| GCC(1) | GNU | GCC(1) |
نام (NAME)
gcc - کامپایلر C و ++C پروژه GNU
خلاصه دستور (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 را اجرا میکنید، معمولاً مراحل پیشپردازش، کامپایل، اسمبلی و پیوندزنی (linking) را انجام میدهد. «گزینههای کلی» به شما امکان میدهند این فرآیند را در یک مرحلهٔ میانی متوقف کنید. برای نمونه، گزینهٔ -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)"
خلاصه گزینهها (Option Summary)
در اینجا خلاصهای از تمامی گزینهها که بر اساس نوع دستهبندی شدهاند آورده شده است. توضیحات مربوطه در بخشهای بعدی ارائه شدهاند.
- گزینههای کلی (Overall 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 (C Language Options)
- -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++ (C++ Language Options)
- -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++ (Objective-C and Objective-C++ Language Options)
- -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 (OpenMP and OpenACC Options)
- -foffload=arg -foffload-options=arg -fopenacc -fopenacc-dim=geom -fopenmp -fopenmp-simd -fopenmp-target-simd-clone[=device-type]
- گزینههای قالببندی پیامهای عیبیابی (Diagnostic Message Formatting Options)
- -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]
- گزینههای هشدار (Warning Options)
- -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 "گزینههای ابزارگذاری برنامه" 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]
- گزینههای پیشپردازنده
- -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
- گزینههای اسمبلر
- -Wa,option -Xassembler option
- گزینههای پیونددهنده
- 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
- گزینههای دایرکتوری
- -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
- گزینههای تولید کد
- -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
- گزینههای توسعهدهنده
- -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]
- گزینههای وابسته به ماشین
- گزینههای
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 Options) -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 Options) -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 Options) -meb -mel -mmul.x -mno-crt0
گزینههای MSP430 (MSP430 Options) -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 Options) -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 Options) -m64 -mmainkernel -moptimize
گزینههای OpenRISC (OpenRISC Options) -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 Options) -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 Options) -mmcu=mcu -minrt -mno-relax -mloop -mabi=variant
گزینههای RISC-V (RISC-V Options) -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 Options) -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 and PowerPC Options) -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 Options) -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 and zSeries Options) -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 Options) -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 Options) -mclear-hwcap -mno-clear-hwcap -mimpure-text -mno-impure-text -pthreads
گزینههای SPARC (SPARC Options) -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 Options) -Qy -Qn -YP,paths -Ym,dir
گزینههای V850 (V850 Options) -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)" فرایند کامپایل میتواند تا چهار مرحله را در بر بگیرد: پیشپردازش، کامپایل اصلی، اسمبل و پیوندزنی (linking)، همواره به همین ترتیب. 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
- کد اسمبلر..IP file.S 4
- file.sx
- کد اسمبلی که باید پیشپردازش شود.
- other
- یک فایل شیء که مستقیماً برای پیونددادن ارسال میشود. هر نام فایلی که پسوند شناختهشدهای نداشته باشد، به این صورت پردازش میشود.
میتوانید زبان ورودی را صریحاً با گزینهٔ -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
- فایلهای
منبع را
کامپایل یا
اسمبل
میکند،
اما پیوند
نمیزند.
مرحلهٔ
پیوندزدن
انجام
نمیشود.
خروجی
نهایی به
صورت یک
فایل شیء به
ازای هر
فایل منبع
خواهد بود.
بهطور پیشفرض، نام فایل شیء برای یک فایل منبع با جایگزینی پسوند .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 تنها نام خروجی اصلی را تعیین میکند، اما بر نامگذاری خروجیهای کمکی و خروجیهای رونوشت نیز تأثیر میگذارد. مثالهای زیر را ببینید. مگر اینکه بازنویسی شوند، هر دو نوع خروجیهای کمکی و خروجیهای رونوشت در همان دایرکتوریِ خروجی اصلی قرار میگیرند. در خروجیهای کمکی، پسوند فایل ورودی با پسوند نوع فایل خروجی کمکی جایگزین میشود؛ در خروجیهای رونوشت، پسوند فایل رونوشت به انتهای پسوند فایل ورودی اضافه میشود. در دستورهای کامپایل، نام پایهٔ خروجیهای کمکی و رونوشت همان نام پایهٔ خروجی اصلی است؛ در دستورهای کامپایل و پیوند، نام خروجی اصلی، منهای پسوند اجرایی، با نام فایل ورودی ترکیب میشود. اگر هر دو، بدون در نظر گرفتن پسوند، دارای یک نام پایه باشند، نتیجهٔ ترکیب همان نام پایه خواهد بود؛ در غیر این صورت، با یک خط تیره به هم متصل میشوند.
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 در دستوری که چندین ورودی را کامپایل میکند، یا کامپایل کرده و سپس پیوند میدهد مشخص شود، ممکن است با 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 مانع از استفاده از نام پایه خروجی برای خروجیها در هنگام پیوند دادن نمیشود:
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، و یک خط پیوند به dumppfx صریح یا پیشفرض الحاق میشوند (یا در صورتی که شامل هرگونه مؤلفه دایرکتوری باشند، آن را بازنویسی میکنند)، بهطوری که هر یک از چندین کامپایل، خروجیهای کمکی و dump با نامهای متفاوتی دریافت کنند.
gcc foo.c bar.c -c -dumpdir dir/pfx- -dumpbase main ...
خروجیهای کمکی و dump را در dir/pfx-main-foo.* و dir/pfx-main-bar.* تولید میکند، با الحاق dumpbase- به dumppfx. خروجیهای 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
- شماره نسخه و حق نشر (copyright) ابزار GCC فراخوانیشده را نمایش میدهد.
- -pass-exit-codes
- به طور معمول اگر هر مرحلهای از کامپایلر کد بازگشتی ناموفق برگرداند، برنامه gcc با کد ۱ خارج میشود. اگر -pass-exit-codes را مشخص کنید، برنامه gcc در عوض با بزرگترین کد خطای عددی تولیدشده توسط هر مرحلهای که اعلام خطا کرده خارج میشود. فرانتاندهای C، C++ و Fortran در صورت مواجهه با خطای داخلی کامپایلر، مقدار ۴ را برمیگردانند.
- -pipe
- به جای فایلهای موقت، از لولهها (pipe) برای برقراری ارتباط بین مراحل مختلف کامپایل استفاده میکند. این قابلیت روی برخی از سیستمهایی که در آنها اسمبلر قادر به خواندن از یک لوله نیست کار نمیکند؛ اما اسمبلر GNU مشکلی با این موضوع ندارد.
- -specs=file
- پس از اینکه کامپایلر فایل استاندارد specs را خواند، file را پردازش میکند تا پیشفرضهایی را که برنامه راهانداز gcc هنگام تعیین سوییچهای ارسالی به cc1، cc1plus، as، ld و غیره استفاده میکند، بازنویسی (override) کند. بیش از یک -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) که مستقل از مکان هستند به کار رود. دایرکتوریهایی که توسط دستورالعملها (directives) ارجاع داده میشوند تحت تأثیر این گزینهها قرار نمیگیرند. همچنین نگاه کنید به -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 را بارگذاری میکند؛ فرض میشود این فایل یک شیء مشترک (shared object) است که توسط کامپایلر با dlopen'd باز خواهد شد. نام پایهٔ فایل شیء مشترک برای شناسایی افزونه به منظور تجزیهٔ آرگومانها به کار میرود (به -fplugin-arg-name-key=value در زیر مراجعه کنید). هر افزونه باید توابع بازخوانی (callback functions) مشخصشده در Plugins API را تعریف کند.
- -fplugin-arg-name-key=value
- یک آرگومان به نام key با مقدار value را برای افزونهای به نام name تعریف میکند.
- -fdump-ada-spec[-slim]
- برای فایلهای منبع و include مربوط به C و C++، مشخصات (specs) متناظر زبان 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 استفاده میکنند؛ فایلهای سرآیند (header) در C++ معمولاً از .hh، .hpp، .H، یا (برای کدهای الگوی مشترک) .tcc بهره میبرند؛ فایلهای پیشپردازششدهٔ C++ پسوند .ii را به کار میبرند؛ و واحدهای رابط ماژول C++20 گاهی از .ixx، .cppm، .cxxm، .c++m یا .ccm استفاده میکنند.
کامپایلر GCC فایلهای با این نامها را تشخیص داده و آنها را به عنوان برنامههای C++ کامپایل میکند، حتی اگر کامپایلر را به همان روشی فراخوانی کنید که برای کامپایل برنامههای C استفاده میشود (معمولاً با نام gcc).
با این حال، استفاده از gcc کتابخانهٔ C++ را اضافه نمیکند. g++ برنامهای است که GCC را فراخوانی کرده و به طور خودکار پیوند دادن (linking) با کتابخانهٔ 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 را بپذیرد. هنگامی که یک استاندارد پایه مشخص میشود، کامپایلر تمامی برنامههای منطبق با آن استاندارد را به همراه برنامههایی که از افزونههای GNU بدون تناقض با آن استفاده میکنند، میپذیرد. برای نمونه، -std=c90 برخی از ویژگیهای GCC را که با ISO C90 ناسازگار هستند غیرفعال میکند؛ مانند کلمات کلیدی "asm" و "typeof"، اما سایر افزونههای GNU را که معنایی در ISO C90 ندارند، مانند حذف عبارت میانی در یک عبارت "?:"، غیرفعال نمیسازد. از سوی دیگر، هنگامی که گویش GNU یک استاندارد مشخص میشود، تمام ویژگیهای پشتیبانیشده توسط کامپایلر فعال میشوند، حتی اگر آن ویژگیها معنای استاندارد پایه را تغییر دهند. در نتیجه، ممکن است برخی از برنامههایی که دقیقاً منطبق بر استاندارد هستند رد شوند. استاندارد مشخصشده توسط -Wpedantic به کار میرود تا تشخیص داده شود کدام ویژگیها با توجه به آن نسخه از استاندارد، افزونههای GNU محسوب میشوند. به عنوان مثال، -std=gnu90 -Wpedantic دربارهٔ کامنتهای سبک C++ با // هشدار میدهد، در حالی که -std=gnu99 -Wpedantic چنین هشداری نمیدهد.
باید مقداری برای این گزینه مشخص شود؛ مقادیر ممکن عبارتند از:
- c90
- c89
- iso9899:1990
- پشتیبانی از تمام برنامههای ISO C90 (برخی افزونههای GNU که با ISO C90 در تداخل هستند غیرفعال میشوند). همانند -ansi برای کدهای C.
- 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 (منتشر شده در ۲۰۱۸). این استاندارد با C11 یکسان است، به جز تصحیح نقصها (که همگی با -std=c11 نیز اعمال میشوند) و مقدار جدیدی برای "__STDC_VERSION__"، و به همین دلیل تا همان میزان C11 پشتیبانی میشود.
- c23
- c2x
- iso9899:2024
- استاندارد ISO C23، بازنگری سال ۲۰۲۳ استاندارد ISO C (منتشر شده در ۲۰۲۴). نام c2x منسوخ شده است.
- c2y
- نسخه بعدی استاندارد ISO C، که هنوز در دست توسعه است. پشتیبانی از این نسخه آزمایشی و ناقص است.
- gnu90
- gnu89
- گویش GNU از ISO C90 (شامل برخی از ویژگیهای C99).
- gnu99
- gnu9x
- گویش GNU از ISO C99. نام gnu9x منسوخ شده است.
- gnu11
- gnu1x
- گویش GNU از ISO C11. نام gnu1x منسوخ شده است.
- gnu17
- gnu18
- گویش GNU از ISO C17.
- gnu23
- gnu2x
- گویش GNU از ISO C23. این مقدار پیشفرض برای کدهای C است. نام gnu2x منسوخ شده است.
- gnu2y
- نسخه بعدی استاندارد ISO C، که هنوز در دست توسعه است، به همراه افزونههای GNU. پشتیبانی از این نسخه آزمایشی و ناقص است. نام gnu2x منسوخ شده است.
- c++98
- c++03
- استاندارد ۱۹۹۸ ISO C++ به همراه اصلاحیه فنی ۲۰۰۳ و برخی گزارشهای نقص اضافی. همانند -ansi برای کدهای C++.
- gnu++98
- gnu++03
- گویش GNU از -std=c++98.
- c++11
- c++0x
- استاندارد ۲۰۱۱ ISO C++ به همراه اصلاحیهها. نام c++0x منسوخ شده است.
- gnu++11
- gnu++0x
- گویش GNU از -std=c++11. نام gnu++0x منسوخ شده است.
- c++14
- c++1y
- استاندارد ISO C++ ۲۰۱۴ به همراه اصلاحیهها. نام c++1y منسوخ شده است.
- gnu++14
- gnu++1y
- گویش GNU از -std=c++14. نام gnu++1y منسوخ شده است.
- c++17
- c++1z
- استاندارد ISO C++ ۲۰۱۷ به همراه اصلاحیهها. نام c++1z منسوخ شده است.
- gnu++17
- gnu++1z
- گویش GNU از -std=c++17. این گزینه پیشفرض برای کدهای C++ است. نام gnu++1z منسوخ شده است.
- c++20
- c++2a
- استاندارد ISO C++ ۲۰۲۰ به همراه اصلاحیهها. پشتیبانی از آن آزمایشی است و ممکن است در نسخههای بعدی با تغییرات ناسازگار همراه شود. نام c++2a منسوخ شده است.
- gnu++20
- gnu++2a
- گویش GNU از -std=c++20. پشتیبانی از آن آزمایشی است و ممکن است در نسخههای بعدی با تغییرات ناسازگار همراه شود. نام gnu++2a منسوخ شده است.
- c++23
- c++2b
- استاندارد ISO C++ ۲۰۲۳ به همراه اصلاحیهها (منتشر شده در سال ۲۰۲۴). پشتیبانی از آن آزمایشی است و ممکن است در نسخههای بعدی با تغییرات ناسازگار همراه شود. نام c++2b منسوخ شده است.
- gnu++23
- gnu++2b
- گویش GNU از -std=c++23. پشتیبانی از آن آزمایشی است و ممکن است در نسخههای بعدی با تغییرات ناسازگار همراه شود. نام gnu++2b منسوخ شده است.
- c++2c
- c++26
- بازنگری بعدی استاندارد ISO C++ که برای سال ۲۰۲۶ برنامهریزی شده است. پشتیبانی از آن کاملاً آزمایشی است و تقریباً بهطور قطع در نسخههای آینده دستخوش تغییرات ناسازگار خواهد شد.
- gnu++2c
- gnu++26
- گویش GNU از -std=c++2c. پشتیبانی از آن کاملاً آزمایشی است و تقریباً بهطور قطع در نسخههای آینده دستخوش تغییرات ناسازگار خواهد شد.
- -aux-info filename
- اعلانهای
دارای
پیشنمونه
را برای
تمام توابع
اعلانشده
و/یا
تعریفشده
در یک واحد
ترجمه، از
جمله موارد
موجود در
فایلهای
سرآیند، در
نام فایل
دادهشده
خروجی
میدهد. این
گزینه در هر
زبانی غیر
از 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
- توابع
توکاری را
که با
پیشوند __builtin_
آغاز
نمیشوند،
شناسایی
نمیکند.
کامپایلر GCC معمولاً برای مدیریت کارآمدتر برخی توابع توکار، کد ویژهای تولید میکند؛ به عنوان مثال، فراخوانیهای "alloca" ممکن است تبدیل به دستورالعملهای تکی شوند که پشته را مستقیماً تنظیم میکنند، و فراخوانیهای "memcpy" ممکن است به حلقههای کپی درونخطی تبدیل شوند. کد حاصل اغلب هم کوچکتر و هم سریعتر است، اما از آنجا که فراخوانیهای تابع دیگر به همان شکل ظاهر نمیشوند، نمیتوانید روی آن فراخوانیها نقطهٔ توقف بگذارید، و همچنین نمیتوانید رفتار توابع را با پیوند دادن به یک کتابخانهٔ دیگر تغییر دهید. علاوه بر این، هنگامی که یک تابع به عنوان تابع توکار شناخته میشود، 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
- عبارتهای شرطی با نوعهای ناهمخوان در آرگومانهای دوم و سوم را مجاز میداند. مقدار چنین عبارتی void است. این گزینه برای C++ پشتیبانی نمیشود.
- -ffreestanding
- مشخص میکند که کامپایل یک محیط مستقل را هدف قرار داده است. این امر مستلزم -fno-builtin است. محیط مستقل محیطی است که در آن ممکن است کتابخانهٔ استاندارد وجود نداشته باشد و شروع برنامه لزوماً در "main" رخ ندهد. واضحترین مثال، هستهٔ یک سیستمعامل است. این گزینه معادل -fno-hosted است.
- -fgimple
- تجزیهٔ تعاریف توابع نشانهگذاریشده با "__GIMPLE" را فعال میکند. این یک ویژگی آزمایشی است که امکان آزمون واحد گذرهای 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) است. این مستلزم -fbuiltin است. محیط میزبانیشده محیطی است که کل کتابخانهٔ استاندارد در آن موجود باشد، و در آن "main" دارای نوع بازگشتی "int" باشد. نمونههای آن تقریباً همهچیز به جز هسته (kernel) سیستمعامل است. این معادل -fno-freestanding است.
- -flax-vector-conversions
- امکان تبدیلهای ضمنی بین بردارهایی (vectors) با تعداد متفاوتی از عناصر و/یا انواع عناصر ناسازگار را فراهم میکند. از این گزینه نباید برای کدهای جدید استفاده شود.
- -fms-extensions
- برخی
ساختارهای
غیراستاندارد
بهکاررفته
در
فایلهای
سرایند (header)
مایکروسافت
را
میپذیرد.
در کد ++C، این گزینه اجازه میدهد نامهای اعضا در ساختارها مشابه اعلانهای پیشین نوع باشند.
typedef int UOW; struct ABC { UOW UOW; };برخی موارد فیلدهای بدون نام در ساختارها (structures) و اجتماعها (unions) تنها با این گزینه پذیرفته میشوند.
توجه داشته باشید که این گزینه برای همهٔ هدفها بهجز هدفهای x86 که از ms-abi استفاده میکنند، غیرفعال است.
- -fpermitted-flt-eval-methods=style
- استاندارد
ISO/IEC TS 18661-3 مقادیر
مجاز جدیدی
را برای
"FLT_EVAL_METHOD"
تعریف
میکند که
نشان
میدهند
عملیاتها
و
ثابتهایی
با نوع
معناییِ
قالب
تبادلی (interchange)
یا
گسترشیافته
(extended)، باید با
دقت و
دامنهٔ
همان نوع
ارزیابی
شوند. این
مقادیر
جدید،
ابرمجموعهای
از مقادیر
مجاز تحت 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".
در حالت ایدهآل، یک برنامهٔ قابل حمل (portable) در صورتی که به علامتدار بودن یک شیء وابسته باشد، باید همواره از "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
- ترتیب
ذخیرهسازی
اسکالر
پیشفرض
ساختارها و
اجتماعها
(unions) را روی
ترتیب بایت
(endianness)
مشخصشده
تنظیم
میکند.
مقادیر
پذیرفتهشده
عبارتند از
big-endian، little-endian و native
برای ترتیب
بایت بومی
هدف
(پیشفرض).
این گزینه
در ++C
پشتیبانی
نمیشود.
هشدار: سوئیچ -fsso-struct در صورتی که ترتیب بایتِ تعیینشده، ترتیب بایت بومیِ هدف نباشد، باعث میشود GCC کدی تولید کند که با کدهای تولیدشده بدون این گزینه از نظر دودویی سازگار نباشد..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
مربوط به C++ ABI
استفاده
میکند.
مقدار
پیشفرض،
نسخه 0 است.
نسخه 0 به نسخهای اشاره دارد که بیشترین سازگاری را با مشخصات C++ ABI دارد. بنابراین، با رفع باگهای ABI، ABI بهدستآمده با استفاده از نسخه 0 در نسخههای مختلف G++ تغییر خواهد کرد.
نسخه 1 نسخهای از C++ ABI است که نخستین بار در G++ 3.2 ارائه شد.
نسخه 2 نسخهای از C++ ABI است که نخستین بار در G++ 3.4 معرفی شد و تا G++ 4.9 پیشفرض بود.
نسخه 3 خطایی را در mangling یک نشانی ثابت بهعنوان آرگومان الگو (template argument) تصحیح میکند.
نسخه 4، که نخستین بار در G++ 4.5 ارائه شد، یک mangling استاندارد را برای انواع برداری (vector types) پیادهسازی میکند.
نسخه 5، که نخستین بار در G++ 4.6 ظاهر شد، mangling مشخصههای const/volatile روی انواع اشارهگر به تابع، decltype یک اعلان ساده، و استفاده از پارامتر یک تابع در اعلان پارامتری دیگر را تصحیح میکند.
نسخه 6، که نخستین بار در G++ 4.7 ارائه شد، رفتار ارتقای (promotion) شمارشهای دامنهدار (scoped enums) در C++11 و mangling بستههای آرگومان الگو، const/static_cast، عملگرهای پیشوندی ++ و --، و تابع در دامنه کلاس که بهعنوان آرگومان الگو استفاده شده را تصحیح میکند.
نسخه 7، که نخستین بار در G++ 4.8 ظاهر شد، با nullptr_t بهعنوان یک نوع داخلی (builtin) رفتار میکند و mangling توابع لامبدا را در دامنه آرگومان پیشفرض تصحیح میکند.
نسخه 8، که نخستین بار در G++ 4.9 ارائه شد، رفتار جایگزینی (substitution) انواع تابعی دارای توصیفکنندههای cv تابع (function-cv-qualifiers) را تصحیح میکند.
نسخه 9، که نخستین بار در G++ 5.2 ظاهر شد، همترازی (alignment) مربوط به "nullptr_t" را تصحیح میکند.
نسخه 10، که نخستین بار در G++ 6.1 ارائه شد، mangling مشخصههای اثرگذار بر هویت نوع، مانند مشخصههای قرارداد فراخوانی ia32 (مانند stdcall) را اضافه میکند.
نسخه 11، که نخستین بار در G++ 7 ظاهر شد، mangling عبارتهای ...sizeof و نامهای عملگر را تصحیح میکند. برای چندین موجودیت با نام یکسان در یک تابع که در دامنههای مختلف اعلان شدهاند، mangling اکنون از دوازدهمین رخداد به بعد تغییر میکند. این گزینه همچنین مستلزم -fnew-inheriting-ctors است.
نسخه 12، که نخستین بار در G++ 8 ارائه شد، قراردادهای فراخوانی را برای کلاسهای خالی در معماری مقصد x86_64 و برای کلاسهایی که فقط سازندههای کپی/انتقال حذفشده دارند، تصحیح میکند. این نسخه تصادفاً قرارداد فراخوانی را برای کلاسهایی با سازنده کپی حذفشده و یک سازنده انتقال ساده (trivial move constructor) تغییر میدهد.
نسخه 13، که نخستین بار در G++ 8.2 ظاهر شد، تغییر تصادفی در نسخه 12 را برطرف میکند.
نسخه 14، که نخستین بار در G++ 10 ارائه شد، mangling عبارت nullptr را تصحیح میکند.
نسخه 15، که نخستین بار در G++ 10.3 ظاهر شد، پسرفت (regression) برچسب ABI در G++ 10 را اصلاح میکند.
نسخه 16، که نخستین بار در G++ 11 ارائه شد، mangling مربوط به "__alignof__" را تغییر میدهد تا از "alignof" و نامهای عملگر وابسته متمایز باشد.
نسخه 17، که نخستین بار در G++ 12 ظاهر شد، چیدمان (layout) کلاسهایی را که در C++14 و بالاتر از کلاسهای تجمیعی (aggregate) با مقداردهندههای اولیه پیشفرض عضو ارثبری میکنند، اصلاح میکند.
نسخه 18، که نخستین بار در G++ 13 ارائه شد، mangling توابع لامبدایی را که بافت (context) اضافی دارند اصلاح میکند.
نسخه 19، که نخستین بار در G++ 14 ظاهر شد، mangling پیوندهای ساختاریافته (structured bindings) را اصلاح میکند تا شامل برچسبهای ABI باشند.
نسخه 20، که نخستین بار در G++ 15 ارائه شد، mangling توابع لامبدا را در مقداردهندههای اولیه اعضای دادهای ایستا اصلاح میکند.
همچنین -Wabi را ببینید.
- -fabi-compat-version=n
- در
مقصدهایی
که از
نامهای
مستعار قوی
(strong aliases)
پشتیبانی
میکنند، G++
هنگام
تعریف
نمادی با
نام mangled
نادرست، با
ایجاد یک
نام مستعار
با نام mangled
درست،
تغییرات mangling
را دور
میزند. این
سوئیچ مشخص
میکند که
کدام نسخه ABI
برای این
نام مستعار
استفاده
شود.
با -fabi-version=0 (حالت پیشفرض)، این مقدار بهطور پیشفرض 13 است (سازگاری با GCC 8.2). اگر نسخه ABI دیگری بهصراحت انتخاب شود، پیشفرض این مقدار 0 خواهد بود. برای سازگاری با نسخههای GCC از 3.2 تا 4.9، از -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،
امضاهای
جدید برای
لیترالهای
تعریفشده
توسط کاربر
(user-defined literals)،
بهروزرسانیهای
کتابخانه
استاندارد
مربوطه، و
ماکروهای
جدید بررسی
ویژگی
"__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
- پشتیبانی
از قابلیت C++
Concepts را برای
محدودسازی
آرگومانهای
قالب (template arguments)
فعال
میکند. در
-std=c++20 و
بالاتر،
قابلیت Concepts
بخشی از
استاندارد
زبان است؛
بنابراین
-fconcepts بهطور
پیشفرض
فعال است.
برخی از ساختارهایی که در مشخصات فنی پیشین مفاهیم C++ یعنی ISO 19217 (2015) مجاز بودند اما به استاندارد نهایی راه نیافتند، میتوانستند علاوه بر این با -fconcepts-ts فعال شوند. گزینهٔ -fconcepts-ts در GCC 14 منسوخ شد و در GCC 15 حذف گردید؛ انتظار میرود کاربران کدهای خود را به مفاهیم استاندارد C++20 ارتقا دهند.
- -fconstexpr-depth=n
- بیشینهٔ عمق ارزیابی تو در تو را برای توابع constexpr در C++11 روی n تنظیم میکند. وجود یک حد برای تشخیص بازگشتهای بیپایان در حین ارزیابی عبارت ثابت ضروری است. کمینهٔ مشخصشده توسط استاندارد ۵۱۲ است.
- -fconstexpr-cache-depth=n
- بیشینهٔ عمق ارزیابی تو در تو را برای توابع constexpr در C++11 که نتایج آنها در حافظهٔ نهان (cache) ذخیره میشود، روی n تنظیم میکند. این یک روش اکتشافی (heuristic) است که تعادلی میان سرعت کامپایل (زمانی که حافظهٔ نهان از محاسبات تکراری جلوگیری میکند) و مصرف حافظه (زمانی که حافظهٔ نهان بر اثر ارزیابیهای بسیار بازگشتی بیش از حد بزرگ میشود) برقرار میکند. مقدار پیشفرض ۸ است. کاربران بسیار کمی نیاز به تغییر آن خواهند داشت، اما اگر کد شما شامل محاسبات سنگین constexpr است، میتوانید با آزمایش، بهترین مقدار مناسب برای شرایط خود را پیدا کنید.
- -fconstexpr-fp-except
- پیوست F (Annex F)
استاندارد C
مشخص
میکند که
استثناهای
ممیز شناور
IEC559 در زمان
کامپایل
نباید مانع
ادامهٔ
فرایند
کامپایل
شوند.
کامپایلرهای
C++ در طول
تاریخ این
راهنما را
نادیده
گرفته و در
عوض با
تقسیم ممیز
شناور بر
صفر با وجود
داشتن
مقداری
کاملاً
مشخص،
بهصورت
غیرثابت
برخورد
کردهاند.
این پرچم به
کامپایلر
دستور
میدهد که
اولویت را
به پیوست F
بدهد تا
قوانینی که
بیان
میکنند یک
عملیات
مشخص،
تعریفنشده
(undefined) است.
constexpr float inf = 1./0.; // OK with -fconstexpr-fp-except
- -fconstexpr-loop-limit=n
- بیشینهٔ تعداد تکرارهای یک حلقه را در توابع constexpr در C++14 روی n تنظیم میکند. وجود این محدودیت برای تشخیص حلقههای بینهایت در حین ارزیابی عبارات ثابت لازم است. مقدار پیشفرض ۲۶۲۱۴۴ (1<<18) است.
- -fconstexpr-ops-limit=n
- بیشینهٔ تعداد عملیاتها را در طول یک ارزیابی منفرد constexpr تعیین میکند. حتی زمانی که تکرار یک حلقه با حد بالا محدود شده باشد، چنانچه چندین حلقهٔ تو در تو وجود داشته باشند که هر کدام تکرارهای متعددی کمتر از حد مزبور داشته باشند، یا در بدنهٔ یک حلقه یا بیرون از آن عبارات بسیار زیادی ارزیابی شوند، ارزیابی نهایی constexpr ممکن است بسیار زمانبر شود. مقدار پیشفرض ۳۳۵۵۴۴۳۲ (1<<25) است.
- -fcontracts
- پشتیبانی
آزمایشی از
قابلیت C++ Contracts
(قراردادها)
را فعال
میکند،
قابلیتی که
پیشتر
بهمدت
کوتاهی به
پیشنویس
کاری 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]
- کنترل میکند که آیا هیچ قراردادی دارای معناشناسی (semantics) باشد یا خیر. مقدار پیشفرض on است.
- -fcontract-assumption-mode=[on|off]
- [N4820] کنترل میکند که آیا قراردادهای با سطح axiom باید معناشناسی فرض (assume) را داشته باشند یا خیر. مقدار پیشفرض on است.
- -fcontract-build-level=[off|default|audit]
- [N4820] مشخص میکند که تولید بررسیها برای کدام سطح از قراردادها صورت گیرد. مقدار پیشفرض default است.
- -fcontract-continuation-mode=[on|off]
- [N4820] کنترل میکند که آیا پس از نقض قرارداد، برنامه اجازهٔ ادامهٔ اجرا را دارد یا خیر؛ یعنی آیا قراردادهای بررسیشده به جای معناشناسی never، دارای معناشناسی maybe (که در زیر توضیح داده شده) هستند یا خیر. مقدار پیشفرض off است.
- -fcontract-role=<name>:<default>,<audit>,<axiom>
- [P1332] معناشناسی عینی را برای هر یک از سطوح قرارداد در یک نقش قراردادی مشخص تعیین میکند.
- -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
- به بخش پیشین (front end) سیپلاسپلاس اجازه میدهد هنگام شکست در تفکیک بارگذاری بیشازحد (overload resolution)، تمام گزینههای نامزد را ذکر کند؛ از جمله زمانی که یک تابع حذفشده (deleted function) انتخاب میشود.
- -fno-elide-constructors
- استاندارد
C++ به
پیادهسازی
اجازه
میدهد از
ایجاد یک
شیء موقت که
صرفاً برای
مقداردهی
اولیهٔ شیء
دیگری از
همان نوع
استفاده
میشود،
صرفنظر
کند.
مشخصکردن
این گزینه
آن
بهینهسازی
را غیرفعال
کرده و G++ را
وادار
میکند در
تمام
حالات،
سازندهٔ
رونوشت (copy constructor)
را
فراخوانی
کند. این
گزینه
همچنین
باعث
میشود G++
توابع عضو
سادهای (trivial member
functions) را که در
غیر این
صورت
بهصورت
درونخطی (inline)
بسط
مییافتند،
فراخوانی
نماید.
در C++17، کامپایلر ملزم به حذف این اشیاء موقت است، اما این گزینه همچنان بر توابع عضو ساده اثر میگذارد.
- -fno-enforce-eh-specs
- کدی برای بررسی نقض مشخصات استثنا (exception specifications) در زمان اجرا تولید نمیکند. این گزینه استاندارد C++ را نقض میکند، اما ممکن است برای کاهش حجم کد در ساختهای نهایی (production builds) مفید باشد، بسیار شبیه به تعریف "NDEBUG". این گزینه به کد کاربر اجازهٔ پرتاب استثنا در نقض مشخصات استثنا را نمیدهد؛ کامپایلر همچنان بر اساس مشخصات استثناها بهینهسازی را انجام میدهد، بنابراین پرتاب یک استثنای غیرمنتظره منجر به رفتار تعریفنشده (undefined behavior) در زمان اجرا خواهد شد.
- -fextern-tls-init
- -fno-extern-tls-init
- استانداردهای
C++11 و OpenMP به
متغیرهای
"thread_local" و
"threadprivate"
اجازه
میدهند تا
مقداردهی
اولیهٔ
پویا (زمان
اجرا) داشته
باشند. برای
پشتیبانی
از این
قابلیت،
هرگونه
استفاده از
چنین
متغیری از
طریق یک
تابع پوششی
(wrapper function) انجام
میشود که
هرگونه
مقداردهی
اولیهٔ
لازم را
اجرا
میکند.
هنگامی که
استفاده و
تعریف
متغیر در یک
واحد ترجمه
(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
- به بخش پیشین (front end) سیپلاسپلاس اجازه میدهد تا فراخوانیهای "std::move"، "std::forward"، "std::addressof" و "std::as_const" را تا (fold) کند. برخلاف درونخطیسازی (inlining)، این به این معنی است که هیچ اطلاعات اشکالزداییای (debug information) برای چنین فراخوانیهایی تولید نخواهد شد. از آنجا که این توابع بهندرت برای اشکالزدایی جالب هستند، این پرچم بهطور پیشفرض فعال است مگر اینکه -fno-inline فعال باشد.
- -fno-gnu-keywords
- کلمهٔ "typeof" را بهعنوان کلیدواژه شناسایی نمیکند، تا کد بتواند از این کلمه بهعنوان یک شناسه (identifier) استفاده کند. میتوانید بهجای آن از کلیدواژهٔ "__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
- هرگز برای الگوهای غیر درونخطی که بهطور ضمنی (یعنی با استفاده) نمونهسازی شدهاند کدی تولید نمیکند؛ صرفاً برای نمونهسازیهای صریح کد تولید میکند. اگر از این گزینه استفاده میکنید، باید مراقب باشید که کد خود را بهگونهای ساختاربندی کنید که تمام نمونهسازیهای صریح لازم را شامل شود تا در زمان پیوند (link time) با نمادهای تعریفنشده مواجه نشوید.
- -fno-implicit-inline-templates
- برای نمونهسازیهای ضمنی الگوهای درونخطی (inline templates) نیز کدی تولید نمیکند. حالت پیشفرض این است که با توابع درونخطی بهگونهای متفاوت رفتار شود تا کامپایل با بهینهسازی و بدون بهینهسازی به مجموعهٔ یکسانی از نمونهسازیهای صریح نیاز داشته باشد.
- -fno-implement-inlines
- برای صرفهجویی در فضا، نسخههای خارج از خط (out-of-line) توابع درونخطی را که توسط "#pragma implementation" کنترل میشوند تولید نمیکند. این امر در صورتی که این توابع در هر جایی که فراخوانی شدهاند درونخطی نشوند، منجر به خطاهای پیونددهنده (linker) خواهد شد.
- -fmodules
- -fno-modules
- پشتیبانی از ماژولهای C++20 را فعال میکند. معمولاً به -fno-modules نیازی نیست، زیرا این مقدار پیشفرض است. با اینکه این قابلیت متعلق به C++20 است، اما در حال حاضر صرفاً با انتخاب نسخهٔ استاندارد بهطور ضمنی فعال نمیشود.
- -fmodule-header
- -fmodule-header=user
- -fmodule-header=system
- یک فایل سرآیند را برای ایجاد یک واحد سرآیندِ قابل وارد کردن (importable header unit) کامپایل میکند.
- -fmodule-implicit-inline
- توابع عضوی که در تعاریف کلاس خود تعریف شدهاند، برای کد ماژولار بهطور ضمنی درونخطی (inline) نیستند. این رفتار با رفتار سنتی C++ متفاوت است و دلایل موجهی دارد. با این حال، ممکن است در هنگام انتقال کد (porting) باعث بروز دشواری شود. این گزینه چنین تعاریف تابعی را بهطور ضمنی inline میکند. با این حال، این کار باعث ناسازگاری در ABI میشود، بنابراین یا باید در همهجا از آن استفاده کنید یا در هیچجا. (چنین تعاریفی در خارج از یک ماژول نامگذاریشده، در هر حال بهطور ضمنی inline باقی میمانند.)
- -fno-module-lazy
- وارد کردن تنبل ماژول (lazy module 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]
- یک مرجع (oracle) برای پرسوجوی نگاشت نام ماژول به نام فایل. در صورت عدم تعیین، متغیر محیطی CXX_MODULE_MAPPER استفاده میشود، و اگر آن هم تنظیم نشده باشد، یک مقدار پیشفرض درونفرایندی (in-process) ارائه میشود.
- -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 معرفی شدند. این ویژگی برای توابع آزادسازی حافظه (deallocation) جایگزین تعریفشده توسط کاربر که به عنوان مثال، از اندازه شیء برای سرعت بخشیدن به آزادسازی استفاده میکنند، مفید است. بهطور پیشفرض تحت -std=c++14 و بالاتر فعال است. پرچم -Wsized-deallocation در مورد مکانهایی که ممکن است بخواهند تعریفی اضافه کنند هشدار میدهد.
- -fstrict-enums
- اجازه دادن به کامپایلر برای بهینهسازی بر مبنای این فرض که مقدار یک نوع شمارشی (enumerated type) تنها میتواند یکی از مقادیر برشماری باشد (همانطور که در استاندارد C++ تعریف شده است؛ اساساً مقداری که میتواند در حداقل تعداد بیتهای لازم برای نمایش همه مقادیر شمارشی نمایش یابد). این فرض ممکن است در صورتی که برنامه از تبدیل نوع (cast) برای تبدیل یک مقدار صحیح اختیاری به نوع شمارشی استفاده کند، نامعتبر باشد. این گزینه برای یک نوع شمارشی با یک نوع زیربنایی ثابت (fixed underlying type) هیچ تأثیری ندارد.
- -fstrong-eval-order
- -fstrong-eval-order=kind
- ارزیابی
دسترسی به
اعضا،
اندیسگذاری
آرایه و
عبارات
شیفت به
ترتیب چپ به
راست، و
ارزیابی
انتساب به
ترتیب راست
به چپ،
همانگونه
که برای 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. مقدار پیشفرض 10 است.
- -ftemplate-depth=n
- تنظیم حداکثر عمق نمونهسازی برای قالبهای کلاس روی n. برای تشخیص بازگشتهای بیپایان در حین نمونهسازی کلاس قالب، تعیین محدودیتی برای عمق نمونهسازی قالب الزامی است. برنامههای منطبق بر ANSI/ISO C++ نباید به عمق حداکثری بیش از 17 متکی باشند (که در C++11 به 1024 تغییر یافت). مقدار پیشفرض 900 است، زیرا کامپایلر در برخی شرایط ممکن است پیش از رسیدن به 1024 با کمبود فضای پشته روبرو شود.
- -fno-threadsafe-statics
- عدم تولید کدهای اضافی جهت استفاده از روالهای مشخصشده در ABI زبان C++ برای مقداردهی اولیه امن در برابر ریسهها (thread-safe) برای متغیرهای ایستای محلی. میتوانید از این گزینه برای کاهش اندک اندازه کد در کدهایی که نیازی به امنیت در برابر ریسه ندارند استفاده کنید.
- -fuse-cxa-atexit
- ثبت مخربها برای اشیایی با مدتزمان ذخیرهسازی ایستا (static storage duration) با استفاده از تابع "__cxa_atexit" به جای تابع "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")))" نشانهگذاری کند تا در جدول صادرات (export table) یک DSO ظاهر نشوند و هنگام استفاده در درون DSO نیازی به ارجاع غیرمستقیم PLT نداشته باشند. فعالسازی این گزینه میتواند تأثیر چشمگیری بر زمانهای بارگذاری و پیوند یک DSO داشته باشد، زیرا در صورت استفاده سنگین کتابخانه از قالبها، اندازه جدول صادرات پویا را به مقدار زیادی کاهش میدهد.
رفتار این گزینه کاملاً مشابه نشانهگذاری مستقیم متدها به عنوان hidden نیست، زیرا بر متغیرهای ایستای محلی تابع تأثیری ندارد و باعث نمیشود کامپایلر استنتاج کند که تابع تنها در یک شیء اشتراکی تعریف شده است.
میتوانید یک متد را بهطور صریح با یک دیداری (visibility) نشانهگذاری کنید تا اثر این گزینه برای آن متد خنثی شود. برای مثال، اگر واقعاً میخواهید اشارهگرها به یک متد برخط خاص را مقایسه کنید، میتوانید آن را با دیداری default نشانهگذاری نمایید. نشانهگذاری کلاس دربرگیرنده با دیداری صریح هیچ تأثیری ندارد.
متدهای برخطی که صراحتاً نمونهسازی شدهاند (explicitly instantiated) تحت تأثیر این گزینه قرار نمیگیرند، چرا که پیوندپذیری (linkage) آنها ممکن است در غیر این صورت از مرز کتابخانه اشتراکی فراتر رود.
- -fvisibility-ms-compat
- این پرچم
تلاش
میکند با
استفاده از
تنظیمات
دیداری (visibility)،
مدل
پیوندپذیری
C++ در GCC را با
مدل Microsoft Visual Studio
سازگار
سازد.
این پرچم تغییرات زیر را در مدل پیوندپذیری GCC ایجاد میکند:
- 1.
- دیداری پیشفرض را مانند -fvisibility=hidden روی "hidden" تنظیم میکند.
- 2.
- انواع، اما نه اعضای آنها، بهطور پیشفرض پنهان (hidden) نمیشوند.
- 3.
- قاعده یک تعریف (One Definition Rule یا ODR) برای انواعی که فاقد مشخصات دیداری صریح هستند و در بیش از یک شیء اشتراکی تعریف شدهاند، تسهیل میشود: این اعلانها در صورتی مجاز هستند که در زمان عدم استفاده از این گزینه نیز مجاز باشند.
در کدهای جدیدتر بهتر است از -fvisibility=hidden استفاده شود و کلاسهایی که قرار است از بیرون قابل مشاهده باشند برونریزی (export) شوند. متأسفانه این امکان وجود دارد که کدها، شاید تصادفاً، به رفتار Visual Studio متکی باشند.
از جمله پیامدهای این تغییرات این است که اعضای دادهای ایستای همنوع با نام یکسان اما تعریفشده در اشیاء اشتراکی متفاوت، متمایز خواهند بود؛ بنابراین تغییر یکی باعث تغییر دیگری نمیشود؛ و اینکه اشارهگرها به توابع عضو تعریفشده در اشیاء اشتراکی مختلف ممکن است در مقایسه برابر نباشند. در صورت استفاده از این پرچم، تعریف متفاوت انواع با نام یکسان، نقض ODR محسوب میشود. از پشتیبانی نمادهای ضعیف (weak symbols) استفاده نکنید، حتی اگر توسط پیونددهنده ارائه شده باشد. به طور پیشفرض، 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 به یک سرآیند کاربری یا سیستمی خاص تبدیل خواهد شد.
- -flang-info-module-cmi
- -flang-info-module-cmi=module
- ناممسیرهای واسط ماژول کامپایلشده (CMI) را گزارش میدهد. اولی تمامی ناممسیرهای 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++)
- درباره
استفاده از
عبارت
ویرگول در
درون یک
عبارت
اندیسگذاری
هشدار
میدهد. این
کاربرد در 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 فعال میشود.
این هشدار توسط -pedantic-errors در حالت C++23 یا بالاتر به یک خطا ارتقا مییابد.
- -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++)
- هنگامی که کلاسی به دلیل خصوصی (private) بودن تمام سازندهها یا ویرانگرهایش غیرقابل استفاده به نظر برسد و نه دوستی (friend) و نه توابع عضو ایستا (static) عمومی (public) داشته باشد، هشدار میدهد. همچنین اگر هیچ متد غیرخصوصی وجود نداشته باشد و حداقل یک تابع عضو خصوصی وجود داشته باشد که سازنده یا ویرانگر نباشد، هشدار میدهد.
- -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)) { } };توابع عضو نیز بررسی میشوند، اما فقط آرگومان شیء آنها:
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 destructor) باشد.
این هشدار را میتوان با استفاده از صفت "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++)
- هشدار
میدهد که
اعلان
عملگر
لفظیِ
تعریفشده
توسط کاربر
با یک فاصله
پیش از
پسوند
منسوخ شده
است. این
هشدار
بهطور
پیشفرض در
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++)
- هشدار
میدهد که
حذف کاما
قبل از varargs
"..." در
انتهای
فهرست
پارامترهای
تابع منسوخ
شده است.
این هشدار
بهطور
پیشفرض در
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 به کار رود. یعنی اگر یک enum با نوع زیربنایی مشخص و بدون فهرست شمارندهها در اعلانی غیر از صرفاً یک اعلان مستقل از آن enum استفاده شود. بهطور پیشفرض فعال است. این هشدار با -pedantic-errors به یک خطا ارتقا مییابد.
- -Wno-init-list-lifetime (فقط C++ و Objective-C++)
- دربارهٔ استفادههایی از "std::initializer_list" که به احتمال زیاد منجر به اشارهگرهای معلق میشوند، هشدار نده. از آنجا که با آرایهٔ زیربنایی یک "initializer_list" مانند یک شیء موقت معمولی در C++ رفتار میشود، بسیار آسان است که بهطور ناخواسته اشارهگری به آن آرایه پس از پایان طول عمرش حفظ شود. برای مثال:
- اگر تابعی یک "initializer_list" موقت یا یک متغیر محلی "initializer_list" را بازگرداند، طول عمر آرایه در انتهای دستور return به پایان میرسد، بنابراین مقدار بازگرداندهشده دارای یک اشارهگر معلق است.
- اگر یک عبارت new یک "initializer_list" ایجاد کند، آرایه فقط تا پایان عبارت کاملِ دربرگیرنده عمر میکند، بنابراین "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
- هشدار
میدهد
هنگامی که
یک تابع
هرگز یک
عبارت ثابت
تولید
نمیکند. در
C++20 و پیش از
آن، برای هر
تابع و
الگوی تابع
"constexpr"،
باید حداقل
یک مجموعه
از
آرگومانهای
تابع در
حداقل یک
نمونهسازی
وجود داشته
باشد به
طوری که
فراخوانی
تابع یا
سازنده
بتواند یک
زیرعبارت
ارزیابیشده
از یک عبارت
ثابت
هستهای (core constant
expression) باشد. C++23
این
محدودیت را
حذف کرد،
بنابراین
ممکن است
تابع یا
الگوی
تابعی با
نشانهٔ
"constexpr"
داشته
باشیم که
هیچ
فراخوانیای
شرایط یک
عبارت ثابت
هستهای را
برآورده
نکند.
این هشدار بهطور پیشفرض بهعنوان یک هشدار سختگیرانه (pedantic) در C++20 و پیش از آن فعال است. در 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) در پایان کامپایل. این گزینه بهطور پیشفرض فعال نیست، زیرا تعیین آن نیازمند پردازش اضافی است. این گزینه هنگام آمادهسازی مجموعههای header-units برای اطمینان از سازگاری ماکروها میتواند مفید باشد.
- -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 و
استانداردهای
پس از آن،
تبدیلهای
باریککننده
همانطور
که توسط
استاندارد
الزامی شده
است،
بهطور
پیشفرض
عیبیابی
میشوند. یک
تبدیل
باریککننده
از یک مقدار
ثابت یک خطا
ایجاد
میکند، و
یک تبدیل
باریککننده
از یک مقدار
غیرثابت یک
هشدار
تولید
مینماید،
اما -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) یا
کپسولهسازی
را نقض کند،
یا
اشارهگرهای
جدول مجازی
(vtable) را خراب
سازد.
دستکاریِ
بازنمایی
چنین
اشیایی
ممکن است
نامتغیرهای
نگهداریشده
توسط توابع
عضو کلاس را
نقض کند. به
عنوان
مثال،
فراخوانی
زیر به
"memset"
رفتار
تعریفنشده
(undefined) دارد
زیرا شیء
کلاسیِ
غیربدیهی
را دستکاری
میکند و از
این رو
گزارش
میشود.
راهکار
ایمن برای
مقداردهی
اولیه یا
پاکسازی
حافظه
اشیایی از
این دست،
استفاده از
سازنده یا
عملگر
انتساب
مناسب است،
در صورتی که
موجود باشد.
std::string str = "abc"; memset (&str, 0, sizeof str);
گزینه -Wclass-memaccess توسط -Wall فعال میشود. تبدیل صریح (explicit cast) اشارهگر شیء کلاس به "void *" یا به نوعی که تابع حافظه خام بتواند به صورت ایمن به آن دسترسی پیدا کند، هشدار را فرومینشاند.
- -Wnon-virtual-dtor (تنها C++ و Objective-C++)
- هنگامی هشدار میدهد که کلاسی دارای توابع مجازی و خودش یا در یک کلاس پایه چندریختی (polymorphic) قابلدسترس، دارای یک مخرب غیرمجازی قابلدسترس باشد؛ در این حالت حذف نمونهای از کلاس مشتقشده از طریق اشارهگری به خود کلاس یا کلاس پایه، ممکن اما ناامن است. این هشدار در صورت تعیین -Weffc++ به طور خودکار فعال میشود. گزینه -Wdelete-non-virtual-dtor (فعالشده با -Wall) باید ترجیح داده شود زیرا درباره موارد ناامن بدون هشدارهای کاذب (false positive) هشدار میدهد.
- -Wregister (تنها C++ و Objective-C++)
- در صورت استفاده از مشخصهساز کلاس حافظه "register" هشدار میدهد، مگر زمانی که بخشی از افزونه GNU Explicit Register Variables باشد. استفاده از کلیدواژه "register" به عنوان مشخصهساز کلاس حافظه در C++11 منسوخ شده و در C++17 حذف گردیده است. به طور پیشفرض با -std=c++17 فعال میشود.
- -Wreorder (تنها C++ و Objective-C++)
- زمانی
هشدار
میدهد که
ترتیب
مقداردهندههای
اولیه اعضا
(member initializers) در کد با
ترتیبی که
باید اجرا
شوند
مطابقت
نداشته
باشد. برای
نمونه:
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
مبتنی بر
دامنه (range-based for-loop)
در 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++)
- در صورتی که یک نوع کلاس دارای کلاس پایهای یا فیلدی باشد که نوع آن از فضای نام ناشناس (anonymous namespace) استفاده میکند یا به نوعی بدون پیوند (no linkage) وابسته است، هشدار ندهد. اگر نوع A به نوع B با پیوند درونی یا بدون پیوند وابسته باشد، تعریف آن در چندین واحد ترجمه نقض ODR خواهد بود؛ زیرا معنای B در هر واحد ترجمه متفاوت است. اگر A تنها در یک واحد ترجمه ظاهر شود، بهترین راه برای فرونشاندن هشدار این است که با قرار دادن آن در یک فضای نام ناشناس، به آن نیز پیوند درونی داده شود. کامپایلر این هشدار را برای انواعی که در فایل اصلی .C تعریف شدهاند صادر نمیکند، زیرا بعید است که دارای تعاریف چندگانه باشند. -Wsubobject-linkage بهطور پیشفرض فعال است.
- -Weffc++ (فقط C++ و Objective-C++)
- دربارهٔ نقض رهنمودهای شیوهنامهای زیر از مجموعه کتابهای Effective C++ اثر اسکات مایرز (Scott Meyers) هشدار میدهد:
- تعریف یک سازندهٔ رونوشت و یک عملگر انتساب برای کلاسهایی با حافظهٔ تخصیصیافته به صورت پویا.
- ترجیح دادن مقداردهی اولیه به انتساب در سازندهها.
- برگرداندن ارجاعی به *this توسط "operator=".
- پرهیز از بازگرداندن ارجاع هنگامی که باید یک شیء برگردانده شود.
- تمایز قائل شدن بین شکلهای پیشوندی و پسوندی عملگرهای افزایش و کاهش.
- هرگز "&&"، "||"، یا "," را سربارگذاری نکنید.
این گزینه همچنین -Wnon-virtual-dtor را فعال میکند که آن هم یکی از توصیههای Effective C++ است. با این حال، این بررسی گسترش یافته تا دربارهٔ نبود مخرب مجازی در کلاسهای پایهٔ غیرچندریختی در دسترس نیز هشدار دهد.
هنگام انتخاب این گزینه آگاه باشید که سرآیندهای کتابخانهٔ استاندارد از همهٔ این رهنمودها پیروی نمیکنند؛ برای فیلتر کردن آن هشدارها از grep -v استفاده کنید.
- -Wno-exceptions (فقط C++ و Objective-C++)
- هشدار مربوط به حالتی را که یک گردانندهٔ استثنا زیر سایهٔ گردانندهٔ دیگری قرار میگیرد (shadowed میشود) غیرفعال میکند؛ این حالت میتواند نشاندهندهٔ ترتیب نادرست گردانندههای استثنا باشد.
- -Wstrict-null-sentinel (فقط C++ و Objective-C++)
- دربارهٔ استفاده از "NULL" بدون تبدیل نوع (uncasted) به عنوان نشانگر پایان (sentinel) هشدار میدهد. هنگام کامپایل تنها با GCC این یک مقدار پایان معتبر است، زیرا "NULL" به صورت "__null" تعریف شده است. اگرچه این مقدار به جای اشارهگر تهی یک ثابت اشارهگر تهی است، تضمین شده که هماندازه با یک اشارهگر باشد؛ ولی این کاربرد میان کامپایلرهای مختلف قابلحمل نیست.
- -Wno-non-template-friend (فقط C++ و Objective-C++)
- هنگامی که توابع دوستِ غیرقالب (non-template friend) درون یک قالب اعلان میشوند، هشدارها را غیرفعال میکند. در نسخههای بسیار قدیمی 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".
پسوند اختیاری سطح (level)، رفتار را زمانی کنترل میکند که همهٔ اعلانها در کلاس مشتقشده، توابع مجازی در کلاس پایه را بازنویسی (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)، ترفیع (promotion) از یک نوع بدونعلامت یا شمارشی به یک نوع علامتدار را بر تبدیل به نوع بدونعلامت هماندازه ترجیح میدهد، هشدار میدهد. نسخههای پیشین 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ها، الگوهای کلاس (class templates) و تخصیصهای ویژهٔ (specializations) آنها با یک class-key که با تعریف یا با اولین اعلان (در صورتی که تعریفی ارائه نشده باشد) مطابقت ندارد، هشدار میدهد.
برای نمونه، اعلان "struct Object" در فهرست آرگومانهای "draw" باعث فعال شدن هشدار میشود. برای جلوگیری از آن، یا class-key اضافیِ "struct" را حذف کنید یا آن را با "class" جایگزین نمایید تا با تعریف آن مطابقت داشته باشد.
class Object { public: virtual ~Object () = 0; }; void draw (struct Object*);همانطور که مثال بالا نشان میدهد، اعلان یک کلاس با class-key از نوع "struct" نادرست نیست. هدف گزینهٔ -Wmismatched-tags کمک به دستیابی به سبکی یکدست در اعلانهای کلاس است. در کدهایی که قرار است برای کامپایلرهای مبتنی بر Windows قابل حمل باشند، این هشدار به جلوگیری از ارجاعات حلنشده (unresolved references) ناشی از تفاوت در درهمسازی نمادها (symbol mangling) که با class-keyهای متفاوت اعلان شدهاند کمک میکند. این گزینه میتواند به تنهایی یا همراه با -Wredundant-tags استفاده شود.
- -Wmultiple-inheritance (فقط C++ و Objective-C++)
- هنگامی که کلاسی با چندین کلاس پایهٔ مستقیم (direct base classes) تعریف شود، هشدار میدهد. برخی قوانین کدنویسی وراثت چندگانه (multiple inheritance) را ممنوع میکنند و از این گزینه میتوان برای اعمال این قاعده استفاده کرد. این هشدار در داخل فایلهای سرایند سیستمی مانند STL غیرفعال است، بنابراین همچنان میتوان از STL استفاده کرد. همچنین میتوان کلاسهایی تعریف کرد که بهطور غیرمستقیم از وراثت چندگانه بهره میبرند.
- -Wvirtual-inheritance
- هنگامی که کلاسی با یک کلاس پایهٔ مستقیم مجازی (virtual direct base class) تعریف شود، هشدار میدهد. برخی قوانین کدنویسی وراثت چندگانه را ممنوع میکنند و از این گزینه میتوان برای اعمال این قاعده استفاده کرد. این هشدار در داخل فایلهای سرایند سیستمی مانند STL غیرفعال است، بنابراین همچنان میتوان از STL استفاده نمود. همچنین میتوان کلاسهایی تعریف کرد که بهطور غیرمستقیم از وراثت مجازی استفاده میکنند.
- -Wno-virtual-move-assign
- هشدارهای مربوط به ارثبری از یک پایهٔ مجازی دارای عملگر انتساب انتقال (move assignment operator) غیرساده (non-trivial) در C++11 را سرکوب میکند. این مسئله خطرناک است زیرا اگر پایهٔ مجازی از بیش از یک مسیر در دسترس باشد، چندین بار انتقال مییابد؛ به این معنی که هر دو شیء در وضعیت منتقلشده (moved-from) قرار میگیرند. اگر عملگر انتساب انتقال طوری نوشته شده باشد که از انتقال یک شیءِ منتقلشده جلوگیری کند، میتوان این هشدار را غیرفعال کرد.
- -Wnamespaces
- هنگامی که یک تعریف namespace باز شود، هشدار میدهد. برخی قوانین کدنویسی namespaceها را ممنوع میکنند و از این گزینه میتوان برای اعمال این قاعده استفاده کرد. این هشدار در داخل فایلهای سرایند سیستمی مانند STL غیرفعال است، بنابراین همچنان میتوان از STL استفاده کرد. همچنین میتوان از رهنمودهای using و نامهای واجد شرایط (qualified names) استفاده کرد.
- -Wno-template-body (فقط C++ و Objective-C++)
- تشخیص خطاها را هنگام تجزیهٔ (parsing) یک الگو (template) غیرفعال میکند و در عوض خطا را تنها هنگام نمونهسازی (instantiation) الگو صادر مینماید. از این پرچم میتوان برای تنزل دادن چنین خطاهایی به هشدار با استفاده از Wno-error= یا -fpermissive نیز استفاده کرد.
- -Wno-template-id-cdtor (فقط C++ و Objective-C++)
- هشدار
مربوط به
استفاده از
simple-template-id به
عنوان declarator-id
برای یک
سازنده (constructor)
یا ویرانگر
(destructor) را که بر
اساس DR 2237 در C++20
نامعتبر
شد،
غیرفعال
میکند.
برای مثال:
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
- هنگامی که
بدنهٔ یک
الگو،
افشای (exposure) یک
موجودیت
محلیِ واحد
ترجمه (translation-unit-local entity)
را پنهان
میکند،
هشدار
میدهد. در
بیشتر
موارد،
ارجاع به یک
موجودیت
محلیِ واحد
ترجمه
(مانند یک
اعلان با
پیوند
درونی / internal linkage)
در
موجودیتی
که به CMI یک
ماژول
منتقل
میشود،
خطا است. با
این حال، در
مقداردهندهٔ
اولیهٔ یک
متغیر یا در
بدنهٔ یک
تابع غیر 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++)
- هنگامی که یک تابع تبدیل (conversion function) شیئی را به همان نوع، به یک کلاس پایه از آن نوع، یا به void تبدیل میکند، هشدار نمیدهد؛ چنین تابع تبدیلی هرگز فراخوانی نخواهد شد.
- -Wvolatile (فقط C++ و Objective-C++)
- دربارهٔ
کاربردهای
منسوخشدهٔ
توصیفگر
"volatile"
هشدار
میدهد. این
شامل
عبارتهای
پسوندی و
پیشوندی
"++" و
"--" برای
نوعهای
دارای
توصیفگر
"volatile"،
استفاده از
انتسابهای
ساده در
مواردی که
عملوند چپ
یک نوع
غیرکلاسی
با
توصیفگر
"volatile" است
برای مقدار
آنها،
انتسابهای
مرکب که در
آنها
عملوند چپ
یک نوع
غیرکلاسی
مقید به
"volatile"
است، نوع
بازگشتی
تابع با
توصیفگر
"volatile"،
نوع
پارامتر با
توصیفگر
"volatile"، و
اتصالهای
ساختیافته
(structured bindings) از نوع
مقید به
"volatile"
میشود. این
کاربردها
در C++20 منسوخ
شدهاند.
بهطور پیشفرض با -std=c++20 فعال است. پیش از -std=c++20، با استفادهٔ صریح از -Wdeprecated فعال میشود.
- -Waligned-new
- دربارهٔ
عبارت new
برای نوعی
که به
ترازبندی
(alignment) بیشتری
نسبت به
alignof(std::max_align_t)
نیاز دارد
اما از یک
تابع تخصیص
بدون
پارامتر
ترازبندی
صریح
استفاده
میکند،
هشدار
میدهد. این
گزینه توسط
-Wall فعال
میشود.
بهطور معمول این گزینه فقط دربارهٔ توابع تخصیص سراسری هشدار میدهد، اما -Waligned-new=all دربارهٔ توابع تخصیص عضو کلاس نیز هشدار صادر میکند.
- -Wno-placement-new
- -Wplacement-new=n
- دربارهٔ
عبارتهای
placement new با رفتار
تعریفنشده
(undefined behavior) هشدار
میدهد،
مانند ساخت
یک شیء در
بافری که از
اندازهٔ
نوع آن شیء
کوچکتر
است. برای
مثال،
عبارت 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++)
- دربارهٔ ساختارهای conditionally-supported (C++11 [intro.defs]) هشدار میدهد.
- -Wno-defaulted-function-deleted (فقط C++ و Objective-C++)
- هنگامی که یک تابع با پیشفرض صریح (explicitly 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
- هشدارهای مربوط به استفاده از سازندههای ارثبریشدهٔ (inheriting constructors) استاندارد C++11 را در حالتی که کلاس پایهٔ به ارثرسیده دارای سازندهٔ متغیرآرگومان C (C variadic) باشد، سرکوب میکند؛ این هشدار بهطور پیشفرض فعال است زیرا بیضی (...) به ارث برده نمیشود.
- -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
function)
void operator delete (void *) noexcept; void operator delete[] (void *) noexcept;
بدون تعریف تابع آزادسازی متناظر آن با اندازه (sized deallocation function)
void operator delete (void *, std::size_t) noexcept; void operator delete[] (void *, std::size_t) noexcept;
یا برعکس، هشدار میدهد. این هشدار توسط -Wextra همراه با -fsized-deallocation فعال میشود.
- -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
- دربارهٔ بازنویسی (overriding) توابع مجازی که با کلیدواژهٔ "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 بهعنوان نام کلاسی استفاده میکند که برای هر رشتهٔ دقیق (literal) مشخصشده با نحو "@"..."" نمونهسازی (instantiate) شود. در صورت استفاده از رانتایم 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]") در این واحد ترجمه، اطمینان میدهند که گیرنده برابر با "nil" نیست. این کار امکان استفاده از نقاط ورود کارآمدتر در زمان اجرا (runtime) را فراهم میسازد. این گزینه تنها در ترکیب با رانتایم NeXT و نسخهٔ 0 یا 1 از ABI در دسترس است.
- -fobjc-abi-version=n
- استفاده از نسخهٔ n از ABI زبان Objective-C برای رانتایم انتخابشده. این گزینه در حال حاضر تنها برای رانتایم NeXT پشتیبانی میشود. در آن حالت، نسخهٔ 0 همان ABI سنتی (۳۲ بیتی) بدون پشتیبانی از مشخصهها (properties) و دیگر افزونههای Objective-C 2.0 است. نسخهٔ 1، ABI سنتی (۳۲ بیتی) همراه با پشتیبانی از مشخصهها و دیگر افزونههای Objective-C 2.0 است. نسخهٔ 2، ABI مدرن (۶۴ بیتی) است. اگر چیزی تعیین نشود، پیشفرض روی ماشینهای مقصد ۳۲ بیتی نسخهٔ 0 و روی ماشینهای مقصد ۶۴ بیتی نسخهٔ 2 خواهد بود.
- -fobjc-call-cxx-cdtors
- برای هر
کلاس Objective-C،
بررسی
میکند که
آیا هر یک
از
متغیرهای
نمونهٔ آن
یک شیء C++ با
یک سازنده
پیشفرض
غیربدیهی
(non-trivial default constructor) است
یا خیر. در
این صورت،
یک متد
نمونهٔ
ویژه به نام
"- (id) .cxx_construct"
میسازد که
سازندههای
پیشفرض
غیربدیهی
را روی تمام
چنین
متغیرهای
نمونهای
به ترتیب
اجرا کرده و
سپس "self"
را
بازمیگرداند.
بهطور
مشابه،
بررسی
میکند که
آیا متغیر
نمونهای
شیء C++ با یک
مخرب
غیربدیهی
(non-trivial destructor) است یا
نه، و در
این صورت،
یک متد
ویژهٔ "- (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 با نسخهٔ 2 از 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]
- دیدپذیری پیشفرض متغیرهای نمونه را روی گزینهٔ مشخصشده تنظیم میکند تا متغیرهای نمونهای که بیرون از حوزهٔ هرگونه رهنمود اصلاحکنندهٔ دسترسی اعلان شدهاند، بهطور پیشفرض دیدپذیری تعیینشده را داشته باشند.
- -gen-decls
- تخلیهٔ اعلانهای رابط (interface declarations) برای همهٔ کلاسهای دیدهشده در فایل مبدأ درون فایلی با نام sourcename.decl.
- -Wassign-intercept (فقط Objective-C و Objective-C++)
- هرگاه یک انتساب Objective-C توسط زبالهروب رهگیری شود، هشدار میدهد.
- -Wno-property-assign-default (فقط Objective-C و Objective-C++)
- اگر برای یک ویژگی (property) در یک شیء Objective-C هیچ معناشناسی انتسابی مشخص نشده باشد، هشداری صادر نمیکند.
- -Wno-protocol (فقط Objective-C و Objective-C++)
- اگر کلاسی برای پیادهسازی یک پروتکل اعلان شده باشد، برای هر متدی در پروتکل که توسط کلاس پیادهسازی نشده باشد، هشداری صادر میشود. رفتار پیشفرض این است که برای هر متدی که صراحتاً در کلاس پیادهسازی نشده است هشدار صادر شود، حتی اگر پیادهسازی یک متد از ابرکلاس به ارث رسیده باشد. اگر از گزینهٔ -Wno-protocol استفاده کنید، متدهای به ارث رسیده از ابرکلاس پیادهسازیشده تلقی میشوند و هیچ هشداری برای آنها صادر نمیشود..IP "-Wobjc-root-class (فقط Objective-C و Objective-C++)" 4 اگر واسط یک کلاس فاقد کلاس والد (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 تولید میکند که بزرگترین ساختار پاس دادهشده با مقدار (pass-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 آزادقالب (free-form)، و !$acc، c$acc و *$acc در Fortran ثابتقالب (fixed-form) را فعال میکند. این گزینه مستلزم -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" مشخصشده به ناحیهٔ وظیفهٔ (task region) جاری متصل میشود.
- -fopenmp-target-simd-clone
- -fopenmp-target-simd-clone=device-type
- علاوه بر
تولید
کلونهای SIMD
برای توابع
نشانهگذاریشده
با
دایرکتیو
"declare simd"،
هنگام فعال
بودن این
گزینه، GCC
برای توابع
نشانهگذاریشده
با
دایرکتیو
"declare target" در OpenMP
که برای
برداریسازی
مناسب
هستند نیز
کلونهایی
تولید
میکند.
مقدار 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 و نیز مشخصهٔ 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
- تنها در حالت شکست خط معنیدار است. به گزارشگر پیامهای عیبیابی دستور میدهد که همان اطلاعات مکان در منبع را (بهعنوان پیشوند) برای خطوط فیزیکی حاصل از شکستن پیامی که برای قرارگیری در یک خط واحد بیش از اندازه طولانی است، درج کند.
- -fdiagnostics-color[=WHEN]
- -fno-diagnostics-color
- استفاده از
رنگ در
پیامهای
عیبیابی.
مقدار WHEN
برابر با
never، always یا auto
است. مقدار
پیشفرض به
نحوهٔ
پیکربندی
کامپایلر
بستگی
دارد؛
میتواند
هر یک از
گزینههای
WHEN بالا
باشد یا در
صورتی که
متغیر
محیطی GCC_COLORS
در محیط
وجود
نداشته
باشد never و در
غیر این
صورت auto
خواهد بود.
auto باعث
میشود GCC
تنها زمانی
از رنگ
استفاده
کند که
خروجی خطای
استاندارد
(standard error) یک
ترمینال
باشد و
دستور در
پوستهٔ emacs
اجرا نشود.
صورتهای
-fdiagnostics-color و -fno-diagnostics-color
بهترتیب
نامهای
مستعاری
برای -fdiagnostics-color=always
و -fdiagnostics-color=never
هستند.
رنگها با متغیر محیطی GCC_COLORS تعریف میشوند. مقدار آن فهرستی جداشده با دونقطه از قابلیتها و زیررشتههای Select Graphic Rendition (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= چاپ میشوند؛ مانند شناسههای رخدادهای منفرد و خطوط نشاندهندهٔ فراخوانیها و بازگشتهای بینروالی.
- "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 برای سرآیند نام فایلها در وصلههای تولیدشده.
- "diff-hunk="
- زیررشتهٔ SGR برای آغاز قطعهها (hunks) در وصلههای تولیدشده.
- "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 تنظیم شده باشد، آدرسهای وب در پیامهای تشخیصی تعبیه نمیشوند. اگر روی st تنظیم شود، آدرسهای وب از دنبالههای گریز ST استفاده میکنند. اگر روی bel (پیشفرض) تنظیم شود، آدرسهای وب از دنبالههای گریز BEL استفاده میکنند. هر مقدار غیرخالی دیگری این ویژگی را فعال میکند. اگر GCC_URLS تنظیم نشده باشد، از TERM_URLS به عنوان جایگزین استفاده میشود. نکته: ST یک دنبالهٔ گریز ANSI و پایاندهندهٔ رشته ESC \ است؛ BEL یک نویسهٔ ASCII (همان CTRL-G) است که معمولاً صدایی مانند بوق (beep) پخش میکند.
در حال حاضر GCC تلاش میکند چند ترمینال را که عدم پشتیبانی آنها از ویژگی URL شناخته شده است، و دارای باگ هستند یا دستکم در برخی از نسخههایی که هنوز در حال استفاده هستند باگ داشتهاند و احتمال دارد دنبالههای گریز URL در آنها رفتار نادرست داشته باشند (یعنی نویسههای نامفهوم روی صفحه چاپ کنند)، شناسایی کند. این فهرست در حال حاضر شامل xfce4-terminal، برخی نسخههای gnome-terminal که دارای باگ شناخته شدهاند، کنسول linux، و mingw است. این بررسی را میتوان با -fdiagnostics-urls=always نادیده گرفت.
- -fno-diagnostics-show-option
- بهطور پیشفرض، هر پیام تشخیصی صادرشده شامل متنی است که گزینهٔ خط فرمانی را که مستقیماً آن تشخیص را کنترل میکند نشان میدهد (اگر چنین گزینهای برای سازوکار تشخیص شناخته شده باشد). مشخص کردن پرچم -fno-diagnostics-show-option از این رفتار جلوگیری میکند.
- -fno-diagnostics-show-caret
- بهطور پیشفرض، هر پیام تشخیصی صادرشده شامل خط اصلی کد منبع و یک علامت مکاننما (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 را کنترل میکند. مقدار پیشفرض آن ۶ است.
- -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) را پس از چاپ هرگونه پیام تشخیصی، در قالب unified diff در stderr چاپ میکند. برای مثال:
--- 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++، هنگام
چاپ
پیامهای
تشخیصی که
عدم تطابق
نوعهای
الگو را
نشان
میدهند،
مانند:
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) با گروهبندی رویدادها بر اساس فریم پشته، و استفاده از تورفتگی برای نشان دادن چگونگی لانهگزینی، 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 مبدأ شماره ستونها را انتخاب میکند، یعنی شماره ستونی که به نخستین ستون اختصاص داده میشود. مقدار پیشفرض ۱ با رفتار سنتی GCC و راهنمای سبک GNU مطابقت دارد. برخی ابزارها ممکن است با مبدأ ۰ عملکرد بهتری داشته باشند؛ هر مقدار غیرمنفی را میتوان مشخص کرد.
- -fdiagnostics-escape-format=FORMAT
- هنگامی که GCC
خطوط مبدأ
مربوطه را
برای یک
پیام
عیبیابی
چاپ
میکند،
معمولاً
تلاش
میکند
بایتهای
مبدأ را
مستقیماً
چاپ کند. با
این حال،
برخی از
پیامهای
عیبیابی
به مسائل
کدگذاری در
فایل مبدأ
مربوط
میشوند،
مانند UTF-8
ناصحیح، یا
مسائل
مربوط به
نرمالسازی
یونیکد. این
پیامهای
عیبیابی
نشانهگذاری
میشوند تا
GCC هنگام چاپ
خطوط مبدأ
مربوط به
آنها،
بایتهایی
را که اسکی
قابل چاپ
نیستند،
گریزدهی (escape)
کند.
این گزینه چگونگی گریزدهی چنین بایتهایی را کنترل میکند.
قالب پیشفرض (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> نمایش میدهد، و بدین ترتیب کدگذاری زیرین نویسههای یونیکد غیر اسکی را نشان خواهد داد. برای نمونه بالا، خروجی زیر چاپ خواهد شد:
before<CF><80><BF>after
- -fdiagnostics-text-art-charset=CHARSET
- برخی
پیامهای
عیبیابی
میتوانند
شامل
نمودارهای
«هنر متنی»
(text art) باشند:
مصورسازیهایی
که از متن
ایجاد
شدهاند و
برای
مشاهده در
یک قلم
تکفاصله
(monospaced) در نظر
گرفته
شدهاند.
این گزینه مشخص میکند که در صورت وجود، چه نویسههایی برای چاپ چنین نمودارهایی استفاده شوند. مقدار CHARSET میتواند none، ascii، unicode یا emoji باشد.
مقدار none از چاپ چنین نمودارهایی جلوگیری میکند. مقدار ascii اطمینان حاصل میکند که این نمودارها صرفاً اسکی («هنر اسکی») باشند. مقدار 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 برای حذف این فاصلههای خالی استفاده کنید. این گزینه باید پیش از گزینهای که قرار است بر آن تأثیر بگذارد، مشخص شود.
این قابلیت به منظور سازگاری با ابزارهایی در نظر گرفته شده است که انتظار ندارند خروجی حاوی خطوط جدید باشد، مانند خروجی تولیدشده توسط نگارشهای قدیمیتر 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 را فعال سازد. اثر ترکیبی حالتهای مثبت و منفی بدین گونه است که گزینههای خاصتر، مستقل از موقعیتشان در خط فرمان، بر گزینههای کمتر خاص اولویت دارند. برای گزینههایی با درجه اختصاصی بودن یکسان، آخرین گزینه اعمال میشود. گزینههای فعال یا غیرفعالشده از طریق pragmaها به گونهای اعمال میشوند که گویی در انتهای خط فرمان قرار گرفتهاند.
هنگامی که یک گزینه هشدار ناشناخته درخواست شود (برای نمونه، -Wunknown-warning)، GCC خطایی صادر کرده و اعلام میکند که گزینه ناشناخته است. با این حال، اگر از شکل -Wno- استفاده شود، رفتار کمی متفاوت خواهد بود: هیچ پیام تشخیصی برای -Wno-unknown-warning تولید نمیشود مگر اینکه پیامهای تشخیصی دیگری در حال تولید باشند. این سازوکار امکان استفاده از گزینههای جدید -Wno- را در کامپایلرهای قدیمی فراهم میکند، اما اگر مشکلی پیش بیاید، کامپایلر هشدار میدهد که یک گزینه ناشناخته وجود دارد.
اثربخشی برخی هشدارها به فعال بودن بهینهسازیها نیز بستگی دارد. برای نمونه، -Wsuggest-final-types همراه با بهینهسازی زمان پیوند (link-time optimization) اثربخشتر است. برخی هشدارهای دیگر ممکن است اصلاً صادر نشوند مگر اینکه بهینهسازی فعال باشد. در حالی که بهینهسازی بهطور کلی کارایی هشدارها را درباره مشکلات جریان کنترل و جریان داده بهبود میبخشد، در برخی موارد ممکن است باعث هشدارهای مثبت کاذب (false positives) نیز بشود.
- -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 برای استفاده از کلیدواژههای جایگزینی که نامشان با __ آغاز و پایان مییابد، پیام هشداری صادر نمیکند. این قالب جایگزین همچنین میتواند برای غیرفعال کردن هشدارها برای انواع داده غیر استاندارد __intN، یعنی __intN__ به کار رود. هشدارهای سختگیرانه (pedantic) در عبارتی که پس از "__extension__" میآید نیز غیرفعال میشوند. با این وجود، تنها فایلهای هدر سیستمی مجازند از این راههای فرار استفاده کنند؛ برنامههای کاربردی باید از آنها دوری گزینند.
برخی هشدارها در مورد برنامههای ناسازگار با استاندارد، توسط گزینههایی غیر از -Wpedantic کنترل میشوند؛ در بسیاری از موارد این هشدارها تلویحاً با -Wpedantic فعال میشوند اما میتوان آنها را بهطور جداگانه با گزینه اختصاصیشان غیرفعال کرد، مانند -Wpedantic -Wno-pointer-sign.
در مواردی که استاندارد مشخصشده با -std نشاندهنده یک گویش گسترشیافته GNU از C باشد، مانند gnu90 یا gnu99، یک base standard (استاندارد پایه) متناظر وجود دارد، یعنی نسخهای از ISO C که گویش گسترشیافته GNU بر پایه آن استوار است. هشدارهای -Wpedantic در مواردی داده میشوند که استاندارد پایه آنها را الزامی کرده باشد. (منطقی نیست که چنین هشدارهایی فقط برای قابلیتهایی صادر شوند که در گویش مشخصشده GNU C وجود ندارند، چرا که طبق تعریف، گویشهای GNU C شامل تمام قابلیتهایی هستند که کامپایلر با گزینه دادهشده پشتیبانی میکند و در نتیجه چیزی برای هشدار دادن وجود نخواهد داشت.)
- -pedantic-errors
- هر زمان که base
standard
(استاندارد
پایه، -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++) کلاسهای پایهٔ مجازی مبهم (ambiguous virtual bases).
- (فقط C++) اندیسگذاری روی آرایهای که با مشخصهٔ "register" اعلان شده است.
- (فقط C++) گرفتن آدرس متغیری که با مشخصهٔ "register" اعلان شده است.
- (فقط C++) یک کلاس پایه در سازندهٔ رونوشت (copy constructor) یک کلاس مشتقشده مقداردهی اولیه نشود.
- -Wabi (فقط C، Objective-C، C++ و Objective-C++)
- در مورد
کدهایی که
تحت تأثیر
تغییرات ABI
قرار
گرفتهاند
هشدار
میدهد. این
شامل
کدهایی است
که ممکن است
با ABI بیطرف
نسبت به
سازندهٔ C++
(vendor-neutral C++ ABI) و
همچنین psABI
مربوط به
معماری
مقصد خاص
ناسازگار
باشند.
هشدارهای
مربوط به
مورد دوم به
صورت
جداگانه
توسط -Wpsabi نیز
کنترل
میشوند،
که به طور
ضمنی با -Wabi
فعال
میگردد.
از آنجا که G++ اکنون به طور پیشفرض ABI را با هر انتشار عمده بهروزرسانی میکند، معمولاً -Wabi تنها زمانی در مورد مشکلات سازگاری ABI در C++ هشدار میدهد که بررسی جدیدی برای یک مشکل ABI کشفشده پس از انتشار اولیه، بعداً به یک سری انتشار اضافه شده باشد. در صورتی که نسخهٔ قدیمیتری از ABI (با -fabi-version=n) انتخاب شده باشد، -Wabi درباره موارد بیشتری هشدار میدهد.
همچنین میتوان از -Wabi با یک شمارهٔ نسخهٔ صریح استفاده کرد تا در مورد سازگاری ABI در C++ با یک سطح خاص از -fabi-version هشدار دهد؛ به عنوان مثال -Wabi=2 برای هشدار دادن درباره تغییرات نسبت به -fabi-version=2.
اگر شمارهٔ نسخه به صورت صریح مشخص شود و -fabi-compat-version تعیین نشده باشد، شمارهٔ نسخهٔ این گزینه برای نامهای مستعار سازگاری (compatibility aliases) استفاده میشود. اگر هیچ شمارهٔ نسخهٔ صریحی با این گزینه ارائه نشود، اما -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))" اعلان
میشدند،
بهروشی
غیراستاندارد
درهمسازی
میشدند که
امکان
سربارگذاری
(overloading) توابعی
با
بردارهایی
با
اندازههای
مختلف را
فراهم
نمیکرد.
نحوه درهمسازی در -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)
بهنادرستی
دارای تراز
(alignment) ۱ بود که
منجر به
دسترسیهای
غیرهمتراز
میشد. توجه
داشته
باشید که
این مورد بر
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++
ایجاب
میکند که
استفادههای
بدون
صلاحیت (unqualified)
از یک نام
در یک کلاس،
در کل حوزه
کلاس دارای
معنای
یکسانی
باشند؛
بنابراین
اعلان یک
نام پس از
استفاده از
آن، نادرست
(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" باشد، هشدار میدهد. این یک علت شایع خطا است، زیرا برنامهنویسان اغلب فراموش میکنند که این نوع در برخی ماشینها علامتدار است. این هشدار با -Wall فعال میشود.
- -Wno-coverage-mismatch
- هنگام استفاده از گزینه -fprofile-use، در صورتی که نمایههای بازخورد (feedback profiles) مطابقت نداشته باشند، هشدار میدهد. اگر یک فایل مبدأ بین کامپایل با -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 Specification بیان میدارد که چنین آرگومانهای استفادهنشدهای مجاز هستند.
- -Wformat-overflow
- -Wformat-overflow=level
- هشدار دربارهٔ فراخوانیهای توابع ورودی/خروجی قالببندیشده مانند "sprintf" و "vsprintf" که ممکن است باعث سرریز بافر مقصد شوند. زمانی که نتوان تعداد دقیق بایتهای نوشتهشده توسط یک دستورالعمل قالب را در زمان کامپایل مشخص کرد، این مقدار بر اساس روشهای اکتشافی که به آرگومان level و بهینهسازی وابستهاند تخمین زده میشود. اگرچه فعال کردن بهینهسازی در بیشتر موارد دقت هشدار را بهبود میبخشد، اما ممکن است به هشدارهای مثبت کاذب (false positives) نیز منجر شود.
- -Wformat-overflow
- -Wformat-overflow=1
- سطح 1 از
-Wformat-overflow که با -Wformat
فعال
میشود،
رویکردی
محافظهکارانه
را به کار
میبندد که
فقط
دربارهٔ
فراخوانیهایی
که به
احتمال
بسیار زیاد
باعث سرریز
بافر
میشوند
هشدار
میدهد. در
این سطح،
آرگومانهای
عددی با
مقادیر
نامعلوم
برای
دستورالعملهای
قالب،
دارای
مقدار یک
فرض
میشوند و
رشتههای
با طول
نامعلوم،
خالی در نظر
گرفته
میشوند.
برای
آرگومانهای
عددی که
مشخص است به
زیرمحدودهای
از نوع خود
محدود
شدهاند،
یا
آرگومانهای
رشتهای که
خروجی
آنها چه
توسط دقت
دستورالعمل
مربوطه یا
مجموعهای
متناهی از
رشتههای
صریح (string literals)
محدود شده
باشد،
مقداری
درون آن
محدوده فرض
میشود که
بیشترین
بایت خروجی
را تولید
کند. برای
مثال،
فراخوانی
به "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 یا تبدیل نوع (cast) آرگومان به "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، همچنین اگر رشتهٔ قالب نیازمند یک آرگومان بدون علامت (unsigned) باشد و آرگومان علامتدار (signed) باشد و برعکس، هشدار داده شود.
- -Wformat-truncation
- -Wformat-truncation=level
- هشدار دربارهٔ فراخوانیهای توابع ورودی/خروجی قالببندیشده مانند "snprintf" و "vsnprintf" که ممکن است به کوتاه شدن (truncation) خروجی منجر شوند. هنگامی که تعداد دقیق بایتهای نوشتهشده توسط یک دستورالعمل قالب را نتوان در زمان کامپایل تعیین کرد، بر اساس روشهای اکتشافی که به آرگومان level و بهینهسازی وابسته هستند تخمین زده میشود. اگرچه فعالسازی بهینهسازی در بیشتر موارد دقت هشدار را بهبود میبخشد، اما ممکن است به هشدارهای مثبت کاذب نیز منجر شود. به جز مواردی که خلاف آن ذکر شده باشد، این گزینه از همان منطق -Wformat-overflow استفاده میکند.
- -Wformat-truncation
- -Wformat-truncation=1
- سطح 1 از -Wformat-truncation که با -Wformat فعال میشود، رویکردی محافظهکارانه را به کار میبندد که فقط دربارهٔ فراخوانی توابع محدودشدهای هشدار میدهد که مقدار بازگشتی آنها بدون استفاده مانده است و به احتمال بسیار زیاد به کوتاه شدن خروجی منجر خواهند شد.
- -Wformat-truncation=2
- سطح 2 علاوه بر این، دربارهٔ فراخوانی توابع محدودشدهای هشدار میدهد که مقدار بازگشتی آنها استفاده شده است و ممکن است در صورت وجود آرگومانی با طول یا بزرگی کافی، به کوتاه شدن خروجی منجر شوند.
- -Wformat-y2k
- در صورت
تعیین -Wformat،
همچنین
دربارهٔ
قالبهای
"strftime" که
ممکن است
سال را تنها
به صورت دو
رقمی تولید
کنند هشدار
داده شود..IP
-Wnonnull 4 هنگامی
که یک
اشارهگر
تهی (null pointer) برای
آرگومانهایی
ارسال شود
که با صفت
تابعی
"nonnull" به
عنوان
نیازمند
مقدار
غیرتهی
مشخص
شدهاند،
هشدار
میدهد.
گزینهٔ -Wnonnull در -Wall و -Wformat گنجانده شده است. این گزینه میتواند با گزینهٔ -Wno-nonnull غیرفعال شود.
- -Wnonnull-compare
- هنگامی که
یک آرگومان
نشانهگذاریشده
با صفت
تابعی
"nonnull"
درون تابع
با null مقایسه
شود، هشدار
میدهد.
گزینهٔ -Wnonnull-compare در -Wall گنجانده شده است. این گزینه میتواند با گزینهٔ -Wno-nonnull-compare غیرفعال شود.
- -Wnull-dereference
- اگر کامپایلر مسیرهایی را شناسایی کند که به دلیل ارجاعزدایی از یک اشارهگر تهی، رفتار نادرست یا رفتار تعریفنشده (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++)
- اگر
کامپایلر
از رونوشت (copy)
یک متغیر
محلی به
مقدار
بازگشتی
تابع در
بستری که
توسط [class.copy.elision]
مجاز
دانسته شده
صرفنظر
نکند (elide
نکند)،
هشدار
میدهد. این
حذف رونوشت
معمولاً با
نام
بهینهسازی
مقدار
بازگشتی
نامگذاریشده
(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)
- این گزینه
هشدارهایی
را کنترل
میکند که
در هنگام
مشخص نشدن
نوع در یک
اعلان (declaration)
صادر
میشوند.
این هشدار
بهطور
پیشفرض،
به صورت یک
خطا، در 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
- هنگامی که
یک مورد switch
بدون break به
مورد بعدی
سرریز کند (fall
through)، هشدار
میدهد.
برای نمونه:
switch (cond) { case 1: a = 1; break; case 2: a = 2; case 3: a = 3; break; }این هشدار در صورتی که آخرین دستور یک مورد نتواند به مورد بعدی سرریز کند هشداری صادر نمیکند؛ برای نمونه هنگامی که یک دستور 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 مطلوب است، GCC صفتی به نام "__attribute__ ((fallthrough))" ارائه میدهد که باید همراه با یک دستور پوچ (null statement) برای فرونشاندن این هشدار که در حالت عادی رخ میداد، استفاده شود: switch (cond) { case 1: bar (0); __attribute__ ((fallthrough)); default: ... }
استاندارد C++17 روشی استاندارد برای فرونشاندن هشدار -Wimplicit-fallthrough با استفاده از "[[fallthrough]];" بهجای صفت GNU فراهم میکند. در C++11 یا C++14، کاربران میتوانند از "[[gnu::fallthrough]];" که یک افزونهٔ GNU است، استفاده کنند. بهجای این صفتها، همچنین امکان افزودن یک کامنت 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 انواع
بازگشتی
"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= برای تعیین همتراز بودن دستورها استفاده میکند (مقدار پیشفرض ۸ است).
این هشدار برای کدهایی که دارای منطق چندخطی پیشپردازنده هستند، مانند مثال زیر، صادر نمیشود.
if (flagA) foo (0); #if SOME_CONDITION_THAT_DOES_NOT_HOLD if (flagB) #endif foo (1);این هشدار پس از یک دستورالعمل "#line" صادر نمیشود، زیرا این مورد معمولاً نشاندهندهٔ کد تولیدشده بهصورت خودکار است و هیچ فرضی در مورد چیدمان فایلی که دستورالعمل به آن ارجاع میدهد نمیتوان داشت.
این هشدار توسط -Wall در C و C++ فعال میشود.
- -Wmissing-attributes
- زمانی که
اعلان یک
تابع فاقد
یک یا چند
صفت باشد که
تابع مرتبط
با آن
صفتها
اعلان شده
است و نبود
آنها ممکن
است بر
درستی یا
کارایی کد
تولیدشده
تأثیر منفی
بگذارد،
هشدار
میدهد.
برای
نمونه، این
هشدار برای
اعلان
نامهای
مستعاری (alias)
صادر
میشود که
از صفتها
برای تعیین
نیازمندیهای
با محدودیت
کمتر نسبت
به اهداف
خود
استفاده
میکنند.
این امر
معمولاً
نشاندهندهٔ
یک فرصت
بالقوه
برای
بهینهسازی
است. در
مقابل،
گزینهٔ
-Wattribute-alias=2
هشدارهای
صادرشده در
شرایطی را
کنترل
میکند که
نام مستعار
محدودکنندهتر
از هدف
باشد، که
این موضوع
میتواند
به تولید کد
نادرست
منجر شود.
صفتهای
بررسیشده
عبارتند از:
"alloc_align"،
"alloc_size"،
"cold"،
"const"،
"hot"،
"leaf"،
"malloc"،
"nonnull"،
"noreturn"،
"nothrow"،
"pure"،
"returns_nonnull" و
"returns_twice".
در C++، این هشدار زمانی صادر میشود که یک تخصیص صریح (explicit specialization) از یک الگوی اصلیِ اعلانشده با صفتهای "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
- اگر
پرانتزها
در شرایط
خاصی حذف
شده باشند
هشدار
میدهد،
مانند
زمانی که
انتساب در
زمینهای
رخ دهد که
مقدار بولی
مورد
انتظار
است، یا
زمانی که
عملگرهایی
تو در تو
استفاده
شدهاند که
تقدم آنها
اغلب افراد
را دچار
سردرگمی
میکند.
همچنین اگر مقایسهای مانند "x<=y<=z" رخ دهد هشدار میدهد؛ این معادل "(x<=y ? 1 : 0) <= z" است که با تفسیر ریاضی معمول تفاوت دارد.
همچنین در مورد استفادههای خطرناک از افزونهی گنو برای "?:" با عملوند میانیِ حذفشده هشدار میدهد. وقتی شرط در عملگر "?": یک عبارت بولی باشد، مقدار حذفشده همیشه ۱ است. اغلب برنامهنویسان در عوض انتظار دارند مقداری باشد که درون عبارت شرطی محاسبه شده است.
برای 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
- دربارهی
کدهایی که
ممکن است به
دلیل نقض
قواعد نقاط
توالی در
استانداردهای
C و C++
معناشناسی
تعریفنشده
داشته
باشند،
هشدار
میدهد.
استانداردهای C و C++ ترتیبی را که عبارات در یک برنامهی C/C++ ارزیابی میشوند بر اساس نقاط توالی تعریف میکنند؛ نقاط توالی نمایانگر یک ترتیب جزئی بین اجرای بخشهای مختلف برنامه هستند: بخشهایی که قبل از نقطهی توالی اجرا میشوند، و بخشهایی که پس از آن اجرا میشوند. این نقاط پس از ارزیابی یک عبارت کامل (عبارتی که بخشی از یک عبارت بزرگتر نیست)، پس از ارزیابی اولین عملوند عملگرهای "&&"، "||"، "? :" یا "," (کاما)، قبل از فراخوانی یک تابع (اما پس از ارزیابی آرگومانهای آن و عبارتی که تابع فراخواندهشده را مشخص میکند)، و در نقاط خاص دیگری رخ میدهند. به جز مواردی که قواعد نقاط توالی بیان کردهاند، ترتیب ارزیابی زیرعبارتهای یک عبارت نامشخص است. همهی این قواعد فقط یک ترتیب جزئی را به جای یک ترتیب کلی بیان میکنند، چرا که به عنوان مثال، اگر دو تابع درون یک عبارت بدون وجود نقطهی توالی بین آنها فراخوانی شوند، ترتیبی که در آن توابع فراخوانی میشوند نامشخص است. با این حال، کمیتهی استاندارد تعیین کرده است که فراخوانیهای توابع همپوشانی ندارند.
مشخص نشده است که در چه زمانی بین نقاط توالی، تغییر در مقادیر شیءها اعمال میشود. برنامههایی که رفتار آنها به این موضوع وابسته است، رفتار تعریفنشده دارند؛ استانداردهای C و C++ مشخص میکنند که «بین نقطهی توالی قبلی و بعدی، یک شیء باید مقدار ذخیرهشدهی خود را حداکثر یک بار بر اثر ارزیابی یک عبارت تغییر یافته ببیند. علاوه بر این، مقدار قبلی فقط برای تعیین مقداری که قرار است ذخیره شود باید خوانده شود.». اگر برنامهای این قوانین را نقض کند، نتایج در هر پیادهسازی خاص کاملاً غیرقابل پیشبینی خواهد بود.
نمونههایی از کدهایی با رفتار تعریفنشده عبارتند از "a = a++;"، "a[n] = b[n++]" و "a[i++] = i;". برخی از موارد پیچیدهتر توسط این گزینه شناسایی نمیشوند و ممکن است گاهی نتیجهی مثبت کاذب بدهد، اما به طور کلی در تشخیص این نوع از مشکلات در برنامهها کاملاً مؤثر بوده است.
استاندارد C++17 ترتیب ارزیابی عملوندها را در موارد بیشتری تعریف میکند: بهویژه الزام میکند که سمت راست یک انتساب قبل از سمت چپ ارزیابی شود، بنابراین مثالهای بالا دیگر رفتار تعریفنشده ندارند. اما این گزینه همچنان دربارهی آنها هشدار میدهد تا به افراد کمک کند از نوشتن کدی که در C و نگارشهای قبلی C++ تعریفنشده است خودداری کنند.
متن استاندارد به صورت گیجکنندهای نگاشته شده است، بنابراین دربارهی معنای دقیق قواعد نقاط توالی در موارد ظریف و پیچیده بحثهایی وجود دارد. پیوندهایی به مباحث مربوط به این مشکل، از جمله تعاریف رسمی پیشنهادی، را میتوان در صفحهی مطالعاتی GCC در https://gcc.gnu.org/readings.html یافت.
این هشدار در C و C++ توسط -Wall فعال میشود..IP -Wno-return-local-addr 4 درباره بازگرداندن یک اشارهگر (یا در ++C، یک ارجاع) به متغیری که پس از بازگشت تابع از حوزه تعریف (scope) خارج میشود، هشدار نده.
- -Wreturn-mismatch
- درباره
دستورات return
بدون عبارت
(expression) در
توابعی که
"void"
برنمیگردانند،
هشدار بده.
همچنین
درباره
دستور
"return"
همراه با یک
عبارت در
تابعی که
نوع
بازگشتی آن
"void" است،
مگر اینکه
نوع عبارت
نیز "void"
باشد،
هشدار بده.
به عنوان یک
افزونه GNU،
مورد دوم
بدون هشدار
پذیرفته
میشود مگر
اینکه -Wpedantic
استفاده
شود.
تلاش برای استفاده از مقدار بازگشتی یک تابع غیر-"void" بهجز "main" که جریان اجرای آن با رسیدن به آکولاد بسته پایانی از انتهای تابع خارج میشود، تعریفنشده (undefined) است.
این هشدار مخصوص C بوده و به طور پیشفرض فعال است. در لهجههای زبانی C99 و نسخههای جدیدتر، با این مورد به عنوان خطا برخورد میشود. میتوان آن را با استفاده از -fpermissive (همراه با هشدارهای دیگر)، یا صرفاً برای همین هشدار با -Wno-error=return-mismatch به یک هشدار تقلیل داد.
- -Wreturn-type
- هرگاه
تابعی با
نوع
بازگشتی
تعریف شود
که پیشفرض
آن "int"
باشد (مگر
اینکه -Wimplicit-int
فعال باشد
که اولویت
دارد)،
هشدار بده.
همچنین اگر
اجرای
برنامه
ممکن است به
انتهای
بدنه تابع
برسد، یا
اگر تابع
اصلاً شامل
هیچ دستور
بازگشتی
نباشد،
هشدار بده.
تلاش برای استفاده از مقدار بازگشتی یک تابع غیر-"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 (و جدیدتر) فعال است. این سطح هشدار درباره شیفت دادن عدد 1 به چپ به درون بیت علامت هشداری نمیدهد. (با این حال، در C چنین سرریزی در زمینههایی که عبارت ثابت از نوع عدد صحیح مورد نیاز است، همچنان رد میشود.) در حالت C++20 (و جدیدتر) هیچ هشداری صادر نمیشود، زیرا شیفتهای به چپ علامتدار همیشه سرریز چرخشی (wrap) دارند.
- -Wshift-overflow=2
- این سطح هشدار، درباره شیفت دادن عدد 1 به چپ به درون بیت علامت نیز هشدار میدهد، مگر اینکه حالت C++14 (یا جدیدتر) فعال باشد.
- -Wswitch
- هرگاه یک دستور "switch" دارای نمایهای از نوع شمارشی (enumeration) باشد و فاقد "case" برای یک یا چند مورد از مقادیر نامگذاریشده آن شمارش باشد، هشدار بده. (وجود برچسب "default" مانع از این هشدار میشود.) برچسبهای "case" که متناظر با مقادیر شمارشی نیستند نیز هنگام استفاده از این گزینه موجب هشدار میشوند، مگر اینکه شمارش با صفت "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" استفاده شوند، هشدار بده. معناشناسی (semantics) این توابع در GCC 4.4 تغییر یافته است.
- -Wtrivial-auto-var-init
- هنگامی که "-ftrivial-auto-var-init" نتواند متغیر خودکار (automatic) را مقداردهی اولیه کند، هشدار بده. یک موقعیت رایج، متغیر خودکاری است که میان عبارت کنترلی و نخستین برچسب 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
- هرگاه یک
متغیر
ایستای
ثابت (constant static) به
جز در
اعلانش
استفاده
نشود،
هشدار
میدهد.
برای فرونشاندن این هشدار از مشخصهٔ "unused" استفاده کنید.
- -Wunused-const-variable=1
- دربارهٔ
متغیرهای
static const بدون
استفاده که
در واحد
ترجمه اصلی
(main compilation unit) تعریف
شدهاند
هشدار
میدهد،
اما
دربارهٔ
متغیرهای
static const
اعلانشده
در هدرهای
گنجاندهشده
(included) هشداری
نمیدهد.
-Wunused-const-variable=1 توسط هر یک از گزینههای -Wunused-variable یا -Wunused برای C فعال میشود، اما برای C++ خیر. در C این اعلان فضای ذخیرهسازی متغیر را مشخص میکند، اما در C++ این یک خطا محسوب نمیشود زیرا متغیرهای const جایگزین "#define"ها میشوند.
- -Wunused-const-variable=2
- این سطح هشدار برای متغیرهای ایستای ثابت استفادهنشده در هدرها (بهاستثنای هدرهای سیستم) نیز هشدار میدهد. این حالت معادل فرم کوتاه -Wunused-const-variable است. این سطح باید صراحتاً در هر دو زبان C و C++ درخواست شود، زیرا پاکسازی همهٔ هدرهای گنجاندهشده ممکن است دشوار باشد.
- -Wunused-value
- هرگاه یک
عبارت (statement)
نتیجهای
را محاسبه
کند که
بهطور
صریح
استفاده
نمیشود،
هشدار
میدهد.
برای
فرونشاندن
این هشدار،
عبارت
استفادهنشده
را به "void"
تبدیل نوع (cast)
کنید. این
شامل یک
عبارت-دستور
یا سمت چپ
یک عبارت
کاما است که
هیچ عوارض
جانبی (side effects)
ندارد. برای
نمونه،
عبارتی
مانند
"x[i,j]"
باعث ایجاد
هشدار
میشود، در
حالی که
"x[(void)i,j]"
هشداری
تولید
نمیکند.
این هشدار توسط -Wall فعال میشود.
- -Wunused
- همهٔ
گزینههای
-Wunused فوق
بهصورت
ترکیبی،
بهجز
مواردی که
مستند شده
است باید
صراحتاً
مشخص شوند.
به منظور دریافت هشدار دربارهٔ یک پارامتر استفادهنشدهٔ تابع، باید یا -Wextra -Wunused را مشخص کنید (توجه داشته باشید که -Wall بهطور ضمنی شامل -Wunused است)، یا بهصورت جداگانه -Wunused-parameter و/یا -Wunused-but-set-parameter را تعیین کنید.
-Wunused به جای -Wunused-const-variable، تنها -Wunused-const-variable=1 را فعال میکند، و آن هم فقط برای C، نه C++.
- -Wuse-after-free (فقط C، Objective-C، C++ و Objective-C++)
- -Wuse-after-free=n
- دربارهٔ استفاده از اشارهگرهایی به شیءهای تخصیصیافته بهصورت پویا که با فراخوانی یک تابع آزادسازی حافظه نامعین (indeterminate) شدهاند، هشدار میدهد. این هشدار در تمامی سطوح بهینهسازی فعال است، اما ممکن است در صورت فعال بودن بهینهسازی نسبت به عدم بهینهسازی، نتایج متفاوتی ارائه دهد.
- -Wuse-after-free=1
- در سطح ۱، این هشدار تلاش میکند تنها استفادههای نامشروط از اشارهگرهایی را تشخیص دهد که بر اثر فراخوانی آزادسازی یا یک فراخوانی موفق به "realloc" نامعین شدهاند، صرفنظر از اینکه فراخوانی به بازتخصیص واقعی حافظه منجر شده است یا خیر. این شامل فراخوانیهای مضاعف "free" (double-free) و همچنین استفاده در عبارات محاسباتی و رابطهای میشود. با وجود تعریفنشده (undefined) بودن، استفاده از اشارهگرهای نامعین در عبارات برابری (یا نابرابری) در این سطح تشخیص داده نمیشود.
- -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"
بهمنظور
تلاش برای
تعیین
اینکه آیا
فراخوانی
منجر به
جابهجایی
شیء به یک
آدرس دیگر
شده است یا
خیر ظاهر
میشوند.
این موارد
در یک سطح
جداگانه
تشخیص داده
میشوند تا
به انتقال
تدریجی
کدهای
قدیمی (legacy) به
جایگزینهای
امن کمک
کنند. برای
نمونه،
آزمون
برابری در
تابع زیر در
این سطح
تشخیص داده
میشود:
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); }برای جلوگیری از هشدار در این سطح، به جای اشارهگرها، آفستها (offsets) را در حافظهٔ تخصیصیافته ذخیره کنید. این رویکرد نیاز به تنظیم مجدد اشارهگرهای ذخیرهشده پس از بازتخصیص را برطرف میکند.
-Wuse-after-free=2 در -Wall گنجانده شده است.
- -Wuseless-cast (فقط C، Objective-C، C++ و Objective-C++)
- هنگامی که
یک عبارت به
نوع خودش
تبدیل نوع (cast)
شود، هشدار
میدهد. این
هشدار
زمانی که یک
شیء کلاسی
به یک نوع
غیرمرجع (non-reference)
تبدیل
میشود رخ
نمیدهد،
زیرا این
روشی برای
ایجاد یک
شیء موقت
است:
struct S { }; void g (S&&); void f (S&& arg) { g (S(arg)); // make arg prvalue so that it can bind to S&& } - -Wuninitialized
- اگر شیئی با
طول عمر
ذخیرهسازی
خودکار (automatic)
یا
تخصیصیافته
(allocated) بدون
اینکه
مقداردهی
اولیه شده
باشد
استفاده
شود، هشدار
میدهد. در
C++، همچنین
اگر یک مرجع
غیرایستا
یا یک عضو
"const"
غیرایستا
در کلاسی
بدون
سازنده
ظاهر شود،
هشدار
میدهد.
علاوه بر این، ارسال اشارهگر (یا در C++، یک مرجع) به شیء مقداردهینشده به یک آرگومان مقید به "const" در یک تابع توکار (built-in) که برای خواندن شیء شناخته شده است نیز توسط این هشدار تشخیص داده میشود. (برای توابع معمولی، -Wmaybe-uninitialized صادر میشود.)
اگر میخواهید دربارهٔ کدی که از مقدار مقداردهینشدهٔ یک متغیر در مقداردهی اولیهٔ خودش استفاده میکند هشدار دریافت کنید، از گزینهٔ -Winit-self استفاده نمایید.
این هشدارها هم برای تکتک عناصر مقداردهینشدهٔ متغیرهای ساختار (structure)، اجتماع (union) یا آرایه، و هم برای متغیرهایی که بهطور کامل مقداردهی اولیه نشدهاند رخ میدهند. این هشدارها برای متغیرها یا عناصری که بهصورت "volatile" اعلان شدهاند اتفاق نمیافتند. از آنجا که این هشدارها به بهینهسازی وابسته هستند، متغیرها یا عناصر دقیقی که برای آنها هشدار صادر میشود، به گزینههای دقیق بهینهسازی و نسخهٔ استفادهشدهٔ GCC وابسته است.
توجه داشته باشید ممکن است دربارهٔ متغیری که تنها برای محاسبهٔ مقداری استفاده میشود که خود آن مقدار هرگز استفاده نمیشود، هشداری داده نشود، زیرا چنین محاسباتی ممکن است پیش از چاپ هشدارها توسط تحلیل جریان داده (data flow analysis) حذف شوند.
در C++، این هشدار همچنین دربارهٔ استفاده از اشیاء مقداردهینشده در فهرستهای مقداردهی اولیهٔ اعضا (member-initializer-lists) هشدار میدهد. برای نمونه، GCC دربارهٔ مقداردهینشده بودن "b" در قطعه کد زیر هشدار میدهد: struct A { int a; int b; A() : a(b) { } };
- -Wno-invalid-memory-model
- این گزینه
هشدارهای
مربوط به
فراخوانیهای
توابع
توکار __atomic،
توابع
توکار __sync و
توابع
جنریک
اتمیک 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، یک ارجاع) به یک شیء مقداردهینشده به یک آرگومان تابع مقید به "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" همواره ۱، ۲ یا ۳ باشد، آنگاه "x" همواره مقداردهی شده است، اما GCC این موضوع را نمیداند. برای فرونشاندن این هشدار، باید یک حالت default به همراه assert(0) یا کدی مشابه ارائه دهید.
این گزینه همچنین زمانی هشدار میدهد که یک متغیر خودکار غیرفرار (non-volatile) ممکن است با فراخوانی "longjmp" تغییر کند. کامپایلر تنها فراخوانیهای "setjmp" را میبیند. او نمیتواند بداند "longjmp" در کجا فراخوانی خواهد شد؛ در واقع، یک گرداننده سیگنال میتواند آن را در هر نقطهای از کد فراخوانی کند. در نتیجه، ممکن است حتی زمانی که در عمل مشکلی وجود ندارد هشدار دریافت کنید، زیرا "longjmp" عملاً نمیتواند در نقطهای که باعث ایجاد مشکل میشود فراخوانی گردد.
با اعلان همه توابعی که استفاده میکنید و هرگز بازنمیگردند به صورت "noreturn"، میتوان از برخی هشدارهای کاذب جلوگیری کرد.
این هشدار توسط -Wall یا -Wextra فعال میشود.
- -Wunknown-pragmas
- هنگامی که با یک دستورالعمل "#pragma" مواجه شود که برای GCC قابل درک نیست، هشدار میدهد. اگر از این گزینه خط فرمان استفاده شود، هشدارها حتی برای عملگرهای عمل (pragmas) ناشناخته در فایلهای سرآیند سیستم نیز صادر میشوند. در صورتی که هشدارها فقط توسط گزینه خط فرمان -Wall فعال شده باشند، اینگونه نخواهد بود.
- -Wno-pragmas
- در مورد استفادههای نادرست از عملگرهای عمل (pragmas)، مانند پارامترهای نادرست، نحو نامعتبر، یا تداخل بین پراگماها هشدار نمیدهد. همچنین -Wunknown-pragmas را ببینید.
- -Wno-pragma-once-outside-header
- هنگامی که "#pragma once" در فایلی غیر از سرآیند، مانند یک فایل اصلی استفاده شود، هشدار نمیدهد.
- -Wno-prio-ctor-dtor
- اگر اولویتی بین ۰ تا ۱۰۰ برای سازنده (constructor) یا ویرانگر (destructor) استفاده شود، هشدار نمیدهد. استفاده از صفتهای سازنده و ویرانگر به شما امکان میدهد تا اولویتی را به سازنده/ویرانگر اختصاص دهید تا ترتیب اجرای آن قبل از فراخوانی "main" یا بعد از بازگشت از آن کنترل شود. مقادیر اولویت باید بزرگتر از ۱۰۰ باشند، زیرا کامپایلر مقادیر اولویت بین ۰ تا ۱۰۰ را برای پیادهسازی رزرو میکند.
- -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 همچنان کد را دچار اختلال میکند، زیرا منفیهای کاذب بسیار کمی دارد. با این حال، موارد مثبت کاذب زیادی دارد. برای تمام تبدیلات اشارهگر بین انواع احتمالاً ناسازگار، حتی اگر هرگز ارجاعزدایی نشوند، هشدار میدهد. تنها در فرانتاند اجرا میشود.
سطح ۲: تهاجمی، سریع، نه چندان دقیق. ممکن است همچنان مثبتهای کاذب زیادی داشته باشد (البته نه به اندازه سطح ۱)، و منفیهای کاذب اندکی داشته باشد (اما احتمالاً بیشتر از سطح ۱). برخلاف سطح ۱، تنها زمانی هشدار میدهد که یک آدرس گرفته شود. درباره انواع ناقص هشدار میدهد. تنها در فرانتاند اجرا میشود.
سطح ۳ (پیشفرض برای -Wstrict-aliasing): باید موارد مثبت کاذب بسیار اندک و موارد منفی کاذب کمی داشته باشد. هنگام فعال بودن بهینهسازی، کمی کندتر از سطوح ۱ یا ۲ است. به الگوی رایج pun+dereference در فرانتاند رسیدگی میکند: "*(int*)&some_float". اگر بهینهسازی فعال باشد، در بکاند نیز اجرا میشود، جایی که با موارد چنددستوری با استفاده از اطلاعات اشارهبه حساس به جریان (flow-sensitive points-to) برخورد میکند. تنها زمانی هشدار میدهد که اشارهگر تبدیلشده ارجاعزدایی شود. درباره انواع ناقص هشدار نمیدهد.
- -Wstrict-overflow
- -Wstrict-overflow=n
- این گزینه
تنها زمانی
فعال است که
سرریز
علامتدار
تعریفنشده
باشد. این
گزینه
درباره
مواردی
هشدار
میدهد که
کامپایلر
بر اساس این
فرض که
سرریز
علامتدار
رخ نمیدهد
بهینهسازی
انجام
میدهد.
توجه داشته
باشید که
این گزینه
درباره همه
مواردی که
ممکن است کد
سرریز کند
هشدار
نمیدهد:
فقط درباره
مواردی
هشدار
میدهد که
کامپایلر
نوعی
بهینهسازی
را پیاده
میکند.
بنابراین
این هشدار
به سطح
بهینهسازی
بستگی دارد.
بهینهسازیای که فرض میکند سرریز علامتدار رخ نمیدهد، اگر مقادیر متغیرهای درگیر به گونهای باشند که سرریز در عمل هرگز رخ ندهد، کاملاً ایمن است. بنابراین این هشدار میتواند به سادگی یک مثبت کاذب ایجاد کند: هشداری در مورد کدی که در واقعیت مشکلی ندارد. برای کمک به تمرکز روی مسائل مهم، چندین سطح هشدار تعریف شده است. هنگام برآورد تعداد تکرارهای یک حلقه، بهویژه هنگام تعیین اینکه آیا یک حلقه اصلاً اجرا خواهد شد یا خیر، هیچ هشداری برای استفاده از سرریز علامتدار تعریفنشده صادر نمیشود.
- -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 از نوع صفرِ «بررسی اندازه شیء» (Object Size Checking) برای تعیین اندازههای اشیاء مقصد استفاده میکند. در این تنظیم، این گزینه برای نوشتن فراتر از انتهای زیراشیاءِ اشیاء بزرگتر که از طریق اشارهگرها مورد دسترسی قرار گرفتهاند هشدار نمیدهد، مگر آنکه اندازه بزرگترین شیء دربرگیرنده مشخص باشد. هنگامی که مقصد ممکن است یکی از چند شیء باشد، بزرگترین آنها در نظر گرفته میشود. در سیستمهای لینوکس، زمانی که بهینهسازی در این تنظیم فعال باشد، این گزینه برای همان کدهایی هشدار میدهد که در هنگام تعریف ماکروی "_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
- درباره
فراخوانیهای
توابع
مقیدِ (bounded)
دستکاری
رشته مانند
"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)
- دربارهٔ
استفادههای
نامناسب از
اعضای
آرایهٔ
انعطافپذیر
با توجه به
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" یا تله (trap) به صورت غیرعادی خارج نشود. این تحلیل به گزینهٔ -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" دیگر ختم میشوند؛ مانند پوششدهندههای "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" داده میشد، کد بالا هشداری را ایجاد میکرد، اما این بار به دلیل عدم بررسی مرزها.
توجه داشته باشید که حتی کدهای بهظاهر درستی که شامل اعداد صحیح علامتدار هستند نیز میتوانند موجب هشدار شوند:
void func (signed int n) { if (n < 500) { p = alloca (n); f (p); } }در مثال بالا، n میتواند منفی باشد که باعث میشود آرگومانی بزرگتر از حد انتظار بهطور ضمنی به فراخوانی "alloca" تبدیل نوع شود.
این گزینه همچنین زمانی که "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 به عنوان یک عضو آرایهٔ انعطافپذیر در نظر گرفته میشود. در نتیجه، دربارهٔ اندیسها یا آفستهای خارج از محدوده در آرایههای با طول صفر یا آرایههای تکعنصری بهطور پیشفرض هشداری داده نمیشود.
میتوانید گزینهٔ -fstrict-flex-arrays یا -fstrict-flex-arrays=level را برای کنترل نحوهٔ برخورد این گزینه با آرایهٔ انتهایی یک ساختار به عنوان عضو آرایهٔ انعطافپذیر اضافه کنید:
هنگامی که level<=1 باشد، تغییری در رفتار پیشفرض ایجاد نمیشود.
هنگامی که level=2 باشد، هشدارهای بیشتری برای اندیسها یا آفستهای خارج از محدوده در آرایههای تکعنصری صادر میشود؛
هنگامی که level=3 باشد، علاوه بر level=2، هشدارهای بیشتری برای اندیسها یا آفستهای خارج از محدوده در آرایههای با طول صفر صادر میشود.
- -Warray-bounds=1
- این سطح هشدار پیشفرض برای -Warray-bounds است و توسط -Wall فعال میشود؛ سطوح بالاتر فعال نمیشوند و باید صراحتاً درخواست شوند.
- -Warray-bounds=2
- این سطح هشدار همچنین دربارهٔ نتایج میانی محاسبات اشارهگر که ممکن است مقادیر خارج از محدوده ایجاد کنند هشدار میدهد. این سطح هشدار ممکن است تعداد بیشتری مثبت کاذب ایجاد کند و بهطور پیشفرض غیرفعال است.
- -Wunterminated-string-initialization (تنها C و Objective-C)
- دربارهٔ
آرایههای
نویسهای
که با یک
رشتهٔ لفظی
به عنوان
دنبالههای
نویسهای
بدون
پایانبخش
مقداردهی
اولیه
میشوند
هشدار
میدهد،
مگر اینکه
اعلان در
حال
مقداردهی
دارای صفت
"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" و صفتهای مشابه استفاده میکنند و هدف آنها با نوع alias ناسازگار است.
- -Wattribute-alias=1
- سطح هشدار پیشفرض گزینهٔ -Wattribute-alias، ناسازگاریهای میان نوع اعلان alias و نوع هدف آن را تشخیص میدهد. چنین ناسازگاریهایی معمولاً نشاندهندهٔ اشکالات برنامهنویسی (باگها) هستند.
- -Wattribute-alias=2
- در این سطح،
-Wattribute-alias همچنین
مواردی را
تشخیص
میدهد که
صفتهای
اعلان alias
محدودکنندهتر
از صفتهای
اعمالشده
بر هدف آن
باشند. این
عدم
تطابقها
میتوانند
بالقوه
منجر به
تولید کد
نادرست
شوند. در
موارد
دیگر، ممکن
است بیخطر
باشند و
صرفاً با
افزودن صفت
ناموجود به
هدف برطرف
شوند. برای
مقایسه،
گزینهٔ
-Wmissing-attributes را
ببینید که
تشخیص
مواردی را
کنترل
میکند که
اعلان alias
بهجای
محدودکنندهتر
بودن، نسبت
به هدف کمتر
محدودکننده
است.
صفتهای در نظر گرفتهشده شامل "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 در
توضیحات
(comments)،
رشتههای
لفظی (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)
- دربارهٔ
تبدیلهای
ناسازگار
عدد صحیح به
اشارهگر و
اشارهگر
به عدد صحیح
هشدار نده.
این هشدار
مربوط به
تبدیلهای
ضمنی است؛
برای
تبدیلهای
صریح
میتوان از
هشدارهای
-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
- هشدار هنگامی که مقدار لفظی 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
- دربارهٔ تقسیم عدد صحیح بر صفر در زمان کامپایل هشدار نده. دربارهٔ تقسیم ممیز شناور بر صفر هشداری داده نمیشود، زیرا میتواند روشی مشروع برای دستیابی به مقادیر بینهایت (infinities) و NaNها باشد.
- -Wsystem-headers
- پیامهای
هشدار را
برای
ساختارهای
یافتشده
در
فایلهای
هدر سیستم (system
header files) چاپ کن.
هشدارهای
مربوط به
هدرهای
سیستم
بهطور
معمول با
این فرض که
نشاندهندهٔ
مشکلات
واقعی
نیستند و
تنها
خواندن
خروجی
کامپایلر
را دشوارتر
میکنند،
فرونشانده
میشوند.
استفاده از
این گزینهٔ
خط فرمان به
GCC میگوید
که
هشدارهای
فایلهای
هدر سیستم
را چنان
صادر کند که
گویی در کد
کاربر رخ
دادهاند.
با این حال،
توجه داشته
باشید که
استفاده از
-Wall در کنار
این گزینه،
دربارهٔ
پراگماهای
ناشناخته
در هدرهای
سیستم
هشدار
نمیدهد---برای
آن، باید
-Wunknown-pragmas نیز
استفاده
شود..IP -Wtautological-compare 4
هشدار
میدهد اگر
یک
خودمقایسهای
همواره به true
یا false
ارزیابی
شود. این
هشدار
اشتباهات
متعددی را
شناسایی
میکند،
مانند:
int i = 1; ... if (i > i) { ... }این هشدار همچنین درباره مقایسههای بیتی که همواره به true یا false ارزیابی میشوند هشدار میدهد، برای نمونه:
if ((a & 16) == 10) { ... }همیشه نادرست (false) خواهد بود.
این هشدار توسط -Wall فعال میشود.
- -Wtrailing-whitespace
- -Wtrailing-whitespace=kind
- درباره فاصلههای خالی انتهایی در انتهای خطوط، از جمله درون کامنتها، اما به استثنای فاصلههای خالی انتهایی در لیترالهای رشتهای خام هشدار میدهد. "-Wtrailing-whitespace" معادل "-Wtrailing-whitespace=blanks" است و تنها درباره نویسههای فاصله (space) و تب افقی انتهایی هشدار میدهد. "-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
- درباره ترامپولینهای تولیدشده برای اشارهگرها به توابع تو در تو هشدار میدهد. ترامپولین قطعه کوچکی از داده یا کد است که در زمان اجرا روی پشته (stack) هنگامی که آدرس یک تابع تو در تو گرفته میشود ایجاد میگردد و برای فراخوانی غیرمستقیم تابع تو در تو استفاده میشود. برای برخی هدفها، تنها از داده تشکیل شده است و بنابراین نیازی به رفتار خاصی ندارد. اما برای بیشتر هدفها، از کد تشکیل شده است و در نتیجه نیازمند آن است که پشته قابل اجرا باشد تا برنامه بهدرستی کار کند.
- -Wfloat-equal
- هشدار
میدهد اگر
مقادیر
ممیز شناور
در
مقایسههای
برابری
استفاده
شوند.
ایده پشت این هشدار این است که گاهی اوقات (برای برنامهنویس) راحتتر است که مقادیر ممیز شناور را بهعنوان تقریبهایی از اعداد حقیقی با دقت بینهایت در نظر بگیرد. اگر چنین میکنید، باید (با تحلیل کد یا روشی دیگر) حداکثر یا خطای حداکثری احتمالی ناشی از محاسبات را محاسبه کرده و هنگام انجام مقایسهها (و هنگام تولید خروجی، که البته مسئله دیگری است) آن را لحاظ کنید. بهویژه، بهجای بررسی برابری، باید بررسی کنید که آیا این دو مقدار دارای بازههای همپوشان هستند یا خیر؛ و این کار با عملگرهای رابطهای انجام میشود، بنابراین مقایسههای برابری احتمالاً اشتباه هستند.
- -Wtraditional (فقط C و Objective-C)
- درباره ساختارهای خاصی که در C سنتی و ISO C رفتار متفاوتی دارند هشدار میدهد. همچنین درباره ساختارهای ISO C که معادلی در C سنتی ندارند، و/یا ساختارهای مسئلهداری که باید از آنها اجتناب شود، هشدار میدهد.
- پارامترهای ماکرو که درون لیترالهای رشتهای در بدنه ماکرو ظاهر میشوند. در C سنتی جایگزینی ماکرو درون لیترالهای رشتهای انجام میشود، اما در ISO C چنین نیست.
- در C سنتی، برخی رهنمودهای پیشپردازنده وجود نداشتند. پیشپردازندههای سنتی یک خط را تنها زمانی یک رهنمود در نظر میگرفتند که # در ستون ۱ خط ظاهر میشد. بنابراین -Wtraditional درباره رهنمودهایی هشدار میدهد که C سنتی آنها را میفهمد اما نادیده میگیرد زیرا # بهعنوان نخستین نویسه خط ظاهر نشده است. این گزینه همچنین پیشنهاد میکند رهنمودهایی مانند "#pragma" را که توسط C سنتی درک نمیشوند با افزودن تورفتگی پنهان کنید. برخی پیادهسازیهای سنتی "#elif" را شناسایی نمیکنند، بنابراین این گزینه پیشنهاد میکند بهطور کلی از آن اجتناب شود.
- یک ماکروی تابعگونه که بدون آرگومان ظاهر شود.
- عملگر جمع یکانی (unary plus).
- پسوند ثابت صحیح U، یا پسوندهای ثابت ممیز شناور F یا L. (C سنتی از پسوند L روی ثابتهای صحیح پشتیبانی میکند.) توجه داشته باشید که این پسوندها در ماکروهای تعریفشده در هدرهای سیستمی اکثر سیستمهای مدرن ظاهر میشوند، مانند ماکروهای _MIN/_MAX در "<limits.h>". استفاده از این ماکروها در کد کاربر ممکن است معمولاً منجر به هشدارهای کاذب شود، با این حال پیشپردازنده یکپارچه GCC زمینه کافی برای جلوگیری از هشدار در این موارد را دارد.
- تابعی که در یک بلوک بهصورت external اعلان شده و سپس بعد از پایان آن بلوک استفاده شود.
- یک دستور "switch" که عملوندی از نوع "long" داشته باشد.
- اعلان یک تابع غیر-"static" که پس از یک اعلان "static" بیاید. این ساختار توسط برخی کامپایلرهای C سنتی پذیرفته نمیشود.
- نوع ISO یک ثابت صحیح عرض یا علامتدار بودن (signedness) متفاوتی نسبت به نوع سنتی خود داشته باشد. این هشدار تنها در صورتی صادر میشود که مبنای ثابت ۱۰ باشد؛ یعنی درباره مقادیر هگزادسیمال یا هشتهشتی (octal)، که معمولاً الگوهای بیتی را نشان میدهند، هشداری داده نمیشود.
- تشخیص استفاده از الحاق رشتهای ISO.
- مقداردهی اولیه تجمیعهای خودکار (automatic aggregates).
- تداخل شناسهها با برچسبها (labels). C سنتی فاقد یک فضای نام جداگانه برای برچسبها است.
- مقداردهی اولیه unionها. اگر مقداردهی اولیه صفر باشد، از هشدار صرفنظر میشود. این کار با این فرض انجام میشود که مقداردهی اولیه به صفر در کد کاربر مشروط به مواردی چون "__STDC__" قرار گرفته تا از هشدارهای عدم مقداردهی اولیه جلوگیری شود و در حالت C سنتی به مقداردهی اولیه پیشفرض به صفر متکی است.
- تبدیلهای ناشی از پروتوتایپ بین مقادیر ممیز ثابت/ممیز شناور و برعکس. عدم وجود این پروتوتایپها هنگام کامپایل با C سنتی مشکلات جدی ایجاد میکند. این یک زیرمجموعه از هشدارهای تبدیل ممکن است؛ برای مجموعه کامل از -Wtraditional-conversion استفاده کنید.
- استفاده از تعریف تابع به سبک ISO C. این هشدار عمداً برای اعلانهای پیشالگو (prototypes) یا توابع با تعداد متغیر آرگومان (variadic) صادر نمیشود، چرا که این قابلیتهای ISO C هنگام استفاده از ماکروهای سازگاری C سنتی در libiberty یعنی "PARAMS" و "VPARAMS" در کد شما ظاهر میشوند. این هشدار همچنین برای توابع تو در تو نادیده گرفته میشود زیرا آن قابلیت از پیش یک افزونه GCC است و بنابراین ربطی به سازگاری با C سنتی ندارد.
- -Wtraditional-conversion (فقط C و Objective-C)
- هشدار میدهد اگر یک پروتوتایپ باعث تبدیل نوعی شود که با آنچه برای همان آرگومان در صورت نبود پروتوتایپ رخ میداد متفاوت باشد. این شامل تبدیلهای ممیز ثابت به شناور و برعکس، و تبدیلهایی است که عرض یا علامتدار بودن یک آرگومان ممیز ثابت را تغییر میدهند، به جز مواردی که با ترفیع پیشفرض یکسان باشد.
- -Wdeclaration-after-statement (فقط C و Objective-C)
- هنگامی که
یک اعلان
بعد از یک
دستور در یک
بلوک قرار
گیرد،
هشدار
میدهد. این
ساختار، که
از C++ شناخته
شده است،
همراه با ISO C99
معرفی شد و
بهطور
پیشفرض در
GCC مجاز است.
این ساختار
توسط ISO C90
پشتیبانی
نمیشود.
این هشدار توسط -pedantic-errors به یک خطا تبدیل میشود.
- -Wshadow
- هرگاه یک متغیر محلی یا اعلان نوع، متغیر دیگر، پارامتر، نوع، عضو کلاس (در C++)، یا متغیر نمونه (در Objective-C) را سایهاندازی (shadow) کند، یا هرگاه یک تابع توکار سایهاندازی شود، هشدار میدهد. توجه داشته باشید که در C++، کامپایلر در صورتی که یک متغیر محلی یک typedef صریح را بپوشاند هشدار میدهد، اما اگر یک struct/class/enum را بپوشاند هشداری نمیدهد. اگر این هشدار فعال باشد، شامل تمام موارد سایهاندازی محلی نیز میشود. این بدان معناست که -Wno-shadow=local و -Wno-shadow=compatible-local در هنگام استفاده از -Wshadow نادیده گرفته میشوند. مشابه -Wshadow=global است..IP "-Wno-shadow-ivar (فقط در Objective-C)" 4 هرگاه یک متغیر محلی بر روی یک متغیر نمونه (instance variable) در یک متد Objective-C سایه بیندازد، هشدار داده نشود.
- -Wshadow=global
- برای هرگونه سایهاندازی (shadowing) هشدار میدهد. همانند -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
- اگر اندازه یک فریم تابع از byte-size فراتر رود، هشدار میدهد. محاسبه انجامشده برای تعیین اندازه فریم پشته تقریبی بوده و محتاطانه (conservative) نیست. نیاز واقعی ممکن است تا حدی بیشتر از byte-size باشد حتی اگر هشداری دریافت نکنید. علاوه بر این، هر فضایی که از طریق "alloca"، آرایههای با طول متغیر، یا ساختارهای مرتبط تخصیص یابد، هنگام تعیین صدور یا عدم صدور هشدار توسط کامپایلر محاسبه نمیشود. -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"
اشارهگری
به نویسه
نال پایانی
برمیگرداند
و نه به
ابتدای
شیء،
فراخوانی
به "free" در
ادامه
تشخیص داده
شده و هشدار
دریافت
میکند.
void f (char *p) { p = stpcpy (p, "abc"); // ... free (p); // warning }-Wfree-nonheap-object در -Wall گنجانده شده است.
- -Wstack-usage=byte-size
- اگر میزان
مصرف پشته
یک تابع
احتمالاً
از byte-size فراتر
رود، هشدار
میدهد.
محاسبه
انجامشده
برای تعیین
مصرف پشته
محتاطانه
(conservative) است.
هرگونه
فضای
تخصیصیافته
از طریق
"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 استفاده شود، این گزینه هشدارهای مربوط به مشخصکنندههای پهنای فرمت غیر ISO در "printf" / "scanf" نظیر "I32"، "I64" و "I" را که در مقصدهای Windows استفاده میشوند و به زماناجرای MS وابستهاند، غیرفعال میکند.
- -Wpointer-arith
- درباره هر
چیزی که به
«اندازه» (size of)
یک نوع تابع
یا نوع
"void"
وابسته
باشد،
هشدار
میدهد.
کامپایلر GNU C
برای راحتی
در محاسبات
با
اشارهگرهای
"void *" و
اشارهگرها
به توابع،
اندازهای
برابر با 1
به این
نوعها
اختصاص
میدهد. در
C++، همچنین
در صورتی که
یک عملیات
محاسباتی
شامل "NULL"
باشد هشدار
میدهد. این
هشدار با
-Wpedantic نیز
فعال
میشود.
این هشدار توسط -pedantic-errors به یک خطا ارتقا مییابد.
- -Wno-pointer-compare
- اگر یک
اشارهگر
با یک ثابت
نویسهای
صفر مقایسه
شود، هشدار
داده نشود.
این حالت
معمولاً به
این معنی
است که قصد
بر
ارجاعزدایی
از
اشارهگر
بوده است.
برای نمونه:
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) باشد، هشدار میدهد. این هشدار را میتوان با یک تبدیل نوع صریح غیرفعال کرد و همچنین توسط -Wextra فعال میشود.
- -Wcomment
- -Wcomments
- هشدار هرگاه توالی آغاز توضیح /* درون یک توضیح /* ظاهر شود، یا هرگاه یک خط جدید با بکاسلش (backslash-newline) در یک توضیح // قرار گیرد. این هشدار توسط -Wall فعال میشود.
- -Wtrigraphs
- هشدار در
صورت
برخورد با
هرگونه
نویسهسهگانه
(trigraph) که ممکن
است معنای
برنامه را
تغییر دهد.
دربارهٔ
نویسههای
سهگانه
درون
توضیحات
هشداری
داده
نمیشود،
مگر مواردی
که یک خط
جدید
گریزیافته
ایجاد کنند.
این گزینه بهطور ضمنی توسط -Wall فعال میشود. اگر -Wall داده نشود، این گزینه همچنان فعال است مگر اینکه trigraphها فعال شده باشند. برای تبدیل trigraph بدون هشدار، اما دریافت سایر هشدارهای -Wall، از -trigraphs -Wall -Wno-trigraphs استفاده کنید.
- -Wundef
- هشدار در صورتی که یک شناسهٔ تعریفنشده در یک دستورالعمل "#if" ارزیابی شود. چنین شناسههایی با صفر جایگزین میشوند.
- -Wexpansion-to-defined
- هشدار هرگاه در بسط یک ماکرو به defined برخورد شود (شامل حالتی که ماکرو توسط یک دستورالعمل #if بسط داده میشود). چنین استفادهای همهکاره و قابلحمل نیست. این هشدار همچنین توسط -Wpedantic و -Wextra فعال میشود.
- -Wunused-macros
- هشدار
دربارهٔ
ماکروهای
تعریفشده
در فایل
اصلی که
استفاده
نشدهاند.
یک ماکرو در
صورتی
استفادهشده
در نظر
گرفته
میشود که
حداقل
یکبار بسط
داده شده یا
وجود آن
بررسی شده
باشد.
پیشپردازنده
همچنین در
صورتی که
ماکرو در
زمان
بازتعریف
یا لغو
تعریف
استفاده
نشده باشد،
هشدار
میدهد.
دربارهٔ ماکروهای توکار، ماکروهای تعریفشده در خط فرمان، و ماکروهای تعریفشده در فایلهای include هشداری داده نمیشود.
نکته: اگر ماکرویی واقعاً استفاده شده باشد، اما تنها در بلوکهای شرطی نادیدهگرفتهشده به کار رفته باشد، پیشپردازنده آن را به عنوان استفادهنشده گزارش میکند. برای جلوگیری از هشدار در چنین حالتی، میتوانید حوزهٔ تعریف ماکرو را بهبود دهید، مثلاً با انتقال آن به اولین بلوک نادیدهگرفتهشده. همچنین، میتوانید یک استفادهٔ ساختگی مانند زیر ایجاد کنید:
#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)
- هشدار هنگامی که فراخوانی یک تابع به نوعی ناسازگار تبدیل شود. برای نمونه، هشدار اگر فراخوانی تابعی که یک نوع عدد صحیح بازمیگرداند، به یک نوع اشارهگر تبدیل شود.
- -Wc90-c99-compat (فقط C و Objective-C)
- هشدار دربارهٔ قابلیتهایی که در ISO C90 موجود نیستند اما در ISO C99 وجود دارند. برای نمونه، هشدار دربارهٔ استفاده از آرایههای با طول متغیر، نوع "long long"، نوع "bool"، لیترالهای مرکب، مقداردهندههای اولیهی تعیینشده و غیره. این گزینه مستقل از حالت استانداردها است. هشدارها در عبارتی که پس از "__extension__" میآید غیرفعال هستند.
- -Wc99-c11-compat (فقط C و Objective-C)
- هشدار دربارهٔ قابلیتهایی که در ISO C99 موجود نیستند اما در ISO C11 وجود دارند. برای نمونه، هشدار دربارهٔ استفاده از ساختارها و اجتماعات بینام، توصیفکنندهٔ نوع "_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"،
استفاده از
نحو [[]] برای
مشخصهها،
استفاده از
انواع ممیز
شناور
دهدهی و
غیره. این
گزینه
مستقل از
حالت
استانداردها
است.
هشدارها در
عبارتی که
پس از
"__extension__"
میآید
غیرفعال
هستند. نام
-Wc11-c2x-compat منسوخ
شده است.
هنگامی که کامپایل در حالت C23 نباشد، این هشدارها توسط -pedantic-errors به خطا ارتقا مییابند.
- -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
- هشدار
هرگاه یک
اشارهگر
طوری تبدیل
نوع شود که
توصیفکنندهٔ
نوع از نوع
هدف حذف
گردد. برای
نمونه،
هشدار اگر
یک "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
- هشدار میدهد هرگاه اشارهگری به گونهای تبدیل نوع شود که تراز (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++، همچنین در مورد تفکیک بارگذاری بیشازحد (overload resolution) گیجکننده برای تبدیلهای تعریفشده توسط کاربر؛ و تبدیلهایی که هرگز از یک عملگر تبدیل نوع استفاده نمیکنند هشدار میدهد: تبدیلها به "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++) به اشیایی با طول مدت ذخیرهسازی خودکار پس از پایان یافتن طول عمر آنها هشدار میدهد. این شامل متغیرهای محلی اعلانشده در بلوکهای تودرتو، لیترالهای ترکیبی (compound literals) و سایر اشیای موقت بینام است. علاوه بر این، در مورد ذخیره آدرس چنین اشیایی در اشارهگرهای فرارکرده (escaped pointers) هشدار میدهد. این هشدار در تمام سطوح بهینهسازی فعال است، اما ممکن است در حالت فعال بودن بهینهسازی نسبت به حالت غیرفعال نتایج متفاوتی داشته باشد.
- -Wdangling-pointer=1
- در سطح ۱، این هشدار تنها استفادههای بدون شرط از اشارهگرهای معلق (dangling pointers) را تشخیص میدهد.
- -Wdangling-pointer=2
- در سطح ۲، این هشدار علاوه بر استفادههای بدون شرط، استفادههای مشروط از اشارهگرهای معلق را نیز تشخیص میدهد.
شکل کوتاه -Wdangling-pointer معادل -Wdangling-pointer=2 است، در حالی که -Wno-dangling-pointer و -Wdangling-pointer=0 اثر یکسانی در غیرفعال کردن هشدارها دارند. -Wdangling-pointer=2 در -Wall گنجانده شده است.
این نمونه هشدار را در سطح ۱ فعال میکند؛ به آدرس شیء موقت بدون نام بهطور بدون شرط در خارج از حوزه (scope) آن ارجاع داده شده است.
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; }
در این مثال، هنگام استفاده از اشارهگر s، آرایهٔ a خارج از حوزه (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"، یک نوع عدد صحیح علامتدار، یا یک نوع عدد صحیح بدون علامت سازگار است. با این حال، از آنجا که انتخاب نوع زیربناییِ یک نوع شمارشی وابسته به پیادهسازی است، چنین عدم تطابقهایی ممکن است سبب بروز مشکلات سازگاری و انتقال شود. در 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)" بوده است. این اخطار تنها در صورتی صادر میشود که آرگومان سوم یک لیترال صفر باشد. در غیر این صورت، اگر عبارتی باشد که به صفر تقلیل یافته، یا تبدیل صفر به یک نوع دیگر باشد، احتمال این که آرگومانها به اشتباه جابهجا شده باشند بسیار کمتر است و هشداری صادر نمیشود. این هشدار توسط -Wall فعال میشود.
- -Waddress
- دربارهٔ
استفادههای
مشکوک از
عبارتهای
آدرس هشدار
میدهد. این
موارد شامل
مقایسهٔ
آدرس یک
تابع یا یک
شیء
اعلانشده
با ثابت
اشارهگر
تهی است،
مانند آنچه
در 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)، بنابراین استفاده از آنها در یک عبارت شرطی ممکن است نشاندهندهٔ پرانتزهای جاافتاده در فراخوانی تابع یا عدم ارجاعزدایی (dereference) در یک عبارت آرایهای باشد. زیرمجموعهٔ این هشدار برای اشارهگرهای شیء را میتوان با تبدیل نوع عملوند اشارهگر به یک نوع عدد صحیح مانند "intptr_t" یا "uintptr_t" نادیده گرفت. مقایسه در برابر لیترالهای رشتهای منجر به رفتار نامشخص (unspecified behavior) میشود و قابل حمل نیست، و پیشنهاد میکند که هدف احتمالاً فراخوانی "strcmp" بوده است. اگر عبارت مشکوک نتیجهٔ بسط یک ماکرو باشد، هشدار نادیده گرفته میشود. هشدار -Waddress توسط -Wall فعال میشود.
- -Wno-address-of-packed-member
- هنگامی که آدرس یک عضو بستهبندیشده (packed) از یک struct یا union گرفته میشود، که معمولاً به یک مقدار اشارهگر ناتراز میانجامد، هشدار داده نشود. این گزینه به طور پیشفرض فعال است.
- -Wlogical-op
- دربارهٔ
استفادههای
مشکوک از
عملگرهای
منطقی در
عبارات
هشدار
میدهد. این
شامل
استفاده از
عملگرهای
منطقی در
مواردی است
که
احتمالاً
انتظار یک
عملگر بیتی
میرود.
همچنین
زمانی که
عملوندهای
یک عملگر
منطقی
یکسان
باشند
هشدار
میدهد:
extern int a; if (a < 0 && a < 0) { ... } - -Wlogical-not-parentheses
- دربارهٔ
نقیض منطقی
(logical not)
استفادهشده
در عملوند
سمت چپ یک
مقایسه
هشدار
میدهد. اگر
عملوند سمت
راست یک
عبارت بولی
در نظر
گرفته شود،
این گزینه
هشداری
صادر
نمیکند.
هدف آن
شناسایی
کدهای
مشکوکی
مانند
موارد زیر
است:
int a; ... if (!a > 1) { ... }میتوان این هشدار را با قرار دادن عملوند سمت چپ در پرانتز سرکوب کرد:
if ((!a) > 1) { ... }این هشدار توسط -Wall فعال میشود.
- -Waggregate-return
- اگر توابعی که ساختارها (structures) یا اجتماعها (unions) را بازمیگردانند تعریف یا فراخوانی شوند، هشدار میدهد. (در زبانهایی که امکان بازگرداندن آرایه وجود دارد، این مورد نیز باعث ایجاد هشدار میشود.)
- -Wno-aggressive-loop-optimizations
- اگر کامپایلر رفتار تعریفنشدهای را در حلقهای با تعداد تکرار ثابت شناسایی کرد، هشدار ندهد. -Waggressive-loop-optimizations به طور پیشفرض فعال است.
- -Wno-attributes
- در صورت
استفاده از
یک "__attribute__"
غیرمنتظره،
مانند
صفتهای
ناشناخته،
صفتهای
تابع
اعمالشده
بر روی
متغیرها و
غیره،
هشدار ندهد.
این گزینه
خطاهای
مربوط به
استفادهٔ
نادرست از
صفتهای
پشتیبانیشده
را متوقف
نمیکند.
هشدارهای مربوط به استفادههای ناهنجار (ill-formed) از صفتهای استاندارد، با گزینهٔ -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 به
طور
پیشفرض
فعال است.
برای
جلوگیری از
این هشدار،
هدر مناسب
را اضافه
کنید تا
پیشنمونههای
توابع
توکار در
دامنه قرار
گیرند.
برای مثال، فراخوانی "memset" در زیر توسط این هشدار شناسایی میشود زیرا تابع مقداری از نوع "size_t" را به عنوان آرگومان خود انتظار دارد اما نوع 32 برابر با "int" است. با -Wextra، اعلان تابع نیز با هشدار مواجه میشود.
extern void* memset (); void f (void *d) { memset (d, '\0', 32); } - -Wno-builtin-macro-redefined
- در صورت بازتعریف برخی ماکروهای توکار، هشدار داده نشود. این گزینه هشدارهای مربوط به بازتعریف "__TIMESTAMP__"، "__TIME__"، "__DATE__"، "__FILE__" و "__BASE_FILE__" را سرکوب میکند.
- -Wfree-labels (فقط C و Objective-C)
- اگر یک
برچسب به یک
غیردستور
(non-statement) نسبت
داده شود یا
در انتهای
یک دستور
مرکب
بیاید،
هشدار
میدهد.
چنین
برچسبهایی
توسط C23 و
گویشهای
بعدی C مجاز
هستند و در
سایر
گویشها به
عنوان یک
افزونهٔ GCC
در دسترس
هستند.
این هشدار توسط -Wc11-c23-compat نیز فعال میشود. در صورت کامپایل برای نسخههای C پیش از C23، توسط -pedantic-errors به یک خطا تبدیل میشود.
- -Wheader-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)
- دربارهٔ استفادههای رو به منسوخ شدن در یک اعلان، مطابق با استاندارد C، هشدار میدهد. به عنوان مثال، اگر مشخصکنندههای ردهٔ ذخیرهسازی مانند "static" نخستین مورد در یک اعلان نباشند، هشدار میدهد. این هشدار همچنین توسط -Wextra فعال میشود.
- -Wold-style-definition (فقط C و Objective-C)
- اگر تعریف
تابع به سبک
قدیمی
استفاده
شود، هشدار
میدهد. حتی
در صورت
وجود یک
پیشنمونهٔ
قبلی نیز
هشدار داده
میشود.
تعریفی که
از ()
استفاده
میکند در
حالت 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 فعال میشود. در صورت ساخت برای نسخهای از C پیش از C23، این هشدار توسط -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، یا توابع موجود در فضاهای نام ناشناس صادر نمیشود.
- -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 باشد که مفهوم 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 positive) وجود دارد. برای ساکت کردن این هشدار، عبارت را در پرانتز قرار دهید. برای نمونه، کد زیر حتی در حالتی که 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 استفاده کنید، GCC در صورتی که کد شما در قالب NFKC نباشد هشدار میدهد. این هشدار با هشدار دادن دربارهٔ هر شناسهای که حرف 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
- اگر مدل هزینه بردارساز، رهنمود 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)
- اگر فیلد مقداردهیشدهای با اثرات جانبی هنگام استفاده از designated initializers بازنویسی شود، هشدار ندهد. این هشدار به طور پیشفرض فعال است.
- -Wpacked
- اگر به یک
ساختار
مشخصه packed
داده شود،
اما این
مشخصه هیچ
تاثیری بر
چینش یا
اندازه
ساختار
نداشته
باشد،
هشدار
میدهد.
چنین
ساختارهایی
ممکن است در
ازای
فایدهای
اندک دچار
ناترازی
شوند. برای
نمونه، در
این کد،
متغیر
"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 4.4
تغییر کرده
باشد، GCC به
شما اطلاع
میدهد.
برای مثال،
در این
ساختار
دیگر یک
فاصلهگذاری
۴ بیتی بین
فیلد "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
- اگر چیزی بیش از یک بار در همان حوزه اعلان شود، حتی در مواردی که اعلان چندگانه معتبر است و تغییری ایجاد نمیکند، هشدار میدهد.
- -Wrestrict
- زمانی که یک
شیء
ارجاعشده
توسط
پارامتری
با صلاحیت
"restrict" (یا
در C++،
پارامتری
با صلاحیت
"__restrict")
دارای نام
مستعار با
آرگومان
دیگری
باشد، یا
هنگامی که
کپیهای
بین چنین
اشیایی
همپوشانی
داشته
باشند،
هشدار
میدهد.
برای مثال،
فراخوانی
تابع
"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 به اندازه کافی از هم دور باشند تا عملیات ذخیرهسازی در یکی نیازمند دسترسی به دیگری برای بارگذاری مجدد خط حافظه نهان نباشد.
به طور پیشفرض، گزینههای --param destructive-interference-size و --param constructive-interference-size بر اساس گزینهٔ فعلی -mtune تنظیم میشوند؛ معمولاً به اندازه خط حافظه نهان L1 برای پردازنده مقصد، و گاهی به یک محدوده در صورت بهینهسازی برای یک مقصد عمومی. بنابراین تمام واحدهای ترجمه که برای استفاده از این متغیرها به سازگاری ABI وابستهاند باید با همان -mtune (یا -mcpu) کامپایل شوند.
اگر پایداری ABI مهم است، مثلاً اگر این متغیر در یک هدر برای کتابخانه استفاده میشود، احتمالاً نباید اصلاً از متغیرهای اندازه تداخل سختافزاری استفاده کنید. در غیر این صورت، میتوانید با --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
- اگر یک سرآیند پیشکامپایلشده در مسیر جستجو پیدا شود اما نتوان از آن استفاده کرد، هشدار میدهد.
- -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
- اگر در حالت ISO C90 از ماکروهای با تعداد آرگومان متغیر استفاده شود، یا اگر در حالت ISO C99 نحو جایگزین GNU به کار رود، هشدار میدهد. این گزینه توسط -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
- در مورد
اعلانهای
مجدد
توابعی که
شامل
آرگومانهایی
از نوع
آرایه با
طول متغیر
با فرمها
یا انواع
ناسازگار
هستند
هشدار
میدهد، و
امکان
تشخیص
دسترسیهای
خارج از
محدوده به
چنین
پارامترهایی
را از طریق
هشدارهایی
مانند -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) را
در مواردی
که به نظر
میرسد
منظور در کد
به توان
رساندن
بوده است،
غیرفعال
میکند.
بهطور
خاص، این
هشدار
زمانی صادر
میشود که
سمت چپ ثابت
دهدهی 2 یا 10
باشد و سمت
راست نیز یک
ثابت
دهدهی
باشد.
در 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
- دربارهٔ
ثابتهای
رشتهای که
طولانیتر
از طول
«حداقلِ
حداکثر»
مشخصشده
در
استاندارد C
هستند،
هشدار
میدهد.
کامپایلرهای
امروزی
عموماً به
ثابتهای
رشتهای که
بسیار
طولانیتر
از حد مجاز
استاندارد
هستند
اجازه
میدهند،
اما
برنامههایی
با قابلیت
حمل بالا
باید از
استفاده از
رشتههای
طولانیتر
خودداری
کنند.
این محدودیت پس از الحاق ثابتهای رشتهای اعمال میشود و نویسهٔ پایانی NUL را شمارش نمیکند. در C90 این محدودیت 509 نویسه بود؛ در C99 به 4095 افزایش یافت. C++98 حداقلِ حداکثرِ هنجاری (normative) مشخصی تعیین نمیکند، بنابراین رشتههای بیش از حد طولانی در C++ گزارش نمیشوند.
این گزینه به صورت ضمنی توسط -Wpedantic فعال میشود، و با -Wno-overlength-strings قابل غیرفعالسازی است.
- -Wunsuffixed-float-constants (تنها در C و Objective-C)
- برای هر ثابت ممیز شناوری که پسوند ندارد، هشدار صادر میکند. هنگامی که همراه با -Wsystem-headers استفاده شود، دربارهٔ چنین ثابتهایی در فایلهای سرآیند سیستم هشدار میدهد. این میتواند هنگام آمادهسازی کد برای استفاده با پراگمای "FLOAT_CONST_DECIMAL64" از افزونهٔ ممیز شناور دهدهی برای C99 سودمند باشد..IP -Wno-lto-type-mismatch 4 در طول بهینهسازی زمان پیوند (LTO)، دربارهٔ عدم تطابق نوع در اعلانهای سراسری از واحدهای ترجمهٔ متفاوت هشدار ندهد. نیازمند فعال بودن -flto است. بهطور پیشفرض فعال است.
- -Wno-designated-init (تنها در C و Objective-C)
- هشدارهایی را که هنگام استفاده از یک مقداردهی اولیهٔ مکانی (positional initializer) برای مقداردهی اولیهٔ ساختاری علامتگذاریشده با مشخصهٔ "designated_init" صادر میشوند، فرونشانی میکند.
گزینههای واپایش تحلیل ایستا (Options That Control Static Analysis)
- -fanalyzer
- این گزینه
تحلیل
ایستای
جریان
برنامه را
فعال
میکند که
به دنبال
مسیرهای
بینروالی
«جالب»
درون کد
میگردد و
برای
مشکلات
یافتشده
در آنها
هشدار صادر
میکند.
این تحلیل بسیار سنگینتر از سایر هشدارهای GCC است.
از دیدگاه فنی، این گزینه یک اجرای نمادین هدایتشده با پوشش (coverage-guided symbolic execution) را بر روی کد در حال ترجمه انجام میدهد. این تحلیل نه معتبر (sound) است و نه کامل (complete): میتواند دارای مثبت کاذب (false positive) و منفی کاذب (false negative) باشد. این ابزار به جای اثبات درستی برنامه، ابزاری برای یافتن باگ است.
تحلیلگر در این نسخه تنها برای استفاده روی کدهای 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 با پشتیبانی فعال از تحلیلگر (analyzer) پیکربندی شده باشد.
- -Wanalyzer-symbol-too-complex
- اگر -fanalyzer
فعال باشد،
تحلیلگر
از روشهای
اکتشافی (heuristics)
گوناگونی
برای تلاش
جهت ردیابی
وضعیت
حافظه
استفاده
میکند،
اما این
روشها
ممکن است در
مواجهه با
کدهای بیش
از حد
پیچیده با
شکست مواجه
شوند.
بهطور پیشفرض، اگر مقادیر عبارات از آستانهٔ تعریفشده توسط --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 برای
غیرفعال
کردن آن
استفاده
کنید.
این تشخیص برای مسیرهایی در کد هشدار میدهد که در آنها یک اشارهگر *پس از* اینکه از قبل ارجاعزدایی (dereference) شده است، برای "NULL" بررسی میشود، که نشان میدهد اشارهگر میتوانسته NULL باشد. چنین مواردی بیانگر آن است که بررسی برای NULL یا زائد است، یا اینکه باید به قبل از ارجاعزدایی اشارهگر منتقل شود.
این تشخیص همچنین مقادیر دریافتشده توسط آرگومان تابعی را که با "__attribute__((nonnull))" علامتگذاری شده، نیازمند مقدار غیر-NULL تلقی میکند و بنابراین اگر چنین مقادیری پس از بازگشت از فراخوانی تابع برای "NULL" بررسی شوند، هشدار خواهد داد.
بعید است این تشخیص در صورت فعال بودن هر سطحی از بهینهسازی گزارش شود، زیرا منطق بهینهسازی GCC معمولاً چنین بررسیهایی برای NULL را زائد تشخیص داده و پیش از آنکه تحلیلگر آنها را «ببیند»، با بهینهسازی حذف میکند. بنابراین هنگام تلاش برای برانگیختن این تشخیص، بهینهسازی باید غیرفعال باشد.
- -Wno-analyzer-double-fclose
- این هشدار
نیازمند -fanalyzer
است که آن
را فعال
میکند؛ از
-Wno-analyzer-double-fclose برای
غیرفعال
کردن آن
استفاده
کنید.
این تشخیص برای مسیرهایی در کد هشدار میدهد که در آنها روی یک "FILE *" ممکن است بیش از یک بار "fclose" فراخوانی شود.
ببینید: 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
برای
غیرفعال
کردن آن
استفاده
کنید.
این تشخیص برای «نشت اطلاعات» (infoleaks) هشدار میدهد - مسیرهایی درون کد که در آنها مقادیر مقداردهینشده از یک مرز امنیتی عبور کرده و کپی میشوند (مانند کدی در هستهٔ سیستمعامل که یک ساختار با مقداردهی ناقص در پشته را به فضای کاربری کپی میکند).
ببینید: 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 برای
غیرفعال
کردن آن
استفاده
کنید.
این پیام تشخیصی درباره مسیرهایی در کد هشدار میدهد که در آنها نشت یک توصیفکننده فایلِ باز رخ میدهد.
ببینید 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" روی یک سوکت جریانی که هنوز "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" به دست آمده است، یا هنگام تلاش برای استفاده از یک عملیات سوکت جریانی روی یک سوکت دیتاگرام، هشدار میدهد.
- -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" روی یک اشارهگر بیرون از 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
برای
غیرفعال
کردن آن
استفاده
کنید.
این پیام تشخیصی درباره مسیرهایی در کد هشدار میدهد که در آنها محاسبات ممیز شناور در مکانهایی استفاده شدهاند که نیاز به محاسبات دقیق است. این پیام تشخیصی در حال حاضر تنها در صورت استفاده از عملوندهای ممیز شناور در محاسبه اندازه تخصیص حافظه هشدار میدهد.
- -Wno-analyzer-infinite-loop
- این هشدار
نیازمند -fanalyzer
است که آن
را فعال
میکند؛ از
-Wno-analyzer-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" را طی میکند و بدنه حلقه بدون انجام هیچ عملیاتی (no-op) با مقدار "cpu_state.pc" بدون تغییر باقی میماند؛ در نتیجه در تمامی تکرارهای بعدی از همان مقدار "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 برای
غیرفعال
کردن آن
استفاده
کنید.
این پیام تشخیصی درباره مسیرهایی در کد هشدار میدهد که به نظر میرسد به یک بازگشت بینهایت منجر میشوند.
به طور خاص، هنگامی که تحلیلگر یک فراخوانی بازگشتی را «میبیند»، وضعیت حافظه در ورودی فریم جدید را با وضعیت ورود به فریم پیشین آن تابع در پشته مقایسه میکند. اگر به نظر برسد هیچ تغییری در حافظه رخ نمیدهد، هشدار صادر میشود؛ هرگونه تغییر مشاهدهشده در پارامترها یا متغیرهای سراسری به عنوان عاملی برای پایان یافتن بازگشت فرض شده و در نتیجه مانع صدور هشدار میگردد.
این پیام تشخیصی احتمالاً مواردی از بازگشت بینهایت را که پیش از «دیده شدن» توسط تحلیلگر توسط بهینهساز به تکرار (حلقه) تبدیل شدهاند نادیده خواهد گرفت. بنابراین، هنگام تلاش برای فعالسازی این پیام تشخیصی، باید بهینهسازی غیرفعال شود.
با -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").
در مواردی که تحلیلگر قادر باشد، یک نمودار متنی (text art) تولید میکند که رابطه مکانی بین ناحیه حافظهای را که پیشبینی میکند مورد دسترسی قرار گیرد، در برابر محدوده حافظهای که دسترسی به آن مجاز است به تصویر میکشد: این که آیا همپوشانی دارند، مماس هستند، نزدیک یا دور از هم هستند؛ کدامیک در حافظه جلوتر یا عقبتر است، اندازههای نسبی مربوطه، جهت دسترسی (خواندن در مقابل نوشتن)، و در برخی موارد، مقادیر دادههای درگیر. این نمودار را میتوان با استفاده از -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 دیریفرنس (dereference) میشود.
ببینید: 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"، اشارهگری به یک متغیر محلی (اتوماتیک) یا بافری روی پشته فرستاده میشود.
ببینید: 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++ است، اما به جای تجزیه صرف درخت نحو، بر اساس تحلیل مسیرهای میانروالی (interprocedural) پیادهسازی شده است. با این حال، تحلیلگر اولویتی به شناسایی چنین مسیرهایی نمیدهد، بنابراین در مقایسه با سایر هشدارها، احتمال نتایج منفی کاذب (false negatives) بیشتر است.
- -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
استفاده
کنید.
این پیام تشخیصی درباره مسیرهایی از کد هشدار میدهد که در آنها مقداری که میتواند تحت کنترل مهاجم باشد، بدون اعتبارسنجی و پاکسازی (sanitize)، به عنوان اندازه یک تخصیص حافظه استفاده میشود؛ به طوری که مهاجم میتواند یک تخصیص بیش از حد بزرگ را تزریق کند و احتمالاً منجر به حمله منع سرویس (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 handlers). برای مثال: assert (some_tainted_value < SOME_LIMIT);
در چنین مواردی:
- هنگامی که بررسی assertion فعال باشد: مهاجم میتواند با تزریق شکست در assertion، یک حمله منع سرویس (denial of service) را تحریک کند
- هنگامی که بررسی assertion غیرفعال باشد، مانند زمانی که با تعریف "NDEBUG" انجام میشود، مهاجم میتواند دادههایی را تزریق کند که فرآیند را مختل سازد، زیرا احتمالاً پیششرطی را که توسط کد فرض شده است نقض میکند.
توجه داشته باشید که هنگام غیرفعال بودن بررسی assertion، معمولاً دستورات assertion پیش از آنکه تحلیلگر فرصت «دیدن» آنها را داشته باشد توسط پیشپردازنده حذف میشوند؛ بنابراین این هشدار تشخیصی تنها میتواند در ساختهایی هشدار تولید کند که بررسی assertion در آنها فعال است.
برای اهداف این هشدار، هر تابعی که با مشخصهٔ "noreturn" علامتگذاری شده باشد، از جمله "__builtin_unreachable"، به عنوان یک گردانندهٔ احتمالی شکست assertion در نظر گرفته میشود. توجه داشته باشید که این توابع گاهی اوقات پیش از آنکه تحلیلگر آنها را «ببیند»، توسط بهینهساز حذف میشوند. بنابراین هنگام تلاش برای برانگیختن این هشدار تشخیصی، بهینهسازی باید غیرفعال شود.
ببینید 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 */
}
اگرچه مورد بالا، از نظر فنی، یک شکست assertion به شمار نمیآید.
- -Wno-analyzer-tainted-array-index
- این هشدار
نیازمند -fanalyzer
است که آن
را فعال
میکند؛
برای
غیرفعال
کردن آن از
-Wno-analyzer-tainted-array-index
استفاده
کنید.
این هشدار تشخیصی دربارهٔ مسیرهایی در کد هشدار میدهد که در آنها مقداری که میتواند تحت کنترل مهاجم باشد، بدون پالایش (sanitization) به عنوان اندیس دسترسی به یک آرایه استفاده شده است، به طوری که مهاجم میتواند یک دسترسی خارج از محدوده را تزریق کند.
ببینید 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")، از درون یک گردانندهٔ سیگنال فراخوانی شده است.
ببینید 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
استفاده
کنید.
این هشدار تشخیصی دربارهٔ مسیرهایی در کد هشدار میدهد که در آنها یک اشارهگر پس از فراخوانی تابع آزادساز روی آن استفاده میشود: چه "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
استفاده
کنید.
این هشدار تشخیصی دربارهٔ مسیرهایی در کد هشدار میدهد که در آنها اشارهگری که به متغیری در یک فریم پشتهٔ منقضیشده اشاره دارد، مرجعزدایی (dereference) میشود.
- -Wno-analyzer-va-arg-type-mismatch
- این هشدار
نیازمند -fanalyzer
است که آن
را فعال
میکند؛
برای
غیرفعال
کردن آن از
-Wno-analyzer-va-arg-type-mismatch
استفاده
کنید.
این هشدار تشخیصی دربارهٔ مسیرهای بینروالی در کد هشدار میدهد که در آنها تحلیلگر تلاشی را برای استفاده از "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").
تحلیلگر دانشی از پیش تعیینشده (hardcoded) دربارهی رفتار توابع مدیریت حافظهی زیر دارد:
- *<"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) میسازد که گرافهای جریان کنترل را با اطلاعات جریان داده ترکیب میکند.
بهطور پیشفرض، یک یال در این گراف میتواند حاوی اثرات اجرای چندین دستور درون یک بلوک پایه باشد. با -fanalyzer-fine-grained، هر دستور یال اختصاصی خود را دریافت میکند.
- -fanalyzer-show-duplicate-count
- این گزینه برای توسعهدهندگان تحلیلگر در نظر گرفته شده است: اگر چند پیام تشخیصی به عنوان موارد تکراری از یکدیگر شناسایی شوند، هنگام گزارش بهترین تشخیص، یادداشتی صادر میکند و تعداد تشخیصهای اضافی را که توسط منطق حذف موارد تکراری نادیده گرفته شدهاند، اعلام مینماید.
- -fanalyzer-show-events-in-system-headers
- بهطور پیشفرض تحلیلگر با پنهان کردن رخدادهایی که بهطور کامل درون یک سرآیند سیستمی قرار دارند، مسیرهای تشخیصی سادهشدهای صادر میکند. با -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 تحلیلگر حتی پس از صدور چنین تشخیصهایی به کاوش در این مسیرها ادامه خواهد داد، که این امر میتواند برای اشکالزدایی مسائل درون تحلیلگر یا برای معیارسنجیهای خرد جهت شناسایی رفتار تعریفنشده مفید باشد.
- -fanalyzer-transitivity
- این گزینه خاصیت تعدی محدودیتها را درون تحلیلگر فعال میکند.
- -fno-analyzer-undo-inlining
- این گزینه
برای
توسعهدهندگان
تحلیلگر
در نظر
گرفته شده
است.
-fanalyzer در مقایسه با سایر ابزارهای تحلیل کد نسبتاً دیرتر اجرا میشود و برخی بهینهسازیها پیشتر روی کد اعمال شدهاند. بهویژه، ممکن است درونخطسازی توابع (inlining) رخ داده باشد که باعث میشود مسیرهای اجرای بینرویهای صادرشده توسط تحلیلگر شامل فریمهای تابعی باشند که با فریمهای کد منبع اصلی مطابقت ندارند.
بهطور پیشفرض تحلیلگر تلاش میکند فریمهای تابع اصلی را بازسازی کرده و رخدادهایی را برای نشان دادن فراخوانیهای درونخطشده صادر کند.
با -fno-analyzer-undo-inlining میتوان این تلاش برای بازسازی اطلاعات فریم اصلی را غیرفعال کرد، که این کار ممکن است هنگام اشکالزدایی مشکلات در تحلیلگر یاریرسان باشد.
- -fanalyzer-verbose-edges
- این گزینه برای توسعهدهندگان تحلیلگر در نظر گرفته شده است. این گزینه جزئیات سطح پایینتر و مشروحتری را در توصیف جریان کنترل درون مسیرهای تشخیصی فعال میکند.
- -fanalyzer-verbose-state-changes
- این گزینه برای توسعهدهندگان تحلیلگر در نظر گرفته شده است. این گزینه جزئیات سطح پایینتر و مشروحتری را در توصیف رخدادهای مربوط به ماشینهای وضعیت درون مسیرهای تشخیصی فعال میکند.
- -fanalyzer-verbosity=level
- این گزینه
پیچیدگی
مسیرهای
جریان
کنترلی را
که برای
تشخیصهای
تحلیلگر
صادر
میشوند
کنترل
میکند.
مقدار level میتواند یکی از موارد زیر باشد:
- 0
- در این سطح، رخدادهای فراخوانی و بازگشت بینرویهای، همراه با مرتبطترین رخدادهای تغییر وضعیت مربوط به یک تشخیص نمایش داده میشوند. برای مثال، برای یک تشخیص آزادسازی دوگانه ("free" مضاعف)، هر دو فراخوانی "free" نشان داده خواهند شد.
- 1
- مشابه سطح قبلی، اما رخدادهای مربوط به ورود به هر تابع را نیز نشان میدهد.
- 2
- مشابه سطح
قبلی، اما
رخدادهای
مربوط به
جریان
کنترل را که
در رخ دادن
مشکل اهمیت
دارند نیز
نشان
میدهد
(مانند «طی
شدن مسیر
درست/true» در
یک شرط).
این سطح پیشفرض است.
- 3
- مشابه سطح قبلی، اما تمام رخدادهای جریان کنترل را نشان میدهد، نه فقط رخدادهای مهم را.
- 4
- این سطح برای توسعهدهندگان تحلیلگر در نظر گرفته شده است؛ این سطح رخدادهای متفرقه دیگری را که برای اشکالزدایی تحلیلگر در نظر گرفته شدهاند اضافه میکند.
- -fdump-analyzer
- جزئیات درونی درباره اقدامات در حال انجام توسط تحلیلگر را در file.analyzer.txt ذخیره میکند. گزینه -fdump-analyzer-stderr بر این گزینه اولویت دارد..IP -fdump-analyzer-stderr 4 تخلیه جزئیات درونی درباره آنچه تحلیلگر انجام میدهد در stderr. این گزینه بر -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
- تخلیه جزئیات درونی درباره جستجوی تحلیلگر برای مسیرهای شدنی (feasible paths). این جزئیات در قالبی مناسب برای مشاهده با 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
میتواند
۲، ۳، ۴ یا ۵
باشد؛ نسخه
پیشفرض
برای بیشتر
هدفها ۵
است (به
استثنای VxWorks،
TPF و Darwin / macOS که
پیشفرض
آنها نسخه
۲ است، و AIX که
پیشفرض آن
نسخه ۴ است).
توجه داشته باشید که در نسخه ۲ DWARF، برخی پورتها به افزونههای غیرمتعارض DWARF 3 در جدولهای بازپیچی (unwind tables) نیاز دارند و همواره از آنها استفاده میکنند.
نسخه ۴ برای بهرهوری حداکثری ممکن است به GDB 7.0 و -fvar-tracking-assignments نیاز داشته باشد. نسخه ۵ نیازمند GDB 8.0 یا بالاتر است.
کامپایلر GCC دیگر از نسخه ۱ DWARF پشتیبانی نمیکند، که تفاوتهای بنیادینی با نسخه ۲ و نسخههای پس از آن دارد. به دلایل تاریخی، برخی دیگر از گزینههای مرتبط با DWARF مانند -fno-dwarf2-cfi-asm ارجاع به نسخه ۲ 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 ندارند حذف شوند.
این گزینه به طور پیشفرض برای هدف BPF هنگام تولید اطلاعات BTF فعال است.
- -gctf
- -gctflevel
- درخواست
اطلاعات
اشکالزدایی
CTF و استفاده
از level برای
تعیین
میزان
اطلاعات
اشکالزدایی
CTF تولیدی.
اگر -gctf بدون
مقدار برای
level مشخص
شود، سطح
پیشفرض
اطلاعات
اشکالزدایی
CTF برابر ۲
خواهد بود.
اطلاعات اشکالزدایی CTF میتوانند در کنار اطلاعات اشکالزدایی DWARF تولید شوند هنگامی که هر دو قالب صراحتاً از طریق گزینههای خط فرمان مربوطه فعال گردند.
سطح ۰ هیچگونه اطلاعات اشکالزدایی CTF تولید نمیکند. بنابراین، -gctf0 گزینه -gctf را خنثی میکند.
سطح ۱ اطلاعات CTF را تنها برای ردگیری فراخوانیها (tracebacks) تولید میکند. این اطلاعات شامل محل فراخوانی (callsite) میشود، اما اطلاعات نوع را در بر نمیگیرد.
سطح ۲ اطلاعات نوع را تنها برای موجودیتها (توابع، اشیاء داده و غیره) در حوزه فایل یا حوزه سراسری تولید میکند.
- -gvms
- تولید اطلاعات اشکالزدایی در قالب اشکالزدایی Alpha/VMS (در صورت پشتیبانی). این قالبی است که توسط DEBUG در سیستمهای Alpha/VMS استفاده میشود..IP -gcodeview 4 تولید اطلاعات اشکالزدایی در قالب اشکالزدایی CodeView (در صورت پشتیبانی). این قالبی است که توسط Microsoft Visual C++ در ویندوز استفاده میشود.
- -glevel
- -ggdblevel
- -gvmslevel
- درخواست
اطلاعات
اشکالزدایی
و همچنین
استفاده از
level برای
مشخص کردن
میزان
اطلاعات.
سطح
پیشفرض ۲
است.
سطح ۰ هیچگونه اطلاعات اشکالزدایی تولید نمیکند. بنابراین، -g0 اثر -g را خنثی میکند.
سطح ۱ حداقل اطلاعات را تولید میکند، که برای ایجاد ردیابی بازگشتی (backtrace) در بخشهایی از برنامه که قصد اشکالزدایی آنها را ندارید کافی است. این سطح شامل توضیحات توابع، متغیرهای خارجی و جدولهای شماره خط است، اما اطلاعاتی دربارهٔ متغیرهای محلی در بر ندارد.
سطح ۳ شامل اطلاعات اضافی است، مانند تمام تعریفهای ماکرو موجود در برنامه. برخی از اشکالزداها هنگام استفاده از -g3 از بسط ماکرو پشتیبانی میکنند.
اگر از چندین گزینهٔ -g، همراه با شماره سطح یا بدون آن، استفاده کنید، آخرین گزینهٔ مشخصشده مؤثر خواهد بود.
برای جلوگیری از سردرگمی با -gdwarf-level، گزینهٔ -gdwarf سطح اشکالزدایی متصل را نمیپذیرد. بهجای آن، از یک گزینهٔ اضافی -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 قرار دارند. این گزینه میتواند برای جایگزین کردن مسیر زمان ساخت با مسیر زمان نصب در اطلاعات اشکالزدایی به کار رود. همچنین میتوان با استفاده از . برای new، یک مسیر مطلق را به مسیری نسبی تغییر داد. این امر میتواند منجر به ساختهای تکرارپذیرتر و مستقل از مکان شود، اما ممکن است برای آگاه کردن GDB از مکان یافتن فایلهای منبع، به دستوری اضافی نیاز داشته باشد. همچنین -ffile-prefix-map و -fcanon-prefix-map را ببینید.
- -fvar-tracking
- گذرگاه
ردیابی
متغیرها را
اجرا
میکند. این
گزینه
محاسبه
میکند که
متغیرها در
هر نقطه از
کد در کجا
ذخیره
شدهاند. در
نتیجه
اطلاعات
اشکالزدایی
بهتری
تولید
میشود (در
صورتی که
قالب
اطلاعات
اشکالزدایی
از این
دادهها
پشتیبانی
کند).
این گزینه هنگام کامپایل با بهینهسازی (-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 را انتخاب میکند. پیشفرض وابسته به معماری هدف است، اگرچه در بیشتر هدفها -gdwarf32 میباشد. قالب ۳۲ بیتی DWARF کمحجمتر است، اما نمیتواند بیش از ۲ گیبیبایت اطلاعات اشکالزدایی را در هیچیک از بخشهای اطلاعات اشکالزدایی DWARF پشتیبانی کند. قالب ۶۴ بیتی DWARF امکان ایجاد اطلاعات اشکالزدایی بزرگتر را فراهم میکند و ممکن است هنوز بهخوبی توسط همهٔ مصرفکنندهها پشتیبانی نشود.
- -gdescribe-dies
- ویژگیهای توصیفی را به برخی از DIEهای DWARF که فاقد صفت نام (name attribute) هستند اضافه میکند، مانند متغیرهای مصنوعی، ارجاعات خارجی و DIEهای پارامتر محل فراخوانی.
- -gpubnames
- بخشهای DWARF شامل ".debug_pubnames" و ".debug_pubtypes" را تولید میکند.
- -ggnu-pubnames
- بخشهای ".debug_pubnames" و ".debug_pubtypes" را در قالبی مناسب برای تبدیل به نمایهٔ 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" و
بازنشانی
بررسی ادعا
در دستورات
هدایتگر
".loc"
پشتیبانی
میکند.
اگر هنگام پیکربندی GCC مشخص شود که اسمبلر از آنها پشتیبانی میکند، این گزینه بهطور پیشفرض فعال خواهد شد.
- -gno-as-locview-support
- در صورتی که -gvariable-location-views صراحتاً درخواست شده باشد، GCC را مجبور میکند که شمارههای نما را بهصورت داخلی اختصاص دهد.
- -gcolumn-info
- انتشار اطلاعات ستون مکان در اطلاعات اشکالزدایی DWARF، به جای صرفاً فایل و سطر. این گزینه بهطور پیشفرض فعال است.
- -gstatement-frontiers
- -gno-statement-frontiers
- این گزینه باعث میشود GCC نشانگرهایی را در نمایش درونی در ابتدای دستورات ایجاد کند و آنها را در طول فرایند ترجمه تقریباً در جای خود نگه دارد، تا از آنها برای هدایت خروجی نشانگرهای "is_stmt" در جدول شماره سطر استفاده کند. این ویژگی هنگام ترجمه با بهینهسازی (-Os، -O1، -O2 و...) و تولید اطلاعات اشکالزدایی DWARF 2 در سطح عادی، بهطور پیشفرض فعال است.
- -gvariable-location-views
- -gvariable-location-views=incompat5
- -gno-variable-location-views
- افزودن
شمارههای
نمای
پیشروندهٔ
استنباطشده
از جدول
شماره سطر
به
فهرستهای
مکان متغیر.
این کار به
مصرفکنندگان
اطلاعات
اشکالزدایی
امکان
میدهد تا
وضعیت را در
نقاط مشخصی
از برنامه
بررسی
کنند، حتی
اگر در آن
نقطه هیچ
دستورالعملی
مرتبط با
مکانهای
متناظر در
کد منبع
وجود
نداشته
باشد. اگر
اسمبلر از
شمارههای
نما در
جدولهای
شماره سطر
پشتیبانی
نکند، این
امر موجب
میشود
کامپایلر
جدول شماره
سطر را
منتشر کند
که عموماً
فشردگی
آنها را تا
حدی کاهش
میدهد.
جدولهای
شماره سطر و
فهرستهای
مکان
تقویتشده،
کاملاً با
گذشته
سازگارند
(backward-compatible)،
بنابراین
میتوانند
توسط
مصرفکنندگان
اطلاعات
اشکالزدایی
که از این
افزونهها
آگاهی
ندارند
استفاده
شوند، اما
نفعی نیز از
آنها
نخواهند
برد.
این گزینه هنگام تولید اطلاعات اشکالزدایی 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
- تلاش برای تعیین نماهای مکانی که میتوان آنها را از فهرستهای نمای مکان حذف کرد. این کار نیازمند آن است که کامپایلر برآوردهای بسیار دقیقی از طول دستورالعملها (insn length) داشته باشد که همیشه اینگونه نیست، و در هنگام استفاده از اسمبلری که از فهرستهای نمای مکان پشتیبانی نمیکند، ممکن است باعث تولید بیسروصدای فهرستهای نمای نادرست شود. اسمبلر GNU هرگونه خطای اینچنینی را به عنوان یک "view number mismatch" علامتگذاری خواهد کرد. این ویژگی تنها روی پورتهایی فعال است که تابع برآورد قابل اعتمادی را تعریف کرده باشند.
- -ginline-points
- -gno-inline-points
- تولید اطلاعات اشکالزدایی گسترشیافته برای توابع درونخطی (inlined). نشانگرهای ردیابی نمای مکان در نقاط ورود توابع درونخطی درج میشوند تا آدرس و شمارههای نما محاسبه شده و در اطلاعات اشکالزدایی خروجی داده شوند. این گزینه میتواند مستقل از نماهای مکان فعال شود که در آن حالت، شمارههای نما در خروجی قرار نخواهند گرفت، اما تنها همراه با مرزهای دستور (statement frontiers) قابل فعالسازی است و بهطور پیشفرض تنها در صورتی فعال میشود که نماهای مکان فعال باشند.
- -gz[=type]
- تولید بخشهای اشکالزدایی فشرده در قالب DWARF، در صورت پشتیبانی. اگر type داده نشود، نوع پیشفرض به قابلیتهای اسمبلر و پیونددهندهٔ (linker) مورد استفاده بستگی دارد. type ممکن است یکی از مقادیر none (بخشهای اشکالزدایی فشرده نشوند) یا zlib (استفاده از فشردهسازی zlib در قالب ELF gABI) باشد. اگر پیونددهنده از نوشتن بخشهای اشکالزدایی فشرده پشتیبانی نکند، گزینه رد میشود. در غیر این صورت، چنانچه اسمبلر از آنها پشتیبانی نکند، -gz هنگام تولید فایلهای شیء بهطور بیسروصدا نادیده گرفته میشود.
- -femit-struct-debug-baseonly
- انتشار
اطلاعات
اشکالزدایی
برای انواع
شبهساختار
(struct-like) فقط
زمانی که
نام پایهٔ
فایل منبع
ترجمه با
نام پایهٔ
فایلی که
ساختار در
آن تعریف
شده است
مطابقت
داشته باشد.
این گزینه اندازهٔ اطلاعات اشکالزدایی را به شکل چشمگیری کاهش میدهد، اما با احتمال از دست رفتن قابل توجه اطلاعات نوع برای اشکالزدا. برای گزینهای ملایمتر، به -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:). یک نوع ساختار زمانی بهطور مستقیم استفاده میشود که نوع یک متغیر یا عضو باشد. استفادههای غیرمستقیم از طریق اشارهگرها به ساختارها ناشی میشوند؛ یعنی زمانی که استفاده از یک ساختار ناقص معتبر است، استفاده غیرمستقیم محسوب میشود. یک مثال از این دست عبارت است از struct one direct; struct two * indirect;.
کلمهٔ دومِ اختیاری، مشخصات را به ساختارهای معمولی (ord:) یا ساختارهای جنریک (gen:) محدود میکند. توضیح ساختارهای جنریک کمی پیچیده است. برای ++C، اینها تخصیصهای غیراختصاصی کلاسهای قالب یا کلاسهای غیرقالب درون موارد بالا هستند. زبانهای برنامهنویسی دیگر نیز جنریکها را دارند، اما -femit-struct-debug-detailed هنوز آنها را پیادهسازی نکرده است.
کلمهٔ سوم فایلهای منبع را برای آن دسته از ساختارهایی تعیین میکند که کامپایلر باید برای آنها اطلاعات اشکالزدایی تولید کند. مقادیر none و any معنای معمول خود را دارند. مقدار base به این معنی است که نام پایهٔ فایلی که اعلان نوع در آن قرار دارد باید با نام پایهٔ فایل اصلی ترجمه مطابقت داشته باشد. در عمل، این بدان معناست که هنگام ترجمهٔ foo.c، اطلاعات اشکالزدایی برای انواع اعلانشده در آن فایل و foo.h تولید میشود، اما برای سایر فایلهای سرآیند تولید نخواهد شد. مقدار sys به معنای انواعی است که شرایط base را برآورده میکنند یا در سرآیندهای سیستمی یا سرآیندهای کامپایلر اعلان شدهاند.
ممکن است لازم باشد برای تعیین بهترین تنظیمات برای برنامهٔ کاربردی خود، آزمون و خطا کنید.
مقدار پیشفرض -femit-struct-debug-detailed=all است.
این گزینه فقط با خروجی اشکالزدایی DWARF کار میکند.
- -fno-dwarf2-cfi-asm
- انتشار اطلاعات unwind در DWARF به صورت بخش ".eh_frame" تولیدشده توسط کامپایلر به جای استفاده از هدایتکنندههای ".cfi_*" متعلق به GAS.
- -fno-eliminate-unused-debug-types
- بهطور معمول هنگام تولید خروجی DWARF، کامپایلر GCC از تولید نمادهای اشکالزدایی برای انواعی که در هیچ کجای فایل منبعِ در حال ترجمه استفاده نشدهاند خودداری میکند. گاهی اوقات مفید است که GCC برای تمام انواع اعلانشده در یک واحد ترجمه، صرفنظر از اینکه واقعاً در آن واحد ترجمه استفاده شدهاند یا خیر، اطلاعات اشکالزدایی منتشر کند؛ برای نمونه، اگر در اشکالزدا بخواهید مقداری را به نوعی که در برنامه استفاده نشده (اما اعلان شده است) تبدیل نوع (cast) کنید. با این حال، در اغلب موارد این کار باعث هدر رفتن میزان قابل توجهی از فضا میشود..SS "گزینههای کنترل بهینهسازی (Options That Control Optimization)" این گزینهها انواع مختلفی از بهینهسازیها را کنترل میکنند.
بدون هیچ گزینه بهینهسازی، هدف کامپایلر کاهش هزینه کامپایل و دستیابی به نتایج مورد انتظار هنگام اشکالزدایی است. دستورها مستقل از یکدیگرند: اگر برنامه را با یک نقطه توقف بین دو دستور متوقف کنید، میتوانید مقداری جدید به هر متغیر نسبت دهید یا شمارنده برنامه را به هر دستور دیگری در تابع تغییر داده و دقیقاً به نتایجی برسید که بر اساس کد منبع انتظار دارید.
فعالسازی پرچمهای بهینهسازی موجب میشود کامپایلر تلاش کند تا کارایی و/یا اندازه کد را به بهای افزایش زمان کامپایل و احتمالاً کاهش توانایی اشکالزدایی برنامه بهبود بخشد.
کامپایلر بهینهسازی را بر پایه شناختی که از برنامه دارد انجام میدهد. کامپایل چندین فایل بهطور همزمان در حالت تولید یک فایل خروجی واحد به کامپایلر این امکان را میدهد که هنگام کامپایل هر یک از آنها، از اطلاعات بهدستآمده از تمام فایلها استفاده کند.
همه بهینهسازیها مستقیماً توسط یک پرچم کنترل نمیشوند. در این بخش تنها بهینهسازیهایی که پرچمی برای آنها وجود دارد فهرست شدهاند.
بیشتر بهینهسازیها در سطح -O0 یا در حالتی که هیچ سطحی از -O در خط فرمان تعیین نشده باشد، بهطور کامل غیرفعال میشوند؛ حتی اگر پرچمهای بهینهسازی منفرد مشخص شده باشند. به همین ترتیب، -Og نیز بسیاری از مراحل بهینهسازی را لغو میکند.
بسته به معماری هدف و نحوه پیکربندی GCC، ممکن است در هر سطح از -O مجموعه کمی متفاوتی از بهینهسازیها نسبت به موارد ذکرشده در اینجا فعال شود. میتوانید GCC را با -Q --help=optimizers فراخوانی کنید تا از مجموعه دقیق بهینهسازیهای فعالشده در هر سطح مطلع شوید.
- -O
- -O1
- بهینهسازی.
کامپایل
بهینهساز
تا حدودی
زمان
بیشتری
میبرد و
برای یک
تابع بزرگ،
حافظه
بسیار
بیشتری
مصرف
میکند.
با استفاده از -O، کامپایلر تلاش میکند اندازه کد و زمان اجرا را کاهش دهد، بدون اینکه بهینهسازیهایی را اجرا کند که زمان کامپایل بسیار زیادی صرف میکنند.
سطح -O به عنوان تعادلی معقول میان زمان صرفشده برای کامپایل و مصرف حافظه، سطح بهینهسازی توصیهشده برای کدهای حجیم تولیدشده توسط ماشین است: سطوح بالاتر بهینهسازی، عملیاتهایی با پیچیدگی الگوریتمی بیشتری نسبت به -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
تقریباً
تمام
بهینهسازیهای
پشتیبانیشدهای
را که
مستلزم
مصالحه
میان فضا و
سرعت
نیستند،
انجام
میدهد. در
مقایسه با
-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 برای برنامههایی که از gotoهای محاسبهشده استفاده میکنند، توجه فرمایید.
- -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 وابسته به مراحل تحلیل کد یا استانداردسازی هستند که توسط -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)، همیشه به محض بازگشت هر تابع آرگومانها را از پشته خارج کنید. در سطوح -O1 و بالاتر، -fdefer-pop حالت پیشفرض است؛ این به کامپایلر اجازه میدهد آرگومانها برای چندین فراخوانی تابع روی پشته جمع شوند و سپس همه را به یکباره خارج کند.
- -fforward-propagate
- یک مرحله
انتشار رو
به جلو (forward propagation)
را روی RTL
انجام
میدهد. این
مرحله سعی
میکند دو
دستورالعمل
را ترکیب
کرده و
بررسی کند
که آیا
نتیجه قابل
سادهسازی
است یا خیر.
اگر باز
کردن حلقه (loop
unrolling) فعال
باشد، دو
مرحله
انجام
میشود و
دومی بعد از
باز کردن
حلقه
زمانبندی
میگردد.
این گزینه به طور پیشفرض در سطوح بهینهسازی -O1، -O2، -O3 و -Os فعال است.
- -favoid-store-forwarding
- -fno-avoid-store-forwarding
- بسیاری از
CPUها زمانی
که یک
بارگذاری (load)
تا حدی به
ذخیرهسازیهای
(store) کوچکتر
قبلی
وابسته
باشد، برای
چندین چرخه
متوقف (stall)
میشوند.
این مرحله
سعی میکند
چنین
مواردی را
تشخیص داده
و با تغییر
ترتیب
بارگذاری و
ذخیرهسازی
و سپس تصحیح
مقدار
بارگذاریشده،
از افت
کارایی
جلوگیری
کند.
به طور پیشفرض غیرفعال است.
- -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) در
توابعی که
به آن نیازی
ندارند. این
کار از
دستورالعملهای
ذخیره،
راهاندازی
و بازیابی
اشارهگر
فریم
جلوگیری
میکند؛ در
بسیاری از
معماریهای
هدف همچنین
یک ثبات (register)
اضافی را در
دسترس قرار
میدهد.
در برخی اهداف، این پرچم هیچ اثری ندارد زیرا دنبالهٔ استاندارد فراخوانی همیشه از یک اشارهگر فریم استفاده میکند، بنابراین نمیتوان آن را حذف کرد.
توجه داشته باشید که -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")
را
درونخطی (inline)
بسط
میدهد،
حتی زمانی
که طول
متغیر باشد
یا آنقدر
بزرگ باشد
که به حلقه
نیاز داشته
باشد. این
گزینه در
کنار -ffreestanding و
-fno-builtin
بیشترین
کاربرد را
دارد.
در برخی شرایط، این گزینه به کامپایلر امکان میدهد کدی تولید کند که از تراز (alignment) و مضارب طولِ مشخص بهره ببرد، اما حتی در این حالت نیز ممکن است کارایی کمتری نسبت به پیادهسازیهای بهینهشدهٔ زمان اجرا داشته باشد و حجم کد را آنقدر افزایش دهد که حتی یک پیادهسازی مشترک با کارایی کمتر، به دلیل استفادهٔ بهتر از حافظهٔ موقت کد (code cache)، سریعتر اجرا شود. این گزینه به طور پیشفرض غیرفعال است.
- -fno-inline
- هیچ تابعی
را به صورت
درونخطی
بسط ندهید،
مگر
آنهایی که
با ویژگی
"always_inline"
نشانهگذاری
شدهاند.
این حالت
پیشفرض در
هنگام عدم
بهینهسازی
است.
توابع منفرد را میتوان با نشانهگذاری به وسیلهٔ ویژگی "noinline" از درونخطیسازی مستثنی کرد.
- -finline-small-functions
- ادغام
توابع در
فراخوانندههای
آنها
هنگامی که
بدنهٔ
آنها
کوچکتر از
کد مورد
انتظار
فراخوانی
تابع باشد
(به طوری که
اندازهٔ
کلی برنامه
کوچکتر
شود).
کامپایلر
به صورت
مکاشفهای
تصمیم
میگیرد
کدام توابع
به اندازهٔ
کافی ساده
هستند که
ارزش ادغام
به این شیوه
را داشته
باشند. این
درونخطیسازی
برای همهٔ
توابع
اعمال
میشود،
حتی
آنهایی که
به عنوان 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
- جایگزینی
اسکالر
ساختارها
(aggregates) بهصورت
بینروالی،
حذف
پارامترهای
استفادهنشده
و جایگزینی
پارامترهای
ارجاعی با
پارامترهای
مقداری را
انجام
میدهد.
در سطوح -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 است که فقط برای توابعی اعمال میشود که با استفاده از صفت (attribute) یا 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
- تلاش برای
ادغام
ثوابت
یکسان
(ثوابت
رشتهای و
ثوابت ممیز
شناور) در
میان
واحدهای
ترجمه (compilation units).
اگر اسمبلر و پیونددهنده پشتیبانی کنند، این گزینه در ترجمه بهینهشده پیشفرض است. برای جلوگیری از این رفتار از -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 را با مجاز شمردن انتقالهای ثبات (register moves) انجام میدهد. با تنظیم این گزینه، برخی یالهای پادوابستگی (anti-dependences) حذف میشوند که این امر باعث تولید انتقالهای ثبات بر اساس تحلیل بازه حیات (life-range analysis) میگردد. این گزینه تنها در صورت فعال بودن -fmodulo-sched مؤثر است.
- -fno-branch-count-reg
- گذر
بهینهسازی
را که
فرصتهای
استفاده از
دستورالعملهای
«کاهش و
انشعاب» (decrement and
branch) را روی یک
ثبات
شمارنده به
جای توالی
دستورالعملهایی
که ثبات را
کاهش
میدهند،
با صفر
مقایسه
میکنند و
سپس بر اساس
نتیجه
انشعاب
انجام
میدهند
جستجو
میکند،
غیرفعال
میسازد.
این گزینه
تنها در
معماریهایی
که از چنین
دستورالعملهایی
پشتیبانی
میکنند،
از جمله 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 قرار
میدهد. این
کار
میتواند
در فضای کد
نهایی
صرفهجویی
کند.
این گزینه این رفتار را غیرفعال میکند، چرا که برخی برنامهها صراحتاً به قرار گرفتن متغیرها در بخش داده (data section) تکیه دارند---برای نمونه، تا فایل اجرایی نهایی بتواند آغاز آن بخش را پیدا کند و/یا بر اساس آن فرضیاتی داشته باشد.
پیشفرض به جز در Ada، گزینه -fzero-initialized-in-bss است.
- -fthread-jumps
- بهینهسازیهایی
را انجام
میدهد که
بررسی
میکنند
آیا یک پرش
به مکانی
هدایت
میشود که
در آن
مقایسه
دیگری وجود
دارد که
توسط
مقایسه اول
دربرگرفته
شده (subsumed) است
یا خیر. اگر
چنین باشد،
انشعاب
اول، بسته
به اینکه
مشخص باشد
شرط درست
است یا
نادرست، به
مقصد
انشعاب دوم
یا نقطهای
بلافاصله
پس از آن
تغییر مسیر
مییابد.
در سطوح -O1، -O2، -O3 و -Os فعال میشود.
- -fsplit-wide-types
- هنگام
استفاده از
نوعی که
چندین ثبات
را اشغال
میکند،
مانند
"long long"
در یک
سامانه ۳۲
بیتی،
ثباتها را
از هم تفکیک
کرده و
آنها را
بهطور
مستقل
تخصیص
میدهد. این
کار
معمولاً کد
بهتری برای
آن انواع
تولید
میکند،
اما ممکن
است
عیبیابی
را دشوارتر
سازد.
در سطوح -O1، -O2، -O3 و -Os فعال میشود.
- -fsplit-wide-types-early
- انواع عریض
(wide types) را زودتر
از موعد
بهطور
کامل تفکیک
میکند، نه
در مراحل
بسیار
پایانی. این
گزینه هیچ
تأثیری
ندارد مگر
اینکه -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
- اجرای مجدد
حذف
زیرعبارتهای
مشترک پس از
انجام
بهینهسازیهای
حلقه.
در سطوح -O2، -O3 و -Os فعال میشود.
- -fgcse
- انجام یک
مرحله حذف
سراسری
زیرعبارتهای
مشترک. این
مرحله
همچنین
انتشار
سراسری
مقادیر
ثابت و
رونوشت (copy propagation)
را انجام
میدهد.
نکته: هنگام کامپایل برنامهای که از gotoهای محاسباتی (computed gotos، افزونهای در GCC) استفاده میکند، در صورت غیرفعال کردن مرحلهٔ حذف سراسری زیرعبارتهای مشترک با افزودن -fno-gcse به خط فرمان، ممکن است کارایی زمان اجرای بهتری به دست آورید.
در سطوح -O2، -O3 و -Os فعال میشود.
- -fgcse-lm
- هنگامی که
-fgcse-lm فعال
باشد، حذف
سراسری
زیرعبارتهای
مشترک تلاش
میکند
بارگذاریهایی
را که تنها
با
ذخیرهسازی
در خودشان
باطل
میشوند
جابجا کند.
این امر
اجازه
میدهد
حلقهای
حاوی توالی
بارگذاری/ذخیرهسازی
به یک
بارگذاری
بیرون از
حلقه و یک
رونوشت/ذخیرهسازی
درون حلقه
تبدیل شود.
بهطور پیشفرض با فعال بودن -fgcse فعال میشود.
- -fgcse-sm
- هنگامی که
-fgcse-sm فعال
باشد، یک
مرحلهٔ
انتقال
ذخیرهسازی
پس از حذف
سراسری
زیرعبارتهای
مشترک اجرا
میشود. این
مرحله تلاش
میکند
ذخیرهسازیها
را به بیرون
از حلقهها
منتقل کند.
هنگامی که
همراه با -fgcse-lm
استفاده
شود،
حلقههای
حاوی توالی
بارگذاری/ذخیرهسازی
را میتوان
به یک
بارگذاری
قبل از حلقه
و یک
ذخیرهسازی
پس از حلقه
تبدیل کرد.
در هیچ سطح بهینهسازی فعال نیست.
- -fgcse-las
- هنگامی که
-fgcse-las فعال
باشد،
مرحلهٔ حذف
سراسری
زیرعبارتهای
مشترک،
بارگذاریهای
زائدی را که
پس از
ذخیرهسازی
در همان
مکان حافظه
رخ میدهند
(هم حشوهای
جزئی و هم
کامل) حذف
میکند.
در هیچ سطح بهینهسازی فعال نیست.
- -fgcse-after-reload
- هنگامی که
-fgcse-after-reload فعال
باشد، یک
مرحلهٔ حذف
بارگذاری
زائد پس از reload
انجام
میشود. هدف
از این
مرحله،
پاکسازی
سرریزهای
زائد به
حافظه (redundant spilling)
است.
توسط -O3، -fprofile-use و -fauto-profile فعال میشود.
- -faggressive-loop-optimizations
- این گزینه به بهینهساز حلقه اعلام میکند که از محدودیتهای زبان برای استخراج کرانهای تعداد تکرارهای یک حلقه استفاده کند. این فرض بر این استوار است که کد حلقه، رفتار تعریفنشدهای (مانند سرریز اعداد صحیح علامتدار یا دسترسی به خارج از محدودهٔ آرایهها) ایجاد نمیکند. کرانهای تعداد تکرار حلقه برای هدایت باز کردن حلقه (loop unrolling)، پوستهریزی حلقه (peeling) و بهینهسازیهای آزمون خروج از حلقه استفاده میشوند. این گزینه بهطور پیشفرض فعال است.
- -funconstrained-commons
- این گزینه به کامپایلر اعلام میکند که متغیرهای تعریفشده در بلوکهای مشترک (common blocks، مثلاً در Fortran) ممکن است بعداً با آرایههای دنبالهای طولانیتر جایگزین شوند. این امر مانع از بهینهسازیهای خاصی میشود که به دانستن کرانهای آرایه وابسته هستند.
- -fcrossjumping
- انجام
تبدیل پرش
متقاطع (cross-jumping).
این تبدیل
کدهای
یکسان را
یکپارچه
کرده و
اندازهٔ کد
را کاهش
میدهد. کد
حاصل ممکن
است عملکرد
بهتری نسبت
به حالت
بدون cross-jumping
داشته باشد
یا نداشته
باشد.
در سطوح -O2، -O3 و -Os فعال میشود.
- -fauto-inc-dec
- ترکیب افزایش یا کاهش آدرسها با دسترسیهای حافظه. این مرحله در معماریهایی که دستورالعملهایی برای پشتیبانی از این ویژگی ندارند، همیشه نادیده گرفته میشود. بهطور پیشفرض در -O1 و بالاتر روی معماریهایی که از آن پشتیبانی میکنند، فعال است.
- -fdce
- انجام حذف کد مرده (DCE) روی RTL. بهطور پیشفرض در -O1 و بالاتر فعال است.
- -fdse
- انجام حذف ذخیرهسازی مرده (DSE) روی RTL. بهطور پیشفرض در -O1 و بالاتر فعال است.
- -fif-conversion
- تلاش برای
تبدیل
پرشهای
شرطی به
معادلهای
بدون
انشعاب (branch-less).
این مورد
شامل
استفاده از
جابجاییهای
شرطی،
دستورالعملهای
min ،max، تنظیم
فلگها و abs،
و برخی
ترفندهای
قابل انجام
با محاسبات
حسابی
استاندارد
است.
استفاده از
اجرای شرطی
روی
پردازندههایی
که از آن
پشتیبانی
میکنند،
توسط -fif-conversion2
کنترل
میشود.
در سطوح -O1، -O2، -O3 و -Os فعال است، اما با -Og فعال نمیشود.
- -fif-conversion2
- استفاده از
اجرای شرطی
(در صورت در
دسترس بودن)
برای تبدیل
پرشهای
شرطی به
معادلهای
بدون
انشعاب.
در سطوح -O1، -O2، -O3 و -Os فعال است، اما با -Og فعال نمیشود.
- -fdeclone-ctor-dtor
- استاندارد
C++ ABI به چندین
نقطهٔ ورود
برای
سازندهها
و
نابودکنندهها
نیاز دارد:
یکی برای یک
زیرشیء
پایه، یکی
برای یک شیء
کامل، و یکی
برای یک
نابودکنندهٔ
مجازی که پس
از آن عملگر
delete را
فراخوانی
میکند.
برای یک
سلسلهمراتب
با
پایههای
مجازی،
انواع پایه
و کامل
کلونهایی
هستند که به
معنای دو
کپی از تابع
است. با این
گزینه،
نسخههای
پایه و کامل
به
تانکهایی
(thunks) تبدیل
میشوند که
یک
پیادهسازی
مشترک را
فراخوانی
میکنند.
توسط -Os فعال میشود.
- -fdelete-null-pointer-checks
- فرض میکند
که
برنامهها
نمیتوانند
بهطور
ایمن
اشارهگرهای
تهی (null) را
ارجاعزدایی
کنند، و هیچ
کد یا عنصر
دادهای در
آدرس صفر
قرار ندارد.
این گزینه
بهینهسازیهای
سادهٔ
محاسبهٔ
عبارات
ثابت (constant folding) را
در تمام
سطوح
بهینهسازی
فعال
میکند.
علاوه بر
این، سایر
مراحل
بهینهسازی
در GCC از این
پرچم برای
کنترل
تحلیلهای
جریان
دادهٔ
سراسری
استفاده
میکنند که
بررسیهای
بیهوده
برای
اشارهگرهای
null را حذف
میکنند؛
این مراحل
فرض
میکنند که
دسترسی
حافظه به
آدرس صفر
همیشه به یک
تله (trap) منجر
میشود، به
طوری که اگر
یک
اشارهگر
پس از
ارجاعزدایی
بررسی شود،
نمیتواند
null باشد.
با این حال توجه داشته باشید که در برخی محیطها این فرض درست نیست. برای برنامههایی که به آن رفتار وابسته هستند، از -fno-delete-null-pointer-checks برای غیرفعال کردن این بهینهسازی استفاده کنید.
این گزینه بهطور پیشفرض روی اکثر مقاصد فعال است. روی AVR و MSP430، این گزینه کاملاً غیرفعال است.
مراحلی که از اطلاعات جریان داده استفاده میکنند، بهطور مستقل در سطوح مختلف بهینهسازی فعال میشوند.
- -fdevirtualize
- تلاش برای تبدیل فراخوانی توابع مجازی به فراخوانیهای مستقیم. این کار هم درون یک روال و هم بهصورت بینروالی به عنوان بخشی از جایگذاری غیرمستقیم (-findirect-inlining) و انتشار مقادیر ثابت بینروالی (-fipa-cp) انجام میشود. در سطوح -O2، -O3 و -Os فعال میشود.
- -fdevirtualize-speculatively
- تلاش برای تبدیل فراخوانی توابع مجازی به فراخوانیهای مستقیم حدسی (speculative). بر اساس تحلیل گراف وراثت نوع، مقصدهای احتمالی برای یک فراخوانی مشخص تعیین میشوند. اگر این مجموعه کوچک باشد (ترجیحاً به اندازهٔ ۱)، فراخوانی به یک ساختار شرطی تبدیل میشود که بین فراخوانی مستقیم و غیرمستقیم تصمیم میگیرد. فراخوانیهای حدسی بهینهسازیهای بیشتری مانند جایگذاری درونخطی (inlining) را ممکن میسازند. اگر پس از بهینهسازی بیشتر بیفایده به نظر برسند، دوباره به شکل اولیه برگردانده میشوند.
- -fdevirtualize-at-ltrans
- ارسال اطلاعات اضافهٔ مورد نیاز برای غیرمجازیسازی تهاجمی هنگام اجرای بهینهساز زمان پیوند در حالت تبدیل محلی. این گزینه امکان غیرمجازیسازی بیشتری را فراهم میکند اما اندازهٔ دادههای ارسالی را بهطور چشمگیری افزایش میدهد. به همین دلیل بهطور پیشفرض غیرفعال است.
- -fexpensive-optimizations
- انجام
تعدادی
بهینهسازی
جزئی که از
نظر
محاسباتی
نسبتاً
هزینهبر
هستند.
در سطوح -O2، -O3 و -Os فعال میشود.
- -free
- تلاش برای
حذف
دستورالعملهای
گسترش (extension)
زائد. این
گزینه
بهویژه
برای
معماری x86-64
مفید است که
پس از نوشتن
در نیمهٔ
پایینی ۳۲
بیتی
ثباتهای
۶۴ بیتی،
بهطور
ضمنی گسترش
با صفر
انجام
میدهد.
برای Alpha، AArch64، LoongArch، PowerPC، RISC-V، SPARC، h83000 و x86 در سطوح -O2، -O3 و -Os فعال است.
- -fno-lifetime-dse
- در C++ مقدار یک شیء تنها تحت تأثیر تغییرات در طول عمر آن قرار میگیرد: هنگامی که سازنده آغاز میشود، شیء دارای مقداری نامعین است و هرگونه تغییر در طول عمر شیء پس از نابودی آن، مرده تلقی میشود. در حالت عادی، حذف ذخیرهسازی مرده از این موضوع بهره میبرد؛ اگر کد شما به ماندگاری مقدار حافظهٔ شیء فراتر از طول عمر آن متکی است، میتوانید از این پرچم برای غیرفعال کردن این بهینهسازی استفاده کنید. برای حفظ ذخیرهسازیهای قبل از شروع سازنده (مثلاً به این دلیل که عملگر 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) است. رنگآمیزی چایتین-بریگز برای همه معماریها پیادهسازی نشده است، اما برای مقصدهایی که از آن پشتیبانی میکنند، به این دلیل که کد بهتری تولید میکند، پیشفرض است.
- -fira-region=region
- استفاده از ناحیههای مشخصشده برای تخصیصدهنده یکپارچه ثباتها. آرگومان region باید یکی از موارد زیر باشد:
- all
- استفاده از تمامی حلقهها به عنوان ناحیههای تخصیص ثبات. این گزینه میتواند بهترین نتایج را برای ماشینهایی با مجموعه ثباتهای کوچک و/یا نامنظم به همراه داشته باشد.
- mixed
- استفاده از تمامی حلقهها به عنوان ناحیه، به جز حلقههایی با فشار ثبات اندک. این مقدار معمولاً در بیشتر موارد و برای اکثر معماریها بهترین نتایج را به دست میدهد و در هنگام کامپایل با بهینهسازی برای سرعت (-O، -O2، ...) به طور پیشفرض فعال است.
- one
- استفاده از تمام توابع به عنوان یک ناحیه واحد. این مقدار معمولاً منجر به کوچکترین اندازه کد میشود و به طور پیشفرض برای -Os یا -O0 فعال است.
- -fira-hoist-pressure
- استفاده از
IRA برای
ارزیابی
فشار
ثباتها در
گذر بالا
کشیدن کد (code hoisting)
به منظور
تصمیمگیری
در خصوص
بالا کشیدن
عبارتها.
این گزینه
معمولاً
منجر به کد
کوچکتری
میشود،
اما
میتواند
سرعت
کامپایلر
را کاهش
دهد.
این گزینه در سطح -Os برای همه مقصدها فعال است.
- -fira-loop-pressure
- استفاده از
IRA برای
ارزیابی
فشار
ثباتها در
حلقهها به
منظور
تصمیمگیری
برای
جابجایی
ناورداهای
حلقه (loop invariants).
این گزینه
معمولاً
منجر به
تولید کدی
سریعتر و
کوچکتر در
ماشینهایی
با
فایلهای
ثبات بزرگ
(۳۲ ثبات یا
بیشتر)
میشود،
اما
میتواند
سرعت
کامپایلر
را کاهش
دهد.
این گزینه در سطح -O3 برای برخی از مقصدها فعال است.
- -fno-ira-share-save-slots
- غیرفعال کردن اشتراکگذاری خانههای پشته استفادهشده برای ذخیره ثباتهای سختافزاریِ دستخوش تغییر در فراخوانی (call-used hard registers) که در طول یک فراخوانی زنده میمانند. هر ثبات سختافزاری یک خانه پشته جداگانه دریافت میکند و در نتیجه فریمهای پشته توابع بزرگتر میشوند.
- -fno-ira-share-spill-slots
- غیرفعال کردن اشتراکگذاری خانههای پشته تخصیصیافته برای شبهثباتها (pseudo-registers). هر شبهثباتی که ثبات سختافزاری دریافت نکند، یک خانه پشته جداگانه دریافت میکند و در نتیجه فریمهای پشته توابع بزرگتر میشوند.
- -flra-remat
- فعال کردن
بازآفرینی
(rematerialization) حساس به CFG
در LRA. به جای
بارگذاری
مقادیر
شبهثباتهای
سرریز شده (spilled
pseudos)، اگر
مقرون به
صرفه باشد 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
- تعیین اینکه در گذر دوم زمانبندی، چه تعداد دستورالعمل (در صورت وجود) میتوانند پیش از موعد از صف دستورالعملهای متوقفشده به فهرست آماده (ready list) منتقل شوند. -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 scheduling)
استفاده
شود. این
ویژگی
امکان
جابجایی در
میان
مرزهای
بلوک پایه
را فراهم
کرده که
منجر به
زمانبندیهای
سریعتر
میشود. این
گزینه
آزمایشی
است، زیرا
همه
توصیفهای
ماشین
استفادهشده
توسط GCC
پردازنده (CPU)
را آنقدر
دقیق
مدلسازی
نمیکنند
که از نتایج
نامطمئن
الگوریتم
جلوگیری
شود.
این گزینه تنها زمانی معنا دارد که زمانبندی پس از تخصیص ثبات انجام شود، یعنی با -fschedule-insns2 یا در سطح -O2 یا بالاتر.
- -fsched-group-heuristic
- فعال کردن اکتشاف گروهی (group heuristic) در زمانبند. این روش مکاشفهای دستورالعملی را که به یک گروه زمانبندی تعلق دارد ترجیح میدهد. این گزینه به طور پیشفرض هنگامی که زمانبندی فعال باشد فعال است، یعنی با -fschedule-insns یا -fschedule-insns2 یا در سطح -O2 یا بالاتر.
- -fsched-critical-path-heuristic
- فعال کردن اکتشاف مسیر بحرانی (critical-path heuristic) در زمانبند. این روش مکاشفهای دستورالعملهای روی مسیر بحرانی را ترجیح میدهد. این گزینه به طور پیشفرض هنگامی که زمانبندی فعال باشد فعال است، یعنی با -fschedule-insns یا -fschedule-insns2 یا در سطح -O2 یا بالاتر.
- -fsched-spec-insn-heuristic
- فعال کردن اکتشاف دستورالعمل گمانهزنانه (speculative instruction heuristic) در زمانبند. این روش مکاشفهای دستورالعملهای گمانهزنانهای را ترجیح میدهد که ضعف وابستگی بیشتری دارند. این گزینه به طور پیشفرض هنگامی که زمانبندی فعال باشد فعال است، یعنی با -fschedule-insns یا -fschedule-insns2 یا در سطح -O2 یا بالاتر..IP -fsched-rank-heuristic 4 فعالسازی هیوریستیک رتبه (rank heuristic) در زمانبند. این هیوریستیک دستورالعمل متعلق به بلوک پایهای (basic block) با اندازه یا بسامد بزرگتر را در اولویت قرار میدهد. این گزینه بهطور پیشفرض هنگام فعال بودن زمانبندی، یعنی با -fschedule-insns یا -fschedule-insns2 یا در سطح -O2 یا بالاتر، فعال است.
- -fsched-last-insn-heuristic
- فعالسازی هیوریستیک آخرین دستورالعمل در زمانبند. این هیوریستیک دستورالعملی را در اولویت قرار میدهد که وابستگی کمتری به آخرین دستورالعمل زمانبندیشده داشته باشد. این گزینه بهطور پیشفرض هنگام فعال بودن زمانبندی، یعنی با -fschedule-insns یا -fschedule-insns2 یا در سطح -O2 یا بالاتر، فعال است.
- -fsched-dep-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
- برخی قالبهای شیء (object formats)، مانند ELF، امکان میاننشینی/جایگزینی نمادها (interposition) را توسط پیونددهندهٔ پویا فراهم میکنند. این بدان معناست که برای نمادهای صادرشده از DSO، کامپایلر نمیتواند انتشار بینرویهای (interprocedural propagation)، درونخطسازی (inlining) و دیگر بهینهسازیها را با این فرض که تابع یا متغیر مربوطه ممکن است تغییر کند، انجام دهد. اگرچه این ویژگی برای مثال جهت بازنویسی توابع تخصیص حافظه با یک پیادهسازی اشکالزدایی مفید است، از نظر کیفیت کد پرهزینه است. با گزینهٔ -fno-semantic-interposition کامپایلر فرض میکند که اگر میاننشینی برای توابع رخ دهد، تابع جایگزین دقیقاً همان معناشناسی (و اثرات جانبی) را خواهد داشت. به همین ترتیب اگر میاننشینی برای متغیرها رخ دهد، سازندهٔ (constructor) متغیر یکسان خواهد بود. این پرچم برای توابعی که صراحتاً بهصورت inline اعلام شدهاند (جایی که میاننشینی هرگز مجاز به تغییر معناشناسی نیست) و برای نمادهایی که صراحتاً ضعیف (weak) اعلام شدهاند، هیچ اثری ندارد.
- -fshrink-wrap
- درج مقدمهٔ تابع (prologue) تنها پیش از بخشهایی از تابع که به آن نیاز دارند، بهجای قرار دادن آن در ابتدای تابع. این پرچم بهطور پیشفرض در -O و بالاتر فعال است.
- -fshrink-wrap-separate
- بستهبندی انقباضی (Shrink-wrap) بخشهای مجزای مقدمه و موخره (epilogue) بهصورت جداگانه، به گونهای که این بخشها تنها در صورت نیاز اجرا شوند. این گزینه بهطور پیشفرض روشن است، اما اثری ندارد مگر اینکه -fshrink-wrap نیز فعال باشد و معماری هدف از آن پشتیبانی کند.
- -fcaller-saves
- فعالسازی
تخصیص
مقادیر به
ثباتهایی
که با
فراخوانی
تابع
بازنویسی و
مخدوش
میشوند
(clobbered)، از طریق
صدور
دستورالعملهای
اضافی برای
ذخیره و
بازیابی
ثباتها در
اطراف چنین
فراخوانیهایی.
این تخصیص
تنها زمانی
انجام
میشود که
به نظر برسد
به کد بهتری
منجر خواهد
شد.
این گزینه همیشه بهطور پیشفرض روی برخی ماشینها فعال است، معمولاً ماشینهایی که ثباتهای ذخیرهشونده توسط فراخواندهشونده (call-preserved) برای استفاده بهجای آنها ندارند.
در سطوح -O2، -O3 و -Os فعال است.
- -fcombine-stack-adjustments
- تنظیمات
پشته (push و popها)
و ارجاعات
حافظهٔ
پشته را
ردیابی
کرده و سپس
تلاش
میکند
راههایی
برای ادغام
و ترکیب
آنها
بیابد.
بهطور پیشفرض در -O1 و بالاتر فعال است.
- -fipa-ra
- استفاده از
ثباتهای
ذخیرهشونده
توسط
فراخواننده
(caller-save) برای
تخصیص، در
صورتی که آن
ثباتها
توسط
هیچیک از
توابع
فراخواندهشده
استفاده
نشوند. در
این صورت
نیازی به
ذخیره و
بازیابی
آنها در
اطراف
فراخوانیها
نخواهد بود.
این امر
تنها زمانی
ممکن است که
توابع
فراخواندهشده
بخشی از
همان واحد
ترجمهٔ (compilation unit)
تابع جاری
باشند و پیش
از آن
کامپایل
شده باشند.
در سطوح -O2، -O3 و -Os فعال است، با این حال اگر کد تولیدشده برای پروفایلسازی ابزارگذاری شود (-p یا -pg)، یا اگر میزان استفادهٔ تابع فراخواندهشده از ثباتها بهطور دقیق مشخص نباشد (این حالت در اهدافی رخ میدهد که مقدمهها و موخرهها را در 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
- انجام بالاکشی بارگذاریها از اشارهگرهای شرطی روی درختها. این گذر بهطور پیشفرض در -O1 و بالاتر فعال است.
- -fhoist-adjacent-loads
- بالاکشی گمانهزنانهٔ بارگذاریها از هر دو شاخهٔ یک if-then-else، در صورتی که بارگذاریها از مکانهای مجاور در همان ساختار باشند و معماری هدف دارای دستورالعمل انتقال شرطی باشد. این پرچم بهطور پیشفرض در -O2 و بالاتر فعال است.
- -ftree-copy-prop
- انجام انتشار کپی (copy propagation) روی درختها. این گذر عملیات کپی غیرضروری را حذف میکند. این پرچم بهطور پیشفرض در -O1 و بالاتر فعال است.
- -fipa-pure-const
- تشخیص اینکه کدام توابع سره (pure) یا ثابت (constant) هستند. بهطور پیشفرض در -O1 و بالاتر فعال است.
- -fipa-reference
- تشخیص اینکه کدام متغیرهای ایستا (static) از واحد ترجمه فراتر نمیروند. بهطور پیشفرض در -O1 و بالاتر فعال است.
- -fipa-reference-addressable
- تشخیص متغیرهای ایستای فقطخواندنی، فقطنوشتنی و غیرقابلآدرسدهی. بهطور پیشفرض در -O1 و بالاتر فعال است.
- -fipa-reorder-for-locality
- گروهبندی زنجیرههای فراخوانی نزدیک به یکدیگر در چیدمان باینری بهمنظور بهبود محلیبودن کد (code locality) و به حداقل رساندن فواصل پرش میان توابعی که مکرراً فراخوانی میشوند. برخلاف -freorder-functions، این گذر زنجیرههای فراخوانی بین توابع را در نظر میگیرد و آنها را کنار هم گروهبندی میکند، بهجای آنکه تمامی توابع داغ/عادی/سرد/هرگز اجرا نشده را در بخشهای جداگانه قرار دهد. برخلاف -fprofile-reorder-functions، هدف آن بهبود محلیبودن کد در سرتاسر زمان اجرای برنامه است، بهجای اینکه فقط بر زمان راهاندازی برنامه تمرکز کند. این گزینه با گزینهٔ صریح -flto-partition= ناسازگار است چرا که یک طرح پارتیشنبندی سفارشی را تحمیل میکند. در صورت استفاده از این گزینه، استفاده از بازخورد پروفایل (profile feedback) نیز توصیه میشود؛ در غیر این صورت، این گزینه بهطور پیشفرض فعال نیست.
- -fipa-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)
تولید شود.
اگر بهینهسازی کامپایلر از بدنه یک تابع یا اطلاعات استخراجشده از بدنه آن برای بهینهسازی/تغییر تابع دیگری استفاده کند، به تابع دوم یک تابع متأثر (impacted function) از تابع اول گفته میشود. اگر تابعی وصله شود، توابع متأثر از آن نیز باید وصله شوند.
توابع متأثر توسط بهینهسازیهای بینرویهای کامپایلر تعیین میشوند. به عنوان مثال، یک فراخواننده متأثر میشود هنگامی که تابعی در فراخوانندهاش درونریزی (inline) شود، تابعی شبیهسازی شود و فراخوانندهاش برای فراخوانی این نسخه شبیهسازیشده جدید تغییر یابد، یا اطلاعات خلوص/ثابت بودن تابع برای بهینهسازی فراخوانندههای مستقیم یا غیرمستقیم آن استخراج شود، و غیره.
معمولاً هر چه بهینهسازیهای 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
- تطبیق الگو را روی گرههای SSA PHI برای بهینهسازی کد شرطی انجام میدهد. این گذر بهطور پیشفرض در -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 و بالاتر روی معماریهای مقصدی که دستورالعملهای انتقال شرطی (conditional move) دارند فعال است.
- -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 نمایش چندوجهی تولید شده و دوباره به gimple تبدیل میشود. با استفاده از -fgraphite-identity میتوان هزینهها یا مزایای تبدیل GIMPLE -> GRAPHITE -> GIMPLE را بررسی کرد. برخی بهینهسازیهای حداقلی نیز توسط تولیدکننده کد isl انجام میشود، مانند تفکیک شاخص (index splitting) و حذف کدهای مرده در حلقهها.
- -floop-nest-optimize
- بهینهساز حلقههای تودرتو مبتنی بر isl را فعال میکند. این یک بهینهساز عمومی حلقههای تودرتو بر پایه الگوریتمهای بهینهسازی Pluto است. این گزینه ساختار حلقهای را محاسبه میکند که برای محلیبودن دادهها (data-locality) و موازیسازی بهینه شده است. این گزینه آزمایشی است.
- -floop-parallelize-all
- از تحلیل وابستگی داده Graphite برای شناسایی حلقههای قابل موازیسازی استفاده میکند. تمام حلقههایی را که بر اساس تحلیل، فاقد وابستگیهای وابسته به دور حلقه (loop carried dependences) تشخیص داده شوند موازی میکند، بدون اینکه سودمند بودن موازیسازی حلقهها را بررسی کند.
- -ftree-coalesce-vars
- هنگام تبدیل برنامه به خارج از نمایش SSA، تلاش میکند با ادغام (coalescing) نسخههای متغیرهای گوناگون تعریفشده توسط کاربر بهجای متغیرهای موقت کامپایلر، عملیات کپی را کاهش دهد. این کار ممکن است توانایی اشکالزدایی برنامههای بهینهشدهای را که با -fno-var-tracking-assignments کامپایل شدهاند بهشدت محدود کند. در حالت نقیض، این پرچم از ادغام متغیرهای کاربر در SSA جلوگیری میکند. این گزینه در صورت فعال بودن بهینهسازی بهطور پیشفرض فعال است، و در غیر این صورت تأثیر چندانی ندارد.
- -ftree-loop-if-convert
- تلاش میکند پرشهای شرطی در درونیترین حلقهها را به معادلهای بدون انشعاب (branch-less) تبدیل کند. هدف، حذف جریان کنترل از درونیترین حلقهها به منظور بهبود توانایی فاز برداریسازی (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 انجام
میدهد. این
پرچم
میتواند
کارایی
حافظه موقت
(cache) را روی
حلقههای
تودرتو
بهبود بخشد
و امکان
بهینهسازیهای
بیشتر
حلقه،
مانند
برداریسازی
را فراهم
آورد. برای
مثال، حلقه
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) تنها از تحلیل ساده ناوردایی استفاده کنیم. این فاز همچنین انتقال ذخیرهسازی (store motion) را دربرمیگیرد..IP -ftree-loop-ivcanon 4 یک شمارنده کانونی (canonical) برای تعداد تکرارها در حلقههایی ایجاد میکند که تعیین تعداد تکرار آنها به تحلیل پیچیدهای نیاز دارد. در نتیجه، بهینهسازیهای بعدی میتوانند این تعداد را به سادگی تعیین کنند. این گزینه بهویژه در ارتباط با باز کردن حلقه (unrolling) مفید است.
- -ftree-scev-cprop
- جایگزینی مقدار نهایی را انجام میدهد. اگر متغیری در یک حلقه بهگونهای تغییر کند که مقدار آن هنگام خروج از حلقه صرفاً با استفاده از مقدار اولیهاش و تعداد تکرارهای حلقه قابل تعیین باشد، موارد استفاده از مقدار نهایی را با چنین محاسبهای جایگزین میکند، مشروط بر اینکه هزینه محاسباتی آن به اندازه کافی کم باشد. این کار وابستگیهای دادهای را کاهش داده و ممکن است سادهسازیهای بیشتری را میسر کند. بهطور پیشفرض در -O1 و بالاتر فعال است.
- -fivopts
- بهینهسازیهای متغیر القایی (کاهش توان، ادغام متغیر القایی و حذف متغیر القایی) را بر روی درختها انجام میدهد. بهطور پیشفرض در -O1 و بالاتر فعال است.
- -ftree-parallelize-loops=n
- موازیسازی حلقهها، یعنی تقسیم فضای تکرار آنها برای اجرا در n رشته (thread). این کار تنها برای حلقههایی ممکن است که تکرارهای آنها مستقل از یکدیگر بوده و بتوان ترتیب اجرای آنها را آزادانه تغییر داد. این بهینهسازی فقط بر روی ماشینهای چندپردازندهای و برای حلقههایی که پردازشمحور (CPU-intensive) هستند سودبخش است، نه حلقههایی که به عنوان مثال با پهنای باند حافظه محدود شدهاند. این گزینه متضمن -pthread است و بنابراین تنها روی مقصدهایی پشتیبانی میشود که از -pthread پشتیبانی میکنند.
- -ftree-pta
- تحلیل اشاره به (points-to analysis) محلیِ تابع را روی درختها انجام میدهد. این پرچم بهطور پیشفرض در -O1 و بالاتر، به جز -Og، فعال است.
- -ftree-sra
- جایگزینی اسکالر مجموعهها را انجام میدهد. این مرحله ارجاعات ساختار را با اسکالرها جایگزین میکند تا از نوشتن زودهنگام ساختارها در حافظه جلوگیری کند. این پرچم بهطور پیشفرض در -O1 و بالاتر، به جز -Og، فعال است.
- -fstore-merging
- ادغام ذخیرهسازیهای باریک (narrow stores) در آدرسهای متوالی حافظه را انجام میدهد. این مرحله، ذخیرهسازیهای متوالی مقادیر بیواسطه (immediate) باریکتر از یک کلمه (word) را در قالب ذخیرهسازیهای عریضتر و کمتعدادتر ادغام میکند تا تعداد دستورالعملها کاهش یابد. این گزینه بهطور پیشفرض در -O2 و بالاتر و همچنین -Os فعال است.
- -ftree-ter
- جایگزینی عبارتهای موقت را در طول فاز SSA->normal انجام میدهد. متغیرهای موقت تکاستفاده/تکتعریف در محل استفادهشان با عبارت تعریفکنندهشان جایگزین میشوند. این کار به کدی غیر از GIMPLE منجر میشود، اما درختهای بسیار پیچیدهتری را برای کار در اختیار بسطدهندهها (expanders) قرار میدهد که به تولید 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)
متغیرهای
خودکاری را
که از نوع
ساختار یا union
هستند با
صفر
مقداردهی
اولیه
میکند. با
این حال،
پیادهسازی
فعلی
نمیتواند
متغیرهای
خودکاری را
که بین
عبارت
کنترلی و
نخستین case از
یک دستور
"switch"
اعلان
شدهاند،
مقداردهی
اولیه کند.
برای گزارش
تمامی این
موارد از
-Wtrivial-auto-var-init
استفاده
کنید.
سه مقدار ممکن برای choice عبارتند از:
- uninitialized هیچ متغیر خودکاری را مقداردهی اولیه نمیکند. این مقدار پیشفرض C و ++C است.
- pattern متغیرهای خودکار را با مقادیری مقداردهی اولیه میکند که احتمالاً باگهای منطقی را در ادامه به خرابی برنامه (crash) تبدیل میکنند، در گزارش خرابی (crash dump) به آسانی قابل تشخیص هستند و مقادیری نیستند که برنامهنویسان بتوانند برای معناشناسی مفید برنامه به آنها تکیه کنند. مقدار فعلی، یک الگوی تکرارشونده بایت با بایت "0xFE" است. مقادیر استفادهشده برای مقداردهی اولیه الگو ممکن است در آینده تغییر کنند.
- zero متغیرهای خودکار را با صفر مقداردهی اولیه میکند.
مقدار پیشفرض uninitialized است.
توجه داشته باشید که مقادیر مقداردهی اولیه، چه zero و چه pattern، به بازنمایی دادهها (در حافظه یا ثباتهای ماشین) اشاره دارند تا به تفسیر آنها به عنوان مقادیر عددی. این تمایز ممکن است در زبانهایی که از انواع دارای اریب (bias) یا ضریب ضمنی پشتیبانی میکنند، و با افزونههایی نظیر hardbool دارای اهمیت باشد. برای نمونه، متغیری که از ۸ بیت برای نمایش مقادیر (اریبدار) در محدوده "range 160..400" استفاده میکند، بسته به choice با الگوهای بیتی 0x00 یا 0xFE مقداردهی اولیه خواهد شد، صرفنظر از اینکه این بازنماییها نشاندهنده مقادیری در آن محدوده باشند یا خیر؛ و حتی اگر باشند، تفسیر مقدار نگهداریشده توسط متغیر به اریب بستگی خواهد داشت. یک متغیر hardbool که مثلاً از "0X5A" و 0xA5 به ترتیب برای "false" و "true" استفاده میکند، با هر کدام از انتخابهای choice برای مقداردهی اولیه اولیه بدیهی دچار تله (trap) خواهد شد؛ یعنی مقداردهی اولیه با zero به بازنمایی "false" تبدیل نمیشود، حتی اگر برای یک متغیر "static" از همان نوع چنین شود. این بدان معناست که الگوی مقداردهی اولیه معمولاً به نوع متغیرِ مقداردهیشده وابسته نیست. یک استثنای درخور توجه این است که متغیرهای بولین (سختنشده) که در ثباتها جای میگیرند، حتی در صورت درخواست pattern نیز با "false" (صفر) مقداردهی اولیه میشوند.
میتوانید با استفاده از صفت متغیرِ "uninitialized" این رفتار را برای یک متغیر خاص کنترل کنید.
- -fvect-cost-model=model
- مدل هزینه (cost
model) مورد
استفاده
برای
برداریسازی
را تغییر
میدهد.
آرگومان model
باید یکی از
مقادیر unlimited،
dynamic، cheap یا very-cheap
باشد. در
مدل unlimited،
مسیر کد
برداریشده
همواره
سودبخش فرض
میشود، در
حالی که در
مدل dynamic یک
بررسی زمان
اجرا از
مسیر کد
برداریشده
محافظت
میکند تا
تنها برای
تعداد
تکرارهایی
فعال شود که
احتمالاً
سریعتر از
اجرای حلقه
اسکالر
اصلی اجرا
خواهند شد.
مدل cheap
برداریسازی
حلقههایی
را غیرفعال
میکند که
انجام آن
هزینهبر
باشد،
مثلاً به
دلیل
بررسیهای
زمان اجرای
لازم برای
وابستگی
داده یا
ترازسازی،
اما در غیر
این صورت
معادل مدل
dynamic است. مدل
very-cheap در صورت
نیاز به
هرگونه
بررسی زمان
اجرا برای
وابستگی
داده یا
ترازسازی،
برداریسازی
حلقهها را
غیرفعال
میکند؛
این مدل
همچنین
برداریسازی
حلقههای
پایانی (epilogue)
را غیرفعال
میکند اما
در غیر این
صورت معادل
مدل cheap است.
مدل هزینه پیشفرض به دیگر گزینههای بهینهسازی بستگی دارد و dynamic یا cheap است.
- -fsimd-cost-model=model
- مدل هزینه مورد استفاده برای برداریسازی حلقههای نشانهگذاریشده با راهنمای simd در OpenMP را تغییر میدهد. آرگومان model باید یکی از مقادیر unlimited، dynamic یا cheap باشد. تمامی مقادیر model همان معنای شرحدادهشده در -fvect-cost-model را دارند و بهطور پیشفرض مدل هزینه تعریفشده با -fvect-cost-model استفاده میشود.
- -ftree-vrp
- انتشار دامنه مقادیر (Value Range Propagation) را روی درختها انجام میدهد. این شبیه به مرحله انتشار مقدار ثابت است، با این تفاوت که به جای مقادیر، دامنهای از مقادیر منتشر میشوند. این امر به بهینهسازها امکان میدهد بررسیهای غیرضروری دامنه، مانند بررسی محدوده آرایه و بررسیهای اشارهگر null را حذف کنند. این گزینه بهطور پیشفرض در -O2 و بالاتر فعال است. حذف بررسی اشارهگر null تنها در صورتی انجام میشود که -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
- بخشهایی
از توابع را
درونخطی (inline)
میکند. این
گزینه تنها
زمانی
اثرگذار
است که خود
درونخطیسازی
توسط
گزینههای
-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 فعال
باشد، اگر
"i" یک
عدد صحیح ۳۲
بیتی یا
کوچکتر
باشد، هم
شاخه و هم
بدنه دستور
"if"
(البته نه
فراخوانی
"snprint")
میتوانند
حذف شوند،
زیرا تضمین
میشود که
مقدار
بازگشتی
حداکثر ۸
خواهد بود.
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)
حدس
نمیزند.
کامپایلر GCC در صورتی که احتمالات انشعاب از طریق بازخورد پروفایلسازی (-fprofile-arcs) ارائه نشده باشند، از روشهای ابتکاری برای حدس زدن آنها بهره میگیرد. این روشهای ابتکاری بر پایه گراف جریان کنترل (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) را
در تابع
کامپایلشده
بازآرایی
میکند تا
تعداد
انشعابهای
طیشده (taken branches)
را کاهش
داده و محلی
بودن کد (code locality)
را بهبود
بخشد.
در سطوح -O1، -O2، -O3 و -Os فعال است.
- -freorder-blocks-algorithm=algorithm
- از
الگوریتم
مشخصشده
برای
بازآرایی
بلوکهای
پایه
استفاده
میکند.
آرگومان algorithm
میتواند
simple باشد که
اندازه کد
را افزایش
نمیدهد
(مگر گاهی
اوقات به
دلیل اثرات
ثانویه
مانند
همترازی
یا alignment)، یا stc،
الگوریتم
«software trace cache»، که
تلاش
میکند
تمام
کدهایی را
که به دفعات
اجرا
میشوند در
کنار
یکدیگر
قرار دهد و
با ایجاد
رونوشتهای
بیشتر از
کد، تعداد
انشعابهای
اجراشده را
به کمینه
برساند.
پیشفرض در سطوح -O1 و -Os مقدار simple، و در سطوح -O2 و -O3 مقدار stc است.
- -freorder-blocks-and-partition
- علاوه بر
بازآرایی
بلوکهای
پایه در
تابع
کامپایلشده
برای کاهش
تعداد
انشعابهای
طیشده،
بلوکهای
پایه داغ (hot) و
سرد (cold) را به
بخشهای
جداگانهای
در
فایلهای
اسمبلی و .o
افراز
میکند تا
کارایی
صفحهبندی
(paging) و محلی
بودن حافظه
نهان (cache locality) را
بهبود بخشد.
این بهینهسازی در صورت حضور مدیریت استثنا یا جدولهای بازپیچی (در مقصدهایی که از setjump/longjump یا طرح اختصاصی مقصد استفاده میکنند)، برای بخشهای linkonce، برای توابعی با صفت بخش تعریفشده توسط کاربر (user-defined section attribute) و در هر معماری که از بخشهای نامگذاریشده پشتیبانی نمیکند، بهطور خودکار خاموش میشود. هنگامی که -fsplit-stack استفاده میشود، این گزینه بهطور پیشفرض فعال نیست (برای جلوگیری از خطاهای پیونددهنده)، اما میتوان آن را بهطور صریح فعال کرد (در صورت استفاده از پیونددهندهای سازگار).
برای x86 در سطوح -O2، -O3 و -Os فعال است.
- -freorder-functions
- توابع را در
فایل شیء (object file)
بازآرایی
میکند تا
محلی بودن
کد بهبود
یابد.
برخلاف
-fipa-reorder-for-locality، این
گزینه
گروهبندی
تمام توابع
متعلق به یک
دسته
(داغ/عادی/سرد/هرگز
اجرا نشده)
را در
اولویت
قرار
میدهد. این
کار با
بهکارگیری
زیربخشهای
اختصاصی
".text.hot"
برای
توابعی با
بیشترین
تکرار اجرا
و ".text.unlikely"
برای
توابعی که
بعید است
اجرا شوند
پیادهسازی
شده است.
بازآرایی
توسط
پیونددهنده
انجام
میگیرد،
بنابراین
ساختار
فایل شیء
باید از
بخشهای
نامگذاریشده
پشتیبانی
کند و
پیونددهنده
باید آنها
را به شکلی
مناسب
جایگذاری
نماید.
این گزینه اثری نخواهد داشت مگر اینکه یا دادههای بازخورد پروفایلسازی را فراهم کنید (برای جزئیات -fprofile-arcs را ببینید) یا توابع را بهصورت دستی با مشخصههای "hot" یا "cold" نشانهگذاری نمایید.
در سطوح -O2، -O3 و -Os فعال است.
- -fstrict-aliasing
- به
کامپایلر
اجازه
میدهد تا
سختگیرانهترین
قواعد نام
مستعار (aliasing)
ممکن برای
زبان در حال
کامپایل را
فرض بگیرد.
برای C (و C++)،
این کار
بهینهسازیهای
مبتنی بر
نوع عبارات
را فعال
میکند.
بهویژه،
فرض بر این
است که شیئی
از یک نوع
هرگز در
نشانی
یکسانی با
شیئی از نوع
متفاوت
قرار
ندارد، مگر
اینکه
انواع
تقریباً
یکسان
باشند. برای
نمونه، یک
"unsigned int"
میتواند
همپوشان (alias)
یک "int"
باشد، اما
نمیتواند
برای "void*"
یا یک
"double" به
عنوان نام
مستعار در
نظر گرفته
شود. یک نوع
نویسهای
(character)
میتواند
با هر نوع
دیگری
همپوشان
باشد.
به کدهایی از این قبیل توجه ویژهای داشته باشید:
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
- شروع توابع
را در توان
بعدی از عدد
دو که
بزرگتر یا
مساوی با n
است تراز
میکند، با
پرش تا
حداکثر m-1
بایت. این
امر تضمین
میکند که
دستکم m
بایت اول
تابع
بتواند
توسط CPU بدون
عبور از مرز
تراز
n-بایتی
واکشی (fetch) شود.
این یک
بهینهسازی
کارایی کد
است و
ترازسازی
برای
توابعی که
سرد (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 برابر ۶۵۵۳۶ است.
در سطوح -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
- تمام اهداف
انشعاب را
در مرز
توانی از دو
تراز
میکند.
پارامترهای این گزینه مشابه با گزینه -falign-functions هستند. -fno-align-labels و -falign-labels=1 معادل یکدیگرند و به این معنی هستند که برچسبها تراز نمیشوند.
اگر -falign-loops یا -falign-jumps قابل اعمال بوده و بزرگتر از این مقدار باشند، مقادیر آنها به جای این مقدار استفاده میشوند.
اگر n مشخص نشده باشد یا صفر باشد، از مقدار پیشفرض وابسته به ماشین استفاده میشود که به احتمال زیاد 1 است، یعنی عدم ترازسازی. حداکثر مقدار مجاز گزینه n برابر ۶۵۵۳۶ است.
در سطوح -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 برابر ۶۵۵۳۶ است.
اگر n مشخص نشده باشد یا صفر باشد، از پیشفرض وابسته به ماشین استفاده میشود.
در سطوح -O2، -O3 فعال میشود.
- -falign-jumps
- -falign-jumps=n
- -falign-jumps=n:m
- -falign-jumps=n:m:n2
- -falign-jumps=n:m:n2:m2
- اهداف
انشعاب را
در مرز
توانی از دو
تراز
میکند؛
برای اهداف
انشعابی که
تنها از
طریق پرش
میتوان به
آنها رسید.
در این
حالت،
نیازی به
اجرای هیچ
عملیات
صوری (dummy) نیست.
این یک
بهینهسازی
کارایی کد
است و
ترازسازی
برای
پرشهایی
که سرد (cold) در
نظر گرفته
میشوند
نادیده
گرفته
میشود.
اگر -falign-labels بزرگتر از این مقدار باشد، مقدار آن به جای این استفاده خواهد شد.
پارامترهای این گزینه مشابه با گزینه -falign-functions هستند. -fno-align-jumps و -falign-jumps=1 معادل یکدیگرند و به این معنی هستند که حلقهها تراز نمیشوند.
اگر n مشخص نشده باشد یا صفر باشد، از پیشفرض وابسته به ماشین استفاده میشود. حداکثر مقدار مجاز گزینه n برابر ۶۵۵۳۶ است.
در سطوح -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)
جدید در
عملیات
ذخیرهسازی
شوند، بدون
اینکه
اثبات کند
دسترسی
همروند به
متغیر توسط
سایر
ریسهها (threads)
امکانپذیر
نیست. بر
بهینهسازی
دادههای
محلی
تأثیری
ندارد. اگر
مشخص باشد
که
دادههای
سراسری
توسط چندین
ریسه مورد
دسترسی
قرار
نخواهند
گرفت،
استفاده از
این گزینه
ایمن است.
از نمونه بهینهسازیهای فعالشده توسط -fallow-store-data-races میتوان به بالا کشیدن (hoisting) یا تبدیلهای شرطی (if-conversions) اشاره کرد که ممکن است باعث شوند مقداری که از قبل در حافظه بوده، دوباره با همان مقدار بازنویسی شود. چنین بازنویسیای در یک زمینه تکریسهای ایمن است اما در یک زمینه چندریسهای ممکن است ناامن باشد. توجه داشته باشید که در برخی پردازندهها، ممکن است تبدیلهای شرطی (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)
مجزا تخصیص
میدهد. این
کار به
مرحلهٔ
تخصیص ثبات
اجازه
میدهد تا
مستقیماً
روی
ثباتهای
ساختگی عمل
کند، اما
چند مرحلهٔ
بهینهسازی
دیگر مانند
CSE،
بهینهساز
حلقه و
حذفکنندهٔ
کدهای
مردهٔ
بدیهی را
نیز تقویت
میکند. با
این حال،
میتواند
اشکالزدایی
را غیرممکن
سازد، زیرا
متغیرها
دیگر در یک
«ثبات
خانگی» (home register)
باقی
نمیمانند.
بهطور پیشفرض با -funroll-loops فعال است.
- -fwhole-program
- فرض را بر
این
میگذارد
که واحد
ترجمهٔ
فعلی
بیانگر کل
برنامهای
است که
کامپایل
میشود.
تمامی
توابع و
متغیرهای
عمومی به
استثنای
"main" و
آنهایی که
با مشخصهٔ
"externally_visible"
علامتگذاری
شدهاند به
توابع
ایستا
تبدیل
میشوند و
در عمل
تهاجمیتر
توسط
بهینهسازهای
بینروالی
بهینهسازی
میگردند.
همراه با -flto این گزینه کاربرد محدودی دارد. در اغلب موارد فهرست دقیق نمادهای استفادهشده یا صادرشده از باینری، بر اساس اطلاعات تفکیک نمادها که توسط افزونه پیونددهنده به بهینهساز زمان پیوند فرستاده میشود، مشخص است. با این حال، اگر از افزونه پیونددهنده استفاده نشود یا در حین گام پیوند تدریجی هنگامی که کد نهایی تولید میشود (با -flto -flinker-output=nolto-rel)، همچنان مفید است.
- -flto[=n]
- این گزینه
بهینهساز
استاندارد
زمان پیوند
(LTO) را اجرا
میکند.
هنگام
فراخوانی
همراه با کد
منبع،
ساختار GIMPLE
(یکی از
نمایشهای
داخلی GCC) را
تولید کرده
و آن را در
بخشهای
ویژهٔ ELF در
فایل شیء (object file)
مینویسد.
هنگامی که
فایلهای
شیء با هم
پیوند داده
میشوند،
تمامی
بدنههای
توابع از
این
بخشهای 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 و بالعکس بهصورت درونخطی قرار دهد.
روشی دیگر (و سادهتر) برای فعالسازی بهینهسازی زمان پیوند:
gcc -o myprog -flto -O2 foo.c bar.c
دستور بالا بایتکد را برای foo.c و bar.c تولید کرده، آنها را در یک نمایش واحد GIMPLE ادغام میکند و طبق معمول بهینهسازی مینماید تا myprog تولید شود.
نکتهٔ مهمی که باید به خاطر سپرد این است که برای فعالسازی بهینهسازیهای زمان پیوند باید از درایور GCC برای انجام مرحلهٔ پیوند استفاده کنید. اگر هر یک از اشیاء دخیل با گزینهٔ خط فرمانی -flto کامپایل شده باشند، GCC بهطور خودکار بهینهسازی زمان پیوند را اعمال میکند. همواره میتوانید تصمیم خودکار برای انجام بهینهسازی زمان پیوند را با ارسال -fno-lto به دستور پیوند لغو کنید.
برای اثربخش کردن بهینهسازی کل برنامه، لازم است فرضیات مشخصی دربارهٔ کل برنامه در نظر گرفته شود. کامپایلر باید بداند چه توابع و متغیرهایی ممکن است از بیرون واحد بهینهسازیشده در زمان پیوند، توسط کتابخانهها و محیط زمان اجرا در دسترس باشند. در صورت پشتیبانی توسط پیونددهنده، افزونه پیونددهنده (نگاه کنید به -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، بهجای ar و ranlib از gcc-ar و gcc-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 تلاش میکند تا یک job server در حال اجرای GNU make را بهطور خودکار شناسایی کند.
از -flto=auto برای استفاده از job server در GNU make (در صورت دردسترس بودن) یا در غیر این صورت، بازگشت به تشخیص خودکار تعداد رشتههای پردازنده موجود در سیستم استفاده کنید.
- -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 را برای ارسال گزینههای مناسب به این ابزارها فراهم میکند. با اشیای غیر-fat LTO، لازم است Makefileها تغییر یابند تا از آنها استفاده کنند.
توجه داشته باشید که 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 پروفایلهای جمعآوریشده با استفاده از دودویی ابزارگذاریشده برای برنامههای چندریسهای ممکن است به دلیل بهروزرسانیهای از دسترفتهٔ شمارنده ناسازگار باشند. هنگامی که این گزینه مشخص شود، GCC از روشهای اکتشافی برای تصحیح یا هموارسازی چنین ناسازگاریهایی استفاده میکند. بهطور پیشفرض، هنگامی که یک پروفایل ناسازگار شناسایی شود، GCC یک پیام خطا صادر میکند.
این گزینه توسط -fauto-profile فعال میشود.
- -fprofile-partial-training
- با "-fprofile-use"، تمام بخشهایی از برنامه که در طول اجرای آموزش اجرا نشدهاند، به جای سرعت، بهشدت برای اندازه بهینهسازی میشوند. در برخی موارد، آموزش دادن همهٔ مسیرهای داغ ممکن در برنامه عملی نیست. (برای مثال، برنامه ممکن است شامل توابعی ویژهٔ سختافزاری خاص باشد و آموزش نتواند تمام پیکربندیهای سختافزاری که برنامه روی آنها اجرا میشود را پوشش دهد.) با "-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
- این گزینه
امکان
کنترل بر
دقت اضافی (excess
precision) را در
ماشینهایی
فراهم
میکند که
در آنها
عملیات
ممیز شناور
در قالبی با
دقت یا
دامنهٔ
بیشتری
نسبت به
استاندارد
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__" میشود.
این گزینه توسط هیچ گزینهٔ -O دیگری به جز -Ofast روشن نمیشود، زیرا میتواند به خروجی نادرست برای برنامههایی منجر شود که به پیادهسازی دقیق قواعد/مشخصات IEEE یا ISO برای توابع ریاضی وابسته هستند. با این حال، ممکن است کد سریعتری برای برنامههایی تولید کند که به ضمانتهای این مشخصات نیازی ندارند.
- -fno-math-errno
- پس از
فراخوانی
توابع
ریاضی که با
یک
تکدستورالعمل
اجرا
میشوند،
مانند
"sqrt"،
متغیر
"errno" را
مقداردهی
نکنید.
برنامهای
که برای
مدیریت
خطای ریاضی
به
استثناهای
IEEE متکی است،
ممکن است
برای
افزایش
سرعت و در
عین حال حفظ
سازگاری
محاسباتی
IEEE، مایل به
استفاده از
این پرچم
باشد.
این گزینه توسط هیچ گزینهٔ -O به جز -Ofast روشن نمیشود، زیرا میتواند به خروجی نادرست برای برنامههایی منجر شود که به پیادهسازی دقیق قواعد/مشخصات IEEE یا ISO برای توابع ریاضی وابسته هستند. با این حال، ممکن است کد سریعتری برای برنامههایی ایجاد کند که نیازی به ضمانتهای این مشخصات ندارند.
حالت پیشفرض -fmath-errno است.
در سیستمهای Darwin، کتابخانهٔ ریاضی هرگز "errno" را تنظیم نمیکند. بنابراین دلیلی ندارد که کامپایلر این احتمال را در نظر بگیرد، و -fno-math-errno حالت پیشفرض است.
- -funsafe-math-optimizations
- بهینهسازیهایی
را برای
محاسبات
ممیز شناور
مجاز
میکند که
(الف) فرض
میکنند
آرگومانها
و نتایج
معتبر
هستند و (ب)
ممکن است
استانداردهای
IEEE یا ANSI را نقض
کنند.
هنگامی که
در زمان
پیوند
استفاده
شود، ممکن
است شامل
کتابخانهها
یا
فایلهای
راهاندازی
باشد که
کلمهٔ
کنترلی
پیشفرض FPU
یا سایر
بهینهسازیهای
مشابه را
تغییر
میدهند.
این گزینه توسط هیچ گزینهٔ -O به جز -Ofast روشن نمیشود، زیرا میتواند به خروجی نادرست برای برنامههایی منجر شود که به پیادهسازی دقیق قواعد/مشخصات IEEE یا ISO برای توابع ریاضی وابسته هستند. با این حال، ممکن است کد سریعتری برای برنامههایی تولید کند که به ضمانتهای این مشخصات نیازی ندارند. گزینههای -fno-signed-zeros، -fno-trapping-math، -fassociative-math و -freciprocal-math را فعال میکند.
حالت پیشفرض -fno-unsafe-math-optimizations است..IP -fassociative-math 4 امکان شرکتپذیری مجدد عملوندها را در سلسلهای از عملیات ممیز شناور فراهم میکند. این کار با احتمال تغییر در نتیجه محاسبات، استانداردهای زبان ISO C و C++ را نقض میکند. نکته: تغییر ترتیب ممکن است علامت صفر را تغییر دهد، مقادیر NaN را نادیده بگیرد و مانع از سرریز زیرین (underflow) یا سرریز (overflow) شود یا آنها را ایجاد کند (و بنابراین نمیتوان آن را در کدهایی که به رفتار گرد کردن متکی هستند، مانند "(x + 2**52) - 2**52" استفاده کرد). همچنین ممکن است مقایسههای ممیز شناور را بازآرایی کند و بنابراین در مواردی که مقایسههای مرتبشده نیاز است، نباید استفاده شود. این گزینه مستلزم فعال بودن همزمان -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)"
مشمول حذف
زیرعبارتهای
مشترک قرار
گیرد، مفید
است. توجه
داشته
باشید که
این کار دقت
را کاهش
داده و
تعداد
عملیات
ممیز شناور
(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)
قابل
مشاهده
برای کاربر
تولید کنند.
این تلهها
شامل تقسیم
بر صفر،
سرریز،
سرریز
زیرین،
نتیجه
نادقیق و
عملیات
نامعتبر
میشوند.
این گزینه
مستلزم
فعال بودن
-fno-signaling-nans است.
تنظیم این
گزینه ممکن
است امکان
تولید کد
سریعتری
را فراهم
کند، به
عنوان مثال
در صورتی که
به محاسبات
IEEE «بدون
توقف» (non-stop)
تکیه شود.
این گزینه توسط هیچیک از گزینههای -O به جز -Ofast روشن نمیشود، چرا که میتواند برای برنامههای وابسته به پیادهسازی دقیق قواعد/مشخصات IEEE یا ISO برای توابع ریاضی به خروجی نادرست منجر شود.
پیشفرض -ftrapping-math است.
نسخههای آینده GCC ممکن است کنترل دقیقتری بر این تنظیم با استفاده از عملگر C99 یعنی "FENV_ACCESS" ارائه دهند. این گزینه خط فرمان همراه با -frounding-math برای تعیین وضعیت پیشفرض برای "FENV_ACCESS" استفاده خواهد شد.
- -frounding-math
- تبدیلات و
بهینهسازیهایی
را که رفتار
پیشفرض
گرد کردن
ممیز شناور
(گرد کردن
به
نزدیکترین)
را فرض
میگیرند،
غیرفعال
میکند. این
گزینه باید
برای
برنامههایی
مشخص شود که
حالت گرد
کردن ممیز
شناور را
بهصورت
پویا تغییر
میدهند،
یا ممکن است
با یک حالت
گرد کردن
غیرپیشفرض
اجرا شوند.
این گزینه
انباشت
ثابتها (constant
folding) در عبارات
ممیز شناور
را در زمان
کامپایل (که
ممکن است
تحت تأثیر
حالت گرد
کردن قرار
گیرد) و
تبدیلات
محاسباتی
ناامن در
حضور
حالتهای
گرد کردن
وابسته به
علامت را
غیرفعال
میکند.
پیشفرض -fno-rounding-math است.
این گزینه آزمایشی است و در حال حاضر غیرفعال شدن تمام بهینهسازیهای GCC را که تحت تأثیر حالت گرد کردن هستند تضمین نمیکند. نسخههای آینده GCC ممکن است کنترل دقیقتری بر این تنظیم با استفاده از عملگر پیشپردازنده C99 یعنی "FENV_ACCESS" ارائه دهند. این گزینه خط فرمان همراه با -ftrapping-math برای مشخص کردن وضعیت پیشفرض برای "FENV_ACCESS" به کار خواهد رفت.
- -fsignaling-nans
- کامپایل کد
با این فرض
که مقادیر
اخطاردهنده
NaN در
استاندارد
IEEE (یا signaling NaNs) ممکن
است در طول
عملیات
ممیز
شناور،
تلههای
قابل
مشاهده
برای کاربر
ایجاد کنند.
تنظیم این
گزینه،
بهینهسازیهایی
را که ممکن
است تعداد
استثناهای
قابلمشاهده
با signaling NaNها را
تغییر
دهند،
غیرفعال
میکند. این
گزینه
مستلزم -ftrapping-math
است.
این گزینه باعث تعریف ماکروی پیشپردازنده "__SUPPORT_SNAN__" میشود.
پیشفرض -fno-signaling-nans است.
این گزینه آزمایشی است و در حال حاضر غیرفعال شدن تمام بهینهسازیهای GCC را که بر رفتار signaling NaN تأثیر میگذارند تضمین نمیکند.
- -fno-fp-int-builtin-inexact
- به توابع
توکار
"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 یا نسخهای بالاتر از C انتخاب شده باشد. این گزینه هیچ اثری ندارد مگر اینکه -ftrapping-math فعال باشد.
حتی اگر از -fno-fp-int-builtin-inexact استفاده شود، چنانچه این توابع فراخوانی به یک تابع کتابخانهای ایجاد کنند و پیادهسازی کتابخانه از TS 18661 پیروی نکند، استثنای «inexact» ممکن است همچنان صادر شود.
- -fsingle-precision-constant
- با ثابتهای ممیز شناور به عنوان دقت یگانه (single precision) رفتار میکند، به جای آنکه آنها را بهطور ضمنی به ثابتهای با دقت دوگانه (double precision) تبدیل نماید.
- -fcx-limited-range
- در صورت
فعال بودن،
این گزینه
بیان
میدارد که
هنگام
انجام
تقسیم
مختلط
نیازی به
مرحله کاهش
محدوده
نیست.
همچنین،
هیچ بررسی
صورت
نمیگیرد
که آیا
نتیجه ضرب
یا تقسیم
مختلط
برابر با
"NaN + I*NaN" است
تا تلاشی
برای بهبود
وضعیت در آن
شرایط
انجام شود.
پیشفرض
-fno-cx-limited-range است،
اما توسط
-ffast-math فعال
میشود.
این گزینه تنظیم پیشفرض دستور ISO C99 با نام "CX_LIMITED_RANGE" را کنترل میکند. با این حال، این گزینه برای تمام زبانها اعمال میشود.
- -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
- گذر انتقال ناورداهای حلقه را در بهینهساز حلقه RTL فعال میکند. در سطح -O1 و بالاتر، بهجز -Og، فعال است.
- -fmove-loop-stores
- گذر انتقال ذخیرههای حلقه را در بهینهساز حلقه 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) در Fortran مفید است، جایی که (برای نمونه) با فرض دسترسیهای پیوسته، برداریسازی (vectorization) بهتری را امکانپذیر میسازد. این پرچم بهطور پیشفرض در -O3 فعال است. همچنین توسط -fprofile-use و -fauto-profile فعال میشود.
- -ffunction-sections
- -fdata-sections
- اگر هدف از
بخشهای
دلخواه (arbitrary sections)
پشتیبانی
کند، هر
تابع یا
داده را در
بخش
اختصاصی
خود در فایل
خروجی قرار
میدهد. نام
تابع یا نام
داده، نام
بخش مربوطه
در فایل
خروجی را
تعیین
میکند.
از این گزینهها در سیستمهایی استفاده کنید که پیونددهنده میتواند بهینهسازیهایی را برای بهبود محلیسازی ارجاع در فضای دستورالعمل انجام دهد. اکثر سیستمهایی که از قالب شیء ELF استفاده میکنند، دارای پیونددهندههایی با چنین بهینهسازیهایی هستند. در AIX، پیونددهنده بخشها (CSECTها) را بر اساس گراف فراخوانی بازآرایی میکند. تأثیر آن بر کارایی متغیر است.
همراه با جمعآوری زباله توسط پیونددهنده (گزینه --gc-sections پیونددهنده)، این گزینهها ممکن است به فایلهای اجرایی پیوندیافته ایستا و کوچکتری (پس از حذف نمادها) منجر شوند.
در سیستمهای ELF/DWARF این گزینهها کیفیت اطلاعات اشکالزدایی را کاهش نمیدهند. اما ممکن است در سایر قالبهای فایل شیء یا اطلاعات اشکالزدایی مشکلاتی وجود داشته باشد.
فقط زمانی از این گزینهها استفاده کنید که مزایای چشمگیری از انجام آن حاصل شود. هنگامی که این گزینهها را مشخص میکنید، اسمبلر و پیونددهنده فایلهای شیء و اجرایی بزرگتری تولید میکنند و همچنین کندتر عمل میکنند. این گزینهها بر تولید کد تأثیر میگذارند. آنها مانع از بهینهسازیهای کامپایلر و اسمبلر با استفاده از مکانهای نسبی درون یک واحد ترجمه (translation unit) میشوند، زیرا مکانها تا زمان پیوند ناشناخته هستند. نمونهای از چنین بهینهسازیهایی، تعدیل فراخوانیها به دستورالعملهای فراخوانی کوتاه است.
- -fstdarg-opt
- مقدمه (prologue) توابع با تعداد آرگومان متغیر را با توجه به نحوه استفاده از آن آرگومانها بهینهسازی میکند.
- -fsection-anchors
- تلاش
میکند تا
با استفاده
از نمادهای
مشترک
«لنگر» (anchor)
برای
آدرسدهی
اشیاء
مجاور،
تعداد
محاسبات
آدرس
نمادین را
کاهش دهد.
این تبدیل
در برخی از
اهداف
میتواند
به کاهش
تعداد
ورودیهای
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) را هنگام بازگشت از تابع صفر میکند تا با کاهش حملات برنامهنویسی مبتنی بر بازگشت (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
- هنگامی که پیشبینی میشود یک انشعاب با احتمالی کمتر از این آستانه (به درصد) پیموده شود، به عنوان انشعابی با پیشبینیپذیری خوب در نظر گرفته میشود.
- 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 محاسبهشده پرش میکند. برای جلوگیری از رفتار O(N^2) در چندین گذر، GCC دستورهای goto محاسبهشده را در اوایل فرایند کامپایل فاکتورگیری کرده و در دیرترین زمان ممکن فاکتورزدایی میکند. تنها پرشهای محاسبهشده در انتهای بلوکهای پایهای که بیش از max-goto-duplication-insns دستورالعمل ندارند فاکتورزدایی میشوند.
- max-delay-slot-insn-search
- بیشینه تعداد دستورالعملهایی که هنگام جستجو برای یافتن دستوری جهت پر کردن شکاف تاخیر (delay slot) بررسی میشوند. اگر بیش از این مقدار اختیاری جستجو شود، صرفهجویی زمانی حاصل از پر کردن شکاف تاخیر ناچیز خواهد بود، بنابراین جستجو متوقف میشود. افزایش مقادیر به معنی بهینهسازی تهاجمیتر است که زمان کامپایل را افزایش داده و احتمالاً بهبود اندکی در زمان اجرا به همراه دارد.
- max-delay-slot-live-search
- هنگام تلاش برای پر کردن شکافهای تاخیر، بیشینه تعداد دستورالعملهایی است که هنگام جستجوی یک بلوک با اطلاعات معتبر ثبتکنندههای فعال بررسی میشوند. افزایش این مقدار دلخواه به معنای بهینهسازی تهاجمیتر است و زمان کامپایل را افزایش میدهد. این پارامتر زمانی که کد شکاف تاخیر برای نگهداری گراف جریان کنترل بازنویسی شود، باید حذف گردد.
- max-gcse-memory
- مقدار تقریبی بیشینهٔ حافظه به "kB" که میتواند برای انجام بهینهسازی حذف زیرعبارتهای مشترک سراسری (GCSE) تخصیص یابد. اگر به حافظهای بیش از مقدار مشخصشده نیاز باشد، بهینهسازی انجام نمیشود.
- max-gcse-insertion-ratio
- اگر نسبت درج عبارات به حذف آنها برای هر عبارتی از این مقدار بیشتر باشد، آنگاه RTL PRE عبارت را درج یا حذف کرده و بدین ترتیب محاسبات تا حدی زائد را در جریان دستورالعملها باقی میگذارد.
- max-pending-list-length
- بیشینه تعداد وابستگیهای معوق که زمانبندی قبل از تخلیهٔ وضعیت فعلی و شروع دوباره اجازه میدهد. توابع بزرگ با انشعابها یا فراخوانیهای کم میتوانند فهرستهای بسیار بزرگی ایجاد کنند که بیدلیل حافظه و منابع را مصرف میکنند.
- 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) را در یک تابع تکی مشخص میکند که درونخطساز درختی برای درونخطی کردن بررسی میکند. این گزینه فقط بر توابع تعریفشده با 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، اما برای واسطهای تابع (thunks) اعمال میشود..IP inline-min-speedup 4 هنگامی که بهبود تخمینی کارایی زمان اجرای فراخواننده + فراخواندهشده (caller + callee) از این آستانه (بر حسب درصد) فراتر رود، تابع میتواند فارغ از محدودیتهای موجود در --param max-inline-insns-single و --param max-inline-insns-auto درونخطی (inline) شود.
- large-function-insns
- حد مشخصکنندهٔ توابع بسیار بزرگ. برای توابعی که پس از درونخطیسازی از این حد فراتر میروند، درونخطیسازی توسط --param large-function-growth محدود میشود. این پارامتر عمدتاً برای جلوگیری از افزایش شدید زمان کامپایلِ ناشی از الگوریتمهای غیرخطی در بخش پشتی (back end) مفید است.
- large-function-growth
- بیشینهٔ رشد توابع بزرگ ناشی از درونخطیسازی را بر حسب درصد مشخص میکند. برای مثال، مقدار پارامتر ۱۰۰ رشد تابع بزرگ را به ۲٫۰ برابر اندازهٔ اصلی محدود میکند.
- large-unit-insns
- حد مشخصکنندهٔ واحد ترجمه (translation unit) بزرگ. رشد ناشی از درونخطیسازی واحدهای بزرگتر از این حد توسط --param inline-unit-growth محدود میشود. برای واحدهای کوچک ممکن است این محدودیت بیش از حد سختگیرانه باشد. برای مثال، واحدی را در نظر بگیرید که شامل تابع A (که درونخطی است) و تابع B است که صرفاً A را سه بار فراخوانی میکند. اگر B نسبت به A کوچک باشد، رشد واحد ۳۰۰\% خواهد بود و با این وجود چنین درونخطیسازی بسیار معقول است. با این حال، برای واحدهای بسیار بزرگ متشکل از توابع کوچکِ قابل درونخطیسازی، اعمال محدودیت بر رشد کلی واحد برای جلوگیری از انفجار نمایی اندازهٔ کد ضروری است. بنابراین برای واحدهای کوچکتر، اندازه پیش از اعمال --param inline-unit-growth تا میزان --param large-unit-insns افزایش داده میشود.
- lazy-modules
- بیشینهٔ تعداد فایلهای ماژول C++ که هنگام بارگذاری تنبلانه (lazy loading) بهطور همزمان باز هستند.
- inline-unit-growth
- بیشینهٔ رشد کلی واحد کامپایل ناشی از درونخطیسازی را مشخص میکند. برای مثال، مقدار پارامتر ۲۰ رشد واحد را به ۱٫۲ برابر اندازهٔ اصلی محدود میکند. توابع سرد (cold) (چه با یک صفت مشخص شده باشند و چه از طریق بازخورد پروفایل) در محاسبهٔ اندازهٔ واحد به حساب نمیآیند.
- ipa-cp-unit-growth
- بیشینهٔ رشد کلی واحد کامپایل ناشی از انتشار ثابت بینرویهای (interprocedural constant propagation) را مشخص میکند. برای مثال، مقدار پارامتر ۱۰ رشد واحد را به ۱٫۱ برابر اندازهٔ اصلی محدود میکند.
- ipa-cp-large-unit-insns
- اندازهای از واحد ترجمه که گذر IPA-CP آن را بزرگ در نظر میگیرد.
- large-stack-frame
- حد مشخصکنندهٔ فریمهای پشتهٔ (stack frames) بزرگ. الگوریتم در حین درونخطیسازی تلاش میکند از این حد فراتر نرود.
- large-stack-frame-growth
- بیشینهٔ رشد فریمهای پشتهٔ بزرگ ناشی از درونخطیسازی را بر حسب درصد مشخص میکند. برای مثال، مقدار پارامتر ۱۰۰۰ رشد فریم پشتهٔ بزرگ را به ۱۱ برابر اندازهٔ اصلی محدود میکند.
- 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
- بیشینهٔ تعداد بلوکهای پایهٔ (bb) مشابه برای مقایسه با یک bb. این پارامتر برای جلوگیری از رفتار درجهدوم در ادغام دنبالهٔ درخت (tree tail merging) استفاده میشود.
- max-tail-merge-iterations
- بیشینهٔ تعداد تکرارهای گذر روی تابع. این پارامتر برای محدود ساختن زمان کامپایل در ادغام دنبالهٔ درخت استفاده میشود.
- store-merging-allow-unaligned
- به گذر ادغام ذخیرهسازیها اجازه میدهد در صورتی که مجاز باشد، ذخیرهسازیهای ناتراز (unaligned stores) ایجاد کند..IP max-stores-to-merge 4 حداکثر تعداد عملیات ذخیرهسازی (store) که در گذر ادغام ذخیرهها (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
- حداکثر عمق یک آشیانه حلقه (loop nest) که برای پوستهکنی کامل مناسب است.
- max-unswitch-insns
- حداکثر تعداد دستورالعملهای یک حلقه خارجسوئیچشده (unswitched).
- 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
- اگر تعداد نامزدها در مجموعه کمتر از این مقدار باشد، هنگام افزودن یک نامزد جدید، همیشه برای حذف ivهای غیرضروری از مجموعه تلاش میشود.
- 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 که توسط تبدیل شرطی TREE (TREE if conversion) پشتیبانی میشود، مگر اینکه حلقه با عملیافته (pragma) simd نشانهگذاری شده باشد.
- vect-max-layout-candidates
- حداکثر تعداد چیدمانهای برداری ممکن (مانند جایگشتها) که هنگام بهینهسازی کدهای آماده برداریسازی (to-be-vectorized) در نظر گرفته میشوند.
- 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
- تعداد درهزارها (permilles) از پراجراترین بخشها، در بازه 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 از تعداد اجراهای پروفایلشده کل برنامه که تعداد اجرای یک بلوک پایه باید کمتر از آن باشد تا اجرای آن بلوک نامحتمل تلقی شود. مقدار پیشفرض 20 است؛ به این معنی که اگر یک بلوک پایه در کمتر از 1/20، یا 5% از اجراهای برنامه اجرا شود، اجرای آن کماحتمال (unlikely) در نظر گرفته میشود. مقدار 0 یعنی همیشه کماحتمال تلقی میشود.
- max-predicted-iterations
- حداکثر تعداد تکرارهای حلقه که بهصورت ایستا پیشبینی میکنیم. این پارامتر در مواردی مفید است که یک تابع شامل یک حلقه با کران مشخص و حلقه دیگری با کران نامشخص باشد. تعداد تکرارهای مشخص بهدرستی پیشبینی میشود، در حالی که تعداد تکرارهای نامشخص بهطور میانگین تقریباً 10 تخمین زده میشود. این بدین معناست که حلقه بدون کران بهطور تصنعی نسبت به دیگری سرد (cold) به نظر میرسد.
- builtin-expect-probability
- احتمال اینکه عبارت مقدار مشخصشده را داشته باشد کنترل میکند. این پارامتر یک درصد (یعنی 0 ... 100) را به عنوان ورودی دریافت میکند.
- builtin-string-cmp-inline-length
- حداکثر طول یک رشته ثابت برای فراخوانی توکار مقایسه رشته (builtin string cmp) که واجد شرایط درونخطیسازی (inlining) باشد.
- align-threshold
- کسری از بیشینه بسامد اجرای یک بلوک پایه در یک تابع را جهت همتراز کردن بلوک پایه انتخاب میکند.
- align-loop-iterations
- حلقهای که انتظار میرود حداقل به تعداد دفعات مشخصشده تکرار شود، همتراز (aligned) میشود.
- 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
- محافظت در برابر stack clash شامل کاوش فضای پشته همزمان با تخصیص آن است. این پارامتر بیشینهٔ فاصله بین کاوشها در پشته را به صورت ۲ به توان num بایت کنترل میکند. مقادیر بالاتر ممکن است تعداد کاوشهای صریح را کاهش دهند، اما مقداری بزرگتر از محافظ ارائهشده توسط سیستمعامل، کد را در برابر حملات نوع stack clash آسیبپذیر خواهد کرد.
- max-cse-path-length
- بیشینهٔ تعداد بلوکهای پایهای در مسیری که CSE در نظر میگیرد.
- max-cse-insns
- بیشینهٔ تعداد دستورالعملهایی که CSE پیش از تخلیه (flushing) پردازش میکند.
- ggc-min-expand
- GCC از یک
زبالهروب
(garbage collector) برای
مدیریت
تخصیص
حافظهٔ خود
استفاده
میکند. این
پارامتر
حداقل
درصدی را
مشخص
میکند که
هیپ (heap)
زبالهروب
اجازه دارد
بین
دورههای
جمعآوری
گسترش یابد.
تنظیم این
پارامتر
ممکن است
سرعت
کامپایل را
بهبود
ببخشد؛ ولی
هیچ تأثیری
بر تولید کد
ندارد.
مقدار پیشفرض 30% + 70% * (RAM/1GB) با حد بالای ۱۰۰٪ در صورت RAM >= 1GB است. اگر "getrlimit" در دسترس باشد، مفهوم «RAM» کوچکترین مقدار از بین RAM واقعی و "RLIMIT_DATA" یا "RLIMIT_AS" خواهد بود. اگر GCC نتواند RAM را در یک بستر خاص محاسبه کند، حد پایین ۳۰٪ استفاده میشود. تنظیم این پارامتر و ggc-min-heapsize روی صفر باعث میشود در هر فرصتی یک جمعآوری کامل رخ دهد. این کار بسیار کُند است، اما میتواند برای اشکالزدایی مفید باشد.
- ggc-min-heapsize
- حداقل
اندازهٔ
هیپ
زبالهروب
پیش از آنکه
شروع به
جمعآوری
زباله کند.
نخستین
جمعآوری
پس از آن رخ
میدهد که
هیپ به
اندازهٔ
ggc-min-expand% فراتر
از ggc-min-heapsize
گسترش یابد.
مجدداً،
تنظیم این
مقدار
میتواند
سرعت
کامپایل را
بهبود بخشد
و هیچ اثری
روی تولید
کد ندارد.
مقدار پیشفرض کوچکترین مقدار از بین RAM/8، RLIMIT_RSS، یا حدی است که تلاش میکند اطمینان حاصل کند از RLIMIT_DATA یا RLIMIT_AS تجاوز نمیشود، اما با حد پایین ۴۰۹۶ (چهار مگابایت) و حد بالای ۱۳۱۰۷۲ (۱۲۸ مگابایت). اگر GCC نتواند RAM را در یک بستر خاص محاسبه کند، از حد پایین استفاده میشود. تنظیم بسیار بزرگ این پارامتر عملاً زبالهروبی را غیرفعال میکند. تنظیم این پارامتر و ggc-min-expand روی صفر باعث میشود در هر فرصتی یک جمعآوری کامل رخ دهد.
- max-reload-search-insns
- بیشینهٔ تعداد دستورالعملهایی که بازبارگذاری (reload) باید برای ثبات معادل به عقب جستجو کند. افزایش مقادیر به معنای بهینهسازی تهاجمیتر است که باعث افزایش زمان کامپایل با کارایی احتمالاً اندکی بهتر میشود.
- max-cselib-memory-locations
- بیشینهٔ تعداد مکانهای حافظهای که cselib باید در نظر بگیرد. افزایش مقادیر به معنای بهینهسازی تهاجمیتر است که باعث افزایش زمان کامپایل با کارایی احتمالاً اندکی بهتر میشود.
- max-sched-ready-insns
- بیشینهٔ تعداد دستورالعملهای آماده برای صدور که زمانبند در هر لحظه در طول اولین گذر زمانبندی باید در نظر بگیرد. افزایش مقادیر به معنای جستجوهای دقیقتر و کاملتر است که زمان کامپایل را با منفعتی احتمالاً اندک افزایش میدهد.
- max-sched-region-blocks
- بیشینهٔ تعداد بلوکها در یک ناحیه که برای زمانبندی بینبلوکی در نظر گرفته میشوند.
- max-pipeline-region-blocks
- بیشینهٔ تعداد بلوکها در یک ناحیه که برای خطلولهسازی در زمانبند گزینشی در نظر گرفته میشوند.
- max-sched-region-insns
- بیشینهٔ تعداد دستورالعملها (insns) در یک ناحیه که برای زمانبندی بینبلوکی در نظر گرفته میشوند.
- max-pipeline-region-insns
- بیشینهٔ تعداد دستورالعملها (insns) در یک ناحیه که برای خطلولهسازی در زمانبند گزینشی در نظر گرفته میشوند.
- min-spec-prob
- حداقل احتمال (به درصد) برای رسیدن به یک بلوک مبدأ جهت زمانبندی گمانهزنانهٔ بینبلوکی.
- max-sched-extend-regions-iters
- بیشینهٔ تعداد تکرارها در CFG برای گسترش ناحیهها. مقدار ۰ گسترش ناحیهها را غیرفعال میکند.
- max-sched-insn-conflict-delay
- بیشینهٔ تأخیر تداخل برای یک دستورالعمل جهت در نظر گرفته شدن برای جابهجایی گمانهزنانه.
- sched-spec-prob-cutoff
- حداقل احتمال موفقیت گمانهزنی (به درصد)، بهطوریکه دستورالعملهای گمانهزنانه زمانبندی شوند.
- sched-state-edge-prob-cutoff
- حداقل احتمالی که یک یال باید داشته باشد تا زمانبند وضعیت خود را در سراسر آن ذخیره کند.
- sched-mem-true-dep-cost
- حداقل فاصله (به چرخههای CPU) میان store و load که مکانهای حافظهٔ یکسانی را هدف قرار میدهند.
- selsched-max-lookahead
- بیشینهٔ اندازهٔ پنجرهٔ پیشنگری در زمانبندی گزینشی. این پارامتر عمق جستجو برای دستورالعملهای در دسترس است.
- selsched-max-sched-times
- بیشینهٔ دفعاتی که یک دستورالعمل در طول زمانبندی گزینشی زمانبندی میشود. این حد بر روی تعداد تکرارهایی است که دستورالعمل ممکن است در آنها خطلولهسازی شود.
- selsched-insns-to-rename
- بیشینهٔ تعداد بهترین دستورالعملها در فهرست آماده که برای تغییر نام در زمانبند گزینشی در نظر گرفته میشوند.
- 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 حداقل اندازه متغیرهایی که هنگام عدم بهینهسازی در اشتراکگذاری شکاف پشته شرکت میکنند.
- max-jump-thread-duplication-stmts
- حداکثر تعداد دستورهای مجاز در بلوکی که هنگام ریسهبندی پرشها نیاز به تکثیر دارد.
- max-jump-thread-paths
- حداکثر تعداد مسیرهایی که هنگام جستجوی فرصتهای ریسهبندی پرش در نظر گرفته میشوند. هنگام رسیدن به یک بلوک، یالهای ورودی تنها در صورتی بررسی میشوند که حاصلضرب تعداد مسیرهای جستجو شده تا آن لحظه در تعداد یالهای ورودی، از حداکثر تعداد مسیرهای مشخصشده فراتر نرود.
- max-fields-for-field-sensitive
- حداکثر تعداد فیلدها در یک ساختار که در طول تحلیل اشارهگرها به صورت حساس به فیلد با آنها رفتار میشود.
- prefetch-latency
- تخمین میانگین تعداد دستورالعملهایی که پیش از پایان واکشی مقدماتی اجرا میشوند. فاصله واکشی به جلو متناسب با این مقدار ثابت است. افزایش این عدد همچنین ممکن است منجر به واکشی مقدماتی جریانهای کمتری شود (به simultaneous-prefetches مراجعه کنید).
- simultaneous-prefetches
- حداکثر تعداد واکشیهای مقدماتی که میتوانند به طور همزمان اجرا شوند.
- l1-cache-line-size
- اندازه خط حافظه نهان در حافظه نهان داده L1، به بایت.
- l1-cache-size
- اندازه حافظه نهان داده L1، به کیلوبایت.
- l2-cache-size
- اندازه حافظه نهان داده L2، به کیلوبایت.
- prefetch-dynamic-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".
اندازه
تداخل مخرب
حداقل
فاصله (offset)
توصیهشده
بین دو شیء
مستقل است
که همزمان
مورد
دسترسی
قرار
میگیرند؛
اندازه
تداخل
سازنده
حداکثر
اندازه
توصیهشده
از حافظه
پیوسته است
که با
یکدیگر
مورد
دسترسی
قرار
میگیرند.
معمولاً هر
دو به
اندازه یک
خط حافظه
نهان L1 برای
هدف بر حسب
بایت
خواهند بود.
برای یک هدف
عمومی که
طیفی از
اندازههای
خط حافظه
نهان L1 را
پوشش
میدهد،
معمولاً
اندازه
تداخل
سازنده
کران پایین
طیف و
اندازه
تداخل مخرب
کران بالای
آن خواهد
بود.
اندازه تداخل مخرب برای چیدمان حافظه در نظر گرفته شده است و در نتیجه بر ABI تأثیر میگذارد. انتظار نمیرود مقدار پیشفرض پایدار باشد و در برخی اهداف با -mtune تغییر میکند؛ بنابراین استفاده از این متغیر در بافتی که پایداری ABI در آن مهم است (مانند رابط عمومی یک کتابخانه) اکیداً توصیه نمیشود؛ اگر در چنین بافتی استفاده شود، کاربران میتوانند با استفاده از این گزینه مقدار آن را تثبیت کنند.
اندازه تداخل سازنده حساسیت کمتری دارد، زیرا معمولاً تنها در یک static_assert برای اطمینان از جا شدن یک نوع در یک خط حافظه نهان استفاده میشود.
همچنین ببینید: -Winterference-size.
- loop-interchange-max-num-stmts
- حداکثر تعداد دستورها (stmts) در حلقهای که قرار است جابهجا شود.
- 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
- حداکثر تعداد caseها برای استفاده از الگوریتمهای کُند تقلیل switch (switch lowering).
- max-partial-antic-length
- حداکثر طول مجموعه antic جزئی که در طول بهینهسازی حذف افزونگی جزئی درختی (-ftree-pre) هنگام بهینهسازی در -O3 و بالاتر محاسبه میشود. برای برخی از انواع کدهای منبع، بهینهسازی پیشرفته حذف افزونگی جزئی میتواند از کنترل خارج شده و تمام حافظه موجود در ماشین میزبان را مصرف کند. این پارامتر محدودیتی برای طول مجموعههای محاسبهشده تعیین میکند که مانع این رفتار مهارنشدنی میشود. تنظیم مقدار 0 برای این پارامتر اجازه طول مجموعه نامحدود را میدهد.
- rpo-vn-max-loop-depth
- حداکثر عمق حلقهای که شمارهگذاری مقدار بهینهبینانه بر روی آن اعمال میشود. هنگامی که به این محدودیت برسد، درونیترین حلقهها به تعداد rpo-vn-max-loop-depth و بیرونیترین حلقه در آشیانه حلقه بهینهبینانه شمارهگذاری مقدار میشوند و باقی حلقهها خیر.
- sccvn-max-alias-queries-per-access
- حداکثر تعداد پرسوجوهای alias-oracle که هنگام جستجوی افزونگیها برای بارگذاریها و ذخیرهسازیها انجام میدهیم. اگر این حد نصاب حاصل شود، جستجو لغو شده و بارگذاری یا ذخیرهسازی به عنوان افزونه در نظر گرفته نمیشود. تعداد پرسوجوها از نظر الگوریتمی به تعداد ذخیرهسازیها در تمام مسیرها از بارگذاری تا نقطه ورود تابع محدود است.
- ira-max-loops-num
- ابزار IRA به طور پیشفرض از تخصیص ناحیهای ثباتها استفاده میکند. اگر تابعی شامل حلقههای بیشتری نسبت به عدد ارائهشده توسط این پارامتر باشد، حداکثر تا تعداد مشخصشده از حلقههایی که بیشترین تکرار اجرا را دارند، نواحی را برای تخصیص ناحیهای ثباتها تشکیل میدهند.
- ira-max-conflict-table-size
- اگرچه IRA از الگوریتم پیچیدهای برای فشردهسازی جدول تداخل استفاده میکند، اما این جدول همچنان میتواند برای توابع بسیار بزرگ به حافظه بیش از حدی نیاز داشته باشد. اگر ممکن است اندازه جدول تداخل برای یک تابع بیشتر از اندازه بر حسب مگابایت مشخصشده توسط این پارامتر باشد، تخصیصدهنده ثبات در عوض از الگوریتمی سریعتر، سادهتر و با کیفیت پایینتر استفاده میکند که نیازی به ایجاد جدول تداخل شبهثباتها ندارد.
- ira-loop-reserved-regs
- میتوان از IRA برای ارزیابی دقیقتر فشار ثباتها در حلقهها جهت تصمیمگیری در مورد جابهجایی مقادیر پایای حلقه استفاده کرد (به -O3 مراجعه کنید). تعداد ثباتهای در دسترسی که برای مقاصد دیگر رزرو شدهاند با این پارامتر مشخص میشود. مقدار پیشفرض این پارامتر بهترین مقدار بهدستآمده از آزمایشهای متعدد است.
- ira-consider-dup-in-all-alts
- باعث میشود IRA محدودیت تطبیق (شماره عملوند تکراری) را در تمام جایگزینهای موجود برای کلاس ثبات ترجیحی بهطور جدی در نظر بگیرد. اگر روی صفر تنظیم شود، به این معنی است که IRA تنها زمانی محدودیت تطبیق را رعایت میکند که در تنها جایگزین موجود با یک کلاس ثبات مناسب باشد. در غیر این صورت، به این معنی است که IRA تمام جایگزینهای موجود برای کلاس ثبات ترجیحی را بررسی خواهد کرد حتی اگر انتخابی با یک کلاس ثبات مناسب یافته باشد و به محدودیت تطبیق واجد شرایطِ یافتهشده احترام میگذارد.
- ira-simple-lra-insn-threshold
- تعداد تقریبی دستورالعملهای (insn) تابع در واحدهای 1K که تخصیص ثبات محلی ساده (simple local RA) را فعال میکند.
- lra-inheritance-ebb-probability-cutoff
- ابزار LRA سعی میکند مقادیر بازگذاریشده در ثباتها را در دستورالعملهای (insns) بعدی مجدداً استفاده کند. این بهینهسازی وراثت نامیده میشود. از EBB به عنوان یک ناحیه برای انجام این بهینهسازی استفاده میشود. این پارامتر حداقل احتمال یال fall-through را بر حسب درصد برای افزودن BB به EBB وراثت در LRA مشخص میکند. مقدار پیشفرض از اجراهای متعدد SPEC2000 روی x86-64 انتخاب شده است..IP loop-invariant-max-bbs-in-loop 4 انتقال ناورداهای حلقه (Loop invariant motion) در حلقههای بسیار بزرگ، هم از نظر زمان ترجمه و هم از نظر میزان حافظهٔ مورد نیاز در زمان ترجمه میتواند بسیار پرهزینه باشد. بهینهسازی انتقال ناورداهای حلقه روی حلقههایی که بلوکهای پایهٔ (basic blocks) آنها بیشتر از این پارامتر باشد، اعمال نخواهد شد.
- loop-max-datarefs-for-datadeps
- ایجاد وابستگیهای دادهای برای حلقههای بسیار بزرگ پرهزینه است. این پارامتر تعداد ارجاعات دادهای در حلقهها را که برای تحلیل وابستگی دادهای در نظر گرفته میشوند محدود میکند. این حلقههای بزرگ توسط بهینهسازیهایی که از وابستگیهای دادهای حلقه استفاده میکنند پردازش نمیشوند.
- max-vartrack-size
- حداکثر تعداد خانههای جدول درهمسازی (hash table slots) را برای استفاده در تحلیل جریان دادهٔ ردیابی متغیر هر تابع تعیین میکند. اگر این حد با فعال بودن ردیابی متغیر در انتسابها رد شود، تحلیل آن تابع پس از حذف تمام دستورالعملهای اشکالزدایی (debug insns) از تابع، دوباره بدون آن امتحان میشود. اگر حد مذکور حتی بدون دستورالعملهای اشکالزدایی نیز رد شود، تحلیل ردیابی متغیر بهطور کامل برای آن تابع غیرفعال میشود. تنظیم این پارامتر روی صفر، آن را نامحدود میکند.
- max-vartrack-expr-depth
- حداکثر عمق بازگشت را هنگام تلاش برای نگاشت نام متغیرها یا متغیرهای موقت اشکالزدایی به عبارتهای مقداری تعیین میکند. این کار زمان ترجمه را در ازای اطلاعات اشکالزدایی کاملتر مبادله میکند. اگر این مقدار بیش از حد کم تنظیم شود، عبارتهای مقداری در دسترس که میتوانستند در اطلاعات اشکالزدایی نمایش داده شوند ممکن است استفاده نشوند؛ تنظیم این مقدار روی عددی بالاتر به کامپایلر امکان میدهد عبارتهای اشکالزدایی پیچیدهتری را پیدا کند، اما ممکن است زمان ترجمه و مصرف حافظه افزایش یابد.
- max-debug-marker-count
- آستانهای را روی تعداد نشانگرهای اشکالزدایی (مانند نشانگرهای begin stmt) تعیین میکند تا از انفجار پیچیدگی هنگام درونخطیسازی (inlining) یا بسط به RTL جلوگیری شود. اگر تابعی تعداد دستورهای gimple از این دست بیشتر از حد تعیینشده داشته باشد، چنین دستورهایی از نسخهٔ درونخطیشدهٔ تابع و از بسط RTL آن حذف خواهند شد.
- min-nondebug-insn-uid
- برای دستورالعملهای غیر اشکالزدایی (nondebug insns) از uidهایی استفاده میکند که از مقدار این پارامتر شروع میشوند. محدودهٔ زیر این پارامتر منحصراً برای دستورالعملهای اشکالزدایی ایجاد شده توسط -fvar-tracking-assignments رزرو شده است، اما اگر محدودهٔ رزرو شده تمام شود، دستورالعملهای اشکالزدایی ممکن است uidهای (غیر همپوشان) بالاتر از آن را دریافت کنند.
- ipa-sra-deref-prob-threshold
- بهینهساز IPA-SRA اشارهگری را که مشخص است NULL نیست تنها در صورتی با یک یا چند پارامتر جدید جایگزین میکند که احتمال (به درصد، نسبت به نقطهٔ ورود تابع) ارجاعزدایی (dereference) آن از این پارامتر بیشتر باشد.
- ipa-sra-ptr-growth-factor
- بهینهساز IPA-SRA اشارهگر به یک متغیر تجمیعی (aggregate) را تنها زمانی با یک یا چند پارامتر جدید جایگزین میکند که اندازهٔ تجمیعی آنها کمتر یا مساوی با ipa-sra-ptr-growth-factor برابرِ اندازهٔ پارامتر اشارهگر اصلی باشد.
- ipa-sra-ptrwrap-growth-factor
- حداکثر رشد مجاز اضافیِ اندازهٔ کل پارامترهای جدیدی که ipa-sra با یک اشارهگر به یک متغیر تجمیعی (aggregate) جایگزین میکند، در صورتی که به یک متغیر محلی اشاره کند که فراخواننده فقط در آن مینویسد و آن را به عنوان یک آرگومان به سایر توابع ارسال میکند.
- ipa-sra-max-replacements
- حداکثر بخشهایی از یک نوع تجمیعی (aggregate) که 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
- حداکثر تعداد دسترسیهای ساختگی (artificial accesses) که جایگزینی اسکالر تجمیعها (SRA) برای هر متغیر محلی بهمنظور تسهیل انتشار کپی (copy propagation) ردیابی میکند.
- tm-max-aggregate-size
- هنگام ساختن رونوشت از متغیرهای محلی-نخ (thread-local) در یک تراکنش، این پارامتر اندازه را به بایت مشخص میکند که پس از آن، متغیرها بر خلاف جفتهای توالی کد ذخیره/بازیابی، با استفاده از توابع لاگبرداری ذخیره میشوند. این گزینه تنها هنگام استفاده از -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 فعال میشوند، هر حلقه را در آشیانهٔ حلقه به تعداد تکرار معینی بخشبندی (strip mine) میکنند. طول نوار را میتوان با استفاده از پارامتر loop-block-tile-size تغییر داد.
- ipa-jump-function-lookups
- تعداد دستورهایی را که در حین کشف آفست تابع پرش (jump function offset) پیمایش میشوند، مشخص میکند.
- ipa-cp-value-list-size
- بهینهساز IPA-CP تلاش میکند تمام مقادیر و انواع احتمالی ارسالشده به یک پارامتر تابع را ردیابی کند تا آنها را منتشر کرده و مجازیزدایی (devirtualization) را انجام دهد. پارامتر ipa-cp-value-list-size حداکثر تعداد مقادیر و انواعی است که برای هر پارامتر صوری یک تابع ذخیره میکند.
- ipa-cp-eval-threshold
- بهینهساز IPA-CP امتیاز خود را از اکتشافات سودآوری همانندسازی (cloning profitability heuristics) محاسبه کرده و آن دسته از فرصتهای همانندسازی را که امتیازشان از 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 تعداد اجرای اندازهگیریشدهٔ یک یال در نمودار فراخوانی (call graph) را در این موقعیت درصدی در بافتنگار (histogram) آنها، بهعنوان مبنای محاسبات اکتشافی خود در نظر میگیرد.
- ipa-cp-recursive-freq-factor
- تعداد دفعاتی که انتشار رونوشت بینروالی (interprocedural copy propagation) انتظار دارد توابع بازگشتی خود را فراخوانی کنند.
- ipa-cp-recursion-penalty
- جریمهٔ درصدی که توابع بازگشتی هنگام ارزیابی برای همانندسازی دریافت خواهند کرد.
- ipa-cp-single-call-penalty
- جریمهٔ درصدی که توابع شامل یک فراخوانیِ منفرد به تابعی دیگر، هنگام ارزیابی برای همانندسازی دریافت خواهند کرد.
- ipa-max-agg-items
- بهینهساز IPA-CP همچنین قادر است تعدادی از مقادیر اسکالر ارسالشده در یک ساختار تجمیعی (aggregate) را منتشر کند. ipa-max-agg-items حداکثر تعداد چنین مقادیری را به ازای هر پارامتر کنترل میکند.
- ipa-cp-loop-hint-bonus
- هنگامی که IPA-CP تشخیص دهد کاندیدای همانندسازی باعث مشخص شدن تعداد تکرارهای یک حلقه میشود، پاداشی به اندازهٔ ipa-cp-loop-hint-bonus را به امتیاز سودآوری آن کاندیدا اضافه میکند.
- ipa-max-loop-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 case) دستور switch ایجاد نخواهد کرد..IP ipa-max-param-expr-ops 4 تحلیلگر IPA-CP دستور شرطیای را که به پارامتر خاصی از تابع ارجاع دارد تحلیل میکند تا سود حاصل از همانندسازی (cloning) بر اساس یک مقدار ثابت مشخص را تخمین بزند. اما اگر تعداد عملگرها در عبارت پارامتر از ipa-max-param-expr-ops فراتر رود، عبارت به عنوان عبارتی پیچیده در نظر گرفته شده و توسط تحلیل IPA پردازش نمیشود.
- lto-partitions
- تعداد افرازهای (partitions) مطلوبِ تولید شده در هنگام کامپایل WHOPR را مشخص میکند. تعداد افرازها باید از تعداد CPUهای استفادهشده برای کامپایل بیشتر باشد.
- lto-min-partition
- اندازه کمینهی افراز برای WHOPR (بر حسب دستورالعملهای تخمینی). این کار از هزینههای ناشی از تقسیم برنامههای بسیار کوچک به افرازهای بیش از حد جلوگیری میکند.
- lto-max-partition
- اندازه بیشینهی افراز برای WHOPR (بر حسب دستورالعملهای تخمینی)، جهت تعیین یک حد بالا برای اندازه هر افراز مجزا. این گزینه تنها برای استفاده با افرازبندی متوازن در نظر گرفته شده است.
- lto-partition-locality-frequency-cutoff
- مخرج n از کسر 1/n بسامد اجرای فراخواندهشده (callee) جهت همانندسازی برای یک فراخواننده (caller) خاص. مقدار ویژه 0 مشخص میکند که همواره بدون حد آستانه همانندسازی انجام شود.
- 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) که هنگام شکست جستجوی نام 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
- حداکثر تعداد دستورالعملهای اجرا شده به صورت موازی در درخت بازپیوندیشده را تعیین میکند. در صورت داشتن مقداری غیر صفر، این پارامتر بر قواعد اکتشافی وابسته به مقصد که به طور پیشفرض استفاده میشوند، تقدم مییابد.
- sched-pressure-algorithm
- انتخاب بین
دو
پیادهسازی
موجود از
-fsched-pressure.
الگوریتم 1
پیادهسازی
اصلی بوده و
احتمال
بیشتری
دارد که از
بازآرایی
دستورالعملها
جلوگیری
کند.
الگوریتم 2
به عنوان
سازشی میان
رویکرد
نسبتاً
محافظهکارانه
الگوریتم 1
و رویکرد
تقریباً
تهاجمی
زمانبند
پیشفرض
طراحی شده
است. این
الگوریتم
اتکای
بیشتری بر
داشتن یک
فایل ثبات
(register file) منظم و
ردههای
فشار ثبات
دقیق دارد.
برای
جزئیات
بیشتر به
haifa-sched.cc در
منابع GCC
مراجعه
کنید.
انتخاب پیشفرض به مقصد بستگی دارد.
- max-slsr-cand-scan
- حداکثر تعداد کاندیداهای موجود را تعیین میکند که هنگام جستجوی پایه برای یک کاندیدای جدیدِ کاهش توان مستقیمخط (straight-line strength reduction) بررسی میشوند.
- asan-globals
- تشخیص سرریز بافر را برای اشیاء سراسری فعال میکند. این نوع حفاظت در صورت استفاده از گزینه -fsanitize=address به طور پیشفرض فعال است. برای غیرفعالسازی حفاظت از اشیاء سراسری از --param asan-globals=0 استفاده کنید.
- asan-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
- اگر تعداد دسترسیها به حافظه در تابعی که کدگذاری (instrument) میشود بزرگتر یا مساوی این عدد باشد، به جای بررسیهای درونخطی از فراخوانیهای بازگشتی (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
- هنگام استفاده از ابزارمندسازی پشته، برچسبهای متغیرهای پشته را با استفاده از یک توالی قطعی که با یک برچسب تصادفی برای هر فریم آغاز میشود تعیین میکند. با تنظیمنشدن این پارامتر، برچسبها با استفاده از همان توالی اما با شروع از 1 انتخاب میشوند. این مورد به طور پیشفرض برای -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) مستقیماً مسموم (poison) یا رفع مسمومیت (unpoison) میشود.
- 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] خروجی پرگویهٔ (verbose dump) حلکنندهٔ threader را فعال میکند.
- parloops-chunk-size
- اندازهٔ تکه (chunk size) در زمانبندی omp برای حلقههای موازیشده توسط parloops.
- parloops-schedule
- نوع زمانبندی omp برای حلقههای موازیشده توسط parloops (شامل static، dynamic، guided، auto، runtime).
- parloops-min-per-thread
- حداقل تعداد تکرارهای درونیترین حلقهٔ موازیشده به ازای هر رشته (thread) که برای آن، حالت موازیشده بر حالت تکرشتهای ترجیح داده میشود. توجه داشته باشید که برای یک آشیانهٔ حلقهٔ موازیشده، حداقل تعداد تکرارهای بیرونیترین حلقه به ازای هر رشته، دو است.
- max-ssa-name-query-depth
- حداکثر عمق بازگشت هنگام پرسوجوی ویژگیهای نامهای SSA در مواردی مانند روتینهای fold. هر سطح از بازگشت معادل پیمایش یک زنجیرهٔ use-def است.
- max-speculative-devirt-maydefs
- حداکثر تعداد may-defهایی که هنگام جستوجو برای یک must-def تعیینکنندهٔ نوع پویای یک شیء بررسی میشوند؛ شیئی که یک فراخوانی مجازی (virtual call) را فرا میخواند که ممکن است بتوان آن را به صورت حدسی مجازیزدایی (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
- حداکثر هزینهٔ مجاز برای دنبالهای که توسط گذر RTL if-conversion برای یک شاخهٔ غیرقابلپیشبینی تولید میشود.
- max-variable-expansions-in-unroller
- در صورت استفاده از -fvariable-expansion-in-unroller، حداکثر تعداد دفعاتی است که یک متغیر مشخص در طول باز کردن حلقه گسترش مییابد.
- partial-inlining-entry-probability
- حداکثر احتمال بلوک پایهای (BB) ورودی ناحیهٔ تقسیمشده (به درصد نسبت به BB ورودی تابع) برای انجام درونخطسازی جزئی (partial inlining).
- max-tracked-strlens
- حداکثر تعداد رشتههایی که گذر بهینهسازی strlen طول آنها را ردگیری خواهد کرد.
- gcse-after-reload-partial-fraction
- نسبت آستانه برای انجام حذف افزونگی جزئی (partial redundancy elimination) پس از reload.
- gcse-after-reload-critical-fraction
- نسبت آستانهٔ تعداد اجرای یالهای بحرانی که اجازهٔ انجام حذف افزونگی پس از reload را میدهد.
- max-loop-header-insns
- حداکثر تعداد دستورالعملها (insns) در سرآیند حلقه که توسط گذر کپی سرآیند حلقه (copy loop headers) تکثیر میشوند.
- vect-epilogues-nomask
- فعالسازی برداریسازی مؤخرهٔ حلقه با استفاده از بردار با اندازهٔ کوچکتر.
- vect-partial-vector-usage
- کنترل میکند که برداریساز حلقه چه زمانی بارگذاریها و ذخیرهسازیهای برداری جزئی را به عنوان جایگزینی برای بازگشت به کد اسکالر در نظر بگیرد. مقدار 0 برداریساز را از استفاده از بارگذاریها و ذخیرهسازیهای جزئی بردار کاملاً بازمیدارد. مقدار 1 در صورتی بارگذاریها و ذخیرهسازیهای جزئی بردار را مجاز میداند که برداریسازی، نیاز به تکرار کد را برطرف کند. مقدار 2 استفاده از آنها را در تمامی حلقهها مجاز میکند. این پارامتر فقط روی مقصدهایی اثر دارد که از بارگذاریها و ذخیرهسازیهای جزئی بردار پشتیبانی میکنند.
- vect-inner-loop-cost-factor
- حداکثر ضریبی که برداریساز حلقه بر هزینهٔ گزارهها در یک حلقهٔ درونی نسبت به حلقهای که برداریسازی میشود اعمال میکند. ضریب اعمالشده بیشینهٔ تعداد تکرارهای تخمینی حلقه درونی و این پارامتر است. مقدار پیشفرض این پارامتر 50 است.
- vect-induction-float
- فعالسازی برداریسازی حلقه برای متغیرهای القایی ممیز شناور (floating point inductions).
- 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
- تعداد چرخههایی که زمانبند پیمانهای نوسانی هنگام بررسی تداخلها با استفاده از DFA در نظر میگیرد.
- graphite-allow-codegen-errors
- اینکه آیا هنگام فعال بودن -fchecking خطاهای تولید کد (codegen) باید به عنوان خطای داخلی کامپایلر (ICE) تلقی شوند یا خیر.
- sms-max-ii-factor
- ضریبی برای تنظیم حد بالای مورد استفاده توسط زمانبند پیمانهای نوسانی جهت زمانبندی یک حلقه.
- lra-max-considered-reload-pseudos
- حداکثر تعداد ثباتهای مجازی بارگذاری مجدد (reload pseudos) که در حین ریزش (spilling) یک ثبات مجازی غیربارگذاری مجدد در نظر گرفته میشوند.
- 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
- ضریب مقیاس برای اعمال روی تعداد گزارهها در یک مسیر پرش ریسهای که از یک یال بازگشتی (backedge) حلقه عبور میکند، هنگام مقایسه با --param=max-jump-thread-duplication-stmts.
- uninit-control-dep-attempts
- حداکثر تعداد فراخوانیهای تودرتو برای جستوجوی وابستگیهای کنترلی در طول تحلیل متغیرهای مقداردهینشده.
- uninit-max-chain-len
- حداکثر تعداد گزارههای AND شده به ازای هر گزارهٔ OR شده در زنجیرهٔ گزارههای نرمالشده.
- uninit-max-num-chains
- حداکثر تعداد گزارههای OR شده در زنجیرهٔ گزارههای نرمالشده..IP uninit-max-prune-work 4 حداکثر مقدار کاری که برای هرس کردن مسیرهایی که در آنها متغیر همواره مقداردهی اولیه شده است، انجام میشود.
- sched-autopref-queue-depth
- پرچم کنترلی مدل زمانبند پیشواکشی خودکار سختافزاری. تعداد چرخههای روبهجلو که مدل بررسی میکند؛ در ' ' تنها اکتشاف مرتبسازی دستورالعملها فعال میشود.
- loop-versioning-max-inner-insns
- حداکثر تعداد دستورالعملهایی که یک حلقه درونی میتواند داشته باشد، پیش از آنکه گذر نسخهبندی حلقه آن را برای کپی کردن بیش از حد بزرگ در نظر بگیرد.
- loop-versioning-max-outer-insns
- حداکثر تعداد دستورالعملهایی که یک حلقه بیرونی میتواند داشته باشد، پیش از آنکه گذر نسخهبندی حلقه آن را برای کپی کردن بیش از حد بزرگ در نظر بگیرد، بدون احتساب دستورالعملهایی در حلقههای درونی که مستقیماً از نسخهبندی بهرهمند میشوند.
- ssa-name-def-chain-limit
- حداکثر تعداد انتسابهای SSA_NAME برای دنبال کردن جهت تعیین یک ویژگی از متغیر مانند مقدار آن. این گزینه تعداد تکرارها یا فراخوانیهای بازگشتی GCC را هنگام بهینهسازی برخی عبارتها یا هنگام تعیین اعتبار آنها پیش از صدور پیامهای تشخیصی محدود میکند.
- store-merging-max-size
- حداکثر اندازه یک ناحیه ادغام ذخیرهسازی بر حسب بایت.
- store-forwarding-max-distance
- حداکثر فاصله بر حسب تعداد دستورالعمل که یک ذخیرهسازی کوچک هدایتشده به یک بارگذاری بزرگتر ممکن است متوقف شود. مقدار '0' بررسیهای هزینه را برای گذر avoid-store-forwarding غیرفعال میکند.
- hash-table-verification-limit
- تعداد عنصرهایی که راستیآزمایی جدول درهمسازی برای آنها به ازای هر عنصر جستوجوشده انجام میشود.
- max-find-base-term-values
- حداکثر تعداد VALUEهای پردازششده در طول یک فراخوانی find_base_term.
- analyzer-max-enodes-per-program-point
- حداکثر تعداد گرههای منفجرشده به ازای هر نقطه از برنامه در تحلیلگر، پیش از خاتمه دادن به تحلیل آن نقطه.
- analyzer-max-constraints
- حداکثر تعداد محدودیتها در هر وضعیت.
- analyzer-min-snodes-for-call-summary
- حداقل تعداد اَبَرگرهها درون یک تابع تا تحلیلگر خلاصهسازی اثرات آن را در نقاط فراخوانی مد نظر قرار دهد.
- analyzer-max-enodes-for-full-dump
- حداکثر عمق گرههای منفجرشده که باید در یک dot dump ظاهر شوند، پیش از تغییر حالت به قالبی با پرگویی کمتر.
- analyzer-max-recursion-depth
- حداکثر دفعاتی که یک نقطه فراخوانی میتواند در یک پشته فراخوانی درون تحلیلگر ظاهر شود، پیش از آنکه تحلیل فراخوانیای که بازگشت عمیقتری دارد خاتمه یابد.
- analyzer-max-svalue-depth
- حداکثر عمق یک مقدار نمادین، پیش از تقریب زدن مقدار به عنوان نامعلوم.
- analyzer-max-infeasible-edges
- حداکثر تعداد یالهای نشدنی برای رد کردن، پیش از اعلام یک تشخیص به عنوان نشدنی.
- gimple-fe-computed-hot-bb-threshold
- تعداد دفعات اجرای یک بلوک پایه که داغ در نظر گرفته میشود. این پارامتر تنها در GIMPLE FE استفاده میشود.
- analyzer-bb-explosion-factor
- حداکثر تعداد گرههای منفجرشده 'after supernode' درون تحلیلگر به ازای هر اَبَرگره، پیش از پایان دادن به تحلیل.
- analyzer-text-art-string-ellipsis-threshold
- تعداد بایتهایی که در آن رشتههای تحتاللفظی در نمودارهای هنر متنی تحلیلگر کوتاهسازی میشوند.
- 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
- حداقل اندازه صفحه برای اهداف هشدار و برداریسازی با خروج زودهنگام.
- 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 باید فرض کند که توصیف زمانبندی عمدتاً یک مدل چرخهدقیق از پردازنده هدف است که کد قرار است روی آن اجرا شود (در نبود عدمدسترسی به حافظه نهان). مقدار غیرصفر بدین معناست که مدل زمانبندی انتخابشده دقیق است و احتمالاً یک پردازنده ترتیبی را توصیف میکند، و اینکه زمانبندی باید بهطور تهاجمی متغیرها را سرریز کند تا هرگونه حباب خط لوله پر شود. این مقدار پیشفرض فعلی است. مقدار صفر بدین معناست که توصیف زمانبندی ممکن است در دسترس یا دقیق نباشد یا شاید اصلاً قابل اعمال نباشد، مانند پردازندههای نامرتب امروزی.
انتخابهای زیر برای name در مقصدهای AArch64 در دسترس هستند:
- aarch64-vect-compare-costs
- هنگام برداریسازی، استفاده از چندین رویکرد مختلف را بررسی کرده و از مدل هزینه برای انتخاب کمهزینهترین رویکرد استفاده میکند. این شامل موارد زیر است:
- آزمودن هر دو مورد SVE و Advanced SIMD، هنگامی که SVE در دسترس است.
- تلاش برای استفاده از بردارهای ۶۴ بیتی Advanced SIMD برای کوچکترین عناصر داده، به جای استفاده از بردارهای ۱۲۸ بیتی برای همه چیز.
- تلاش برای استفاده از بردارهای SVE «بازنشده» ("unpacked") برای عناصر کوچکتر. این شامل ذخیره عناصر کوچکتر در ظرفهای بزرگتر و دسترسی به عناصر با بارگذاریهای گسترشدهنده و ذخیرهسازیهای کوتاهکننده است.
- aarch64-float-recp-precision
- تعداد تکرارهای نیوتن برای محاسبه معکوس نوع float. هنگامی که تقریب تقسیم فعال باشد، دقت تقسیم متناسب با این پارامتر است. مقدار پیشفرض 1 است.
- aarch64-double-recp-precision
- تعداد تکرارهای نیوتن برای محاسبه معکوس نوع double. هنگامی که تقریب تقسیم فعال باشد، دقت تقسیم متناسب با این پارامتر است. مقدار پیشفرض 2 است.
- aarch64-autovec-preference
- یک راهبرد گزینش ISA را برای برداریسازی خودکار اجبار میکند.
- 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، از سیاست ساختار تنظیمات (tuning structure) استفاده میکند. این مقدار پیشفرض فعلی است. با --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
- پارامتری برای کنترل اینکه در گذر ادغام جفتهای بارگذاری/ذخیرهسازی AArch64 کدام فرصتهای پسنویسی (writeback) مدیریت شوند. مقدار صفر مدیریت پسنویسی را غیرفعال میکند. مقدار یک به این معنی است که در صورت امکان تلاش میشود جفتهایی تشکیل شوند که شامل یک یا چند دسترسی مجزای writeback موجود باشند. مقدار دو به این معنی است که علاوه بر آن تلاش میشود با ادغام بهروزرسانیهای مخرب انتهاییِ ثبات پایه که توسط یک جفت استفاده میشود، فرصتهای writeback به صورت بهینهجویانه ایجاد شوند.
- aarch64-loop-vect-issue-rate-niters
- تنظیمات (tuning) برای برخی از پردازندههای AArch64 تلاش میکند هنگام تصمیمگیری دربارهٔ اینکه یک حلقه باید با استفاده از SVE برداریسازی شود، با Advanced SIMD برداریسازی شود یا اصلاً برداریسازی نشود، هر دو عامل تأخیر (latencies) و نرخ صدور (issue rates) را در نظر بگیرد. اگر این پارامتر روی n تنظیم شود، GCC از این روش شهودی برای حلقههایی که مشخص است در کمتر از n تکرار Advanced SIMD اجرا میشوند، استفاده نخواهد کرد.
- aarch64-vect-unroll-limit
- برداریساز (vectorizer) از اطلاعات تنظیمات موجود برای تعیین اینکه آیا باز کردن حلقهٔ برداریسازیشدهٔ اصلی سودمند است یا خیر و تا چه اندازه، استفاده میکند. این پارامتر حد بالای میزان باز کردن حلقهٔ اصلی توسط برداریساز را تعیین میکند. مقدار پیشفرض چهار است.
گزینههای زیر برای name در مقصدهای GCN موجود هستند:
- gcn-preferred-vectorization-factor
- ضریب برداریسازی ترجیحی: default، 32، 64.
گزینههای زیر برای name در مقصدهای i386 و x86_64 موجود هستند:
- x86-stlf-window-ninsns
- تعداد دستورالعملهایی که بالاتر از آن میتوان جریمهٔ توقف (stall penalty) STFL را جبران کرد.
- x86-stv-max-visits
- حداکثر تعداد بازدیدهای use و def هنگام کشف یک زنجیرهٔ STV پیش از لغو شدن عملیات کشف.
گزینههای ابزارسازی برنامه (Program Instrumentation Options)
کامپایلر GCC از چندین گزینهٔ خط فرمان پشتیبانی میکند که افزودن ابزارسازی زمان اجرا (run-time instrumentation) به کدهایی را که به طور معمول تولید میکند، کنترل مینمایند. برای مثال، یک هدف ابزارسازی، جمعآوری آمار پروفایلسازی برای استفاده در یافتن نقاط داغ برنامه (hot spots)، تحلیل پوشش کد، یا بهینهسازیهای هدایتشده با پروفایل (profile-guided optimizations) است. دستهٔ دیگری از ابزارسازی برنامه، افزودن بررسیهای زمان اجرا برای تشخیص خطاهای برنامهنویسی مانند ارجاع نامعتبر به اشارهگرها یا دسترسیهای خارج از محدودهٔ آرایه، و همچنین حملات مخرب عمدی مانند درهمشکستن پشته (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 پیوند دهید (مورد دوم مستلزم مورد اول است).
- برنامه را
روی یک بار
کاری نمونه
(representative workload) اجرا
کنید تا
اطلاعات
پروفایل arc
تولید شود.
این کار را
میتوان به
هر تعداد
دفعه تکرار
کرد. شما
میتوانید
نمونههای
همروند
برنامهٔ
خود را اجرا
کنید، و تا
زمانی که
سیستم فایل
از
قفلگذاری
پشتیبانی
میکند،
فایلهای
داده به
درستی
بهروزرسانی
خواهند شد.
مگر اینکه
یک گزینهٔ
سختگیرانه
از گویش ISO C
فعال باشد،
فراخوانیهای
"fork"
شناسایی
شده و بدون
شمارش
مضاعف به
درستی
مدیریت
میشوند.
علاوه بر این، یک فایل شیء میتواند چندین بار بازکامپایل شود و تا زمانی که فایل مبدأ و گزینههای کامپایلر بدون تغییر باقی بمانند، فایل .gcda مربوطه ادغام میشود..IP * 4 برای بهینهسازیهای هدایتشده با پروفایل، فایلهای منبع را دوباره با همان گزینههای بهینهسازی و تولید کد بهعلاوهٔ -fbranch-probabilities کامپایل کنید.
- برای تحلیل پوشش آزمون، از gcov برای تولید اطلاعات خوانا برای انسان از فایلهای .gcno و .gcda استفاده کنید. برای اطلاعات بیشتر به مستندات gcov مراجعه کنید.
با -fprofile-arcs، برای هر تابع از برنامهٔ شما، GCC یک گراف جریان برنامه ایجاد میکند، سپس یک درخت پوشا برای گراف پیدا میکند. فقط یالهایی که روی درخت پوشا نیستند باید ابزارگذاری شوند: کامپایلر کدی اضافه میکند تا تعداد دفعات اجرای این یالها را بشمارد. هنگامی که یک یال تنها خروجی یا تنها ورودیِ یک بلوک است، کد ابزارگذاری میتواند به همان بلوک اضافه شود؛ در غیر این صورت، یک بلوک پایهای جدید باید برای نگهداری کد ابزارگذاری ایجاد شود.
با -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
استفاده
میکند،
بنابراین
فایل دادهٔ
پروفایل در
همان
دایرکتوریِ
فایل شیء
ظاهر
میشود.
برای
جلوگیری از
تداخل نام
فایلها،
اگر نام
فایل شیء یک
مسیر مطلق
نباشد،
مسیر مطلق
فایل sourcename.gcda
درهمسازی
(mangle) شده و به
عنوان نام
فایل .gcda
استفاده
میشود.
جزئیات
مربوط به
نامگذاری
فایل را در
-fprofile-arcs ببینید.
گزینهٔ
مشابه -fprofile-note
را نیز
ببینید.
هنگامی که یک فایل اجرایی در یک محیط بسیار موازی اجرا میشود، توصیه میشود که پروفایل در پوشههای متفاوتی ذخیره شود. این کار با متغیرهایی در path که در طول زمان اجرا صادر (export) میشوند امکانپذیر است:
- %p
- شناسه فرایند (PID).
- %q{VAR}
- مقدار متغیر محیطی VAR
- -fprofile-generate
- -fprofile-generate=path
- گزینههایی
را فعال
میکند که
معمولاً
برای
ابزارگذاری
برنامه جهت
تولید
پروفایل
مناسب برای
کامپایل
مجدد بعدی
با
بهینهسازی
مبتنی بر
بازخورد
پروفایل
استفاده
میشوند.
شما باید از
-fprofile-generate هم در
هنگام
کامپایل و
هم در هنگام
پیوند
برنامهٔ
خود
استفاده
کنید.
گزینههای زیر فعال میشوند: -fprofile-arcs، -fprofile-values، -finline-functions و -fipa-bit-cp.
اگر path مشخص شده باشد، GCC برای یافتن فایلهای دادهٔ بازخورد پروفایل به path نگاه میکند. گزینهٔ -fprofile-dir را ببینید.
برای بهینهسازی برنامه بر اساس اطلاعات پروفایل جمعآوریشده، از -fprofile-use استفاده کنید.
- -fprofile-info-section
- -fprofile-info-section=name
- اطلاعات
پروفایل را
به جای
استفاده از
سازنده/ویرانگر
در بخش (section)
مشخصشده
ثبت میکند.
نام بخش در
صورت مشخص
شدن name است،
در غیر این
صورت نام
بخش بهطور
پیشفرض به
".gcov_info"
تعیین
میشود.
برای هر
واحد
ترجمه،
اشارهگری
به اطلاعات
پروفایل
تولیدشده
توسط -fprofile-arcs در
بخش
مشخصشده
قرار
میگیرد.
این گزینه
ثبت
اطلاعات
پروفایل از
طریق
سازنده را
غیرفعال
کرده و
پردازش
اطلاعات
پروفایل از
طریق
ویرانگر را
نیز
غیرفعال
میکند. این
گزینه برای
استفاده در
محیطهای
میزبانیشده
مانند GNU/Linux در
نظر گرفته
نشده است.
این گزینه
محیطهای
خودکفا (freestanding،
مانند
سامانههای
تعبیهشده)
با منابع
محدود را
هدف قرار
میدهد که
از
سازندهها/ویرانگرها
یا
ورودی/خروجی
فایل
کتابخانهٔ C
پشتیبانی
نمیکنند.
پیونددهنده میتواند بخشهای ورودی را در یک بلوک حافظهٔ پیوسته جمعآوری کرده و نمادهای آغاز و پایان را تعریف کند. یک نمونه اسکریپت پیونددهندهٔ GNU که یک بخش خروجیِ پیونددهنده را تعریف میکند به شرح زیر است:
.gcov_info : { PROVIDE (__gcov_info_start = .); KEEP (*(.gcov_info)) PROVIDE (__gcov_info_end = .); }برنامه میتواند اطلاعات پروفایلسازی ثبتشده در این مجموعهٔ پیونددهنده را برای نمونه به این شکل تخلیه کند:
#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 میتواند برای بازسازی دادهها (deserialize) از جریان دادهٔ تولیدشده توسط توابع "__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) نکند (یا یک رشتهی جداشده ایجاد کند)، فایل پروفایل ممکن است همچنان آسیب ببیند.
استفاده از 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
- ابزار Hardware-assisted 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
- ابزار Hardware-assisted
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" عمل نامعتبر را تنها زمانی تشخیص میدهد که هر دو اشارهگر غیرتهی باشند.
- -fsanitize=pointer-subtract
- عملیات
تفریق با
عملوندهای
اشارهگر
را تجهیز
میکند. این
گزینه باید
با -fsanitize=kernel-address یا
-fsanitize=address ترکیب
شود. این
گزینه
نمیتواند
با -fsanitize=thread
ترکیب شود.
توجه: این
بررسی
بهطور
پیشفرض در
زمان اجرا
غیرفعال
است. برای
فعال کردن
آن، مقدار
"detect_invalid_pointer_pairs=2"
را به متغیر
محیطی ASAN_OPTIONS
اضافه کنید.
استفاده از
"detect_invalid_pointer_pairs=1"
عمل
نامعتبر را
تنها زمانی
تشخیص
میدهد که
هر دو
اشارهگر
غیرتهی
باشند..IP
-fsanitize=shadow-call-stack 4
فعالسازی
ShadowCallStack،
سازوکاری
برای
ارتقای
امنیت که به
منظور
محافظت از
برنامهها
در برابر
بازنویسی
آدرس
بازگشت
(مانند
سرریزهای
بافر پشته)
استفاده
میشود.
شیوه کار آن
ذخیره کردن
آدرس
بازگشت یک
تابع در یک
پشته
فراخوانی
سایه (shadow call stack)
مجزا در
مقدمه تابع
(function prologue) و
بازیابی
آدرس
بازگشت از
پشته
فراخوانی
سایه در
مؤخره تابع
(function epilogue) است.
ابزارگذاری
تنها در
توابعی رخ
میدهد که
نیاز به
ذخیره آدرس
بازگشت در
پشته دارند.
در حال حاضر این ویژگی تنها از معماری aarch64 پشتیبانی میکند و بهطور ویژه برای هستههای لینوکسی طراحی شده است که گزینه CONFIG_SHADOW_CALL_STACK را فعال کرده باشند. برای برنامههای فضای کاربری (user space)، در حال حاضر پشتیبانی زمان اجرا در 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
- این گزینه بررسی منفی نبودن آرگومان دوم عملیات شیفت و کوچکتر بودن آن از دقت (precision) آرگومان اولِ ارتقایافته را فعال میکند.
- -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
- این گزینه بررسی اشارهگر را فعال میکند. بهطور خاص، برنامهای که با این گزینه ساخته شود هنگام تلاش برای ارجاعزدایی (dereference) از یک اشارهگر NULL، یا در صورتی که یک مرجع (احتمالاً یک مرجع 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)، آرایههای شبهعضو آرایه انعطافپذیر، و مقداردهندههای اولیه متغیرهای با حافظه سراسری/ایستا ابزارگذاری نمیشوند؛ به استثنای آرایههای شبهعضو آرایه انعطافپذیر که گزینههای "-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 فعال نمیشود، زیرا تقسیم ممیز شناور بر صفر میتواند روشی مجاز برای دستیابی به مقادیر بینهایت و NaN باشد.
- -fsanitize=float-cast-overflow
- این گزینه بررسی تبدیل نوع ممیز شناور به عدد صحیح را فعال میکند. بررسی میشود که نتیجه تبدیل سرریز نکند. بر خلاف گزینههای مشابه دیگر، -fsanitize=float-cast-overflow توسط -fsanitize=undefined فعال نمیشود. این گزینه با فعال بودن استثناهای "FE_INVALID" به خوبی کار نمیکند.
- -fsanitize=nonnull-attribute
- این گزینه ابزارگذاری فراخوانیها را فعال میکند، و بررسی مینماید که مقادیر null به آرگومانهایی که توسط مشخصه تابعی "nonnull" به عنوان نیازمند مقدار غیر null تعیین شدهاند ارسال نشوند.
- -fsanitize=returns-nonnull-attribute
- این گزینه ابزارگذاری دستورهای بازگشت را در توابعی که با مشخصه تابعی "returns_nonnull" علامتگذاری شدهاند فعال میکند، تا بازگرداندن مقادیر null از چنین توابعی شناسایی شود.
- -fsanitize=bool
- این گزینه ابزارگذاری بارگذاریها از bool را فعال میکند. اگر مقداری غیر از 0 یا 1 بارگذاری شود، خطای زمان اجرا صادر میگردد.
- -fsanitize=enum
- این گزینه ابزارگذاری بارگذاریها از یک نوع enum را فعال میکند. اگر مقداری خارج از محدوده مقادیر مجاز برای آن نوع enum بارگذاری شود، خطای زمان اجرا صادر میگردد.
- -fsanitize=vptr
- این گزینه ابزارگذاری فراخوانی توابع عضو C++، دسترسی به اعضا و برخی تبدیلهای بین اشارهگرها به کلاسهای پایه و مشتقشده را فعال میکند، تا تأیید شود که شیء ارجاعشده نوع پویای (dynamic type) درستی دارد..IP -fsanitize=pointer-overflow 4 این گزینه ابزارگذاری (instrumentation) محاسبات اشارهگر را فعال میکند. اگر محاسبات اشارهگر سرریز کند، یک خطای زمان اجرا صادر میشود.
- -fsanitize=builtin
- این گزینه ابزارگذاری آرگومانهای توابع توکار (builtin) منتخب را فعال میکند. اگر مقدار نامعتبری به چنین آرگومانهایی ارسال شود، یک خطای زمان اجرا صادر میگردد. برای مثال، ارسال 0 بهعنوان آرگومان به "__builtin_ctz" یا "__builtin_clz" رفتار تعریفنشده ایجاد کرده و توسط این گزینه تشخیص داده میشود.
توجه داشته باشید که ضدعفونیکنندهها تمایل دارند نرخ هشدارهای مثبت کاذب (false positive) را افزایش دهند، بهویژه مواردی که پیرامون -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,...
- متغیرهای سراسری را در بخشهای منتخبِ تعریفشده توسط کاربر پالایش و اعتبارسنجی میکند. 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" در متغیر محیطی متناظر لغو (override) کرد.
نحو این گزینه بدون یک پارامتر صریح 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" نیازی نیست و به برنامه پیوند (link) داده نمیشود؛ بنابراین حتی در محیطهای مستقل (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" را در هر بلوک پایه (basic block) درج میکند.
- -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
- کد اضافی
تولید
میکند تا
هنگام ورود
به
بلوکهای
پایه (basic blocks)،
متغیرهای
بولی تنظیم
شوند، و
هنگام خروج
از تابع،
چنانچه
مقادیر
بولی مسیر
اجرایی
سازگار با
گراف جریان
کنترل (control flow graph)
تشکیل
ندهند، عمل
وارسی
انجام شده و
تله (trap) فعال
شود.
وارسی پیش از بازگشتها، پیش از فراخوانیهای انتهایی اجباری (زیر را ببینید) و بهصورت اختیاری پیش از خروج استثناها با -fhardcfr-check-exceptions، پیش از فراخوانیهای بازگشتی با -fhardcfr-check-returning-calls، و پیش از فراخوانیهای noreturn با -fhardcfr-check-noreturn-calls) صورت میپذیرد. گزینههای تنظیمات --param hardcfr-max-blocks و --param hardcfr-max-inline-blocks در دسترس هستند.
بهینهسازی فراخوانی انتهایی (tail call optimization) بسیار دیرتر از آن انجام میشود که افزونگی جریان کنترل را تحت تأثیر قرار دهد، اما فراخوانیهایی که توسط پیشانه (front-end) زبان به عنوان فراخوانیهای انتهایی اجباری نشانهگذاری شدهاند، و هر فراخوانی که به اندازه کافی زود به عنوان فراخوانی انتهایی بالقوه علامتگذاری شده باشد نیز عمل وارسی را پیش از فراخوانی صادر خواهند کرد؛ اما این احتمالات صرفاً نظری هستند، چرا که این شرایط تنها هنگام استفاده از پلاگینهای سفارشی کامپایلر ممکن است رخ دهند.
- -fhardcfr-skip-leaf
- غیرفعال کردن -fharden-control-flow-redundancy در توابع برگ (leaf functions).
- -fhardcfr-check-exceptions
- هنگامی که -fharden-control-flow-redundancy فعال باشد، مسیر اجرایی ثبتشده را در نقاط فرار استثنا در برابر گراف جریان کنترل بررسی میکند؛ گویی بدنه تابع با یک کنترلکننده پاکسازی (cleanup handler) احاطه شده که وارسی را انجام داده و استثنا را دوباره برمیانگیزد (reraise). این گزینه بهطور پیشفرض فعال است؛ برای غیرفعال کردن آن از -fno-hardcfr-check-exceptions استفاده کنید.
- -fhardcfr-check-returning-calls
- هنگامی که
-fharden-control-flow-redundancy فعال
باشد، مسیر
اجرایی
ثبتشده را
در برابر
گراف جریان
کنترل، پیش
از هر
فراخوانی
تابعی که
بلافاصله
با
بازگرداندن
نتیجه آن
(در صورت
وجود) دنبال
میشود،
وارسی
میکند تا
مانع
بهینهسازی
فراخوانی
انتهایی (tail-call)
نشود،
صرفنظر از
اینکه آیا
در نهایت به
فراخوانی
انتهایی
بهینهسازی
میشود یا
خیر.
این گزینه هر زمان که بهینهسازیهای فراخوانی برادر (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" با کنترلکننده پاکسازی که بهطور ضمنی اضافه شده خودداری میکند، زیرا با وارسی انجامشده پیش از فراخوانی تکراری و زائد خواهد بود؛ اما سایر کنترلکنندهها یا پاکسازیها در تابع، در صورت فعال شدن، مسیر اجرایی ثبتشده را تغییر داده و با رسیدن به یک نقطه وارسی (checkpoint) دیگر مجدداً آن را وارسی میکنند. این نقطه وارسی حتی ممکن است فراخوانی "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 builds) در نظر گرفته شده است، نه صرفاً در ساختهای اشکالزدایی (debug builds).
در حال حاضر، -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
- کدی تولید
میکند تا
وارسی کند
که از مرز
پشته فراتر
نروید.
چنانچه در
محیطی با
چندین نخ (thread)
اجرا
میشوید
باید این
پرچم را
مشخص کنید،
اما در یک
محیط
تکنخی
بهندرت
نیاز به
تعیین آن
دارید،
زیرا در
صورت وجود
تنها یک
پشته،
سرریز پشته
در تقریباً
تمامی
سیستمها
بهطور
خودکار
شناسایی
میشود.
توجه داشته باشید که این گزینه در عمل باعث انجام وارسی نمیشود؛ سیستمعامل یا زمان اجرای زبان (runtime) باید این کار را انجام دهند. این گزینه باعث تولید کدی میشود تا اطمینان حاصل شود که آنها متوجه گسترش پشته میشوند.
میتوانید علاوه بر این یک پارامتر رشتهای مشخص کنید: no به معنای عدم بررسی، generic به معنای اجبار به استفاده از بررسی به سبک قدیمی، و specific به معنای استفاده از بهترین روش بررسی است و با -fstack-check بدون پارامتر معادل است.
بررسی به سبک قدیمی (old-style) سازوکاری عمومی است که نیازی به پشتیبانی اختصاصی برای مقصد در کامپایلر ندارد، اما معایب زیر را به همراه دارد:
- 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 کار کند.
میتوانید با استفاده از صفت تابع "no_stack_limit"، بررسی محدودیت پشته را بهصورت محلی لغو کنید.
- -fsplit-stack
- تولید کدی
برای تقسیم
خودکار
پشته پیش از
سرریز شدن
آن. برنامهٔ
حاصل دارای
پشتهای
ناپیوسته
خواهد بود
که تنها در
صورتی
میتواند
سرریز شود
که برنامه
قادر به
تخصیص
حافظهٔ
بیشتری
نباشد. این
ویژگی
بیشترین
کاربرد را
هنگام
اجرای
برنامههای
چندنخی
دارد، زیرا
دیگر نیازی
به محاسبهٔ
اندازهٔ
مناسب پشته
برای هر نخ
نخواهد بود.
این قابلیت
در حال حاضر
تنها برای
مقصدهای x86
در حال اجرا
روی GNU/Linux
پیادهسازی
شده است.
هنگامی که کد کامپایلشده با -fsplit-stack کدی را فراخوانی میکند که بدون -fsplit-stack کامپایل شده است، ممکن است فضای پشتهٔ زیادی برای اجرای کد دوم در دسترس نباشد. اگر کامپایل تمام کدها، از جمله کدهای کتابخانهای، با -fsplit-stack امکانپذیر نباشد، پیونددهنده میتواند این فراخوانیها را اصلاح کند تا کدی که بدون -fsplit-stack کامپایل شده است همواره پشتهٔ بزرگی در اختیار داشته باشد. پشتیبانی از این قابلیت در پیونددهندهٔ gold در نگارش ۲.۲۱ و بعدتر از GNU binutils پیادهسازی شده است.
- -fstrub=disable
- غیرفعال کردن کامل پاکسازی پشته (strub) و نادیده گرفتن هرگونه صفت "strub". ببینید
- -fstrub=strict
- حالت پیشفرض توابع به حالت "disabled" برای "strub" تنظیم میشود، و این محدودیت بهصورت سختگیرانه اعمال میشود که تنها توابع مرتبط با حالتهای "strub"-"callable" (شامل "at-calls"، "callable" و "always_inline" "internal") توسط توابعی با حالتهای فعالشدهٔ "strub" ("at-calls" و "internal") قابلفراخوانی ("callable") باشند.
- -fstrub=relaxed
- بازگردانی تنظیمات پیشفرض پاکسازی پشته ("strub")؛ به این معنا که "strub" تنها طبق صفتهای "strub" مرتبط با توابع و انواع دادهها فعال میشود. "Relaxed" بدین معناست که زمینههای strub تنها از فراخوانی توابعی بازداشته میشوند که صراحتاً با حالت "strub" از نوع "disabled" مرتبط شدهاند. این گزینه تنها برای باطل کردن سایر گزینههای -fstrub=* که پیش از آن در خط فرمان آمدهاند مفید است.
- -fstrub=at-calls
- فعالسازی حالت "strub" با "at-calls" در صورت امکانپذیر بودن. کاربرد اصلی این گزینه برای آزمایش است. این گزینه سازوکار "strub" را در سناریوهایی که کاملاً محلی برای یک واحد ترجمه هستند میآزماید. این حالتِ "strub"، رابطهای توابع را تغییر میدهد؛ بنابراین هر تابعی که برای سایر واحدهای ترجمه قابلمشاهده باشد، یا آدرس آن گرفته شده باشد، تحت تأثیر این گزینه قرار نخواهد گرفت. گزینههای بهینهسازی نیز ممکن است بر امکانپذیری تأثیر بگذارند. برای جزئیات شرایط امکانپذیری و شایستگی، به مستندات صفت "strub" مراجعه کنید.
- -fstrub=internal
- فعالسازی حالت "strub" با "internal" در صورت امکانپذیر بودن. کاربرد اصلی این گزینه برای آزمایش است. این گزینه در نظر دارد بخشهایی از سازوکار "strub" را که حالت کمبازدهتر اما حفظکنندهٔ رابطِ "strub" را پیادهسازی میکنند، بهطور دقیق بیازماید. توابعی که تحت تأثیر این گزینه قرار نگیرند، بسیار نادر هستند.
- -fstrub=all
- فعالسازی یکی از حالتهای "strub" در صورت امکانپذیر بودن. هرگاه هر دو حالت strub امکانپذیر باشند، "at-calls" ترجیح داده میشود. گزینهٔ -fdump-ipa-strubm صفتهایی به توابع اضافه میکند که مشخص میسازد کدام حالت برای هر تابع انتخاب شده است. کاربرد اصلی این گزینه برای آزمایش و آزمودن دقیق سازوکار "strub" است.
- -fvtable-verify=[std|preinit|none]
- این گزینه
تنها هنگام
کامپایل کد
++C در دسترس
است. این
گزینه
قابلیت
امنیتیای
را فعال (یا
در صورت
استفاده از
-fvtable-verify=none
غیرفعال)
میکند که
در زمان
اجرا، برای
هر
فراخوانی
مجازی،
بررسی
میکند که
آیا
اشارهگر 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
در صورت
تعریف
بودن، یا در
دایرکتوری
کاری فعلی
در غیر این
صورت نوشته
میشود.
نکته: این ویژگی دادهها را به فایل گزارش الحاق میکند. اگر یک فایل گزارش تازه میخواهید، حتماً هر فایل موجود قبلی را حذف کنید.
- -fvtv-counts
- این یک پرچم
اشکالزدایی
است. هنگامی
که همراه با
-fvtable-verify=std یا -fvtable-verify=preinit
استفاده
شود، باعث
میشود
کامپایلر
تعداد کل
فراخوانیهای
مجازی که با
آنها
مواجه
میشود و
تعداد
اعتبارسنجیهایی
که درج
میکند را
پیگیری
نماید.
همچنین
تعداد
فراخوانیهای
درجشده به
توابع
کتابخانهای
زمان اجرای
خاص را
میشمارد و
این
اطلاعات را
برای هر
واحد
کامپایل
ثبت میکند.
کامپایلر
این
اطلاعات را
در فایلی به
نام vtv_count_data.log در
دایرکتوری
مشخصشده
توسط متغیر
محیطی VTV_LOGS_DIR
در صورت
تعریف
بودن، و در
غیر این
صورت در
دایرکتوری
کاری فعلی
مینویسد.
همچنین
اندازهٔ
مجموعههای
اشارهگر vtable
را برای هر
کلاس
میشمارد،
و این
اطلاعات را
در vtv_class_set_sizes.log در
همان
دایرکتوری
مینویسد.
نکته: این ویژگی دادهها را به فایلهای گزارش الحاق میکند. برای داشتن فایلهای گزارش تازه، حتماً فایلهای موجود قبلی را حذف کنید.
- -finstrument-functions
- تولید
فراخوانیهای
سنجش
عملکرد
برای ورود و
خروج به
توابع.
دقیقاً پس
از ورود به
تابع و
دقیقاً پیش
از خروج از
تابع،
توابع
تحلیل
کارایی زیر
با آدرس
تابع فعلی و
محل
فراخوانی
آن صدا زده
میشوند.
(در برخی
بسترها،
"__builtin_return_address"
فراتر از
تابع فعلی
عمل
نمیکند،
بنابراین
اطلاعات
محل
فراخوانی
ممکن است در
غیر این
صورت برای
توابع
تحلیل
کارایی در
دسترس
نباشد.)
void __cyg_profile_func_enter (void *this_fn, void *call_site); void __cyg_profile_func_exit (void *this_fn, void *call_site);آرگومان اول آدرس نقطهٔ آغاز تابع فعلی است که میتواند دقیقاً در جدول نمادها جستجو شود.
این سنجش عملکرد برای توابعی که درون توابع دیگر بهصورت درونخطی (inline) بسط یافتهاند نیز انجام میشود. فراخوانیهای تحلیل کارایی نشان میدهند که از نظر مفهومی چه زمانی به تابع درونخطی وارد شده و از آن خارج میشویم. این بدین معناست که باید نسخههای آدرسپذیر از چنین توابعی در دسترس باشند. اگر تمام استفادههای شما از یک تابع بهصورت درونخطی بسط داده شده باشند، این امر ممکن است منجر به افزایش اندازهٔ کد شود. اگر در کد C خود از "extern inline" استفاده میکنید، باید نسخهای آدرسپذیر از چنین توابعی ارائه شود. (این مورد معمولاً در هر حالتی برقرار است، اما اگر خوششانس باشید و بهینهساز همیشه توابع را بهصورت درونخطی بسط دهد، ممکن است بدون ارائهٔ رونوشتهای ایستا از آن گذشته باشید.)
میتوان به یک تابع صفت "no_instrument_function" داد، که در این صورت این سنجش عملکرد انجام نمیشود. از این قابلیت میتوان برای نمونه، برای توابع تحلیل کارایی ذکرشده در بالا، روالهای وقفه با اولویت بالا و هر تابعی که نمیتوان توابع تحلیل کارایی را بهصورت امن از آن فراخوانی کرد (شاید گردانندههای سیگنال، در صورتی که روالهای تحلیل خروجی تولید کنند یا حافظه تخصیص دهند) استفاده کرد.
- -finstrument-functions-once
- این گزینه
شبیه به
-finstrument-functions است،
با این
تفاوت که
توابع
تحلیل
کارایی
تنها یک بار
به ازای هر
تابع
سنجیدهشده
فراخوانی
میشوند؛
بدین معنا
که تابع
تحلیل
کارایی اول
پس از اولین
ورود به
تابعِ
سنجیدهشده
فراخوانی
میشود و
تابع تحلیل
کارایی دوم
پیش از خروج
متناظر با
این ورود
نخست صدا
زده میشود.
تعریف "once" (یک بار) برای منظور این گزینه تا حدی مبهم است زیرا پیادهسازی در برابر رقابتهای دادهای محافظت نشده است. در نتیجه، پیادهسازی تنها تضمین میکند که توابع تحلیل کارایی حداقل یک بار به ازای هر فرایند و حداکثر یک بار به ازای هر نخ فراخوانی شوند، اما فراخوانیها همواره جفت هستند؛ به این معنا که اگر نخی تابع نخست را فراخوانی کند، تابع دوم را نیز فراخوانی خواهد کرد، مگر اینکه هرگز به نقطهٔ خروج از تابع سنجیدهشده نرسد..IP -finstrument-functions-exclude-file-list=file,file,... 4 فهرست توابعی را که باید از ابزارگذاری مستثنی شوند تعیین میکند (توضیحات مربوط به -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> &)"، نه نام درهمریخته (mangled) داخلی (مانند "_Z4blahRSt6vectorIiSaIiEE"). تطبیق روی زیررشتهها صورت میگیرد: اگر پارامتر sym زیررشتهای از نام تابع باشد، تطابق در نظر گرفته میشود. برای شناسههای گسترشیافته C99 و ++C، نام تابع باید به صورت UTF-8 ارائه شود، نه با استفاده از نامهای نویسه عمومی (universal character names).
- -fpatchable-function-entry=N[,M]
- تعداد N
دستور NOP را
دقیقاً در
ابتدای هر
تابع تولید
میکند، به
طوری که
نقطه ورود
تابع پیش از
Mاُمین NOP
قرار
میگیرد.
اگر M حذف
شود، مقدار
پیشفرض آن
0 خواهد
بود،
بنابراین
نقطه ورود
تابع
دقیقاً به
آدرس اولین
NOP اشاره
میکند.
دستورالعملهای
NOP فضای
اضافی را
رزرو
میکنند که
در صورت
قابلنوشتن
بودن سگمنت
کد،
میتواند
برای
وصلهزدن
هر
ابزارگذاری
دلخواهی در
زمان اجرا
به کار رود.
میزان این
فضا به طور
غیرمستقیم
از طریق
تعداد NOPها
قابل کنترل
است؛ دستور
NOP
استفادهشده
متناظر با
دستوری است
که توسط
رابط باطنی
(back-end) داخلی GCC
یعنی
"gen_nop"
تولید
میشود. این
رفتار
وابسته به
معماری
مقصد (target-specific)
است و
همچنین
ممکن است به
نوع معماری
و/یا دیگر
گزینههای
کامپایل
بستگی
داشته باشد.
برای شناسایی در زمان اجرا، آدرسهای شروع این نواحی، که متناظر با نقطه ورود توابع مربوطه منهای M هستند، علاوه بر این در بخش "__patchable_function_entries" از فایل باینری حاصل جمعآوری میشوند.
توجه داشته باشید که مقدار "__attribute__ ((patchable_function_entry (N,M)))" بر گزینه خط فرمان -fpatchable-function-entry=N,M اولویت دارد. این ویژگی میتواند برای افزایش اندازه ناحیه یا حذف کامل آن در یک تابع منفرد به کار رود. اگر "N=0" باشد، هیچ مکانی برای لایهگذاری ثبت نمیشود.
دستورالعملهای NOP در آدرس ورود تابع - و شاید بسته به M، قبل از آن - حتی قبل از پرولوگ (prologue) درج میشوند. در PowerPC با رابط ELFv2 ABI، برای تابعی با نقاط ورود دوگانه، نقطه ورود محلی به طور پیشفرض همان آدرس ورود تابع است. برای تغییر این مورد گزینه -msplit-patch-nops را ببینید.
حداکثر مقدار N و M برابر با 65535 است. در PowerPC با ELFv2 ABI، برای تابعی با نقاط ورود دوگانه، مقادیر پشتیبانیشده برای M در صورت عدم استفاده از -msplit-patch-nops عبارتند از 0، 2، 6 و 14.
گزینههای کنترل پیشپردازنده (Options Controlling the Preprocessor)
این گزینهها پیشپردازنده C را کنترل میکنند، که پیش از کامپایل واقعی روی هر فایل منبع C اجرا میشود.
اگر از گزینه -E استفاده کنید، هیچ عملیاتی به جز پیشپردازش انجام نمیشود. برخی از این گزینهها تنها در کنار -E کاربرد دارند زیرا باعث میشوند خروجی پیشپردازنده برای کامپایل واقعی نامناسب باشد.
علاوه بر گزینههای فهرستشده در اینجا، تعدادی گزینه برای کنترل مسیرهای جستجوی فایلهای ضمیمه وجود دارد که در Directory Options مستند شدهاند. گزینههای کنترل پیامهای خطایابی و هشدارهای پیشپردازنده در Warning Options فهرست شدهاند.
- -D name
- نام name را به عنوان یک ماکرو با مقدار پیشفرض 1 از پیش تعریف میکند.
- -D name=definition
- محتوای definition
نشانهگذاری
(tokenize) شده و به
گونهای
پردازش
میشود که
گویی در فاز
سوم ترجمه
درون یک
دستورالعمل
#define ظاهر شده
است.
بهویژه،
این تعریف
با
نویسههای
خط جدیدِ
تعبیهشده
بریده (truncate)
میشود.
اگر پیشپردازنده را از یک شل یا برنامهای مشابه فراخوانی میکنید، ممکن است نیاز باشد از نحو نقلقول (quoting) شل برای محافظت از نویسههایی مانند فاصلهها که در نحو شل معنای خاصی دارند، استفاده کنید.
اگر میخواهید یک ماکروی شبهتابع (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 داده شود، فایلها به همان ترتیبی که در خط فرمان ظاهر شدهاند گنجانده میشوند.
- -imacros file
- دقیقاً
مانند -include
عمل
میکند، با
این تفاوت
که هرگونه
خروجی حاصل
از پویش file
دور ریخته
میشود.
ماکروهایی
که تعریف
میکند
همچنان
تعریفشده
باقی
میمانند.
این گزینه
به شما
امکان
میدهد
تمام
ماکروها را
از یک
سرآیند
دریافت
کنید بدون
آنکه نیاز
به پردازش
اعلانات (declarations)
آن باشد.
تمام فایلهای مشخصشده توسط -imacros پیش از تمام فایلهای مشخصشده توسط -include پردازش میشوند.
- -undef
- هیچ ماکروی مختص سیستم یا مختص GCC را از پیش تعریف نمیکند. ماکروهای استاندارد از پیش تعریفشده همچنان تعریفشده باقی میمانند.
- -pthread
- ماکروهای اضافی مورد نیاز برای استفاده از کتابخانه ریسههای POSIX را تعریف میکند. باید از این گزینه به طور هماهنگ هم برای کامپایل و هم برای پیوند (linking) استفاده کنید. این گزینه در مقصدهای GNU/Linux، اکثر مشتقات دیگر یونیکس، و همچنین در مقصدهای x86 Cygwin و MinGW پشتیبانی میشود.
- -M
- به جای
خروجی دادن
نتیجه
پیشپردازش،
یک قاعده
مناسب برای
make تولید
میکند که
وابستگیهای
فایل منبع
اصلی را
توصیف
میکند.
پیشپردازنده
یک قاعده make
شامل نام
فایل شیء (object file)
برای آن
فایل منبع،
یک دونقطه،
و نامهای
تمام
فایلهای
گنجاندهشده
(از جمله
فایلهای
ناشی از
گزینههای
خط فرمان -include
یا -imacros) را
خروجی
میدهد.
مگر اینکه به صراحت مشخص شده باشد (با -MT یا -MQ)، نام فایل شیء شامل نام فایل منبع است که پسوند آن با پسوند فایل شیء جایگزین شده و هر بخش دایرکتوری ابتدایی آن حذف شده است. اگر تعداد فایلهای گنجاندهشده زیاد باشد، قاعده با استفاده از \-newline به چندین خط شکسته میشود. این قاعده هیچ دستوری ندارد.
این گزینه خروجی اشکالزدایی پیشپردازنده مانند -dM را غیرفعال نمیکند. برای جلوگیری از آمیخته شدن چنین خروجی اشکالزدایی با قواعد وابستگی، باید صراحتاً فایل خروجی وابستگی را با -MF مشخص کنید، یا از متغیر محیطی مانند DEPENDENCIES_OUTPUT استفاده نمایید. خروجی اشکالزدایی همچنان طبق روال معمول به جریان خروجی استاندارد فرستاده میشود.
ارسال -M به درایور مستلزم -E است، و هشدارها را با یک -w ضمنی نادیده میگیرد.
- -MM
- مانند -M
عمل میکند
اما
فایلهای
سرآیندی را
که در
دایرکتوریهای
سرآیند
سیستم یافت
میشوند، و
همچنین
فایلهای
سرآیندی را
که به طور
مستقیم یا
غیرمستقیم
از چنین
سرآیندی
گنجانده
شدهاند را
ذکر
نمیکند.
این بدان معناست که انتخاب پرانتزهای زاویهدار (<>) یا نقلقول دوتایی ("") در یک دستورالعمل #include به خودی خود تعیین نمیکند که آیا آن سرآیند در خروجی وابستگی -MM ظاهر میشود یا خیر.
- -MF file
- هنگامی که
با -M یا -MM
استفاده
شود، فایلی
را برای
نوشتن
وابستگیها
در آن مشخص
میکند. اگر
هیچ سوئیچ
-MF مشخص
نشود،
پیشپردازنده
قواعد را به
همان جایی
میفرستد
که خروجی
پیشپردازششده
را ارسال
میکرد.
هنگامی که همراه با گزینههای درایور -MD یا -MMD استفاده شود، -MF فایل خروجی وابستگی پیشفرض را بازنویسی میکند.
اگر 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
- هدف (target)
قاعدهای
را که با
تولید
وابستگی
صادر
میشود
تغییر
میدهد.
بهطور
پیشفرض، CPP
نام فایل
ورودی اصلی
را
میگیرد،
هرگونه
مؤلفههای
دایرکتوری
و هر پسوند
فایل مانند
.c را حذف
میکند، و
پسوند
معمول فایل
شیء سکو را
به آن الحاق
میکند.
نتیجه، هدف
خواهد بود.
گزینهٔ -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
ضمنی نیست.
درایور file
را بر اساس
اینکه
گزینهٔ -o
داده شده
است یا خیر
تعیین
میکند. اگر
داده شده
باشد،
درایور از
آرگومان آن
اما با
پسوند .d
استفاده
میکند، در
غیر این
صورت نام
فایل ورودی
را
میگیرد،
مؤلفههای
دایرکتوری
و پسوند آن
را حذف
میکند، و
پسوند .d را
اعمال
مینماید.
اگر -MD همراه با -E استفاده شود، هر سوییچ -o به این صورت درک میشود که فایل خروجی وابستگی را مشخص میکند، اما اگر بدون -E استفاده شود، هر -o برای مشخص کردن یک فایل شیء هدف فهمیده میشود.
از آنجا که -E ضمنی نیست، -MD میتواند برای تولید یک فایل خروجی وابستگی بهعنوان یک اثر جانبی از فرآیند کامپایل استفاده شود.
- -MMD
- مانند -MD است با این تفاوت که فقط فایلهای سرایند کاربر ذکر میشوند، نه فایلهای سرایند سیستم.
- -fpreprocessed
- به
پیشپردازنده
نشان
میدهد که
فایل ورودی
قبلاً
پیشپردازش
شده است.
این کار
مواردی
مانند بسط
ماکرو،
تبدیل
سهنگارهها،
پیوند خطوط
جدید گریز
دادهشده،
و پردازش
بیشتر
دستورالعملها
را سرکوب
میکند.
پیشپردازنده
همچنان
توضیحها
(comments) را تشخیص
داده و حذف
میکند،
بنابراین
میتوانید
فایلی را که
با -C
پیشپردازش
شده است
بدون مشکل
به
کامپایلر
ارسال کنید.
در این
حالت،
پیشپردازندهٔ
یکپارچه
چیزی بیش از
یک
نشانهگذار
(tokenizer) برای
فرانتاندها
نیست.
اگر فایل ورودی یکی از پسوندهای .i، .ii یا .mi را داشته باشد، -fpreprocessed بهطور ضمنی فعال است. اینها پسوندهایی هستند که GCC برای فایلهای پیشپردازششدهٔ ایجادشده توسط -save-temps استفاده میکند.
- -fdirectives-only
- هنگام
پیشپردازش،
دستورالعملها
را مدیریت
میکند،
اما
ماکروها را
بسط
نمیدهد.
رفتار این گزینه به گزینههای -E و -fpreprocessed بستگی دارد.
با -E، پیشپردازش به رسیدگی به دستورالعملهایی مانند "#define"، "#ifdef" و "#error" محدود میشود. سایر عملیاتهای پیشپردازنده، مانند بسط ماکرو و تبدیل سهنگارهها انجام نمیشوند. علاوه بر این، گزینهٔ -dD بهطور ضمنی فعال میشود.
با -fpreprocessed، تعریف پیشفرض ماکروهای خط فرمان و اکثر ماکروهای توکار غیرفعال میشود. ماکروهایی مانند "__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 را تعیین میکند. پیشفرض 200 است.
- -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 "..." جستجو میکند؛ همچنین میتوانید بهطور صریح system را برای مسیر جستجوی "#include <...>" مشخص کنید.
- -ftabstop=width
- فاصلهٔ بین ایستگاههای تب را تعیین میکند. این کار به پیشپردازنده کمک میکند تا شماره ستونهای صحیحی را در هشدارها یا خطاها گزارش کند، حتی اگر تبها در خط وجود داشته باشند. اگر مقدار کمتر از 1 یا بیشتر از 100 باشد، گزینه نادیده گرفته میشود. مقدار پیشفرض 8 است.
- -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 استفاده کرد که میتواند منجر به ساختهای بازتولیدپذیرتری شود که مستقل از مکان هستند. این گزینه همچنین بر "__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" و ترتیب بایتِ بزرگپایان یا کوچکپایان مورد استفاده برای تولید کد مطابقت داشته باشد. همانند -fexec-charset، مقدار charset میتواند هر کدگذاری پشتیبانیشده توسط تابع کتابخانهای "iconv" سیستم باشد؛ با این حال، با کدگذاریهایی که دقیقاً در "wchar_t" جا نمیشوند دچار مشکل خواهید شد..IP -finput-charset=charset 4 مجموعهنویسه ورودی را تعیین میکند که برای تبدیل از مجموعهنویسه فایل ورودی به مجموعهنویسه مبدأ استفادهشده توسط GCC به کار میرود. اگر لوکال (locale) آن را مشخص نکند، یا 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
- تولید نشانگرهای خط (linemarkers) را در خروجی پیشپردازنده فعال میکند که به کامپایلر اجازه میدهد دایرکتوری کاری فعلی در زمان پیشپردازش را بداند. هنگامی که این گزینه فعال است، پیشپردازنده پس از نشانگر خط اولیه، یک نشانگر خط دوم با دایرکتوری کاری فعلی و در پی آن دو اسلش صادر میکند. در صورت وجود در ورودی پیشپردازششده، GCC از این دایرکتوری به عنوان دایرکتوری کاری صادرشده در برخی قالبهای اطلاعات اشکالزدایی (debugging) استفاده میکند. این گزینه در صورت فعال بودن اطلاعات اشکالزدایی بهطور ضمنی فعال میشود، اما میتوان با شکل نقیض آن -fno-working-directory از آن جلوگیری کرد. اگر پرچم -P در خط فرمان وجود داشته باشد، این گزینه هیچ اثری ندارد، زیرا هیچ دستور "#line" به هیچ وجه صادر نمیشود.
- -A predicate=answer
- یک ادعا (assertion) با گزاره predicate و پاسخ answer ایجاد میکند. این شکل بر شکل قدیمیتر -A predicate(answer)، که هنوز پشتیبانی میشود، ترجیح داده میشود، زیرا از نویسههای خاص شل (shell) استفاده نمیکند.
- -A -predicate=answer
- یک ادعا با گزاره predicate و پاسخ answer را لغو میکند.
- -C
- توضیحات (comments)
را دور
نریز. تمام
توضیحات به
فایل خروجی
منتقل
میشوند،
به جز
توضیحات
درون
دستورهای
پردازششده
که همراه با
خود دستور
حذف
میشوند.
هنگام استفاده از -C باید برای عوارض جانبی آماده باشید؛ این گزینه باعث میشود پیشپردازنده با توضیحات به عنوان توکنهای مستقل رفتار کند. به عنوان مثال، توضیحاتی که در آغاز خطی که قرار بود یک خط دستور باشد ظاهر میشوند، این اثر را دارند که آن خط را به یک خط کد منبع معمولی تبدیل میکنند، زیرا اولین توکن در خط دیگر # نیست.
- -CC
- توضیحات را
دور نریز،
حتی در طول
بسط ماکرو (macro
expansion). این
گزینه
مانند -C
است، به جز
اینکه
توضیحات
موجود در
ماکروها
نیز به فایل
خروجی در
جایی که
ماکرو بسط
مییابد
منتقل
میشوند.
علاوه بر عوارض جانبی گزینه -C، گزینه -CC باعث میشود تمامی توضیحات سبک C++ در داخل ماکرو به توضیحات سبک C تبدیل شوند. این کار برای جلوگیری از این است که استفاده بعدی از آن ماکرو بهطور ناخواسته بقیه خط منبع را به توضیح تبدیل نکند.
گزینه -CC عموماً برای پشتیبانی از توضیحات lint استفاده میشود.
- -P
- از تولید نشانگرهای خط (linemarkers) در خروجی پیشپردازنده جلوگیری میکند. این گزینه ممکن است هنگام اجرای پیشپردازنده روی چیزی که کد 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 مشخص شده، دامپهای اشکالزدایی (debugging dumps) ایجاد شوند. پرچمهای مستندشده در اینجا مواردی هستند که به پیشپردازنده مربوط میشوند. سایر 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 پیشپردازش را بهصورت بخشی ادغامشده از تفکیک نشانهها (tokenization) و تجزیه (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)
این گزینهها زمانی وارد عمل میشوند که کامپایلر فایلهای شیء را به یک فایل خروجی اجرایی پیوند میدهد (link میکند). اگر کامپایلر مرحله پیوند را انجام ندهد، این گزینهها بیاثر خواهند بود.
- object-file-name
- نام فایلی که به پسوند شناختهشده خاصی ختم نشود، بهعنوان نام یک فایل شیء یا کتابخانه در نظر گرفته میشود. (فایلهای شیء بر اساس محتوای فایل توسط لینکر از کتابخانهها تشخیص داده میشوند.) اگر پیوند انجام شود، این فایلهای شیء بهعنوان ورودی به لینکر داده میشوند.
- -c
- -S
- -E
- اگر از هر یک از این گزینهها استفاده شود، لینکر اجرا نمیشود و نباید از نام فایلهای شیء بهعنوان آرگومان استفاده کرد.
- -flinker-output=type
- این گزینه
تولید کد در
بهینهساز
زمان پیوند
(link-time optimizer) را
کنترل
میکند.
بهطور
پیشفرض،
خروجی
لینکر
بهطور
خودکار
توسط
پلاگین
لینکر
تعیین
میشود.
برای
اشکالزدایی
کامپایلر و
در صورتی که
پیوند
افزایشی (incremental
linking) با یک
فایل شیء
غیر-LTO مد نظر
باشد،
کنترل دستی
این نوع
خروجی
میتواند
مفید باشد.
اگر type برابر با exec باشد، تولید کد یک باینری ایستا ایجاد میکند. در این حالت، هر دو گزینه -fpic و -fpie غیرفعال میشوند.
اگر type برابر با dyn باشد، تولید کد یک کتابخانه مشترک ایجاد میکند. در این حالت -fpic یا -fPIC حفظ میشود، اما بهطور خودکار فعال نمیگردد. این امر امکان ساخت کتابخانههای مشترک بدون کد مستقل از موقعیت (position-independent code) را روی معماریهایی که امکانپذیر است (مانند x86) فراهم میکند.
اگر type برابر با pie باشد، تولید کد یک فایل اجرایی با -fpie ایجاد میکند. این حالت بهینهسازیهایی مشابه با exec به همراه دارد، با این تفاوت که اگر -fpie در زمان کامپایل مشخص شده باشد غیرفعال نمیشود.
اگر type برابر با rel باشد، کامپایلر فرض میکند که پیوند افزایشی در حال انجام است. بخشهای حاوی کد میانی برای بهینهسازی زمان پیوند ادغام، پیشبهینهسازی، و به فایل شیء حاصل ارسال میشوند. علاوه بر این، اگر -ffat-lto-objects مشخص شده باشد، کد باینری برای پیوندهای بعدیِ بدون LTO نیز تولید میشود. فایل شیء حاصل از پیوند افزایشی، از یک کتابخانه ایستا که از همان فایلهای شیء ساخته شده باشد کوچکتر است. در زمان پیوند، نتیجه پیوند افزایشی سریعتر از یک کتابخانه ایستا نیز بارگذاری میشود؛ با این فرض که بیشتر اشیاء موجود در کتابخانه استفاده شده باشند.
در نهایت، nolto-rel کامپایلر را برای پیوند افزایشی به گونهای پیکربندی میکند که تولید کد اجباری شده، یک باینری نهایی تولید میشود، و کد میانی برای بهینهسازیهای بعدی زمان پیوند حذف (strip) میگردد. هنگامی که چندین فایل شیء با هم پیوند داده میشوند، کد حاصل بهتر از زمانی بهینهسازی میشود که بهینهسازیهای زمان پیوند غیرفعال باشند (بهعنوان مثال، درونریزی میانماژولی یا cross-module inlining اتفاق میافتد)، اما بیشتر مزایای بهینهسازی کل برنامه از دست میرود.
در طول پیوند افزایشی (توسط -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
- استفاده از لینکر Modern Linker (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
- هنگام پیوند دادن، از فایلهای راهاندازی (startup) استاندارد سیستم استفاده نمیکند. کتابخانههای استاندارد سیستم بهصورت عادی استفاده میشوند، مگر اینکه از گزینههای -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. این گزینه روی اهداف GNU/Linux، اکثر مشتقات دیگر Unix و همچنین روی اهداف x86 Cygwin و MinGW پشتیبانی میشود. در برخی اهداف، این گزینه پرچمهایی را نیز برای پیشپردازنده تنظیم میکند، بنابراین باید به طور هماهنگ هم برای کامپایل و هم برای پیونددهی استفاده شود.
- -r
- یک شیء بازپخشپذیر به عنوان خروجی تولید میکند. این عمل با عنوان پیوند جزئی نیز شناخته میشود.
- -rdynamic
- در اهدافی که از آن پشتیبانی میکنند، پرچم -export-dynamic را به پیونددهنده ELF ارسال میکند. این به پیونددهنده دستور میدهد که همه نمادها، و نه فقط نمادهای استفاده شده را، به جدول نمادهای پویا اضافه کند. این گزینه برای برخی از کاربردهای "dlopen" یا برای امکانپذیر ساختن دریافت ردگیری معکوس (backtrace) از داخل برنامه مورد نیاز است.
- -s
- تمام اطلاعات جدول نمادها و اطلاعات بازپخش را از فایل اجرایی حذف میکند.
- -static
- در سیستمهایی که از پیوند پویا پشتیبانی میکنند، این گزینه بر -pie اولویت داشته و از پیوند با کتابخانههای مشترک جلوگیری میکند. در سایر سیستمها، این گزینه هیچ تأثیری ندارد.
- یک شیء مشترک تولید میکند که پس از آن میتواند با اشیاء دیگر پیوند داده شود تا یک فایل اجرایی تشکیل دهد. همه سیستمها از این گزینه پشتیبانی نمیکنند. برای نتایج قابل پیشبینی، هنگام مشخص کردن این گزینه پیونددهنده، باید همان مجموعه گزینههای استفاده شده برای کامپایل (-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)، ارجاعها به نمادهای سراسری را مقید میکند. دربارهٔ هرگونه ارجاع حلنشده هشدار میدهد (مگر اینکه توسط گزینهٔ ویرایشگر پیوند -Xlinker -z -Xlinker defs لغو شود). تنها سیستمهای معدودی از این گزینه پشتیبانی میکنند.
- -T script
- از 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 برای بازنویسی (override) یک فایل سرآیند سیستمی و جایگزین کردن نسخهٔ خودتان استفاده کنید، زیرا این دایرکتوریها پیش از دایرکتوریهای استاندارد فایلهای سرآیند سیستم جستجو میشوند. با این حال، نباید از این گزینه برای افزودن دایرکتوریهای حاوی فایلهای سرآیند سیستمی ارائهشده توسط سازنده استفاده کنید؛ برای این منظور از -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
- دایرکتوری مورد جستجو برای افزونههایی که به جای -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
- برای برخی مقاصد (targets)، بسته به گزینههای دیگری که استفاده شده است، پسوندی به دایرکتوری ریشهٔ مشخصشده با --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
است. این
گزینه
زمانی مورد
نیاز است که
برنامه طول
عمر یک
متغیر محلی
در حوزه (scoped)
یا یک متغیر
موقت
تولیدشده
توسط
کامپایلر
را فراتر از
نقطهٔ
پایانی
تعریفشده
توسط زبان
گسترش دهد.
هنگامی که
طول عمر یک
متغیر
پایان
مییابد، و
در صورتی که
متغیر در
حافظه قرار
داشته
باشد،
کامپایلر
بهینهساز
این آزادی
عمل را دارد
که فضای
پشتهٔ آن را
برای سایر
متغیرهای
موقت یا
متغیرهای
محلی
حوزهای که
بازهٔ حیات
آنها با آن
همپوشانی
ندارد،
مجدداً
استفاده
کند. کدهای
قدیمی که
طول عمر
متغیرهای
محلی را
گسترش
میدهند،
به احتمال
زیاد با
بهینهسازی
استفادهٔ
مجدد از
پشته دچار
شکست
خواهند شد.
برای نمونه،
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 یکدیگر را لغو میکنند؛ بنابراین استفاده از -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
- کدی تولید میکند که به دستورالعملهای بهدامانداز (trapping) اجازه میدهد استثنا پرتاب کنند. توجه داشته باشید که این ویژگی نیازمند پشتیبانی زمان اجرای وابسته به بستر است که در همه جا وجود ندارد. افزون بر این، این گزینه تنها به دستورالعملهای بهدامانداز اجازهٔ پرتاب استثنا میدهد، یعنی ارجاعات حافظه یا دستورالعملهای ممیز شناور. این گزینه اجازه نمیدهد استثناها از گردانندههای سیگنال دلخواه مانند "SIGALRM" پرتاب شوند. این گزینه -fexceptions را فعال میکند.
- -fdelete-dead-exceptions
- دستورالعملهایی را که ممکن است استثنا پرتاب کنند اما در غیر این صورت نقشی در اجرای برنامه ندارند، قابل حذف در بهینهسازی در نظر میگیرد. این گزینه بر فراخوانی توابع تأثیری ندارد، مگر توابعی که دارای مشخصههای "pure" یا "const" هستند. این گزینه همانطور که توسط مشخصات زبان مجاز دانسته شده است، بهطور پیشفرض برای کامپایلرهای Ada و ++C فعال است. گذرگاههای بهینهسازی که موجب حذف استثناهای مرده میشوند، بهطور مستقل در سطوح بهینهسازی مختلف فعال میگردند.
- -funwind-tables
- مشابه با -fexceptions است، با این تفاوت که تنها دادههای ایستا (static data) مورد نیاز را تولید میکند، اما به هیچ روش دیگری بر کد تولیدشده تأثیر نمیگذارد. معمولاً نیازی به فعال کردن این گزینه ندارید؛ در عوض، پردازشگر زبانی که به این سازوکار نیاز دارد، آن را از طرف شما فعال خواهد کرد.
- -fasynchronous-unwind-tables
- در صورت پشتیبانی توسط ماشین مقصد، جدول بازپیچی (unwind table) را در قالب DWARF تولید میکند. این جدول در مرز هر دستورالعمل دقیق است، بنابراین میتواند برای بازپیچی پشته از رویدادهای ناهمگام (مانند اشکالزدا یا بازیافت حافظه / زبالهروب) به کار رود.
- -fno-gnu-unique
- در سیستمهایی با نسخهٔ جدید اسمبلر GNU و کتابخانهٔ C، کامپایلر ++C از پیوند "STB_GNU_UNIQUE" استفاده میکند تا اطمینان یابد تعاریف اعضای دادهای ایستای الگو و متغیرهای محلی ایستا در توابع درونخطی (inline)، حتی در حضور "RTLD_LOCAL" یکتا باقی میمانند؛ این امر برای جلوگیری از بروز مشکل در مواردی که کتابخانهای توسط دو افزونهٔ متفاوت "RTLD_LOCAL" استفاده میشود و به تعریفی در یکی از آنها وابسته است و در نتیجه با دیگری دربارهٔ پیوند نماد اختلاف نظر پیدا میکند، ضروری است. اما این امر باعث میشود "dlclose" برای اشیاء اشتراکی متأثر (DSO) نادیده گرفته شود؛ اگر برنامهٔ شما به راهاندازی مجدد یک DSO از طریق "dlclose" و "dlopen" متکی است، میتوانید از -fno-gnu-unique استفاده کنید.
- -fpcc-struct-return
- مقادیر
«کوتاه»
"struct" و
"union" را
همانند
ساختارهای
طولانیتر
در حافظه
برمیگرداند،
نه در
ثباتها (registers).
این
قرارداد
کارایی
کمتری
دارد، اما
این مزیت را
دارد که
امکان
فراخوانی
متقابل بین
فایلهای
کامپایلشده
با GCC و
فایلهای
کامپایلشده
با سایر
کامپایلرها،
بهویژه
کامپایلر Portable
C Compiler (pcc) را فراهم
میسازد.
قرارداد دقیق برای بازگرداندن ساختارها در حافظه به ماکروهای پیکربندی معماری مقصد بستگی دارد.
منظور از ساختارها و اجتماعات کوتاه، آنهایی هستند که اندازه و تراز (alignment) آنها با نوعی از انواع عدد صحیح مطابقت دارد.
هشدار: کدی که با سوییچ -fpcc-struct-return کامپایل شده باشد، سازگاری دودویی (binary compatible) با کدی که با سوییچ -freg-struct-return کامپایل شده است ندارد. از آن برای سازگاری با یک رابط دودویی برنامهبردی (ABI) غیرپیشفرض استفاده کنید..IP -freg-struct-return 4 بازگرداندن مقادیر "struct" و "union" در صورت امکان در ثباتها (registers). این کار برای ساختارهای کوچک کارآمدتر از -fpcc-struct-return است.
اگر نه -fpcc-struct-return و نه -freg-struct-return را مشخص کنید، GCC به هر قراردادی که برای مقصد (target) استاندارد باشد پیشفرض میشود. اگر هیچ قرارداد استانداردی وجود نداشته باشد، GCC به طور پیشفرض از -fpcc-struct-return استفاده میکند، به جز در مقصدهایی که GCC کامپایلر اصلی است. در آن موارد، ما میتوانیم استاندارد را انتخاب کنیم، و گزینهٔ کارآمدترِ بازگرداندن در ثبات را برگزیدهایم.
هشدار: کدی که با سوییچ -freg-struct-return کامپایل شده باشد با کدی که با سوییچ -fpcc-struct-return کامپایل شده است سازگاری باینری ندارد. از آن برای مطابقت با یک رابط باینری برنامه (ABI) غیرپیشفرض استفاده کنید.
- -fshort-enums
- اختصاص
دادن تنها
به تعداد
بایتهای
مورد نیاز
به یک نوع
"enum" با
توجه به
بازهٔ
اعلانشده
از مقادیر
ممکن.
بهطور
مشخص، نوع
"enum"
معادل
کوچکترین
نوع عدد
صحیحی است
که فضای
کافی داشته
باشد. این
گزینه برای
یک نوع
شمارشی با
نوع
پایهای
ثابت هیچ
تأثیری
ندارد.
هشدار: سوییچ -fshort-enums باعث میشود GCC کدی تولید کند که با کدهای تولیدشده بدون این سوییچ سازگاری باینری ندارد. از آن برای مطابقت با یک رابط باینری برنامه (ABI) غیرپیشفرض استفاده کنید.
- -fshort-wchar
- بازنویسی
نوع
پایهای
برای
"wchar_t" به
صورت "short
unsigned int" به
جای مقدار
پیشفرض
برای مقصد.
این گزینه
برای ساخت
برنامههایی
که تحت WINE
اجرا
میشوند
مفید است.
هشدار: سوییچ -fshort-wchar باعث میشود GCC کدی تولید کند که با کدهای تولیدشده بدون این سوییچ سازگاری باینری ندارد. از آن برای مطابقت با یک رابط باینری برنامه (ABI) غیرپیشفرض استفاده کنید.
- -fcommon
- در کد C، این
گزینه
نحوهٔ
قرارگیری
متغیرهای
سراسری
تعریفشده
بدون
مقداردهی
اولیه را
کنترل
میکند، که
در
استاندارد C
با عنوان
تعاریف
آزمایشی (tentative
definitions) شناخته
میشوند.
تعاریف
آزمایشی
متمایز از
اعلانهای
یک متغیر با
کلمهٔ
کلیدی
"extern"
هستند که
حافظهای
تخصیص
نمیدهند.
حالت پیشفرض -fno-common است، که مشخص میکند کامپایلر متغیرهای سراسری مقداردهینشده را در بخش BSS از فایل شیء (object file) قرار دهد. این کار مانع از ادغام تعاریف آزمایشی توسط پیونددهنده (linker) میشود، بنابراین اگر متغیر یکسانی بهطور تصادفی در بیش از یک واحد کامپایل تعریف شود، با یک خطای تعریف چندگانه (multiple-definition) مواجه میشوید.
گزینهٔ -fcommon متغیرهای سراسری مقداردهینشده را در یک بلوک مشترک (common block) قرار میدهد. این کار به پیونددهنده اجازه میدهد تا تمام تعاریف آزمایشی مربوط به یک متغیر یکسان در واحدهای کامپایل مختلف را به یک شیء واحد، یا به یک تعریف غیرآزمایشی حلوفصل (resolve) کند. این رفتار با ++C ناسازگار است، و در بسیاری از مقصدها موجب کاهش سرعت و افزایش اندازهٔ کد در ارجاعات به متغیرهای سراسری میشود. این گزینه عمدتاً برای فعالسازی پیوند دادن کدهای قدیمی بدون خطا مفید است.
- -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، ۲۸
کیلوبایت
در AArch64 و ۳۲
کیلوبایت
در m68k و RS/6000
هستند.
معماری x86
چنین
محدودیتی
ندارد.)
کد مستقل از موقعیت به پشتیبانی ویژهای نیاز دارد و بنابراین فقط روی ماشینهای خاصی کار میکند. برای x86، کامپایلر GCC از PIC برای System V پشتیبانی میکند اما برای Sun 386i خیر. کدی که برای IBM RS/6000 تولید میشود، همواره مستقل از موقعیت است.
هنگامی که این پرچم تنظیم شود، ماکروهای "__pic__" و "__PIC__" برابر با ۱ تعریف میشوند..IP -fPIC 4 در صورت پشتیبانی در ماشین مقصد، کد مستقل از موقعیت تولید میکند که برای پیوند پویا مناسب بوده و از هرگونه محدودیت روی اندازهٔ جدول آفست سراسری (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
بارگذاری
کرده و به
آن انشعاب
میزند. این
کار با حذف
کدهای رابط
(stub) مربوط به PLT
و در معرض
بهینهسازی
قرار دادن
بارگذاریهای
GOT، منجر به
کدی
کارآمدتر
میشود. در
معماریهایی
مانند x86 ۳۲
بیتی که
رابطهای PLT
انتظار
اشارهگر GOT
را در ثباتی
خاص دارند،
این امر
آزادی عمل
بیشتری در
تخصیص ثبات
به
کامپایلر
میدهد.
پیوند تنبل
(Lazy binding) نیازمند
استفاده از
PLT است؛ با -fno-plt
تمام
نمادهای
خارجی در
زمان
بارگذاری
تفکیک
میشوند.
همچنین میتوان از صفت تابع "noplt" برای جلوگیری از فراخوانی توابع خارجی خاص از طریق PLT استفاده کرد.
در کدهای وابسته به موقعیت، برخی از مقصدهای کامپایل نیز فراخوانی توابعی را که برای عدم استفاده از PLT نشانهگذاری شدهاند، تغییر میدهند تا در عوض از GOT استفاده کنند.
- -fno-jump-tables
- برای دستورات switch از جدولهای پرش استفاده نمیکند، حتی در مواردی که این روش از سایر راهبردهای تولید کد کارآمدتر باشد. این گزینه در ترکیب با -fpic یا -fPIC برای ساخت کدهایی مفید است که بخشی از یک پیونددهندهٔ پویا را تشکیل میدهند و نمیتوانند به آدرس جدول پرش ارجاع دهند. در برخی مقصدها، جدولهای پرش نیازی به GOT ندارند و این گزینه در آنها لازم نیست.
- -fno-bit-tests
- برای دستورات switch از آزمونهای بیت (bit tests) استفاده نمیکند، حتی در مواردی که از سایر راهبردهای تولید کد کارآمدتر باشد.
- -ffixed-reg
- با ثبات با
نام reg به
عنوان یک
ثبات ثابت
برخورد
میکند؛ کد
تولیدشده
هرگز نباید
به آن ارجاع
دهد (شاید
بهجز
بهعنوان
اشارهگر
پشته،
اشارهگر
فریم یا در
نقشی ثابت
از نوعی
دیگر).
مقدار reg باید نام یک ثبات باشد. نامهای پذیرفتهشده برای ثباتها وابسته به ماشین بوده و در ماکروی "REGISTER_NAMES" در فایل ماکروهای توصیف ماشین تعریف شدهاند.
این پرچم فرم منفی ندارد، زیرا مشخصکنندهٔ انتخابی سهگانه است.
- -fcall-used-reg
- با ثبات با
نام reg به
عنوان یک
ثبات قابل
تخصیص که با
فراخوانیهای
توابع
رونویسی (clobber)
میشود
رفتار
میکند.
ممکن است
برای
متغیرهای
موقت یا
متغیرهایی
که در طول
فراخوانی
یک تابع
باقی
نمیمانند
تخصیص داده
شود. توابعی
که با این
شیوه
کامپایل
میشوند
ثبات reg را
ذخیره و
بازیابی
نمیکنند.
استفاده از این پرچم برای اشارهگر فریم یا اشارهگر پشته یک خطا است. استفاده از این پرچم برای سایر ثباتهایی که نقشهای فراگیر و ثابتی در مدل اجرای ماشین دارند، نتایج فاجعهباری به بار میآورد.
این پرچم فرم منفی ندارد، زیرا مشخصکنندهٔ انتخابی سهگانه است.
- -fcall-saved-reg
- با ثبات با
نام reg به
عنوان یک
ثبات قابل
تخصیص که
توسط توابع
ذخیره
میشود
رفتار
میکند.
میتواند
حتی برای
متغیرهای
موقت یا
متغیرهایی
که در طول
فراخوانی
باقی
میمانند
تخصیص یابد.
توابعی که
با این شیوه
کامپایل
میشوند،
در صورت
استفاده از
ثبات reg، آن
را ذخیره و
بازیابی
میکنند.
استفاده از این پرچم برای اشارهگر فریم یا اشارهگر پشته یک خطا است. استفاده از این پرچم برای سایر ثباتهایی که نقشهای فراگیر و ثابتی در مدل اجرای ماشین دارند، نتایج فاجعهباری تولید میکند.
نوع متفاوتی از فاجعه در اثر استفاده از این پرچم برای ثباتی رخ میدهد که ممکن است مقادیر بازگشتی تابع در آن قرار گیرند.
این پرچم فرم منفی ندارد، زیرا مشخصکنندهٔ انتخابی سهگانه است.
- -fpack-struct[=n]
- در صورت عدم
تعیین
مقدار،
تمام اعضای
ساختار را
بدون هیچ
حفره و
فاصلهای
در کنار هم
بستهبندی
میکند.
هنگامی که
مقداری
مشخص شود
(که باید
توان کوچکی
از دو
باشد)،
اعضای
ساختار را
مطابق با
این مقدار
که
نمایانگر
حداکثر
تراز (alignment) است
بستهبندی
میکند (به
این معنا که
اشیایی با
الزامات
تراز
پیشفرض
بزرگتر از
این مقدار،
احتمالاً
بدون تراز
در مکان
مناسب بعدی
قرار
میگیرند).
هشدار: گزینهٔ -fpack-struct باعث میشود GCC کدی تولید کند که با کد تولیدشده بدون این گزینه سازگاری دودویی ندارد. علاوه بر این، این کار کد را غیربهینه میکند. تنها برای مطابقت با یک واسط دودویی برنامه (ABI) غیرپیشفرض از آن استفاده کنید.
- -fleading-underscore
- این گزینه و
همتای آن،
-fno-leading-underscore،
نحوهٔ
نمایش
نمادهای C
را در فایل
شیء (object file)
بهطور
اجباری
تغییر
میدهند. یک
کاربرد آن،
کمک به
پیوند با
کدهای
اسمبلی
قدیمی است.
هشدار: گزینهٔ -fleading-underscore باعث میشود GCC کدی تولید کند که با کد تولیدشده بدون این گزینه سازگاری دودویی ندارد. از آن برای مطابقت با یک واسط دودویی برنامه (ABI) غیرپیشفرض استفاده کنید. همهٔ مقصدها پشتیبانی کاملی از این گزینه ارائه نمیدهند.
- -ftls-model=model
- مدل مورد
استفاده
برای
حافظهٔ
محلی رشته
(thread-local storage) را
تغییر
میدهد.
آرگومان model
باید یکی از
مقادیر
global-dynamic، local-dynamic،
initial-exec یا local-exec
باشد. توجه
داشته
باشید که
این انتخاب
مشمول
بهینهسازی
است:
کامپایلر
ممکن است
برای
نمادهایی
که در خارج
از واحد
ترجمه مرئی
نیستند، یا
در صورتی که
-fpic در خط
فرمان مشخص
نشده باشد،
از مدل
کارآمدتری
استفاده
کند.
پیشفرض بدون -fpic برابر با initial-exec است؛ و با -fpic پیشفرض global-dynamic خواهد بود.
- -ftrampolines
- برای
مقصدهایی
که معمولاً
برای توابع
تودرتو
به
ترامپولینها
نیاز
دارند،
همیشه به
جای
استفاده از
توصیفگرها
آنها را
تولید
میکند. در
غیر این
صورت، برای
مقصدهایی
که به آنها
نیازی
ندارند،
مانند HP-PA یا
IA-64، هیچ کاری
انجام
نمیدهد.
ترامپولین قطعه کد کوچکی است که در زمان اجرا روی پشته و هنگام گرفتن آدرس یک تابع تودرتو ایجاد میشود، و برای فراخوانی غیرمستقیم تابع تودرتو به کار میرود. بنابراین، برای عملکرد صحیح برنامه نیاز است که پشته قابل اجرا باشد.
گزینهٔ -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]
- دیداری (visibility)
پیشفرض
نمادهای
تصویر ELF را
به گزینهٔ
مشخصشده
تعیین
میکند---همهٔ
نمادها با
این مشخصه
علامتگذاری
میشوند
مگر اینکه
درون کد لغو
(override) شوند.
استفاده از
این ویژگی
میتواند
زمان پیوند
و بارگذاری
کتابخانههای
شیء مشترک
را بهطور
چشمگیری
بهبود
بخشد، کد
بهینهتری
تولید کند،
صدور API
تقریباً
بینقصی
ارائه دهد و
از تداخل
نمادها
جلوگیری
نماید.
اکیداً
توصیه
میشود که
در هر شیء
مشترکی که
توزیع
میکنید از
این گزینه
استفاده
کنید.
علیرغم نامگذاری، default همواره به معنای عمومی (public) است؛ یعنی برای پیوند خوردن از بیرون شیء مشترک در دسترس است. گزینههای protected و internal در کاربردهای واقعی عملاً بیاستفاده هستند، بنابراین تنها گزینهٔ متداول دیگر hidden است. پیشفرض در صورت عدم تعیین -fvisibility، مقدار default است؛ یعنی همهٔ نمادها عمومی میشوند.
توضیح مناسبی از مزایای ناشی از اطمینان از صحت دیداری نمادهای ELF در مقالهٔ «چگونه کتابخانههای اشتراکی بنویسیم» اثر Ulrich Drepper ارائه شده است (که در آدرس https://www.akkadia.org/drepper در دسترس است)---با این وجود، راهحل برتری که این گزینه ممکن ساخته است (به جای مخفی کردن موارد در حالتی که پیشفرض عمومی است)، این است که پیشفرض را hidden قرار داده و موارد لازم را عمومی علامتگذاری کنید. این روش در 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" باید همیشه دارای دیداری پیشفرض باشند.
آگاه باشید که سربرگهای خارج از پروژهٔ شما، بهویژه سربرگهای سیستم و سربرگهای هر کتابخانهٔ دیگری که استفاده میکنید، ممکن است انتظار نداشته باشند با دیداری غیر از پیشفرض کامپایل شوند. شاید نیاز باشد پیش از درج هر یک از این سربرگها، صریحاً از عبارت "#pragma GCC visibility push(default)" استفاده کنید.
اعلانهای "extern" تحت تأثیر -fvisibility قرار نمیگیرند، بنابراین بسیاری از کدها بدون هیچ تغییری میتوانند با -fvisibility=hidden مجدداً کامپایل شوند. با این حال، این بدان معناست که فراخوانی توابع "extern" فاقد دیداری صریح از PLT استفاده میکند، بنابراین مؤثرتر است که از "__attribute ((visibility))" و/یا "#pragma GCC visibility" استفاده کنید تا به کامپایلر اعلام نمایید کدام اعلانهای "extern" باید به صورت مخفی در نظر گرفته شوند.
توجه داشته باشید که -fvisibility بر موجودیتهای پیوند مبهم (vague linkage) در ++C تأثیر میگذارد. این بدان معناست که برای نمونه، یک کلاس استثنا که بین DSOها پرتاب میشود، باید صریحاً با دیداری پیشفرض علامتگذاری شود تا گرههای type_info بین DSOها یکپارچه گردند.
مروری بر این روشها، مزایای آنها و نحوهٔ بهکارگیری آنها در https://gcc.gnu.org/wiki/Visibility آورده شده است..IP -fstrict-volatile-bitfields 4 این گزینه باید زمانی استفاده شود که دسترسیها به میدانهای بیتی (bit-field) از نوع volatile (یا دیگر فیلدهای ساختار، اگرچه کامپایلر معمولاً آن نوعها را در هر صورت رعایت میکند) باید از یک دسترسی واحد به پهنای نوع فیلد استفاده کنند که در صورت امکان با یک همترازی طبیعی (natural alignment) تراز شده باشد. برای مثال، هدفهایی با ثباتهای جانبی نگاشتشده در حافظه (memory-mapped peripheral registers) ممکن است نیازمند این باشند که تمام این دسترسیها ۱۶ بیتی باشند؛ با این پرچم میتوانید تمام میدانهای بیتی دستگاه جانبی را به صورت "unsigned short" اعلان کنید (با فرض اینکه short روی این هدفها ۱۶ بیتی است) تا GCC را مجبور کنید به جای دسترسی شاید کارآمدتر ۳۲ بیتی، از دسترسیهای ۱۶ بیتی استفاده کند.
اگر این گزینه غیرفعال باشد، کامپایلر از کارآمدترین دستورالعمل استفاده میکند. در مثال قبلی، ممکن است این یک دستورالعمل بارگذاری (load) ۳۲ بیتی باشد، حتی اگر به بایتهایی دسترسی پیدا کند که شامل هیچ بخشی از میدان بیتی نیستند، یا به ثباتهای نگاشتشده در حافظهای که به ثبات در حال بهروزرسانی ارتباطی ندارند دسترسی یابد.
در برخی موارد، مانند زمانی که صفت "packed" بر یک فیلد ساختار اعمال شده است، ممکن است دسترسی به فیلد با یک خواندن یا نوشتن تکی که برای ماشین هدف به درستی تراز شده باشد، امکانپذیر نباشد. در این حالت، GCC به جای تولید کدی که در زمان اجرا دچار خطا (fault) شده یا نتیجه را کوتاه (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" (در صورت وجود) و لایهگذاری انتهایی (tail padding) در ساختار (در صورت وجود) صفر میشوند.
گزینههای توسعهدهنده GCC (GCC Developer Options)
این بخش گزینههای خط فرمانی را شرح میدهد که عمدتاً برای توسعهدهندگان GCC جالب توجه هستند، از جمله گزینههایی برای پشتیبانی از آزمودن کامپایلر و بررسی باگهای کامپایلر و مشکلات کارایی در زمان کامپایل. این شامل گزینههایی است که رونوشتهای اشکالزدایی (debug dumps) را در نقاط مختلف کامپایل تولید میکنند؛ گزینههایی که آمارهایی مانند مصرف حافظه و زمان اجرا را چاپ میکنند؛ و اطلاعاتی درباره پیکربندی GCC، مانند محل جستجوی کتابخانهها را نمایش میدهند. بهندرت ممکن است برای کارهای معمول کامپایل و پیوند (linking) نیازی به استفاده از هیچیک از این گزینهها داشته باشید.
بسیاری از گزینههای توسعهدهنده که باعث میشوند GCC خروجی را در یک فایل رونوشت (dump) بریزد، یک پسوند اختیاری =filename میپذیرند. میتوانید stdout یا - را برای رونوشت در خروجی استاندارد، و stderr را برای خطای استاندارد مشخص کنید.
اگر =filename حذف شود، نام پیشفرض فایل رونوشت با الحاق نام پایه فایل رونوشت، شماره گذر (pass number)، حرف مرحله (phase letter)، و نام گذر ساخته میشود. نام پایه فایل رونوشت، نام فایل خروجی تولیدشده توسط کامپایلر است اگر صریحاً مشخص شده باشد و یک فایل اجرایی نباشد؛ در غیر این صورت نام فایل مبدأ است. شماره گذر بر اساس ترتیبی تعیین میشود که گذرها در مدیر گذر (pass manager) کامپایلر ثبت شدهاند. این ترتیب عموماً همان ترتیب اجرا است، اما گذرهایی که توسط افزایهها (plugins) ثبت میشوند، گذرهای مختص هدف، یا گذرهایی که به نحوی دیرتر ثبت شدهاند، شمارهای بالاتر از گذر با نام final دریافت میکنند، حتی اگر زودتر اجرا شوند. حرف مرحله یکی از حروف i (تحلیل بینرویهای)، l (خاص زبان)، r (RTL) یا t (درخت) است. فایلها در دایرکتوری فایل خروجی ایجاد میشوند.
- -fcallgraph-info
- -fcallgraph-info=MARKERS
- باعث
میشود
کامپایلر
اطلاعات
گراف
فراخوانی
(callgraph) برنامه
را به ازای
هر فایل شیء
(object file) تولید
کند. این
اطلاعات در
قالب رایج 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 فعال کرد. حروف ممکن برای استفاده در pass و letters، و معانی آنها به شرح زیر است:
- -fdump-rtl-alignments
- تولید رونوشت پس از محاسبه همترازیهای انشعاب (branch alignments).
- -fdump-rtl-asmcons
- تولید رونوشت پس از اصلاح عبارات RTL که محدودیتهای ورودی/خروجی ارضانشده دارند.
- -fdump-rtl-auto_inc_dec
- تولید رونوشت پس از شناسایی خودکار کاهش/افزایش (auto-inc-dec). این گذر تنها روی معماریهایی اجرا میشود که دستورالعملهای افزایش خودکار یا کاهش خودکار دارند.
- -fdump-rtl-barriers
- تولید رونوشت پس از پاکسازی دستورالعملهای سد (barrier).
- -fdump-rtl-bbpart
- تولید رونوشت پس از افرازش (partitioning) بلوکهای پایهای داغ و سرد.
- -fdump-rtl-bbro
- تولید رونوشت پس از مرتبسازی مجدد بلوکها.
- -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 خروجی گرفتن (dump) پس از سه گذر تبدیل if را فعال میکنند.
- -fdump-rtl-cprop_hardreg
- خروجی گرفتن پس از انتشار رونوشت در ثباتهای سختافزاری (hard register copy propagation).
- -fdump-rtl-csa
- خروجی گرفتن پس از ترکیب تنظیمات پشته (combining 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 handling).
- -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 خروجی گرفتن پس از حذف سراسری زیرعبارتهای مشترک (global common subexpression elimination) را فعال میکنند.
- -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
- خروجی گرفتن پس از حذف تعویضهای زائد حالت (redundant mode switches).
- -fdump-rtl-rnreg
- خروجی گرفتن پس از شمارهگذاری مجدد ثباتها.
- -fdump-rtl-outof_cfglayout
- خروجی گرفتن پس از تبدیل از حالت cfglayout و خروج از آن.
- -fdump-rtl-peephole2
- خروجی گرفتن پس از گذر peephole.
- -fdump-rtl-postreload
- خروجی گرفتن پس از بهینهسازیهای پس از بارگذاری مجدد (post-reload).
- -fdump-rtl-pro_and_epilogue
- خروجی گرفتن پس از تولید مقدمهها و مؤخرههای تابع (prologues و epilogues).
- -fdump-rtl-sched1
- -fdump-rtl-sched2
- -fdump-rtl-sched1 و -fdump-rtl-sched2 خروجی گرفتن پس از گذرهای زمانبندی بلوکهای پایه (basic block scheduling) را فعال میکنند.
- -fdump-rtl-ree
- خروجی گرفتن پس از حذف گسترش علامت یا صفر (sign/zero extension elimination).
- -fdump-rtl-seqabstr
- خروجی گرفتن پس از کشف توالیهای مشترک (common sequence discovery).
- -fdump-rtl-shorten
- خروجی گرفتن پس از کوتاهسازی پرشها و انشعابها.
- -fdump-rtl-split1
- -fdump-rtl-split2
- -fdump-rtl-split3
- -fdump-rtl-split4
- -fdump-rtl-split5
- این گزینهها خروجی گرفتن پس از پنج مرحله تفکیک دستورالعملها (instruction splitting) را فعال میکنند.
- -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
- خروجی گرفتن پس از ردگیری متغیرها (variable tracking).
- -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
- این خروجیها (dumpها) تعریف شدهاند اما همواره فایلهای خالی تولید میکنند.
- -da
- -fdump-rtl-all
- تولید تمام خروجیهای (dumpهای) فهرستشده در بالا..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
- کنترل تخلیه درخت زبان تحلیل بینروالی در مراحل گوناگون در یک فایل. نام فایل با الحاق یک پسوند ویژهٔ کلید به نام فایل منبع ساخته میشود و فایل در همان دایرکتوری فایل خروجی ایجاد میگردد. تخلیههای زیر امکانپذیر هستند:
- all
- تمام تخلیههای تحلیل بینروالی را فعال میکند.
- cgraph
- تخلیه اطلاعات درباره بهینهسازی گراف فراخوانی (call-graph)، حذف توابع استفادهنشده و تصمیمات درونخطیسازی (inlining).
- inline
- تخلیه پس از درونخطیسازی توابع.
- strubm
- تخلیه پس از انتخاب حالتهای "strub" و ثبت این انتخابها به عنوان مشخصههای تابع.
- strub
- تخلیه دگرگونیهای "strub": تغییرات واسط، پوششدهی توابع، و درج فراخوانیهای توکار برای پاکسازی پشته و واترمارکگذاری.
علاوه بر این، گزینههای -optimized، -missed، -note و -all را میتوان مشخص کرد، با همان معانیِ مربوط به -fopt-info، که مقدار پیشفرض آن -optimized است.
برای نمونه، -fdump-ipa-inline-optimized-missed اطلاعات مربوط به نقاط فراخوانی که درونخطی شدهاند را همراه با نقاط فراخوانی که درونخطی نشدهاند منتشر میکند.
بهطور پیشفرض، فایل تخلیه شامل پیامهایی درباره بهینهسازیهای موفقیتآمیز (معادل -optimized) همراه با جزئیات سطح پایین تحلیل خواهد بود.
- -fdump-ipa-clones
- ایجاد یک
فایل تخلیه
حاوی
اطلاعات
مربوط به
ایجاد
کلونهای
گره گراف
فراخوانی و
حذف
گرههای
گراف
فراخوانی
در طول
بهینهسازیها
و
دگرگونیهای
بینروالی.
کاربرد
اصلی آن این
است که
ابزارهای
سازندهٔ
وصلههای
زنده (live-patches)
بتوانند
مجموعه
توابعی را
که برای
جایگزینی
کامل یک
تابع مشخص
باید وصلهٔ
زنده شوند،
تعیین کنند
(نگاه کنید
به -flive-patching). نام
فایل با
افزودن
پسوند
"ipa-clones" به
نام فایل
منبع ایجاد
میشود و
فایل در
همان
دایرکتوری
فایل خروجی
ساخته
میشود. هر
ورودی در
فایل در یک
خط جداگانه
حاوی
فیلدهایی
است که با
نقطه
ویرگول از
هم جدا
شدهاند.
در صورت ایجاد کلون گراف فراخوانی، فیلدهای مجزا عبارتند از:
- 1.
- رشتهٔ "Callgraph clone".
- 2.
- نام تابعی که از آن کلون ساخته میشود، همانگونه که به اسمبلر ارائه میگردد.
- 3.
- عددی که به صورت یکتا نشاندهندهٔ تابع در حال کلونشدن در گراف فراخوانی است. توجه داشته باشید که این عدد تنها در یک واحد کامپایل یا در تحلیل کل برنامه (whole-program analysis) یکتا است، اما احتمالاً در این دو فاز متفاوت خواهد بود.
- 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
- تخلیهٔ اطلاعات سلسلهمراتب کلاسها (class hierarchy). اطلاعات جدول مجازی (virtual table) صادر میشود مگر اینکه 'slim' مشخص شده باشد. این گزینه فقط برای C++ کاربرد دارد.
- module
- تخلیهٔ اطلاعات پودمان (module). گزینههای lineno (مکانها)، graph (دسترسپذیری)، blocks (خوشهها)، uid (سریالسازی)، alias (ادغامپذیر)، asmname (مربوط به Elrond)، eh (نگاشتکننده) و vops (ماکروها) ممکن است اطلاعات بیشتری ارائه دهند. این گزینه فقط برای C++ کاربرد دارد.
- raw
- تخلیهٔ دادههای خام درخت داخلی. این گزینه فقط برای C++ کاربرد دارد.
- -fdump-passes
- چاپ فهرست گذرگاههای بهینهسازی (optimization passes) فعال و غیرفعالشده توسط گزینههای خط فرمان جاری روی stderr.
- -fdump-statistics-option
- فعالسازی و کنترل تخلیهٔ آمار گذرگاهها در یک فایل مجزا. نام فایل با افزودن پسوندی که به .statistics ختم میشود به نام فایل منبع تولید میشود، و فایل در همان دایرکتوری فایل خروجی ایجاد میگردد. در صورت استفاده از ساختار -option، مقدار -stats باعث میشود شمارندهها روی کل واحد ترجمه (compilation unit) جمع زده شوند، در حالی که -details هر رویداد را همگام با تولید توسط گذرگاهها تخلیه میکند. حالت پیشفرض در صورت نبود هیچ گزینهای، جمع زدن شمارندهها برای هر تابع کامپایلشده است.
- -fdump-tree-all
- -fdump-tree-switch
- -fdump-tree-switch-options
- -fdump-tree-switch-options=filename
- کنترل تخلیه در مراحل مختلف پردازش درخت زبان میانی به یک فایل. اگر از ساختار -options استفاده شود، options فهرستی از گزینههای جداشده با - است که جزئیات تخلیه را کنترل میکنند. همهٔ گزینهها برای همهٔ تخلیهها کاربرد ندارند؛ مواردی که معنادار نیستند نادیده گرفته میشوند. گزینههای زیر در دسترس هستند:
- address
- چاپ نشانی هر گره. معمولاً معنادار نیست زیرا بر اساس محیط و فایل منبع تغییر میکند. کاربرد اصلی آن ارتباط دادن یک فایل تخلیه با یک محیط دیباگ است.
- asmname
- اگر "DECL_ASSEMBLER_NAME" برای یک تعریف (decl) مشخص شده باشد، بهجای "DECL_NAME" از آن در خروجی تخلیه استفاده شود. کاربرد اصلی آن، سهولت در ردیابی معکوس از روی نامهای دستکاریشده (mangled names) در فایل اسمبلی است.
- slim
- هنگام
تخلیهٔ
نمایشهای
میانی بخش
فرانتاند
(front-end)، از
تخلیهٔ
اعضای یک
حوزه (scope) یا
بدنهٔ یک
تابع صرفاً
به دلیل
اینکه به آن
حوزه رسیده
است،
جلوگیری
میکند. این
موارد تنها
زمانی
تخلیه
میشوند که
از طریق
مسیر دیگری
مستقیماً
قابل
دسترسی
باشند.
هنگام تخلیهٔ درختهای فرمتشده (pretty-printed)، این گزینه از تخلیهٔ بدنهٔ ساختارهای کنترلی جلوگیری میکند.
هنگام تخلیهٔ RTL، نمایش RTL را بهجای قالب پیشفرض شبیه به LISP، در یک قالب فشرده (slim) چاپ میکند.
- raw
- چاپ نمایشی خام از درخت. بهطور پیشفرض، درختها با فرمت خوانا (pretty-printed) در یک قالب شبیه به C نمایش داده میشوند.
- details
- فعالسازی تخلیههای با جزئیات بیشتر (در تمام گزینههای تخلیه پشتیبانی نمیشود). همچنین اطلاعات مربوط به گذرگاههای بهینهسازی را شامل میشود.
- stats
- فعالسازی تخلیهٔ آمارهای گوناگون دربارهٔ گذرگاه (در تمام گزینههای تخلیه پشتیبانی نمیشود).
- blocks
- فعالسازی نمایش مرزهای بلوکهای پایهای (در تخلیههای خام یا raw غیرفعال است).
- graph
- بهازای هر
یک از
فایلهای
تخلیهٔ
مشخصشدهٔ
دیگر (-fdump-rtl-pass)،
نمایشی از
گراف جریان
کنترل (control flow graph)
مناسب برای
مشاهده با GraphViz
را در file.passid.pass.dot
تخلیه
میکند. هر
تابع در
فایل
بهصورت یک
زیرگراف (subgraph)
مرتب چاپ
میشود تا GraphViz
بتواند
همهٔ آنها
را در یک
نمودار
واحد رسم
کند.
این گزینه در حال حاضر فقط برای تخلیههای RTL کار میکند، و RTL همیشه به صورت فشرده (slim) تخلیه میشود.
- vops
- فعالسازی نمایش عملوندهای مجازی برای هر عبارت.
- lineno
- فعالسازی نمایش شماره خطوط برای عبارتها.
- uid
- فعالسازی نمایش شناسهٔ یکتا ("DECL_UID") برای هر متغیر.
- verbose
- فعالسازی نمایش تخلیهٔ درخت برای هر عبارت.
- eh
- فعالسازی نمایش شماره ناحیهٔ EH (مدیریت استثنا) که دربرگیرندهٔ هر عبارت است.
- scev
- فعالسازی نمایش جزئیات تحلیل فرگشت اسکالر (scalar evolution analysis).
- 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
- تخلیهٔ
اطلاعات
بهینهسازی
(optimization dumps) را از
مراحل
مختلف
بهینهسازی
کنترل
میکند. اگر
ساختار -options
استفاده
شود، options
فهرستی از
کلیدواژههای
گزینهای
جدا شده با
- است تا
جزئیات
تخلیه و
بهینهسازیها
را انتخاب
کند.
میتوان options را به سه گروه تقسیم کرد:
- 1.
- گزینههایی که توصیف میکنند چه انواعی از پیامها باید صادر شوند،
- 2.
- گزینههایی که میزان پرگویی (verbosity) گزارش تخلیه را مشخص میکنند، و
- 3.
- گزینههایی که مشخص میکنند کدام بهینهسازیها باید گنجانده شوند.
گزینههای هر گروه را میتوان آزادانه ترکیب کرد زیرا همپوشانی ندارند. با این حال، در صورت بروز هرگونه تداخل، گزینههای بعدی در خط فرمان، گزینههای قبلی را باطل (override) میکنند.
گزینههای زیر کنترل میکنند چه انواعی از پیامها باید صادر شوند:
- optimized
- چاپ اطلاعات هنگام اعمال موفقیتآمیز یک بهینهسازی. این بستگی به هر مرحله (pass) دارد که تصمیم بگیرد چه اطلاعاتی مرتبط است. به عنوان مثال، مراحل بردارساز (vectorizer) موقعیت مبدأ حلقههایی را که با موفقیت برداری شدهاند چاپ میکنند.
- missed
- چاپ اطلاعات دربارهٔ بهینهسازیهای از دست رفته. مراحل بهطور مستقل کنترل میکنند چه اطلاعاتی در خروجی گنجانده شود.
- note
- چاپ اطلاعات با جزئیات بیشتر دربارهٔ بهینهسازیها، مانند برخی تبدیلها، پیامهای مفصلتر در مورد تصمیمگیریها و غیره.
- all
- چاپ اطلاعات تفصیلی بهینهسازی. این شامل optimized، missed و note است.
گزینهٔ زیر میزان پرگویی گزارش را کنترل میکند:
- internals
- بهطور پیشفرض، تنها پیامهای «سطح بالا» صادر میشوند. این گزینه پیامهای اضافی و با جزئیات بیشتری را فعال میکند که احتمالاً فقط برای توسعهدهندگان GCC جالب توجه خواهد بود.
یک یا چند مورد از کلیدواژههای گزینهای زیر را میتوان برای مشخص کردن یک گروه از بهینهسازیها استفاده کرد:
- ipa
- فعال کردن گزارش تخلیه برای تمامی بهینهسازیهای بینرویهای (interprocedural).
- loop
- فعال کردن گزارش تخلیه برای تمامی بهینهسازیهای حلقه.
- inline
- فعال کردن گزارش تخلیه برای تمامی بهینهسازیهای جایگزینی درونخطی (inlining).
- omp
- فعال کردن گزارش تخلیه برای تمامی بهینهسازیهای OMP (Offloading and Multi Processing).
- vec
- فعال کردن گزارش تخلیه برای تمامی بهینهسازیهای برداریسازی (vectorization).
- optall
- فعال کردن گزارش تخلیه برای تمامی بهینهسازیها. این یک ابرمجموعه از گروههای بهینهسازی فهرستشده در بالاست.
اگر options حذف شود، مقدار پیشفرض آن optimized-optall خواهد بود، به این معنی که پیامهای مربوط به بهینهسازیهای موفقیتآمیز از تمام مراحل گزارش میشوند و پیامهایی که به عنوان «internals» در نظر گرفته میشوند نادیده گرفته خواهند شد.
اگر filename ارائه شود، گزارشهای تمام بهینهسازیهای مربوطه در فایل filename تجمیع و ذخیره میشوند. در غیر این صورت گزارش به stderr هدایت میشود. اگرچه گزینههای چندگانهٔ -fopt-info پذیرفته میشوند، تنها یکی از آنها میتواند شامل یک filename باشد. اگر نامهای فایل دیگری ارائه شوند، بهجز اولین مورد، سایر آنها نادیده گرفته میشوند.
توجه داشته باشید که در صورت وجود چندین واحد ترجمه (translation unit)، فایل خروجی filename بازنویسی (overwrite) میشود. اگر یک خروجی ترکیبی از چند واحد ترجمه مورد نظر است، باید از 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
- برای
بهینهسازیهایی
که از -fopt-info
پشتیبانی
میکنند،
یک فایل
SRCFILE.opt-record.json.gz
مینویسد
که جزئیات
بهینهسازیهای
انجامشده
را شرح
میدهد.
این گزینه آزمایشی است و قالب دادههای درون فایل فشردهٔ JSON ممکن است تغییر کند.
این گزینه تقریباً معادل یک نسخهٔ ماشینخوان از -fopt-info-all به صورت مجموعهای از پیامها همراه با نام فایل مبدأ، شمارهٔ خط و شمارهٔ ستون است که دادههای اضافی زیر را نیز برای هر پیام به همراه دارد:
- تعداد دفعات اجرای کدی که در حال بهینهسازی است، به همراه فرادادهای در این مورد که آیا این مقدار از دادههای نمایهسازی (profile) واقعی بوده یا صرفاً یک تخمین است، که به مصرفکنندگان اجازه میدهد پیامها را بر اساس میزان داغ بودن (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 بزرگتر از یک، احتمالهای بلوک پایه، اطلاعات تفصیلی فهرست آماده و اطلاعات واحد/دستورالعمل را نیز در خروجی میآورد. برای n بزرگتر از دو، شامل RTL در نقطهٔ لغو، جریان کنترل و اطلاعات ناحیهها میشود. و برای 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
به جای
اعداد
تصادفی در
تولید نام
نمادهای
مشخصی که
باید در هر
فایل
کامپایلشده
متفاوت
باشند،
استفاده
میکند.
همچنین
برای قرار
دادن
مهرهای
یکتا در
فایلهای
دادههای
پوششآزمون
و فایلهای
شیء که
آنها را
تولید
میکنند،
به کار
میرود.
میتوانید
از گزینهٔ
-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 به
کامپایلر
ارسال
میشود.
فایلهای
تخلیه (dump) و
فایلهای
موقت
حفظشده در
طول
کامپایل
دوم تغییر
نام داده
میشوند تا
پسوند
اضافی
".gk" را در
بر داشته
باشند، تا
از رونویسی
موارد
تولیدشده
در کامپایل
اول
جلوگیری
شود.
هنگامی که این گزینه به راهانداز (driver) کامپایلر ارسال میشود، باعث نادیده گرفتن کامپایل اول میشود که کاربرد آن را تقریباً به اشکالزدایی خود کامپایلر محدود میکند.
- -gtoggle
- تولید اطلاعات اشکالزدایی را در صورتی که بدون این گزینه تولید میشدند خاموش میکند، یا در غیر این صورت آن را در سطح ۲ روشن میکند. موقعیت این آرگومان در خط فرمان اهمیتی ندارد؛ این گزینه پس از پردازش تمام گزینههای دیگر اعمال میشود و فارغ از اینکه چند بار مشخص شده باشد، تنها یکبار اثر میکند. این گزینه اساساً برای استفاده با -fcompare-debug طراحی شده است.
- -fvar-tracking-assignments-toggle
- گزینهٔ -fvar-tracking-assignments را تغییر وضعیت (toggle) میدهد، همانگونه که -gtoggle وضعیت -g را تغییر میدهد.
- -Q
- هنگامی که
در خط فرمان
پیش از --help=
استفاده
شود، -Q به
عنوان
اصلاحکنندهای
برای خروجی
راهنما عمل
میکند.
در غیر این صورت، این گزینه باعث میشود کامپایلر نام هر تابع را هنگام کامپایل شدن چاپ کرده و آمارههایی درباره هر گذر (pass) پس از اتمام آن نمایش دهد.
- -ftime-report
- باعث
میشود
کامپایلر
هنگام
اتمام هر
گذر،
آمارههایی
درباره
زمان
مصرفشده
توسط آن را
در stderr چاپ کند.
اگر خروجی SARIF برای تشخیصها از طریق -fdiagnostics-format=sarif-file یا -fdiagnostics-format=sarif-stderr درخواست شده باشد، اطلاعات -ftime-report در عوض در قالب JSON به عنوان بخشی از خروجی SARIF صادر میشود. ساختار دقیق این دادههای JSON ممکن است تغییر کند، و مقادیر ممکن است به دلیل ثبت در نقطهای کمی متفاوت در کامپایلر، دقیقاً با مقادیر ارسالشده به stderr مطابقت نداشته باشند.
- -ftime-report-details
- زمان مصرفشده توسط بخشهای زیرساختی را برای هر گذر بهطور جداگانه ثبت میکند.
- -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)
تنظیمشده
توسط
بخشهای
داخلی
کامپایلر،
مقصد، یا
سازندگان
در زمان
پیکربندی
فراهم
میکند.
مشابه "TFLAGS"، این به کتابخانههای مقصد اجازه میدهد برای محیطهای پایهٔ سازگار و قابلحمل ساخته شوند، در حالی که کامپایلر بهطور پیشفرض از تنظیمات پیشرفتهتر استفاده میکند. این ویژگی سودمند است چرا که اگر پیشفرضها برای محیط مقصد کاربران ایدهآل نباشد، کاربران میتوانند به راحتی پیشفرضهایی را که کامپایلر برای ساخت برنامههایشان استفاده میکند بازنویسی کنند، در حالی که بازسازی کتابخانههای زمان اجرا معمولاً چندان آسان یا مطلوب نیست.
برخلاف "TFLAGS"، استفاده از مشخصات (specs) امکان انتخاب پرچمهای متفاوتی را برای multilibهای گوناگون فراهم میکند. روش دستیابی به این کار، ساخت با make TFLAGS=-fmultiflags پس از پیکربندی با --with-specs=%{fmultiflags:...} است.
این گزینه پس از پایان پردازش self specهای راهانداز، توسط راهانداز نادیده گرفته میشود.
همچنین برای بررسی اینکه آیا "TFLAGS" برای ساخت همه کتابخانههای مقصد استفاده میشود، میتوان یک کامپایلر غیر خودراهانداز (non-bootstrap) را با --with-specs='%{!fmultiflags:%emissing TFLAGS}' پیکربندی کرده و کامپایلر و کتابخانههای مقصد را ساخت.
- -fprofile-report
- باعث میشود کامپایلر آمارههایی را درباره سازگاری نمایهٔ (تخمینزدهشده) و اثر گذرهای منفرد چاپ کند.
- -fstack-usage
- باعث میشود کامپایلر اطلاعات مصرف پشته (stack) را برای برنامه، بهازای هر تابع خروجی دهد. نام فایل برای این خروجی با افزودن .su به auxname ایجاد میشود. در صورتی که نام فایل خروجی بهطور صریح مشخص شده باشد و یک فایل اجرایی نباشد، auxname از نام آن تولید میشود؛ در غیر این صورت، نام پایه (basename) فایل منبع خواهد بود. هر مدخل از سه فیلد تشکیل شده است:
- نام تابع.
- تعداد بایتها.
- یک یا چند توصیفکننده: "static"، "dynamic"، "bounded".
توصیفکنندهٔ "static" به این معنی است که تابع پشته را بهطور ایستا مدیریت میکند: تعداد ثابتی از بایتها در هنگام ورود به تابع برای قاب (frame) تخصیص یافته و هنگام خروج از تابع آزاد میشوند؛ به جز این، هیچ تنظیم دیگری روی پشته در تابع صورت نمیگیرد. فیلد دوم، همین تعداد بایت ثابت است.
توصیفکنندهٔ "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 را که هنگام پیوند دادن (link) استفاده میشود چاپ میکند---و کار دیگری انجام نمیدهد. با این گزینه، GCC هیچ چیزی را کامپایل یا پیوند نمیکند؛ تنها نام فایل را چاپ میکند.
- -print-multi-directory
- نام دایرکتوری متناظر با multilib انتخابشده توسط سایر سوییچهای موجود در خط فرمان را چاپ میکند. فرض بر این است که این دایرکتوری در GCC_EXEC_PREFIX وجود دارد.
- -print-multi-lib
- نگاشت نام دایرکتوریهای multilib به سوییچهای کامپایلری که آنها را فعال میکنند را چاپ میکند. نام دایرکتوری با ; از سوییچها جدا میشود و هر سوییچ بهجای - با یک @ شروع میشود، بدون فاصله بین سوییچهای متعدد. این ساختار برای آسانتر کردن پردازش در پوسته (shell) در نظر گرفته شده است.
- -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 مقصدی است که یا در زمان پیکربندی (configure time) یا با استفاده از گزینهٔ --sysroot تعیین شده است، احتمالاً به همراه یک پسوند اضافی که به گزینههای کامپایل بستگی دارد. اگر هیچ sysroot مقصدی مشخص نشده باشد، این گزینه چیزی چاپ نمیکند.
- -print-sysroot-headers-suffix
- پسوندی را که هنگام جستجوی هدرها (headers) به sysroot مقصد افزوده میشود چاپ میکند، یا در صورتی که کامپایلر با چنین پسوندی پیکربندی نشده باشد خطا میدهد---و کار دیگری انجام نمیدهد.
- -dumpmachine
- ماشین مقصد کامپایلر را چاپ میکند (برای مثال، i686-pc-linux-gnu)---و کار دیگری انجام نمیدهد.
- -dumpversion
- نسخهٔ کامپایلر را چاپ میکند (برای مثال، 3.0، 6.3.0 یا 7)---و کار دیگری انجام نمیدهد. این نسخهٔ کامپایلر است که در مسیرهای فایلسیستم و specs استفاده میشود. بسته به نحوهٔ پیکربندی کامپایلر، خروجی میتواند تنها یک عدد (نسخهٔ اصلی - major version)، دو عدد جدا شده با نقطه (نسخهٔ اصلی و فرعی - major and minor) یا سه عدد جدا شده با نقطه (نسخهٔ اصلی، فرعی و وصله - patchlevel) باشد.
- -dumpfullversion
- نسخهٔ کامل کامپایلر را چاپ میکند---و کار دیگری انجام نمیدهد. خروجی همیشه سه عدد جدا شده با نقطه است: نسخهٔ اصلی (major)، فرعی (minor) و وصله (patchlevel).
- -dumpspecs
- مشخصاتِ پیشساختهٔ (built-in specs) کامپایلر را چاپ میکند---و کار دیگری انجام نمیدهد. (این گزینه هنگام ساخت خود GCC استفاده میشود.).SS "گزینههای وابسته به ماشین (Machine-Dependent Options)" هر ماشین مقصدی که توسط GCC پشتیبانی میشود، میتواند گزینههای مختص به خود را داشته باشد---برای نمونه، جهت فراهم ساختن امکان همگردانی برای یک گونهٔ پردازنده یا ABI خاص، یا واپایش بهینهسازیهای ویژهٔ آن ماشین. طبق قرارداد، نام گزینههای خاص ماشین با -m آغاز میشود.
برخی از پیکربندیهای کامپایلر همچنین از گزینههای اضافی مختص به مقصد پشتیبانی میکنند، که معمولاً برای سازگاری با سایر کامپایلرها روی همان پلتفرم است.
گزینههای AArch64
این گزینهها برای پیادهسازیهای AArch64 تعریف شدهاند:
- -mabi=name
- تولید کد
برای مدل
دادهٔ
مشخصشده.
مقادیر
مجاز
عبارتند از
ilp32 برای مدل
دادهٔ شبه SysV
که در آن int، long int
و
اشارهگرها
۳۲ بیتی
هستند، و lp64
برای مدل
دادهٔ شبه SysV
که در آن int
مقدار ۳۲
بیتی دارد،
اما long int و
اشارهگرها
۶۴ بیتی
هستند.
مقدار پیشفرض به پیکربندی خاص مقصد بستگی دارد. توجه داشته باشید که ABIهای LP64 و ILP32 در زمان پیوند سازگار نیستند؛ شما باید تمام برنامهٔ خود را با همان ABI کامپایل کرده و با مجموعهای سازگار از کتابخانهها پیوند دهید.
مدل ilp32 منسوخ شده است.
- -mbig-endian
- تولید کد بزرگپایان (big-endian). این حالت پیشفرض است هنگامی که GCC برای یک مقصد aarch64_be-*-* پیکربندی شده باشد.
- -mgeneral-regs-only
- تولید کدی که تنها از ثباتهای همهمنظوره استفاده میکند. این کار مانع از استفادهٔ کامپایلر از ثباتهای ممیز شناور و Advanced SIMD میشود، اما هیچ محدودیتی بر اسمبلر اعمال نخواهد کرد.
- -mlittle-endian
- تولید کد کوچکپایان (little-endian). این حالت پیشفرض است هنگامی که GCC برای یک مقصد aarch64-*-* پیکربندی شده باشد و نه aarch64_be-*-*.
- -mcmodel=tiny
- تولید کد برای مدل کد ریز (tiny code model). برنامه و نمادهای ایستا تعریفشدهٔ آن باید در فاصلهٔ ۱ مگابایتی از یکدیگر باشند. برنامهها میتوانند بهصورت ایستا یا پویا پیوند داده شوند.
- -mcmodel=small
- تولید کد برای مدل کد کوچک (small code model). برنامه و نمادهای ایستا تعریفشدهٔ آن باید در فاصلهٔ ۴ گیگابایتی از یکدیگر باشند. برنامهها میتوانند بهصورت ایستا یا پویا پیوند داده شوند. این مدل کد پیشفرض است.
- -mcmodel=large
- تولید کد برای مدل کد بزرگ (large code model). این حالت هیچ فرضی دربارهٔ نشانیها و اندازهٔ بخشها در نظر نمیگیرد. برنامهها تنها میتوانند بهصورت ایستا پیوند داده شوند. گزینهٔ -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 علاوهبراین مشخص میکنند که کدام ثبات سیستمی بهعنوان ثبات پایه برای خواندن قناری و از چه آفستی نسبت به آن ثبات پایه استفاده شود. هیچ ثبات یا آفست پیشفرضی وجود ندارد زیرا این ویژگی تماماً برای استفاده در هستهٔ Linux است.
- -mtls-dialect=desc
- استفاده از توصیفگرهای TLS به عنوان سازوکار حافظهٔ محلی ریسه (thread-local storage) برای دسترسیهای پویای متغیرهای TLS. این حالت پیشفرض است.
- -mtls-dialect=traditional
- استفاده از TLS سنتی به عنوان سازوکار حافظهٔ محلی ریسه برای دسترسیهای پویای متغیرهای TLS.
- -mtls-size=size
- تعیین اندازهٔ بیت آفستهای بیواسطهٔ TLS. مقادیر معتبر ۱۲، ۲۴، ۳۲ و ۴۸ هستند. این گزینه به binutils نسخهٔ 2.26 یا جدیدتر نیاز دارد.
- -mfix-cortex-a53-835769
- -mno-fix-cortex-a53-835769
- فعال یا غیرفعال کردن راهکار رفع اشکال (workaround) برای نقص فنی شمارهٔ 835769 پردازندهٔ ARM Cortex-A53. این مورد شامل درج یک دستور NOP میان دستورهای حافظه و دستورهای ضرب و جمع انباشتهٔ (multiply-accumulate) صحیح ۶۴ بیتی است. اگر معماری یا cpu مشخصشده در خط فرمان نیازی به این راهکار نداشته باشد، این پرچم نادیده گرفته خواهد شد.
- -mfix-cortex-a53-843419
- -mno-fix-cortex-a53-843419
- فعال یا غیرفعال کردن راهکار رفع اشکال برای نقص فنی شمارهٔ 843419 پردازندهٔ ARM Cortex-A53. این راهکار نقص فنی در زمان پیوند اعمال میشود و این گزینه صرفاً پرچم مربوطه را به پیونددهنده ارسال میکند. اگر معماری یا cpu مشخصشده در خط فرمان نیازی به این راهکار نداشته باشد، این پرچم نادیده گرفته خواهد شد.
- -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) را برای
پیادهسازی
عملیاتهای
اتمیک (atomic)
فعال یا
غیرفعال
میکند. این
توابع کمکی
در زمان
اجرا مشخص
خواهند کرد
که آیا
دستورالعملهای
LSE از معماری
ARMv8.1-A قابل
استفاده
هستند یا
خیر؛ در غیر
این صورت،
آنها از
دستورالعملهای
load/store-exclusive موجود
در معماری
پایه ARMv8.0 ISA
استفاده
خواهند کرد.
این گزینه تنها هنگام کامپایل برای مجموعه دستورالعملهای پایه 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 تخلیهٔ پرحجم (verbose) مدل هزینه را در فایلهای تخلیه اشکالزدایی فعال میکند. این گزینه برای استفاده هنگام اشکالزدایی کامپایلر ارائه شده است.
- -mpc-relative-literal-loads
- -mno-pc-relative-literal-loads
- بارگذاری مقادیر ثابت وابسته به شمارندهٔ برنامه (PC-relative literal loads) را فعال یا غیرفعال میکند. با این گزینه، به استخرهای دادههای ثابت (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
- ویژگیهای حفاظت از انشعاب (branch protection) مورد استفاده را مشخص میکند. none مقدار پیشفرض است و تمام انواع حفاظت از انشعاب را غیرفعال میکند. standard تمام ویژگیهای حفاظت از انشعاب را فعال میکند. اگر ویژگیای دارای گزینههای تنظیمات بیشتری باشد، standard آن را روی سطح استاندارد خود قرار میدهد. pac-ret[+leaf] امضای نشانی بازگشت را در سطح استاندارد فعال میکند: امضای توابعی که نشانی بازگشت را با استفاده از a-key در حافظه ذخیره میکنند (توابع غیربرگ عملاً همیشه این کار را انجام میدهند). از آرگومان اختیاری 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 تمام آنها را غیرفعال میسازد.
- -mearly-ra=scope
- زمان
فعالسازی
مرحلهٔ
زودهنگام
تخصیص ثبات
(early register allocation pass) را
تعیین
میکند. این
مرحله پیش
از
زمانبندی
دستورالعملها
اجرا شده و
تلاش
میکند
تخصیصی
بدون سرریز
(spill-free) برای
کدهای ممیز
شناور و
برداری
بیابد.
همچنین
تلاش
میکند از
دستورالعملهای
چندثباتی
گامدار (strided
multi-register)، مانند LD1
و ST1 گامدار
در SME2
استفاده
کند.
مقادیر ممکن برای scope عبارتند از: all که این مرحله را روی تمام توابع اجرا میکند؛ strided که آن را روی توابعی که به دستورالعملهای چندثباتی گامدار دسترسی دارند اجرا مینماید؛ و none که این مرحله را غیرفعال میکند.
-mearly-ra=all مقدار پیشفرض برای سطوح بهینهسازی -O2 و بالاتر، و همچنین برای -Os است. در غیر این صورت مقدار پیشفرض -mearly-ra=none است.
- -mearly-ldp-fusion
- نسخهای از مرحلهٔ ادغام جفتهای بارگذاری/ذخیرهسازی در AArch64 را فعال میکند که پیش از تخصیص ثبات اجرا میشود. این گزینه بهطور پیشفرض در -O و بالاتر فعال است.
- -mlate-ldp-fusion
- نسخهای از مرحلهٔ ادغام جفتهای بارگذاری/ذخیرهسازی در 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 خروجی ناآگاه از طول بردار تولید میکند. تمامی مقادیر دیگر کدهایی با طول بردار خاص تولید میکنند. رفتار این مقادیر ممکن است در نسخههای بعدی تغییر کند و به هیچ مقداری جز scalable نباید برای تولید کدی که بین طولهای مختلف بردار سختافزاری SVE سازگار و قابلحمل (portable) باشد تکیه کرد.
مقدار پیشفرض -msve-vector-bits=scalable است که کد ناآگاه از طول بردار تولید میکند.
- -Wexperimental-fmv-target
- دربارهٔ استفاده از نسخهبندی چندگانهٔ توابع (FMV) بهصورت آزمایشی هشدار میدهد. مشخصات Arm C Language Extension برای ویژگی Function Multi Versioning در وضعیت بتا بوده و ممکن است دستخوش تغییر شود. هرگونه استفاده از FMV با این تذکر همراه است که احتمال تغییر رفتار و ناسازگاری در آینده وجود دارد.
اصلاحکنندههای ویژگی برای -march و -mcpu
اصلاحکنندههای ویژگی که با -march و -mcpu استفاده میشوند میتوانند هر یک از موارد زیر و معکوس آنها یعنی nofeature باشند:
- crc
- افزونهٔ CRC را فعال میکند. این گزینه بهطور پیشفرض برای -march=armv8.1-a فعال است.
- crypto
- افزونهٔ Crypto را فعال میکند. این گزینه همچنین دستورالعملهای Advanced SIMD و ممیز شناور (floating-point) را فعال میسازد.
- 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 ممکن ساخته و آن را به اسمبلر منتقل میکند، که به دستورهای اسمبلی درونخطی (inline 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
- دستورالعملهای تولید اعداد تصادفی در Armv8.5-a را فعال میکند. این گزینه صرفاً برای فعالسازی افزونه در سطح اسمبلر است و بر تولید کد تأثیری نمیگذارد.
- memtag
- افزونههای برچسبگذاری حافظه (Memory Tagging Extensions) در 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
- دستورهای Armv8-a Execution and Data Prediction Restriction را فعال میکند. این گزینه صرفاً برای فعالسازی افزونه در سطح اسمبلر است و بر تولید کد تأثیری نمیگذارد. این گزینه بهطور پیشفرض برای -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
- دستورهای ضرب ماتریسی ممیز شناور ۳۲ بیتی (32-bit Floating point Matrix Multiply) را فعال میکند. این گزینه همچنین دستورهای SVE را فعال میسازد. استفاده از این گزینه با معماریهای پیش از Armv8.2-A پشتیبانی نمیشود.
- f64mm
- دستورهای ضرب ماتریسی ممیز شناور ۶۴ بیتی (64-bit Floating point Matrix Multiply) را فعال میکند. این گزینه همچنین دستورهای SVE را فعال میسازد. استفاده از این گزینه با معماریهای پیش از Armv8.2-A پشتیبانی نمیشود.
- bf16
- دستورهای ممیز شناور با دقت نیمه brain (یا brain half-precision floating-point) را فعال میکند. این گزینه همچنین دستورهای Advanced SIMD و ممیز شناور را فعال میسازد. این گزینه بهطور پیشفرض برای -march=armv8.6-a فعال است. استفاده از این گزینه با معماریهای پیش از Armv8.2-A پشتیبانی نمیشود.
- ls64
- دستورهای بارگذاری و ذخیرهسازی اتمیک ۶۴ بایتی را برای شتابدهندهها فعال میکند.
- mops
- دستورهایی را برای شتاببخشی به عملیات حافظه مانند "memcpy"، "memmove" و "memset" فعال میکند. این گزینه بهطور پیشفرض برای -march=armv8.8-a فعال است.
- flagm
- افزونهٔ دستورهای Flag Manipulation را فعال میکند.
- 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 نسخهٔ ۲.۱ را فعال میکند. این گزینه همچنین دستورهای 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
- افزونهٔ ضرب-جمع (multiply accumulate) برای fp8 (ممیز شناور ۸ بیتی) را فعال میکند.
- ssve-fp8fma
- افزونهٔ ضرب-جمع برای fp8 (ممیز شناور ۸ بیتی) در حالت جریانی (streaming mode) را فعال میکند.
- fp8dot4
- افزونهٔ ضرب نقطهای ۴تایی (4-way dot product) از fp8 (ممیز شناور ۸ بیتی) به دقت یگانه (single-precision) را فعال میکند.
- ssve-fp8dot4
- افزونهٔ ضرب نقطهای ۴تایی از fp8 (ممیز شناور ۸ بیتی) به دقت یگانه را در حالت جریانی فعال میکند.
- fp8dot2
- افزونهٔ ضرب نقطهای ۲تایی (2-way dot product) از fp8 (ممیز شناور ۸ بیتی) به دقت نیمه (half-precision) را فعال میکند.
- 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 دستورالعمل «ساده» تنظیم میکند. این هزینه صرفاً یک روش تقریبی (heuristic) است و تضمینی برای تولید نتایج یکدست در میان نسخههای مختلف وجود ندارد.
- -mcmove
- تولید انتقالهای شرطی (conditional moves) را فعال میکند.
- -mnops=num
- پیش از هر دستورالعمل تولیدشدهٔ دیگر، num دستور NOP درج میکند.
- -mno-soft-cmpsf
- برای مقایسههای ممیز شناور با دقت یگانه (single-precision)، یک دستورالعمل "fsub" درج کرده و پرچمها را بررسی میکند. این روش سریعتر از مقایسهٔ نرمافزاری است، اما میتواند در حضور NaNها یا هنگامی که دو عدد کوچکِ متفاوت به گونهای مقایسه میشوند که تفاضل آنها صفر محاسبه میشود، نتایج نادرستی به بار آورد. پیشفرض -msoft-cmpsf است که از مقایسههای نرمافزاریِ کندتر اما سازگار با IEEE استفاده میکند.
- -mstack-offset=num
- آفست (فاصله) میان بالای پشته و اشارهگر پشته را تعیین میکند. بهعنوان مثال، مقدار 8 بدین معناست که هشت بایت در بازهٔ "sp+0...sp+7" میتواند توسط توابع برگ (leaf functions) بدون تخصیص پشته استفاده شود. مقادیر به غیر از 8 یا 16 آزمایشنشده هستند و بعید است کار کنند. همچنین توجه داشته باشید که این گزینه ABI را تغییر میدهد؛ کامپایل کردن برنامهای با آفست پشتهای متفاوت از کتابخانههایی که برنامه با آنها کامپایل شده است عموماً کار نخواهد کرد. این گزینه میتواند در صورتی مفید باشد که بخواهید بررسی کنید آیا یک آفست پشتهٔ متفاوت کد بهتری تولید میکند یا خیر، اما برای استفادهٔ عملی از یک آفست پشتهٔ متفاوت جهت ساخت برنامههای کاربردی، توصیه میشود زنجیرهٔ ابزار (toolchain) را با گزینهٔ مناسب --with-stack-offset=num پیکربندی کنید.
- -mno-round-nearest
- باعث میشود که زمانبند (scheduler) فرض کند حالت گرد کردن روی حالت قطع کردن (truncating) تنظیم شده است. پیشفرض -mround-nearest است.
- -mlong-calls
- اگر توسط یک صفت (attribute) به گونهٔ دیگری مشخص نشده باشد، فرض میکند همهٔ فراخوانیها ممکن است فراتر از محدودهٔ آفست دستورالعملهای "b" / "bl" باشند؛ بنابراین، آدرس تابع را پیش از اجرای یک فراخوانی (که در غیر این صورت مستقیم میبود) درون یک ثبات بارگذاری میکند. این رفتار پیشفرض است.
- -mshort-calls
- اگر توسط یک صفت به گونهٔ دیگری مشخص نشده باشد، فرض میکند همهٔ فراخوانیهای مستقیم در محدودهٔ دستورالعملهای "b" / "bl" قرار دارند، بنابراین از این دستورالعملها برای فراخوانیهای مستقیم استفاده میکند. پیشفرض -mlong-calls است.
- -msmall16
- فرض میکند نشانیها میتوانند به صورت مقادیر ۱۶ بیتی بدون علامت بارگذاری شوند. این مورد شامل نشانیهای توابعی که معناشناسی -mlong-calls برای آنها اعمال شده است، نمیشود.
- -mfp-mode=mode
- حالت غالب
واحد ممیز
شناور (FPU) را
تنظیم
میکند. این
گزینه حالت
ممیز
شناوری را
که در زمان
فراخوانی و
بازگشت از
تابع ارائه
و انتظار
میرود
تعیین
میکند.
منطبق کردن
این حالت با
حالتی که
عمدتاً در
آغاز تابع
به آن نیاز
دارید،
میتواند
با جلوگیری
از
تعویضهای
غیرضروری
حالت،
برنامههای
شما را
کوچکتر و
سریعتر
کند.
mode میتواند روی یکی از مقادیر زیر تنظیم شود:
- caller
- هر حالتی در ورودی تابع معتبر است، و هنگام بازگشت تابع و زمانی که توابع دیگر را فراخوانی میکند، حفظ یا بازیابی میشود. این حالت برای کامپایل کتابخانهها یا سایر واحدهای کامپایلی مفید است که ممکن است بخواهید آنها را در برنامههای متفاوتی با حالتهای FPU غالب گوناگون ادغام کنید، و آسودگیِ امکان استفاده از یک فایل شیء (object file) واحد بر سربار اندازه و سرعت ناشی از هرگونه تعویض حالت اضافی که ممکن است در مقایسه با نیاز به انتخاب حالت 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 میتواند 4 یا 8 باشد. پیشفرض 8 است. توجه داشته باشید که این یک تغییر در 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
- مشخص میکند چه مقدار فضای پشته به بایت (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. همچنین گزینههای ناممستعار میانبری برای سازگاری با گذشته و راحتی کار در دسترس هستند. مقادیر پشتیبانیشده برای 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 بیتی.
- arc600_mul64
- کامپایل برای پردازندهٔ ARC 600 با فعال بودن دستورالعملهای خانوادهٔ "mul64" و "norm"..IP arc601_norm 4 کامپایل برای پردازندهٔ ARC 601 با فعال بودن دستورالعملهای "norm".
- arc601_mul32x16
- کامپایل برای پردازندهٔ ARC 601 با فعال بودن دستورالعملهای "norm" و ضرب ۳۲ در ۱۶ بیتی.
- arc601_mul64
- کامپایل برای پردازندهٔ ARC 601 با فعال بودن دستورالعملهای "norm" و خانوادهٔ "mul64".
- nps400
- کامپایل برای ARC 700 بر روی تراشهٔ NPS400.
- em_mini
- کامپایل برای پیکربندی کمینهگرای ARC EM با مجموعه ثباتهای کاهشیافته.
- -mdpfp
- -mdpfp-compact
- تولید دستورالعملهای FPX با دقت مضاعف (double-precision)، بهینهسازیشده برای پیادهسازی فشرده (compact).
- -mdpfp-fast
- تولید دستورالعملهای FPX با دقت مضاعف (double-precision)، بهینهسازیشده برای پیادهسازی سریع (fast).
- -mno-dpfp-lrsr
- غیرفعال کردن استفاده از ثباتهای کمکی افزونهٔ FPX توسط دستورالعملهای "lr" و "sr".
- -mea
- تولید دستورالعملهای محاسباتی گسترشیافته. در حال حاضر تنها "divaw"، "adds"، "subs" و "sat16" پشتیبانی میشوند. تنها برای -mcpu=ARC700 معتبر است.
- -mno-mpy
- دستورالعملهای خانوادهٔ "mpy" برای ARC700 تولید نشوند. این گزینه منسوخ شده است.
- -mmul32x16
- تولید دستورالعملهای ضرب و ضرب-انباشت ۳۲ در ۱۶ بیتی.
- -mmul64
- تولید دستورالعملهای "mul64" و "mulu64". تنها برای -mcpu=ARC600 معتبر است.
- -mnorm
- تولید دستورالعملهای "norm". اگر -mcpu=ARC700 اعمال شده باشد، این حالت پیشفرض است.
- -mspfp
- -mspfp-compact
- تولید دستورالعملهای FPX با دقت یگانه (single-precision)، بهینهسازیشده برای پیادهسازی فشرده (compact).
- -mspfp-fast
- تولید دستورالعملهای FPX با دقت یگانه (single-precision)، بهینهسازیشده برای پیادهسازی سریع (fast).
- -msimd
- فعال کردن تولید دستورالعملهای ARC SIMD از طریق توابع توکار وابسته به هدف. تنها برای -mcpu=ARC700 معتبر است.
- -msoft-float
- این گزینه نادیده گرفته میشود؛ فقط به منظور سازگاری فراهم شده است. کد ممیز شناور نرمافزاری بهطور پیشفرض تولید میشود، و این پیشفرض میتواند با گزینههای FPX جایگزین شود؛ -mspfp، -mspfp-compact یا -mspfp-fast برای دقت یگانه، و -mdpfp، -mdpfp-compact یا -mdpfp-fast برای دقت مضاعف.
- -mswap
- تولید دستورالعملهای "swap".
- -matomic
- این گزینه استفاده از افزونهٔ قفلشدهٔ load/store شرطی را برای پیادهسازی توابع توکار حافظهٔ اتمیک فعال میکند. برای هستههای ARC 6xx یا ARC EM در دسترس نیست.
- -mdiv-rem
- فعالسازی دستورالعملهای "div" و "rem" برای هستههای ARCv2.
- -mcode-density
- فعالسازی دستورالعملهای تراکم کد برای ARC EM. این گزینه بهطور پیشفرض برای ARC HS فعال است.
- -mll64
- فعالسازی عملیات دوگانهٔ load/store برای هستههای ARC HS.
- -mtp-regno=regno
- مشخص کردن شمارهٔ ثبات اشارهگر ریسه.
- -mmpy-option=multo
- کامپایل کد ARCv2 با یک گزینهٔ طراحی ضربکننده. میتوانید گزینه را با استفاده از یک رشته یا یک مقدار عددی برای multo مشخص کنید. wlh1 مقدار پیشفرض است. مقادیر شناختهشده عبارتند از:
- 0
- none
- هیچ ضربکنندهای در دسترس نیست.
- 1
- w
- ضربکنندهٔ ۱۶ در ۱۶، کاملاً خطلولهای (fully pipelined). دستورالعملهای زیر فعال میشوند: "mpyw" و "mpyuw".
- 2
- wlh1
- ضربکنندهٔ ۳۲ در ۳۲، کاملاً خطلولهای (۱ مرحلهای). دستورالعملهای زیر نیز علاوه بر این فعال میشوند: "mpy"، "mpyu"، "mpym"، "mpymu" و "mpy_s".
- 3
- wlh2
- ضربکنندهٔ ۳۲ در ۳۲، کاملاً خطلولهای (۲ مرحلهای). دستورالعملهای زیر نیز علاوه بر این فعال میشوند: "mpy"، "mpyu"، "mpym"، "mpymu" و "mpy_s".
- 4
- wlh3
- دو ضربکنندهٔ ۱۶ در ۱۶، مسدودکننده (blocking)، ترتیبی. دستورالعملهای زیر نیز علاوه بر این فعال میشوند: "mpy"، "mpyu"، "mpym"، "mpymu" و "mpy_s".
- 5
- wlh4
- یک ضربکنندهٔ ۱۶ در ۱۶، مسدودکننده (blocking)، ترتیبی. دستورالعملهای زیر نیز علاوه بر این فعال میشوند: "mpy"، "mpyu"، "mpym"، "mpymu" و "mpy_s".
- 6
- wlh5
- یک ضربکنندهٔ ۳۲ در ۴، مسدودکننده (blocking)، ترتیبی. دستورالعملهای زیر نیز علاوه بر این فعال میشوند: "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
- پشتیبانی از افزونههای سختافزاری ممیز شناور با دقت یگانه (single-precision) را فعال میکند.
- fpud
- پشتیبانی از افزونههای سختافزاری ممیز شناور با دقت مضاعف (double-precision) را فعال میکند. افزونهٔ ممیز شناور با دقت یگانه نیز فعال میشود. برای ARC EM در دسترس نیست.
- fpuda
- پشتیبانی از افزونههای سختافزاری ممیز شناور با دقت مضاعف را با استفاده از دستورالعملهای کمکی دقت مضاعف فعال میکند. افزونهٔ ممیز شناور با دقت یگانه نیز فعال میشود. این گزینه تنها برای ARC EM در دسترس است.
- fpuda_div
- پشتیبانی از افزونههای سختافزاری ممیز شناور با دقت مضاعف را با استفاده از دستورالعملهای کمکی دقت مضاعف فعال میکند. افزونههای ممیز شناور با دقت یگانه، ریشهٔ دوم و تقسیم نیز فعال میشوند. این گزینه تنها برای ARC EM در دسترس است.
- fpuda_fma
- پشتیبانی از افزونههای سختافزاری ممیز شناور با دقت مضاعف را با استفاده از دستورالعملهای کمکی دقت مضاعف فعال میکند. افزونههای سختافزاری ممیز شناور با دقت یگانه و ضرب و جمع ترکیبشده (fused multiply and add) نیز فعال میشوند. این گزینه تنها برای 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) با ۱۶ مدخل تولید کند. این گزینه ماکروی پیشپردازندهٔ "__ARC_RF16__" را تعریف میکند.
- -mbranch-index
- استفاده از دستورالعملهای "bi" یا "bih" را برای پیادهسازی جدولهای پرش فعال میکند.
گزینههای زیر به اسمبلر منتقل میشوند و نمادهای ماکروی پیشپردازنده را نیز تعریف میکنند:
- -mdsp-packa
- برای فعالسازی افزونههای DSP Pack A به اسمبلر منتقل میشود. همچنین نماد پیشپردازندهٔ "__Xdsp_packa" را تنظیم میکند. این گزینه منسوخ شده است.
- -mdvbf
- برای فعالسازی افزونهٔ dual Viterbi butterfly به اسمبلر منتقل میشود. همچنین نماد پیشپردازندهٔ "__Xdvbf" را تنظیم میکند. این گزینه منسوخ شده است.
- -mlock
- برای فعالسازی افزونهٔ شرطی locked load/store به اسمبلر منتقل میشود. همچنین نماد پیشپردازندهٔ "__Xlock" را تنظیم میکند.
- -mmac-d16
- به اسمبلر منتقل میشود. همچنین نماد پیشپردازندهٔ "__Xxmac_d16" را تنظیم میکند. این گزینه منسوخ شده است.
- -mmac-24
- به اسمبلر منتقل میشود. همچنین نماد پیشپردازندهٔ "__Xxmac_24" را تنظیم میکند. این گزینه منسوخ شده است.
- -mrtsc
- برای فعالسازی دستورالعمل افزونهٔ شمارندهٔ برچسب زمانی ۶۴ بیتی به اسمبلر منتقل میشود. همچنین نماد پیشپردازندهٔ "__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
- فراخوانیها را به صورت فراخوانیهای غیرمستقیم مبتنی بر ثبات تولید میکند، و در نتیجه دسترسی به کل دامنه نشانی ۳۲ بیتی را ممکن میسازد.
- -mmedium-calls
- برای فراخوانیها، از محدوده آدرسدهی کمتر از ۲۵ بیتی استفاده نمیکند، که همان آفستِ در دسترس برای یک دستور branch-and-link غیرشرطی است. اجرای شرطی فراخوانیهای تابع متوقف میشود تا امکان استفاده از دامنه ۲۵ بیتی به جای دامنه ۲۱ بیتی با branch-and-link شرطی فراهم گردد. این حالت پیشفرض برای زنجیرهابزارهای ساختهشده برای اهداف "arc-linux-uclibc" و "arceb-linux-uclibc" است.
- -G num
- تعاریف دادههای قابلمشاهده از خارج را در بخش دادههای کوچک (small data) قرار میدهد، چنانچه اندازه آن دادهها بزرگتر از num بایت نباشد. مقدار پیشفرض num برای هر پیکربندی ARC برابر ۴، یا در صورت وجود عملیات دوتایی بارگذاری/ذخیره (double load/store) برابر ۸ است.
- -mno-sdata
- مراجع sdata را تولید نمیکند. این حالت پیشفرض برای زنجیرهابزارهای ساختهشده برای اهداف "arc-linux-uclibc" و "arceb-linux-uclibc" است.
- -mvolatile-cache
- برای ارجاعات volatile، از دسترسیهای حافظه معمولی دارای حافظه پنهان (cached) استفاده میکند. این حالت پیشفرض است.
- -mno-volatile-cache
- دور زدن حافظه پنهان (cache bypass) را برای ارجاعات volatile فعال میکند.
گزینههای زیر تولید کد را دقیقتر تنظیم (fine-tune) میکنند:
- -malign-call
- کاری انجام نمیدهد. برای سازگاری با نسخههای پیشین حفظ شده است.
- -mauto-modify-reg
- استفاده از تغییر قبل/بعد (pre/post modify) همراه با جابهجایی ثبات را فعال میکند.
- -mbbit-peephole
- کاری انجام نمیدهد. برای سازگاری با نسخههای پیشین حفظ شده است.
- -mno-brcc
- این گزینه یک گذر (pass) مختص هدف را در arc_reorg جهت تولید دستورالعملهای مقایسه و انشعاب ("brcc") غیرفعال میکند. این گزینه تاثیری بر تولید این دستورالعملها از طریق گذر combiner ندارد.
- -mcase-vector-pcrel
- برای فعالسازی کوتاهسازی جدول case، از جدولهای switch case وابسته به PC استفاده میکند. این حالت پیشفرض برای -Os است.
- -mcompact-casesi
- الگوی فشرده "casesi" را فعال میکند. این حالت پیشفرض برای -Os است و تنها برای هستههای ARCv1 در دسترس است. این گزینه منسوخ شده است.
- -mno-cond-exec
- گذر ویژه ARCompact
را برای
تولید
دستورالعملهای
اجرای شرطی
غیرفعال
میکند.
به دلیل زمانبندی شکاف تاخیر (delay slot) و برهمکنش میان تعداد عملوندها، اندازه مقادیر صریح (literal sizes)، طول دستورالعملها و پشتیبانی از اجرای شرطی، گذر مستقل از هدف برای تولید اجرای شرطی معمولاً ناکافی است؛ از این رو پورت ARC یک گذر اختصاصی را نگهداشته است که تلاش میکند پس از انجام تخصیص ثبات، کوتاهسازی انشعاب و زمانبندی شکاف تاخیر، فرصتهای بیشتری برای تولید اجرای شرطی بیابد. این گذر عموماً، اما نه همیشه، عملکرد و اندازه کد را به بهای زمان کامپایل بیشتر بهبود میبخشد، به همین دلیل گزینهای برای خاموش کردن آن وجود دارد. اگر با دستورالعملهای فراخوانی به دلیل شرطی شدن و فراتر رفتن از محدوده آفست مجازشان مشکل دارید، باید استفاده از -mmedium-calls را به عنوان جایگزین در نظر بگیرید.
- -mearly-cbranchsi
- استفاده پیش از بارگذاری مجدد (pre-reload) از الگوی "cbranchsi" را فعال میکند.
- -mexpand-adddi
- در زمان تولید RTL، الگوهای "adddi3" و "subdi3" را به "add.f"، "adc" و غیره بسط میدهد. این گزینه منسوخ شده است.
- -mindexed-loads
- استفاده از بارگذاریهای نمایهشده (indexed loads) را فعال میکند. این امر میتواند مشکلساز باشد زیرا برخی از بهینهسازها فرض میکنند که ذخیرهسازیهای نمایهشده نیز وجود دارند، در حالی که چنین نیست.
- -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
- برای تمام توابع یک فریم پشته سازگار با استاندارد ARM Procedure Call Standard تولید میکند، حتی اگر برای اجرای صحیح کد اکیداً ضروری نباشد. مشخص کردن -fomit-frame-pointer همراه با این گزینه باعث میشود فریمهای پشته برای توابع برگ (leaf functions) تولید نشوند. مقدار پیشفرض -mno-apcs-frame است. این گزینه منسوخ شده است.
- -mapcs
- این گزینه مترادفی برای -mapcs-frame است و منسوخ شده است.
- -mthumb-interwork
- تولید کدی که از فراخوانی متقابل میان مجموعهدستورهای ARM و Thumb پشتیبانی میکند. بدون این گزینه، در معماریهای پیش از نسخه ۵ (pre-v5)، نمیتوان با اطمینان از هر دو مجموعهدستور در یک برنامه استفاده کرد. مقدار پیشفرض -mno-thumb-interwork است، چرا که در صورت تعیین -mthumb-interwork کدی با حجم کمی بیشتر تولید میشود. در پیکربندیهای AAPCS این گزینه بیمعنی است.
- -mno-sched-prolog
- جلوگیری از بازآرایی دستورالعملها در مقدمه تابع (function prologue)، یا ادغام آن دستورالعملها با دستورالعملهای بدنه تابع. این بدان معناست که تمام توابع با مجموعهای قابل تشخیص از دستورالعملها (یا در واقع انتخابی از میان یک مجموعه کوچک از مقدمههای مختلف تابع) شروع میشوند، و میتوان از این اطلاعات برای یافتن نقطه شروع توابع در یک قطعه کد اجرایی استفاده کرد. مقدار پیشفرض -msched-prolog است.
- -mfloat-abi=name
- مشخص
میکند از
کدام ABI ممیز
شناور
استفاده
شود. مقادیر
مجاز
عبارتند از:
soft، softfp و hard.
مشخص کردن soft باعث میشود GCC خروجیای حاوی فراخوانیهای کتابخانهای برای عملیات ممیز شناور تولید کند. softfp اجازه تولید کد با استفاده از دستورالعملهای سختافزاری ممیز شناور را میدهد، اما همچنان از قراردادهای فراخوانی soft-float استفاده میکند. hard اجازه تولید دستورالعملهای ممیز شناور را داده و از قراردادهای فراخوانی اختصاصی FPU استفاده میکند.
مقدار پیشفرض به پیکربندی هدف خاص بستگی دارد. توجه داشته باشید که ABIهای hard-float و soft-float از نظر پیوند با یکدیگر سازگار نیستند؛ باید کل برنامه خود را با همان 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
- افزونهٔ امنیتی.
- +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 با پشتیبانی از مجازیسازی.
- +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
- دستورالعملهای رمزنگاری.
- +nocrypto
- غیرفعالسازی دستورالعملهای رمزنگاری.
- +nofp
- غیرفعالسازی دستورالعملهای ممیز شناور، Advanced SIMD و رمزنگاری.
- +sb
- دستورالعمل سد گمانهزنی (Speculation Barrier)..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 و نیز افزونهٔ ضرب نقطهای و افزونهٔ fmla ممیز شناور با دقت نیمه را فعال میکند.
- +simd
- دستورالعملهای ممیز شناور و Advanced SIMD در ARMv8.3-A و نیز افزونهٔ ضرب نقطهای.
- +crypto
- دستورالعملهای رمزنگاری. این گزینه همچنین دستورالعملهای ممیز شناور و Advanced SIMD و نیز افزونهٔ ضرب نقطهای را فعال میکند.
- +nocrypto
- غیرفعال کردن افزونهٔ رمزنگاری.
- +nofp
- غیرفعال کردن دستورالعملهای ممیز شناور، Advanced SIMD و رمزنگاری.
- +sb
- دستورالعمل سد گمانهزنی (Speculation Barrier).
- +predres
- دستورالعملهای محدودسازی پیشبینی اجرا و داده.
- +i8mm
- دستورالعملهای ضرب ماتریس عدد صحیح ۸ بیتی. این گزینه همچنین دستورالعملهای ممیز شناور و Advanced SIMD را فعال میکند.
- +bf16
- دستورالعملهای ممیز شناور با دقت نیمه Brain. این گزینه همچنین دستورالعملهای ممیز شناور و Advanced SIMD را فعال میکند.
- +fp16
- دستورالعملهای پردازش دادهٔ ممیز شناور با دقت نیمه. این گزینه همچنین دستورالعملهای ممیز شناور و Advanced SIMD و نیز افزونهٔ ضرب نقطهای و افزونهٔ fmla ممیز شناور با دقت نیمه را فعال میکند.
- +simd
- دستورالعملهای ممیز شناور و Advanced SIMD در ARMv8.3-A و نیز افزونهٔ ضرب نقطهای.
- +crypto
- دستورالعملهای رمزنگاری. این گزینه همچنین دستورالعملهای ممیز شناور و Advanced SIMD و نیز افزونهٔ ضرب نقطهای را فعال میکند.
- +nocrypto
- غیرفعال کردن افزونهٔ رمزنگاری.
- +nofp
- غیرفعال کردن دستورالعملهای ممیز شناور، Advanced SIMD و رمزنگاری.
- +i8mm
- دستورالعملهای ضرب ماتریس عدد صحیح ۸ بیتی. این گزینه همچنین دستورالعملهای ممیز شناور و Advanced SIMD را فعال میکند.
- +bf16
- دستورالعملهای ممیز شناور با دقت نیمه Brain. این گزینه همچنین دستورالعملهای ممیز شناور و Advanced SIMD را فعال میکند.
- +fp16
- دستورالعملهای پردازش دادهٔ ممیز شناور با دقت نیمه. این گزینه همچنین دستورالعملهای ممیز شناور و Advanced SIMD و نیز افزونهٔ ضرب نقطهای و افزونهٔ fmla ممیز شناور با دقت نیمه را فعال میکند.
- +simd
- دستورالعملهای ممیز شناور و Advanced SIMD در ARMv8.3-A و نیز افزونهٔ ضرب نقطهای.
- +crypto
- دستورالعملهای رمزنگاری. این گزینه همچنین دستورالعملهای ممیز شناور و Advanced SIMD و نیز افزونهٔ ضرب نقطهای را فعال میکند.
- +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-Profile Vector Extension (MVE).
- +mve.fp
- دستورالعملهای عدد صحیح و ممیز شناور با دقت تکی M-Profile Vector Extension (MVE).
- +fp
- دستورالعملهای ممیز شناور با دقت تکی.
- +fp.dp
- دستورالعملهای ممیز شناور با دقت تکی و مضاعف.
- +nofp
- غیرفعال کردن افزونهٔ ممیز شناور.
- +cdecp0, +cdecp1, ... , +cdecp7
- فعال کردن Custom Datapath Extension (CDE) روی همپردازندههای انتخابشده با توجه به شمارههای مشخصشده در گزینهها در بازهٔ ۰ تا ۷.
- +pacbti
- فعال کردن افزونهٔ Pointer Authentication and Branch Target Identification.
- +dsp
- دستورالعملهای DSP.
- +nodsp
- غیرفعال کردن افزونهٔ DSP.
- +fp
- دستورالعملهای ممیز شناور با دقت تکی.
- +fp.dp
- دستورالعملهای ممیز شناور با دقت تکی و مضاعف.
- +nofp
- غیرفعال کردن افزونهٔ ممیز شناور.
- +cdecp0, +cdecp1, ... , +cdecp7
- فعال کردن Custom Datapath Extension (CDE) روی همپردازندههای انتخابشده با توجه به شمارههای مشخصشده در گزینهها در بازهٔ ۰ تا ۷.
- +crc
- دستورالعملهای Cyclic Redundancy Check (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
باید
کارایی کد
را برای آن
میزانسازی
کند. برای
برخی
پیادهسازیهای
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ها در این بازه سودمند است و پرهیز از افت کارایی در سایر CPUها. با گذشت زمان و آمدن و رفتن مدلهای پردازنده، اثرات این گزینه ممکن است در نسخههای آیندهٔ GCC تغییر کند.
گزینهٔ -mtune همان گزینههای افزونهٔ مجاز در -mcpu را میپذیرد، اما این گزینههای افزونه بر میزانسازی کد تولیدشده تأثیری ندارند.
گزینهٔ -mtune=native باعث میشود کامپایلر پردازندهٔ رایانهٔ ساخت را بهطور خودکار تشخیص دهد. در حال حاضر، این ویژگی فقط در GNU/Linux پشتیبانی میشود و همهٔ معماریها شناسایی نمیشوند. اگر تشخیص خودکار ناموفق باشد، این گزینه هیچ اثری نخواهد داشت..IP -mcpu=name[+extension...] 4 این گزینه نام پردازندهٔ ARM هدف را مشخص میکند. GCC از این نام برای استخراج نام معماری ARM هدف (همانند حالتی که با -march مشخص شده باشد) و نوع پردازندهٔ ARM جهت بهینهسازی کارایی (همانند حالتی که با -mtune مشخص شده باشد) استفاده میکند. در مواردی که این گزینه به همراه -march یا -mtune به کار رود، آن گزینهها بر بخش متناظر از این گزینه اولویت دارند.
بسیاری از پردازندههای پشتیبانیشده، افزونههای معماری اختیاری را پیادهسازی میکنند. در این موارد، این افزونههای معماری معمولاً بهطور پیشفرض فعال هستند. چنانچه پیادهسازیهایی وجود داشته باشند که فاقد افزونه هستند، میتوان از نحو افزونه برای غیرفعال کردن مواردی که حذف شدهاند استفاده کرد. برای دستورالعملهای ممیز شناور و Advanced SIMD (Neon)، تنظیمات گزینههای -mfloat-abi و -mfpu نیز باید در نظر گرفته شوند: دستورالعملهای ممیز شناور و Advanced SIMD تنها در صورتی استفاده خواهند شد که -mfloat-abi روی soft تنظیم نشده باشد؛ و هر تنظیمی از -mfpu غیر از auto، دستورالعملهای افزونهٔ ممیز شناور و SIMD موجود را نادیده گرفته و جایگزین میکند.
برای نمونه، cortex-a9 را میتوان در سه پیکربندی اصلی یافت: فقط اعداد صحیح، تنها با یک واحد ممیز شناور، یا با ممیز شناور و Advanced SIMD. حالت پیشفرض فعالسازی تمامی دستورالعملها است، اما میتوان از افزونههای +nosimd و +nofp به ترتیب برای غیرفعال کردن تنها SIMD یا هر دو دستورالعملهای SIMD و ممیز شناور استفاده کرد.
نامهای مجاز برای این گزینه همانند گزینههای مجاز برای -mtune است.
گزینههای افزونهٔ زیر میان پردازندههای فهرستشده مشترک هستند:
- +nodsp
- غیرفعال کردن دستورالعملهای DSP در cortex-m33، cortex-m35p، cortex-m52، cortex-m55 و cortex-m85. همچنین غیرفعال کردن دستورالعملهای اعداد صحیح و ممیز شناور با دقت یگانهٔ M-Profile Vector Extension (MVE) در cortex-m52، cortex-m55 و cortex-m85.
- +nopacbti
- غیرفعال کردن Pointer Authentication and Branch Target Identification Extension در cortex-m52 و cortex-m85.
- +nomve
- غیرفعال کردن دستورالعملهای اعداد صحیح و ممیز شناور با دقت یگانهٔ M-Profile Vector Extension (MVE) در cortex-m52، cortex-m55 و cortex-m85.
- +nomve.fp
- غیرفعال کردن دستورالعملهای ممیز شناور با دقت یگانهٔ M-Profile Vector Extension (MVE) در cortex-m52، cortex-m55 و cortex-m85.
- +cdecp0, +cdecp1, ... , +cdecp7
- فعال کردن Custom Datapath Extension (CDE) روی همپردازندههای انتخابشده بر اساس شمارههای ارائهشده در گزینهها در محدودهٔ ۰ تا ۷ در 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
- بخش دقت مضاعف دستورالعملهای ممیز شناور را در 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 باعث میشود کامپایلر پردازندهٔ رایانهٔ ساخت را بهطور خودکار تشخیص دهد. در حال حاضر، این قابلیت تنها در GNU/Linux پشتیبانی میشود و همهٔ معماریها شناسایی نمیشوند. چنانچه تشخیص خودکار ناموفق باشد، این گزینه هیچ تاثیری ندارد.
گزینهٔ -mcpu=unset باعث میشود کامپایلر هرگونه گزینهٔ -mcpu=... را که پیشتر در خط فرمان آمده نادیده بگیرد و چنان رفتار کند که گویی این گزینه هرگز ارسال نشده است. این ویژگی برای جلوگیری از هشدارهای مربوط به تداخل گزینههای پردازنده و معماری، هنگامی که این دو مشخصات متفاوتی تولید میکنند، سودمند است.
- -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
- قالب نوع دادهٔ ممیز شناور با نیمدقت "__fp16" را مشخص میکند. نامهای مجاز عبارتند از none، ieee و alternative؛ حالت پیشفرض none است که در این حالت نوع "__fp16" تعریف نمیشود.
- -mstructure-size-boundary=n
- اندازهٔ
تمام
ساختارها
(structures) و
اجتماعها
(unions) به مضربی
از تعداد
بیتهای
تعیینشده
توسط این
گزینه گرد
میشوند.
مقادیر
مجاز
عبارتند از
۸، ۳۲ و ۶۴.
مقدار
پیشفرض در
زنجیرهابزارهای
مختلف
متفاوت است.
برای
زنجیرهابزار
مبتنی بر COFF
مقدار
پیشفرض ۸
است. مقدار
۶۴ تنها در
صورتی مجاز
است که ABI
زیربنایی
از آن
پشتیبانی
کند.
تعیین مقداری بزرگتر میتواند کدی سریعتر و کارآمدتر تولید کند، اما ممکن است حجم برنامه را نیز افزایش دهد. مقادیر مختلف بهطور بالقوه ناسازگار هستند. کدی که با یک مقدار کامپایل شده باشد، در صورت تبادل اطلاعات از طریق ساختارها یا اجتماعها، لزوماً نمیتواند با کد یا کتابخانههای کامپایلشده با مقداری دیگر کار کند.
این گزینه منسوخ شده است.
- -mabort-on-noreturn
- یک فراخوانی به تابع "abort" در پایان یک تابع "noreturn" ایجاد میکند. در صورتی که تابع تلاش کند بازگردد، این دستور اجرا میشود.
- -mlong-calls
- -mno-long-calls
- به
کامپایلر
دستور
میدهد که
فراخوانی
توابع را
ابتدا با
بارگذاری
نشانی تابع
در یک ثبات
و سپس انجام
فراخوانی
زیرروال (subroutine call)
روی این
ثبات انجام
دهد. این
سوییچ
زمانی لازم
است که تابع
هدف، خارج
از محدودهٔ
آدرسدهی
۶۴
مگابایتی
نسخهٔ
مبتنی بر
آفستِ
دستورالعمل
فراخوانی
زیرروال
قرار داشته
باشد.
حتی اگر این سوییچ فعال باشد، تمام فراخوانیهای تابع به فراخوانیهای طولانی (long calls) تبدیل نمیشوند. سازوکار تشخیصی بدینگونه است که توابع ایستا (static)، توابعی با صفت "short_call"، توابعی که در دامنهٔ رهنمود "#pragma no_long_calls" قرار دارند، و توابعی که تعاریف آنها پیشتر در واحد کامپایل جاری ترجمه شدهاند، به فراخوانی طولانی تبدیل نمیشوند. استثناهای این قاعده عبارتند از تعاریف توابع ضعیف (weak functions)، توابعی با صفت "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) ثابت است. این امر امکان استفاده از عملیات آدرسدهی وابسته به PC را برای دسترسی به دادههایی که مشخص است در بخش data قرار دارند فراهم میکند. برای مقاصد غیر VxWorks RTP، این گزینه به طور پیشفرض فعال است. هنگام غیرفعال شدن در چنین مقاصدی، به طور پیشفرض -msingle-pic-base را فعال خواهد کرد.
- -mpoke-function-name
- نام هر تابع
را
مستقیماً
پیش از
مقدمهٔ
تابع، در
بخش 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 را به صورت متناوب بین توابع جابهجا میکند. این گزینه برای آزمون رگرسیونِ تولید کد ترکیبی Thumb/ARM ارائه شده است و برای استفادهٔ عادی در کامپایل کد در نظر گرفته نشده است.
- -mtpcs-frame
- یک فریم پشته منطبق با استاندارد فراخوانی رویهٔ تامب (Thumb Procedure Call Standard) برای همهٔ توابع غیربرگی (non-leaf) تولید میکند. (یک تابع برگی تابعی است که هیچ تابع دیگری را فراخوانی نمیکند.) پیشفرض -mno-tpcs-frame است.
- -mtpcs-leaf-frame
- یک فریم پشته منطبق با استاندارد فراخوانی رویهٔ تامب (Thumb Procedure Call Standard) برای همهٔ توابع برگی تولید میکند. (یک تابع برگی تابعی است که هیچ تابع دیگری را فراخوانی نمیکند.) پیشفرض -mno-apcs-leaf-frame است.
- -mcallee-super-interworking
- به تمام توابع دارای دید بیرونی در فایل در حال کامپایل، یک سرآیند از مجموعه دستورالعملهای ARM اختصاص میدهد که پیش از اجرای بقیهٔ تابع، به حالت Thumb جابهجا میشود. این امر امکان فراخوانی این توابع را از کدهای non-interworking فراهم میکند. این گزینه در پیکربندیهای AAPCS معتبر نیست زیرا interworking به طور پیشفرض در آنها فعال است.
- -mcaller-super-interworking
- اجازه میدهد فراخوانیها از طریق اشارهگرهای تابع (شامل توابع مجازی)، بدون توجه به اینکه کد مقصد برای interworking کامپایل شده است یا خیر، به درستی اجرا شوند. در صورت فعال بودن این گزینه، هزینهٔ اجرای اشارهگر تابع بار پردازشی اندکی خواهد داشت. این گزینه در پیکربندیهای AAPCS معتبر نیست زیرا interworking به طور پیشفرض در آنها فعال است.
- -mtp=name
- مدل دسترسی به اشارهگر حافظهٔ محلی رشته (TLS) را مشخص میکند. مدل 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 and local exec) تحت تأثیر این گزینه قرار نمیگیرند و همیشه از طرح اصلی استفاده میکنند.
- -mword-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
غیرفعال
است، و برای
سایر
معماریها
فعال است.
اگر دسترسی
ناهمتراز
فعال
نباشد،
دسترسی به
کلمات در
ساختارهای
دادهای
فشرده (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
- فرض میکند که اسمبلر درونخطی از نحو یکپارچهٔ asm (unified syntax) استفاده میکند. مقدار پیشفرض در حال حاضر غیرفعال است که بیانگر نحو تفکیکشده (divided syntax) است. این گزینه هیچ اثری بر Thumb2 ندارد؛ با این حال ممکن است در نسخههای بعدی GCC تغییر کند. نحو تفکیکشده باید منسوخ تلقی شود.
- -mrestrict-it
- تولید بلوکهای IT را به منظور تطابق با قوانین ARMv8-A محدود میکند. بلوکهای IT تنها میتوانند شامل یک دستورالعمل ۱۶ بیتی از یک مجموعه دستورالعمل مشخص باشند. این گزینه برای حالت Thumb در ARMv8-A به طور پیشفرض فعال است.
- -mprint-tune-info
- اطلاعات تنظیم پردازنده (CPU tuning) را به صورت توضیح (کامنت) در فایل اسمبلر چاپ میکند. این گزینه تنها برای آزمونهای رگرسیونِ کامپایلر استفاده میشود و برای استفادهٔ عادی در کامپایل کد در نظر گرفته نشده است. این گزینه به طور پیشفرض غیرفعال است.
- -mverbose-cost-dump
- تخلیهٔ پرحجم (verbose) مدل هزینه را در فایلهای گزارش اشکالزدایی (debug dump) فعال میکند. این گزینه برای استفاده در اشکالزدایی کامپایلر ارائه شده است..IP -mpure-code 4 از قرار گرفتن دادههای ثابت در بخشهای کد جلوگیری میکند. علاوه بر این، هنگام کامپایل برای قالب شیء ELF، به تمامی بخشهای متن، صفت بخش مختص پردازنده در ELF، یعنی "SHF_ARM_PURECODE" را اختصاص میدهد. این گزینه تنها هنگام تولید کد غیر-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
- انتخاب ABI
مربوط به FDPIC،
که از
توصیفکنندههای
تابع ۶۴
بیتی برای
نمایش
اشارهگرها
به توابع
استفاده
میکند.
هنگامی که
کامپایلر
برای اهداف
"arm-*-uclinuxfdpiceabi"
پیکربندی
شده باشد،
این گزینه
بهطور
پیشفرض
فعال است و
در صورتی که
هیچیک از
گزینههای
مرتبط با PIC/PIE
مشخص نشده
باشند،
مستلزم -fPIE
خواهد بود.
در سایر
اهداف، این
گزینه تنها
ویژگیهای
تولید کد
مختص FDPIC را
فعال
میکند، و
کاربر باید
در صورت
نیاز،
گزینههای
مربوط به PIC/PIE
را
بهصراحت
مشخص کند.
توجه داشته باشید که پیوند ایستا (static linking) پشتیبانی نمیشود، زیرا هنگام بازنشانی مکانی خودکار برنامه (self-relocate)، همچنان پیونددهنده پویا را درگیر خواهد کرد. اگر چنین رفتاری قابل قبول است، از گزینههای -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" و یک فایل device-specs ("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"
- دستگاههای «کلاسیک» با حداکثر 8 KiB حافظه برنامه. mcu = "attiny22", "attiny26", "at90s2313", "at90s2323", "at90s2333", "at90s2343", "at90s4414", "at90s4433", "at90s4434", "at90c8534", "at90s8515", "at90s8535".
- "avr25"
- دستگاههای «کلاسیک» با حداکثر 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"
- دستگاههای «کلاسیک» با 16 KiB تا 64 KiB حافظه برنامه. mcu = "at76c711", "at43usb355".
- "avr31"
- دستگاههای «کلاسیک» با 128 KiB حافظه برنامه. mcu = "atmega103", "at43usb320".
- "avr35"
- دستگاههای «کلاسیک» با 16 KiB تا 64 KiB حافظه برنامه و دارای دستورالعمل "MOVW". mcu = "attiny167", "attiny1634", "atmega8u2", "atmega16u2", "atmega32u2", "ata5505", "ata6617c", "ata664251", "at90usb82", "at90usb162".
- "avr4"
- دستگاههای «بهبودیافته» با حداکثر 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"
- دستگاههای «بهبودیافته» با 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"
- دستگاههای «بهبودیافته» با 128 KiB حافظه برنامه. mcu = "atmega128", "atmega128a", "atmega128rfa1", "atmega128rfr2", "atmega1280", "atmega1281", "atmega1284", "atmega1284p", "atmega1284rfr2", "at90can128", "at90usb1286", "at90usb1287".
- "avr6"
- دستگاههای «بهبودیافته» با 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
- استفاده از
یک جدول
بردار
فشرده (CVT).
برخی از
دستگاهها
از 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 نسخهٔ 2.3 به بعد در دسترس است ("https://github.com/avrdudes/avr-libc/issues/1010").
- -mdouble=bits
- -mlong-double=bits
- اندازهٔ (بر حسب بیت) نوع "double" یا "long double" را به ترتیب تعیین میکند. مقادیر ممکن برای bits برابر ۳۲ و ۶۴ است. مجاز بودن یا نبودن یک مقدار مشخص برای bits به گزینههای پیکربندیِ "--with-double=" و "--with-long-double=" بستگی دارد ("https://gcc.gnu.org/install/configure.html#avr")، و همین امر برای مقادیر پیشفرض این گزینهها نیز صدق میکند.
- -mgas-isr-prologues
- روالهای سرویس وقفه (ISRها) میتوانند از شبهدستور "__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 نسخهٔ 2.3 به بعد عملکرد مورد انتظار را خواهد داشت ("https://github.com/avrdudes/avr-libc/issues/1012"). در نسخههای قدیمیتر، هیچ بهبودی در عملکرد حاصل نخواهد شد.
- -mno-interrupts
- کد تولیدشده با وقفههای سختافزاری سازگار نیست. اندازهٔ کد کوچکتر است.
- -mrelax
- تلاش
میکند در
صورت
امکان،
دستور
"CALL" یا
"JMP" را با
دستور
کوتاهتر
"RCALL" یا
"RJMP"
جایگزین
کند. تنظیم
-mrelax صرفاً
گزینهٔ --mlink-relax
را به خط
فرمان
اسمیلر و
گزینهٔ --relax
را به خط
فرمان
پیونددهنده
اضافه
میکند.
عملیات Jump relaxing توسط پیونددهنده انجام میگیرد زیرا آفستهای پرش پیش از تعیین مکان نهایی کد مشخص نیستند. بنابراین، کد اسمبلی تولیدشده توسط کامپایلر یکسان است، اما دستورهای موجود در فایل اجرایی ممکن است با دستورهای موجود در کد اسمبلی تفاوت داشته باشند.
اگر به stubهای پیونددهنده نیاز باشد، این بهینهسازی باید فعال شود؛ بخش مربوط به "EIND" و stubهای پیونددهنده در زیر را ببینید.
- -mrodata-in-ram
- -mno-rodata-in-ram
- بخشهای
".rodata" را
برای
دادههای
فقطخواندنی،
بهترتیب
در RAM یا در
حافظهٔ
برنامه
قرار
میدهد.
برای بیشتر
دستگاهها
انتخابی
وجود ندارد
و این گزینه
بیشتر شبیه
به یک تأیید
(assertion) عمل
میکند.
از نسخهٔ ۱۴ و برای دستگاههای *AVR64 و *AVR128، بخش ".rodata" بهطور پیشفرض در حافظهٔ flash قرار میگیرد، مشروط بر این که پشتیبانی مورد نیاز در GNU Binutils (مورد PR31124 ("https://sourceware.org/PR31124")) در دسترس باشد. در آن حالت، -mrodata-in-ram میتواند برای بازگشت به چیدمان قبلی با ".rodata" در RAM استفاده شود.
- -mtiny-stack
- تنها ۸ بیت پایینی اشارهگر پشته را تغییر میدهد.
- -mfract-convert-truncate
- اجازه میدهد برای انواع ممیز ثابت کسری، به جای گرد کردن به سمت صفر از بُرش (truncation) استفاده شود.
- -nodevicelib
- با
کتابخانهٔ
ویژهٔ
دستگاه در AVR-LibC
یعنی
"libmcu.a"
پیوند
ایجاد
نمیکند.
توجه داشته باشید که از AVR-LibC نسخهٔ 2.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) تابع
تخصیص داده
و آزاد
میکند.
بدون این
گزینه،
آرگومانهای
خروجی پیش
از
فراخوانی
تابع push شده و
پس از آن pop
میشوند.
همچنین
گزینهٔ
بهینهسازی
-fdefer-pop را در Optimize
Options,,optimization option
ببینید.
بیرون کشیدن (pop کردن) آرگومانها پس از فراخوانی تابع میتواند در AVR هزینهبر باشد، بنابراین انباشتن فضای پشته ممکن است به تولید فایلهای اجرایی کوچکتر منجر شود زیرا نیازی نیست آرگومانها پس از فراخوانی تابع از پشته حذف شوند.
این گزینه میتواند حجم کد را برای توابعی که فراخوانیهای متعددی به توابع دریافتکنندهٔ آرگومان روی پشته دارند (مانند توابع شبیه printf)، کاهش دهد.
- -mbranch-cost=cost
- هزینهٔ انشعاب را برای دستورهای انشعاب شرطی روی cost تنظیم میکند. مقادیر معقول برای cost اعداد صحیح، کوچک و نامنفی هستند. هزینهٔ انشعاب پیشفرض 0 است..IP -mcall-prologues 4 مقدمهها و مؤخرههای توابع (prologues/epilogues) بهصورت فراخوانی زیرروالهای مناسب بسط داده میشوند. اندازهٔ کد کوچکتر میشود.
- -mfuse-add
- -mno-fuse-add
- -mfuse-add=level
- دسترسهای غیرمستقیم به حافظه را در دستگاههای تقلیلیافتهٔ Tiny بهینهسازی میکند. مقدار پیشفرض برای بهینهسازیهای -Og و -O1 از "level=1" و برای سطوح بهینهسازی بالاتر از "level=2" استفاده میکند. مقادیر معتبر برای level عبارتند از 0، 1 و 2.
- -mfuse-move
- -mno-fuse-move
- -mfuse-move=level
- یک گذر بهینهسازی پس از بازخوانی (post reload) را اجرا میکند که تلاش مینماید دستورالعملهای انتقال (move) را ادغام کرده و دستورالعملهای چندبایتی را به عملیاتهای ۸ بیتی تقسیم کند. پیشفرض برای بهینهسازی -O1 از "level=3" و برای بهینهسازیهای بالاتر از "level=23" استفاده میکند. مقادیر معتبر برای level در بازهٔ 0 ... 23 قرار دارند که مقداری بر مبنای مختلط (mixed radix) ۳:۲:۲:۲ است. هر رقم جنبهای از بهینهسازی را کنترل میکند.
- -mfuse-move2
- یک گذر بهینهسازی پس از ترکیب (post combine) را اجرا میکند که تلاش مینماید دستورالعملهای انتقال را ادغام کند.
- -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" و دستگاههایی با بیش از ۱۲۸ کیبیبایت حافظهٔ Flash
اشارهگرها در این پیادهسازی پهنای ۱۶ بیتی دارند. آدرس یک تابع یا برچسب بهصورت آدرس کلمهای (word address) نشان داده میشود تا پرشها و فراخوانیهای غیرمستقیم بتوانند هر آدرس کدی در محدودهٔ ۶۴ کیبیکلمه را هدف قرار دهند.
به منظور تسهیل پرش غیرمستقیم در دستگاههایی با بیش از ۱۲۸ کیبیبایت فضای حافظهٔ برنامه، یک ثبات با کارکرد ویژه (SFR) به نام "EIND" وجود دارد که هنگام استفاده از دستورالعملهای "EICALL" یا "EIJMP" بهعنوان پرارزشترین بخش آدرس هدف عمل میکند.
پرشها و فراخوانیهای غیرمستقیم در این دستگاهها توسط کامپایلر بهصورت زیر مدیریت میشوند و مشمول محدودیتهایی هستند:
- کامپایلر هرگز "EIND" را مقداردهی نمیکند.
- کامپایلر از "EIND" بهطور ضمنی در دستورالعملهای "EICALL"/"EIJMP" استفاده میکند، یا ممکن است برای شبیهسازی فراخوانی/پرش غیرمستقیم با استفاده از دستورالعمل "RET"، مستقیماً "EIND" را بخواند.
- کامپایلر فرض میکند که "EIND" هرگز در طول کد راهاندازی یا در حین اجرای برنامه تغییر نمیکند. بهویژه، "EIND" در مقدمه/مؤخرهٔ (prologue/epilogue) توابع یا روتینهای سرویس وقفه ذخیره/بازیابی نمیشود.
- برای فراخوانیهای غیرمستقیم به توابع و gotoی محاسبهشده، پیونددهنده stubها را تولید میکند. این stubها سکوهای پرشی هستند که گاهی trampoline (ترامپولین) نیز نامیده میشوند. بنابراین، فراخوانی/پرش غیرمستقیم به چنین stubای منتقل میشود. خود stub شامل یک پرش مستقیم به آدرس مورد نظر است.
- بهینهسازی آرامسازی پیونددهنده (Linker 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" در اسکریپت پیونددهنده تعریف شده است.
- Stubها در صورت برقراری دو شرط زیر بهطور خودکار توسط پیونددهنده ایجاد میشوند:
- -<آدرس یک برچسب با استفاده از تغییردهندهٔ "gs" گرفته شده باشد>
- (کوتاهشدهٔ
generate stubs) مانند:
LDI r24, lo8(gs(<func>)) LDI r25, hi8(gs(<func>))
- -<مکان نهایی آن برچسب در قطعه کدی باشد>
- خارج از قطعهای که stubها در آن قرار دارند.
- *
- کامپایلر چنین اصلاحکنندههای "gs" را برای برچسبهای کد در موقعیتهای زیر درج میکند:
- -<گرفتن آدرس یک تابع یا برچسب کد.>
- -<gotoی محاسبهشده (Computed goto).>
- -<در صورت استفاده از تابع prologue-save، گزینهٔ -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) تعریف شود.
مدیریت ثباتهای کارکرد خاص (SFR) شامل "RAMPD"، "RAMPX"، "RAMPY" و "RAMPZ"
برخی از دستگاههای AVR از حافظههایی بزرگتر از محدوده ۶۴ کیبیبایت (64 KiB) که با اشارهگرهای ۱۶ بیتی قابل دسترسی هستند، پشتیبانی میکنند. برای دسترسی به مکانهای حافظه در خارج از این محدوده ۶۴ کیبیبایتی، محتوای یک ثبات "RAMP" به عنوان بخش بالایی نشانی استفاده میشود: ثباتهای نشانی "X"، "Y" و "Z" به ترتیب با ثباتهای کارکرد خاص "RAMPX"، "RAMPY" و "RAMPZ" ترکیب میشوند تا یک نشانی عریض به دست آید. بهطور مشابه، "RAMPD" به همراه نشانیدهی مستقیم به کار میرود.
- کد راهاندازی (startup code)، ثباتهای کارکرد خاص "RAMP" را با صفر مقداردهی اولیه میکند.
- اگر یک فضای نشانی نامگذاریشده AVR بهجز generic یا "__flash" استفاده شود، آنگاه "RAMPZ" پیش از عملیات بر حسب نیاز تنظیم میشود.
- اگر دستگاه از حافظه RAM بزرگتر از ۶۴ کیبیبایت پشتیبانی کند و کامپایلر برای انجام یک عملیات نیازمند تغییر "RAMPZ" باشد، "RAMPZ" پس از عملیات مجدداً به صفر بازنشانی میشود.
- اگر دستگاه دارای یک ثبات "RAMP" خاص باشد، پرولوگ/اپیلوگِ ISR آن 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) به دلیل یک نقص سختافزاری (erratum) نباید دستورالعملهای ۳۲ بیتی را نادیده بگیرند (skip کنند). دستورالعملهای رد کردن عبارتند از "SBRS"، "SBRC"، "SBIS"، "SBIC" و "CPSE". ماکروی دوم تنها در صورتی تعریف میشود که "__AVR_HAVE_JMP_CALL__" نیز تنظیم شده باشد.
- "__AVR_ISA_RMW__"
- دستگاه دارای دستورالعملهای خواندن-تغییر-نوشتن (Read-Modify-Write شامل 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__"
- کامپایلر از مشخصههای تابع AVR Function Attributes,,function attributes شامل signal(num) و interrupt(num) با آرگومان num که شمارهٔ روال سرویس وقفه را مشخص میکند، پشتیبانی مینماید.
- "__HAVE_DOUBLE_MULTILIB__"
- تعریف میشود اگر -mdouble= بهعنوان یک گزینهٔ multilib عمل کند.
- "__HAVE_DOUBLE32__"
- "__HAVE_DOUBLE64__"
- تعریف میشود اگر کامپایلر بهترتیب از double ۳۲ بیتی یا double ۶۴ بیتی پشتیبانی کند. چینش واقعی با گزینهٔ -mdouble= تعیین میشود.
- "__DEFAULT_DOUBLE__"
- اندازهٔ "double" به بیت، در صورتی که -mdouble= تنظیم نشده باشد. برای آزمایش چینش "double" در یک برنامه، از ماکروی توکار "__SIZEOF_DOUBLE__" استفاده کنید.
- "__HAVE_LONG_DOUBLE32__"
- "__HAVE_LONG_DOUBLE64__"
- "__HAVE_LONG_DOUBLE_MULTILIB__"
- "__DEFAULT_LONG_DOUBLE__"
- مشابه موارد بالا، اما برای "long double" بهجای "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
گزینههای زیر بهطور داخلی توسط کامپایلر و برای برقراری ارتباط بین فایلهای specs دستگاه و خود کامپایلر استفاده میشوند. نیازی نیست که این گزینهها را بهصورت دستی تنظیم کنید؛ بهویژه اینکه اینها گزینههای بهینهسازی نیستند. استفاده از این گزینهها به شیوهٔ نادرست ممکن است به تولید کدهای غیربهینه یا نادرست بیانجامد. این گزینهها برای کامل بودن مستندات و به منظور بهدست آوردن درک بهتری از فایلهای 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 را مشخص میکند. هر راهکار ترمیمی موجود برای ویرایش سیلیکون مورد نظر فعال میشود. اگر 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
- اشارهگر چارچوب را برای توابع برگ در ثبات نگه نمیدارد. این کار از دستورالعملهای ذخیره، راهاندازی و بازیابی اشارهگرهای چارچوب جلوگیری کرده و یک ثبات اضافی را در توابع برگ در دسترس قرار میدهد.
- -mspecld-anomaly
- هنگامی که فعال باشد، کامپایلر اطمینان حاصل میکند که کد تولیدشده شامل بارگذاریهای حدسی پس از دستورالعملهای پرش نباشد. اگر از این گزینه استفاده شود، "__WORKAROUND_SPECULATIVE_LOADS" تعریف میشود.
- -mno-specld-anomaly
- کد اضافی برای جلوگیری از وقوع بارگذاریهای حدسی تولید نمیکند.
- -mcsync-anomaly
- هنگامی که فعال باشد، کامپایلر اطمینان حاصل میکند که کد تولیدشده شامل دستورالعملهای CSYNC یا SSYNC بلافاصله پس از انشعابهای شرطی نباشد. اگر این گزینه استفاده شود، "__WORKAROUND_SPECULATIVE_SYNCS" تعریف میشود.
- -mno-csync-anomaly
- کد اضافی برای جلوگیری از وقوع زودهنگام دستورالعملهای CSYNC یا SSYNC پس از یک انشعاب شرطی تولید نمیکند.
- -mlow64k
- هنگامی که فعال باشد، کامپایلر مجاز است از این آگاهی که کل برنامه در ۶۴ کیلوبایت پایین حافظه جای میگیرد بهرهبرداری کند.
- -mno-low64k
- فرض میکند که برنامه به اندازه دلخواه بزرگ است. این حالت پیشفرض است.
- -mstack-check-l1
- بررسی پشته را با استفاده از اطلاعات قرار دادهشده در حافظه یادداشت L1 توسط هسته uClinux انجام میدهد.
- -mid-shared-library
- کدی تولید میکند که از طریق روش شناسه کتابخانه از کتابخانههای مشترک پشتیبانی میکند. این امر امکان اجرا درجا و استفاده از کتابخانههای مشترک را در محیطی بدون مدیریت حافظه مجازی فراهم میسازد. این گزینه متضمن -fPIC است. با هدف bfin-elf، این گزینه متضمن -msim است.
- -mno-id-shared-library
- کدی تولید میکند که فرض نمیکند کتابخانههای مشترک مبتنی بر شناسه در حال استفاده هستند. این حالت پیشفرض است.
- -mleaf-id-shared-library
- کدی تولید میکند که از طریق روش شناسه کتابخانه از کتابخانههای مشترک پشتیبانی میکند، اما فرض میکند که این کتابخانه یا فایل اجرایی به هیچ کتابخانه مشترک مبتنی بر شناسه دیگری پیوند نخواهد خورد. این امر به کامپایلر اجازه میدهد از کد سریعتری برای پرشها و فراخوانیها استفاده کند.
- -mno-leaf-id-shared-library
- فرض نمیکند که کد در حال کامپایل به هیچ کتابخانه مشترک مبتنی بر شناسهای پیوند نخواهد خورد. برای دستورات پرش و فراخوانی کدهای کندتری تولید میشود.
- شماره شناسایی کتابخانه مشترک مبتنی بر شناسهای را که در حال کامپایل است مشخص میکند. تعیین مقدار 0 کد فشردهتری تولید میکند؛ تعیین مقادیر دیگر تخصیص آن شماره را به کتابخانه جاری تحمیل میکند اما از نظر فضا یا زمان کارآمدتر از حذف این گزینه نیست.
- -msep-data
- کدی تولید میکند که اجازه میدهد بخش داده در ناحیهای از حافظه متفاوت از بخش کد قرار گیرد. این امر با حذف بازنشانیها نسبت به بخش کد، امکان اجرا درجا را در محیطی بدون مدیریت حافظه مجازی فراهم میکند.
- -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ها در زمان اجرا فعال هستند. این امر بر راهکارهای دور زدن برخی ناهنجاریها اثر میگذارد. برای مقصدهای لینوکس، پیشفرض این است که 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
- تنظیم و بهینهسازی تمامی ویژگیهای قابل اعمال کد تولیدشده برای architecture-type، به جز ABI و مجموعه دستورالعملهای در دسترس. گزینههای انتخابی برای architecture-type مشابه با -march=architecture-type هستند.
- -mmax-stack-frame=n
- هشدار در صورتی که اندازهٔ فریم پشتهٔ یک تابع از n بایت فراتر رود.
- -metrax4
- -metrax100
- گزینههای -metrax4 و -metrax100 به ترتیب مترادفهای -march=v3 و -march=v8 هستند.
- -mmul-bug-workaround
- -mno-mul-bug-workaround
- دور زدن یک باگ در دستورالعملهای "muls" و "mulu" برای مدلهای پردازندهای که مشمول آن هستند. این گزینه به طور پیشفرض غیرفعال است.
- -mpdebug
- فعالسازی اطلاعات پرگو (verbose) و مرتبط با اشکالزدایی مخصوص CRIS در کد اسمبلی. این گزینه همچنین نشانگر کد قالببندیشدهٔ #NO_APP را برای اسمبلر در ابتدای فایل اسمبلی خاموش میکند.
- -mcc-init
- عدم استفاده از نتایج کدهای شرطی حاصل از دستورالعمل پیشین؛ همواره صدور دستورالعملهای مقایسه و آزمایش پیش از بهکارگیری کدهای شرطی انجام میشود.
- -mno-side-effects
- عدم صدور دستورالعملهای دارای اثر جانبی در حالتهای آدرسدهی غیر از پسافزایش (post-increment).
- -mstack-align
- -mno-stack-align
- -mdata-align
- -mno-data-align
- -mconst-align
- -mno-const-align
- این گزینهها (گزینههای no-) ترتیب همترازی (یا حذف آن) را برای فریم پشته، دادههای مجزا و مقادیر ثابت جهت دستیابی به حداکثر اندازهٔ دسترسی منفرد به داده در مدل پردازندهٔ برگزیده فراهم میکنند. پیشفرض، برقراری همترازی ۳۲ بیتی است. جزئیات ABI مانند چیدمان ساختار (structure layout) تحت تأثیر این گزینهها قرار نمیگیرند.
- -m32-bit
- -m16-bit
- -m8-bit
- مشابه گزینههای همترازی پشته، داده و مقادیر ثابت در بالا، این گزینهها همترازی ۳۲ بیتی، ۱۶ بیتی یا ۸ بیتی را برای تمامی فریم پشته، دادههای قابلنوشتن و مقادیر ثابت فراهم میآورند. پیشفرض، همترازی ۳۲ بیتی است.
- -mno-prologue-epilogue
- -mprologue-epilogue
- با گزینهٔ -mno-prologue-epilogue، مقدمه (prologue) و مؤخرهٔ (epilogue) عادی تابع که فریم پشته را برپا میکنند حذف شده و هیچ دستورالعمل بازگشت یا دنبالهٔ بازگشتی در کد تولید نمیشود. از این گزینه تنها در کنار بررسی چشمی کد کامپایلشده استفاده کنید: در زمانی که ثباتهای فراخواندهمحافظت (call-saved) باید ذخیره شوند یا نیاز به تخصیص فضا برای متغیرهای محلی باشد، هیچ هشدار یا خطایی صادر نخواهد شد.
- -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 برای پیوند با یکدیگر سازگار نیستند؛ شما باید کل برنامه خود را با همان ABI کامپایل کرده و با مجموعهای سازگار از کتابخانهها پیوند دهید.
- -mhard-float
- -msoft-float
- پیادهسازیهای سختافزاری یا نرمافزاری ممیز شناور را انتخاب میکند. پیشفرض soft float است.
- -mdouble-float
- -mno-double-float
- هنگامی که -mhard-float فعال باشد، تولید دستورالعملهای ممیز شناور با دقت مضاعف را فعال میکند. این گزینه پیشفرض است، مگر هنگام کامپایل برای 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 Mode)، تنها با استفاده از ثباتهای شمارهٔ 0-7 جهت امکان استفاده از دستورالعملهای ۱۶ بیتی. این گزینه برای CK801 که در آن این رفتار الزامی است نادیده گرفته میشود، و برای CK802 بهطور پیشفرض فعال است. برای سایر مقاصد، پیشفرض غیرفعال است.
- -mhigh-registers
- -mno-high-registers
- تولید کد با استفاده از ثباتهای بالا به شمارههای 16-31. این گزینه در CK801، CK802 یا CK803 پشتیبانی نمیشود، و برای سایر پردازندهها بهطور پیشفرض فعال است.
- -manchor
- -mno-anchor
- تولید کد با استفاده از آدرس نمادهای لنگر سراسری.
- -mpushpop
- -mno-pushpop
- تولید کد با استفاده از دستورالعملهای "push" و "pop". این گزینه بهطور پیشفرض فعال است.
- -mmultiple-stld
- -mstm
- -mno-multiple-stld
- -mno-stm
- تولید کد با استفاده از دستورالعملهای "stm" و "ldm". این گزینه در CK801 پشتیبانی نمیشود اما در سایر پردازندهها بهطور پیشفرض فعال است.
- -mconstpool
- -mno-constpool
- ایجاد استخرهای مقادیر ثابت در کامپایلر به جای موکول کردن آن به اسمبلر. این گزینه پیشفرض بوده و برای تولید کد صحیح در CK801 و CK802 الزامی است، و در سایر پردازندهها اختیاری میباشد.
- -mstack-size
- -mno-stack-size
- درج دستورالعملهای هدایتگر ".stack_size" برای هر تابع در خروجی اسمبلی. این گزینه بهطور پیشفرض غیرفعال است.
- -mccrt
- -mno-ccrt
- تولید کد برای زمان اجرای کامپایلر C-SKY به جای libgcc. این گزینه بهطور پیشفرض غیرفعال است..IP -mbranch-cost=n 4 هزینهٔ انشعابها را تقریباً برابر با "n" دستورالعمل تنظیم میکند. پیشفرض 1 است.
- -msched-prolog
- -mno-sched-prolog
- زمانبندی توالیهای مقدمه (prologue) و مؤخرهٔ (epilogue) تابع را مجاز میکند. استفاده از این گزینه میتواند منجر به کدی شود که با الزامات مقدمه در ABI مربوط به C-SKY V2 سازگار نیست و امکان اشکالزدایی یا ردگیری به عقب (backtrace) آن وجود ندارد. بهطور پیشفرض غیرفعال است.
- -msim
- کتابخانهٔ libsemi.a را که با شبیهساز سازگار است پیوند (link) میدهد. فقط برای کامپایلر ELF قابل اعمال است.
گزینههای Cygwin و MinGW
این گزینههای اضافی برای مقصدهای Microsoft Windows در دسترس هستند:
- -mconsole
- این گزینه با هدایت پیونددهنده برای تنظیم نوع زیرسیستم سرآیند PE طبق آنچه برای برنامههای کنسولی لازم است، مشخص میکند که یک برنامهٔ کنسولی باید تولید شود. این گزینه برای مقصدهای Cygwin و MinGW در دسترس بوده و بهطور پیشفرض در آن مقصدها فعال است.
- -mcrtdll=library
- پیشپردازش، کامپایل یا پیوند با library مشخصشده از نوع C RunTime DLL. این گزینه ماکروهای پیشتعریفشدهٔ "__CRTDLL__"، "__MSVCRT__"، "_UCRT" و "__MSVCRT_VERSION__" را برای library سیآرتی مشخصشده تنظیم میکند، فایل آغازین را برای library سیآرتی انتخاب کرده و با آن پیوند میدهد. نامهای شناختهشدهٔ کتابخانهٔ CRT برای پیشپردازنده عبارتند از: "crtdll*"، "msvcrt10*"، "msvcrt20*"، "msvcrt40*"، "msvcr40*"، "msvcrtd*"، "msvcrt-os*"، "msvcr70*"، "msvcr71*"، "msvcr80*"، "msvcr90*"، "msvcr100*"، "msvcr110*"، "msvcr120*" و "ucrt*". اگر این گزینه مشخص نشود، کتابخانهٔ وارداتی پیشفرض MinGW یعنی "msvcrt" برای پیوند استفاده میشود و هیچ تنظیم دیگری برای پیشپردازنده انجام نخواهد شد. کتابخانهٔ وارداتی "msvcrt" در MinGW صرفاً یک پیوند نمادین (symlink) به (یا کپی از) یک کتابخانهٔ وارداتی دیگر MinGW CRT است که در حین کامپایل MinGW انتخاب شده است. کتابخانهٔ وارداتی "msvcrt-os" در MinGW برای کتابخانهٔ DLL سیآرتی سیستمی ویندوز یعنی "msvcrt.dll" بوده و در بیشتر موارد کتابخانهٔ وارداتی پیشفرض MinGW است. بهطور کلی، تغییر دادن CRT DLL نیازمند کامپایل مجدد کل MinGW CRT است. این گزینه صرفاً برای مقاصد آزمایشی و تست در نظر گرفته شده است. این گزینه برای مقصدهای MinGW در دسترس است.
- -mdll
- این گزینه برای مقصدهای Cygwin و MinGW در دسترس است. این گزینه مشخص میکند که یک DLL---یک کتابخانهٔ پیوند پویا (dynamic link library)---باید تولید شود، که امکان انتخاب شیء راهاندازی زمان اجرا و نقطهٔ ورود مورد نیاز را فراهم میسازد.
- -mnop-fun-dllimport
- این گزینه برای مقصدهای Cygwin و MinGW در دسترس است. این گزینه مشخص میکند که ویژگی "dllimport" باید نادیده گرفته شود.
- -mthreads
- این گزینه برای مقصدهای MinGW در دسترس است. این گزینه مشخص میکند که پشتیبانی از ریسمانهای مختص MinGW باید استفاده شود.
- -municode
- این گزینه برای مقصدهای MinGW-w64 در دسترس است. این گزینه باعث میشود ماکروی پیشپردازندهٔ "UNICODE" از پیش تعریف شود، و کد راهاندازی زمان اجرای با قابلیت پشتیبانی از یونیکد را انتخاب میکند.
- -mwin32
- این گزینه برای مقصدهای Cygwin و MinGW در دسترس است. این گزینه مشخص میکند که ماکروهای معمول پیشتعریفشدهٔ Microsoft Windows در پیشپردازنده تنظیم شوند، اما بر انتخاب کتابخانهٔ زمان اجرا/کد راهاندازی تأثیری نمیگذارد.
- -mwindows
- این گزینه برای مقصدهای Cygwin و MinGW در دسترس است. این گزینه با دستور به پیونددهنده برای تنظیم مناسب نوع زیرسیستم سرآیند PE، مشخص میکند که یک برنامهٔ دارای رابط کاربری گرافیکی (GUI) تولید شود.
- -fno-set-stack-executable
- این گزینه برای مقصدهای MinGW در دسترس است. این گزینه مشخص میکند که پرچم قابلاجرا بودن (executable) برای پشتهای که توسط توابع تو در تو استفاده میشود، تنظیم نشود. این امر برای فایلهای باینری که در حالت هستهٔ (kernel mode) سیستمعامل Microsoft Windows اجرا میشوند ضروری است، زیرا در آنجا User32 API، که برای تنظیم دسترسیهای اجرایی استفاده میشود، در دسترس نیست.
- -fwritable-relocated-rdata
- این گزینه برای مقصدهای MinGW و Cygwin در دسترس است. این گزینه مشخص میکند که دادههای بازنشانیشده (relocated-data) در بخش فقطخواندنی، درون بخش ".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 یک چارچوب قرار دارد. دستورات include برای سرآیندهای زیرچارچوب فقط میتوانند در سرآیند چارچوبی ظاهر شوند که حاوی آن زیرچارچوب است، یا در سرآیند یک زیرچارچوب همتا (sibling). دو زیرچارچوب در صورتی همتا هستند که در یک چارچوب یکسان وجود داشته باشند. یک زیرچارچوب نباید همنام یک چارچوب باشد؛ در صورت نقض این قاعده، یک هشدار صادر میشود. در حال حاضر یک زیرچارچوب نمیتواند دارای زیرچارچوب باشد؛ در آینده ممکن است این سازوکار برای پشتیبانی از این قابلیت گسترش یابد. چارچوبهای استاندارد را میتوان در /System/Library/Frameworks و /Library/Frameworks یافت. یک نمونه دستور include به صورت "#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"
برقرار شود.
بهطور
پیشفرض
هنگام
کامپایل
برای Darwin/PowerPC
مقدار
sizeof(bool)
برابر 4
و هنگام
کامپایل
برای Darwin/x86
برابر 1
است،
بنابراین
این گزینه
بر روی x86
تأثیری
ندارد.
هشدار: سوییچ -mone-byte-bool باعث میشود GCC کدی تولید کند که با کد تولیدشده بدون این سوییچ سازگاری باینری ندارد. استفاده از این سوییچ ممکن است نیازمند کامپایل مجدد تمام ماژولهای دیگر برنامه، از جمله کتابخانههای سیستم باشد. از این سوییچ برای انطباق با یک مدل داده غیرپیشفرض استفاده کنید.
- -mfix-and-continue
- -ffix-and-continue
- -findirect-data
- کدی مناسب برای چرخهی توسعه سریع تولید میکند، مانند فراهم کردن امکان بارگذاری پویای فایلهای .o توسط GDB در برنامههایی که در حال حاضر اجرا میشوند. گزینههای -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
بازگردانده
میشوند.
این یک
توالی
فراخوانی (calling
sequence) غیر
استاندارد
است؛
بنابراین
هر تابعی با
آرگومان یا
مقدار
بازگشتی
ممیز شناور
که توسط کدی
کامپایلشده
با -mno-fp-regs
فراخوانی
میشود،
خود نیز
باید با
همین گزینه
کامپایل
شده باشد.
کاربرد معمول این گزینه در ساخت هستهای است که از هیچ ثبات ممیز شناوری استفاده نمیکند، و بنابراین نیازی به ذخیره و بازیابی آنها نخواهد داشت.
- -mieee
- معماری Alpha سختافزار ممیز شناور را برای بیشترین کارایی بهینهسازی کرده است. این سختافزار تا حد زیادی با استاندارد ممیز شناور IEEE سازگار است. با این حال، برای انطباق کامل، کمکهای نرمافزاری لازم است. این گزینه کدی کاملاً منطبق بر استاندارد IEEE تولید میکند بهجز اینکه پرچم inexact-flag نگهداری نمیشود (در ادامه را ببینید). اگر این گزینه فعال باشد، ماکروی پیشپردازندهٔ "_IEEE_FP" در حین کامپایل تعریف میشود. کد حاصل کارایی کمتری دارد اما قادر است بهدرستی از اعداد غیرنرمال (denormalized) و مقادیر استثنایی IEEE مانند NaN (not-a-number) و مثبت/منفی بینهایت پشتیبانی کند. سایر کامپایلرهای 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
- این گزینه تعیین میکند که کدام تلههای (trap) مربوط به ممیز شناور فعال شوند. سایر کامپایلرهای 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
- دقت در سطح برنامه (Program precision). این گزینه پیشفرض است و بدین معناست که گردانندهٔ تله تنها میتواند تشخیص دهد کدام برنامه باعث بروز استثنای ممیز شناور شده است.
- f
- دقت در سطح تابع (Function precision). گردانندهٔ تله میتواند تابعی را که باعث بروز استثنای ممیز شناور شده است مشخص کند.
- i
- دقت در سطح دستورالعمل (Instruction precision). گردانندهٔ تله میتواند دستورالعمل دقیقی را که باعث استثنای ممیز شناور شده است مشخص نماید.
سایر کامپایلرهای 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 یک
ثابت عدد
صحیح ۳۲ یا
۶۴ بیتی را
بررسی
میکند تا
ببیند آیا
میتواند
آن را از
ثابتهای
کوچکتر در
طی دو یا سه
دستورالعمل
بسازد یا
خیر. در
صورتی که
نتواند،
ثابت را به
عنوان یک
لیترال (literal)
خروجی داده
و کدی برای
بارگذاری
آن از بخش
داده (data segment) در
زمان اجرا
تولید
میکند.
از این گزینه برای ملزم کردن GCC به ساخت تمام ثابتهای صحیح با استفاده از دستورالعملها استفاده کنید، حتی اگر به دستورالعملهای بیشتری نیاز باشد (حداکثر شش دستورالعمل).
این گزینه معمولاً برای ساخت بارگذار پویای (dynamic loader) کتابخانههای اشتراکی استفاده میشود. از آنجا که بارگذار پویا خود یک کتابخانهٔ اشتراکی است، پیش از آنکه بتواند متغیرها و ثابتها را در بخش دادهٔ خود پیدا کند، باید خودش را در حافظه بازنشانی (relocate) نماید..IP -mbwx 4
- -mno-bwx
- -mcix
- -mno-cix
- -mfix
- -mno-fix
- -mmax
- -mno-max
- مشخص میکند که آیا GCC باید کدی تولید کند که از مجموعهدستورالعملهای اختیاری BWX، CIX، FIX و MAX استفاده کند یا خیر. حالت پیشفرض استفاده از مجموعهدستورالعملهایی است که توسط نوع پردازندهٔ تعیینشده از طریق گزینهٔ -mcpu= پشتیبانی میشود، یا در صورت عدم تعیین، نوع پردازندهای که GCC روی آن ساخته شده است.
- -msafe-bwa
- -mno-safe-bwa
- مشخص میکند که آیا در نبود مجموعهدستورالعملهای اختیاری BWX، کامپایلر GCC باید کدی ایمن در برابر چندریسمانی (multi-thread) و سیگنالهای ناهمگام (async-signal) برای دسترسیهای حافظه به بایتها و کلمات تراز شده تولید کند یا خیر.
- -msafe-partial
- -mno-safe-partial
- مشخص میکند که آیا GCC باید برای دسترسیهای جزئی به حافظه، کدی ایمن در برابر چندریسمانی و سیگنالهای ناهمگام تولید کند یا خیر، از جمله دسترسیهای تدریجی به دادههای ناتراز و همچنین دسترسیهای بلوکی به بخشهای ابتدایی و انتهایی انواع دادهٔ تجمیعی (aggregate) یا سایر اشیاء در حافظه که به ترتیب روی یک مرز تراز شدهٔ دادهای ۶۴ بیتی شروع و پایان نمییابند.
- -mfloat-vax
- -mfloat-ieee
- کدی تولید میکند که به جای ممیز شناور دقت یگانه و دوگانهٔ IEEE، از محاسبات ممیز شناور F و G پردازندههای VAX استفاده کند (یا استفاده نکند).
- -mexplicit-relocs
- -mno-explicit-relocs
- اسمبلرهای قدیمیتر Alpha راهی برای تولید بازنشانیهای نماد (symbol relocations) جز از طریق ماکروهای اسمبلر ارائه نمیدادند. استفاده از این ماکروها مانع زمانبندی بهینهٔ دستورالعملها میشد. مجموعه ابزار GNU binutils از نسخهٔ 2.12 از نحو جدیدی پشتیبانی میکند که به کامپایلر اجازه میدهد صریحاً مشخص کند کدام بازنشانیها باید بر کدام دستورالعملها اعمال شوند. این گزینه بیشتر برای اشکالزدایی مفید است، زیرا GCC هنگام ساخته شدن، قابلیتهای اسمبلر را تشخیص داده و پیشفرض را بر همان اساس تنظیم میکند.
- -msmall-data
- -mlarge-data
- هنگامی که
-mexplicit-relocs فعال
باشد،
دادههای
ایستا از
طریق
بازنشانیهای
نسبی به gp (gp-relative)
در دسترس
قرار
میگیرند.
وقتی از -msmall-data
استفاده
میشود،
اشیای ۸
بایت یا
کوچکتر در
یک «ناحیهٔ
دادههای
کوچک» (small data area،
یعنی
بخشهای
".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
- میزان
تأخیری را
تعیین
میکند که
زمانبند
باید برای
ارجاعهای
معمول به
حافظه،
همانگونه
که برنامه
مشاهده
میکند،
فرض کند.
این عدد به
شدت به
الگوهای
دسترسی
حافظه مورد
استفاده
توسط
برنامه و
اندازهٔ
حافظهٔ
نهان (cache)
خارجی
دستگاه
وابسته است.
گزینههای معتبر برای time عبارتند از:
گزینههای eBPF
- -mframe-limit=bytes
- این گزینه حد سختگیرانه (hard limit) را برای اندازه فریمها، بر حسب بایت، تعیین میکند. در حال حاضر، مقداری که میتوان تعیین کرد باید کمتر یا مساوی با 32767 باشد. مقدار پیشفرض، همان حدی است که توسط نسخه هسته لینوکس هدف تعیین شده است.
- -mbig-endian
- تولید کد برای مقصد big-endian.
- -mlittle-endian
- تولید کد برای مقصد little-endian. این حالت پیشفرض است.
- -mjmpext
- -mno-jmpext
- فعال یا غیرفعال کردن تولید دستورالعملهای اضافه انشعاب شرطی. برای پردازندههای v2 و بالاتر فعال است.
- -mjmp32
- -mno-jmp32
- فعال یا غیرفعال کردن تولید دستورالعملهای پرش ۳۲ بیتی. برای پردازندههای v3 و بالاتر فعال است.
- -malu32
- -mno-alu32
- فعال یا غیرفعال کردن تولید دستورالعملهای ۳۲ بیتی ALU. برای پردازندههای v3 و بالاتر فعال است.
- -mv3-atomics
- -mno-v3-atomics
- فعال یا غیرفعال کردن دستورالعملهای مربوط به عملیات اتمی عمومی معرفیشده در پردازنده v3. برای پردازندههای v3 و بالاتر فعال است.
- -mbswap
- -mno-bswap
- فعال یا غیرفعال کردن دستورالعملهای جابهجایی بایت (byte swap). برای پردازندههای v4 و بالاتر فعال است.
- -msdiv
- -mno-sdiv
- فعال یا غیرفعال کردن دستورالعملهای تقسیم علامتدار و باقیمانده (modulus). برای پردازندههای v4 و بالاتر فعال است.
- -msmov
- -mno-smov
- فعال یا غیرفعال کردن دستورالعملهای انتقال با گسترش علامت (sign-extending) و بارگذاری حافظه. برای پردازندههای 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). پشتیبانی از BPF CO-RE هنگام تولید اطلاعات اشکالزدایی BTF برای هدف BPF، بهطور پیشفرض فعال است.
- -mxbpf
- تولید کد برای یک نسخه بسطیافته از BPF، که برخی از محدودیتهای اعمالشده توسط معماری BPF را کاهش میدهد:
- -<ذخیره و بازیابی ثباتهای callee-saved در ورود و>
- خروج تابع، بهترتیب.
- -masm=dialect
- دستورالعملهای
اسمبلی را
با استفاده
از dialect
انتخابی eBPF
خروجی
میدهد.
مقدار
پیشفرض pseudoc
است.
مقدارهای پشتیبانیشده برای dialect عبارتند از:
- -minline-memops-threshold=bytes
- آستانه اندازهای را بر حسب بایت مشخص میکند که در آن یا کمتر از آن، memmove، memcpy و memset همواره باید بهصورت درونخطی (inline) بسط داده شوند. عملیاتی که با اندازههای بزرگتر از این آستانه سروکار دارند باید به جای بسط درونخطی با استفاده از یک فراخوانی کتابخانهای پیادهسازی شوند، اما از آنجا که BPF اجازه فراخوانیهای کتابخانهای (libcalls) را نمیدهد، فراتر رفتن از این آستانه منجر به خطای زمان کامپایل میشود. مقدار پیشفرض 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
- فعالسازی درونخطیسازی مدخلهای 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
- از کتابخانهٔ C گنو (GNU C library) استفاده میکند. این حالت پیشفرض است، بهجز در مقصدهای *-*-linux-*uclibc*، *-*-linux-*musl* و *-*-linux-*android*.
- -muclibc
- از کتابخانهٔ C یوسیلیبسی (uClibc) استفاده میکند. این حالت در مقصدهای *-*-linux-*uclibc* پیشفرض است.
- -mmusl
- از کتابخانهٔ C ماسل (musl) استفاده میکند. این حالت در مقصدهای *-*-linux-*musl* پیشفرض است.
- -mbionic
- از کتابخانهٔ C بایونیک (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 را غیرفعال میکند؛ یعنی گزینههای استاندارد پیوند Linux را به پیونددهنده ارسال میکند.
گزینههای 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
تأثیر
میگذارد.
هر دو پیادهسازی فراخوانی کتابخانهای همگامسازی و libatomic از قفلگذاری استفاده میکنند. در نتیجه، ذخیرهسازیهای پردازنده نسبت به سایر عملیات اتمی، اتمی نیستند. بارگذاریهای پردازنده تا DImode نسبت به سایر عملیات اتمی، اتمی هستند، مشروط بر اینکه بهصورت یک دسترسی منفرد پیادهسازی شده باشند.
معماری PA-RISC به جز دستورالعمل "ldcw" از هیچ عملیات اتمی در سختافزار پشتیبانی نمیکند؛ بنابراین، تمام پشتیبانی اتمی با استفاده از فراخوانیهای کتابخانهای همگامسازی و اتمی پیادهسازی شده است. پشتیبانی فراخوانی کتابخانهای همگامسازی در libgcc.a و پشتیبانی فراخوانی کتابخانهای اتمی در 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 بهطور صریح یا ضمنی با پیونددهندهٔ گنو پیکربندی شده باشد، پیشفرض است. این گزینه تأثیری بر اینکه کدام ld فراخوانی شود ندارد؛ فقط پارامترهای ارسالی به آن ld را تغییر میدهد. پیونددهندهای (ld) که فراخوانی میشود توسط گزینهٔ پیکربندی --with-ld، مسیر جستجوی برنامههای GCC و در نهایت PATH کاربر تعیین میگردد. پیونددهندهٔ مورداستفاده توسط GCC را میتوان با استفاده از دستور which `gcc -print-prog-name=ld` مشاهده کرد. این گزینه تنها در نسخهٔ ۶۴بیتی HP-UX GCC، یعنی نسخهای که با hppa*64*-*-hpux* پیکربندی شده باشد، در دسترس است.
- -mhp-ld
- استفاده از گزینههای مخصوص HP ld. این گزینه هنگام ساخت کتابخانه اشتراکی -b را به ld ارسال میکند و در تمامی پیوندها +Accept TypeMismatch را به ld میفرستد. این حالت زمانی که GCC بهطور صریح یا ضمنی با پیونددهندهٔ HP پیکربندی شده باشد، پیشفرض است. این گزینه بر اینکه کدام ld فراخوانی شود تأثیری ندارد؛ بلکه فقط پارامترهای ارسالی به آن ld را تغییر میدهد. پیونددهندهای که فراخوانی میشود توسط گزینهٔ پیکربندی --with-ld، مسیر جستجوی برنامههای GCC، و در نهایت PATH کاربر تعیین میشود. پیونددهندهٔ مورداستفادهٔ GCC را میتوان با which `gcc -print-prog-name=ld` مشاهده کرد. این گزینه فقط در نسخهٔ ۶۴بیتی HP-UX GCC، یعنی پیکربندیشده با hppa*64*-*-hpux*، در دسترس است.
- -mlinker-opt
- فعالسازی مرحلهٔ بهینهسازی در پیونددهندهٔ HP-UX. توجه داشته باشید که این کار اشکالزدایی نمادین را غیرممکن میسازد.
- -mlong-calls
- تولید کدی
که از
دنبالههای
فراخوانی
طولانی
استفاده
میکند. این
تضمین
میکند که
یک
فراخوانی
همیشه
بتواند به
تکهکدهای
رابط
ایجادشده
توسط
پیونددهنده
دسترسی
پیدا کند.
حالت
پیشفرض
این است که
فراخوانیهای
طولانی
تنها زمانی
تولید شوند
که فاصله از
محل
فراخوانی
تا ابتدای
تابع یا
واحد ترجمه
(بسته به
مورد)، از
حد از پیش
تعیینشده
توسط نوع
شاخهٔ
مورداستفاده
فراتر رود.
محدودیتها
برای
فراخوانیهای
عادی به
ترتیب
۷٬۶۰۰٬۰۰۰
و ۲۴۰٬۰۰۰
بایت برای
معماریهای
PA 2.0 و PA 1.X است.
فراخوانیهای
Sibcall همیشه به
۲۴۰٬۰۰۰
بایت محدود
میشوند.
هنگام استفاده از گزینهٔ -ffunction-sections، یا هنگام استفادهٔ همزمان از گزینههای -mgas و -mno-portable-runtime تحت HP-UX با پیونددهندهٔ SOM، فاصلهها از ابتدای توابع اندازهگیری میشوند.
معمولاً استفاده از این گزینه مطلوب نیست چرا که کارایی را کاهش میدهد. با این حال، ممکن است در برنامههای بزرگ کاربرد داشته باشد، بهویژه زمانی که از پیوند جزئی برای ساخت برنامه استفاده میشود.
انواع فراخوانیهای طولانی مورداستفاده به قابلیتهای اسمبلر و پیونددهنده و نوع کدی که تولید میشود بستگی دارد. تأثیر آن بر سیستمهایی که از فراخوانیهای طولانیِ مطلق و فراخوانیهای طولانیِ pic از نوع اختلاف نماد یا pc-relative پشتیبانی میکنند باید نسبتاً کم باشد. با این حال، در سیستمهای ۳۲بیتی 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" را در صورت نیاز بررسی کرده، تنظیم نماید و بازیابی کند. اکثر نرمافزارهای گنو چنین قابلیتی را ارائه نمیدهند.
- -nolibdld
- جلوگیری از تولید گزینههای پیوند برای جستجوی libdld.sl هنگامی که گزینهٔ -static در HP-UX 10 و جدیدتر مشخص شده باشد.
- -static
- پیادهسازی
setlocale در libc در
سیستم HP-UX به libdld.sl
وابسته است.
هیچ نسخهٔ
بایگانیشدهای
از libdld.sl وجود
ندارد.
بنابراین،
هنگامی که
گزینهٔ -static
مشخص
میشود،
گزینههای
پیوند خاصی
برای رفع
این
وابستگی
مورد نیاز
است.
در HP-UX 10 و جدیدتر، گردانندهٔ GCC در صورت تعیین گزینهٔ -static، گزینههای لازم برای پیوند با libdld.sl را اضافه میکند. این امر باعث میشود که باینری حاصل پویا شود. در پورت ۶۴بیتی، پیونددهندهها در هر حال بهطور پیشفرض باینریهای پویا تولید میکنند. میتوان از گزینهٔ -nolibdld برای جلوگیری از اضافه کردن این گزینههای پیوند توسط گردانندهٔ GCC استفاده کرد..IP -threads 4 افزودن پشتیبانی از چندنخی (multithreading) با کتابخانهٔ 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 assembler). این حالت پیشفرض است.
- -mgnu-ld
- -mno-gnu-ld
- تولید کردن (یا نکردن) کد برای پیونددهندهٔ گنو (GNU linker). این حالت پیشفرض است.
- -mno-pic
- تولید کدی که از ثبات اشارهگر سراسری استفاده نمیکند. نتیجه کد مستقل از موقعیت (position independent code) نخواهد بود، و از IA-64 ABI تخطی میکند.
- -mvolatile-asm-stop
- -mno-volatile-asm-stop
- تولید کردن (یا نکردن) یک بیت توقف (stop bit) بلافاصله پیش و پس از عبارتهای volatile asm.
- -mregister-names
- -mno-register-names
- تولید کردن (یا نکردن) نامهای ثبات in، loc و out برای ثباتهای پشتهای. این کار ممکن است خروجی اسمبلر را خواناتر کند.
- -mno-sdata
- -msdata
- غیرفعال کردن (یا فعال کردن) بهینهسازیهایی که از بخش دادههای کوچک (small data section) استفاده میکنند. این کار ممکن است برای دور زدن باگهای بهینهساز مفید باشد.
- -mconstant-gp
- تولید کدی که از یک مقدارِ ثابتِ اشارهگر سراسری استفاده میکند. این گزینه هنگام کامپایل کردن کد هسته مفید است.
- -mauto-pic
- تولید کدی که بازنشانیپذیر خودکار (self-relocatable) باشد. این گزینه متضمن -mconstant-gp است. این مورد هنگام کامپایل کردن کد سفتافزار (firmware) مفید است.
- -minline-float-divide-min-latency
- تولید کد برای تقسیمهای درونخطی (inline) مقادیر ممیز شناور با استفاده از الگوریتم کمینهٔ تأخیر (minimum latency).
- -minline-float-divide-max-throughput
- تولید کد برای تقسیمهای درونخطی مقادیر ممیز شناور با استفاده از الگوریتم بیشینهٔ توان عملیاتی (maximum 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. این کار ممکن است هنگام عدم استفاده از اسمبلر گنو مفید باشد.
- -mearly-stop-bits
- -mno-early-stop-bits
- اجازه دادن به قرارگیری بیتهای توقف زودتر از موقعیتِ بلافاصله قبل از دستورالعملی که بیت توقف را راهاندازی کرده است. این کار میتواند زمانبندی دستورالعملها را بهبود بخشد، اما همواره چنین نتیجهای ندارد.
- -mfixed-range=register-range
- تولید کدی که با محدودهٔ ثبات دادهشده مانند ثباتهای ثابت رفتار میکند. یک ثبات ثابت ثباتی است که تخصیصدهندهٔ ثبات نمیتواند از آن استفاده کند. این مورد هنگام کامپایل کردن کد هسته مفید است. یک محدودهٔ ثبات به صورت دو ثبات مشخص میشود که با یک خط پیوند از یکدیگر جدا شدهاند. میتوان چندین محدودهٔ ثبات را با استفاده از کاما از هم تفکیک کرد.
- -mtls-size=tls-size
- مشخص کردن اندازهٔ بیت آفستهای بیدرنگ TLS. مقادیر معتبر عبارتند از 14، 22 و 64.
- -mtune=cpu-type
- میزانسازی زمانبندی دستورالعملها برای یک پردازندهٔ خاص. مقادیر معتبر عبارتند از itanium، itanium1، merced، itanium2 و mckinley.
- -milp32
- -mlp64
- تولید کد برای یک محیط 32 بیتی یا 64 بیتی. محیط 32 بیتی مقادیر int، long و اشارهگر را روی 32 بیت تنظیم میکند. محیط 64 بیتی int را روی 32 بیت، و long و اشارهگر را روی 64 بیت تنظیم میکند. اینها پرچمهای مختص 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 به بارگذاریهای حدسی داده وابسته هستند. این گزینه تنها زمانی مؤثر است که -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
- (غیر)فعالسازی زمانبندی حدسی دستورالعملهایی که به بارگذاریهای حدسی کنترلی وابسته هستند. این گزینه تنها زمانی مؤثر است که -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) مفید است. مقدار پیشفرض ۱ است.
- -msched-max-memory-insns-hard-limit
- محدودیت مشخصشده توسط msched-max-memory-insns را به یک محدودیت سخت تبدیل میکند و اجازه حضور بیش از آن تعداد را در یک گروه دستورالعمل نمیدهد. در غیر این صورت، محدودیت «نرم» است، به این معنی که با رسیدن به حد تعیینشده، عملیاتهای غیر از حافظه ترجیح داده میشوند، اما عملیاتهای حافظه همچنان ممکن است زمانبندی شوند.
گزینههای LM32
این گزینههای -m برای معماری LatticeMico32 تعریف شدهاند:
- -mbarrel-shift-enabled
- فعالسازی دستورالعملهای جابجایی بشکهای (barrel-shift).
- -mdivide-enabled
- فعالسازی دستورالعملهای تقسیم و باقیمانده.
- -mmultiply-enabled
- فعالسازی دستورالعملهای ضرب.
- -msign-extend-enabled
- فعالسازی دستورالعملهای بسط علامت (sign extend).
- -muser-enabled
- فعالسازی دستورالعملهای تعریفشده توسط کاربر.
گزینههای LoongArch
این گزینههای خط فرمان برای مقصدهای LoongArch تعریف شدهاند:
- -march=arch-type
- تولید
دستورالعملها
برای نوع
ماشین arch-type.
-march=arch-type به GCC
اجازه
میدهد کدی
تولید کند
که ممکن است
روی
پردازندههایی
غیر از
پردازنده
مشخصشده
اصلاً اجرا
نشود.
انتخابهای موجود برای arch-type عبارتند از:
- native
- نوع پردازنده محلی که توسط کامپایلر محلی (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
- فعالسازی تولید دستورالعملهای LoongArch SIMD برای برداریسازی (vectorization) و از طریق توابع توکار (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 را غیرفعال میسازد. این گزینههای مختص راهانداز (driver-only) بر وضعیت پیکربندی نهایی msimd اثر گذاشته و تغییرات تدریجی را به ترتیبی که در خط فرمان راهانداز GCC ظاهر میشوند اعمال میکنند، تا گزینهٔ نهایی و استانداردشدهٔ msimd را که به خود کامپایلر ارسال میشود استخراج کنند.
- -mbranch-cost=n
- تنظیم هزینهٔ انشعابها (branches) به حدود 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 اجازه میدهد اکثر رونوشتهای با اندازهٔ ثابت را درونخطی (inline) کند. تنظیم سطح بهینهسازی روی -Os نیز استفاده از "memcpy" را اجباری میکند، اما در صورت مشخص شدن صریح -mno-memcpy، صرفنظر از ترتیب این گزینهها در خط فرمان، این رفتار لغو میشود.
- -mstrict-align
- -mno-strict-align
- اجتناب یا اجازه به تولید دسترسیهای حافظهای که ممکن است بر مرز طبیعی شیء، همانطور که در مشخصات معماری شرح داده شده است، همتراز نباشند. پیشفرض -mno-strict-align است.
- -G num
- قرار دادن دادههای عمومی (global) و ایستا (static) کوچکتر از 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 کامپایلر در جایی که linker relaxation غیرممکن باشد برای بهبود کیفیت کد از عملگرهای بازمکانی و در جاهای دیگر از ماکروها استفاده خواهد کرد. مقدار پیشفرض این گزینه بر اساس قابلیتهای اسمبلرِ شناساییشده در زمان ساخت 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 برای
دسترسی به
نمادهای
خارجی.
مقدار
پیشفرض
-mno-direct-extern-access است:
از GOT برای
نمادهای
خارجی با
پدیداری (visibility)
پیشفرض
استفاده
میشود،
اما برای
سایر
نمادهای
خارجی
استفاده
نمیشود.
با گزینهٔ -mdirect-extern-access، از GOT استفاده نمیشود و تمامی نمادهای خارجی بهصورت PC-relative آدرسدهی میشوند. این گزینه تنها برای محیطهایی مناسب است که در آنها هیچ پیوند پویایی انجام نمیگیرد، مانند سفتافزارها، هستههای سیستمعامل، و برنامههای اجرایی که با -static یا -static-pie پیوند یافتهاند. گزینهٔ -mdirect-extern-access با -fPIC یا -fpic سازگار نیست.
- -mrelax
- -mno-relax
- بهرهگیری (یا عدم بهرهگیری) از بهینهسازیهای پیونددهنده (linker relaxations). اگر -mpass-mrelax-to-as فعال باشد، این گزینه به اسمبلر نیز ارسال میشود. مقدار پیشفرض در زمان ساخت GCC با تشخیص پشتیبانی اسمبلر مربوطه تعیین میشود: -mrelax در صورتی که اسمبلر هم از گزینهٔ -mrelax و هم از بهینهسازی پرش شرطی پشتیبانی کند (این مورد الزامی است، در غیر این صورت دایرکتیوهای ".align" و دستورالعملهای پرش شرطی در کد اسمبلی خروجی GCC ممکن است بهدلیل سرریز بازنشانی توسط اسمبلر رد شوند)، و در غیر این صورت -mno-relax.
- -mpass-mrelax-to-as
- -mno-pass-mrelax-to-as
- ارسال (یا عدم ارسال) گزینهٔ -mrelax یا -mno-relax به اسمبلر. مقدار پیشفرض در زمان ساخت GCC با بررسی پشتیبانی اسمبلر مربوطه تعیین میشود: -mpass-mrelax-to-as در صورتی که اسمبلر از گزینهٔ -mrelax پشتیبانی کند، و در غیر این صورت -mno-pass-mrelax-to-as. این گزینه بیشتر برای اشکالزدایی یا کار با اسمبلرهایی متفاوت با اسمبلر زمان ساخت کاربرد دارد.
- -mrecip
- این گزینه استفاده از دستورالعملهای برآورد معکوس و برآورد ریشهٔ دوم معکوس را به همراه گامهای تکمیلی نیوتن-رافسون جهت افزایش دقت، بهجای انجام تقسیم یا ریشهٔ دوم و تقسیم برای آرگومانهای ممیز شناور، فعال میکند. این دستورالعملها تنها زمانی تولید میشوند که -funsafe-math-optimizations همراه با -ffinite-math-only و -fno-trapping-math فعال باشد. این گزینه بهطور پیشفرض غیرفعال است. پیش از استفاده از این گزینه، باید مطمئن شوید که پردازندهٔ مقصد از دستورالعملهای frecipe و frsqrte پشتیبانی میکند. توجه داشته باشید که هرچند توان عملیاتی این توالی دستورالعملها از توان عملیاتی دستورالعملهای غیرمعکوس بیشتر است، اما دقت آن میتواند تا ۲ ulp کاهش یابد (بهعنوان نمونه، معکوس ۱٫۰ برابر با 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]" همراه با ورودی که بسط علامت نیافته است. هنگام ساخت با -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" و جدول پرش (jump table) در مواقعی که از جدول پرش برای بهینهسازی عبارت "switch" استفاده میشود. برخی از ابزارهای خارجی، برای نمونه objtool در سیستم ساخت هستهٔ Linux، جهت تحلیل جریان کنترل به این یادداشتگذاری نیاز دارند. مقدار پیشفرض -mno-annotate-tablejump است.
- --param loongarch-vect-unroll-limit=n
- بخش بردارساز بر پایهٔ دادههای بهینهسازی موجود تعیین خواهد کرد که آیا باز کردن حلقهٔ اصلی برداریشده سودمند است یا خیر و تا چه میزان. این پارامتر، حد بالای میزان باز کردن حلقهٔ اصلی توسط بردارساز را تعیین میکند. مقدار پیشفرض، عدد شش است..PP گزینههای M32C
- -mcpu=name
- پردازندهای را که کد برای آن تولید میشود انتخاب میکند. name میتواند یکی از مقادیر r8c برای سری R8C/Tiny، m16c برای سری M16C (تا /60)، m32cm برای سری M16C/80، یا m32c برای سری M32C/80 باشد.
- -msim
- مشخص میکند که برنامه روی شبیهساز اجرا خواهد شد. این گزینه باعث پیوند خوردن یک کتابخانهٔ زمان اجرای جایگزین میشود که برای مثال از ورودی/خروجی (I/O) فایل پشتیبانی میکند. هنگام تولید برنامههایی که روی سختافزار واقعی اجرا میشوند، نباید از این گزینه استفاده کنید؛ باید برای هر تابع ورودی/خروجی مورد نیاز، کتابخانهٔ زمان اجرای خود را ارائه دهید.
- -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
- غیرفعال
کردن
استفاده از
ناحیهٔ
دادههای
کوچک (small data area).
متغیرها در
یکی از
بخشهای
".data"،
".bss" یا
".rodata"
قرار
میگیرند
(مگر اینکه
مشخصهٔ
"section"
تعیین شده
باشد). این
مقدار
پیشفرض
است.
ناحیهٔ دادههای کوچک از بخشهای ".sdata" و ".sbss" تشکیل شده است. اشیاء را میتوان با مشخصهٔ "section" با استفاده از یکی از این بخشها بهطور صریح در ناحیهٔ دادههای کوچک قرار داد.
- -msdata=sdata
- دادههای کوچک سراسری و ایستا در ناحیهٔ دادههای کوچک قرار میگیرند، اما کد ویژهای برای ارجاع به آنها تولید نمیشود.
- -msdata=use
- دادههای کوچک سراسری و ایستا در ناحیهٔ دادههای کوچک قرار میگیرند و دستورالعملهای ویژهای برای ارجاع به آنها تولید میشود.
- -G num
- اشیاء
سراسری و
ایستای با
اندازهٔ
کوچکتر یا
مساوی با num
بایت را به
جای
بخشهای
معمولی data یا
BSS، در
بخشهای
دادههای
کوچک یا BSS
قرار
میدهد.
مقدار
پیشفرض num
برابر با 8
است. برای
اثرگذاری
این گزینه،
گزینهٔ -msdata
باید روی
یکی از
مقادیر sdata
یا use تنظیم
شده باشد.
همهٔ پودمانها باید با مقدار یکسانی از -G num کامپایل شوند. کامپایل کردن با مقادیر مختلف num ممکن است کار کند یا نکند؛ اگر کار نکند، پیونددهنده یک پیام خطا میدهد---کد نادرست تولید نمیشود.
- -mdebug
- باعث میشود کد ویژهٔ M32R در کامپایلر، آماری را نمایش دهد که ممکن است به اشکالزدایی برنامهها کمک کند.
- -malign-loops
- تمام حلقهها را روی مرز ۳۲ بایتی همتراز میکند.
- -mno-align-loops
- همترازی ۳۲ بایتی را برای حلقهها اعمال نمیکند. این مقدار پیشفرض است.
- -missue-rate=number
- صدور number دستورالعمل در هر چرخه. مقدار number تنها میتواند 1 یا 2 باشد.
- -mbranch-cost=number
- مقدار number تنها میتواند 1 یا 2 باشد. اگر 1 باشد، انشعابها به کد شرطی ترجیح داده میشوند؛ اگر 2 باشد، عکس آن صدق میکند.
- -mflush-trap=number
- شمارهٔ تله (trap) مورد استفاده برای تخلیهٔ حافظهٔ نهان (cache) را مشخص میکند. مقدار پیشفرض 12 است. شمارههای معتبر بین 0 تا 15 هستند (شامل هر دو).
- -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
بهینهسازی
میکند.
ریزمعماریهای
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 ماکروی "__muarch__" را هنگام بهینهسازی برای ریزمعماری ColdFire تحت عنوان uarch تعریف میکند که در آن 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 linker، میتوانند چندین GOT ایجاد کنند و مدخلهای GOT را مرتب نمایند. اگر چنین پیونددهندهای دارید، تنها زمانی باید از -mxgot استفاده کنید که یک فایل شیء (object file) منفرد را کامپایل میکنید که به بیش از ۸۱۹۲ مدخل 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) را ترجیح میدهد.
- -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
- استفاده از جابهجاکنندهٔ بشکهای سختافزاری (barrel shifter).
- -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 در زمان پیوند ایستا ثابت است. از آنجا که آدرسدهی مبتنی بر PC پشتیبانی نمیشود، این ویژگی اجازه میدهد دادهها بهجای GOT، از طریق آفست از آدرس ابتدای text مورد ارجاع قرار گیرند.
گزینههای 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 پشتیبانی میکند که بهترین گزینهٔ معماری را برای پردازندهٔ میزبان برمیگزیند. -march=native در صورتی که GCC پردازنده را شناسایی نکند هیچ اثری نخواهد داشت.
در نام پردازندهها، 000 انتهایی میتواند بهصورت k مخفف شود (برای نمونه، -march=r2k). پیشوندها اختیاری هستند و vr ممکن است بهصورت r نوشته شود.
نامهایی به شکل nf2_1 به پردازندههایی با FPUهایی اشاره دارند که سرعت کلاک آنها نصف نرخ هسته است، نامهایی به شکل nf1_1 به پردازندههایی با FPUهایی اشاره دارند که سرعت کلاک آنها برابر با نرخ هسته است، و نامهایی به شکل nf3_2 به پردازندههایی با FPUهایی اشاره دارند که نرخ کلاک آنها نسبت 3:2 با هسته دارد. به دلایل سازگاری، 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 روی توابع به صورت یکدرمیان. این گزینه برای آزمون رگرسیون تولید کد ترکیبی MIPS16/غیر-MIPS16 ارائه شده است، و برای استفاده عادی در کامپایل کد کاربر در نظر گرفته نشده است.
- -minterlink-compressed
- -mno-interlink-compressed
- الزام (عدم
الزام) به
اینکه کدی
که از ISA
استاندارد
(فشردهنشده)
MIPS استفاده
میکند، با
کدهای 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. مجموعه ثباتهای ذخیرهشده حین فراخوانی نیز از این جهت یکسان میماند که ثباتهای با دقت مضاعف با شماره زوج ذخیره میشوند.
دو گونه دیگر از 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
- تولید (عدم
تولید) کدی
که کاملاً
مستقل از
موقعیت
است، و
بنابراین
میتواند
در
کتابخانههای
مشترک
پیوند داده
شود. این
گزینه فقط
بر -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 اثر
میگذارد.
برای ABI n64، این
گزینه بدون
-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 استفاده کنید که یک فایل شیء منفرد به بیش از 64k ورودی GOT دسترسی داشته باشد. موارد بسیار کمی چنین هستند.
این گزینهها هیچ اثری ندارند مگر اینکه GCC در حال تولید کد مستقل از موقعیت (position independent code) باشد.
- -mgp32
- فرض میکند که ثباتهای همهمنظوره ۳۲ بیتی هستند.
- -mgp64
- فرض میکند که ثباتهای همهمنظوره ۶۴ بیتی هستند.
- -mfp32
- فرض میکند که ثباتهای ممیز شناور ۳۲ بیتی هستند.
- -mfp64
- فرض میکند که ثباتهای ممیز شناور ۶۴ بیتی هستند.
- -mfpxx
- عرض ثباتهای ممیز شناور را مفروض در نظر نمیگیرد.
- -mhard-float
- از دستورالعملهای کمکپردازندهٔ ممیز شناور استفاده میکند.
- -msoft-float
- از دستورالعملهای کمکپردازندهٔ ممیز شناور استفاده نمیکند؛ در عوض محاسبات ممیز شناور را با استفاده از فراخوانیهای کتابخانهای پیادهسازی میکند.
- -mno-float
- معادل با -msoft-float است، اما علاوه بر آن تصریح میکند که برنامهٔ در حال کامپایل هیچ عملیات ممیز شناوری را انجام نمیدهد. این گزینه در حال حاضر تنها توسط برخی پیکربندیهای MIPS بستر لخت (bare-metal) پشتیبانی میشود، که ممکن است مجموعهٔ خاصی از کتابخانهها را انتخاب کند که فاقد هرگونه پشتیبانی ممیز شناور هستند (برای مثال، شامل قالبهای ممیز شناور "printf"). اگر کدی که با -mno-float کامپایل شده است تصادفاً شامل عملیات ممیز شناور باشد، احتمالاً در زمان پیوند یا زمان اجرا با شکست مواجه خواهد شد.
- -msingle-float
- فرض میکند که کمکپردازندهٔ ممیز شناور تنها از عملیات با دقت یگانه پشتیبانی میکند.
- -mdouble-float
- فرض میکند که کمکپردازندهٔ ممیز شناور از عملیات با دقت دوگانه پشتیبانی میکند. این مقدار پیشفرض است.
- -modd-spreg
- -mno-odd-spreg
- استفاده از ثباتهای ممیز شناور دقت یگانه با شمارهٔ فرد را برای ABI o32 فعال میکند. این حالت پیشفرض برای پردازندههایی است که پشتیبانی آنها از این ثباتها شناختهشده است. هنگام استفاده از ABI o32 FPXX، گزینهٔ -mno-odd-spreg بهصورت پیشفرض تنظیم میشود.
- -mabs=2008
- -mabs=legacy
- این
گزینهها
نحوهٔ
برخورد با
دادههای
ممیز شناور
خاصِ ناعدد
(NaN) در IEEE 754 را
توسط
دستورالعملهای
ماشین
"abs.fmt"
و
"neg.fmt"
کنترل
میکنند.
بهطور پیشفرض یا زمانی که از -mabs=legacy استفاده میشود، برخورد موروثی انتخاب میگردد. در این حالت این دستورالعملها محاسباتی تلقی شده و در جایی که عملکرد صحیح الزامی است و عملوند ورودی ممکن است NaN باشد، از آنها اجتناب میشود. در عوض از دنبالهٔ طولانیتری از دستورالعملها استفاده میشود که بیت علامت دادهٔ ممیز شناور را بهصورت دستی دستکاری میکنند، مگر اینکه گزینهٔ -ffinite-math-only نیز مشخص شده باشد.
گزینهٔ -mabs=2008 رفتار IEEE 754-2008 را انتخاب میکند. در این حالت این دستورالعملها غیرمحاسباتی در نظر گرفته شده و بنابراین در همهٔ حالات، بهویژه در حالتی که عملوند ورودی NaN است، بهدرستی کار میکنند. بنابراین این دستورالعملها همیشه برای عملیات مربوطه استفاده میشوند.
- -mnan=2008
- -mnan=legacy
- این
گزینهها
کدگذاری
دادههای
ممیز شناور
ویژهٔ
ناعدد (NaN) در IEEE 754
را کنترل
میکنند.
گزینهٔ -mnan=legacy کدگذاری موروثی را انتخاب میکند. در این حالت NaNهای ساکت (qNaNها) با ۰ بودن نخستین بیت فیلد مقدار معنادار انتهاییشان مشخص میشوند، در حالی که NaNهای هشداردهنده (sNaNها) با ۱ بودن نخستین بیت فیلد مقدار معنادار انتهاییشان مشخص میگردند.
گزینهٔ -mnan=2008 کدگذاری IEEE 754-2008 را انتخاب میکند. در این حالت qNaNها با ۱ بودن نخستین بیت فیلد مقدار معنادار انتهاییشان مشخص شده، در حالی که sNaNها با ۰ بودن نخستین بیت فیلد مقدار معنادار انتهاییشان مشخص میگردند.
پیشفرض -mnan=legacy است مگر اینکه GCC با --with-nan=2008 پیکربندی شده باشد.
- -mllsc
- -mno-llsc
- از
دستورالعملهای
ll، sc و sync
برای
پیادهسازی
توابع
درونی (built-in)
حافظهٔ
اتمیک
استفاده
میکند
(استفاده
نمیکند).
وقتی
هیچکدام
از این دو
گزینه مشخص
نشده باشد،
اگر معماری
مقصد از
آنها
پشتیبانی
کند، GCC از
این
دستورالعملها
استفاده
میکند.
گزینهٔ -mllsc در صورتی مفید است که محیط زمان اجرا بتواند این دستورالعملها را شبیهسازی کند و -mno-llsc میتواند هنگام کامپایل برای ISAهای غیراستاندارد مفید باشد. شما میتوانید با پیکربندی GCC بهترتیب با --with-llsc و --without-llsc، هر یک از این گزینهها را پیشفرض کنید. برای برخی پیکربندیها، --with-llsc پیشفرض است؛ برای جزئیات به مستندات نصب مراجعه کنید.
- -mdsp
- -mno-dsp
- از بازبینی ۱ از MIPS DSP ASE استفاده میکند (استفاده نمیکند). این گزینه ماکروی پیشپردازندهٔ "__mips_dsp" را تعریف میکند. همچنین "__mips_dsp_rev" را روی ۱ تعریف میکند.
- -mdspr2
- -mno-dspr2
- از بازبینی ۲ از MIPS DSP ASE استفاده میکند (استفاده نمیکند). این گزینه ماکروهای پیشپردازندهٔ "__mips_dsp" و "__mips_dspr2" را تعریف میکند. همچنین "__mips_dsp_rev" را روی ۲ تعریف میکند.
- -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 همانند EABI ۶۴ بیتی از "long"های ۶۴ بیتی استفاده میکند؛ سایر موارد از "long"های ۳۲ بیتی استفاده میکنند. اشارهگرها هماندازه "long"ها یا هماندازه ثباتهای اعداد صحیح هستند، هر کدام که کوچکتر باشد.
- -msym32
- -mno-sym32
- فرض کردن (فرض نکردن) اینکه تمام نمادها بدون در نظر گرفتن ABI انتخابشده، دارای مقادیر ۳۲ بیتی هستند. این گزینه در ترکیب با -mabi=64 و -mno-abicalls مفید است، زیرا به GCC اجازه میدهد ارجاعاتی کوتاهتر و سریعتر به آدرسهای نمادین ایجاد کند.
- -G num
- قرار دادن
تعاریف
دادههای
قابل
مشاهده از
خارج در یک
بخش داده
کوچک (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
- فرض کردن
(فرض نکردن)
اینکه
دادههای
تعریفشده
در خارج در
صورتی که
اندازهشان
در محدوده
-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 section)
قرار
دارند؛
گزینههای
-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)، سپس در صورت امکان در بخش دادههای کوچک (small data section)، و در غیر این صورت در بخش دادهها (data). این گزینه کدی اندکی کندتر از حالت پیشفرض تولید میکند، اما مقدار رم (RAM) مورد نیاز در هنگام اجرا را کاهش میدهد، و بنابراین ممکن است برای برخی سیستمهای توکار (embedded) ترجیح داده شود.
- -muninit-const-in-rodata
- -mno-uninit-const-in-rodata
- قرار دادن متغیرهای مقداردهینشدهٔ "const" در بخش دادههای فقطخواندنی. این گزینه تنها در کنار -membedded-data معنا دارد.
- -mcode-readable=setting
- مشخص میکند که آیا GCC میتواند کدی تولید کند که از بخشهای قابل اجرا (executable sections) بخواند یا خیر. سه مقدار ممکن برای setting وجود دارد:
- -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" در سال ۲۰۰۱ به GAS معرفی شد. پشتیبانی از بازآراییهای صریح "pcrel" در سال ۲۰۱۴ به GAS افزوده شد، که از %pcrel_hi و %pcrel_lo پشتیبانی میکند.
- -mcheck-zero-division
- -mno-check-zero-division
- ایجاد تله (trap)
(یا عدم
ایجاد تله)
در هنگام
تقسیم عدد
صحیح بر
صفر.
پیشفرض -mcheck-zero-division است.
- -mdivide-traps
- -mdivide-breaks
- سیستمهای
MIPS تقسیم بر
صفر را با
ایجاد یک
تلهٔ شرطی
یا یک
دستورالعمل
break بررسی
میکنند.
استفاده از
تلهها به
کد
کوچکتری
میانجامد،
اما فقط در MIPS II
و نسخههای
پس از آن
پشتیبانی
میشود.
همچنین،
برخی از
نسخههای
هسته
لینوکس
دارای باگی
هستند که
مانع از
ایجاد
سیگنال
مناسب
("SIGFPE")
توسط تله
میشود. از
-mdivide-traps برای
مجاز کردن
تلههای
شرطی روی
معماریهایی
که از آنها
پشتیبانی
میکنند و
از -mdivide-breaks برای
اجبار به
استفاده از
break استفاده
کنید.
پیشفرض معمولاً -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) برای 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"
کارآمدتر
است اما
مستلزم آن
است که
فراخواننده
و
فراخواندهشده
در یک بخش
۲۵۶
مگابایتی
یکسان قرار
داشته
باشند.
این گزینه هیچ تأثیری بر کدهای 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، هنگامی که از دستورالعملهای multiply-accumulate استفاده میشود، حاصلضرب میانی با دقت بینهایت محاسبه شده و مشمول بیت Flush to Zero در FCSR نمیگردد. این موضوع ممکن است در برخی شرایط نامطلوب باشد. در سایر پردازندهها، نتیجه از نظر عددی با محاسبهٔ معادل که از دستورالعملهای تفکیکشدهٔ ضرب، جمع، تفریق و قرینهسازی استفاده میکند یکسان است.
- -nocpp
- به اسمبلر MIPS اعلام میکند که هنگام اسمبل کردن فایلهای اسمبلی کاربر (با پسوند .s)، پیشپردازندهٔ خود را بر روی آنها اجرا نکند.
- -mfix-24k
- -mno-fix-24k
- دور زدن اشکال سختافزاری (errata) در 24K E48 (از دست رفتن دادهها در ذخیرهسازی حین refill). این راهحلهای دور زدن بهجای GCC، توسط اسمبلر پیادهسازی شدهاند.
- -mfix-r4000
- -mno-fix-r4000
- دور زدن برخی اشکالات سختافزاری پردازندهٔ R4000:
- یک شیفت متغیر یا دابلورد (double-word) در صورتی که بلافاصله پس از شروع یک تقسیم عدد صحیح اجرا شود، ممکن است نتیجهٔ نادرستی به دست دهد.
- یک شیفت متغیر یا دابلورد در صورتی که حین انجام یک ضرب عدد صحیح اجرا شود، ممکن است نتیجهٔ نادرستی به دست دهد.
- یک تقسیم عدد صحیح در صورتی که در شکاف تأخیر (delay slot) یک انشعاب برقرارشده (taken branch) یا یک پرش آغاز شود، ممکن است نتیجهٔ نادرستی به بار آورد.
- -mfix-r4400
- -mno-fix-r4400
- دور زدن برخی اشکالات سختافزاری پردازندهٔ R4400:
- -
- یک شیفت متغیر یا دابلورد (double-word) در صورتی که بلافاصله پس از شروع یک تقسیم عدد صحیح اجرا شود، ممکن است نتیجهٔ نادرستی به دست دهد.
- -mfix-r10000
- -mno-fix-r10000
- دور زدن برخی اشکالات سختافزاری R10000:
- -
- توالیهای "ll"/"sc" ممکن است در نگارشهای قبل از 3.0 رفتار اتمیک (atomic) نداشته باشند. آنها در نگارشهای 2.6 و قدیمیتر ممکن است دچار بنبست (deadlock) شوند.
این گزینه تنها زمانی میتواند استفاده شود که معماری مقصد از دستورالعملهای branch-likely پشتیبانی کند. در صورت استفاده از -march=r10000، گزینهٔ -mfix-r10000 پیشفرض است؛ در غیر این صورت، پیشفرض -mno-fix-r10000 خواهد بود.
- -mfix-r5900
- -mno-fix-r5900
- تلاشی برای زمانبندی دستورالعمل ماقبل در شکاف تأخیر (delay slot) یک دستور انشعابِ قرارگرفته در انتهای حلقهای کوتاه با شش یا کمتر دستورالعمل انجام ندهد و همیشه بهجای آن یک دستورالعمل "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 barrier) درج
کند یا خیر.
همانند بسیاری از پردازندهها، پردازندهٔ R10K تلاش میکند نتیجهٔ یک انشعاب شرطی را پیشبینی کرده و بهطور پیشبینانه دستورالعملهای شاخهٔ انتخابشده ("taken") را اجرا کند. این پردازنده در صورتی که پیشبینی نادرست باشد، بعداً این دستورالعملها را لغو مینماید. با این حال، در R10K، حتی دستورالعملهای لغوشده نیز میتوانند اثرات جانبی داشته باشند.
این مشکل تنها بر عملیات ذخیره در سطح هسته (kernel stores) و بسته به سیستم، بر بارگذاریهای هسته (kernel loads) اثر میگذارد. به عنوان مثال، یک ذخیرهسازی که بهصورت پیشبینانه اجرا شده ممکن است حافظهٔ مقصد را در کَش بارگذاری کرده و خط کاشه را به عنوان تغییریافته (dirty) علامت بزند، حتی اگر خود عملیات ذخیره بعداً لغو شود. اگر یک عملیات DMA پیش از تخلیهٔ (flush) خط "dirty" بر روی همان ناحیه از حافظه بنویسد، دادههای کَششده بر روی دادههای نوشتهشده توسط DMA بازنویسی خواهند شد. برای شرح کامل، شامل دیگر مشکلات بالقوه، به کتابچهٔ راهنمای پردازندهٔ R10K مراجعه فرمایید.
یک راهحل، درج دستورالعملهای cache barrier قبل از هر دسترسی به حافظه است که ممکن است بهصورت پیشبینانه اجرا شده و حتی در صورت لغو نیز اثرات جانبی به جا گذارد. گزینهٔ -mr10k-cache-barrier=setting نحوهٔ پیادهسازی این راهحل در GCC را کنترل میکند. این گزینه فرض میکند که دسترسیهای لغوشده به هر بایتی از نواحی زیر، هیچ اثر جانبی ندارد:
- 1.
- حافظهٔ اشغالشده توسط فریم پشتهٔ (stack frame) تابع کنونی؛
- 2.
- حافظهٔ اشغالشده توسط یک آرگومان ورودیِ پشته؛
- 3.
- حافظهٔ اشغالشده توسط شیئی با نشانی ثابت در زمان پیوند (link-time-constant address).
اطمینان از اینکه دسترسیهای پیشبینانه به این نواحی واقعاً ایمن هستند، بر عهدهٔ هسته (kernel) است.
اگر
برنامهٔ
ورودی شامل
اعلان
تابعی
مانند زیر
باشد: void foo (void);
آنگاه پیادهسازی "foo" باید به "j foo" و "jal foo" اجازه دهد تا بهصورت حدسی (speculatively) اجرا شوند. GCC این محدودیت را برای توابعی که خودش کامپایل میکند رعایت میکند. و انتظار دارد توابع غیر GCC (مانند کدهای اسمبلی دستنویس) نیز همین کار را انجام دهند.
این گزینه سه شکل دارد:
- -mr10k-cache-barrier=load-store
- درج یک سد حافظه نهان (cache barrier) پیش از یک بارگذاری (load) یا ذخیرهسازی (store) که ممکن است بهصورت حدسی اجرا شود و حتی در صورت لغو شدن، عوارض جانبی داشته باشد.
- -mr10k-cache-barrier=store
- درج یک سد حافظه نهان پیش از یک ذخیرهسازی که ممکن است بهصورت حدسی اجرا شود و حتی در صورت لغو شدن، عوارض جانبی داشته باشد.
- -mr10k-cache-barrier=none
- غیرفعالسازی درج سدهای حافظه نهان. این حالت پیشفرض است.
- -mflush-func=func
- -mno-flush-func
- تابعی را که برای تخلیه (flush) حافظههای نهان I و D باید فراخوانی شود، یا فراخوانی نکردن هیچ تابعی از این قبیل را مشخص میکند. در صورت فراخوانی، این تابع باید همان آرگومانهای تابع متداول "_flush_func" را بپذیرد، یعنی نشانی محدوده حافظهای که حافظه نهان آن در حال تخلیه است، اندازه محدوده حافظه، و عدد ۳ (برای تخلیه هر دو حافظه نهان). مقدار پیشفرض به مقصدی بستگی دارد که GCC برای آن پیکربندی شده است، اما معمولاً "_flush_func" یا "__cpu_flush" است.
- -mbranch-cost=num
- هزینه پرشها (branches) را تقریباً برابر با 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 تضمین میکند که دستورالعملهای پرش فشرده (compact branch) هرگز تولید نخواهند شد.
گزینه -mcompact-branches=always تضمین میکند در صورتی که برای MIPS Release 6 به بعد دستورالعمل پرش فشرده در دسترس باشد، تولید گردد. اگر دستورالعمل پرش فشرده در دسترس نباشد (یا در نسخههای پیش از R6)، بهجای آن از شکل دارای شکاف تأخیر (delay slot) پرش استفاده خواهد شد.
اگر برای مقصدهای MIPS16/microMIPS استفاده شود، در حال حاضر نادیده گرفته خواهد شد. رفتار برای MIPS16/microMIPS ممکن است در آینده تغییر کند، چرا که آنها دارای برخی دستورالعملهای پرش فشرده هستند.
گزینه -mcompact-branches=optimal باعث میشود در صورتی که در ISA جاری یک پرش با delay slot در دسترس باشد و شکاف تأخیر با موفقیت پر شود، از آن استفاده شود. اگر شکاف تأخیر پر نشود، در صورت در دسترس بودن یک پرش فشرده انتخاب خواهد شد.
- -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 ارسال
(dispatch) میشوند
به
فراخوانیهای
مستقیم. این
مورد تنها
زمانی ممکن
است که
پیونددهنده
(linker) بتواند
مقصد را در
زمان پیوند
حل کند و
مقصد در
محدوده
مجاز برای
یک
فراخوانی
مستقیم
باشد.
در صورتی که 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 ناتهی (nonnull) باشد.
پیشفرض -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 یا جدیدتر باشد، دستورالعملهای Long Instruction Word را تولید کند. این گزینه پیشفرض است. این گزینه ماکروی پیشپردازندهٔ "__LIW__" را تعریف میکند.
- -mno-liw
- به کامپایلر اجازه نمیدهد دستورالعملهای Long Instruction Word را تولید کند. این گزینه ماکروی پیشپردازندهٔ "__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 (crt0).
گزینههای MSP430
این گزینهها برای MSP430 تعریف شدهاند:
- -masm-hex
- وادار کردن خروجی اسمبلی به استفاده همیشگی از ثابتهای هگزادسیمال. معمولاً اینگونه ثوابت بهصورت دهدهی علامتدار هستند، اما این گزینه برای اهداف مجموعه آزمایش (testsuite) و/یا زیبایی بصری در دسترس است.
- -mmcu=
- انتخاب MCU
هدف. این
گزینه برای
ایجاد یک
نماد
پیشپردازنده
C بر اساس
نام MCU
استفاده
میشود، که
به حروف
بزرگ تبدیل
شده و
پیشوند و
پسوند __ به
آن اضافه
میشود. این
نماد به
نوبه خود
توسط
پرونده
سرایند msp430.h
برای
انتخاب یک
پرونده
سرایند
مکمل ویژه MCU
به کار
میرود.
این گزینه همچنین ISA مورد استفاده را تنظیم میکند. اگر نام MCU از نوعی باشد که مشخصاً تنها از 430 ISA پشتیبانی میکند، همان انتخاب میشود؛ در غیر این صورت 430X ISA انتخاب خواهد شد. نام عمومی MCU بهصورت msp430 نیز میتواند برای انتخاب 430 ISA استفاده شود. به طور مشابه، نام عمومی MCU msp430x معماری 430X ISA را انتخاب میکند.
علاوه بر این، یک اسکریپت پیونددهنده مخصوص MCU به خط فرمان پیونددهنده اضافه میشود. نام اسکریپت، نام MCU با پسوند .ld است. بنابراین، تعیین -mmcu=xxx در خط فرمان gcc، نماد پیشپردازنده C "__XXX__" را تعریف کرده و باعث میشود پیونددهنده به دنبال اسکریپتی به نام xxx.ld بگردد.
معماری ISA و پشتیبانی از ضرب سختافزاری برای MCUهای مختلف بهصورت تعبیهشده (hard-code) در 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 را از دایرکتوری ریشه زنجیره ابزار (toolchain) بررسی میکند. این دایرکتوری در نصب پیشفرض وجود ندارد، اما اگر کاربر آن را ایجاد کرده و devices.csv را در آنجا کپی کرده باشد، دادههای MCU خوانده میشوند. مشابه بالا، این دایرکتوری نیز به عنوان یک مسیر include و مسیر کتابخانه پیونددهنده ثبت میشود.
اگر هیچ یک از روشهای جستجوی بالا پرونده devices.csv را پیدا نکنند، از دادههای تعبیهشده MCU استفاده میشود.
- -mwarn-mcu
- -mno-warn-mcu
- این گزینه هشدارهای مربوط به تداخل میان نام MCU مشخصشده با گزینه -mmcu و ISA تعیینشده توسط گزینه -mcpu و/یا پشتیبانی از ضرب سختافزاری تعیینشده توسط گزینه -mhwmult را فعال یا غیرفعال میکند. همچنین هشدارهای مربوط به نامهای ناشناخته MCU را فعال یا غیرفعال میسازد. این گزینه به طور پیشفرض فعال است.
- -mcpu=
- معماری ISA مورد استفاده را مشخص میکند. مقادیر پذیرفتهشده عبارتند از msp430، msp430x و msp430xv2. این گزینه منسوخ شده است (deprecated). برای انتخاب ISA باید از گزینه -mmcu= استفاده شود.
- -msim
- پیوند به کتابخانههای زمان اجرای شبیهساز و اسکریپت پیونددهنده. این گزینه هر اسکریپتی را که ممکن بود توسط گزینه -mmcu= انتخاب شود لغو میکند (override).
- -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) فراخوانی میشود. این امر کدی بزرگتر اما سریعتر تولید میکند.
روالهای ضرب سختافزاری در زمان اجرا وقفهها را غیرفعال کرده و پس از اتمام، وضعیت قبلی وقفه را بازیابی میکنند. این امر استفاده از آنها را در داخل گردانندههای وقفه (interrupt handlers) و همچنین در کدهای عادی ایمن میسازد.
- -minrt
- فعال کردن استفاده از یک محیط حداقل زمان اجرا (minimum runtime environment) - بدون مقداردهندههای اولیه یا سازندههای ایستا (static). این قابلیت برای دستگاههای با محدودیت حافظه در نظر گرفته شده است. کامپایلر نمادهای ویژهای را در برخی پروندههای شیء میگنجاند که به پیونددهنده و زمان اجرا اعلام میکنند چه بخشهایی از کد مورد نیاز است.
- -mtiny-printf
- فعال کردن
توابع
کتابخانهای
"printf" و
"puts" با
حجم کد
کاهشیافته.
پیادهسازیهای
tiny از این
توابع
بازورودناپذیر
(not reentrant) هستند،
بنابراین
در
برنامههای
چندنخی
باید با
احتیاط
استفاده
شوند.
پشتیبانی از جریانها (streams) حذف شده است و رشتهای که باید چاپ شود همیشه از طریق فراخوان سیستمی "write" به stdout ارسال خواهد شد. این رشته پیش از ارسال به write بافر نمیشود.
این گزینه به Newlib Nano IO نیاز دارد، بنابراین GCC باید با --enable-newlib-nano-formatted-io پیکربندی شده باشد.
- -mmax-inline-shift=
- این گزینه
یک عدد صحیح
بین ۰ تا ۶۴
(شامل هر دو)
را دریافت
میکند و
حداکثر
تعداد
دستورالعملهای
شیفت
درونخطی
را که باید
برای انجام
عملیات
شیفت با یک
مقدار ثابت
صادر شوند،
تعیین
مینماید.
هنگامی که
نیاز به
فراتر رفتن
از این
مقدار
باشد، به
جای آن از
یک تابع
کمکی mspabi
استفاده
میشود.
مقدار
پیشفرض ۴
است.
این گزینه فقط بر مواردی اثر میگذارد که یک شیفت چندموقعیتی نتواند با یک دستورالعمل منفرد تکمیل شود (مانند تمام شیفتهای بزرگتر از ۱ در 430 ISA).
شیفتهای یک مقدار ۳۲ بیتی حداقل دو برابر هزینهبر هستند، بنابراین مقدار ارائهشده برای این گزینه بر ۲ تقسیم شده و مقدار حاصل به جای آن استفاده میشود.
- -mcode-region=
- -mdata-region=
- این گزینهها به کامپایلر اعلام میکنند که توابع و دادههای فاقد یکی از مشخصههای "lower"، "upper"، "either" یا "section" را در کجا قرار دهد. مقادیر ممکن عبارتند از "lower"، "upper"، "either" یا "any". سه مقدار اول مانند مشخصه متناظر خود رفتار میکنند. مقدار ممکن چهارم - یعنی "any" - حالت پیشفرض است. این مقدار، جایگذاری را به طور کامل به اسکریپت پیونددهنده و نحوه تخصیص بخشهای استاندارد (".text"، ".data" و غیره) به نواحی حافظه توسط آن واگذار میکند.
- -msilicon-errata=
- این گزینه درخواستی را به اسمبلر ارسال میکند تا اصلاحات مربوط به نقصهای سیلیکونی (silicon errata) نامبردهشده را فعال کند.
- -msilicon-errata-warn=
- این گزینه درخواستی را به اسمبلر ارسال میکند تا پیامهای هشدار را در مواردی که ممکن است نیاز به اعمال اصلاح نقص سیلیکونی باشد، فعال کند.
- -mwarn-devices-csv
- -mno-warn-devices-csv
- در صورت پیدا نشدن devices.csv یا وجود مشکل در تجزیهٔ آن هشدار میدهد (پیشفرض: فعال).
گزینههای NDS32
این گزینهها برای پیادهسازیهای NDS32 تعریف شدهاند:
- -mbig-endian
- تولید کد در حالت big-endian.
- -mlittle-endian
- تولید کد در حالت little-endian.
- -mreduced-regs
- استفاده از مجموعه ثباتهای کاهشیافته برای تخصیص ثبات.
- -mfull-regs
- استفاده از مجموعه ثباتهای کامل برای تخصیص ثبات.
- -mcmov
- تولید دستورالعملهای انتقال شرطی (conditional move).
- -mno-cmov
- عدم تولید دستورالعملهای انتقال شرطی.
- -mext-perf
- تولید دستورالعملهای افزونهٔ کارایی (performance extension).
- -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
- تمامی بخشهای داده و دادههای فقطخواندنی باید در فضای آدرسدهی 512KB باشند. بخش کد (text segment) باید در فضای آدرسدهی 16MB باشد.
- medium
- بخش داده باید در فضای آدرسدهی 512KB باشد، در حالی که بخش دادههای فقطخواندنی میتواند در فضای آدرسدهی 4GB باشد. بخش کد همچنان باید در فضای آدرسدهی 16MB قرار گیرد.
- large
- تمامی بخشهای کد و داده میتوانند در فضای آدرسدهی 4GB باشند.
- -mctor-dtor
- فعالسازی قابلیت سازنده/ویرانگر (constructor/destructor).
- -mrelax
- هدایت پیونددهنده برای بهینهسازی و کاستن از طول دستورالعملها (relax instructions).
گزینههای 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. این گزینه برای اجرای مستقل به جای بارگذاری جانبی (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") را فراهم میکند، و زمانی که حافظهٔ عمومی برای ذخیرهسازی زیرین به کار میرود، دسترسی به متغیرهای خودکار را از سایر رشتهها یا از طریق دستورالعملهای اتمیک ممکن میسازد. این شیوهٔ تولید کد برای بارگذاری جانبی OpenMP استفاده میشود، اما این گزینه به تنهایی با هدف آزمایش کامپایلر ارائه شده است؛ برای تولید کد مناسب جهت پیوند در برنامههایی که از تخلیه بار OpenMP استفاده میکنند، از گزینهٔ -mgomp استفاده کنید.
- -muniform-simt
- تغییر به روش تولید کدی که اجازه میدهد تمام رشتهها در هر warp اجرا شوند، در حالی که وضعیت حافظه و اثرات جانبی طوری حفظ میشوند که گویی فقط یک رشته در هر warp خارج از نواحی OpenMP SIMD فعال بوده است. تمام عملیات اتمیک و فراخوانیهای زمان اجرا (malloc، free، vprintf) به صورت شرطی اجرا میشوند (تنها و تنها اگر شناسهٔ لاین فعلی با شناسهٔ لاین اصلی برابر باشد)، و ثباتی که مقداردهی میشود از طریق یک دستورالعمل shuffle از لاین اصلی رونویسی میگردد. خارج از نواحی SIMD، لاین 0 به عنوان master عمل میکند؛ در درون آن، هر رشته خود را به عنوان لاین اصلی میبیند. آرایهٔ حافظهٔ مشترک "int __nvptx_uni[]" ماسکهای بیتیِ تمامصفر یا تمامیک را برای هر warp نگهداری میکند که نشاندهندهٔ حالت فعلی است (مقدار 0 در خارج از نواحی SIMD). هر رشته میتواند ماسک بیتی را در موقعیت "tid.y" با شناسهٔ لاین فعلی به صورت بیتی AND کند تا شناسهٔ لاین اصلی را محاسبه نماید..IP -mgomp 4 تولید کد برای استفاده در بارسپاری (offloading) در OpenMP: گزینههای -msoft-stack و -muniform-simt را فعال میکند و گونهٔ multilib متناظر را انتخاب مینماید.
گزینههای OpenRISC
این گزینهها برای OpenRISC تعریف شدهاند:
- -mboard=name
- پیکربندی یک زمان اجرای (runtime) وابسته به برد خاص. این مقدار برای پیوند کتابخانهٔ برد 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 انتخاب شده باشد، تولید دستورالعملهای ممیز شناور با دقت مضاعف را فعال میکند. بهطور پیشفرض از توابع libgcc برای انجام عملیات ممیز شناور با دقت مضاعف استفاده میشود.
- -munordered-float
- هنگامی که -mhard-float انتخاب شده باشد، تولید دستورالعملهای مقایسهٔ ممیز شناور نامرتب و تنظیم پرچم ("lf.sfun*") را فعال میکند. بهطور پیشفرض از توابع libgcc برای انجام عملیات مقایسهٔ ممیز شناور نامرتب و تنظیم پرچم استفاده میشود.
- -mcmov
- تولید دستورالعملهای انتقال شرطی ("l.cmov") را فعال میکند. بهطور پیشفرض، معادل آن با استفاده از تنظیم و انشعاب تولید خواهد شد.
- -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
- مقصد دارای فضای مجزای دستورالعمل و داده است. مستلزم -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 تنها spec مربوط به "sim" را ارائه میدهد که برای اجرای آزمونهای رگرسیون با استفاده از یک شبیهساز در نظر گرفته شده است. مشخصههای مربوط به سختافزار واقعی را میتوان با نصب بستهٔ GnuPruMcu ("https://github.com/dinuxbg/gnuprumcu") به دست آورد.
- -mno-relax
- باعث میشود GCC بهجای گزینهٔ --relax، گزینهٔ خط فرمان --no-relax را به پیونددهنده منتقل کند..IP -mloop 4 به GCC اجازه میدهد (یا نمیدهد) از دستورالعمل LOOP استفاده کند.
- -mabi=variant
- گونهٔ ABI را برای تولید کد خروجی مشخص میکند. -mabi=ti مدل ABI دستنخوردهٔ TI را انتخاب میکند، در حالی که -mabi=gnu گونهٔ گنو (GNU) را برمیگزیند که با فرضیات خاص GCC سازگاری طبیعیتری دارد. تفاوتها از این قرارند:
- اندازهٔ اشارهگر تابع
- مشخصات TI ABI تعیین میکند که اشارهگرهای تابع (کد) ۱۶ بیتی هستند، در حالی که GNU تنها از اشارهگرهای داده و کد ۳۲ بیتی پشتیبانی میکند.
- اشارهگر اختیاری مقدار بازگشتی
- مقادیر بازگشتی تابع که بزرگتر از ۶۴ بیت هستند، با استفاده از یک اشارهگر پنهان به عنوان نخستین آرگومان تابع ارسال میشوند. با این حال، TI ABI الزامی میکند که در صورت عدم استفادهٔ فراخواننده از مقدار بازگشتی، این اشارهگر میتواند NULL باشد. GNU همواره یک اشارهگر معتبر برای مقدار بازگشتی ارسال کرده و انتظار آن را دارد.
پیادهسازی کنونی -mabi=ti هنگام شناسایی هر یک از ساختارهای کد بالا، صرفاً یک خطای کامپایل صادر میکند. در نتیجه، کتابخانهٔ استاندارد C قابل ساخت نبوده و هنگام پیوند (link) با -mabi=ti کنار گذاشته میشود.
قابلیت بهینهسازی فاصلهها (Relaxation) از ویژگیهای GNU است و به دلایل ایمنی هنگام استفاده از -mabi=ti غیرفعال میشود. زنجیرهابزار TI برای دستورالعملهای QBBx اطلاعات بازنشانی (relocation) صادر نمیکند، بنابراین پیونددهندهٔ 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 بدون امتیاز (Unprivileged، که قبلاً User-Level نامیده میشد) RISC-V را که کد باید مطابق با آن تولید شود، مشخص میکند. مقادیر ممکن برای 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) از یکدیگر جدا شوند.
- "یک زیرخط میتواند در هر جایی پس از 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 افزونهٔ عملیات اتمی (Atomic)..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.
- smstateen
- @tab 1.0 @tab افزونهٔ فعالسازی وضعیت.
- ssaia
- @tab 1.0 @tab افزونهٔ معماری وقفهٔ پیشرفته برای حالت supervisor.
- sscofpmf
- @tab 1.0 @tab افزونهٔ سرریز شمارش و فیلترسازی.
- ssstateen
- @tab 1.0 @tab افزونهٔ فعالسازی وضعیت برای حالت supervisor.
- sstc
- @tab 1.0 @tab افزونهٔ وقفههای زمانسنج در حالت supervisor.
- svinval
- @tab 1.0 @tab افزونهٔ ابطال دقیق حافظهٔ پنهان ترجمهٔ آدرس.
- svnapot
- @tab 1.0 @tab افزونهٔ پیوستگی ترجمهٔ NAPOT.
- svpbmt
- @tab 1.0 @tab افزونهٔ انواع حافظهٔ مبتنی بر صفحه.
- xcvmac
- @tab 1.0 @tab افزونهٔ ضرب-انباشت Core-V.
- xcvalu
- @tab 1.0 @tab افزونهٔ ALU متفرقه Core-V.
- xcvelw
- @tab 1.0 @tab افزونهٔ بارگذاری کلمه رویداد 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
- بهینهسازی
خروجی برای
پردازندهٔ
دادهشده،
که بر اساس
ریزمعماری
یا نام خاص CPU
تعیین
میشود.
مقادیر
مجاز برای
این گزینه
عبارتند از:
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= را لغو میکند، اما اطلاعات خط لوله را نادیده نمیگیرد. این کار به کاهش اندازهٔ کد و در عین حال ارائهٔ عملکرد مناسب کمک میکند.
- -mpreferred-stack-boundary=num
- تلاش برای
همتراز
نگه داشتن
مرز پشته
روی مرز ۲
به توان num
بایت. اگر
-mpreferred-stack-boundary مشخص
نشده باشد،
پیشفرض ۴
است (۱۶
بایت یا ۱۲۸
بیت).
هشدار: در صورت استفاده از این سوئیچ، باید تمام پودمانها، از جمله هرگونه کتابخانه را با همان مقدار بسازید. این امر کتابخانههای سیستم و پودمانهای راهاندازی (startup) را نیز شامل میشود.
- -msmall-data-limit=n
- قرار دادن دادههای سراسری و ایستا کوچکتر از n بایت در یک بخش ویژه (در برخی مقصدها).
- -msave-restore
- -mno-save-restore
- استفاده یا عدم استفاده از کد پیشدرآمد و پسدرآمد کوچکتر اما کندتر که از فراخوانی توابع کتابخانهای بهره میبرد. پیشفرض، استفاده از پیشدرآمدها و پسدرآمدهای سریع درونخطی است.
- -mmovcc
- -mno-movcc
- تولید یا عدم تولید توالی کدهای انتقال شرطی بدون انشعاب، حتی در مقصدهایی که دستورالعملهای خاصی برای عملیات شرطی ندارند. در صورت فعال بودن، در جاهایی که سودمند باشد، توالیهایی از عملیات ALU با استفاده از دستورالعملهای پایه عدد صحیح ISA تولید میشود.
- -minline-atomics
- -mno-inline-atomics
- استفاده یا عدم استفاده از کد شبیهسازی اتمیک زیرکلمه کوچکتر اما کندتر که از فراخوانی توابع libatomic استفاده میکند. پیشفرض، استفاده از اتمیکهای زیرکلمه سریع درونخطی است که نیازی به libatomic ندارند..IP -minline-strlen 4
- -mno-inline-strlen
- تلاش کردن یا نکردن برای درونخطیسازی (inline) فراخوانیهای 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
- تلاش کردن یا نکردن برای استفاده بیشتر از دستورالعملهای بارگذاری/ذخیرهسازی فشرده (compressed 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. برنامه و
نمادهای
تعریفشده
بهصورت
ایستای آن
باید درون
هر بازه
آدرسدهی
منفرد 2 GiB
قرار گیرند.
برنامهها
میتوانند
بهصورت
ایستا یا
پویا پیوند
داده شوند.
کد تولیدشده توسط مدل کد medium-any مستقل از موقعیت (position-independent) است، اما تضمینی وجود ندارد که هنگام پیوند شدن با فایلهای اجرایی یا کتابخانههای مستقل از موقعیت، بهدرستی عمل کند.
- -mcmodel=large
- تولید کد برای یک مدل کد large، که هیچ محدودیتی در اندازه یا محل قرارگیری نمادها ندارد.
- -mexplicit-relocs
- -mno-exlicit-relocs
- استفاده کردن یا نکردن از عملگرهای بازآرایی اسمبلر (relocation) هنگام کار با آدرسهای نمادین. روش جایگزین، استفاده از ماکروهای اسمبلر است که ممکن است بهینهسازی را محدود کند.
- -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
- کنترل نحوه تراز کردن متغیرها و مقادیر ثابت از انواع آرایه، ساختار (structure)، یا اجتماع (union) توسط 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
- تولید کد
محافظت از
پشته با
استفاده از
کاناری (canary) در
guard.
مکانهای
پشتیبانیشده
عبارتاند
از global برای
کاناری
سراسری یا
tls برای
کاناری به
ازای هر
رشته در
بلوک TLS.
با انتخاب حالت دوم، گزینههای -mstack-protector-guard-reg=reg و -mstack-protector-guard-offset=offset علاوه بر این مشخص میکنند که کدام ثبات بهعنوان ثبات پایه برای خواندن کاناری، و با چه آفستی از آن ثبات پایه استفاده شود. هیچ ثبات یا آفست پیشفرضی وجود ندارد چرا که این تنظیم کاملاً برای استفاده در درون هسته لینوکس است.
- -mtls-dialect=desc
- استفاده از توصیفگرهای TLS به عنوان سازوکار حافظه محلی رشته (thread-local storage) برای دسترسیهای پویای متغیرهای 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
فاقد
بانکهای
ثبات است،
بنابراین
از قرارداد
فراخوانی
متفاوتی
استفاده
میکند.
اگر این گزینه تنظیم شود، نوع پشتیبانی ضرب سختافزاری مورد استفاده را نیز انتخاب میکند، مگر اینکه این موضوع با یک گزینهٔ صریح -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ها به عنوان مقادیر ۶۴ بیتی و دوکلمهای رفتار نماید. پیشفرض 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
گزینههای خاص تعیینشده برای هر CPU معین بین نسخههای مختلف کامپایلر تفاوت دارد، و این بستگی دارد به این که چه تنظیمی کد بهینهتری برای آن CPU تولید میکند؛ این امر لزوماً نشاندهنده قابلیتهای واقعی سختافزار نیست. اگر میخواهید یک گزینه خاص را روی مقدار مشخصی تنظیم کنید، میتوانید آن را پس از گزینه -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 باشند. این مقدار پیشفرض برای Linux ۶۴بیتی است.
- -mcmodel=large
- تولید کد PowerPC64 برای مدل large: ساختار TOC میتواند تا اندازهٔ 4G باشد. سایر دادهها و کدها فقط به فضای آدرسدهی ۶۴بیتی محدود میشوند.
- -maltivec
- -mno-altivec
- تولید کدی
که از
دستورالعملهای
AltiVec استفاده
میکند (یا
نمیکند)، و
همچنین
فعالسازی
استفاده از
توابع
درونی (built-in) که
امکان
دسترسی
مستقیمتر
به مجموعه
دستورالعملهای
AltiVec را فراهم
میکنند.
همچنین
ممکن است
برای
هماهنگسازی
ABI فعلی با
بهبودهای AltiVec
ABI، نیاز به
تنظیم -mabi=altivec
داشته
باشید.
هنگامی که از -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 «پیشین» (before) را در جلوی نقطه ورود سراسری و NOPهای «پسین» (after) را پس از نقطه ورود محلی قرار میدهد. این کار باعث میشود توالی NOPها در زمان تولید یک نقطه ورود سراسری غیرمتوالی شود. بدون این گزینه، NOPها مستقیماً قبل و بعد از نقطه ورود محلی قرار میگیرند که باعث متوالی بودن آنها میشود، اما نقطه ورود سراسری و محلی را از یکدیگر دورتر میکند. اگر تنها یک نقطه ورود تولید شود، این گزینه هیچ تاثیری ندارد.
- -misel
- -mno-isel
- این سوییچ، تولید دستورالعملهای ISEL را فعال یا غیرفعال میکند.
- -mvsx
- -mno-vsx
- تولید کدی که از دستورالعملهای برداری/اسکالر (VSX) استفاده میکند (یا نمیکند)، و همچنین فعالسازی استفاده از توابع درونی (built-in) که دسترسی مستقیمتر به مجموعه دستورالعملهای VSX را ممکن میسازد.
- -mcrypto
- -mno-crypto
- فعالسازی (یا غیرفعالسازی) استفاده از توابع درونی (built-in) که امکان دسترسی مستقیم به دستورالعملهای رمزنگاری اضافهشده در نسخه 2.07 از PowerPC ISA را فراهم میکنند.
- -mhtm
- -mno-htm
- فعالسازی (یا غیرفعالسازی) استفاده از توابع درونی (built-in) که امکان دسترسی مستقیم به دستورالعملهای حافظه تراکنشی سختافزاری (HTM) اضافهشده در نسخه 2.07 از PowerPC ISA را فراهم میکنند.
- -mpower8-fusion
- -mno-power8-fusion
- تولید کدی که برخی عملیاتهای عدد صحیح را در مجاورت یکدیگر نگه میدارد (یا نگه نمیدارد) تا دستورالعملها بتوانند در پردازندههای power8 و جدیدتر با یکدیگر ادغام (fuse) شوند.
- -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
برای ممیز
شناور ۱۲۸
بیتی IEEE و
استفاده از
شبیهسازی
نرمافزاری
یا
دستورالعملهای
سختافزاری
برای ممیز
شناور ۱۲۸
بیتی IEEE.
مجموعه دستورالعمل VSX (-mvsx) باید برای استفاده از پشتیبانی ممیز شناور ۱۲۸ بیتی IEEE فعال باشد. ممیز شناور ۱۲۸ بیتی IEEE تنها روی Linux پشتیبانی میشود.
پیشفرض برای -mfloat128 روی سیستمهای PowerPC Linux که از مجموعه دستورالعمل VSX استفاده میکنند فعال، و روی سایر سیستمها غیرفعال است.
اگر از مجموعه دستورالعمل ISA 3.0 (-mcpu=power9) روی یک سیستم 64-bit استفاده کنید، پشتیبانی ممیز شناور ۱۲۸ بیتی IEEE همچنین تولید دستورالعملهای ممیز شناور ۱۲۸ بیتی IEEE مربوط به ISA 3.0 را فعال میکند. در غیر این صورت، اگر تولید دستورالعملهای ISA 3.0 را مشخص نکنید یا یک سیستم big endian ۳۲ بیتی را هدف قرار دهید، ممیز شناور ۱۲۸ بیتی IEEE با شبیهسازی نرمافزاری انجام خواهد شد.
- -mfloat128-hardware
- -mno-float128-hardware
- فعال/غیرفعال
کردن
استفاده از
دستورالعملهای
سختافزاری
ISA 3.0 برای
پشتیبانی
از نوع داده
__float128.
پیشفرض برای -mfloat128-hardware روی سیستمهای PowerPC Linux با مجموعه دستورالعمل ISA 3.0 فعال، و روی سایر سیستمها غیرفعال است.
- -m32
- -m64
- تولید کد برای محیطهای 32-bit یا 64-bit اهداف Darwin و SVR4 (شامل GNU/Linux). محیط 32-bit متغیرهای int، long و اشارهگر را روی ۳۲ بیت تنظیم کرده و کدی تولید میکند که روی هر گونهای از PowerPC اجرا میشود. محیط 64-bit متغیر int را روی ۳۲ بیت و long و اشارهگر را روی ۶۴ بیت تنظیم کرده، و کدی برای PowerPC64، مشابه -mpowerpc64، تولید میکند.
- -mfull-toc
- -mno-fp-in-toc
- -mno-sum-in-toc
- -mminimal-toc
- اصلاح شیوه
تولید TOC
(مخفف Table Of Contents)،
که برای هر
فایل
اجرایی
ایجاد
میشود.
گزینه -mfull-toc
بهطور
پیشفرض
انتخاب شده
است. در این
حالت، GCC
دستکم یک
مدخل TOC را به
هر ارجاع
منحصربهفرد
متغیر
غیرخودکار
(non-automatic) در
برنامه شما
اختصاص
میدهد. GCC
همچنین
مقادیر
ثابت ممیز
شناور را در
TOC قرار
میدهد. با
این حال،
تنها
۱۶٬۳۸۴
مدخل در TOC
موجود است.
اگر پیام خطایی از پیونددهنده دریافت کردید مبنی بر اینکه فضای دردسترس TOC سرریز شده است، میتوانید با گزینههای -mno-fp-in-toc و -mno-sum-in-toc مقدار فضای مصرفی 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 و قرارداد فراخوانی (calling convention) ۶۴ بیتی AIX: اشارهگرهای ۶۴ بیتی، نوع "long" ۶۴ بیتی، و زیرساخت مورد نیاز برای پشتیبانی از آنها. مشخص کردن -maix64 مستلزم -mpowerpc64 است، در حالی که -maix32 این ABI ۶۴ بیتی را غیرفعال کرده و مستلزم -mno-powerpc64 است. پیشفرض GCC روی -maix32 است.
- -mxl-compat
- -mno-xl-compat
- تولید کدی
که هنگام
استفاده از
ABI سازگار با
AIX، تطابق
بیشتری با
معناشناسی
(semantics)
کامپایلر IBM XL
داشته باشد.
آرگومانهای
ممیز شناور
توابع
دارای
اعلان
اولیه (prototyped functions)
فراتر از
ناحیه
ذخیره ثبات
(RSA) روی پشته،
علاوهبر
FPRهای مربوط
به آرگومان
ارسال
میشوند.
هنگام
مقایسه
مقادیر و
تبدیل به double،
فرض نکنید
که
باارزشترین
double در یک
مقدار 128-bit long 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) از رشتهها پشتیبانی نمیکند، بنابراین گزینه -mpe و گزینه -pthread با یکدیگر ناسازگار هستند.
- -malign-natural
- -malign-power
- در AIX، سیستم
32-bit Darwin و 64-bit PowerPC GNU/Linux،
گزینه -malign-natural
ترازسازی
(alignment)
تعریفشده
توسط ABI را
برای انواع
بزرگتر،
مانند ممیز
شناور
مضاعف (double)، بر
روی مرز
مبتنی بر
اندازه
طبیعی
آنها
بازنویسی
میکند.
گزینه -malign-power
به GCC دستور
میدهد که
از قواعد
ترازسازی
تعیینشده
توسط ABI
پیروی کند.
پیشفرض GCC
ترازسازی
استاندارد
تعریفشده
در ABI است.
روی 64-bit 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 استفاده کنید، فاصله زمانی کوتاهی میان زمان بهروزرسانی اشارهگر پشته (stack pointer) و ذخیره آدرس قاب قبلی وجود دارد، که به این معنی است کدی که در میان وقفهها یا سیگنالها قاب پشته (stack frame) را پیمایش میکند ممکن است دادههای مخدوش دریافت کند..IP -mavoid-indexed-addresses 4
- -mno-avoid-indexed-addresses
- تولید کدی که تلاش میکند از استفاده از دستورالعملهای بارگذاری یا ذخیرهسازی نمایهدار (indexed load or store) اجتناب کند (اجتناب نکند). این دستورالعملها در شرایط خاصی، مانند هنگام پیمایش آرایههای بزرگی که از مرز 16M عبور میکنند، میتوانند روی پردازندههای Power6 افت کارایی ایجاد کنند. این گزینه بهطور پیشفرض هنگام هدف قرار دادن Power6 فعال و در غیر این صورت غیرفعال است.
- -mfused-madd
- -mno-fused-madd
- تولید کدی که از دستورالعملهای ضرب و انباشت ممیز شناور (floating-point multiply and accumulate) استفاده میکند (استفاده نمیکند). این دستورالعملها در صورت استفاده از ممیز شناور سختافزاری بهطور پیشفرض تولید میشوند. گزینه وابسته به ماشین -mfused-madd اکنون به گزینه مستقل از ماشین -ffp-contract=fast نگاشت شده است، و -mno-fused-madd به -ffp-contract=off نگاشت میشود.
- -mmulhw
- -mno-mulhw
- تولید کدی که از دستورالعملهای ضرب نیمکلمه (half-word multiply) و ضرب-انباشت بر روی پردازندههای IBM 405، 440، 464 و 476 استفاده میکند (استفاده نمیکند). این دستورالعملها هنگام هدف قرار دادن این پردازندهها بهطور پیشفرض تولید میشوند.
- -mdlmzb
- -mno-dlmzb
- تولید کدی که از دستورالعمل جستجوی رشته dlmzb در پردازندههای IBM 405، 440، 464 و 476 استفاده میکند (استفاده نمیکند). این دستورالعمل هنگام هدف قرار دادن این پردازندهها بهطور پیشفرض تولید میشود.
- -mno-bit-align
- -mbit-align
- در
سیستمهای
System V.4 و
سیستمهای
توکار PowerPC،
ساختارها و
اجتماعهایی
که شامل
میدانهای
بیتی (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 instructions) در طول گذر دوم زمانبندی اختصاص داده میشود کنترل میکند. آرگومان priority مقادیر 0، 1 یا 2 را میپذیرد تا (به ترتیب) هیچ، بالاترین یا دومین اولویت بالا را به دستورالعملهای محدودشده با شیار اعزام اختصاص دهد.
- -msched-costly-dep=dependence_type
- این گزینه کنترل میکند که چه وابستگیهایی در طول زمانبندی دستورالعملها توسط هدف پرهزینه در نظر گرفته شوند. آرگومان dependence_type یکی از مقادیر زیر را میپذیرد:
- no
- هیچ وابستگیای پرهزینه نیست.
- all
- تمام وابستگیها پرهزینه هستند.
- true_store_to_load
- یک وابستگی واقعی از ذخیره به بارگذاری پرهزینه است.
- store_to_load
- هرگونه وابستگی از ذخیره به بارگذاری پرهزینه است.
- number
- هر وابستگیای که مقدار تأخیر (latency) آن بزرگتر یا مساوی با number باشد پرهزینه است.
- -minsert-sched-nops=scheme
- این گزینه مشخص میکند کدام طرح درج NOP در طول گذر دوم زمانبندی استفاده شود. آرگومان scheme یکی از مقادیر زیر را میپذیرد:
- no
- دستورهای NOP را درج نکن.
- pad
- هر گروه اعزام دارای شیارهای صدور خالی را بر اساس گروهبندی زمانبند، با NOP پُر (pad) کن.
- regroup_exact
- دستورهای NOP را برای وادار کردن دستورالعملهای وابسته پرهزینه به انتقال به گروههای مجزا درج کن. دقیقاً به تعداد مورد نیاز NOP درج کن تا بر اساس گروهبندی تخمینی پردازنده، دستورالعمل را به یک گروه جدید منتقل کند..IP number 4 درج NOPها برای بردن دستورالعملهای وابسته و پرهزینه به گروههای جداگانه. درج number NOP برای راندن یک دستورالعمل به گروه جدید.
- -mcall-sysv
- در سامانههای System V.4 و PowerPC توکار، کد را با استفاده از قراردادهای فراخوانی منطبق با پیشنویس مارس ۱۹۹۵ واسط باینری کاربردی 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 توکار، کد را برای سامانهٔ گنو بر پایهٔ لینوکس کامپایل میکند.
- -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
- بازگرداندن تمام ساختارها در حافظه (همانطور که توسط AIX ABI مشخص شده است).
- -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 پیشفرض برای لینوکس ۶۴بیتی PowerPC با ترتیب بایت بزرگتر (big-endian) است. نادیدهگرفتن ABI پیشفرض نیازمند پشتیبانی سیستمی ویژه بوده و بهاحتمال زیاد به طرزی فاجعهبار با شکست مواجه خواهد شد.
- -mabi=elfv2
- تغییر ABI فعلی به استفاده از ELFv2 ABI. این ABI پیشفرض برای لینوکس ۶۴بیتی PowerPC با ترتیب بایت کوچکتر (little-endian) است. نادیدهگرفتن ABI پیشفرض نیازمند پشتیبانی سیستمی ویژه بوده و بهاحتمال زیاد به طرزی فاجعهبار با شکست مواجه خواهد شد.
- -mgnu-attribute
- -mno-gnu-attribute
- تولید دستورالعملهای اسمبلی .gnu_attribute برای تنظیم جفتهای برچسب/مقدار در بخش .gnu.attributes که دگرگونیهای ABI در پارامترهای تابع یا مقادیر بازگشتی را مشخص میکنند.
- -mprototype
- -mno-prototype
- در سامانههای System V.4 و PowerPC توکار فرض میکند که تمامی فراخوانیهای توابع با آرگومانهای متغیر بهدرستی اعلان نمونه (prototype) شدهاند. در غیر این صورت، کامپایلر باید پیش از هر فراخوانی فاقد پیشنمونه، دستورالعملی برای تنظیم یا پاک کردن بیت ۶ از ثبات کد شرط ("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 تنظیم میکند تا مشخص کند که بازآراییهای گسترشیافتهٔ eabi استفاده میشوند.
- -meabi
- -mno-eabi
- در سامانههای System V.4 و PowerPC توکار، از واسط باینری برنامههای کاربردی توکار (EABI)، که مجموعهای از اصلاحات بر مشخصات System V.4 است، پیروی میکند (یا نمیکند). انتخاب -meabi به این معنی است که پشته بر روی یک مرز ۸ بایتی تراز میشود، تابع "__eabi" از "main" برای برپاسازی محیط EABI فراخوانی میگردد، و گزینهٔ -msdata میتواند از هر دو ثبات "r2" و "r13" برای اشاره به دو ناحیهٔ مجزای دادههای کوچک استفاده کند. انتخاب -mno-eabi بدین معناست که پشته بر روی مرز ۱۶ بایتی تراز میشود، هیچ تابع مقداردهی اولیهٔ EABI از "main" فراخوانی نمیشود، و گزینهٔ -msdata تنها از "r13" برای اشاره به یک ناحیهٔ دادههای کوچک استفاده میکند. گزینهٔ -meabi بهطور پیشفرض فعال است اگر GCC را با استفاده از یکی از گزینههای powerpc*-*-eabi* پیکربندی کرده باشید.
- -msdata=eabi
- در سامانههای System V.4 و PowerPC توکار، دادههای سراسری و ایستای (static) کوچک، سراسری و مقداردهیشدهٔ "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 توکار، تمامی دادههای سراسری و ایستا (static) مقداردهیشده را در بخش ".data" و تمامی دادههای مقداردهینشده را در بخش ".bss" قرار میدهد.
- -mreadonly-in-sdata
- اشیاء فقطخواندنی را نیز در بخش ".sdata" قرار میدهد. این رفتار پیشفرض است.
- -mblock-move-inline-limit=num
- تمام انتقالهای بلوکی (مانند فراخوانیهای "memcpy" یا رونوشت ساختارها) را که کوچکتر یا مساوی num بایت هستند بهصورت درونخطی (inline) درمیآورد. حداقل مقدار برای 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 معمولی، در بخشهای دادههای کوچک (small data) یا BSS قرار میدهد. بهطور پیشفرض، مقدار num برابر با ۸ است. سوییچ -G num به پیونددهنده نیز ارسال میشود. تمام پودمانها باید با مقدار یکسان -G num کامپایل شوند.
- -mregnames
- -mno-regnames
- در سامانههای System V.4 و PowerPC توکار، نامهای ثباتها را در خروجی زبان اسمبلی با استفاده از اشکال نمادین درج میکند (درج نمیکند).
- -mlongcall
- -mno-longcall
- بهطور
پیشفرض
فرض میکند
که تمام
فراخوانیها
دوردست
هستند،
بهطوری که
توالی
فراخوانی
طولانیتر
و
پرهزینهتری
مورد نیاز
است. این
کار برای
فراخوانیهای
دورتر از ۳۲
مگابایت
(۳۳٬۵۵۴٬۴۳۲
بایت) از
موقعیت
فعلی لازم
است. اگر
کامپایلر
بداند که
فراخوانی
نمیتواند
آنقدر دور
باشد، یک
فراخوانی
کوتاه (short call)
تولید
میشود. این
تنظیم را
میتوان
توسط صفت
تابع
"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" را به همراه یک جزیرهٔ انشعاب (کد چسباننده) تولید میکند. این دو نشانی هدف نشاندهندهٔ تابع فراخواندهشده و جزیرهٔ انشعاب هستند. پیونددهندهٔ 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 و اشیاء بازنشانیپذیر -mbss-plt در PowerPC ۳۲ بیتی نباید با یکدیگر پیوند داده شوند.
- -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) استفاده کنید. توجه داشته باشید که اگرچه توان عملیاتی این توالی عموماً بالاتر از توان عملیاتی دستورالعملهای غیرمعکوس است، اما دقت توالی میتواند برای ریشههای دوم معکوس تا ۲ ulp کاهش یابد (بهعنوان مثال معکوس 1.0 برابر با 0.99999994 میشود).
- -mrecip=opt
- این گزینه مشخص میکند که کدام دستورالعملهای برآورد معکوس میتوانند استفاده شوند. آرگومان opt فهرستی از گزینهها است که با ویرگول از هم جدا شدهاند، و برای نفی کردن گزینه میتواند با یک "!" پیشونددهی شود:
- all
- تمام دستورالعملهای برآورد را فعال میکند.
- default
- دستورالعملهای پیشفرض را فعال میکند، معادل با -mrecip.
- none
- تمام دستورالعملهای برآورد را غیرفعال میکند، معادل با -mno-recip.
- div
- دستورالعملهای تقریب معکوس را برای هر دو دقت یگانه (single precision) و دوگانه (double precision) فعال میکند.
- divf
- دستورالعملهای تقریب معکوس با دقت یگانه را فعال میکند.
- divd
- دستورالعملهای تقریب معکوس با دقت دوگانه را فعال میکند.
- rsqrt
- دستورالعملهای تقریب ریشهٔ دوم معکوس را برای هر دو دقت یگانه و دوگانه فعال میکند..IP rsqrtf 4 دستورالعملهای تقریب معکوس ریشه دوم با دقت یگانه (single-precision) را فعال میکند.
- rsqrtd
- دستورالعملهای تقریب معکوس ریشه دوم با دقت دوگانه (double-precision) را فعال میکند.
بنابراین برای نمونه، -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 است، که استفاده از کتابخانههای Mathematical Acceleration Subsystem (MASS) شرکت IBM را برای برداریسازی توابع درونی با استفاده از کتابخانههای خارجی تعیین میکند. کامپایلر 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
- کدی برای ذخیره مقدار TOC در مکان رزروشده پشته در مقدمه تابع (function prologue) تولید میکند (تولید نمیکند) در صورتی که تابع از طریق یک اشارهگر روی سیستمهای AIX و لینوکس ۶۴ بیتی فراخوانی انجام دهد. اگر مقدار 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
- کد حفاظت از
پشته را با
استفاده از
قناری (canary) در
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 را در صورتی که پردازنده هدف از آنها پشتیبانی کند تولید میکند (تولید نمیکند). در حال حاضر این گزینه بهینهسازی جمعبندی انقباضی (-fshrink-wrap) را غیرفعال میکند.
- -mprivileged
- -mno-privileged
- کدی تولید میکند (تولید نمیکند) که در وضعیت ممتاز (privileged state) اجرا خواهد شد.
- -mblock-ops-unaligned-vsx
- -mno-block-ops-unaligned-vsx
- دستورالعملهای بارگذاری و ذخیره ناتراز vsx را برای بسط درونخطی توابع "memcpy" و "memmove" تولید میکند (تولید نمیکند).
- --param rs6000-vect-unroll-limit=
- بردارساز (vectorizer) با بررسی اطلاعات هدف تعیین میکند که آیا باز کردن حلقه اصلی برداریشده سودمند خواهد بود یا خیر و به چه میزان. این پارامتر حد بالایی را برای میزان باز کردن حلقه اصلی توسط بردارساز تعیین میکند. مقدار پیشفرض چهار است..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
- استفاده از محیط زمان اجرای شبیهساز. پیشفرض، استفاده از محیط زمان اجرای مخصوص برد libgloss است.
- -mas100-syntax
- -mno-as100-syntax
- هنگام تولید خروجی اسمبلی، از نحوی استفاده میکند که با اسمبلر AS100 متعلق به Renesas سازگار است. این نحو همچنین توسط اسمبلر GAS قابل پردازش است، اما محدودیتهایی دارد و بنابراین بهطور پیشفرض تولید نمیشود.
- -mmax-constant-size=N
- حداکثر
اندازه (به
بایت) ثابتی
را مشخص
میکند که
میتواند
به عنوان یک
عملوند در
یک
دستورالعمل
RX استفاده
شود. اگرچه
مجموعه
دستورالعملهای
RX اجازه
میدهد
ثابتهایی
تا طول ۴
بایت در
دستورالعملها
به کار
روند، اما
مقدار
طولانیتر
به معنای
دستورالعملی
طولانیتر
است.
بنابراین
در برخی
شرایط
میتواند
محدود کردن
اندازهٔ
ثابتهای
مورد
استفاده در
دستورالعملها
سودمند
باشد.
ثابتهایی
که بیش از
حد بزرگ
هستند، در
عوض در یک
مخزن
مقادیر
ثابت قرار
گرفته و از
طریق ارجاع
غیرمستقیم
با ثبات به
آنها
اشاره
میشود.
مقدار 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" را
فعال یا
غیرفعال
میکند. این
دستورالعملها
ممکن است
دادهها را
پیشواکشی
کنند که در
صورت
دسترسی به
یک ثبات I/O
ایمن نیست.
(برای
اطلاعات
بیشتر به
بخش ۱۲.۲.۷
در 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
- آدرس فریم
فراخواننده
(caller) را
بهعنوان
اشارهگر backchain
در فریم
پشتهٔ
فراخواندهشده
(callee) ذخیره
میکند (یا
ذخیره
نمیکند).
یک backchain ممکن
است برای
امکان
خطایابی با
استفاده از
ابزارهایی
که اطلاعات
فریم
فراخوانی DWARF
را
پشتیبانی
نمیکنند،
مورد نیاز
باشد.
هنگامی که
-mno-packed-stack فعال
باشد،
اشارهگر backchain
در پایین
فریم پشته
ذخیره
میشود؛
هنگامی که
-mpacked-stack فعال
باشد، backchain در
بالاترین
کلمه (word) از
ناحیهٔ
ذخیرهٔ
ثباتهای
۹۶/۱۶۰
بایتی قرار
میگیرد.
بهطور کلی، کدی که با -mbackchain کامپایل شده است، با کدی که با -mno-backchain کامپایل شده سازگاری فراخوانی (call-compatible) دارد؛ با این حال، استفاده از backchain برای اهداف خطایابی معمولاً مستلزم این است که کل فایل اجرایی با -mbackchain ساخته شده باشد. توجه داشته باشید که ترکیب -mbackchain، -mpacked-stack و -mhard-float پشتیبانی نمیشود. برای ساخت هسته لینوکس از -msoft-float استفاده کنید.
پیشفرض این است که backchain نگهداری نشود.
- -mpacked-stack
- -mno-packed-stack
- از چیدمان
پشتهٔ
فشرده (packed stack)
استفاده
میکند (یا
استفاده
نمیکند).
هنگامی که
-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" برای فراخوانی زیرروالها (subroutine) استفاده میکند. این مورد تنها زمانی به شکل قابل اطمینان کار میکند که اندازهٔ کل فایل اجرایی از 64k فراتر نرود. پیشفرض این است که در عوض از دستورالعمل "basr" استفاده شود که چنین محدودیتی ندارد.
- -m64
- -m31
- هنگامی که -m31 مشخص شود، کدی مطابق با ABI سیستم GNU/Linux برای S/390 تولید میکند. هنگامی که -m64 مشخص شود، کدی مطابق با ABI سیستم GNU/Linux برای zSeries تولید میکند. این قابلیت بهویژه به GCC اجازه میدهد تا دستورالعملهای ۶۴ بیتی تولید کند. برای مقصدهای s390، پیشفرض -m31 است، در حالی که مقصدهای s390x بهصورت پیشفرض از -m64 استفاده میکنند.
- -mzarch
- -mesa
- هنگامی که -mzarch مشخص شود، کدی با استفاده از دستورالعملهای موجود در z/Architecture تولید میکند. هنگامی که -mesa مشخص شود، کدی با استفاده از دستورالعملهای موجود در ESA/390 تولید میکند. توجه داشته باشید که استفاده از -mesa به همراه -m64 امکانپذیر نیست. هنگام تولید کدی سازگار با ABI سیستم GNU/Linux برای S/390، پیشفرض -mesa است. هنگام تولید کدی سازگار با ABI سیستم GNU/Linux برای zSeries، پیشفرض -mzarch است.
- -mhtm
- -mno-htm
- گزینهٔ -mhtm مجموعهای از توابع توکار (builtins) را فعال میکند که از دستورالعملهای موجود در امکان اجرای تراکنشی (transactional execution facility) معرفیشده در نسل ماشینهای IBM zEnterprise EC12 استفاده میکنند (S/390 System z Built-in Functions). گزینهٔ -mhtm هنگام استفاده از -march=zEC12 بهطور پیشفرض فعال است.
- -mvx
- -mno-vx
- هنگامی که -mvx مشخص شود، کدی با استفاده از دستورالعملهای موجود در امکان گسترش برداری (vector extension facility) معرفیشده در نسل ماشینهای IBM z13 تولید میکند. این گزینه ABI را برای برخی از مقادیر نوع برداری با توجه به تراز (alignment) و قراردادهای فراخوانی تغییر میدهد. در صورتی که مقادیر نوع برداری در زمینهای مرتبط با ABI استفاده شوند، یک دستور .gnu_attribute در GAS اضافه میشود تا باینری حاصل را با ABI استفادهشده نشانهگذاری کند. گزینهٔ -mvx هنگام استفاده از -march=z13 بهطور پیشفرض فعال است.
- -mzvector
- -mno-zvector
- گزینهٔ -mzvector پسوندهای زبانی برداری و توابع توکار ارائهشده بر اساس دستورالعملهای امکان گسترش برداری معرفیشده در نسل ماشینهای IBM z13 را فعال میکند. این گزینه پشتیبانی از کلیدواژهٔ vector را جهت تعریف متغیرها و آرگومانهای نوع برداری اضافه میکند. vector تنها زمانی در دسترس است که افزونههای GNU فعال باشند. در صورت الزام انطباق دقیق با استاندارد، مثلاً با -std=c99، این کلمه کلیدی بسط نخواهد یافت. علاوه بر توابع توکار سطح پایین GCC، گزینهٔ -mzvector مجموعهای از توابع توکار را که برای سازگاری با پیادهسازیهای سبک AltiVec مانند Power و Cell اضافه شدهاند نیز فعال میکند. جهت بهرهبرداری از این توابع توکار، فایل سرایند vecintrin.h باید گنجانده (include) شود. -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 دستورالعملهای اضافی در مقدمهٔ تابع (function prologue) تولید میکند که در صورت فراتر رفتن اندازهٔ پشته به میزان 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،
حداکثر
۱۰۰۰۰۰۰)
درج میشود.
پس از
برچسب، ۲ *
post-halfwords بایت
اضافه
میشود که
در آن از
بزرگترین
دستورالعملهای
شبیه NOP که
معماری
اجازه
میدهد
استفاده
خواهد شد
(حداکثر
۱۰۰۰۰۰۰).
اگر هر دو آرگومان صفر باشند، وصلهزنی درجا غیرفعال میشود.
این گزینه را میتوان برای توابع منفرد به وسیلهٔ ویژگی "hotpatch" لغو (override) کرد.
گزینههای 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 با این فرض که واحد ممیز شناور به طور پیشفرض در حالت دقتیگانه است.
- -m4-200-single-only
- تولید کد برای SH4-200 به گونهای که از هیچ عملیات ممیز شناور با دقتمضاعف استفاده نشود.
- -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 بر روی مرزهای ۶۴ بیتی. توجه داشته باشید که این گزینه قراردادهای فراخوانی را تغییر میدهد و بنابراین برخی از توابع کتابخانهٔ استاندارد 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
- درونخطیسازی کد برای باطلهسازی مدخلهای حافظهٔ نهان دستورالعمل پس از برپایی ترامپولینهای توابع تودرتو. این گزینه اگر -musermode برقرار باشد و گزینهٔ تولید کد انتخابی (مانند -m4) اجازهٔ استفاده از دستورالعمل "icbi" را ندهد، اثری ندارد. اگر گزینهٔ تولید کد انتخابی اجازهٔ استفاده از دستورالعمل "icbi" را ندهد و -musermode برقرار نباشد، کد درونخطیشده آرایهٔ آدرس کش دستورالعمل را مستقیماً با یک نوشتن انجمنی دستکاری میکند. این کار نه تنها نیازمند حالت ممتاز در زمان اجرا است، بلکه اگر خط حافظهٔ نهان از طریق TLB نگاشت شده باشد و نگاشت آن حذف شده باشد با شکست مواجه میشود.
- -misize
- تخلیهٔ اندازه و مکان دستورالعمل در کد اسمبلی.
- -mpadstruct
- این گزینه منسوخ شده است. این گزینه ساختارها را به مضربی از ۴ بایت تراز میکند، که با SH ABI ناسازگار است.
- -matomic-model=model
- تنظیم مدل عملیات اتمیک و پارامترهای اضافی به صورت فهرستی جداشده با کاما. برای جزئیات مربوط به توابع داخلی اتمیک، __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" به طور موقت غیرفعال میکنند. این مدل فقط هنگامی که برنامه در حالت ممتاز اجرا میشود کار میکند و فقط برای سیستمهای تکهستهای مناسب است. پشتیبانی اضافی از کد مدیریت وقفه/استثنای سیستم نیاز نیست. این مدل زمانی که مقصد "sh*-*-linux*" و SH1* یا SH2* باشد به طور پیشفرض فعال است.
- hard-llcs
- تولید توالیهای اتمیک سختافزاری تنها با استفاده از دستورالعملهای "movli.l" و "movco.l". این قابلیت فقط روی SH4A در دسترس است و برای سیستمهای چندهستهای مناسب است. از آنجا که دستورالعملهای سختافزاری تنها از متغیرهای اتمیک ۳۲ بیتی پشتیبانی میکنند، دسترسی به متغیرهای ۸ یا ۱۶ بیتی با دسترسیهای ۳۲ بیتی شبیهسازی میشود. کدی که با این گزینه کامپایل شود در صورت اجرا روی سیستم SH4A، با سایر سیستمهای مدیریت وقفه/استثنای مدلهای اتمیک نرمافزاری نیز سازگار است. برای این مدل، پشتیبانی اضافی از کد مدیریت وقفه/استثنای سیستم نیاز نیست.
- gbr-offset=
- این پارامتر آفست بر حسب بایت متغیر در ساختار بلوک کنترل رشته را مشخص میکند که باید توسط توالیهای اتمیک تولیدشده هنگام انتخاب مدل soft-tcb استفاده شود. برای سایر مدلها این پارامتر نادیده گرفته میشود. مقدار مشخصشده باید مضرب صحیحی از چهار و در محدودهٔ 0-1020 باشد.
- strict
- این پارامتر از استفادهٔ ترکیبی چندین مدل اتمیک، حتی در صورت سازگار بودن آنها، جلوگیری میکند و کامپایلر را وادار میکند تا فقط توالیهای اتمیکِ مدل مشخصشده را تولید کند.
- -mprefergot
- هنگام تولید کد مستقل از موقعیت، فراخوانیهای توابع را به جای Procedure Linkage Table با استفاده از Global Offset Table منتشر میکند.
- -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
- تابعی از کتابخانه را فراخوانی میکند که از یک جدول جستجو (lookup table) برای مقسومعلیههای کوچک و دستور "div1" همراه با تمایز حالت برای مقسومعلیههای بزرگتر استفاده میکند. تقسیم بر صفر نتیجهای نامشخص محاسبه کرده و تله ایجاد نمیکند. این حالت پیشفرض برای SH4 است. مشخص کردن این گزینه برای مقاصدی که فاقد دستورات شیفت پویا هستند، به طور پیشفرض به "call-div1" تغییر مییابد.
هنگامی که راهبرد تقسیمی مشخص نشده باشد، راهبرد پیشفرض بر اساس مقصد جاری انتخاب میشود. برای SH2A راهبرد پیشفرض استفاده از دستورات "divs" و "divu" به جای فراخوانیهای توابع کتابخانهای است.
- -maccumulate-outgoing-args
- فضای لازم برای آرگومانهای خروجی را یک بار در مقدمه تابع (prologue) رزرو میکند، نه در اطراف هر فراخوانی. این کار به طور کلی برای کارایی و اندازه کد سودمند است. همچنین برای بازپیچی پشته (unwinding) جهت جلوگیری از تغییر قاب پشته در اطراف کدهای شرطی مورد نیاز است.
- -mdivsi3_libfunc=name
- نام تابع کتابخانهایِ مورد استفاده برای تقسیم علامتدار ۳۲ بیتی را روی name تنظیم میکند. این گزینه فقط بر نام استفادهشده در راهبردهای تقسیم call تأثیر میگذارد، و کامپایلر همچنان انتظار همان مجموعه ثباتهای ورودی/خروجی/تغییریافته (clobbered) را دارد که گویی این گزینه وجود نداشته است.
- -mfixed-range=register-range
- کدی تولید میکند که محدوده ثباتهای دادهشده را به عنوان ثباتهای ثابت در نظر میگیرد. ثبات ثابت ثباتی است که تخصیصدهنده ثبات (register allocator) نمیتواند از آن استفاده کند. این گزینه هنگام کامپایل کد هسته مفید است. یک محدوده ثبات به صورت دو ثبات که با یک خط تیره جدا شدهاند مشخص میشود. میتوان چندین محدوده ثبات را با کاما جدا کرده و مشخص نمود.
- -mbranch-cost=num
- مقدار num را به عنوان هزینه یک دستور انشعاب در نظر میگیرد. مقادیر بالاتر باعث میشوند کامپایلر تلاش کند در صورت امکان کدهای بدون انشعاب بیشتری تولید کند. در صورت عدم تعیین، این مقدار بسته به نوع پردازندهای که برای آن کامپایل انجام میشود، انتخاب خواهد شد.
- -mzdcbranch
- -mno-zdcbranch
- فرض میکند (فرض نمیکند) که دستورات انشعاب شرطی با جابجایی صفر "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" را برای تقریب معکوس ریشه دوم صادر کند. گزینه -mfsrra باید در ترکیب با -funsafe-math-optimizations و -ffinite-math-only استفاده شود. این گزینه به طور پیشفرض هنگام تولید کد برای SH4A فعال است. استفاده از -mno-fsrra تقریبهای معکوس ریشه دوم را حتی در صورت فعال بودن -funsafe-math-optimizations و -ffinite-math-only غیرفعال میکند.
- -mpretend-cmove
- انشعابهای شرطی با جابجایی صفر را برای الگوهای دستور انتقال شرطی ترجیح میدهد. این کار میتواند منجر به تولید کد سریعتر روی پردازنده SH4 شود.
- -mfdpic
- با استفاده از FDPIC ABI کد تولید میکند.
گزینههای 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
را مشخص
کنید تا
خروجی با
استفاده از
ثباتهای
سراسری ۲ تا
۴ تولید
شود؛
ثباتهایی
که SPARC SVR4 ABI برای
برنامههای
کاربردی
رزرو کرده
است. مشابه
ثبات
سراسری ۱،
با هر یک از
ثباتهای
سراسری ۲ تا
۴ به عنوان
یک ثبات
قابل تخصیص
برخورد
میشود که
در
فراخوانی
توابع
تخریب (clobber)
میشوند.
این حالت
پیشفرض
است.
برای سازگاری کامل با SVR4 ABI به قیمت مقداری افت کارایی، -mno-app-regs را مشخص کنید. باید کتابخانهها و نرمافزارهای سیستمی را با این گزینه کامپایل کنید.
- -mflat
- -mno-flat
- با -mflat،
کامپایلر
دستورالعملهای
save/restore را تولید
نمیکند و
از یک مدل
پنجرهٔ
ثبات
«مسطح» یا
تکپنجرهای
استفاده
میکند. این
مدل با مدل
معمول
پنجرهٔ
ثبات
سازگار است.
ثباتهای
محلی و
ثباتهای
ورودی (0--5)
همچنان به
عنوان
ثباتهای
«call-saved» در نظر
گرفته
میشوند و
در صورت
نیاز در
پشته ذخیره
میگردند.
با -mno-flat (حالت پیشفرض)، کامپایلر دستورالعملهای save/restore را (به جز برای توابع برگ یا leaf functions) تولید میکند. این حالت کارکرد عادی است.
- -mfpu
- -mhard-float
- تولید خروجی حاوی دستورالعملهای ممیز شناور سختافزاری. این حالت پیشفرض است.
- -mno-fpu
- -msoft-float
- تولید
خروجی حاوی
فراخوانیهای
کتابخانهای
برای ممیز
شناور.
هشدار:
کتابخانههای
مورد نیاز
برای تمام
مقصدهای SPARC
در دسترس
نیستند. به
طور معمول
از امکانات
کامپایلر C
عادی سیستم
استفاده
میشود،
اما این کار
در کامپایل
متقابل (cross-compilation)
به طور
مستقیم
امکانپذیر
نیست. باید
تمهیدات
لازم را
برای فراهم
کردن توابع
کتابخانهای
مناسب در
کامپایل
متقابل در
نظر بگیرید.
مقصدهای
تعبیهشدهٔ
sparc-*-aout و sparclite-*-*
پشتیبانی
ممیز شناور
نرمافزاری
را ارائه
میدهند.
گزینهٔ -msoft-float شیوهٔ فراخوانی (calling convention) را در فایل خروجی تغییر میدهد؛ بنابراین، تنها در صورتی مفید است که تمام برنامه را با این گزینه کامپایل کنید. بهویژه، برای کارکرد درست باید libgcc.a، یعنی کتابخانهای که همراه GCC ارائه میشود، را با -msoft-float کامپایل کنید.
- -mhard-quad-float
- تولید خروجی حاوی دستورالعملهای ممیز شناور چهارکلمهای (long double).
- -msoft-quad-float
- تولید
خروجی حاوی
فراخوانیهای
کتابخانهای
برای
دستورالعملهای
ممیز شناور
چهارکلمهای
(long double). توابع
فراخوانیشده
همانهایی
هستند که در
SPARC ABI مشخص
شدهاند.
این حالت
پیشفرض
است.
تا زمان نگارش این مستند، هیچ پیادهسازی SPARC وجود ندارد که پشتیبانی سختافزاری از دستورالعملهای ممیز شناور چهارکلمهای داشته باشد. همهٔ آنها برای هر یک از این دستورالعملها یک گردانندهٔ تله (trap handler) را فراخوانی میکنند، و سپس گردانندهٔ تله اثر دستورالعمل را شبیهسازی میکند. به دلیل سربار گردانندهٔ تله، این روش بسیار کندتر از فراخوانی توابع کتابخانهای ABI است. از این رو گزینهٔ -msoft-quad-float پیشفرض است.
- -mno-unaligned-doubles
- -munaligned-doubles
- فرض میکند
که مقادیر double
دارای تراز
۸ بایتی
هستند. این
حالت
پیشفرض
است.
با -munaligned-doubles، کامپایلر GCC فرض میکند مقادیر double تنها در صورتی دارای تراز ۸ بایتی هستند که درون نوع دیگری قرار گرفته باشند، یا نشانی مطلقی داشته باشند. در غیر این صورت، تراز آنها را ۴ بایتی فرض میکند. تعیین این گزینه از برخی مشکلات سازگاری نادر با کدهای تولیدشده توسط دیگر کامپایلرها جلوگیری میکند. این حالت پیشفرض نیست زیرا باعث افت کارایی، بهویژه در کدهای ممیز شناور میشود.
- -muser-mode
- -mno-user-mode
- کدی که فقط میتواند در حالت ناظر (supervisor mode) اجرا شود را تولید نمیکند. این موضوع فقط برای دستورالعمل "casa" که برای پردازندهٔ LEON3 منتشر میشود مرتبط است. این حالت پیشفرض است.
- -mfaster-structs
- -mno-faster-structs
- با -mfaster-structs، کامپایلر فرض میکند که ساختارها باید دارای تراز ۸ بایتی باشند. این کار استفاده از جفتدستورالعملهای "ldd" و "std" را برای رونوشتها در انتساب ساختار، به جای دو برابر جفتهای "ld" و "st" ممکن میسازد. با این حال، استفاده از این تراز تغییریافته مستقیماً SPARC ABI را نقض میکند. بنابراین، این گزینه تنها برای اهدافی در نظر گرفته شده است که توسعهدهنده میداند کد حاصل مستقیماً با قواعد ABI مطابقت نخواهد داشت.
- -mstd-struct-return
- -mno-std-struct-return
- با -mstd-struct-return،
کامپایلر
طبق 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 تولید میکند. این گزینه دستورالعملهای ضرب عدد صحیح، گام تقسیم عدد صحیح و اسکن ("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 نیز استفاده کرد، اما تنها مقادیر مفید آنهایی هستند که یک پیادهسازی بهخصوص از CPU را انتخاب میکنند. این مقادیر عبارتند از: 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 کدی برای SPARC-V8+ ABI تولید میکند. تفاوت آن با V8 ABI در این است که ثباتهای سراسری و خروجی با پهنای ۶۴ بیت در نظر گرفته میشوند. این گزینه بهطور پیشفرض در Solaris در حالت ۳۲ بیتی برای تمام پردازندههای SPARC-V9 فعال است.
- -mvis
- -mno-vis
- با -mvis، کامپایلر GCC کدی تولید میکند که از افزونههای UltraSPARC Visual Instruction Set بهره میبرد. پیشفرض -mno-vis است.
- -mvis2
- -mno-vis2
- با -mvis2، کامپایلر GCC کدی تولید میکند که از نسخهٔ 2.0 افزونههای UltraSPARC Visual Instruction Set بهره میبرد. هنگام هدف قرار دادن پردازندهای که از چنین دستورالعملهایی پشتیبانی میکند، مانند UltraSPARC-III و جدیدتر، پیشفرض -mvis2 است. تنظیم -mvis2 همچنین -mvis را فعال میکند.
- -mvis3
- -mno-vis3
- با -mvis3، کامپایلر GCC کدی تولید میکند که از نسخهٔ 3.0 افزونههای UltraSPARC Visual Instruction Set بهره میبرد. هنگام هدف قرار دادن پردازندهای که از چنین دستورالعملهایی پشتیبانی میکند، مانند niagara-3 و جدیدتر، پیشفرض -mvis3 است. تنظیم -mvis3 همچنین -mvis2 و -mvis را فعال میکند.
- -mvis3b
- -mno-vis3b
- با -mvis3b، کامپایلر GCC کدی تولید میکند که از نسخهٔ 3.0 افزونههای UltraSPARC Visual Instruction Set، بهعلاوه دستورالعملهای اضافی VIS معرفیشده در Oracle SPARC Architecture 2011 بهره میبرد. هنگام هدف قرار دادن پردازندهای که از این دستورالعملها پشتیبانی میکند، مانند niagara-7 و جدیدتر، پیشفرض -mvis3b است. تنظیم -mvis3b همچنین گزینههای -mvis3، -mvis2 و -mvis را فعال میکند.
- -mvis4
- -mno-vis4
- با -mvis4، کامپایلر GCC کدی تولید میکند که از نسخهٔ 4.0 افزونههای UltraSPARC Visual Instruction Set بهره میبرد. هنگام هدف قرار دادن پردازندهای که از چنین دستورالعملهایی پشتیبانی میکند، مانند niagara-7 و جدیدتر، پیشفرض -mvis4 است. تنظیم -mvis4 همچنین گزینههای -mvis3b، -mvis3، -mvis2 و -mvis را فعال میکند.
- -mvis4b
- -mno-vis4b
- با -mvis4b، کامپایلر GCC کدی تولید میکند که از نسخهٔ 4.0 افزونههای UltraSPARC Visual Instruction Set، بهعلاوه دستورالعملهای اضافی VIS معرفیشده در Oracle SPARC Architecture 2017 بهره میبرد. هنگام هدف قرار دادن پردازندهای که از چنین دستورالعملهایی پشتیبانی میکند، مانند m8 و جدیدتر، پیشفرض -mvis4b است. تنظیم -mvis4b همچنین گزینههای -mvis4، -mvis3b، -mvis3، -mvis2 و -mvis را فعال میکند.
- -mcbcond
- -mno-cbcond
- با -mcbcond، کامپایلر GCC کدی تولید میکند که از دستورالعملهای Compare-and-Branch-on-Condition در UltraSPARC بهره میبرد. هنگام هدف قرار دادن یک CPU که از این دستورالعملها پشتیبانی میکند، مانند Niagara-4 و جدیدتر، پیشفرض -mcbcond است.
- -mfmaf
- -mno-fmaf
- با -mfmaf، کامپایلر GCC کدی تولید میکند که از دستورالعملهای ممیز شناور Fused Multiply-Add در UltraSPARC بهره میبرد. هنگام هدف قرار دادن یک CPU که از چنین دستورالعملهایی پشتیبانی میکند، مانند 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
- فعالسازی راهکار مستندشده برای رفع تکنقص پردازندهٔ Atmel AT697F (که مطابق با نقص شمارهٔ ۱۳ پردازندهٔ AT697E است).
- -mfix-ut699
- فعالسازی راهکارهای مستندشده برای رفع نقصهای ممیز شناور و نقصهای باطلسازی حافظهٔ پنهان داده در پردازندهٔ UT699.
- -mfix-ut700
- فعالسازی راهکار مستندشده برای رفع نقصهای ذخیرهسازی پشتسرهم پردازندهٔ UT699E/UT700.
- -mfix-gr712rc
- فعالسازی راهکار مستندشده برای رفع نقصهای ذخیرهسازی پشتسرهم پردازندهٔ GR712RC.
این گزینههای -m علاوهبر موارد بالا بر روی پردازندههای SPARC-V9 در محیطهای ۶۴ بیتی پشتیبانی میشوند:
- -m32
- -m64
- تولید کد برای یک محیط ۳۲ بیتی یا ۶۴ بیتی. محیط ۳۲ بیتی مقادیر int، long و pointer را روی ۳۲ بیت تنظیم میکند. محیط ۶۴ بیتی int را روی ۳۲ بیت و long و pointer را روی ۶۴ بیت تنظیم میکند.
- -mcmodel=which
- تنظیم مدل کد به یکی از موارد:
- medlow
- مدل کد Medium/Low: آدرسهای ۶۴ بیتی، برنامهها باید در ۳۲ بیت پایینی حافظه پیوند یابند. برنامهها را میتوان بهصورت ایستا یا پویا پیوند داد..IP medmid 4 مدل کد Medium/Middle: آدرسهای ۶۴-بیتی؛ برنامهها باید در ۴۴ بیت پایین حافظه پیوند (link) داده شوند، قطعههای متن (text) و داده (data) باید اندازهای کمتر از 2GB داشته باشند و قطعهٔ داده باید در فاصلهٔ کمتر از 2GB از قطعهٔ متن قرار گیرد.
- medany
- مدل کد Medium/Anywhere: آدرسهای ۶۴-بیتی؛ برنامهها میتوانند در هر کجای حافظه پیوند داده شوند، قطعههای متن و داده باید کمتر از 2GB باشند و قطعهٔ داده باید در فاصلهٔ کمتر از 2GB از قطعهٔ متن واقع شود.
- embmedany
- مدل کد Medium/Anywhere برای سیستمهای تعبیهشده (embedded): آدرسهای ۶۴-بیتی؛ قطعههای متن و داده باید کمتر از 2GB باشند، و هر دو میتوانند از هر کجای حافظه آغاز شوند (تعیینشده در زمان پیوند). ثبات عمومی %g4 به ابتدای قطعهٔ داده اشاره میکند. برنامهها بهصورت ایستا (statically) پیوند داده میشوند و PIC پشتیبانی نمیشود.
- -mmemory-model=mem-model
- مدل حافظهٔ فعال روی پردازنده را روی یکی از موارد زیر تنظیم میکند:
این مدلهای حافظه بهطور رسمی در پیوست D از کتابچهٔ راهنمای معماری SPARC-V9 تعریف شدهاند، همانگونه که در فیلد "PSTATE.MM" پردازنده تنظیم میشوند.
- -mstack-bias
- -mno-stack-bias
- با گزینهٔ -mstack-bias، کامپایلر GCC فرض میکند که اشارهگر پشته (stack pointer) و اشارهگر چارچوب (frame pointer در صورت وجود) دارای انحراف (offset) به اندازهٔ -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
جلوگیری
میکند.
این گزینه هنگام استفاده از RH850 ABI به طور پیشفرض فعال است (به -mrh850-abi مراجعه کنید)، و هنگام استفاده از GCC ABI به طور پیشفرض غیرفعال است. اگر دستورالعملهای "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 مربوط به V850 ABI را فعال میکند. این حالت پیشفرض است. با این نگارش از ABI، قوانین زیر اعمال میشوند:
- ساختارها و اجتماعهای هماندازه با عدد صحیح، به جای ثبات، از طریق یک اشارهگر حافظه بازگردانده میشوند.
- ساختارها و اجتماعهای بزرگ (با اندازهٔ بیش از ۸ بایت) از طریق مقدار (by value) ارسال میشوند.
- توابع روی مرزهای ۱۶ بیتی همتراز میشوند.
- گزینهٔ خط فرمان -m8byte-align پشتیبانی میشود.
- گزینهٔ خط فرمان -mdisable-callt به طور پیشفرض فعال است. گزینهٔ خط فرمان -mno-disable-callt پشتیبانی نمیشود.
هنگامی که این نگارش از ABI فعال باشد، نماد پیشپردازندهٔ سی "__V850_RH850_ABI__" تعریف میشود.
- -mgcc-abi
- پشتیبانی از نگارش قدیمی GCC مربوط به V850 ABI را فعال میکند. با این نگارش از 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 تولید میکند. تنها در صورتی از این گزینه استفاده کنید که اسمبلر یا پیونددهنده از انشعابهای خارج از محدوده در جدول 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 آزمایشی است، بنابراین کامپایلر به طور پیشفرض از بارگذاری مجدد استاندارد استفاده میکند.
گزینههای 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
- انتخاب کتابخانههای زمان اجرای 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
مشخصشده
بهینهسازی
میکند،
-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،
سطح
ریزمعماری
متناظر را
بر اساس x86-64 psABI
انتخاب
میکنند. بر
روی ABIهایی
غیر از x86-64 psABI،
همان
ویژگیهای
پردازندهای
را انتخاب
میکنند که
اسناد x86-64 psABI
برای آن سطح
ریزمعماری
ویژه مستند
کردهاند.
از آنجا که این مقادیر cpu-type تنظیمات متناظری در -mtune ندارند، استفاده از -march با این مقادیر، بهینهسازی سراسری و عمومی را فعال میکند. بهینهسازی ویژه را میتوان با استفاده از گزینهٔ -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-bit و پشتیبانی از مجموعه دستورالعملهای MMX، SSE، SSE2، SSE3 و FXSR.
- core2
- پردازندهٔ Intel Core 2 با افزونههای 64-bit و پشتیبانی از مجموعه دستورالعملهای MMX، SSE، SSE2، SSE3، SSSE3، CX16، SAHF و FXSR.
- nehalem
- corei7
- پردازندهٔ Intel Nehalem با افزونههای 64-bit و پشتیبانی از مجموعه دستورالعملهای MMX، SSE، SSE2، SSE3، SSSE3، SSE4.1، SSE4.2، POPCNT، CX16، SAHF و FXSR.
- westmere
- پردازندهٔ Intel Westmere با افزونههای 64-bit و پشتیبانی از مجموعه دستورالعملهای MMX، SSE، SSE2، SSE3، SSSE3، SSE4.1، SSE4.2، POPCNT، CX16، SAHF، FXSR و PCLMUL.
- sandybridge
- corei7-avx
- پردازندهٔ Intel Sandy Bridge با افزونههای 64-bit و پشتیبانی از مجموعه دستورالعملهای MMX، SSE، SSE2، SSE3، SSSE3، SSE4.1، SSE4.2، POPCNT، CX16، SAHF، FXSR، AVX، XSAVE و PCLMUL.
- ivybridge
- core-avx-i
- پردازندهٔ Intel Ivy Bridge با افزونههای 64-bit و پشتیبانی از مجموعه دستورالعملهای 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-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.
- broadwell
- پردازندهٔ Intel Broadwell با افزونههای 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.
- skylake
- پردازندهٔ Intel Skylake با افزونههای 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.
- skylake-avx512
- پردازندهٔ سرور Intel Skylake با افزونههای 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، CLWB، AVX512VL، AVX512BW، AVX512DQ و AVX512CD.
- cascadelake
- پردازندهٔ Intel Cascade Lake با افزونههای 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، CLWB، AVX512VL، AVX512BW، AVX512DQ، AVX512CD و AVX512VNNI.
- cannonlake
- پردازندهٔ سرور Intel Cannon Lake با افزونههای 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.
- cooperlake
- پردازندهٔ Intel Cooper Lake با افزونههای 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، CLWB، AVX512VL، AVX512BW، AVX512DQ، AVX512CD، AVX512VNNI و AVX512BF16.
- icelake-client
- پردازندهٔ کلاینت Intel Ice Lake با افزونههای 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.
- icelake-server
- پردازندهٔ سرور Intel Ice Lake با افزونههای 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.
- tigerlake
- پردازندهٔ Intel Tiger Lake با افزونههای 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، MOVDIRI، MOVDIR64B، CLWB، AVX512VP2INTERSECT و KEYLOCKER.
- rocketlake
- پردازندهٔ Intel Rocket Lake با افزونههای 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، 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-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، KL، WIDEKL و AVX-VNNI.
- arrowlake
- پردازندهٔ Intel Arrow 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، KL، WIDEKL، AVX-VNNI، UINTR، AVXIFMA، AVXVNNIINT8، AVXNECONVERT و CMPCCXADD.
- arrowlake-s
- lunarlake
- پردازندهٔ Intel Arrow Lake S/Lunar 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، 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!، 3DNow! ارتقایافته و دستورالعملهای پیشواکشی SSE.
- athlon-4
- athlon-xp
- athlon-mp
- پردازندهٔ ارتقایافتهٔ AMD Athlon با پشتیبانی از مجموعهدستورالعملهای MMX، 3DNow!، 3DNow! ارتقایافته و مجموعهدستورالعمل کامل SSE.
- k8
- opteron
- athlon64
- athlon-fx
- پردازندههای مبتنی بر هستهٔ AMD K8 با پشتیبانی از مجموعهدستورالعمل x86-64، شامل پردازندههای AMD Opteron، Athlon 64 و Athlon 64 FX. (این دربرگیرندهٔ مجموعهدستورالعملهای MMX، SSE، SSE2، 3DNow!، 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!، 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 تنظیم (tune)
میکند. در
حالی که
انتخاب یک
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 مجموعه دستورالعملهایی را مشخص میکند که کامپایلر میتواند استفاده کند، و هیچ مجموعه دستورالعمل عمومیای وجود ندارد که برای همهٔ پردازندهها قابل اعمال باشد. در مقابل، -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
- استفاده از
دستورالعملهای
ممیز شناور
اسکالر
موجود در
مجموعه
دستورالعمل
SSE. این
مجموعه
دستورالعمل
توسط Pentium III و
تراشههای
جدیدتر، و
در خط تولید
AMD توسط
تراشههای
Athlon-4، Athlon XP و Athlon MP
پشتیبانی
میشود.
نسخهٔ
پیشین
مجموعه
دستورالعمل
SSE تنها از
محاسبات با
دقت یگانه
پشتیبانی
میکند؛
بنابراین،
محاسبات با
دقت مضاعف و
دقت
گسترشیافته
همچنان با
استفاده از
387 انجام
میشوند.
نسخهٔ
بعدی، که
فقط در Pentium 4 و
تراشههای
x86-64 شرکت AMD
وجود دارد،
از محاسبات
با دقت
مضاعف نیز
پشتیبانی
میکند.
برای کامپایلر x86-32، برای فعالسازی افزونههای SSE و اثربخش کردن این گزینه باید از سوئیچهای -march=cpu-type، -msse یا -msse2 استفاده کنید. برای کامپایلر 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 نشان دهد پردازندهٔ مقصد همیشه 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" مشخص کنید که یک تابع بهصورت مجزا با این توالی فراخوانی صدا زده شود. همچنین میتوانید با بهکارگیری مشخصه تابع "cdecl"، گزینه -mrtd را لغو کنید.
هشدار: این قرارداد فراخوانی با قراردادی که معمولاً در Unix استفاده میشود ناسازگار است؛ بنابراین اگر نیاز به فراخوانی کتابخانههای کامپایلشده با کامپایلر Unix دارید، نمیتوانید از آن استفاده کنید.
همچنین، باید الگوی اولیه (prototype) تمام توابعی را که تعداد متغیری از آرگومانها را دریافت میکنند (از جمله "printf") فراهم کنید؛ در غیر این صورت کدهای نادرستی برای فراخوانی این توابع تولید میشود.
علاوه بر این، اگر تابعی را با آرگومانهای بیش از حد فراخوانی کنید، کد به شدت نادرستی تولید خواهد شد. (در حالت عادی، آرگومانهای اضافه بدون مشکل نادیده گرفته میشوند.)
- -mregparm=num
- تعداد
ثباتهای
مورد
استفاده
برای ارسال
آرگومانهای
عدد صحیح را
کنترل
میکند.
بهطور
پیشفرض،
هیچ ثباتی
برای ارسال
آرگومانها
استفاده
نمیشود و
حداکثر
میتوان از
۳ ثبات
استفاده
کرد.
میتوانید
این رفتار
را برای یک
تابع خاص با
استفاده از
مشخصه تابع
"regparm"
کنترل کنید.
هشدار: اگر از این سوییچ استفاده کنید و مقدار num غیرصفر باشد، باید تمام ماژولها و کتابخانهها را با همین مقدار بسازید. این امر شامل کتابخانههای سیستم و ماژولهای راهاندازی (startup) نیز میشود.
- -msseregparm
- از
قراردادهای
ارسال ثبات
SSE برای
آرگومانها
و مقادیر
بازگشتی از
نوع float و double
استفاده
میکند.
میتوانید
این رفتار
را برای یک
تابع خاص با
استفاده از
مشخصه تابع
"sseregparm"
کنترل کنید.
هشدار: اگر از این سوییچ استفاده کنید، باید تمامی ماژولها و کتابخانهها را با همان مقدار بسازید. این مورد شامل کتابخانههای سیستم و ماژولهای راهاندازی نیز میشود.
- -mvect8-ret-in-mem
- بردارهای ۸ بایتی را به جای ثباتهای MMX، در حافظه بازمیگرداند. این گزینه در VxWorks پیشفرض است تا با ABI کامپایلرهای Sun Studio تا نسخه ۱۲ مطابقت داشته باشد. تنها زمانی از این گزینه استفاده کنید که نیاز به حفظ سازگاری با کدهای موجودِ تولیدشده توسط آن نسخههای قبلی کامپایلر یا نسخههای قدیمیتر GCC داشته باشید.
- -mpc32
- -mpc64
- -mpc80
- دقت ممیز
شناور 80387 را
روی ۳۲، ۶۴
یا ۸۰ بیت
تنظیم
میکند.
هنگامی که
-mpc32 مشخص
شود، بخش
مانتیس (significand)
نتایج
محاسبات
ممیز شناور
به ۲۴ بیت
گرد میشود
(دقت
یگانه)؛
گزینه -mpc64
بخش مانتیس
نتایج ممیز
شناور را به
۵۳ بیت گرد
میکند (دقت
مضاعف) و
گزینه -mpc80
مانتیس
نتایج را به
۶۴ بیت گرد
میکند (دقت
مضاعف
گسترشیافته)
که مقدار
پیشفرض
است. هنگام
استفاده از
این گزینه،
محاسبات
ممیز شناور
در دقتهای
بالاتر
بدون تنظیم
صریح کلمه
کنترل FPU در
دسترس
برنامهنویس
نخواهد بود.
تنظیم گرد کردن محاسبات ممیز شناور به مقداری کمتر از ۸۰ بیتِ پیشفرض میتواند سرعت برخی برنامهها را ۲٪ یا بیشتر افزایش دهد. توجه داشته باشید که برخی از کتابخانههای ریاضی فرض میکنند محاسبات ممیز شناور با دقت گسترشیافته (۸۰ بیتی) بهطور پیشفرض فعال است؛ بنابراین اگر با استفاده از این گزینه دقت را به مقداری کمتر از دقت گسترشیافته کاهش دهید، توابع موجود در این کتابخانهها ممکن است دچار افت شدید دقت شوند که معمولاً به دلیل پدیده «حذف فاجعهبار» (catastrophic cancellation) رخ میدهد.
- -mdaz-ftz
- پرچمهای flush-to-zero (FTZ) و denormals-are-zero (DAZ) در ثبات MXCSR برای کنترل محاسبات ممیز شناور به کار میروند. دستورات SSE و AVX، شامل دستورات اسکالر و برداری، با فعال شدن پرچمهای FTZ و DAZ هنگام مشخص شدن -mdaz-ftz میتوانند کارایی بهتری داشته باشند. هنگامی که -mno-daz-ftz یا -shared مشخص شده باشد، پرچمهای FTZ/DAZ را تنظیم نکنید؛ با این حال -mdaz-ftz حتی همراه با -shared نیز این پرچمها را تنظیم خواهد کرد.
- -mstackrealign
- تراز کردن مجدد پشته در نقطه ورود. در معماری x86، گزینه -mstackrealign پیشدرآمد (prologue) و پسدرآمد (epilogue) متفاوتی تولید میکند که در صورت لزوم، پشته زمان اجرا را مجدداً تراز میسازد. این امر از ادغام کدهای قدیمی که تراز پشته ۴ بایتی دارند با کدهای امروزی که تراز پشته ۱۶ بایتی را برای سازگاری با 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 ممکن است خطای وقفه دسترسی نامتراز به حافظه (misaligned memory access traps) ایجاد کنند. علاوه بر این، آرگومانهای متغیر برای اشیاء تراز ۱۶ بایتی (شامل 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" ممکن است در صورت عدم تراز ۱۶ بایتی به درستی عمل نکند.
برای اطمینان از تراز مناسب این مقادیر روی پشته، مرز پشته باید به اندازهای که هر مقدار ذخیرهشده روی پشته نیاز دارد تراز باشد. علاوه بر این، هر تابع باید طوری تولید شود که تراز پشته را حفظ کند. بدین ترتیب، فراخوانی تابعی که با مرز پشته ترجیحی بالاتر کامپایل شده از درون تابعی که با مرز پشته ترجیحی پایینتر کامپایل شده است، به احتمال زیاد پشته را از تراز خارج میکند. توصیه میشود کتابخانههایی که از توابع بازفراخوانی (callback) استفاده میکنند، همواره از تنظیم پیشفرض بهره ببرند.
این تراز اضافی فضای پشته بیشتری مصرف میکند و عموماً حجم کد را افزایش میدهد. کدهایی که به مصرف فضای پشته حساس هستند، مانند سیستمهای تعبیهشده (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 را ببینید.
کامپایلر GCC هنگام استفاده از -mavx دستورالعملهای SSEx را سرکوب میکند. در عوض، در صورت نیاز دستورالعملهای جدید AVX یا معادل AVX را برای همه دستورالعملهای SSEx تولید مینماید.
این گزینهها به GCC امکان میدهند تا از این دستورالعملهای گسترشیافته در کد تولیدشده، حتی بدون -mfpmath=sse استفاده کند. برنامههایی که شناسایی زمان اجرای 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" درج کند. دستورالعملهای رشتهای برای انتخاب بین حالت افزایش خودکار یا کاهش خودکار به پرچم DF وابستهاند. در حالی که ABI تصریح میکند پرچم DF در بدو ورود به تابع پاک شود، برخی سیستمهای عامل با پاک نکردن پرچم DF در توزیعکنندههای استثنای خود، این مشخصه را نقض میکنند. گرداننده استثنا میتواند با پرچم DF تنظیمشده فراخوانی شود که هنگام استفاده از دستورالعملهای رشتهای منجر به حالت جهتگیری نادرست میگردد. این گزینه میتواند بهطور پیشفرض بر روی اهداف ۳۲ بیتی x86 با پیکربندی GCC از طریق گزینه پیکربندی --enable-cld فعال شود. در این صورت، تولید دستورالعملهای "cld" را میتوان با گزینه کامپایلر -mno-cld متوقف کرد.
- -mvzeroupper
- این گزینه به GCC دستور میدهد تا پیش از انتقال جریان کنترل به خارج از تابع، یک دستورالعمل "vzeroupper" صادر کند تا جریمه گذار از AVX به SSE به حداقل برسد و همچنین موارد توکار غیرضروری "zeroupper" حذف شوند.
- -mprefer-avx128
- این گزینه به GCC دستور میدهد تا در بردارساز خودکار، بهجای دستورالعملهای ۲۵۶ بیتی AVX، از دستورالعملهای ۱۲۸ بیتی AVX استفاده کند.
- -mprefer-vector-width=opt
- این گزینه به GCC دستور میدهد تا بهجای پیشفرض روی بستر انتخابشده، از پهنای بردار opt بیتی در دستورالعملها استفاده کند.
- -mpartial-vector-fp-math
- این گزینه GCC
را قادر
میسازد تا
عملیاتهای
ممیز شناور
را که ممکن
است بر
مجموعه
پرچمهای
وضعیت ممیز
شناور در
بردارهای
جزئی تأثیر
بگذارند،
تولید کند؛
در جایی که
عناصر
بردار در
بخش پایینی
ثبات ۱۲۸
بیتی SSE قرار
دارند. مگر
اینکه -fno-trapping-math
مشخص شده
باشد،
کامپایلر
با پاکسازی
همه
عملوندهای
ورودی به
گونهای که
در بخش
بالایی
استفادهنشده
ثبات بردار
صفر قرار
گیرد،
رفتار صحیح
را تضمین
میکند.
توجه داشته
باشید که با
استفاده از
توابع
توکار یا
اسمبلی
درونخطی
با
آرگومانهای
بردار
جزئی،
مقادیر NaN،
غیرعادی (denormal)
یا نامعتبر
میتوانند
به بخش
بالایی
بردار نشت
کنند و در
صورت
برقراری
-fno-trapping-math،
احتمالاً
باعث
مشکلات
کارایی
شوند. این
مسائل را
میتوان با
پاکسازی
دستی بخش
بالایی
ثبات
آرگومان
بردار جزئی
یا با
استفاده از
-mdaz-ftz برای
تنظیم پرچم
denormals-are-zero (DAZ) در ثبات
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" را برای بهینهسازی جابهجایی بایتهای موجودیتهای چهار و هشت بایتی فعال میکند.
- -mshstk
- گزینهٔ -mshstk توابع توکار پشتهٔ سایه (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" (و
نسخههای
برداریشدهٔ
آنها) را
برای
آرگومانهای
ممیز شناور
با دقت
یگانه فعال
میکند. این
دستورالعملها
تنها زمانی
تولید
میشوند که
-funsafe-math-optimizations
همراه با
-ffinite-math-only و -fno-trapping-math
فعال باشد.
توجه داشته
باشید که
هرچند توان
عملیاتی
این توالی
بالاتر از
توان
عملیاتی
دستورالعملهای
غیرمعکوس
است، اما
ممکن است
دقت این
توالی تا ۲ 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
- فعالسازی تقریب برای تقسیم اسکالر.
- vec-div
- فعالسازی تقریب برای تقسیم برداریشده.
- sqrt
- فعالسازی تقریب برای ریشهٔ دوم اسکالر.
- vec-sqrt
- فعالسازی تقریب برای ریشهٔ دوم برداریشده.
بنابراین، بهعنوان مثال، -mrecip=all,!sqrt تمام تقریبهای معکوس را به جز ریشهٔ دوم فعال میکند.
- -mveclibabi=type
- نوع ABI مورد
استفاده
برای
برداریسازی
توابع
درونی (intrinsics) با
استفاده از
یک
کتابخانهٔ
خارجی را
تعیین
میکند.
مقادیر
پشتیبانیشده
برای type
عبارتاند
از svml برای
کتابخانهٔ
ریاضی
بردار
کوتاه Intel،
گزینهٔ aocl
برای
کتابخانهٔ
ریاضی (LibM) از AMD
Optimizing CPU Libraries (AOCL) و acml
برای
کتابخانهٔ
ریاضی
هستهٔ AMD که
پشتیبانی
از آن به
پایان
رسیده است
(و AOCL-LibM جانشین
آن است).
برای
استفاده از
این گزینه،
باید هم -ftree-vectorize
و هم -funsafe-math-optimizations
فعال
باشند، و یک
کتابخانهٔ
سازگار با ABI
مربوط به SVML
یا ACML در زمان
پیوند مشخص
شود.
در حال حاضر 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 برای ABI مایکروسافت. حالت پیشفرض، استفاده از ABI مایکروسافت هنگام هدفگیری Microsoft Windows، و SysV ABI در سایر سیستمها است. میتوان این رفتار را برای توابع خاص با استفاده از ویژگیهای تابع "ms_abi" و "sysv_abi" کنترل کرد.
- -mforce-indirect-call
- اجبار کردن تمام فراخوانیهای تابع به صورت غیرمستقیم. این گزینه هنگام استفاده از Intel Processor Trace که در آن اطلاعات زمانبندی دقیقتری برای فراخوانیهای تابع تولید میشود، مفید است.
- -mmanual-endbr
- درج دستورالعمل ENDBR در ورودی تابع تنها از طریق ویژگی تابع "cf_check". این گزینه در صورت استفاده همراه با گزینهٔ -fcf-protection=branch جهت کنترل درج ENDBR در ورودی تابع سودمند است.
- -mcet-switch
- بهطور پیشفرض، سنجشگری CET در دستورهای switch که از جدول پرش (jump table) استفاده میکنند خاموش است و ردیابی شاخهٔ غیرمستقیم غیرفعال است. از آنجا که جدولهای پرش در حافظهٔ فقطخواندنی ذخیره میشوند، این امر منجر به از بین رفتن مستقیم مقاومسازی امنیتی نمیشود. اما اگر اندیس جدول پرش توسط مهاجم کنترل شود، پرش غیرمستقیم ممکن است توسط CET محدود نشود. این گزینه سنجشگری CET را روشن میکند تا ردیابی شاخهٔ غیرمستقیم را برای دستورهای switch با جدول پرش فعال سازد، که منجر به دسترسیپذیر شدن اهداف پرش از طریق هر پرش غیرمستقیمی میشود.
- -mcall-ms2sysv-xlogues
- به دلیل تفاوتها در ABIهای ۶۴ بیتی، هر تابع مایکروسافت ABI که تابعی با System V ABI را فراخوانی میکند باید ثباتهای RSI، RDI و XMM6-15 را به عنوان تخریبشده (clobbered) در نظر بگیرد. بهطور پیشفرض، کد لازم برای ذخیره و بازیابی این ثباتها به صورت درونخطی (inline) صادر میشود که منجر به پیشدرآمدها (prologues) و پسدرآمدهای (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. برنامههایی که به مدیریت استثنای thread-safe وابستهاند باید تمام کد را با گزینهٔ -mthreads کامپایل و پیوند (link) کنند. در زمان کامپایل، -mthreads ماکروی -D_MT را تعریف میکند؛ هنگام پیوند نیز کتابخانهٔ کمکی نخ ویژهٔ -lmingwthrd را پیوند میدهد که دادههای مدیریت استثنای اختصاصی هر نخ را پاکسازی میکند.
- -mms-bitfields
- -mno-ms-bitfields
- فعال/غیرفعال
کردن
چیدمان
میدانبیتی
(bit-field) سازگار
با
کامپایلر
بومی Microsoft Windows.
اگر "packed" روی یک ساختار به کار رود یا از میدانهای بیتی استفاده شود، ممکن است ABI مایکروسافت ساختار را متفاوت از حالت معمول GCC چیدمان کند. بهویژه هنگام انتقال دادههای فشرده (packed) بین توابعی که با GCC کامپایل شدهاند و کامپایلر بومی مایکروسافت (خواه از طریق فراخوانی تابع یا دادههای درون یک فایل)، ممکن است دسترسی به هر دو قالب ضروری باشد.
این گزینه به صورت پیشفرض برای مقصدهای Microsoft Windows فعال است. این رفتار را میتوان به صورت محلی با استفاده از صفتهای متغیر یا نوع نیز کنترل کرد. برای اطلاعات بیشتر، x86 Variable Attributes و x86 Type Attributes را ببینید.
الگوریتم چیدمان ساختار مایکروسافت، به استثنای بستهبندی میدانهای بیتی، نسبتاً ساده است. فاصلهگذاری (padding) و ترازسازی (alignment) اعضای ساختارها و اینکه آیا یک میدانبیتی میتواند از مرز یک واحد ذخیرهسازی عبور کند یا خیر، با این قوانین تعیین میشود:
- ۱. اعضای ساختار به همان ترتیبی که اعلان شدهاند، به طور متوالی ذخیره میشوند:
- اولین عضو کمترین آدرس حافظه و آخرین عضو بیشترین آدرس را خواهد داشت.
- ۲. هر شیء داده نیاز به یک الزام تراز دارد. الزام تراز برای همهٔ دادهها
- به جز
ساختارها،
unionها و
آرایهها،
برابر با
اندازهٔ
شیء یا
اندازهٔ
بستهبندی
فعلی است
(که با صفت
"aligned" یا
دستور
کاربردی
"pack" مشخص
میشود)، هر
کدام که
کمتر باشد.
برای
ساختارها،
unionها و
آرایهها،
الزام تراز
برابر با
بزرگترین
الزام تراز
میان اعضای
آن است. به
هر شیء یک
آفست تخصیص
مییابد به
طوری که:
offset % alignment_requirement == 0
- ۳. میدانهای بیتی مجاور در یک واحد تخصیص ۱، ۲، یا ۴ بایتی بستهبندی میشوند
- اگر نوعهای صحیح دارای اندازهٔ یکسان باشند و میدانبیتی بعدی بدون عبور از مرز تعیینشده توسط الزامات تراز مشترک میدانهای بیتی، در واحد تخصیص فعلی جا بگیرد.
کامپایلر MSVC میدانهای بیتی با طول صفر را به روشهای زیر تفسیر میکند:
- ۱. اگر یک میدانبیتی با طول صفر بین دو میدانبیتی درج شود که به طور معمول
- ادغام
میشوند،
آن
میدانهای
بیتی ادغام
نخواهند شد.
برای مثال:
struct { unsigned long bf_1 : 12; unsigned long : 0; unsigned long bf_2 : 12; } t1;اندازهٔ "t1" با وجود میدانبیتی با طول صفر برابر با ۸ بایت است. اگر این میدانبیتی با طول صفر حذف میشد، اندازهٔ "t1" برابر با ۴ بایت بود.
- ۲. اگر یک میدانبیتی با طول صفر پس از یک میدانبیتی مانند "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" یا در نتیجه اندازهٔ ساختار تأثیری نمیگذارد.
با در نظر گرفتن این موضوع، توجه به نکات زیر حائز اهمیت است:
- ۱. اگر یک میدانبیتی با طول صفر پس از یک میدانبیتی معمولی بیاید، نوع
- میدانبیتی با طول صفر ممکن است بر تراز کل ساختار تأثیر بگذارد. برای مثال، "t2" اندازهای برابر با ۴ بایت دارد، زیرا میدانبیتی با طول صفر پس از یک میدانبیتی معمولی آمده و از نوع short است.
- ۲. حتی اگر پس از یک میدانبیتی با طول صفر، میدانبیتی معمولی نیامده باشد، باز هم
- ممکن است بر
تراز
ساختار
تأثیر
بگذارد:
struct { char foo : 6; long : 0; } t4;در اینجا، "t4" مقدار ۴ بایت فضا اشغال میکند.
- ۳. میدانهای بیتی با طول صفر که پس از اعضای غیر میدانبیتی میآیند نادیده گرفته میشوند:
-
struct { char foo; long : 0; char bar; } t5;در اینجا، "t5" مقدار ۲ بایت فضا اشغال میکند.
- -mno-align-stringops
- مقصد عملیات رشتهای درونخطیشده (inlined) را تراز نمیکند. این سوئیچ اندازهٔ کد را کاهش میدهد و در مواردی که مقصد از قبل تراز شده باشد اما GCC از آن مطلع نباشد، کارایی را بهبود میبخشد.
- -minline-all-stringops
- بهطور پیشفرض، GCC عملیات رشتهای را فقط زمانی درونخطی میکند که مشخص باشد مقصد حداقل روی یک مرز ۴ بایتی تراز است. این گزینه درونخطیسازی بیشتری را ممکن میسازد و اندازهٔ کد را افزایش میدهد، اما ممکن است کارایی کدهایی را که به "memcpy" و "memset" سریع برای طولهای کوتاه وابستهاند بهبود بخشد. این گزینه همچنین بسط درونخطی "strlen" را برای تمامی ترازهای اشارهگر فعال میکند.
- -minline-stringops-dynamically
- برای عملیات رشتهای با اندازهٔ نامشخص، از بررسیهای زمان اجرا به همراه کد درونخطی برای بلوکهای کوچک و فراخوانی کتابخانهای برای بلوکهای بزرگ استفاده میکند.
- -mstringop-strategy=alg
- اکتشاف (heuristic) تصمیمگیری داخلی را برای انتخاب الگوریتم خاص مورد استفاده جهت درونخطیسازی عملیات رشتهای لغو میکند. مقادیر مجاز برای alg عبارتند از:
- -mmemcpy-strategy=strategy
- اکتشاف (heuristic) تصمیمگیری داخلی را برای تعیین اینکه آیا "__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
برای ۶۴
بیتی) مورد
دسترسی
قرار
گیرند، یا
اینکه
باید
اشارهگر
پایهٔ رشته
افزوده شود.
معتبر بودن
یا نبودن
این مورد
بستگی به
سیستمعامل
دارد و
اینکه آیا
سگمنت را
برای پوشش
دادن کل
ناحیهٔ TLS
نگاشت
میکند یا
خیر.
برای سیستمهایی که از کتابخانهٔ GNU C استفاده میکنند، مقدار پیشفرض روشن است.
- -msse2avx
- -mno-sse2avx
- مشخص میکند که اسمبلر باید دستورالعملهای SSE را با پیشوند VEX کدگذاری کند. گزینهٔ -mavx این مورد را بهطور پیشفرض روشن میکند.
- -mfentry
- -mno-fentry
- اگر پروفایلسازی فعال باشد (-pg)، فراخوانی شمارندهٔ پروفایلسازی را پیش از پیشدرآمد (prologue) قرار میدهد. نکته: در معماریهای x86، مشخصهٔ "ms_hook_prologue" در حال حاضر برای -mfentry و -pg امکانپذیر نیست.
- -mrecord-mcount
- -mno-record-mcount
- اگر پروفایلسازی فعال باشد (-pg)، یک بخش __mcount_loc تولید میکند که شامل اشارهگرهایی به هر فراخوانی پروفایلسازی است. این گزینه برای وصله کردن (patching) خودکار فراخوانیها به داخل و خارج سودمند است.
- -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 برای جلوگیری از ذخیرهٔ غیرضروری ثباتهای برداری در پشته هنگام ارسال آرگومانهای متغیر استفاده میشود، پیامدهای این گزینه آن است که توابع فراخوانیشده ممکن است مقداری از فضای پشته را هدر دهند، رفتار نادرست داشته باشند یا به مکانی تصادفی بپرند. نسخههای 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
- کد محافظت
از پشته را
با استفاده
از قناری در
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 بازنویسی (override) میکند.
- -mgeneral-regs-only
- کدی تولید میکند که تنها از ثباتهای همهمنظوره استفاده میکند. این کار مانع از آن میشود که کامپایلر از ثباتهای ممیز شناور، برداری، ماسک و کران (bound) استفاده کند.
- -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 ممکن است در مدل کد بزرگ (large code model) در دسترس نباشد.
توجه داشته باشید که -mindirect-branch=thunk-extern با -fcf-protection=branch سازگار است زیرا thunk خارجی را میتوان طوری ساخت که بررسی جریان کنترل (control-flow check) را فعال کند..IP -mfunction-return=choice 4 بازگشت تابع را با choice تبدیل میکند. مقدار پیشفرض keep است که بازگشت تابع را بدون تغییر نگه میدارد. thunk بازگشت تابع را به فراخوانی و بازگشت thunk تبدیل میکند. thunk-inline بازگشت تابع را به فراخوانی و بازگشت thunk درونخطی تبدیل میکند. thunk-extern بازگشت تابع را به فراخوانی و بازگشت thunk خارجی ارائهشده در یک فایل شیء جداگانه تبدیل میکند. میتوانید این رفتار را برای یک تابع خاص با استفاده از ویژگی تابع "function_return" کنترل کنید.
توجه داشته باشید که -mindirect-return=thunk-extern با -fcf-protection=branch سازگار است زیرا thunk خارجی را میتوان طوری ساخت که بررسی جریان کنترل را فعال کند.
توجه داشته باشید که -mcmodel=large با -mfunction-return=thunk و -mfunction-return=thunk-extern ناسازگار است، چرا که تابع thunk ممکن است در مدل کد بزرگ قابل دسترسی نباشد.
- -mindirect-branch-register
- فراخوانی و پرش غیرمستقیم را اجباراً از طریق ثبات انجام میدهد.
- -mharden-sls=choice
- برای کاهش اثرات اجرای حدسی خط مستقیم (SLS) با استفاده از 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 در inline asm، از گزینه جدید کامپایلر -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 کدی تولید میکند که با psABI مربوط به Intel MCU مطابقت دارد. این گزینه نیازمند فعال بودن گزینه -m32 است.
- -mno-red-zone
- از اصطلاحاً «red zone» برای کد x86-64 استفاده نمیکند. ناحیه red zone توسط ABI مربوط به x86-64 الزامی شده است؛ این ناحیه، منطقهای ۱۲۸ بایتی فراتر از مکان اشارهگر پشته است که توسط گردانندههای سیگنال یا وقفه تغییر داده نمیشود و بنابراین میتواند برای دادههای موقت بدون تنظیم اشارهگر پشته استفاده شود. پرچم -mno-red-zone این ناحیه red zone را غیرفعال میکند.
- -mcmodel=small
- برای مدل کد کوچک کد تولید میکند: برنامه و نمادهای آن باید در ۲ گیگابایت پایینی فضای آدرس پیوند داده شوند. اشارهگرها ۶۴ بیتی هستند. برنامهها میتوانند بهصورت ایستا یا پویا پیوند داده شوند. این مدل کد پیشفرض است.
- -mcmodel=kernel
- برای مدل کد هسته کد تولید میکند. هسته در ۲ گیگابایت منفی فضای آدرس اجرا میشود. این مدل باید برای کد کرنل لینوکس استفاده شود.
- -mcmodel=medium
- برای مدل متوسط کد تولید میکند: برنامه در ۲ گیگابایت پایینی فضای آدرس پیوند داده میشود. نمادهای کوچک نیز در آنجا قرار میگیرند. نمادهایی با اندازههای بزرگتر از -mlarge-data-threshold در بخشهای داده بزرگ یا BSS قرار داده میشوند و میتوانند بالاتر از ۲ گیگابایت واقع شوند. برنامهها میتوانند بهصورت ایستا یا پویا پیوند داده شوند.
- -mcmodel=large
- برای مدل بزرگ کد تولید میکند. این مدل هیچ فرضی درباره آدرسها و اندازههای بخشها در نظر نمیگیرد.
- -maddress-mode=long
- برای حالت آدرسدهی بلند کد تولید میکند. این گزینه فقط برای محیطهای ۶۴ بیتی و x32 پشتیبانی میشود. این حالت آدرسدهی پیشفرض برای محیطهای ۶۴ بیتی است.
- -maddress-mode=short
- برای حالت آدرسدهی کوتاه کد تولید میکند. این گزینه فقط برای محیطهای ۳۲ بیتی و x32 پشتیبانی میشود. این حالت آدرسدهی پیشفرض برای محیطهای ۳۲ بیتی و x32 است.
- -mneeded
- -mno-needed
- ویژگی GNU_PROPERTY_X86_ISA_1_NEEDED گنو را برای مقصد لینوکس صادر میکند تا سطح ISA معماری خرد مورد نیاز برای اجرای باینری را مشخص کند.
- -mno-direct-extern-access
- بدون -fpic یا
-fPIC، همواره
از
اشارهگر GOT
برای
دسترسی به
نمادهای
خارجی
استفاده
میکند. با
-fpic یا -fPIC،
دسترسی به
نمادهای
محافظتشده
را مانند
نمادهای
محلی تلقی
میکند.
مقدار
پیشفرض
-mdirect-extern-access است.
هشدار: کتابخانههای مشترک کامپایلشده با -mno-direct-extern-access و فایلهای اجرایی کامپایلشده با -mdirect-extern-access ممکن است در صورت استفاده از نمادهای محافظتشده در کتابخانههای مشترک و فایل اجرایی، دارای سازگاری باینری نباشند.
- -munroll-only-small-loops
- باز کردن محافظهکارانه حلقههای کوچک را کنترل میکند. این گزینه بهطور پیشفرض توسط O2 فعال میشود و حلقههای با کمتر از ۴ دستورالعمل را ۱ بار باز میکند. گزینههای صریح -f[no-]unroll-[all-]loops این پرچم را غیرفعال میکنند تا از هرگونه رفتار باز کردن حلقهای که کاربر تمایلی به آن ندارد جلوگیری شود.
- -mlam=choice
- قابلیت LAM (ماسکگذاری آدرس خطی) امکان استفاده از بیتهای خاصی در اشارهگر را برای فراداده فراهم میکند. مقدار پیشفرض none است. با u48، بیتهای اشارهگر در موقعیتهای 62:48 میتوانند برای فراداده استفاده شوند؛ با u57، بیتهای اشارهگر در موقعیتهای 62:57 میتوانند برای فراداده استفاده شوند.
گزینههای x86 Windows
گزینههای Xstormy16
این گزینهها برای Xstormy16 تعریف شدهاند:
- -msim
- فایلهای راهاندازی و اسکریپت پیونددهنده مناسب برای شبیهساز را انتخاب میکند.
گزینههای Xtensa
این گزینهها برای مقصدهای Xtensa پشتیبانی میشوند:
- -mconst16
- -mno-const16
- استفاده از دستورالعملهای "CONST16" را برای بارگذاری مقادیر ثابت فعال یا غیرفعال میکند. دستورالعمل "CONST16" در حال حاضر یک گزینه استاندارد از سوی Tensilica نیست. در صورت فعال بودن، دستورالعملهای "CONST16" همواره بهجای دستورالعملهای استاندارد "L32R" استفاده میشوند. استفاده از "CONST16" بهطور پیشفرض تنها در صورتی فعال است که دستورالعمل "L32R" در دسترس نباشد..IP -mfused-madd 4
- -mno-fused-madd
- فعال یا غیرفعال کردن استفاده از دستورالعملهای ادغامشدهٔ ضرب/جمع و ضرب/تفریق در گزینهٔ ممیز شناور (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 است که مقادیر صریح را در یک بخش مجزا در فایل خروجی قرار میدهد. این کار اجازه میدهد مخزن مقادیر صریح در RAM/ROM داده قرار گیرد، و همچنین به پیونددهنده امکان میدهد مخازن مقادیر صریحِ فایلهای شیء مجزا را با یکدیگر ترکیب کرده تا مقادیر تکراری حذف شده و حجم کد کاهش یابد. با -mtext-section-literals، مقادیر صریح در بخش متن (text section) پراکنده میشوند تا حتیالامکان نزدیک به مراجع خود بمانند. این امر ممکن است برای فایلهای اسمبلی بزرگ ضروری باشد. مقادیر صریح هر تابع دقیقاً پیش از همان تابع قرار میگیرند.
- -mauto-litpools
- -mno-auto-litpools
- این گزینهها نحوهٔ مدیریت مخازن مقادیر صریح را کنترل میکنند. پیشفرض -mno-auto-litpools است که مقادیر صریح را در یک بخش مجزا در فایل خروجی قرار میدهد، مگر اینکه از -mtext-section-literals استفاده شده باشد. با -mauto-litpools، مقادیر صریح توسط اسمبلر در بخش متن پراکنده میشوند. کامپایلر دستورالعملهای صریح ".literal" را تولید نمیکند و مقادیر صریح را به جای "L32R" با دستورالعملهای "MOVI" درون ثباتها بارگذاری میکند تا به اسمبلر اجازه دهد بازآرایی (relaxation) را انجام داده و مقادیر صریح را بر حسب نیاز جایگذاری کند. این گزینه به اسمبلر اجازه میدهد چندین مخزن مقادیر صریح برای هر تابع ایجاد کرده و توابع بسیار بزرگ را اسمبل کند، کاری که ممکن است با -mtext-section-literals امکانپذیر نباشد.
- -mtarget-align
- -mno-target-align
- هنگامی که این گزینه فعال باشد، GCC به اسمبلر دستور میدهد که دستورالعملها را به طور خودکار همتراز کند تا جریمههای انشعاب (branch penalties) به بهای کاهش اندک فشردگی کد کاسته شود. اسمبلر تلاش میکند دستورالعملهای متراکم (density instructions) را گسترش دهد تا مقصدهای انشعاب و دستورالعملهای پس از دستورالعملهای فراخوانی همتراز شوند. اگر دستورالعملهای متراکم امنِ قبلی برای همتراز کردن یک مقصد کافی نباشند، هیچ گسترشی انجام نمیشود. پیشفرض -mtarget-align است. این گزینهها بر رفتار با دستورالعملهای خودهمتراز شونده مانند "LOOP" تأثیری ندارند، چرا که اسمبلر آنها را همیشه، چه با گسترش دستورالعملهای متراکم و چه با درج دستورالعملهای NOP، همتراز میکند.
- -mlongcalls
- -mno-longcalls
- هنگامی که این گزینه فعال باشد، GCC به اسمبلر دستور میدهد تا فراخوانیهای مستقیم (direct calls) را به فراخوانیهای غیرمستقیم (indirect calls) ترجمه کند، مگر اینکه بتواند تعیین کند که مقصد یک فراخوانی مستقیم در محدودهٔ مجازِ دستورالعمل فراخوانی قرار دارد. این ترجمه معمولاً برای فراخوانی توابع در سایر فایلهای منبع رخ میدهد. بهطور مشخص، اسمبلر یک دستورالعمل مستقیم "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 فعال باشد، نماد پیشپردازندهٔ C با نام "__XTENSA_CALL0_ABI__" تعریف میشود.
- -mabi=windowed
- هنگامی که این گزینه فعال باشد، پارامترهای تابع در ثباتهای "a10" تا "a15" ارسال میشوند، و تابع فراخوانیشده پنجرهٔ ثبات را در بدو ورود به اندازهٔ ۸ ثبات میچرخاند تا آرگومانهای آن در ثباتهای "a2" تا "a7" قرار گیرند. ثبات "a7" ممکن است به عنوان اشارهگر فریم استفاده شود. پنجرهٔ ثبات هنگام بازگشت از تابع، ۸ ثبات به عقب چرخانده میشود. هنگامی که این نسخه از ABI فعال باشد، نماد پیشپردازندهٔ C با نام "__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 را بازنویسی میکند؛ در غیر این صورت، LC_CTYPE و LC_MESSAGES به طور پیشفرض مقدار متغیر محیطی LANG را میگیرند. اگر هیچیک از این متغیرها تنظیم نشده باشند، رفتار GCC به طور پیشفرض منطبق بر رفتار سنتی انگلیسی C خواهد بود.
- TMPDIR
- اگر TMPDIR تنظیم شده باشد، دایرکتوری مورد استفاده برای فایلهای موقت را مشخص میکند. GCC از فایلهای موقت برای نگهداری خروجی یک مرحله از کامپایل که قرار است به عنوان ورودی مرحله بعد استفاده شود، بهره میبرد: برای مثال، خروجی پیشپردازنده که ورودی خود کامپایلر اصلی است.
- GCC_COMPARE_DEBUG
- تنظیم GCC_COMPARE_DEBUG تقریباً معادل با ارسال -fcompare-debug به راهانداز کامپایلر است. برای جزئیات بیشتر به مستندات این گزینه مراجعه کنید.
- 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) استفاده میشوند به کار میرود.
علاوه بر این، از این پیشوند به شیوهای غیرمعمول در یافتن دایرکتوریها برای جستجوی فایلهای سرآیند استفاده میشود. برای هر یک از دایرکتوریهای استانداردی که نام آنها به طور معمول با /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 فهرستی از دایرکتوریها است که با دونقطه از هم جدا شدهاند، بسیار شبیه به PATH. در صورتی که GCC نتواند زیربرنامهها را با استفاده از GCC_EXEC_PREFIX پیدا کند، دایرکتوریهای مشخصشده به این روش را هنگام جستجو برای زیربرنامهها امتحان میکند.
- LIBRARY_PATH
- مقدار LIBRARY_PATH فهرستی از دایرکتوریها است که با دونقطه از هم جدا شدهاند، بسیار شبیه به PATH. هنگامی که به عنوان یک کامپایلر بومی پیکربندی شده باشد، در صورتی که GCC نتواند فایلهای خاص پیونددهنده را با استفاده از GCC_EXEC_PREFIX پیدا کند، دایرکتوریهای مشخصشده را امتحان میکند. همچنین پیوند دادن با استفاده از GCC، هنگام جستجوی کتابخانههای معمولی برای گزینه -l از این دایرکتوریها استفاده میکند (اما دایرکتوریهای تعیینشده با -L در اولویت هستند).
- LANG
- این متغیر برای ارسال اطلاعات محلی به کامپایلر استفاده میشود. یک نمونه از کاربردهای این اطلاعات، تعیین مجموعهنویسه مورد استفاده در هنگام تجزیه نویسههای لفظی، رشتههای لفظی و کامنتها در C و C++ است. هنگامی که کامپایلر برای مجاز دانستن نویسههای چندبایتی پیکربندی شده باشد، مقادیر زیر برای LANG شناخته میشوند:
اگر LANG تعریف نشده باشد، یا مقدار دیگری داشته باشد، کامپایلر از "mblen" و "mbtowc" همانطور که توسط منطقه محلی پیشفرض تعریف شدهاند، برای شناسایی و ترجمه نویسههای چندبایتی استفاده میکند.
- GCC_EXTRA_DIAGNOSTIC_OUTPUT
- اگر GCC_EXTRA_DIAGNOSTIC_OUTPUT روی یکی از مقادیر زیر تنظیم شده باشد، هنگامی که راهنماییهای fix-it صادر میشوند، متن اضافی به stderr فرستاده خواهد شد. گزینههای -fdiagnostics-parseable-fixits و -fno-diagnostics-parseable-fixits بر این متغیر محیطی اولویت دارند.
- fixits-v1
- ارائه راهنماییهای قابل تجزیه fix-it، معادل با -fdiagnostics-parseable-fixits. بهویژه، ستونها به عنوان تعداد بایتها بیان میشوند که از بایت ۱ برای ستون اولیه شروع میشود.
- fixits-v2
- مانند "fixits-v1"، اما ستونها همانطور که در -fdiagnostics-column-unit=display آمده است، به عنوان ستونهای نمایشی بیان میشوند.
چند متغیر محیطی اضافی بر رفتار پیشپردازنده تأثیر میگذارند.
- CPATH
- C_INCLUDE_PATH
- CPLUS_INCLUDE_PATH
- OBJC_INCLUDE_PATH
- مقدار هر
متغیر
فهرستی از
دایرکتوریها
است که با
یک نویسه
ویژه جدا
شدهاند
(بسیار شبیه
به PATH) و باید
برای یافتن
فایلهای
سرآیند
جستجو شوند.
این نویسه
ویژه،
"PATH_SEPARATOR"،
به معماری
مقصد
وابسته است
و در زمان
ساخت GCC مشخص
میشود.
برای
مقصدهای
مبتنی بر Microsoft
Windows این نویسه
یک
نقطهویرگول
است، و برای
تقریباً
تمام
مقصدهای
دیگر
دونقطه است.
متغیر 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/or1k-elf-gcc/-/issues.
پاورقیها (FOOTNOTES)
- 1.
- در برخی سیستمها، gcc -shared برای کارکرد سازندهها نیازمند ساخت کد واسط تکمیلی است. در سیستمهای چندکتابخانهای (multi-libbed)، دستور gcc -shared باید کتابخانههای پشتیبان مناسب را برای پیوند انتخاب کند. عدم ارائهٔ پرچمهای صحیح ممکن است منجر به نقصهای نامحسوس شود. ارائهٔ آنها در مواردی که ضروری نیستند، بیضرر است. گزینهٔ -shared از افزودن کد راهاندازی برای تغییر محیط ممیز شناور، آنطور که با -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)
مدخل Info مربوط به gcc، یا https://gcc.gnu.org/onlinedocs/gcc/Contributors.html را برای مشارکتکنندگان در GCC ببینید.
کپیرایت و تکثیر (COPYRIGHT)
حق نشر (c) 1988-2025 Free Software Foundation, Inc.
اجازهٔ کپی، توزیع و/یا تغییر این سند تحت شرایط مجوز مستندات آزاد گنو (GNU Free Documentation License)، نسخهٔ 1.3 یا هر نسخهٔ بالاتر منتشر شده توسط بنیاد نرمافزار آزاد (Free Software Foundation) داده میشود؛ با بخشهای تغییرناپذیر «GNU General Public License» و «Funding Free Software»، متنهای روی جلد (a) (به زیر مراجعه کنید)، و با متنهای پشت جلد (b) (به زیر مراجعه کنید). یک نسخه از این مجوز در صفحهٔ راهنمای gfdl(7) گنجانده شده است.
(a) متن روی جلد FSF عبارت است از:
A GNU Manual
(b) متن پشت جلد 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 |