| GCC(1) | GNU | GCC(1) |
نام (NAME)
gcc - کامپایلر C و ++C پروژهٔ گنو
خلاصه دستور (SYNOPSIS)
gcc [-c|-S|-E] [-std=standard]
[-g] [-pg] [-Olevel]
[-Wwarn...] [-Wpedantic]
[-Idir...] [-Ldir...]
[-Dmacro[=defn]...] [-Umacro]
[-foption...] [-mmachine-option...]
[-o outfile] [@file] infile...
در اینجا تنها کاربردیترین گزینهها فهرست شدهاند؛ برای باقی موارد به ادامه مراجعه کنید. g++ عمدتاً همان گزینههای gcc را میپذیرد.
توضیحات (DESCRIPTION)
هنگامی که GCC را فراخوانی میکنید، معمولاً پیشپردازش، کامپایل، اسمبل و پیونددهی را انجام میدهد. «گزینههای کلی» به شما امکان میدهند این فرآیند را در یک مرحلهٔ میانی متوقف کنید. برای نمونه، گزینهٔ -c مشخص میکند که پیونددهنده اجرا نشود. در این صورت، خروجی شامل فایلهای شیء حاصل از اسمبلر خواهد بود.
گزینههای دیگر به یک یا چند مرحله از پردازش ارسال میشوند. برخی گزینهها پیشپردازنده و برخی دیگر خودِ کامپایلر را کنترل میکنند. گزینههای دیگری نیز اسمبلر و پیونددهنده را کنترل میکنند؛ بیشتر این گزینهها در اینجا مستند نشدهاند، چرا که به ندرت به استفاده از هریک از آنها نیاز پیدا میکنید.
بیشتر گزینههای خط فرمانی که میتوانید با GCC استفاده کنید برای برنامههای C کاربرد دارند؛ هنگامی که گزینهای تنها برای زبانی دیگر (معمولاً C++) کاربرد داشته باشد، در توضیحات صراحتاً بیان میشود. اگر در توضیحات یک گزینه به زبان مبدأ خاصی اشاره نشده باشد، میتوانید از آن گزینه برای تمامی زبانهای پشتیبانیشده استفاده کنید.
روش معمول برای اجرای GCC، اجرای فایل اجرایی موسوم به gcc است، یا machine-gcc هنگام کامپایل متقابل (cross-compiling)، یا 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 -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 --assemble --compile --dumpbase dumpbase --dumpbase-ext auxdropsuf --dumpdir dumppfx --language=language --output=file --pass-exit-codes --pipe --preprocess --verbose
- گزینههای زبان 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 --ansi
- گزینههای زبان C++ (C++ Language Options)
- --compile-std-module -fabi-compat-version=n -fabi-version=n -fno-access-control -faligned-new=[n] -fno-assume-sane-operators-new-delete -fchar8_t -fcheck-new -fconcepts -fconcepts-diagnostics-depth=n -fconstexpr-depth=n -fconstexpr-cache-depth=n -fconstexpr-loop-limit=n -fconstexpr-ops-limit=n -fcontracts -fcontract-evaluation-semantic=[ignore|observe|enforce|quick_enforce] -fcontracts-conservative-ipa -fcontract-checks-outlined -fcontract-disable-optimized-checks -fcontracts-client-check=[none|pre|all] -fcontracts-definition-check=[on|off] -fcoroutines -fdiagnostics-all-candidates -fno-elide-constructors -fno-enforce-eh-specs -fext-numeric-literals -fno-gnu-keywords -fno-immediate-escalation -fno-implement-inlines -fimplicit-constexpr -fno-implicit-inline-templates -fno-implicit-templates -fmodule-header[=kind] -fmodule-implicit-inline -fno-module-lazy -fmodule-mapper=specification -fmodule-only -fmodules -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 -freflection -fno-rtti -fsized-deallocation -fstrict-enums -fstrong-eval-order[=kind] -ftemplate-backtrace-limit=n -ftemplate-depth=n -fno-threadsafe-statics -fuse-cxa-atexit -fno-use-cxa-get-exception-ptr -fno-weak -nostdinc++ -fvisibility-inlines-hidden -fvisibility-ms-compat -flang-info-include-translate[=header] -flang-info-include-translate-not -flang-info-module-cmi[=module] -stdlib=libstdc++,libc++ -Wabbreviated-auto-in-template-arg -Wabi-tag -Waligned-new[=kind] -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 -Wno-deprecated-literal-operator -Wdeprecated-variadic-comma-omission -Weffc++ -Wno-elaborated-enum-base -Wno-exceptions -Wno-expose-global-module-tu-local -Wno-external-tu-local -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 -Wno-sfinae-incomplete -Wstrict-null-sentinel -Wno-subobject-linkage -Wtemplates -Wno-non-c-typedef-for-linkage -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] -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 -fno-diagnostics-show-nesting -fno-diagnostics-show-nesting-locations -fdiagnostics-show-nesting-levels -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] -fdiagnostics-show-context[=depth]
- گزینههای هشدار (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 -Wauto-profile -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 -Wc++26-compat -Wno-c++11-extensions -Wno-c++14-extensions -Wno-c++17-extensions -Wno-c++20-extensions -Wno-c++23-extensions -Wcalloc-transposed-args -Wcannot-profile -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 -Wno-deprecated-openmp -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-diag -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 -Wkeyword-macro -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-parameter=n -Wunused-but-set-variable -Wunused-but-set-variable=n -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 --all-warnings --extra-warnings --no-warnings --pedantic --pedantic-errors.IP "گزینههای تحلیلگر ایستا" 4 -fanalyzer -fanalyzer-assume-nothrow -fanalyzer-call-summaries -fanalyzer-checker=name -fno-analyzer-feasibility -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 -Wno-analyzer-throw-of-unexpected-type -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 -Wmultiple-parameter-fwd-decl-lists -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 -gno-prune-btf -ggdb -gno-record-gcc-switches -gstrict-dwarf -gas-loc-support -gas-locview-support -gcodeview -gcolumn-info -gdwarf32 -gdwarf64 -gno-statement-frontiers -gno-variable-location-views -gvariable-location-views=incompat5 -ginternal-reset-location-views -ginline-points -gvms -gz[=type] -gsplit-dwarf -gdescribe-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 -fvar-tracking-uninit --debug
- گزینههای بهینهسازی
- -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-profile-inlining -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 -fcx-method -fdata-sections -fdce -fdelayed-branch -fdelete-null-pointer-checks -fdep-fusion -fdevirtualize -fdevirtualize-speculatively -fdevirtualize-at-ltrans -fdse -fearly-inlining -fexcess-precision=style -fexpensive-optimizations -fext-dce -ffast-math -ffat-lto-objects -ffinite-loops -ffinite-math-only -ffloat-store -fforward-propagate -ffp-contract=style -ffp-int-builtin-inexact -ffunction-sections -ffuse-ops-with-volatile-access -fgcse -fgcse-after-reload -fgcse-las -fgcse-lm -fgraphite-identity -fgcse-sm -fhoist-adjacent-loads -fif-conversion -fif-conversion2 -findirect-inlining -finline-atomics -finline-functions -finline-functions-called-once -finline-limit=n -finline-small-functions -finline-stringops[=fn] -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-sra -fipa-stack-alignment -fipa-icf -fipa-icf-functions -fipa-icf-variables -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=n -flto-toplevel-asm-heuristics -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-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 -fspeculatively-call-stored-functions -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 -O -O0 -O1 -O2 -O3 -Os -Ofast -Og -Oz --optimize.IP "گزینههای ابزارگذاری برنامه" 4 -p -pg -fprofile-arcs -coverage -ftest-coverage -fcondition-coverage -fpath-coverage -fprofile -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 -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] --coverage --profile
- گزینههای پیشپردازنده
- -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 --comments --comments-in-macros --define-macro=macro[=defn] --dependencies --dump=letters --imacros=file --include=file --no-integrated-cpp --no-line-commands --print-missing-file-dependencies --traditional --traditional-cpp --trigraphs --trace-includes --undefine-macro=macro --user-dependencies --write-dependencies --write-user-dependencies
- گزینههای اسمبلر
- -Wa,option -Xassembler option --for-assembler=option
- گزینههای پیونددهنده
- object-file-name -flink-libatomic -fuse-ld=linker -llibrary -nostartfiles -nodefaultlibs -nolibc -nostdlib -nostdlib++ -e entry -pie -pthread -r -rdynamic -s -static -static-pie -static-libgcc -static-libstdc++ -static-libasan -static-libhwasan -static-liblsan -static-libtsan -static-libubsan -shared -shared-libgcc -symbolic -T script -Wl,option -Xlinker option -u symbol -Tbss=addr -Tdata=addr -Ttext=addr -N -n -t -Z -z keyword --entry=entry --for-linker=option --force-link=symbol --no-standard-library --pie --static --static-pie --symbolic
- گزینههای دایرکتوری
- -Bprefix -Idir -I- -idirafter dir -imacros file -imultilib dir -imultiarch dir -iplugindir=dir -iprefix file -iquote dir -isysroot dir -isystem dir -iwithprefix dir -iwithprefixbefore dir -Ldir -no-canonical-prefixes --no-sysroot-suffix -nostdinc -nostdinc++ --embed-dir=dir --embed-directory=dir --include-barrier --include-directory=dir --include-directory-after=dir --include-prefix=prefix --include-with-prefix=prefix --include-with-prefix-after=prefix --include-with-prefix-before=prefix --no-canonical-prefixes --no-standard-includes --prefix=prefix --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 -fwrapv-pointer -fvisibility=[default|internal|hidden|protected] -fstrict-volatile-bitfields -fsync-libcalls -fzero-init-padding-bits=value -Qy -Qn
- گزینههای توسعهدهنده
- -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-internal-locations -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-autofdo-gcov-version -print-file-name=library -print-libgcc-file-name -print-multi-directory -print-multi-lib -print-multi-os-directory -print-multiarch -print-prog-name=program -print-search-dirs -Q -print-sysroot -print-sysroot-headers-suffix -save-temps -save-temps=cwd -save-temps=obj -specs=file -time[=file] --dump=letters --print-autofdo-gcov-version --print-file-name=library --print-libgcc-file-file-name --print-multi-directory --print-multi-lib --print-multi-os-directory --print-multiarch --print-prog-name=program --print-search-dirs --print-sysroot --print-sysroot-headers-suffix --save-temps --specs=file --param name=value
- گزینههای مختص به مقصد
- گزینههای
AArch64 (AArch64 Options) -mabi=name
-mbig-endian -mlittle-endian -menable-sysreg-checking
-mgeneral-regs-only -mcmodel=tiny -mcmodel=small
-mcmodel=large -mstrict-align -momit-leaf-frame-pointer
-mtls-dialect=desc -mtls-dialect=traditional
-mtls-size=size -mtp=name
-mfix-cortex-a53-835769 -mfix-cortex-a53-843419
-mlow-precision-recip-sqrt -mlow-precision-sqrt -mlow-precision-div
-mmax-vectorization -mautovec-preference=name
-mpc-relative-literal-loads
-msign-return-address=scope
-mbranch-protection=features -mharden-sls=opts
-march=name -mcpu=name
-mtune=name -moverride=string
-mstack-protector-guard=guard
-mstack-protector-guard-reg=sysreg
-mstack-protector-guard-offset=offset
-mtrack-speculation -moutline-atomics -mearly-ra
-mearly-ldp-fusion -mlate-ldp-fusion -mnarrow-gp-writes
-msve-vector-bits=bits
گزینههای 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 -mmay-round-for-trunc -mfp-iarith -mvect-double -max-vect-align=num -msplit-vecmove-early -m1reg-reg
گزینههای AMD GCN (AMD GCN Options) -march=gpu -mtune=gpu -mgang-private-size=bytes -msram-ecc=[on|off|any] -mxnack=[on|off|any] -Wopenacc-dims
گزینههای ARC (ARC Options) -mbarrel-shifter -mjli-always -mcpu=cpu -mA6 -mARC600 -mA7 -mARC700 -mdpfp -mdpfp-compact -mdpfp-fast -mno-dpfp-lrsr -mea -mmul32x16 -mmul64 -matomic -mnorm -mspfp -mspfp-compact -mspfp-fast -msimd -msoft-float -mswap -mlock -mswape -mxy -misize -marclinux -marclinux_prof -mlong-calls -mmedium-calls -msdata -mirq-ctrl-saved -mrgf-banked-regs -mlpc-width=width -G num -mvolatile-cache -mtp-regno=regno -mbitops -mcmem -munaligned-access -mauto-modify-reg -mno-brcc -mcase-vector-pcrel -mno-cond-exec -mearly-cbranchsi -mindexed-loads -mlra-priority-none -mlra-priority-compact -mlra-priority-noncompact -mmillicode -msize-level=level -mtune=cpu -mmultcost=num -mcode-density-frame -mmpy-option=multo -mdiv-rem -mcode-density -mll64 -mfpu=fpu -mrf16 -mbranch-index
گزینههای ARM (ARM Options) -mapcs-frame -mapcs -mabi=name -mgeneral-regs-only -mno-sched-prolog -mlittle-endian -mbig-endian -mbe8 -mbe32 -mfloat-abi=name -mfp16-format=name -mthumb-interwork -mcpu=name -march=name -mfpu=name -mtune=name -mstructure-size-boundary=n -mabort-on-noreturn -mlong-calls -msingle-pic-base -mpic-register=reg -mpic-data-is-text-relative -mnop-fun-dllimport -mpoke-function-name -mthumb -marm -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 -mslow-flash-data -masm-syntax-unified -mrestrict-it -mpure-code -mcmse -mfix-cmse-cve-2021-35465 -mstack-protector-guard=guard -mstack-protector-guard-offset=offset -mfdpic -mbranch-protection=features -mvectorize-with-neon-quad -mvectorize-with-neon-double.Sp گزینههای 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 -mpmem-wrap-around -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 -mspecld-anomaly -mcsync-anomaly -mlow-64k -mstack-check-l1 -mid-shared-library -mleaf-id-shared-library -mshared-library-id=n -msep-data -mlong-calls -mfast-fp -minline-plt -mmulticore -mcorea -mcoreb -msdram -micplb
گزینههای C6X (C6X Options) -mbig-endian -mlittle-endian -march=cpu -msim -msdata=sdata-type -mdsbt -mlong-calls
گزینههای CRIS (CRIS Options) -mcpu=cpu -march=cpu -mtune=cpu -mmax-stackframe=n -metrax4 -metrax100 -mpdebug -mcc-init -mno-side-effects -mstack-align -mdata-align -mconst-align -m32-bit -m16-bit -m8-bit -mno-prologue-epilogue -mbest-lib-options -moverride-best-lib-options -mtrap-using-break8 -mtrap-unaligned-atomic -munaligned-atomic-may-use-library -sim -sim2 -mmul-bug-workaround
گزینههای C-SKY (C-SKY Options) -march=arch -mcpu=cpu -mbig-endian -mlittle-endian -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 -msched-prolog -msim
گزینههای Cygwin و MinGW (Cygwin and MinGW Options) -mconsole -mcrtdll=library -mdll -mnop-fun-dllimport -mthreads -municode -mwin32 -mwindows -fno-set-stack-executable -fwritable-relocated-rdata -mpe-aligned-commons -muse-libstdc-wrappers
گزینههای Darwin (Darwin Options) -all_load -allowable_client -arch name -arch_errors_fatal -asm_macosx_version_min=version -bind_at_load -bundle -bundle_loader -client_name -compatibility_version -current_version -dead_strip -dependency-file -dylib_file -dylinker -dylinker_install_name -dynamic -dynamiclib -exported_symbols_list -fapple-kext -fconstant-cfstrings -ffix-and-continue -filelist -findirect-data -flat_namespace -force_cpusubtype_ALL -force_flat_namespace -framework name -gfull -gused -headerpad_max_install_names -iframework -image_base -init symbol-name -install_name -keep_private_externs -matt-stubs -mconstant-cfstrings -mdynamic-no-pic -mfix-and-continue -mkernel -mmacosx-version-min=version -mone-byte-bool -msymbol-stubs -mtarget-linker[=]version -nodefaultexport -nodefaultrpaths -pagezero_size -preload -read_only_relocs -sectalign -sectcreate -seg_addr_table -seg1addr -segaddr -segprot -segs_read_only_addr -segs_read_write_addr -sub_library -sub_umbrella -twolevel_namespace -twolevel_namespace_hints -umbrella -undefined -unexported_symbols_list -weak_framework name -weak_reference_mismatches -whatsloaded -whyload -F -ObjC -ObjC++ -Wnonportable-cfstrings
گزینههای 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 -mtls-kernel -mtls-size=bitsize -mlong-double-128 -mlong-double-64
گزینههای eBPF (eBPF Options) -mbig-endian -mlittle-endian -mframe-limit=bytes -mxbpf -mco-re -mjmpext -mjmp32 -malu32 -mv3-atomics -mbswap -msdiv -msmov -mcpu=version -masm=dialect -minline-memops-threshold=bytes -Wco-re
گزینههای FR30 (FR30 Options) -msmall-model -mno-lsim
گزینههای FRV (FRV Options) -mgpr-32 -mgpr-64 -mfpr-32 -mfpr-64 -mhard-float -msoft-float -malloc-cc -mfixed-cc -mdword -mdouble -mmedia -mmuladd -mfdpic -minline-plt -mgprel-ro -multilib-library-pic -mlinked-fp -mlong-calls -malign-labels -mlibrary-pic -macc-4 -macc-8 -mpack -mno-eflags -mno-cond-move -mno-optimize-membar -mno-scc -mno-cond-exec -mno-vliw-branch -mno-multi-cond-exec -mno-nested-cond-exec -mtomcat-stats -mTLS -mtls -mcpu=cpu
گزینههای FT32 (FT32 Options) -msim -mnodiv -mft32b -mcompress -mnopm
گزینههای 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 -msx -ms2600 -mquickcall -mslowbyte -mexr -mint32 -malign-300
گزینههای HPPA (HPPA Options) -march=architecture-type -mno-atomic-libcalls -mcaller-copies -mdisable-fpregs -mdisable-indexing -mordered -mfast-indirect-calls -mgas -mgnu-ld -mhp-ld -mfixed-range=register-range -mcoherent-ldcw -mlinker-opt -mlong-calls -mlong-load-store -mno-space-regs -msoft-float -mpa-risc-1-0 -mpa-risc-1-1 -mpa-risc-2-0 -mportable-runtime -mschedule=cpu-type -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 -mconstant-gp -mauto-pic -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-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 -mlasx -mbranch-cost=n -maddr-reg-reg-cost=n -mcheck-zero-division -mbreak-code=code -mcond-move-int -mcond-move-float -memcpy -mstrict-align -G num -mmax-inline-memcpy-size=n -mexplicit-relocs=style -mexplicit-relocs -mno-explicit-relocs -mdirect-extern-access -mcmodel=code-model -mrelax -mpass-mrelax-to-as -mrecip -mrecip=opt -mfrecipe -mdiv32 -mlam-bh -mlamcas -mld-seq-sa -mscq -mtls-dialect=opt -mannotate-tablejump
گزینههای LynxOS (LynxOS Options) -mshared -mthreads -mlegacy-threads
گزینههای M32C (M32C Options) -mcpu=cpu -msim -memregs=number
گزینههای M32R/D (M32R/D Options) -m32r2 -m32rx -m32r -mdebug -malign-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 -m68302 -m68332 -m68851 -mcpu32 -mfidoa -m5200 -m5206e -m528x -m5307 -m5407 -mcfv4e -mbitfield -mc68000 -mc68020 -mrtd -mdiv -mshort -mhard-float -m68881 -msoft-float -mpcrel -malign-int -mstrict-align -msep-data -mshared-library-id=n -mid-shared-library -mxgot -mxtls -mlong-jump-table-offsets
گزینههای MCore (MCore Options) -mhardlit -mdiv -mrelax-immediates -mwide-bitfields -m4byte-functions -mcallgraph-data -mslow-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-gp-opt -mxl-multiply-high -mxl-float-convert -mxl-float-sqrt -mbig-endian -mlittle-endian -mxl-reorder -mxl-mode-app-model -mxl-prefetch -mpic-data-is-text-relative
گزینههای MIPS (MIPS Options) -EL -EB -mel -meb -march=arch -mtune=arch -mips1 -mips2 -mips3 -mips4 -mips32 -mips32r2 -mips32r3 -mips32r5 -mips32r6 -mips64 -mips64r2 -mips64r3 -mips64r5 -mips64r6 -mips16 -mmips16e2 -mflip-mips16 -minterlink-compressed -minterlink-mips16 -mabi=abi -mabicalls -mshared -mplt -mxgot -mgp32 -mgp64 -mfp32 -mfpxx -mfp64 -mhard-float -msoft-float -mno-float -msingle-float -mdouble-float -modd-spreg -mabs=mode -mnan=encoding -mdsp -mdspr2 -mmcu -meva -mvirt -mxpa -mcrc -mginv -mmicromips -mmsa -mloongson-mmi -mloongson-ext -mloongson-ext2 -mfpu=fpu-type -msmartmips -mpaired-single -mdmx -mips3d -mmt -mllsc -mlong64 -mlong32 -msym32 -Gnum -mno-local-sdata -mno-extern-sdata -mno-gopt -membedded-data -muninit-const-in-rodata -mcode-readable=setting -mno-data-in-code -mcode-xonly -msplit-addresses -mexplicit-relocs -mexplicit-relocs=release -mno-check-zero-division -mdivide-traps -mdivide-breaks -mno-load-store-pairs -mstrict-align -mno-unaligned-access -mmemcpy -mlong-calls -mmad -mimadd -mno-fused-madd -nocpp -mfix-24k -mfix-r4000 -mfix-r4400 -mfix-r5900 -mfix-r10000 -mfix-rm7000 -mfix-vr4120 -mfix-vr4130 -mfix-sb1 -mfix4300 -mr10k-cache-barrier=setting -mflush-func=func -mno-flush-func -mbranch-cost=num -mbranch-likely -mcompact-branches=policy -mno-fp-exceptions -mvr4130-align -msynci -mno-lxc1-sxc1 -mno-madd4 -mno-relax-pic-calls -mmcount-ra-address -mframe-header-opt.Sp گزینههای MMIX (MMIX Options) -mlibfuncs -mepsilon -mabi=gnu -mabi=mmixware -mzero-extend -mknuthdiv -mtoplevel-symbols -melf -mbranch-predict -mbase-addresses -msingle-exit -mset-data-start=address -mset-program-start=address -mno-set-program-start
گزینههای MN10300 (MN10300 Options) -mmult-bug -mno-mult-bug -mam33 -mam33-2 -mam34 -mtune=cpu-type -mno-return-pointer-on-d0 -mno-crt0 -mrelax -mno-liw -mno-setlb
گزینههای Moxie (Moxie Options) -meb -mel -mmul.x -mno-crt0
گزینههای MSP430 (MSP430 Options) -msim -masm-hex -mmcu=name -mlarge -msmall -mrelax -mwarn-mcu -mwarn-devices-csv -mcode-region=where -mdata-region=where -muse-lower-region-prefix -msilicon-errata=name[,name...] -msilicon-errata-warn=name[,name...] -mhwmult=type -minrt -mtiny-printf -mmax-inline-shift=n
گزینههای NDS32 (NDS32 Options) -mbig-endian -mlittle-endian -EB -EL -mabi=name -mfloat-abi=name -mreduced-regs -mfull-regs -malways-align -malign-functions -mfp-as-gp -mcmov -mhw-abs -mext-perf -mext-perf2 -mext-string -mext-dsp -mext-fpu-fma -mext-fpu-sp -mext-fpu-dp -mv3push -m16-bit -mvh -misr-vector-size=num -misr-secure=num -mcache-block-size=num -march=arch -mcpu=cpu -mconfig-fpu=num -mconfig-mul=type -mconfig-register-ports=kind -mcmodel=code-model -mctor-dtor -mrelax -mrelax-hint -msched-prolog-epilog -mno-ret-in-naked-func -malways-save-lp -munaligned-access -minline-asm-r15
گزینههای Nvidia PTX (Nvidia PTX Options) -m64 -march=arch -misa=arch -march-map=arch -mptx=version -mmainkernel -moptimize -msoft-stack -msoft-stack-reserve-local=size -muniform-simt -mgomp
گزینههای OpenRISC (OpenRISC Options) -mboard=name -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 -m40 -m45 -m10 -mint32 -mint16 -msplit -munix-asm -mdec-asm -mgnu-asm -mlra
گزینههای Picolibc (Picolibc Options) --oslib=library --crt0=[none|minimal|hosted|semihost] --printf=[d|f|l|i|m] --scanf=[d|f|l|i|m]
گزینههای PowerPC گزینههای RS/6000 و PowerPC را ببینید.
گزینههای PRU (PRU Options) -mmcu=mcu -minrt -mno-relax -mloop -mmul -mfillzero -mabi=variant
گزینههای RISC-V (RISC-V Options) -mbranch-cost=N-instruction -mabi=ABI-string -mfdiv -mdiv -mno-fence-tso -misa-spec=ISA-spec-string -march=[ISA|Profile|Profile_ISA|processor-string] -mcpu=processor-string -mtune=processor-string -mpreferred-stack-boundary=num -msmall-data-limit=N-bytes -msave-restore -mno-shorten-memrefs -mstrict-align -mscalar-strict-align -mno-vector-strict-align -mcmodel=medlow -mcmodel=medany -mcmodel=large -mexplicit-relocs -mrelax -mriscv-attribute -malign-data=type -mbig-endian -mlittle-endian -mstack-protector-guard=guard -mstack-protector-guard-reg=reg -mstack-protector-guard-offset=offset -mcsr-check -momit-leaf-frame-pointer -mmovcc -mno-inline-atomics -mno-inline-strlen -mno-inline-strcmp -mno-inline-strncmp -mstringop-strategy=strategy -mtls-dialect=desc -mtls-dialect=trad -mrvv-vector-bits=value -mrvv-max-lmul=value -madjust-lmul-cost -mmax-vectorization -mno-autovec-segment
گزینههای RL78 (RL78 Options) -msim -mallregs -mrelax -mes0 -mmul=none -mmul=g13 -mmul=g14 -mmul=rl78 -mcpu=g10 -mcpu=g13 -mcpu=g14 -mcpu=rl78 -mg10 -mg13 -mg14 -mrl78 -msave-mduc-in-interrupts
گزینههای RS/6000 و PowerPC (RS/6000 and PowerPC Options) -mcpu=cpu-type -mtune=cpu-type -mcmodel=code-model -mprofile-kernel -mpowerpc64 -maltivec -mpowerpc-gpopt -mpowerpc-gfxopt -mmfcrf -mpopcntb -mpopcntd -mfprnd -mcmpb -mhard-dfp -mfull-toc -mminimal-toc -mno-fp-in-toc -mno-sum-in-toc -maix64 -maix32 -m64 -m32 -mxl-compat -mpe -malign-power -malign-natural -msoft-float -mhard-float -mmultiple -mupdate -mavoid-indexed-addresses -mfused-madd -mbit-align -mbit-word -mstrict-align -mrelocatable -mrelocatable-lib -mlittle -mlittle-endian -mbig -mbig-endian -mdynamic-no-pic -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 -mregnames -mlongcall -mpltseq -mtls-markers -mblock-move-inline-limit=num -mblock-compare-inline-limit=num -mblock-compare-inline-loop-limit=num -mblock-ops-unaligned-vsx -mstring-compare-inline-limit=num -misel -mvsx -mvrsave -mmulhw -mdlmzb -mprototype -msim -mmvme -mads -myellowknife -memb -meabi -msdata -msdata=opt -mreadonly-in-sdata -mvxworks -G num -mrecip -mrecip=opt -mno-recip -mrecip-precision -mveclibabi=type -mfriz -mpointers-to-nested-functions -msave-toc-indirect -mpower8-fusion -mcrypto -mhtm -mquad-memory -mquad-memory-atomic -mcompat-align-parm -mfloat128 -mfloat128-hardware -mgnu-attribute -mstack-protector-guard=guard -mstack-protector-guard-reg=reg -mstack-protector-guard-offset=offset -mprefixed -mpcrel -mmma -mdense-math -mrop-protect -mprivileged -mno-splat-word-constant -mno-splat-float-constant -mno-ieee128-constant -mno-warn-altivec-long
گزینههای RX (RX Options) -m64bit-doubles -m32bit-doubles -fpu -nofpu -mcpu=name -mbig-endian-data -mlittle-endian-data -msmall-data-limit=N -msim -mas100-syntax -mrelax -mmax-constant-size=N -mint-register=N -mpid -mno-allow-string-insns -mjsr -mno-warn-multiple-fast-interrupts -msave-acc-in-interrupts -mlra
گزینههای S/390 و zSeries (S/390 and zSeries Options) -mtune=cpu-type -march=cpu-type -mhard-float -msoft-float -mhard-dfp -mlong-double-64 -mlong-double-128 -mbackchain -mpacked-stack -msmall-exec -mmvcle -m64 -m31 -mdebug -mesa -mzarch -mhtm -mvx -mzvector -mtpf-trace -mtpf-trace-skip -mmain -mfused-madd -mno-fused-madd -mwarn-framesize=framesize -mwarn-dynamicstack -mstack-size=stack-size -mno-stack-size -mstack-guard=stack-guard -mno-stack-guard -mstack-protector-guard=guard -mstack-protector-guard-record -mhotpatch=pre-halfwords,post-halfwords -mno-pic-data-is-text-relative -mindirect-branch=choice -mindirect-branch-jump=choice -mindirect-branch-call=choice -mfunction-return=choice -mfunction-return-mem=choice -mfunction-return-reg=choice -mindirect-branch-table -mfentry -mrecord-mcount -mnop-mcount -mpreserve-args -munaliged-symbols
گزینههای SH (SH Options) -m1 -m2 -m2e -m2a -m2a-nofpu -m2a-single -m2a-single-only -m3 -m3e -m4 -m4-nofpu -m4-single -m4-single-only -m4-100 -m4-100-nofpu -m4-100-single -m4-100-single-only -m4-200 -m4-200-nofpu -m4-200-single -m4-200-single-only -m4-300 -m4-300-nofpu -m4-300-single -m4-300-single-only -m4-340 -m4-400 -m4-500 -m4a -m4al -m4a-nofpu -m4a-single -m4a-single-only -mb -ml -mdalign -mrelax -mbigtable -mbitops -mfmovd -mrenesas -mnomacsave -mieee -misize -minline-ic_invalidate -mprefergot -musermode -multcost=number -mdiv=strategy -mdivsi3_libfunc=name -mfixed-range=register-range -maccumulate-outgoing-args -matomic-model=atomic-model -mbranch-cost=num -mzdcbranch -mcbranch-force-delay-slot -mfsca -mfsrra -mpretend-cmove -mfdpic -mtas -mlra
گزینههای Solaris 2 (Solaris 2 Options) -mclear-hwcap -mno-clear-hwcap -mimpure-text -mno-impure-text -gsctf
گزینههای SPARC (SPARC Options) -mcpu=cpu-type -mtune=cpu-type -mcmodel=code-model -mmemory-model=mem-model -m32 -m64 -mptr32 -mptr64 -mapp-regs -mfaster-structs -mflat -mfpu -mhard-float -msoft-float -mhard-quad-float -msoft-quad-float -mstack-bias -mstd-struct-return -munaligned-doubles -muser-mode -mv8plus -mvis -mvis2 -mvis3 -mvis3b -mvis4 -mvis4b -mcbcond -mfmaf -mfsmuld -mpopc -msubxc -mfix-at697f -mfix-ut699 -mfix-ut700 -mfix-gr712rc
گزینههای System V (System V Options) -YP,paths -Ym,dir
گزینههای V850 (V850 Options) -mlong-calls -mep -mprolog-function -mspace -mtda=n -msda=n -mzda=n -mv850 -mv850e3v5 -m850e2v4 -mv850e2v3 -mv850e2 -mv850e1 -mv850es -mv850e -mdisable-callt -mrelax -mlong-jumps -msoft-float -mhard-float -mloop -mrh850-abi -mghs -mgcc-abi -m8byte-align -mbig-switch -mapp-regs -msmall-sld -mno-strict-align -mjump-tables-in-data-section
گزینههای VAX (VAX Options) -munix -mgnu -md -md-float -mg -mg-float -mlra -mvaxc-alignment -mqmath.Sp گزینههای Visium (Visium Options) -mdebug -msim -mfpu -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 -mvthreads -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 -mieee-fp -mrtd -malign-double -mpreferred-stack-boundary=num -mincoming-stack-boundary=num -mcld -mcx16 -msahf -mmovbe -mcrc32 -mmwait -mrecip -mrecip=opt -mvzeroupper -mstv -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 -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.2 -mamx-avx512 -mamx-tf32 -mmovrs -mamx-movrs -mavx512bmm -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 -mstack-arg-probe -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 -mrecord-return -mfentry-name=name -mfentry-section=name -mskip-rax-setup -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 -mtls-dialect=type -mrelax-cmpxchg-loop -mindirect-branch=choice -mfunction-return=choice -mindirect-branch-register -mharden-sls=choice -mindirect-branch-cs-prefix -mapx-inline-asm-use-gpr32 -mgather -mscatter -mneeded -mno-direct-extern-access -munroll-only-small-loops -mdispatch-scheduler -mlam=choice
گزینههای x86 Windows گزینههای Cygwin و MinGW را ببینید.
گزینههای Xstormy16 (Xstormy16 Options) -msim
گزینههای Xtensa (Xtensa Options) -mconst16 -mforce-no-pic -mno-serialize-volatile -mtext-section-literals -mauto-litpools -mno-target-align -mlongcalls -mabi=abi-type -mextra-l32r-costs=cycles -mstrict-align
گزینههای zSeries گزینههای S/390 و zSeries را ببینید..SS "گزینههای کنترل نوع خروجی" همگردانی میتواند تا چهار مرحله را در بر گیرد: پیشپردازش، خودِ همگردانی، اسمبل و پیوند، که همواره به همین ترتیب انجام میشوند. GCC قادر است چندین فایل را پیشپردازش و همگردانی کرده و آنها را به چند فایل ورودی اسمبلر، یا به یک فایل ورودی اسمبلر تبدیل کند؛ سپس هر فایل ورودی اسمبلر یک فایل شیء تولید میکند و در نهایت، مرحلهٔ پیوند تمام فایلهای شیء (چه آنهایی که بهتازگی همگردانی شدهاند و چه آنهایی که به عنوان ورودی تعیین شدهاند) را در قالب یک فایل اجرایی با هم ترکیب میکند.
برای هر فایل ورودی معین، پسوند نام فایل مشخص میکند که چه نوع همگردانیای انجام شود:
- 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 با قالب ثابت که نباید پیشپردازش شود.
- file.F
- file.FOR
- file.fpp
- file.FPP
- file.FTN
- کد منبع Fortran با قالب ثابت که باید پیشپردازش شود (با استفاده از پیشپردازندهٔ سنتی).
- file.f90
- file.f95
- file.f03
- file.f08
- file.fii
- کد منبع Fortran با قالب آزاد که نباید پیشپردازش شود.
- 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 که شامل اعلان یک واحد کتابخانهای (اعلان یک بسته، زیربرنامه، یا عام (generic)، یا نمونهسازی یک شیء عام)، یا اعلان تغییرنام واحد کتابخانهای (اعلان تغییرنام یک بسته، عام، یا زیربرنامه) است. به چنین فایلهایی specs نیز میگویند.
- file.adb
- فایل کد منبع Ada شامل بدنهٔ واحد کتابخانهای (بدنهٔ یک زیربرنامه یا بسته). به چنین فایلهایی bodies نیز میگویند.
- file.s
- کد اسمبلی..IP file.S 4
- file.sx
- کد اسمبلی که باید پیشپردازش شود.
- other
- یک فایل شیء (object file) که مستقیماً به مرحلهٔ پیوند (linking) فرستاده میشود. با هر نام فایلی بدون پسوند شناختهشده، به این صورت رفتار میشود.
میتوانید زبان ورودی را بهطور صریح با گزینهٔ -x مشخص کنید:
- -x language
- --language=language
- --language language
- زبان (language) را
بهطور
صریح برای
فایلهای
ورودی پس از
آن مشخص
میکند (به
جای اینکه
به
کامپایلر
اجازه داده
شود
پیشفرضی
را بر اساس
پسوند نام
فایل
انتخاب
کند). این
گزینه بر
همهٔ
فایلهای
ورودی بعدی
اعمال
میشود تا
زمانی که
گزینهٔ -x
بعدی مشخص
شود. مقادیر
ممکن برای
language عبارتند
از:
c c-header cpp-output c++ c++-header c++-system-header c++-user-header c++-cpp-output c++-system-module objective-c objective-c-header objective-c-cpp-output objc-cpp-output objective-c++ objective-c++-header objective-c++-cpp-output objc++-cpp-output assembler assembler-with-cpp ada adascil adawhy cobol d f77 f77-cpp-input f95 f95-cpp-input go modula-2 modula-2-cpp-output rust algol68 lto
توجه داشته باشید که -x نشاندهندهٔ استاندارد خاصی از زبان نیست. برای مثال، -x f77 ممکن است برای برخی از کدهای منبع قدیمیتر به -std=legacy نیز نیاز داشته باشد.
- -x none
- هرگونه تعیین زبان را غیرفعال میکند، بهطوری که با فایلهای بعدی بر اساس پسوند نام آنها رفتار میشود (همانطور که گویی اصلاً از -x استفاده نشده است).
اگر فقط برخی از مراحل کامپایل را میخواهید، میتوانید از -x (یا پسوندهای نام فایل) استفاده کنید تا به gcc بگویید از کجا شروع کند، و از یکی از گزینههای -c، -S یا -E برای تعیین محل توقف gcc بهره بگیرید. توجه داشته باشید که برخی ترکیبها (برای مثال، -x cpp-output -E) به gcc دستور میدهند که اصلاً هیچ کاری انجام ندهد.
- -c
- --compile
- فایلهای
منبع را
کامپایل یا
اسمبل
میکند،
اما آنها
را پیوند (link)
نمیدهد.
مرحلهٔ
پیونددهی
اساساً
انجام
نمیشود.
خروجی
نهایی به
شکل یک فایل
شیء (object file) به
ازای هر
فایل منبع
خواهد بود.
بهطور پیشفرض، نام فایل شیء برای یک فایل منبع با جایگزینی پسوند .c، .i، .s و غیره با .o ساخته میشود.
فایلهای ورودی ناشناخته که نیازی به کامپایل یا اسمبل ندارند، نادیده گرفته میشوند.
- -S
- --assemble
- پس از
مرحلهٔ
کامپایل
واقعی
متوقف
میشود؛
اسمبل
انجام
نمیدهد.
خروجی به
شکل یک فایل
کد اسمبلی
برای هر
فایل ورودی
مشخصشدهٔ
غیر اسمبلی
خواهد بود.
بهطور پیشفرض، نام فایل اسمبلی برای یک فایل منبع با جایگزینی پسوند .c، .i و غیره با .s ساخته میشود.
فایلهای ورودی که نیازی به کامپایل ندارند نادیده گرفته میشوند.
- -E
- --preprocess
- پس از
مرحلهٔ
پیشپردازش
متوقف
میشود؛
کامپایلر
واقعی را
اجرا
نمیکند.
خروجی به
شکل کد منبع
پیشپردازششده
است که به
خروجی
استاندارد
فرستاده
میشود.
فایلهای ورودی که نیازی به پیشپردازش ندارند نادیده گرفته میشوند.
- -o file
- --output=file
- --output file
- خروجی اصلی
را در فایل
file قرار
میدهد. این
موضوع برای
هر نوع
خروجی
تولیدشده،
اعم از یک
فایل
اجرایی، یک
فایل شیء،
یک فایل
اسمبلی یا
کد C
پیشپردازششده،
صدق میکند.
اگر -o مشخص نشود، رفتار پیشفرض این است که فایل اجرایی در a.out، فایل شیء برای source.suffix در source.o، فایل اسمبلی آن در source.s، فایل هدر از پیش کامپایلشده در source.suffix.gch، و تمام کدهای C پیشپردازششده در خروجی استاندارد قرار داده شوند.
اگرچه -o تنها خروجی اصلی را نامگذاری میکند، اما بر نامگذاری خروجیهای کمکی (auxiliary) و تخلیه (dump) نیز تأثیر میگذارد. به مثالهای زیر نگاه کنید. مگر اینکه بازنویسی شوند، هر دو خروجی کمکی و تخلیه در همان دایرکتوری خروجی اصلی قرار میگیرند. در خروجیهای کمکی، پسوند فایل ورودی با پسوند نوع فایل خروجی کمکی جایگزین میشود؛ در خروجیهای تخلیه، پسوند فایل تخلیه به پسوند فایل ورودی الحاق میگردد. در دستورهای کامپایل، نام پایهٔ (base name) هر دو خروجی کمکی و تخلیه همان نام پایهٔ خروجی اصلی است؛ در دستورهای کامپایل و پیوند، نام خروجی اصلی منهای پسوند فایل اجرایی، با نام فایل ورودی ترکیب میشود. اگر هر دو نام پایهٔ یکسانی داشته باشند (بدون در نظر گرفتن پسوند)، نتیجهٔ ترکیب همان نام پایه خواهد بود؛ در غیر این صورت، آنها با یک خط تیره از هم جدا و به یکدیگر متصل میشوند.
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
- --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 اسمبل مینماید.
در نبود این گزینه، فایلهای dump و aux نام خود را از فایل ورودی میگیرند، یا اگر فایل خروجی (غیر پیونددهنده) صریحاً مشخص شده باشد، از آن میگیرند: فایلهای خروجی dump (برای مثال مواردی که با گزینههای -fdump-* درخواست شدهاند) با پسوند نام ورودی، و فایلهای خروجی aux (آنهایی که با دیگر گزینههای غیر dump درخواست شدهاند، مانند "-save-temps"، "-gsplit-dwarf" و "-fcallgraph-info") بدون آن.
تمایز مشابه پسوند برای خروجیهای dump و aux را میتوان با مشخص کردن -dumpbase-ext .suf علاوه بر -dumpbase basename.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 در دستوری مشخص شود که چندین ورودی را کامپایل میکند، یا کامپایل کرده و سپس پیوند میدهد، ممکن است همانطور که تحت -dumpdir شرح داده شده با dumppfx ترکیب شود. آنگاه، هر فایل ورودی با استفاده از dumppfx ترکیبی کامپایل میشود و مقادیر پیشفرض برای dumpbase و auxdropsuf برای هر فایل ورودی محاسبه میگردد:
gcc foo.c bar.c -c -dumpbase main ...
فایلهای foo.o و bar.o را به عنوان خروجیهای اصلی ایجاد میکند، و با استفاده از dumpbase به عنوان پیشوند، از رونویسی خروجیهای کمکی و dump جلوگیری کرده و خروجیهای کمکی و dump را با نامهای main-foo.* و main-bar.* میسازد.
تعیین یک رشته خالی به عنوان dumpbase از تأثیر نام پایه خروجی بر نامگذاری خروجیهای کمکی و dump در حین کامپایل جلوگیری کرده و مقادیر پیشفرض را محاسبه میکند:
gcc -c foo.c -o dir/foobar.o -dumpbase " ...
خروجیهای aux را 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
- --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
- --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 صریح یا پیشفرض الحاق میشوند (یا در صورت داشتن هرگونه مؤلفه دایرکتوری، جایگزین آن میشوند)، تا هر یک از کامپایلهای متعدد، خروجیهای aux و 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=* بازنویسی (override) شود:
gcc foo.c -dumpdir alt/pfx- -o dir/main.exe -save-temps=cwd ...
خروجیهای کمکی با نام foo.* و خروجیهای dump با نام foo.c.* در دایرکتوری کاری فعلی ساخته میشوند، همانطور که نهایتاً توسط -save-temps=cwd درخواست شده است.
برای جمعبندی همهٔ این موارد جهت دستیابی به یک جریان دادهٔ شهودی اما تا حدی تقریبی: نام خروجی اصلی به یک بخش دایرکتوری و یک بخش نام پایه شکسته میشود؛ 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 به زیرکامپایلرها پاس میدهد.
- -v
- --verbose
- دستورات اجراشده برای اجرای مراحل کامپایل را (در خروجی خطای استاندارد) چاپ میکند. همچنین شماره نسخهٔ برنامهٔ درایور کامپایلر، پیشپردازنده و خود کامپایلر اصلی را چاپ میکند.
- -###
- مشابه -v است با این تفاوت که دستورات اجرا نمیشوند و آرگومانها درون کوتیشن قرار میگیرند، مگر آنکه صرفاً شامل نویسههای عددی-حروفی یا "./-_" باشند. این گزینه برای اسکریپتهای شل جهت ضبط خطوط فرمان تولیدشده توسط درایور مفید است.
- --help
- شرحی از گزینههای خط فرمان شناختهشده برای gcc را (در خروجی استاندارد) چاپ میکند. اگر گزینهٔ -v نیز مشخص شده باشد، آنگاه --help به فرایندهای متعددی که توسط gcc فراخوانی میشوند نیز ارسال میشود تا آنها هم بتوانند گزینههای خط فرمان پذیرفتهشدهٔ خود را نمایش دهند. در صورتی که گزینهٔ -Wextra نیز (قبل از گزینهٔ --help) تعیین شده باشد، گزینههای خط فرمانی که هیچ مستنداتی به آنها اختصاص نیافته نیز نمایش داده میشوند.
- --target-help
- شرحی از گزینههای خط فرمان مختص به هدف (target-specific) را برای هر ابزار (در خروجی استاندارد) چاپ میکند. برای برخی اهداف ممکن است اطلاعات اضافی مربوط به آن معماری هدف نیز چاپ شود.
- --help={class|[^]qualifier}[,...]
- شرحی از گزینههای خط فرمان شناختهشده توسط کامپایلر را که در تمام کلاسها و توصیفکنندههای تعیینشده جای میگیرند (در خروجی استاندارد) چاپ میکند. کلاسهای پشتیبانیشده عبارتند از:
- optimizers
- نمایش تمامی گزینههای بهینهسازی پشتیبانیشده توسط کامپایلر.
- warnings
- نمایش تمامی گزینههای کنترلکنندهٔ پیامهای هشدار تولیدشده توسط کامپایلر.
- target
- نمایش گزینههای مختص به هدف. با این حال، بر خلاف گزینهٔ --target-help، گزینههای مختص به هدف در پیونددهنده و اسمبلی نمایش داده نمیشوند؛ زیرا این ابزارها در حال حاضر از نحو گسترشیافتهٔ --help= پشتیبانی نمیکنند.
- params
- نمایش مقادیر شناختهشده توسط گزینهٔ --param.
- language
- نمایش گزینههای پشتیبانیشده برای language، که در آن language نام یکی از زبانهای پشتیبانیشده در این نسخه از GCC است. اگر گزینهای توسط همهٔ زبانها پشتیبانی شود، باید کلاس common انتخاب شود.
- common
- نمایش گزینههایی که بین همهٔ زبانها مشترک هستند.
توصیفکنندههای پشتیبانیشده به این شرح هستند:
- undocumented
- نمایش صرفاً گزینههایی که مستند نشدهاند.
- joined
- نمایش گزینههایی که آرگومانی میپذیرند که پس از علامت مساوی در همان تکه متن پیوسته ظاهر میشود، مانند: --help=target.
- separate
- نمایش گزینههایی که آرگومانی را به عنوان یک کلمهٔ جداگانه پس از گزینهٔ اصلی میپذیرند، مانند: -o output-file.
بنابراین برای مثال جهت نمایش تمام سوئیچهای مستندنشده و مختص به هدف که توسط کامپایلر پشتیبانی میشوند، از این دستور استفاده کنید:
--help=target,undocumented
معنای یک توصیفکننده را میتوان با پیشوند قرار دادن نویسهٔ ^ معکوس کرد؛ بنابراین برای مثال جهت نمایش تمام گزینههای هشدار باینری (یعنی گزینههایی که یا روشن یا خاموش هستند و آرگومانی دریافت نمیکنند) که دارای توضیحات هستند، از این دستور استفاده کنید:
--help=warnings,^joined,^undocumented
آرگومان ورودی --help= نباید صرفاً شامل توصیفکنندههای معکوسشده باشد.
ترکیب چندین کلاس ممکن است، هرچند که این کار معمولاً خروجی را چنان محدود میکند که چیزی برای نمایش باقی نمیماند. با این حال یکی از مواردی که به درستی کار میکند، زمانی است که یکی از کلاسها target باشد. برای مثال جهت نمایش تمام گزینههای بهینهسازی مختص به هدف، از این دستور استفاده کنید:
--help=target,optimizers
گزینهٔ --help= میتواند در خط فرمان تکرار شود. هر بار استفادهٔ متوالی، کلاس درخواستی گزینهها را نشان میدهد و مواردی را که قبلاً نمایش داده شدهاند نادیده میگیرد. در صورتی که --help نیز در هر کجای خط فرمان مشخص شده باشد، نسبت به هر گزینهٔ --help= اولویت دارد.
اگر گزینهٔ -Q در خط فرمان پیش از گزینهٔ --help= بیاید، متن توصیفی نمایشدادهشده توسط --help= تغییر میکند. به جای شرح گزینههای نمایشدادهشده، نشان داده میشود که آیا گزینه فعال، غیرفعال یا روی یک مقدار خاص تنظیم شده است (با این فرض که کامپایلر در مرحلهای که گزینهٔ --help= استفاده شده این موضوع را میداند).
در اینجا
یک مثال
کوتاه از
پورت ARM برای
gcc آورده شده
است: % gcc -Q -mabi=2 --help=target -c The following
options are target specific: -mabi= 2 -mabort-on-noreturn [disabled] -mapcs
[disabled]
خروجی نسبت به اثرات گزینههای پیشین در خط فرمان حساس است؛ بنابراین، بهعنوان نمونه میتوان دریافت که چه بهینهسازیهایی در -O2 فعال هستند با استفاده از:
-Q -O2 --help=optimizers
بهعنوان روشی جایگزین، میتوانید بهینهسازیهای دودوییِ فعالشده با -O3 را با استفاده از دستورهای زیر بیابید:
gcc -c -Q -O3 --help=optimizers > /tmp/O3-opts gcc -c -Q -O2 --help=optimizers > /tmp/O2-opts diff /tmp/O2-opts /tmp/O3-opts | grep enabled
- --version
- شمارهٔ نگارش و کپیرایتهای نسخهٔ فراخوانیشدهٔ GCC را نمایش میدهد.
- -pass-exit-codes
- --pass-exit-codes
- بهطور معمول اگر هر مرحلهای از کامپایلر کد بازگشتیِ ناموفقی بازگرداند، برنامهٔ gcc با کد ۱ خارج میشود. اگر -pass-exit-codes را مشخص کنید، برنامهٔ gcc در عوض با بزرگترین کد خطای عددی حاصل از هر مرحلهای که نشانگر خطا بوده است، خارج میشود. بخشهای جلویی (فرانتاند) C، C++ و Fortran در صورت مواجهه با خطای داخلی در کامپایلر، مقدار ۴ را برمیگردانند.
- -pipe
- --pipe
- برای ارتباط میان مراحل گوناگون کامپایل، بهجای فایلهای موقت از لولهها (pipes) استفاده میکند. این ویژگی در برخی سامانهها که در آنها اسمبلر قادر به خواندن از لوله نیست با شکست مواجه میشود؛ اما اسمبلر گنو (GNU assembler) مشکلی با آن ندارد.
- -wrapper
- تمام
زیردستورها
را تحت یک
برنامهٔ
لفاف (wrapper)
اجرا
میکند. نام
برنامهٔ
لفاف و
پارامترهای
آن بهصورت
فهرستی
جداشده با
کاما ارسال
میشوند.
gcc -c t.c -wrapper gdb,--args
این کار تمام زیربرنامههای gcc را تحت gdb --args اجرا میکند، بنابراین فراخوانی cc1 بهصورت gdb --args cc1 ... خواهد بود.
- -ffile-prefix-map=old=new
- هنگام کامپایل فایلهای مستقر در پوشهٔ 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 شود. نام پایهٔ فایل شیء اشتراکی برای شناسایی افزونه بهمنظور تجزیهٔ آرگومانها استفاده میشود (گزینهٔ -fplugin-arg-name-key=value در ادامه را ببینید). هر افزونه باید توابع بازفراخوانی (callback) مشخصشده در رابط برنامهنویسی افزونهها (Plugins API) را تعریف کند.
- -fplugin-arg-name-key=value
- یک آرگومان به نام key با مقدار value برای افزونهای به نام name تعریف میکند.
- -fdump-ada-spec[-slim]
- برای فایلهای منبع و گنجاندنی (include) در زبانهای C و C++، مشخصات (spec) متناظر زبان Ada را تولید میکند.
- -fada-spec-parent=unit
- در هماهنگی با گزینهٔ -fdump-ada-spec[-slim] در بالا، مشخصات Ada را بهعنوان واحدهای فرزند از واحد والد unit تولید میکند.
- -fdump-go-spec=file
- برای فایلهای ورودی در هر زبانی، اعلانهای متناظر در زبان Go را در file تولید میکند. این گزینه اعلانهای Go از نوع "const"، "type"، "var" و "func" را تولید میکند که میتواند شیوهٔ مفیدی برای شروع نوشتن یک رابط Go برای کدهایی باشد که به زبانهای دیگر نوشته شدهاند.
- @file
- گزینههای
خط فرمان را
از file
میخواند.
گزینههای
خواندهشده
بهجای
گزینهٔ
اصلی @file درج
میشوند.
اگر file وجود
نداشته
باشد یا
قابل
خواندن
نباشد، با
گزینه
بهصورت
لفظی و متنی
برخورد شده
و حذف
نخواهد شد.
گزینهها در file با نویسههای فاصله (whitespace) از یکدیگر تفکیک میشوند. میتوان یک نویسهٔ فاصله را با محصور کردن کل گزینه در گیومهٔ تکی یا دوگانه درون یک گزینه قرار داد. هر نویسهای (از جمله بکاسلش) را میتوان با درج یک بکاسلش بهعنوان پیشوند در کنار آن وارد کرد. خود file نیز میتواند شامل گزینههای بیشتری از نوع @file باشد؛ تمامی این گزینهها بهصورت بازگشتی پردازش خواهند شد..SS "کامپایل برنامههای C++ (Compiling C++ Programs)" فایلهای منبع C++ بهطور معمول از یکی از پسوندهای .C، .cc، .cpp، .CPP، .c++، .cp یا .cxx استفاده میکنند؛ فایلهای سرآیند C++ اغلب از .hh، .hpp، .H یا (برای کدهای قالب اشتراکی) .tcc استفاده میکنند؛ فایلهای پیشپردازششده C++ از پسوند .ii استفاده میکنند؛ و واحدهای رابط ماژول C++20 گاهی از .ixx، .cppm، .cxxm، .c++m یا .ccm استفاده میکنند.
کامپایلر GCC فایلهایی با این نامها را تشخیص میدهد و آنها را به عنوان برنامههای C++ کامپایل میکند، حتی اگر کامپایلر را به همان روشی که برای کامپایل برنامههای C معمول است (معمولاً با نام gcc) فراخوانی کنید.
با این حال، استفاده از gcc کتابخانه C++ را اضافه نمیکند. g++ برنامهای است که GCC را فراخوانی کرده و پیوند با کتابخانه C++ را بهطور خودکار مشخص میکند. این برنامه با فایلهای .c، .h و .i بهجای فایلهای منبع C، مانند فایلهای منبع C++ رفتار میکند، مگر اینکه -x به کار رفته باشد. این برنامه همچنین هنگام پیشکامپایل کردن یک فایل سرآیند C با پسوند .h جهت استفاده در کامپایلهای C++ مفید است. در بسیاری از سیستمها، g++ با نام c++ نیز نصب میشود.
هنگامی که برنامههای C++ را کامپایل میکنید، میتوانید بسیاری از همان گزینههای خط فرمانی را تعیین کنید که برای کامپایل برنامهها در هر زبانی به کار میبرید؛ یا گزینههای خط فرمانی که برای C و زبانهای وابسته معنادار هستند؛ یا گزینههایی که تنها برای برنامههای C++ کاربرد دارند.
گزینههای کنترل لهجه C (Options Controlling C Dialect)
گزینههای زیر گویش (لهجه) C (یا زبانهای برگرفته از C، مانند C++، Objective-C و Objective-C++) را که کامپایلر میپذیرد کنترل میکنند:
- -ansi
- --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. این استاندارد اساساً بهطور کامل پشتیبانی میشود، به جز باگها و مشکلات ممیز شناور (عمدتاً اما نه منحصراً مربوط به ویژگیهای اختیاری C99 از ضمیمههای F و G). برای اطلاعات بیشتر به https://gcc.gnu.org/projects/c-status.html مراجعه کنید. نامهای c9x و iso9899:199x منسوخ شدهاند.
- c11
- c1x
- iso9899:2011
- استاندارد ISO C11، بازنگری سال ۲۰۱۱ استاندارد ISO C. این استاندارد اساساً بهطور کامل پشتیبانی میشود، به جز باگها، مشکلات ممیز شناور (عمدتاً اما نه منحصراً مربوط به ویژگیهای اختیاری C11 از ضمیمههای F و G) و ضمیمههای اختیاری K (رابطهای بررسی محدوده) و L (تحلیلپذیری). نام c1x منسوخ شده است.
- c17
- c18
- iso9899:2017
- iso9899:2018
- استاندارد ISO C17، بازنگری سال ۲۰۱۷ استاندارد ISO C (منتشرشده در سال ۲۰۱۸). این استاندارد به جز تصحیح نقصها (که همگی با -std=c11 نیز اعمال میشوند) و یک مقدار جدید برای "__STDC_VERSION__"، همانند C11 است و بنابراین به همان میزان C11 پشتیبانی میشود.
- c23
- c2x
- iso9899:2024
- استاندارد ISO C23، بازنگری سال ۲۰۲۳ استاندارد ISO C (منتشرشده در سال ۲۰۲۴). نام c2x منسوخ شده است.
- c2y
- نسخه بعدی استاندارد ISO C، که هنوز در حال توسعه است. پشتیبانی از این نسخه آزمایشی و ناقص است.
- gnu90
- gnu89
- لهجه 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. نام gnu++1z منسوخ شده است.
- c++20
- c++2a
- استاندارد ISO C++ سال ۲۰۲۰ بههمراه اصلاحیهها. پشتیبانی از ماژولهای C++20 هنوز آزمایشی است و باید با گزینهٔ -fmodules فعال شود. نام c++2a منسوخ شده است.
- gnu++20
- gnu++2a
- گویش GNU از -std=c++20. این مقدار، پیشفرض برای کد C++ است. پشتیبانی از ماژولهای C++20 هنوز آزمایشی است و باید با گزینهٔ -fmodules فعال شود. نام 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
- اعلانهای
دارای
پیشنمونه
(prototyped) را برای
تمام
توابعی که
در یک واحد
ترجمه (translation unit)
اعلان و/یا
تعریف
شدهاند،
از جمله
موارد
موجود در
فایلهای
سرآیند، در
نام فایل
ارائهشده
خروجی
میدهد. این
گزینه در هر
زبانی غیر
از C در سکوت
نادیده
گرفته
میشود.
علاوه بر اعلانها، این فایل در قالب کامنتها مبدأ هر اعلان (فایل منبع و خط)، ضمنی، دارای پیشنمونه یا بدون پیشنمونه بودن اعلان (I، N برای new یا O برای old، بهترتیب در اولین نویسه پس از شماره خط و دونقطه)، و اینکه آیا از یک اعلان آمده یا یک تعریف (C یا F، بهترتیب در نویسه بعدی) را مشخص میکند. در مورد تعاریف توابع، فهرستی از آرگومانها به سبک K&R بههمراه اعلانهای مربوطهشان نیز درون کامنتها، پس از اعلان ارائه میگردد.
- -fno-asm
- کلمات
"asm"،
"inline" یا
"typeof" را
بهعنوان
کلمهٔ
کلیدی
شناسایی
نمیکند تا
کد بتواند
از این
کلمات
بهعنوان
شناسه
استفاده
کند. در عوض
میتوانید
از کلمات
کلیدی
"__asm__"،
"__inline__" و
"__typeof__"
استفاده
کنید. در C،
گزینهٔ -ansi
مستلزم -fno-asm
است.
در C++، کلمهٔ "inline" یک کلمهٔ کلیدی استاندارد است و تحت تأثیر این سوییچ قرار نمیگیرد. ممکن است بخواهید بهجای آن از پرچم -fno-gnu-keywords استفاده کنید که "typeof" را غیرفعال میکند اما نه "asm" و "inline" را. در حالت C99 (-std=c99 یا -std=gnu99)، این سوییچ فقط بر کلمات کلیدی "asm" و "typeof" تأثیر میگذارد، چرا که "inline" یک کلمهٔ کلیدی استاندارد در ISO C99 است. در حالت C23 (-std=c23 یا -std=gnu23)، این سوییچ فقط بر کلمهٔ کلیدی "asm" تأثیر دارد، چرا که "typeof" یک کلمهٔ کلیدی استاندارد در ISO C23 است.
- -fno-builtin
- -fno-builtin-function
- توابع
توکاری (built-in)
که با
پیشوند __builtin_
آغاز
نمیشوند
را شناسایی
نمیکند.
GCC بهطور معمول کدهای ویژهای تولید میکند تا برخی توابع توکار را با کارایی بیشتری مدیریت کند؛ برای نمونه، فراخوانیهای "alloca" ممکن است به دستورالعملهای منفردی تبدیل شوند که پشته را مستقیماً تنظیم میکنند، و فراخوانیهای "memcpy" ممکن است به حلقههای رونوشت درونخطی تبدیل گردند. کد حاصل معمولاً هم کوچکتر و هم سریعتر است، اما از آنجا که فراخوانیهای تابع دیگر به این شکل ظاهر نمیشوند، نمیتوانید روی آن فراخوانیها نقطهٔ توقف (breakpoint) بگذارید، و همچنین نمیتوانید رفتار توابع را با پیوند دادن به یک کتابخانهٔ دیگر تغییر دهید. علاوه بر این، هنگامی که یک تابع بهعنوان تابع توکار شناخته میشود، GCC ممکن است از اطلاعات مربوط به آن تابع برای هشدار دادن دربارهٔ اشکالات فراخوانیهای آن، یا تولید کد کارآمدتر استفاده کند، حتی اگر کد حاصل همچنان حاوی فراخوانی به آن تابع باشد. برای نمونه، هشدارهایی با -Wformat برای فراخوانیهای نادرست به "printf" داده میشود هنگامی که "printf" توکار است و مشخص است که "strlen" حافظهٔ سراسری را تغییر نمیدهد.
با گزینهٔ -fno-builtin-function فقط تابع توکار function غیرفعال میشود. نام function نباید با __builtin_ آغاز شود. اگر تابعی نام برده شود که در این نسخه از GCC توکار نباشد، این گزینه نادیده گرفته میشود. گزینهٔ معادل -fbuiltin-function وجود ندارد؛ اگر مایلید هنگام استفاده از -fno-builtin یا -ffreestanding توابع توکار را بهصورت انتخابی فعال کنید، میتوانید ماکروهایی نظیر این تعریف کنید: #define abs(n) __builtin_abs ((n)) #define strcpy(d, s) __builtin_strcpy ((d), (s))
- -fcond-mismatch
- عبارات شرطی با نوعهای ناسازگار در آرگومانهای دوم و سوم را مجاز میکند. مقدار چنین عبارتی void است. این گزینه برای C++ پشتیبانی نمیشود.
- -ffreestanding
- مشخص میکند که هدف کامپایل، یک محیط مستقل (freestanding) است. این گزینه متضمن -fno-builtin است. محیط مستقل محیطی است که در آن ممکن است کتابخانهٔ استاندارد وجود نداشته باشد و نقطهٔ شروع برنامه لزوماً تابع "main" نباشد. بارزترین نمونهٔ آن، هستهٔ سیستمعامل است. این گزینه معادل -fno-hosted است.
- -fgimple
- تجزیهٔ تعاریف توابعی را که با "__GIMPLE" نشانهگذاری شدهاند، فعال میکند. این یک ویژگی آزمایشی است که امکان آزمون واحد (unit testing) برای گذرگاههای GIMPLE را فراهم میآورد.
- -fgnu-tm
- هنگامی که
گزینهٔ -fgnu-tm
مشخص شود،
کامپایلر
کدی برای
گونهٔ
لینوکسی
سند مشخصات
جاری ABI
حافظهٔ
تراکنشی (Transactional
Memory) اینتل
(نگارش ۱.۱،
۶ مه ۲۰۰۹)
تولید
میکند. این
یک ویژگی
آزمایشی
است که با
تغییر
مشخصات
رسمی، ممکن
است رابط
کاربری آن
در
نسخههای
آیندهٔ GCC
تغییر کند.
لطفاً توجه
داشته
باشید که
این ویژگی
در همهٔ
معماریها
پشتیبانی
نمیشود.
برای اطلاعات بیشتر در مورد پشتیبانی GCC از حافظهٔ تراکنشی،
توجه داشته باشید که ویژگی حافظهٔ تراکنشی همراه با استثناهای غیرفراخوانی (-fnon-call-exceptions) پشتیبانی نمیشود.
- -fgnu89-inline
- گزینهٔ -fgnu89-inline
به GCC اعلام
میکند که
در حالت C99 از
معناشناسی
سنتی GNU برای
توابع
"inline"
استفاده
کند.
استفاده از این گزینه تقریباً معادل افزودن مشخصهٔ تابع "gnu_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" است. تقریباً همهٔ برنامهها به جز هسته، نمونههایی از آن هستند. این گزینه معادل -fno-freestanding است.
- -flax-vector-conversions
- تبدیلهای ضمنی میان بردارها با تعداد متفاوتی از عناصر و/یا نوعهای عناصر ناسازگار را مجاز میکند. این گزینه نباید برای کدهای جدید استفاده شود.
- -fms-extensions
- برخی از
ساختارهای
غیراستاندارد
مورد
استفاده در
فایلهای
سرآیند
مایکروسافت
را
میپذیرد.
در کد C++، این گزینه اجازه میدهد نامهای اعضا در ساختارها مشابه با اعلانهای انواع قبلی باشند.
typedef int UOW; struct ABC { UOW UOW; };برخی موارد فیلدهای بدون نام در ساختارها و اجتماعها تنها با این گزینه پذیرفته میشوند.
توجه داشته باشید که این گزینه برای تمام مقاصد، به جز مقاصد x86 که از ms-abi استفاده میکنند، غیرفعال است.
- -fpermitted-flt-eval-methods=style
- مشخصات ISO/IEC TS 18661-3
مقادیر
مجاز جدیدی
را برای
"FLT_EVAL_METHOD"
تعریف
میکند که
نشان
میدهند
عملیات و
مقادیر
ثابت با نوع
معناییِ
قالب
تبادلی یا
گسترشیافته
باید با دقت
و دامنهٔ آن
نوع
ارزیابی
شوند. این
مقادیر
جدید،
ابرمجموعهای
از مقادیر
مجاز تحت C99/C11
هستند، که
معنای سایر
مقادیر
مثبت
"FLT_EVAL_METHOD" را
مشخص
نمیکند. از
این رو،
ممکن است
کدهای
منطبق بر C11
بدون در نظر
گرفتن
احتمال
وجود
مقادیر
جدید نوشته
شده باشند.
گزینهٔ -fpermitted-flt-eval-methods مشخص میکند که کامپایلر باید تنها مقادیر "FLT_EVAL_METHOD" مشخصشده در C99/C11 را مجاز بداند، یا مجموعهٔ گسترشیافتهٔ مقادیر مشخصشده در ISO/IEC TS 18661-3 را نیز بپذیرد.
مقدار style بسته به مورد، یا "c11" است یا "ts-18661-3".
پیشفرض در حالت منطبق بر استاندارد (-std=c11 یا مشابه آن)، -fpermitted-flt-eval-methods=c11 است. پیشفرض در گویشهای GNU (-std=gnu11 یا مشابه آن)، -fpermitted-flt-eval-methods=ts-18661-3 است.
گزینههای -fdeps-* برای استخراج اطلاعات ساختیافتهٔ وابستگی برای یک مبدأ استفاده میشوند. این کار شامل تعیین این است که چه منابعی که توسط سایر فایلهای منبع ارائه شدهاند برای کامپایل این مبدأ لازم خواهند بود، و همچنین چه منابعی توسط خود این مبدأ ارائه میشوند. از این اطلاعات میتوان برای افزودن وابستگیهای لازم بین قواعد کامپایل مبداهای وابسته بر اساس محتوای آنها استفاده کرد، بدون اینکه نیاز باشد این اطلاعات در ابزارهای ساخت نیز منعکس شوند.
- -fdeps-file=file
- محل نوشتن اطلاعات ساختیافتهٔ وابستگی.
- -fdeps-format=format
- قالبی که برای اطلاعات ساختیافتهٔ وابستگی استفاده میشود. در حال حاضر p1689r5 تنها قالب پشتیبانیشده است. توجه داشته باشید که با مشخص شدن این آرگومان، خروجی -MF از برخی اطلاعات (بهویژه ماژولهای C++) خالی میشود تا از نحو توسعهیافتهٔ makefile که توسط بیشتر ابزارها پشتیبانی نمیشود، استفاده نکند.
- -fdeps-target=file
- مشابه -MT است اما برای اطلاعات ساختیافتهٔ وابستگی. این گزینه هدفی را مشخص میکند که در نهایت به هر منبع مورد نیازی احتیاج خواهد داشت و هر منبع استخراجشده از مبدأ را که ممکن است سایر مبدأها به آن نیاز داشته باشند، فراهم میسازد.
- -fplan9-extensions
- برخی از
ساختارهای
غیراستاندارد
بهکاررفته
در کد Plan 9 را
میپذیرد.
این گزینه -fms-extensions را فعال میکند، ارسال اشارهگر به ساختارهایی با فیلدهای بینام را به توابعی که انتظار اشارهگر به عناصری از نوع آن فیلد را دارند مجاز میسازد، و ارجاع به فیلدهای بینام اعلانشده با typedef را ممکن میکند. این گزینه تنها برای C پشتیبانی میشود، نه C++.
- -fsigned-bitfields
- -funsigned-bitfields
- -fno-signed-bitfields
- -fno-unsigned-bitfields
- این گزینهها کنترل میکنند که آیا یک فیلد بیتی (bit-field) بدون علامت است یا علامتدار، زمانی که در اعلان از هیچکدام از "signed" یا "unsigned" استفاده نشده باشد. بهطور پیشفرض، چنین فیلد بیتیای علامتدار است، زیرا با رفتار کلی سازگار است: انواع پایهٔ عدد صحیح مانند "int" انواع علامتدار هستند.
- -fsigned-char
- -funsigned-char
- گزینهٔ -fsigned-char
باعث
میشود نوع
"char"
مانند "signed
char"
علامتدار
باشد، در
حالی که -funsigned-char
باعث
میشود نوع
"char"
مانند "unsigned
char" بدون
علامت باشد.
توجه داشته باشید که -fsigned-char معادل -fno-unsigned-char است که صورت منفیِ -funsigned-char محسوب میشود. به همین ترتیب، گزینهٔ -fno-signed-char معادل -funsigned-char است.
هر مقصدی که توسط GCC پشتیبانی میشود، برای اینکه "char" چه باشد یک پیشفرض دارد که معمولاً در سند ABI مختص پردازنده برای آن مقصد مشخص میشود. این مقدار بهطور پیشفرض یا شبیه به "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 است که کمترین میزان سختگیری را دارد. در این حالت، تمام آرایههای انتهایی ساختارها به عنوان اعضای آرایهٔ انعطافپذیر تلقی میشوند.
دو سطح دیگر بین ۰ و ۳ وجود دارد که برای پشتیبانی از کدهای قدیمیتر ارائه شدهاند؛ کدهایی که از افزونهٔ آرایه با طول صفر GCC ([0]) یا آرایههای تکعضوی به عنوان اعضای آرایهٔ انعطافپذیر ([1]) استفاده میکنند. هنگامی که level برابر ۱ باشد، آرایهٔ انتهایی در صورتی به عنوان عضو آرایهٔ انعطافپذیر تلقی میشود که به صورت []، [0] یا [1] اعلان شده باشد. هنگامی که level برابر ۲ باشد، آرایهٔ انتهایی در صورتی به عنوان عضو آرایهٔ انعطافپذیر تلقی میشود که به صورت [] یا [0] اعلان شده باشد.
میتوانید این رفتار را برای یک فیلد آرایهٔ انتهاییِ مشخص از یک ساختار، با استفاده از صفت متغیر "strict_flex_array" کنترل کنید.
گزینهٔ -fstrict_flex_arrays با گزینهٔ -Wstrict-flex-arrays در تعامل است.
- -fsso-struct=endianness
- ترتیب
ذخیرهسازی
اسکالر
پیشفرضِ
ساختارها و
اجتماعها
را روی
ترتیب بایت
(endianness)
مشخصشده
تنظیم
میکند.
مقادیر
پذیرفتهشده
عبارتند از
big-endian، little-endian و native
برای ترتیب
بایت بومی
هدف
(پیشفرض).
این گزینه
برای C++
پشتیبانی
نمیشود.
هشدار: سویچ -fsso-struct در صورتی که ترتیب بایتِ مشخصشده با ترتیب بایتِ بومی هدف یکسان نباشد، باعث میشود GCC کدی تولید کند که با کدهای تولیدشده بدون این گزینه، سازگاری باینری ندارد.
گزینههای کنترلکنندهٔ لهجهٔ C++ (Options Controlling C++ Dialect)
این بخش گزینههای خط فرمانی را شرح میدهد که تنها برای برنامههای C++ معنادار هستند. همچنین فارغ از اینکه برنامهتان به چه زبانی نوشته شده است، میتوانید از بیشتر گزینههای کامپایلر GNU استفاده کنید. به عنوان مثال، ممکن است فایلی مانند firstClass.C را به این صورت کامپایل کنید:
g++ -g -fstrict-enums -O -c firstClass.C
در این مثال، تنها -fstrict-enums گزینهای است که منحصراً برای برنامههای C++ در نظر گرفته شده است؛ سایر گزینهها را میتوانید با هر زبانی که GCC پشتیبانی میکند به کار ببرید.
برخی از گزینههای کامپایل برنامههای C، مانند -std، برای برنامههای C++ نیز کاربرد دارند.
در اینجا فهرستی از گزینههایی آورده شده است که تنها برای کامپایل برنامههای C++ هستند:
- --compile-std-module
- رابطهای ماژول کامپایلشده را برای واحد سرایند <bits/stdc++.h> و ماژولهای std و std.compat، پیش از کامپایل هر فایل منبعی که صراحتاً در خط فرمان مشخص شده است، میسازد. هدف از این گزینه، کاربردی بودن برای ساخت برنامههای سادهای است که با یک دستور واحد از import std; استفاده میکنند.
- -fabi-version=n
- از نسخهٔ n
مربوط به C++ ABI
استفاده
میکند.
پیشفرض،
نسخهٔ 0 است.
نسخهٔ 0 به نسخهای اشاره دارد که بیشترین انطباق را با مشخصات C++ ABI دارد. بنابراین، ABI بهدستآمده با استفاده از نسخهٔ 0 با رفع باگهای ABI در نسخههای مختلف G++ تغییر خواهد کرد.
نسخهٔ 1 نسخهای از C++ ABI است که نخستین بار در G++ 3.2 ظاهر شد.
نسخهٔ 2 نسخهای از C++ ABI است که نخستین بار در G++ 3.4 ظاهر شد و تا G++ 4.9 نسخهٔ پیشفرض بود.
نسخهٔ 3 خطایی را در درهمسازی (mangling) یک آدرس ثابت به عنوان آرگومان الگو تصحیح میکند.
نسخهٔ 4، که نخستین بار در G++ 4.5 ظاهر شد، یک درهمسازی استاندارد برای نوعهای برداری پیادهسازی میکند.
نسخهٔ 5، که نخستین بار در G++ 4.6 ظاهر شد، درهمسازی صفت const/volatile روی نوعهای اشارهگر تابع، decltype یک اعلان ساده، و استفاده از یک پارامتر تابع در اعلان پارامتری دیگر را تصحیح میکند.
نسخهٔ 6، که نخستین بار در G++ 4.7 ظاهر شد، رفتار ارتقای (promotion) نوعهای شمارشی محدودهدارِ C++11 و درهمسازی بستههای آرگومان الگو، const/static_cast، عملگرهای پیشوندی ++ و --، و تابع در محدودهٔ کلاس مورد استفاده به عنوان آرگومان الگو را تصحیح میکند.
نسخهٔ 7، که نخستین بار در G++ 4.8 ظاهر شد، با nullptr_t به عنوان یک نوع توکار رفتار کرده و درهمسازی لامبداها را در محدودهٔ آرگومان پیشفرض تصحیح میکند.
نسخهٔ 8، که نخستین بار در G++ 4.9 ظاهر شد، رفتار جایگزینی نوعهای تابع با توصیفکنندههای cv تابع (function-cv-qualifiers) را تصحیح میکند.
نسخهٔ 9، که نخستین بار در G++ 5.2 ظاهر شد، همترازی "nullptr_t" را تصحیح میکند.
نسخهٔ 10، که نخستین بار در G++ 6.1 ظاهر شد، درهمسازی صفتهایی را اضافه میکند که بر هویت نوع تأثیر میگذارند، مانند صفتهای قرارداد فراخوانی ia32 (مانند stdcall).
نسخهٔ 11، که نخستین بار در G++ 7 ظاهر شد، درهمسازی عبارتهای ...sizeof و نام عملگرها را تصحیح میکند. برای چندین موجودیت با نام یکسان درون یک تابع که در محدودههای متفاوتی اعلان شدهاند، درهمسازی اکنون از دوازدهمین رخداد به بعد تغییر میکند. همچنین نشانگر فعال بودن -fnew-inheriting-ctors است.
نسخهٔ 12، که نخستین بار در G++ 8 ظاهر شد، قراردادهای فراخوانی برای کلاسهای خالی در هدف x86_64 و برای کلاسهایی که تنها دارای سازندههای رونوشت/انتقال حذفشده هستند را تصحیح میکند. این نسخه به طور تصادفی قرارداد فراخوانی را برای کلاسهایی با یک سازندهٔ رونوشت حذفشده و یک سازندهٔ انتقال ناچیز (trivial) تغییر میدهد.
نسخهٔ 13، که نخستین بار در G++ 8.2 ظاهر شد، تغییر تصادفی در نسخهٔ 12 را برطرف میکند.
نسخهٔ 14، که نخستین بار در G++ 10 ظاهر شد، درهمسازی عبارت nullptr را تصحیح میکند.
نسخهٔ 15، که نخستین بار در G++ 10.3 ظاهر شد، پسرفت (regression) برچسب ABI در G++ 10 را برطرف میکند.
نسخهٔ 16، که نخستین بار در G++ 11 ظاهر شد، درهمسازی "__alignof__" را تغییر میدهد تا از "alignof" و نامهای عملگر وابسته متمایز باشد.
نسخهٔ 17، که نخستین بار در G++ 12 ظاهر شد، چیدمان کلاسهایی را که در C++14 به بالا از کلاسهای تجمیعی (aggregate) با مقداردهندههای اولیهٔ پیشفرضِ عضو ارثبری میکنند، تصحیح میکند.
نسخهٔ 18، که نخستین بار در G++ 13 ظاهر شد، درهمسازی لامبداهایی را که دارای زمینهٔ اضافی هستند تصحیح میکند.
نسخهٔ 19، که نخستین بار در G++ 14 ظاهر شد، درهمسازی مقیدسازیهای ساختاریافته را به گونهای که شامل برچسبهای ABI باشند اصلاح میکند، مدیریت اعضای cv-qualified دارای [[no_unique_address]] را تصحیح کرده و درهمسازی قیود C++20 را روی الگوهای تابع اضافه میکند.
نسخهٔ 20، که نخستین بار در G++ 15 ظاهر شد، درهمسازی لامبداها را در مقداردهندههای اولیهٔ عضو دادهای ایستا تصحیح میکند.
نسخهٔ 21، که نخستین بار در G++ 16 ظاهر شد، شکار غیرضروری متغیرها در لامبداهای noexcept به شمارهٔ (c++/119764)، چیدمان یک کلاس پایه با تمام سازندههای صراحتاً پیشفرضشده به شمارهٔ (c++/120012)، و درهمسازی اشیای کلاس و آرایه با زیراشیای غیرانتهایی که به طور ضمنی با صفر مقداردهی اولیه شدهاند به شمارهٔ (c++/121231) را تصحیح میکند.
همچنین ببینید: -Wabi.
- -fabi-compat-version=n
- در
هدفهایی
که از
نامهای
مستعار قوی
(strong aliases)
پشتیبانی
میکنند، G++
تغییرات
درهمسازی
را با ایجاد
یک نام
مستعار با
نام
درهمسازیشدهٔ
صحیح،
هنگام
تعریف یک
نماد با نام
درهمسازیشدهٔ
نادرست،
دور میزند.
این سویچ
مشخص
میکند که
کدام نسخهٔ
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 را برای
انواعی که
به
همترازی
بیشتری
نسبت به
آنچه "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" در کد قابل مشاهده باشد یا از قلابهای "malloc" استفاده شده باشد؛ اما اگر برنامهای این عملگرها را جایگزین کند، ممکن است برآورده نشود. این رفتار بهطور پیشفرض فعال است. با گزینهٔ "-fno-assume-sane-operators-new-delete" کامپایلر GCC باید فرض کند که تمام این فراخوانیها (چه از عبارتهای new یا delete باشند یا مستقیماً فراخوانی شوند) ممکن است وضعیت سراسری را بخوانند و بنویسند، مگر اینکه خلاف آن ثابت شود (مثلاً زمانی که GCC پیادهسازی آنها را کامپایل میکند). اگر این عملگرها جایگزین شدهاند یا ممکن است جایگزین شوند و کد باید انتظار چنین رفتاری را داشته باشد، از این گزینه استفاده کنید.
- -fchar8_t
- -fno-char8_t
- پشتیبانی
از "char8_t"
را
همانطور
که برای C++20
تصویب شده
است فعال
میکند. این
شامل
افزودن نوع
بنیادین
جدید
"char8_t"،
تغییر در
انواع
لیترالهای
رشتهای و
نویسهای
UTF-8، امضاهای
جدید برای
لیترالهای
تعریفشده
توسط
کاربر،
بهروزرسانیهای
مرتبط در
کتابخانهٔ
استاندارد،
و ماکروهای
آزمون
ویژگیِ
جدید
"__cpp_char8_t" و
"__cpp_lib_char8_t"
است.
این گزینه امکان اورلود (overload) توابع را برای رشتههای معمولی و UTF-8 فراهم میسازد:
int f(const char *); // #1 int f(const char8_t *); // #2 int v1 = f("text"); // Calls #1 int v2 = f(u8"text"); // Calls #2و امضاهای جدیدی برای لیترالهای تعریفشده توسط کاربر معرفی میکند:
int operator""_udl1(char8_t); int v3 = u8'x'_udl1; int operator""_udl2(const char8_t*, std::size_t); int v4 = u8"text"_udl2; template<typename T, T...> int operator""_udl3(); int v5 = u8"text"_udl3;
تغییر انواع لیترالهای رشتهای و نویسهای UTF-8 ناسازگاریهایی با ISO C++11 و استانداردهای بعدی ایجاد میکند. برای نمونه، کد زیر تحت ISO C++11 کاملاً خوشساخت (well-formed) است، اما در صورت تعیین -fchar8_t بدساخت (ill-formed) محسوب میشود.
const char *cp = u8"xx";// error: invalid conversion from // `const char8_t*' to `const char*' int f(const char*); auto v = f(u8"xx"); // error: invalid conversion from // `const char8_t*' to `const char*' std::string s{u8"xx"}; // error: no matching function for call to // `std::basic_string<char>::basic_string()' using namespace std::literals; s = u8"xx"s; // error: conversion from // `basic_string<char8_t>' to non-scalar // type `basic_string<char>' requested - -fcheck-new
- بررسی میکند که اشارهگر بازگردانده شده توسط "operator new" پیش از تلاش برای تغییر فضای ذخیرهسازی تخصیصیافته، تهی (null) نباشد. این بررسی معمولاً غیرضروری است زیرا استاندارد C++ تعیین میکند که "operator new" تنها در صورتی 0 بازمیگرداند که با throw() اعلان شده باشد، که در آن صورت کامپایلر حتی بدون این گزینه نیز همواره مقدار بازگشتی را بررسی میکند. در تمام موارد دیگر، هنگامی که "operator new" مشخصهٔ استثنای غیرخالی دارد، اتمام حافظه با پرتاب "std::bad_alloc" اعلام میشود. همچنین new (nothrow) را ببینید.
- -fconcepts
- پشتیبانی
از ویژگی C++ Concepts
را برای
مقید کردن
آرگومانهای
الگو فعال
میکند. در
-std=c++20 و
بالاتر،
مفاهیم
بخشی از
استاندارد
زبان
هستند،
بنابراین
-fconcepts بهطور
پیشفرض
روشن است.
برخی از ساختارهایی که توسط مشخصات فنی قبلی «پسوندهای C++ برای مفاهیم»، ISO 19217 (2015) مجاز بودند اما به استاندارد راه نیافتند، میتوانستند علاوه بر این با -fconcepts-ts فعال شوند. گزینهٔ -fconcepts-ts در GCC 14 منسوخ شد و در GCC 15 حذف گردید؛ انتظار میرود کاربران کدهای خود را به مفاهیم C++20 ارتقا دهند.
- -fconcepts-diagnostics-depth=n
- حداکثر عمق بازپخش خطا را در حین عیبیابی بازگشتیِ شکست در برآورده شدن یک قید مشخص میکند. مقدار پیشفرض 1 است.
- -fconstexpr-depth=n
- حداکثر عمق ارزیابی تودرتو را برای توابع constexpr در C++11 روی n تنظیم میکند. برای تشخیص بازگشت بیپایان در حین ارزیابی عبارت ثابت، وجود یک محدودیت لازم است. حداقل تعیینشده توسط استاندارد 512 است.
- -fconstexpr-cache-depth=n
- حداکثر سطح عمق ارزیابی تودرتو برای توابع constexpr در C++11 که در حافظهٔ موقت ذخیره (cache) میشوند را روی n تنظیم میکند. این یک راهکار شهودی است که تعادلی بین سرعت کامپایل (زمانی که کَش مانع از محاسبات تکراری میشود) و مصرف حافظه (زمانی که کَش به دلیل ارزیابیهای بسیار بازگشتی بسیار بزرگ میشود) برقرار میکند. مقدار پیشفرض 8 است. احتمالاً کاربران بسیار کمی نیاز به تنظیم آن خواهند داشت، اما اگر کد شما محاسبات سنگین constexpr انجام میدهد، ممکن است بخواهید برای یافتن مقداری که بهترین بازدهی را دارد آزمایش کنید.
- -fconstexpr-fp-except
- پیوست F از
استاندارد C
مشخص
میکند که
استثناهای
ممیز شناور
IEC559 که در زمان
کامپایل رخ
میدهند
نباید
کامپایل را
متوقف کنند.
کامپایلرهای
C++ در طول
تاریخ این
راهنما را
دنبال
نکردهاند
و در عوض
تقسیم ممیز
شناور بر
صفر را، با
وجود داشتن
یک مقدار
معین،
غیرثابت در
نظر
گرفتهاند.
این پرچم به
کامپایلر
میگوید که
به پیوست F
نسبت به
سایر
قوانینی که
یک عملیات
خاص را
تعریفنشده
میدانند
اولویت دهد.
constexpr float inf = 1./0.; // OK with -fconstexpr-fp-except
- -fconstexpr-loop-limit=n
- حداکثر تعداد تکرارهای یک حلقه در توابع constexpr در C++14 را روی n تنظیم میکند. برای تشخیص حلقههای بینهایت در طول ارزیابی عبارت ثابت، یک محدودیت لازم است. مقدار پیشفرض 262144 (1<<18) است.
- -fconstexpr-ops-limit=n
- حداکثر تعداد عملیاتها را در طول یک ارزیابی منفردِ constexpr مشخص میکند. حتی زمانی که تعداد تکرارهای یک حلقه منفرد با محدودیت بالا محدود شده باشد، در صورتی که چندین حلقهٔ تودرتو وجود داشته باشد و هر یک تکرارهای زیادی کمتر از محدودیت فوق داشته باشند، یا اگر در بدنهٔ یک حلقه یا خارج از آن عبارات بسیار زیادی نیاز به ارزیابی داشته باشند، ارزیابی constexpr ممکن است بیش از حد به درازا بینجامد. مقدار پیشفرض 33554432 (1<<25) است.
- -fcontracts
- پشتیبانی
از ویژگی
قراردادهای
C++ (Contracts) را طبق
پیشنویس
کاری C++26 (N5003)
فعال
میکند.
در هنگام نقض یک قرارداد اعمالشده یا مشاهدهشده (به -fcontract-evaluation-semantic در زیر مراجعه کنید)، یک گردانندهٔ نقض فراخوانی میشود؛ کتابخانهٔ استاندارد یک گردانندهٔ پیشفرض ارائه میدهد که اطلاعاتی در مورد قراردادی که ناموفق بوده است منتشر میکند.
کاربران میتوانند با تعریف تابع زیر، گردانندهٔ پیشفرض نقض را جایگزین کنند:
void handle_contract_violation (const std::contracts::contract_violation&);
- -fcontract-evaluation-semantic=semantic
- معناشناسیای
که
قراردادها
بر اساس آن
ارزیابی
میشوند را
روی semantic
تنظیم
میکند.
مقادیر موجود برای حالت ارزیابی عبارتند از:
'"ignored"' بررسیهای قرارداد نادیده گرفته میشوند، و هیچ بررسی در زمان کامپایل یا زمان اجرا اضافه نخواهد شد.
'"observed"' بررسیهای قرارداد انجام میشوند (در زمان اجرا) و در صورت شکست، گردانندهای فراخوانی میشود که امکان انجام اقداماتی مانند ثبت وقایع یا صدور هشدارهای زمان اجرا را فراهم میآورد. با بازگشت گرداننده، اجرای کد ادامه مییابد. در زمان کامپایل، بررسیها برای ارزیابیهای "constexpr" انجام میشوند که در این صورت با شکست بررسی، یک پیام تشخیصی صادر میشود.
'"enforce"' بررسیهای قرارداد انجام شده و در صورت شکست، گرداننده فراخوانی میشود. با بازگشت گرداننده، اجرای کد پایان مییابد تا از ادامهٔ روند پس از وضعیت ناموفق جلوگیری شود. در زمان کامپایل، این بررسیها روی "constexpr" اعمال میشوند و در صورت شکست، برنامه بدساخت (ill-formed) محسوب شده و خطایی صادر میشود.
'"quick_enforce"' بررسیهای قرارداد انجام میشوند (در زمان اجرا) و در صورت شکست، اجرای کد فوراً (بدون فراخوانی هیچ گردانندهای) خاتمه مییابد. در زمان کامپایل هیچ تفاوتی در رفتار بین این گزینه و حالت "enforce" وجود ندارد، چرا که در زمان کامپایل هیچ گردانندهای فراخوانی نمیشود..IP -fcontracts-conservative-ipa 4 این گزینه از اقدام «تحلیل بینرویهای» (IPA) در زمانی که بدنه یک تابع inline در یک TU معین قابل مشاهده است، جلوگیری میکند. این کار شرایطی را پوشش میدهد که در آن شرایط ارزیابی قراردادها مجاز به تفاوت بین TUها هستند، به این معنی که چنین اقداماتی بالقوه نادرست خواهند بود.
- -fcontract-checks-outlined
- بهطور پیشفرض، بررسیهای قرارداد برای شرایط "pre" و "post" بهصورت درونخطی در بدنه توابع بسط مییابند. این گزینه باعث میشود در عوض یک تابع کوچک (شامل بررسیها) ایجاد شود که در موقعیت مربوطه فراخوانی گردد. این امر اجازه میدهد معیارهای متفاوتی برای کامپایل بخش بررسی و باقیمانده بدنه تابع اعمال شود.
- -fcontract-disable-optimized-checks
- هنگامی که بررسیهای شرایط "pre" و "post" برونخطی (outlined) میشوند (با استفاده از -fcontract-checks-outlined)، این گزینه مراحل بهینهسازی را برای آن توابع غیرفعال میکند که میتواند از حذف ناخواسته مراحل بررسی جلوگیری کند.
- -fcontracts-client-check=mode
- این گزینه
درج
بررسیها
را در
محلهای
فراخوانی
(بررسی در
سمت
فراخواننده)
فعال
میکند.
مقدار mode مشخص میکند که کدام بررسیهای قرارداد انجام شوند: '"none"' بدون بررسی در سمت فراخواننده/کلاینت (پیشفرض)
'"pre"' پیششرطها در سمت فراخواننده/کلاینت بررسی میشوند.
'"all"' هر دو مورد پیششرطها و پسشرطها در سمت فراخواننده/کلاینت بررسی میشوند.
- -fcontracts-definition-check=mode
- این گزینه
قابلیت
غیرفعال
کردن
بررسیهای
سمت
فراخوانده/تعریف
را فراهم
میکند، که
در غیر این
صورت هنگام
فعال بودن
ویژگی
قراردادها
بهطور
پیشفرض
فعال هستند.
متغیر mode مقادیر '"on"' و '"off"' را میپذیرد.
- -fcoroutines
- پشتیبانی از افزونهٔ C++ coroutines را فعال میکند. در -std=c++20 و بالاتر، coroutines بخشی از استاندارد زبان هستند، بنابراین -fcoroutines بهطور پیشفرض فعال است.
- -fdiagnostics-all-candidates
- به فرانتاند C++ اجازه میدهد هنگام شکست در تفکیک بارگذاری بیش از حد (overload resolution)، همه نامزدها را ثبت کند، از جمله زمانی که یک تابع حذفشده (deleted function) انتخاب شده باشد.
- -fdump-lang-
- -fdump-lang-switch
- -fdump-lang-switch-options
- -fdump-lang-switch-options=filename
- تخلیهٔ اطلاعات مختص C++ را کنترل میکند. بخشهای options و filename همانطور که در گزینهٔ -fdump-tree شرح داده شده است عمل میکنند. مقادیر زیر برای switch پذیرفته میشوند:
- all
- تمام موارد زیر را فعال میکند.
- class
- اطلاعات سلسلهمراتب کلاس را تخلیه میکند. اطلاعات جدول مجازی صادر میشود مگر آنکه 'slim' مشخص شده باشد.
- module
- اطلاعات ماژول را تخلیه میکند. گزینههای lineno (مکانها)، graph (دسترسپذیری)، blocks (خوشهها)، uid (سریالسازی)، alias (قابل ادغام)، asmname (مربوط به Elrond)، eh (نگاشتکننده) و vops (ماکروها) ممکن است اطلاعات بیشتری ارائه دهند.
- raw
- دادههای خام درخت داخلی را تخلیه میکند.
- tinst
- دنباله
نمونهسازیهای
الگو را به
صورت
تورفته
برای نمایش
عمق بازگشت
تخلیه
میکند.
گزینهٔ lineno
مکان
مبدأیی را
که
نمونهسازی
در آن رخ
داده اضافه
میکند، و
گزینهٔ details
همچنین
جایگزینیهای
پیش از
نمونهسازی،
مانند
موارد
انجامشده
در حین
استنتاج
آرگومان
الگو را
تخلیه
میکند.
سطرها در خروجی tinst. با I برای یک نمونهسازی، S برای یک جایگزینی دیگر، و R[IS] برای زمینه بازگشاییشده از یک نمونهسازی بهتعویقافتاده شروع میشوند.
- -fno-elide-constructors
- استاندارد
C++ به
پیادهسازی
اجازه
میدهد از
ایجاد شیء
موقتی که
صرفاً برای
مقداردهی
اولیه شیء
دیگری از
همان نوع
استفاده
میشود،
صرفنظر
کند. تعیین
این گزینه
آن
بهینهسازی
را غیرفعال
کرده و G++ را
مجبور
میکند
سازنده
رونوشت را
در همه
موارد
فراخوانی
کند. این
گزینه
همچنین
باعث
میشود G++
توابع عضو
بدیهی را
فراخوانی
کند که در
غیر این
صورت
بهصورت
درونخطی
بسط داده
میشدند.
در C++17، کامپایلر موظف است از این اشیاء موقت صرفنظر کند، اما این گزینه همچنان بر توابع عضو بدیهی تأثیر میگذارد.
- -fno-enforce-eh-specs
- کدی برای بررسی نقض مشخصات استثنا در زمان اجرا تولید نمیکند. این گزینه استاندارد C++ را نقض میکند، اما ممکن است برای کاهش اندازه کد در ساختهای نهایی، همانند تعریف "NDEBUG" مفید باشد. این کار به کد کاربر اجازه پرتاب استثناها بر خلاف مشخصات استثنا را نمیدهد؛ کامپایلر همچنان بر اساس مشخصات بهینهسازی را انجام میدهد، بنابراین پرتاب یک استثنای غیرمنتظره منجر به رفتار تعریفنشده در زمان اجرا خواهد شد.
- -fextern-tls-init
- -fno-extern-tls-init
- استانداردهای
C++11 و OpenMP به
متغیرهای
"thread_local" و
"threadprivate"
اجازه
میدهند
دارای
مقداردهی
اولیه پویا
(زمان اجرا)
باشند. برای
پشتیبانی
از این
ویژگی،
هرگونه
استفاده از
چنین
متغیری از
طریق یک
تابع پوششی
انجام
میشود که
مقداردهی
اولیه لازم
را انجام
میدهد.
هنگامی که
استفاده و
تعریف
متغیر در یک
واحد ترجمه
باشند، این
بار اضافه
میتواند
با
بهینهسازی
حذف شود،
اما هنگامی
که استفاده
در یک واحد
ترجمه دیگر
باشد، بار
اضافهٔ
قابل توجهی
وجود دارد
حتی اگر
متغیر در
واقع نیازی
به
مقداردهی
اولیه پویا
نداشته
باشد. اگر
برنامهنویس
اطمینان
داشته باشد
که هیچ
استفادهای
از متغیر در
یک TU
غیرتعریفکننده
نیازی به
راهاندازی
مقداردهی
اولیه پویا
ندارد (خواه
به این دلیل
که متغیر
بهصورت
ایستا
مقداردهی
اولیه شده
است، یا
استفاده از
متغیر در TU
تعریفکننده
پیش از هر
استفادهای
در TU دیگر
اجرا خواهد
شد)،
میتواند
با استفاده
از گزینهٔ
-fno-extern-tls-init از این
بار اضافه
جلوگیری
کند.
در مقصدهایی که از نامهای مستعار نماد پشتیبانی میکنند، مقدار پیشفرض -fextern-tls-init است. در مقصدهایی که از نامهای مستعار نماد پشتیبانی نمیکنند، مقدار پیشفرض -fno-extern-tls-init است.
- -ffold-simple-inlines
- -fno-fold-simple-inlines
- به فرانتاند C++ اجازه میدهد فراخوانیهای "std::move"، "std::forward"، "std::addressof"، "std::to_underlying" و "std::as_const" را فشرده/تا کند. برخلاف درونخطیسازی، این بدان معناست که هیچ اطلاعات اشکالزدایی برای چنین فراخوانیهایی تولید نخواهد شد. از آنجا که این توابع بهندرت برای اشکالزدایی مورد توجه هستند، این پرچم بهطور پیشفرض فعال است مگر اینکه -fno-inline فعال باشد.
- -fno-gnu-keywords
- کلمهٔ کلیدی "typeof" را بهعنوان کلیدواژه شناسایی نمیکند، تا کد بتواند از این کلمه به عنوان یک شناسه استفاده کند. میتوانید به جای آن از کلیدواژه "__typeof__" استفاده کنید. این گزینه بهصورت ضمنی در گویشهای سختگیرانهٔ ISO C++ فعال است: -ansi، -std=c++98، -std=c++11 و غیره.
- -fno-immediate-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) در یک بافت فوری قرار دارد، بنابراین مجبور نیست یک مقدار ثابت تولید کند (این همان سازوکاری است که امکان ترکیب توابع consteval را فراهم میسازد). با این حال، با -fno-immediate-escalation، تابع "f" به "consteval" ترفیع نمییابد، و از آنجا که فراخوانی تابع consteval یعنی id(t) یک عبارت ثابت نیست، کامپایلر کد را رد میکند.
این گزینه بهطور پیشفرض فعال است؛ این گزینه تنها در حالت C++20 یا بالاتر مؤثر است..IP -fimplicit-constexpr 4 توابع inline را در صورتی که نیازمندیهای یک تابع constexpr را برآورده کنند، به طور ضمنی constexpr میکند. این گزینه میتواند در حالت C++14 یا بالاتر استفاده شود. این امر میتواند منجر به تغییر مقداردهی اولیه از پویا (dynamic) به ایستا (static) و سایر بهینهسازیها گردد.
- -fno-implicit-templates
- هرگز کدی برای الگوهای غیر inline که به صورت ضمنی نمونهسازی میشوند (یعنی از طریق استفاده)، تولید نمیکند؛ تنها برای نمونهسازیهای صریح کد تولید میکند. اگر از این گزینه استفاده میکنید، باید مراقب باشید که کد خود را طوری ساختاردهی کنید تا شامل تمام نمونهسازیهای صریح لازم باشد و در زمان پیوند با نمادهای تعریفنشده (undefined symbols) مواجه نشوید.
- -fno-implicit-inline-templates
- برای نمونهسازیهای ضمنی الگوهای inline نیز کدی تولید نمیکند. حالت پیشفرض این است که با توابع inline به طور متفاوتی رفتار شود تا کامپایل با یا بدون بهینهسازی، به مجموعه یکسانی از نمونهسازیهای صریح نیاز داشته باشد.
- -fno-implement-inlines
- برای صرفهجویی در فضا، رونوشتهای خارج از خط (out-of-line) توابع inline که توسط "#pragma implementation" کنترل میشوند را تولید نمیکند. این امر در صورتی که این توابع در تمام مکانهای فراخوانی درونخطی (inline) نشوند، باعث خطاهای پیونددهنده میشود.
- -fmodules
- -fno-modules
- پشتیبانی از ماژولهای C++20 را فعال میکند. گزینه -fno-modules معمولاً نیاز نیست، زیرا حالت پیشفرض است. با وجود اینکه این یک ویژگی C++20 است، در حال حاضر با انتخاب این نسخه از استاندارد به طور ضمنی فعال نمیشود.
- -fmodule-header
- -fmodule-header=user
- -fmodule-header=system
- یک فایل هدر را برای ایجاد یک واحد هدر (header unit) قابل وارد کردن، کامپایل میکند.
- -fmodule-implicit-inline
- توابع عضوی که درون تعریف کلاس خود تعریف شدهاند، در کدهای ماژولار به طور ضمنی inline در نظر گرفته نمیشوند. این تفاوت با رفتار سنتی C++، به دلایل موجهی اعمال شده است. با این حال، ممکن است در هنگام پورت کردن کد باعث ایجاد مشکل شود. این گزینه چنین تعاریف تابعی را به طور ضمنی 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 استفاده میشود و اگر آن هم تنظیم نشده باشد، یک پیشفرض درونفرآیندی ارائه میگردد.
- -fmodule-only
- تنها رابط ماژول کامپایلشده (Compiled Module Interface) را تولید میکند و از ایجاد هرگونه فایل شیء جلوگیری مینماید.
- -fms-extensions
- هشدارهای Wpedantic را در مورد ساختارهای بهکاررفته در MFC، مانند int ضمنی و گرفتن اشارهگر به تابع عضو از طریق نحو غیر استاندارد، غیرفعال میکند.
- -fnew-inheriting-ctors
- تعدیل P0136 در معناشناسی وراثت سازنده C++11 را فعال میکند. این بخشی از C++17 است اما همچنین به عنوان یک گزارش نقص (Defect Report) علیه C++11 و C++14 در نظر گرفته میشود. این پرچم به طور پیشفرض فعال است مگر اینکه -fabi-version=10 یا پایینتر مشخص شده باشد.
- -fnew-ttp-matching
- راهحل P0522 را برای مشکل اصلی ۱۵۰ (Core issue 150)، پارامترهای قالب الگویی و آرگومانهای پیشفرض فعال میکند: این به یک الگو با آرگومانهای الگوی پیشفرض اجازه میدهد تا به عنوان آرگومانی برای یک پارامتر قالب الگویی با پارامترهای الگوی کمتر استفاده شود. این پرچم به طور پیشفرض برای -std=c++17 فعال است.
- -fno-nonansi-builtins
- اعلانهای توکار (built-in) توابعی که توسط ANSI/ISO C الزامی نشدهاند را غیرفعال میکند. این شامل "ffs"، "alloca"، "_exit"، "index"، "bzero"، "conjf" و سایر توابع مرتبط است.
- -fnothrow-opt
- با مشخصه استثنای throw() به گونهای رفتار میکند که گویی یک مشخصه "noexcept" است تا سربار اندازه متن (text size) را در مقایسه با تابعی بدون مشخصه استثنا، کاهش دهد یا حذف کند. اگر تابع دارای متغیرهای محلی با نوعهایی باشد که تخریبکنندههای (destructors) غیربدیهی دارند، این مشخصه استثنا در واقع تابع را کوچکتر میکند زیرا پاکسازیهای EH برای آن متغیرها میتواند از طریق بهینهسازی حذف شود. اثر معنایی این است که پرتاب استثنا به بیرون از تابعی با چنین مشخصه استثنایی منجر به فراخوانی "terminate" به جای "unexpected" میشود.
- -fno-operator-names
- کلمات کلیدی نام عملگر شامل "and"، "bitand"، "bitor"، "compl"، "not"، "or" و "xor" را به عنوان کلمات کلیدی مترادف در نظر نمیگیرد.
- -fno-optional-diags
- تشخیصهایی که استاندارد میگوید نیازی به صدور آنها توسط کامپایلر نیست را غیرفعال میکند. در حال حاضر، تنها تشخیصی از این دست که توسط 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 و بالاتر، این بخشی از استاندارد زبان است، بنابراین طول عمر متغیرهای موقت به طور پیشفرض تا پایان حلقه تمدید میشود. این گزینه امکان فعالسازی این رفتار را در نسخههای پیشین استاندارد نیز فراهم میکند.
- -freflection
- ویژگی آزمایشی بازتاب (Reflection) در C++26 را فعال میکند.
- -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) برای تبدیل یک مقدار صحیح دلخواه به نوع شمارشی استفاده کند، ممکن است این فرض معتبر نباشد. این گزینه برای یک نوع شمارشی با نوع زیرین (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 تنظیم میکند. مقدار پیشفرض ۱۰ است.
- -ftemplate-depth=n
- حداکثر عمق نمونهسازی برای کلاسهای الگو را روی n تنظیم میکند. تعیین محدودیت روی عمق نمونهسازی الگو برای تشخیص بازگشتهای بیپایان در حین نمونهسازی کلاس الگو ضروری است. برنامههای منطبق با ANSI/ISO C++ نباید به عمق حداکثری بیش از ۱۷ متکی باشند (در C++11 به ۱۰۲۴ تغییر یافت). مقدار پیشفرض ۹۰۰ است، چرا که کامپایلر ممکن است در برخی شرایط پیش از رسیدن به ۱۰۲۴ با کمبود فضای پشته (stack space) مواجه شود.
- -fno-threadsafe-statics
- کد اضافی لازم برای استفاده از روتینهای مشخصشده در C++ ABI جهت مقداردهی اولیهٔ متغیرهای محلی ایستای امن برای نخها (thread-safe initialization of local statics) را تولید نمیکند. میتوانید از این گزینه برای کاهش جزئی اندازهٔ کد در کدهایی که نیازی به امنیت نخها ندارند استفاده کنید.
- -fuse-cxa-atexit
- مخربها (destructors) را برای اشیائی با طول عمر ذخیرهسازی ایستا با تابع "__cxa_atexit" به جای تابع "atexit" ثبت میکند. این گزینه برای مدیریت کاملاً منطبق با استاندارد مخربهای ایستا مورد نیاز است، اما تنها در صورتی کار میکند که کتابخانهٔ C شما از "__cxa_atexit" پشتیبانی کند.
- -fno-use-cxa-get-exception-ptr
- از روتین زمان اجرای "__cxa_get_exception_ptr" استفاده نمیکند. این امر باعث نادرست کار کردن "std::uncaught_exception" میشود، اما در صورتی که این روتین زمان اجرا در دسترس نباشد، ضروری است.
- -fvisibility-inlines-hidden
- این سوییچ
اعلام
میکند که
کاربر قصد
مقایسهٔ
اشارهگرها
به توابع یا
متدهای
درونخطی (inline)
را در
مواردی که
آدرسهای
دو تابع در
اشیاء
مشترک (shared objects)
متفاوتی
گرفته
شدهاند،
ندارد.
اثر این کار این است که GCC میتواند در عمل، متدهای inline را با "__attribute__ ((visibility ("hidden")))" نشانهگذاری کند تا در جدول صادرات (export table) یک DSO ظاهر نشوند و هنگام استفاده در درون DSO نیازی به ارجاع غیرمستقیم PLT نداشته باشند. فعال کردن این گزینه میتواند تأثیر چشمگیری بر زمان بارگذاری و پیوند یک DSO بگذارد، چرا که در صورت استفادهٔ زیاد کتابخانه از الگوها، اندازهٔ جدول صادرات پویا را بهشدت کاهش میدهد.
رفتار این سوییچ دقیقاً مشابه نشانهگذاری مستقیم متدها به عنوان hidden نیست، چرا که بر متغیرهای ایستای محلی تابع تأثیری ندارد و باعث نمیشود کامپایلر استنباط کند که تابع تنها در یک شیء مشترک تعریف شده است.
میتوانید یک متد را بهطور صریح با یک سطح پدیداری (visibility) نشانهگذاری کنید تا اثر این سوییچ را برای آن متد خنثی سازید. برای نمونه، اگر میخواهید اشارهگرها به یک متد درونخطی خاص را مقایسه کنید، میتوانید آن را دارای پدیداری default نشانهگذاری کنید. نشانهگذاری کلاس دربرگیرنده با پدیداری صریح هیچ تأثیری ندارد.
متدهای درونخطی که بهطور صریح نمونهسازی شدهاند تحت تأثیر این گزینه قرار نمیگیرند، چرا که پیوند آنها در غیر این صورت ممکن است از مرز یک کتابخانهٔ مشترک عبور کند.
- -fvisibility-ms-compat
- این پرچم
تلاش
میکند با
استفاده از
تنظیمات
پدیداری،
مدل پیوند (linkage
model) زبان C++ در GCC
را با مدل Microsoft
Visual Studio سازگار
کند.
این پرچم این تغییرات را در مدل پیوند GCC ایجاد میکند:
- 1.
- پدیداری پیشفرض را مانند -fvisibility=hidden روی "hidden" تنظیم میکند.
- 2.
- نوعها (types)، اما نه اعضای آنها، بهطور پیشفرض پنهان نیستند.
- 3.
- قاعدهٔ تکتعریفی (One Definition Rule یا ODR) برای نوعهای فاقد مشخصات پدیداری صریح که در بیش از یک شیء مشترک تعریف شدهاند تسهیل میشود: این اعلانها در صورتی مجاز هستند که در حالت عدم استفاده از این گزینه نیز مجاز باشند.
در کدهای جدید بهتر است از -fvisibility=hidden استفاده کرده و آن کلاسهایی را که قرار است بهطور بیرونی پدیدار باشند صادر (export) کنید. متأسفانه ممکن است کدها، شاید بهطور تصادفی، به رفتار Visual Studio وابسته باشند.
از جمله پیامدهای این تغییرات این است که اعضای دادهای ایستای همنوع با نام یکسان اما تعریفشده در اشیاء مشترک مختلف، متفاوت خواهند بود؛ بنابراین تغییر یکی باعث تغییر دیگری نمیشود؛ و اینکه اشارهگرها به توابع عضوِ تعریفشده در اشیاء مشترک مختلف ممکن است در مقایسه برابر نباشند. هنگامی که این پرچم داده میشود، تعریف متفاوت نوعهای همنام نقض ODR محسوب میشود.
- -fno-weak
- از پشتیبانی نمادهای ضعیف (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 tag) در زمینهای استفاده شود که فاقد آن برچسب ABI است، هشدار میدهد. برای اطلاعات بیشتر دربارهٔ برچسبهای ABI به C++ Attributes مراجعه کنید.
- -Wno-abbreviated-auto-in-template-arg
- خطای مربوط
به نوع
جانگهدار
"auto" را که
در یک فهرست
آرگومان
الگو برای
اعلان یک
الگوی تابع
مختصرشدهٔ
C++20 استفاده
شده است
غیرفعال
میکند،
برای نمونه:
void f(S<auto>);
این قابلیت در Concepts TS پیشنهاد شده بود، اما در C++20 پذیرفته نشد؛ در استاندارد، یک جانگهدار در اعلان پارامتر باید به عنوان یک decl-specifier ظاهر شود. این خطا را همچنین میتوان با استفاده از -fpermissive یا -Wno-error=abbreviated-auto-in-template-arg به یک هشدار کاهش داد..IP "-Wcomma-subscript (فقط C++ و Objective-C++)" 4 درباره استفاده از عبارت کاما در درون یک عبارت اندیسگذاری هشدار میدهد. این کاربرد در 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++)
- زمانی که یک کلاس غیرقابلاستفاده به نظر برسد هشدار میدهد، زیرا تمام سازندهها یا مخربها در آن کلاس خصوصی هستند و کلاس فاقد توابع دوست (friends) یا توابع عضو ایستای عمومی است. همچنین در صورتی که هیچ متد غیرخصوصی وجود نداشته باشد و حداقل یک تابع عضو خصوصی وجود داشته باشد که سازنده یا مخرب نباشد، هشدار میدهد.
- -Wdangling-reference (فقط C++ و Objective-C++)
- زمانی که یک
ارجاع به یک
شیء موقت
مقید شود که
طول عمر آن
به پایان
رسیده است،
هشدار
میدهد.
برای مثال:
int n = 1; const int& r = std::max(n - 1, n + 1); // r is dangling
در مثال بالا، دو شیء موقت ایجاد میشود (یکی به ازای هر آرگومان) و ارجاعی به یکی از اشیاء موقت بازگردانده میشود. با این حال، هر دو شیء موقت در انتهای عبارت کامل نابود میشوند، بنابراین ارجاع "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 فعال میشود.
- -Wdelete-non-virtual-dtor (فقط C++ و Objective-C++)
- هنگامی که از "delete" برای نابودی نمونهای از یک کلاس استفاده شود که دارای توابع مجازی و مخرب غیرمجازی است، هشدار میدهد. در صورتی که کلاس پایه فاقد مخرب مجازی باشد، نابودی نمونهای از کلاس مشتقشده از طریق اشارهگری به کلاس پایه ناامن است. این هشدار با -Wall فعال میشود.
- -Wdeprecated-copy (فقط C++ و Objective-C++)
- هشدار میدهد که در C++11 و بالاتر، اعلان ضمنی یک سازنده کپی یا عملگر انتساب کپی در صورتی که کلاس دارای یک سازنده کپی یا عملگر انتساب کپی ارائهشده توسط کاربر باشد، منسوخ است. این هشدار با -Wextra فعال میشود.
- -Wdeprecated-copy-dtor (فقط C++ و Objective-C++)
- مشابه با -Wdeprecated-copy است، اما در صورتی که کلاس دارای یک مخرب ارائهشده توسط کاربر باشد نیز آن را منسوخ در نظر میگیرد.
- -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++)
- هشدار
میدهد که
حذف کاما
پیش از
آرگومانهای
متغیر
"..." در
انتهای
فهرست
پارامترهای
تابع منسوخ
شده است.
این هشدار
بهطور
پیشفرض در
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 با نوع پایهای مشخصشده و بدون فهرست شمارندهها (enumerator list)، در اعلانی غیر از صرفاً یک اعلان مستقل از آن enum به کار رود. بهطور پیشفرض فعال است. این هشدار با -pedantic-errors به یک خطا ارتقا مییابد.
- -Wno-init-list-lifetime (فقط C++ و Objective-C++)
- درباره استفادههایی از "std::initializer_list" که احتمالاً به اشارهگرهای معلق (dangling pointers) منجر میشوند، هشدار نمیدهد. از آنجا که با آرایه زیرین یک "initializer_list" مانند یک شیء موقت معمولی C++ رفتار میشود، بسیار آسان است که بهطور ناخواسته اشارهگری به آن آرایه پس از پایان طول عمرش نگهداشته شود. برای نمونه:
- اگر یک تابع یک "initializer_list" موقت یا یک متغیر محلی "initializer_list" را بازگرداند، طول عمر آرایه در انتهای دستور return پایان مییابد، بنابراین مقدار بازگرداندهشده دارای یک اشارهگر معلق است.
- اگر یک new-expression یک "initializer_list" ایجاد کند، آرایه تنها تا انتهای full-expression دربرگیرنده زنده میماند، بنابراین "initializer_list" در heap دارای یک اشارهگر معلق خواهد بود.
- هنگامی که
یک متغیر
"initializer_list" از
یک فهرست
مقداردهی
اولیه
محصور در
آکولاد
انتساب
مییابد،
آرایه موقت
ایجادشده
برای سمت
راست
انتساب فقط
تا انتهای
full-expression زنده
میماند،
بنابراین
در دستور
بعدی متغیر
"initializer_list" یک
اشارهگر
معلق دارد.
// li's initial underlying array lives as long as li std::initializer_list<int> li = { 1,2,3 }; // assignment changes li to point to a temporary array li = { 4, 5 }; // now the temporary is gone and li has a dangling pointer int i = li.begin()[0] // undefined behavior - هنگامی که یک سازنده فهرست، اشارهگر "begin" را از آرگومان "initializer_list" ذخیره میکند، این کار طول عمر آرایه را تمدید نمیکند؛ بنابراین اگر یک متغیر کلاس از یک "initializer_list" موقت ساخته شود، اشارهگر در انتهای دستور اعلان متغیر بهصورت معلق رها میشود.
- -Winvalid-constexpr
- هنگامی که
یک تابع
هرگز یک
عبارت ثابت
(constant expression) تولید
نمیکند،
هشدار
میدهد. در C++20
و پیش از
آن، برای هر
تابع و
الگوی تابع
"constexpr"،
باید حداقل
یک مجموعه
از
آرگومانهای
تابع در
دستکم یک
نمونهسازی
(instantiation) وجود
داشته باشد
بهگونهای
که
فراخوانی
تابع یا
سازنده
بتواند
زیرعبارتی
ارزیابیشده
از یک عبارت
ثابت
هستهای (core constant
expression) باشد. C++23
این
محدودیت را
حذف کرد،
بنابراین
امکان دارد
تابع یا
الگوی
تابعی با
علامت
"constexpr"
وجود داشته
باشد که هیچ
فراخوانی
از آن
الزامات یک
عبارت ثابت
هستهای را
برآورده
نکند.
این هشدار بهطور پیشفرض به عنوان یک هشدار سختگیرانه (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 macros) در پایان کامپایل معتبر باشند. این گزینه بهطور پیشفرض فعال نیست، زیرا تعیین آن نیازمند پردازش اضافی است. این گزینه ممکن است هنگام آمادهسازی مجموعههایی از header-unitها برای اطمینان از سازگاری ماکروها مفید باشد.
- -Wno-literal-suffix (فقط C++ و Objective-C++)
- هنگامی که
پس از یک
لیترال
رشتهای یا
نویسهای
یک ud-suffix
میآید که
با زیرخط
آغاز
نمیشود،
هشدار
نمیدهد.
بهعنوان
یک افزونه
سازگار با
استاندارد،
GCC با چنین
پسوندهایی
به عنوان
نشانههای
(توکنهای)
پیشپردازش
مجزا رفتار
میکند تا
سازگاری
عقبرو با
کدهایی که
از
ماکروهای
قالببندی
"<inttypes.h>"
استفاده
میکنند
حفظ شود.
برای نمونه:
#define __STDC_FORMAT_MACROS #include <inttypes.h> #include <stdio.h> int main() { int64_t i64 = 123; printf("My int64: %" PRId64"\n", i64); }در این حالت، با "PRId64" به عنوان یک نشانه پیشپردازش جداگانه رفتار میشود.
این گزینه همچنین هشدارهایی را کنترل میکند که هنگام اعلان یک عملگر لیترال تعریفشده توسط کاربر با شناسه پسوند لیترالی که با زیرخط آغاز نمیشود، صادر میشوند. شناسههای پسوند لیترال که با زیرخط آغاز نمیشوند، برای استانداردسازیهای آینده رزرو شدهاند.
این هشدارها بهطور پیشفرض فعال هستند.
- -Wno-narrowing (فقط C++ و Objective-C++)
- برای C++11 و
استانداردهای
پس از آن،
تبدیلات
محدودکننده
(narrowing conversions)
همانگونه
که توسط
استاندارد
الزامی
است،
بهطور
پیشفرض
تشخیص داده
میشوند.
تبدیل
محدودکننده
از یک مقدار
ثابت منجر
به خطا شده
و تبدیل
محدودکننده
از یک مقدار
غیرثابت یک
هشدار
تولید
میکند،
اما -Wno-narrowing این
تشخیص را
فرومینشاند.
توجه داشته
باشید که
این گزینه
بر معنای
کدهای
خوشساخت
(well-formed) تأثیری
نمیگذارد؛
تبدیلات
محدودکننده
همچنان در
زمینههای
SFINAE بدساخت (ill-formed)
تلقی
میشوند.
با -Wnarrowing در C++98، هنگامی که یک تبدیل محدودکننده ممنوعشده در C++11 درون { } رخ دهد، هشدار میدهد؛ برای نمونه:
int i = { 2.2 }; // error: narrowing from double to intاین پرچم در -Wall و -Wc++11-compat گنجانده شده است.
- -Wnoexcept (فقط C++ و Objective-C++)
- هنگامی که یک noexcept-expression به دلیل فراخوانی تابعی که مشخصه استثنای غیرپرتابکننده (یعنی 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"
شیئی از نوع
کلاس باشد،
و نوشتن در
چنین شیئی
ممکن است
سازنده یا
انتساب
رونوشت (copy assignment)
غیربدیهی
یا حذفشده
کلاس را دور
بزند،
درستیِ const یا
کپسولهسازی
را نقض کند،
یا
اشارهگرهای
جدول مجازی
را مخدوش
نماید،
هشدار
میدهد.
اصلاح
بازنمود
چنین
اشیایی
ممکن است
ناورداهایی
(invariants) را که
توسط توابع
عضو کلاس
حفظ
میشوند
نقض کند.
برای
نمونه،
فراخوانی
"memset" در
زیر
تعریفنشده
است زیرا یک
شیء کلاسی
غیربدیهی
را تغییر
میدهد و
بنابراین
تشخیص داده
میشود. روش
ایمن برای
مقداردهی
اولیه یا
پاککردن
حافظه
اشیایی از
این نوع،
استفاده از
سازنده یا
عملگر
انتساب
مناسب در
صورت در
دسترس بودن
است.
std::string str = "abc"; memset (&str, 0, sizeof str);
گزینه -Wclass-memaccess توسط -Wall فعال میشود. تبدیل نوع صریح اشارهگر شیء کلاس به "void *" یا به نوعی که بتواند بهطور ایمن توسط تابع حافظه خام مورد دسترسی قرار گیرد، هشدار را سرکوب میکند..IP "-Wnon-virtual-dtor (تنها C++ و Objective-C++)" 4 زمانی که یک کلاس توابع مجازی (virtual functions) و یک مخرب (destructor) غیرمجازی دردسترس در خود یا در یک کلاس پایه چندریختی (polymorphic) دردسترس داشته باشد، هشدار میدهد؛ در چنین حالتی حذف نمونهای از کلاس مشتقشده از طریق اشارهگری به خود کلاس یا کلاس پایه امکانپذیر اما ناامن است. این هشدار در صورت تعیین -Weffc++ بهطور خودکار فعال میشود. گزینهٔ -Wdelete-non-virtual-dtor (فعالشده توسط -Wall) به دلیل هشدار دربارهٔ موارد ناامن بدون موارد مثبت کاذب، باید ترجیح داده شود.
- -Wregister (تنها C++ و Objective-C++)
- دربارهٔ استفاده از مشخصکنندهٔ کلاس حافظهٔ "register" هشدار میدهد، مگر زمانی که بخشی از افزونهٔ Explicit Register Variables در GNU باشد. استفاده از کلمهٔ کلیدی "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) شود.
سناریوی
متداولی که
در آن حذف
کپی رخ
میدهد
هنگام
بازگشت از
تابعی با
نوع
بازگشتی
کلاسی است،
مشروط بر
اینکه
عبارتِ
بازگرداندهشده
نام یک شیء
خودکار (automatic)
غیرفرّار
(non-volatile) بوده،
پارامتر
تابع
نباشد، و
نوع یکسانی
با نوع
بازگشتی
تابع داشته
باشد.
struct T { ... }; T fn() { T t; ... return std::move (t); }اما در این مثال، فراخوانی "std::move" مانع از حذف کپی میشود.
این هشدار توسط -Wall فعال میشود.
- -Wno-redundant-move (تنها C++ و Objective-C++)
- این گزینه
دربارهٔ
فراخوانیهای
زائد
"std::move"
هشدار
میدهد؛
یعنی زمانی
که عملیات
انتقال (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++ یک کپی
غیرضروری
ایجاد کند.
این حالت
میتواند
زمانی رخ
دهد که
اعلان بازه
یک ارجاع (reference)
نباشد، در
حالی که
احتمالاً
باید ارجاع
باشد. به
عنوان مثال:
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 &" به آن متصل (bind) میگردد.
این هشدار توسط -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 با پیوند داخلی یا بدون پیوند وابسته باشد، تعریف آن در چندین واحد ترجمه (translation unit) نقض ODR خواهد بود، چرا که معنای B در هر واحد ترجمه متفاوت است. اگر A تنها در یک واحد ترجمه ظاهر شود، بهترین روش برای ساکت کردن هشدار، اعطای پیوند داخلی به آن با قرار دادنش در یک فضای نام ناشناس است. کامپایلر این هشدار را برای نوعهای تعریفشده در فایل اصلی .C صادر نمیکند، زیرا بعید است که دارای چندین تعریف باشند. گزینهٔ -Wsubobject-linkage بهطور پیشفرض فعال است.
- -Weffc++ (تنها C++ و Objective-C++)
- دربارهٔ نقض رهنمودهای شیوهنامهای زیر برگرفته از سری کتابهای Effective C++ نوشتهٔ Scott Meyers هشدار میدهد:
- برای کلاسهای دارای حافظهٔ تخصیصیافته به صورت پویا، یک سازندهٔ کپی و یک عملگر انتساب تعریف کنید.
- مقداردهی اولیه را به انتساب در سازندهها ترجیح دهید.
- کاری کنید که "operator=" ارجاعی به *this بازگرداند.
- هنگامی که باید یک شیء بازگردانید، سعی نکنید ارجاع بازگردانید.
- بین شکلهای پیشوندی و پسوندی عملگرهای افزایش و کاهش تمایز قائل شوید.
- هرگز "&&"، "||"، یا "," را سربارگذاری (overload) نکنید.
این گزینه همچنین -Wnon-virtual-dtor را فعال میکند، که آن نیز یکی از توصیههای کتاب Effective C++ است. با این حال، دامنهٔ بررسی گسترش یافته تا دربارهٔ نبود مخرب مجازی در کلاسهای پایهٔ غیرچندریختی دردسترس نیز هشدار داده شود.
هنگام انتخاب این گزینه، توجه داشته باشید که سرآیندهای کتابخانهٔ استاندارد از تمامی این رهنمودها پیروی نمیکنند؛ برای فیلتر کردن این هشدارها از grep -v استفاده کنید. هشدار مربوط به حالتی را که در آن یک گردانندهٔ استثنا (exception handler) توسط گردانندهٔ دیگری پوشانده (shadow) میشود، غیرفعال میکند؛ این حالت میتواند نشاندهندهٔ ترتیب نادرست گردانندههای استثنا باشد.
- -Wsfinae-incomplete (فقط C++ و Objective-C++)
- دربارهٔ
کلاسی که
ناقص (incomplete)
تشخیص داده
شده است، یا
تابعی با
نوع
بازگشتی auto
که هنوز
استنتاج
نشده است،
در
زمینهای
که منجر به
شکست
جایگزینی
(substitution failure) بهجای
خطا میشود
و سپس آن
کلاس یا
تابع بعداً
در همان
واحد ترجمه
(translation unit) تعریف
میگردد،
هشدار
میدهد. این
مسئله
مشکلساز
است چرا که
نمونهسازیهای
قالب (template instantiations)
یا
بررسیهای
مفهوم (concept checks)
بسته به
اینکه قبل
یا بعد از
تعریف رخ
دهند، ممکن
است نتایج
متفاوتی
داشته
باشند.
این هشدار بهطور پیشفرض فعال است. -Wsfinae-incomplete=2 هشداری را در نقطهٔ شکست جایگزینی میافزاید تا ردیابی مشکلاتی که در حالت پیشفرض پرچمگذاری شدهاند، آسانتر شود.
- -Wstrict-null-sentinel (فقط C++ و Objective-C++)
- دربارهٔ استفاده از "NULL" تبدیلنوعنیافته (uncasted) بهعنوان نگهبان (sentinel) هشدار میدهد. هنگام کامپایل صرفاً با GCC، این یک نگهبان معتبر است، زیرا "NULL" بهصورت "__null" تعریف شده است. اگرچه این یک ثابت اشارهگر تهی است نه خود اشارهگر تهی، اما تضمین میشود که اندازهای یکسان با یک اشارهگر دارد. با این حال، این کاربرد میان کامپایلرهای گوناگون سازگار و قابلحمل نیست.
- -Wno-non-c-typedef-for-linkage (فقط C++ و Objective-C++)
- هشدار
سختگیرانه
(pedwarn) را برای
کلاسهای
بینام
دارای نام typedef
برای اهداف
پیوند (linkage) که
شامل اعضای
خاص C++،
کلاسهای
پایه،
مقادیر
اولیهٔ
پیشفرض
اعضا یا
عبارتهای
لامبدا (از
جمله موارد
موجود در
کلاسهای
عضو تودرتو)
هستند،
غیرفعال
میکند.
typedef struct { int a; // non-static data members are ok struct T { int b; }; // member classes too enum E { E1, E2, E3 }; // member enumerations as well int c = 42; // default member initializers are not ok struct U : A { int c; }; // classes with base classes are not ok typedef int V; // typedef is not ok using W = int; // using declaration is not ok decltype([](){}) x; // lambda expressions not ok } S;در تمام این موارد، نام برچسب S باید پس از کلمهٔ کلیدی struct اضافه شود.
- -Wno-non-template-friend (فقط C++ و Objective-C++)
- هشدارهای مربوط به زمانی را که توابع دوست (friend) غیرقالبی درون یک قالب اعلان میشوند، غیرفعال میکند. در نسخههای بسیار قدیمی GCC که پیش از پیادهسازی استاندارد ISO بودند، اعلانهایی مانند friend int foo(int) که در آنها نام تابع دوست یک unqualified-id است، میتوانستند بهعنوان یک تخصیص خاص (specialization) از یک تابع قالبی تفسیر شوند؛ این هشدار برای تشخیص مشکلات سازگاری وجود دارد و بهطور پیشفرض فعال است.
- -Wold-style-cast (فقط C++ و Objective-C++)
- اگر در یک برنامهٔ C++ از تبدیل نوع سبک قدیمی (سبک C) به یک نوع غیر void استفاده شود، هشدار میدهد. تبدیل نوعهای سبک جدید ("dynamic_cast"، "static_cast"، "reinterpret_cast" و "const_cast") کمتر در معرض اثرات ناخواسته هستند و جستجو برای آنها بسیار آسانتر است.
- -Woverloaded-virtual (فقط C++ و Objective-C++)
- -Woverloaded-virtual=n
- زمانی که یک
اعلان
تابع،
توابع
مجازی (virtual) یک
کلاس پایه
را پنهان (hide)
میکند،
هشدار
میدهد.
برای نمونه
در:
struct A { virtual void f(); }; struct B: public A { void f(int); // does not override };نسخهٔ کلاس "A" از تابع "f" در "B" پنهان میشود، و کدی مانند:
B* b; b->f();
در کامپایل شکست میخورد.
در مواردی که تفاوت در امضاها تصادفی نیست، سادهترین راهحل افزودن یک اعلان using به کلاس مشتقشده برای خارج کردن تابع پایه از حالت پنهان است؛ مانند افزودن "using A::f;" به "B".
پسوند اختیاری سطح، رفتار را در حالتی کنترل میکند که تمام اعلانهای کلاس مشتقشده توابع مجازی کلاس پایه را بازنویسی (override) میکنند، حتی اگر همهٔ توابع پایه بازنویسی نشده باشند:
struct C { virtual void f(); virtual void f(int); }; struct D: public C { void f(int); // does override }احتمال اینکه این الگو یک اشتباه باشد کمتر است؛ اگر از D صرفاً بهصورت مجازی استفاده شود، کاربر ممکن است تشخیص داده باشد که معناشناسی (semantics) کلاس پایه برای برخی از سربارگذاریها مناسب است.
در سطح ۱، این حالت هشداری صادر نمیکند؛ در سطح ۲ هشدار میدهد. گزینهٔ -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 استفاده کرد. همچنین میتوان قالبها را نمونهسازی یا تخصیص داد.
- -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 گنجانده شده است.
- -Wmismatched-tags (فقط C++ و Objective-C++)
- دربارهٔ
اعلانهای
structها، classها، و
قالبهای
کلاس و
تخصیصهای
آنها با
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) ناشی از تفاوت در درهمسازی (mangling) نمادهای اعلانشده با class-keyهای گوناگون کمک میکند. این گزینه را میتوان بهتنهایی یا همراه با -Wredundant-tags به کار برد..IP "-Wmultiple-inheritance (فقط C++ و Objective-C++)" 4 هنگامی که یک کلاس با چندین کلاس پایه مستقیم تعریف شود هشدار میدهد. برخی قواعد کدنویسی وراثت چندگانه را مجاز نمیدانند، و میتوان از این گزینه برای اعمال آن قاعده استفاده کرد. این هشدار درون فایلهای سرآیند سیستمی مانند STL غیرفعال است، بنابراین همچنان میتوان از STL استفاده کرد. همچنین میتوان کلاسهایی تعریف کرد که بهطور غیرمستقیم از وراثت چندگانه استفاده میکنند.
- -Wvirtual-inheritance
- هنگامی که یک کلاس با یک کلاس پایه مستقیم مجازی تعریف شود هشدار میدهد. برخی قواعد کدنویسی وراثت چندگانه را مجاز نمیدانند، و میتوان از این گزینه برای اعمال آن قاعده استفاده کرد. این هشدار درون فایلهای سرآیند سیستمی مانند STL غیرفعال است، بنابراین همچنان میتوان از STL استفاده کرد. همچنین میتوان کلاسهایی تعریف کرد که بهطور غیرمستقیم از وراثت مجازی استفاده میکنند.
- -Wno-virtual-move-assign
- هشدارهای مربوط به ارثبری از یک پایه مجازی با یک عملگر انتساب انتقال (move assignment) غیربدیهی C++11 را متوقف میکند. این کار خطرناک است زیرا اگر پایه مجازی از بیش از یک مسیر در دسترس باشد، چندین بار منتقل (move) میشود، که میتواند به این معنی باشد که هر دو شیء در وضعیت منتقلشده (moved-from) قرار میگیرند. اگر عملگر انتساب انتقال طوری نوشته شده باشد که از انتقال یک شیء منتقلشده جلوگیری کند، میتوان این هشدار را غیرفعال کرد.
- -Wnamespaces
- هنگامی که یک تعریف فضای نام (namespace) باز شود هشدار میدهد. برخی قواعد کدنویسی فضاهای نام را مجاز نمیدانند، و این گزینه میتواند برای اعمال آن قاعده استفاده شود. این هشدار درون فایلهای سرآیند سیستمی مانند STL غیرفعال است، بنابراین همچنان میتوان از STL استفاده کرد. همچنین میتوان از رهنمودهای using و نامهای واجد شرایط (qualified names) استفاده کرد.
- -Wno-template-body (فقط C++ و Objective-C++)
- تشخیص خطاها هنگام تجزیه یک الگو (template) را غیرفعال کرده و به جای آن خطا را تنها هنگام نمونهسازی (instantiation) الگو صادر میکند. این پرچم همچنین میتواند برای تنزل درجه چنین خطاهایی به هشدار با Wno-error= یا -fpermissive استفاده شود.
- -Wno-template-id-cdtor (فقط C++ و Objective-C++)
- هشدار
درباره
استفاده از
simple-template-id به
عنوان declarator-id یک
سازنده یا
مخرب را
غیرفعال
میکند؛
این مورد در
C++20 از طریق DR 2237
نامعتبر شد.
برای نمونه:
template<typename T> struct S { S<T>(); // should be S(); ~S<T>(); // should be ~S(); };گزینه -Wtemplate-id-cdtor به طور پیشفرض با -std=c++20 فعال است؛ همچنین توسط -Wc++20-compat فعال میشود.
- -Wtemplate-names-tu-local
- هنگامی که
بدنه یک
الگو،
افشای (exposure) یک
موجودیت
محلیِ
واحدِ
ترجمه (translation-unit-local)
را پنهان
میکند
هشدار
میدهد. در
بیشتر
موارد،
ارجاع به یک
موجودیت
محلیِ
واحدِ
ترجمه
(مانند
تعریفی با
پیوند
درونی / internal linkage)
درون
موجودیتی
که به CMI یک
ماژول
فرستاده
میشود، یک
خطا است. با
این حال،
درون
مقداردهنده
اولیه یک
متغیر یا در
بدنه یک
تابع غیر-inline،
این یک افشا
محسوب
نمیشود و
خطایی صادر
نمیگردد.
این وضعیت میتواند باعث شود الگوهای متغیر یا تابع در صورت ارجاع به چنین موجودیتی به طور تصادفی غیرقابل استفاده شوند، زیرا سایر واحدهای ترجمهای که الگو را وارد (import) میکنند هرگز قادر به نمونهسازی آن نخواهند بود. این هشدار تلاش میکند مواردی را که ممکن است این اتفاق رخ دهد شناسایی کند. وجود یک نمونهسازی صریح هشدار را بیاثر میکند.
این پرچم توسط -Wextra فعال میشود.
- -Wno-expose-global-module-tu-local
- افشای یک
موجودیت
محلیِ
واحدِ
ترجمه از
طریق واسط
یک ماژول
نامعتبر
است، زیرا
ممکن است
باعث نقض ODR
شده و منجر
به خطاهای
پیوند (link) یا
رفتارهای
غیرمنتظره
دیگر شود.
با این حال،
بسیاری از
کتابخانههای
موجود،
موجودیتهای
TU-local را در
واسط خود
اعلان
میکنند، و
اجتناب از
افشای این
موجودیتها
در برخی
موارد ممکن
است دشوار
باشد.
به عنوان یک افزونه، GCC اجازه افشای متغیرها و توابع درونی را که در بخش ماژول سراسری (global module fragment) اعلان شده بودند میدهد. این هشدار نشان میدهد که چه زمانی چنین افشای نامعتبری رخ داده است، و میتواند با استفاده از عملگرهای پراگمای تشخیصی در محل افشا یا در نقطه اعلان درونی خاموش شود. این موضوع همچنین برای اعلانهای "export using" که از چنین موجودیتهایی نام میبرند اعمال میشود.
هنگام ترکیب با -Wtemplate-names-tu-local، GCC همچنین درباره ارجاعات غیر-افشایی به موجودیتهای TU-local در بدنههای الگو هشدار میدهد. چنین الگوهایی همچنان میتوانند در سایر TUها نمونهسازی شوند اما خطرات فوق در رابطه با افشای موجودیتهای محلیِ واحدِ ترجمه برقرار است.
این هشدار به طور پیشفرض فعال است و توسط -pedantic-errors به یک خطا ارتقا مییابد.
- -Wno-external-tu-local
- هنگامی که
از یک
موجودیت TU-local
خارج از
واحد
ترجمهای
که در آن
اعلان شده
است نام
برده شود،
هشدار
میدهد.
چنین
اعلانهایی
در طول
جستجوی نام
نادیده
گرفته
میشوند.
این امر
میتواند
هنگام
انجام ADL از
یک الگوی
اعلانشده
در همان TUِ
تابع درونی
رخ دهد:
export module M; template <typename T> void foo(T t) { bar(t); } struct S {} s; static void bar(S) {} // internal linkage // instantiating foo(s) from outside this TU can see ::bar, // but naming it there is ill-formed.میتوان این مشکل را با متصل کردن "bar" به ماژول سراسری با استفاده از "extern "C++"" برطرف کرد.
این هشدار به طور پیشفرض فعال است و توسط -pedantic-errors به یک خطا ارتقا مییابد.
- -Wno-terminate (فقط C++ و Objective-C++)
- هشدار درباره عبارت throw را که بلافاصله منجر به فراخوانی "terminate" میشود، غیرفعال میکند.
- -Wno-vexing-parse (فقط C++ و Objective-C++)
- درباره
ابهام نحوی
آزاردهندهترین
تجزیه (most vexing parse)
هشدار
میدهد. این
گزینه
درباره
مواردی
هشدار
میدهد که
در آنها یک
اعلان شبیه
تعریف
متغیر به
نظر
میرسد،
اما زبان C++
ایجاب
میکند که
به عنوان یک
اعلان تابع
تفسیر شود.
برای نمونه:
void f(double a) { int i(); // extern int i (void); int n(int(a)); // extern int n (int); }نمونهای دیگر:
struct S { S(int); }; void f(double a) { S x(int(a)); // extern struct S x (int); S y(int()); // extern struct S y (int (*) (void)); S z(); // extern struct S z (void); }این هشدار گزینههایی را برای چگونگی برخورد با چنین ابهامی پیشنهاد میدهد؛ به عنوان مثال میتواند حذف پرانتزها یا استفاده از آکولادها به جای آن را پیشنهاد کند.
این هشدار به طور پیشفرض فعال است.
- -Wno-class-conversion (فقط C++ و Objective-C++)
- هنگامی که یک تابع تبدیل شیء را به همان نوع، به یک کلاس پایه از آن نوع، یا به void تبدیل میکند، هشدار نمیدهد؛ چنین تابع تبدیلی هرگز فراخوانی نخواهد شد.
- -Wvolatile (فقط C++ و Objective-C++)
- درباره
کاربردهای
منسوخشده
توصیفکننده
"volatile"
هشدار
میدهد. این
شامل
عبارات
پیشوندی و
پسوندی
"++" و
"--" از
نوعهای
توصیفشده
با "volatile"،
استفاده از
انتسابهای
ساده که در
آنها
عملوند چپ
یک نوع
غیرکلاسیِ
توصیفشده
با "volatile"
برای مقدار
آنها است،
انتسابهای
مرکب که در
آنها
عملوند چپ
یک نوع
غیرکلاسی
توصیفشده
با "volatile"
است، نوع
بازگشتی
تابع
توصیفشده
با "volatile"،
نوع
پارامتر
توصیفشده
با "volatile" و
پیوندهای
ساختاریافته
(structured bindings) از یک
نوع
توصیفشده
با "volatile"
میشود. این
کاربرد در C++20
منسوخ شده
است.
به طور پیشفرض با -std=c++20 فعال است. پیش از -std=c++20، با گزینه صریح -Wdeprecated فعال میشود.
- -Waligned-new
- -Waligned-new=[none|global|all]
- درباره
عبارت new از
نوعی که به
ترازبندی
بزرگتری
نسبت به
alignof(std::max_align_t)
نیاز دارد
اما از یک
تابع تخصیص
حافظه بدون
پارامتر
ترازبندی
صریح
استفاده
میکند،
هشدار
میدهد. این
گزینه توسط
-Wall فعال
میشود.
بهطور معمول این گزینه فقط درباره توابع تخصیص سراسری هشدار میدهد، اما -Waligned-new=all درباره توابع تخصیص عضو کلاس نیز هشدار میدهد.
- -Wno-placement-new
- -Wplacement-new=n
- درباره
عبارتهای
placement new با رفتار
تعریفنشده،
مانند ساخت
یک شیء در
بافری که از
نوع شیء
کوچکتر
است، هشدار
میدهد.
برای
نمونه،
عبارت placement new
زیر اخطار
دریافت
میکند
زیرا تلاش
میکند
آرایهای
از ۶۴ عدد
صحیح را در
بافری
بسازد که
تنها ۶۴
بایت
اندازه
دارد.
char buf [64]; new (buf) int[64];
این هشدار بهطور پیشفرض فعال است.
- -Wplacement-new=1
- این سطح
پیشفرض
هشدار برای
-Wplacement-new است. در
این سطح،
هشدار برای
برخی از
ساختارهای
کاملاً
تعریفنشده
که GCC جهت
سازگاری با
کدهای
قدیمی به
عنوان
افزونه
مجاز
میداند
صادر
نمیشود.
برای
نمونه،
عبارت
"new" زیر
در این سطح
اخطار
دریافت
نمیکند
حتی با
اینکه طبق
استاندارد
C++ رفتاری
تعریفنشده
دارد، چرا
که فراتر از
انتهای
آرایه
تکعنصری
مینویسد.
struct S { int n, a[1]; }; S *s = (S *)malloc (sizeof *s + 31 * sizeof s->a[0]); new (s->a)int [32](); - -Wplacement-new=2
- در این سطح،
افزون بر
تشخیص
تمامی
ساختارهای
سطح ۱،
هشداری نیز
برای
عبارتهای
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 که از طریق ارجاع دریافت نمیکنند، هشدار میدهد. با -Wcatch-value=1 (یا به اختصار -Wcatch-value) درباره انواع کلاسهای چندریختی که با مقدار دریافت میشوند هشدار میدهد. با -Wcatch-value=2 درباره همه انواع کلاسها که با مقدار دریافت میشوند هشدار میدهد. با -Wcatch-value=3 درباره همه انواعی که با ارجاع دریافت نمیشوند هشدار میدهد. -Wcatch-value توسط -Wall فعال میشود.
- -Wconditionally-supported (فقط C++ و Objective-C++)
- درباره ساختارهای با پشتیبانی مشروط (طبق C++11 [intro.defs]) هشدار میدهد.
- -Wno-defaulted-function-deleted (فقط C++ و Objective-C++)
- زمانی که تابعی که صریحاً پیشفرض شده (defaulted) توسط کامپایلر حذف (delete) میشود، هشدار میدهد. این حالت زمانی رخ میدهد که نوع اعلانشده تابع با نوع تابعی که بهطور ضمنی اعلان میشد مطابقت نداشته باشد. این هشدار بهطور پیشفرض فعال است.
- -Wno-delete-incomplete (فقط C++ و Objective-C++)
- هنگام حذف یک اشارهگر به نوع ناقص (incomplete type)، که ممکن است موجب رفتار تعریفنشده در زمان اجرا شود، هشدار نمیدهد. این هشدار بهطور پیشفرض فعال است.
- -Wextra-semi (فقط C++ و Objective-C++)
- درباره
نقطهویرگولهای
اضافی
هشدار
میدهد.
زمینههای
مختلفی
وجود دارد
که در آنها
یک
نقطهویرگول
اضافی
میتواند
رخ دهد. یکی
نقطهویرگول
پس از
تعاریف
توابع درون
کلاس است که
در همه
گویشهای C++
معتبر است
(و هرگز یک pedwarn
محسوب
نمیشود):
struct S { void foo () {}; };دیگری یک نقطهویرگول اضافی در حوزه فضای نام (namespace scope) است که از C++11 مجاز شده است (بنابراین در C++98 یک pedwarn است):
struct S { }; ;و دیگری نقطهویرگول اضافی در تعاریف کلاس است که از C++11 به بعد مجاز شده است (بنابراین در C++98 یک pedwarn است):
struct S { int a; ; }; - -Wno-global-module (فقط C++ و Objective-C++)
- پیام هشدار مربوط به حالتی که قطعه ماژول سراسری (global module fragment) یک واحد ماژول تنها شامل دستورهای پیشپردازنده نباشد را غیرفعال میکند.
- -Wno-inaccessible-base (فقط C++ و Objective-C++)
- این گزینه
هشدارهایی
را کنترل
میکند که
به هنگام
غیرقابل
دسترس بودن
یک کلاس
پایه در
کلاس
مشتقشده
از آن به
دلیل ابهام
روی
میدهند.
این هشدار
بهطور
پیشفرض
فعال است.
توجه داشته
باشید که
هشدار برای
پایههای
مجازی مبهم
با گزینه -Wextra
فعال
میشود.
struct A { int a; }; struct B : A { }; struct C : B, A { }; - -Wno-inherited-variadic-ctor
- هشدارهای مربوط به استفاده از سازندههای ارثبریشده C++11 را در مواردی که کلاس پایهای که از آن ارثبری شده یک سازنده C variadic داشته باشد سرکوب میکند؛ این هشدار بهطور پیشفرض فعال است زیرا علامت سهنقطه (ellipsis) به ارث برده نمیشود.
- -Wno-invalid-offsetof (فقط C++ و Objective-C++)
- هشدارهای
ناشی از
اعمال
ماکروی
"offsetof" بر
روی
نوعهای
غیر POD (non-POD) را
نادیده
میگیرد.
طبق
استاندارد
2014 ISO C++، اعمال
"offsetof" به
یک نوع با
چیدمان
غیراستاندارد
(non-standard-layout)
تعریفنشده
است. با این
وجود، در
پیادهسازیهای
موجود C++،
معمولاً
"offsetof"
نتایج
معناداری
ارائه
میدهد. این
پرچم برای
کاربرانی
است که
آگاهند کدی
غیرقابلحمل
مینویسند
و عمداً
تصمیم
گرفتهاند
هشدار
درباره آن
را نادیده
بگیرند.
محدودیتهای اعمالشده بر "offsetof" ممکن است در نسخه آینده استاندارد C++ کاهش یابند.
- -Wsized-deallocation (فقط C++ و Objective-C++)
- درباره
تعریف یک
تابع
آزادسازی
بدون
اندازه
void operator delete (void *) noexcept; void operator delete[] (void *) noexcept;
بدون تعریف تابع متناظر آزادسازی همراه با اندازه
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"، کیفیت کد بهبود مییابد. این هشدار با بهینهسازی زمان پیوند مؤثرتر خواهد بود، چرا که اطلاعات درباره گراف سلسلهمراتب کلاسها در آن کاملتر است. توصیه میشود ابتدا پیشنهادهای -Wsuggest-final-types را بررسی کرده و سپس با نشانهگذاریهای جدید برنامه را بازسازی (rebuild) کنید.
- -Wsuggest-override
- درباره بازنویسی توابع مجازی که با کلیدواژه "override" نشانهگذاری نشدهاند هشدار میدهد.
- -Wno-conversion-null (فقط C++ و Objective-C++)
- برای تبدیلهای میان "NULL" و انواع دادهای غیر اشارهگر هشدار نمیدهد. گزینه -Wconversion-null بهطور پیشفرض فعال است..SS "گزینههای مهار گویشهای Objective-C و Objective-C++ (Options Controlling Objective-C and Objective-C++ Dialects)" (نکته: این راهنما، خودِ زبانهای Objective-C و Objective-C++ را شرح نمیدهد.)
این بخش گزینههای خط فرمانی را شرح میدهد که تنها برای برنامههای Objective-C و Objective-C++ معنی دارند. شما همچنین میتوانید از بیشتر گزینههای مستقل از زبانِ کامپایلر گنو (GNU) استفاده کنید. برای نمونه، ممکن است فایلی مانند some_class.m را بدین صورت کامپایل کنید:
gcc -g -fgnu-runtime -O -c some_class.m
در این مثال، -fgnu-runtime گزینهای است که تنها برای برنامههای Objective-C و Objective-C++ در نظر گرفته شده است؛ شما میتوانید سایر گزینهها را همراه با هر زبان پشتیبانیشده توسط GCC به کار ببرید.
توجه داشته باشید از آنجا که Objective-C افزونهای بر زبان C است، کامپایلهای Objective-C میتوانند از گزینههای مخصوص فرانتاند C (مانند -Wtraditional) نیز استفاده کنند. به طور مشابه، کامپایلهای Objective-C++ میتوانند از گزینههای مختص C++ (مانند -Wabi) بهره ببرند.
در ادامه فهرستی از گزینههایی آمده است که تنها برای کامپایل برنامههای Objective-C و Objective-C++ کاربرد دارند:
- -fconstant-string-class=class-name
- از class-name بهعنوان نام کلاسی که باید برای هر رشتهٔ لفظی مشخصشده با نحو "@"..."" نمونهسازی شود، استفاده میکند. در صورت استفاده از زمان اجرای گنو (GNU runtime)، نام کلاس پیشفرض "NXConstantString" و در صورت استفاده از زمان اجرای NeXT، نام آن "NSConstantString" است (به زیر مراجعه کنید). در بسترهای Darwin / macOS، در صورت حضور گزینهٔ -fconstant-cfstrings، این گزینه بر تنظیمات -fconstant-string-class اولویت یافته و باعث میشود مقادیر رشتهای صریح "@"..."" به عنوان رشتههای ثابت CoreFoundation چیدمان شوند. توجه داشته باشید که -fconstant-cfstrings نام مستعاری برای معادل وابسته به مقصدِ -mconstant-cfstrings است.
- -fgnu-runtime
- تولید کد شیء (object code) سازگار با زمان اجرای استاندارد Objective-C گنو. این حالت برای بیشتر انواع سیستمها پیشفرض است.
- -fnext-runtime
- تولید خروجی سازگار با زمان اجرای NeXT. این مقدار برای سیستمهای مبتنی بر NeXT، از جمله Darwin / macOS پیشفرض است. ماکروی "__NEXT_RUNTIME__" فقط و فقط در صورتی که این گزینه استفاده شود، از پیش تعریف میشود.
- -fno-nil-receivers
- فرض را بر این میگذارد که تمام ارسالهای پیام (message dispatches) در Objective-C ("[receiver message:arg]") در این واحد ترجمه تضمین میکنند که گیرنده (receiver) برابر با "nil" نیست. این کار امکان استفاده از نقاط ورودی کارآمدتر در زمان اجرا را فراهم میکند. این گزینه تنها در ترکیب با زمان اجرای NeXT و نسخهٔ ABI برابر با 0 یا 1 در دسترس است.
- -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++ با
ویرانکنندهٔ
(destructor)
غیربدیهی
است یا خیر،
و اگر چنین
باشد، یک
متد ویژهٔ
"- (void) .cxx_destruct"
تولید
میکند که
همهٔ این
ویرانکنندههای
پیشفرض را
به ترتیب
معکوس اجرا
میکند.
متدهای "- (id) .cxx_construct" و "- (void) .cxx_destruct" که بدینگونه تولید میشوند، فقط روی متغیرهای نمونهٔ اعلانشده در کلاس فعلی Objective-C عمل میکنند، نه متغیرهای به ارث رسیده از ابرکلاسها (superclasses). فراخوانی تمام این متدها در سلسلهمراتب وراثت یک شیء بر عهدهٔ زمان اجرای 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 الزامی است. این گزینه هم با زمان اجرای گنو و هم زمان اجرای NeXT در دسترس است (اما همراه با زمان اجرای NeXT در Mac OS X 10.2 و قبلتر موجود نیست).
- -fobjc-gc
- بازیافت حافظه (garbage collection یا GC) را در برنامههای Objective-C و Objective-C++ فعال میکند. این گزینه تنها با زمان اجرای NeXT در دسترس است؛ زمان اجرای گنو پیادهسازی متفاوتی برای بازیافت حافظه دارد که نیازی به پرچمهای ویژه کامپایلر ندارد.
- -fobjc-nilcheck
- برای زمان اجرای NeXT با نسخهٔ 2 از ABI، پیش از فراخوانی واقعی متد، بررسی میکند که گیرنده در فراخوانیهای متد nil نباشد. این رفتار پیشفرض است و میتوان آن را با -fno-objc-nilcheck غیرفعال کرد. متدهای کلاس و فراخوانیهای super بدون توجه به اینکه این پرچم چگونه تنظیم شده است، هرگز از این طریق برای nil بررسی نمیشوند. در حال حاضر، هنگام استفاده از زمان اجرای گنو یا نسخههای قدیمیتر 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 سودمند است، زیرا امکان تغییر پیادهسازیهای کلاسهای مجزا را در طول اجرای برنامه فراهم میسازد. زمان اجرای گنو در حال حاضر صرفنظر از گزینههای خط فرمان، همیشه فراخوانیهای objc_get_class("...") را حفظ میکند.
- -fno-local-ivars
- بهطور پیشفرض به متغیرهای نمونه در Objective-C میتوان از درون متدهای کلاسی که در آن اعلان شدهاند، به گونهای دسترسی داشت که گویی متغیرهای محلی هستند. این امر میتواند منجر به سایهاندازی (shadowing) بین متغیرهای نمونه و متغیرهای دیگری شود که با همان نام به صورت محلی در متد کلاس یا به صورت سراسری اعلان شدهاند. مشخص کردن پرچم -fno-local-ivars این رفتار را غیرفعال کرده و بنابراین از مشکلات سایهاندازی متغیرها جلوگیری میکند.
- -fivar-visibility=[public|protected|private|package]
- دیداریبودن (visibility) پیشفرض متغیرهای نمونه را روی گزینهٔ مشخصشده تنظیم میکند تا متغیرهای نمونهای که خارج از محدودهٔ هرگونه دستور اصلاحکنندهٔ دسترسی اعلان شدهاند، به طور پیشفرض دارای دیداریبودن تعیینشده باشند.
- -gen-decls
- اعلانهای رابط (interface declarations) را برای تمام کلاسهای دیدهشده در فایل مبدأ، در فایلی به نام sourcename.decl ذخیره (dump) میکند.
- -Wassign-intercept (تنها Objective-C و Objective-C++)
- هرگاه یک انتساب در Objective-C توسط بازیافت حافظه (garbage collector) رهگیری شود، هشدار میدهد.
- -Wno-property-assign-default (تنها Objective-C و Objective-C++)
- اگر برای یک ویژگی در شیء Objective-C هیچ معناشناسی انتسابی (assign semantics) مشخص نشده باشد، هشداری صادر نمیکند.
- -Wno-protocol (تنها Objective-C و Objective-C++)
- اگر کلاسی برای پیادهسازی یک پروتکل اعلان شده باشد، برای هر متدی در آن پروتکل که توسط کلاس پیادهسازی نشده باشد، یک هشدار صادر میشود. رفتار پیشفرض صدور هشدار برای هر متدی است که صریحاً در کلاس پیادهسازی نشده باشد، حتی اگر پیادهسازی آن متد از ابرکلاس به ارث رسیده باشد. اگر از گزینهٔ -Wno-protocol استفاده کنید، متدهای به ارث رسیده از ابرکلاس، پیادهسازیشده تلقی میشوند و هیچ هشداری برای آنها صادر نمیشود..IP "-Wobjc-root-class (تنها Objective-C و Objective-C++)" 4 اگر واسط یک کلاس فاقد کلاس والد (superclass) باشد، هشدار میدهد. برای نمونه بیشتر کلاسها از "NSObject" (یا "Object") ارثبری میکنند. هنگام اعلان کلاسهایی که قرار است کلاس ریشه (root class) باشند، میتوان با نشانهگذاری واسط آنها با "__attribute__((objc_root_class))" از این هشدار جلوگیری کرد.
- -Wselector (تنها Objective-C و Objective-C++)
- اگر در حین کامپایل چندین متد با انواع دادهایِ متفاوت برای یک سلکتور مشابه یافت شود، هشدار میدهد. این بررسی بر روی فهرست متدها در مرحله نهایی کامپایل انجام میشود. علاوه بر این، بررسی برای هر سلکتوری که در یک عبارت @selector(...) ظاهر شده و متد متناظر با آن سلکتور در حین کامپایل یافت شده باشد نیز صورت میپذیرد. از آنجا که این بررسیها جدول متدها را صرفاً در انتهای کامپایل پویش میکنند، در صورتی که مرحله پایانی کامپایل محقق نشود (برای مثال به دلیل بروز خطا حین کامپایل یا استفاده از گزینه -fsyntax-only)، این هشدارها صادر نمیشوند.
- -Wstrict-selector-match (تنها Objective-C و Objective-C++)
- هنگام تلاش برای ارسال یک پیام با استفاده از یک سلکتور به گیرندهای از نوع "id" یا "Class"، چنانچه چندین متد با انواع آرگومان و/یا نوع بازگشتی متفاوت برای آن سلکتور یافت شود، هشدار میدهد. زمانی که این پرچم غیرفعال است (که رفتار پیشفرض میباشد)، کامپایلر در صورتی که تفاوتهای یافتهشده محدود به انواعی با اندازه و تراز (alignment) یکسان باشد، از صدور چنین هشدارهایی صرفنظر میکند.
- -Wundeclared-selector (تنها Objective-C و Objective-C++)
- اگر عبارت @selector(...) که به یک سلکتور اعلاننشده اشاره دارد یافت شود، هشدار میدهد. یک سلکتور در صورتی اعلاننشده در نظر گرفته میشود که هیچ متدی با آن نام پیش از عبارت @selector(...) اعلان نشده باشد، خواه به صورت صریح در یک اعلان @interface یا @protocol، یا به صورت ضمنی در بخش @implementation. این گزینه بررسیهای خود را همواره به محض یافتن عبارت @selector(...) انجام میدهد، در حالی که -Wselector بررسیهای خود را فقط در مرحله نهایی کامپایل انجام میدهد. این مورد همچنین این قرارداد شیوهنامه کدنویسی را تحمیل میکند که متدها و سلکتورها باید پیش از استفاده اعلان شوند.
- -print-objc-runtime-info
- یک هدر C تولید میکند که بزرگترین ساختاری را که با مقدار (by value) پاس داده میشود (در صورت وجود) توصیف مینماید.
گزینههای کنترل OpenMP و OpenACC
کامپایلر GCC افزونههای OpenMP را برای زبانهای C، C++ و Fortran با گزینه -fopenmp پشتیبانی میکند. به طور مشابه، افزونههای OpenACC در هر سه زبان با -fopenacc پشتیبانی میشوند.
- -foffload=disable
- -foffload=default
- -foffload=target-list
- مشخص
میکند که
کد برای
کدام
مقصدهای offload
در OpenMP و OpenACC باید
تولید شود.
رفتار
پیشفرض،
معادل با
-foffload=default، تولید
کد برای
تمامی
مقصدهای offload
پشتیبانیشده
است. ساختار
-foffload=disable کد را
صرفاً برای
حالت
بازگشتی
میزبان (host fallback)
تولید
میکند، در
حالی که
-foffload=target-list کد را
تنها برای
فهرست
مشخصشدهای
از مقصدهای
offload که با کاما
از هم جدا
شدهاند،
تولید
مینماید.
مقصدهای offload در قالب سهگانه مقصد (target-triplet) داخلی GCC مشخص میشوند. میتوانید کامپایلر را با گزینه -v اجرا کنید تا فهرست مقصدهای offload پیکربندیشده در زیر "OFFLOAD_TARGET_NAMES" نمایش داده شود.
- -foffload-options=options
- -foffload-options=target-triplet-list=options
- با گزینه
-foffload-options=options،
کامپایلر GCC
گزینههای
مشخصشده
در options را به
کامپایلرهای
مربوط به
تمام
مقصدهای offload
فعال پاس
میدهد.
میتوانید
گزینههایی
را که فقط
برای یک یا
چند مقصد
خاص اعمال
میشوند با
استفاده از
فرمت
-foffload-options=target-list=options
مشخص کنید.
target-list فهرستی
جداشده با
کاما در
همان قالب
گزینه -foffload=
است.
خطوط فرمان متداول به این صورت هستند:
-foffload-options='-fno-math-errno -ffinite-math-only' \ -foffload-options=nvptx-none=-latomic -foffload-options=amdgcn-amdhsa=-march=gfx906 - -fopenacc
- مدیریت دیرکتیوهای OpenACC شامل #pragma acc در C/C++ و !$acc در فرمت آزاد Fortran و !$acc، c$acc و *$acc در فرمت ثابت Fortran را فعال میکند. این گزینه مستلزم -pthread است و بنابراین تنها روی مقصدهایی پشتیبانی میشود که دارای پشتیبانی از -pthread باشند.
- -fopenacc-dim=geom
- ابعاد محاسباتی پیشفرض را برای نواحی موازی offload که آنها را صریحاً تعیین نکردهاند، مشخص میکند. مقدار geom یک سهتایی از اندازههای جداشده با : به ترتیب gang، worker و vector است. برای استفاده از مقدار پیشفرض مختص به مقصد، میتوان یک اندازه را حذف کرد.
- -fopenmp
- مدیریت
دیرکتیوهای
OpenMP شامل #pragma omp،
[[omp::decl(...)]]، [[omp::directive(...)]] و
[[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" مستقل از بند (clause) تعیینشده برای "bind"، به ناحیه وظیفه جاری مقید میشود.
- -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 صفر باشد،
هیچ شکست
خطی انجام
نمیشود؛
هر پیام خطا
در یک خط
تکی نمایش
مییابد.
این رفتار
پیشفرض
برای تمامی
فرانتاندها
است.
توجه - این گزینه همچنین بر نمایش دستورات پیشپردازندهٔ #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 -fno-diagnostics-show-nesting در آینده، اگر 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= چاپ میشوند؛ مانند شناسههای رویدادهای منفرد و خطوط نشاندهندهٔ فراخوانیها و بازگشتهای میانرویهای (interprocedural).
- "range1="
- زیررشتهٔ SGR برای اولین محدودهٔ اضافی.
- "range2="
- زیررشتهٔ SGR برای دومین محدودهٔ اضافی.
- "locus="
- زیررشتهٔ SGR برای اطلاعات مکان، مانند file:line یا file:line:column و غیره.
- "quote="
- زیررشتهٔ SGR برای اطلاعات چاپشده درون علامتهای نقلقول.
- "fnname="
- زیررشتهٔ SGR برای نام توابع C++.
- "targs="
- زیررشتهٔ SGR برای مقیدسازیهای پارامتر قالب تابع در C++.
- "fixit-insert="
- زیررشتهٔ SGR برای راهنماییهای fix-it که متنی را برای درج یا جایگزینی پیشنهاد میکنند.
- "fixit-delete="
- زیررشتهٔ SGR برای راهنماییهای fix-it که متنی را برای حذف پیشنهاد میکنند.
- "diff-filename="
- زیررشتهٔ SGR برای سرایندهای نام فایل در وصلههای (patch) تولیدشده.
- "diff-hunk="
- زیررشتهٔ SGR برای آغاز قطعهها (hunkها) در وصلههای تولیدشده.
- "diff-delete="
- زیررشتهٔ SGR برای خطوط حذفشده در وصلههای تولیدشده.
- "diff-insert="
- زیررشتهٔ SGR برای خطوط درجشده در وصلههای تولیدشده.
- "type-diff="
- زیررشتهٔ SGR برای برجستهسازی نوعهای ناهماهنگ درون آرگومانهای قالب در فرانتاند C++.
- "valid="
- زیررشتهٔ SGR برای برجستهسازی عناصر معتبر در نمودارهای هنر متنی (text art).
- "invalid="
- زیررشتهٔ SGR برای برجستهسازی عناصر نامعتبر در نمودارهای هنر متنی.
- "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 استفاده از auto خواهد بود اگر هر یک از متغیرهای محیطی GCC_URLS یا TERM_URLS در محیط کامپایلر موجود و غیرخالی باشند، و در صورت عدم وجود هر دو، روی never قرار میگیرد.
با این حال، حتی با -fdiagnostics-urls=always نیز این رفتار وابسته به این متغیرهای محیطی است: اگر GCC_URLS روی مقدار خالی یا no تنظیم شده باشد، نشانیهای وب را در پیامهای تشخیصی قرار نده. اگر روی st تنظیم شده باشد، URLها از توالیهای گریز ST استفاده میکنند. اگر روی bel (حالت پیشفرض) تنظیم شده باشد، URLها از توالیهای گریز BEL استفاده میکنند. هر مقدار غیرخالی دیگر این ویژگی را فعال میکند. اگر GCC_URLS تنظیم نشده باشد، از TERM_URLS بهعنوان جایگزین استفاده میشود. نکته: ST یک توالی گریز ANSI (پایانهبخش رشته ESC \) است، و BEL یک نویسهٔ ASCII است (CTRL-G) که معمولاً صدایی شبیه بوق ایجاد میکند.
در حال حاضر GCC تلاش میکند پایانههایی را که ویژگی URL در آنها پیادهسازی نشده و باگ دارند یا دستکم در برخی نسخههایی که هنوز در حال استفادهاند باگ داشتهاند و توالیهای گریز URL در آنها ممکن است رفتار نادرستی نشان دهند (یعنی نویسههای زائد روی صفحه چاپ کنند) را نیز شناسایی کند. این فهرست در حال حاضر شامل xfce4-terminal، برخی نسخههای اشکالدار شناختهشدهٔ gnome-terminal، کنسول لینوکس (linux console) و mingw است. با استفاده از -fdiagnostics-urls=always میتوان این بررسی را نادیده گرفت.
- -fno-diagnostics-show-option
- بهطور پیشفرض، هر پیام تشخیصی صادرشده شامل متنی است که گزینهٔ خط فرمانیِ کنترلکنندهٔ مستقیم آن پیام را نشان میدهد (در صورتی که چنین گزینهای برای سازوکار تشخیص شناختهشده باشد). تعیین پرچم -fno-diagnostics-show-option مانع از این رفتار میشود.
- -fno-diagnostics-show-caret
- بهطور پیشفرض، هر پیام تشخیصی صادرشده شامل سطر کد منبع اصلی و یک نشانگر ^ برای نشان دادن ستون مربوطه است. این گزینه مانع از نمایش این اطلاعات میشود. در صورت مشخص شدن گزینهٔ -fmessage-length=n، سطر کد منبع به n نویسه کوتاه میشود. هنگامی که خروجی به پایانه ارسال میشود، عرض آن به مقداری که توسط متغیر محیطی COLUMNS مشخص شده، یا در صورت تنظیم نشدن، به عرض پایانه محدود میگردد.
- -fno-diagnostics-show-labels
- بهطور
پیشفرض،
هنگام چاپ
کد منبع (از
طریق -fdiagnostics-show-caret)،
پیامهای
تشخیصی
میتوانند
محدودههایی
از کد منبع
را با
اطلاعات
مربوطه
برچسبگذاری
کنند،
مانند نوع
عبارتها:
printf ("foo %s bar", long_i + long_j); ~^ ~~~~~~~~~~~~~~~ | | char * long intاین گزینه از چاپ این برچسبها جلوگیری میکند (در مثال بالا، خطهای عمودی و عبارتهای "char *" و "long int").
- -fno-diagnostics-show-event-links
- بهطور
پیشفرض،
هنگام چاپ
مسیرهای
اجرا (از
طریق
-fdiagnostics-path-format=inline-events)، GCC
خطوطی را
برای اتصال
رویدادهای
مرتبط چاپ
میکند،
مانند خطی
که
رویدادهای
۱ و ۲ را در
نمونهٔ زیر
به هم متصل
میکند:
3 | if (p) | ^ | | | (1) following `false' branch (when `p' is NULL)... ->-+ | | | | |+------------------------------------------------------------+ 4 || return 0; 5 || return *p; || ~ || | |+-------->(2) ...to here | (3) dereference of NULL `p'
این گزینه از چاپ چنین خطوط اتصالدهندهای جلوگیری میکند.
- -fno-diagnostics-show-cwe
- پیامهای
تشخیصی
میتوانند
به صورت
اختیاری
دارای یک
شناسهٔ
CWE ("https://cwe.mitre.org/index.html") مرتبط باشند. خود GCC چنین فرادادهای را تنها برای برخی از پیامهای تشخیصی -fanalyzer فراهم میکند. افزایههای GCC نیز ممکن است پیامهای تشخیصی دارای چنین فرادادهای ارائه دهند. بهطور پیشفرض، در صورت وجود این اطلاعات، همراه با پیام تشخیصی چاپ خواهد شد. این گزینه از چاپ این فراداده جلوگیری میکند. - -fno-diagnostics-show-rules
- پیامهای تشخیصی میتوانند به صورت اختیاری دارای قواعد مرتبط باشند، مانند قواعد ناشی از یک استاندارد کدنویسی، یا یک مشخصهٔ فنی. خود GCC این کار را برای هیچیک از پیامهای تشخیصی خود انجام نمیدهد، اما افزایهها ممکن است چنین کنند. بهطور پیشفرض، در صورت وجود این اطلاعات، همراه با پیام تشخیصی چاپ خواهد شد. این گزینه از چاپ این فراداده جلوگیری میکند.
- -fno-diagnostics-show-highlight-colors
- GCC میتواند
هنگام چاپ
پیامهای
تشخیصی و
نقل کد منبع
کاربر، از
رنگ برای
تأکید و
ایجاد
تمایز
استفاده
کند.
برای نمونه، در
demo.c: In function `test_bad_format_string_args': ../../src/demo.c:25:18: warning: format `%i' expects argument of type `int', but argument 2 has type `const char *' [-Wformat=] 25 | printf("hello %i", msg); | ~^ ~~~ | | | | int const char * | %s
- عبارتهای %i و "int" در پیام و همچنین "int" در کد منبع نقلشده با استفاده از "highlight-a" (بهطور پیشفرض سبز پررنگ) رنگآمیزی میشوند، و
- عبارت "const char *" در پیام و در کد منبع نقلشده هر دو با استفاده از "highlight-b" (بهطور پیشفرض آبی پررنگ) رنگآمیزی میشوند.
هدف این است که با بهرهگیری از رنگ برای گروهبندی مؤلفههای مرتبط و ایجاد تمایز میان موارد ناسازگار، توجه خواننده به ارتباط میان جنبههای مختلف پیام تشخیصی و کد منبع جلب شود.
این رنگآمیزی تکمیلی در صورت فعال بودن چاپ رنگی (طبق -fdiagnostics-color=) بهطور پیشفرض فعال است، اما میتوان آن را بهطور جداگانه از طریق -fno-diagnostics-show-highlight-colors غیرفعال کرد.
- -fno-diagnostics-show-line-numbers
- بهطور پیشفرض، هنگام چاپ کد منبع (از طریق -fdiagnostics-show-caret)، یک حاشیهٔ چپ برای نمایش شمارههای سطر چاپ میشود. این گزینه از چاپ این حاشیهٔ چپ جلوگیری میکند.
- -fdiagnostics-minimum-margin-width=width
- این گزینه حداقل عرض حاشیهٔ چپ چاپشده توسط -fdiagnostics-show-line-numbers را کنترل میکند. مقدار پیشفرض آن 6 است.
- -fdiagnostics-show-context[=depth]
- -fno-diagnostics-show-context
- با این
گزینه،
کامپایلر
ممکن است
زنجیرهٔ
جریان
کنترلِ
مهمی را که
از بلوک
پایهای
دستورِ
دارای
هشدار
محافظت
میکند،
چاپ نماید.
depth حداکثر
عمق
زنجیرهٔ
جریان
کنترل است.
در حال
حاضر،
فهرست
گزینههای
هشدار تحت
تأثیر شامل
این موارد
است: -Warray-bounds،
-Wstringop-overflow، -Wstringop-overread،
-Wstringop-truncation و -Wrestrict.
ممکن است در
نسخههای
بعدی،
گزینههای
هشدار
بیشتری به
این فهرست
اضافه شوند.
صورتهای
-fdiagnostics-show-context و
-fno-diagnostics-show-context به
ترتیب
نامهای
مستعاری
برای -fdiagnostics-show-context=1
و -fdiagnostics-show-context=0
هستند..IP
-fdiagnostics-parseable-fixits 4
راهنماییهای
تصحیح (fix-it hints) را
در قالبی
ماشینخوان
(machine-parseable) و مناسب
برای
استفاده در
IDEها صادر
میکند. به
ازای هر fix-it،
خطی پس از
پیام
عیبیابی
مربوطه چاپ
میشود که
با رشتهی
"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") گریزدهی (escape) میکنند.
یک رشته جایگزین خالی نشان میدهد که بازه دادهشده باید حذف شود. یک بازه خالی (مثلاً "45:3-45:3") نشان میدهد که رشته باید در موقعیت دادهشده درج شود.
- -fdiagnostics-generate-patch
- راهنماییهای
تصحیح را پس
از چاپ
هرگونه
پیام
عیبیابی،
در قالب 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++، هنگام
چاپ
پیامهای
عیبیابی
که عدم
تطابق
انواع الگو
(template) را نشان
میدهند،
مانند:
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 events)
را برای
پیامهای
عیبیابی
که چنین
مسیری به
آنها
مرتبط است،
مشخص
میکند.
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جریان کنترل بینرویهای با گروهبندی رویدادها بر پایه فریم پشته (stack frame) و استفاده از دندانهگذاری برای نشان دادن نحوه تودرتو شدن، قرار گرفتن در پشته (push) و خارج شدن از آن (pop) نشان داده میشود.
برای نمونه:
'test': events 1-2 | | 133 | { | | ^ | | | | | (1) entering 'test' | 134 | boxed_int *obj = make_boxed_int (i); | | ~~~~~~~~~~~~~~~~~~ | | | | | (2) calling 'make_boxed_int' | +--> 'make_boxed_int': events 3-4 | | 120 | { | | ^ | | | | | (3) entering 'make_boxed_int' | 121 | boxed_int *result = (boxed_int *)wrapped_malloc (sizeof (boxed_int)); | | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ | | | | | (4) calling 'wrapped_malloc' | +--> 'wrapped_malloc': events 5-6 | | 7 | { | | ^ | | | | | (5) entering 'wrapped_malloc' | 8 | return malloc (size); | | ~~~~~~~~~~~~~ | | | | | (6) calling 'malloc' | <-------------+ | 'test': event 7 | | 138 | free_boxed_int (obj); | | ^~~~~~~~~~~~~~~~~~~~ | | | | | (7) calling 'free_boxed_int' | (etc) این گزینه اطلاعات بیشتری را هنگام چاپ مسیرهای جریان کنترل مرتبط با یک پیام عیبیابی فراهم میکند. اگر این گزینه مشخص شود، عمق پشته برای هر توالی از رویدادها در -fdiagnostics-path-format=inline-events چاپ خواهد شد. اگر همراه با -fdiagnostics-path-format=separate-events مشخص شود، هنگام چاپ هر رویداد، عمق پشته و اعلان تابع ضمیمه خواهد شد. این گزینه برای استفادهٔ توسعهدهندگان GCC و توسعهدهندگان افزونهها هنگام اشکالزدایی پیامهای عیبیابی که جریان کنترل بینرویهای را گزارش میدهند، در نظر گرفته شده است. - -fno-show-column
-
شمارهٔ ستونها را در پیامهای عیبیابی چاپ نمیکند. این ممکن است زمانی لازم باشد که پیامهای عیبیابی توسط برنامهای که شمارهٔ ستونها را متوجه نمیشود، مانند dejagnu، پویش میشوند.
- -fdiagnostics-column-unit=UNIT
-
واحد شمارهٔ ستون را انتخاب میکند. این گزینه بر پیامهای عیبیابی سنتی (در صورت عدم استفاده از -fno-show-column) اثر میگذارد. مقدار پیشفرض UNIT، یعنی display، تعداد ستونهای نمایش اشغالشده توسط هر نویسه را در نظر میگیرد. این مقدار ممکن است در مورد نویسههای تب (tab) از تعداد بایتهای لازم برای کدگذاری نویسه بیشتر باشد، یا در مورد نویسههای چندبایتی کمتر باشد. برای نمونه، نویسهٔ «GREEK SMALL LETTER PI (U+03C0)» یک ستون نمایش را اشغال میکند و کدگذاری UTF-8 آن نیازمند دو بایت است؛ نویسهٔ «SLIGHTLY SMILING FACE (U+1F642)» دو ستون نمایش را اشغال میکند و کدگذاری UTF-8 آن به چهار بایت نیاز دارد. تنظیم UNIT روی byte در تمام موارد شمارهٔ ستون را به شمارش بایتهای خام تغییر میدهد، همانطور که پیش از نگارش 11.1.0 به صورت سنتی در خروجی GCC چاپ میشد.
- -fdiagnostics-column-origin=ORIGIN
-
مبدأ شمارهٔ ستونها را انتخاب میکند، یعنی شمارهٔ ستونی که به ستون نخست اختصاص مییابد. مقدار پیشفرض 1 با رفتار سنتی GCC و راهنمای سبک نگارش گنو مطابقت دارد. برخی ابزارها ممکن است با مبدأ 0 بهتر کار کنند؛ هر مقدار غیرمنفی را میتوان مشخص کرد.
- -fdiagnostics-escape-format=FORMAT
-
هنگامی که GCC خطوط سورس مرتبط با یک پیام عیبیابی را چاپ میکند، معمولاً تلاش میکند بایتهای سورس را مستقیماً چاپ کند. با این حال، برخی از پیامهای عیبیابی به مشکلات کدگذاری در فایل سورس، مانند UTF-8 ناهنجار یا مشکلات استانداردسازی یونیکد مربوط میشوند. این پیامهای عیبیابی علامتگذاری میشوند تا GCC هنگام چاپ خطوط سورس مربوط به آنها، بایتهایی را که اسکی قابلچاپ نیستند گریزدهی کند. این گزینه نحوهٔ گریزدهی چنین بایتهایی را کنترل میکند. مقدار پیشفرض 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
- برخی
پیامهای
عیبیابی
میتوانند
شامل
نمودارهای
«هنر متنی»
باشند:
تجسمهایی
ایجادشده
از متن، که
برای
مشاهده در
یک قلم با
عرض ثابت (monospaced)
در نظر
گرفته
شدهاند.
این گزینه مشخص میکند چه نویسههایی، در صورت وجود، باید برای چاپ چنین نمودارهایی به کار روند. CHARSET یکی از مقادیر none، ascii، unicode یا emoji است.
مقدار none از چاپ چنین نمودارهایی جلوگیری میکند. مقدار ascii تضمین میکند که این نمودارها اسکی خالص («هنر اسکی») باشند. مقدار unicode امکان استفادهٔ محتاطانه از نویسههای ترسیمی یونیکد (مانند نویسههای رسم جعبه و کادر) را فراهم میکند. مقدار emoji همچنین امکان استفاده از ایموجی در خروجی را اضافه میکند (مانند انتشار U+26A0 WARNING SIGN و به دنبال آن U+FE0F VARIATION SELECTOR-16 برای انتخاب گونهٔ ایموجی نویسه).
مقدار پیشفرض emoji است، مگر زمانی که متغیر محیطی LANG روی C تنظیم شده باشد که در این حالت پیشفرض ascii خواهد بود.
- -fno-diagnostics-show-nesting
- برخی
پیامهای
عیبیابی GCC
دارای یک
ساختار
درختی
درونی از
زیرپیامهای
تودرتو
هستند،
مانند
مشکلاتی که
هنگام
نمونهسازی
الگوهای ++C
رخ میدهند.
بهطور پیشفرض، GCC از تورفتگی و نشانههای گلولهای در خروجی متنی خود برای نمایش ساختار تودرتوی این پیامها استفاده میکند، اطلاعات مکان را برای شفافتر شدن ساختار به خطوط جداگانه منتقل میکند، و اطلاعات تکراری اضافی را حذف مینماید.
انتخاب -fno-diagnostics-show-nesting مانع این تورفتگی، تغییر قالببندی و حذف اطلاعات شده و ظاهر قدیمیتر پیامهای عیبیابی را بازمیگرداند.
- -fno-diagnostics-show-nesting-locations
- هنگامی که fdiagnostics-show-nesting فعال باشد، نامهای فایل و شمارههای سطر و ستون در خطوطی جدا از پیامها نمایش داده میشوند. این اطلاعات مکان را میتوان با استفاده از -fno-diagnostics-show-nesting-locations بهطور کامل غیرفعال کرد. این گزینه برای استفادهٔ توسعهدهندگان GCC به منظور نوشتن موارد آزمون DejaGnu در نظر گرفته شده است.
- -fdiagnostics-show-nesting-levels
- هنگامی که fdiagnostics-show-nesting فعال است، با استفاده از fdiagnostics-show-nesting-levels میتوان اعدادی را که نشاندهندهٔ عمق تودرتویی هستند نیز نمایش داد. این گزینه برای استفادهٔ توسعهدهندگان GCC به منظور اشکالزدایی پیامهای عیبیابی تودرتو کاربرد دارد، اما ممکن است برای نویسندگان افزونهها نیز مفید باشد.
- -fdiagnostics-format=FORMAT
- قالب
متفاوتی را
برای چاپ
پیامهای
عیبیابی
انتخاب
میکند. FORMAT
یکی از
مقادیر text،
sarif-stderr یا sarif-file
است.
استفاده از این گزینه جایگزین هر مقصد خروجی اضافی تعیینشده توسط -fdiagnostics-add-output=، یا مقدار تنظیمشده توسط -fdiagnostics-set-output= میشود.
مقدار پیشفرض text است.
قالبهای sarif-stderr و sarif-file هر دو پیامهای عیبیابی را در قالب SARIF نگارش 2.1.0 صادر میکنند؛ اولی به stderr و دومی به فایلی با نام source.sarif.
- -fdiagnostics-add-output=DIAGNOSTICS-OUTPUT-SPEC
- یک مقصد
خروجی
اضافی برای
صدور
پیامهای
عیبیابی
میافزاید.
DIAGNOSTICS-OUTPUT-SPEC باید یک طرحواره را مشخص کند که بهصورت اختیاری با ":" و یک یا چند جفت KEY=VALUE دنبال میشود، به این شکل:
<SCHEME> <SCHEME>:<KEY>=<VALUE> <SCHEME>:<KEY>=<VALUE>,<KEY2>=<VALUE2>
و غیره.
طرحوارهها، کلیدها یا مقادیری که نام آنها با پیشوند «experimental» آغاز میشود ممکن است بدون اطلاع قبلی تغییر کنند یا حذف شوند. کلیدها میتوانند مختص به هر طرحواره باشند یا به کلیت GCC مربوط شوند.
SCHEME میتواند یکی از موارد زیر باشد:
- text
- پیامهای
عیبیابی
را با
استفاده از
قالب متنی
کلاسیک GCC به
stderr ارسال
میکند.
کلیدهای پشتیبانیشده برای طرحوارهٔ "text" عبارتند از:
- color=[yes|no]
- تنظیمات رنگآمیزی تعیینشده در -fdiagnostics-color را برای این خروجی متنی بازنویسی میکند.
- show-nesting=[yes|no]
- حالتی را فعال میکند که بر روابط سلسلهمراتبی درون پیامهای عیبیابی تأکید دارد، همانطور که در -fdiagnostics-show-nesting شرح داده شد. پیشفرض "yes" است.
- show-nesting-locations=[yes|no]
- اگر "show-nesting=yes" باشد، مکانها بهطور پیشفرض نمایش داده میشوند؛ این کلید را روی "no" تنظیم کنید تا چاپ این مکانها غیرفعال شود. این گزینه برای استفادهٔ توسعهدهندگان GCC به منظور نوشتن موارد آزمون DejaGnu وجود دارد.
- show-nesting-levels=[yes|no]
- این یک گزینهٔ اشکالزدایی برای استفاده همراه با "show-nesting=yes" است. این کلید را روی "yes" تنظیم کنید تا سطوح تودرتویی به طور صریح در خروجی چاپ شوند. این گزینه برای استفادهٔ توسعهدهندگان GCC در نظر گرفته شده است.
کلیدهای پشتیبانیشده برای طرحوارهٔ "sarif" عبارتاند از:
- file=FILENAME
- مشخص کردن نام فایلی که خروجی SARIF در آن نوشته میشود؛ که میتواند با یک مسیر مطلق یا نسبی در ابتدا همراه باشد. در صورت مشخص نشدن، پیشفرض source.sarif خواهد بود.
- serialization=[json]
- مشخص کردن قالب سریالسازی مورد استفاده هنگام نوشتن خروجی SARIF. در حال حاضر این مقدار تنها میتواند "json" باشد، اما به عنوان نقطهای جهت گسترش برای آزمایش سایر قالبهای سریالسازی قرار داده شده است.
- version=[2.1|2.2-prerelease]
- مشخص کردن نسخهٔ SARIF برای استفاده در خروجی. در صورت تعیین نشدن، پیشفرض 2.1 است. "2.2-prerelease" از یک پیشنویس غیررسمی از مشخصات آیندهٔ SARIF 2.2 استفاده میکند و در این انتشار تنها باید برای امور آزمایشی به کار رود.
همچنین این کلید برای استفادهٔ توسعهدهندگان GCC (نه کاربران نهایی) در نظر گرفته شده و ممکن است بدون اطلاع قبلی تغییر کرده یا حذف شود:
- state-graphs=[yes|no]
- این یک قابلیت اشکالزدایی است و مقدار پیشفرض آن "no" میباشد. اگر "state-graphs=yes" باشد، تلاش میشود اطلاعات تفصیلی وضعیت از -fanalyzer در SARIF تولیدشده ثبت گردد.
- experimental-html
- انتشار
پیامهای
عیبیابی
در یک فایل
با قالب HTML.
این
طرحواره
آزمایشی
است، و ممکن
است در
نگارشهای
آیندهٔ GCC
حذف شود.
همچنین
کلیدها و
جزئیات
خروجی ممکن
است تغییر
کنند.
کلیدهای پشتیبانیشده برای طرحوارهٔ "experimental-html" عبارتاند از:
- css=[yes|no]
- افزودن یک عنصر توکار <style> به HTML تولیدشده. پیشفرض yes است.
- file=FILENAME
- مشخص کردن نام فایلی که خروجی HTML در آن نوشته میشود؛ که میتواند با یک مسیر مطلق یا نسبی در ابتدا همراه باشد. در صورت مشخص نشدن، پیشفرض source.html خواهد بود.
- javascript=[yes|no]
- افزودن یک عنصر توکار <script> به HTML تولیدشده که یک رابط کاربری ساده را برای مشاهدهٔ نتایج فراهم میکند. پیشفرض yes است.
همچنین این کلیدها برای استفادهٔ توسعهدهندگان GCC (نه کاربران نهایی) در نظر گرفته شدهاند و ممکن است بدون اطلاع قبلی تغییر کرده یا حذف شوند:
- show-state-diagrams=[yes|no]
- این یک قابلیت اشکالزدایی است و مقدار پیشفرض آن "no" میباشد. اگر "show-state-diagrams=yes" باشد، تلاش میشود تا با استفاده از dot نمودارهای SVG در HTML تولیدشده ایجاد شوند تا وضعیت را در هر رویداد از یک مسیر عیبیابی به صورت بصری نمایش دهند. این نمودارها با فشردن «j» و «k» جهت گام برداشتن به جلو و عقب در میان رویدادها قابل مشاهده هستند. فعالسازی این گزینه روند تولید HTML را کُند خواهد کرد.
- show-graph-dot-src=[yes|no]
- این یک قابلیت اشکالزدایی است و مقدار پیشفرض آن "no" میباشد. اگر "show-graph-dot-src=yes" باشد، آنگاه در صورت فعال بودن "show-state-diagrams=yes"، نمودارهای وضعیت تولیدشده همچنین کد منبع dot. ورودی GraphViz را که برای ترسیم نمودار استفاده شده نشان خواهند داد.
- show-graph-sarif=[yes|no]
- این یک قابلیت اشکالزدایی است و مقدار پیشفرض آن "no" میباشد. اگر "show-graph-sarif=yes" باشد، آنگاه در صورت فعال بودن "show-state-diagrams=yes"، نمودارهای وضعیت تولیدشده همچنین بازنمایی SARIF از وضعیت را نشان خواهند داد.
علاوه بر کلیدهای ویژهٔ هر طرحواره، کلید مرتبط با GCC زیر نیز روی مقصدهای خروجی (sinks) با هر طرحوارهای قابل استفاده است:
- cfgs=[yes|no]
- اگر برای یک مقصد خروجی مقدار "cfgs=yes" تعیین شود، GCC تلاش خواهد کرد اطلاعات مربوط به نمودارهای جریان کنترل (CFG) توابعی را که کامپایل میکند به آن مقصد ارسال نماید. مقصدهای متنی این اطلاعات را نادیده میگیرند. مقصدهای SARIF این نمودارها را درون "theRun.graphs" اضافه خواهند کرد. مقصدهای HTML تصاویری به شکل SVG تولید میکنند که نمودارها را نمایش میدهد. شکل دقیق این اطلاعات ممکن است بدون اطلاع قبلی تغییر کند.
برای نمونه،
-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" | "experimental-html";
<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= ایجاد شدهاند.
- -fno-diagnostics-json-formatting
- به طور
پیشفرض،
هنگامی که JSON
برای
پیامهای
عیبیابی
(از طریق
-fdiagnostics-format=sarif-stderr یا
-fdiagnostics-format=sarif-file)
تولید
میشود، GCC
خطوط جدید و
فاصلهگذاری
تورفتگی
اضافه
میکند تا
ساختار
سلسلهمراتبی
JSON به صورت
بصری
برجسته شود.
برای حذف این فاصلهها از -fno-diagnostics-json-formatting استفاده کنید. این گزینه باید پیش از گزینهای که قرار است بر آن تأثیر بگذارد، تعیین شود.
این گزینه جهت سازگاری با ابزارهایی در نظر گرفته شده که انتظار ندارند خروجی شامل خطوط جدید باشد، مانند خروجی تولیدشده توسط نگارشهای قدیمیتر GCC..SS "گزینههایی برای درخواست یا سرکوب اخطارها (Options to Request or Suppress Warnings)" اخطارها (Warnings) پیامهای تشخیصی هستند که ساختارهایی را گزارش میکنند که ذاتاً نادرست نیستند، اما مخاطرهآمیز بوده یا نشان میدهند که ممکن است خطایی رخ داده باشد.
گزینههای مستقل از زبانِ زیر، اخطارهای خاصی را فعال نمیکنند، بلکه انواع پیامهای تشخیصی تولیدشده توسط GCC را کنترل میکنند.
- -fsyntax-only
- کد را فقط برای خطاهای نحوی بررسی میکند، اما فراتر از آن کاری انجام نمیدهد.
- -fmax-errors=n
- حداکثر تعداد پیامهای خطا را به n محدود میکند؛ در این نقطه GCC بهجای تلاش برای ادامهٔ پردازش کد منبع، کار را متوقف میکند. اگر n برابر 0 (پیشفرض) باشد، هیچ محدودیتی در تعداد پیامهای خطای تولیدشده وجود ندارد. اگر -Wfatal-errors نیز مشخص شده باشد، -Wfatal-errors بر این گزینه اولویت دارد.
- -w
- --no-warnings
- از صدور تمامی پیامهای اخطار جلوگیری میکند.
- -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
- --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 نمایانگر یک گویش گسترشیافتهٔ گنو برای C باشد (مانند gnu90 یا gnu99)، یک استاندارد پایه متناظر وجود دارد، یعنی نسخهٔ ISO C که گویش گسترشیافتهٔ گنو بر پایهٔ آن استوار است. اخطارهای ناشی از -Wpedantic در مواردی صادر میشوند که توسط استاندارد پایه الزامی شده باشند. (منطقی نیست که این اخطارها فقط برای ویژگیهایی صادر شوند که در گویش مشخصشدهٔ GNU C وجود ندارند، زیرا طبق تعریف، گویشهای گنو برای C شامل تمام ویژگیهایی هستند که کامپایلر با گزینهٔ دادهشده پشتیبانی میکند و چیزی برای اخطار دادن وجود نخواهد داشت.)
- -pedantic-errors
- --pedantic-errors
- هر زمان که
استاندارد
پایه (نگاه
کنید به -Wpedantic)
نیازمند یک
پیام
تشخیصی
باشد، در
برخی موارد
که رفتار
تعریفنشده
(undefined behavior) در زمان
کامپایل
وجود دارد،
و در برخی
موارد دیگر
که مانع از
کامپایل
برنامههای
معتبر بر
اساس
استاندارد
نمیشوند،
یک خطا صادر
میکند. این
گزینه
معادل -Werror=pedantic
نیست:
گزینهٔ
اخیر بعید
است مفید
باشد، زیرا
تنها
پیامهای
تشخیصی
کنترلشده
توسط -Wpedantic را
به خطا
تبدیل
میکند، در
حالی که این
گزینه بر
پیامهای
تشخیصی
الزامی که
همیشه فعال
هستند یا
توسط
گزینههایی
غیر از -Wpedantic
کنترل
میشوند
نیز اثر
میگذارد.
اگر میخواهید پیامهای تشخیصی الزامی که بهطور پیشفرض اخطار هستند به خطا تبدیل شوند، اما همزمان تمایلی به فعالسازی پیامهای تشخیصی -Wpedantic ندارید، میتوانید -pedantic-errors -Wno-pedantic را مشخص کنید (یا -pedantic-errors -Wno-error=pedantic را برای فعالسازی آنها اما فقط در قالب اخطار).
برخی از پیامهای تشخیصی الزامی بهطور پیشفرض خطا هستند، اما میتوان با استفاده از -fpermissive یا گزینهٔ اخطار اختصاصی آنها، مانند -Wno-error=narrowing، آنها را به اخطار کاهش داد.
برخی از پیامهای تشخیصی برای رفتارهای غیر منطبق با استاندارد ISO توسط گزینههای اخطار اختصاصی غیر از -Wpedantic کنترل میشوند، اما توسط -pedantic-errors نیز به خطا تبدیل میگردند. برای نمونه:
-Wattributes (برای ویژگیهای استاندارد) -Wchanges-meaning (در C++) -Wcomma-subscript (C++23 یا جدیدتر) -Wdeclaration-after-statement (C90 یا قدیمیتر) -Welaborated-enum-base (C++11 یا جدیدتر) -Wimplicit-int (C99 یا جدیدتر) -Wimplicit-function-declaration (C99 یا جدیدتر) -Wincompatible-pointer-types -Wint-conversion -Wlong-long (C90 یا قدیمیتر) -Wmain -Wnarrowing (C++11 یا جدیدتر) -Wpointer-arith -Wpointer-sign -Wincompatible-pointer-types -Wregister (C++17 یا جدیدتر) -Wvla (C90 یا قدیمیتر) -Wwrite-strings (C++11 یا جدیدتر)
- -fpermissive
- برخی از
پیامهای
تشخیصی
الزامی در
مورد کدهای
ناسازگار
با
استاندارد
را از خطا
به اخطار
تنزل
میدهد.
بنابراین،
استفاده از
-fpermissive اجازه
میدهد
برخی کدهای
ناسازگار
با
استاندارد
کامپایل
شوند. برخی
پیامهای
تشخیصی C++
تنها توسط
این پرچم
کنترل
میشوند،
اما این
گزینه برخی
پیامهای
تشخیصی C و C++
را نیز که
پرچم
اختصاصی
خود را
دارند تنزل
میدهد:
-Wabbreviated-auto-in-template-arg (فقط C++ و Objective-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)..IP -Wall 4
- --all-warnings
- این گزینه
تمام
هشدارهای
مربوط به
ساختارهایی
را که برخی
کاربران
مشکوک تلقی
میکنند و
اجتناب از
آنها (یا
تغییر
دادنشان
برای
جلوگیری از
هشدار) حتی
در ترکیب با
ماکروها
آسان است،
فعال
میکند. این
گزینه
همچنین
برخی
هشدارهای
مختص زبان
را که در 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
- --extra-warnings
- این گزینه
برخی از
پرچمهای
هشدار
اضافی را که
توسط -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) -Wmultiple-parameter-fwd-decl-lists (فقط 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 (فقط C/ObjC) -Wunused-parameter (تنها با -Wunused یا -Wall) -Wunused-but-set-parameter (تنها با -Wunused یا -Wall)
گزینه -Wextra همچنین برای موارد زیر پیام هشدار چاپ میکند:
- یک اشارهگر با عدد صحیح صفر با استفاده از "<"، "<="، ">" یا ">=" مقایسه شود.
- (فقط C++) یک شمارشوند (enumerator) و یک غیرشمارشوند هر دو در یک عبارت شرطی ظاهر شوند.
- (فقط C++) کلاسهای پایه مجازی مبهم.
- (فقط C++) اندیسگذاری روی آرایهای که به صورت "register" اعلان شده است.
- (فقط C++) گرفتن آدرس متغیری که به صورت "register" اعلان شده است.
- (فقط C++) یک کلاس پایه در سازنده رونوشت یک کلاس مشتقشده مقداردهی اولیه نشده باشد.
- -Wabi (فقط C، Objective-C، C++ و Objective-C++)
- هشدار
درباره
کدهایی که
تحت تأثیر
تغییرات ABI
قرار
میگیرند.
این شامل
کدهایی است
که ممکن است
با ABI مستقل
از سازنده
در C++ و
همچنین 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 مشخص نشده باشد، شماره نسخه ارائهشده با این گزینه برای نامهای مستعار سازگاری استفاده میشود. اگر هیچ شماره نسخه صریحی با این گزینه ارائه نشود، اما -fabi-compat-version مشخص شده باشد، آن شماره نسخه برای هشدارهای ABI در C++ استفاده خواهد شد.
اگرچه تلاش شده است تا درباره همه این موارد هشدار داده شود، اما احتمالاً مواردی وجود دارند که درباره آنها هشداری صادر نمیشود، حتی اگر 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"
بهعنوان
مقیدکنندههای
نوع (type qualifiers)
منگل
میشدند، و
"decltype" یک
اعلان ساده
نادیده
گرفته و حذف
(folded away) میشد.
این مشکلات منگلسازی در -fabi-version=5 برطرف شدند.
- شمارندههای
دامنهدار
(scoped enumerators) که
بهعنوان
آرگومان به
یک تابع با
تعداد
متغیر
آرگومان (variadic)
ارسال
میشوند،
مانند
شمارندههای
بدون دامنه
ارتقا
مییابند و
باعث اعلام
هشدار
"va_arg"
میشوند. در
بیشتر
معماریهای
هدف، این
موضوع
واقعاً بر ABI
ارسال
پارامترها
تأثیری
نمیگذارد،
زیرا هیچ
راهی برای
ارسال یک
آرگومان
کوچکتر از
"int" وجود
ندارد.
همچنین، در ABI نحوه منگلسازی بستههای آرگومان قالب (template argument packs)، "const_cast"، "static_cast"، افزایش/کاهش پیشوندی، و تابع با دامنه کلاس که بهعنوان آرگومان قالب استفاده شده، تغییر یافت.
این مشکلات در -fabi-version=6 اصلاح شدند.
- توابع
لامبدا در
دامنه
آرگومان
پیشفرض
بهنادرستی
منگل
میشدند، و
ABI نحوهی
منگلسازی
"nullptr_t" را
تغییر داد.
این مشکلات در -fabi-version=7 اصلاح شدند.
- هنگام
منگلسازی
یک نوع تابع
با
مقیدکنندههای
cv تابع (function-cv-qualifiers)،
نوع تابع
بدون قید
بهطور
نادرست
بهعنوان
نامزد
جایگزینی
(substitution candidate) در نظر
گرفته
میشد.
این مورد در -fabi-version=8، مقدار پیشفرض برای GCC 5.1، برطرف شد.
- عبارت
decltype(nullptr)
بهنادرستی
دارای
همترازی
(alignment) ۱ بود که
منجر به
دسترسیهای
ناتراز (unaligned accesses)
میشد. توجه
داشته
باشید که
این موضوع
بر 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++
بهگونهای
تغییر
یافتهاند
که بر
سازگاری
دودویی (binary compatibility)
کدهای
کامپایلشده
تأثیر
میگذارند.
با -Wpsabi،
کامپایلر GCC
میتواند
استفادههای
ناسازگار
احتمالی را
شناسایی
کرده و
درباره
آنها هشدار
دهد.
گزینه -Wpsabi بهطور پیشفرض فعال است، و همچنین توسط -Wabi نیز اعمال میشود.
- -Wno-changes-meaning (فقط C++ و Objective-C++)
- زبان C++
الزام
میکند که
استفادههای
بدون قید از
یک نام درون
یک کلاس، در
کل دامنه
کلاس معنای
یکسانی
داشته
باشند،
بنابراین
اعلان نام
پس از
استفاده از
آن نادرست و
بدریخت (ill-formed)
است:
struct A; struct B1 { A a; typedef A A; }; // warning, 'A' changes meaning struct B2 { A a; struct A { }; }; // error, 'A' changes meaningبهطور پیشفرض، حالت B1 فقط یک هشدار است زیرا هر دو اعلان نوع یکسانی دارند، در حالی که حالت B2 یک خطا به شمار میرود. هر دو پیام تشخیصی را میتوان با -Wno-changes-meaning غیرفعال کرد. همچنین، میتوان حالت خطا را با -Wno-error=changes-meaning یا -fpermissive به یک هشدار تقلیل داد.
هر دو پیام تشخیصی توسط -fms-extensions نیز سرکوب میشوند.
- -Wchar-subscripts
- اگر اندیس
یک آرایه از
نوع "char"
باشد،
هشدار
میدهد. این
یک علت شایع
خطا است،
زیرا
برنامهنویسان
اغلب
فراموش
میکنند که
این نوع در
برخی
ماشینها
علامتدار
(signed) است. به
@xref{Characters implementation}، و
"char" type signedness
رجوع کنید.
این هشدار توسط -Wall فعال میشود. در صورت فعال بودن، هشدار صرفنظر از اینکه "char" بهطور پیشفرض در معماری هدف بدونعلامت (unsigned) باشد یا نه صادر میشود، و همچنین تحت تأثیر گزینههای -fsigned-char یا -funsigned-char قرار نمیگیرد.
- -Wno-coverage-mismatch
- هنگام استفاده از گزینه -fprofile-use، در صورتی که پروفایلهای بازخورد تطابق نداشته باشند هشدار میدهد. اگر یک فایل منبع در فاصله بین کامپایل با -fprofile-generate و کامپایل با -fprofile-use تغییر کند، ممکن است فایلهای حاوی بازخورد پروفایل با فایل منبع مطابقت نداشته باشند و GCC نتواند از اطلاعات بازخورد پروفایل استفاده کند. بهطور پیشفرض، این هشدار فعال است و بهعنوان خطا در نظر گرفته میشود. از -Wno-coverage-mismatch میتوان برای غیرفعال کردن هشدار یا از -Wno-error=coverage-mismatch برای غیرفعال کردن خطا استفاده کرد. غیرفعال کردن خطا برای این هشدار میتواند منجر به تولید کدهایی با بهینهسازی ضعیف شود و فقط در صورت اعمال تغییرات بسیار جزئی مانند رفع باگ در یک پایگاه کد موجود مفید است. غیرفعال کردن کامل این هشدار توصیه نمیشود.
- -Wno-coverage-too-many-conditions
- اگر -fcondition-coverage استفاده شود و یک عبارت دارای جملات شرطی بیش از حد باشد و GCC از پوشش صرفنظر کند، هشدار میدهد. صرفنظر از پوشش زمانی رخ میدهد که تعداد شروط موجود در عبارت شرطی بیشتر از تعداد بیتهای یک "gcov_type_unsigned" باشد. این هشدار بهطور پیشفرض فعال است.
- -Wno-coverage-too-many-paths
- اگر -fpath-coverage استفاده شود و یک تابع دارای مسیرهای بیش از حد باشد و GCC از پوشش صرفنظر کند، هشدار میدهد. صرفنظر کردن توسط -fpath-coverage-limit کنترل میشود. این هشدار بهطور پیشفرض فعال است.
- -Wno-coverage-invalid-line-number
- در صورتی که
تابعی به
دلیل
ماکروهای
شماره خط
نامعتبر،
زودتر از
شروع خود به
پایان برسد
هشدار
میدهد. این
هشدار تنها
با فعال
بودن --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 Specification و برخی افزونههای 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-diag، -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-diag
- در صورت تعیین -Wformat، دربارهٔ رشتههای فرمتی که برای پیامهای تشخیصی GCC نامناسب هستند هشدار نده.
- -Wno-format-extra-args
- در صورت
تعیین -Wformat،
دربارهٔ
آرگومانهای
اضافی
ارائهشده
به یک تابع
فرمت
"printf" یا
"scanf"
هشدار نده.
استاندارد C
مشخص
میکند که
چنین
آرگومانهایی
نادیده
گرفته
میشوند.
در جاهایی که آرگومانهای استفادهنشده میان آرگومانهای استفادهشدهای قرار میگیرند که با مشخصکنندههای شماره عملوند $ تعیین شدهاند، معمولاً همچنان هشدار داده میشود؛ زیرا پیادهسازی نمیتواند بداند برای نادیده گرفتن آرگومانهای استفادهنشده چه نوعی را باید به "va_arg" ارسال کند. با این حال، در مورد فرمتهای "scanf"، چنانچه تمام آرگومانهای استفادهنشده اشارهگر باشند این گزینه هشدار را متوقف میکند، زیرا مشخصات Single Unix بیان میکند که چنین آرگومانهای استفادهنشدهای مجاز هستند.
- -Wformat-overflow
- -Wformat-overflow=level
- دربارهٔ فراخوانی توابع ورودی/خروجی قالببندیشده مانند "sprintf" و "vsprintf" که ممکن است باعث سرریز بافر مقصد شوند هشدار بده. هنگامی که تعداد دقیق بایتهای نوشتهشده توسط یک راهنمای فرمت را نتوان در زمان کامپایل مشخص کرد، این مقدار بر اساس روشهای اکتشافی که به آرگومان level و بهینهسازی وابسته هستند تخمین زده میشود. اگرچه فعال کردن بهینهسازی در اکثر موارد دقت هشدار را بهبود میبخشد، اما ممکن است منجر به هشدارهای مثبت کاذب نیز بشود.
- -Wformat-overflow
- -Wformat-overflow=1
- سطح 1 از
-Wformat-overflow که با -Wformat
فعال
میشود،
رویکردی
محافظهکارانه
را بهکار
میگیرد که
تنها
دربارهٔ
فراخوانیهایی
هشدار
میدهد که
به احتمال
زیاد باعث
سرریز بافر
میشوند. در
این سطح،
فرض میشود
آرگومانهای
عددی برای
راهنماهای
فرمت با
مقادیر
نامعلوم
دارای
مقدار یک
هستند، و
رشتههای
با طول
نامعلوم
خالی فرض
میشوند.
آرگومانهای
عددی که
مشخص است به
زیرمجموعهای
محدود از
محدودهٔ
نوع
دادهشان
محدود
شدهاند،
یا
آرگومانهای
رشتهای که
خروجی
آنها چه
توسط دقت
راهنما یا
مجموعهای
متناهی از
لیترالهای
رشتهای
محدود شده
است، فرض
میشوند
مقداری را
در آن
محدوده
اختیار
کنند که به
بیشترین
تعداد بایت
در خروجی
منجر شود.
برای مثال،
فراخوانی
"sprintf" در
زیر اخطار
دریافت
میکند
زیرا حتی با
برابر بودن
هر دو a و b
با صفر،
نویسهٔ
پایانی NUL
('\0') که
توسط تابع
به بافر
مقصد اضافه
میشود،
فراتر از
انتهای آن
نوشته
خواهد شد.
افزایش
اندازهٔ
بافر به
میزان تنها
یک بایت
برای
جلوگیری از
هشدار کافی
است، هرچند
ممکن است
برای
جلوگیری از
سرریز کافی
نباشد.
void f (int a, int b) { char buf [13]; sprintf (buf, "a = %i, b = %i\n", a, b); } - -Wformat-overflow=2
- سطح 2
همچنین
دربارهٔ
فراخوانیهایی
هشدار
میدهد که
با در نظر
گرفتن
آرگومانی
با طول یا
بزرگی کافی
ممکن است
باعث سرریز
بافر مقصد
شوند. در
سطح 2، برای
آرگومانهای
عددی
نامعلوم
کمترین
مقدار
قابلنمایش
برای انواع
علامتدار
با دقتی
بیشتر از ۱
و در غیر
این صورت
بیشترین
مقدار
قابلنمایش
در نظر
گرفته
میشود.
آرگومانهای
رشتهای
نامعلوم که
طول آنها
را نتوان
محدود به
دقت
راهنما، یا
مجموعهای
متناهی از
لیترالهای
رشتهای که
ممکن است
ارزیابی
شوند، یا
آرایهٔ
نویسهای
که ممکن است
به آن اشاره
کنند فرض
کرد، ۱
نویسه در
نظر گرفته
میشوند.
در سطح 2، فراخوانی در مثال بالا دوباره تشخیص داده میشود، اما این بار به این دلیل که اگر a برابر با یک مقدار ۳۲-بیتی "INT_MIN" باشد، نخستین راهنمای %i برخی از ارقام خود را فراتر از انتهای بافر مقصد خواهد نوشت. برای ایمن ساختن این فراخوانی صرفنظر از مقادیر دو متغیر، اندازهٔ بافر مقصد باید حداقل به ۳۴ بایت افزایش یابد. GCC حداقل اندازهٔ مورد نیاز بافر را در یک یادداشت اطلاعاتی پس از هشدار درج میکند.
یک جایگزین برای افزایش اندازهٔ بافر مقصد، محدود کردن دامنهٔ مقادیر فرمتشده است. بیشینهٔ طول آرگومانهای رشتهای را میتوان با مشخص کردن دقت در راهنمای فرمت محدود کرد. هنگامی که بتوان فرض کرد آرگومانهای عددی راهنماهای فرمت به مقداری کمتر از دقت نوع خود محدود شدهاند، انتخاب یک اصلاحکنندهٔ طول مناسب برای مشخصکنندهٔ فرمت، اندازهٔ بافر مورد نیاز را کاهش خواهد داد. برای نمونه، اگر در مثال بالا بتوان فرض کرد که a و b در محدودهٔ دقت نوع "short int" قرار دارند، استفاده از راهنمای فرمت %hi یا تبدیل نوع (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) نیاز داشته باشد و آرگومان علامتدار باشد، یا بالعکس، هشدار بده.
- -Wformat-truncation
- -Wformat-truncation=level
- دربارهٔ فراخوانی توابع ورودی/خروجی قالببندیشده مانند "snprintf" و "vsnprintf" که ممکن است منجر به کوتاهسازی (truncation) خروجی شوند هشدار بده. هنگامی که تعداد دقیق بایتهای نوشتهشده توسط یک راهنمای فرمت را نتوان در زمان کامپایل مشخص کرد، این مقدار بر اساس روشهای اکتشافی که به آرگومان level و بهینهسازی وابستهاند تخمین زده میشود. اگرچه فعالسازی بهینهسازی در اکثر موارد دقت هشدار را بهبود میبخشد، اما ممکن است منجر به هشدارهای مثبت کاذب نیز بشود. بهجز مواردی که خلاف آن ذکر شده باشد، این گزینه از همان منطق -Wformat-overflow استفاده میکند.
- -Wformat-truncation
- -Wformat-truncation=1
- سطح 1 از -Wformat-truncation که توسط -Wformat فعال میشود، رویکردی محافظهکارانه را بهکار میگیرد که تنها دربارهٔ فراخوانی توابع دارای مرزبندی هشدار میدهد که مقدار بازگشتی آنها استفاده نشده است و به احتمال زیاد منجر به کوتاهسازی خروجی میشوند.
- -Wformat-truncation=2
- سطح 2 همچنین دربارهٔ فراخوانی توابع دارای مرزبندی هشدار میدهد که مقدار بازگشتی آنها استفاده شده است و با در نظر گرفتن آرگومانی با طول یا بزرگی کافی ممکن است منجر به کوتاهسازی خروجی شوند.
- -Wnonnull
- دربارهٔ
ارسال
اشارهگر
تهی (null pointer) برای
آرگومانهایی
که با صفت (attribute)
تابعیِ
"nonnull"
بهعنوان
نیازمند
مقداری
غیرتهی
نشانهگذاری
شدهاند،
هشدار
میدهد.
-Wnonnull در -Wall و -Wformat گنجانده شده است. میتوان آن را با گزینهٔ -Wno-nonnull غیرفعال کرد.
- -Wnonnull-compare
- هنگام
مقایسهٔ یک
آرگومان
نشانهگذاریشده
با صفت
تابعی
"nonnull" با
مقدار null در
درون تابع،
هشدار
میدهد.
-Wnonnull-compare در -Wall گنجانده شده است. میتوان آن را با گزینهٔ -Wno-nonnull-compare غیرفعال کرد.
- -Wnull-dereference
- اگر کامپایلر مسیرهایی را شناسایی کند که به دلیل ارجاعزدایی از یک اشارهگر تهی (null pointer) موجب رفتار نادرست یا تعریفنشده (undefined behavior) میشوند، هشدار میدهد. این گزینه تنها زمانی فعال است که -fdelete-null-pointer-checks فعال باشد، که در بیشتر مقصدها (targets) با بهینهسازیها فعال میشود. دقت هشدارها به گزینههای بهینهسازیِ استفادهشده بستگی دارد.
- -Wno-musttail-local-addr
- دربارهٔ ارسال یک اشارهگر (یا در C++، یک ارجاع) به یک متغیر محلی یا برچسب به آرگومانی از یک فراخوانی "musttail" هشدار نمیدهد. این متغیرها پیش از دستور فراخوانی دمی (tail call) از محدوده (scope) خارج میشوند.
- -Wmaybe-musttail-local-addr
- هنگامی که
نشانی یک
متغیر محلی
بتواند به
یک
فراخوانی
"musttail"
فرار کند (escape)،
هشدار
میدهد،
مگر آنکه
پیش از
فراخوانی
"musttail" از
محدوده
خارج شده
باشد.
int foo (int *); int bar (int *x) { if (x[0] == 1) { int a = 42; foo (&a); /* Without the C<musttail> attribute this call would not be tail called, because address of the C<a> variable escapes and the second foo call could dereference it. With the attribute the local variables are assumed to go out of scope immediately before the tail call instruction and the compiler warns about this. */ [[gnu::musttail]] return foo (nullptr); } else { { int a = 42; foo (&a); } /* The C<a> variable isn't already in scope, so even when it escaped, even without C<musttail> attribute it would be undefined behavior to dereference it and the compiler could turn this into a tail call. No warning is diagnosed here. */ [[gnu::musttail]] return foo (nullptr); } }این هشدار با -Wextra فعال میشود.
- -Wnrvo (تنها C++ و Objective-C++)
- اگر
کامپایلر
کپی از یک
متغیر محلی
به مقدار
بازگشتی یک
تابع را در
زمینهای
که توسط [class.copy.elision]
مجاز
دانسته شده
حذف نکند (elide
نکند)،
هشدار
میدهد. این
حذف کپی
معمولاً با
نام
بهینهسازی
مقدار
بازگشتی
نامدار (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; }این هشدار با -Wall در C++ فعال میشود.
- -Wno-implicit-int (تنها C و Objective-C)
- این گزینه
هشدارهای
مربوط به
زمانی را که
یک اعلان
نوعی را
مشخص
نمیکند،
کنترل
میکند. این
هشدار
بهطور
پیشفرض،
بهعنوان
یک خطا (error)، در
گویشهای 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 بدون
وقفه ادامه
مییابد (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 و C23 روشی استاندارد برای نادیدهگرفتن هشدار -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++)
- اگر نوع
بازگشتی یک
تابع دارای
یک
توصیفکنندهٔ
نوع مانند
"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= برای تعیین تراز بودن دستورها استفاده میکند (پیشفرض 8 است).
این هشدار برای کدهایی که شامل منطق چندخطی پیشپردازنده هستند (مانند مثال زیر) صادر نمیشود.
if (flagA) foo (0); #if SOME_CONDITION_THAT_DOES_NOT_HOLD if (flagB) #endif foo (1);این هشدار پس از یک دستورالعمل "#line" صادر نمیشود، زیرا این دستور معمولاً نشاندهندهٔ کد بهطور خودکار تولیدشده است و هیچ فرضی دربارهٔ ساختار فایلی که دستورالعمل به آن ارجاع میدهد نمیتوان داشت.
این هشدار در C و C++ توسط -Wall فعال میشود.
- -Wmissing-attributes
- هنگامی
هشدار
میدهد که
اعلان یک
تابع فاقد
یک یا چند
صفتی باشد
که یک تابع
مرتبط با
آنها
اعلان شده
است و عدم
وجود آنها
ممکن است بر
درستی یا
کارایی کد
تولیدشده
تأثیر منفی
بگذارد.
برای مثال،
این هشدار
برای اعلان
نامهای
مستعاری (aliases)
صادر
میشود که
از صفتها
برای مشخص
کردن
شرایطی
کمتر
محدودکننده
نسبت به
اهداف خود
استفاده
میکنند.
این مورد
معمولاً
نشاندهندهٔ
یک فرصت
بالقوه
برای
بهینهسازی
است. در
مقابل،
گزینهٔ
-Wattribute-alias=2
هشدارهایی
را کنترل
میکند که
در صورت
محدودکنندهتر
بودن نام
مستعار از
هدف صادر
میشوند،
که
میتواند
به تولید کد
نادرست
منجر شود.
صفتهای
بررسیشده
شامل
"alloc_align"،
"alloc_size"،
"cold"،
"const"،
"hot"،
"leaf"،
"malloc"،
"nonnull"،
"noreturn"،
"nothrow"،
"pure"،
"returns_nonnull" و
"returns_twice"
هستند.
در C++، این هشدار زمانی صادر میشود که یک تخصیص صریح (explicit specialization) از یک الگوی اولیه که با صفت "alloc_align"، "alloc_size"، "assume_aligned"، "format"، "format_arg"، "malloc"، یا "nonnull" اعلان شده، بدون آن صفت اعلان شود. صفتهای "deprecated"، "error" و "warning" مانع از صدور این هشدار میشوند.
میتوانید از صفت "copy" برای اعمال همان مجموعه صفتها از یک اعلان بر اعلان دیگر، بدون نیاز به برشمردن صریح آنها استفاده کنید. این صفت را میتوان برای اعلان توابع، متغیرها یا انواع به کار برد. Common Attributes.
گزینهٔ -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"، و
همچنین
شکلهای
متناظر
آنها در C++
یعنی "operator
new" و "operator
delete" بهطور
ضمنی
بهعنوان
تخصیصدهنده
و
آزادسازهای
منطبق بر هم
در نظر
گرفته
میشوند. در
مثال زیر،
"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;این هشدار توسط -Wall در C و C++ فعال میشود.
- -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
- درباره کدی
که ممکن است
به دلیل نقض
قوانین
نقاط توالی
(sequence point) در
استانداردهای
C و C++ دارای
معنای
تعریفنشده
باشد،
هشدار
میدهد.
استانداردهای C و C++ ترتیب ارزیابی عبارتها را در یک برنامه C/C++ بر حسب نقاط توالی تعریف میکنند که نشاندهنده یک ترتیب جزئی بین اجرای بخشهایی از برنامه است: بخشهایی که قبل از نقطه توالی اجرا میشوند، و بخشهایی که پس از آن اجرا میشوند. این نقاط پس از ارزیابی یک عبارت کامل (عبارتی که بخشی از یک عبارت بزرگتر نیست)، پس از ارزیابی عملوند نخست یک عملگر "&&"، "||"، "? :" یا "," (کاما)، قبل از فراخوانی یک تابع (اما پس از ارزیابی آرگومانهای آن و عبارتی که تابع فراخوانیشده را مشخص میکند) و در مکانهای خاص دیگری رخ میدهند. به غیر از مواردی که در قوانین نقاط توالی بیان شده است، ترتیب ارزیابی زیرعبارتهای یک عبارت نامشخص است. همه این قوانین صرفاً یک ترتیب جزئی را به جای یک ترتیب کامل توصیف میکنند؛ زیرا برای مثال، اگر دو تابع در یک عبارت بدون هیچ نقطه توالی بین آنها فراخوانی شوند، ترتیب فراخوانی توابع نامشخص است. با این حال، کمیته استانداردها مقرر کرده است که فراخوانی توابع با یکدیگر همپوشانی ندارند.
مشخص نشده است که در فاصله بین نقاط توالی، تغییرات مقادیر شیءها چه زمانی اعمال میشوند. برنامههایی که رفتار آنها به این موضوع وابسته است دارای رفتار تعریفنشده (undefined behavior) هستند؛ استانداردهای C و C++ مشخص کردهاند که «بین نقطه توالی قبلی و بعدی، مقدار ذخیرهشده یک شیء در اثر ارزیابی یک عبارت حداکثر باید یک بار اصلاح شود. علاوه بر این، مقدار قبلی تنها باید برای تعیین مقداری که قرار است ذخیره شود خوانده شود.». اگر برنامهای این قوانین را نقض کند، نتایج در هر پیادهسازی خاص کاملاً غیرقابل پیشبینی خواهد بود.
نمونههایی از کدهایی با رفتار تعریفنشده عبارتاند از "a = a++;"، "a[n] = b[n++]" و "a[i++] = i;". برخی موارد پیچیدهتر توسط این گزینه تشخیص داده نمیشوند و ممکن است گاهی نتیجه مثبت کاذب (false positive) بدهد، اما بهطور کلی مشخص شده است که در شناسایی این نوع از مشکلات در برنامهها کاملاً مؤثر است.
استاندارد C++17 ترتیب ارزیابی عملوندها را در موارد بیشتری تعریف میکند: بهویژه ایجاب میکند که سمت راست یک انتساب، پیش از سمت چپ آن ارزیابی شود، بنابراین مثالهای بالا دیگر رفتار تعریفنشده محسوب نمیشوند. اما این گزینه همچنان درباره آنها هشدار میدهد تا به برنامهنویسان کمک کند از نوشتن کدی که در C و نگارشهای قبلی C++ تعریفنشده است خودداری کنند.
متن استاندارد به شکلی گیجکننده بیان شده است؛ از این رو در موارد ظریف و پیچیده، درباره معنای دقیق قوانین نقاط توالی بحثها و اختلاف نظرهایی وجود دارد. پیوندهایی به مباحث مربوط به این مسئله، از جمله تعاریف رسمی پیشنهادی، در صفحه خواندنیهای GCC به نشانی https://gcc.gnu.org/readings.html در دسترس است.
این هشدار توسط -Wall برای C و C++ فعال میشود..IP -Wno-return-local-addr 4 درباره بازگرداندن یک اشارهگر (یا در C++، یک ارجاع) به متغیری که پس از بازگشت تابع از دامنه (scope) خارج میشود، هشدار نده.
- -Wreturn-mismatch
- درباره
دستورهای return
بدون عبارت
در توابعی
که "void"
برنمیگردانند،
هشدار بده.
همچنین
درباره
دستور
"return"
همراه با یک
عبارت در
تابعی که
نوع
بازگشتی آن
"void" است،
هشدار بده،
مگر اینکه
نوع عبارت
نیز "void"
باشد. به
عنوان یک
افزونه گنو
(GNU extension)، مورد
اخیر بدون
هشدار
پذیرفته
میشود مگر
اینکه -Wpedantic
استفاده
شده باشد.
تلاش برای استفاده از مقدار بازگشتی یک تابع غیر "void" به جز "main" که اجرای آن با رسیدن به آکولاد بسته پایانی تابع از انتهای آن خارج میشود، رفتاری تعریفنشده است.
این هشدار مختص 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" شاخصی از نوع شمارشی داشته باشد و فاقد "case" برای یک یا چند کد نامگذاریشده از آن شمارش باشد، هشدار بده. (وجود برچسب "default" از این هشدار جلوگیری میکند.) برچسبهای "case" که با مقادیر شمارشی متناظر نیستند نیز هنگام استفاده از این گزینه موجب ایجاد هشدار میشوند، مگر اینکه شمارش با صفت "flag_enum" علامتگذاری شده باشد. این هشدار توسط -Wall فعال میشود.
- -Wswitch-default
- هر زمان که یک دستور "switch" فاقد حالت "default" باشد، هشدار بده.
- -Wswitch-enum
- هر زمان که یک دستور "switch" شاخصی از نوع شمارشی داشته باشد و فاقد "case" برای یک یا چند کد نامگذاریشده از آن شمارش باشد، هشدار بده. برچسبهای "case" که با مقادیر شمارشی متناظر نیستند نیز هنگام استفاده از این گزینه موجب ایجاد هشدار میشوند، مگر اینکه شمارش با صفت "flag_enum" علامتگذاری شده باشد. تنها تفاوت بین -Wswitch و این گزینه آن است که این گزینه درباره کد شمارشی جاافتاده حتی در صورت وجود برچسب "default" نیز هشدار میدهد.
- -Wno-switch-bool
- زمانی که یک
دستور
"switch"
شاخصی از
نوع بولی
دارد و
مقادیر 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 صرفاً یک اعلان باشد، هشدار نمیدهد:
switch (cond) { int i; ... case 5: i = 5; ... }این هشدار بهطور پیشفرض برای برنامههای C و C++ فعال است.
- -Wsync-nand (تنها در C و C++)
- هنگام استفاده از توابع توکار "__sync_fetch_and_nand" و "__sync_nand_and_fetch" هشدار بده. معناشناسی این توابع در GCC 4.4 تغییر کرده است.
- -Wtrivial-auto-var-init
- زمانی که "-ftrivial-auto-var-init" نتواند متغیر خودکار را مقداردهی اولیه کند، هشدار بده. یک وضعیت رایج، متغیر خودکاری است که میان عبارت کنترلی و نخستین برچسب case یک دستور "switch" اعلان شده باشد.
- -Wunused-but-set-parameter
- گزینه -Wunused-but-set-parameter همانند -Wunused-but-set-parameter=3 و گزینه -Wno-unused-but-set-parameter همانند -Wunused-but-set-parameter=0 است.
- -Wunused-but-set-parameter=n
- هر زمان که
به یک
پارامتر
تابع
مقداری
انتساب
داده شود،
اما به جز
اعلان آن در
جای دیگری
استفاده
نشود،
هشدار بده.
برای فرونشاندن این هشدار از صفت "unused" استفاده کنید.
گزینه -Wunused-but-set-parameter=0 هشدار را غیرفعال میکند. با -Wunused-but-set-parameter=1 تمام استفادهها به جز مقداردهی اولیه و سمت چپ انتسابی که دیگر استفاده نشود، هشدار را غیرفعال میکنند. با -Wunused-but-set-parameter=2 علاوه بر این، استفاده از پارامتر در عملگرهای "++" و "--" نیز استفاده به شمار نمیآید. و سرانجام با -Wunused-but-set-parameter=3 علاوه بر موارد قبل، استفاده در parm "@=" rhs خارج از rhs نیز استفاده به شمار نمیآید. برای مثالها گزینه -Wunused-but-set-variable=n را ببینید.
هشدار -Wunused-but-set-parameter=3 همچنین توسط -Wunused همراه با -Wextra فعال میشود..IP -Wunused-but-set-variable 4 -Wunused-but-set-variable همانند -Wunused-but-set-variable=3 و -Wno-unused-but-set-variable همانند -Wunused-but-set-variable=0 است.
- -Wunused-but-set-variable=n
- هرگاه به یک
متغیر محلی
مقداری
انتساب
داده شود،
اما در غیر
این صورت
(بهجز در
اعلان آن)
استفاده
نشود،
هشدار
میدهد. این
هشدار
-Wunused-but-set-variable=3 با -Wall
فعال
میشود.
برای فرونشاندن این هشدار از صفت "unused" استفاده کنید.
گزینهٔ -Wunused-but-set-variable=0 این هشدار را غیرفعال میکند. با -Wunused-but-set-variable=1، تمام استفادهها به جز مقداردهی اولیه و سمت چپ انتسابی که دیگر استفاده نشود، هشدار را غیرفعال میکنند. با -Wunused-but-set-variable=2، علاوه بر این، استفاده از متغیر در عملگرهای "++" و "--" به عنوان استفاده به شمار نمیآیند. و در نهایت با -Wunused-but-set-variable=3، علاوه بر این، استفادهها در parm "@=" rhs خارج از rhs به عنوان استفاده به شمار نمیآیند.
این هشدار -Wunused-but-set-variable=3 همچنین توسط -Wunused که خود با -Wall فعال میشود، فعال میگردد.
void foo (void) { int a = 1; // B<-Wunused-variable> warning int b = 0; // Warning for <n> >= 1 b = 1; b = 2; int c = 0; // Warning for <n> >= 2 ++c; c--; --c; c++; int d = 0; // Warning for <n> >= 3 d += 4; int e = 0; // No warning, cast to void (void) e; int f = 0; // No warning, f used int g = f = 5; (void) g; int h = 0; // No warning, preincrement result used int i = ++h; (void) i; int j = 0; // No warning, postdecrement result used int k = j--; (void) k; int l = 0; // No warning, l used int m = l |= 2; (void) m; } - -Wunused-function
- هرگاه یک تابع static اعلان شود اما تعریف نشود، یا یک تابع static غیر inline استفاده نشده باقی بماند، هشدار میدهد. این هشدار با -Wall فعال میشود.
- -Wunused-label
- هرگاه یک
برچسب (label)
اعلان شود
اما
استفاده
نشود،
هشدار
میدهد. این
هشدار با -Wall
فعال
میشود.
برای فرونشاندن این هشدار از صفت "unused" استفاده کنید.
- -Wunused-local-typedefs (فقط در C، Objective-C، C++ و Objective-C++)
- هنگامی که یک typedef که بهصورت محلی درون یک تابع تعریف شده است استفاده نشود، هشدار میدهد. این هشدار با -Wall فعال میشود.
- -Wunused-parameter
- هرگاه یک
پارامتر
تابع به جز
در اعلان آن
استفاده
نشود،
هشدار
میدهد. این
گزینه توسط
"-Wunused"
فعال
نمیشود
مگر اینکه
"-Wextra" نیز
مشخص شده
باشد.
برای فرونشاندن این هشدار از صفت "unused" استفاده کنید.
- -Wno-unused-result
- اگر فراخوانندهٔ تابعی که با صفت "warn_unused_result" مشخص شده است از مقدار بازگشتی آن استفاده نکند، هشدار ندهد. پیشفرض -Wunused-result است.
- -Wunused-variable
- هرگاه یک
متغیر محلی
یا static به جز در
اعلان آن
استفاده
نشود،
هشدار
میدهد. این
گزینه برای
C به معنای
-Wunused-const-variable=1 است،
اما برای C++
چنین نیست.
این هشدار
با -Wall فعال
میشود.
برای فرونشاندن این هشدار از صفت "unused" استفاده کنید.
- -Wunused-const-variable
- -Wunused-const-variable=n
- هرگاه یک
متغیر static
ثابت به جز
در اعلان آن
استفاده
نشود،
هشدار
میدهد.
برای فرونشاندن این هشدار از صفت "unused" استفاده کنید.
- -Wunused-const-variable=1
- دربارهٔ
متغیرهای static
const
استفادهنشدهای
که در واحد
ترجمه اصلی
تعریف
شدهاند
هشدار
میدهد،
اما
دربارهٔ
متغیرهای static
const
اعلانشده
در هر
سرایند (header)
اضافه شده
هشدار
نمیدهد.
گزینهٔ -Wunused-const-variable=1 با هر یک از گزینههای -Wunused-variable یا -Wunused برای C فعال میشود، اما برای C++ خیر. در C این اعلان فضای ذخیرهسازی متغیر را مشخص میکند، اما در C++ این یک خطا نیست چرا که متغیرهای const جایگزین "#define"ها میشوند.
- -Wunused-const-variable=2
- این سطح هشدار همچنین برای متغیرهای static ثابت استفادهنشده در سرایندها (بهجز سرایندهای سیستم) هشدار میدهد. این سطح معادل شکل کوتاه -Wunused-const-variable است. این سطح باید به صراحت در هر دو زبان C و C++ درخواست شود چرا که پاکسازی همهٔ سرایندهای اضافه شده ممکن است دشوار باشد.
- -Wunused-value
- هرگاه یک
دستور
نتیجهای
را محاسبه
کند که
صراحتاً
مورد
استفاده
قرار
نمیگیرد،
هشدار
میدهد.
برای
فرونشاندن
این هشدار،
عبارت
استفادهنشده
را به "void"
تبدیل (cast)
کنید. این
شامل یک
دستور-عبارت
یا سمت چپ
یک عبارت
کاما است که
هیچ اثر
جانبی
ندارد. به
عنوان
مثال،
عبارتی
مانند
"x[i,j]"
باعث ایجاد
هشدار
میشود، در
حالی که
"x[(void)i,j]"
هشداری
ایجاد
نمیکند.
این هشدار با -Wall فعال میشود.
- -Wunused
- ترکیب تمام
گزینههای
-Wunused بالا، به
جز مواردی
که ذکر شده
است باید به
صراحت مشخص
شوند.
برای دریافت هشدار در مورد پارامتر استفادهنشدهٔ یک تابع، باید یا -Wextra -Wunused را مشخص کنید (توجه داشته باشید که -Wall متضمن -Wunused است)، یا بهطور جداگانه -Wunused-parameter و/یا -Wunused-but-set-parameter را مشخص نمایید.
گزینهٔ -Wunused به جای -Wunused-const-variable، تنها گزینهٔ -Wunused-const-variable=1 را فعال میکند و آن هم فقط برای C، نه C++.
- -Wuse-after-free (فقط در C، Objective-C، C++ و Objective-C++)
- -Wuse-after-free=n
- دربارهٔ استفاده از اشارهگرها به اشیایی با تخصیص پویا که به دلیل فراخوانی یک تابع آزادسازی حافظه، نامعین شدهاند هشدار میدهد. این هشدار در تمام سطوح بهینهسازی فعال است اما ممکن است با بهینهسازی نتایج متفاوتی نسبت به بدون آن ارائه دهد. گزینهٔ -Wuse-after-free معادل -Wuse-after-free=1 است.
- -Wuse-after-free=1
- در سطح ۱، این هشدار تلاش میکند تنها استفادههای نامشروط از اشارهگرهایی را که با فراخوانی آزادسازی یا یک فراخوانی موفق به "realloc" نامعین شدهاند تشخیص دهد، صرفنظر از اینکه آن فراخوانی منجر به تخصیص مجدد واقعی حافظه شده باشد یا خیر. این مورد شامل فراخوانیهای دوگانهٔ "free" (یا double-free) و همچنین استفاده در عبارتهای حسابی و رابطهای میشود. اگرچه رفتار تعریفنشده است، استفاده از اشارهگرهای نامعین در عبارتهای برابری (یا نابرابری) در این سطح تشخیص داده نمیشود.
- -Wuse-after-free=2
- در سطح ۲،
علاوه بر
استفادههای
نامشروط،
این هشدار
استفادههای
مشروط از
اشارهگرهایی
را که با یک
فراخوانی
آزادسازی
نامعین
شدهاند
نیز تشخیص
میدهد.
همانند سطح
۲، استفاده
در
عبارتهای
برابری (یا
نابرابری)
تشخیص داده
نمیشود.
برای مثال،
فراخوانی
دوم به
"free" در
تابع زیر در
این سطح
تشخیص داده
میشود:
struct A { int refcount; void *data; }; void release (struct A *p) { int refcount = --p->refcount; free (p); if (refcount == 0) free (p->data); // warning: p may be used after free } - -Wuse-after-free=3
- در سطح ۳،
این هشدار
استفاده از
اشارهگرهای
نامعین در
عبارتهای
برابری را
نیز تشخیص
میدهد.
تمام
استفادهها
از
اشارهگرهای
نامعین،
تعریفنشده
هستند اما
آزمونهای
برابری
گاهی پس از
فراخوانیهای
"realloc" به
عنوان
تلاشی برای
تعیین
اینکه آیا
فراخوانی
منجر به
جابجایی
شیء به یک
نشانی دیگر
شده است یا
خیر ظاهر
میشوند.
آنها در یک
سطح مجزا
تشخیص داده
میشوند تا
به گذار
تدریجی
کدهای
قدیمی به
جایگزینهای
امن کمک
کنند. برای
مثال،
آزمون
برابری در
تابع زیر در
این سطح
تشخیص داده
میشود: void adjust_pointers
(int**, int); void grow (int **p, int n) { int **q = (int**)realloc (p, n
*= 2); if (q == p) return; adjust_pointers ((int**)q, n); }
برای جلوگیری از هشدار در این سطح، به جای اشارهگرها، آفستها را در حافظهٔ تخصیصیافته ذخیره کنید. این رویکرد نیاز به تنظیم مجدد اشارهگرهای ذخیرهشده پس از تخصیص دوباره را برطرف میکند.
گزینهٔ -Wuse-after-free=2 در -Wall گنجانده شده است.
- -Wuseless-cast (فقط C، Objective-C، C++ و Objective-C++)
- زمانی که یک
عبارت به
نوع خودش
تبدیل نوع (cast)
میشود
هشدار
میدهد. این
هشدار
زمانی که یک
شیء کلاسی
به یک نوع
غیرمرجع
تبدیل
میشود رخ
نمیدهد،
زیرا این
روشی برای
ایجاد یک
شیء موقت
است:
struct S { }; void g (S&&); void f (S&& arg) { g (S(arg)); // make arg prvalue so that it can bind to S&& } - -Wuninitialized
- اگر شیئی با
دورهٔ
ذخیرهسازی
خودکار یا
تخصیصیافته
بدون
مقداردهی
اولیه
استفاده
شود، هشدار
میدهد. در
C++، همچنین
اگر یک مرجع
غیرایستا
یا یک عضو
غیرایستای
"const" در
کلاسی بدون
سازنده
ظاهر شود،
هشدار
میدهد.
علاوه بر این، ارسال یک اشارهگر (یا در C++، یک مرجع) به شیء مقداردهینشده به آرگومانی با صفت "const" از یک تابع توکار که مشخص است شیء را میخواند نیز توسط این هشدار شناسایی میشود. (برای توابع معمولی، -Wmaybe-uninitialized صادر میشود.)
اگر میخواهید دربارهٔ کدی که از مقدار مقداردهینشدهٔ متغیر در مقداردهی اولیهٔ خودش استفاده میکند هشدار دریافت کنید، از گزینهٔ -Winit-self استفاده نمایید.
این هشدارها هم برای تکتک عناصر مقداردهینشدهٔ متغیرهای ساختار، اجتماع یا آرایه و هم برای متغیرهایی که بهطور کامل مقداردهی نشدهاند رخ میدهند. آنها برای متغیرها یا عناصری که بهصورت "volatile" اعلان شدهاند رخ نمیدهند. از آنجا که این هشدارها به بهینهسازی وابستهاند، متغیرها یا عناصر دقیقی که برای آنها هشدار صادر میشود به گزینههای دقیق بهینهسازی و نسخهٔ GCC استفادهشده بستگی دارد.
توجه داشته باشید که ممکن است برای متغیری که فقط برای محاسبهٔ مقداری استفاده میشود که خود آن مقدار هرگز به کار نمیرود هشداری داده نشود، زیرا چنین محاسباتی ممکن است پیش از چاپ هشدارها توسط تحلیل جریان داده حذف شوند.
در C++، این گزینه همچنین دربارهٔ استفاده از اشیاء مقداردهینشده در member-initializer-lists هشدار میدهد. برای نمونه، GCC در قطعهکد زیر دربارهٔ مقداردهی اولیه نشدن "b" هشدار میدهد:
struct A { int a; int b; A() : a(b) { } }; - -Wno-invalid-memory-model
- این گزینه
هشدارهای
مربوط به
فراخوانیهای
__atomic Builtins، __sync Builtins و
توابع
عمومی
اتمیک C11 را
با آرگومان
سازگاری
حافظهای
که یا برای
عملیات
نامعتبر
است یا خارج
از دامنهٔ
مقادیر نوع
شمارشی
"memory_order"
قرار دارد،
کنترل
میکند.
برای
نمونه، از
آنجا که
توابع
توکار
"__atomic_store" و
"__atomic_store_n"
فقط برای
ترتیبهای
حافظهٔ relaxed، release
و sequentially consistent تعریف
شدهاند،
کد زیر
تشخیص داده
شده و هشدار
دریافت
میکند:
void store (int *i) { __atomic_store_n (i, 0, memory_order_consume); }گزینهٔ -Winvalid-memory-model بهطور پیشفرض فعال است.
- -Wmaybe-uninitialized
- برای شیئی
با دورهٔ
ذخیرهسازی
خودکار یا
تخصیصیافته،
اگر مسیری
از ورود به
تابع تا
نقطهای از
استفاده از
شیء که در
آن
مقداردهی
شده است
وجود داشته
باشد، اما
مسیرهای
دیگری
باشند که در
آنها شیء
مقداردهی
نشده است،
چنانچه
کامپایلر
نتواند
ثابت کند
مسیرهای
مقداردهینشده
در زمان
اجرا اجرا
نمیشوند،
هشداری
صادر
میکند.
علاوه بر این، فرستادن یک اشارهگر (یا در C++، یک مرجع) به شیء مقداردهینشده به آرگومانی از تابع با صفت "const" نیز توسط این هشدار شناسایی میشود. (برای توابع توکاری که خواندن شیء توسط آنها محرز است، -Wuninitialized صادر میشود.) نشانهگذاری تابع با مشخصهٔ "access (none)" مشخص میکند که از این آرگومان برای دسترسی به شیء استفاده نمیشود و از بروز هشدار جلوگیری میکند.
این هشدارها تنها در کامپایل همراه با بهینهسازی امکانپذیر هستند، زیرا در غیر این صورت GCC وضعیت متغیرها را دنبال نمیکند. از سوی دیگر، مشخص شده است که -Wmaybe-uninitialized در بسیاری از موقعیتها به دلیل بهینهسازیهایی که از تعریفنشده بودن کاربردهای مقداردهینشده بهره میبرند (مانند انتشار مقدار ثابت)، هشداری نمیدهد (موارد منفی کاذب).
این هشدارها اختیاری در نظر گرفته شدهاند زیرا ممکن است GCC نتواند تشخیص دهد که چه زمانی کد، با وجود ظاهر خطادار، در واقع درست است. در اینجا نمونهای از نحوهٔ وقوع این حالت آمده است:
{ int x; switch (y) { case 1: x = 1; break; case 2: x = 4; break; case 3: x = 5; } foo (x); }اگر مقدار "y" همیشه ۱، ۲ یا ۳ باشد، آنگاه "x" همیشه مقداردهی اولیه شده است، اما GCC این موضوع را نمیداند. برای فرونشاندن این هشدار، باید یک حالت پیشفرض با assert(0) یا کدی مشابه فراهم کنید.
این گزینه همچنین زمانی که ممکن است یک متغیر خودکار غیر-volatile با فراخوانی "longjmp" تغییر کند، هشدار میدهد. کامپایلر تنها فراخوانیهای "setjmp" را میبیند و نمیتواند بداند "longjmp" در کجا فراخوانی خواهد شد؛ در واقع، یک ادارهکنندهٔ سیگنال میتواند آن را در هر نقطهای از کد فراخوانی کند. در نتیجه، ممکن است حتی زمانی که در عمل مشکلی وجود ندارد هشداری دریافت کنید، زیرا "longjmp" در عمل نمیتواند در جایی فراخوانی شود که مشکلی ایجاد کند.
با اعلان کردن تمام توابع مورد استفاده که هرگز بازنمیگردند بهصورت "noreturn"، میتوان از برخی هشدارهای کاذب جلوگیری کرد.
این هشدار توسط -Wall یا -Wextra فعال میشود.
- -Wunknown-pragmas
- هنگامی که با یک دستور "#pragma" مواجه شود که برای GCC قابل درک نیست، هشدار میدهد. اگر این گزینهٔ خط فرمان استفاده شود، هشدارها حتی برای عملگرهای pragma ناشناخته در فایلهای سرایند سیستم نیز صادر میشوند. اگر این هشدارها فقط توسط گزینهٔ خط فرمان -Wall فعال شده باشند، چنین نخواهد بود.
- -Wno-pragmas
- دربارهٔ استفادههای نادرست از pragma، مانند پارامترهای نادرست، نحو نامعتبر، یا تداخل میان pragmaها هشدار نمیدهد. همچنین نگاه کنید به -Wunknown-pragmas.
- -Wno-pragma-once-outside-header
- هنگامی که از "#pragma once" در فایلی غیر از فایل سرایند، مانند فایل اصلی، استفاده شود، هشدار نمیدهد.
- -Wno-prio-ctor-dtor
- اگر اولویتی از ۰ تا ۱۰۰ برای سازنده یا ویرانگر استفاده شود، هشدار نمیدهد. استفاده از مشخصههای سازنده و ویرانگر به شما امکان میدهد اولویتی را به سازنده/ویرانگر اختصاص دهید تا ترتیب اجرای آن پیش از فراخوانی "main" یا پس از بازگشت از آن کنترل شود. مقادیر اولویت باید بزرگتر از ۱۰۰ باشند، زیرا کامپایلر مقادیر اولویت بین ۰ تا ۱۰۰ را برای پیادهسازی رزرو کرده است.
- -Wstrict-aliasing
- این گزینه
تنها زمانی
فعال است که
-fstrict-aliasing فعال
باشد. این
گزینه
دربارهٔ
کدی که ممکن
است قواعد
نام مستعار
دقیق (strict aliasing) را
که
کامپایلر
برای
بهینهسازی
به کار
میبرد نقض
کند، هشدار
میدهد. این
هشدار همهٔ
موارد را
پوشش
نمیدهد،
اما تلاش
میکند
خطاهای
متداولتر
را شناسایی
کند. این
گزینه در -Wall
گنجانده
شده است.
این گزینه
معادل -Wstrict-aliasing=3
است..IP -Wstrict-aliasing=n 4
این گزینه
فقط زمانی
فعال است که
-fstrict-aliasing فعال
باشد.
درباره
کدهایی
هشدار
میدهد که
ممکن است
قواعد نام
مستعار
دقیق (strict aliasing) را
که
کامپایلر
برای
بهینهسازی
استفاده
میکند،
نقض کنند.
سطوح
بالاتر
متناظر با
دقت بالاتر
(موارد مثبت
کاذب کمتر)
هستند. سطوح
بالاتر
همچنین به
تلاش و
پردازش
بیشتری
نیاز
دارند،
مشابه روشی
که -O عمل
میکند. -Wstrict-aliasing
معادل با
-Wstrict-aliasing=3 است.
سطح ۱: تهاجمیترین، سریع، کمدقتترین. احتمالاً زمانی مفید است که سطوح بالاتر هشدار نمیدهند اما -fstrict-aliasing همچنان کد را دچار مشکل میکند، زیرا موارد منفی کاذب بسیار کمی دارد. با این حال، موارد مثبت کاذب زیادی دارد. برای تمام تبدیلهای اشارهگر بین انواع احتمالاً ناسازگار، حتی اگر هرگز ارجاعزدایی (dereference) نشوند، هشدار میدهد. فقط در فرانتاند (front end) اجرا میشود.
سطح ۲: تهاجمی، سریع، نه چندان دقیق. ممکن است همچنان موارد مثبت کاذب زیادی داشته باشد (اگرچه نه به اندازه سطح ۱)، و موارد منفی کاذب اندکی دارد (اما احتمالاً بیشتر از سطح ۱). برخلاف سطح ۱، تنها زمانی هشدار میدهد که آدرسی گرفته شود. درباره انواع ناقص (incomplete types) هشدار میدهد. فقط در فرانتاند اجرا میشود.
سطح ۳ (پیشفرض برای -Wstrict-aliasing): باید موارد مثبت کاذب بسیار کم و موارد منفی کاذب اندکی داشته باشد. در صورت فعال بودن بهینهسازی، کمی کندتر از سطوح ۱ یا ۲ است. الگوی رایج pun+dereference را در فرانتاند مدیریت میکند: "*(int*)&some_float". اگر بهینهسازی فعال باشد، در بکاند (back end) نیز اجرا میشود، جایی که با استفاده از اطلاعات جریانمحور اشاره (flow-sensitive points-to) به موارد چنددستوری رسیدگی میکند. فقط زمانی هشدار میدهد که اشارهگر تبدیلشده ارجاعزدایی شود. درباره انواع ناقص هشدار نمیدهد.
- -Wstrict-overflow
- -Wstrict-overflow=n
- این گزینه
فقط زمانی
فعال است که
سرریز
علامتدار
(signed overflow)
تعریفنشده
باشد.
درباره
مواردی
هشدار
میدهد که
کامپایلر
بر اساس این
فرض که
سرریز
علامتدار
رخ
نمیدهد،
بهینهسازی
انجام
میدهد.
توجه داشته
باشید که
درباره همه
مواردی که
ممکن است کد
دچار سرریز
شود هشدار
نمیدهد:
فقط درباره
مواردی
هشدار
میدهد که
کامپایلر
نوعی
بهینهسازی
اعمال
میکند.
بنابراین
این هشدار
به سطح
بهینهسازی
بستگی دارد.
بهینهسازیای که فرض میکند سرریز علامتدار رخ نمیدهد، اگر مقادیر متغیرهای درگیر بهگونهای باشند که سرریز در عمل هرگز رخ ندهد، کاملاً ایمن است. بنابراین این هشدار میتواند بهسادگی یک مثبت کاذب ایجاد کند: هشداری درباره کدی که در واقعیت مشکلی ندارد. برای کمک به تمرکز روی مسائل مهم، چندین سطح هشدار تعریف شده است. هیچ هشداری برای استفاده از سرریز علامتدار تعریفنشده هنگام تخمین تعداد تکرارهای مورد نیاز یک حلقه، بهویژه هنگام تعیین اینکه آیا یک حلقه اصلاً اجرا خواهد شد یا خیر، صادر نمیشود.
- -Wstrict-overflow=1
- درباره مواردی هشدار میدهد که هم جای تردید دارند و هم اجتناب از آنها آسان است. برای مثال کامپایلر "x + 1 > x" را به 1 سادهسازی میکند. این سطح از -Wstrict-overflow توسط -Wall فعال میشود؛ سطوح بالاتر فعال نمیشوند و باید صراحتاً درخواست شوند.
- -Wstrict-overflow=2
- همچنین درباره سایر مواردی که در آنها یک مقایسه به یک مقدار ثابت سادهسازی میشود هشدار میدهد. برای مثال: "abs (x) >= 0". این مورد تنها زمانی میتواند سادهسازی شود که سرریز عدد صحیح علامتدار تعریفنشده باشد، زیرا "abs (INT_MIN)" به "INT_MIN" سرریز میکند، که کمتر از صفر است. گزینه -Wstrict-overflow (بدون تعیین سطح) مشابه -Wstrict-overflow=2 است.
- -Wstrict-overflow=3
- همچنین درباره سایر مواردی که یک مقایسه سادهسازی میشود هشدار میدهد. برای مثال: "x + 1 > 1" به "x > 0" ساده میشود.
- -Wstrict-overflow=4
- همچنین درباره سایر سادهسازیهایی که توسط موارد بالا پوشش داده نشدهاند هشدار میدهد. برای مثال: "(x * 10) / 5" به "x * 2" ساده میشود.
- -Wstrict-overflow=5
- همچنین درباره مواردی هشدار میدهد که کامپایلر بزرگی یک مقدار ثابت درگیر در یک مقایسه را کاهش میدهد. برای مثال: "x + 2 > y" به "x + 1 >= y" ساده میشود. این مورد تنها در بالاترین سطح هشدار گزارش میشود زیرا این سادهسازی برای مقایسههای متعددی اعمال میشود، بنابراین این سطح هشدار تعداد بسیار زیادی مثبت کاذب ایجاد میکند.
- -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
- برای
کدهایی که
میتوان به
صورت ایستا
تعیین کرد
که باعث
سرریز بافر
یا سرریز
حافظه
میشوند،
مانند
فراخوانیهای
"memcpy" و
"strcpy" که
از بافر
مقصد سرریز
میکنند،
هشدار
میدهد.
آرگومان
اختیاری یک
واحد
بزرگتر از
نوعِ Object Size Checking
است که برای
تعیین
اندازه
مقصد انجام
میشود. این
آرگومان
تنها برای
توابع
رشتهای که
روی
آرایههای
کاراکتری
عمل
میکنند
معنادار
است؛ توابع
حافظه خام
مانند
"memcpy"
همیشه از Object Size
Checking نوع صفر
استفاده
میکنند.
این گزینه همچنین برای فراخوانیهایی که اندازهای بیش از بزرگترین شیء ممکن یا حداکثر "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 از «بررسی اندازه شیء نوع صفر» (type-zero Object Size Checking) برای تعیین اندازهٔ اشیاء مقصد استفاده میکند. در این تنظیم، این گزینه برای نوشتن فراتر از انتهای زیرشیءهای متعلق به اشیاء بزرگتری که با اشارهگر به آنها دسترسی پیدا شده است هشداری نمیدهد، مگر آنکه اندازهٔ بزرگترین شیء دربرگیرنده مشخص باشد. هنگامی که مقصد ممکن است یکی از چندین شیء باشد، بزرگترین آنها فرض میشود. در سیستمهای لینوکس، زمانی که بهینهسازی در این تنظیم فعال است، این گزینه برای همان کدهایی هشدار میدهد که ماکروی "_FORTIFY_SOURCE" با مقداری غیر صفر در آنها تعریف شده باشد.
- -Wstringop-overflow=2
- گزینهٔ -Wstringop-overflow=2 از «بررسی اندازه شیء نوع یک» (type-one Object Size Checking) برای تعیین اندازهٔ اشیاء مقصد استفاده میکند. در این تنظیم، این گزینه دربارهٔ سرریز هنگام نوشتن در اعضای بزرگترین اشیاء کاملی که اندازهٔ دقیق آنها مشخص است، هشدار میدهد. با این حال، برای نوشتن بیش از حد در اعضای مشابه از اشیاء ناشناختهای که با اشارهگر به آنها ارجاع داده شده هشداری نمیدهد، زیرا ممکن است به آرایههایی با تعداد اعضای نامشخص اشاره کنند. این حالت، تنظیم پیشفرض این گزینه است.
- -Wstringop-overflow=3
- گزینهٔ -Wstringop-overflow=3 از «بررسی اندازه شیء نوع دو» (type-two Object Size Checking) برای تعیین اندازهٔ اشیاء مقصد استفاده میکند. در این تنظیم، این گزینه دربارهٔ سرریز از کوچکترین شیء یا عضو داده هشدار میدهد. این محدودکنندهترین تنظیم این گزینه است که ممکن است به صدور هشدار برای کدهای امن نیز منجر شود.
- -Wstringop-overflow=4
- گزینهٔ -Wstringop-overflow=4 از «بررسی اندازه شیء نوع سه» (type-three Object Size Checking) برای تعیین اندازهٔ اشیاء مقصد استفاده میکند. در این تنظیم، این گزینه دربارهٔ سرریز از هر عضو داده هشدار میدهد، و هنگامی که مقصد یکی از چندین شیء باشد، از اندازهٔ بزرگترین آنها برای تصمیمگیری در مورد صدور هشدار استفاده میکند. مشابه با -Wstringop-overflow=3، این تنظیمِ گزینه نیز ممکن است منجر به صدور هشدار برای کدهای بیخطر شود.
- -Wno-stringop-overread
- برای
فراخوانی
توابع
دستکاری
رشته مانند
"memchr" یا
"strcpy" که
مشخص شده
است فراتر
از انتهای
توالی مبدأ
را
میخوانند،
هشدار
میدهد.
گزینهٔ -Wstringop-overread بهطور پیشفرض فعال است.
- -Wno-stringop-truncation
- برای
فراخوانی
توابع
کراندار
دستکاری
رشته مانند
"strncat"،
"strncpy" و
"stpncpy" که
ممکن است
رشتهٔ
کپیشده را
کوتاه کرده
یا مقصد را
بدون تغییر
باقی
بگذارند،
هشدار
نمیدهد.
در مثال زیر، فراخوانی "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" یا به دام افتادن (trapping) بهطور غیرعادی پایان نیابد. این تحلیل به گزینهٔ -fipa-pure-const نیاز دارد، که بهطور پیشفرض در -O و سطوح بالاتر فعال است. سطوح بهینهسازی بالاتر، دقت این تحلیل را بهبود میبخشند.
- -Wsuggest-attribute=format
- -Wmissing-format-attribute
- دربارهٔ
اشارهگرهای
تابعی که
ممکن است
کاندیدای
صفتهای
"format"
باشند
هشدار
میدهد.
توجه داشته
باشید که
اینها
صرفاً
کاندیداهای
احتمالی
هستند، نه
قطعی.
کامپایلر GCC
حدس میزند
اشارهگرهای
تابعی
دارای صفت
"format" که
در انتساب،
مقداردهی
اولیه،
ارسال
پارامتر یا
عبارات
بازگشت
استفاده
میشوند،
باید صفت
"format"
متناظری در
نوعِ حاصل
داشته
باشند؛
بدین معنا
که به
ترتیب، سمت
چپ انتساب
یا
مقداردهی
اولیه، نوع
متغیر
پارامتر،
یا نوع
بازگشتی
تابع
دربرگیرنده
نیز باید
دارای صفت
"format"
باشد تا از
صدور هشدار
جلوگیری
شود.
کامپایلر GCC همچنین دربارهٔ تعاریف توابعی که ممکن است کاندیدای صفتهای "format" باشند هشدار میدهد. مجدداً، اینها تنها کاندیداهای احتمالی هستند. کامپایلر GCC حدس میزند که ممکن است صفتهای "format" برای هر تابعی که تابعی مانند "vprintf" یا "vscanf" را فراخوانی میکند مناسب باشد، اما این موضوع ممکن است همیشه صادق نباشد و برخی توابع که صفتهای "format" برای آنها مناسب است شناسایی نشوند.
- -Wsuggest-attribute=cold
- دربارهٔ توابعی که ممکن است کاندیدای صفت "cold" باشند هشدار میدهد. این هشدار بر اساس بررسی ایستا است و عموماً تنها دربارهٔ توابعی صادر میشود که همیشه به فراخوانی یک تابع "cold" دیگر ختم میشوند؛ مانند توابع پوششی دستور "throw" در C++ یا توابع گزارش خطای مهلک که منجر به فراخوانی "abort" میشوند.
- -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" در کد منبع هشدار میدهد.
- -Wauto-profile
- هشدارهایی درباره ناهمخوانیهای auto-profile چاپ میکند.
- -Wcannot-profile
- هنگامی که ابزارگذاری پروفایلسازی (profiling instrumentation) درخواست شده باشد اما نتوان آن را روی تابع خاصی اعمال کرد، هشدار میدهد.
- -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" حداکثر 1000 بایت است. با این حال، اگر "-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 و
بالاتر)،
اما
زیرمجموعهای
از موارد
حتی بدون
بهینهسازی
نیز صادر
میشوند.
به طور پیشفرض، آرایهٔ انتهایی یک ساختار توسط -Warray-bounds یا -Warray-bounds=n به عنوان عضو آرایه انعطافپذیر در نظر گرفته میشود اگر طبق استاندارد C99 به بعد به عنوان یک عضو آرایه انعطافپذیر ([])، یک افزونه طول صفر GCC ([0])، یا یک آرایه تکعنصری ([1]) اعلان شده باشد. در نتیجه، به طور پیشفرض برای اندیسها یا آفستهای خارج از محدوده در آرایههای با طول صفر یا آرایههای تکعنصری هشداری داده نمیشود.
میتوانید گزینهٔ -fstrict-flex-arrays یا -fstrict-flex-arrays=level را اضافه کنید تا نحوهٔ برخورد این گزینه با آرایهٔ انتهایی یک ساختار به عنوان عضو آرایه انعطافپذیر کنترل شود:
هنگامی که level<=1 باشد، تغییری در رفتار پیشفرض داده نمیشود.
هنگامی که level=2 باشد، هشدارهای بیشتری برای اندیسها یا آفستهای خارج از محدوده در آرایههای تکعنصری صادر خواهد شد؛
هنگامی که level=3 باشد، علاوه بر موارد level=2، هشدارهای بیشتری برای اندیسها یا آفستهای خارج از محدوده در آرایههای با طول صفر صادر خواهد شد.
- -Warray-bounds=1
- این سطح پیشفرض هشدار برای -Warray-bounds است و توسط -Wall فعال میشود؛ سطوح بالاتر فعال نمیشوند و باید صراحتاً درخواست گردند.
- -Warray-bounds=2
- این سطح هشدار همچنین درباره نتایج میانی محاسبات اشارهگر که ممکن است مقادیر خارج از محدوده تولید کنند هشدار میدهد. این سطح هشدار ممکن است تعداد بیشتری هشدار نادرست مثبت (false positive) ایجاد کند و به طور پیشفرض غیرفعال است.
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 ناسازگاریهای میان نوع اعلان نام مستعار و نوع هدف آن را تشخیص میدهد. چنین ناسازگاریهایی معمولاً نشاندهنده اشکالات نرمافزاری هستند.
- -Wattribute-alias=2
- در این سطح،
-Wattribute-alias مواردی
را نیز
تشخیص
میدهد که
در آنها
ویژگیهای
اعلان نام
مستعار
محدودکنندهتر
از
ویژگیهای
اعمالشده
بر روی هدف
آن باشند.
این عدم
تطابقها
میتوانند
بهطور
بالقوه
منجر به
تولید کد
نادرست
شوند. در
موارد دیگر
ممکن است
بیخطر
باشند و
صرفاً با
افزودن
ویژگی
ازدسترفته
به هدف حل
شوند. برای
مقایسه، به
گزینه -Wmissing-attributes
مراجعه
کنید که
مواردی را
کنترل
میکند که
اعلان نام
مستعار
کمتر از هدف
محدودکننده
باشد، نه
محدودکنندهتر.
ویژگیهای بررسیشده شامل "alloc_align"، "alloc_size"، "cold"، "const"، "hot"، "leaf"، "malloc"، "nonnull"، "noreturn"، "nothrow"، "pure"، "returns_nonnull" و "returns_twice" هستند.
-Wattribute-alias معادل -Wattribute-alias=1 است. این مقدار پیشفرض است. میتوانید این هشدارها را با -Wno-attribute-alias یا -Wattribute-alias=0 غیرفعال کنید.
- -Wbidi-chars=[none|unpaired|any|ucn]
- درباره
نویسههای
کنترلی
دوجهته (bidirectional)
احتمالاً
گمراهکننده
UTF-8 در
کامنتها،
رشتههای
لفظی،
ثوابت
نویسهای و
شناسهها
هشدار
میدهد.
چنین
نویسههایی
میتوانند
جهت نوشتار
چپبهراست
را به
راستبهچپ
(و برعکس)
تغییر
دهند، که
میتواند
سبب
سردرگمی
میان ترتیب
منطقی و
ترتیب
دیداری شود.
این مسئله
میتواند
خطرناک
باشد؛ برای
نمونه،
ممکن است
چنین به نظر
برسد که
بخشی از کد
کامنت نشده
است، در
حالی که در
واقع کامنت
شده است.
سه سطح هشدار توسط 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
- درباره
عملیات
مشکوک بر
روی
عبارتهایی
از نوع بولی
هشدار
میدهد.
برای
نمونه،
نقیض بیتی
یک مقدار
بولی به
احتمال
بسیار زیاد
یک باگ در
برنامه است.
برای C، این
هشدار
همچنین در
مورد
افزایش یا
کاهش یک
مقدار
بولی، که
بهندرت
معنا دارد،
هشدار
میدهد. (در
C++، کاهش یک
مقدار بولی
همواره
نامعتبر
است. افزایش
مقدار بولی
در C++17
نامعتبر
است و در
غیر این
صورت منسوخ
اعلام شده
است.)
این هشدار توسط -Wall فعال میشود.
- -Wduplicated-branches
- هنگامی که
یک دستور if-else
دارای
شاخههای
یکسان باشد
هشدار
میدهد. این
هشدار
مواردی
مانند زیر
را تشخیص
میدهد:
if (p != NULL) return 0; else return 0;
هنگامی که هر دو شاخه تنها شامل یک دستور تهی باشند هشدار نمیدهد. این هشدار همچنین برای عملگرهای شرطی هشدار میدهد:
int i = x ? *p : *p;
- -Wduplicated-cond
- درباره
شرطهای
تکراری در
یک زنجیره
if-else-if هشدار
میدهد.
برای
نمونه،
برای کد زیر
هشدار
میدهد: if (p->q != NULL) {
... } else if (p->q != NULL) { ... }
- -Wframe-address
- هنگامی که __builtin_frame_address یا __builtin_return_address با یک آرگومان بزرگتر از 0 فراخوانی شوند، هشدار میدهد. چنین فراخوانیهایی ممکن است مقادیر نامعین برگردانند یا باعث خرابی (crash) برنامه شوند. این هشدار در -Wall گنجانده شده است.
- -Wno-discarded-qualifiers (تنها C و Objective-C)
- در صورتی که توصیفکنندههای نوع (type qualifiers) روی اشارهگرها نادیده گرفته شوند، هشدار نمیدهد. به طور معمول، اگر یک متغیر "const char *" به تابعی که پارامتر "char *" میگیرد ارسال شود، کامپایلر هشدار میدهد. این گزینه میتواند برای فرونشاندن چنین هشداری استفاده شود.
- -Wno-discarded-array-qualifiers (تنها C و Objective-C)
- در صورتی که توصیفکنندههای نوع در آرایههایی که مقصد اشارهگر هستند نادیده گرفته شوند، هشدار نمیدهد. به طور معمول، اگر یک متغیر "const int (*)[]" به تابعی که پارامتر "int (*)[]" میگیرد ارسال شود، کامپایلر هشدار میدهد. این گزینه میتواند برای فرونشاندن چنین هشداری استفاده شود.
- -Wno-incompatible-pointer-types (تنها C و Objective-C)
- هنگامی که
تبدیلی بین
اشارهگرهایی
با انواع
ناسازگار
صورت
میگیرد،
هشدار
نمیدهد.
این هشدار
مربوط به
مواردی است
که تحت پوشش
-Wno-pointer-sign
نیستند؛
گزینهای
که برای
ارسال
آرگومان
اشارهگر
یا انتساب
با
علامتداری
(signedness) متفاوت
هشدار
میدهد.
به طور پیشفرض، در C99 و گویشهای جدیدتر C، کامپایلر GCC با این مورد به عنوان یک خطا برخورد میکند. این خطا میتواند با استفاده از -fpermissive (به همراه برخی خطاهای دیگر)، یا فقط برای این خطا با -Wno-error=incompatible-pointer-types به یک هشدار تقلیل یابد.
این هشدار توسط -pedantic-errors به یک خطا ارتقا مییابد.
- -Wno-int-conversion (تنها C و Objective-C)
- درباره
تبدیلات
ناسازگار
عدد صحیح به
اشارهگر و
اشارهگر
به عدد صحیح
هشدار
نمیدهد.
این هشدار
مربوط به
تبدیلات
ضمنی (implicit)
است؛ برای
تبدیلات
صریح (explicit)
میتوان از
هشدارهای
-Wno-int-to-pointer-cast و -Wno-pointer-to-int-cast
استفاده
کرد.
به طور پیشفرض، در C99 و گویشهای جدیدتر C، کامپایلر GCC با این مورد به عنوان یک خطا برخورد میکند. این خطا میتواند با استفاده از -fpermissive (به همراه برخی خطاهای دیگر)، یا فقط برای این خطا با -Wno-error=int-conversion به یک هشدار تقلیل یابد.
این هشدار توسط -pedantic-errors به یک خطا ارتقا مییابد.
- -Wzero-as-null-pointer-constant
- هنگامی که مقدار مستقیم (literal) 0 به عنوان ثابت اشارهگر تهی (null pointer constant) استفاده میشود، هشدار میدهد.
- -Wzero-length-bounds
- درباره
دسترسی به
عناصر
اعضای
آرایه با
طول صفر که
ممکن است با
سایر اعضای
همان شیء
همپوشانی
داشته
باشند،
هشدار
میدهد.
اعلان
آرایههای
درونی با
طول صفر
توصیه
نمیشود
زیرا
دسترسی به
آنها
تعریفنشده
(undefined) است.
به عنوان مثال، دو ذخیرهسازی اول در تابع "bad" شناسایی میشوند زیرا عناصر آرایه با اعضای بعدی یعنی "b" و "c" همپوشانی دارند. ذخیرهسازی سوم توسط -Warray-bounds شناسایی میشود زیرا فراتر از محدودههای شیء دربرگیرنده است.
struct X { int a[0]; int b, c; }; struct X x; void bad (void) { x.a[0] = 0; // -Wzero-length-bounds x.a[1] = 1; // -Wzero-length-bounds x.a[2] = 2; // -Warray-bounds }گزینه -Wzero-length-bounds توسط -Warray-bounds فعال میشود.
- -Wno-div-by-zero
- درباره تقسیم عدد صحیح بر صفر در زمان کامپایل هشدار نمیدهد. درباره تقسیم بر صفر ممیز شناور هشداری داده نمیشود، زیرا میتواند روشی معتبر برای دستیابی به بینهایتها (infinities) و NaNها باشد.
- -Wsystem-headers
- پیامهای هشدار را برای ساختارهای یافتشده در فایلهای هدر سیستمی چاپ میکند. هشدارهای فایلهای هدر سیستمی معمولاً با این فرض که مشکلات واقعی را نشان نمیدهند و فقط خواندن خروجی کامپایلر را دشوارتر میکنند، فرونشانده میشوند. استفاده از این گزینه خط فرمان به GCC میگوید که هشدارهای هدرهای سیستمی را به گونهای صادر کند که گویی در کد کاربر رخ دادهاند. با این حال، توجه داشته باشید که استفاده از -Wall همراه با این گزینه، درباره pragmaهای ناشناخته در هدرهای سیستمی هشدار نمیدهد---برای آن، -Wunknown-pragmas نیز باید استفاده شود.
- -Wtautological-compare
- در صورتی که
یک
خود-مقایسهای
همواره به
درست (true) یا
نادرست (false)
ارزیابی
شود، هشدار
میدهد. این
هشدار
خطاهای
گوناگونی
را تشخیص
میدهد،
مانند:
int i = 1; ... if (i > i) { ... }این هشدار همچنین درباره مقایسههای بیتی که همواره به درست یا نادرست ارزیابی میشوند نیز هشدار میدهد، به عنوان مثال:
if ((a & 16) == 10) { ... }همواره نادرست خواهد بود.
این هشدار توسط -Wall فعال میشود.
- -Wtrailing-whitespace
- -Wtrailing-whitespace=kind
- درباره فاصلههای خالی انتهایی (trailing whitespace) در انتهای خطوط، شامل درون کامنتها، اما به جز فاصلههای انتهایی در رشتههای لفظی خام (raw string literals)، هشدار میدهد. "-Wtrailing-whitespace" معادل "-Wtrailing-whitespace=blanks" است و فقط درباره نویسههای فاصله (space) و تب افقی (horizontal tab) در انتهای خط هشدار میدهد. "-Wtrailing-whitespace=any" درباره این موارد یا نویسههای برگهپران (form feed) یا تب عمودی انتهایی هشدار میدهد. "-Wno-trailing-whitespace" یا "-Wtrailing-whitespace=none" این هشدار را غیرفعال میکنند، که حالت پیشفرض است. این یک هشدار سبک کدنویسی است.
- -Wleading-whitespace=kind
- درباره اشکالات سبک در فاصلههای خالی ابتدای خطوط (leading whitespace) هشدار میدهد، اما نه درباره مقدار تورفتگی (indentation). برخی پروژهها از سبکهای کدنویسی استفاده میکنند که در آن تنها از نویسههای فاصله برای تورفتگی استفاده میشود، پروژههای دیگر تنها از تب استفاده میکنند، و دیگران از صفر یا چند تب (برای مضارب "-ftabstop=n") و به دنبال آن صفر یا کمتر از n فاصله استفاده میکنند. روی خطوطی که صرفاً شامل نویسههای فاصله هستند هیچ هشداری صادر نمیشود (اگرچه ممکن است هشدار "-Wtrailing-whitespace=" صادر شود)، و درون رشتههای لفظی خام نیز هشداری داده نمیشود. همچنین برای فاصلههای خالی ابتدا در داخل کامنتهای چندخطی نیز هشدار صادر میشود. "-Wleading-whitespace=spaces" برای پروژههایی که میخواهند تورفتگی را تنها با فاصلهها انجام دهند، درباره فاصلههای خالی ابتدایی به جز فاصله هشدار میدهد. "-Wleading-whitespace=tabs" برای پروژههایی که میخواهند تورفتگی را تنها با تبهای افقی انجام دهند، درباره فاصلههای خالی ابتدایی به جز تبهای افقی هشدار میدهد. "-Wleading-whitespace=blanks" درباره فاصلههای خالی ابتدا به جز فاصلهها و تبهای افقی، یا درباره یک تب افقی بعد از یک فاصله در فاصلههای خالی ابتدا، یا درباره n یا تعداد بیشتری فاصله متوالی در فاصلههای خالی ابتدا (که در آن n آرگومان "-ftabstop=n" است، که به طور پیشفرض 8 میباشد) هشدار میدهد. "-Wleading-whitespace=none" این هشدار را غیرفعال میکند، که حالت پیشفرض است. این یک هشدار سبک کدنویسی است.
- -Wtrampolines
- درباره ترامپولینهای (trampolines) تولیدشده برای اشارهگرها به توابع تودرتو (nested functions) هشدار میدهد. یک ترامپولین قطعه کوچکی از داده یا کد است که در زمان اجرا، هنگام گرفته شدن آدرس یک تابع تودرتو، روی پشته (stack) ایجاد میشود و برای فراخوانی غیرمستقیم تابع تودرتو به کار میرود. برای برخی از معماریهای مقصد، این ترامپولین تنها از داده تشکیل شده است و بنابراین نیاز به رسیدگی خاصی ندارد. اما برای بیشتر مقاصد، از کد تشکیل شده و بنابراین نیاز دارد پشته قابلاجرا (executable) باشد تا برنامه به درستی کار کند.
- -Wfloat-equal
- در صورتی که
مقادیر
ممیز شناور
در
مقایسههای
برابری
استفاده
شوند،
هشدار
میدهد.
ایده پشت این هشدار این است که گاهی اوقات (برای برنامهنویس) راحت است که مقادیر ممیز شناور را به عنوان تقریبهایی از اعداد حقیقی با دقت نامتناهی در نظر بگیرد. اگر چنین کاری انجام میدهید، باید (با تحلیل کد یا از راهی دیگر) حداکثر یا حداکثر خطای احتمالی را که محاسبات ایجاد میکند محاسبه کنید، و هنگام انجام مقایسهها (و هنگام تولید خروجی، هرچند که این مسئله متفاوتی است) آن را لحاظ نمایید. به طور خاص، به جای آزمودن برابری، باید بررسی کنید که آیا دو مقدار دارای بازههایی با همپوشانی هستند یا خیر؛ و این کار با عملگرهای رابطهای انجام میشود، بنابراین مقایسههای برابری احتمالاً اشتباه هستند.
- -Wtraditional (تنها C و Objective-C)
- درباره ساختارهای معینی که در C سنتی (traditional) و ISO C رفتار متفاوتی دارند، هشدار میدهد. همچنین درباره ساختارهای ISO C که هیچ معادل C سنتی ندارند، و/یا ساختارهای مشکلسازی که باید از آنها اجتناب شود، هشدار میدهد.
- پارامترهای ماکرو که در داخل رشتههای لفظی (string literals) در بدنه ماکرو ظاهر میشوند. در C سنتی جایگزینی ماکرو درون رشتههای لفظی رخ میدهد، اما در ISO C اینگونه نیست..IP * 4 در C سنتی (traditional 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 یک ثابت عدد صحیح دارای پهنا یا علامتداری متفاوتی نسبت به نوع سنتی آن باشد. این هشدار تنها زمانی صادر میشود که مبنای ثابت ده باشد؛ به این معنی که مقادیر هگزادسیمال یا اکتال، که معمولاً الگوهای بیتی را نشان میدهند، هشدار دریافت نمیکنند.
- استفاده از الحاق رشته به سبک ISO شناسایی شود.
- مقداردهی اولیه به ساختارهای تجمعی خودکار (automatic aggregates).
- تداخل شناسه با برچسبها. C سنتی فاقد فضاینام جداگانه برای برچسبها است.
- مقداردهی اولیه unionها. اگر مقداردهندهٔ اولیه صفر باشد، از هشدار صرفنظر میشود. این کار با این فرض انجام میشود که مقداردهی اولیه به صفر در کد کاربر مثلاً مشروط به "__STDC__" قرار گرفته تا از هشدارهای عدم وجود مقداردهی اولیه جلوگیری شود و در مورد C سنتی به مقداردهی اولیه پیشفرض با صفر تکیه میکند.
- تبدیلها توسط پیشنمونهها (prototypes) میان مقادیر ممیز ثابت/ممیز شناور و برعکس. عدم وجود این پیشنمونهها هنگام کامپایل با C سنتی مشکلات جدی ایجاد میکند. این یک زیرمجموعه از هشدارهای تبدیل ممکن است؛ برای مجموعه کامل از -Wtraditional-conversion استفاده کنید.
- استفاده از تعریف توابع به سبک ISO C. این هشدار عمداً برای اعلانهای پیشنمونه یا توابع با تعداد آرگومان متغیر (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) دیگری را سایهاندازی کند، یا هرگاه یک تابع توکار سایهاندازی شود، هشدار میدهد. توجه داشته باشید که در ++C، کامپایلر در صورتی که یک متغیر محلی یک typedef صریح را سایهاندازی کند هشدار میدهد، اما در صورتی که یک struct/class/enum را سایهاندازی کند هشداری نمیدهد. اگر این هشدار فعال باشد، شامل تمام نمونههای سایهاندازی محلی نیز میشود. این بدان معناست که در صورت استفاده از -Wshadow، گزینههای -Wno-shadow=local و -Wno-shadow=compatible-local نادیده گرفته میشوند. مشابه -Wshadow=global است.
- -Wno-shadow-ivar (فقط Objective-C)
- هنگامی که یک متغیر محلی، یک متغیر نمونه را در یک متد Objective-C سایهاندازی میکند، هشدار ندهد.
- -Wshadow=global
- برای هرگونه سایهاندازی هشدار میدهد. مشابه -Wshadow است.
- -Wshadow=local
- هنگامی که یک متغیر محلی، متغیر محلی دیگر یا پارامتری را سایهاندازی کند، هشدار میدهد.
- -Wshadow=compatible-local
- هنگامی که
یک متغیر
محلی،
متغیر محلی
دیگر یا
پارامتری
را
سایهاندازی
کند که نوع
آن با نوع
متغیر
سایهانداز
سازگار
است، هشدار
میدهد. در
++C، سازگاری
نوع در
اینجا به
این معناست
که نوع
متغیر
سایهانداز
بتواند به
نوع متغیر
سایهاندازیشده
تبدیل شود.
ایجاد این
پرچم (علاوه
بر -Wshadow=local) بر
این ایده
استوار است
که وقتی یک
متغیر محلی
متغیر
دیگری با
نوع
ناسازگار
را
سایهاندازی
میکند، به
احتمال
زیاد عمدی
بوده است،
نه یک باگ
یا اشتباه
تایپی،
همانطور
که در مثال
زیر نشان
داده شده
است:
for (SomeIterator i = SomeObj.begin(); i != SomeObj.end(); ++i) { for (int i = 0; i < N; ++i) { ... } ... }از آنجا که دو متغیر "i" در مثال بالا دارای نوعهای ناسازگار هستند، فعال کردن صرفِ -Wshadow=compatible-local هشداری صادر نمیکند. به دلیل ناسازگار بودن نوعهای آنها، اگر یک برنامهنویس به طور تصادفی یکی را به جای دیگری استفاده کند، انتظار میرود که بررسی نوع متوجه آن شده و یک خطا یا هشدار صادر کند. استفاده از این پرچم به جای -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
- هشدار میدهد اگر اندازهٔ قاب تابع (function frame) از byte-size تجاوز کند. محاسبات انجامشده برای تعیین اندازه قاب پشته تقریبی بوده و محتاطانه نیست. نیازهای واقعی ممکن است تا حدی بیشتر از 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"
اشارهگری
به نویسهٔ
پایانی nul
بازمیگرداند
و نه به
ابتدای
شیء،
فراخوانی
"free" در
زیر تشخیص
داده شده و
مشمول
هشدار
میشود.
void f (char *p) { p = stpcpy (p, "abc"); // ... free (p); // warning }گزینهٔ -Wfree-nonheap-object در -Wall گنجانده شده است..IP -Wstack-usage=byte-size 4 اگر میزان استفاده یک تابع از پشته (stack) ممکن است از byte-size فراتر رود، هشدار میدهد. محاسبات انجامشده برای تعیین میزان استفاده از پشته به صورت محافظهکارانه است. کامپایلر هرگونه فضای تخصیصیافته از طریق "alloca"، آرایههای با طول متغیر (variable-length arrays)، یا ساختارهای مرتبط را هنگام تصمیمگیری دربارهٔ صدور هشدار محاسبه میکند.
پیام هشدار با خروجی -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 *" و
اشارهگرها
به توابع،
اندازهٔ
این نوعها
را ۱ تعیین
میکند. در
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" پشتیبانی نمیکند و ممکن است هشدارهای مثبت کاذب گزارش کند.
- -Wtype-limits
- اگر مقایسهای به دلیل دامنهٔ محدود نوع داده، همیشه درست (true) یا همیشه نادرست (false) باشد هشدار میدهد، اما برای عبارتهای ثابت هشدار نمیدهد. برای مثال، اگر یک متغیر بدون علامت (unsigned) با استفاده از "<" یا ">=" با صفر مقایسه شود، هشدار میدهد. این هشدار توسط -Wextra نیز فعال میشود.
- -Wabsolute-value (تنها C و Objective-C)
- هنگامی که یک تابع استاندارد مناسبتر در دسترس باشد، در صورت فراخوانی توابع استانداردی که قدر مطلق یک آرگومان را محاسبه میکنند، هشدار میدهد. برای نمونه، فراخوانی abs(3.14) این هشدار را فعال میکند چرا که تابع مناسب برای محاسبهٔ قدر مطلق یک آرگومان double، تابع "fabs" است. این گزینه همچنین زمانی که آرگومانِ یک فراخوانی به چنین تابعی دارای یک نوعِ بدون علامت باشد، هشدار میدهد. این هشدار را میتوان با یک تبدیل صریح نوع فرونشاند و همچنین توسط -Wextra فعال میشود.
- -Wcomment
- -Wcomments
- هرگاه توالی شروع توضیح /* درون یک توضیح /* ظاهر شود، یا هرگاه یک بکاسلش-خطجدید درون یک توضیح // بیاید، هشدار میدهد. این هشدار توسط -Wall فعال میشود.
- -Wtrigraphs
- اگر
سهنویسهایها
(trigraphs) یافت
شوند که
ممکن است
معنای
برنامه را
تغییر
دهند،
هشدار
میدهد. در
مورد trigraphهای
درون
توضیحات
هشداری
داده
نمیشود،
مگر مواردی
که تشکیل یک
خط جدید
گریزیافته
بدهند.
این گزینه توسط -Wall نیز اعمال میشود. اگر -Wall مشخص نشده باشد، این گزینه همچنان فعال است مگر اینکه trigraphs فعال شده باشند. برای تبدیل trigraph بدون هشدارها، اما با حفظ سایر هشدارهای -Wall، از -trigraphs -Wall -Wno-trigraphs استفاده کنید.
- -Wundef
- اگر یک شناسهٔ تعریفنشده در دستورالعمل "#if" ارزیابی شود، هشدار میدهد. چنین شناسههایی با صفر جایگزین میشوند.
- -Wexpansion-to-defined
- هر زمان که defined در بسط یک ماکرو دیده شود (شامل موردی که ماکرو توسط دستورالعمل #if بسط داده میشود)، هشدار میدهد. چنین کاربردی قابلحمل نیست. این هشدار توسط -Wpedantic و -Wextra نیز فعال میشود.
- -Wunused-macros
- دربارهٔ
ماکروهای
تعریفشده
در فایل
اصلی که
بلااستفاده
ماندهاند،
هشدار
میدهد. یک
ماکرو در
صورتی
استفادهشده
محسوب
میشود که
حداقل یک
بار بسط
داده شده یا
وجود آن
بررسی شده
باشد.
پیشپردازنده
همچنین
هشدار
میدهد اگر
ماکرو در
زمان
بازتعریف
یا حذف
تعریف،
استفاده
نشده باشد.
در مورد ماکروهای توکار (built-in)، ماکروهای تعریفشده در خط فرمان، و ماکروهای تعریفشده در فایلهای 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)
- هنگامی که فراخوانی یک تابع به نوعی غیرمنطبق تبدیل (cast) شود، هشدار میدهد. برای نمونه، هشدار میدهد اگر فراخوانی تابعی که یک نوع عدد صحیح بازمیگرداند، به یک نوع اشارهگر تبدیل شود.
- -Wc90-c99-compat (تنها C و Objective-C)
- دربارهٔ ویژگیهایی که در ISO C90 موجود نیستند اما در ISO C99 حاضر هستند، هشدار میدهد. برای مثال، دربارهٔ استفاده از آرایههای با طول متغیر، نوع "long long"، نوع "bool"، لیترالهای مرکب (compound literals)، مقداردهندههای اولیه معین (designated initializers) و غیره هشدار میدهد. این گزینه مستقل از حالت استانداردها است. هشدارها در عبارتی که پس از "__extension__" میآید غیرفعال هستند.
- -Wc99-c11-compat (تنها C و Objective-C)
- دربارهٔ ویژگیهایی که در ISO C99 وجود ندارند اما در ISO C11 حاضر هستند، هشدار میدهد. برای مثال، دربارهٔ استفاده از ساختارها و اجتماعهای بینام (anonymous structures and unions)، توصیفگر نوع "_Atomic"، مشخصکننده کلاس حافظهٔ "_Thread_local"، مشخصکنندهٔ "_Alignas"، عملگر "Alignof"، کلیدواژهٔ "_Generic" و غیره هشدار میدهد. این گزینه مستقل از حالت استانداردها است. هشدارها در عبارتی که پس از "__extension__" میآید غیرفعال هستند..IP "-Wc11-c23-compat (فقط C و Objective-C)" 4
- -Wc11-c2x-compat (فقط C و Objective-C)
- دربارهٔ
ویژگیهایی
که در ISO C11 وجود
ندارند اما
در ISO C23
موجودند،
هشدار
میدهد.
برای
نمونه،
دربارهٔ
حذف رشته در
"_Static_assert"،
استفاده از
نحو [[]] برای
صفتها (attributes)،
استفاده از
انواع ممیز
شناور
دهدهی، و
مواردی از
این دست
هشدار
میدهد. این
گزینه
مستقل از
حالت
استانداردها
است.
هشدارها در
عبارتی که
پس از
"__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 فعال میشود.
- -Wc++26-compat (فقط C++ و Objective-C++)
- دربارهٔ ساختارهای C++ که معنای آنها میان ISO C++ 2023 و استاندارد آیندهٔ ISO C++ 2026 متفاوت است هشدار میدهد. این هشدار توسط -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
- هرگاه
اشارهگری
بهگونهای
تبدیل نوع
شود که
همترازیِ
مورد نیازِ
هدف افزایش
یابد،
هشدار
میدهد.
برای
نمونه، اگر
در
ماشینهایی
که اعداد
صحیح در
آنها فقط
در مرزهای
دو یا چهار
بایتی قابل
دسترسی
هستند، یک
"char *" به
یک "int *"
تبدیل نوع
شود، هشدار
میدهد.
هرگاه اشارهگری بهگونهای تبدیل نوع شود که همترازی مورد نیاز هدف افزایش یابد، هشدار میدهد. برای نمونه، صرفنظر از ماشین هدف، اگر یک "char *" به یک "int *" تبدیل نوع شود، هشدار میدهد.
- -Wcast-function-type
- هنگامی که یک اشارهگر تابع به یک اشارهگر تابعِ ناسازگار تبدیل نوع شود، هشدار میدهد. در تبدیل نوعی شامل انواع توابع با فهرست آرگومان متغیر، تنها انواع آرگومانهای ابتداییِ ارائهشده در نظر گرفته میشوند. هر پارامتری از نوع اشارهگر با هر نوع اشارهگر دیگری تطابق دارد. هرگونه تفاوت بیضرر در انواع صحیح نادیده گرفته میشود؛ مانند "int" در برابر "long" در اهداف ILP32. بهطور مشابه توصیفگرهای نوع نادیده گرفته میشوند. نوع تابع "void (*) (void)" خاص است و با همهچیز مطابقت دارد، که میتوان از آن برای فرونشاندن این هشدار استفاده کرد. در تبدیل نوعی شامل اشارهگر به انواع عضو، هرگاه تبدیل نوع موجب تغییر نوع اشارهگر به عضو شود، این گزینه هشدار میدهد. این هشدار توسط -Wextra فعال میشود.
- -Wcast-user-defined
- هنگامی که
تبدیل نوع
به یک نوع
مرجع، شامل
تبدیل
تعریفشده
توسط
کاربری که
ممکن است
برنامهنویس
انتظار
فراخوانیاش
را داشته
باشد نشود،
هشدار
میدهد.
struct A { operator const int&(); } a; auto r = (int&)a; // warningاین هشدار بهطور پیشفرض فعال است.
- -Wwrite-strings
- هنگام
کامپایل C،
به
ثابتهای
رشتهای
نوع "const
char[length]"
میدهد تا
کپی کردن
نشانی یکی
از آنها
درون یک
اشارهگر
"char *"
غیر-"const"
موجب تولید
یک هشدار
شود. این
هشدارها به
شما کمک
میکنند تا
در زمان
کامپایل،
کدی را
بیابید که
ممکن است
برای نوشتن
در یک ثابت
رشتهای
تلاش کند؛
البته تنها
در صورتی که
در استفاده
از "const"
در
اعلانها و
پیشنمونهها
بسیار دقیق
بوده باشید.
در غیر این
صورت،
صرفاً
مایهٔ
دردسر
خواهد بود.
به همین
دلیل است که
ما -Wall را
وادار به
درخواست
این
هشدارها
نکردهایم.
هنگام کامپایل C++، دربارهٔ تبدیل منسوخشده از لفظهای رشتهای به "char *" هشدار میدهد. این هشدار بهطور پیشفرض برای برنامههای C++ فعال است.
این هشدار در حالت C++11 یا بالاتر، توسط -pedantic-errors به یک خطا ارتقا مییابد.
- -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 غیرفعال کرد.
این گزینه همچنین میتواند برای غیرفعال کردن هشدارهایی مانند cc1plus: note: CTF debug info requested, but not supported for 'GNU C++20' frontend که توسط -gctf یا -gsctf برای زبانهای پشتیبانینشده تولید میشود، مورد استفاده قرار گیرد..IP "-Wcompare-distinct-pointer-types (تنها C و Objective-C)" 4 اگر اشارهگرهایی از انواع متمایز بدون تبدیل نوع (cast) با یکدیگر مقایسه شوند، هشدار میدهد. این هشدار بهطور پیشفرض فعال است.
- -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) به اشیائی با دورهٔ ماندگاری خودکار (automatic storage duration) پس از پایان طول عمر آنها، هشدار میدهد. این شامل متغیرهای محلی اعلانشده در بلوکهای تودرتو، لیترالهای مرکب (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 خارج از حوزه است. از آنجا که کدی که "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__" هشدار میدهد، چرا که ممکن است مانع از کامپایلهای بازتولیدپذیر و دقیقاً همسان از نظر بیتی (bitwise-identical reproducible) شوند.
- -Wempty-body
- اگر بدنهٔ خالی در دستور "if"، "else" یا "do while" رخ دهد، هشدار میدهد. این هشدار همچنین توسط -Wextra فعال میشود.
- -Wno-endif-labels
- دربارهٔ توکنهای اضافه و سرگردان پس از "#else" و "#endif" هشدار نمیدهد.
- -Wenum-compare
- دربارهٔ مقایسه میان مقادیر انواع شمارشی (enumerated types) متفاوت هشدار میدهد. در ++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"، یک نوع عدد صحیح علامتدار، یا یک نوع عدد صحیح بدون علامت سازگار است. با این حال، از آنجا که انتخاب نوع زیربنایی (underlying type) یک نوع شمارشی وابسته به پیادهسازی (implementation-defined) است، چنین عدم تطابقهایی ممکن است مسائلی در زمینهٔ انتقالپذیری (portability) ایجاد کنند. در ++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 غیرفعال کرد..IP -Wsign-compare 4 هنگامی که مقایسه بین مقادیر علامتدار (signed) و بدون علامت (unsigned) به دلیل تبدیل مقدار علامتدار به بدون علامت ممکن است نتیجه نادرستی تولید کند، هشدار میدهد. در C++، این هشدار توسط -Wall نیز فعال میشود. در C، این گزینه توسط -Wextra نیز فعال میگردد.
- -Wsign-conversion
- برای تبدیلهای ضمنی (implicit conversions) که ممکن است علامت یک مقدار صحیح را تغییر دهند، مانند انتساب یک عبارت صحیح علامتدار به یک متغیر صحیح بدون علامت، هشدار میدهد. یک تبدیل نوع صریح (explicit cast) این هشدار را بیاثر میکند. در C، این گزینه همچنین توسط -Wconversion فعال میشود.
- -Wflex-array-member-not-at-end (تنها C و C++)
- هنگامی که
یک ساختار
حاوی عضو
آرایه
انعطافپذیر
C99 (flexible array member) به
عنوان فیلد
آخر، در
انتهای یک
ساختار
دیگر قرار
نگرفته
باشد،
هشدار
میدهد. این
هشدار به
عنوان مثال
در چنین
مواردی
اخطار
میدهد:
struct flex { int length; char data[]; }; struct mid_flex { int m; struct flex flex_data; int n; }; - -Wfloat-conversion
- برای تبدیلهای ضمنی که دقت یک مقدار اعشاری (حقیقی) را کاهش میدهند هشدار میدهد. این شامل تبدیل از مقدار اعشاری به صحیح، و از مقادیر اعشاری با دقت بالاتر به مقادیر اعشاری با دقت پایینتر است. این گزینه همچنین توسط -Wconversion فعال میشود.
- -Wno-scalar-storage-order
- درباره ساختارهای مشکوک مرتبط با ترتیب ذخیرهسازی اسکالر معکوس (reverse 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)" مد نظر بوده است. این پیغام عیبیابی تنها زمانی صادر میشود که آرگومان سوم یک لیترال صفر باشد. در غیر این صورت، اگر عبارتی باشد که به صفر خلاصه (fold) میشود، یا تبدیل نوع صفر به نوعی دیگر باشد، احتمال اینکه جای آرگومانها به اشتباه جابهجا شده باشد بسیار کمتر است و هیچ هشداری صادر نمیشود. این هشدار توسط -Wall فعال میشود.
- -Waddress
- درباره
استفادههای
مشکوک از
عبارات
آدرس هشدار
میدهد. این
موارد شامل
مقایسه
آدرس یک
تابع یا یک
شیء
اعلانشده
با ثابت
اشارهگر
تهی (null pointer constant)
است، مانند:
void f (void); void g (void) { if (!f) // warning: expression evaluates to false abort (); }مقایسه یک اشارهگر با یک لیترال رشتهای، مانند:
void f (const char *x) { if (x == "abc") // warning: expression evaluates to false puts ("equal"); }و بررسی برابری نتایج جمع یا تفریق اشارهگر با null، مانند:
void f (const int *p, int i) { return p + i == NULL; }چنین استفادههایی معمولاً نشاندهنده خطای برنامهنویس هستند: آدرس بیشتر توابع و اشیاء لزوماً برابر با true ارزیابی میشود (استثنا نمادهای ضعیف یا weak symbols هستند)، بنابراین استفاده از آنها در یک شرط ممکن است نشاندهنده جا افتادن پرانتزها در یک فراخوانی تابع یا جا افتادن ارجاعزدایی (dereference) در یک عبارت آرایه باشد. زیرمجموعه این هشدار برای اشارهگرهای شیء را میتوان با تبدیل نوع عملوند اشارهگر به یک نوع عدد صحیح مانند "intptr_t" یا "uintptr_t" فرونشاند. مقایسه در برابر لیترالهای رشتهای منجر به رفتار نامشخص (unspecified behavior) میشود و قابل حمل نیست، و نشان میدهد که قصد برنامهنویس فراخوانی "strcmp" بوده است. اگر عبارت مشکوک نتیجه بسط یک ماکرو باشد، این هشدار فرونشانده میشود. هشدار -Waddress توسط -Wall فعال میشود.
- -Wno-address-of-packed-member
- هنگامی که آدرس عضوی فشرده (packed member) از یک struct یا union گرفته میشود، که معمولاً منجر به یک مقدار اشارهگر همترازنشده (unaligned pointer) میشود، هشدار نمیدهد. این گزینه به طور پیشفرض فعال است.
- -Wlogical-op
- درباره
استفادههای
مشکوک از
عملگرهای
منطقی در
عبارات
هشدار
میدهد. این
شامل
استفاده از
عملگرهای
منطقی در
زمینههایی
است که
احتمالاً
یک عملگر
بیتی (bitwise)
مورد
انتظار است.
همچنین
هنگامی که
عملوندهای
یک عملگر
منطقی
یکسان
باشند
هشدار
میدهد:
extern int a; if (a < 0 && a < 0) { ... } - -Wlogical-not-parentheses
- درباره
استفاده از
نقیض منطقی
(logical not) در
عملوند سمت
چپ یک
مقایسه
هشدار
میدهد. این
گزینه اگر
عملوند سمت
راست یک
عبارت بولی
در نظر
گرفته شود
هشدار
نمیدهد.
هدف آن
تشخیص
کدهای
مشکوک
مانند مورد
زیر است:
int a; ... if (!a > 1) { ... }میتوان این هشدار را با قرار دادن عملوند سمت چپ درون پرانتز فرونشاند:
if ((!a) > 1) { ... }این هشدار توسط -Wall فعال میشود..IP -Waggregate-return 4 هشدار میدهد اگر توابعی که ساختارها (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:: هشدارها دربارهٔ تمام صفتهای موجود در یک فضای نام (namespace) را غیرفعال کرد که از هشدار برای هر دوی این اعلانها جلوگیری میکند:
[[vendor::safe]] void f(); [[vendor::unsafe]] void f2();
توجه داشته باشید که -Wno-attributes= متضمن -Wno-attributes نیست.
- -Wno-builtin-declaration-mismatch
- هشدار
میدهد اگر
یک تابع
توکار (built-in) با
یک امضای
ناسازگار
یا
بهعنوان
چیزی غیر از
تابع اعلان
شود، یا
زمانی که یک
تابع توکار
اعلانشده
با نوعی
فاقد
پیشنمونه
(prototype)، با
آرگومانهایی
فراخوانی
شود که
انواع
ارتقایافتهٔ
آنها با
انواع مورد
انتظار
تابع
مطابقت
نداشته
باشد.
هنگامی که
-Wextra مشخص شده
باشد،
همچنین اگر
یک تابع
توکار
آرگومانپذیر
بدون
پیشنمونه
اعلان شود
هشدار
میدهد.
هشدار
-Wbuiltin-declaration-mismatch
بهطور
پیشفرض
فعال است.
برای
جلوگیری از
این هشدار،
سرآیند
مناسب را
بگنجانید
تا
پیشنمونههای
توابع
توکار در
حوزه (scope) قرار
گیرند.
برای مثال، فراخوانی "memset" در زیر مشمول این هشدار میشود زیرا این تابع مقداری از نوع "size_t" را بهعنوان آرگومان خود انتظار دارد اما نوع 32 برابر با "int" است. با -Wextra، اعلان تابع نیز مشمول هشدار میشود.
extern void* memset (); void f (void *d) { memset (d, '\0', 32); } - -Wno-builtin-macro-redefined
- اگر ماکروهای توکار (built-in) مشخصی مجدداً تعریف شوند، هشدار نمیدهد. این گزینه هشدارهای مربوط به تعریف مجدد "__TIMESTAMP__"، "__TIME__"، "__DATE__"، "__FILE__" و "__BASE_FILE__" را متوقف میکند.
- -Wkeyword-macro
- هشدار میدهد اگر یک کلمهٔ کلیدی (keyword) بهعنوان یک ماکرو تعریف شود یا لغو تعریف (undefined) گردد. برای C++ شناسههای دارای معنای خاص یا شناسههای صفتهای استاندارد نیز بررسی و گزارش میشوند. این هشدار برای C++26 در صورت تعیین "-Wpedantic" بهطور پیشفرض فعال است و در آن حالت یک pedwarn صادر میکند.
- -Wfree-labels (تنها C و Objective-C)
- هشدار
میدهد اگر
یک برچسب (label)
روی یک
غیرعبارت
(non-statement) اعمال
شود، یا در
انتهای یک
عبارت مرکب
(compound statement) قرار
گیرد. چنین
برچسبهایی
در C23 و
گویشهای
بعدی C مجاز
هستند و در
تمام
گویشهای
دیگر
بهعنوان
یک افزونهٔ
GCC در دسترس
میباشند.
این هشدار همچنین با -Wc11-c23-compat فعال میشود. در صورت ساخت برای نسخهای از C قبل از C23، توسط -pedantic-errors به یک خطا تبدیل میشود.
- -Wheader-guard
- هشدار میدهد اگر یک محافظ شمول چندگانهٔ معتبر سرآیند پیشپردازنده (preprocessor header multiple inclusion guard)، بلافاصله پس از دستور "#ifndef" یا "#if !defined" مربوط به محافظ شمول چندگانه دارای یک دستور "#define" باشد که ماکرویی متفاوت از ماکروی محافظ اما با نامی مشابه را تعریف کند، ماکروی واقعی محافظ شمول چندگانه در دستور "#ifndef" متناظر در انتهای سرآیند تعریف نشده باشد، و دستور "#define" یک ماکروی شبهشیء (object-like macro) با تعریفی خالی را تعریف کند. در چنین حالتی، اغلب تنها یک اشتباه املایی در نام محافظ رخ داده است، چه در دستور "#ifndef" یا "#if !defined" و چه در دستور "#define" پس از آن. این هشدار توسط -Wall فعال میشود.
- -Wstrict-prototypes (تنها C و Objective-C)
- هشدار میدهد اگر تابعی بدون مشخص کردن نوع آرگومانها اعلان یا تعریف شود. (تعریف تابع به سبک قدیمی، در صورتی که قبل از آن اعلانی باشد که انواع آرگومانها را مشخص کند، بدون هشدار مجاز است.)
- -Wold-style-declaration (تنها C و Objective-C)
- دربارهٔ کاربردهای منسوخشده طبق استاندارد C در یک اعلان هشدار میدهد. برای نمونه، اگر مشخصکنندههای ردهٔ ذخیرهسازی (storage-class specifiers) مانند "static" اولین بخش در یک اعلان نباشند، هشدار میدهد. این هشدار همچنین با -Wextra فعال میشود.
- -Wold-style-definition (تنها C و Objective-C)
- هشدار میدهد اگر از یک تعریف تابع به سبک قدیمی استفاده شود. حتی در صورت وجود یک پیشنمونهٔ قبلی نیز هشدار داده میشود. تعریفی که از () استفاده میکند در حالت C23 یک تعریف سبک قدیمی محسوب نمیشود، زیرا در آن حالت معادل (void) است، اما برای استانداردهای قدیمیتر یک تعریف سبک قدیمی به شمار میآید.
- -Wmultiple-parameter-fwd-decl-lists (تنها C و Objective-C)
- هشدار میدهد اگر بیش از یک فهرست از اعلانهای پیشین (forward declarations) پارامترها در یک پیشنمونهٔ تابع ظاهر شود. این هشدار همچنین با -Wextra فعال میشود.
- -Wdeprecated-non-prototype (تنها C و Objective-C)
- هشدار
میدهد اگر
تابعی که با
یک فهرست
پارامتر
خالی ()
اعلان شده
است با یک
یا چند
آرگومان
فراخوانی
شود، یا اگر
پس از چنین
اعلانی
تعریفی از
تابع با یک
یا چند
پارامتر
مشاهده
گردد. هر
دوی این
موارد در 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)
- هشدار
میدهد اگر
یک پارامتر
تابع بدون
مشخصکنندهٔ
نوع (type specifier) در
توابع به
سبک K&R اعلان
شود:
void foo(bar) { }این هشدار همچنین با -Wextra فعال میشود.
- -Wno-declaration-missing-parameter-type (تنها C و Objective-C)
- اگر اعلان
یک تابع
شامل نام
پارامتر
بدون نوع
باشد،
هشدار
نمیدهد.
چنین
اعلانهای
تابعی
پیشنمونهٔ
تابع (prototype)
ارائه
نمیدهند و
از بیشتر
بررسیهای
نوع در
فراخوانیهای
تابع
جلوگیری
میکنند.
این هشدار بهطور پیشفرض فعال است. در C99 و گویشهای بعدی C، با آن بهعنوان یک خطا رفتار میشود. این خطا را میتوان با استفاده از -fpermissive (همراه با برخی خطاهای دیگر)، یا تنها برای همین خطا، با -Wno-error=declaration-missing-parameter-type به یک هشدار تنزل داد.
این هشدار توسط -pedantic-errors به یک خطا ارتقا مییابد.
- -Wmissing-prototypes (تنها C و Objective-C)
- هشدار میدهد اگر یک تابع سراسری (global) بدون اعلان پیشنمونهٔ قبلی تعریف شود. این هشدار حتی اگر خود تعریف یک پیشنمونه ارائه دهد نیز صادر میشود. از این گزینه برای شناسایی توابع سراسری که اعلان پیشنمونهٔ منطبقی در یک فایل سرآیند ندارند استفاده کنید. این گزینه برای C++ معتبر نیست زیرا تمام اعلانهای تابع پیشنمونه ارائه میدهند و یک اعلان نامنطبق به جای تداخل با اعلانی پیشین، یک سربارگذاری (overload) را اعلان میکند. برای شناسایی اعلانهای ناموجود در C++ از -Wmissing-declarations استفاده کنید.
- -Wmissing-variable-declarations (تنها C و Objective-C)
- هشدار میدهد اگر یک متغیر سراسری بدون اعلان قبلی تعریف شود. از این گزینه برای شناسایی متغیرهای سراسری که اعلان extern منطبقی در یک فایل سرآیند ندارند استفاده کنید.
- -Wmissing-declarations
- هشدار
میدهد اگر
یک تابع
سراسری
بدون اعلان
قبلی تعریف
شود. حتی
اگر خود
تعریف یک
پیشنمونه
ارائه دهد
نیز این کار
انجام
میشود. از
این گزینه
برای
شناسایی
توابع
سراسری که
در
فایلهای
سرآیند
اعلان
نشدهاند
استفاده
کنید. در C،
هیچ هشداری
برای
توابعی با
اعلانهای
غیرپیشنمونهای
قبلی صادر
نمیشود؛
برای
شناسایی
پیشنمونههای
ناموجود از
-Wmissing-prototypes
استفاده
کنید. در C++،
هیچ هشداری
برای
الگوهای
تابع (function templates)،
یا برای
توابع
درونخطی (inline
functions)، یا برای
توابع در
فضاهای نام
ناشناس
صادر
نمیشود..IP
-Wmissing-field-initializers 4 اگر
در
مقداردهی
اولیه یک
ساختار
برخی از
فیلدها جا
افتاده
باشند،
هشدار
میدهد.
برای
نمونه، کد
زیر باعث
چنین
هشداری
میشود،
زیرا "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> یک عبارت معتبر باشد، مقدار satisfied برابر با true خواهد بود، که این برای هر T صادق است. احتمالاً منظور کاربر نوشتن این بوده است:
bool satisfied = requires { requires C<T> };تا satisfied تنها در صورتی true باشد که مفهوم (concept) C برای نوع T برآورده شده باشد.
این هشدار را میتوان با -Wno-missing-requires غیرفعال کرد.
- -Wno-missing-template-keyword
- اگر شیء
والد
وابسته (dependent)
باشد و عضوی
که نام برده
میشود یک
الگو (template)
باشد،
نشانههای
دسترسی به
عضو .، -> و ::
باید با
کلمه کلیدی
"template"
دنبال شوند.
template <class X> void DoStuff (X x) { x.template DoSomeOtherStuff<X>(); // Good. x.DoMoreStuff<X>(); // Warning, x is dependent. }در موارد نادر ممکن است هشدارهای مثبت کاذب رخ دهد. برای فرونشاندن این هشدار، عبارت را در پرانتز قرار دهید. برای نمونه، عبارت زیر به عنوان یک الگو در نظر گرفته میشود، حتی در جایی که 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 برخی
قواعد
نرمالسازی
(normalization rules) را معین
کرده است که
با اعمال
آنها
اطمینان
حاصل
میشود دو
دنباله با
ظاهر یکسان
به یک
دنباله
یکسان
تبدیل شوند.
GCC میتواند
در صورت
استفاده از
شناسههایی
که
نرمالسازی
نشدهاند
هشدار دهد؛
این گزینه
این هشدار
را کنترل
میکند.
چهار سطح هشدار توسط GCC پشتیبانی میشود. پیشفرض -Wnormalized=nfc است که درباره هر شناسهای که در شکل نرمالسازیشده "C" از ISO 10646 یعنی NFC نباشد هشدار میدهد. شکل NFC برای بیشتر کاربردها توصیه میشود و معادل -Wnormalized است.
متأسفانه، برخی از نویسهها که طبق ISO C و ISO C++ در شناسهها مجاز هستند، وقتی به NFC تبدیل میشوند دیگر در شناسهها مجاز نیستند. این یعنی راهی برای استفاده از این نمادها در کدهای قابلحمل ISO C یا C++ وجود ندارد به گونهای که تمام شناسههای شما در قالب NFC باقی بمانند. گزینه -Wnormalized=id هشدار را برای این نویسهها نادیده میگیرد. امید است نسخههای آینده استانداردهای مربوطه این مشکل را رفع کنند، و به همین دلیل این گزینه پیشفرض نیست.
میتوانید با نوشتن -Wnormalized=none یا -Wno-normalized هشدار را برای همه نویسهها خاموش کنید. تنها در صورتی باید این کار را انجام دهید که از طرح نرمالسازی دیگری (مانند "D") استفاده میکنید، زیرا در غیر این صورت به سادگی ممکن است باگهایی ایجاد کنید که دیدن آنها با چشم عملاً غیرممکن است.
برخی نویسهها در ISO 10646 معانی متمایزی دارند اما در بعضی قلمها یا روشهای نمایش، بهویژه پس از اعمال قالببندی، یکسان به نظر میرسند. برای نمونه "\u207F"، یا "SUPERSCRIPT LATIN SMALL LETTER N"، دقیقاً مانند یک "n" معمولی نمایش داده میشود که در بالانویس قرار گرفته است. استاندارد ISO 10646 طرح نرمالسازی NFKC را نیز برای تبدیل همه این موارد به یک شکل استاندارد تعریف میکند، و در صورت استفاده از -Wnormalized=nfkc، اگر کد شما در قالب NFKC نباشد، GCC هشدار میدهد. این هشدار قابل مقایسه با هشدار دادن درباره هر شناسهای است که حرف O را شامل میشود به این دلیل که ممکن است با رقم 0 اشتباه گرفته شود؛ از این رو پیشفرض نیست، اما در صورتی که نتوان محیط برنامهنویسی را طوری اصلاح کرد که این نویسهها را به طور متمایز نمایش دهد، ممکن است به عنوان یک شیوهنامه کدنویسی محلی مفید باشد.
- -Wno-attribute-warning
- درباره استفاده از توابعی که با صفت "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-deprecated-openmp
- درباره کدهای منسوخشده OpenMP هشدار نده.
- -Wno-overflow
- درباره سرریز زمان کامپایل در عبارتهای ثابت هشدار نده.
- -Wno-odr
- درباره نقض قانون One Definition Rule در زمان بهینهسازی پیوند (LTO) هشدار میدهد. به طور پیشفرض فعال است.
- -Wopenacc-parallelism
- درباره انتخابهای بالقوه غیربهینه مرتبط با موازیسازی OpenACC هشدار میدهد.
- -Wno-openmp
- درباره کدهای مشکوک OpenMP هشدار میدهد.
- -Wopenmp-simd
- اگر مدل هزینه بردارساز (vectorizer cost model) رهنمود OpenMP simd تعیینشده توسط کاربر را نادیده بگیرد، هشدار میدهد. گزینه -fsimd-cost-model=unlimited را میتوان برای کاهش محدودیت مدل هزینه استفاده کرد.
- -Woverride-init (تنها در C و Objective-C)
- اگر هنگام
استفاده از
مقداردهندههای
معینشده،
یک فیلد
مقداردهیشده
بدون اثر
جانبی
بازنویسی
شود، هشدار
میدهد.
این هشدار در -Wextra گنجانده شده است. برای دریافت سایر هشدارهای -Wextra بدون این مورد، از -Wextra -Wno-override-init استفاده کنید..IP "-Wno-override-init-side-effects (تنها C و Objective-C)" 4 هنگامی که از مقداردهندههای تعیینشده (designated initializers) استفاده میشود، اگر فیلد مقداردهیشدهای که دارای اثر جانبی است بازنویسی شود، هشدار ندهد. این هشدار بهطور پیشفرض فعال است.
- -Wpacked
- اگر به یک
ساختار صفت
packed داده شود،
اما این صفت
هیچ تأثیری
بر چیدمان
یا
اندازهی
ساختار
نداشته
باشد،
هشدار
میدهد.
چنین
ساختارهایی
ممکن است در
ازای
فایدهای
ناچیز
ناتراز (misaligned)
شوند. برای
نمونه، در
این کد،
متغیر
"f.x" در
"struct bar"
ناتراز است
حتی با
اینکه خود
"struct bar"
دارای صفت packed
نیست:
struct foo { int x; char a, b, c, d; } __attribute__((packed)); struct bar { char z; struct foo f; }; - -Wnopacked-bitfield-compat
- سریهای
۴.۱، ۴.۲ و ۴.۳
از GCC صفت
"packed" را
روی
میدانهای
بیتی از نوع
"char"
نادیده
میگیرند.
این مورد در
GCC 4.4 برطرف شد،
اما این
تغییر
میتواند
منجر به
تفاوتهایی
در چیدمان
ساختار شود.
GCC هنگامی که
آفست چنین
فیلدی در GCC 4.4
تغییر کرده
باشد به شما
اطلاع
میدهد.
برای
نمونه، در
این ساختار
دیگر یک
فاصلهگذاری
(padding) ۴ بیتی
میان
فیلدهای
"a" و
"b" وجود
ندارد:
struct foo { char a:4; char b:8; } __attribute__ ((packed));این هشدار بهطور پیشفرض فعال است. برای غیرفعال کردن این هشدار از -Wno-packed-bitfield-compat استفاده کنید.
- -Wpacked-not-aligned (تنها C، C++، Objective-C و Objective-C++)
- اگر یک فیلد
ساختار با
تراز
مشخصشدهی
صریح در یک struct
یا union با صفت packed
ناتراز
باشد،
هشدار
میدهد.
برای نمونه
در این کد،
هشداری
برای "struct
S" صادر
خواهد شد
مانند "warning:
alignment 1 of 'struct S' is less than 8":
struct __attribute__ ((aligned (8))) S8 { char a[8]; }; struct __attribute__ ((packed)) S { struct S8 s8; };این هشدار توسط -Wall فعال میشود.
- -Wpadded
- اگر فاصلهگذاری (padding) در یک ساختار گنجانده شود، چه برای تراز کردن عضوی از ساختار و چه برای تراز کردن کل ساختار، هشدار میدهد. گاهی اوقات در چنین شرایطی ممکن است بتوان چینش فیلدهای ساختار را بازآرایی کرد تا فاصلهگذاری کاهش یافته و در نتیجه ساختار کوچکتری به دست آید.
- -Wredundant-decls
- اگر چیزی بیش از یک بار در همان حوزه (scope) اعلان شود، حتی در مواردی که اعلان چندگانه معتبر بوده و هیچ تغییری ایجاد نمیکند، هشدار میدهد.
- -Wrestrict
- هنگامی که
شیء
ارجاعشده
توسط یک
پارامتر
دارای
صلاحیت
"restrict" (یا
در C++، یک
پارامتر با
صلاحیت
"__restrict")
توسط
آرگومان
دیگری نام
مستعار (alias)
شود، یا
زمانی که
کپیها
میان چنین
اشیایی
همپوشانی
داشته
باشند،
هشدار
میدهد.
برای
نمونه،
فراخوانی
تابع
"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
- -Wno-interference-size
- دربارهی
استفادههای
سؤالبرانگیز
از
متغیرهای
"constexpr"
استاندارد
C++17 یعنی
"std::hardware_destructive_interference_size"
و
"std::hardware_constructive_interference_size"
هشدار
میدهد.
این متغیرها برای کنترل چیدمان کلاسها در نظر گرفته شدهاند، تا از اشتراک کاذب (false sharing) در کدهای همروند جلوگیری کنند:
struct independent_fields { alignas(std::hardware_destructive_interference_size) std::atomic<int> one; alignas(std::hardware_destructive_interference_size) std::atomic<int> two; };در اینجا هدف این است که one و two به اندازهی کافی از یکدیگر فاصله داشته باشند تا نوشتن در یکی، دسترسیها به دیگری را وادار به بارگذاری مجدد خط کَش (cache line) نکند.
بهطور پیشفرض، به این متغیرها بر اساس گزینهی -mtune کنونی مقادیری اختصاص مییابد؛ معمولاً متناسب با اندازهی خط کَش L1 برای پردازندهی هدف خاص، و گاهی به صورت یک بازه در صورتی که بهینهسازی برای یک هدف عمومی باشد. بنابراین تمام واحدهای ترجمه که برای استفاده از این متغیرها به سازگاری ABI وابسته هستند، باید با همان -mtune (یا -mcpu) کامپایل شوند.
اگر پایداری ABI اهمیت دارد، مانند زمانی که این متغیرها در سرآیند یک کتابخانه استفاده میشوند، احتمالاً بهتر است اصلاً از متغیرهای اندازهی تداخل سختافزاری استفاده نکنید.
این هشدارها بهطور پیشفرض فعال هستند. اگر اطمینان دارید که استفادهی شما از این متغیرها روی ABI خارج از یک بیلد مستقل از پروژهتان تأثیری نمیگذارد، میتوانید هشدار را با -Wno-interference-size خاموش کنید.
- -Wint-in-bool-context
- در مورد استفادهی مشکوک از مقادیر عددی صحیح در جاهایی که مقادیر بولی مورد انتظار است هشدار میدهد، مانند عبارتهای شرطی (?:) با استفاده از ثابتهای صحیح غیربولی در زمینهی بولی، نظیر "if (a <= b ? 2 : 3)"؛ یا شیفت به چپ اعداد صحیح علامتدار در زمینهی بولی، مانند "for (a = 0; 1 << a; a++);". همچنین برای تمامی انواع ضرب بدون در نظر گرفتن نوع داده هشدار میدهد. این هشدار توسط -Wall فعال میشود.
- -Wno-int-to-pointer-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 به یک خطا ارتقا مییابد..IP -Wvariadic-macros 4 اگر ماکروهای با تعداد آرگومان متغیر (variadic macros) در حالت ISO C90 استفاده شوند، یا اگر نحو جایگزین GNU در حالت ISO C99 به کار رود، هشدار میدهد. این گزینه توسط هر یک از -Wpedantic یا -Wtraditional فعال میشود. برای غیرفعال کردن پیامهای هشدار، از -Wno-variadic-macros استفاده کنید.
- -Wno-varargs
- در صورت استفادهٔ مشکوک از ماکروهای به کار رفته برای مدیریت آرگومانهای متغیر مانند "va_start"، هشدار نمیدهد. این هشدارها به طور پیشفرض فعال هستند.
- -Wvector-operation-performance
- اگر عملیات برداری از طریق قابلیتهای SIMD معماری پیادهسازی نشده باشد، هشدار میدهد. این گزینه عمدتاً برای تنظیم و بهبود کارایی مفید است. عملیات برداری میتواند به صورت "piecewise" پیادهسازی شود، به این معنی که عملیات اسکالر بر روی هر عنصر بردار اجرا میشود؛ "in parallel"، به این معنی که عملیات برداری با استفاده از اسکالرهای با نوع عریضتر پیادهسازی میشود که معمولاً از نظر کارایی بهینهتر است؛ و "as a single scalar"، به این معنی که بردار درون یک نوع اسکالر جای میگیرد.
- -Wvla
- اگر از یک
آرایه با
طول متغیر
(variable-length array) در کد
استفاده
شود، هشدار
میدهد.
گزینهٔ -Wno-vla
از صدور
هشدار -Wpedantic
برای
آرایههای
با طول
متغیر
جلوگیری
میکند.
این هشدار توسط -pedantic-errors به یک خطا ارتقا مییابد.
- -Wvla-larger-than=byte-size
- در صورت
استفاده از
این گزینه،
کامپایلر
برای تعریف
آرایههای
با طول
متغیری که
اندازهٔ
آنها یا
نامحدود
است یا با
آرگومانی
محدود شده
که به
اندازهٔ
آرایه
اجازه
میدهد از
byte-size بایت
فراتر رود،
هشدار
میدهد. این
سازوکار
مشابه
نحوهٔ
عملکرد
-Walloca-larger-than=byte-size
است، اما
برای
آرایههای
با طول
متغیر
اعمال
میشود.
توجه داشته باشید که GCC ممکن است آرایههای کوچک با طول متغیر با مقدار معلوم را به آرایههای معمولی بهینهسازی کند، بنابراین ممکن است این هشدار برای چنین آرایههایی صادر نشود.
گزینهٔ -Wvla-larger-than=PTRDIFF_MAX به طور پیشفرض فعال است اما معمولاً تنها زمانی اثرگذار است که -ftree-vrp فعال باشد (پیشفرض برای -O2 و بالاتر).
همچنین ببینید: -Walloca-larger-than=byte-size.
- -Wno-vla-larger-than
- هشدارهای -Wvla-larger-than= را غیرفعال میکند. این گزینه معادل -Wvla-larger-than=SIZE_MAX یا مقادیر بزرگتر است.
- -Wvla-parameter
- دربارهٔ
اعلانهای
مجدد
توابعی که
شامل
آرگومانهایی
از نوع
آرایه با
طول متغیر (VLA)
با انواع یا
اَشکال
ناسازگار
هستند
هشدار
میدهد، و
امکان
تشخیص
دسترسیهای
خارج از
محدوده به
چنین
پارامترهایی
را توسط
هشدارهایی
مانند -Warray-bounds
فراهم
میسازد.
اگر نخستین اعلان تابع از فرم VLA استفاده کند، کران مشخصشده در آرایه به عنوان حداقل تعداد عناصر مورد انتظار برای ارسال در فراخوانیهای تابع و حداکثر تعداد عناصر قابل دسترسی توسط آن فرض میشود. ارسال نکردن آرگومانهایی با اندازهٔ کافی یا دسترسی به بیش از حداکثر تعداد عناصر ممکن است به عنوان خطا یا هشدار گزارش شود.
برای نمونه، این هشدار برای اعلانهای مجدد زیر فعال میشود زیرا اعلان نخست اجازه میدهد آرایهای با هر اندازهای به "f" ارسال شود در حالی که اعلان دوم مشخص میکند آرگومان آرایه باید حداقل "n" عنصر داشته باشد. علاوه بر این، فراخوانی "f" با پارامتر کران VLA مرتبطی که از کران واقعی VLA تجاوز کند نیز موجب صدور هشدار میشود.
void f (int n, int[n]); // warning: argument 2 previously declared as a VLA void f (int, int[]); void g (int n) { if (n > 4) return; int a[n]; // warning: access to a by f may be out of bounds f (sizeof a, a); ... }گزینهٔ -Wvla-parameter در -Wall گنجانده شده است. گزینهٔ -Warray-parameter هشدارهایی را برای مشکلات مشابه مرتبط با آرگومانهای آرایهٔ معمولی صادر میکند.
- -Wvolatile-register-var
- اگر یک متغیر ثبات (register variable) با مشخصهٔ volatile اعلان شود، هشدار میدهد. اصلاحکنندهٔ volatile مانع از تمام بهینهسازیهایی که ممکن است عملیات خواندن و/یا نوشتن روی متغیرهای ثبات را حذف کنند نمیشود. این هشدار توسط -Wall فعال میگردد.
- -Wno-xor-used-as-pow (تنها در C، C++، Objective-C و Objective-C++)
- هشدارهای
مربوط به
استفاده از
"^"،
عملگر XOR، را
در مواردی
که به نظر
میرسد
مقصود کد به
توان
رساندن
بوده است
غیرفعال
میکند. به
طور مشخص،
این هشدار
زمانی صادر
میشود که
عملوند سمت
چپ ثابت
دهدهی 2 یا 10
باشد و سمت
راست نیز یک
ثابت
دهدهی
باشد.
در C و C++، عملگر "^" به معنای یاء مانعهالجمع (XOR) است، در حالی که در برخی زبانهای دیگر (مانند TeX و برخی نگارشهای BASIC) به معنای به توان رساندن است.
این هشدار را میتوان با تبدیل یکی از عملوندها به مبنای شانزدهشانزدهی (hexadecimal) و همچنین با کامپایل کردن با -Wno-xor-used-as-pow برطرف کرد.
- -Wdisabled-optimization
- اگر یک مرحله از بهینهسازیِ (optimization pass) درخواستشده غیرفعال شود، هشدار میدهد. این هشدار عموماً نشاندهندهٔ اشکالی در کد شما نیست؛ بلکه تنها بیانگر این است که بهینهسازهای GCC قادر به پردازش مؤثر کد نیستند. اغلب، مشکل از آنجا ناشی میشود که کد بیش از حد بزرگ یا بیش از حد پیچیده است؛ GCC زمانی که احتمال رود خود فرآیند بهینهسازی بیش از اندازه زمانبر شود، از بهینهسازی برنامهها خودداری میکند.
- -Wpointer-sign (تنها در C و Objective-C)
- هنگام
ارسال
آرگومان
اشارهگر
یا انتساب
اشارهگر
با
علامتداری
(signedness) متفاوت،
هشدار
میدهد. این
گزینه تنها
در C و Objective-C
پشتیبانی
میشود. این
هشدار به
صورت ضمنی
توسط -Wall و -Wpedantic
فعال
میشود و با
-Wno-pointer-sign قابل
غیرفعالسازی
است.
این هشدار توسط -pedantic-errors به یک خطا تبدیل میشود.
- -Wstack-protector
- این گزینه تنها زمانی مؤثر است که -fstack-protector فعال باشد. این گزینه دربارهٔ توابعی که در برابر تخریب پشته (stack smashing) محافظت نشدهاند هشدار میدهد.
- -Woverlength-strings
- دربارهٔ
ثابتهای
رشتهای که
طولی بیش از
«حداقل
حداکثر» (minimum maximum)
طول
مشخصشده
در
استاندارد C
دارند
هشدار
میدهد.
کامپایلرهای
امروزی
معمولاً
اجازه
میدهند
ثابتهای
رشتهای
بسیار
طولانیتر
از حداقل حد
استاندارد
باشند، اما
برنامههایی
با قابلیت
حمل بالا
باید از به
کار بردن
رشتههای
طولانیتر
خودداری
کنند.
این محدودیت پس از الحاق ثابتهای رشتهای اعمال میشود و نویسهٔ انتهایی NUL را به حساب نمیآورد. در C90، این محدودیت ۵۰۹ نویسه بود؛ در C99، به ۴۰۹۵ نویسه افزایش یافت. استاندارد C++98 حداقلِ حداکثرِ الزامآوری را تعیین نکرده است، بنابراین رشتههای بیش از حد مجاز در C++ گزارش نمیشوند.
این گزینه به صورت ضمنی توسط -Wpedantic فعال میشود، و با -Wno-overlength-strings میتوان آن را غیرفعال کرد.
- -Wunsuffixed-float-constants (تنها در C و Objective-C)
- برای هر ثابت ممیز شناوری که پسوند نداشته باشد هشدار صادر میکند. هنگامی که همراه با -Wsystem-headers استفاده شود، دربارهٔ چنین ثابتهایی در فایلهای سرایند سیستمی نیز هشدار میدهد. این گزینه هنگام آمادهسازی کد برای استفاده با عملگر هدایتی (pragma) "FLOAT_CONST_DECIMAL64" برگرفته از افزونهٔ ممیز شناور دهدهی برای C99، میتواند سودمند باشد.
- -Wno-lto-type-mismatch
- در طول بهینهسازی زمان پیوند (LTO)، دربارهٔ عدم تطابق نوع در اعلانهای سراسری مربوط به واحدهای کامپایل متفاوت هشدار نمیدهد. نیازمند فعال بودن -flto است. این گزینه به طور پیشفرض فعال است.
- -Wno-designated-init (تنها در C و Objective-C)
- هنگامی که از یک مقداردهندهٔ اولیهساز ترتیبی (positional initializer) برای مقداردهی ساختاری که با صفت "designated_init" علامتگذاری شده استفاده شود، هشدارها را سرکوب میکند..SS "گزینههای کنترل تحلیل ایستا (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-throw-of-unexpected-type -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
فعال باشد،
تحلیلگر
از روشهای
اکتشافی
گوناگونی
برای تلاش
در ردیابی
وضعیت
حافظه
استفاده
میکند،
اما کدهای
بیش از حد
پیچیده
میتوانند
مانع از این
کار شوند.
بهطور پیشفرض، اگر مقادیر عبارتها از یک حد درونی فراتر رود، تحلیل بدون اعلام پیام، ردیابی مقادیر آنها را متوقف کرده و به یک بازنمایی نادقیق برای این عبارتها عقبنشینی میکند. گزینه -Wanalyzer-symbol-too-complex در صورت رخ دادن این موضوع هشدار میدهد.
- -Wanalyzer-too-complex
- اگر -fanalyzer
فعال باشد،
تحلیلگر
از روشهای
اکتشافی
گوناگونی
برای بررسی
جریان
کنترل و
جریان داده
در برنامه
استفاده
میکند،
اما کدهای
بیش از حد
پیچیده
میتوانند
این
تلاشها را
خنثی کنند.
بهطور پیشفرض، اگر کد برای کاوش کامل تحلیلگر بیش از حد پیچیده باشد و به یک حد درونی برسد، تحلیل بدون اعلام پیام متوقف میشود. گزینه -Wanalyzer-too-complex در صورت رخ دادن این وضعیت هشدار میدهد.
- -Wno-analyzer-allocation-size
- این هشدار
به -fanalyzer نیاز
دارد که آن
را فعال
میکند؛
برای
غیرفعال
کردن آن، از
-Wno-analyzer-allocation-size
استفاده
کنید.
این پیام تشخیصی درباره مسیرهایی از کد هشدار میدهد که در آنها یک اشارهگر به بافر مقداردهی میشود تا به بافری اشاره کند که اندازه آن مضربی از "sizeof (*pointer)" نیست.
ببینید CWE-131: Incorrect Calculation of Buffer Size ("https://cwe.mitre.org/data/definitions/131.html").
- -Wno-analyzer-deref-before-check
- این هشدار
به -fanalyzer نیاز
دارد که آن
را فعال
میکند؛
برای
غیرفعال
کردن آن از
-Wno-analyzer-deref-before-check
استفاده
کنید.
این پیام تشخیصی برای مسیرهایی از کد هشدار میدهد که در آنها یک اشارهگر *پس از* اینکه پیشتر ارجاعزدایی شده است، برای "NULL" بررسی میشود؛ این امر نشان میدهد که اشارهگر میتوانسته NULL باشد. چنین مواردی بیانگر آن است که بررسی NULL یا زائد است یا باید به قبل از ارجاعزدایی اشارهگر منتقل شود.
این پیام تشخیصی همچنین مقادیر ارسالشده به آرگومان تابعی را که با "__attribute__((nonnull))" نشانهگذاری شده است نیازمند مقداری غیر-NULL در نظر میگیرد، و بنابراین اگر چنین مقادیری پس از بازگشت از فراخوانی تابع برای "NULL" بررسی شوند، هشدار صادر میکند.
بعید است که این پیام تشخیصی هنگام فعال بودن هر سطحی از بهینهسازی گزارش شود، چرا که منطق بهینهسازی GCC معمولاً چنین بررسیهایی برای NULL را زائد تلقی کرده و پیش از آنکه تحلیلگر آنها را ببیند، با بهینهسازی حذفشان میکند. بنابراین هنگام تلاش برای برانگیختن این پیام تشخیصی، بهینهسازی باید غیرفعال باشد.
- -Wno-analyzer-double-fclose
- این هشدار
به -fanalyzer نیاز
دارد که آن
را فعال
میکند؛
برای
غیرفعال
کردن آن از
-Wno-analyzer-double-fclose
استفاده
کنید.
این پیام تشخیصی برای مسیرهایی از کد هشدار میدهد که در آنها روی یک "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) هشدار میدهد - مسیرهایی از کد که در آنها مقادیر مقداردهینشده از یک مرز امنیتی عبور کرده و کپی میشوند (مانند کدی در هسته سیستمعامل که یک struct تا حدی مقداردهیشده در پشته را به فضای کاربری کپی میکند).
ببینید CWE-200: Exposure of Sensitive Information to an Unauthorized Actor ("https://cwe.mitre.org/data/definitions/200.html").
- -Wno-analyzer-fd-access-mode-mismatch
- این هشدار
به -fanalyzer نیاز
دارد که آن
را فعال
میکند؛
برای
غیرفعال
کردن آن از
-Wno-analyzer-fd-access-mode-mismatch
استفاده
کنید.
این پیام تشخیصی برای مسیرهایی در کد هشدار میدهد که در آنها تلاشی برای "read" بر روی یک توصیفگر فایل فقطنوشتنی انجام گرفته است، یا برعکس.
این پیام تشخیصی همچنین برای مسیرهایی از کد هشدار میدهد که در آنها تابعی با صفت "fd_arg_read (N)" با یک توصیفگر فایل بازشده با "O_WRONLY" در آرگومان ارجاعشده "N" فراخوانی شده است، یا تابعی با صفت "fd_arg_write (N)" با یک توصیفگر فایل بازشده با "O_RDONLY" در آرگومان ارجاعشده N فراخوانی شده است.
- -Wno-analyzer-fd-double-close
- این هشدار
به -fanalyzer نیاز
دارد که آن
را فعال
میکند؛
برای
غیرفعال
کردن آن از
-Wno-analyzer-fd-double-close
استفاده
کنید.
این پیام تشخیصی برای مسیرهایی در کد هشدار میدهد که در آنها یک توصیفگر فایل ممکن است بیش از یک بار بسته شود.
ببینید CWE-1341: Multiple Releases of Same Resource or Handle ("https://cwe.mitre.org/data/definitions/1341.html")..IP -Wno-analyzer-fd-leak 4 این هشدار نیازمند -fanalyzer است که آن را فعال میکند؛ برای غیرفعالکردن آن از -Wno-analyzer-fd-leak استفاده کنید.
این هشدار تشخیصی درباره مسیرهایی در کد هشدار میدهد که در آنها یک توصیفگر فایل (file descriptor) باز نشت پیدا میکند.
ببینید: CWE-775: Missing Release of File Descriptor or Handle after Effective Lifetime ("https://cwe.mitre.org/data/definitions/775.html").
- -Wno-analyzer-fd-phase-mismatch
- این هشدار
نیازمند -fanalyzer
است که آن
را فعال
میکند؛
برای
غیرفعالکردن
آن از -Wno-analyzer-fd-phase-mismatch
استفاده
کنید.
این هشدار تشخیصی درباره مسیرهایی در کد هشدار میدهد که در آنها تلاشی برای انجام یک عملیات در فاز نادرستی از چرخه حیات توصیفگر فایل صورت گرفته است. برای مثال، درباره تلاش برای فراخوانی "accept" روی یک سوکت جریانی (stream socket) که هنوز "listen" با موفقیت روی آن فراخوانی نشده است، هشدار خواهد داد.
ببینید: CWE-666: Operation on Resource in Wrong Phase of Lifetime ("https://cwe.mitre.org/data/definitions/666.html").
- -Wno-analyzer-fd-type-mismatch
- این هشدار
نیازمند -fanalyzer
است که آن
را فعال
میکند؛
برای
غیرفعالکردن
آن از -Wno-analyzer-fd-type-mismatch
استفاده
کنید.
این هشدار تشخیصی درباره مسیرهایی در کد هشدار میدهد که در آنها تلاشی برای انجام عملیات روی نوع نادرستی از توصیفگر فایل صورت گرفته است. برای مثال، درباره تلاش برای استفاده از عملیات سوکت روی توصیفگر فایلی که از طریق "open" به دست آمده است، یا تلاش برای استفاده از عملیات سوکت جریانی روی یک سوکت دیتاگرام (datagram socket) هشدار خواهد داد.
- -Wno-analyzer-fd-use-after-close
- این هشدار
نیازمند -fanalyzer
است که آن
را فعال
میکند؛
برای
غیرفعالکردن
آن از -Wno-analyzer-fd-use-after-close
استفاده
کنید.
این هشدار تشخیصی درباره مسیرهایی در کد هشدار میدهد که در آنها خواندن یا نوشتن (read یا write) روی یک توصیفگر فایلِ بستهشده فراخوانی میشود.
این هشدار تشخیصی همچنین درباره مسیرهایی در کد هشدار میدهد که در آنها تابعی با صفت "fd_arg (N)" یا "fd_arg_read (N)" یا "fd_arg_write (N)" با یک توصیفگر فایل بسته در آرگومان ارجاعشدهی "N" فراخوانی شده است.
- -Wno-analyzer-fd-use-without-check
- این هشدار
نیازمند -fanalyzer
است که آن
را فعال
میکند؛
برای
غیرفعالکردن
آن از
-Wno-analyzer-fd-use-without-check
استفاده
کنید.
این هشدار تشخیصی درباره مسیرهایی در کد هشدار میدهد که در آنها یک توصیفگر فایل بدون بررسی معتبر بودنش مورد استفاده قرار گرفته است.
این هشدار تشخیصی همچنین درباره مسیرهایی در کد هشدار میدهد که در آنها تابعی با صفت "fd_arg (N)" یا "fd_arg_read (N)" یا "fd_arg_write (N)" با یک توصیفگر فایل در آرگومان ارجاعشدهی "N" بدون بررسی معتبر بودن فراخوانی شده است.
- -Wno-analyzer-file-leak
- این هشدار
نیازمند -fanalyzer
است که آن
را فعال
میکند؛
برای
غیرفعالکردن
آن از -Wno-analyzer-file-leak
استفاده
کنید.
این هشدار تشخیصی درباره مسیرهایی در کد هشدار میدهد که در آنها یک شیء جریان "FILE *" از "<stdio.h>" نشت پیدا کرده است.
ببینید: CWE-775: Missing Release of File Descriptor or Handle after Effective Lifetime ("https://cwe.mitre.org/data/definitions/775.html").
- -Wno-analyzer-free-of-non-heap
- این هشدار
نیازمند -fanalyzer
است که آن
را فعال
میکند؛
برای
غیرفعالکردن
آن از -Wno-analyzer-free-of-non-heap
استفاده
کنید.
این هشدار تشخیصی درباره مسیرهایی در کد هشدار میدهد که در آنها "free" روی یک اشارهگر خارج از هیپ (non-heap) فراخوانی شده است (مانند بافری روی پشته [stack] یا یک متغیر سراسری [global]).
ببینید: CWE-590: Free of Memory not on the Heap ("https://cwe.mitre.org/data/definitions/590.html").
- -Wno-analyzer-imprecise-fp-arithmetic
- این هشدار
نیازمند -fanalyzer
است که آن
را فعال
میکند؛
برای
غیرفعالکردن
آن از
-Wno-analyzer-imprecise-fp-arithmetic
استفاده
کنید.
این هشدار تشخیصی درباره مسیرهایی در کد هشدار میدهد که در آنها محاسبات ممیز شناور (floating-point) در مکانهایی به کار رفته که نیازمند محاسبات دقیق است. این هشدار تشخیصی در حال حاضر فقط درباره استفاده از عملوندهای ممیز شناور درون محاسبه اندازه تخصیص حافظه هشدار میدهد.
- -Wno-analyzer-infinite-loop
- این هشدار
نیازمند -fanalyzer
است که آن
را فعال
میکند؛
برای
غیرفعالکردن
آن از -Wno-analyzer-infinite-loop
استفاده
کنید.
این هشدار تشخیصی درباره مسیرهایی در کد هشدار میدهد که به نظر میرسد به یک حلقه بینهایت منجر میشوند.
بهطور مشخص، تحلیلگر زمانی این هشدار را صادر میکند که حلقهای را «مشاهده کند» که در آن:
- هیچ کار قابلمشاهدهای از بیرون در داخل حلقه انجام نشود
- هیچ راهی برای گریز از حلقه وجود نداشته باشد
- تحلیلگر در سراسر حلقه اطمینان کافی از وضعیت برنامه داشته باشد تا بداند موارد بالا درست هستند
یکی از راههای صدور این هشدار زمانی است که یک مسیر اجرا از میان یک حلقه وجود داشته باشد که طی کردن آن در یک تکرار (iteration)، مستلزم این است که همان مسیر در تمام تکرارهای بعدی نیز طی شود.
برای مثال، این کد را در نظر بگیرید:
while (1)
{
char opcode = *cpu_state.pc;
switch (opcode)
{
case OPCODE_FOO:
handle_opcode_foo (&cpu_state);
break;
case OPCODE_BAR:
handle_opcode_bar (&cpu_state);
break;
}
}
تحلیلگر برای مورد بالا هشدار خواهد داد، زیرا اگر "opcode" با هیچیک از موارد مطابقت نداشته باشد، "switch" از حالت ضمنی "default" پیروی میکند و باعث میشود بدنه حلقه با تغییر نیافتن "cpu_state.pc" به یک «دستور بیاثر» (no-op) تبدیل شود، و در نتیجه از همان مقدار "opcode" در تمام تکرارهای بعدی استفاده شده و به یک حلقه بینهایت بیانجامد.
ببینید: CWE-835: Loop with Unreachable Exit Condition ('Infinite Loop') ("https://cwe.mitre.org/data/definitions/835.html").
- -Wno-analyzer-infinite-recursion
- این هشدار
نیازمند -fanalyzer
است که آن
را فعال
میکند؛
برای
غیرفعالکردن
آن از -Wno-analyzer-infinite-recursion
استفاده
کنید.
این هشدار تشخیصی درباره مسیرهایی در کد هشدار میدهد که به نظر میرسد به بازگشت بینهایت منجر میشوند.
بهطور مشخص، هنگامی که تحلیلگر یک فراخوانی بازگشتی را «میبیند»، وضعیت حافظه در بدو ورود به چارچوب (frame) جدید را با وضعیت ورود به چارچوب قبلی آن تابع روی پشته مقایسه میکند. این هشدار زمانی صادر میشود که به نظر برسد هیچ چیزی در حافظه تغییر نمیکند؛ فرض میشود هرگونه تغییرِ مشاهدهشده در پارامترها یا متغیرهای سراسری، به پایان یافتن بازگشت میانجامد و بنابراین از صدور هشدار جلوگیری میکند.
این هشدار تشخیصی به احتمال زیاد مواردی از بازگشت بینهایت را که پیش از «دیدهشدن» توسط تحلیلگر توسط بهینهساز به تکرار (iteration) تبدیل شدهاند نادیده میگیرد. بنابراین هنگام تلاش برای برانگیختن این هشدار تشخیصی، بهینهسازی باید غیرفعال باشد.
با -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" فراخوانی شده است.
- -Wno-analyzer-malloc-leak
- این هشدار
نیازمند -fanalyzer
است که آن
را فعال
میکند؛
برای
غیرفعالکردن
آن از -Wno-analyzer-malloc-leak
استفاده
کنید.
این هشدار تشخیصی درباره مسیرهایی در کد هشدار میدهد که در آنها یک اشارهگرِ تخصیصیافته از طریق یک تخصیصدهنده نشت پیدا میکند: چه "malloc"، و چه تابعی که با صفت "malloc" نشانهگذاری شده باشد.
ببینید: CWE-401: Missing Release of Memory after Effective Lifetime ("https://cwe.mitre.org/data/definitions/401.html")..IP -Wno-analyzer-mismatching-deallocation 4 این هشدار نیازمند -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 بودن ارجاعزدایی میشود.
ببینید: CWE-690: Unchecked Return Value to NULL Pointer Dereference ("https://cwe.mitre.org/data/definitions/690.html").
- -Wno-analyzer-null-argument
- این هشدار
نیازمند -fanalyzer
است که آن
را فعال
میکند؛
برای
غیرفعال
کردن آن از
-Wno-analyzer-null-argument
استفاده
کنید.
این پیام تشخیصی درباره مسیرهایی از کد هشدار میدهد که در آنها مقداری که مشخصاً NULL است به آرگومان تابعی ارسال میشود که با "__attribute__((nonnull))" به عنوان نیازمند مقدار غیر NULL مشخص شده است.
ببینید: CWE-476: NULL Pointer Dereference ("https://cwe.mitre.org/data/definitions/476.html").
- -Wno-analyzer-null-dereference
- این هشدار
نیازمند -fanalyzer
است که آن
را فعال
میکند؛
برای
غیرفعال
کردن آن از
-Wno-analyzer-null-dereference
استفاده
کنید.
این پیام تشخیصی درباره مسیرهایی از کد هشدار میدهد که در آنها از مقداری که مشخصاً NULL است، ارجاعزدایی میشود.
ببینید: CWE-476: NULL Pointer Dereference ("https://cwe.mitre.org/data/definitions/476.html").
- -Wno-analyzer-putenv-of-auto-var
- این هشدار
نیازمند -fanalyzer
است که آن
را فعال
میکند؛
برای
غیرفعال
کردن آن از
-Wno-analyzer-putenv-of-auto-var
استفاده
کنید.
این پیام تشخیصی درباره مسیرهایی از کد هشدار میدهد که در آنها به فراخوانی تابع "putenv"، اشارهگری به یک متغیر خودکار (automatic) محلی یا یک بافر روی پشته (on-stack) ارسال میشود.
ببینید: 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) پیادهسازی شده است، نه صرفاً تجزیه درخت نحو. با این وجود، تحلیلگر اولویتی برای شناسایی چنین مسیرهایی قائل نمیشود، بنابراین نتایج منفی کاذب در مقایسه با سایر هشدارها محتملتر هستند.
- -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" برای ثبت موقعیت بازگشت فراخوانی میشود، فریم پشته (stack frame) را ثبت میکند. این فریم پشته با بازگشت تابعی که فراخوانی "setjmp" در آن قرار دارد، نامعتبر میشود. تلاش برای بازگشت به آن از طریق "longjmp" به یک فریم پشته ارجاع میدهد که دیگر وجود ندارد و احتمالاً منجر به فروپاشی برنامه (crash) یا وضعیتی بدتر خواهد شد.
- -Wno-analyzer-tainted-allocation-size
- این هشدار
نیازمند -fanalyzer
است که آن
را فعال
میکند؛
برای
غیرفعال
کردن آن از
-Wno-analyzer-tainted-allocation-size
استفاده
کنید.
این پیام تشخیصی درباره مسیرهایی از کد هشدار میدهد که در آنها مقداری که میتواند تحت کنترل مهاجم باشد، بدون پاکسازی و اعتبارسنجی به عنوان اندازه یک تخصیص حافظه استفاده شده است، به طوری که یک مهاجم میتواند تخصیص بسیار بزرگی را تزریق کرده و بهطور بالقوه باعث حمله منع خدمت (denial of service) شود.
ببینید: 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);
در چنین مواردی:
- *
- هنگامی که بررسی اعتبارسنجی غیرفعال است، مانند تعریف "NDEBUG"، مهاجم میتواند دادههایی را تزریق کند که فرآیند را منحرف یا تخریب کند، زیرا احتمالاً پیششرطی را که توسط کد فرض شده است نقض میکند.
توجه داشته باشید که وقتی بررسی اعتبارسنجی غیرفعال است، assertionها معمولاً پیش از آنکه تحلیلگر فرصت «دیدن» آنها را داشته باشد توسط پیشپردازنده حذف میشوند، بنابراین این تشخیص تنها میتواند روی ساختهایی هشدار تولید کند که بررسی اعتبارسنجی در آنها فعال است.
برای اهداف این هشدار، هر تابعی که با صفت "noreturn" مشخص شده باشد به عنوان یک رسیدگیکنندهٔ احتمالی شکست اعتبارسنجی در نظر گرفته میشود، از جمله "__builtin_unreachable". توجه داشته باشید که این توابع گاهی پیش از آنکه تحلیلگر آنها را «ببیند»، توسط بهینهساز حذف میشوند. از این رو هنگام تلاش برای برانگیختن این پیام تشخیصی، بهینهسازی باید غیرفعال شود.
ببینید: CWE-617: Reachable Assertion ("https://cwe.mitre.org/data/definitions/617.html").
این هشدار همچنین میتواند ساختارهای مشکلسازی مانند مورد زیر را گزارش دهد:
switch (some_tainted_value) {
case 0:
/* [...etc; various valid cases omitted...] */
break;
default:
__builtin_unreachable (); /* BUG: attacker can trigger this */
}
اگرچه قطعهکد بالا، به بیان دقیق، یک شکست اعتبارسنجی محسوب نمیشود.
- -Wno-analyzer-tainted-array-index
- این هشدار
نیازمند -fanalyzer
است که آن
را فعال
میکند؛
برای
غیرفعال
کردن آن از
-Wno-analyzer-tainted-array-index
استفاده
کنید.
این پیام تشخیصی دربارهٔ مسیرهایی در طول کد هشدار میدهد که در آنها مقداری که میتواند تحت کنترل یک مهاجم باشد، بدون پالایش (sanitization) به عنوان نمایهٔ دسترسی به یک آرایه استفاده شده است، به طوری که مهاجم میتواند یک دسترسی خارج از محدوده (out-of-bounds) تزریق کند.
ببینید: CWE-129: Improper Validation of Array Index ("https://cwe.mitre.org/data/definitions/129.html").
- -Wno-analyzer-tainted-divisor
- این هشدار
نیازمند -fanalyzer
است که آن
را فعال
میکند؛
برای
غیرفعال
کردن آن از
-Wno-analyzer-tainted-divisor
استفاده
کنید.
این پیام تشخیصی دربارهٔ مسیرهایی در طول کد هشدار میدهد که در آنها مقداری که میتواند تحت کنترل مهاجم باشد، بدون پالایش به عنوان مقسومعلیه در یک عملیات تقسیم یا باقیمانده استفاده شده است، به طوری که مهاجم میتواند یک تقسیم بر صفر تزریق کند.
ببینید: CWE-369: Divide By Zero ("https://cwe.mitre.org/data/definitions/369.html").
- -Wno-analyzer-tainted-offset
- این هشدار
نیازمند -fanalyzer
است که آن
را فعال
میکند؛
برای
غیرفعال
کردن آن از
-Wno-analyzer-tainted-offset
استفاده
کنید.
این پیام تشخیصی دربارهٔ مسیرهایی در طول کد هشدار میدهد که در آنها مقداری که میتواند تحت کنترل مهاجم باشد، بدون پالایش به عنوان آفست یک اشارهگر استفاده شده است، به طوری که مهاجم میتواند دسترسی خارج از محدوده تزریق کند.
ببینید: CWE-823: Use of Out-of-range Pointer Offset ("https://cwe.mitre.org/data/definitions/823.html").
- -Wno-analyzer-tainted-size
- این هشدار
نیازمند -fanalyzer
است که آن
را فعال
میکند؛
برای
غیرفعال
کردن آن از
-Wno-analyzer-tainted-size
استفاده
کنید.
این پیام تشخیصی دربارهٔ مسیرهایی در طول کد هشدار میدهد که در آنها مقداری که میتواند تحت کنترل مهاجم باشد، بدون پالایش به عنوان اندازه در عملیاتی نظیر "memset" استفاده شده است، به طوری که مهاجم میتواند دسترسی خارج از محدوده تزریق کند.
ببینید: CWE-129: Improper Validation of Array Index ("https://cwe.mitre.org/data/definitions/129.html").
- -Wno-analyzer-throw-of-unexpected-type
- این هشدار
نیازمند -fanalyzer
است که آن
را فعال
میکند؛
برای
غیرفعال
کردن آن از
-Wno-analyzer-throw-of-unexpected-type
استفاده
کنید.
مشخصات
استثنای
پویا فقط در
C++14 و پیش از آن
در دسترس
هستند.
این پیام تشخیصی دربارهٔ مسیرهایی در طول کد هشدار میدهد که در آنها استثنایی از تابعی با مشخصهٔ استثنای پویا پرتاب میشود، در حالی که آن استثنا با مشخصه مطابقت ندارد.
- -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
استفاده
کنید.
این پیام تشخیصی دربارهٔ مسیرهایی در طول کد هشدار میدهد که در آنها تابعی که مشخصاً ناامن در برابر سیگنال ناهمگام است (نظیر "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
استفاده
کنید.
این پیام تشخیصی دربارهٔ مسیرهایی در طول کد هشدار میدهد که در آنها اشارهگری که به متغیری در یک قاب پشتهٔ منسوخ اشاره دارد، مرجعزدایی میشود.
- -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" جهت دسترسی به مقدار بعدی ارسالشده به یک فراخوانی variadic شناسایی میکند، اما تمام مقادیر موجود در "va_list" قبلاً مصرف شدهاند.
ببینید: CWE-685: Function Call With Incorrect Number of Arguments ("https://cwe.mitre.org/data/definitions/685.html").
- -Wno-analyzer-va-list-leak
- این هشدار
نیازمند -fanalyzer
است که آن
را فعال
میکند؛
برای
غیرفعال
کردن آن از
-Wno-analyzer-va-list-leak
استفاده
کنید.
این پیام تشخیصی دربارهٔ مسیرهای میانروالی در طول کد هشدار میدهد که در آنها تحلیلگر تشخیص میدهد که "va_start" یا "va_copy" روی یک "va_list" فراخوانی شده، بدون اینکه فراخوانی متناظری با "va_end" انجام شود.
- -Wno-analyzer-va-list-use-after-va-end
- این هشدار
نیازمند -fanalyzer
است که آن
را فعال
میکند؛
برای
غیرفعال
کردن آن از
-Wno-analyzer-va-list-use-after-va-end
استفاده
کنید.
این پیام تشخیصی دربارهٔ مسیرهای میانروالی در طول کد هشدار میدهد که در آنها تحلیلگر تلاشی را برای استفاده از یک "va_list" پس از فراخوانی "va_end" روی آن شناسایی میکند. "va_list"..IP -Wno-analyzer-write-to-const 4 این هشدار نیازمند -fanalyzer است که آن را فعال میکند؛ برای غیرفعال کردن آن از -Wno-analyzer-write-to-const استفاده کنید.
این پیام تشخیصی در مورد مسیرهایی در کد هشدار میدهد که در آنها تحلیلگر تلاشی برای نوشتن از طریق یک اشارهگر در یک شیء "const" را شناسایی کند. با این وجود، تحلیلگر اولویت بالایی برای شناسایی چنین مسیرهایی قائل نمیشود، بنابراین احتمال هشدارهای منفی کاذب در مقایسه با سایر هشدارها بیشتر است.
- -Wno-analyzer-write-to-string-literal
- این هشدار
نیازمند -fanalyzer
است که آن
را فعال
میکند؛
برای
غیرفعال
کردن آن از
-Wno-analyzer-write-to-string-literal
استفاده
کنید.
این پیام تشخیصی در مورد مسیرهایی در کد هشدار میدهد که در آنها تحلیلگر تلاشی برای نوشتن از طریق یک اشارهگر در یک رشته لفظی (string literal) را شناسایی کند. با این وجود، تحلیلگر اولویت بالایی برای شناسایی چنین مسیرهایی قائل نمیشود، بنابراین احتمال هشدارهای منفی کاذب در مقایسه با سایر هشدارها بیشتر است.
- -Wno-analyzer-use-of-uninitialized-value
- این هشدار
نیازمند -fanalyzer
است که آن
را فعال
میکند؛
برای
غیرفعال
کردن آن از
-Wno-analyzer-use-of-uninitialized-value
استفاده
کنید.
این پیام تشخیصی در مورد مسیرهایی در کد هشدار میدهد که در آنها از یک مقدار مقداردهینشده استفاده شده است.
ببینید: CWE-457: Use of Uninitialized Variable ("https://cwe.mitre.org/data/definitions/457.html").
تحلیلگر دارای دانشی از پیش تعیینشده درباره رفتار توابع مدیریت حافظه زیر است:
- *<"alloca">
- *<توابع توکار "__builtin_alloc",>
- "__builtin_alloc_with_align", @item "__builtin_calloc", "__builtin_free", "__builtin_malloc", "__builtin_memcpy", "__builtin_memcpy_chk", "__builtin_memset", "__builtin_memset_chk", "__builtin_realloc", "__builtin_stack_restore" و "__builtin_stack_save"
- *<"calloc">
- *<"free">
- *<"malloc">
- *<"memset">
- *<"operator delete">
- *<"operator delete []">
- *<"operator new">
- *<"operator new []">
- *<"realloc">
- *<"strdup">
- *<"strndup">
درباره توابع زیر برای کار با توصیفکنندههای فایل:
- *<"open">
- *<"close">
- *<"creat">
- *<"dup"، "dup2" و "dup3">
- *<"isatty">
- *<"pipe" و "pipe2">
- *<"read">
- *<"write">
- *<"socket"، "bind"، "listen"، "accept" و "connect">
درباره توابع زیر برای کار با جریانهای "<stdio.h>":
- *<توابع توکار "__builtin_fprintf",>
- "__builtin_fprintf_unlocked", "__builtin_fputc", "__builtin_fputc_unlocked", "__builtin_fputs", "__builtin_fputs_unlocked", "__builtin_fwrite", "__builtin_fwrite_unlocked", "__builtin_printf", "__builtin_printf_unlocked", "__builtin_putc", "__builtin_putchar", "__builtin_putchar_unlocked", "__builtin_putc_unlocked", "__builtin_puts", "__builtin_puts_unlocked", "__builtin_vfprintf" و "__builtin_vprintf"
- *<"fopen">
- *<"fclose">
- *<"ferror">
- *<"fgets">
- *<"fgets_unlocked">
- *<"fileno">
- *<"fread">
- *<"getc">
- *<"getchar">
- *<"fprintf">
- *<"printf">
- *<"fwrite">
و درباره توابع زیر:
- *<توابع توکار "__builtin_expect",>
- "__builtin_expect_with_probability", "__builtin_strchr", "__builtin_strcpy", "__builtin_strcpy_chk", "__builtin_strlen", "__builtin_va_copy" و "__builtin_va_start"
- *<افزونههای GNU "error" و "error_at_line">
- *<"getpass">
- *<"longjmp">
- *<"putenv">
- *<"setjmp">
- *<"siglongjmp">
- *<"signal">
- *<"sigsetjmp">
- *<"strcat">
- *<"strchr">
- *<"strlen">
علاوه بر این، توابع گوناگونی با پیشوند "__analyzer_" برای تحلیلگر معنای ویژهای دارند که در راهنمای داخلی GCC (GCC Internals) شرح داده شدهاند. پارامترهای داخلی متعددی که از طریق --param قابل تنظیم هستند، برای کنترل پیمایش به کار میروند؛ این موارد نیز در راهنمای GCC Internals مستند شدهاند.
گزینههای زیر تحلیلگر را کنترل میکنند.
- -fanalyzer-assume-nothrow
- به طور
پیشفرض،
اگر -fexceptions
فعال باشد،
تحلیلگر
فرض میکند
که
فراخوانی
هر تابعی
بدون صفت
"nothrow"
میتواند
یک استثنا
پرتاب کند.
این امر
میتواند
به شناسایی
مسیرهای
اجرایی که
به دلیل دور
زدن کدهای
پاکسازی
توسط
استثناها
دچار نشت
منابع
میشوند
کمک کند،
اما هنگام
استفاده از
سرآیندهایی
که نویسنده
صفت "nothrow"
را در آنها
درج نکرده
است، ممکن
است به
مثبتهای
کاذب منجر
شود.
اگر -fanalyzer-assume-nothrow فعال باشد، تحلیلگر فرض خواهد کرد که توابع خارجی استثنایی پرتاب نمیکنند. این گزینه میتواند برای کاهش «نوفه» تحلیلگر هنگام فعال کردن -fexceptions روی کد C سودمند باشد، اما اگر استثنایی توسط مواردی که کد C فراخوانی میکند برانگیخته شود، ممکن است اشکالات واقعی را پنهان کند.
- -fanalyzer-call-summaries
- تحلیل
بینارویهای
را با
محاسبهٔ
اثر
فراخوانیهای
خاص،
بهجای
پیمایش
تمام
مسیرهای
درون تابع
از محل
فراخوانی
تا هر
بازگشت
ممکن،
سادهسازی
میکند.
در صورت فعال بودن، خلاصههای فراخوانی (call summaries) تنها برای توابعی با بیش از یک محل فراخوانی و با پیچیدگی کافی استفاده میشوند.
- -fanalyzer-checker=name
- تحلیلگر را محدود میکند تا تنها بررسیکنندهٔ (checker) نامبردهشده را اجرا و فعال کند.
- -fanalyzer-debug-text-art-headings
- این گزینه برای توسعهدهندگان تحلیلگر در نظر گرفته شده است. در صورت فعال بودن، تحلیلگر یادداشتهای توضیحی بیشتری به نمودارهای تولیدی خود میافزاید.
- -fno-analyzer-feasibility
- این گزینه
برای
توسعهدهندگان
تحلیلگر
در نظر
گرفته شده
است.
به طور پیشفرض، تحلیلگر بررسی میکند که آیا یک مسیر جریان کنترل امکانپذیر برای هر گزارش تشخیصی وجود دارد یا خیر: بدین معنا که شرایط برقرار، ناسازگار و مانعةالجمع نباشند. گزارشهای تشخیصی که هیچ مسیر امکانپذیری برای آنها یافت نشود، رد میشوند. این پالایش را میتوان با -fno-analyzer-feasibility جهت اشکالزدایی مسائل درون این بخش از کد غیرفعال کرد.
- -fanalyzer-fine-grained
- کاری انجام نمیدهد. برای سازگاری با نسخههای پیشین حفظ شده است.
- -fanalyzer-show-duplicate-count
- این گزینه برای توسعهدهندگان تحلیلگر در نظر گرفته شده است: اگر چند گزارش تشخیصی به عنوان نسخهٔ تکراری یکدیگر شناسایی شوند، هنگام اعلام بهترین گزارش تشخیصی، یادداشتی شامل تعداد گزارشهای تشخیصی دیگری که توسط منطق حذف موارد تکراری کنار گذاشته شدهاند نمایش میدهد.
- -fanalyzer-show-events-in-system-headers
- به طور پیشفرض، تحلیلگر با پنهان کردن رخدادهایی که به طور کامل درون یک سرآیند سیستمی قرار دارند، مسیرهای تشخیصی سادهشدهای صادر میکند. با -fanalyzer-show-events-in-system-headers چنین رخدادهایی دیگر پنهان نخواهند شد.
- -fno-analyzer-simplify-supergraph
- این گزینه
برای
توسعهدهندگان
تحلیلگر
در نظر
گرفته شده
است.
به طور پیشفرض، تحلیلگر پیش از بررسی اَبَرگراف برنامه، سادهسازیهای گوناگونی روی آن انجام میدهد. با -fno-analyzer-simplify-supergraph میتوان جهت اشکالزدایی مسائل مربوط به آن، این سادهسازی را غیرفعال کرد.
- -fno-analyzer-state-merge
- این گزینه
برای
توسعهدهندگان
تحلیلگر
در نظر
گرفته شده
است.
به طور پیشفرض، تحلیلگر هنگام ساختن «گراف بسطیافته» (exploded graph) خود، تلاش میکند با ادغام وضعیتهای به اندازهٔ کافی مشابه در هر نقطه از برنامه، فرایند تحلیل را ساده کند. با -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
- همانند سطح
پیشین، با
این تفاوت
که
رخدادهای
مربوط به
جریان
کنترل را که
در بروز
مشکل نقش
اساسی
دارند
(مانند «طی
شدن مسیر
درست» در یک
عبارت شرطی)
نیز نشان
میدهد.
این سطح پیشفرض است.
- 3
- همانند سطح پیشین، اما تمامی رخدادهای جریان کنترل را نمایش میدهد، نه فقط موارد بااهمیت را.
- 4
- این سطح برای توسعهدهندگان تحلیلگر در نظر گرفته شده است؛ این گزینه رخدادهای گوناگون دیگری را جهت اشکالزدایی تحلیلگر اضافه میکند.
- -fdump-analyzer-stderr
- تخلیهٔ جزئیات داخلی دربارهٔ عملیات تحلیلگر در 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
- ارائهٔ اطلاعات تشخیصی که نشان میدهد گرهها در «exploded graph» در چه موقعیتی نسبت به کد منبع برنامه قرار دارند.
- -fdump-analyzer-exploded-nodes-2
- تخلیهٔ یک نمایش متنی از «exploded graph» در file.eg.txt.
- -fdump-analyzer-exploded-nodes-3
- تخلیهٔ یک نمایش متنی از «exploded graph» در یک فایل تخلیه بهازای هر گره، در 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 مناسب است تخلیه میکند، اما گراف را با اطلاعاتی دربارهٔ اینکه چه حالتی در هر گره پاکسازی (purge) خواهد شد نشانهگذاری مینماید. این گراف در file.state-purge.dot نوشته میشود.
- -fdump-analyzer-supergraph
- تخلیهٔ نمایشهایی از «supergraph» مناسب برای مشاهده با GraphViz در file.supergraph.index.kind.dot. این نمایشها تمام گرافهای جریان کنترل برنامه را در مراحل گوناگون تحلیل نشان میدهند. مجموعهٔ دقیق فایلهای تخلیه و آنچه نمایش میدهند ممکن است تغییر کند.
- -fdump-analyzer-untracked
- صدور هشدارهای سفارشی همراه با جزئیات داخلی که برای توسعهدهندگان تحلیلگر در نظر گرفته شدهاند.
گزینههای اشکالزدایی برنامه شما (Options for Debugging Your Program)
برای اینکه به GCC بگویید اطلاعات اضافی جهت استفادهٔ یک اشکالزدا صادر کند، در تقریباً تمامی موارد فقط کافی است -g را به سایر گزینههای خود بیفزایید. برخی از قالبهای اشکالزدایی میتوانند همزیستی داشته باشند (مانند DWARF همراه با CTF) در صورتی که هر یک از آنها بهطور صریح با افزودن گزینهٔ خط فرمان متناظر به سایر گزینههای شما فعال شده باشد.
کامپایلر GCC به شما امکان میدهد از -g همراه با -O استفاده کنید. میانبرهایی که توسط کد بهینهسازیشده ایجاد میشوند ممکن است گهگاه غافلگیرکننده باشند: ممکن است برخی متغیرهایی که تعریف کردهاید اصلاً وجود نداشته باشند؛ جریان کنترل ممکن است برای لحظاتی به جایی برود که انتظارش را نداشتید؛ ممکن است برخی دستورها اجرا نشوند زیرا نتایج ثابتی را محاسبه میکنند یا مقادیر آنها از قبل در دسترس است؛ ممکن است برخی دستورها به دلیل انتقال به بیرون از حلقهها، در مکانهای متفاوتی اجرا شوند. با وجود این، اشکالزدایی خروجی بهینهسازیشده امکانپذیر است. این امر استفاده از بهینهساز را برای برنامههایی که ممکن است باگ داشته باشند معقول میسازد.
اگر از گزینه بهینهسازی دیگری استفاده نمیکنید، استفاده از -Og همراه با -g را در نظر بگیرید. بدون هیچ گزینهٔ -O، برخی از گذرهای کامپایلر که اطلاعات مفید برای اشکالزدایی را گردآوری میکنند اصلاً اجرا نمیشوند؛ بنابراین -Og ممکن است به تجربهٔ اشکالزدایی بهتری منجر شود.
- -g
- --debug
- تولید
اطلاعات
اشکالزدایی
در قالب
بومی
سیستمعامل
(stabs، COFF، XCOFF یا DWARF).
ابزار GDB
میتواند
با این
اطلاعات
اشکالزدایی
کار کند.
در اکثر سیستمهایی که از قالب stabs استفاده میکنند، گزینهٔ -g استفاده از اطلاعات اشکالزدایی اضافی را فعال میکند که فقط GDB میتواند از آنها استفاده کند؛ این اطلاعات اضافی باعث میشود اشکالزدایی در GDB بهتر کار کند اما احتمالاً باعث فروپاشی (crash) سایر اشکالزداها یا امتناع آنها از خواندن برنامه میشود. اگر میخواهید با اطمینان مشخص کنید که آیا اطلاعات اضافی تولید شوند یا خیر، از -gvms استفاده کنید (پایین را ببینید).
- -ggdb
- تولید اطلاعات اشکالزدایی برای استفاده توسط GDB. این بدان معناست که از گویاترین قالب موجود استفاده شود (DWARF، stabs، یا در صورت عدم پشتیبانی از هیچکدام، قالب بومی سیستم)، شامل افزونههای GDB تا حد امکان.
- -gdwarf
- -gdwarf-version
- تولید
اطلاعات
اشکالزدایی
در قالب DWARF (در
صورت
پشتیبانی).
مقدار version
میتواند 2،
3، 4 یا 5 باشد؛
نسخهٔ
پیشفرض
برای بیشتر
هدفها 5
است (به
استثنای VxWorks،
TPF و Darwin / macOS که
پیشفرض
آنها
نسخهٔ 2
است، و AIX که
پیشفرض آن
نسخهٔ 4 است).
توجه داشته باشید که با DWARF نسخهٔ 2، برخی پورتها به افزونههای غیرمتداخل DWARF 3 در جدولهای بازگردانی پشته (unwind tables) نیاز دارند و همواره از آنها استفاده میکنند.
نسخهٔ 4 ممکن است برای بهرهمندی حداکثری به GDB 7.0 و -fvar-tracking-assignments نیاز داشته باشد. نسخهٔ 5 به GDB 8.0 یا بالاتر نیاز دارد.
کامپایلر GCC دیگر از نسخهٔ 1 DWARF پشتیبانی نمیکند، که تفاوت اساسی با نسخهٔ 2 و بعد از آن دارد. به دلایل تاریخی، برخی دیگر از گزینههای مرتبط با DWARF (مانند -fno-dwarf2-cfi-asm) ارجاع به نسخهٔ 2 DWARF را در نام خود حفظ کردهاند، اما برای همهٔ نسخههای پشتیبانیشدهٔ کنونی DWARF اعمال میشوند.
- -gbtf
- درخواست اطلاعات اشکالزدایی BTF. قالب BTF قالب اشکالزدایی پیشفرض برای هدف eBPF است. در سایر هدفها مانند x86، اطلاعات اشکالزدایی BTF میتواند همراه با اطلاعات اشکالزدایی DWARF تولید شود، به شرط آنکه هر دو قالب اشکالزدایی بهطور صریح از طریق گزینههای خط فرمان مربوطهشان فعال شده باشند.
- -gprune-btf
- -gno-prune-btf
- هرس کردن
اطلاعات BTF
پیش از
صدور. هنگام
هرس کردن،
فقط
اطلاعات
نوع (type information)
برای انواع
استفادهشده
توسط
متغیرهای
سراسری و
توابع با
حوزهٔ فایل
صادر خواهد
شد. در صورت
کامپایل
برای هدف BPF
در حالی که BPF
CO-RE فعال
باشد،
اطلاعات
نوع برای
انواع
استفادهشده
در
بازنشانیهای
BPF CO-RE نیز صادر
خواهد شد.
علاوه بر
این، انواع
struct و union که
صرفاً از
طریق
اشارهگرها
از اعضای
سایر انواع
struct یا union به
آنها
ارجاع داده
شده است،
هرس شده و
با BTF_KIND_FWD
جایگزین
میشوند،
گویی آن
انواع فقط
به صورت
اعلانهای
پیشین (forward declarations)
در ورودی
حضور
داشتهاند.
این گزینه حجم اطلاعات تولیدشدهٔ BTF را بهطور چشمگیری کاهش میدهد، اما با از دست رفتن قابلتوجه جزئیات اطلاعات نوع همراه است. این گزینه عمدتاً هنگام کامپایل برای هدف BPF مفید است تا اندازهٔ آبجکت حاصل به حداقل برسد و اطلاعات BTF که ارتباط مستقیمی با فرایند بارگذاری برنامهٔ BPF ندارند، حذف شوند.
این گزینه هنگام تولید اطلاعات BTF برای هدف BPF بهطور پیشفرض فعال است.
- -gctf
- -gctflevel
- درخواست
اطلاعات
اشکالزدایی
CTF و استفاده
از level برای
تعیین
اینکه چه
مقدار
اطلاعات
اشکالزدایی
CTF باید
تولید شود.
اگر -gctf بدون
مقداری
برای level مشخص
شود، سطح
پیشفرض
اطلاعات
اشکالزدایی
CTF برابر 2 است.
اطلاعات اشکالزدایی CTF میتوانند همراه با اطلاعات اشکالزدایی DWARF تولید شوند، زمانی که هر دو قالب اشکالزدایی بهطور صریح از طریق گزینههای خط فرمان مربوط به خود فعال شده باشند.
سطح 0 هیچ اطلاعات اشکالزدایی CTF تولید نمیکند. بنابراین، -gctf0 اثر -gctf را خنثی میکند.
سطح 1 اطلاعات CTF را صرفاً برای ردیابی بازگشتی (traceback) تولید میکند. این شامل اطلاعات محل فراخوانی (callsite) است، اما شامل اطلاعات نوع نمیشود.
سطح 2 اطلاعات نوع را فقط برای موجودیتها (توابع، اشیاء داده و غیره) در حوزهٔ فایل یا حوزهٔ سراسری تولید میکند..IP -gvms 4 تولید اطلاعات اشکالزدایی در قالب اشکالزدایی Alpha/VMS (در صورت پشتیبانی). این همان قالبی است که توسط DEBUG در سیستمهای Alpha/VMS استفاده میشود.
- -gcodeview
- تولید اطلاعات اشکالزدایی در قالب اشکالزدایی CodeView (در صورت پشتیبانی). این همان قالبی است که توسط Microsoft Visual C++ در Windows استفاده میشود.
- -glevel
- -ggdblevel
- -gvmslevel
- درخواست
اطلاعات
اشکالزدایی
و همچنین
استفاده از
level برای
مشخص کردن
میزان
اطلاعات.
سطح
پیشفرض ۲
است.
سطح ۰ هیچگونه اطلاعات اشکالزدایی تولید نمیکند. بنابراین، -g0 اثر -g را خنثی میکند.
سطح ۱ اطلاعاتی حداقلی تولید میکند، در حدی که برای تهیهٔ backtrace در بخشهایی از برنامه که قصد اشکالزدایی آنها را ندارید کافی باشد. این اطلاعات شامل توضیحات توابع و متغیرهای خارجی و جدولهای شمارهٔ خطوط است، اما اطلاعاتی دربارهٔ متغیرهای محلی در بر ندارد.
سطح ۲ تنظیم معمول برای تولید کد قابل اشکالزدایی است. خروجی اشکالزدایی شامل تمام اطلاعات سطح ۱، بهعلاوه اطلاعات مربوط به متغیرهای محلی و typedefها است تا پیمایش گامبهگام کد و بررسی وضعیت آن امکانپذیر شود. برای کد C++، اطلاعات اضافی نیز برای کمک به اشکالزدایی توابع مربوط به namespace، کلاس و قالبها (templates) صادر میشود.
سطح ۳ شامل اطلاعات اضافی مانند تمام تعاریف ماکروی موجود در برنامه است. برخی از اشکالزداها هنگام استفاده از -g3 از بسط ماکرو پشتیبانی میکنند.
اگر از چندین گزینهٔ -g استفاده کنید، چه با شمارهٔ سطح و چه بدون آن، آخرین گزینه اعمال خواهد شد.
گزینهٔ -gdwarf برای جلوگیری از سردرگمی با -gdwarf-level، سطح اشکالزدایی متصل را نمیپذیرد. بهجای آن از یک گزینهٔ اضافی -glevel برای تغییر سطح اشکالزدایی DWARF استفاده کنید.
- -fno-eliminate-unused-debug-symbols
- بهطور پیشفرض، هیچ اطلاعات اشکالزدایی برای نمادهایی که عملاً استفاده نشدهاند تولید نمیشود. اگر اطلاعات اشکالزدایی را برای همهٔ نمادها میخواهید، از این گزینه استفاده کنید.
- -femit-class-debug-always
- بهجای درج اطلاعات اشکالزدایی یک کلاس C++ تنها در یک فایل شیء، آن را در تمام فایلهای شیء استفادهکننده از کلاس درج میکند. این گزینه تنها باید با اشکالزداهایی استفاده شود که قادر به مدیریت روش معمول 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) فعال باشد.
- -fvar-tracking-uninit
- -fno-var-tracking-uninit
- ردیابی متغیر را انجام داده و متغیرهای مقداردهینشده را نیز در اطلاعات اشکالزدایی علامتگذاری میکند. این پرچم بهطور پیشفرض توسط -fvar-tracking فعال میشود؛ همچنین به معنی فعالسازی -fvar-tracking نیز هست. برای ردیابی متغیر بدون علامتگذاری متغیرهای مقداردهینشده، از -fvar-tracking -fno-var-tracking-uninit استفاده کنید.
- -gsplit-dwarf
- در صورت فعال بودن اطلاعات اشکالزدایی DWARF، تا حد ممکن اطلاعات اشکالزدایی را در یک فایل خروجی مجزا با پسوند .dwo جدا میکند. این گزینه به سیستم ساخت اجازه میدهد از پیوند دادن فایلهای حاوی اطلاعات اشکالزدایی خودداری کند. برای کاربردی بودن، این گزینه نیازمند اشکالزدایی است که توانایی خواندن فایلهای .dwo را داشته باشد.
- -gdwarf32
- -gdwarf64
- در صورت فعال بودن اطلاعات اشکالزدایی DWARF، گزینهٔ -gdwarf32 قالب ۳۲ بیتی DWARF و گزینهٔ -gdwarf64 قالب ۶۴ بیتی DWARF را انتخاب میکند. پیشفرض وابسته به معماری هدف است، هرچند در اکثر اهداف -gdwarf32 است. قالب ۳۲ بیتی DWARF کوچکتر است، اما نمیتواند بیش از ۲ گیبیبایت اطلاعات اشکالزدایی را در هیچیک از بخشهای اطلاعات اشکالزدایی DWARF پشتیبانی کند. قالب ۶۴ بیتی DWARF اطلاعات اشکالزدایی بزرگتری را ممکن میسازد و ممکن است هنوز توسط همهٔ ابزارهای مصرفکننده به خوبی پشتیبانی نشود.
- -gdescribe-dies
- ویژگیهای توصیفی را به برخی از DIEهای DWARF که فاقد ویژگی نام هستند اضافه میکند، مانند متغیرهای ساختگی، ارجاعهای خارجی و DIEهای پارامتر محل فراخوانی.
- -gpubnames
- بخشهای ".debug_pubnames" و ".debug_pubtypes" در DWARF را تولید میکند.
- -ggnu-pubnames
- بخشهای ".debug_pubnames" و ".debug_pubtypes" را در قالبی مناسب برای تبدیل به ایندکس GDB تولید میکند. این گزینه تنها همراه با پیونددهندهای مفید است که بتواند ایندکس GDB نسخهٔ ۷ را تولید کند.
- -gno-pubnames
- بخشهای ".debug_pubnames" و ".debug_pubtypes" در DWARF را تولید نمیکند.
- -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 مشخص شود که اسمبلر از چنین دستورالعملهایی پشتیبانی میکند..IP -gno-as-loc-support 4 اجبار GCC به تولید داخلی جداول شماره خط DWARF2+، در صورتی که قرار باشد جداول شماره خط DWARF2+ تولید شوند.
- -gas-locview-support
- به
کامپایلر
اطلاع
میدهد که
اسمبلر از
تخصیص
"view" و
بررسی
ادعای
بازنشانی
در
دستورالعملهای
".loc"
پشتیبانی
میکند.
این گزینه بهطور پیشفرض فعال است اگر در زمان پیکربندی GCC، مشخص شود که اسمبلر از آنها پشتیبانی میکند.
- -gno-as-locview-support
- مجبور کردن GCC به تخصیص داخلی شمارههای نما (view numbers)، در صورتی که -gvariable-location-views صراحتاً درخواست شده باشد.
- -gcolumn-info
- -gno-column-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
- تلاش برای تعیین نماهای مکانی که میتوان آنها را از فهرستهای نمای مکان حذف کرد. این کار نیازمند برآوردهای بسیار دقیق طول دستورالعملها توسط کامپایلر است، که همیشه ممکن نیست، و ممکن است هنگام استفاده از اسمبلری که از فهرستهای نمای مکان پشتیبانی نمیکند، باعث تولید خاموش فهرستهای نمای نادرست شود. اسمبلر گنو (GAS) هرگونه خطای اینچنینی را به عنوان "view number mismatch" علامتگذاری میکند. این گزینه فقط در پورتهایی فعال است که یک تابع تخمین قابل اعتماد تعریف کرده باشند.
- -ginline-points
- -gno-inline-points
- تولید اطلاعات اشکالزدایی گسترشیافته برای توابع برخط (inlined). نشانگرهای ردیابی نمای مکان در نقاط ورودی برخط درج میشوند تا آدرس و شمارههای نما محاسبه شده و در اطلاعات اشکالزدایی قرار گیرند. این گزینه میتواند مستقل از نماهای مکان فعال شود که در این صورت شمارههای نما درج نخواهند شد، اما تنها همراه با مرزهای دستورات قابل فعالسازی است، و بهطور پیشفرض تنها در صورتی فعال است که نماهای مکان فعال باشند.
- -gz[=type]
- تولید بخشهای اشکالزدایی فشردهشده در قالب DWARF، در صورتی که پشتیبانی شود. اگر type مشخص نشود، نوع پیشفرض به قابلیتهای اسمبلر و پیونددهندهٔ مورداستفاده بستگی دارد. type میتواند یکی از موارد none (بخشهای اشکالزدایی را فشرده نکن)، zlib (استفاده از فشردهسازی zlib در قالب ELF gABI) یا zstd (استفاده از فشردهسازی zstd در قالب 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 info) در DWARF بهصورت بخش ".eh_frame" تولیدشده توسط کامپایلر، بهجای استفاده از دستورالعملهای ".cfi_*" در GAS..IP -fno-eliminate-unused-debug-types 4 در حالت عادی، هنگام تولید خروجی DWARF، کامپایلر GCC از تولید خروجی نمادهای اشکالزدایی برای انواعی که در هیچ کجای فایل منبعِ در حال کامپایل استفاده نشدهاند، خودداری میکند. گاهی اوقات مفید است که GCC اطلاعات اشکالزدایی را برای تمام انواع اعلانشده در یک واحد کامپایل (compilation unit) تولید کند، صرفنظر از اینکه آیا واقعاً در آن واحد کامپایل استفاده شدهاند یا خیر؛ بهعنوان مثال اگر در اشکالزدا بخواهید مقداری را به نوعی که در برنامه استفاده نشده (اما اعلان شده است) تبدیل نوع (cast) کنید. با این حال، در بیشتر مواقع این کار به هدر رفتن مقدار قابل توجهی فضا منجر میشود.
گزینههای کنترل بهینهسازی (Options That Control Optimization)
این گزینهها انواع مختلف بهینهسازیها را کنترل میکنند.
بدون هیچ گزینه بهینهسازی، هدف کامپایلر کاهش هزینه کامپایل و حصول اطمینان از این است که اشکالزدایی نتایج مورد انتظار را حاصل کند. عبارتها مستقل هستند: اگر برنامه را با یک نقطه توقف (breakpoint) بین عبارتها متوقف کنید، میتوانید به هر متغیری مقدار جدیدی اختصاص دهید یا شمارنده برنامه (program counter) را به هر عبارت دیگری در تابع تغییر دهید و دقیقاً همان نتایجی را دریافت کنید که بر اساس کد منبع انتظار دارید.
فعال کردن پرچمهای بهینهسازی باعث میشود کامپایلر تلاش کند تا کارایی و/یا اندازه کد را به بهای افزایش زمان کامپایل و احتمالاً کاهش توانایی اشکالزدایی برنامه بهبود بخشد.
کامپایلر بهینهسازی را بر اساس شناختی که از برنامه دارد انجام میدهد. کامپایل چندین فایل بهطور همزمان در قالب یک فایل خروجی واحد، به کامپایلر این امکان را میدهد که هنگام کامپایل هر یک از آنها، از اطلاعات بهدستآمده از تمامی فایلها بهره ببرد.
همه بهینهسازیها مستقیماً با یک پرچم کنترل نمیشوند. تنها بهینهسازیهایی که پرچمی برای آنها وجود دارد در این بخش فهرست شدهاند.
بیشتر بهینهسازیها در سطح -O0 یا در صورتی که سطحی از -O در خط فرمان مشخص نشده باشد، کاملاً غیرفعال میشوند؛ حتی اگر پرچمهای بهینهسازیِ تکی مشخص شده باشند. به همین ترتیب، -Og نیز جلوی بسیاری از مراحل بهینهسازی را میگیرد.
بسته به معماری مقصد و چگونگی پیکربندی GCC، ممکن است در هر سطح -O مجموعهای کمی متفاوت از بهینهسازیها نسبت به موارد ذکرشده در اینجا فعال شوند. میتوانید GCC را با -Q --help=optimizers فراخوانی کنید تا از مجموعه دقیق بهینهسازیهای فعال در هر سطح مطلع شوید.
- -O
- -O1
- --optimize
- بهینهسازی.
کامپایل
همراه با
بهینهسازی،
زمان تا حدی
بیشتری
برده و برای
یک تابع
بزرگ به
حافظه
بسیار
بیشتری
نیاز دارد.
با -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 -fdep-fusion -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 -fspeculatively-call-stored-functions -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 محاسباتی (computed gotos) استفاده میکنند، توجه داشته باشید.
- -O3
- بهینهسازی
باز هم
بیشتر.
گزینه -O3
تمام
بهینهسازیهای
مشخصشده
توسط -O2 را
روشن کرده و
همچنین
پرچمهای
بهینهسازی
زیر را فعال
میکند:
-fgcse-after-reload -fipa-cp-clone -floop-interchange -floop-unroll-and-jam -fpeel-loops -fpredictive-commoning -fsplit-loops -fsplit-paths -ftree-loop-distribution -ftree-partial-pre -funswitch-loops -fvect-cost-model=dynamic -fversion-loops-for-strides.IP -O0 4 کاهش زمان کامپایل و حصول اطمینان از اینکه اشکالزدایی نتایج مورد انتظار را تولید میکند. این حالت پیشفرض است.
در سطح -O0، کامپایلر GCC بیشتر مراحل بهینهسازی را بهطور کامل غیرفعال میکند؛ این مراحل حتی در صورت فعالسازی صریح در خط فرمان، یا قرار داشتن در فهرست خروجی -Q --help=optimizers بهعنوان گزینههای فعال بهطور پیشفرض، اجرا نمیشوند. بسیاری از بهینهسازیهای انجامشده توسط GCC وابسته به مراحل تحلیل کد یا استانداردسازی هستند که با -O فعال میشوند، و اجرای مراحل بهینهسازی فردی بهصورت مجزا سودمند نخواهد بود.
- -Os
- بهینهسازی
برای حجم. -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 و گزینهٔ ویژهٔ Fortran یعنی -fstack-arrays (مگر در صورت مشخص شدن -fmax-stack-var-size) و -fno-protect-parens را فعال میکند. این گزینه -fsemantic-interposition را غیرفعال میکند.
- -Og
- بهینهسازی
با در نظر
گرفتن
تجربه
اشکالزدایی.
گزینهٔ -Og
باید سطح
بهینهسازی
انتخابی
برای چرخه
استاندارد
ویرایش-کامپایل-اشکالزدایی
باشد، که
ترکیبی
معقول از
بهینهسازی،
کامپایل
سریع و
تجربهٔ
اشکالزدایی
را بهویژه
برای
کدهایی با
جریمهٔ
انتزاع
بالا ارائه
میدهد. در
مقایسه با
-O0، این
گزینه -fvar-tracking-assignments
و -fvar-tracking را
فعال
میکند که
اطلاعات
اشکالزدایی
را در مقدمه
و مؤخره
توابع بهتر
از -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
- اجرای یک
مرحله
انتشار
روبهجلو
بر روی RTL. این
مرحله تلاش
میکند دو
دستورالعمل
را ترکیب
کرده و
بررسی کند
که آیا
نتیجه قابل
سادهسازی
است یا خیر.
اگر باز
کردن حلقه
فعال باشد،
دو مرحله
انجام
میشود و
مرحله دوم
پس از باز
کردن حلقه
زمانبندی
میگردد.
این گزینه بهطور پیشفرض در سطوح بهینهسازی -O1، -O2، -O3 و -Os فعال است.
- -favoid-store-forwarding
- -fno-avoid-store-forwarding
- بسیاری از
پردازندهها
هنگامی که
یک
بارگذاری
تا حدی به
ذخیرهسازیهای
کوچکتر
قبلی
وابسته
باشد، برای
چرخههای
متعددی
متوقف
میشوند.
این مرحله
تلاش
میکند
چنین
مواردی را
شناسایی
کرده و با
تغییر
ترتیب
بارگذاری و
ذخیرهسازی
و سپس اصلاح
مقدار
بارگذاریشده،
از این
جریمه
کارایی
جلوگیری
کند.
بهطور پیشفرض غیرفعال است.
- -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 است.
- -ffp-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
ادغام شده
است) به این
توابع چنین
اجازهای
نمیدهد.
حالت پیشفرض -fno-fp-int-builtin-inexact است که مانع ایجاد استثنا میشود، مگر اینکه C17 یا استانداردی قدیمیتر از C انتخاب شده باشد. این گزینه هیچ اثری ندارد مگر اینکه -ftrapping-math فعال باشد.
حتی اگر از -fno-fp-int-builtin-inexact استفاده شود، اگر این توابع فراخوانی به یک تابع کتابخانهای تولید کنند، در صورتی که پیادهسازی کتابخانه از TS 18661 پیروی نکند، استثنای «inexact» ممکن است ایجاد شود.
- -fomit-frame-pointer
- حذف
اشارهگر
فریم در
توابعی که
به آن نیازی
ندارند. این
کار از
دستورالعملهای
ذخیره،
راهاندازی
و بازیابی
اشارهگر
فریم
جلوگیری
میکند؛ در
بسیاری از
مقاصد،
همچنین یک
ثبات اضافی
را در دسترس
قرار
میدهد.
در برخی از معماریهای مقصد این پرچم تأثیری ندارد زیرا توالی فراخوانی استاندارد همیشه از یک اشارهگر فریم استفاده میکند، بنابراین نمیتوان آن را حذف کرد.
توجه داشته باشید که -fno-omit-frame-pointer تضمین نمیکند که اشارهگر فریم در همه توابع استفاده شود. چندین معماری مقصد همیشه اشارهگر فریم را در توابع برگ حذف میکنند.
بهطور پیشفرض در -O1 و بالاتر فعال است.
- -foptimize-crc
- تشخیص
حلقههای
محاسبهکنندهٔ
CRC
(انجامدهندهٔ
تقسیم
طولانی
چندجملهای)
و جایگزینی
آنها با
پیادهسازی
سریعتر.
تشخیص CRCهای
۸، ۱۶، ۳۲ و
۶۴ بیتی با
یک
چندجملهای
ثابت بدون
بیت ۱
پیشرو،
برای هر دو
حالت بیت
مستقیم و
بیت معکوس.
اگر معماری
مقصد از
دستورالعمل
CRC پشتیبانی
کند و
چندجملهای
استفادهشده
در کد منبع
با
چندجملهای
استفادهشده
در
دستورالعمل
CRC مطابقت
داشته
باشد، آن
دستورالعمل
CRC را تولید
میکند. در
غیر این
صورت، اگر
معماری
مقصد از
دستورالعمل
ضرب بدون
رقم نقلی
پشتیبانی
کند، CRC را با
استفاده از
آن تولید
میکند؛ در
غیر این
صورت، CRC
مبتنی بر
جدول تولید
میکند.
بهطور پیشفرض در -O2 و بالاتر فعال است.
- -foptimize-sibling-calls
- بهینهسازی
فراخوانیهای
همسطح و
بازگشتی
انتهایی.
در سطوح -O2، -O3 و -Os فعال است.
- -foptimize-strlen
- بهینهسازی
توابع
رشتهای
استاندارد C
مختلف
(مانند
"strlen"،
"strchr" یا
"strcpy") و
معادلهای
"_FORTIFY_SOURCE"
آنها به
جایگزینهای
سریعتر.
در سطوح -O2 و -O3 فعال است.
- -finline-atomics
- -fno-inline-atomics
- درونخطسازی عملیات __atomic هنگامی که یک دنبالهٔ دستورالعمل بدون قفل در دسترس باشد. این بهینهسازی بهطور پیشفرض فعال است.
- -finline-stringops[=fn]
- بسط
درونخط
عملیات
حافظه و
رشته (در
حال حاضر،
فقط
"memset")،
حتی زمانی
که طول
متغیر باشد
یا آنقدر
بزرگ باشد
که نیاز به
حلقه داشته
باشد. این
مورد
بیشترین
کاربرد را
همراه با
-ffreestanding و -fno-builtin
دارد.
در برخی شرایط، این گزینه به کامپایلر اجازه میدهد کدی تولید کند که از تراز و مضربهای طول شناختهشده بهره میبرد، اما حتی در این صورت ممکن است کارایی کمتری نسبت به پیادهسازیهای بهینهشدهٔ زمان اجرا داشته باشد و حجم کد را آنقدر افزایش دهد که حتی یک پیادهسازی مشترک با کارایی کمتر، به دلیل استفاده بهتر از حافظهٔ نهان کد، سریعتر اجرا شود. این گزینه بهطور پیشفرض غیرفعال است..IP -fno-inline 4 هیچ تابعی را بهصورت درونخطی (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 فعال میگردد.
- -finline-functions-called-once
- بررسی تمام
توابع
"static" که
تنها یک بار
فراخوانی
شدهاند
برای
درونخطیسازی
در
فراخوانندهٔ
آنها، حتی
اگر با
"inline"
نشانهگذاری
نشده باشند.
اگر
فراخوانی
به یک تابع
معین ادغام
شود، آن
تابع دیگر
بهطور
مستقل به
عنوان کد
اسمبلی در
خروجی
تولید
نمیشود.
در سطوح -O1، -O2، -O3 و -Os فعال میشود، اما در -Og خیر.
- -fearly-inlining
- درونخطیسازی
زودهنگام
توابع
نشانهگذاریشده
با "always_inline"
و توابعی که
به نظر
میرسد
بدنهٔ
آنها از
بار اضافی
فراخوانی
تابع
کوچکتر
است، پیش از
اجرای
ابزار
دقیقسازی
-fprofile-generate و گذر
واقعی
درونخطیسازی.
انجام این
کار باعث
کاهش
چشمگیر
هزینهٔ
پروفایلسازی
شده و
معمولاً در
برنامههایی
با
زنجیرههای
بزرگ از
توابع
پوششی تو در
تو،
درونخطیسازی
را سریعتر
میکند.
بهطور پیشفرض فعال است.
- -fipa-sra
- انجام
جایگزینی
اسکالر
ساختارها
میانرویهای
(interprocedural scalar replacement of aggregates)،
حذف
پارامترهای
استفادهنشده
و جایگزینی
پارامترهای
ارجاعی با
پارامترهای
مقداری.
در سطوح -O2، -O3 و -Os فعال میشود.
- -finline-limit=n
- بهطور
پیشفرض، GCC
اندازهٔ
توابعی را
که
میتوانند
درونخطی
شوند محدود
میکند. این
پرچم امکان
کنترل کلی
این
محدودیت را
فراهم
میآورد. n
اندازهٔ
توابعی است
که
میتوانند
بر حسب
تعداد
شبهدستورالعملها
درونخطی
شوند.
درونخطیسازی در واقع توسط تعدادی از پارامترهای داخلی کنترل میشود که در راهنمای داخلی GCC (GCC Internals) مستند شدهاند و معمولاً نباید مستقیماً تنظیم شوند.
نکته: ممکن است هیچ مقداری برای -finline-limit وجود نداشته باشد که منجر به رفتار پیشفرض شود.
نکته: شبهدستورالعمل در این زمینهٔ خاص، نمایانگر معیاری انتزاعی از اندازهٔ تابع است. این معیار بههیچوجه بیانگر تعداد دستورالعملهای اسمبلی نیست و از این رو معنای دقیق آن ممکن است از یک نسخه به نسخهٔ دیگر تغییر کند.
- -fno-keep-inline-dllexport
- این یک نسخهٔ دقیقتر از -fkeep-inline-functions است که فقط برای توابعی اعمال میشود که با استفاده از مشخصه یا declspec با مقدار "dllexport" اعلان شدهاند.
- -fkeep-inline-functions
- در C، توابع "static" را که بهصورت "inline" اعلان شدهاند، حتی در صورتی که در تمام فراخوانندههایشان درونخطی شده باشند، در فایل شیء (object file) درج میکند. این گزینه بر توابعی که از پسوند "extern inline" در GNU C90 استفاده میکنند تأثیری ندارد. در ++C، تمام توابع درونخطی را بدون استثنا در فایل شیء درج میکند.
- -fkeep-static-functions
- درج توابع "static" در فایل شیء، حتی اگر تابع هرگز استفاده نشده باشد.
- -fkeep-static-consts
- درج
متغیرهای
اعلانشده
بهصورت
"static const" در
خروجی
هنگامی که
بهینهسازی
غیرفعال
است، حتی
اگر به
متغیرها
ارجاعی
داده نشده
باشد.
کامپایلر GCC این گزینه را بهطور پیشفرض فعال میکند. اگر میخواهید کامپایلر را بدون توجه به فعال بودن یا نبودن بهینهسازی، وادار به بررسی ارجاع داده شدن به متغیر کنید، از گزینهٔ -fno-keep-static-consts استفاده نمایید.
- -fmerge-constants
- تلاش برای
ادغام
مقادیر
ثابت یکسان
(ثوابت
رشتهای و
ثوابت ممیز
شناور) در
میان
واحدهای
کامپایل
مختلف.
این گزینه در صورت پشتیبانی اسمبلر و پیونددهنده (linker)، در کامپایل بهینهسازیشده پیشفرض است. برای جلوگیری از این رفتار از -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
- غیرفعال
کردن گذر
بهینهسازی
که
فرصتهای
استفاده از
دستورالعملهای
«کاهش و
انشعاب» را
روی ثبات
شمارشگر،
به جای
توالی
دستورالعملهایی
که یک ثبات
را کاهش
داده، آن را
با صفر
مقایسه
میکنند و
سپس بر اساس
نتیجه
انشعاب
مییابند،
جستجو
میکند. این
گزینه فقط
در
معماریهایی
که از چنین
دستورالعملهایی
پشتیبانی
میکنند،
شامل x86، PowerPC، IA-64
و S/390 معنا
دارد. توجه
داشته
باشید که
گزینهٔ
-fno-branch-count-reg
دستورالعملهای
کاهش و
انشعاب
تولیدشده
توسط سایر
گذرهای
بهینهسازی
را از جریان
دستورالعملها
حذف
نمیکند.
پیشفرض در -O1 و بالاتر، به جز -Og، گزینهٔ -fbranch-count-reg است.
- -fno-function-cse
- آدرس توابع
را در
ثباتها
قرار ندهد؛
کاری کند که
هر
دستورالعملی
که یک تابع
ثابت را
فراخوانی
میکند،
آدرس تابع
را
بهصراحت
شامل شود.
این گزینه منجر به تولید کدی با کارایی کمتر میشود، اما ممکن است برخی ترفندهای خاص که خروجی اسمبلی را تغییر میدهند، در صورت استفاده نشدن از این گزینه با بهینهسازیهای صورتگرفته دچار اختلال شوند.
پیشفرض -ffunction-cse است.
- -ffuse-ops-with-volatile-access
- اجازه دادن
به
بهینهسازی
محدود
عملیات با
دسترسی
حافظهٔ
فرار (volatile)
زمانی که
انجام این
کار
معناشناسی
توصیفشده
را تغییر
ندهد.
پیشفرض -ffuse-ops-with-volatile-access است.
- -fno-zero-initialized-in-bss
- اگر معماری
مقصد از بخش
BSS پشتیبانی
کند، GCC
بهطور
پیشفرض
متغیرهایی
را که با
صفر
مقداردهی
اولیه
شدهاند در
بخش BSS قرار
میدهد. این
کار
میتواند
فضا را در
کد حاصل
صرفهجویی
کند.
این گزینه این رفتار را غیرفعال میکند زیرا برخی برنامهها صراحتاً به قرار گرفتن متغیرها در بخش data وابسته هستند؛ به عنوان مثال، تا فایل اجرایی حاصل بتواند ابتدای آن بخش را پیدا کرده و/یا بر اساس آن فرضیاتی داشته باشد.
پیشفرض -fzero-initialized-in-bss است، مگر در زبان Ada.
- -fthread-jumps
- انجام
بهینهسازیهایی
که بررسی
میکنند
آیا یک پرش
به مکانی
منشعب
میشود که
مقایسهٔ
دیگری
دربرگرفتهشده
توسط
مقایسهٔ
اول در آن
یافت
میشود یا
خیر. در این
صورت،
انشعاب اول
بسته به
اینکه شرط
درست یا
نادرست
باشد، به
مقصد
انشعاب دوم
یا نقطهای
بلافاصله
پس از آن
تغییر مسیر
مییابد.
در سطوح -O1، -O2، -O3 و -Os فعال میشود..IP -fsplit-wide-types 4 هنگام استفاده از نوع دادهای که چندین ثبات را اشغال میکند، مانند "long long" در سامانههای ۳۲-بیتی، ثباتها را تفکیک کرده و آنها را به طور مستقل تخصیص میدهد. این کار معمولاً برای این نوع دادهها کد بهتری تولید میکند، اما ممکن است اشکالزدایی را دشوارتر سازد.
در سطوح -O1، -O2، -O3 و -Os فعال میشود.
- -fsplit-wide-types-early
- نوعهای
عریض را به
جای مراحل
نهایی، در
مراحل
اولیه به
طور کامل
تفکیک
میکند. این
گزینه تا
زمانی که
-fsplit-wide-types فعال
نباشد، هیچ
اثری ندارد.
این ویژگی در برخی معماریهای مقصد، پیشفرض است.
- -fcse-follow-jumps
- در حذف
زیرعبارتهای
مشترک (CSE)،
دستورهای
پرش را
هنگامی که
مقصد پرش از
هیچ مسیر
دیگری در
دسترس
نباشد،
پیمایش
میکند.
برای
نمونه،
هنگامی که CSE
با دستور
"if"
دارای
عبارت
"else"
مواجه
میشود، در
صورت
نادرست
بودن شرط
بررسیشده،
پرش را
دنبال
میکند.
در سطوح -O2، -O3 و -Os فعال میشود.
- -fcse-skip-blocks
- این گزینه
مشابه -fcse-follow-jumps
است، اما
سبب میشود
CSE پرشهایی
را دنبال
کند که به
طور شرطی از
روی
بلوکها رد
میشوند.
هنگامی که CSE
با یک دستور
سادهٔ
"if" بدون
عبارت else
مواجه شود،
-fcse-skip-blocks باعث
میشود CSE
پرش به بعد
از بدنهٔ
"if" را
دنبال
نماید.
در سطوح -O2، -O3 و -Os فعال میشود.
- -frerun-cse-after-loop
- اجرای
دوبارهٔ
حذف
زیرعبارتهای
مشترک پس از
انجام
بهینهسازیهای
حلقه.
در سطوح -O2، -O3 و -Os فعال میشود.
- -fgcse
- یک گذر حذف
سراسری
زیرعبارتهای
مشترک (GCSE)
انجام
میدهد. این
گذر همچنین
انتشار
سراسری
مقادیر
ثابت و
رونوشتها
را انجام
میدهد.
نکته: هنگام کامپایل برنامهای که از دستورات پرش محاسباتی (computed gotos، یکی از افزونههای GCC) استفاده میکند، در صورت غیرفعال کردن گذر حذف سراسری زیرعبارتهای مشترک با افزودن -fno-gcse به خط فرمان، ممکن است کارایی زمان اجرای بهتری حاصل شود.
در سطوح -O2، -O3 و -Os فعال میشود.
- -fgcse-lm
- هنگامی که
-fgcse-lm فعال
باشد، حذف
سراسری
زیرعبارتهای
مشترک تلاش
میکند
بارگذاریهایی
(loads) را که تنها
توسط
ذخیرهسازیهای
خودشان
باطل
میشوند،
جابهجا
کند. این
کار امکان
میدهد تا
یک حلقه
شامل توالی
بارگذاری/ذخیرهسازی
به یک
بارگذاری
خارج از
حلقه و یک
رونوشت/ذخیرهسازی
درون حلقه
تبدیل شود.
هنگام فعال بودن -fgcse به صورت پیشفرض فعال است.
- -fgcse-sm
- هنگامی که
-fgcse-sm فعال
باشد، یک
گذر انتقال
ذخیرهسازی
(store motion) پس از حذف
سراسری
زیرعبارتهای
مشترک اجرا
میشود. این
گذر تلاش
میکند
ذخیرهسازیها
را به خارج
از حلقهها
منتقل کند.
در صورت
استفاده
همراه با
-fgcse-lm،
حلقههای
حاوی توالی
بارگذاری/ذخیرهسازی
را میتوان
به یک
بارگذاری
پیش از حلقه
و یک
ذخیرهسازی
پس از حلقه
تبدیل کرد.
در هیچ سطح بهینهسازی به طور خودکار فعال نیست.
- -fgcse-las
- هنگامی که
-fgcse-las فعال
باشد، گذر
حذف سراسری
زیرعبارتهای
مشترک،
بارگذاریهای
زائدی را که
پس از
ذخیرهسازی
در همان
مکان حافظه
رخ
میدهند،
حذف میکند
(هم
افزونگیهای
جزئی و هم
کامل).
در هیچ سطح بهینهسازی به طور خودکار فعال نیست.
- -fgcse-after-reload
- هنگامی که
-fgcse-after-reload فعال
باشد، یک
گذر حذف
بارگذاریهای
زائد پس از
مرحلهٔ reload
انجام
میشود. هدف
این گذر،
پاکسازی
سرریزهای
(spilling) زائد به
حافظه است.
توسط -O3، -fprofile-use و -fauto-profile فعال میشود.
- -faggressive-loop-optimizations
- این گزینه به بهینهساز حلقه اعلام میکند که برای به دست آوردن حدود تعداد تکرارهای یک حلقه، از محدودیتهای زبان برنامهنویسی استفاده کند. با این فرض که کد حلقه با رفتارهای تعریفنشده، مانند سرریز اعداد صحیح علامتدار یا دسترسی خارج از محدودهٔ آرایهها مواجه نمیشود. حدود تکرارهای حلقه برای هدایت باز کردن حلقه (loop unrolling)، پوستهکنی حلقه (loop peeling) و بهینهسازیهای آزمون خروج از حلقه به کار میرود. این گزینه به صورت پیشفرض فعال است.
- -funconstrained-commons
- این گزینه به کامپایلر اعلام میکند متغیرهای اعلانشده در بلوکهای مشترک (مانند common در Fortran) ممکن است بعداً با آرایههای دنبالهدار طولانیتر جایگزین شوند. این امر مانع از انجام برخی بهینهسازیهای وابسته به آگاهی از حدود آرایه میشود.
- -fcrossjumping
- تبدیل پرش
متقاطع (cross-jumping)
را انجام
میدهد. این
تبدیل
کدهای
یکسان را
یکپارچه
کرده و
اندازهٔ کد
را کاهش
میدهد.
عملکرد کد
حاصل ممکن
است نسبت به
حالت بدون
پرش متقاطع
بهتر شده یا
تفاوتی
نکند.
در سطوح -O2، -O3 و -Os فعال میشود.
- -fauto-inc-dec
- افزایش یا کاهش آدرسها را با دسترسیهای حافظه ترکیب میکند. این گذر همواره در معماریهایی که فاقد دستورالعملهای سختافزاری پشتیبانیکننده از این قابلیت هستند، نادیده گرفته میشود. در سطوح -O1 و بالاتر روی معماریهای دارای این پشتیبانی به صورت پیشفرض فعال است.
- -fdce
- حذف کد مرده (DCE) را روی RTL انجام میدهد. به طور پیشفرض در سطوح -O1 و بالاتر فعال است.
- -fdse
- حذف ذخیرهسازی مرده (DSE) را روی RTL انجام میدهد. به طور پیشفرض در سطوح -O1 و بالاتر فعال است.
- -fif-conversion
- تلاش
میکند
پرشهای
شرطی را به
معادلهای
بدون
انشعاب
تبدیل
نماید. این
تبدیل شامل
استفاده از
دستورالعملهای
جابهجایی
شرطی، min، max،
تنظیم
پرچمها و
دستورالعملهای
abs به همراه
ترفندهای
محاسباتی
استاندارد
است.
استفاده از
اجرای شرطی
روی
تراشههایی
که از آن
پشتیبانی
میکنند،
توسط
گزینهٔ -fif-conversion2
کنترل
میشود.
در سطوح -O1، -O2، -O3 و -Os فعال میشود، اما با -Og فعال نیست.
- -fif-conversion2
- برای تبدیل
پرشهای
شرطی به
معادلهای
بدون
انشعاب، از
اجرای شرطی
(در صورت در
دسترس بودن
در
پردازنده)
استفاده
میکند.
در سطوح -O1، -O2، -O3 و -Os فعال میشود، اما با -Og فعال نیست.
- -fdeclone-ctor-dtor
- استاندارد
C++ ABI به چندین
نقطهٔ ورود
برای
سازندهها
و
تخریبکنندهها
نیاز دارد:
یکی برای
زیرشیء
پایه، یکی
برای شیء
کامل، و یکی
برای
تخریبکنندهٔ
مجازی که پس
از آن operator delete
را
فراخوانی
میکند.
برای
ساختارهای
وراثتی با
پایههای
مجازی،
حالتهای
پایه و کامل
رونوشت
یکدیگر (clone)
هستند که به
معنای وجود
دو نسخه از
تابع است.
با فعال
کردن این
گزینه،
حالتهای
پایه و کامل
به thunkهایی
تبدیل
میشوند که
یک
پیادهسازی
مشترک را
فراخوانی
میکنند.
توسط -Os فعال میشود.
- -fdelete-null-pointer-checks
- فرض را بر
این
میگذارد
که
برنامهها
نمیتوانند
با اطمینان
اشارهگرهای
خالی (null) را
دیرفرنس
(dereference) کنند، و
هیچ عنصر کد
یا دادهای
در آدرس صفر
قرار ندارد.
این گزینه
بهینهسازیهای
سادهٔ
تجمیع
مقادیر
ثابت را در
همهٔ سطوح
بهینهسازی
فعال
میسازد.
همچنین،
سایر
گذرهای
بهینهسازی
در GCC از این
پرچم برای
کنترل
تحلیلهای
سراسری
جریان داده
بهره
میبرند تا
بررسیهای
بیهوده
برای
اشارهگرهای
null را حذف
کنند؛ این
تحلیلها
بر این
پایهاند
که دسترسی
به آدرس صفر
حافظه
همواره به
یک تله (trap)
منجر
میشود،
بنابراین
چنانچه
اشارهگری
پس از
دیرفرنس
شدن بررسی
شود،
نمیتواند
null باشد.
توجه داشته باشید که در برخی محیطها این فرض صادق نیست. برای برنامههایی که به آن رفتار وابستهاند، از گزینهٔ -fno-delete-null-pointer-checks برای غیرفعال کردن این بهینهسازی استفاده کنید.
این گزینه به صورت پیشفرض در اکثر معماریهای مقصد فعال است. روی AVR و MSP430، این گزینه به طور کامل غیرفعال است.
گذرهایی که از اطلاعات جریان داده استفاده میکنند، به صورت مستقل در سطوح بهینهسازی مختلف فعال میشوند.
- -fdevirtualize
- تلاش میکند فراخوانیهای توابع مجازی را به فراخوانیهای مستقیم تبدیل کند. این عملیات هم درون یک تابع و هم بینتابعی به عنوان بخشی از درونخطسازی غیرمستقیم (-findirect-inlining) و انتشار بینتابعی مقادیر ثابت (-fipa-cp) انجام میشود. در سطوح -O2، -O3 و -Os فعال میشود.
- -fdevirtualize-speculatively
- تلاش میکند فراخوانی توابع مجازی را به فراخوانیهای مستقیم حدسی (speculative) تبدیل کند. بر اساس تحلیل گراف وراثت نوع، برای یک فراخوانی معین، مجموعهای از مقاصد احتمالی مشخص میشود. اگر این مجموعه کوچک باشد (ترجیحاً دارای اندازهٔ ۱)، فراخوانی به یک عبارت شرطی تبدیل میشود که بین فراخوانی مستقیم و غیرمستقیم تصمیم میگیرد. فراخوانیهای حدسی بهینهسازیهای بیشتری مانند درونخطسازی را ممکن میسازند. چنانچه پس از بهینهسازیهای بعدی بدون فایده تشخیص داده شوند، مجدداً به ساختار اصلی خود بازگردانده میشوند.
- -fdevirtualize-at-ltrans
- هنگام
اجرای
بهینهساز
زمان پیوند
در حالت
تبدیلات
محلی،
دادههای
اضافی مورد
نیاز برای
تبدیل
تهاجمی
توابع
مجازی را
ارسال
میکند. این
گزینه
امکان
تبدیل
توابع
مجازی
بیشتری را
فراهم
میسازد،
اما حجم
دادههای
جابهجاشده
را به طور
چشمگیری
افزایش
میدهد. به
همین دلیل
به صورت
پیشفرض
غیرفعال
است..IP -fexpensive-optimizations 4
انجام
تعدادی
بهینهسازی
جزئی که
نسبتاً
پرهزینهاند.
در سطوح -O2، -O3 و -Os فعال میشود.
- -fext-dce
- -fno-ext-dce
- انجام حذف کدهای مرده (dead code elimination) روی بسطهای صفر و علامت، همراه با تحلیل جریان دادهٔ ویژه.
- -free
- تلاش برای
حذف
دستورالعملهای
بسط تکراری.
این گزینه
بهویژه
برای
معماری x86-64
مفید است،
که پس از
نوشتن در
نیمهٔ
پایینی ۳۲
بیتی
ثباتهای
۶۴ بیتی، به
طور ضمنی
آنها را با
صفر بسط
میدهد.
برای Alpha، AArch64، LoongArch، PowerPC، RISC-V، SPARC، h83000 و x86 در سطوح -O2، -O3 و -Os فعال میشود.
- -fno-lifetime-dse
- در ++C مقدار یک شیء تنها تحت تأثیر تغییرات درون طول عمر آن قرار میگیرد: هنگامی که سازنده (constructor) شروع میشود، شیء مقداری نامشخص دارد و هرگونه تغییر در طول عمر شیء، پس از تخریب آن مرده به شمار میرود. به طور معمول، بهینهسازی حذف ذخیرهسازیهای مرده (dead store elimination) از این رفتار بهره میبرد؛ اگر کد شما به ماندگاری دادههای شیء فراتر از طول عمر آن وابسته است، میتوانید از این پرچم برای غیرفعال کردن این بهینهسازی استفاده کنید. برای حفظ ذخیرهسازیها پیش از شروع سازنده (مثلاً به این دلیل که operator new شما حافظهٔ شیء را پاک میکند) و در عین حال مرده تلقی کردن شیء پس از نابودگر (destructor)، میتوانید از -flifetime-dse=1 استفاده کنید. رفتار پیشفرض را میتوان به طور صریح با -flifetime-dse=2 انتخاب کرد. -flifetime-dse=0 معادل با -fno-lifetime-dse است.
- -flive-range-shrinkage
- تلاش برای کاهش فشار ثباتها از طریق جمع کردن بازهٔ حیات ثبات (live range shrinkage). این گزینه برای پردازندههای سریعی که مجموعهثباتهای کوچک یا متوسط دارند مفید است.
- -fira-algorithm=algorithm
- استفاده از الگوریتم رنگآمیزی مشخصشده برای تخصیصدهندهٔ یکپارچهٔ ثبات (IRA). آرگومان algorithm میتواند priority باشد که رنگآمیزی اولویتی Chow's را مشخص میکند، یا CB باشد که رنگآمیزی Chaitin-Briggs را مشخص میکند. رنگآمیزی 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
- غیرفعال کردن اشتراکگذاری خانههای پشته (stack slots) برای ذخیرهٔ ثباتهای سختافزاریِ تغییریافته در فراخوانی که در طول یک فراخوانی معتبر میمانند. هر ثبات سختافزاری یک خانهٔ پشتهٔ جداگانه دریافت میکند و در نتیجه قابهای پشتهٔ توابع بزرگتر میشوند.
- -fno-ira-share-spill-slots
- غیرفعال کردن اشتراکگذاری خانههای پشتهٔ تخصیصیافته به شبهثباتها (pseudo-registers). هر شبهثباتی که ثبات سختافزاری دریافت نکند، یک خانهٔ پشتهٔ جداگانه میگیرد و در نتیجه قابهای پشتهٔ توابع بزرگتر میشوند.
- -flra-remat
- فعالسازی
بازتولید
(rematerialization) حساس به
گراف جریان
کنترل (CFG) در LRA.
بهجای
بارگذاری
مقادیر
شبهثباتهای
سرریزشده
(spilled)، در
صورتی که
مقرونبهصرفه
باشد LRA سعی
میکند
مقادیر را
دوباره
بازتولید
(محاسبهٔ
مجدد) کند.
در سطوح -O2، -O3 و -Os فعال میشود.
- -fdelayed-branch
- در صورت
پشتیبانی
در ماشین
مقصد، تلاش
برای
بازآرایی
دستورالعملها
جهت
بهرهگیری
از
شکافهای
خالی موجود
پس از
دستورالعملهای
انشعاب با
تأخیر (delayed branch).
در سطوح -O1، -O2، -O3 و -Os فعال میشود، اما در -Og فعال نیست.
- -fschedule-insns
- در صورت
پشتیبانی
در ماشین
مقصد، تلاش
برای
بازآرایی
دستورالعملها
جهت حذف
توقفهای
اجرایی
ناشی از در
دسترس
نبودن
دادههای
مورد نیاز.
این کار با
اجازه دادن
به صدور
سایر
دستورالعملها
تا زمان
آماده شدن
نتیجهٔ
دستور
بارگذاری
یا ممیز
شناور، به
ماشینهایی
که
دستورالعملهای
بارگذاری
حافظه یا
ممیز شناور
کُند دارند
کمک میکند.
به طور معمول در سطوح بهینهسازی -O2 و -O3 فعال است. با این حال، بسیاری از مقصدها این رفتار را نادیده میگیرند. به عنوان مثال، در x86 در تمام سطوح غیرفعال است، در حالی که در AArch64 فقط در سطح -O3 فعال میشود.
- -fschedule-insns2
- مشابه با
-fschedule-insns، اما
درخواست یک
مرحلهٔ
اضافی برای
زمانبندی
دستورالعملها
پس از انجام
تخصیص ثبات
را دارد.
این گزینه
بهویژه در
ماشینهایی
با تعداد
نسبتاً کم
ثبات و در
شرایطی که
دستورالعملهای
بارگذاری
حافظه بیش
از یک چرخه
زمان
میبرند،
بسیار مفید
است.
در سطوح -O2، -O3 و -Os فعال میشود.
- -fno-sched-interblock
- غیرفعال کردن زمانبندی دستورالعملها میان بلوکهای پایه، که معمولاً هنگام زمانبندی پیش از تخصیص ثبات، یعنی با -fschedule-insns یا در -O2 و بالاتر فعال است.
- -fno-sched-spec
- غیرفعال کردن جابهجایی حدسی (speculative motion) دستورالعملهای غیربارگذاری، که معمولاً هنگام زمانبندی پیش از تخصیص ثبات، یعنی با -fschedule-insns یا در -O2 و بالاتر فعال است.
- -fsched-pressure
- فعال کردن زمانبندی دستورالعملهای حساس به فشار ثبات پیش از تخصیص ثبات. این گزینه تنها زمانی کاربرد دارد که زمانبندی پیش از تخصیص ثبات فعال باشد، یعنی با -fschedule-insns یا در -O2 و بالاتر. استفاده از این گزینه میتواند با جلوگیری از افزایش فشار ثبات به بیش از تعداد ثباتهای سختافزاری موجود و جلوگیری از سرریزهای بعدی در تخصیص ثبات، کد تولیدشده را بهبود بخشیده و حجم آن را کاهش دهد.
- -fsched-spec-load
- اجازه دادن به جابهجایی حدسی برخی از دستورالعملهای بارگذاری. این گزینه تنها زمانی کاربرد دارد که زمانبندی پیش از تخصیص ثبات فعال باشد، یعنی با -fschedule-insns یا در -O2 و بالاتر.
- -fsched-spec-load-dangerous
- اجازه دادن به جابهجایی حدسی تعداد بیشتری از دستورالعملهای بارگذاری. این گزینه تنها زمانی کاربرد دارد که زمانبندی پیش از تخصیص ثبات فعال باشد، یعنی با -fschedule-insns یا در -O2 و بالاتر.
- -fsched-stalled-insns
- -fsched-stalled-insns=n
- تعیین میکند در طول مرحلهٔ دوم زمانبندی، چه تعداد دستورالعمل (در صورت وجود) میتوانند پیش از موعد از صف دستورالعملهای متوقفشده به فهرست آماده منتقل شوند. -fno-sched-stalled-insns به این معنی است که هیچ دستورالعملی پیش از موعد منتقل نمیشود، و -fsched-stalled-insns=0 یعنی هیچ محدودیتی برای تعداد دستورالعملهای در صف که میتوانند پیش از موعد منتقل شوند وجود ندارد. -fsched-stalled-insns بدون مقدار، معادل با -fsched-stalled-insns=1 است.
- -fsched-stalled-insns-dep
- -fsched-stalled-insns-dep=n
- مشخص میکند که چه تعداد گروه دستورالعمل (چرخه) برای وابستگی به یک دستورالعمل معلق (stalled) که نامزد حذف زودهنگام از صف دستورالعملهای معلق است، بررسی شوند. این گزینه تنها در طول گذر دوم زمانبندی، و تنها در صورتی که -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
پردازنده
را آنقدر
دقیق
مدلسازی
نمیکنند
که از نتایج
غیرقابلاطمینان
این
الگوریتم
جلوگیری
شود.
این گزینه تنها هنگام زمانبندی پس از تخصیص ثبات معنا پیدا میکند، یعنی همراه با -fschedule-insns2 یا در سطح -O2 یا بالاتر.
- -fsched-group-heuristic
- ابتکار گروهی را در زمانبند فعال میکند. این ابتکار به دستورالعملی که به یک گروه زمانبندی تعلق دارد اولویت میدهد. این گزینه بهطور پیشفرض در صورت فعال بودن زمانبندی فعال است، یعنی همراه با -fschedule-insns یا -fschedule-insns2 یا در سطح -O2 یا بالاتر.
- -fsched-critical-path-heuristic
- ابتکار مسیر بحرانی را در زمانبند فعال میکند. این ابتکار به دستورالعملهای روی مسیر بحرانی اولویت میدهد. این گزینه بهطور پیشفرض در صورت فعال بودن زمانبندی فعال است، یعنی همراه با -fschedule-insns یا -fschedule-insns2 یا در سطح -O2 یا بالاتر.
- -fsched-spec-insn-heuristic
- ابتکار دستورالعملهای حدسی را در زمانبند فعال میکند. این ابتکار به دستورالعملهای حدسی با ضعف وابستگی بیشتر اولویت میدهد. این گزینه بهطور پیشفرض در صورت فعال بودن زمانبندی فعال است، یعنی همراه با -fschedule-insns یا -fschedule-insns2 یا در سطح -O2 یا بالاتر.
- -fsched-rank-heuristic
- ابتکار رتبه را در زمانبند فعال میکند. این ابتکار به دستورالعمل متعلق به بلوک پایهای با اندازه یا بسامد بزرگتر اولویت میدهد. این گزینه بهطور پیشفرض در صورت فعال بودن زمانبندی فعال است، یعنی همراه با -fschedule-insns یا -fschedule-insns2 یا در سطح -O2 یا بالاتر.
- -fsched-last-insn-heuristic
- ابتکار آخرین دستورالعمل را در زمانبند فعال میکند. این ابتکار به دستورالعملی که وابستگی کمتری به آخرین دستورالعمل زمانبندیشده دارد اولویت میدهد. این گزینه بهطور پیشفرض در صورت فعال بودن زمانبندی فعال است، یعنی همراه با -fschedule-insns یا -fschedule-insns2 یا در سطح -O2 یا بالاتر.
- -fsched-dep-count-heuristic
- ابتکار تعداد وابستهها را در زمانبند فعال میکند. این ابتکار به دستورالعملی که دستورالعملهای بیشتری به آن وابسته هستند اولویت میدهد. این گزینه بهطور پیشفرض در صورت فعال بودن زمانبندی فعال است، یعنی همراه با -fschedule-insns یا -fschedule-insns2 یا در سطح -O2 یا بالاتر.
- -fspeculatively-call-stored-functions
- تلاش میکند تا در صورتی که تمام ذخیرهسازیهای قابلمشاهده در یک فیلد ساختار تنها یک نامزد واحد را ذخیره کنند، فراخوانیهای غیرمستقیم اشارهگرهای تابع را به اشارهگرهای بارگذاریشده از فیلد ساختار تبدیل کند. هنگام انجام این کار، فراخوانی به یک ساختار شرطی تبدیل میشود که بین فراخوانی مستقیم و فراخوانی غیرمستقیم اصلی تصمیمگیری میکند. این فراخوانیهای حدسی اغلب بهینهسازیهای بیشتری مانند درونخطیسازی (inlining) را ممکن میسازند. اگر پس از بهینهسازیهای بعدی بیفایده به نظر برسند، دوباره به شکل اولیه خود بازگردانده میشوند.
- -freschedule-modulo-scheduled-loops
- زمانبندی پیمانهای (modulo scheduling) پیش از زمانبندی سنتی انجام میشود. اگر حلقهای به صورت پیمانهای زمانبندی شود، گذرهای بعدی زمانبندی ممکن است زمانبندی آن را تغییر دهند. از این گزینه برای کنترل این رفتار استفاده کنید.
- -fselective-scheduling
- دستورالعملها را با استفاده از الگوریتم زمانبندی انتخابی زمانبندی میکند. زمانبندی انتخابی به جای گذر اول زمانبند اجرا میشود.
- -fselective-scheduling2
- دستورالعملها را با استفاده از الگوریتم زمانبندی انتخابی زمانبندی میکند. زمانبندی انتخابی به جای گذر دوم زمانبند اجرا میشود.
- -fsel-sched-pipelining
- خط لوله نرمافزاری را برای درونیترین حلقهها در طول زمانبندی انتخابی فعال میکند. این گزینه هیچ اثری ندارد مگر اینکه یکی از گزینههای -fselective-scheduling یا -fselective-scheduling2 روشن باشد.
- -fsel-sched-pipelining-outer-loops
- هنگام اعمال خط لوله روی حلقهها در طول زمانبندی انتخابی، حلقههای بیرونی را نیز خطلولهبندی میکند. این گزینه هیچ اثری ندارد مگر اینکه -fsel-sched-pipelining روشن باشد.
- -fsemantic-interposition
- برخی از قالبهای فایل شیء، مانند ELF، اجازه حائلگذاری (interposing) نمادها را توسط پیونددهنده پویا میدهند. این بدان معناست که برای نمادهای صادرشده از DSO، کامپایلر نمیتواند با این احتمال که ممکن است تابع یا متغیر مربوطه تغییر کند، انتشار بینرویهای، درونخطیسازی و سایر بهینهسازیها را انجام دهد. اگرچه این ویژگی مفید است (بهعنوان مثال برای بازنویسی توابع تخصیص حافظه توسط پیادهسازیهای اشکالزدایی)، اما از نظر کیفیت کد پرهزینه است. با گزینه -fno-semantic-interposition کامپایلر فرض میکند در صورتی که حائلگذاری برای توابع رخ دهد، تابع بازنویسیکننده دقیقاً همان معناشناسی (و اثرات جانبی) را خواهد داشت. به طور مشابه اگر حائلگذاری برای متغیرها رخ دهد، سازنده (constructor) متغیر یکسان خواهد بود. این پرچم هیچ اثری بر روی توابعی که صراحتاً به صورت inline اعلان شدهاند (که در آنها هیچگاه اجازه داده نمیشود حائلگذاری معناشناسی را تغییر دهد) و بر روی نمادهایی که صراحتاً weak اعلان شدهاند، ندارد.
- -fshrink-wrap
- تولید مقدمه تابع (function prologue) فقط پیش از بخشهایی از تابع که به آن نیاز دارند، به جای قرار دادن آن در ابتدای تابع. این پرچم بهطور پیشفرض در سطح -O و بالاتر فعال است.
- -fshrink-wrap-separate
- بخشهای جداگانه مقدمه (prologue) و مؤخره (epilogue) را به صورت مستقل جمعوجور (shrink-wrap) میکند، به طوری که آن بخشها تنها در صورت نیاز اجرا شوند. این گزینه بهطور پیشفرض روشن است، اما اثری ندارد مگر اینکه -fshrink-wrap نیز روشن باشد و معماری هدف از آن پشتیبانی کند.
- -fcaller-saves
- تخصیص
مقادیر به
ثباتهایی
را که توسط
فراخوانیهای
تابع
بازنویسی (clobber)
میشوند،
با صدور
دستورالعملهای
اضافی برای
ذخیره و
بازیابی
ثباتها در
اطراف این
فراخوانیها
فعال
میکند.
چنین
تخصیصی
تنها در
صورتی
انجام
میشود که
به نظر برسد
به تولید کد
بهتری منجر
خواهد شد.
این گزینه همیشه بهطور پیشفرض در ماشینهای خاصی فعال است؛ معمولاً ماشینهایی که هیچ ثبات حفظشده در فراخوانی (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 و بالاتر فعال است..IP -ftree-phiprop 4 بالابردن بارگذاریها (hoisting of loads) از اشارهگرهای شرطی را روی درختها انجام میدهد. این گذر بهطور پیشفرض در -O1 و بالاتر فعال است.
- -fhoist-adjacent-loads
- اگر بارگذاریها از مکانهای مجاور در همان ساختار باشند و معماری مقصد دارای دستورالعمل جابهجایی شرطی باشد، بارگذاریها را بهطور گمانهزنانه از هر دو شاخه یک if-then-else به بالا منتقل میکند. این پرچم بهطور پیشفرض در -O2 و بالاتر فعال است.
- -ftree-copy-prop
- انتشار رونوشت (copy propagation) را روی درختها انجام میدهد. این گذر عملیات رونوشت غیرضروری را حذف میکند. این پرچم بهطور پیشفرض در -O1 و بالاتر فعال است.
- -fipa-pure-const
- تشخیص میدهد که کدام توابع محض (pure) یا ثابت (constant) هستند. بهطور پیشفرض در -O1 و بالاتر فعال است.
- -fipa-reference
- تشخیص میدهد که کدام متغیرهای ایستا از واحد کامپایل (compilation unit) خارج نمیشوند. بهطور پیشفرض در -O1 و بالاتر فعال است.
- -fipa-reference-addressable
- متغیرهای ایستای فقطخواندنی، فقطنوشتنی و غیرقابلآدرسدهی را تشخیص میدهد. بهطور پیشفرض در -O1 و بالاتر فعال است.
- -fipa-reorder-for-locality
- زنجیرههای فراخوانی را در چیدمان باینری نزدیک به یکدیگر گروهبندی میکند تا محلیبودن کد بهبود یافته و فواصل پرش بین توابعی که مکرراً فراخوانی میشوند به حداقل برسد. برخلاف -freorder-functions، این گذر زنجیرههای فراخوانی بین توابع را در نظر گرفته و آنها را با یکدیگر گروهبندی میکند، بهجای اینکه تمام توابع داغ/عادی/سرد/هرگز اجرا نشده را در بخشهای جداگانه دستهبندی کند. برخلاف -fprofile-reorder-functions، هدف آن بهبود محلیبودن کد در سرتاسر زمان اجرای برنامه است، نه تمرکز صرف بر راهاندازی برنامه. این گزینه با گزینه صریح -flto-partition= ناسازگار است چرا که یک طرح پارتیشنبندی سفارشی را تحمیل میکند. در صورت استفاده از این گزینه، توصیه میشود از بازخورد پروفایل (profile feedback) نیز استفاده شود، اما در غیر این صورت این گزینه بهطور پیشفرض فعال نیست.
- -fipa-stack-alignment
- تراز پشته را در صورت امکان در نقاط فراخوانی کاهش میدهد. بهطور پیشفرض فعال است.
- -fipa-pta
- تحلیل اشارهگر بینروالی و تحلیل ارجاع و تغییر بینروالی را انجام میدهد. این گزینه میتواند در واحدهای کامپایل بزرگ باعث مصرف بیش از حد حافظه و زمان کامپایل شود. این گزینه بهطور پیشفرض در هیچ سطح بهینهسازی فعال نیست.
- -fipa-profile
- انتشار پروفایل بینروالی را انجام میدهد. توابعی که فقط از توابع سرد (cold) فراخوانی میشوند به عنوان سرد علامتگذاری میشوند. همچنین توابعی که فقط یک بار اجرا میشوند (مانند "cold"، "noreturn"، سازندهها یا نابودکنندههای ایستا) شناسایی میشوند. سپس توابع سرد و بخشهای بدون حلقه از توابعی که یک بار اجرا میشوند، برای اندازه بهینهسازی میشوند. بهطور پیشفرض در -O1 و بالاتر فعال است.
- -fipa-modref
- تحلیل بینروالی تغییر/ارجاع (mod/ref) را انجام میدهد. این بهینهسازی اثرات جانبی توابع (مکانهای حافظهای که تغییر مییابند یا به آنها ارجاع داده میشود) را تحلیل کرده و بهینهسازی بهتری را در مرزهای فراخوانی تابع ممکن میسازد. این پرچم بهطور پیشفرض در -O1 و بالاتر فعال است.
- -fipa-cp
- انتشار ثابت بینروالی (interprocedural constant propagation) را انجام میدهد. این بهینهسازی برنامه را تحلیل میکند تا مشخص کند چه زمانی مقادیر ارسالشده به توابع ثابت هستند و سپس بر این اساس بهینهسازی میکند. اگر برنامه مقادیر ثابتی داشته باشد که به توابع ارسال میشوند، این بهینهسازی میتواند کارایی را به میزان قابلتوجهی افزایش دهد. این پرچم بهطور پیشفرض در -O2، -Os و -O3 فعال است. همچنین توسط -fprofile-use و -fauto-profile فعال میشود.
- -fipa-cp-clone
- همتاسازی تابع (function cloning) را انجام میدهد تا انتشار ثابت بینروالی قویتر شود. هنگامی که فعال باشد، در صورتی که یک تابع با دید بیرونی بتواند با آرگومانهای ثابت فراخوانی شود، انتشار ثابت بینروالی اقدام به همتاسازی تابع میکند. از آنجا که این بهینهسازی میتواند چندین رونوشت از توابع ایجاد کند، ممکن است اندازه کد را به میزان قابلتوجهی افزایش دهد. این پرچم بهطور پیشفرض در -O3 فعال است. همچنین توسط -fprofile-use و -fauto-profile فعال میشود.
- -fipa-bit-cp
- در صورت فعال بودن، انتشار ثابت بیتی بینروالی را انجام میدهد. این پرچم بهطور پیشفرض در -O2 و توسط -fprofile-use و -fauto-profile فعال میشود. این پرچم نیازمند فعال بودن -fipa-cp است.
- -fipa-vrp
- در صورت فعال بودن، انتشار بینروالی محدودههای مقدار را انجام میدهد. این پرچم بهطور پیشفرض در -O2 فعال است. این پرچم نیازمند فعال بودن -fipa-cp است.
- -fipa-icf-functions
- -fipa-icf-variables
- -fipa-icf
- تاکردن
کدهای
یکسان (ICF) را
برای توابع
(-fipa-icf-functions)،
متغیرهای
فقطخواندنی
(-fipa-icf-variables) یا هر
دو (-fipa-icf)
انجام
میدهد. این
بهینهسازی
اندازه کد
را کاهش
میدهد و
ممکن است با
جایگزین
کردن یک
تابع با
تابعی
معادل با
نامی دیگر،
پشتههای
بازگشایی (unwind
stacks) را دچار
اختلال کند.
این
بهینهسازی
با فعال
بودن
بهینهسازی
زمان پیوند
(LTO) اثرگذاری
بیشتری
دارد.
اگرچه رفتار آن مشابه بهینهسازی ICF در پیونددهنده Gold است، اما ICF در GCC در سطوح متفاوتی عمل میکند و بنابراین بهینهسازیها یکسان نیستند - همارزیهایی وجود دارند که فقط توسط GCC یافت میشوند و همارزیهایی که فقط توسط Gold پیدا میشوند.
-fipa-icf بهطور پیشفرض در -O2 و -Os فعال است.
- -flate-combine-instructions
- دو گذر
ترکیب
دستورالعمل
را که
نسبتاً در
مراحل
پایانی
فرایند
کامپایل
اجرا
میشوند،
فعال
میکند. یکی
از گذرها
قبل از
تخصیص ثبات
و دیگری پس
از تخصیص
ثبات اجرا
میشود. هدف
اصلی این
گذرها
جایگزینی
تعاریف در
تمام موارد
استفاده
است.
بیشتر معماریهای مقصد این پرچم را بهطور پیشفرض در -O2 و -Os فعال میکنند.
- -flive-patching=level
- بهینهسازیهای
GCC را کنترل
میکند تا
خروجی
مناسبی
برای
وصلهکردن
زنده (live-patching)
تولید شود.
اگر بهینهسازی کامپایلر از بدنه یک تابع یا اطلاعات استخراجشده از بدنه آن برای بهینهسازی/تغییر تابع دیگری استفاده کند، تابع دوم را یک تابع تحتتأثیر (impacted function) از اولی مینامند. اگر تابعی وصله شود، توابع تحتتأثیر آن نیز باید وصله شوند.
توابع تحتتأثیر توسط بهینهسازیهای بینروالی کامپایلر مشخص میشوند. برای مثال، هنگام جایگذاری درونخطی یک تابع در فراخوانندهاش، همتاسازی یک تابع و تغییر فراخواننده آن برای فراخوانی این همتای جدید، یا استخراج اطلاعات محض/ثابت بودن تابع برای بهینهسازی فراخوانندههای مستقیم یا غیرمستقیم آن و غیره، فراخواننده تحتتأثیر قرار میگیرد.
معمولاً هر چه بهینهسازیهای 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
- فقط
درونخطیسازی
توابع
ایستا را
فعال
میکند. در
نتیجه،
هنگام
وصلهکردن
یک تابع
ایستا،
تمام
فراخوانندههای
آن
تحتتأثیر
قرار
میگیرند و
بنابراین
باید آنها
نیز وصله
شوند.
علاوه بر تمام پرچمهایی که -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) پشتیبانی نمیشود. مسیرهایی را شناسایی میکند که به دلیل ارجاعزدایی از یک اشارهگر تهی (با فعال بودن -fdelete-null-pointer-checks) یا تقسیم بر صفر، رفتار نادرست یا تعریفنشده ایجاد میکنند. این مسیرها را از جریان کنترل اصلی جدا کرده و دستور دارای رفتار نادرست یا تعریفنشده را به یک تله (trap) تبدیل میکند. این پرچم بهطور پیشفرض در -O2 و بالاتر فعال است.
- -fisolate-erroneous-paths-attribute
- مسیرهایی را شناسایی میکند که به دلیل استفاده از یک مقدار تهی (null) به روشی که توسط مشخصهٔ "returns_nonnull" یا "nonnull" منع شده است، رفتار نادرست یا تعریفنشده ایجاد میکنند. این مسیرها را از جریان کنترل اصلی جدا کرده و دستور دارای رفتار نادرست یا تعریفنشده را به یک تله (trap) تبدیل میکند. این گزینه در حال حاضر فعال نیست، اما ممکن است در آینده توسط -O2 فعال شود.
- -ftree-sink
- انتقال رو به جلوی ذخیرهسازی (forward store motion) را روی درختها انجام میدهد. این پرچم بهطور پیشفرض در -O1 و بالاتر فعال است.
- -ftree-bit-ccp
- انتشار شرطی خلوت ثابت بیت (sparse conditional bit constant propagation) را روی درختها انجام داده و اطلاعات تراز اشارهگر را انتشار میدهد. این گذرگاه فقط روی متغیرهای محلی اسکالر عمل میکند و بهطور پیشفرض در -O1 و بالاتر، به جز -Og، فعال است. این گزینه نیازمند فعال بودن -ftree-ccp است.
- -ftree-ccp
- انتشار شرطی خلوت ثوابت (CCP) را روی درختها انجام میدهد. این گذرگاه فقط روی متغیرهای محلی اسکالر عمل میکند و بهطور پیشفرض در -O1 و بالاتر فعال است.
- -fssa-backprop
- اطلاعات مربوط به کاربردهای یک مقدار را در طول زنجیرهٔ تعریف به سمت بالا انتشار میدهد تا تعاریف را سادهسازی کند. به عنوان مثال، اگر علامت یک مقدار هرگز اهمیتی نداشته باشد، این گذرگاه عملیات علامت را حذف میکند. این پرچم بهطور پیشفرض در -O1 و بالاتر فعال است.
- -fssa-phiopt
- تطبیق الگو را روی گرههای PHI در SSA برای بهینهسازی کدهای شرطی انجام میدهد. این گذرگاه بهطور پیشفرض در -O1 و بالاتر، به جز -Og، فعال است.
- -ftree-switch-conversion
- تبدیل مقداردهیهای اولیهٔ ساده در یک switch را به مقداردهی اولیه از یک آرایهٔ اسکالر انجام میدهد. این پرچم بهطور پیشفرض در -O2 و بالاتر فعال است.
- -ftree-tail-merge
- دنبالههای کد یکسان را جستجو میکند. پس از یافتن، یکی را با یک پرش به دیگری جایگزین میکند. این بهینهسازی با نامهای ادغام انتها (tail merging) یا پرش متقاطع (cross jumping) شناخته میشود. این پرچم بهطور پیشفرض در -O2 و بالاتر فعال است. زمان کامپایل در این گذرگاه را میتوان با استفاده از پارامتر max-tail-merge-comparisons و پارامتر max-tail-merge-iterations محدود کرد.
- -ftree-cselim
- حذف ذخیرهسازی شرطی (conditional store elimination) را روی درختها انجام میدهد. این پرچم بهطور پیشفرض در -O1 و بالاتر روی مقصدهایی که دارای دستورالعملهای انتقال شرطی هستند، فعال است.
- -ftree-dce
- حذف کدهای مرده (DCE) را روی درختها انجام میدهد. این پرچم بهطور پیشفرض در -O1 و بالاتر فعال است.
- -ftree-builtin-call-dce
- حذف شرطی کدهای مرده (DCE) را برای فراخوانیهای توابع داخلی (built-in) که ممکن است "errno" را تنظیم کنند اما در غیر این صورت فاقد اثرات جانبی هستند، انجام میدهد. این پرچم بهطور پیشفرض در -O2 و بالاتر فعال است، مشروط بر اینکه -Os نیز مشخص نشده باشد.
- -ffinite-loops
- فرض میکند
حلقهای که
دارای خروج
است، در
نهایت از آن
خارج خواهد
شد و تا ابد
تکرار
نخواهد شد.
این به
کامپایلر
اجازه
میدهد تا
حلقههایی
را که در
غیر این
صورت هیچ
اثر جانبی
ندارند حذف
کند و چرخهٔ
بیپایان
احتمالی را
اثر جانبی
در نظر
نگیرد.
این گزینه بهطور پیشفرض در -O2 برای ++C با std=c++11- یا بالاتر فعال است.
- -ftree-dominator-opts
- انواعی از پاکسازیهای سادهٔ اسکالر (انتشار ثابت/رونوشت، حذف افزونگی، انتشار بازه و سادهسازی عبارات) را بر پایهٔ پیمایش درخت تسلط (dominator tree) انجام میدهد. این گزینه همچنین تنیدن پرشها (jump threading، برای کاهش پرشها به پرشهای دیگر) را انجام میدهد. این پرچم بهطور پیشفرض در -O1 و بالاتر فعال است.
- -ftree-dse
- حذف ذخیرهسازیهای مرده (DSE) را روی درختها انجام میدهد. ذخیرهسازی مرده، نوشتن در مکانی از حافظه است که بعداً توسط ذخیرهسازی دیگری بدون هیچ بارگذاری (load) در این بین رونویسی میشود. در این حالت ذخیرهسازی قبلی میتواند حذف شود. این پرچم بهطور پیشفرض در -O1 و بالاتر فعال است.
- -ftree-ch
- رونوشتبرداری از سرایند حلقه (loop header copying) را روی درختها انجام میدهد. این کار سودمند است زیرا اثربخشی بهینهسازیهای انتقال کد را افزایش میدهد. همچنین صرفهجویی در یک پرش را به همراه دارد. این پرچم بهطور پیشفرض در -O1 و بالاتر فعال است. این گزینه برای -Os فعال نیست، زیرا معمولاً اندازهٔ کد را افزایش میدهد.
- -ftree-loop-optimize
- بهینهسازیهای حلقه را روی درختها انجام میدهد. این پرچم بهطور پیشفرض در -O1 و بالاتر فعال است.
- -ftree-loop-linear
- -floop-strip-mine
- -floop-block
- بهینهسازیهای حلقههای تو در تو را انجام میدهد. معادل -floop-nest-optimize است. برای استفاده از این تبدیل کد، GCC باید با --with-isl پیکربندی شده باشد تا زیرساخت تبدیل حلقهٔ Graphite فعال گردد.
- -fgraphite-identity
- تبدیل همانی را برای graphite فعال میکند. برای هر SCoP نمای چندوجهی (polyhedral) تولید شده و دوباره به gimple تبدیل میشود. با استفاده از -fgraphite-identity میتوان هزینهها یا مزایای تبدیل GIMPLE -> GRAPHITE -> GIMPLE را بررسی کرد. همچنین برخی بهینهسازیهای حداقلی مانند تفکیک اندیس و حذف کدهای مرده در حلقهها توسط مولد کد isl انجام میشود.
- -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
- تلاش میکند پرشهای شرطی در درونیترین حلقهها را به معادلهای بدون انشعاب تبدیل کند. هدف، حذف جریان کنترل از درونیترین حلقهها برای بهبود توانایی گذرگاه بردارسازی (vectorization) در مدیریت این حلقهها است. این گزینه در صورت فعال بودن بردارسازی بهطور پیشفرض فعال است.
- -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) را
در
حلقههای
تودرتو
بهبود دهد و
امکان
انجام
بهینهسازیهای
بعدی حلقه،
مانند
برداریسازی
(vectorization) را فراهم
سازد. برای
مثال، حلقه
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) نیز میشود.
- -ftree-loop-ivcanon
- ایجاد یک شمارنده کانونیکال (استاندارد) برای تعداد تکرارها در حلقههایی که تعیین تعداد تکرار در آنها مستلزم تحلیلی پیچیده است. بهینهسازیهای بعدی میتوانند این تعداد را بهسادگی تعیین کنند. بهویژه در ارتباط با باز کردن حلقه (unrolling) مفید است.
- -ftree-scev-cprop
- انجام جایگزینی مقدار نهایی. اگر متغیری در یک حلقه به گونهای تغییر کند که مقدار آن هنگام خروج از حلقه تنها با استفاده از مقدار اولیه آن و تعداد تکرارهای حلقه قابل تعیین باشد، استفادهها از مقدار نهایی با چنین محاسباتی جایگزین میشود، به شرطی که هزینه آن به اندازه کافی کم باشد. این امر وابستگیهای دادهای را کاهش میدهد و ممکن است اجازه سادهسازیهای بیشتری را بدهد. بهطور پیشفرض در -O1 و بالاتر فعال است.
- -fivopts
- انجام بهینهسازیهای متغیر استقرایی (کاهش هزینه محاسباتی [strength reduction]، ادغام متغیر استقرایی و حذف متغیر استقرایی) روی درختها. بهطور پیشفرض در -O1 و بالاتر فعال است.
- -ftree-parallelize-loops
- -ftree-parallelize-loops=n
- موازیسازی
حلقهها،
یعنی تقسیم
فضای تکرار
آنها برای
اجرا در
چندین رشته
(thread). این
بهینهسازی
تنها برای
حلقههایی
ممکن است که
تکرارهای
آنها
مستقل از
یکدیگر
بوده و
ترتیب
اجرای
آنها به
دلخواه
قابل تغییر
باشد. این
بهینهسازی
فقط روی
ماشینهای
چندپردازندهای
و برای
حلقههایی
با بار
پردازشی
سنگین (CPU-intensive)،
به جای
حلقههای
محدودشده
با پهنای
باند
حافظه،
سودمند است.
این گزینه
مستلزم -pthread
است و
بنابراین
فقط روی
مقصدهایی
پشتیبانی
میشود که
از -pthread
پشتیبانی
میکنند.
هنگامی که یک مقدار مثبت n مشخص شود، تعداد رشتهها در زمان کامپایل ثابت شده و پس از کامپایل قابل تغییر نیست. کامپایلر "#pragma omp parallel num_threads(n)" را تولید میکند.
هنگامی که بدون "=n" استفاده شود (یعنی -ftree-parallelize-loops)، تعداد رشتهها در زمان اجرای برنامه از طریق متغیر محیطی OMP_NUM_THREADS تعیین میشود. اگر OMP_NUM_THREADS تنظیم نشده باشد، محیط زمان اجرای OpenMP بهطور خودکار تعداد پردازندههای موجود را تشخیص داده و از آن مقدار استفاده میکند. این ویژگی امکان ایجاد باینریهایی را فراهم میسازد که بدون نیاز به کامپایل مجدد، خود را با پیکربندیهای مختلف سختافزاری وفق میدهند.
- -ftree-pta
- انجام تحلیل اشارهگری (points-to analysis) محلیِ تابع روی درختها. این پرچم بهطور پیشفرض در -O1 و بالاتر، به جز -Og، فعال است.
- -ftree-sra
- انجام جایگزینی اسکالر برای ساختارها (scalar replacement of aggregates). این گذر ارجاعهای به ساختار را با مقادیر اسکالر جایگزین میکند تا از انتقال زودهنگام ساختارها به حافظه جلوگیری کند. این پرچم بهطور پیشفرض در -O1 و بالاتر، به جز -Og، فعال است.
- -fstore-merging
- انجام ادغام ذخیرهسازیهای باریک در آدرسهای متوالی حافظه. این گذر ذخیرهسازیهای متوالی مقادیر فوری (immediate) باریکتر از یک کلمه (word) را در تعداد کمتری از ذخیرهسازیهای عریضتر ادغام میکند تا تعداد دستورالعملها کاهش یابد. این پرچم بهطور پیشفرض در -O2 و بالاتر و همچنین در -Os فعال است.
- -ftree-ter
- انجام جایگزینی عبارات موقت در طول فاز SSA->normal. متغیرهای موقت تکاستفاده/تکتعریف در محل استفادهشان با عبارت تعریفکننده خود جایگزین میشوند. این کار منجر به کد غیر-GIMPLE میشود، اما درختهای بسیار پیچیدهتری را در اختیار بسطدهندهها (expanders) قرار میدهد که به تولید RTL بهتری میانجامد. این پرچم بهطور پیشفرض در -O1 و بالاتر فعال است.
- -ftree-slsr
- انجام کاهش هزینه محاسباتی خطمستقیم (straight-line strength reduction) روی درختها. این گذر عبارات مرتبط شامل ضرب را شناسایی کرده و در صورت امکان آنها را با محاسبات کمهزینهتر جایگزین میکند. این پرچم بهطور پیشفرض در -O1 و بالاتر فعال است.
- -ftree-vectorize
- انجام برداریسازی (vectorization) روی درختها. این پرچم در صورت عدم تعیین صریح، -ftree-loop-vectorize و -ftree-slp-vectorize را فعال میکند.
- -ftree-loop-vectorize
- انجام برداریسازی حلقه روی درختها. این پرچم بهطور پیشفرض در -O2 و توسط -ftree-vectorize، -fprofile-use و -fauto-profile فعال میشود.
- -ftree-slp-vectorize
- انجام برداریسازی بلوک پایه (basic block) روی درختها. این پرچم بهطور پیشفرض در -O2 و توسط -ftree-vectorize، -fprofile-use و -fauto-profile فعال میشود.
- -ftrivial-auto-var-init=choice
- مقداردهی
اولیه
متغیرهای
خودکار (automatic)
یا اشیاء
موقت با یک
الگو یا با
صفر، جهت
افزایش
امنیت و
پیشبینیپذیری
برنامه از
طریق
جلوگیری از
افشا و
استفاده از
حافظه
مقداردهینشده.
GCC همچنان
متغیر
خودکاری را
که
مقداردهی
اولیه صریح
ندارد،
مقداردهینشده
تلقی
میکند؛
گزینههای
-Wuninitialized و
-Wanalyzer-use-of-uninitialized-value
همچنان
پیامهای
هشدار را
درباره
چنین
متغیرهای
خودکار یا
اشیاء
موقتی
گزارش
خواهند داد
و کامپایلر
بهینهسازی
را طوری
انجام
میدهد که
گویی متغیر
مقداردهی
نشده است.
با این
گزینه، GCC
همچنین
هرگونه
فاصله خالی
(padding) در
متغیرهای
خودکار یا
اشیاء
موقتی را که
دارای نوع
ساختار (structure)
یا اجتماع (union)
هستند با
صفر
مقداردهی
اولیه
میکند. با
این حال،
پیادهسازی
فعلی
نمیتواند
متغیرهای
خودکاری را
مقداردهی
کند که
مقداردهی
اولیه
آنها با
دستور
"switch" یا
"goto" دور
زده شده
است. از -Wtrivial-auto-var-init
برای گزارش
تمام چنین
مواردی
استفاده
کنید.
سه مقدار ممکن برای choice عبارتند از:
- uninitialized هیچ متغیر خودکاری را مقداردهی اولیه نمیکند.
- pattern متغیرهای خودکار را با مقادیری مقداردهی اولیه میکند که به احتمال زیاد باگهای منطقی را در ادامه مسیر به خرابی برنامه (crash) تبدیل میکنند، در گزارشهای خرابی (crash dump) بهراحتی قابل تشخیص هستند و مقادیری نیستند که برنامهنویسان بتوانند برای معناشناسی مفید برنامه به آنها تکیه کنند. مقدار فعلی یک الگوی تکرارشونده بایتی با بایت "0xFE" است. مقادیر استفادهشده برای مقداردهی اولیهی الگو ممکن است در آینده تغییر کنند.
- zero متغیرهای خودکار را با صفر مقداردهی اولیه میکند.
مقدار پیشفرض uninitialized است، مگر برای C++26 که در آن حالت، اگر -ftrivial-auto-var-init= اصلاً مشخص نشده باشد، تمام متغیرهای خودکار یا اشیاء موقت با صفر مقداردهی میشوند، اما مقداردهی اولیه بیتهای فاصلهساز (padding bits) با صفر انجام نمیشود.
توجه داشته باشید که مقادیر مقداردهی اولیه، چه zero و چه pattern، به نحوه بازنمایی دادهها (در حافظه یا ثباتهای ماشین) اشاره دارند تا به تفسیر آنها به عنوان مقادیر عددی. این تمایز ممکن است در زبانهایی که از انواع دارای سوگیری (bias) یا ضریبهای ضمنی پشتیبانی میکنند و با افزونههایی نظیر hardbool اهمیت داشته باشد. برای مثال، متغیری که از ۸ بیت برای بازنمایی مقادیر (سوگیریشده) در "range 160..400" استفاده میکند، بسته به choice با الگوهای بیتی 0x00 یا 0xFE مقداردهی اولیه میشود؛ صرفنظر از اینکه آیا این بازنماییها نشاندهنده مقادیری در آن محدوده هستند یا خیر، و حتی اگر باشند، تفسیر مقدار نگهداشتهشده توسط متغیر به سوگیری بستگی خواهد داشت. یک متغیر hardbool که به عنوان مثال از 0x5A و 0xA5 به ترتیب برای "false" و "true" استفاده میکند، با هر کدام از دو choice مقداردهی اولیه ساده دچار تله (trap) خواهد شد؛ یعنی مقداردهی اولیه zero به بازنمایی "false" تبدیل نمیشود، حتی اگر برای یک متغیر "static" از همان نوع چنین شود. این بدان معناست که الگوی مقداردهی اولیه عموماً به نوع متغیر مقداردهیشده وابسته نیست. یک استثنای قابل توجه این است که متغیرهای بولی (نامقاومسازیشده یا non-hardened) که در ثباتها جای میگیرند، حتی در صورت درخواست pattern، با "false" (صفر) مقداردهی میشوند.
میتوانید این رفتار را برای یک متغیر خاص با استفاده از صفت متغیر استاندارد "uninitialized" یا صفت C++26 با عنوان "[[indeterminate]]" کنترل کنید. مدل هزینه استفادهشده برای برداریسازی را تغییر میدهد. آرگومان model باید یکی از مقادیر unlimited، dynamic، cheap یا very-cheap باشد. با مدل unlimited فرض میشود مسیر کد برداریشده سودمند است، در حالی که در مدل dynamic یک بررسی زمان اجرا از مسیر کد برداریشده محافظت میکند تا تنها برای تعداد تکرارهایی فعال شود که احتمالاً سریعتر از اجرای حلقه اسکالر اصلی اجرا خواهند شد. مدل cheap برداریسازی حلقههایی را که انجام آن هزینه بسیار بالایی دارد (برای مثال به دلیل بررسیهای زمان اجرای لازم برای وابستگی داده یا ترازسازی) غیرفعال میکند، اما در غیر این صورت معادل مدل dynamic است. مدل very-cheap برداریسازی حلقهها را در صورتی که هرگونه بررسی زمان اجرا برای وابستگی داده یا ترازسازی نیاز باشد غیرفعال میکند، همچنین برداریسازی حلقههای موخره را غیرفعال میسازد، اما در غیر این صورت معادل مدل cheap است.
مدل هزینه پیشفرض به دیگر گزینههای بهینهسازی بستگی دارد و یا dynamic است یا cheap.
- -fsimd-cost-model=model
- مدل هزینه استفادهشده برای برداریسازی حلقههای نشانهگذاریشده با دستورالعمل simd مربوط به OpenMP را تغییر میدهد. آرگومان model باید یکی از unlimited، dynamic یا cheap باشد. تمامی مقادیر model همان معنای شرحدادهشده در -fvect-cost-model را دارند و بهطور پیشفرض از مدل هزینه تعریفشده با -fvect-cost-model استفاده میشود.
- -ftree-vrp
- انتشار دامنه مقادیر را روی درختها انجام میدهد. این عملیات مشابه گذر انتشار مقادیر ثابت است، اما بهجای مقادیر، دامنهای از مقادیر منتشر میشوند. این کار به بهینهسازها امکان میدهد تا بررسیهای دامنه غیرضروری مانند بررسیهای محدوده آرایه و بررسیهای اشارهگر پوچ را حذف کنند. این گزینه بهطور پیشفرض در -O2 و بالاتر فعال است. حذف بررسی اشارهگر پوچ تنها در صورتی انجام میشود که -fdelete-null-pointer-checks فعال باشد.
- -fsplit-paths
- مسیرهای منتهی به یالهای برگشتی حلقه را تفکیک میکند. این کار میتواند حذف کدهای مرده و حذف زیرعبارتهای مشترک را بهبود بخشد. این گزینه بهطور پیشفرض در -O3 و بالاتر فعال است.
- -fsplit-ivs-in-unroller
- بیان
مقادیر
متغیرهای
استقرایی
را در
تکرارهای
بعدی حلقه
بازشده با
استفاده از
مقدار
موجود در
تکرار اول
فعال
میکند. این
کار
زنجیرههای
طولانی
وابستگی را
میشکند و
بنابراین
کارایی
گذرهای
زمانبندی
را بهبود
میبخشد.
ترکیبی از -fweb و CSE اغلب برای دستیابی به همین اثر کافی است. با این حال، در مواردی که بدنه حلقه پیچیدهتر از یک بلوک پایه منفرد باشد، قابل اعتماد نیست. همچنین در برخی معماریها به دلیل محدودیتهای موجود در گذر CSE اصلاً کار نمیکند.
این بهینهسازی بهطور پیشفرض فعال است.
- -fvariable-expansion-in-unroller
- با این
گزینه،
کامپایلر
هنگام باز
کردن یک
حلقه چندین
نسخه از
برخی
متغیرهای
محلی ایجاد
میکند که
میتواند
به کدی با
کارایی
برتر منجر
شود.
این بهینهسازی بهطور پیشفرض برای اهداف PowerPC فعال است، اما در غیر این صورت بهطور پیشفرض غیرفعال است.
- -fpartial-inlining
- بخشهایی
از توابع را
درونخطی
میکند. این
گزینه تنها
زمانی
اثرگذار
است که خود
درونخطیسازی
توسط
گزینههای
-finline-functions یا -finline-small-functions
روشن شده
باشد.
در سطوح -O2، -O3 و -Os فعال است.
- -fpredictive-commoning
- بهینهسازی
محاسبات
مشترک
پیشبینانه
را انجام
میدهد؛
یعنی
استفاده
مجدد از
محاسباتی
(بهویژه
بارگذاریها
و
ذخیرهسازیهای
حافظه) که
در
تکرارهای
قبلی
حلقهها
انجام شده
است.
این گزینه در سطح -O3 فعال است. همچنین توسط -fprofile-use و -fauto-profile فعال میشود.
- -fprefetch-loop-arrays
- در صورت
پشتیبانی
ماشین
مقصد،
دستورالعملهایی
برای
پیشواکشی
حافظه
تولید
میکند تا
کارایی
حلقههایی
که به
آرایههای
بزرگ
دسترسی
دارند
بهبود یابد.
این گزینه ممکن است کدی بهتر یا بدتر تولید کند؛ نتایج بهشدت به ساختار حلقهها در کد منبع بستگی دارد.
در سطح -Os غیرفعال است.
- -fno-printf-return-value
- ثابتها را
جایگزین
مقدار
بازگشتی
مشخص توابع
خروجی
قالببندیشده
مانند
"sprintf"،
"snprintf"،
"vsprintf" و
"vsnprintf"
نمیکند
(اما نه
"printf" یا
"fprintf"). این
تبدیل به GCC
اجازه
میدهد تا
انشعابها
را بر اساس
مقدار
بازگشتی
شناختهشده
این توابع
فراخوانیشده
با
آرگومانهای
ثابت، یا
آرگومانهایی
که مقادیر
آنها در
محدودهای
مشخص قرار
دارد و
تعیین دقیق
مقدار
بازگشتی را
ممکن
میسازد،
بهینهسازی
یا حتی حذف
کند. برای
مثال،
هنگامی که
-fprintf-return-value فعال
باشد، هم
انشعاب و هم
بدنه دستور
"if" (اما
نه
فراخوانی
"snprint") را
میتوان در
صورتی که
"i" یک
عدد صحیح ۳۲
بیتی یا
کوچکتر
باشد
بهینهسازی
و حذف کرد،
زیرا تضمین
میشود که
مقدار
بازگشتی
حداکثر ۸
است.
char buf[9]; if (snprintf (buf, "%08x", i) >= sizeof buf) ...
گزینه -fprintf-return-value به بهینهسازیهای دیگر وابسته است و بهترین نتایج را با -O2 و بالاتر به دست میدهد. این گزینه در تعامل با گزینههای -Wformat-overflow و -Wformat-truncation کار میکند. گزینه -fprintf-return-value بهطور پیشفرض فعال است.
- -fno-peephole
- -fno-peephole2
- هرگونه
بهینهسازی
روزنهای
وابسته به
ماشین را
غیرفعال
میکند.
تفاوت بین
-fno-peephole و -fno-peephole2 در
نحوه
پیادهسازی
آنها در
کامپایلر
است؛ برخی
اهداف از
یکی
استفاده
میکنند،
برخی از
دیگری، و
تعداد کمی
از هر دو.
گزینه -fpeephole بهطور پیشفرض فعال است. گزینه -fpeephole2 در سطوح -O2، -O3 و -Os فعال است.
- -fno-guess-branch-probability
- احتمالات
انشعاب را
با استفاده
از روشهای
ابتکاری
حدس
نمیزند.
اگر احتمالات انشعاب از طریق بازخورد پروفایلسازی (-fprofile-arcs) ارائه نشده باشد، GCC از روشهای ابتکاری برای حدس زدن آنها استفاده میکند. این روشهای ابتکاری بر پایه گراف جریان کنترل هستند. اگر برخی از احتمالات انشعاب توسط "__builtin_expect" مشخص شده باشند، روشهای ابتکاری برای حدس زدن احتمالات انشعاب برای باقی گراف جریان کنترل، با در نظر گرفتن اطلاعات "__builtin_expect" به کار میروند. تعامل میان روشهای ابتکاری و "__builtin_expect" میتواند پیچیده باشد، و در برخی موارد، ممکن است غیرفعال کردن روشهای ابتکاری مفید باشد تا درک اثرات "__builtin_expect" آسانتر گردد.
همچنین میتوان احتمال مورد انتظار عبارت را با تابع داخلی "__builtin_expect_with_probability" مشخص کرد.
پیشفرض در سطوح -O، -O2، -O3 و -Os گزینه -fguess-branch-probability است.
- -freorder-blocks
- بلوکهای
پایه را در
تابع
کامپایلشده
مرتبسازی
مجدد
میکند تا
تعداد
انشعابهای
گرفتهشده
کاهش یابد و
محلیبودن
کد بهبود
یابد.
در سطوح -O1، -O2، -O3 و -Os فعال است.
- -freorder-blocks-algorithm=algorithm
- از
الگوریتم
مشخصشده
برای
مرتبسازی
مجدد
بلوکهای
پایه
استفاده
میکند.
آرگومان algorithm
میتواند
simple باشد که
اندازه کد
را افزایش
نمیدهد
(بهجز گاهی
به دلیل
اثرات
ثانویه
مانند
ترازسازی)،
یا stc
(الگوریتم software
trace cache) که تلاش
میکند
تمام
کدهایی را
که مکرراً
اجرا
میشوند
کنار هم
قرار دهد، و
با ایجاد
نسخههای
اضافی از
کد، تعداد
انشعابهای
اجراشده را
به حداقل
برساند.
پیشفرض در سطوح -O1 و -Os برابر با simple، و در سطوح -O2 و -O3 برابر با stc است.
- -freorder-blocks-and-partition
- علاوه بر
مرتبسازی
مجدد
بلوکهای
پایه در
تابع
کامپایلشده
برای کاهش
تعداد
انشعابهای
گرفتهشده،
بلوکهای
پایه داغ و
سرد را به
بخشهای
جداگانهای
از
فایلهای
اسمبلی و .o
تفکیک
میکند تا
عملکرد
صفحهبندی
و
محلیبودن
حافظه
پنهان
بهبود یابد.
این بهینهسازی در صورت وجود مدیریت استثنا یا جدولهای بازکردن پشته (در اهدافی که از طرح setjump/longjump یا طرح اختصاصی هدف استفاده میکنند)، برای بخشهای linkonce، برای توابعی با مشخصه بخش تعریفشده توسط کاربر و در هر معماری که از بخشهای نامگذاریشده پشتیبانی نمیکند، بهطور خودکار خاموش میشود. هنگامی که از -fsplit-stack استفاده میشود، این گزینه بهطور پیشفرض فعال نیست (برای جلوگیری از خطاهای پیونددهنده)، اما ممکن است بهصراحت فعال شود (در صورت استفاده از پیونددهندهای سازگار).
برای x86 در سطوح -O2، -O3 و -Os فعال است.
- -freorder-functions
- توابع را در
فایل هدف
مرتبسازی
مجدد
میکند تا
محلیبودن
کد بهبود
یابد.
برخلاف
-fipa-reorder-for-locality، این
گزینه
گروهبندی
تمام توابع
در یک دسته
(داغ/عادی/سرد/هرگز
اجرا نشده)
را در
اولویت
قرار
میدهد. این
کار با
استفاده از
زیربخشهای
ویژه
".text.hot"
برای
توابعی که
بیشترین
اجرا را
دارند و
".text.unlikely"
برای
توابعی با
اجرای
نامحتمل
پیادهسازی
میشود.
مرتبسازی
مجدد توسط
پیونددهنده
انجام
میشود،
بنابراین
قالب فایل
هدف باید از
بخشهای
نامگذاریشده
پشتیبانی
کند و
پیونددهنده
باید آنها
را به روشی
معقول قرار
دهد.
این گزینه اثری ندارد مگر اینکه بازخورد پروفایلسازی ارائه دهید (برای جزئیات به -fprofile-arcs مراجعه کنید) یا توابع را بهصورت دستی با مشخصههای "hot" یا "cold" نشانهگذاری کنید.
در سطوح -O2، -O3 و -Os فعال است..IP -fstrict-aliasing 4 به کامپایلر اجازه میدهد سختگیرانهترین قوانین نام مستعار (aliasing) قابل اعمال بر زبان در حال کامپایل را فرض کند. برای C (و ++C)، این گزینه بهینهسازیهایی را بر مبنای نوع عبارتها فعال میکند. بهویژه، دسترسی به یک شیء از یک نوع از طریق عبارتی از نوع دیگر مجاز نیست، مگر اینکه نوعها نوعهای سازگار (compatible types) باشند، تنها در علامتدار بودن یا توصیفکنندهها (qualifiers) تفاوت داشته باشند، یا اینکه عبارت دارای نوع نویسهای باشد. دسترسی به اشیاء نردهای (scalar) از طریق نوع برداری متناظر نیز مجاز است.
برای نمونه، یک "unsigned int" میتواند نام مستعاری برای یک "int" باشد، اما نه برای یک "void*" یا یک "double". یک نوع نویسهای میتواند نام مستعاری برای هر نوع دیگری باشد.
به کدهایی شبیه به این توجه ویژه داشته باشید:
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 در C مجاز است، به شرطی که دسترسی به حافظه از طریق نوع union انجام گیرد. در ISO C++، عمل type-punning از طریق یک نوع union رفتار تعریفنشده است، اما GCC آن را به عنوان یک افزونه پشتیبانی میکند. بنابراین، کد بالا همانگونه که انتظار میرود کار میکند. با این حال، کد زیر ممکن است درست عمل نکند:
int f() { union a_union t; int* ip; t.d = 3.0; ip = &t.i; return *ip; }به طور مشابه، دسترسی با گرفتن آدرس، تبدیل نوع (cast) اشارهگر حاصل و ارجاعزدایی (dereference) از نتیجه، رفتار تعریفنشده دارد، حتی اگر تبدیل نوع از یک نوع union استفاده کند؛ برای نمونه:
int f() { double d = 3.0; return ((union a_union *) &d)->i; }گزینهٔ -fstrict-aliasing در سطوح -O2، -O3 و -Os فعال میشود.
- -fipa-strict-aliasing
- کنترل
میکند که
آیا قوانین
-fstrict-aliasing در
فراتر از
مرزهای
توابع
اعمال شوند
یا خیر.
توجه داشته
باشید که
اگر چندین
تابع در یک
تابع
درونخطی (inlined)
شوند،
دسترسیهای
حافظه دیگر
به عنوان
عبور از مرز
تابع به
حساب
نمیآیند.
گزینهٔ -fipa-strict-aliasing به طور پیشفرض فعال است و تنها در ترکیب با -fstrict-aliasing مؤثر واقع میشود.
- -falign-functions
- -falign-functions=n
- -falign-functions=n:m
- -falign-functions=n:m:n2
- -falign-functions=n:m:n2:m2
- شروع توابع
را با رد
کردن
حداکثر m-1
بایت، به
توان دو
بعدیِ
بزرگتر یا
مساوی با n
تراز
میکند. این
تضمین
میکند که
حداقل m
بایت نخست
تابع
بتواند
بدون عبور
از مرز تراز
n-بایتی
توسط CPU
واکشی شود.
این یک
بهینهسازی
در کارایی
کد است و از
ترازسازی
برای
توابعی که
کمکاربرد
(cold) محسوب
میشوند،
صرفنظر
میشود. اگر
ترازسازی
برای تمامی
توابع نیاز
است، از
-fmin-function-alignment
استفاده
کنید.
اگر m مشخص نشده باشد، مقدار پیشفرض آن برابر با n خواهد بود.
مثالها: -falign-functions=32 توابع را به مرز 32-بایتی بعدی تراز میکند، -falign-functions=24 تنها در صورتی به مرز 32-بایتی بعدی تراز میکند که با رد کردن 23 بایت یا کمتر قابل انجام باشد، و -falign-functions=32:7 تنها در صورتی به مرز 32-بایتی بعدی تراز میکند که با رد کردن 6 بایت یا کمتر قابل انجام باشد.
جفت دوم مقادیر n2:m2 به شما امکان میدهد یک تراز ثانویه را تعیین کنید: -falign-functions=64:7:32:3 در صورتی که با رد کردن 6 بایت یا کمتر امکانپذیر باشد به مرز 64-بایتی بعدی تراز میکند، و در غیر این صورت اگر با رد کردن 2 بایت یا کمتر امکانپذیر باشد به مرز 32-بایتی بعدی تراز میکند. اگر m2 تعیین نشود، مقدار پیشفرض آن برابر با n2 خواهد بود.
برخی اسمبلرها این پرچم را فقط زمانی پشتیبانی میکنند که n توانی از دو باشد؛ در آن صورت، مقدار به بالا گرد میشود.
گزینههای -fno-align-functions و -falign-functions=1 معادل یکدیگرند و بدین معنا هستند که توابع تراز نمیشوند.
اگر n مشخص نشود یا صفر باشد، از یک مقدار پیشفرض وابسته به ماشین استفاده میشود. حداکثر مقدار مجاز برای گزینهٔ n برابر 65536 است.
در سطوح -O2 و -O3 فعال میشود.
- -flimit-function-alignment
- اگر این گزینه فعال باشد، کامپایلر تلاش میکند از تراز بیشازحد و غیرضروری توابع خودداری کند. این گزینه میکوشد به اسمبلر دستور دهد به میزانی که توسط -falign-functions مشخص شده ترازسازی را انجام دهد، اما بایتهای بیشتری نسبت به اندازهٔ تابع را رد نکند.
- -falign-labels
- -falign-labels=n
- -falign-labels=n:m
- -falign-labels=n:m:n2
- -falign-labels=n:m:n2:m2
- تمام
مقصدهای
انشعاب (branch targets)
را به مرزی
از توان دو
تراز
میکند.
پارامترهای این گزینه مشابه با گزینهٔ -falign-functions هستند. گزینههای -fno-align-labels و -falign-labels=1 معادل یکدیگرند و بدین معنا هستند که برچسبها تراز نمیشوند.
اگر -falign-loops یا -falign-jumps قابل اعمال بوده و بزرگتر از این مقدار باشند، مقادیر آنها به جای این مقدار استفاده میشود.
اگر n مشخص نشود یا صفر باشد، از یک پیشفرض وابسته به ماشین استفاده میشود که به احتمال بسیار زیاد 1 خواهد بود، به معنای عدم ترازسازی. حداکثر مقدار مجاز برای گزینهٔ n برابر 65536 است.
در سطوح -O2 و -O3 فعال میشود.
- -falign-loops
- -falign-loops=n
- -falign-loops=n:m
- -falign-loops=n:m:n2
- -falign-loops=n:m:n2:m2
- حلقهها را
به مرزی از
توان دو
تراز
میکند. اگر
حلقهها
بارها اجرا
شوند، این
کار هزینهٔ
اجرای
هرگونه
دستورالعمل
پرکنندهٔ
صوری (dummy padding) را
جبران
خواهد کرد.
این یک
بهینهسازی
در کارایی
کد است و از
ترازسازی
برای
حلقههایی
که
کمکاربرد
(cold) محسوب
میشوند،
صرفنظر
میشود.
اگر -falign-labels بزرگتر از این مقدار باشد، مقدار آن به جای این مقدار استفاده خواهد شد.
پارامترهای این گزینه مشابه با گزینهٔ -falign-functions هستند. گزینههای -fno-align-loops و -falign-loops=1 معادل یکدیگرند و بدین معنا هستند که حلقهها تراز نمیشوند. حداکثر مقدار مجاز برای گزینهٔ n برابر 65536 است.
اگر n مشخص نشود یا صفر باشد، از یک پیشفرض وابسته به ماشین استفاده میشود.
در سطوح -O2 و -O3 فعال میشود.
- -falign-jumps
- -falign-jumps=n
- -falign-jumps=n:m
- -falign-jumps=n:m:n2:m2
- تراز کردن
اهداف
انشعاب به
مرزی از
توان دو،
برای
اهدافی که
تنها از
طریق پرش
قابل
دستیابی
هستند. در
این حالت،
نیازی به
اجرای هیچ
دستور
ساختگی (dummy)
نیست. این
یک
بهینهسازی
برای
کارایی کد
است و از
ترازسازی
برای
پرشهایی
که سرد (cold) در
نظر گرفته
شوند،
صرفنظر
میشود.
اگر -falign-labels از این مقدار بزرگتر باشد، مقدار آن بهجای این گزینه استفاده میشود.
پارامترهای این گزینه مشابه با گزینهٔ -falign-functions هستند. -fno-align-jumps و -falign-jumps=1 معادل یکدیگرند و به این معنی هستند که حلقهها تراز نمیشوند.
اگر n مشخص نشده باشد یا صفر باشد، از مقدار پیشفرض وابسته به معماری ماشین استفاده میشود. حداکثر مقدار مجاز برای گزینهٔ n برابر با 65536 است.
در سطوح بهینهسازی -O2 و -O3 فعال میشود.
- -fmin-function-alignment
- تعیین کمینهٔ تراز توابع تا توان بعدی دو که بزرگتر یا مساوی با n باشد. برخلاف -falign-functions، این تراز بر روی تمام توابع (حتی توابعی که سرد تلقی میشوند) نیز اعمال میشود. این ترازسازی همچنین تحت تأثیر -flimit-function-alignment قرار نمیگیرد.
- -fno-allocation-dce
- عدم حذف
تخصیصهای
استفادهنشدهٔ
++C (با
استفاده از
عملگرهای
"new" و
"delete") در
مرحلهٔ حذف
کدهای مرده
(dead code elimination).
همچنین ببینید: -fmalloc-dce.
- -fallow-store-data-races
- به
کامپایلر
اجازه
میدهد
بهینهسازیهایی
را انجام
دهد که ممکن
است باعث
ایجاد
شرایط
رقابتی
داده (data race)
جدید در
عملیات
ذخیرهسازی
(store) شوند،
بدون اینکه
اثبات کند
متغیر
نمیتواند
بهطور
همروند
توسط
رشتههای
دیگر
دسترسی
پیدا کند.
این گزینه
بر
بهینهسازی
دادههای
محلی
تأثیری
ندارد. در
صورتی که
مشخص باشد
دادههای
سراسری
توسط چندین
رشته مورد
دسترسی
قرار
نخواهند
گرفت،
استفاده از
این گزینه
ایمن است.
از نمونه بهینهسازیهای فعالشده توسط -fallow-store-data-races میتوان به بالا بردن عبارتها (hoisting) یا تبدیلهای شرطی (if-conversions) اشاره کرد که ممکن است سبب شوند مقداری که پیشتر در حافظه بوده دوباره با همان مقدار بازنویسی شود. چنین بازنویسیهایی در یک بستر تکرشتهای ایمن هستند، اما ممکن است در یک بستر چندرشتهای ناامن باشند. توجه داشته باشید که در برخی پردازندهها، تبدیلهای شرطی ممکن است برای فعالسازی برداریسازی (vectorization) الزامی باشند.
در سطح -Ofast فعال میشود.
- -funit-at-a-time
- این گزینه
تنها به
دلایل
سازگاری
باقی مانده
است. -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) را
بهگونهای
که معمولاً
برای مقاصد
تخصیص ثبات
(register allocation) به کار
میروند
میسازد و
به هر وب یک
ثبات کاذب (pseudo
register) جداگانه
اختصاص
میدهد. این
کار به
مرحلهٔ
تخصیص ثبات
اجازه
میدهد
مستقیماً
بر روی
ثباتهای
کاذب عمل
کند، اما
همچنین
چندین
مرحلهٔ
بهینهسازی
دیگر مانند
CSE،
بهینهساز
حلقه و حذف
کدهای
مردهٔ ساده
را تقویت
مینماید.
با این
وجود،
میتواند
اشکالزدایی
را غیرممکن
سازد، زیرا
متغیرها
دیگر در یک
«ثبات
مبنا» (home register)
باقی
نمیمانند.
بهطور پیشفرض همراه با -funroll-loops فعال میشود.
- -fwhole-program
- فرض میکند
که واحد
کامپایل
فعلی
نمایانگر
کل برنامهٔ
در حال
کامپایل
است. تمام
توابع و
متغیرهای
عمومی
بهاستثنای
"main" و
مواردی که
با مشخصهٔ
"externally_visible"
علامتگذاری
شدهاند،
به توابع
ایستا (static)
تبدیل
میشوند و
در عمل با
تهاجم
بیشتری
توسط
بهینهسازهای
بینروالی
(interprocedural)
بهینهسازی
میگردند.
با گزینهٔ -flto، این گزینه کاربرد محدودی دارد. در بیشتر موارد، فهرست دقیق نمادهای استفادهشده یا صادرشده از باینری، از اطلاعات تفکیکی که توسط افزونهٔ پیونددهنده به بهینهساز زمان پیوند منتقل میشود، مشخص است. با این حال، اگر از هیچ افزونهٔ پیونددهندهای استفاده نشود یا در طول مرحلهٔ پیوند افزایشی هنگامی که کد نهایی تولید میشود (با -flto -flinker-output=nolto-rel)، همچنان مفید است.
- -flto[=n]
- این گزینه
بهینهساز
استاندارد
زمان پیوند
را اجرا
میکند.
هنگامی که
با کد منبع
فراخوانی
شود، GIMPLE (یکی
از
نمایشهای
درونی GCC) را
تولید کرده
و آن را در
بخشهای
ویژهٔ ELF در
فایل هدف
مینویسد.
هنگامی که
فایلهای
هدف به
یکدیگر
پیوند داده
میشوند،
تمامی
بدنههای
توابع از
این
بخشهای ELF
خوانده شده
و طوری
نمونهسازی
میشوند که
گویی بخشی
از یک واحد
ترجمه (translation unit)
یکسان
بودهاند.
برای استفاده از بهینهساز زمان پیوند، باید -flto و گزینههای بهینهسازی هم در زمان کامپایل و هم در زمان پیوند نهایی مشخص شوند. توصیه میشود که تمام فایلهای دخیل در یک پیوند را با گزینههای یکسان کامپایل کرده و همان گزینهها را در زمان پیوند نیز مشخص نمایید. برای مثال:
gcc -c -O2 -flto foo.c gcc -c -O2 -flto bar.c gcc -o myprog -flto -O2 foo.o bar.o
دو فراخوانی نخست به GCC، یک نمایش بایتکد از GIMPLE را در بخشهای ویژهٔ ELF درون foo.o و bar.o ذخیره میکنند. فراخوانی نهایی بایتکد GIMPLE را از foo.o و bar.o میخواند، این دو فایل را در یک تصویر داخلی واحد ادغام مینماید، و نتیجه را طبق روال معمول کامپایل میکند. از آنجا که هر دو فایل foo.o و bar.o در یک تصویر واحد ادغام شدهاند، این امر سبب میشود که تمام تحلیلها و بهینهسازیهای بینروالی در GCC در هر دو فایل بهگونهای عمل کنند که گویی یک فایل واحد هستند. این بدان معناست که برای مثال، بخش درونریز (inliner) قادر است توابع موجود در bar.o را درون توابع موجود در foo.o بهصورت درونخطی (inline) قرار دهد و بالعکس.
راه دیگر (و سادهتر) برای فعالسازی بهینهسازی زمان پیوند:
gcc -o myprog -flto -O2 foo.c bar.c
دستور بالا بایتکد را برای foo.c و bar.c تولید کرده، آنها را در یک نمایش واحد GIMPLE با یکدیگر ادغام میکند و برای تولید myprog آنها را طبق معمول بهینهسازی مینماید.
نکتهٔ مهمی که باید به خاطر سپرد این است که برای فعالسازی بهینهسازیهای زمان پیوند، لازم است از گردانندهٔ (driver) GCC برای انجام مرحلهٔ پیوند استفاده کنید. اگر هر یک از اشیای دخیل با گزینهٔ خط فرمان -flto کامپایل شده باشند، GCC بهطور خودکار بهینهسازی زمان پیوند را انجام میدهد. شما همیشه میتوانید تصمیم خودکار برای انجام بهینهسازی زمان پیوند را با فرستادن -fno-lto به دستور پیوند لغو کنید.
برای اثربخش کردن بهینهسازی کل برنامه، لازم است فرضیات معینی در نظر گرفته شود. کامپایلر باید بداند چه توابع و متغیرهایی ممکن است توسط کتابخانهها و زماناجرا (runtime) خارج از واحد بهینهسازیشده در زمان پیوند مورد دسترسی قرار گیرند. در صورت پشتیبانی توسط پیونددهنده، افزونهٔ پیونددهنده (ببینید: -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 از بالاترین سطح بهینهسازی استفادهشده در هنگام کامپایل فایلهای هدف استفاده میکند. توجه داشته باشید که تعیین گزینهٔ سطح بهینهسازی صرفاً در زمان پیوند و نه در زمان کامپایل، عموماً بیتأثیر است و این امر دو دلیل دارد: نخست اینکه کامپایل کردن بدون بهینهسازی، گذارهای (passes) کامپایلر را که اطلاعات لازم برای بهینهسازی مؤثر در زمان پیوند را جمعآوری میکنند، متوقف میسازد. دوم اینکه برخی از مراحل اولیهٔ بهینهسازی تنها در زمان کامپایل قابل انجام هستند و نه در زمان پیوند.
برخی پرچمهای تولید کد وجود دارند که توسط 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 به مرحلهٔ پیوند منتقل میشوند و تنظیمات آنها با مرحلهٔ کامپایل در سطح دانهبندی تابع (function granularity) مطابقت دارد. توجه داشته باشید که این موضوع تنها برای پیامهای تشخیصی صادرشده در حین بهینهسازی اهمیت دارد. همچنین توجه کنید که تبدیلات کد مانند درونخطیسازی (inlining) میتواند منجر به فعال یا غیرفعال شدن هشدارها برای بخشهایی از کد شود، چنانچه با تنظیمات زمان کامپایل سازگار نباشد.
هنگامی که نیاز دارید گزینههایی را از طریق -Wa یا -Xassembler به اسمبلر ارسال کنید، مطمئن شوید که یا چنین واحدهای ترجمهای را با -fno-lto کامپایل میکنید، یا بهطور یکپارچه از همان گزینههای اسمبلر در تمامی واحدهای ترجمه استفاده مینمایید. همچنین میتوانید گزینههای اسمبلر را در زمان پیوند LTO مشخص کنید.
برای فعالسازی تولید اطلاعات اشکالزدایی باید -g را در زمان کامپایل مشخص کنید. اگر هر یک از فایلهای ورودی در زمان پیوند با فعال بودن تولید اطلاعات اشکالزدایی ساخته شده باشند، مرحلهٔ پیوند نیز تولید اطلاعات اشکالزدایی را فعال خواهد کرد. هرگونه تنظیمات پیشرفتهتر اطلاعات اشکالزدایی مانند سطح DWARF در -gdwarf-5 باید صریحاً در خط فرمان پیونددهنده تکرار شود و ترکیب تنظیمات مختلف در واحدهای ترجمهٔ گوناگون توصیه نمیشود.
اگر LTO با اشیایی با پیوند C مواجه شود که با انواع ناسازگار در واحدهای ترجمهٔ مجزایی که قرار است به یکدیگر پیوند داده شوند اعلان شدهاند (رفتار تعریفنشده طبق ISO C99 6.2.7)، ممکن است یک پیام تشخیصی غیرمهلک صادر شود. این رفتار در زمان اجرا همچنان تعریفنشده است. پیامهای تشخیصی مشابهی ممکن است برای زبانهای دیگر نیز ایجاد شود.
یکی دیگر از ویژگیهای LTO این است که میتوان بهینهسازیهای بینارویهای (interprocedural optimizations) را روی فایلهای نوشتهشده به زبانهای مختلف اعمال کرد:
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 ذخیره شده باشند، در صورتی که از یک پیونددهنده با پشتیبانی از افزونه (plugin) استفاده کنید، امکان استخراج و استفاده از آنها در پیوند 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 از قبل بهصورت موازی در حال اجرا باشد. برای کارکرد این قابلیت، باید یک + در ابتدای دستور (recipe) در Makefile والد قرار دهید. این گزینه احتمالاً تنها زمانی کار میکند که MAKE همان GNU make باشد. حتی بدون مقدار گزینه، GCC تلاش میکند تا یک job server در حال اجرای GNU make را بهطور خودکار تشخیص دهد.
از -flto=auto برای استفاده از job server متعلق به GNU make (در صورت دردسترس بودن) استفاده کنید، یا در غیر این صورت به تشخیص خودکار تعداد رشتههای پردازنده (CPU threads) موجود در سیستم بازگردید.
- -flto-partition=alg
- الگوریتم پارتیشنبندی مورداستفاده توسط بهینهساز زمان پیوند را مشخص میکند. مقدار آن میتواند 1to1 برای مشخص کردن پارتیشنبندی متناظر با فایلهای مبدأ اصلی، یا balanced برای تعیین پارتیشنبندی به بخشهای هماندازه (در صورت امکان)، یا max برای ایجاد پارتیشن جدید برای هر نماد در صورت امکان، یا cache برای متعادلسازی اندازهٔ بخشها در عین کنار هم نگهداشتن نمادهای مرتبط جهت حافظهپنهانسازی بهتر در LTO افزایشی باشد. مشخص کردن none بهعنوان الگوریتم، پارتیشنبندی و جریاندهی (streaming) را بهطور کامل غیرفعال میکند. مقدار پیشفرض balanced است. در حالی که 1to1 میتواند بهعنوان یک راهحل موقت برای مشکلات مختلف ترتیب کد استفاده شود، پارتیشنبندی max صرفاً برای آزمایشهای داخلی در نظر گرفته شده است. مقدار one مشخص میکند که دقیقاً یک پارتیشن باید استفاده شود، در حالی که مقدار none پارتیشنبندی را دور میزند و مرحلهٔ بهینهسازی زمان پیوند را مستقیماً از فاز WPA اجرا میکند.
- -flto-incremental=path
- فعالسازی
LTO افزایشی،
به همراه
حافظهٔ
پنهان آن در
دایرکتوری
موجودِ
مشخصشده.
میتواند
چرخههای
ویرایش-کامپایل
را با LTO
بهطور
چشمگیری
کوتاهتر
کند.
هنگامی که به همراه LTO (-flto) استفاده شود، خروجی واحدهای ترجمه در درون LTO در حافظهٔ پنهان ذخیره میشود. واحدهای ترجمهٔ ذخیرهشده در حافظهٔ پنهان احتمالاً هنگام کامپایل دوباره با تغییرات کوچک کد دوباره با همان وضعیت مواجه خواهند شد، که منجر به کاهش زمان کامپایل مجدد میشود.
چندین نمونه از GCC میتوانند بهطور موازی از یک حافظهٔ پنهان مشترک استفاده کنند.
- -flto-incremental-cache-size=n
- تعداد مدخلهای حافظهٔ پنهان در LTO افزایشی را مشخص میکند که پس از آن ورودیهای قدیمی هرس میشوند. این یک محدودیت نرم (soft limit) است و موقتاً ممکن است ورودیهای بیشتری وجود داشته باشد.
- -flto-compression-level=n
- این گزینه سطح فشردهسازی مورداستفاده برای زبان میانیِ نوشتهشده در فایلهای شیء LTO را مشخص میکند و تنها همراه با حالت LTO (-flto) معنادار است. GCC در حال حاضر از دو الگوریتم فشردهسازی LTO پشتیبانی میکند. برای zstd، مقادیر معتبر از 0 (بدون فشردهسازی) تا 19 (حداکثر فشردهسازی) است، در حالی که zlib از مقادیر 0 تا 9 پشتیبانی میکند. مقادیر خارج از این محدوده به حداقل یا حداکثر مقادیر پشتیبانیشده محدود (clamped) میشوند. اگر گزینه مشخص نشود، یک تنظیم فشردهسازی متعادل پیشفرض استفاده میشود.
- -flto-toplevel-asm-heuristics
- روشهای
اکتشافی (heuristics)
را برای
یافتن
نمادهای
مورداستفاده
در "asm"
پایه در سطح
بالا فعال
میکند. این
کار
بهینهسازیهای
زمان پیوند
را که ممکن
است باعث
تغییر نام
یا حذف چنین
نمادهایی
شوند (و در
نتیجه
خطاهای
نبود نماد
توسط
پیونددهنده
ایجاد کنند)
محدود
میسازد.
این پرچم برای پروژههایی در نظر گرفته شده است که هنوز به استفاده از "asm" گسترشیافته در سطح بالا مهاجرت نکردهاند؛ روشی که کاربرد نماد را مستقیماً و بدون هیچ مورد مثبت کاذبی (false positive) مشخص میکند.
این روشهای اکتشافی ساده هستند و کد اسمبلی را تجزیه (parse) نمیکنند. این روشها اسمبلی سطح بالا را برای تمام شناسههای ممکن بررسی میکنند؛ اگر شناسهای در میان نمادهای اعلانشده یافت شود، آن نماد علامتگذاری میشود تا بهینهسازیهای زمان پیوند محدود گردند. نمادهای ایستا (static) بهینهسازیهای بیشتری را غیرفعال میکنند. همچنین شناسههایی که پس از آنها ':' قرار دارد نیز بهینهسازیهای بیشتری را غیرفعال میسازند، زیرا ممکن است نمادی باشند که بهصورت محلی در اسمبلی تعریف شده است، حتی اگر اعلان آن با 'extern' مشخص شده باشد..IP -fuse-linker-plugin 4 استفاده از یک افزونهٔ پیونددهنده (linker plugin) را در طول بهینهسازی زمان پیوند فعال میکند. این گزینه به پشتیبانی پیونددهنده از افزونه وابسته است که در gold یا در GNU ld نسخهٔ 2.21 یا جدیدتر در دسترس است.
این گزینه استخراج فایلهای شیء حاوی بایتکد GIMPLE را از آرشیوهای کتابخانهای ممکن میسازد. این امر کیفیت بهینهسازی را با در معرض بهینهسازِ زمانِ پیوند قرار دادنِ کدهای بیشتر بهبود میبخشد. این اطلاعات مشخص میکند چه نمادهایی میتوانند بهصورت خارجی (توسط شیء غیر LTO یا در طول پیوند پویا) در دسترس باشند. بهبودهای حاصل در کیفیت کد روی باینریها (و کتابخانههای اشتراکی که از دید پنهان استفاده میکنند) مشابه -fwhole-program است. برای شرح اثرات این پرچم و نحوهٔ استفاده از آن، -flto را ببینید.
این گزینه بهطور پیشفرض زمانی که پشتیبانی از LTO در GCC فعال باشد و GCC برای استفاده با پیونددهندهای با پشتیبانی از افزونهها (GNU ld نسخهٔ 2.21 یا جدیدتر، یا gold) پیکربندی شده باشد، فعال است.
- -ffat-lto-objects
- اشیاء Fat LTO
فایلهای
شیئی هستند
که هم شامل
زبان میانی
و هم کد شیء
هستند. این
امر آنها
را هم برای
پیوند LTO و هم
پیوند عادی
قابل
استفاده
میسازد.
این گزینه
فقط هنگام
کامپایل با
-flto مؤثر است
و در زمان
پیوند
نادیده
گرفته
میشود.
گزینهٔ -fno-fat-lto-objects زمان کامپایل را نسبت به LTO ساده بهبود میبخشد، اما نیازمند آن است که کل زنجیرهابزار از LTO آگاه باشد. این گزینه برای عملکردهای پایه به پیونددهندهای با پشتیبانی از افزونهٔ پیونددهنده نیاز دارد. علاوه بر این، nm، ar و ranlib برای فراهم ساختن یک محیط ساخت با تمام امکانات (با قابلیت ساخت کتابخانههای ایستا و غیره) باید از افزونههای پیونددهنده پشتیبانی کنند. GCC پوششهای gcc-ar، gcc-nm و gcc-ranlib را برای ارسال گزینههای مناسب به این ابزارها فراهم میکند. با اشیاء LTO غیر fat، لازم است 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
- تلاش برای
حذف
دستورات
جمع با
ادغام
آنها در
دستورات
بارگذاری/ذخیرهسازی
حافظه.
در سطوح -O2 و -O3 فعال است.
- -fcprop-registers
- پس از تخصیص
ثبات و
تقسیم
دستورالعملهای
پس از تخصیص
ثبات، یک
مرحلهٔ
انتشار کپی
انجام
میدهد تا
وابستگیهای
زمانبندی
را کاهش
داده و
گهگاه عمل
کپی را حذف
کند.
در سطوح -O1، -O2، -O3 و -Os فعال است.
- -fprofile-correction
- پروفایلهای
جمعآوریشده
با استفاده
از باینری
ابزاردقیقشده
برای
برنامههای
چندنخی
ممکن است به
دلیل
بهروزرسانیهای
از دست
رفتهٔ
شمارندهها
ناهمخوان
باشند.
هنگامی که
این گزینه
مشخص شود، 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://perfwiki.github.io/main را ببینید.
برای مثال:
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 - -fauto-profile-inlining
- هنگامی که auto-profile در دسترس است، پیش از خواندن بازخورد پروفایل، تمام توابع مرتبطی را که در اجرای آموزشی درونخطی شده بودند، درونخطی میکند. این کار حساسیت به زمینهٔ پروفایل را بهبود میبخشد. بهطور پیشفرض فعال است.
گزینههای زیر رفتار کامپایلر را در رابطه با محاسبات ممیز شناور کنترل میکنند. این گزینهها میان سرعت و صحت تعادل برقرار میسازند. همهٔ آنها باید بهطور مشخص فعال شوند.
- -fexcess-precision=style
- این گزینه
امکان
کنترل بر
دقت مازاد
را در
ماشینهایی
که عملیات
ممیز شناور
در آنها با
قالبی با
دقت یا
دامنهٔ
بیشتر از
استاندارد
IEEE و انواع
تبادلی
ممیز شناور
انجام
میشود،
فراهم
میکند.
نمونهای
از چنین
مقصدی،
ممیز شناور
x87 روی
پردازندههای
x86 است که در
داخل
بهجای
قالب ۶۴
بیتی IEEE از
نمایش ۸۰
بیتی
استفاده
میکند.
برای اکثر
برنامهها،
دقت مازاد
بیضرر
است، اما
برخی
برنامهها
ممکن است به
الزامات
استانداردهای
زبان C یا C++
برای
مدیریت
مقادیر IEEE
متکی باشند.
بهطور پیشفرض، -fexcess-precision=fast فعال است؛ این بدان معنی است که در صورتی که به کدی سریعتر بیانجامد، ممکن است عملیات با دقتی بالاتر از انواع مشخصشده در کد منبع انجام شوند و زمان گرد کردن به انواع مشخصشده در کد منبع غیرقابلپیشبینی خواهد بود. هنگام کامپایل C یا C++، اگر -fexcess-precision=standard مشخص شود، آنگاه دقت مازاد از قوانین مشخصشده در ISO C99 یا C++ پیروی میکند؛ بهویژه، هم تبدیلهای صریح نوع و هم انتسابها موجب میشوند مقادیر به انواع معنایی خود گرد شوند (در حالی که -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 بدون دقت مازاد اعمال میشود و در حالت دوم، گرد کردن غیرقابلپیشبینی است..IP -ffloat-store 4 متغیرهای ممیز شناور را در ثباتها ذخیره نکن، و مانع از گزینههای دیگری شو که ممکن است دریافت یک مقدار ممیز شناور از ثبات یا حافظه را تغییر دهند. این گزینه عموماً زیرمجموعهٔ -fexcess-precision=standard قرار گرفته که جامعتر است. اگر از -ffloat-store استفاده میکنید، ممکن است نیاز باشد برنامهٔ خود را بهگونهای تغییر دهید که محاسبات میانی را صراحتاً در متغیرهای موقت ذخیره کند، زیرا -ffloat-store گرد کردن به قالب IEEE را تنها هنگام انتسابها اعمال میکند و نه در تبدیل نوعها (casts)، برخلاف کاری که -fexcess-precision=standard انجام میدهد.
- -ffast-math
- گزینههای
-fno-math-errno، -funsafe-math-optimizations،
-ffinite-math-only، -fno-rounding-math،
-fno-signaling-nans، -fcx-limited-range و
-fexcess-precision=fast را
تنظیم
میکند.
این گزینه باعث تعریف ماکروی پیشپردازندهٔ "__FAST_MATH__" میشود.
این گزینه به جز با -Ofast با هیچ گزینهٔ -O دیگری روشن نمیشود، زیرا میتواند برای برنامههایی که به پیادهسازی دقیق قواعد یا مشخصات IEEE یا ISO برای توابع ریاضی وابسته هستند، منجر به خروجی نادرست شود. با این حال، ممکن است برای برنامههایی که نیازی به ضمانتهای این مشخصات ندارند، کد سریعتری تولید کند.
- -fno-math-errno
- پس از
فراخوانی
توابع
ریاضی که با
یک
دستورالعمل
منفرد اجرا
میشوند
(مانند
"sqrt")،
مقدار
"errno" را
تنظیم نکن.
برنامهای
که برای
رسیدگی به
خطاهای
ریاضی به
استثناهای
IEEE متکی است،
ممکن است
بخواهد از
این پرچم
برای
افزایش
سرعت و در
عین حال حفظ
سازگاری
محاسباتی IEEE
استفاده
کند.
این گزینه به جز با -Ofast با هیچ گزینهٔ -O دیگری روشن نمیشود، زیرا میتواند برای برنامههایی که به پیادهسازی دقیق قواعد یا مشخصات IEEE یا ISO برای توابع ریاضی وابستهاند، منجر به خروجی نادرست شود. با این حال، ممکن است برای برنامههایی که نیازی به ضمانتهای این مشخصات ندارند، کد سریعتری به بار آورد.
پیشفرض -fmath-errno است.
در سیستمهای Darwin، کتابخانهٔ ریاضی هرگز "errno" را تنظیم نمیکند. بنابراین دلیلی ندارد که کامپایلر این احتمال را در نظر بگیرد، و -fno-math-errno پیشفرض است.
- -funsafe-math-optimizations
- بهینهسازیهایی
را برای
محاسبات
ممیز شناور
مجاز کن که
(الف) فرض
میکنند
آرگومانها
و نتایج
معتبر
هستند و (ب)
ممکن است
استانداردهای
IEEE یا ANSI را نقض
کنند. در
صورت
استفاده در
زمان
پیوند،
ممکن است
کتابخانهها
یا
فایلهای
راهاندازیای
را شامل شود
که کلمهٔ
کنترلی
پیشفرض FPU
یا سایر
بهینهسازیهای
مشابه را
تغییر
میدهند.
این گزینه به جز با -Ofast با هیچ گزینهٔ -O دیگری روشن نمیشود، زیرا میتواند برای برنامههایی که به پیادهسازی دقیق قواعد یا مشخصات IEEE یا ISO برای توابع ریاضی وابستهاند، منجر به خروجی نادرست شود. با این حال، ممکن است برای برنامههایی که نیازی به ضمانتهای این مشخصات ندارند، کد سریعتری به دست دهد. گزینههای -fno-signed-zeros، -fno-trapping-math، -fassociative-math و -freciprocal-math را فعال میکند.
پیشفرض -fno-unsafe-math-optimizations است.
- -fassociative-math
- تغییر
شرکتپذیری
عملوندها
در
دنبالهای
از
عملیاتهای
ممیز شناور
را مجاز کن.
این کار
ممکن است با
تغییر
نتیجهٔ
محاسبات،
استانداردهای
زبان ISO C و C++ را
نقض کند.
توجه: تغییر
ترتیب ممکن
است علامت
صفر را
تغییر دهد و
همچنین
مقادیر NaN را
نادیده
بگیرد و
باعث ایجاد
یا مهار
زیرسرریز
یا سرریز
شود (و در
نتیجه
نمیتواند
روی کدی که
به رفتار
گرد کردن
وابسته
است، مانند
"(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)"
سودمند
خواهد بود.
توجه داشته
باشید که
این کار دقت
را کاهش
داده و
تعداد
عملیاتهای
ممیز شناور
روی آن
مقدار را
افزایش
میدهد.
پیشفرض -fno-reciprocal-math است.
- -ffinite-math-only
- بهینهسازیهایی
را برای
محاسبات
ممیز شناور
مجاز کن که
فرض
میکنند
آرگومانها
و نتایج
مقدار NaN یا Infs+-
نیستند.
این گزینه به جز با -Ofast با هیچ گزینهٔ -O دیگری روشن نمیشود، زیرا میتواند برای برنامههایی که به پیادهسازی دقیق قواعد یا مشخصات 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
- کد را با
این فرض
کامپایل کن
که
عملیاتهای
ممیز شناور
نمیتوانند
تلههای
قابل
مشاهده
برای کاربر
تولید کنند.
این تلهها
شامل تقسیم
بر صفر،
سرریز،
زیرسرریز،
نتیجهٔ
غیردقیق و
عملیات
نامعتبر
هستند. این
گزینه
مستلزم
فعال بودن
-fno-signaling-nans است.
برای مثال،
اگر به
محاسبات IEEE
«بدون
توقف» (non-stop)
تکیه شده
باشد،
تنظیم این
گزینه ممکن
است کد
سریعتری
تولید کند.
این گزینه به جز با -Ofast با هیچ گزینهٔ -O دیگری روشن نمیشود، زیرا میتواند برای برنامههایی که به پیادهسازی دقیق قواعد یا مشخصات IEEE یا ISO برای توابع ریاضی وابستهاند، منجر به خروجی نادرست شود.
پیشفرض -ftrapping-math است.
نسخههای آیندهٔ GCC ممکن است با استفاده از پراگمای "FENV_ACCESS" در C99، کنترل دقیقتری روی این تنظیم ارائه دهند. این گزینهٔ خط فرمان به همراه -frounding-math برای مشخص کردن حالت پیشفرض "FENV_ACCESS" به کار خواهد رفت.
- -frounding-math
- تبدیلها و
بهینهسازیهایی
را که رفتار
پیشفرض
گرد کردن
ممیز شناور
(گرد کردن
به
نزدیکترین)
را فرض
میکنند،
غیرفعال کن.
این گزینه
باید برای
برنامههایی
مشخص شود که
حالت گرد
کردن FP را
بهطور
پویا تغییر
میدهند،
یا ممکن است
با حالتی
غیر از حالت
پیشفرض
اجرا شوند.
این گزینه
ادغام
مقادیر
ثابت (constant folding) در
عبارتهای
ممیز شناور
در زمان
کامپایل (که
ممکن است
تحت تأثیر
حالت گرد
کردن باشند)
و
تبدیلهای
حسابی را که
در حضور
حالتهای
گرد کردنِ
وابسته به
علامت
ناامن
هستند،
غیرفعال
میکند.
پیشفرض -fno-rounding-math است.
این گزینه آزمایشی است و در حال حاضر تضمین نمیکند که تمام بهینهسازیهای GCC که تحت تأثیر حالت گرد کردن قرار دارند غیرفعال شوند. نسخههای آیندهٔ GCC ممکن است با استفاده از پراگمای "FENV_ACCESS" در C99، کنترل دقیقتری روی این تنظیم ارائه دهند. این گزینهٔ خط فرمان به همراه -ftrapping-math برای مشخص کردن وضعیت پیشفرض "FENV_ACCESS" استفاده خواهد شد.
- -fsignaling-nans
- کد را با
این فرض
کامپایل کن
که NaNهای
سیگنالدهنده
در IEEE ممکن
است هنگام
عملیات
ممیز شناور
تلههای
قابل
مشاهده
برای کاربر
تولید کنند.
تنظیم این
گزینه
بهینهسازیهایی
را که ممکن
است تعداد
استثناهای
قابل
مشاهده با
NaNهای
سیگنالدهنده
را تغییر
دهند،
غیرفعال
میکند. این
گزینه
متضمن -ftrapping-math
است.
این گزینه باعث تعریف ماکروی پیشپردازندهٔ "__SUPPORT_SNAN__" میشود.
پیشفرض -fno-signaling-nans است.
این گزینه آزمایشی است و در حال حاضر تضمین نمیکند که تمام بهینهسازیهای GCC که بر رفتار NaNهای سیگنالدهنده تأثیر میگذارند، غیرفعال شوند.
- -fsingle-precision-constant
- با ثابتهای ممیز شناور بهصورت دقت تکی برخورد کن، به جای اینکه بهطور ضمنی آنها را به ثابتهای با دقت مضاعف تبدیل کنی.
- -fcx-limited-range
- در صورت
فعال بودن،
این گزینه
بیان
میکند که
هنگام
انجام
تقسیم
مختلط، به
مرحلهٔ
کاهش بازه
نیازی نیست.
همچنین
بررسی
نمیشود که
آیا نتیجهٔ
ضرب یا
تقسیم
مختلط
برابر با
"NaN + I*NaN" است
یا خیر، تا
در آن صورت
تلاشی برای
بهبود
وضعیت صورت
گیرد. این
گزینه توسط
-ffast-math فعال
میشود.
این گزینه تنظیم پیشفرض پراگمای "CX_LIMITED_RANGE" در ISO C99 را کنترل میکند. با این حال، این گزینه بر تمام زبانها اعمال میشود.
- -fcx-fortran-rules
- ضرب و تقسیم
اعداد
مختلط از
قوانین Fortran
پیروی
میکنند.
کاهش بازه
به عنوان
بخشی از
تقسیم
مختلط
انجام
میشود،
اما بررسی
نمیشود که
آیا نتیجهٔ
ضرب یا
تقسیم
مختلط
برابر با
"NaN + I*NaN" است
یا خیر، تا
در آن صورت
تلاشی برای
بهبود
وضعیت صورت
گیرد..IP -fcx-method=method 4
ضرب و تقسیم
اعداد
مختلط از method
تعیینشده
پیروی
میکنند.
آرگومان method
باید یکی از
مقادیر
limited-range، fortran یا stdc
باشد.
حالت پیشفرض، رعایت محدودیتهای ویژه هر زبان است که به معنای fortran برای زبان Fortran و در غیر این صورت stdc است.
گزینههای زیر بهینهسازیهایی را کنترل میکنند که ممکن است کارایی را بهبود ببخشند، اما توسط هیچیک از گزینههای -O فعال نمیشوند. این بخش شامل گزینههای آزمایشی است که ممکن است کد معیوب تولید کنند.
- -fbranch-probabilities
- پس از اجرای
برنامهای
که با -fprofile-arcs
کامپایل
شده است،
میتوانید
آن را برای
بار دوم با
استفاده از
-fbranch-probabilities
کامپایل
کنید تا
بهینهسازیها
بر اساس
تعداد
دفعاتی که
هر انشعاب
طی شده است
بهبود
یابند.
هنگامی که
برنامهای
که با -fprofile-arcs
کامپایل
شده خاتمه
مییابد،
شمارش
اجرای
قوسها (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
- بازآرایی
توابع بر
اساس ابزار
دقیق
پروفایلسازی،
نخستین
زمان اجرای
یک تابع را
ثبت کرده و
این توابع
را به ترتیب
صعودی مرتب
میکند، با
این هدف که
زمان
راهاندازی
برنامه از
طریق
بارگذاری
کارآمدتر
بخشهای
متنی (text segments)
بهینهسازی
شود.
با -fprofile-use فعال میشود.
- -fvpt
- اگر با -fprofile-arcs
ترکیب شود،
این گزینه
به
کامپایلر
دستور
میدهد تا
کدی برای
جمعآوری
اطلاعات
درباره
مقادیر
عبارتها
اضافه کند.
با -fbranch-probabilities، دادههای جمعآوریشده را بازخوانی کرده و بهینهسازیها را عملاً بر اساس آنها اعمال میکند. در حال حاضر بهینهسازیها شامل تخصیصیافتگی عملیات تقسیم با بهرهگیری از آگاهی درباره مقدار مخرج است.
با -fprofile-use و -fauto-profile فعال میشود.
- -frename-registers
- تلاش برای
پرهیز از
وابستگیهای
کاذب در
کدهای
زمانبندیشده،
با استفاده
از
ثباتهایی
که پس از
تخصیص
ثباتها
باقی
ماندهاند.
این
بهینهسازی
بیشترین
فایده را
برای
پردازندههای
دارای
ثباتهای
زیاد دارد.
با این حال،
بسته به
قالب
اطلاعات
اشکالزدایی
اتخاذشده
توسط هدف،
ممکن است
اشکالزدایی
را ناممکن
سازد؛ چرا
که متغیرها
دیگر در یک
«ثبات
خانگی»
باقی
نمیمانند.
به طور پیشفرض با -funroll-loops فعال است.
- -fschedule-fusion
- یک گذر
وابسته به
معماری هدف
بر روی
جریان
دستورالعملها
اجرا
میکند تا
دستورالعملهای
همنوع را
در کنار هم
زمانبندی
نماید،
زیرا ماشین
هدف
میتواند
در صورت
مجاورت
آنها با
یکدیگر در
جریان
دستورالعمل،
آنها را با
کارایی
بیشتری
اجرا کند.
در سطوح -O2، -O3 و -Os فعال میشود.
- -fdep-fusion
- جفتهای
ادغامپذیرِ
ماکرو-عملیاتی
(macro-op) متشکل از
دستورالعملهای
تکبار
مصرف و
استفادههای
آنها را
تشخیص داده
و این
جفتها را
در جریان
دستورالعملها
کنار
یکدیگر
میگذارد
تا
فرصتهای
ادغام در
سختافزار
افزایش
یابد. این
گذر یک بار
پیش از
تخصیص
ثباتها و
بار دیگر
پیش از
تغییر نام
ثباتها
اجرا
میشود.
در سطوح -O2، -O3 و -Os فعال میشود.
- -ftracer
- تکثیر
دنباله (tail duplication)
را برای
بزرگتر
کردن
اندازه
ابربلوک (superblock)
انجام
میدهد. این
تبدیل،
جریان
کنترل تابع
را ساده
کرده و به
دیگر
بهینهسازیها
اجازه
میدهد
کارایی
بهتری
داشته
باشند.
توسط -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
- اگر یک حلقه
شامل شرطی
باشد که
همواره
برای بخشی
از فضای
تکرار درست
('true') و برای
بخش دیگر
نادرست ('false')
باشد، آن را
به دو حلقه
تقسیم
میکند.
توسط -fprofile-use و -fauto-profile فعال میشود.
- -funswitch-loops
- انشعابهای
دارای
شرایط
نامتغیر در
حلقه را به
خارج از
حلقه منتقل
میکند،
همراه با
ایجاد
نسخههای
المثنی از
حلقه در هر
دو شاخه (که
بر اساس
نتیجه شرط
اصلاح
شدهاند).
توسط -fprofile-use و -fauto-profile فعال میشود.
- -fversion-loops-for-strides
- اگر یک حلقه
روی
آرایهای
با گام
متغیر
تکرار شود،
نسخه دیگری
از حلقه
ایجاد
میکند که
فرض میکند
گام همیشه
یک است.
برای مثال:
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
- قرار دادن
هر تابع یا
مولفه داده
(data item) در بخش (section)
اختصاصی
خود در فایل
خروجی، در
صورتی که
معماری
مقصد از
بخشهای
دلخواه
پشتیبانی
کند. نام
تابع یا نام
مولفه
داده، نام
بخش مربوطه
را در فایل
خروجی
تعیین
میکند.
از این گزینهها در سیستمهایی استفاده کنید که در آنها پیونددهنده (linker) میتواند بهینهسازیهایی برای بهبود محل مراجعات (locality of reference) در فضای دستورالعملها انجام دهد. اکثر سیستمهایی که از قالب شیء ELF استفاده میکنند، پیونددهندههایی با چنین بهینهسازیهایی دارند. در AIX، پیونددهنده بخشها (CSECTها) را بر اساس گراف فراخوانی (call graph) بازآرایی میکند. تأثیر این عمل بر کارایی متغیر است.
همراه با قابلیت جمعآوری زباله توسط پیونددهنده (گزینه --gc-sections در linker)، این گزینهها ممکن است منجر به ایجاد فایلهای اجرایی پیوند ایستا (statically-linked) کوچکتری (پس از پیراستن یا strip کردن) شوند.
در سیستمهای مبتنی بر ELF/DWARF این گزینهها کیفیت اطلاعات اشکالزدایی (debug information) را کاهش نمیدهند. با این حال ممکن است با سایر قالبهای فایل شیء یا قالبهای اطلاعات اشکالزدایی مشکلاتی وجود داشته باشد.
تنها زمانی از این گزینهها استفاده کنید که مزایای قابلتوجهی به همراه داشته باشند. هنگام مشخص کردن این گزینهها، اسمبلر و پیونددهنده فایلهای شیء و اجرایی بزرگتری تولید کرده و همچنین کندتر عمل میکنند. این گزینهها بر تولید کد تأثیر میگذارند؛ آنها مانع از بهینهسازیهای کامپایلر و اسمبلر با استفاده از مکانهای نسبی درون یک واحد ترجمه (translation unit) میشوند، زیرا این مکانها تا زمان پیوند ناشناخته باقی میمانند. نمونهای از این بهینهسازیها، تبدیل فراخوانیها به دستورالعملهای فراخوانی کوتاه (short call) است.
- -fstdarg-opt
- بهینهسازی بخش مقدماتی (prologue) توابع دارای آرگومانهای متغیر (variadic) با توجه به نحوه استفاده از آن آرگومانها.
- -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]; }همه معماریهای مقصد از این گزینه پشتیبانی نمیکنند.
- -fzero-call-used-regs=choice
- صفر کردن
ثباتهای
مورداستفاده
در
فراخوانی
(call-used registers) هنگام
بازگشت از
تابع جهت
افزایش
امنیت
برنامه، چه
از طریق
کاهش حملات
ROP (Return-Oriented Programming) یا
جلوگیری از
نشت
اطلاعات از
طریق
ثباتها.
مقادیر ممکن برای choice همانند مقادیر مشخصه "zero_call_used_regs" است. مقدار پیشفرض skip میباشد.
میتوانید این رفتار را برای یک تابع خاص با استفاده از مشخصه تابع "zero_call_used_regs" کنترل کنید.
گزینههای ابزارگذاری برنامه (Program Instrumentation Options)
کامپایلر GCC از چندین گزینه خط فرمان پشتیبانی میکند که افزودن ابزارگذاری زمان اجرا (run-time instrumentation) را به کدی که بهطور معمول تولید میکند، کنترل مینمایند. برای نمونه، یکی از اهداف ابزارگذاری، جمعآوری آمار پروفایلسازی (profiling) برای استفاده در یافتن نقاط پرمصرف برنامه (hot spots)، تحلیل پوشش کد (code coverage) یا بهینهسازیهای هدایتشده با پروفایل (PGO) است. دسته دیگری از ابزارگذاری برنامه، افزودن بررسیهای زمان اجرا برای تشخیص خطاهای برنامهنویسی مانند ارجاعگشایی نامعتبر اشارهگر (invalid pointer dereference) یا دسترسیهای خارج از محدوده به آرایهها، و همچنین حملات خصمانه عمدی مانند شکستن پشته (stack smashing) یا سرقت vtable در C++ است. همچنین یک قلاب (hook) عمومی نیز وجود دارد که میتواند برای پیادهسازی سایر اشکال ردیابی یا ابزارگذاری در سطح توابع برای اهداف اشکالزدایی یا تحلیل برنامه استفاده شود.
- -p
- --profile
- -fprofile
- -pg
- تولید کد
اضافی برای
نوشتن
اطلاعات
پروفایلسازی
مناسب برای
برنامه
تحلیلگر
prof (برای -p،
--profile و -fprofile) یا gprof
(برای -pg). شما
باید هنگام
کامپایل
کردن
فایلهای
منبعی که
خواهان
دادههای
آنها
هستید، و
همچنین
هنگام
پیوند دادن
(linking) از این
گزینه
استفاده
کنید.
میتوانید از مشخصه تابع "no_instrument_function" برای جلوگیری از پروفایلسازی توابع خاص هنگام کامپایل با این گزینهها استفاده کنید.
- -fprofile-arcs
- افزودن کد
به طوری که
کمانهای
جریان
برنامه (arcs)
ابزارگذاری
شوند. در
حین اجرا،
برنامه ثبت
میکند که
هر شاخه (branch) و
فراخوانی
چند بار
اجرا شده و
چند بار
منشعب شده
یا بازگشته
است. در
معماریهای
مقصدی که از
سازندهها
با اولویت
پشتیبانی
میکنند،
پروفایلسازی
بهدرستی
سازندهها،
مخربها (destructors)
و
سازندههای
کلاسهای 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 از یک روش اکتشافی (heuristic) بدبینانه استفاده میکند که تعداد مسیرهای در حال پردازش را اندکی بیش از حد واقعی میشمارد، و اگر قبل از یافتن تمام مسیرها به این آستانه برسد، کار را متوقف میکند. این گزینه برای کنترل دقیق اینکه کدام توابع ابزارگذاری شوند نیست - بلکه هدف آن محدود کردن اثر انفجار مسیرها و معقول نگه داشتن زمان کامپایل است. مقدار پیشفرض 250000 است.
- --coverage
- -coverage
- این گزینه برای کامپایل و پیوند دادن کدهای ابزارگذاریشده جهت تحلیل پوشش کد استفاده میشود. گزینههای -coverage و --coverage معادل هستند؛ هر دو مترادفی برای -fprofile-arcs -ftest-coverage (هنگام کامپایل) و -lgcov (هنگام پیوند دادن) میباشند. برای جزئیات بیشتر به مستندات آن گزینهها مراجعه کنید.
- فایلهای منبع را با -fprofile-arcs به همراه گزینههای بهینهسازی و تولید کد کامپایل کنید. برای تحلیل پوشش آزمون، از گزینه اضافی -ftest-coverage استفاده نمایید. نیازی به پروفایلسازی تمام فایلهای منبع در یک برنامه نیست.
- علاوه بر این، فایلهای منبع را با -fprofile-abs-path کامپایل کنید تا نام مسیرهای مطلق در فایلهای .gcno ایجاد شوند. این ویژگی به gcov اجازه میدهد در پروژههایی که کامپایل در دایرکتوریهای کاری متفاوتی انجام میشود، منابع صحیح را پیدا کند.
- فایلهای
شیء خود را
با -lgcov یا -fprofile-arcs
پیوند دهید
(گزینه دوم
متضمن
گزینه اول
است)..IP * 4
برنامه را
با یک بار
کاری نمونه
اجرا کنید
تا اطلاعات
پروفایل
کمان (arc)
ایجاد شود.
این کار را
میتوان به
هر تعداد
دفعه تکرار
کرد.
میتوانید
نمونههای
همروند
برنامه خود
را اجرا
کنید، و به
شرطی که
سیستم فایل
از
قفلگذاری
پشتیبانی
کند،
فایلهای
داده
بهدرستی
بهروزرسانی
خواهند شد.
مگر اینکه
یک گزینه
گویش دقیق ISO C
فعال باشد،
فراخوانیهای
"fork"
شناسایی
شده و بدون
شمارش
مضاعف،
بهدرستی
مدیریت
میشوند.
علاوه بر این، یک فایل شیء (object file) را میتوان چندین بار بازکامپایل کرد و تا زمانی که فایل منبع و گزینههای کامپایلر تغییر نکرده باشند، فایل .gcda متناظر ادغام میشود.
- برای بهینهسازیهای هدایتشده با پروفایل (profile-directed optimizations)، فایلهای منبع را دوباره با همان گزینههای بهینهسازی و تولید کد، به همراه -fbranch-probabilities کامپایل کنید.
- برای تحلیل پوشش آزمون، از gcov جهت تولید اطلاعات خوانا برای انسان از فایلهای .gcno و .gcda استفاده کنید. برای اطلاعات بیشتر به مستندات gcov مراجعه کنید.
با -fprofile-arcs، کامپایلر GCC برای هر تابع از برنامه شما یک گراف جریان برنامه ایجاد میکند، سپس یک درخت پوشا برای گراف مییابد. تنها کمانهایی که روی درخت پوشا نیستند باید ابزارگذاری (instrument) شوند: کامپایلر کدی را اضافه میکند تا تعداد دفعات اجرای این کمانها را بشمارد. هنگامی که یک کمان تنها خروجی یا تنها ورودی به یک بلوک باشد، کد ابزارگذاری میتواند به همان بلوک اضافه شود؛ در غیر این صورت، برای نگهداری کد ابزارگذاری باید یک بلوک پایهای (basic block) جدید ایجاد شود.
با -fcondition-coverage، کامپایلر GCC برای هر عبارت شرطی در برنامه شما یک مجموعهبیت (bitset) ایجاد کرده و مقادیر بولیِ آزمودهشدهای را که تأثیر مستقلی بر نتیجه آن عبارت دارند، ثبت میکند.
با -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
- شناسه فرآیند (process ID).
- %q{VAR}
- مقدار متغیر محیطی VAR.
- -fprofile-generate
- -fprofile-generate=path
- گزینههایی
را فعال
میکند که
معمولاً
برای
ابزارگذاری
برنامه به
منظور
تولید
پروفایل
مفید جهت
بازکامپایل
بعدی با
بهینهسازی
مبتنی بر
بازخورد
پروفایل
استفاده
میشوند.
شما باید از
-fprofile-generate هم در
هنگام
کامپایل و
هم در زمان
پیوند دادن
(link) برنامه
خود
استفاده
کنید.
گزینههای زیر فعال میشوند: -fprofile-arcs، -fprofile-values، -finline-functions و -fipa-bit-cp.
اگر path مشخص شده باشد، GCC برای یافتن فایلهای داده بازخورد پروفایل به path نگاه میکند. به -fprofile-dir مراجعه کنید.
برای بهینهسازی برنامه بر اساس اطلاعات پروفایل جمعآوریشده، از -fprofile-use استفاده کنید.
- -fprofile-info-section
- -fprofile-info-section=name
- اطلاعات
پروفایل را
به جای
استفاده از
سازنده/ویرانگر
(constructor/destructor)، در بخش
(section) مشخصشده
ثبت میکند.
نام بخش در
صورت مشخص
شدن name است،
در غیر این
صورت نام
بخش بهطور
پیشفرض
".gcov_info"
خواهد بود.
یک
اشارهگر
به اطلاعات
پروفایل
تولیدشده
توسط -fprofile-arcs
برای هر
واحد ترجمه
(translation unit) در بخش
مشخصشده
قرار
میگیرد.
این گزینه
ثبت
اطلاعات
پروفایل از
طریق یک
سازنده و
پردازش
اطلاعات
پروفایل از
طریق یک
ویرانگر را
غیرفعال
میکند. این
گزینه برای
استفاده در
محیطهای
میزبانیشده
(hosted) مانند GNU/Linux
در نظر
گرفته نشده
است. هدف آن
محیطهای
مستقل (freestanding)
(برای مثال
سیستمهای
نهفته) با
منابع
محدود است
که از
سازندهها/ویرانگرها
یا I/O فایل
کتابخانه C
پشتیبانی
نمیکنند.
پیونددهنده (linker) میتواند بخشهای ورودی را در یک بلوک پیوسته حافظه جمعآوری کرده و نمادهای آغاز و پایان را تعریف کند. یک نمونه اسکریپت پیونددهنده GNU که یک بخش خروجی پیونددهنده را تعریف میکند به شرح زیر است:
.gcov_info : { PROVIDE (__gcov_info_start = .); KEEP (*(.gcov_info)) PROVIDE (__gcov_info_end = .); }برنامه میتواند اطلاعات پروفایلسازی ثبتشده در این مجموعه پیونددهنده را برای مثال به این صورت تخلیه (dump) کند:
#include <gcov.h> #include <stdio.h> #include <stdlib.h> extern const struct gcov_info *const __gcov_info_start[]; extern const struct gcov_info *const __gcov_info_end[]; static void dump (const void *d, unsigned n, void *arg) { const unsigned char *c = d; forall (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) از تمامی فایلهای شیء پروژهٔ ساختهشده خواهد بود. این مسئله زمانی که دایرکتوریِ مورد استفاده برای ساخت باینریِ نشانهگذاریشده با دایرکتوری مورد استفاده برای ساخت باینریِ بهینهسازیشده با بازخورد پروفایل تفاوت دارد، مطلوب نیست؛ زیرا دادههای پروفایل در طول ساخت بهینهسازیشده یافت نخواهند شد. در چنین شرایطی، گزینهٔ -fprofile-prefix-path=path با اشارهٔ path به دایرکتوری پایهٔ ساخت، میتواند برای حذف بخش نامربوط مسیر و نسبی نگهداشتن تمامی نامهای فایل نسبت به دایرکتوری اصلی ساخت به کار رود.
- -fprofile-prefix-map=old=new
- هنگام کامپایل فایلهای واقع در دایرکتوری old، اطلاعات پروفایلسازی (با --coverage) را بهگونهای ثبت میکند که گویی این فایلها در دایرکتوری new قرار دارند. همچنین ببینید: -ffile-prefix-map و -fcanon-prefix-map.
- -fprofile-update=method
- تغییر روش
بهروزرسانی
برای
برنامهای
که جهت
بهینهسازی
بر پایهٔ
بازخورد
پروفایل
نشانهگذاری
شده است.
آرگومان method
باید یکی از
مقادیر single،
atomic یا prefer-atomic
باشد. مورد
اول برای
برنامههای
تکرشتهای
مفید است،
در حالی که
مورد دوم با
تولید کد
ریسهامن
(thread-safe)، از خراب
شدن
دادههای
پروفایل
جلوگیری
میکند.
هشدار: هنگامی که یک برنامه تمام رشتهها را بهدرستی الحاق (join) نکند (یا یک رشتهٔ مجزا/detached ایجاد کند)، فایل پروفایل ممکن است همچنان خراب شود.
استفاده از prefer-atomic، در صورت پشتیبانی توسط معماری مقصد به atomic و در غیر این صورت به single تبدیل میشود. درایور GCC در صورتی که -pthread در خط فرمان وجود داشته باشد بهطور خودکار prefer-atomic را انتخاب میکند، در غیر این صورت روش پیشفرض single است.
اگر atomic انتخاب شود، اطلاعات پروفایل بر پایهٔ «بیشترین تلاش» (best-effort) با استفاده از عملیاتهای اتمی بهروزرسانی میشوند. در حالت ایدهآل، اطلاعات پروفایل از طریق عملیاتهای اتمی در سختافزار بهروزرسانی میشوند. با این حال، اگر سکوی مقصد از عملیاتهای اتمی سختافزاری لازم پشتیبانی نکند ولی libatomic در دسترس باشد، اطلاعات پروفایل از طریق فراخوانیهای libatomic بهروزرسانی خواهد شد. چنانچه سکوی مقصد نه از عملیاتهای اتمی سختافزاری و نه از libatomic پشتیبانی کند، اطلاعات پروفایل بهصورت اتمی بهروزرسانی نمیشود و یک هشدار صادر خواهد شد. در این حالت، اطلاعات پروفایلسازی بهدستآمده برای برنامههای چندرشتهای ممکن است خراب باشد.
به دلایل کارایی، اگر شمارندههای ۶۴ بیتی برای اطلاعات پروفایلسازی استفاده شوند و سکوی مقصد تنها از عملیاتهای اتمی ۳۲ بیتی در سختافزار پشتیبانی کند، بهروزرسانیهای حساس از نظر کارایی با استفاده از دو عملیات اتمی ۳۲ بیتی برای هر بهروزرسانی شمارنده انجام میشوند. اگر یک سیگنال این دو عملیات بهروزرسانیِ یک شمارنده را قطع کند، ممکن است اطلاعات پروفایلسازی در وضعیتی ناسازگار قرار گیرد.
- -fprofile-filter-files=regex
- تنها
توابعی از
فایلها را
نشانهگذاری
میکند که
نام آنها
با هر یک از
عبارتهای
منظم (که با
نقطهویرگول
جدا
شدهاند)
مطابقت
داشته باشد.
برای مثال، -fprofile-filter-files=main\.c;module.*\.c تنها فایل main.c و تمام فایلهای C که با 'module' شروع میشوند را نشانهگذاری خواهد کرد.
- -fprofile-exclude-files=regex
- تنها
توابعی از
فایلها را
نشانهگذاری
میکند که
نام آنها
با هیچیک
از
عبارتهای
منظم (که با
نقطهویرگول
جدا
شدهاند)
مطابقت
نداشته
باشد.
برای مثال، -fprofile-exclude-files=/usr/.* از نشانهگذاری تمام فایلهایی که در پوشهٔ /usr/ قرار دارند جلوگیری میکند.
- -fprofile-reproducible=[multithreaded|parallel-runs|serial]
- سطح
تکرارپذیری
پروفایل
گردآوریشده
توسط
"-fprofile-generate" را
کنترل
میکند. این
امر ساخت
مجدد
برنامه با
خروجی
یکسان را
امکانپذیر
میسازد که
برای مثال
برای
بستههای
توزیع مفید
است.
با گزینهٔ -fprofile-reproducible=serial، پروفایل گردآوریشده توسط -fprofile-generate تکرارپذیر است، به شرطی که برنامهٔ آموزشدیده در هر بار فراخوانی اجرای آموزشی رفتار یکسانی داشته باشد، چندرشتهای نباشد و ارسال جریانی دادههای پروفایل همیشه به یک ترتیب انجام گیرد. توجه داشته باشید که ارسال جریانی پروفایل در پایان اجرای برنامه و همچنین قبل از فراخوانی تابع "fork" رخ میدهد.
توجه داشته باشید که بسیار معمول است تعداد دفعات اجرای برخی از بخشهای برنامهها، به عنوان مثال، به طول نام فایلهای موقت یا تصادفیسازی فضای حافظه (که ممکن است بر نرخ برخورد جدول هش تأثیر بگذارد) بستگی داشته باشد. این بخشهای تکرارناپذیر برنامهها را میتوان با صفت تابعی "no_instrument_function" علامتگذاری کرد. از gcov-dump به همراه -l میتوان برای تخلیهٔ (dump) دادههای جمعآوریشده و تأیید تکرارپذیر بودن آنها استفاده کرد.
با گزینهٔ -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=memtag-stack در حال
حاضر تنها
در ABIهای AArch64 با
اشارهگرهای
۶۴ بیتی
پشتیبانی
میشود.
هنگام کامپایل با -fsanitize=address، باید از -g نیز برای تولید خروجی معنادارتر استفاده کنید. برای دریافت ردیابی پشتهٔ (stack trace) دقیقتر، امکان استفاده از گزینههایی مانند -O0، -O1 یا -Og (که برای مثال از درونخطیسازی اکثر توابع جلوگیری میکنند)، -fno-optimize-sibling-calls (که از بهینهسازی فراخوانیهای همسطح و بازگشتی انتهایی جلوگیری میکند؛ این گزینه بهطور ضمنی برای -O0، -O1 یا -Og فعال است)، یا -fno-ipa-icf (که قابلیت Identical Code Folding را برای توابع غیرفعال میکند) وجود دارد. استفاده از -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 بهطور پیشفرض فعال نیستند. استفاده از برچسب فریم تصادفی برای نشانهگذاری هسته پیادهسازی نشده است.
- -fsanitize=memtag-stack
- استفاده از دستورالعملهای Memory Tagging Extension بهجای نشانهگذاری برای امکان تشخیص خطاهای حافظه. مشابه HWASAN، این نیز یک روش احتمالاتی است. این گزینه تنها در آن دسته از معماریهای AArch64 که از Memory Tagging Extensions پشتیبانی میکنند در دسترس است.
- -fsanitize=pointer-compare
- نشانهگذاری عملیاتهای مقایسه (<، <=، >، >=) با عملوندهای اشارهگر. این گزینه باید با یکی از گزینههای -fsanitize=kernel-address یا -fsanitize=address ترکیب شود. این گزینه را نمیتوان با -fsanitize=thread ترکیب کرد. نکته: بهطور پیشفرض، این بررسی در زمان اجرا غیرفعال است. برای فعالسازی آن، "detect_invalid_pointer_pairs=2" را به متغیر محیطی ASAN_OPTIONS اضافه کنید. استفاده از "detect_invalid_pointer_pairs=1" عملیات نامعتبر را تنها زمانی تشخیص میدهد که هر دو اشارهگر غیرتهی (non-null) باشند..IP -fsanitize=pointer-subtract 4 ابزارگذاری عمل تفریق با عملوندهای اشارهگر. این گزینه باید با -fsanitize=kernel-address یا -fsanitize=address ترکیب شود. این گزینه را نمیتوان با -fsanitize=thread ترکیب کرد. نکته: این بررسی بهطور پیشفرض در زمان اجرا غیرفعال است. برای فعال کردن آن، "detect_invalid_pointer_pairs=2" را به متغیر محیطی ASAN_OPTIONS اضافه کنید. استفاده از "detect_invalid_pointer_pairs=1" عملیات نامعتبر را تنها زمانی تشخیص میدهد که هر دو اشارهگر غیرتهی (non-null) باشند.
- -fsanitize=shadow-call-stack
- فعالسازی
ShadowCallStack،
سازوکاری
برای بهبود
امنیت
بهمنظور
محافظت از
برنامهها
در برابر
بازنویسی
آدرس
بازگشت
(مانند
سرریز بافر
پشته).
کارکرد آن
بدین صورت
است که آدرس
بازگشت
تابع را در
مقدمه تابع
(function prologue) در یک
پشته
فراخوانی
سایه که
بهصورت
جداگانه
تخصیص
یافته
ذخیره
میکند و
آدرس
بازگشت را
در مؤخره
تابع (function epilogue) از
پشته
فراخوانی
سایه
بازیابی
میکند.
ابزارگذاری
تنها در
توابعی رخ
میدهد که
نیاز به
ذخیره آدرس
بازگشت در
پشته دارند.
در حال حاضر این ویژگی فقط از بستر aarch64 پشتیبانی میکند. این ویژگی بهطور خاص برای هستههای لینوکسی طراحی شده است که گزینه CONFIG_SHADOW_CALL_STACK را فعال کردهاند. برای برنامههای فضای کاربر، پشتیبانی زمان اجرا در حال حاضر در libc و libgcc ارائه نشده است. کاربرانی که میخواهند از این ویژگی در فضای کاربر استفاده کنند باید خودشان پشتیبانی از زمان اجرا را فراهم آورند. باید توجه داشت که این کار ممکن است باعث نقض قواعد ABI شود.
در aarch64، ابزارگذاری از ثبات بستری "x18" استفاده میکند. این امر عموماً بدان معناست که هر کدی که ممکن است در همان رشتهای که کد کامپایلشده با ShadowCallStack اجرا میشود اجرا گردد، باید با پرچم -ffixed-x18 کامپایل شود؛ در غیر این صورت توابعی که بدون -ffixed-x18 کامپایل شدهاند ممکن است به "x18" آسیب رسانده و در نتیجه اشارهگر پشته سایه را خراب کنند.
همچنین، از آنجا که هیچ پشتیبانی زمان اجرایی در فضای کاربر وجود ندارد، کد کامپایلشده با 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، شناساگر نشت حافظه. این گزینه تنها برای پیوند زدن فایلهای اجرایی اهمیت دارد. فایل اجرایی با کتابخانهای پیوند میخورد که "malloc" و سایر توابع تخصیصدهنده را بازنویسی میکند. برای جزئیات بیشتر به https://github.com/google/sanitizers/wiki/AddressSanitizerLeakSanitizer مراجعه کنید. رفتار زمان اجرا را میتوان با استفاده از متغیر محیطی LSAN_OPTIONS تحت تأثیر قرار داد. این گزینه را نمیتوان با -fsanitize=thread ترکیب کرد.
- -fsanitize=undefined
- فعالسازی UndefinedBehaviorSanitizer، شناساگر سریع رفتار تعریفنشده. محاسبات گوناگونی برای تشخیص رفتار تعریفنشده در زمان اجرا ابزارگذاری میشوند. برای جزئیات بیشتر به 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
- این گزینه بررسی منفی نبودن آرگومان دوم عملیات شیفت و کوچکتر بودن آن از دقتِ اولین آرگومانِ ارتقایافته را فعال میکند.
- -fsanitize=shift-base
- در صورتی که آرگومان دوم عملیات شیفت در محدوده مجاز باشد، بررسی میکند که نتیجه عملیات شیفت تعریفنشده نباشد. توجه داشته باشید که تعریف دقیق رفتار تعریفنشده میان C و C++ و همچنین میان ISO C90 و C99 و غیره اندکی تفاوت دارد.
- -fsanitize=integer-divide-by-zero
- تشخیص تقسیم عدد صحیح بر صفر.
- -fsanitize=unreachable
- با این گزینه، کامپایلر فراخوانی "__builtin_unreachable" را در عوض به یک فراخوانی پیام عیبیابی تبدیل میکند. هنگام رسیدن به فراخوانی "__builtin_unreachable"، رفتار برنامه تعریفنشده است.
- -fsanitize=vla-bound
- این گزینه به کامپایلر دستور میدهد تا مثبت بودن اندازه آرایه با طول متغیر را بررسی کند.
- -fsanitize=null
- این گزینه بررسی اشارهگرها را فعال میکند. بهویژه، برنامهای که با فعال بودن این گزینه ساخته شده باشد، در صورتی که برای ارجاعزدایی از یک اشارهگر NULL تلاش کند، یا اگر یک ارجاع (احتمالاً یک ارجاع rvalue) به یک اشارهگر NULL مقید شود، یا اگر متدی روی شیئی فراخوانی شود که توسط اشارهگر NULL مورد اشاره قرار گرفته، پیام خطا صادر میکند.
- -fsanitize=return
- این گزینه بررسی عبارت بازگشت (return) را فعال میکند. برنامههایی که با فعال بودن این گزینه ساخته شوند، در صورت رسیدن به انتهای یک تابع غیر-void بدون بازگرداندن واقعی یک مقدار، پیام خطا صادر میکنند. این گزینه فقط در C++ کار میکند.
- -fsanitize=signed-integer-overflow
- این گزینه
بررسی
سرریز عدد
صحیح
علامتدار
را فعال
میکند.
بررسی
میشود که
نتیجه
"+"،
"*"، و هر
دو عملگر
یگانی و
دودویی
"-" در
محاسبات
علامتدار
سرریز نکند.
این گزینه
همچنین
تقسیم
علامتدار
"INT_MIN / -1" را
تشخیص
میدهد.
توجه داشته
باشید که
باید قواعد
ارتقای عدد
صحیح در نظر
گرفته شوند.
بدین معنا
که مورد زیر
سرریز
محسوب
نمیشود:
signed char a = SCHAR_MAX; a++;
- -fsanitize=bounds
- این گزینه ابزارگذاری حدود آرایه را فعال میکند. دسترسیهای گوناگون خارج از محدوده شناسایی میشوند. اعضای آرایه انعطافپذیر، آرایههای شبیه به عضو آرایه انعطافپذیر، و مقداردهندههای اولیه متغیرهای با حافظه ایستا ابزارگذاری نمیشوند، به استثنای آرایههای شبیه به عضو آرایه انعطافپذیر که گزینههای "-fstrict-flex-arrays" یا "-fstrict-flex-arrays=" یا ویژگیهای "strict_flex_array" مشخص میکنند که نباید با آنها مانند آرایههای شبیه به عضو آرایه انعطافپذیر رفتار شود.
- -fsanitize=bounds-strict
- این گزینه ابزارگذاری سختگیرانه حدود آرایه را فعال میکند. اکثر دسترسیهای خارج از محدوده شناسایی میشوند، از جمله آرایههای شبیه به عضو آرایه انعطافپذیر. مقداردهندههای اولیه متغیرهای با حافظه ایستا ابزارگذاری نمیشوند.
- -fsanitize=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" به عنوان نیازمند مقدار غیرتهی علامتگذاری شدهاند، ارسال نشوند.
- -fsanitize=returns-nonnull-attribute
- این گزینه ابزارگذاری دستورهای بازگشت (return) را در توابعی که با ویژگی تابعی "returns_nonnull" علامتگذاری شدهاند فعال میکند، تا بازگرداندن مقادیر تهی از چنین توابعی تشخیص داده شود.
- -fsanitize=bool
- این گزینه ابزارگذاری بارگذاریها از bool را فعال میکند. اگر مقداری غیر از 0/1 بارگذاری شود، یک خطای زمان اجرا صادر میگردد..IP -fsanitize=enum 4 این گزینه ابزارگذاری بارگذاریها از یک نوع enum را فعال میکند. اگر مقداری خارج از محدودهٔ مقادیر مجاز برای آن نوع شمارشی بارگذاری شود، یک خطای زمان اجرا صادر میگردد.
- -fsanitize=vptr
- این گزینه ابزارگذاری فراخوانی توابع عضو C++، دسترسی به اعضا و برخی تبدیلها میان اشارهگرهای کلاس پایه و مشتقشده را فعال میکند تا اطمینان حاصل شود شیء ارجاعشده نوع پویای (dynamic type) صحیحی دارد.
- -fsanitize=pointer-overflow
- این گزینه ابزارگذاری محاسبات اشارهگر را فعال میکند. اگر محاسبات اشارهگر سرریز کند، یک خطای زمان اجرا صادر میشود.
- -fsanitize=builtin
- این گزینه ابزارگذاری آرگومانهای توابع توکار (builtin) منتخب را فعال میکند. اگر مقدار نامعتبری به چنین آرگومانهایی ارسال شود، یک خطای زمان اجرا صادر میگردد. برای نمونه ارسال 0 به عنوان آرگومان به "__builtin_ctz" یا "__builtin_clz" موجب رفتار تعریفنشده شده و توسط این گزینه تشخیص داده میشود.
توجه داشته باشید که ضدعفونیکنندهها (sanitizers) تمایل به افزایش نرخ هشدارهای مثبت کاذب دارند، به ویژه مواردی پیرامون -Wmaybe-uninitialized. توصیه میکنیم از ترکیب -Werror با [استفاده از] ضدعفونیکنندهها خودداری کنید.
در حالی که -ftrapv موجب صدور تلهها (traps) برای سرریزهای علامتدار میشود، -fsanitize=undefined یک پیام تشخیصی صادر میکند. این قابلیت در حال حاضر تنها برای خانواده زبانهای C کار میکند.
- -fno-sanitize=all
- این گزینه تمام ضدعفونیکنندههایی را که پیشتر فعال شدهاند غیرفعال میکند. -fsanitize=all مجاز نیست، زیرا برخی از ضدعفونیکنندهها را نمیتوان به همراه یکدیگر استفاده کرد.
- -fasan-shadow-offset=number
- این گزینه GCC را وادار میکند تا در بررسیهای 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 نیز پذیرفته میشوند؛ اولی بازیابی را برای تمام ضدعفونیکنندههایی که از آن پشتیبانی میکنند فعال، و دومی بازیابی را برای تمام ضدعفونیکنندههای پشتیبانیکننده غیرفعال میسازد.
حتی اگر حالت بازیابی در سمت کامپایلر فعال شده باشد، باید در سمت کتابخانه زمان اجرا نیز فعال شود، در غیر این صورت شکستها همچنان مهلک خواهند بود. پیشفرض کتابخانه زمان اجرا برای ThreadSanitizer و UndefinedBehaviorSanitizer مقدار "halt_on_error=0" است، در حالی که مقدار پیشفرض برای AddressSanitizer برابر "halt_on_error=1" میباشد. این مقدار را میتوان با تنظیم پرچم "halt_on_error" در متغیر محیطی مربوطه بازنویسی کرد.
نحو بدون پارامتر صریح opts منسوخ شده است. این معادل مشخص کردن فهرست opts زیر است:
undefined,float-cast-overflow,float-divide-by-zero,bounds-strict
- -fsanitize-address-use-after-scope
- ضدعفونی متغیرهای محلی را برای شناسایی باگهای استفاده پس از پایان حوزه (use-after-scope) فعال میکند. این گزینه مقدار -fstack-reuse را روی none تنظیم میکند.
- -fsanitize-trap[=opts]
- گزینهٔ -fsanitize-trap=
به
کامپایلر
دستور
میدهد
برای
ضدعفونیکنندههای
ذکرشده در
فهرست
جداشده با
کامای opts،
رفتار
تعریفنشده
را به جای
روال
کتابخانهای
"libubsan" با
استفاده از
"__builtin_trap"
گزارش کند.
اگر این
گزینه برای
ضدعفونیکنندهٔ
خاصی فعال
شود، نسبت
به -fsanitizer-recover=
برای آن
ضدعفونیکننده
اولویت
دارد؛
"__builtin_trap"
صادر خواهد
شد و
صرفنظر از
این که
بازیابی با
استفاده از
-fsanitize-recover= فعال
یا غیرفعال
باشد، مهلک
خواهد بود.
مزیت این روش آن است که نیازی به کتابخانهٔ "libubsan" نیست و پیوند داده نمیشود، بنابراین حتی در محیطهای مستقل (freestanding) نیز قابل استفاده است.
در حال حاضر این ویژگی با -fsanitize=undefined (و زیرگزینههای آن به جز -fsanitize=vptr)، -fsanitize=float-cast-overflow، -fsanitize=float-divide-by-zero و -fsanitize=bounds-strict کار میکند. همچنین میتوان "-fsanitize-trap=all" را مشخص کرد که آن را برای زیرگزینههای "undefined"، -fsanitize=float-cast-overflow، -fsanitize=float-divide-by-zero و -fsanitize=bounds-strict فعال میسازد. اگر از "-fsanitize-trap=undefined" یا "-fsanitize-trap=all" استفاده شود و "-fsanitize=vptr" در خط فرمان فعال باشد، ابزارگذاری در سکوت نادیده گرفته میشود زیرا این ابزارگذاری همواره نیازمند پشتیبانی "libubsan" است؛ -fsanitize-trap=vptr مجاز نیست.
- -fsanitize-undefined-trap-on-error
- گزینهٔ -fsanitize-undefined-trap-on-error معادل منسوخشدهٔ -fsanitize-trap=all است.
- -fsanitize-coverage=trace-pc
- ابزارگذاری کد برای آزمون فاز هدایتشده با پوشش را فعال میکند. یک فراخوانی به "__sanitizer_cov_trace_pc" را در هر بلوک پایه درج مینماید.
- -fsanitize-coverage=trace-cmp
- ابزارگذاری کد برای آزمون فاز هدایتشده با جریان داده را فعال میکند. یک فراخوانی به "__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 یا جدیدتر کار میکند..IP -fharden-compares 4 برای هر آزمون منطقی که از بهینهسازیهای gimple باقی میماند و شرطی در یک انشعاب شرطی نیست (برای نمونه، شرطهایی که برای جابهجاییهای شرطی، یا برای ذخیره در متغیرهای بولی آزمایش میشوند)، کد اضافی برای محاسبه و اعتبارسنجی شرط معکوس، و فراخوانی "__builtin_trap" در صورت عدم تطابق نتایج، ایجاد میکند. برای پوشش دادن همهٔ عبارات شرطی، همراه با -fharden-conditional-branches استفاده شود.
- -fharden-conditional-branches
- برای هر انشعاب شرطی غیربرداری که از بهینهسازیهای gimple باقی میماند، کد اضافی برای محاسبه و اعتبارسنجی شرط معکوس، و فراخوانی "__builtin_trap" در صورت غیرمنتظره بودن نتیجه، تولید میکند. برای پوشش دادن همهٔ عبارات شرطی، همراه با -fharden-compares استفاده شود.
- -fharden-control-flow-redundancy
- کد اضافی
برای
مقداردهی
بولیها
هنگام ورود
به
بلوکهای
پایهای (basic
blocks)، و
اعتبارسنجی
و به دام
انداختن (trap)
در
خروجیهای
تابع در
هنگامی که
مقادیر
بولی مسیر
اجرایی
سازگاری با
گراف جریان
کنترل (CFG)
تشکیل
نمیدهند،
تولید
میکند.
اعتبارسنجی پیش از بازگشتها، پیش از فراخوانیهای پایانی اجباری (زیر را ببینید) و بهصورت اختیاری، پیش از استثناهای فرارکننده با -fhardcfr-check-exceptions، پیش از فراخوانیهای بازگرداننده با -fhardcfr-check-returning-calls، و پیش از فراخوانیهای noreturn با -fhardcfr-check-noreturn-calls انجام میشود.
بهینهسازی فراخوانی پایانی (Tail call optimization) بسیار دیر انجام میشود و نمیتواند بر افزونگی جریان کنترل تأثیر بگذارد، اما فراخوانیهایی که توسط فرانتاند زبان بهعنوان فراخوانیهای پایانی اجباری حاشیهنویسی شدهاند، و هر فراخوانی که به اندازهٔ کافی زود بهعنوان فراخوانی پایانی بالقوه علامتگذاری شده باشد نیز اعتبارسنجی پیش از فراخوانی خواهند داشت؛ هرچند این احتمالات صرفاً نظری هستند، چرا که این شرایط تنها هنگام استفاده از پلاگینهای سفارشی کامپایلر میتوانند محقق شوند.
- -fhardcfr-skip-leaf
- غیرفعال کردن -fharden-control-flow-redundancy در توابع برگ (leaf functions).
- -fhardcfr-check-exceptions
- هنگامی که -fharden-control-flow-redundancy فعال است، مسیر اجرایی ثبتشده را در نقاط فرار استثنا با گراف جریان کنترل بررسی میکند، بهگونهای که گویی بدنهٔ تابع با یک گردانندهٔ پاکسازی (cleanup handler) پوشانده شده است که بررسی را انجام داده و استثنا را دوباره پرتاب میکند. این گزینه بهطور پیشفرض فعال است؛ از -fno-hardcfr-check-exceptions برای غیرفعال کردن آن استفاده کنید.
- -fhardcfr-check-returning-calls
- هنگامی که
-fharden-control-flow-redundancy فعال
است، مسیر
اجرایی
ثبتشده را
پیش از هر
فراخوانی
تابعی که
بلافاصله
با
بازگرداندن
نتیجهٔ آن
(در صورت
وجود) دنبال
میشود، در
برابر گراف
جریان
کنترل
بررسی
میکند تا
مانع از
بهینهسازی
فراخوانی
پایانی
نشود، چه در
نهایت به یک
فراخوانی
پایانی
بهینهسازی
بشود یا
نشود.
این گزینه هر زمان که بهینهسازیهای فراخوانی همسطح فعال باشند (به -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) در نظر گرفته شده است، نه صرفاً در ساختهای اشکالزدایی.
در حال حاضر، -fhardened فقط روی اهداف GNU/Linux پشتیبانی میشود.
گزینهٔ -fhardened تنها در صورتی یک گزینهٔ مشخص را فعال میکند که از قبل در جایی از خط فرمان مشخص نشده باشد. برای نمونه، -fhardened -fstack-protector فقط -fstack-protector را فعال خواهد کرد، نه -fstack-protector-strong را.
- -fstack-protector
- کد اضافی برای بررسی سرریز بافر (buffer overflow)، مانند حملات تخریب پشته (stack smashing)، تولید میکند. این کار با افزودن یک متغیر نگهبان به توابع دارای اشیاء آسیبپذیر انجام میشود. این شامل توابعی است که "alloca" را فراخوانی میکنند، و توابعی با بافرهای بزرگتر یا مساوی ۸ بایت. نگهبانها هنگام ورود به تابع مقداردهی اولیه میشوند و سپس هنگام خروج تابع بررسی میگردند. اگر بررسی نگهبان شکست بخورد، یک پیام خطا چاپ شده و برنامه خارج میشود. فقط متغیرهایی در نظر گرفته میشوند که در عمل روی پشته تخصیص یافته باشند؛ متغیرهایی که با بهینهسازی حذف شدهاند یا متغیرهای تخصیصیافته در ثباتها به حساب نمیآیند.
- -fstack-protector-all
- مانند -fstack-protector است با این تفاوت که همهٔ توابع محافظت میشوند.
- -fstack-protector-strong
- مانند -fstack-protector است اما توابع بیشتری را برای محافظت در بر میگیرد --- آنهایی که تعاریف آرایهٔ محلی دارند، یا ارجاعاتی به آدرسهای فریم محلی دارند. فقط متغیرهایی که واقعاً روی پشته تخصیص داده شدهاند در نظر گرفته میشوند؛ متغیرهای حذفشده با بهینهسازی یا متغیرهای تخصیصیافته در ثباتها به حساب نمیآیند.
- -fstack-protector-explicit
- مانند -fstack-protector است اما تنها از توابعی محافظت میکند که ویژگی "stack_protect" را داشته باشند.
- -fstack-check
- تولید کدی
برای
اعتبارسنجی
اینکه از
محدودهٔ
پشته فراتر
نروید. اگر
در محیطی با
چندین رشته
(threads) در حال
اجرا
هستید،
باید این
پرچم را
مشخص کنید،
اما در یک
محیط
تکرشتهای
بهندرت
نیاز به
تعیین آن
دارید،
زیرا اگر
تنها یک
پشته وجود
داشته
باشد،
سرریز پشته
تقریباً
روی همهٔ
سیستمها
بهطور
خودکار
تشخیص داده
میشود.
توجه داشته باشید که این سوییچ در عمل باعث انجام بررسی نمیشود؛ سیستمعامل یا محیط زمان اجرای زبان باید این کار را انجام دهند. این سوییچ باعث تولید کدی میشود تا تضمین کند آنها متوجه گسترش یافتن پشته میشوند.
همچنین میتوانید یک پارامتر رشتهای تعیین کنید: no به معنای عدم بررسی است، generic به معنای اجبار به استفاده از بررسی سبک قدیمی است، و specific به معنای استفاده از بهترین روش بررسی است و معادل استفاده از -fstack-check بهتنهایی است.
بررسی سبک قدیمی سازوکاری عمومی است که نیازی به پشتیبانی خاصی از هدف در کامپایلر ندارد اما معایب زیر را به همراه دارد:
- 1.
- راهبرد تخصیص تغییریافته برای اشیاء بزرگ: اگر اندازهٔ آنها از یک آستانهٔ ثابت فراتر رود، همواره بهصورت پویا تخصیص مییابند. توجه داشته باشید این ممکن است معناشناسی برخی از کدها را تغییر دهد.
- 2.
- محدودیت ثابت در اندازهٔ فریم ایستای توابع: هنگامی که یک تابع خاص از این مقدار فراتر رود، بررسی پشته قابل اعتماد نخواهد بود و هشداری توسط کامپایلر صادر میشود.
- 3.
- ناکارآمدی: به دلیل هر دو موردِ راهبرد تخصیص تغییریافته و پیادهسازی عمومی، کارایی کد دچار افت میشود.
توجه داشته باشید که اگر پشتیبانی از هدف در کامپایلر افزوده نشده باشد، بررسی سبک قدیمی پشته روش پشتیبان (fallback) برای specific نیز هست.
گزینهٔ -fstack-check= برای نیازهای زبان Ada بهمنظور تشخیص بازگشت بینهایت و سرریزهای پشته طراحی شده است. specific هنگام کامپایل کد Ada یک انتخاب عالی است. این گزینه بهطور کلی برای محافظت در برابر حملات stack-clash کافی نیست. برای محافظت در برابر آنها به -fstack-clash-protection نیاز دارید. تولید کد برای جلوگیری از حملات به سبک تداخل پشته (stack clash). هنگامی که این گزینه فعال باشد، کامپایلر در هر زمان تنها یک صفحه از فضای پشته را تخصیص میدهد و بلافاصله پس از تخصیص به هر صفحه دسترسی پیدا میکند. بدینترتیب، از پریدن تخصیصها از روی هرگونه صفحهٔ محافظ پشته (stack guard page) ارائهشده توسط سیستمعامل جلوگیری میکند.
بیشتر معماریهای مقصد بهطور کامل از محافظت در برابر تداخل پشته پشتیبانی نمیکنند. با این حال، در آن مقصدها -fstack-clash-protection از تخصیصهای پویای پشته محافظت خواهد کرد. همچنین اگر معماری مقصد از -fstack-check=specific پشتیبانی کند، -fstack-clash-protection ممکن است محافظت محدودی برای تخصیصهای ایستای پشته نیز فراهم آورد.
- -fstack-limit-register=reg
- -fstack-limit-symbol=sym
- -fno-stack-limit
- تولید کد
برای
اطمینان از
اینکه
پشته از یک
مقدار مشخص
فراتر
نرود؛ این
مقدار
میتواند
مقدار یک
ثبات (register) یا
نشانی یک
نماد (symbol)
باشد. اگر
پشتهٔ
بزرگتری
مورد نیاز
باشد، در
زمان اجرا
یک سیگنال
صادر
میشود.
برای بیشتر
معماریهای
مقصد، این
سیگنال قبل
از اینکه
پشته از مرز
تجاوز کند
صادر
میشود،
بنابراین
گرفتن
سیگنال
بدون نیاز
به تمهیدات
ویژه
امکانپذیر
است.
برای نمونه، اگر پشته از نشانی مطلق 0x80000000 آغاز شده و رو به پایین رشد کند، میتوانید از پرچمهای -fstack-limit-symbol=__stack_limit و -Wl,--defsym,__stack_limit=0x7ffe0000 برای اعمال یک محدودیت پشتهٔ 128KB استفاده کنید. توجه داشته باشید که این ممکن است تنها با پیونددهندهٔ GNU کار کند.
میتوانید با استفاده از صفت تابع "no_stack_limit"، بررسی حد پشته را بهطور محلی لغو کنید.
- -fsplit-stack
- تولید کد
برای تقسیم
خودکار
پشته پیش از
سرریز شدن
آن. برنامه
حاصل دارای
یک پشتهٔ
ناپیوسته
خواهد بود
که تنها در
صورتی
میتواند
سرریز شود
که برنامه
قادر به
تخصیص
حافظهٔ
بیشتری
نباشد. این
گزینه
بهویژه
هنگام
اجرای
برنامههای
چندنخی (threaded)
بسیار مفید
است، چرا که
دیگر نیازی
به محاسبهٔ
اندازهٔ
مناسب پشته
برای هر نخ
نخواهد بود.
این قابلیت
در حال حاضر
تنها برای
مقصدهای x86
در حال اجرا
روی GNU/Linux
پیادهسازی
شده است.
هنگامی که کد کامپایلشده با -fsplit-stack کدی را فراخوانی میکند که بدون -fsplit-stack کامپایل شده است، ممکن است فضای پشتهٔ چندانی برای اجرای کد دوم در دسترس نباشد. اگر کامپایل کردن تمام کدها، از جمله کدهای کتابخانهای با -fsplit-stack مقدور نباشد، پیونددهنده میتواند این فراخوانیها را اصلاح کند تا کدی که بدون -fsplit-stack کامپایل شده است، همواره یک پشتهٔ بزرگ داشته باشد. پشتیبانی از این قابلیت در پیونددهندهٔ gold در نگارش 2.21 از GNU Binutils و نسخههای بعدی پیادهسازی شده است.
- -fstrub=disable
- پاکسازی پشته (stack scrubbing) را بهطور کامل غیرفعال میکند و هرگونه صفت "strub" را نادیده میگیرد.
- -fstrub=strict
- حالت پیشفرض توابع را در حالت "disabled" برای "strub" قرار میدهد و این محدودیت را بهطور سختگیرانه اعمال میکند که تنها توابع مرتبط با حالتهای قابل فراخوانیِ "strub" (شامل "at-calls"، "callable" و "always_inline" "internal") توسط توابعی که حالتهای فعالشدهٔ "strub" ("at-calls" و "internal") دارند، قابل فراخوانی ("callable") باشند.
- -fstrub=relaxed
- تنظیمات پیشفرض پاکسازی پشته ("strub") را بازمیگرداند؛ بدین معنا که "strub" تنها بنا بر صفتهای "strub" مرتبط با توابع و انواع داده فعال میشود. حالت "Relaxed" به این معنی است که بافتهای strub تنها از فراخوانی توابعی که صراحتاً با حالت "disabled" برای "strub" مرتبط هستند منع میشوند. این گزینه تنها برای لغو سایر گزینههای -fstrub=* که پیش از آن در خط فرمان آمدهاند مفید است.
- -fstrub=at-calls
- حالت "at-calls" را برای "strub" در مواردی که امکانپذیر باشد فعال میکند. کاربرد اصلی این گزینه برای آزمودن است. این گزینه سازوکار "strub" را در سناریوهایی که کاملاً محلی در یک واحد ترجمه (translation unit) هستند به کار میگیرد. این حالت "strub" رابطهای توابع را تغییر میدهد، بنابراین هر تابعی که برای سایر واحدهای ترجمه قابل مشاهده باشد، یا نشانی آن گرفته شده باشد، تحت تأثیر این گزینه قرار نخواهد گرفت. گزینههای بهینهسازی نیز ممکن است بر امکانپذیر بودن تأثیر بگذارند. برای جزئیات مربوط به شرایط امکانپذیری و واجد شرایط بودن، مستندات صفت "strub" را ببینید.
- -fstrub=internal
- حالت "internal" را برای "strub" در مواردی که امکانپذیر باشد فعال میکند. کاربرد اصلی این گزینه برای آزمودن است. هدف این گزینه آزمودن و بهکارگیری کامل بخشهایی از سازوکار "strub" است که حالت کمبازدهتر اما نگهدارندهٔ رابط (interface-preserving) برای "strub" را پیادهسازی میکنند. توابعی که تحت تأثیر این گزینه قرار نگیرند، بسیار نادر هستند.
- -fstrub=all
- یک حالت "strub" را در مواردی که امکانپذیر باشد فعال میکند. هنگامی که هر دو حالت strub امکانپذیر باشند، "at-calls" ترجیح داده میشود. گزینهٔ -fdump-ipa-strubm صفتهای تابعی اضافه میکند که مشخص میکنند چه حالتی برای هر تابع انتخاب شده است. کاربرد اصلی این گزینه برای آزمودن است تا سازوکار "strub" را بهطور کامل به کار بگیرد.
- -fvtable-verify=[std|preinit|none]
- این گزینه
تنها هنگام
کامپایل
کردن کدهای
++C در دسترس
است. این
گزینه
قابلیت
امنیتیای
را روشن (یا
خاموش، در
صورت
استفاده از
-fvtable-verify=none)
میکند که
در زمان
اجرا، برای
هر
فراخوانی
مجازی،
معتبر بودن
اشارهگر 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
- تولید
فراخوانیهای
سنجش کد (instrumentation)
برای ورود و
خروج به
توابع. درست
پس از ورود
به تابع و
درست پیش از
خروج از آن،
توابع
پروفایلسازی
زیر با
نشانی تابع
فعلی و محل
فراخوانی
آن
فراخوانی
میشوند.
(در برخی
پلتفرمها،
"__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" را اختصاص داد، که در این صورت این سنجش کد انجام نمیشود. این صفت میتواند برای مثال برای توابع پروفایلسازی فهرستشده در بالا، روالهای وقفه با اولویت بالا، و هر تابعی که توابع پروفایلسازی را نتوان با اطمینان از درون آن فراخوانی کرد (احتمالاً گردانندههای سیگنال، در صورتی که روالهای پروفایلسازی خروجی تولید کنند یا حافظه تخصیص دهند) استفاده شود..IP -finstrument-functions-once 4 این گزینه مشابه -finstrument-functions است، اما توابع تحلیل کارایی (profiling) تنها یکبار بهازای هر تابع ابزارگذاریشده فراخوانی میشوند؛ یعنی اولین تابع تحلیل کارایی پس از اولین ورود به تابع ابزارگذاریشده و دومین تابع تحلیل کارایی پیش از خروج متناظر با این ورودِ اول فراخوانی میشود.
تعریف "once" (یکبار) برای هدف این گزینه کمی مبهم است زیرا پیادهسازی در برابر رقابت دادهای (data race) محافظت نشده است. در نتیجه، این پیادهسازی فقط تضمین میکند که توابع تحلیل کارایی حداقل یکبار بهازای هر فرآیند و حداکثر یکبار بهازای هر ریسه (thread) فراخوانی شوند، اما فراخوانیها همواره جفت هستند؛ یعنی اگر یک ریسه تابع اول را فراخوانی کند، تابع دوم را نیز فراخوانی خواهد کرد، مگر آنکه هرگز به نقطهٔ خروج تابع ابزارگذاریشده نرسد.
- -finstrument-functions-exclude-file-list=file,file,...
- فهرست
فایلهایی
را تعیین
میکند که
توابع
موجود در
آنها از
ابزارگذاری
مستثنی
میشوند
(توضیحات
-finstrument-functions را
ببینید).
اگر فایلی
که حاوی
تعریف یک
تابع است با
یکی از fileها
مطابقت
داشته
باشد، آن
تابع
ابزارگذاری
نمیشود.
این مطابقت
بر اساس
زیررشته
انجام
میشود: اگر
پارامتر file
زیررشتهای
از نام فایل
باشد، یک
تطابق در
نظر گرفته
میشود.
برای مثال:
-finstrument-functions-exclude-file-list=/bits/stl,include/sys
هر تابع درونخطی (inline) تعریفشده در فایلهایی را که مسیر آنها شامل /bits/stl یا include/sys باشد، مستثنی میکند.
اگر به هر دلیلی میخواهید نویسهٔ , را در یکی از symها قرار دهید، , را بنویسید. برای مثال، -finstrument-functions-exclude-file-list=',,tmp' (به کوتیشن تکی احاطهکنندهٔ گزینه توجه کنید).
- -finstrument-functions-exclude-function-list=sym,sym,...
- این گزینه مشابه -finstrument-functions-exclude-file-list است، اما این گزینه فهرستی از نامهای توابع را برای مستثنی شدن از ابزارگذاری تنظیم میکند. نام تابعی که باید مطابقت داده شود، نام قابلمشاهده برای کاربرِ آن است، مانند "vector<int> blah(const vector<int> &)"، نه نام درهمریختهٔ داخلی (مانند "_Z4blahRSt6vectorIiSaIiEE"). این مطابقت بر روی زیررشتهها انجام میشود: اگر پارامتر sym زیررشتهای از نام تابع باشد، یک تطابق در نظر گرفته میشود. برای شناسههای گسترشیافتهٔ C99 و C++، نام تابع باید در قالب UTF-8 مشخص شود، نه با استفاده از نامهای نویسهٔ عمومی (universal character names).
- -fpatchable-function-entry=N[,M]
- تعداد N
دستور NOP را
درست در
آغاز هر
تابع تولید
میکند،
بهطوری که
نقطهٔ ورود
تابع پیش از
Mامین NOP
قرار
میگیرد.
اگر M حذف
شود، مقدار
پیشفرض آن
0 است،
بنابراین
نقطهٔ ورود
تابع
دقیقاً به
آدرسِ
نخستین NOP
اشاره
میکند.
دستورهای NOP
فضای
اضافهای
را رزرو
میکنند که
در صورت
قابلنوشتن
بودن سگمنت
کد،
میتوان از
آن برای
وصلهکردن
هر
ابزارگذاری
دلخواهی در
زمان اجرا
استفاده
کرد. میزان
فضا بهطور
غیرمستقیم
از طریق
تعداد NOPها
قابل کنترل
است؛ دستور
NOP
استفادهشده
متناظر با
دستوری است
که توسط
رابط داخلی
بکاند 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 هستند..SS "گزینههای کنترل پیشپردازنده (Options Controlling the Preprocessor)" این گزینهها پیشپردازندهٔ C را کنترل میکنند، که پیش از کامپایل واقعی روی هر فایل منبع C اجرا میشود.
اگر از گزینهٔ -E استفاده کنید، هیچ کاری بهجز پیشپردازش انجام نمیشود. برخی از این گزینهها تنها همراه با -E معنا دارند، زیرا باعث میشوند خروجی پیشپردازنده برای کامپایل واقعی نامناسب باشد.
افزون بر گزینههای فهرستشده در اینجا، تعدادی گزینه برای مهار مسیرهای جستجوی فایلهای include وجود دارد که در Directory Options مستند شدهاند. گزینههای مربوط به کنترل پیامهای تشخیصی پیشپردازنده نیز در Warning Options فهرست شدهاند.
- -D name
- --define-macro=name
- --define-macro name
- تعریف پیشفرض name به عنوان یک ماکرو، با مقدار 1.
- -D name=definition
- --define-macro=name=definition
- --define-macro name=definition
- محتوای definition
نشانهگذاری
(tokenize) شده و
طوری
پردازش
میشود که
گویی در فاز
سوم ترجمه
در یک
دستورالعمل
#define ظاهر شده
است.
بهویژه،
این تعریف
با
نویسههای
خطجدیدِ
درون آن
کوتاهسازی
میشود.
اگر پیشپردازنده را از یک شل یا برنامهای شبیه به شل فراخوانی میکنید، ممکن است لازم باشد از نحو نقلقول (quoting) شل برای محافظت از نویسههایی مانند فاصلهها که در نحو شل معنای خاصی دارند استفاده کنید.
اگر میخواهید یک ماکروی شبیه به تابع (function-like) را در خط فرمان تعریف کنید، فهرست آرگومانهای آن را درون پرانتزها پیش از علامت مساوی (در صورت وجود) بنویسید. پرانتزها برای بیشتر شلها معنادار هستند، بنابراین باید این گزینه را درون نقلقول قرار دهید. در sh و csh، عبارت -D'name(args...)=definition' کار میکند.
گزینههای -D و -U به همان ترتیبی که در خط فرمان داده شدهاند پردازش میشوند. تمام گزینههای -imacros file و -include file پس از تمام گزینههای -D و -U پردازش میشوند.
- -U name
- --undefine-macro=name
- --undefine-macro name
- هر تعریف قبلی از name را، چه توکار باشد و چه با گزینهٔ -D ارائه شده باشد، لغو میکند.
- -include file
- --include=file
- --include file
- پردازش file
بهگونهای
که گویی
عبارت "#include
"file"" به
عنوان
نخستین خط
فایل منبع
اصلی آمده
است. با این
حال،
نخستین
دایرکتوری
جستجو شده
برای file،
دایرکتوری
کاری
پیشپردازنده
است به جای
دایرکتوری
حاوی فایل
منبع اصلی.
اگر آنجا
پیدا نشود،
به صورت
عادی در
بقیهٔ
زنجیرهٔ
جستجوی
"#include "...""
جستجو
میشود.
اگر چندین گزینهٔ -include داده شود، فایلها به همان ترتیبی که در خط فرمان آمدهاند گنجانده میشوند.
- -imacros file
- --imacros=file
- --imacros file
- دقیقاً
مانند -include
عمل
میکند، با
این تفاوت
که هرگونه
خروجی
تولید شده
حاصل از
بررسی و
پیمایش file
دور ریخته
میشود.
ماکروهایی
که در آن
تعریف
میشوند
همچنان
تعریفشده
باقی
میمانند.
این قابلیت
به شما
امکان
میدهد تا
تمام
ماکروها را
از یک فایل
سرایند (header)
دریافت
کنید بدون
آنکه
تعاریف (declarations)
آن نیز
پردازش
شوند.
تمام فایلهای مشخصشده توسط -imacros پیش از تمام فایلهای مشخصشده توسط -include پردازش میشوند.
- -undef
- هیچیک از ماکروهای مخصوص سیستم یا مختص GCC را از پیش تعریف نمیکند. ماکروهای استاندارد از پیش تعریفشده همچنان تعریفشده باقی میمانند.
- -pthread
- ماکروهای اضافی مورد نیاز برای استفاده از کتابخانهٔ ریسههای پازیکس (POSIX threads) را تعریف میکند. باید از این گزینه بهطور پیوسته هم برای کامپایل و هم برای پیونددهی (linking) استفاده کنید. این گزینه روی اهداف GNU/Linux، بیشتر مشتقات دیگر یونیکس، و همچنین روی اهداف x86 Cygwin و MinGW پشتیبانی میشود.
- -M
- --dependencies
- به جای
خروجی دادن
نتیجهٔ
پیشپردازش،
یک قاعدهٔ
مناسب برای
make خروجی
میدهد که
وابستگیهای
فایل منبع
اصلی را
توصیف
میکند.
پیشپردازنده
یک قاعدهٔ
make شامل نام
فایل شیء (object file)
برای آن
فایل منبع،
یک دونقطه،
و نام تمام
فایلهای
گنجاندهشده
(از جمله
مواردی که
از
گزینههای
خط فرمان -include
یا -imacros
میآیند)
تولید
میکند.
مگر آنکه بهطور صریح (با -MT یا -MQ) مشخص شده باشد، نام فایل شیء متشکل از نام فایل منبع است که پسوند آن با پسوند فایل شیء جایگزین شده و تمام بخشهای دایرکتوری ابتدای آن حذف شدهاند. اگر فایلهای گنجاندهشده زیادی وجود داشته باشند، قاعده با استفاده از ترکیب \-خطجدید به چند خط شکسته میشود. این قاعده هیچ دستوری ندارد.
این گزینه خروجی اشکالزدایی پیشپردازنده، مانند -dM را متوقف نمیکند. برای جلوگیری از تداخل چنین خروجیهای اشکالزدایی با قواعد وابستگی، باید صریحاً فایل خروجی وابستگی را با -MF مشخص کنید، یا از یک متغیر محیطی مانند DEPENDENCIES_OUTPUT استفاده نمایید. خروجی اشکالزدایی همچنان طبق معمول به جریان خروجی عادی فرستاده میشود.
ارسال -M به راهانداز (driver) مستلزم اعمال -E است، و هشدارها را با یک -w ضمنی نادیده میگیرد.
- -MM
- --user-dependencies
- مانند -M
است اما
فایلهای
سرایند
موجود در
دایرکتوریهای
سرایند
سیستم، و
نیز
فایلهای
سرایندی را
که بهطور
مستقیم یا
غیرمستقیم
از چنین
سرایندی
فراخوانی
شدهاند،
ذکر
نمیکند.
این بدان معناست که انتخاب علامتهای کوچکتر/بزرگتر یا گیومه در دستورالعمل #include بهخودیخود تعیینکنندهٔ نمایش آن سرایند در خروجی وابستگی -MM نیست.
- -MF file
- هنگامی که
همراه با -M
یا -MM
استفاده
شود، فایلی
را برای
نوشتن
وابستگیها
مشخص
میکند. اگر
هیچ گزینهٔ
-MF داده
نشود،
پیشپردازنده
قواعد را به
همان جایی
ارسال
میکند که
خروجی
پیشپردازششده
را ارسال
میکرد.
هنگامی که همراه با گزینههای راهانداز -MD یا -MMD استفاده شود، -MF فایل خروجی پیشفرض وابستگی را بازنویسی میکند.
اگر file برابر با - باشد، وابستگیها در stdout نوشته میشوند.
- -MG
- --print-missing-file-dependencies
- در همراهی
با
گزینهای
مانند -M که
درخواست
تولید
وابستگی
دارد، -MG
فرض میکند
که
فایلهای
سرایند
ناموجود
فایلهای
تولیدشده
(تولیدشونده)
هستند و
آنها را
بدون ایجاد
خطا به
فهرست
وابستگی
میافزاید.
نام فایل
وابستگی
مستقیماً
از
دستورالعمل
"#include"
بدون
افزودن هیچ
مسیری
استخراج
میشود.
همچنین -MG
خروجی
پیشپردازششده
را متوقف
میکند،
زیرا
ناموجود
بودن یک
فایل
سرایند آن
را
بیفایده
میسازد.
این ویژگی در بهروزرسانی خودکار makefileها به کار میرود.
- -Mno-modules
- غیرفعال کردن تولید وابستگی برای رابطهای ماژول کامپایلشده (compiled module interfaces).
- -MP
- این گزینه
به CPP دستور
میدهد تا
یک هدف
ساختگی (phony target)
برای هر
وابستگی
غیر از فایل
اصلی اضافه
کند، به
طوری که هر
یک از آنها
به هیچچیز
وابسته
نباشد. این
قواعد صوری
خطاهایی را
که make در
صورت حذف
فایلهای
سرایند
بدون
بهروزرسانی
متناظر Makefile
صادر
میکند،
دور
میزنند.
این یک خروجی نمونه است: test.o: test.c test.h test.h:
- -MT target
- هدف قاعده
صادرشده بر
اثر ایجاد
وابستگی را
تغییر
میدهد.
بهطور
پیشفرض، CPP
نام فایل
ورودی اصلی
را
برداشته،
مؤلفههای
دایرکتوری
و هر پسوند
فایل مانند
.c را حذف
میکند، و
پسوند فایل
شیء (object) معمول
پلتفرم را
به آن
میافزاید.
حاصل این
کار، هدف
خواهد بود.
گزینه -MT هدف را دقیقاً برابر با رشتهای که مشخص میکنید تنظیم میکند. اگر چند هدف میخواهید، میتوانید آنها را در قالب یک آرگومان واحد به -MT بدهید، یا از چندین گزینه -MT استفاده کنید.
برای مثال، -MT '$(objpfx)foo.o' ممکن است چنین نتیجهای بدهد:
$(objpfx)foo.o: foo.c
- -MQ target
- مشابه -MT
است، اما هر
نویسهای
را که برای Make
معنای خاصی
دارد،
نقلقول
(کوتیشن)
میکند.
دستور
-MQ '$(objpfx)foo.o'
نتیجه
میدهد:
$$(objpfx)foo.o: foo.c
هدف پیشفرض بهصورت خودکار نقلقول میشود، گویی با -MQ مشخص شده باشد.
- -MD
- --write-dependencies
- -MD معادل -M -MF
file است، با
این تفاوت
که -E
بهطور
ضمنی اعمال
نمیشود.
گرداننده (driver)
مقدار file را
بر این اساس
که آیا
گزینه -o
داده شده
است یا خیر
تعیین
میکند. اگر
داده شده
باشد،
گرداننده
از آرگومان
آن اما با
پسوند .d
استفاده
میکند؛ در
غیر این
صورت، نام
فایل ورودی
را گرفته،
مؤلفههای
دایرکتوری
و پسوند آن
را حذف کرده
و یک پسوند
.d به آن
اعمال
میکند.
اگر -MD همراه با -E استفاده شود، هر سوییچ -o مشخصکننده فایل خروجی وابستگی در نظر گرفته میشود، اما در صورت استفاده بدون -E، هر -o مشخصکننده یک فایل شیء هدف فهمیده میشود.
از آنجا که -E ضمنی نیست، میتوان از -MD برای ایجاد یک فایل خروجی وابستگیها به عنوان یک اثر جانبی از فرآیند کامپایل استفاده کرد.
- -MMD
- --write-user-dependencies
- مشابه -MD است، بهجز اینکه تنها فایلهای سرایند کاربر را ذکر میکند، نه فایلهای سرایند سیستم را.
- -fpreprocessed
- به
پیشپردازنده
نشان
میدهد که
فایل ورودی
قبلاً
پیشپردازش
شده است.
این امر
مواردی
مانند
گسترش
ماکرو،
تبدیل
سهنویسهها
(trigraphs)، الحاق
خطوط جدید
فرار
دادهشده (escaped
newline splicing) و
پردازش
بیشتر
دستورالعملها
(directives) را لغو
میکند.
پیشپردازنده
همچنان
یادداشتها
(کامنتها)
را شناسایی
و حذف
میکند،
بهطوری که
میتوانید
فایلی را که
با -C
پیشپردازش
شده است
بدون مشکل
به
کامپایلر
ارسال کنید.
در این
حالت،
پیشپردازنده
یکپارچه
چیزی بیش از
یک
نشانهگذار
(tokenizer) برای
فرانتاندها
نیست.
اگر فایل ورودی یکی از پسوندهای .i، .ii یا .mi را داشته باشد، -fpreprocessed ضمنی است. اینها همان پسوندهایی هستند که GCC برای فایلهای پیشپردازششده ایجادشده توسط -save-temps استفاده میکند.
- -fdirectives-only
- هنگام
پیشپردازش،
دستورالعملها
(directives) را
پردازش
میکند،
اما
ماکروها را
گسترش
نمیدهد.
رفتار این گزینه به گزینههای -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 را مشخص میکند. پیشفرض ۲۰۰ است.
- -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
- فاصله بین ایستگاههای تب (tab stops) را مشخص میکند. این گزینه به پیشپردازنده کمک میکند تا شماره ستونهای درستی را در هشدارها یا خطاها گزارش کند، حتی اگر تبها در خط وجود داشته باشند. اگر مقدار کمتر از ۱ یا بیشتر از ۱۰۰ باشد، گزینه نادیده گرفته میشود. مقدار پیشفرض ۸ است.
- -ftrack-macro-expansion[=level]
- موقعیت
توکنها را
در طول
گسترش
ماکروها
ردگیری
میکند. این
قابلیت به
کامپایلر
اجازه
میدهد
هنگامی که
خطای
کامپایل در
گسترش
ماکرو رخ
میدهد،
پیامهای
تشخیصی
درباره
پشته گسترش
ماکروی
فعلی صادر
کند.
استفاده از
این گزینه
باعث
میشود
پیشپردازنده
و کامپایلر
حافظه
بیشتری
مصرف کنند.
از پارامتر
level میتوان
برای
انتخاب سطح
دقت ردگیری
مکان
توکنها
استفاده
کرد و در
صورت لزوم
مصرف حافظه
را کاهش
داد. مقدار
0 برای level
این گزینه
را غیرفعال
میکند.
مقدار 1
مکان
توکنها را
در حالتی
تقلیلیافته
بهمنظور
کمترین
سربار
حافظه
ردگیری
میکند. در
این حالت،
تمام
توکنهای
حاصل از
گسترش یک
آرگومان
ماکروی
تابعگونه
موقعیت
یکسانی
خواهند
داشت. مقدار
2 مکان
توکنها را
بهطور
کامل
ردگیری
میکند. این
مقدار
بیشترین
مصرف حافظه
را دارد.
هنگامی که
هیچ
آرگومانی
به این
گزینه داده
نشود،
مقدار
پیشفرض
پارامتر 2
است.
توجه داشته باشید که "-ftrack-macro-expansion=2" بهطور پیشفرض فعال است.
- -fmacro-prefix-map=old=new
- هنگام پیشپردازش فایلهای مستقر در دایرکتوری old، ماکروهای "__FILE__" و "__BASE_FILE__" را طوری گسترش میدهد که گویی فایلها در دایرکتوری new قرار دارند. از این گزینه میتوان برای تبدیل یک مسیر مطلق به یک مسیر نسبی با استفاده از . برای new استفاده کرد، که منجر به ساختهای تکرارپذیرتر و مستقل از مکان میشود. این گزینه بر "__builtin_FILE()" نیز در حین کامپایل تأثیر میگذارد. همچنین ببینید: -ffile-prefix-map و -fcanon-prefix-map.
- -fexec-charset=charset
- مجموعهنویسه اجرایی را که برای ثابتهای رشتهای و نویسهای استفاده میشود، تنظیم میکند. مقدار پیشفرض UTF-8 است. charset میتواند هر رمزگذاریِ پشتیبانیشده توسط روتین کتابخانه "iconv" سیستم باشد.
- -fwide-exec-charset=charset
- مجموعهنویسه اجرایی عریض را که برای ثابتهای رشتهای و نویسهای عریض به کار میرود، تعیین میکند. مقدار پیشفرض یکی از UTF-32BE، UTF-32LE، UTF-16BE یا UTF-16LE است؛ هر کدام که با پهنای "wchar_t" و ترتیب بایت big-endian یا little-endian به کار رفته برای تولید کد مطابقت داشته باشد. همانند -fexec-charset، charset میتواند هر رمزگذاریِ پشتیبانیشده توسط روتین کتابخانه "iconv" سیستم باشد؛ با این حال، با رمزگذاریهایی که دقیقاً در "wchar_t" جا نمیشوند دچار مشکل خواهید شد.
- -finput-charset=charset
- مجموعهنویسه
ورودی را
تنظیم
میکند که
برای تبدیل
از
مجموعهنویسه
فایل ورودی
به
مجموعهنویسه
منبع
استفادهشده
توسط GCC به
کار میرود.
مقدار
پیشفرض UTF-8
است. charset
میتواند
هر
رمزگذاریِ
پشتیبانیشده
توسط روتین
کتابخانه
"iconv"
سیستم باشد.
اگر مجموعهنویسه ورودی UTF-8 باشد، در صورت فعال بودن -Winvalid-utf8، هشدارهایی درباره توالیهای بدشکل واحدِ کد (code unit sequences) صادر میشود. در غیر این صورت، وقتی مجموعهنویسه ورودی با مجموعهنویسه اجرایی مطابقت داشته باشد، هیچ پیام تشخیصی صادر نمیشود. اگر آنها متفاوت باشند، توالیهای بدشکل واحدِ کد در طول تبدیل رمزگذاری به مجموعهنویسه اجرایی منجر به خطا میشوند..IP -fpch-deps 4 هنگام استفاده از سرآیندهای ازپیشکامپایلشده، این پرچم باعث میشود که پرچمهای خروجی وابستگی، فایلهای موجود در وابستگیهای سرآیند ازپیشکامپایلشده را نیز فهرست کنند. اگر مشخص نشود، تنها سرآیند ازپیشکامپایلشده فهرست میشود و نه فایلهایی که برای ایجاد آن استفاده شدهاند، زیرا در زمان استفاده از سرآیند ازپیشکامپایلشده، به آن فایلها رجوع نمیشود.
- -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" صادر نمیشود.
- -C
- --comments
- توضیحات
(کامنتها)
را حذف
نکنید. تمام
توضیحات به
فایل خروجی
منتقل
میشوند،
به جز
توضیحات
درون
دستورالعملهای
پردازششده
که همراه با
خود
دستورالعمل
حذف
میگردند.
هنگام استفاده از -C باید برای عوارض جانبی آماده باشید؛ این گزینه باعث میشود پیشپردازنده با کامنتها به عنوان نشانهها (tokens) به طور مستقل رفتار کند. برای مثال، کامنتهایی که در ابتدای یک خطِ دستورالعمل ظاهر میشوند، این اثر را دارند که آن خط را به یک خط کد منبع معمولی تبدیل کنند، زیرا دیگر نخستین نشانه در آن خط، کاراکتر # نیست.
- -CC
- --comments-in-macros
- توضیحات
را، حتی در
طول بسط
ماکروها،
حذف نکنید.
این گزینه
مانند -C
است، به جز
اینکه
توضیحات
موجود در
ماکروها
نیز در جایی
که ماکرو
بسط
مییابد به
فایل خروجی
منتقل
میشوند.
علاوه بر عوارض جانبی گزینه -C، گزینه -CC باعث میشود تمام توضیحات سبک C++ در داخل یک ماکرو به توضیحات سبک C تبدیل شوند. این کار برای جلوگیری از این است که استفاده بعدی از آن ماکرو ناخواسته باقیمانده خط کد منبع را به کامنت تبدیل نکند.
گزینه -CC معمولاً برای پشتیبانی از توضیحات lint به کار میرود.
- -P
- --no-line-commands
- از تولید نشانگرهای خط در خروجی پیشپردازنده جلوگیری میکند. این ممکن است هنگام اجرای پیشپردازنده بر روی چیزی که کد C نیست و به برنامهای فرستاده میشود که ممکن است توسط نشانگرهای خط دچار سردرگمی شود، مفید باشد.
- -traditional
- --traditional
- -traditional-cpp
- --traditional-cpp
- تلاش
میکند تا
رفتار
پیشپردازندههای
C پیش از
استاندارد
را در برابر
پیشپردازندههای
ISO C
شبیهسازی
کند. برای
جزئیات
بیشتر به
راهنمای GNU CPP
مراجعه
کنید.
توجه داشته باشید که GCC در غیر این صورت تلاشی برای شبیهسازی کامپایلر C پیش از استاندارد نمیکند، و این گزینهها تنها با سوئیچ -E یا هنگام فراخوانی صریح CPP پشتیبانی میشوند.
- -trigraphs
- --trigraphs
- پشتیبانی
از
سهنگارههای
(trigraphs)
استاندارد
ISO C. اینها
توالیهای
سهکاراکتری
هستند که
همگی با ??
شروع
میشوند و
در ISO C برای
نمایش
کاراکترهای
تکی تعریف
شدهاند.
برای
نمونه، ??/
بیانگر \
است،
بنابراین
'??/n' یک ثابت
کاراکتری
برای خط
جدید (newline) است.
نه سهنگاره و معادلهای جایگزین آنها عبارتند از:
Trigraph: ??( ??) ??< ??> ??= ??/ ??' ??! ??- Replacement: [ ] { } # \ ^ | ~به صورت پیشفرض، GCC سهنگارهها را نادیده میگیرد، اما در حالتهای منطبق بر استاندارد آنها را تبدیل میکند. گزینههای -std و -ansi را ببینید.
- -remap
- کد ویژهای را برای دور زدن محدودیت سیستمفایلهایی که تنها نامهای فایل بسیار کوتاه را مجاز میدانند (مانند MS-DOS)، فعال میکند.
- -H
- --trace-includes
- علاوه بر سایر فعالیتهای معمول، نام هر فایل سرآیند استفادهشده را چاپ میکند. هر نام با تورفتگی نشان داده میشود تا میزان عمق آن در پشته #include مشخص گردد. فایلهای سرآیند ازپیشکامپایلشده نیز چاپ میشوند، حتی اگر نامعتبر تشخیص داده شوند؛ یک فایل سرآیند ازپیشکامپایلشده نامعتبر با ...x و یک فایل معتبر با ...! چاپ میشود.
- -dletters
- --dump=letters
- --dump letters
- تعیین میکند که در طول کامپایل رونوشتهای اشکالزدایی (debugging dumps) طبق آنچه با letters مشخص شده است، ایجاد شوند. پرچمهای مستندشده در اینجا مواردی هستند که به پیشپردازنده مربوط میشوند. سایر letters توسط خود کامپایلر تفسیر میشوند، یا برای نسخههای آینده GCC رزرو شدهاند، و بنابراین بدون هیچ پیامی نادیده گرفته میشوند. اگر letters را به گونهای مشخص کنید که رفتار متناقض داشته باشند، نتیجه نامشخص خواهد بود.
- -dM
- --dump=M
- به جای
خروجی
معمول،
فهرستی از
دستورالعملهای
#define را برای
تمام
ماکروهای
تعریفشده
در طول
اجرای
پیشپردازنده،
از جمله
ماکروهای
ازپیشتعریفشده،
تولید
میکند. این
به شما راهی
برای یافتن
تعاریف
پیشفرض در
نسخه
پیشپردازنده
شما میدهد.
با فرض
اینکه
فایلی با
نام foo.h
ندارید،
دستور
touch foo.h; cpp -dM foo.h
تمام ماکروهای ازپیشتعریفشده را نشان میدهد.
اگر از -dM بدون گزینه -E استفاده کنید، -dM به عنوان مترادفی برای -fdump-rtl-mach تفسیر میشود.
- -dD
- --dump=D
- مانند -dM است به جز اینکه هر دو دستورالعملهای #define و نتیجه پیشپردازش را در خروجی درج میکند. هر دو نوع خروجی به فایل خروجی استاندارد ارسال میشوند.
- -dN
- --dump=N
- مشابه -dD، اما تنها نام ماکروها را در خروجی میدهد، نه بسط آنها را.
- -dI
- --dump=I
- دستورالعملهای #include را علاوه بر نتیجهٔ پیشپردازش در خروجی قرار میدهد.
- -dU
- --dump=U
- مشابه -dD، با این تفاوت که فقط ماکروهایی در خروجی قرار میگیرند که بسط داده شوند، یا وضعیت تعریفشدن آنها در دستورالعملهای پیشپردازنده بررسی شود؛ خروجی تا زمان استفاده یا بررسی ماکرو به تأخیر میافتد؛ و دستورالعملهای #undef نیز برای ماکروهایی که بررسی شده اما در آن زمان تعریف نشدهاند، در خروجی قرار میگیرند.
- -fdebug-cpp
- این گزینه
فقط برای
اشکالزدایی
GCC کاربرد
دارد.
هنگامی که
از طریق CPP یا
همراه با -E
استفاده
شود،
اطلاعات
اشکالزدایی
مربوط به
نقشههای
مکان (location maps) را
در خروجی
ثبت میکند.
پیش از هر
نشانه (token) در
خروجی،
اطلاعات
نقشهای که
مکان آن به
آن تعلق
دارد درج
میشود.
هنگام استفاده در GCC بدون -E، این گزینه هیچ اثری ندارد.
- -Wp,option
- میتوانید از -Wp,option برای دور زدن راهانداز کامپایلر و ارسال مستقیم option به پیشپردازنده استفاده کنید. اگر option حاوی کاما باشد، در محل کاماها به چندین گزینه تفکیک میشود. با این حال، بسیاری از گزینهها پیش از تحویل به پیشپردازنده توسط راهانداز کامپایلر اصلاح، ترجمه یا تفسیر میشوند و -Wp این مرحله را اجباراً دور میزند. رابط مستقیم پیشپردازنده مستند نشده و در معرض تغییر است، بنابراین در صورت امکان باید از بهکارگیری -Wp خودداری کنید و مدیریت گزینهها را به راهانداز بسپارید.
- -Xpreprocessor option
- گزینهٔ option
را به عنوان
یک گزینه به
پیشپردازنده
ارسال
میکند.
میتوانید
از این
گزینه برای
ارائه
گزینههای
پیشپردازنده
ویژهٔ
سیستم که
برای GCC
ناشناخته
است
استفاده
کنید.
اگر میخواهید گزینهای ارسال کنید که آرگومان میپذیرد، باید دوبار از -Xpreprocessor استفاده کنید؛ یکبار برای خود گزینه و یکبار برای آرگومان آن.
- -no-integrated-cpp
- --no-integrated-cpp
- پیشپردازش را به عنوان یک مرحلهٔ مجزا پیش از کامپایل انجام میدهد. به طور پیشفرض، GCC پیشپردازش را به عنوان بخشی یکپارچه از نشانهگذاری (tokenization) و تجزیه (parsing) ورودی انجام میدهد. در صورت ارائه این گزینه، بخش جلویی (front end) زبان مربوطه (cc1، cc1plus، یا cc1obj به ترتیب برای C، C++، و Objective-C) در عوض دو بار فراخوانی میشود؛ یکبار فقط برای پیشپردازش و بار دیگر برای کامپایل واقعی ورودی پیشپردازششده. این گزینه ممکن است همراه با گزینههای -B یا -wrapper برای تعیین یک پیشپردازندهٔ جایگزین یا انجام پردازش اضافی روی کد منبع برنامه بین پیشپردازش عادی و کامپایل مفید باشد.
ارسال گزینهها به اسمبلر (Passing Options to the Assembler)
میتوانید گزینههای مورد نظر را به اسمبلر ارسال کنید.
- -Wa,option
- گزینهٔ option را به عنوان گزینهای به اسمبلر ارسال میکند. اگر option حاوی کاما باشد، در محل کاماها به چندین گزینه تفکیک میشود.
- -Xassembler option
- --for-assembler=option
- --for-assembler option
- گزینهٔ option
را به عنوان
گزینهای
به اسمبلر
ارسال
میکند.
میتوانید
از این
گزینه برای
ارائه
گزینههای
اسمبلر
ویژهٔ
سیستم که
برای GCC
ناشناخته
است
استفاده
کنید.
اگر میخواهید گزینهای ارسال کنید که آرگومان میپذیرد، باید دوبار از -Xassembler استفاده کنید؛ یکبار برای خود گزینه و یکبار برای آرگومان آن..SS "گزینههای پیونددهی (Options for Linking)" این گزینهها زمانی وارد عمل میشوند که کامپایلر فایلهای شیء را به یک فایل خروجی اجرایی پیوند میدهد. در صورتی که کامپایلر مرحلهٔ پیوند را انجام ندهد، این گزینهها بیمعنی خواهند بود.
- object-file-name
- نام فایلی که به یک پسوند شناختهشدهٔ ویژه ختم نمیشود، به عنوان نام یک فایل شیء یا کتابخانه در نظر گرفته میشود. (فایلهای شیء توسط پیونددهنده بر اساس محتوای فایل از کتابخانهها متمایز میشوند.) در صورت انجام پیوند، این فایلهای شیء به عنوان ورودی برای پیونددهنده استفاده میشوند.
- -c
- -S
- -E
- اگر هر یک از این گزینهها استفاده شود، پیونددهنده اجرا نمیشود و نباید از نامهای فایل شیء به عنوان آرگومان استفاده کرد.
- -flink-libatomic
- در صورت پشتیبانی هدف، پیوندزدن libatomic را فعال میکند؛ این گزینه بهطور پیشفرض فعال است. فرم منفی -fno-link-libatomic میتواند برای غیرفعال کردن صریح پیوندزدن libatomic استفاده شود.
- -flinker-output=type
- این گزینه
تولید کد
بهینهساز
زمان پیوند
را کنترل
میکند.
بهطور
پیشفرض،
خروجی
پیونددهنده
بهطور
خودکار
توسط
پلاگین
پیونددهنده
تعیین
میشود.
برای
اشکالزدایی
کامپایلر و
در صورتی که
پیوند
افزایشی با
یک فایل شیء
غیر LTO مورد
نظر باشد،
ممکن است
کنترل دستی
نوع خروجی
مفید باشد.
اگر type مقدار exec باشد، تولید کد یک باینری ایستا ایجاد میکند. در این حالت، هر دو گزینهٔ -fpic و -fpie غیرفعال میشوند.
اگر type مقدار dyn باشد، تولید کد یک کتابخانهٔ مشترک تولید میکند. در این حالت -fpic یا -fPIC حفظ میشود، اما بهطور خودکار فعال نمیگردد. این امکان ساخت کتابخانههای مشترک را بدون کد مستقل از موقعیت در معماریهایی که امکانپذیر است، مانند x86، فراهم میکند.
اگر type مقدار pie باشد، تولید کد یک فایل اجرایی -fpie ایجاد میکند. این حالت به بهینهسازیهای مشابهی با exec منجر میشود، با این تفاوت که اگر -fpie در زمان کامپایل مشخص شده باشد، غیرفعال نمیشود.
اگر type مقدار rel باشد، کامپایلر فرض میکند که پیوند افزایشی در حال انجام است. بخشهای حاوی کد میانی برای بهینهسازی زمان پیوند ادغام شده، پیشبهینهسازی میشوند و در فایل شیء حاصل خروجی داده میشوند. علاوه بر این، اگر -ffat-lto-objects مشخص شده باشد، کد باینری برای پیوندهای غیر LTO بعدی تولید میشود. فایل شیء تولید شده توسط پیوند افزایشی کوچکتر از یک کتابخانهٔ ایستا است که از همان فایلهای شیء تولید شده باشد. در زمان پیوند، نتیجهٔ پیوند افزایشی با این فرض که اکثر اشیاء موجود در کتابخانه استفاده میشوند، سریعتر از یک کتابخانهٔ ایستا بارگذاری میشود.
در نهایت، nolto-rel کامپایلر را برای پیوند افزایشی پیکربندی میکند که در آن تولید کد اجباری است، یک باینری نهایی تولید میشود، و کد میانی برای بهینهسازیهای بعدی زمان پیوند حذف میشود. هنگامی که چندین فایل شیء با یکدیگر پیوند داده میشوند، کد حاصل نسبت به زمانی که بهینهسازیهای زمان پیوند غیرفعال است بهتر بهینهسازی میشود (برای مثال، inlining میانماژولی رخ میدهد)، اما بیشتر مزایای بهینهسازیهای کل برنامه از دست میرود.
در طول پیوند افزایشی (توسط -r)، پلاگین پیونددهنده بهطور پیشفرض روی rel تنظیم میشود. برای پیوند افزایشی اشیاء LTO و اشیاء غیر LTO در یک فایل شیء ترکیبی واحد، به GNU Binutils نسخهٔ 2.44 یا بالاتر نیاز است. اگر هر یک از فایلهای شیء در یک پیوند افزایشی نتواند برای بهینهسازی زمان پیوند استفاده شود، پلاگین پیونددهنده یک هشدار صادر کرده و از nolto-rel استفاده میکند. برای حفظ بهینهسازی کل برنامه، در عوض چنین اشیائی را به یک کتابخانهٔ ایستا پیوند دهید.
- -fuse-ld=bfd
- استفاده از پیونددهندهٔ bfd به جای پیونددهندهٔ پیشفرض.
- -fuse-ld=gold
- استفاده از پیونددهندهٔ gold به جای پیونددهندهٔ پیشفرض.
- -fuse-ld=lld
- استفاده از پیونددهندهٔ LLVM lld به جای پیونددهندهٔ پیشفرض.
- -fuse-ld=mold
- استفاده از پیونددهندهٔ Modern Linker (mold) به جای پیونددهندهٔ پیشفرض.
- -fuse-ld=wild
- استفاده از پیونددهندهٔ Wild (wild) به جای پیونددهندهٔ پیشفرض.
- -llibrary
- -l library
- هنگام
پیوندزدن،
به دنبال
کتابخانهای
به نام library
میگردد.
(حالت دوم
با
کتابخانه
به عنوان یک
آرگومان
جداگانه
تنها برای
سازگاری با
POSIX است و
توصیه
نمیشود.)
گزینهٔ -l مستقیماً توسط GCC به پیونددهنده ارسال میشود. برای جزئیات دقیق به مستندات پیونددهندهٔ خود مراجعه کنید. توضیحات کلی زیر در مورد پیونددهندهٔ GNU صدق میکند.
پیونددهنده فهرست استانداردی از دایرکتوریها را برای یافتن کتابخانه جستجو میکند. دایرکتوریهای جستجوشده شامل چندین دایرکتوری استاندارد سیستمی به اضافهٔ هر دایرکتوری است که با -L مشخص کنید.
کتابخانههای ایستا آرشیوهایی از فایلهای شیء هستند و نام فایلهایی مانند liblibrary.a دارند. برخی از هدفها از کتابخانههای مشترک نیز پشتیبانی میکنند که معمولاً نامهایی مانند liblibrary.so دارند. اگر هر دو نوع کتابخانهٔ ایستا و مشترک یافت شوند، پیونددهنده اولویت را به پیوند با کتابخانهٔ مشترک میدهد، مگر اینکه از گزینهٔ -static استفاده شده باشد.
اینکه این گزینه را در کجای دستور بنویسید تفاوت ایجاد میکند؛ پیونددهنده کتابخانهها و فایلهای شیء را به ترتیبی که مشخص شدهاند جستجو و پردازش میکند. بنابراین، foo.o -lz bar.o کتابخانهٔ z را پس از فایل foo.o اما قبل از bar.o جستجو میکند. اگر bar.o به توابعی در z ارجاع دهد، ممکن است آن توابع بارگذاری نشوند.
- -lobjc
- برای پیوند یک برنامهٔ Objective-C یا Objective-C++ به این حالت خاص از گزینهٔ -l نیاز دارید.
- -nostartfiles
- هنگام پیوندزدن، از فایلهای راهانداز استاندارد سیستم استفاده نکنید. کتابخانههای استاندارد سیستم بهطور عادی استفاده میشوند، مگر اینکه از -nostdlib، -nolibc یا -nodefaultlibs استفاده شود.
- -nodefaultlibs
- هنگام
پیوندزدن،
از
کتابخانههای
استاندارد
سیستم
استفاده
نکنید. تنها
کتابخانههایی
که مشخص
میکنید به
پیونددهنده
ارسال
میشوند، و
گزینههایی
که پیوند
کتابخانههای
سیستم را
تعیین
میکنند،
مانند -static-libgcc
یا -shared-libgcc،
نادیده
گرفته
میشوند.
فایلهای
راهانداز
استاندارد
بهطور
عادی
استفاده
میشوند،
مگر اینکه
از -nostartfiles
استفاده
شود.
کامپایلر ممکن است فراخوانیهایی به "memcmp"، "memset"، "memcpy" و "memmove" ایجاد کند. این مدخلها معمولاً توسط مدخلهای موجود در libc برطرف میشوند. هنگامی که این گزینه مشخص شده است، این نقاط ورودی باید از طریق مکانیسم دیگری تأمین شوند.
- -nolibc
- هنگام پیوندزدن، از کتابخانهٔ C یا کتابخانههای سیستمی که وابستگی شدیدی به آن دارند استفاده نکنید. همچنان با فایلهای راهانداز، libgcc یا کتابخانههای پشتیبانی زبان ارائهشده توسط زنجیرهابزار مانند libgnat، libgfortran یا libstdc++ پیوند برقرار میشود، مگر اینکه گزینههایی برای جلوگیری از گنجاندن آنها نیز استفاده شده باشد. این معمولاً -lc و همچنین کتابخانههای سیستمی را که معمولاً با آن همراه هستند و در صورت عدم وجود کتابخانهٔ C بیمعنی میشوند (برای مثال -lpthread یا -lm در برخی پیکربندیها) از خط فرمان پیوند حذف میکند. این گزینه برای هدفهای bare-board که در آنها هیچ کتابخانهٔ C در دسترسی نیست، در نظر گرفته شده است.
- -nostdlib
- --no-standard-libraries
- هنگام
پیوندزدن،
از
فایلهای
راهانداز
یا
کتابخانههای
استاندارد
سیستم
استفاده
نکنید. هیچ
فایل
راهاندازی
و تنها
کتابخانههایی
که مشخص
میکنید به
پیونددهنده
ارسال
میشوند، و
گزینههایی
که پیوند
کتابخانههای
سیستم را
تعیین
میکنند،
مانند -static-libgcc
یا -shared-libgcc،
نادیده
گرفته
میشوند.
کامپایلر ممکن است فراخوانیهایی به "memcmp"، "memset"، "memcpy" و "memmove" ایجاد کند. این مدخلها معمولاً توسط مدخلهای موجود در libc برطرف میشوند. هنگامی که این گزینه مشخص شده است، این نقاط ورودی باید از طریق مکانیسم دیگری تأمین شوند.
یکی از کتابخانههای استانداردی که توسط -nostdlib و -nodefaultlibs نادیده گرفته میشود، libgcc.a است؛ کتابخانهای از زیرروالهای داخلی که GCC برای غلبه بر کاستیهای ماشینهای خاص یا نیازهای ویژهٔ برخی زبانها استفاده میکند.
در بیشتر موارد، حتی زمانی که میخواهید از سایر کتابخانههای استاندارد اجتناب کنید، به libgcc.a نیاز دارید. به عبارت دیگر، هنگامی که -nostdlib یا -nodefaultlibs را مشخص میکنید، معمولاً باید -lgcc را نیز تعیین کنید. این امر تضمین میکند که هیچ ارجاع حلنشدهای به زیرروالهای کتابخانهٔ داخلی GCC نداشته باشید. (نمونهای از چنین زیرروال داخلی "__main" است که برای اطمینان از فراخوانی سازندههای C++ استفاده میشود.).IP -nostdlib++ 4 بهصورت ضمنی با کتابخانههای استاندارد C++ پیوند برقرار نمیکند.
- -e entry
- --entry=entry
- --entry entry
- مشخص میکند که نقطهٔ ورود برنامه entry است. این آرگومان توسط پیونددهنده تفسیر میشود؛ پیونددهندهٔ GNU یک نام نماد یا یک آدرس را میپذیرد.
- -pie
- --pie
- یک فایل اجرایی مستقل از موقعیت پیوندخورده بهصورت پویا را روی مقصدهایی که از آن پشتیبانی میکنند تولید میکند. برای دستیابی به نتایج قابل پیشبینی، هنگام مشخص کردن این گزینهٔ پیونددهنده، باید همان مجموعهگزینههایی که برای کامپایل استفاده شدهاند (-fpie، -fPIE یا زیرگزینههای مدل) را نیز مشخص کنید.
- -no-pie
- فایل اجرایی مستقل از موقعیت با پیوند پویا تولید نمیکند.
- -static-pie
- --static-pie
- یک فایل اجرایی مستقل از موقعیت ایستا را روی مقصدهایی که از آن پشتیبانی میکنند تولید میکند. یک فایل اجرایی مستقل از موقعیت ایستا مشابه یک فایل اجرایی ایستا است، اما میتواند در هر آدرسی بدون نیاز به یک پیونددهندهٔ پویا بارگذاری شود. برای دستیابی به نتایج قابل پیشبینی، هنگام مشخص کردن این گزینهٔ پیونددهنده، باید همان مجموعهگزینههایی که برای کامپایل استفاده شدهاند (-fpie، -fPIE یا زیرگزینههای مدل) را نیز مشخص کنید.
- -pthread
- با کتابخانهٔ ریسههای POSIX پیوند برقرار میکند. این گزینه در مقصدهای GNU/Linux، بیشتر مشتقات یونیکس، و همچنین مقصدهای x86 Cygwin و MinGW پشتیبانی میشود. در برخی مقصدها این گزینه پرچمهایی را نیز برای پیشپردازنده تنظیم میکند، بنابراین باید بهطور هماهنگ هم برای کامپایل و هم برای پیونددهی استفاده شود.
- -r
- یک شیء با قابلیت جابهجایی را به عنوان خروجی تولید میکند. این عمل به عنوان پیونددهی جزئی نیز شناخته میشود.
- -rdynamic
- پرچم -export-dynamic را در مقصدهایی که از آن پشتیبانی میکنند به پیونددهندهٔ ELF ارسال میکند. این دستور به پیونددهنده اعلام میکند که تمام نمادها، و نه فقط موارد استفادهشده را، به جدول نمادهای پویا اضافه کند. این گزینه برای برخی موارد استفاده از "dlopen" یا جهت امکانپذیر ساختن دریافت ردگیری معکوس فراخوانیها (backtraces) از درون برنامه مورد نیاز است.
- -s
- تمام جدول نمادها و اطلاعات جابهجایی را از فایل اجرایی حذف میکند.
- -static
- --static
- روی سیستمهایی که از پیوند پویا پشتیبانی میکنند، این گزینه بر -pie مقدم شده و از پیوند با کتابخانههای مشترک جلوگیری میکند. روی سایر سیستمها، این گزینه هیچ اثری ندارد.
- یک شیء مشترک تولید میکند که پس از آن میتواند با اشیاء دیگر پیوند داده شود تا یک فایل اجرایی تشکیل دهد. همهٔ سیستمها از این گزینه پشتیبانی نمیکنند. برای نتایج قابل پیشبینی، هنگام مشخص کردن این گزینهٔ پیونددهنده، باید همان مجموعهگزینههایی که برای کامپایل استفاده شدهاند (-fpic، -fPIC یا زیرگزینههای مدل) را نیز مشخص کنید.[1]
- -static-libgcc
- روی
سیستمهایی
که libgcc را به
عنوان یک
کتابخانهٔ
مشترک
ارائه
میدهند،
این
گزینهها
بهترتیب
استفاده از
نسخهٔ
مشترک یا
ایستا را
اجباری
میکنند.
اگر هنگام
پیکربندی
کامپایلر
هیچ نسخهٔ
مشترکی از
libgcc ساخته
نشده باشد،
این
گزینهها
هیچ اثری
نخواهند
داشت.
موقعیتهای متعددی وجود دارد که در آنها یک برنامه کاربردی باید به جای نسخهٔ ایستا از libgcc مشترک استفاده کند. رایجترین مورد زمانی است که برنامه میخواهد استثناها را در میان کتابخانههای مشترک مختلف پرتاب و دریافت کند. در آن صورت، هر یک از کتابخانهها و همچنین خود برنامه کاربردی باید از libgcc مشترک استفاده کنند.
بنابراین، راهانداز G++ هر زمان که یک کتابخانهٔ مشترک یا یک فایل اجرایی اصلی را میسازید، بهطور خودکار -shared-libgcc را اضافه میکند، زیرا برنامههای C++ معمولاً از استثناها استفاده میکنند و در نتیجه این کار مناسب است.
اگر در عوض، از راهانداز GCC برای ساخت کتابخانههای مشترک استفاده کنید، ممکن است متوجه شوید که آنها همیشه با libgcc مشترک پیوند داده نمیشوند. اگر GCC در زمان پیکربندی خود تشخیص دهد که شما یک پیونددهندهٔ غیر گنو دارید، یا یک پیونددهندهٔ گنو که از گزینهٔ --eh-frame-hdr پشتیبانی نمیکند، بهطور پیشفرض نسخهٔ مشترک libgcc را به کتابخانههای مشترک پیوند میدهد. در غیر این صورت، از قابلیتهای پیونددهنده بهره برده و پیوند با نسخهٔ مشترک libgcc را بهینهسازی و حذف میکند، و بهطور پیشفرض با نسخهٔ ایستای libgcc پیوند برقرار میکند. این امر اجازه میدهد تا استثناها در میان چنین کتابخانههای مشترکی بدون تحمیل هزینههای جابهجایی در زمان بارگذاری کتابخانه، منتشر شوند.
با این حال، اگر قرار باشد یک کتابخانه یا فایل اجرایی اصلی استثناها را پرتاب یا دریافت کند، باید آن را با استفاده از راهانداز G++ یا با استفاده از گزینهٔ -shared-libgcc پیوند دهید تا با نسخهٔ مشترک libgcc پیوند بخورد.
- -static-libasan
- هنگامی که گزینهٔ -fsanitize=address برای پیوند دادن یک برنامه استفاده میشود، راهانداز GCC بهطور خودکار با libasan پیوند برقرار میکند. اگر libasan بهصورت یک کتابخانهٔ مشترک در دسترس باشد و گزینهٔ -static استفاده نشود، پیوند با نسخهٔ مشترک libasan برقرار میشود. گزینهٔ -static-libasan به راهانداز GCC دستور میدهد که libasan را بهصورت ایستا پیوند دهد، بدون آنکه لزوماً کتابخانههای دیگر را بهصورت ایستا پیوند بزند.
- -static-libhwasan
- هنگامی که گزینهٔ -fsanitize=hwaddress برای پیوند دادن یک برنامه استفاده میشود، راهانداز GCC بهطور خودکار با libhwasan پیوند برقرار میکند. اگر libhwasan بهصورت یک کتابخانهٔ مشترک در دسترس باشد و گزینهٔ -static استفاده نشود، پیوند با نسخهٔ مشترک libhwasan برقرار میشود. گزینهٔ -static-libhwasan به راهانداز GCC دستور میدهد که libhwasan را بهصورت ایستا پیوند دهد، بدون آنکه لزوماً کتابخانههای دیگر را بهصورت ایستا پیوند بزند.
- -static-liblsan
- هنگامی که گزینهٔ -fsanitize=leak برای پیوند دادن یک برنامه استفاده میشود، راهانداز GCC بهطور خودکار با liblsan پیوند برقرار میکند. اگر liblsan بهصورت یک کتابخانهٔ مشترک در دسترس باشد و گزینهٔ -static استفاده نشود، پیوند با نسخهٔ مشترک liblsan برقرار میشود. گزینهٔ -static-liblsan به راهانداز GCC دستور میدهد که liblsan را بهصورت ایستا پیوند دهد، بدون آنکه لزوماً کتابخانههای دیگر را بهصورت ایستا پیوند بزند.
- -static-libtsan
- هنگامی که گزینهٔ -fsanitize=thread برای پیوند دادن یک برنامه استفاده میشود، راهانداز GCC بهطور خودکار با libtsan پیوند برقرار میکند. اگر libtsan بهصورت یک کتابخانهٔ مشترک در دسترس باشد و گزینهٔ -static استفاده نشود، پیوند با نسخهٔ مشترک libtsan برقرار میشود. گزینهٔ -static-libtsan به راهانداز GCC دستور میدهد که libtsan را بهصورت ایستا پیوند دهد، بدون آنکه لزوماً کتابخانههای دیگر را بهصورت ایستا پیوند بزند.
- -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++ را بهصورت ایستا پیوند دهد، بدون آنکه لزوماً کتابخانههای دیگر را بهصورت ایستا پیوند بزند.
- -symbolic
- --symbolic
- هنگام ساخت یک شیء مشترک، ارجاعات را به نمادهای سراسری پیوند میدهد (bind). دربارهٔ هرگونه ارجاع حلنشده هشدار میدهد (مگر اینکه توسط گزینهٔ ویرایشگر پیوند -Xlinker -z -Xlinker defs لغو شده باشد). تنها تعداد کمی از سیستمها از این گزینه پشتیبانی میکنند..IP "-T script" 4 استفاده از script بهعنوان اسکریپت پیونددهنده (linker script). این گزینه توسط بیشتر سامانههایی که از پیونددهندهٔ GNU استفاده میکنند پشتیبانی میشود. در برخی مقاصد، مانند مقاصد bare-board بدون سیستمعامل، گزینهٔ -T ممکن است هنگام پیوند دادن برای جلوگیری از ارجاع به نمادهای تعریفنشده الزامی باشد.
- -Xlinker option
- ارسال option
بهعنوان
یک گزینه به
پیونددهنده.
میتوانید
از این
گزینه برای
فراهم کردن
گزینههای
پیونددهندهٔ
مختص
سامانه که
برای GCC
ناشناخته
هستند
استفاده
کنید.
اگر میخواهید گزینهای را ارسال کنید که آرگومان جداگانهای میگیرد، باید از -Xlinker دو بار استفاده کنید، یک بار برای گزینه و یک بار برای آرگومان. برای مثال، برای ارسال -assert definitions، باید بنویسید: -Xlinker -assert -Xlinker definitions. نوشتن -Xlinker "-assert definitions" کار نخواهد کرد، زیرا کل رشته را بهعنوان یک آرگومان واحد ارسال میکند، که مورد انتظار پیونددهنده نیست.
هنگام استفاده از پیونددهندهٔ GNU، معمولاً راحتتر است که آرگومانها را با استفاده از نحو option=value به گزینههای پیونددهنده ارسال کنید تا بهصورت آرگومانهای جداگانه. برای مثال، میتوانید به جای -Xlinker -Map -Xlinker output.map، مقدار -Xlinker -Map=output.map را مشخص کنید. سایر پیونددهندهها ممکن است از این نحو برای گزینههای خط فرمان پشتیبانی نکنند.
- -Wl,option
- --for-linker=option
- --for-linker option
- ارسال option بهعنوان یک گزینه به پیونددهنده. اگر option حاوی ویرگول باشد، در محل ویرگولها به چندین گزینه تقسیم میشود. میتوانید از این نحو برای ارسال یک آرگومان به گزینه استفاده کنید. برای مثال، -Wl,-Map,output.map گزینهٔ -Map output.map را به پیونددهنده ارسال میکند. هنگام استفاده از پیونددهندهٔ GNU، میتوانید با -Wl,-Map=output.map نیز به همین نتیجه برسید.
- -u symbol
- --force-link=symbol
- --force-link symbol
- وانمود میکند که نماد symbol تعریفنشده است، تا پیونددهیِ ماژولهای کتابخانه برای تعریف آن تحمیل شود. میتوانید از -u چندین بار با نمادهای مختلف برای تحمیل بارگذاری ماژولهای کتابخانهٔ اضافی استفاده کنید.
- -Tbss=addr
- -Tdata=addr
- -Ttext=addr
- -N
- -n
- -t
- -Z
- -z keyword
- این گزینهها بدون تفسیر توسط GCC به پیونددهنده منتقل میشوند. برای دانستن معانی این گزینهها به مستندات پیونددهندهٔ خود مراجعه کنید.
گزینههای جستجوی دایرکتوری (Options for Directory Search)
این گزینهها دایرکتوریهایی را برای جستجوی فایلهای سرآیند (header files)، کتابخانهها و بخشهایی از کامپایلر مشخص میکنند:
- -I dir
- -iquote dir
- -isystem dir
- -idirafter dir
- --include-directory-after=dir
- --include-directory-after dir
- --include-directory=dir
- --include-directory dir
- افزودن
دایرکتوری
dir به فهرست
دایرکتوریهایی
که در طول
پیشپردازش
برای
فایلهای
سرآیند
جستجو
میشوند.
--include-directory یک نام
مستعار
برای -I
است، در
حالی که
--include-directory-after یک نام
مستعار
برای -idirafter
است. اگر 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 برای رونویسی یک فایل سرآیند سامانه و جایگزین کردن نسخهٔ خود استفاده کنید، زیرا این دایرکتوریها پیش از دایرکتوریهای استاندارد فایلهای سرآیند سامانه جستجو میشوند. با این حال، نباید از این گزینه برای افزودن دایرکتوریهای حاوی فایلهای سرآیند سامانه ارائهشده توسط سازنده استفاده کنید؛ برای این منظور از -isystem استفاده نمایید.
گزینههای -isystem و -idirafter همچنین دایرکتوری را بهعنوان یک دایرکتوری سامانه علامتگذاری میکنند تا همان رفتار ویژهای که برای دایرکتوریهای استاندارد سامانه اعمال میشود، دربارهٔ آن نیز اعمال شود.
اگر یک دایرکتوری استاندارد include سامانه، یا دایرکتوری مشخصشده با -isystem، با -I نیز مشخص شده باشد، گزینهٔ -I نادیده گرفته میشود. دایرکتوری همچنان جستجو میشود اما بهعنوان یک دایرکتوری سامانه در جایگاه معمول خود در زنجیرهٔ include سامانه. این کار برای اطمینان از این است که سازوکار GCC برای اصلاح سرآیندهای معیوب سامانه و ترتیب مربوط به دستورالعمل "#include_next" سهواً تغییر نکند. اگر واقعاً نیاز به تغییر ترتیب جستجوی دایرکتوریهای سامانه دارید، از گزینههای -nostdinc و/یا -isystem استفاده کنید.
- -I-
- --include-barrier
- تفکیک مسیر
include. این گزینه
منسوخ شده
است. لطفاً
برای
دایرکتوریهای
-I پیش از -I-
بهجای آن
از -iquote
استفاده
کنید و
گزینهٔ -I-
را حذف
نمایید.
هر دایرکتوریِ مشخصشده با گزینههای -I پیش از -I- تنها برای سرآیندهایی جستجو میشود که با "#include "file"" درخواست شدهاند؛ آنها برای "#include <file>" جستجو نخواهند شد. اگر دایرکتوریهای بیشتری با گزینههای -I پس از -I- مشخص شوند، آن دایرکتوریها برای همهٔ دستورالعملهای #include جستجو میشوند.
علاوه بر این، -I- از استفاده از دایرکتوریِ فایل فعلی بهعنوان نخستین دایرکتوری جستجو برای "#include "file"" جلوگیری میکند. هیچ راهی برای باطل کردن این اثر -I- وجود ندارد.
- -iprefix prefix
- --include-prefix=prefix
- --include-prefix prefix
- مقدار prefix را بهعنوان پیشوند برای گزینههای بعدی -iwithprefix تعیین میکند. اگر پیشوند نمایانگر یک دایرکتوری است، باید اسلش پایانی / را نیز بگنجانید.
- -iwithprefix dir
- -iwithprefixbefore dir
- --include-with-prefix=prefix
- --include-with-prefix prefix
- --include-with-prefix-after=prefix
- --include-with-prefix-after prefix
- --include-with-prefix-before=prefix
- --include-with-prefix-before prefix
- پوشهٔ dir را
به پیشوندی
که پیشتر
با -iprefix مشخص
شده اضافه
میکند و
دایرکتوری
حاصل را به
مسیر
جستجوی include
میافزاید.
-iwithprefixbefore آن را
در همان
جایگاهی
قرار
میدهد که
-I قرار
میدهد؛
-iwithprefix آن را
جایی
میگذارد
که -idirafter قرار
میدهد.
گزینههای --include-with-prefix و --include-with-prefix-after هر دو نامهای مستعار برای -iwithprefix هستند، در حالی که --include-with-prefix-before نام مستعاری برای -iwithprefixbefore است.
- -isysroot dir
- این گزینه مشابه گزینهٔ --sysroot است، اما فقط بر فایلهای سرآیند اعمال میشود (بهجز در مقصدهای Darwin که در آنها هم بر فایلهای سرآیند و هم بر کتابخانهها اعمال میشود). برای اطلاعات بیشتر گزینهٔ --sysroot را ببینید.
- -imultilib dir
- از dir بهعنوان زیردایرکتوریِ پوشهٔ حاوی سرآیندهای C++ ویژهٔ مقصد استفاده میکند.
- -imultiarch dir
- از dir بهعنوان زیردایرکتوریِ پوشهٔ حاوی سرآیندهای C++ ویژهٔ معماری استفاده میکند.
- -nostdinc
- --no-standard-includes
- دایرکتوریهای استاندارد سیستم را برای فایلهای سرآیند جستجو نمیکند. تنها دایرکتوریهایی جستجو میشوند که بهطور صریح با گزینههای -I، -iquote، -isystem و/یا -idirafter مشخص شدهاند (و همچنین دایرکتوری فایل جاری، در صورت لزوم).
- -nostdinc++
- فایلهای سرآیند را در دایرکتوریهای استاندارد ویژهٔ C++ جستجو نمیکند، اما سایر دایرکتوریهای استاندارد را همچنان جستجو میکند. (این گزینه هنگام ساخت کتابخانهٔ C++ استفاده میشود.)
- --embed-dir=dir
- --embed-directory=dir
- --embed-directory dir
- دایرکتوری
dir را به
فهرست
دایرکتوریهای
مورد جستجو
برای دستور
پیشپردازندهٔ
"#embed" یا
ماکروی
"__has_embed"
اضافه
میکند. هیچ
دایرکتوری
پیشفرضی
برای
"#embed"
وجود ندارد.
اگر dir با = یا $SYSROOT آغاز شود، آنگاه = یا $SYSROOT با پیشوند sysroot جایگزین میشود؛ به --sysroot و -isysroot مراجعه کنید.
- -iplugindir=dir
- دایرکتوری مورد جستجو برای پلاگینهایی را مشخص میکند که به جای -fplugin=path/name.so با -fplugin=name ارسال شدهاند. این گزینه برای استفاده توسط کاربر در نظر گرفته نشده، بلکه تنها توسط درایور کامپایلر ارسال میشود.
- -Ldir
- --library-directory=dir
- --library-directory dir
- دایرکتوری dir را به فهرست دایرکتوریهای مورد جستجو برای -l میافزاید.
- -Bprefix
- --prefix=prefix
- --prefix prefix
- این گزینه
مشخص
میکند
فایلهای
اجرایی،
کتابخانهها،
فایلهای
سرآیند (include) و
فایلهای
دادهٔ خود
کامپایلر
در کجا یافت
شوند.
برنامهٔ درایور کامپایلر یک یا چند زیربرنامه از قبیل cpp، cc1، as و ld را اجرا میکند. این برنامه برای هر برنامهای که قصد اجرای آن را دارد، prefix را بهعنوان پیشوند، هم همراه با machine/version/ و هم بدون آن، برای ماشین مقصد و نسخهٔ کامپایلر متناظر امتحان میکند.
برای هر زیربرنامهای که باید اجرا شود، درایور کامپایلر ابتدا پیشوند -B (در صورت وجود) را امتحان میکند. اگر آن نام پیدا نشود، یا اگر -B مشخص نشده باشد، درایور دو پیشوند استاندارد /usr/lib/gcc/ و /usr/local/lib/gcc/ را امتحان میکند. اگر هیچکدام از آنها منجر به فایلی که پیدا شود نگردد، نامِ دستنخوردهٔ برنامه با استفاده از دایرکتوریهای مشخصشده در متغیر محیطی PATH شما جستجو میشود.
کامپایلر بررسی میکند که آیا مسیر ارائهشده توسط -B به یک دایرکتوری اشاره دارد یا خیر، و در صورت نیاز نویسهٔ جداکنندهٔ دایرکتوری را به انتهای مسیر میافزاید.
پیشوندهای -B که عملاً نام دایرکتوری را تعیین میکنند، برای کتابخانهها در پیونددهنده (linker) نیز اعمال میشوند، زیرا کامپایلر این گزینهها را به گزینههای -L برای پیونددهنده ترجمه میکند. آنها همچنین برای فایلهای include در پیشپردازنده نیز اعمال میشوند، زیرا کامپایلر این گزینهها را به گزینههای -isystem برای پیشپردازنده ترجمه میکند. در این حالت، کامپایلر include را به انتهای پیشوند میافزاید.
فایل پشتیبان زمان اجرای libgcc.a نیز در صورت نیاز میتواند با استفاده از پیشوند -B جستجو شود. اگر در آنجا یافت نشود، تنها دو پیشوند استاندارد فوق امتحان میشوند و بس. اگر فایل با این روشها پیدا نشود، از فرایند پیوند کنار گذاشته میشود.
راه دیگر برای تعیین پیشوندی شبیه به پیشوند -B، استفاده از متغیر محیطی GCC_EXEC_PREFIX است.
بهعنوان یک ترفند ویژه، اگر مسیر مشخصشده با -B بهصورت [dir/]stageN/ باشد که در آن N عددی بین 0 تا 9 است، با [dir/]include جایگزین میشود. این سازوکار برای کمک به خودراهاندازی (bootstrapping) کامپایلر است.
- -no-canonical-prefixes
- --no-canonical-prefixes
- هنگام ایجاد یک پیشوند نسبی، پیوندهای نمادین را بسط نده، ارجاعات به /../ یا /./ را حلوفصل نکن و مسیر را به مسیر مطلق تبدیل نکن.
- --sysroot=dir
- --sysroot dir
- از dir
بهعنوان
دایرکتوری
ریشهٔ
منطقی برای
فایلهای
سرآیند و
کتابخانهها
استفاده
میکند.
برای
نمونه، اگر
کامپایلر
در حالت
عادی برای
سرآیندها
در /usr/include و
برای
کتابخانهها
در /usr/lib جستجو
میکند، در
عوض dir/usr/include و
dir/usr/lib را
جستجو
خواهد کرد.
اگر هم از این گزینه و هم از گزینهٔ -isysroot استفاده کنید، گزینهٔ --sysroot بر کتابخانهها اعمال میشود، اما گزینهٔ -isysroot بر فایلهای سرآیند اعمال خواهد شد.
پیونددهندهٔ گنو (از نسخهٔ 2.16 به بعد) پشتیبانی لازم از این گزینه را دارد. اگر پیونددهندهٔ شما از این گزینه پشتیبانی نکند، جنبهٔ فایل سرآیندِ --sysroot همچنان کار میکند، اما جنبهٔ کتابخانهای آن کار نخواهد کرد.
- --no-sysroot-suffix
- برای برخی از مقصدهای کامپایل، بسته به سایر گزینههای استفادهشده، پسوندی به دایرکتوری ریشهٔ مشخصشده با --sysroot افزوده میشود، به گونهای که ممکن است سرآیندها برای نمونه بهجای dir/usr/include در dir/suffix/usr/include یافت شوند. این گزینه افزودن چنین پسوندی را غیرفعال میکند..SS "گزینههای مربوط به قراردادهای تولید کد (Options for Code Generation Conventions)" این گزینههای مستقل از ماشین، قراردادهای واسط مورد استفاده در تولید کد را کنترل میکنند.
بیشتر آنها هم شکل مثبت و هم منفی دارند؛ شکل منفی -ffoo بهصورت -fno-foo است. در جدول زیر، تنها یکی از شکلها فهرست شده است---شکلی که پیشفرض نیست. شما میتوانید با حذف یا افزودن no- به شکل دیگر برسید.
- -fstack-reuse=reuse-level
- این گزینه
استفادهٔ
مجدد از
فضای پشته
را برای
متغیرهای
محلی/خودکار
(local/auto)
تعریفشده
توسط کاربر
و متغیرهای
موقت
تولیدشده
توسط
کامپایلر
کنترل
میکند.
مقدار reuse_level
میتواند
all، named_vars یا none
باشد. مقدار
all
استفادهٔ
مجدد از
پشته را
برای تمام
متغیرهای
محلی و
متغیرهای
موقت فعال
میکند، named_vars
استفادهٔ
مجدد را
تنها برای
متغیرهای
محلیِ
نامدارِ
تعریفشده
توسط کاربر
فعال
میسازد، و
none
استفادهٔ
مجدد از
پشته را
بهطور
کامل
غیرفعال
میکند.
مقدار
پیشفرض all
است. این
گزینه
زمانی لازم
است که
برنامه،
طول عمر یک
متغیر محلی
در حوزه (scoped)
یا یک متغیر
موقت
تولیدشده
توسط
کامپایلر
را فراتر از
نقطهٔ
پایانِ
تعریفشده
توسط زبان
گسترش دهد.
هنگامی که
طول عمر یک
متغیر به
پایان
میرسد، و
در صورتی که
آن متغیر در
حافظه
باشد،
کامپایلرِ
بهینهساز
این آزادی
عمل را دارد
که فضای
پشتهٔ آن را
برای سایر
متغیرهای
موقت یا
متغیرهای
محلی که
محدودهٔ
حیات (live range)
آنها با آن
همپوشانی
ندارد،
مجدداً
استفاده
کند. کدهای
قدیمی (legacy) که
طول عمر
متغیرهای
محلی را
گسترش
میدهند،
احتمالاً
با
بهینهسازی
استفادهٔ
مجدد از
پشته دچار
شکست
خواهند شد.
برای مثال:
int *p; { int local1; p = &local1; local1 = 10; .... } { int local2; local2 = 20; ... } if (*p == 10) // out of scope use of local1 { }مثالی دیگر:
struct A { A(int k) : i(k), j(k) { } int i; int j; }; A *ap; void foo(const A& ar) { ap = &ar; } void bar() { foo(A(10)); // temp object's lifetime ends when foo returns { A a(20); .... } ap->i+= 10; // ap references out of scope temp whose space // is reused with a. What is the value of ap->i? }طول عمر یک متغیر موقت تولیدشده توسط کامپایلر بهخوبی توسط استاندارد ++C تعریف شده است. هنگامی که طول عمر یک متغیر موقت پایان مییابد، در صورتی که آن متغیر در حافظه باشد، کامپایلر بهینهساز این آزادی عمل را دارد که فضای پشتهٔ آن را با متغیرهای موقت دیگر یا متغیرهای محلی که محدودهٔ حیاتشان با آن همپوشانی ندارد دوباره استفاده کند. با این حال، برخی از کدهای قدیمی به رفتار کامپایلرهای قدیمیتر وابسته هستند که در آنها فضای پشتهٔ متغیرهای موقت مجدداً استفاده نمیشد؛ بنابراین استفادهٔ مجدد تهاجمی از پشته میتواند منجر به خطاهای زمان اجرا شود. این گزینه برای کنترل بهینهسازی استفادهٔ مجدد از پشته برای متغیرهای موقت به کار میرود.
- -ftrapv
- این گزینه برای سرریز علامتدار (signed overflow) در عملیاتهای جمع، تفریق و ضرب تله (trap) ایجاد میکند. گزینههای -ftrapv و -fwrapv یکدیگر را لغو (override) میکنند؛ بنابراین استفاده از -ftrapv -fwrapv در خط فرمان باعث مؤثر شدن -fwrapv میشود. توجه داشته باشید که تنها گزینههای فعال لغو میشوند، بنابراین استفاده از -ftrapv -fwrapv -fno-wrapv در خط فرمان موجب مؤثر شدن -ftrapv خواهد شد.
- -fwrapv
- این گزینه به کامپایلر دستور میدهد فرض کند سرریز محاسباتی علامتدار در جمع، تفریق و ضرب با استفاده از نمایش متمم دو (two's-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) را فعال میکند. کدهای اضافی مورد نیاز برای انتشار استثناها را تولید میکند. برای برخی از مقاصد (targets)، این گزینه موجب میشود GCC اطلاعات بازگشایی فریم (frame unwind) را برای تمام توابع تولید کند که گرچه تأثیری بر اجرا ندارد، اما میتواند سربار اندازهٔ دادهٔ قابل توجهی ایجاد کند. اگر این گزینه را مشخص نکنید، GCC آن را بهطور پیشفرض برای زبانهایی مانند ++C که معمولاً به مدیریت استثنا نیاز دارند فعال کرده، و برای زبانهایی مانند C که بهطور معمول به آن نیازی ندارند غیرفعال میکند. با این حال، ممکن است هنگام کامپایل کدهای C که باید بهدرستی با مدیریتکنندههای استثنای نوشتهشده در ++C تعامل داشته باشند، به فعال کردن این گزینه نیاز داشته باشید. همچنین اگر برنامههای قدیمیتر ++C را که از مدیریت استثنا استفاده نمیکنند کامپایل میکنید، شاید مایل به غیرفعال کردن این گزینه باشید.
- -fnon-call-exceptions
- کدی تولید میکند که به دستورالعملهای تلهگذار (trapping instructions) اجازه میدهد استثنا پرتاب کنند. توجه داشته باشید که این به پشتیبانی زمان اجرای مختص هر پلتفرم نیاز دارد که در همهجا موجود نیست. علاوه بر این، این گزینه تنها به دستورالعملهای تلهگذار اجازه میدهد استثنا پرتاب کنند، یعنی ارجاعات به حافظه یا دستورالعملهای ممیز شناور. این گزینه اجازه نمیدهد استثناها از گردانندههای سیگنال دلخواه مانند "SIGALRM" پرتاب شوند. این گزینه -fexceptions را فعال میکند.
- -fdelete-dead-exceptions
- در نظر میگیرد که دستورالعملهایی که ممکن است استثنا پرتاب کنند اما در غیر این صورت نقشی در اجرای برنامه ندارند، میتوانند از طریق بهینهسازی حذف شوند. این گزینه بر فراخوانی توابع تأثیری ندارد، مگر توابعی با ویژگیهای "pure" یا "const". این گزینه طبق مجوزی که مشخصات زبان صادر کرده است، بهطور پیشفرض برای کامپایلرهای Ada و ++C فعال است. گذرهای بهینهسازی که باعث حذف استثناهای مرده میشوند، بهطور مستقل در سطوح بهینهسازی مختلف فعال میگردند.
- -funwind-tables
- مشابه -fexceptions است، با این تفاوت که تنها دادههای ایستای مورد نیاز را تولید میکند و به هیچ شکل دیگری بر کد تولیدشده تأثیر نمیگذارد. معمولاً نیازی به فعالسازی دستی این گزینه ندارید؛ در عوض، پردازشگر زبانی که به این سازوکار نیاز دارد، آن را از طرف شما فعال خواهد کرد.
- -fasynchronous-unwind-tables
- در صورت پشتیبانی ماشین مقصد، جدول بازگشایی را در قالب DWARF تولید میکند. این جدول در مرز هر دستورالعمل دقیق است، بنابراین میتواند برای بازگشایی پشته در رویدادهای ناهمگام (مانند دیباگر یا زبالهروب) به کار رود.
- -fno-gnu-unique
- در سیستمهایی با اسمبلر GNU و کتابخانهٔ C جدید، کامپایلر ++C از پیوند "STB_GNU_UNIQUE" استفاده میکند تا اطمینان حاصل کند که تعاریف اعضای دادهای ایستای الگو و متغیرهای محلی ایستا در توابع درونخطی (inline) حتی در حضور "RTLD_LOCAL" نیز یکتا هستند؛ این امر برای جلوگیری از بروز مشکل در کتابخانهای که توسط دو افزونهٔ مختلف "RTLD_LOCAL" استفاده میشود و به تعریفی در یکی از آنها وابسته است و در نتیجه دربارهٔ پیوند نماد با یکدیگر اختلاف دارند، ضروری است. اما این کار باعث میشود که "dlclose" برای اشیاء اشتراکی پویا (DSO) آسیبدیده نادیده گرفته شود؛ اگر برنامهٔ شما به مقداردهی اولیهٔ مجدد یک DSO از طریق "dlclose" و "dlopen" وابسته است، میتوانید از -fno-gnu-unique استفاده کنید.
- -fpcc-struct-return
- مقادیر
«کوتاه»
"struct" و
"union" را
به جای
ثباتها،
همانند
ساختارهای
طولانیتر
در حافظه
بازمیگرداند.
این
قرارداد
کارایی
کمتری
دارد، اما
این مزیت را
داراست که
امکان
فراخوانی
متقابل بین
فایلهای
کامپایلشده
با GCC و
فایلهای
کامپایلشده
با سایر
کامپایلرها،
بهویژه Portable C
Compiler (pcc) را فراهم
میسازد.
قرارداد دقیق برای بازگرداندن ساختارها در حافظه به ماکروهای پیکربندی مقصد وابسته است.
ساختارها و اجتماعات (unions) کوتاه، آنهایی هستند که اندازه و تراز (alignment) آنها با نوعی از انواع عدد صحیح مطابقت دارد.
هشدار: کدی که با سوییچ -fpcc-struct-return کامپایل شده باشد، از نظر باینری با کدی که با سوییچ -freg-struct-return کامپایل شده سازگار نیست. از آن برای مطابقت با یک واسط دودویی برنامهٔ (ABI) غیرپیشفرض استفاده کنید..IP -freg-struct-return 4 بازگرداندن مقادیر "struct" و "union" در ثباتها (registers) در صورت امکان. این کار برای ساختارهای کوچک کارآمدتر از -fpcc-struct-return است.
اگر هیچیک از گزینههای -fpcc-struct-return یا -freg-struct-return را مشخص نکنید، GCC بهطور پیشفرض از هر قراردادی که برای مقصد استاندارد باشد استفاده میکند. اگر هیچ قرارداد استانداردی وجود نداشته باشد، GCC بهطور پیشفرض از -fpcc-struct-return استفاده میکند، مگر در مقصدهایی که GCC کامپایلر اصلی است. در چنین مواردی، میتوانیم استاندارد را انتخاب کنیم و گزینه کارآمدتر بازگرداندن از طریق ثبات را برگزیدهایم.
هشدار: کدی که با سوییچ -freg-struct-return کامپایل شده است، از نظر دودویی با کدی که با سوییچ -fpcc-struct-return کامپایل شده سازگار نیست. از آن برای سازگاری با یک رابط دودویی کاربردی (ABI) غیرپیشفرض استفاده کنید.
- -fshort-enums
- به یک نوع
داده "enum"
تنها به
تعداد
بایتهایی
که برای
بازه
مقادیر
ممکنِ
اعلانشده
نیاز دارد،
فضا اختصاص
میدهد.
بهطور
مشخص، نوع
"enum"
معادل با
کوچکترین
نوع داده
صحیحی
خواهد بود
که فضای
کافی داشته
باشد. این
گزینه برای
نوع داده
شمارشی با
یک نوع
زیربنایی
ثابت هیچ
اثری ندارد.
هشدار: سوییچ -fshort-enums باعث میشود GCC کدی تولید کند که از نظر دودویی با کدهای تولیدشده بدون این سوییچ سازگار نیست. از آن برای سازگاری با یک رابط دودویی کاربردی (ABI) غیرپیشفرض استفاده کنید.
- -fshort-wchar
- نوع
زیربنایی
را برای
"wchar_t"
تغییر داده
و بهجای
پیشفرضِ
مقصد، آن را
"short unsigned
int" قرار
میدهد. این
گزینه برای
ساخت
برنامههایی
که قرار است
تحت WINE اجرا
شوند مفید
است.
هشدار: سوییچ -fshort-wchar باعث میشود GCC کدی تولید کند که از نظر دودویی با کدهای تولیدشده بدون این سوییچ سازگار نیست. از آن برای سازگاری با یک رابط دودویی کاربردی (ABI) غیرپیشفرض استفاده کنید.
- -fcommon
- در کد C، این
گزینه
جایگذاری
متغیرهای
سراسری
تعریفشده
بدون
مقداردهی
اولیه (که
در
استاندارد C
به عنوان tentative
definitions شناخته
میشوند) را
کنترل
میکند.
تعاریف
آزمایشی (tentative
definitions) با
اعلانهای
یک متغیر با
کلیدواژه
"extern" که
فضایی
تخصیص
نمیدهند،
متمایز
هستند.
پیشفرض -fno-common است، که مشخص میکند کامپایلر متغیرهای سراسری مقداردهینشده را در بخش BSS از فایل شیء قرار دهد. این کار از ادغام تعاریف آزمایشی توسط پیونددهنده جلوگیری میکند، بنابراین اگر یک متغیر بهطور تصادفی در بیش از یک واحد کامپایل تعریف شده باشد، خطای تعریف چندگانه (multiple-definition) دریافت خواهید کرد.
گزینه -fcommon متغیرهای سراسری مقداردهینشده را در یک بلوک مشترک (common block) قرار میدهد. این به پیونددهنده اجازه میدهد تمام تعاریف آزمایشی یک متغیر یکسان را در واحدهای کامپایل مختلف به همان شیء، یا به یک تعریف غیرآزمایشی حل و فصل کند. این رفتار با ++C ناسازگار است، و در بسیاری از مقصدها موجب افت سرعت و افزایش حجم کد در ارجاعات متغیرهای سراسری میشود. این گزینه عمدتاً برای پیوند دادن کدهای قدیمی بدون خطا مفید است.
- -fno-ident
- -Qy
- -Qn
- -fno-ident انتشار دستورالعملهای اسمبلی ".ident" را متوقف کرده و باعث نادیده گرفته شدن دستور پیشپردازنده "#ident" میشود. -Qy و -Qn مترادفهای منسوخشده بهترتیب برای -fident و -fno-ident هستند.
- -finhibit-size-directive
- دستورالعمل اسمبلی ".size" یا هر چیز دیگری را که در صورت تکهتکه شدن تابع از وسط و قرار گرفتن دو نیمه در مکانهای دور از هم در حافظه موجب مشکل میشود، خروجی ندهید. این گزینه هنگام کامپایل crtstuff.c استفاده میشود؛ نباید نیازی به استفاده از آن برای موارد دیگر داشته باشید.
- -fverbose-asm
- اطلاعات
توضیحی (comment)
بیشتری را
در کد
اسمبلی
تولیدشده
قرار
میدهد تا
خوانایی آن
افزایش
یابد. این
گزینه
معمولاً
فقط برای
کسانی مفید
است که
واقعاً
نیاز به
خواندن کد
اسمبلی
تولیدشده
دارند
(احتمالاً
هنگام
اشکالزدایی
خودِ
کامپایلر).
-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
دوباره
کامپایل
کنید. (این
مقادیر
بیشینه
برابر 8k روی
SPARC، برابر 28k
روی AArch64 و 32k روی
m68k و RS/6000 است. x86
چنین
محدودیتی
ندارد.)
کد مستقل از موقعیت نیازمند پشتیبانی ویژه است و بنابراین فقط روی ماشینهای خاصی کار میکند. برای x86، کامپایلر GCC از PIC برای System V پشتیبانی میکند اما برای Sun 386i خیر. کدهای تولیدشده برای IBM RS/6000 همیشه مستقل از موقعیت هستند.
هنگامی که این پرچم تنظیم شود، ماکروهای "__pic__" و "__PIC__" برابر با 1 تعریف میشوند..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
بارگذاری
کرده و به
آن انشعاب
بزن. این
کار با حذف PLT
stubها و قرار
دادن
بارگذاریهای
GOT در معرض
بهینهسازیها،
منجر به کد
کارآمدتری
میشود. در
معماریهایی
مانند x86
۳۲-بیتی که PLT
stubها انتظار
دارند
اشارهگر GOT
در یک ثبات
خاص باشد،
این امر
آزادی عمل
بیشتری در
تخصیص ثبات
به
کامپایلر
میدهد.
پیوند تنبل
(Lazy binding) نیازمند
استفاده از
PLT است؛ با -fno-plt
تمام
نمادهای
خارجی در
زمان
بارگذاری
حلوفصل
میشوند.
همچنین، مشخصه تابع "noplt" میتواند برای جلوگیری از فراخوانی توابع خارجی خاص از طریق PLT استفاده شود.
در کد وابسته به موقعیت، تعداد اندکی از مقاصد نیز فراخوانی توابعی را که برای عدم استفاده از PLT علامتگذاری شدهاند به استفاده از GOT تبدیل میکنند.
- -fno-jump-tables
- برای دستورهای switch از جدولهای پرش استفاده نکن، حتی در مواردی که نسبت به سایر راهبردهای تولید کد کارآمدتر باشد. این گزینه در ترکیب با -fpic یا -fPIC برای ساخت کدی کاربرد دارد که بخشی از یک پیونددهنده پویا را تشکیل میدهد و نمیتواند به آدرس یک جدول پرش ارجاع دهد. در برخی مقاصد، جدولهای پرش نیازی به GOT ندارند و به این گزینه نیازی نیست.
- -fno-bit-tests
- برای دستورهای switch از آزمونهای بیتی استفاده نکن، حتی در مواردی که نسبت به سایر راهبردهای تولید کد کارآمدتر باشد.
- -ffixed-reg
- با ثبات با
نام reg
مانند یک
ثبات ثابت
رفتار کن؛
کد
تولیدشده
هرگز نباید
به آن ارجاع
دهد (مگر
احتمالاً
به عنوان
اشارهگر
پشته،
اشارهگر
فریم یا در
نقشی ثابت
از نوع
دیگر).
reg باید نام یک ثبات باشد. نامهای ثبات پذیرفتهشده مختص ماشین هستند و در ماکروی "REGISTER_NAMES" در فایل ماکروی توصیف ماشین تعریف شدهاند.
این پرچم فاقد شکل منفی است، زیرا یک انتخاب سهگانه را مشخص میکند.
- -fcall-used-reg
- با ثبات با
نام reg به
عنوان یک
ثبات
قابلتخصیص
رفتار کن که
با
فراخوانی
توابع
مخدوش
میشود.
ممکن است
برای
مقادیر
موقت یا
متغیرهایی
که پس از
فراخوانی
زنده
نمیمانند،
تخصیص یابد.
توابعی که
به این شیوه
کامپایل
میشوند،
ثبات reg را
ذخیره و
بازیابی
نمیکنند.
استفاده از این پرچم به همراه اشارهگر فریم یا اشارهگر پشته یک خطا است. استفاده از این پرچم برای سایر ثباتهایی که نقشهای ثابت و فراگیر در مدل اجرای ماشین دارند، نتایج فاجعهباری به بار میآورد.
این پرچم فاقد شکل منفی است، زیرا یک انتخاب سهگانه را مشخص میکند.
- -fcall-saved-reg
- با ثبات با
نام reg به
عنوان یک
ثبات
قابلتخصیص
رفتار کن که
توسط توابع
ذخیره
میشود. حتی
برای
مقادیر
موقت یا
متغیرهایی
که در طول
یک
فراخوانی
زنده
میمانند
نیز ممکن
است تخصیص
یابد.
توابعی که
به این روش
کامپایل
میشوند،
در صورت
استفاده از
ثبات reg، آن
را ذخیره و
بازیابی
میکنند.
استفاده از این پرچم به همراه اشارهگر فریم یا اشارهگر پشته یک خطا است. استفاده از این پرچم برای سایر ثباتهایی که نقشهای ثابت و فراگیر در مدل اجرای ماشین دارند، نتایج فاجعهباری به بار میآورد.
نوع متفاوتی از فاجعه در اثر استفاده از این پرچم برای ثباتی رخ میدهد که ممکن است مقادیر بازگشتی تابع در آن قرار گیرند.
این پرچم فاقد شکل منفی است، زیرا یک انتخاب سهگانه را مشخص میکند.
- -fpack-struct[=n]
- بدون تعیین
مقدار،
تمام اعضای
ساختار را
بدون هیچ
فضای خالی
کنار هم
فشردهسازی
کن. هنگامی
که مقداری
مشخص شود
(که باید
توان کوچکی
از دو
باشد)،
اعضای
ساختار را
بر اساس این
مقدار که
نمایانگر
بیشینه
تراز است
فشردهسازی
کن (یعنی
شیءهایی با
الزامات
تراز
پیشفرض
بزرگتر از
این مقدار،
احتمالاً
بهصورت
ترازنشده
در مکان
مناسب بعدی
در خروجی
قرار
میگیرند).
هشدار: سوئیچ -fpack-struct باعث میشود GCC کدی تولید کند که با کد تولیدشده بدون این سوئیچ سازگاری باینری ندارد. علاوه بر این، کد را زیربهینه میکند. از آن برای سازگاری با یک رابط باینری کاربردی (ABI) غیرپیشفرض استفاده کنید.
- -fleading-underscore
- این گزینه و
همتای آن،
-fno-leading-underscore، شیوه
نمایش
نمادهای
زبان C را در
فایل شیء
بهاجبار
تغییر
میدهند. یک
کاربرد آن
کمک به
پیوند با
کدهای
قدیمی
اسمبلی است.
هشدار: سوئیچ -fleading-underscore باعث میشود GCC کدی تولید کند که با کد تولیدشده بدون این سوئیچ سازگاری باینری ندارد. از آن برای سازگاری با یک رابط باینری کاربردی غیرپیشفرض استفاده کنید. همه مقاصد از این سوئیچ پشتیبانی کامل به عمل نمیآورند.
- -ftls-model=model
- مدل فضای
ذخیرهسازی
محلی نخ (TLS)
مورداستفاده
را تغییر
میدهد.
آرگومان 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]
- نمایانی
پیشفرض
نمادهای
تصویر ELF را
روی گزینه
تعیینشده
تنظیم
کن---تمام
نمادها با
این مشخصه
علامتگذاری
میشوند
مگر اینکه
درون کد لغو
شوند.
استفاده از
این ویژگی
میتواند
زمان پیوند
و بارگذاری
کتابخانههای
شیء مشترک
را به میزان
بسیار
چشمگیری
بهبود
بخشد، کد
بهینهتری
تولید کند،
صدور API
تقریباً
بینقصی
ارائه دهد و
از تداخل
نمادها
جلوگیری
کند.
اکیداً
توصیه
میشود که
در تمام
اشیاء
مشترکی که
توزیع
میکنید از
این گزینه
استفاده
کنید.
برخلاف نامگذاری، default همیشه به معنای عمومی (public) است؛ یعنی برای پیوند از خارج شیء مشترک در دسترس است. گزینههای protected و internal در کاربردهای واقعی چندان کاربردی ندارند، بنابراین تنها گزینه پرکاربرد دیگر hidden است. اگر -fvisibility مشخص نشود، حالت پیشفرض default است، یعنی تمام نمادها عمومی شوند.
توضیح خوبی از مزایای ناشی از اطمینان از نمایانی صحیح نمادهای ELF در مقاله «How To Write Shared Libraries» نوشته 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" همواره باید دارای نمایانی پیشفرض (default) باشند.
آگاه باشید که هدرهای خارج از پروژه شما، بهویژه هدرهای سیستمی و هدرهای هر کتابخانه دیگری که استفاده میکنید، ممکن است انتظار نداشته باشند با نمایانی دیگری غیر از پیشفرض کامپایل شوند. شاید لازم باشد پیش از افزودن هر یک از این هدرها، صراحتاً از "#pragma GCC visibility push(default)" استفاده کنید.
اعلانهای "extern" تحت تأثیر -fvisibility قرار نمیگیرند، بنابراین کدهای بسیاری را میتوان بدون هیچ تغییری با -fvisibility=hidden دوباره کامپایل کرد. با این حال، این بدان معناست که فراخوانی توابع "extern" بدون نمایانی صریح از PLT استفاده میکند، بنابراین مؤثرتر است که با استفاده از "__attribute ((visibility))" و/یا "#pragma GCC visibility" به کامپایلر اعلام شود کدام اعلانهای "extern" باید به صورت hidden تلقی گردند.
توجه داشته باشید که -fvisibility بر موجودیتهای پیوند مبهم در C++ اثر میگذارد. این بدان معناست که، برای نمونه، یک کلاس استثنا که بین DSOها پرتاب میشود، باید صراحتاً با نمایانی پیشفرض علامتگذاری شود تا گرههای type_info بین DSOها یکپارچه شوند.
مروری بر این روشها، مزایای آنها و نحوه استفاده از آنها در https://gcc.gnu.org/wiki/Visibility موجود است..IP -fstrict-volatile-bitfields 4 این گزینه باید زمانی استفاده شود که دسترسیها به فیلدهای بیتیِ فرار (volatile) (یا سایر فیلدهای ساختار، اگرچه کامپایلر معمولاً در هر حال به آن نوعها پایبند است) باید از یک دسترسی منفرد با پهنای نوعِ فیلد، و در صورت امکان همتراز با همترازی طبیعی استفاده کند. برای مثال، هدفهایی با ثباتهای جانبی نگاشتشده در حافظه (memory-mapped peripheral registers) ممکن است نیازمند آن باشند که تمام چنین دسترسیهایی پهنای ۱۶ بیتی داشته باشند؛ با این پرچم میتوانید تمام فیلدهای بیتی جانبی را بهصورت "unsigned short" تعریف کنید (با این فرض که روی این هدفها، short ۱۶ بیتی است) تا GCC را وادار کنید بهجای یک دسترسی احتمالاً کارآمدتر ۳۲ بیتی، از دسترسیهای ۱۶ بیتی استفاده کند.
اگر این گزینه غیرفعال باشد، کامپایلر کارآمدترین دستورالعمل را به کار میبرد. در مثال پیشین، این دستور ممکن است یک دستورالعمل بارگذاری ۳۲ بیتی باشد، حتی اگر این کار به بایتهایی دسترسی پیدا کند که شامل هیچ بخشی از فیلد بیتی نیستند، یا به ثباتهای نگاشتشده در حافظهای دست یابد که ربطی به ثباتِ در حال بهروزرسانی ندارند.
در برخی موارد، مانند زمانی که صفت "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++
هنگام
استفاده از
مقداردهی
اولیه با
صفر (zero-initialization)، یا
استاندارد 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 مانند مسیرهای جستجوی کتابخانهها نمایش میدهند. بهندرت پیش میآید که برای وظایف عادی کامپایل و پیوند دادن به استفاده از هر یک از این گزینهها نیاز داشته باشید.
بسیاری از گزینههای توسعهدهنده که باعث میشوند GCC خروجی را در یک فایل رونوشت (dump) بریزد، یک پسوند اختیاریِ =filename میپذیرند. میتوانید stdout یا - را برای رونوشت در خروجی استاندارد و stderr را برای خطای استاندارد مشخص کنید.
اگر =filename درج نشود، نام پیشفرض فایل رونوشت از بههم پیوستنِ نام پایهٔ فایل رونوشت، شمارهٔ گذر (pass number)، حرف فاز (phase letter) و نام گذر ساخته میشود. نام پایهٔ فایل رونوشت در صورتی که بهطور صریح مشخص شده باشد و یک فایل اجرایی نباشد، همان نام فایل خروجی تولیدشده توسط کامپایلر است؛ در غیر این صورت، نام فایل مبدأ خواهد بود. شمارهٔ گذر بر اساس ترتیبی که گذرها در مدیر گذرهای کامپایلر (pass manager) ثبت میشوند تعیین میگردد. این ترتیب عموماً با ترتیب اجرا یکسان است، اما گذرهایی که توسط پلاگینها ثبت شدهاند، گذرهای مختص هدف، یا گذرهایی که به هر نحوی دیر ثبت شدهاند، شمارهای بالاتر از گذر موسوم به final دریافت میکنند، حتی اگر زودتر اجرا شوند. حرف فاز یکی از این موارد است: i (تحلیل بینرویهای یا inter-procedural analysis)، l (مختص زبان)، r (RTL)، یا t (درخت یا tree). فایلها در دایرکتوریِ فایل خروجی ایجاد میشوند.
- -fcallgraph-info
- -fcallgraph-info=MARKERS
- کامپایلر
را وادار
میکند تا
اطلاعات
گراف
فراخوانی
(callgraph) برنامه
را به ازای
هر فایل شیء
(object file) در خروجی
بنویسد. این
اطلاعات در
قالب
متداول VCG
تولید
میشوند. در
صورتی که
فهرستی از
نشانگرهای
جداشده با
کاما نیز
مشخص شود،
میتوان
اطلاعات را
با
دادههای
اضافی به
ازای هر گره
و/یا هر یال
آراست.
هنگامی که
نشانگر
"su" مشخص
شود، گراف
فراخوانی
با اطلاعات
مصرف پشته (stack
usage) تکمیل
میگردد که
معادل با
-fstack-usage است.
هنگامی که
نشانگر
"da" مشخص
شود، گراف
فراخوانی
با اطلاعات
پیرامون
اشیای
تخصیصیافته
بهصورت
پویا تکمیل
میگردد.
هنگام کامپایل با -flto، هیچ اطلاعات گراف فراخوانی به همراه فایل شیء در خروجی درج نمیشود. در زمان پیوند LTO، گزینهٔ -fcallgraph-info ممکن است چندین فایل اطلاعات گراف فراخوانی را در کنار فایلهای خروجی میانیِ LTO ایجاد کند.
- -dletters
- --dump=letters
- --dump letters
- -fdump-rtl-pass
- -fdump-rtl-pass-options
- -fdump-rtl-pass-options=filename
- دستور
میدهد که
در حین
کامپایل و
در
زمانهایی
که با letters
هنگام
استفاده از
-d، یا با pass
هنگام
استفاده از
-fdump-rtl مشخص
میشود،
رونوشتهای
اشکالزدایی
ایجاد شوند.
این قابلیت
برای
اشکالزدایی
گذرهای
مبتنی بر RTL
در
کامپایلر
استفاده
میشود.
برخی از گزینههای -dletters هنگامی که از -E برای پیشپردازش استفاده میشود، معنای متفاوتی دارند.
قالب -options امکان واپایش بیشتری را روی جزئیات رونوشت فراهم میکند. گزینهٔ -fdump-tree را ببینید.
در ادامه نمونههای واقعی از گزینههای خط فرمان که از این الگوها پیروی میکنند و معانی آنها آورده شده است:
- -fdump-rtl-alignments
- رونوشت پس از محاسبهٔ همترازیهای انشعاب (branch alignments).
- -fdump-rtl-asmcons
- رونوشت پس از تصحیح دستورهای rtl که قیدهای ورودی/خروجیِ برآوردهنشده دارند.
- -fdump-rtl-auto_inc_dec
- رونوشت پس از شناسایی خودکار افزایش/کاهش (auto-inc-dec). این گذر تنها روی معماریهایی اجرا میشود که دستورالعملهای افزایش یا کاهش خودکار دارند.
- -fdump-rtl-barriers
- رونوشت پس از پاکسازی دستورالعملهای سد (barrier instructions).
- -fdump-rtl-bbpart
- رونوشت پس از بخشبندی بلوکهای پایهای داغ و سرد (hot and cold basic blocks).
- -fdump-rtl-bbro
- رونوشت پس از بازآرایی بلوکها (block reordering).
- -fdump-rtl-btl1
- -fdump-rtl-btl2
- -fdump-rtl-btl1 و -fdump-rtl-btl2 رونوشتگیری پس از دو گذرِ بهینهسازی بارگذاری مقصد انشعاب (branch target load optimization) را فعال میکنند..IP -fdump-rtl-bypass 4 تخلیه اطلاعات پس از دور زدن پرشها و بهینهسازیهای جریان کنترل.
- -fdump-rtl-combine
- تخلیه اطلاعات پس از مرحلهٔ ترکیب دستورالعملهای RTL.
- -fdump-rtl-compgotos
- تخلیه اطلاعات پس از تکثیر gotoهای محاسبهشده.
- -fdump-rtl-ce1
- -fdump-rtl-ce2
- -fdump-rtl-ce3
- -fdump-rtl-ce1، -fdump-rtl-ce2 و -fdump-rtl-ce3 تخلیه اطلاعات پس از سه مرحلهٔ تبدیل if را فعال میکنند.
- -fdump-rtl-cprop_hardreg
- تخلیه اطلاعات پس از انتشار رونوشت ثباتهای سختافزاری.
- -fdump-rtl-csa
- تخلیه اطلاعات پس از ترکیب تنظیمات پشته.
- -fdump-rtl-cse1
- -fdump-rtl-cse2
- -fdump-rtl-cse1 و -fdump-rtl-cse2 تخلیه اطلاعات را پس از دو مرحلهٔ حذف زیرعبارتهای مشترک فعال میکنند.
- -fdump-rtl-dce
- تخلیه اطلاعات پس از مراحل مستقل حذف کدهای مرده.
- -fdump-rtl-dbr
- تخلیه اطلاعات پس از زمانبندی انشعابهای تاخیری.
- -fdump-rtl-dce1
- -fdump-rtl-dce2
- -fdump-rtl-dce1 و -fdump-rtl-dce2 تخلیه اطلاعات را پس از دو مرحلهٔ حذف ذخیرهسازیهای مرده فعال میکنند.
- -fdump-rtl-eh
- تخلیه اطلاعات پس از نهاییسازی کدهای مدیریت EH.
- -fdump-rtl-eh_ranges
- تخلیه اطلاعات پس از تبدیل نواحی بازهٔ مدیریت EH.
- -fdump-rtl-expand
- تخلیه اطلاعات پس از تولید RTL.
- -fdump-rtl-fwprop1
- -fdump-rtl-fwprop2
- -fdump-rtl-fwprop1 و -fdump-rtl-fwprop2 تخلیه اطلاعات پس از دو مرحلهٔ انتشار رو به جلو را فعال میکنند.
- -fdump-rtl-gcse1
- -fdump-rtl-gcse2
- -fdump-rtl-gcse1 و -fdump-rtl-gcse2 تخلیه اطلاعات را پس از حذف سراسری زیرعبارتهای مشترک فعال میکنند.
- -fdump-rtl-init-regs
- تخلیه اطلاعات پس از مقداردهی اولیهٔ ثباتها.
- -fdump-rtl-initvals
- تخلیه اطلاعات پس از محاسبهٔ مجموعههای مقادیر اولیه.
- -fdump-rtl-into_cfglayout
- تخلیه اطلاعات پس از تبدیل به حالت cfglayout.
- -fdump-rtl-ira
- تخلیه اطلاعات پس از تخصیص تکرارشوندهٔ ثباتها.
- -fdump-rtl-jump
- تخلیه اطلاعات پس از دومین بهینهسازی پرش.
- -fdump-rtl-loop2
- -fdump-rtl-loop2 تخلیه اطلاعات پس از مراحل بهینهسازی حلقه در RTL را فعال میکند.
- -fdump-rtl-mach
- تخلیه اطلاعات پس از اجرای مرحلهٔ بازسازماندهی وابسته به ماشین، در صورت وجود آن مرحله.
- -fdump-rtl-mode_sw
- تخلیه اطلاعات پس از حذف تعویضهای زاید حالت.
- -fdump-rtl-rnreg
- تخلیه اطلاعات پس از شمارهگذاری مجدد ثباتها.
- -fdump-rtl-outof_cfglayout
- تخلیه اطلاعات پس از تبدیل از حالت cfglayout.
- -fdump-rtl-peephole2
- تخلیه اطلاعات پس از مرحلهٔ روزنه (peephole).
- -fdump-rtl-postreload
- تخلیه اطلاعات پس از بهینهسازیهای پسا-بارگذاری مجدد (post-reload).
- -fdump-rtl-pro_and_epilogue
- تخلیه اطلاعات پس از تولید پیشدرآمدها و پسدرآمدهای تابع.
- -fdump-rtl-sched1
- -fdump-rtl-sched2
- -fdump-rtl-sched1 و -fdump-rtl-sched2 تخلیه اطلاعات را پس از مراحل زمانبندی بلوکهای پایه فعال میکنند.
- -fdump-rtl-ree
- تخلیه اطلاعات پس از حذف گسترش علامت/صفر.
- -fdump-rtl-seqabstr
- تخلیه اطلاعات پس از کشف توالیهای مشترک.
- -fdump-rtl-shorten
- تخلیه اطلاعات پس از کوتاهسازی انشعابها.
- -fdump-rtl-split1
- -fdump-rtl-split2
- -fdump-rtl-split3
- -fdump-rtl-split4
- -fdump-rtl-split5
- این گزینهها تخلیه اطلاعات پس از پنج دور تقسیم دستورالعملها را فعال میکنند.
- -fdump-rtl-sms
- تخلیه اطلاعات پس از زمانبندی پیمانهای (modulo scheduling). این مرحله تنها روی برخی از معماریها اجرا میشود.
- -fdump-rtl-stack
- تخلیه اطلاعات پس از تبدیل ثباتهای «مجموعه ثبات تخت» مربوط به GCC به ثباتهای پشتهمانند x87. این مرحله تنها روی نسخههای x86 اجرا میشود.
- -fdump-rtl-subreg1
- -fdump-rtl-subreg2
- -fdump-rtl-subreg1 و -fdump-rtl-subreg2 تخلیه اطلاعات را پس از دو مرحلهٔ بسط subreg فعال میکنند.
- -fdump-rtl-vartrack
- تخلیه اطلاعات پس از ردیابی متغیرها.
- -fdump-rtl-vregs
- تخلیه اطلاعات پس از تبدیل ثباتهای مجازی به ثباتهای سختافزاری.
- -fdump-rtl-web
- تخلیه اطلاعات پس از تقسیم بازهٔ حیات.
- -fdump-rtl-regclass
- -fdump-rtl-subregs_of_mode_init
- -fdump-rtl-subregs_of_mode_finish
- -fdump-rtl-dfinit
- -fdump-rtl-dfinish
- این دامپها تعریف شدهاند اما همواره فایلهای خالی تولید میکنند.
- -da
- --dump=a
- -fdump-rtl-all
- تولید تمام دامپهای فهرستشده در بالا.
- -dA
- --dump=A
- حاشیهنویسی خروجی اسمبلر با اطلاعات گوناگون اشکالزدایی.
- -dD
- --dump=D
- تخلیه تمام تعاریف ماکرو در پایان پیشپردازش، علاوه بر خروجی عادی.
- -dH
- --dump=H
- تولید یک core dump هر زمان که خطایی رخ دهد.
- -dp
- --dump=p
- حاشیهنویسی خروجی اسمبلر با یادداشتی که مشخص میکند کدام الگو و جایگزین استفاده شده است. طول و هزینه هر دستورالعمل نیز چاپ میشود.
- -dP
- --dump=P
- تخلیه RTL در خروجی اسمبلر به عنوان یادداشت پیش از هر دستورالعمل. همچنین حاشیهنویسی -dp را نیز فعال میکند.
- -dx
- --dump=x
- صرفاً تولید 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-internal-locations
- تخلیه اطلاعات دقیق درباره بازنمایی داخلی GCC از مکانهای کد منبع.
- -fdump-ipa-switch
- -fdump-ipa-switch-options
- کنترل تخلیه درخت زبان تحلیل بینروالی (inter-procedural analysis) در مراحل مختلف در یک فایل. نام فایل با افزودن یک پسوند خاص هر switch به نام فایل منبع ایجاد میشود، و فایل در همان دایرکتوریِ فایل خروجی ساخته میشود. دامپهای زیر امکانپذیر هستند:
- all
- تمام دامپهای تحلیل بینروالی را فعال میکند.
- cgraph
- اطلاعات مربوط به بهینهسازی گراف فراخوانی (call-graph)، حذف توابع بدون استفاده، و تصمیمهای درونخطیسازی (inlining) را تخلیه میکند.
- inline
- تخلیه پس از درونخطیسازی تابع.
- strubm
- تخلیه پس از انتخاب حالتهای "strub" و ثبت انتخابها به عنوان ویژگیهای تابع.
- strub
- تخلیه تبدیلات "strub": تغییرات رابط، لفافپیچی توابع (function wrapping)، و درج فراخوانیهای توکار (builtin) برای پاکسازی پشته (stack scrubbing) و واترمارکگذاری.
علاوه بر این، گزینههای -optimized، -missed، -note و -all را میتوان با همان معنایی که برای -fopt-info دارند مشخص کرد، که مقدار پیشفرض آن -optimized است.
برای نمونه، -fdump-ipa-inline-optimized-missed اطلاعات مربوط به جایگاههای فراخوانی که درونخطی شدهاند را به همراه جایگاههای فراخوانی که درونخطی نشدهاند منتشر خواهد کرد.
بهطور پیشفرض، دامپ شامل پیامهایی درباره بهینهسازیهای موفقیتآمیز (معادل -optimized) به همراه جزئیات سطح پایین درباره تحلیل خواهد بود.
- -fdump-ipa-clones
- یک فایل
دامپ شامل
اطلاعات
مربوط به
ایجاد
کلونهای
گره گراف
فراخوانی و
حذف
گرههای
گراف
فراخوانی
در طول
بهینهسازیها
و تبدیلات
بینروالی
ایجاد
میکند.
کاربرد
اصلی آن این
است که
ابزارهای
ایجاد
وصلههای
زنده (live-patches)
بتوانند
مجموعه
توابعی را
که برای
جایگزینی
کامل یک
تابع خاص
نیاز به
وصله زنده
دارند،
تعیین کنند
(به -flive-patching
مراجعه
کنید). نام
فایل با
افزودن
پسوند
"ipa-clones" به
نام فایل
منبع ایجاد
میشود و
فایل در
همان
دایرکتوریِ
فایل خروجی
ساخته
میشود. هر
ورودی در
فایل در یک
خط جداگانه
قرار دارد
که فیلدهای
آن با نقطه
ویرگول (semicolon)
از یکدیگر
جدا
شدهاند.
در صورت ایجاد کلون در گراف فراخوانی، فیلدهای مجزا عبارتند از:
- 1.
- رشته "Callgraph clone".
- 2.
- نام تابعی که در حال کلون شدن است، همانطور که به اسمبلر ارائه میشود.
- 3.
- عددی که تابع در حال کلون شدن را بهطور یکتا در گراف فراخوانی نمایش میدهد. توجه داشته باشید که این عدد تنها در یک واحد کامپایل یا درون تحلیل کل برنامه (whole-program analysis) یکتا است، اما احتمالاً در این دو فاز متفاوت خواهد بود.
- 4.
- نام فایل منبعی که تابع در آن تعریف شده است.
- 5.
- شماره خطی که تعریف تابع در آن واقع شده است.
- 6.
- شماره ستونی که تعریف تابع در آن واقع شده است.
- 7.
- نام کلون جدید تابع، همانطور که به اسمبلر ارائه میشود.
- 8.
- عددی که کلون جدید تابع را بهطور یکتا در گراف فراخوانی نمایش میدهد. توجه داشته باشید که این عدد تنها در یک واحد کامپایل یا درون تحلیل کل برنامه یکتا است، اما احتمالاً در این دو فاز متفاوت خواهد بود..IP 9. 4 نام فایل منبعی که مکان کد منبع کلون جدید به آن اشاره میکند.
- 10.
- خطی که مکان کد منبع کلون جدید به آن اشاره میکند.
- 11.
- ستونی که مکان کد منبع کلون جدید به آن اشاره میکند.
- 12.
- رشتهای که دلیل کلونسازی را مشخص میکند.
در صورت حذف کلون از گراف فراخوانی، فیلدهای جداگانه عبارتند از:
- 1.
- رشتهٔ "Callgraph removal".
- 2.
- نام تابعی که در حال حذف است، به همان صورتی که به اسمبلر ارائه میشود.
- 3.
- عددی که به طور یکتا تابع در حال کلونشدن را در گراف فراخوانی مشخص میکند. توجه داشته باشید که این عدد فقط در یک واحد ترجمه یا در تحلیل کل برنامه یکتا است، اما احتمالاً در این دو فاز متفاوت خواهد بود.
- 4.
- نام فایل منبعی که تابع در آن تعریف شده است.
- 5.
- خطی که تعریف تابع در آن قرار دارد.
- 6.
- ستونی که تعریف تابع در آن قرار دارد.
- -fdump-lang
- تخلیه اطلاعات مختص به زبان. نام فایل با افزودن .lang به انتهای نام فایل منبع ساخته میشود.
- -fdump-lang-all
- -fdump-lang-switch
- -fdump-lang-switch-options
- -fdump-lang-switch-options=filename
- کنترل تخلیه اطلاعات مختص زبان. بخشهای options و filename همانطور که در گزینهٔ -fdump-tree شرح داده شده عمل میکنند. -fdump-tree-all تمام تخلیههای مختص زبان را فعال میکند؛ سایر گزینهها بسته به زبان متفاوت هستند. برای نمونه، ببینید
- -fdump-passes
- چاپ فهرست گذرهای بهینهسازی که با گزینههای خط فرمان فعلی فعال یا غیرفعال شدهاند در stderr.
- -fdump-statistics-option
- فعالسازی و کنترل تخلیه آمار گذرها در فایلی جداگانه. نام فایل با افزودن یک پسوند منتهی به .statistics به انتهای نام فایل منبع ایجاد میشود، و فایل در همان دایرکتوریِ فایل خروجی ساخته میشود. اگر ساختار -option به کار رود، -stats باعث میشود شمارندهها روی کل واحد ترجمه جمع زده شوند در حالی که -details هر رویداد را به محض تولید توسط گذرها تخلیه میکند. حالت پیشفرض بدون هیچ گزینهای، جمع زدن شمارندهها به ازای هر تابع کامپایلشده است.
- -fdump-tree-all
- -fdump-tree-switch
- -fdump-tree-switch-options
- -fdump-tree-switch-options=filename
- کنترل تخلیه در مراحل مختلف پردازش درخت زبان میانی به یک فایل. اگر از ساختار -options استفاده شود، options فهرستی از گزینههای جداشده با - است که جزئیات تخلیه را کنترل میکنند. همهٔ گزینهها برای همهٔ تخلیهها قابل اعمال نیستند؛ مواردی که کاربردی ندارند نادیده گرفته میشوند. گزینههای زیر در دسترس هستند
- address
- چاپ آدرس هر گره. معمولاً این مقدار فاقد معنای خاصی است زیرا بر اساس محیط و فایل منبع تغییر میکند. کاربرد اصلی آن برای مرتبط ساختن یک فایل تخلیه با محیط اشکالزدایی است.
- asmname
- اگر برای یک تعریف مشخص مقدار "DECL_ASSEMBLER_NAME" تنظیم شده باشد، در تخلیه به جای "DECL_NAME" از آن استفاده میشود. کاربرد اصلی آن تسهیل کار در ردیابی رو به عقب از نامهای درهمریخته در فایل اسمبلی است.
- slim
- هنگام
تخلیه
نمایشهای
میانی بخش
فرانتاند،
از تخلیه
اعضای یک
حوزه یا
بدنهٔ یک
تابع صرفاً
به این دلیل
که به آن
حوزه
دسترسی
پیدا شده
جلوگیری
میکند.
تنها
مواردی را
تخلیه
میکند که
مستقیماً
از یک مسیر
دیگر قابل
دسترسی
باشند.
هنگام تخلیه درختهای قالببندیشده، این گزینه از تخلیه بدنههای ساختارهای کنترلی جلوگیری میکند.
هنگام تخلیه RTL، به جای نمایش پیشفرض شبیه به LISP، خروجی RTL را در قالب فشرده (slim) چاپ میکند.
- raw
- چاپ یک نمایش خام از درخت. بهطور پیشفرض، درختها با قالبی مرتب و شبیه به C نمایش داده میشوند.
- details
- فعالسازی تخلیه با جزئیات بیشتر (در همهٔ گزینههای تخلیه پشتیبانی نمیشود). همچنین شامل اطلاعات حاصل از گذرهای بهینهسازی نیز میشود.
- stats
- فعالسازی تخلیه آمارهای مختلف پیرامون گذر (در همهٔ گزینههای تخلیه پشتیبانی نمیشود).
- blocks
- فعالسازی نمایش مرزهای بلوک پایه (در تخلیههای خام غیرفعال است).
- graph
- به ازای هر
یک از سایر
فایلهای
تخلیهٔ
مشخصشده
(-fdump-rtl-pass)،
نمایشی از
گراف جریان
کنترل
مناسب برای
مشاهده با GraphViz
را در file.passid.pass.dot
تخلیه
میکند. هر
تابع در
فایل به
عنوان یک
زیرگراف
قالببندی
میشود تا GraphViz
بتواند
همهٔ آنها
را در یک
نمودار
واحد رسم
کند.
خروجی RTL همیشه به صورت فشرده (slim) تخلیه میشود.
- vops
- فعالسازی نمایش عملوندهای مجازی برای هر دستور.
- lineno
- فعالسازی نمایش شماره خطوط برای دستورها.
- uid
- فعالسازی نمایش شناسهٔ یکتا ("DECL_UID") برای هر متغیر.
- verbose
- فعالسازی نمایش تخلیهٔ درختی برای هر دستور.
- eh
- فعالسازی نمایش شمارهٔ ناحیهٔ EH که هر دستور را در بر دارد.
- scev
- فعالسازی نمایش جزئیات تحلیل تکامل اسکالر.
- optimized
- فعالسازی نمایش اطلاعات بهینهسازی (تنها در گذرهای مشخصی در دسترس است).
- missed
- فعالسازی نمایش اطلاعات بهینهسازیهای از دسترفته (تنها در گذرهای مشخصی در دسترس است).
- note
- فعالسازی سایر اطلاعات تفصیلی بهینهسازی (تنها در گذرهای مشخصی در دسترس است).
- folding
- فعالسازی تخلیه اطلاعات درباره الگوهای match-and-simplify (match.pd)، هنگامی که اعمال میشوند.
- all
- فعال کردن تمام گزینهها، به جز raw، slim، verbose و lineno.
- optall
- فعال کردن تمام گزینههای بهینهسازی، یعنی optimized، missed و note.
برای تعیین اینکه چه تخلیههای درختی در دسترس هستند یا یافتن تخلیهٔ مربوط به یک گذر مورد نظر، مراحل زیر را دنبال کنید..IP 1. 4 دستور GCC را با -fdump-passes فراخوانی کنید و در خروجی stderr به دنبال کدی بگردید که متناظر با گذر (pass) مورد نظر شما است. برای نمونه، کدهای "tree-evrp"، "tree-vrp1" و "tree-vrp2" متناظر با سه گذر انتشار محدوده مقدار (Value Range Propagation) هستند. عدد موجود در انتها، فراخوانیهای متمایز از یک گذر مشابه را تفکیک میکند.
- 2.
- برای فعالسازی ایجاد فایل رونوشت (dump)، کد گذر را به پیشوند گزینهٔ -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
- -fopt-info-options
- -fopt-info-options=filename
- رونوشتهای
بهینهسازی
را از
گذرهای
مختلف
بهینهسازی
کنترل
میکند. اگر
قالب -options به
کار رود، options
فهرستی از
کلیدواژههای
گزینهها
است که با -
از یکدیگر
جدا
شدهاند تا
جزئیات
رونوشت و
بهینهسازیها
را انتخاب
کنند.
گزینههای options را میتوان به سه گروه تقسیم کرد:
- 1.
- گزینههایی که توصیف میکنند چه نوع پیامهایی باید ارسال شوند،
- 2.
- گزینههایی که میزان پرگویی (verbosity) رونوشت را توصیف میکنند، و
- 3.
- گزینههایی که توصیف میکنند چه بهینهسازیهایی باید لحاظ شوند.
گزینههای هر گروه را میتوان آزادانه ترکیب کرد چرا که همپوشانی ندارند. با این حال، در صورت بروز هرگونه تداخل، گزینههای متأخر در خط فرمان بر گزینههای متقدم اولویت خواهند داشت.
گزینههای زیر کنترل میکنند که چه نوع پیامهایی باید ارسال شوند:
- optimized
- هنگامی که یک بهینهسازی با موفقیت اعمال میشود، اطلاعات را چاپ میکند. تصمیمگیری در مورد این که چه اطلاعاتی مرتبط هستند بر عهدهٔ خود گذر است. برای نمونه، گذرهای بردارساز (vectorizer) مکان مبدأ حلقههایی را که با موفقیت برداری شدهاند، چاپ میکنند.
- missed
- اطلاعات مربوط به بهینهسازیهای از دسترفته را چاپ میکند. گذرهای منفرد کنترل میکنند که چه اطلاعاتی در خروجی گنجانده شود.
- note
- اطلاعات پرگو دربارهٔ بهینهسازیها را چاپ میکند، مانند تبدیلات خاص، پیامهای دقیقتر دربارهٔ تصمیمگیریها و غیره.
- all
- اطلاعات تفصیلی بهینهسازی را چاپ میکند. این شامل optimized، missed و note میشود.
گزینهٔ زیر میزان پرگویی رونوشت را کنترل میکند:
- internals
- بهطور پیشفرض، تنها پیامهای «سطح بالا» (high-level) ارسال میشوند. این گزینه پیامهای بیشتر و دقیقتری را فعال میکند که احتمالاً فقط برای توسعهدهندگان GCC جالب توجه خواهد بود.
یک یا چند مورد از کلیدواژههای گزینههای زیر را میتوان برای توصیف یک گروه از بهینهسازیها به کار برد:
- ipa
- فعالسازی رونوشتها از تمام بهینهسازیهای بینرویهای (interprocedural).
- loop
- فعالسازی رونوشتها از تمام بهینهسازیهای حلقه (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 تولید میشود که شامل رونوشتهایی از بردارساز در مورد فرصتهای از دسترفته است. یک پروندهٔ SRCFILE.opt-record.json.gz با جزئیات بهینهسازیهای انجامشده، برای بهینهسازیهایی که از -fopt-info پشتیبانی میکنند، مینویسد.
این گزینه آزمایشی است و قالب دادههای درون پروندهٔ فشردهٔ JSON ممکن است تغییر کند.
این گزینه تقریباً معادل یک نسخهٔ ماشینخوان از -fopt-info-all است، بهصورت مجموعهای از پیامها به همراه پروندهٔ مبدأ، شمارهٔ خط و شمارهٔ ستون، همراه با دادههای تکمیلی زیر برای هر پیام:
- تعداد دفعات اجرای کدی که بهینهسازی میشود، به همراه فرادادههایی دربارهٔ این که آیا این مقدار از دادههای پروفایل واقعی بوده است یا صرفاً یک برآورد، که به مصرفکنندگان امکان اولویتبندی پیامها بر اساس میزان داغی (hotness) کد را میدهد،
- نام تابع مربوط به کدی که بهینهسازی میشود، در صورت وجود،
- «زنجیرهٔ درونخطیسازی» (inlining chain) برای کدی که بهینهسازی میشود، تا هنگامی که یک تابع در چندین مکان مختلف درونخطی میشود (که خود آنها نیز ممکن است درونخطی شده باشند)، خواننده بتواند نسخهها را از یکدیگر تشخیص دهد،
- اشیایی که مشخصکنندهٔ بخشهایی از پیام هستند که به عبارتها، دستورها یا گرههای جدول نماد ارجاع دارند، نوع دستهبندی آنها، و در صورت دسترسی، مکان آنها در کد مبدأ،
- گذر (pass) کامپایلر GCC که پیام را صادر کرده است، و
- مکانی در کد خود GCC که پیام از آنجا صادر شده است
علاوه بر این، برخی از پیامها بهطور منطقی درون پیامهای دیگر تو در تو شدهاند که بازتابدهندهٔ جزئیات پیادهسازی گذرهای بهینهسازی است.
- -fsched-verbose=n
- در
مقصدهایی
که از
زمانبندی
دستورالعملها
استفاده
میکنند،
این گزینه
میزان
خروجی
اشکالزدایی
را که
زمانبند
در
پروندههای
تخلیه (dump) چاپ
میکند،
کنترل
مینماید.
برای مقادیر n بزرگتر از صفر، -fsched-verbose اطلاعات مشابه -fdump-rtl-sched1 و -fdump-rtl-sched2 را خروجی میدهد. برای مقادیر n بزرگتر از یک، همچنین احتمالهای بلوک پایه، اطلاعات دقیق فهرست آماده و اطلاعات واحد/دستورالعمل را خروجی میدهد. برای مقادیر n بزرگتر از دو، شامل RTL در نقطهٔ لغو (abort)، جریان کنترل و اطلاعات ناحیهها است. و برای 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) به نام 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
- گذر درختی به نام pass را فعال میکند. برای شرح آرگومانهای گزینه، -fdisable-rtl را ببینید.
در اینجا چند مثال برای نمایش استفاده از این گزینهها آورده شده است.
# disable ccp1 for all functions -fdisable-tree-ccp1 # disable complete unroll for function whose cgraph node uid is 1 -fenable-tree-cunroll=1 # disable gcse2 for functions at the following ranges [1,1], # [300,400], and [400,1000] # disable gcse2 for functions foo and foo2 -fdisable-rtl-gcse2=foo,foo2 # disable early inlining -fdisable-tree-einline # disable ipa inlining -fdisable-ipa-inline # enable tree full unroll -fenable-tree-unroll
- -fchecking
- -fchecking=n
- بررسی سازگاری درونی را فعال میکند. مقدار پیشفرض به پیکربندی کامپایلر بستگی دارد. -fchecking=2 بررسیهای سازگاری درونی بیشتری را فعال میکند که ممکن است بر تولید کد تأثیر بگذارد.
- -frandom-seed=string
- این گزینه
یک دانه (seed) را
فراهم
میکند که GCC
بهجای
اعداد
تصادفی در
تولید برخی
نامهای
نماد که
باید در هر
پروندهٔ
کامپایلشده
متفاوت
باشند، از
آن استفاده
میکند.
همچنین
برای قرار
دادن
مهرهای
یکتا در
پروندههای
دادههای
پوشش (coverage) و
پروندههای
شیئی که
آنها را
تولید
میکنند به
کار میرود.
میتوانید
از گزینهٔ
-frandom-seed برای
تولید
پروندههای
شیء
بازتولیدپذیر
و یکسان
استفاده
کنید.
مقدار string میتواند یک عدد (دهدهی، هشتهشتی، یا شانزدهشانزدهی) یا یک رشتهٔ دلخواه باشد (که در این صورت با محاسبهٔ CRC32 به یک عدد تبدیل میشود).
مقدار string باید برای هر پروندهای که کامپایل میکنید متفاوت باشد.
- -save-temps
- --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 عمل میکند..IP -specs=file 4
- --specs=file
- --specs file
- فایل file را پس از خواندن فایل استاندارد specs توسط کامپایلر پردازش میکند تا پیشفرضهایی را که برنامهٔ گردانندهٔ gcc هنگام تعیین سوئیچهای ارسالی به cc1، cc1plus، as، ld و غیره استفاده میکند، بازنویسی کند. بیش از یک -specs=file را میتوان در خط فرمان مشخص کرد، و آنها به ترتیب، از چپ به راست پردازش میشوند.
- -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 تخلیه (dump) میکند. اگر آرگومان اختیاری حذف شود (یا اگر file برابر "." باشد)، نام فایل تخلیه با افزودن ".gkd" به نام پایهٔ تخلیه تعیین میشود؛ گزینهٔ -dumpbase را ببینید.
- -fcompare-debug[=opts]
- اگر در طول
کامپایل
خطایی رخ
ندهد،
کامپایلر
را برای بار
دوم اجرا
میکند و opts
و -fcompare-debug-second را به
آرگومانهای
ارسالی به
کامپایل
دوم
میافزاید.
بازنمایی
درونی
نهایی را در
هر دو
کامپایل
تخلیه کرده
و در صورت
تفاوت
داشتن
آنها،
خطایی چاپ
میکند.
اگر علامت مساوی حذف شود، مقدار پیشفرض -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" در
حین
کامپایل
دوم باشند و
از
بازنویسی
روی
فایلهای
تولیدشده
در کامپایل
اول
جلوگیری
شود.
هنگامی که این گزینه به گردانندهٔ کامپایلر فرستاده میشود، باعث رد شدن کامپایل first (اول) میگردد، که کاربرد آن را تقریباً تنها به اشکالزدایی خود کامپایلر محدود میکند.
- -gtoggle
- تولید اطلاعات اشکالزدایی را خاموش میکند اگر در صورت عدم استفاده از این گزینه تولید میشد، یا در غیر این صورت آن را در سطح ۲ روشن میکند. جایگاه این آرگومان در خط فرمان اهمیتی ندارد؛ پس از پردازش تمام گزینههای دیگر اعمال میشود و صرفنظر از اینکه چند بار داده شده باشد، تنها یک بار اعمال خواهد شد. این گزینه عمدتاً برای استفاده همراه با -fcompare-debug در نظر گرفته شده است.
- -fvar-tracking-assignments-toggle
- گزینهٔ -fvar-tracking-assignments را تغییر وضعیت میدهد، همانگونه که -gtoggle وضعیت -g را تغییر میدهد.
- -Q
- هنگامی که
در خط فرمان
پیش از --help=
استفاده
شود، -Q به
عنوان
تغییردهندهٔ
خروجی
راهنما عمل
میکند.
در غیر این صورت، این گزینه باعث میشود کامپایلر نام هر تابع را هنگام کامپایل شدن چاپ کند، و پس از اتمام هر گذر (pass)، آماری را در مورد آن چاپ نماید.
- -ftime-report
- باعث
میشود
کامپایلر
پس از اتمام
هر گذر (pass)،
آماری را
دربارهٔ
زمان
مصرفشده
توسط آن در stderr
چاپ کند.
اگر خروجی SARIF برای اعلانهای تشخیصی از طریق -fdiagnostics-format=sarif-file یا -fdiagnostics-format=sarif-stderr درخواست شده باشد، اطلاعات -ftime-report در عوض در قالب JSON و به عنوان بخشی از خروجی SARIF صادر میشود. قالب دقیق این دادههای JSON ممکن است تغییر کند و ممکن است مقادیر به دلیل ثبت در نقطهای کمی متفاوت در کامپایلر، دقیقاً با مقادیر ارسالشده به stderr مطابقت نداشته باشند.
- -ftime-report-details
- زمان مصرفشده توسط بخشهای زیرساختی را برای هر گذر (pass) بهطور جداگانه ثبت میکند.
- -fira-verbose=n
- میزان پرگویی (verbosity) فایل تخلیه را برای تخصیصدهندهٔ یکپارچهٔ ثباتها (integrated register allocator) کنترل میکند. مقدار پیشفرض 5 است. اگر مقدار n بزرگتر یا مساوی 10 باشد، خروجی تخلیه با همان قالبِ n منهای 10 به 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
را ممکن
میسازد تا
کتابخانههای
مقصد (target libraries) با
گزینههایی
متفاوت از
آنچه
کامپایلر
بهطور
پیشفرض
برای
استفاده از
آنها
پیکربندی
شده است
ساخته
شوند؛ این
کار از طریق
specs
تنظیمشده
توسط
بخشهای
درونی
کامپایلر،
توسط مقصد
(target)، یا توسط
سازندگان
در زمان
پیکربندی
انجام
میشود.
مانند "TFLAGS"، این گزینه امکان ساخت کتابخانههای مقصد را برای محیطهای پایهٔ سازگار و قابلحمل فراهم میکند، در حالی که پیشفرض کامپایلر محیطهای پیشرفتهتر است. این امر مفید است زیرا کاربران در صورتی که پیشفرضها برای محیط مقصدشان ایدهآل نباشد، میتوانند بهراحتی پیشفرضهای پیکربندیشدهٔ کامپایلر را برای ساخت برنامههای خود بازنویسی کنند، در حالی که ساخت مجدد کتابخانههای زمان اجرا معمولاً به این آسانی یا مطلوبی نیست.
برخلاف "TFLAGS"، استفاده از specs امکان انتخاب پرچمهای متفاوت را برای multilibهای گوناگون فراهم میکند. روش دستیابی به این هدف، ساخت با make TFLAGS=-fmultiflags پس از پیکربندی با --with-specs=%{fmultiflags:...} است.
این گزینه پس از اینکه گرداننده پردازش driver self spec را به پایان رساند، کنار گذاشته میشود.
همچنین برای بررسی اینکه آیا "TFLAGS" برای ساخت تمام کتابخانههای مقصد استفاده میشود یا خیر، با پیکربندی یک کامپایلر non-bootstrap از طریق --with-specs='%{!fmultiflags:%emissing TFLAGS}' و سپس ساخت کامپایلر و کتابخانههای مقصد، مفید است..IP -fprofile-report 4 باعث میشود کامپایلر آمارههایی را دربارهٔ سازگاری نمایهٔ (تخمینی) و اثر گذرهای مجزا چاپ کند.
- -fstack-usage
- باعث میشود کامپایلر اطلاعات مصرف پشته (stack usage) را برای برنامه، بر پایهٔ هر تابع خروجی دهد. نام فایل این خروجی با الحاق .su به auxname ساخته میشود. مقدار auxname از نام فایل خروجی تولید میشود، چنانچه صراحتاً مشخص شده باشد و فایل اجرایی نباشد، در غیر این صورت نام پایه (basename) فایل منبع خواهد بود. هر مدخل از سه فیلد تشکیل شده است:
- نام تابع.
- تعداد بایتها.
- یک یا چند توصیفکننده: "static"، "dynamic"، "bounded".
توصیفکنندهٔ "static" به این معنی است که تابع پشته را بهطور ایستا دستکاری میکند: هنگام ورود به تابع، تعداد بایتهای ثابتی برای فریم تخصیص مییابد و هنگام خروج از تابع آزاد میشود؛ هیچ تنظیم دیگری روی پشته درون تابع انجام نمیشود. فیلد دوم، همین تعداد بایتهای ثابت است.
توصیفکنندهٔ "dynamic" به این معنی است که تابع پشته را بهطور پویا دستکاری میکند: علاوه بر تخصیص ایستای شرحدادهشده در بالا، تنظیماتی روی پشته در بدنهٔ تابع انجام میشود، برای مثال برای push/pop کردن آرگومانها هنگام فراخوانی توابع. اگر توصیفکنندهٔ "bounded" نیز وجود داشته باشد، مقدار این تنظیمات در زمان کامپایل کراندار (محدود) است و فیلد دوم، یک کران بالا از کل مقدار پشتهٔ مصرفشده توسط تابع است. اگر وجود نداشته باشد، مقدار این تنظیمات در زمان کامپایل کراندار نیست و فیلد دوم تنها نمایانگر بخش کراندار است.
- -fstats
- در پایان کامپایل، آمارههایی دربارهٔ پردازش بخش جلویی (front-end) صادر میکند. این گزینه تنها توسط فرانتاند ++C پشتیبانی میشود و این اطلاعات عموماً فقط برای تیم توسعهٔ ++G مفید است.
- -fdbg-cnt-list
- نام و کران بالای شمارنده را برای تمام شمارندههای اشکالزدایی چاپ میکند.
- -fdbg-cnt=counter-value-list
- کران پایین و بالای شمارندهٔ اشکالزدایی داخلی را تعیین میکند. counter-value-list فهرستی از تاپلهای جداشده با کاما به شکل name:lower_bound1-upper_bound1 [:lower_bound2-upper_bound2...] است که نام شمارنده و فهرستی از بازههای بسته را تعیین میکند. مقدار lower_bound اختیاری است و در صورت تنظیم نشدن، با صفر مقداردهی اولیه میشود. برای نمونه، با -fdbg-cnt=dce:2-4:10-11,tail_call:10، دستور dbg_cnt(dce) تنها برای فراخوانیهای دوم، سوم، چهارم، دهم و یازدهم مقدار درست (true) برمیگرداند. برای dbg_cnt(tail_call) برای ۱۰ فراخوانی نخست مقدار درست برگردانده میشود.
- -print-autofdo-gcov-version
- --print-autofdo-gcov-version
- نسخهٔ فعلی GCOV مورداستفاده توسط زیرساخت AutoFDO را چاپ میکند.
- -print-file-name=library
- --print-file-name=library
- --print-file-name library
- نام مطلق و کامل فایل کتابخانهٔ library را که هنگام پیوند دادن (linking) استفاده میشد چاپ میکند---و کار دیگری انجام نمیدهد. با این گزینه، GCC هیچ چیزی را کامپایل یا پیوند نمیزند؛ فقط نام فایل را چاپ میکند.
- -print-multi-directory
- --print-multi-directory
- نام دایرکتوری متناظر با multilib انتخابشده توسط سایر سوئیچهای موجود در خط فرمان را چاپ میکند. فرض بر این است که این دایرکتوری در GCC_EXEC_PREFIX وجود دارد.
- -print-multi-lib
- --print-multi-lib
- نگاشت نام دایرکتوریهای multilib به سوئیچهای کامپایلری که آنها را فعال میکنند چاپ میکند. نام دایرکتوری با ; از سوئیچها جدا میشود و هر سوئیچ به جای - با یک @ آغاز میشود، بدون هیچ فاصلهای میان چند سوئیچ. فرض بر این است که این قالب، پردازش در پوسته را آسانتر کند.
- -print-multi-os-directory
- --print-multi-os-directory
- مسیر کتابخانههای سیستمعامل برای multilib انتخابشده را نسبت به یک زیردایرکتوری lib چاپ میکند. اگر کتابخانههای سیستمعامل در زیردایرکتوری lib وجود داشته باشند و هیچ multilib استفاده نشود، این مقدار معمولاً فقط . است؛ اگر کتابخانههای سیستمعامل در دایرکتوریهای همسطح libsuffix موجود باشند، این گزینه مثلاً ../lib64، ../lib یا ../lib32 را چاپ میکند، یا اگر کتابخانههای سیستمعامل در زیردایرکتوریهای lib/subdir باشند، مثلاً amd64، sparcv9 یا ev6 را چاپ میکند.
- -print-multiarch
- --print-multiarch
- مسیر کتابخانههای سیستمعامل برای چندمعماری (multiarch) انتخابشده را نسبت به یک زیردایرکتوری lib چاپ میکند.
- -print-prog-name=program
- --print-prog-name=program
- --print-prog-name program
- مشابه -print-file-name، اما به دنبال برنامهای نظیر cpp میگردد.
- -print-libgcc-file-name
- --print-libgcc-file-name
- همانند
-print-file-name=libgcc.a.
این گزینه زمانی مفید است که از -nostdlib یا -nodefaultlibs استفاده میکنید اما میخواهید با libgcc.a پیوند دهید. میتوانید این دستور را اجرا کنید:
gcc -nostdlib <files>... `gcc -print-libgcc-file-name`
- -print-search-dirs
- --print-search-dirs
- نام
دایرکتوری
نصب
پیکربندیشده
و فهرستی از
دایرکتوریهای
برنامه و
کتابخانهای
که gcc در
آنها
جستجو
میکند را
چاپ
میکند---و
کار دیگری
انجام
نمیدهد.
این گزینه زمانی مفید است که gcc پیام خطای installation problem, cannot exec cpp0: No such file or directory را چاپ کند. برای رفع این مشکل، یا باید cpp0 و سایر اجزای کامپایلر را در جایی قرار دهید که gcc انتظار دارد آنها را بیابد، یا میتوانید متغیر محیطی GCC_EXEC_PREFIX را برابر دایرکتوریای قرار دهید که آنها را در آن نصب کردهاید. اسلش انتهایی / را فراموش نکنید.
- -print-sysroot
- --print-sysroot
- دایرکتوری sysroot مقصد را که در طول کامپایل استفاده میشود چاپ میکند. این همان sysroot مقصدی است که در زمان پیکربندی یا با استفاده از گزینهٔ --sysroot مشخص شده است، احتمالاً همراه با پسوند اضافی که به گزینههای کامپایل بستگی دارد. اگر هیچ sysroot مقصدی مشخص نشده باشد، این گزینه چیزی چاپ نمیکند.
- -print-sysroot-headers-suffix
- --print-sysroot-headers-suffix
- پسوندی را که هنگام جستجو برای سرآیندها به sysroot مقصد اضافه میشود چاپ میکند، یا اگر کامپایلر با چنین پسوندی پیکربندی نشده باشد خطایی میدهد---و کار دیگری انجام نمیدهد.
- -dumpmachine
- ماشین مقصد کامپایلر (برای نمونه، i686-pc-linux-gnu) را چاپ میکند---و کار دیگری انجام نمیدهد.
- -dumpversion
- نسخهٔ کامپایلر (برای نمونه، 3.0، 6.3.0 یا 7) را چاپ میکند---و کار دیگری انجام نمیدهد. این همان نسخهٔ کامپایلری است که در مسیرهای فایلسیستم و specs استفاده میشود. بسته به نحوهٔ پیکربندی کامپایلر، میتواند فقط یک عدد منفرد (نسخهٔ اصلی یا major)، دو عدد جداشده با یک نقطه (نسخهٔ اصلی و فرعی یا minor) یا سه عدد جداشده با نقطه (نسخهٔ اصلی، فرعی و سطح وصله یا patchlevel) باشد..IP -dumpfullversion 4 نسخه کامل کامپایلر را چاپ میکند---و کار دیگری انجام نمیدهد. خروجی همیشه شامل سه عدد است که با نقطه از یکدیگر جدا شدهاند: نسخه اصلی (major)، فرعی (minor) و سطح وصله (patchlevel).
- -dumpspecs
- مشخصات (specs) توکار کامپایلر را چاپ میکند---و کار دیگری انجام نمیدهد. (این گزینه هنگام ساخت خود GCC استفاده میشود.)
- --param name=value
- --param=name=value
- به صورت
قراردادی،
GCC به جای
استفاده از
مقادیر
ثابت
تعبیهشده
در کد، از
پارامترهایی
استفاده
میکند که
میتوان
آنها را در
خط فرمان
برای تعیین
محدودیتها
یا روشهای
اکتشافی (heuristics)
اختیاری
کامپایلر
مشخص کرد.
بسیاری از
پارامترها
با
بهینهسازی
در ارتباط
هستند؛ به
عنوان
مثال، GCC
توابعی را
که بیش از
تعداد
مشخصی
دستورالعمل
دارند
درونخطی (inline)
نمیکند.
تحلیلگر
ایستا (static analyzer)
نیز به طور
مشابه از
پارامترها
برای محدود
کردن
پیچیدگی
استفاده
میکند،
بهینهسازی
زمان پیوند
(link-time optimization) از
پارامترها
برای کنترل
افراز (partitioning)
بهره
میگیرد و
غیره.
پارامترهای
دیگر،
جنبههایی
از GCC را
کنترل
میکنند که
کاملاً
داخلی
هستند،
مانند
تخصیص
حافظه و
راهبرد
جمعآوری
زباله (garbage collection).
سایر
پارامترها
نیز
رفتارهای
وابسته به
مقصد (target-specific) را
کنترل
میکنند.
گزینه --param یک رابط یکپارچه برای مشخص کردن مقادیر این پارامترهای کامپایلر فراهم میکند. با این حال، نام پارامترهای خاص و مفهوم مقادیر آنها وابسته به ساختار داخلی کامپایلر است و ممکن است در نسخههای بعدی بدون اطلاع قبلی تغییر کند. شما نباید برای کامپایل صحیح برنامه خود به تنظیمات این پارامترها وابسته باشید. این پارامترها صرفاً برای سهولت کار توسعهدهندگان در اشکالزدایی مشکلات کامپایل یا در برخی موارد به عنوان راهکارهایی موقت برای دور زدن باگهای کامپایلر از طریق خط فرمان ارائه شدهاند.
گزینههای مختص معماری مقصد (Target-Specific Options)
هر ماشین مقصدی که توسط GCC پشتیبانی میشود میتواند گزینههای خاص خود را داشته باشد---برای مثال، تا به شما اجازه دهد برای گونه خاصی از پردازنده یا ABI کامپایل کنید، یا بهینهسازیهای مختص آن ماشین را کنترل نمایید. به طور مشابه، GCC گزینههایی نیز دارد که مختص سیستمعاملها یا محیطهای زمان اجرای خاصی بر روی مقصد هستند.
طبق توافق، نام گزینههای مختص ماشین با -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-*-* پیکربندی شده باشد.
- -mlittle-endian
- تولید کد کوچکاندیان (little-endian). این حالت پیشفرض هنگامی است که GCC برای یک مقصد aarch64-*-* (و نه aarch64_be-*-*) پیکربندی شده باشد.
- -menable-sysreg-checking
- در صورت تلاش برای دسترسی به یک ثبات سیستم (system register) که در معماری مقصد موجود نیست، یک پیام خطا تولید میکند.
- -mgeneral-regs-only
- تولید کدی که تنها از ثباتهای همهمنظوره استفاده میکند. این کار مانع از استفاده کامپایلر از ثباتهای ممیز شناور (floating-point) و Advanced SIMD میشود، اما هیچ محدودیتی بر اسمبلر اعمال نمیکند.
- -mcmodel=tiny
- تولید کد برای مدل کد tiny. برنامه و نمادهای تعریفشده ایستا در آن باید در فاصله حداکثر ۱ مگابایت از یکدیگر باشند. برنامهها میتوانند به صورت ایستا یا پویا پیوند داده شوند.
- -mcmodel=small
- تولید کد برای مدل کد small. برنامه و نمادهای تعریفشده ایستا در آن باید در فاصله حداکثر ۴ گیگابایت از یکدیگر باشند. برنامهها میتوانند به صورت ایستا یا پویا پیوند داده شوند. این مدل، مدل کد پیشفرض است.
- -mcmodel=large
- تولید کد برای مدل کد large. این مدل هیچ فرضی درباره آدرسها و اندازه بخشها در نظر نمیگیرد. برنامهها تنها میتوانند به صورت ایستا پیوند داده شوند. گزینه -mcmodel=large با -mabi=ilp32، -fpic و -fPIC ناسازگار است.
- -mtp=name
- مشخص کردن ثبات سیستم برای استفاده به عنوان اشارهگر ریسه (thread pointer). مقادیر معتبر عبارتند از tpidr_el0، tpidrro_el0، tpidr_el1، tpidr_el2 و tpidr_el3. به منظور سازگاری با گذشته، نامهای مستعار el0، el1، el2 و el3 نیز پذیرفته میشوند. تنظیم پیشفرض tpidr_el0 است. توصیه میشود تمام کدهایی که قرار است با یکدیگر تعامل داشته باشند را با مقدار یکسانی از این گزینه کامپایل کنید تا از دسترسی به یک اشارهگر ریسه متفاوت از سطح استثنای (exception level) نادرست جلوگیری شود.
- -mstrict-align
- -mno-strict-align
- جلوگیری از تولید یا مجاز دانستن دسترسیهایی به حافظه که ممکن است بر روی مرز طبیعی شیء (همانطور که در مشخصات معماری تشریح شده) تراز (align) نشده باشند.
- -momit-leaf-frame-pointer
- -mno-omit-leaf-frame-pointer
- حذف یا حفظ اشارهگر فریم (frame pointer) در توابع برگ (leaf functions). رفتار اول، حالت پیشفرض است.
- -mstack-protector-guard=guard
- -mstack-protector-guard-reg=reg
- -mstack-protector-guard-offset=offset
- تولید کد
محافظت از
پشته با
استفاده از
قناری (canary) در
guard.
مکانهای
پشتیبانیشده
عبارتند از
global برای یک
قناری
سراسری یا
sysreg برای یک
قناری در یک
ثبات سیستم
مناسب.
با انتخاب مورد دوم، گزینههای -mstack-protector-guard-reg=reg و -mstack-protector-guard-offset=offset علاوه بر این مشخص میکنند که کدام ثبات سیستم به عنوان ثبات پایه برای خواندن قناری، و از چه آفستی نسبت به آن ثبات پایه استفاده شود. هیچ ثبات یا آفست پیشفرضی وجود ندارد زیرا این ویژگی کاملاً برای استفاده درون هسته لینوکس در نظر گرفته شده است.
- -mtls-dialect=desc
- استفاده از توصیفکنندههای TLS به عنوان سازوکار حافظه محلی ریسه (TLS) برای دسترسیهای پویا به متغیرهای TLS. این حالت پیشفرض است.
- -mtls-dialect=traditional
- استفاده از TLS سنتی به عنوان سازوکار حافظه محلی ریسه برای دسترسیهای پویا به متغیرهای TLS.
- -mtls-size=size
- مشخص کردن اندازه بیتی آفستهای بیواسطه (immediate) در TLS. مقادیر معتبر عبارتند از 12، 24، 32، 48. این گزینه به binutils نسخه 2.26 یا جدیدتر نیاز دارد.
- -mfix-cortex-a53-835769
- -mno-fix-cortex-a53-835769
- فعال یا غیرفعال کردن راهکار دور زدن برای نقص سختافزاری (erratum) شماره 835769 پردازنده ARM Cortex-A53. این کار شامل قرار دادن یک دستورالعمل NOP بین دستورالعملهای حافظه و دستورالعملهای ضرب و انباشت (multiply-accumulate) اعداد صحیح ۶۴ بیتی است. اگر معماری یا پردازندهای در خط فرمان مشخص شده باشد که به این راهکار نیاز ندارد، این پرچم نادیده گرفته خواهد شد.
- -mfix-cortex-a53-843419
- -mno-fix-cortex-a53-843419
- فعال یا غیرفعال کردن راهکار دور زدن برای نقص سختافزاری (erratum) شماره 843419 پردازنده ARM Cortex-A53. این راهکار در زمان پیوند اعمال میشود و تنها پرچم مربوطه را به پیونددهنده ارسال میکند. اگر معماری یا پردازندهای در خط فرمان مشخص شده باشد که به این راهکار نیاز ندارد، این پرچم نادیده گرفته خواهد شد.
- -mlow-precision-recip-sqrt
- -mno-low-precision-recip-sqrt
- فعال یا غیرفعال کردن تقریب معکوس ریشه دوم (reciprocal square root). این گزینه تنها زمانی تأثیر دارد که -ffast-math یا -funsafe-math-optimizations نیز استفاده شده باشد. فعال کردن این گزینه دقت نتایج معکوس ریشه دوم را برای دقت یگانه (single precision) به حدود ۱۶ بیت و برای دقت دوگانه (double precision) به ۳۲ بیت کاهش میدهد..IP -mlow-precision-sqrt 4
- -mno-low-precision-sqrt
- فعال یا غیرفعال کردن تقریب ریشه دوم (جذر). این گزینه تنها زمانی اثر دارد که -ffast-math یا -funsafe-math-optimizations نیز استفاده شده باشد. فعال کردن این گزینه دقت نتایج ریشه دوم را برای دقت یگانه (single precision) به حدود ۱۶ بیت و برای دقت دوگانه (double precision) به ۳۲ بیت کاهش میدهد. در صورت فعال بودن، متضمن -mlow-precision-recip-sqrt است.
- -mlow-precision-div
- -mno-low-precision-div
- فعال یا غیرفعال کردن تقریب تقسیم. این گزینه تنها زمانی اثر دارد که -ffast-math یا -funsafe-math-optimizations نیز استفاده شده باشد. فعال کردن این گزینه دقت نتایج تقسیم را برای دقت یگانه به حدود ۱۶ بیت و برای دقت دوگانه به ۳۲ بیت کاهش میدهد.
- -mtrack-speculation
- -mno-track-speculation
- فعال یا غیرفعال کردن تولید کد اضافی برای ردگیری اجرای گمانهزنانه از میان انشعابهای شرطی. وضعیت ردگیری سپس میتواند توسط کامپایلر هنگام بسط دادن فراخوانیهای "__builtin_speculation_safe_value" برای تولید توالی کد کارآمدتر استفاده شود.
- -moutline-atomics
- -mno-outline-atomics
- فعال یا
غیرفعال
کردن
فراخوانی
توابع کمکی
برونخط (out-of-line
helpers) برای
پیادهسازی
عملیات
اتمیک. این
توابع کمکی
در زمان
اجرا مشخص
میکنند که
آیا
دستورالعملهای
LSE از ARMv8.1-A قابل
استفاده
هستند یا
خیر؛ در غیر
این صورت،
از
دستورالعملهای
load/store-exclusive موجود
در ISA پایهٔ ARMv8.0
استفاده
خواهند کرد.
این گزینه تنها هنگام کامپایل برای مجموعه دستورالعمل پایهٔ ARMv8.0 کاربرد دارد. در صورت استفاده از نسخههای بعدی، مانند -march=armv8.1-a یا -march=armv8-a+lse، دستورالعملهای ARMv8.1-Atomics بهطور مستقیم استفاده خواهند شد. همین مسئله در هنگام استفاده از -mcpu= در صورتی که پردازندهٔ انتخابی از ویژگی lse پشتیبانی کند نیز صدق میکند. این گزینه بهطور پیشفرض فعال است.
- -mmax-vectorization
- -mno-max-vectorization
- فعال یا غیرفعال کردن لغو مدل هزینهٔ بردارساز (vectorizer cost model) به شکلی که بردارسازی همیشه سودمند به نظر برسد. این گزینه میتواند با -mautovec-preference ترکیب شود تا کنترل دقیقی بر روی اینکه کدام ISA برای بردارسازی خودکار استفاده شود فراهم کند. بر خلاف -fno-vect-cost-model یا -fvect-cost-model=unlimited، این گزینه مقایسهٔ هزینه بین حالتهای برداری مختلف را غیرفعال نمیکند.
- -mautovec-preference=name
- تحمیل یک راهبرد انتخاب ISA برای بردارسازی خودکار. مقادیر ممکن برای name عبارتند از:
- default
- استفاده از روشهای اکتشافی (heuristics) پیشفرض.
- asimd-only
- تنها استفاده از Advanced SIMD برای بردارسازی خودکار.
- sve-only
- تنها استفاده از SVE برای بردارسازی خودکار.
- prefer-asimd
- استفاده از هر دو Advanced SIMD و SVE. در صورت برابری هزینهها، Advanced SIMD ترجیح داده میشود.
- prefer-sve
- استفاده از هر دو Advanced SIMD و SVE. در صورت برابری هزینهها، SVE ترجیح داده میشود.
برای بهترین کارایی، اکیداً توصیه میشود در عوض از -mcpu یا -mtune استفاده شود. این پارامتر تنها باید برای بررسی و آزمودن کد به کار رود.
- -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.5-A : armv9.4-a, cpa, +faminmax, +lut
- armv8-r : Armv8-R : armv8-r
مقدار native در سیستمهای گنو/لینوکس بومی AArch64 در دسترس است و باعث میشود کامپایلر معماری سیستم میزبان را برگزیند. این گزینه در صورتی که کامپایلر نتواند معماری سیستم میزبان را شناسایی کند، هیچ اثری ندارد. هنگامی که -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, armagicpu, neoverse-n3,
olympus, rigel, 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, hip12, 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,
ampere1c, cobalt-100, apple-m1, apple-m2,
apple-m3, apple-m4, apple-m5, c1-nano,
c1-pro, c1-premium c1-ultra و 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، مقدار native کارایی را متناسب با سیستم میزبان بهینهسازی میکند. این گزینه در صورتی که کامپایلر نتواند پردازندهٔ سیستم میزبان را شناسایی کند، هیچ اثری ندارد.
در صورتی که هیچیک از گزینههای -mtune=، -mcpu= یا -march= مشخص نشده باشند، کد بهگونهای تنظیم میشود که در طیف وسیعی از پردازندههای مقصد عملکرد مطلوبی داشته باشد.
این گزینه نمیتواند تغییردهندهٔ ویژگی به عنوان پسوند داشته باشد..IP -mcpu=name 4 نام پردازندهٔ هدف را مشخص میکند که میتواند به صورت اختیاری با یک یا چند تغییردهندهٔ ویژگی پسوند داشته باشد. این گزینه به فرم -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 در نظر گرفته شده است.
- -mpc-relative-literal-loads
- -mno-pc-relative-literal-loads
- بارگذاریهای مقادیر ثابت وابسته به PC (یا PC-relative literal loads) را فعال یا غیرفعال میکند. با این گزینه، استخرهای مقادیر ثابت (literal pools) با استفاده از یک دستورالعمل تکی قابل دسترسی بوده و پس از هر تابع صادر میشوند. این امر حداکثر اندازهٔ توابع را به 1MB محدود میکند. این گزینه بهطور پیشفرض برای -mcmodel=tiny فعال است.
- -msign-return-address=scope
- محدودهٔ تابعی که امضای آدرس بازگشت روی آن اعمال خواهد شد را انتخاب میکند. مقادیر مجاز عبارتند از none که امضای آدرس بازگشت را غیرفعال میکند، non-leaf که امضای اشارهگر را برای توابعی که توابع برگ نیستند فعال میکند، و all که امضای اشارهگر را برای تمام توابع فعال میسازد. مقدار پیشفرض none است. این گزینه منسوخ شده و گزینهٔ -mbranch-protection جایگزین آن شده است.
- -mbranch-protection=features
- ویژگیهای
حفاظت از
انشعاب را
برای
استفاده
انتخاب
میکند. features
میتواند
یکی از
اشکال زیر
را داشته
باشد:
مقدار none پیشفرض است و تمام انواع حفاظت از انشعاب را خاموش میکند.
مقدار standard تمام انواع ویژگیهای حفاظت از انشعاب را فعال میکند. اگر یک ویژگی دارای گزینههای تنظیم کارایی اضافی باشد، standard آن را روی سطح استاندارد خود تنظیم میکند.
مقدار pac-ret امضای آدرس بازگشت را در سطح استاندارد خود فعال میکند: امضای توابعی که آدرس بازگشت را در حافظه ذخیره میکنند (توابع non-leaf عملاً همیشه این کار را انجام میدهند) با استفاده از A-key.
مقدار pac-ret+leaf امضای pac-ret را گسترش میدهد تا توابع برگ (leaf) را نیز شامل شود.
مقادیر pac-ret+b-key یا pac-ret+leaf+b-key میتوانند برای امضای توابع با B-key بهجای A-key استفاده شوند.
مقدار bti سازوکار شناسایی هدف انشعاب (Branch Target Identification) را فعال میکند.
مقدار gcs تولید کد سازگار با پشتهٔ کنترلی محافظتشده (Guarded Control Stack) را فعال میکند.
- -mharden-sls=opts
- مقاومسازی کامپایلر را در برابر حدس مستقیم خطی (SLS) فعال میکند. opts فهرستی از گزینههای زیر است که با ویرگول از هم جدا شدهاند:
علاوه بر این، -mharden-sls=all تمام مقاومسازیهای SLS را فعال میکند در حالی که -mharden-sls=none تمام مقاومسازیهای SLS را غیرفعال میسازد.
- -mearly-ra=scope
- تعیین
میکند چه
زمانی یک
مرحلهٔ
تخصیص
زودهنگام
ثبات فعال
شود. این
مرحله قبل
از
زمانبندی
دستورالعملها
اجرا
میشود و
تلاش
میکند یک
تخصیص بدون
ریزش (spill-free)
برای کدهای
ممیز شناور
و برداری
پیدا کند.
همچنین سعی
میکند از
دستورالعملهای
چندثباتی
گامدار،
مانند LD1 و ST1
گامدار در
SME2 استفاده
کند.
مقادیر ممکن برای scope عبارتند از: all که این مرحله را روی تمام توابع اجرا میکند؛ strided که این مرحله را روی توابعی که به دستورالعملهای چندثباتی گامدار دسترسی دارند اجرا میکند؛ و none که این مرحله را غیرفعال میسازد.
گزینهٔ -mearly-ra=all برای -O2 و بالاتر، و همچنین برای -Os پیشفرض است. در غیر این صورت، -mearly-ra=none پیشفرض است.
- -mearly-ldp-fusion
- -mno-early-ldp-fusion
- مرحلهٔ ترکیب جفت بارگذاری/ذخیرهسازی (load/store pair fusion) در AArch64 را که پیش از تخصیص ثبات اجرا میشود، فعال میکند. بهطور پیشفرض در -O و بالاتر فعال است.
- -mlate-ldp-fusion
- -mno-late-ldp-fusion
- مرحلهٔ ترکیب جفت بارگذاری/ذخیرهسازی در AArch64 را که پس از تخصیص ثبات اجرا میشود، فعال میکند. بهطور پیشفرض در -O و بالاتر فعال است.
- -mnarrow-gp-writes
- تبدیل نوشتن در ثباتهای همهمنظورهٔ ۶۴ بیتی به عملیاتهای ۳۲ بیتی معادل را هنگامی که ۳۲ بیت بالایی صفر شناخته شده باشند، فعال میکند. این مرحله با -mnarrow-gp-writes قابل کنترل است و در -O2 و بالاتر فعال است، اما بهطور پیشفرض فعال نیست، به جز برای -mcpu=olympus.
- -msve-vector-bits=bits
- تعداد
بیتها در
یک ثبات
برداری SVE را
مشخص
میکند. این
گزینه تنها
زمانی
تأثیر دارد
که SVE فعال
باشد.
کامپایلر GCC از دو حالت تولید کد SVE پشتیبانی میکند: خروجی «مستقل از طول بردار» (vector-length agnostic) که با هر اندازهای از ثبات برداری کار میکند، و خروجی «مختص طول بردار» (vector-length specific) که به GCC اجازه میدهد در صورتی که برای اهداف بهینهسازی مفید باشد، فرضیاتی دربارهٔ طول بردار اتخاذ کند. مقادیر ممکن برای bits عبارتند از: scalable، 128، 256، 512، 1024 و 2048. مشخص کردن scalable خروجی مستقل از طول بردار را انتخاب میکند. در حال حاضر -msve-vector-bits=128 نیز خروجی مستقل از طول بردار را برای اهداف big-endian تولید میکند. سایر مقادیر، کد مختص طول بردار تولید میکنند. رفتار این مقادیر ممکن است در نسخههای آینده تغییر کند و برای تولید کدی که بین طولهای بردار مختلف در سختافزارهای مختلف SVE قابل حمل باشد، به هیچ مقداری بهجز scalable نباید اتکا کرد.
پیشفرض -msve-vector-bits=scalable است که کد مستقل از طول بردار تولید میکند.
تغییردهندههای ویژگی -march و -mcpu
تغییردهندههای ویژگی مورد استفاده با -march و -mcpu میتوانند هر یک از موارد زیر و معکوس آنها nofeature باشند:
- crc
- افزونهٔ CRC را فعال میکند. این ویژگی بهطور پیشفرض برای -march=armv8.1-a فعال است.
- crypto
- افزونهٔ Crypto را فعال میکند. این ویژگی همچنین دستورالعملهای Advanced SIMD و ممیز شناور را فعال میسازد.
- fp
- دستورالعملهای ممیز شناور را فعال میکند. این ویژگی بهطور پیشفرض برای تمام مقادیر ممکن گزینههای -march و -mcpu فعال است.
- simd
- دستورالعملهای Advanced SIMD را فعال میکند. این ویژگی همچنین دستورالعملهای ممیز شناور را فعال میسازد. این ویژگی بهطور پیشفرض برای تمام مقادیر ممکن گزینههای -march و -mcpu فعال است.
- sve
- دستورالعملهای افزونهٔ برداری مقیاسپذیر (SVE) را فعال میکند. این ویژگی همچنین دستورالعملهای Advanced SIMD و ممیز شناور را فعال میسازد.
- lse
- دستورالعملهای افزونهٔ سامانهٔ بزرگ (LSE) را فعال میکند. این ویژگی بهطور پیشفرض برای -march=armv8.1-a فعال است..IP rdma 4 فعالسازی دستورالعملهای Round Double Multiply Accumulate. این گزینه بهطور پیشفرض برای -march=armv8.1-a فعال است.
- fp16
- فعالسازی افزونهٔ FP16. این گزینه همچنین دستورالعملهای ممیز شناور (floating-point) را فعال میکند.
- 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
- فعالسازی دستورالعملهای Random Number در Armv8.5-a. این گزینه صرفاً برای فعالسازی افزونه در سطح اسمبلر است و بر تولید کد تأثیری ندارد.
- memtag
- فعالسازی افزونههای Memory Tagging در Armv8.5-a. استفاده از این گزینه در معماریهای پیش از Armv8.5-A پشتیبانی نمیشود.
- sb
- فعالسازی دستورالعمل Speculation Barrier در Armv8-a. این گزینه صرفاً برای فعالسازی افزونه در سطح اسمبلر است و بر تولید کد تأثیری ندارد. این گزینه بهطور پیشفرض برای -march=armv8.5-a فعال است.
- ssbs
- فعالسازی دستورالعمل Speculative Store Bypass Safe در Armv8-a. این گزینه صرفاً برای فعالسازی افزونه در سطح اسمبلر است و بر تولید کد تأثیری ندارد. این گزینه بهطور پیشفرض برای -march=armv8.5-a فعال است.
- predres
- فعالسازی دستورالعملهای Execution and Data Prediction Restriction در Armv8-a. این گزینه صرفاً برای فعالسازی افزونه در سطح اسمبلر است و بر تولید کد تأثیری ندارد. این گزینه بهطور پیشفرض برای -march=armv8.5-a فعال است.
- sve2
- فعالسازی Scalable Vector Extension 2 در Armv8-a. این گزینه همچنین دستورالعملهای 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.
- 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 half-precision. این گزینه همچنین دستورالعملهای Advanced SIMD و ممیز شناور را فعال میکند. این گزینه بهطور پیشفرض برای -march=armv8.6-a فعال است. استفاده از این گزینه در معماریهای پیش از Armv8.2-A پشتیبانی نمیشود.
- ls64
- فعالسازی دستورالعملهای اتمیک load و store ۶۴ بایتی برای شتابدهندهها.
- mops
- فعالسازی دستورالعملهای شتاببخشی به عملیات حافظه مانند "memcpy"، "memmove" و "memset". این گزینه بهطور پیشفرض برای -march=armv8.8-a فعال است.
- flagm
- فعالسازی افزونهٔ دستورالعملهای Flag Manipulation.
- flagm2
- فعالسازی دستورالعملهای تبدیل پرچم FlagM2.
- pauth
- فعالسازی افزونهٔ Pointer Authentication.
- cssc
- فعالسازی دستورالعملهای Common Short Sequence Compression.
- cmpbr
- فعالسازی دستورالعملهای کوتاهتر مقایسه و انشعاب (compare and branch)، یعنی "cbb"، "cbh" و "cb".
- sme
- فعالسازی افزونهٔ Scalable Matrix Extension.
- sme-i16i64
- فعالسازی افزونهٔ FEAT_SME_I16I64 برای SME. این گزینه همچنین دستورالعملهای SME را فعال میکند.
- sme-f64f64
- فعالسازی افزونهٔ FEAT_SME_F64F64 برای SME. این گزینه همچنین دستورالعملهای SME را فعال میکند.
- sme2
- فعالسازی افزونهٔ Scalable Matrix Extension 2. این گزینه همچنین دستورالعملهای SME را فعال میکند.
- sme-f8f16
- فعالسازی افزونهٔ FEAT_SME_F8F16 برای SME. این گزینه همچنین دستورالعملهای SME2 و FP8 را فعال میکند.
- sme-f8f32
- فعالسازی افزونهٔ FEAT_SME_F8F32 برای SME. این گزینه همچنین دستورالعملهای SME2 و FP8 را فعال میکند.
- 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..IP lse128 4 فعالسازی افزونه دستورهای اتمیک ۱۲۸ بیتی 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
- فعالسازی افزونه ضرب نقطهای ۴ جهته fp8 (نقطه شناور ۸ بیتی) به دقت یگانه (single-precision).
- ssve-fp8dot4
- فعالسازی افزونه ضرب نقطهای ۴ جهته fp8 (نقطه شناور ۸ بیتی) به دقت یگانه در حالت جریانی.
- fp8dot2
- فعالسازی افزونه ضرب نقطهای ۲ جهته fp8 (نقطه شناور ۸ بیتی) به نیمدقت (half-precision).
- ssve-fp8dot2
- فعالسازی افزونه ضرب نقطهای ۲ جهته fp8 (نقطه شناور ۸ بیتی) به نیمدقت در حالت جریانی.
- faminmax
- فعالسازی افزونه Floating Point Absolute Maximum/Minimum (کمینه/بیشینه مطلق نقطه شناور).
- lut
- فعالسازی افزونه جدول جستوجو (Lookup Table).
- sme-lutv2
- فعالسازی افزونه SME Lookup Table v2 (LUTv2).
- cpa
- فعالسازی دستورهای محاسبات اشارهگر وارسیشده (Checked Pointer Arithmetic).
- sve-b16b16
- فعالسازی افزونه نقطه شناور مغز بدون افزایش عرض ("bf16") در SVE. این گزینه تنها زمانی تأثیر دارد که "sve2" یا "sme2" نیز فعال شده باشند.
- sve-bfscale
- فعالسازی افزونه SVE_BFSCALE.
- poe2
- فعالسازی افزونه Permission Overlays Extension 2.
- tev
- فعالسازی افزونه TIndex Exception-like Vector.
- tlbid
- فعالسازی افزونه دامنههای TLBI (TLBI Domains Extension).
- gcie
- فعالسازی افزونه رابط پردازنده GICv5 (Generic Interrupt Controller).
- lscp
- فعالسازی افزونه جفت load acquire و store release.
- mops-go
- فعالسازی گونههای فقط-برچسب دستورهای MOPS. این گزینه همچنین دستورهای شتاببخشی به عملیات حافظه و افزونههای برچسبگذاری حافظه Armv8.5-a را فعال میکند.
- sve2p3
- فعالسازی SVE2.3. این گزینه دستورهای SVE2.2 را نیز فعال میکند.
- sme2p3
- فعالسازی SME2.3. این گزینه دستورهای SME2.2 را نیز فعال میکند.
- f16f32dot
- فعالسازی دستورهای f16f32dot در Armv9.7-a. این گزینه Advanced SIMD، دستورهای ممیز شناور و دستورهای FP16 در Armv8.2-a را نیز فعال میکند.
- sve-b16mm
- فعالسازی افزونه SVE B16MM. این گزینه دستورهای SVE، Advanced SIMD و دستورهای ممیز شناور را نیز فعال میکند.
- mtetc
- فعالسازی عملیات بلوک برچسب حافظه نهان داده. این گزینه همچنین افزونههای برچسبگذاری حافظه Armv8.5-a را فعال میکند.
- f16f32mm
- فعالسازی دستورهای f16f32mm در Armv9.7-a. این گزینه Advanced SIMD، دستورهای ممیز شناور و دستورهای FP16 در Armv8.2-a را نیز فعال میکند.
- f16mm
- فعالسازی دستورهای f16mm. این گزینه Advanced SIMD، دستورهای ممیز شناور و دستورهای FP16 در Armv8.2-a را نیز فعال میکند.
ویژگی crypto مستلزم aes، sha2 و simd است که خود مستلزم fp میباشد. برعکس، nofp مستلزم nosimd است، که به نوبه خود مستلزم nocrypto، noaes و nosha2 میباشد.
گزینههای Adapteva Epiphany
این گزینههای -m برای Adapteva Epiphany تعریف شدهاند:
- -mhalf-reg-file
- -mno-half-reg-file
- عدم تخصیص هرگونه ثبات در محدوده "r32"..."r63". این کار اجازه میدهد کد روی گونههای سختافزاری که فاقد این ثباتها هستند اجرا شود.
- -mprefer-short-insn-regs
- -mno-prefer-short-insn-regs
- تخصیص اولویتدار ثباتهایی که امکان تولید دستورهای کوتاه را فراهم میکنند. این کار میتواند منجر به افزایش تعداد دستورالعملها شود، بنابراین ممکن است اندازه کلی کد را کاهش یا افزایش دهد.
- -mbranch-cost=num
- تنظیم هزینه انشعابها تقریباً به اندازه num دستور «ساده». این هزینه صرفاً یک تقریب تجربی (heuristic) است و تضمینی برای ارائه نتایج یکدست در نگارشهای مختلف وجود ندارد.
- -mcmove
- -mno-cmove
- فعالسازی تولید دستورهای انتقال شرطی (conditional moves).
- -mnops=num
- درج num دستور NOP پیش از هر دستور تولیدشده دیگر.
- -mno-soft-cmpsf
- -msoft-cmpsf
- برای مقایسههای نقطه شناور با دقت یگانه، یک دستور "fsub" درج کرده و پرچمها را بررسی میکند. این روش سریعتر از مقایسه نرمافزاری است، اما میتواند در حضور NaNها، یا زمانی که دو عدد کوچکِ متفاوت مقایسه شوند به گونهای که تفاضل آنها صفر محاسبه شود، نتایج نادرستی به بار آورد. پیشفرض -msoft-cmpsf است که از مقایسههای نرمافزاری کندتر، ولی سازگار با استاندارد IEEE استفاده میکند.
- -mstack-offset=num
- تنظیم آفست (فاصله) میان بالای پشته و اشارهگر پشته (stack pointer). برای نمونه، مقدار ۸ به این معنی است که هشت بایت در محدوده "sp+0...sp+7" میتواند توسط توابع برگ (leaf functions) بدون تخصیص پشته استفاده شود. مقادیر غیر از 8 یا 16 آزمایش نشدهاند و بعید است به درستی کار کنند. همچنین توجه داشته باشید که این گزینه ABI را تغییر میدهد؛ کامپایل برنامهای با آفست پشتهای متفاوت از کتابخانههایی که از پیش کامپایل شدهاند، عموماً کار نخواهد کرد. این گزینه در صورتی مفید است که بخواهید بررسی کنید آیا آفست پشته متفاوتی کد بهتری به شما میدهد یا خیر، اما برای استفاده واقعی از آفست پشته متفاوت جهت ساخت برنامههای کاربردی، توصیه میشود زنجیره ابزار (toolchain) با گزینه مناسب --with-stack-offset=num پیکربندی شود.
- -mno-round-nearest
- -mround-nearest
- -mno-round-nearest باعث میشود زمانبند فرض کند که حالت گرد کردن روی قطعکردن (truncating) تنظیم شده است. پیشفرض -mround-nearest است.
- -mlong-calls
- در صورتی که با یک ویژگی (attribute) خلاف آن تعیین نشده باشد، فرض میکند که همه فراخوانیها ممکن است فراتر از محدوده آفست دستورهای "b" / "bl" باشند، و بنابراین پیش از انجام یک فراخوانی (که در غیر این صورت مستقیم میبود)، آدرس تابع را در یک ثبات بارگذاری میکند. این رفتار پیشفرض است.
- -mshort-calls
- در صورتی که
با یک ویژگی
خلاف آن
تعیین نشده
باشد، فرض
میکند که
همه
فراخوانیهای
مستقیم در
محدوده
دستورهای
"b" /
"bl"
هستند،
بنابراین
از این
دستورها
برای
فراخوانیهای
مستقیم
استفاده
میکند.
پیشفرض -mlong-calls است. توجه داشته باشید که -mlong-calls معادل -mno-short-calls است، و به طور مشابه -mno-long-calls معادل -mshort-calls میباشد.
- -msmall16
- -mno-small16
- فرض میکند آدرسها را میتوان به صورت مقادیر بدون علامت ۱۶ بیتی بارگذاری کرد. این مورد برای آدرسهای توابعی که معناشناسی -mlong-calls برای آنها اعمال شده است صدق نمیکند.
- -mfp-mode=mode
- حالت غالب
واحد ممیز
شناور را
تنظیم
میکند. این
گزینه حالت
ممیز
شناوری را
که در هنگام
فراخوانی و
بازگشت
تابع ارائه
و انتظار
میرود
مشخص
میکند.
تطبیق این
حالت با
حالتی که
عمدتاً در
ابتدای
تابع به آن
نیاز
دارید،
میتواند
با جلوگیری
از تعویض
حالتهای
غیرضروری،
برنامههای
شما را
کوچکتر و
سریعتر
کند.
mode میتواند روی یکی از مقادیر زیر تنظیم شود:
- caller
- هر حالتی در هنگام ورود به تابع معتبر است، و با بازگشت تابع و هنگامی که توابع دیگر را فراخوانی میکند، حفظ یا بازیابی میشود. این حالت برای کامپایل کتابخانهها یا سایر واحدهای کامپایلی مفید است که ممکن است بخواهید آنها را در برنامههای مختلف با حالتهای غالب FPU متفاوت ادغام کنید؛ و راحتیِ امکان استفاده از یک فایل شیء (object file) منفرد، بر سربار اندازه و سرعت ناشی از هرگونه تعویض حالت اضافی که ممکن است نیاز باشد، در مقایسه با آنچه که با یک انتخاب مشخصتر برای حالت غالب FPU لازم بود، برتری دارد.
- truncate
- این حالتی است که برای محاسبات ممیز شناور با حالت گرد کردن قطعکننده (یعنی گرد کردن به سمت صفر) استفاده میشود. این شامل تبدیل ممیز شناور به عدد صحیح نیز میگردد.
- round-nearest
- این حالتی است که برای محاسبات ممیز شناور با حالت گرد کردن به نزدیکترین یا زوج (round-to-nearest-or-even) استفاده میشود.
- int
- این حالتی است که برای انجام محاسبات اعداد صحیح در FPU استفاده میشود، مانند ضرب عدد صحیح یا ضرب و جمع انباشته (multiply-and-accumulate) عدد صحیح.
پیشفرض -mfp-mode=caller است.
- -mmay-round-for-trunc
- -mno-may-round-for-trunc
- این گزینه اجازه میدهد تا برای صرفهجویی در تعویض حالت، قطع کردن ممیز شناور به عدد صحیح با گرد کردن جایگزین شود. این گزینه به طور پیشفرض غیرفعال است.
- -mfp-iarith
- -mno-fp-iarith
- این گزینه استفاده از واحد ممیز شناور را برای جمع و تفریق اعداد صحیح فعال میکند. به طور پیشفرض غیرفعال است.
- -msplit-lohi
- -mno-split-lohi
- -mpost-inc
- -mno-post-inc
- -mpost-modify
- -mno-post-modify
- تنظیمات جزئی تولید کد که به ترتیب تقسیم بارگذاریهای ۳۲ بیتی، تولید آدرسهای پسافزایش (post-increment)، و تولید آدرسهای پساصلاح (post-modify) را کنترل میکنند. مقادیر پیشفرض عبارتند از msplit-lohi، -mpost-inc و -mpost-modify.
- -mno-vect-double
- حالت SIMD ترجیحی را به SImode تغییر میدهد. پیشفرض -mvect-double است که از DImode به عنوان حالت ترجیحی SIMD استفاده میکند.
- -max-vect-align=num
- حداکثر تراز برای نوعهای حالت برداری SIMD. مقدار num میتواند ۴ یا ۸ باشد. پیشفرض ۸ است. توجه داشته باشید که این یک تغییر در ABI است، اگرچه بسیاری از رابطهای توابع کتابخانهای در صورتی که در بخشهای تأثیرگذار بر اندازه و/یا تراز نوعهای مربوطه از حالتهای برداری SIMD استفاده نکنند، تحت تأثیر قرار نمیگیرند.
- -msplit-vecmove-early
- -mno-split-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).
- gfx90c
- کامپایل برای دستگاههای GCN5 Vega 7 (gfx90c).
- gfx942
- کامپایل برای دستگاههای سری CDNA3 Instinct MI300 (gfx942). (آزمایشی)
- gfx950
- کامپایل برای دستگاههای CDNA3 gfx950. (آزمایشی)
- gfx9-generic
- کامپایل کد عمومی برای دستگاههای Vega، قابل اجرا روی زیرمجموعه زیر از دستگاههای GFX9: gfx900، gfx902، gfx904، gfx906، gfx909 و gfx90c.
- gfx9-4-generic
- کامپایل کد عمومی برای دستگاههای CDNA3، قابل اجرا روی زیرمجموعه زیر از دستگاههای GFX9: gfx942 و gfx950. (آزمایشی).IP gfx1030 4 کامپایل برای دستگاههای 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.
- -mgang-private-size=bytes
- تعیین میزان حافظه محلی بهاشتراکگذاشتهشده (LDS) برای رزرو متغیرهای gang-private. مقدار پیشفرض 512 است.
- -msram-ecc=on
- -msram-ecc=off
- -msram-ecc=any
- کامپایل باینریهای مناسب برای دستگاههایی که قابلیت SRAM-ECC در آنها فعال، غیرفعال، یا در هر یک از این دو حالت است. این ویژگی در برخی دستگاهها میتواند بهازای هر فرآیند فعال شود. کد کامپایلشده باید با حالت دستگاه مطابقت داشته باشد. مقدار پیشفرض برای دستگاههایی که از آن پشتیبانی میکنند، any است.
- -mxnack=on
- -mxnack=off
- -mxnack=any
- کامپایل باینریهای مناسب برای دستگاههایی که قابلیت XNACK در آنها فعال، غیرفعال، یا در هر یک از این دو حالت است. برخی دستگاهها همیشه به XNACK نیاز دارند و برخی دیگر به کاربر اجازه پیکربندی XNACK را میدهند. کد کامپایلشده باید با حالت دستگاه مطابقت داشته باشد. پیشفرض در دستگاههایی که از Unified Shared Memory پشتیبانی میکنند -mxnack=any و در غیر این صورت -mxnack=no است.
- -Wopenacc-dims
- -Wno-openacc-dims
- کنترل هشدارهای مربوط به ابعاد نامعتبر OpenACC.
گزینههای ARC (ARC Options)
گزینههای زیر گونه معماری که کد برای آن کامپایل میشود را کنترل میکنند:
- -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 با فعال بودن دستورالعملهای "norm" و خانواده دستورالعملهای "mul64".
- arc601_norm
- کامپایل برای پردازنده ARC 601 با فعال بودن دستورالعملهای "norm"..IP arc601_mul32x16 4 کامپایل برای پردازندهٔ ARC 601 با فعال بودن دستورهای "norm" و ضرب 32x16 بیتی.
- arc601_mul64
- کامپایل برای پردازندهٔ ARC 601 با فعال بودن دستورهای "norm" و خانوادهٔ "mul64".
- nps400
- کامپایل برای ARC 700 روی تراشهٔ NPS400.
- em_mini
- کامپایل برای پیکربندی کمینهگرای ARC EM شامل مجموعه ثباتهای کاهشیافته.
- -mdpfp
- -mdpfp-compact
- تولید دستورهای FPX با دقت مضاعف، بهینهسازیشده برای پیادهسازی فشرده (compact).
- -mdpfp-fast
- تولید دستورهای FPX با دقت مضاعف، بهینهسازیشده برای پیادهسازی سریع (fast).
- -mno-dpfp-lrsr
- -mdpfp-lrsr
- کنترل اینکه آیا دستورهای "lr" و "sr" از ثباتهای کمکی افزونهٔ FPX استفاده کنند یا خیر. این گزینه بهطور پیشفرض فعال است.
- -mea
- تولید دستورهای محاسباتی گسترشیافته. در حال حاضر تنها "divaw"، "adds"، "subs" و "sat16" پشتیبانی میشوند. فقط برای -mcpu=ARC700 معتبر است.
- -mmul32x16
- تولید دستورهای ضرب و ضرب-انباشت (multiply-accumulate) 32x16 بیتی.
- -mmul64
- تولید دستورهای "mul64" و "mulu64". فقط برای -mcpu=ARC600 معتبر است.
- -mnorm
- تولید دستورهای "norm". اگر -mcpu=ARC700 اعمال شده باشد، این حالت پیشفرض است.
- -mspfp
- -mspfp-compact
- تولید دستورهای FPX با دقت منفرد، بهینهسازیشده برای پیادهسازی فشرده.
- -mspfp-fast
- تولید دستورهای FPX با دقت منفرد، بهینهسازیشده برای پیادهسازی سریع.
- -msimd
- فعالسازی تولید دستورهای ARC SIMD از طریق توابع توکار (built-in) اختصاصی مقصد. فقط برای -mcpu=ARC700 معتبر است.
- -msoft-float
- این گزینه نادیده گرفته میشود؛ صرفاً برای سازگاری ارائه شده است. کد ممیز شناور نرمافزاری بهطور پیشفرض تولید میشود، و این پیشفرض میتواند توسط گزینههای FPX لغو شود؛ -mspfp، -mspfp-compact، یا -mspfp-fast برای دقت منفرد، و -mdpfp، -mdpfp-compact، یا -mdpfp-fast برای دقت مضاعف.
- -mswap
- تولید دستورهای "swap".
- -matomic
- استفاده از افزونهٔ شرطی بارگذاری/ذخیرهسازی قفلشده را برای پیادهسازی توابع درونی حافظهٔ اتمیک فعال میکند. برای هستههای ARC 6xx یا ARC EM موجود نیست.
- -mdiv-rem
- فعالسازی دستورهای "div" و "rem" برای هستههای ARCv2.
- -mcode-density
- -mno-code-density
- فعالسازی دستورهای فشردگی کد (code density) برای ARC EM. این گزینه بهطور پیشفرض برای ARC HS فعال است.
- -mll64
- فعالسازی عملیات بارگذاری/ذخیرهسازی دوگانه برای هستههای ARC HS.
- -mtp-regno=regno
- تعیین شمارهٔ ثبات اشارهگر ریسه (thread pointer).
- -mbitops
- فعالسازی استفاده از عملیات بیتی NPS400.
- -mcmem
- فعالسازی استفاده از افزونهٔ xld/xst در NPS400.
- -mmpy-option=multo
- کامپایل کد ARCv2 با یک گزینهٔ طراحی ضربکننده. میتوانید این گزینه را با استفاده از یک رشته یا یک مقدار عددی برای multo مشخص کنید. wlh1 مقدار پیشفرض است. مقادیر شناختهشده عبارتند از:
- 0
- none
- هیچ ضربکنندهای در دسترس نیست.
- 1
- w
- ضربکنندهٔ 16x16، کاملاً خطلولهای (fully pipelined). دستورهای زیر فعال میشوند: "mpyw" و "mpyuw".
- 2
- wlh1
- ضربکنندهٔ 32x32، کاملاً خطلولهای (۱ مرحله). دستورهای زیر علاوه بر آن فعال میشوند: "mpy"، "mpyu"، "mpym"، "mpymu" و "mpy_s".
- 3
- wlh2
- ضربکنندهٔ 32x32، کاملاً خطلولهای (۲ مرحله). دستورهای زیر علاوه بر آن فعال میشوند: "mpy"، "mpyu"، "mpym"، "mpymu" و "mpy_s".
- 4
- wlh3
- دو ضربکنندهٔ 16x16، مسدودکننده (blocking)، متوالی (sequential). دستورهای زیر علاوه بر آن فعال میشوند: "mpy"، "mpyu"، "mpym"، "mpymu" و "mpy_s".
- 5
- wlh4
- یک ضربکنندهٔ 16x16، مسدودکننده، متوالی. دستورهای زیر علاوه بر آن فعال میشوند: "mpy"، "mpyu"، "mpym"، "mpymu" و "mpy_s".
- 6
- wlh5
- یک ضربکنندهٔ 32x4، مسدودکننده، متوالی. دستورهای زیر علاوه بر آن فعال میشوند: "mpy"، "mpyu"، "mpym"، "mpymu" و "mpy_s".
- 7
- plus_dmpy
- پشتیبانی از SIMD در ARC HS..IP 8 4
- plus_macd
- پشتیبانی از SIMD در ARC HS.
- 9
- plus_qmacw
- پشتیبانی از SIMD در ARC HS.
این گزینه تنها برای هستههای 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) با 16 مدخل کد تولید کند. این گزینه ماکروی پیشپردازندهٔ "__ARC_RF16__" را تعریف میکند.
- -mbranch-index
- استفاده از دستورالعملهای "bi" یا "bih" را برای پیادهسازی جدولهای پرش (jump tables) فعال میکند.
گزینههای زیر به اسمبلر ارسال میشوند و همچنین نمادهای ماکروی پیشپردازنده را تعریف میکنند:
- -mlock
- به اسمبلر فرستاده میشود تا افزونهٔ شرطی بارگذاری/ذخیرهٔ قفلشده (locked load/store conditional) را فعال کند. همچنین نماد پیشپردازندهٔ "__Xlock" را تنظیم میکند.
- -mswape
- به اسمبلر فرستاده میشود تا دستورالعمل افزونهٔ تعویض ترتیب بایت (swap byte ordering) را فعال کند. همچنین نماد پیشپردازندهٔ "__Xswape" را تنظیم میکند.
- -mxy
- به اسمبلر فرستاده میشود تا افزونهٔ حافظهٔ XY را فعال کند. همچنین نماد پیشپردازندهٔ "__Xxy" را تنظیم میکند.
گزینههای زیر نحوهٔ حاشیهنویسی کد اسمبلی را کنترل میکنند:
- -misize
- دستورالعملهای اسمبلی را با آدرسهای تخمینی حاشیهنویسی میکند.
گزینههای زیر به پیونددهنده (linker) فرستاده میشوند:
- -marclinux
- -mno-arclinux
- به پیونددهنده ارسال میشود تا استفاده از شبیهسازی "arclinux" را مشخص کند. این گزینه بهطور پیشفرض در زنجیرهابزارهای ساختهشده برای اهداف "arc-linux-uclibc" و "arceb-linux-uclibc" در صورت درخواست نشدنِ تحلیل کارایی (profiling) فعال است.
- -marclinux_prof
- -mno-arclinux_prof
- به پیونددهنده ارسال میشود تا استفاده از شبیهسازی "arclinux_prof" را مشخص کند. این گزینه بهطور پیشفرض در زنجیرهابزارهای ساختهشده برای اهداف "arc-linux-uclibc" و "arceb-linux-uclibc" در صورت درخواست تحلیل کارایی فعال است.
گزینههای زیر معانی و رفتار کدهای تولیدشده را کنترل میکنند:
- -mlong-calls
- فراخوانیها را بهصورت فراخوانیهای غیرمستقیم ثباتی (register indirect calls) تولید میکند، و از این رو امکان دسترسی به کل دامنهٔ آدرسدهی 32 بیتی را فراهم میآورد.
- -mmedium-calls
- -mno-medium-calls
- برای فراخوانیها از دامنهٔ آدرسدهی کمتر از 25 بیت استفاده نمیکند؛ این مقدار، آفستِ در دسترس برای یک دستورالعمل انشعاب و پیوند (branch-and-link) بدون شرط است. اجرای شرطی فراخوانیِ توابع متوقف میشود تا بهجای دامنهٔ 21 بیتی با انشعاب و پیوند شرطی، امکان استفاده از دامنهٔ 25 بیتی فراهم گردد. این گزینه، حالت پیشفرض برای زنجیرهابزارهای ساختهشده برای اهداف "arc-linux-uclibc" و "arceb-linux-uclibc" است..IP "-G num" 4 تعاریف دادههای از بیرون مرئی را در صورتی که اندازهٔ آن دادهها بزرگتر از num بایت نباشد، در بخش دادههای کوچک (small data section) قرار میدهد. مقدار پیشفرض num برای هر پیکربندی ARC برابر ۴ است، یا در صورتی که عملیات بارگذاری/ذخیره دوگانه داشته باشیم، ۸ است.
- -mno-sdata
- ارجاعات sdata را تولید نمیکند. این حالت پیشفرض برای زنجیرههای ابزاری است که برای اهداف "arc-linux-uclibc" و "arceb-linux-uclibc" ساخته شدهاند.
- -mvolatile-cache
- -mno-volatile-cache
- نحوهٔ دسترسی به ارجاعات volatile را کنترل میکند. حالت پیشفرض -mvolatile-cache است که از دسترسیهای معمولی حافظهٔ میانگیرشده (cached) برای ارجاعات volatile استفاده میکند. از -mno-volatile-cache برای فعالسازی دور زدن حافظهٔ موقت (cache bypass) برای ارجاعات volatile استفاده کنید.
گزینههای زیر تولید کد را دقیقتر تنظیم میکنند:
- -mauto-modify-reg
- استفاده از تغییر قبل/بعد (pre/post modify) را با جابهجایی ثبات فعال میکند.
- -mno-brcc
- -mbrcc
- این گزینه گذرگاه مختص به مقصد را در arc_reorg برای تولید دستورالعملهای مقایسه-و-انشعاب ("brcc") کنترل میکند، که بهطور پیشفرض فعال است. این گزینه تأثیری بر تولید این دستورالعملها که توسط گذرگاه combiner هدایت میشوند ندارد.
- -mcase-vector-pcrel
- از جدولهای switch case وابسته به شمارندهٔ برنامه (PC-relative) استفاده میکند تا امکان کوتاهسازی جدول case فراهم شود. این حالت پیشفرض برای -Os است.
- -mno-cond-exec
- گذرگاه
مختص ARCompact
برای تولید
دستورالعملهای
اجرای
مشروط را
غیرفعال
میکند.
به دلیل زمانبندی شکاف تأخیر (delay slot) و برهمکنش میان تعداد عملوندها، اندازهٔ دادههای لفظی، طول دستورالعملها و پشتیبانی از اجرای مشروط، گذرگاه مستقل از مقصد برای تولید اجرای مشروط اغلب ناکافی است؛ بنابراین پورت ARC گذرگاه ویژهای را نگه داشته است که سعی میکند پس از انجام تخصیص ثبات، کوتاهسازی انشعاب، و زمانبندی شکاف تأخیر، فرصتهای بیشتری برای تولید اجرای مشروط بیابد. این گذرگاه معمولاً، اما نه همیشه، کارایی و اندازهٔ کد را به بهای زمان کامپایل بیشتر بهبود میبخشد، که به همین دلیل گزینهای برای غیرفعال کردن آن در نظر گرفته شده است. اگر با مشکل فراتر رفتن دستورالعملهای فراخوانی از دامنهٔ مجاز آفست خود به دلیل مشروط شدن آنها مواجه هستید، باید در عوض استفاده از -mmedium-calls را مد نظر قرار دهید.
- -mearly-cbranchsi
- استفادهٔ پیش از بارگذاری مجدد (pre-reload) از الگوی "cbranchsi" را فعال میکند.
- -mindexed-loads
- استفاده از بارگذاریهای نمایهشده (indexed loads) را فعال میکند. این کار میتواند مشکلساز باشد زیرا برخی از بهینهسازها در این صورت فرض میکنند که ذخیرههای نمایهشده وجود دارند، در حالی که اینگونه نیست.
- -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 معتبر هستند.
- -msize-level=level
- بهینهسازی اندازه را با توجه به طول دستورالعملها و ترازسازی بهدقت تنظیم میکند. مقادیر شناختهشده برای level عبارتند از:
- 0
- بدون بهینهسازی اندازه. این سطح منسوخ شده و مانند 1 با آن رفتار میشود.
- 1
- دستورالعملهای کوتاه به صورت فرصتطلبانه استفاده میشوند.
- 2
- علاوه بر این، ترازسازی حلقهها و کد پس از موانع نادیده گرفته میشود.
- 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
- تنظیم دقیق برای پردازندهٔ نوع ARCv2 core3. این گزینه استفاده از دستورالعمل "dbnz" را فعال میکند.
- release31a
- تنظیم دقیق برای ARC4x نگارش 3.10a.
- -mmultcost=num
- هزینهای که برای یک دستورالعمل ضرب فرض میشود، با این شرط که مقدار 4 معادل یک دستورالعمل معمولی است.
گزینههای ARM (ARM Options)
این گزینههای -m برای پورت ARM تعریف شدهاند:
- -mabi=name
- تولید کد برای ABI مشخصشده. مقادیر مجاز عبارتند از: apcs-gnu، atpcs، aapcs و aapcs-linux.
- -mapcs-frame
- برای همهٔ توابع، یک چارچوب پشته (stack frame) منطبق با استاندارد فراخوانی رویهٔ ARM تولید میکند، حتی اگر این کار برای اجرای صحیح کد اکیداً لازم نباشد. مشخص کردن -fomit-frame-pointer همراه با این گزینه باعث میشود چارچوب پشته برای توابع برگی تولید نشود. حالت پیشفرض -mno-apcs-frame است. این گزینه منسوخ شده است.
- -mapcs
- این گزینه مترادفی برای -mapcs-frame است و منسوخ شده است.
- -mthumb-interwork
- کدی تولید میکند که از فراخوانی میان مجموعههای دستورالعمل ARM و Thumb پشتیبانی میکند. بدون این گزینه، در معماریهای پیش از نگارش ۵، این دو مجموعه دستورالعمل را نمیتوان بهطور قابلاطمینان درون یک برنامه استفاده کرد. حالت پیشفرض -mno-thumb-interwork است، زیرا هنگام تعیین -mthumb-interwork کد تا حدی بزرگتر تولید میشود. در پیکربندیهای AAPCS این گزینه بیمعنی است.
- -msched-prolog
- -mno-sched-prolog
- مجاز یا ممنوع کردن بازآرایی دستورالعملها در مقدمهٔ تابع (function prologue)، یا ادغام آن دستورالعملها با دستورالعملهای درون بدنهٔ تابع. با -mno-sched-prolog، تمام توابع با مجموعهای مشخص و قابلتشخیص از دستورالعملها (یا در واقع انتخابی از میان مجموعهای کوچک از مقدمههای گوناگون تابع) آغاز میشوند، و این اطلاعات میتواند برای تعیین محل آغاز توابع درون یک قطعه کد اجرایی به کار رود. پیشفرض -msched-prolog است.
- -mfloat-abi=name
- مشخص
میکند که
از کدام ABI
ممیز شناور
استفاده
شود. مقادیر
مجاز
عبارتاند
از: soft، softfp و hard.
تعیین soft باعث میشود GCC خروجیای تولید کند که حاوی فراخوانیهای کتابخانهای برای عملیات ممیز شناور باشد. softfp امکان تولید کد با استفاده از دستورالعملهای سختافزاری ممیز شناور را فراهم میکند، اما همچنان از قراردادهای فراخوانی soft-float بهره میبرد. hard اجازهٔ تولید دستورالعملهای ممیز شناور را صادر کرده و از قراردادهای فراخوانی اختصاصی FPU استفاده میکند.
پیشفرض به پیکربندی مقصد مشخص بستگی دارد. توجه داشته باشید که ABIهای hard-float و soft-float با یکدیگر سازگار برای پیوند (link-compatible) نیستند؛ شما باید کل برنامهٔ خود را با یک 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.
بسیاری از معماریها از افزونهها (extensions) پشتیبانی میکنند. این افزونهها را میتوان با افزودن +extension به انتهای نام معماری اضافه کرد. گزینههای افزونه به ترتیب پردازش میشوند و قابلیتها انباشته میگردند. یک افزونه همچنین هر افزونهٔ پایهٔ ضروری که به آن وابسته است را نیز فعال میکند. برای مثال، افزونهٔ +crypto همواره افزونهٔ +simd را فعال میکند. استثنای این ساختار افزایشی، افزونههایی هستند که دارای پیشوند +no... میباشند: این افزونهها گزینهٔ مشخصشده و هر افزونهٔ دیگری را که ممکن است به وجود آن افزونه وابسته باشد، غیرفعال میکنند.
برای مثال، عبارت -march=armv7-a+simd+nofp+vfpv4 معادل با -march=armv7-a+vfpv4 است، چرا که گزینهٔ +simd کاملاً توسط گزینهٔ +nofp پس از آن غیرفعال میشود.
بیشتر نامهای افزونهها نامگذاری عمومی دارند، اما تأثیر آنها به معماریای که به آن اعمال میشوند وابسته است. برای مثال، گزینهٔ +simd میتواند هم برای معماری armv7-a و هم armv8-a اعمال شود، اما افزونههای اصلی ARMv7-A Advanced SIMD (Neon) را برای armv7-a و گونهٔ ARMv8-A را برای armv8-a فعال میکند.
جدول زیر افزونههای پشتیبانیشده را برای هر معماری فهرست میکند. معماریهایی که ذکر نشدهاند، از هیچ افزونهای پشتیبانی نمیکنند.
- +fp
- دستورالعملهای ممیز شناور VFPv2. افزونهٔ +vfpv2 میتواند به عنوان نام مستعاری برای این افزونه به کار رود.
- +nofp
- غیرفعال کردن دستورالعملهای ممیز شناور.
- armv7
- زیرمجموعهٔ مشترک معماریهای ARMv7-A، ARMv7-R و ARMv7-M.
- +fp
- دستورالعملهای ممیز شناور VFPv3، با ۱۶ ثبات دقت مضاعف (double-precision). افزونهٔ +vfpv3-d16 میتواند به عنوان نام مستعاری برای این افزونه به کار رود. توجه داشته باشید که ممیز شناور توسط معماری پایهٔ ARMv7-M پشتیبانی نمیشود، اما با هر دو معماری ARMv7-A و ARMv7-R سازگار است.
- +nofp
- غیرفعال کردن دستورالعملهای ممیز شناور.
- +mp
- افزونهٔ چندپردازشی (multiprocessing).
- +sec
- افزونهٔ امنیتی (security).
- +fp
- دستورالعملهای ممیز شناور VFPv3، با ۱۶ ثبات دقت مضاعف. افزونهٔ +vfpv3-d16 میتواند به عنوان نام مستعاری برای این افزونه به کار رود.
- +simd
- دستورالعملهای Advanced SIMD (Neon) v1 و ممیز شناور VFPv3. افزونههای +neon و +neon-vfpv3 میتوانند به عنوان نامهای مستعار برای این افزونه استفاده شوند.
- +vfpv3
- دستورالعملهای ممیز شناور VFPv3، با ۳۲ ثبات دقت مضاعف.
- +vfpv3-d16-fp16
- دستورالعملهای ممیز شناور VFPv3، با ۱۶ ثبات دقت مضاعف و عملیات تبدیل ممیز شناور با دقت نیمه (half-precision)..IP +vfpv3-fp16 4 دستورالعملهای ممیز شناور VFPv3، با ۳۲ ثبات دقت مضاعف و عملیات تبدیل ممیز شناور با نیمدقت.
- +vfpv4-d16
- دستورالعملهای ممیز شناور VFPv4، با ۱۶ ثبات دقت مضاعف.
- +vfpv4
- دستورالعملهای ممیز شناور VFPv4، با ۳۲ ثبات دقت مضاعف.
- +neon-fp16
- دستورالعملهای ممیز شناور VFPv3 و Advanced SIMD (Neon) v1، با عملیات تبدیل ممیز شناور با نیمدقت.
- +neon-vfpv4
- دستورالعملهای ممیز شناور VFPv4 و Advanced SIMD (Neon) v2.
- +nosimd
- غیرفعالسازی دستورالعملهای Advanced SIMD (ممیز شناور را غیرفعال نمیکند).
- +nofp
- غیرفعالسازی دستورالعملهای ممیز شناور و Advanced SIMD.
- armv7ve
- نسخهٔ گسترشیافته معماری ARMv7-A با پشتیبانی از مجازیسازی.
- +fp
- دستورالعملهای ممیز شناور VFPv4، با ۱۶ ثبات دقت مضاعف. افزونهٔ +vfpv4-d16 میتواند به عنوان نام مستعار برای این افزونه استفاده شود.
- +simd
- دستورالعملهای ممیز شناور VFPv4 و Advanced SIMD (Neon) v2. افزونهٔ +neon-vfpv4 میتواند به عنوان نام مستعار برای این افزونه استفاده شود.
- +vfpv3-d16
- دستورالعملهای ممیز شناور VFPv3، با ۱۶ ثبات دقت مضاعف.
- +vfpv3
- دستورالعملهای ممیز شناور VFPv3، با ۳۲ ثبات دقت مضاعف.
- +vfpv3-d16-fp16
- دستورالعملهای ممیز شناور VFPv3، با ۱۶ ثبات دقت مضاعف و عملیات تبدیل ممیز شناور با نیمدقت.
- +vfpv3-fp16
- دستورالعملهای ممیز شناور VFPv3، با ۳۲ ثبات دقت مضاعف و عملیات تبدیل ممیز شناور با نیمدقت.
- +vfpv4-d16
- دستورالعملهای ممیز شناور VFPv4، با ۱۶ ثبات دقت مضاعف.
- +vfpv4
- دستورالعملهای ممیز شناور VFPv4، با ۳۲ ثبات دقت مضاعف.
- +neon
- دستورالعملهای ممیز شناور VFPv3 و Advanced SIMD (Neon) v1. افزونهٔ +neon-vfpv3 میتواند به عنوان نام مستعار برای این افزونه استفاده شود.
- +neon-fp16
- دستورالعملهای ممیز شناور VFPv3 و Advanced SIMD (Neon) v1، با عملیات تبدیل ممیز شناور با نیمدقت.
- +nosimd
- غیرفعالسازی دستورالعملهای Advanced SIMD (ممیز شناور را غیرفعال نمیکند).
- +nofp
- غیرفعالسازی دستورالعملهای ممیز شناور و Advanced SIMD.
- +crc
- دستورالعملهای بررسی افزونگی چرخهای (CRC).
- +simd
- دستورالعملهای ممیز شناور و Advanced SIMD در ARMv8-A.
- +crypto
- دستورالعملهای رمزنگاری.
- +nocrypto
- غیرفعالسازی دستورالعملهای رمزنگاری.
- +nofp
- غیرفعالسازی دستورالعملهای ممیز شناور، Advanced SIMD و رمزنگاری.
- +sb
- دستورالعمل سد گمانهزنی (Speculation Barrier).
- +predres
- دستورالعملهای محدودسازی پیشبینی داده و اجرا (Execution and Data Prediction Restriction).
- +simd
- دستورالعملهای ممیز شناور و Advanced SIMD در ARMv8.1-A.
- +crypto
- دستورالعملهای رمزنگاری. این گزینه همچنین دستورالعملهای ممیز شناور و Advanced SIMD را فعال میکند.
- +nocrypto
- غیرفعالسازی دستورالعملهای رمزنگاری.
- +nofp
- غیرفعالسازی دستورالعملهای ممیز شناور، Advanced SIMD و رمزنگاری.
- +sb
- دستورالعمل سد گمانهزنی (Speculation Barrier).
- +predres
- دستورالعملهای محدودسازی پیشبینی داده و اجرا (Execution and Data Prediction Restriction).
- +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
- دستورالعملهای محدودسازی پیشبینی داده و اجرا (Execution and Data Prediction Restriction).
- +i8mm
- دستورالعملهای ضرب ماتریسی عدد صحیح ۸-بیتی. این گزینه همچنین دستورالعملهای ممیز شناور و Advanced SIMD را فعال میکند..IP +bf16 4 دستورالعملهای ممیز شناور با دقت نیمهٔ Brain. این گزینه همچنین دستورالعملهای ممیز شناور و Advanced SIMD را فعال میکند.
- +fp16
- دستورالعملهای پردازش دادهٔ ممیز شناور با دقت نیمه. این گزینه همچنین دستورالعملهای ممیز شناور و Advanced SIMD به همراه افزونهٔ Dot Product و افزونهٔ fmla ممیز شناور با دقت نیمه را فعال میکند.
- +simd
- دستورالعملهای ممیز شناور و Advanced SIMD در ARMv8.3-A و همچنین افزونهٔ Dot Product.
- +crypto
- دستورالعملهای رمزنگاری. این گزینه همچنین دستورالعملهای ممیز شناور و Advanced SIMD به همراه افزونهٔ Dot Product را فعال میکند.
- +nocrypto
- افزونهٔ رمزنگاری را غیرفعال میکند.
- +nofp
- دستورالعملهای ممیز شناور، Advanced SIMD و رمزنگاری را غیرفعال میکند.
- +sb
- دستورالعمل مانع ارزیابی حدسی (Speculation Barrier).
- +predres
- دستورالعملهای محدودسازی اجرای حدسی و پیشبینی داده.
- +i8mm
- دستورالعملهای ضرب ماتریسی اعداد صحیح ۸-بیتی. این گزینه همچنین دستورالعملهای ممیز شناور و Advanced SIMD را فعال میکند.
- +bf16
- دستورالعملهای ممیز شناور با دقت نیمهٔ Brain. این گزینه همچنین دستورالعملهای ممیز شناور و Advanced SIMD را فعال میکند.
- +fp16
- دستورالعملهای پردازش دادهٔ ممیز شناور با دقت نیمه. این گزینه همچنین دستورالعملهای ممیز شناور و Advanced SIMD به همراه افزونهٔ Dot Product و افزونهٔ fmla ممیز شناور با دقت نیمه را فعال میکند.
- +simd
- دستورالعملهای ممیز شناور و Advanced SIMD در ARMv8.3-A و همچنین افزونهٔ Dot Product.
- +crypto
- دستورالعملهای رمزنگاری. این گزینه همچنین دستورالعملهای ممیز شناور و Advanced SIMD به همراه افزونهٔ Dot Product را فعال میکند.
- +nocrypto
- افزونهٔ رمزنگاری را غیرفعال میکند.
- +nofp
- دستورالعملهای ممیز شناور، Advanced SIMD و رمزنگاری را غیرفعال میکند.
- +i8mm
- دستورالعملهای ضرب ماتریسی اعداد صحیح ۸-بیتی. این گزینه همچنین دستورالعملهای ممیز شناور و Advanced SIMD را فعال میکند.
- +bf16
- دستورالعملهای ممیز شناور با دقت نیمهٔ Brain. این گزینه همچنین دستورالعملهای ممیز شناور و Advanced SIMD را فعال میکند.
- +fp16
- دستورالعملهای پردازش دادهٔ ممیز شناور با دقت نیمه. این گزینه همچنین دستورالعملهای ممیز شناور و Advanced SIMD به همراه افزونهٔ Dot Product و افزونهٔ fmla ممیز شناور با دقت نیمه را فعال میکند.
- +simd
- دستورالعملهای ممیز شناور و Advanced SIMD در ARMv8.3-A و همچنین افزونهٔ Dot Product.
- +crypto
- دستورالعملهای رمزنگاری. این گزینه همچنین دستورالعملهای ممیز شناور و Advanced SIMD به همراه افزونهٔ Dot Product را فعال میکند.
- +nocrypto
- افزونهٔ رمزنگاری را غیرفعال میکند.
- +nofp
- دستورالعملهای ممیز شناور، 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) روی کمکپردازندههای انتخابشده بر اساس شمارههای ارائهشده در گزینهها در محدودهٔ 0 تا 7.
- +pacbti
- فعالسازی افزونهٔ Pointer Authentication and Branch Target Identification.
- +dsp
- دستورالعملهای DSP.
- +nodsp
- غیرفعالسازی افزونهٔ DSP.
- +fp
- دستورالعملهای ممیز شناور با دقت یگانه.
- +fp.dp
- دستورالعملهای ممیز شناور با دقت یگانه و مضاعف.
- +nofp
- غیرفعالسازی افزونهٔ ممیز شناور.
- +cdecp0, +cdecp1, ... , +cdecp7
- فعالسازی Custom Datapath Extension (CDE) روی کمکپردازندههای انتخابشده بر اساس شمارههای ارائهشده در گزینهها در محدودهٔ 0 تا 7.
- +crc
- دستورالعملهای بررسی افزونگی چرخشی (CRC).
- +fp.sp
- دستورالعملهای ممیز شناور FPv5 با دقت یگانه.
- +simd
- دستورالعملهای Advanced SIMD و ممیز شناور ARMv8-A.
- +crypto
- دستورالعملهای رمزنگاری.
- +nocrypto
- غیرفعالسازی دستورالعملهای رمزنگاری.
- +nofp
- غیرفعالسازی دستورالعملهای ممیز شناور، Advanced SIMD و رمزنگاری.
گزینهٔ -march=native باعث میشود کامپایلر معماری رایانهٔ ساخت را بهطور خودکار تشخیص دهد. در حال حاضر، این قابلیت فقط در GNU/Linux پشتیبانی میشود و همهٔ معماریها شناسایی نمیشوند. در صورتی که تشخیص خودکار ناموفق باشد، این گزینه هیچ اثری نخواهد داشت.
گزینهٔ -march=unset باعث میشود که کامپایلر هرگونه گزینهٔ -march=... را که پیشتر در خط فرمان آمده است نادیده بگیرد و به گونهای رفتار کند که گویی این گزینه هرگز داده نشده است. این ویژگی برای جلوگیری از هشدارهای مربوط به تداخل گزینههای CPU و معماری زمانی که این دو مشخصات معماری متفاوتی تولید میکنند مفید است.
- -mtune=name
- این گزینه
نام
پردازندهٔ
ARM مقصد را
مشخص
میکند که GCC
باید
کارایی کد
را برای آن
تنظیم (tune) کند.
برای برخی
پیادهسازیهای
ARM با
استفاده از
این گزینه
میتوان
کارایی
بهتری به
دست آورد.
نامهای
مجاز
عبارتند از:
arm7tdmi، arm7tdmi-s، arm710t،
arm720t، arm740t، strongarm،
strongarm110، strongarm1100،
strongarm1110، arm8، arm810،
arm9، arm9e، arm920،
arm920t، arm922t، arm946e-s،
arm966e-s، arm968e-s،
arm926ej-s، arm940t، arm9tdmi،
arm10tdmi، arm1020t،
arm1026ej-s، arm10e، arm1020e،
arm1022e، arm1136j-s،
arm1136jf-s، mpcore،
mpcorenovfp، arm1156t2-s،
arm1156t2f-s، arm1176jz-s،
arm1176jzf-s، generic-armv7-a،
cortex-a5، cortex-a7، cortex-a8،
cortex-a9، cortex-a12،
cortex-a15، cortex-a17،
cortex-a32، cortex-a35،
cortex-a53، cortex-a55،
cortex-a57، cortex-a72،
cortex-a73، cortex-a75،
cortex-a76، cortex-a76ae،
cortex-a77، cortex-a78،
cortex-a78ae، cortex-a78c،
cortex-a710، ares، cortex-r4،
cortex-r4f، cortex-r5،
cortex-r7، cortex-r8،
cortex-r52، cortex-r52plus،
cortex-m0، cortex-m0plus،
cortex-m1، cortex-m3، cortex-m4،
cortex-m7، cortex-m23،
cortex-m33، cortex-m35p،
cortex-m52، cortex-m55،
cortex-m85، cortex-x1،
cortex-x1c، cortex-m1.small-multiply،
cortex-m0.small-multiply،
cortex-m0plus.small-multiply، exynos-m1،
marvell-pj4، neoverse-n1،
neoverse-n2، neoverse-v1،
xscale، iwmmxt، iwmmxt2،
ep9312، fa526، fa626،
fa606te، fa626te، fmp626،
fa726te، star-mc1، xgene1.
علاوه بر این، این گزینه میتواند مشخص کند که GCC باید کارایی کد را برای یک سیستم big.LITTLE تنظیم کند. نامهای مجاز عبارتند از: cortex-a15.cortex-a7، cortex-a17.cortex-a7، cortex-a57.cortex-a53، cortex-a72.cortex-a53، cortex-a72.cortex-a35، cortex-a73.cortex-a53، cortex-a75.cortex-a55، cortex-a76.cortex-a55.
گزینهٔ -mtune=generic-arch مشخص میکند که GCC باید کارایی را برای ترکیبی از پردازندههای درون معماری arch تنظیم کند. هدف، تولید کدی است که روی محبوبترین پردازندههای فعلی به خوبی اجرا شود، و بین بهینهسازیهایی که به نفع برخی CPUهای این رده است و اجتناب از تلههای کارایی در سایر پردازندهها تعادل برقرار سازد. با تغییر و گذر مدلهای پردازنده، اثرات این گزینه ممکن است در نسخههای آیندهٔ GCC تغییر کند.
گزینهٔ -mtune همان گزینههای افزونهٔ مربوط به -mcpu را میپذیرد، اما گزینههای افزونه بر نحوهٔ تنظیم کارایی کد تولیدشده اثری ندارند.
گزینهٔ -mtune=native باعث میشود کامپایلر CPU رایانهٔ ساخت را بهطور خودکار تشخیص دهد. در حال حاضر، این قابلیت فقط در GNU/Linux پشتیبانی میشود و همهٔ معماریها شناختهشده نیستند. در صورتی که تشخیص خودکار ناموفق باشد، این گزینه هیچ اثری نخواهد داشت.
- -mcpu=name[+extension...]
- این گزینه
نام
پردازندهٔ
ARM مقصد را
مشخص
میکند. GCC از
این نام
برای
استخراج
نام معماری
ARM مقصد
(مشابه
حالتی که
توسط -march
مشخص شود) و
نوع
پردازندهٔ
ARM جهت تنظیم
کارایی
(مشابه
حالتی که
توسط -mtune
مشخص شود)
استفاده
میکند. در
مواردی که
این گزینه
در کنار -march
یا -mtune به کار
رود، آن
گزینهها
بر بخش
متناظر از
این گزینه
تقدم
خواهند
داشت.
بسیاری از CPUهای پشتیبانیشده افزونههای اختیاری معماری را پیادهسازی میکنند. در صورتی که چنین باشد، افزونههای معماری معمولاً بهطور پیشفرض فعال هستند. اگر پیادهسازیهایی وجود داشته باشند که فاقد افزونه هستند، میتوان از نحو افزونه برای غیرفعال کردن آن افزونههایی که حذف شدهاند استفاده کرد. برای دستورالعملهای ممیز شناور و Advanced SIMD (Neon)، تنظیمات گزینههای -mfloat-abi و -mfpu نیز باید در نظر گرفته شوند: دستورالعملهای ممیز شناور و Advanced SIMD تنها زمانی استفاده خواهند شد که -mfloat-abi روی soft تنظیم نشده باشد؛ و هر تنظیمی از -mfpu غیر از auto بر دستورالعملهای افزونهٔ ممیز شناور و SIMD موجود اولویت خواهد داشت.
برای مثال، cortex-a9 در سه پیکربندی اصلی یافت میشود: فقط عدد صحیح، تنها با یک واحد ممیز شناور، یا همراه با ممیز شناور و Advanced SIMD. پیشفرض بر فعال بودن تمام دستورالعملها است، اما از افزونههای +nosimd و +nofp میتوان به ترتیب برای غیرفعال کردن تنها SIMD یا هر دو دستورالعملهای SIMD و ممیز شناور استفاده کرد.
نامهای مجاز برای این گزینه مشابه نامهای مربوط به -mtune هستند.
گزینههای افزونهٔ زیر برای CPUهای فهرستشده مشترک هستند:
- +nopacbti
- افزونهٔ احراز هویت اشارهگر و شناسایی مقصد انشعاب (Pointer Authentication and Branch Target Identification Extension) را در cortex-m52 و cortex-m85 غیرفعال میکند.
- +nomve
- دستورالعملهای عدد صحیح و ممیز شناور با دقت یگانهٔ افزونهٔ برداری M-Profile (MVE) را در cortex-m52، cortex-m55 و cortex-m85 غیرفعال میکند.
- +nomve.fp
- دستورالعملهای ممیز شناور با دقت یگانهٔ افزونهٔ برداری M-Profile (MVE) را در cortex-m52، cortex-m55 و cortex-m85 غیرفعال میکند.
- +cdecp0, +cdecp1, ... , +cdecp7
- افزونهٔ مسیر دادهٔ سفارشی (CDE) را بر روی کمکپردازندههای انتخابشده بر اساس شمارههای ارائهشده در گزینهها در بازهٔ 0 تا 7 در cortex-m52، cortex-m55، cortex-m85 و 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 باعث میشود کامپایلر CPU رایانهٔ ساخت را بهطور خودکار شناسایی کند. در حال حاضر، این قابلیت تنها در GNU/Linux پشتیبانی میشود و همهٔ معماریها شناسایی نمیشوند. اگر تشخیص خودکار ناموفق باشد، گزینه هیچ تاثیری نخواهد داشت.
گزینهٔ -mcpu=unset باعث میشود کامپایلر هرگونه گزینهٔ -mcpu=... را که پیشتر در خط فرمان آمده نادیده بگیرد و طوری عمل کند که گویی این گزینه هرگز ارسال نشده است. این ویژگی برای جلوگیری از هشدارهای مربوط به تداخل گزینههای CPU و معماری زمانی که این دو مشخصات متفاوتی برای معماری تولید میکنند مفید است.
- -mfpu=name
- این گزینه
مشخص
میکند چه
سختافزار
ممیز
شناوری (یا
شبیهسازی
سختافزاری)
در مقصد در
دسترس است.
نامهای
مجاز
عبارتند از:
auto، vfpv2، vfpv3،
vfpv3-fp16، vfpv3-d16،
vfpv3-d16-fp16، vfpv3xd،
vfpv3xd-fp16، neon-vfpv3،
neon-fp16، vfpv4، vfpv4-d16،
fpv4-sp-d16، neon-vfpv4،
fpv5-d16، fpv5-sp-d16، fp-armv8،
neon-fp-armv8 و crypto-neon-fp-armv8.
توجه داشته
باشید که neon
یک نام
مستعار
برای neon-vfpv3 و vfp
یک نام
مستعار
برای vfpv2 است.
تنظیم auto حالت پیشفرض و ویژه است. این تنظیم باعث میشود کامپایلر دستورالعملهای ممیز شناور و Advanced SIMD را بر اساس تنظیمات -mcpu و -march انتخاب کند.
اگر سختافزار ممیز شناور انتخابشده شامل افزونهٔ NEON باشد (مانند -mfpu=neon)، توجه داشته باشید که عملیات ممیز شناور توسط مرحلهٔ برداریسازی خودکار کامپایلر GCC تولید نمیشوند مگر اینکه -funsafe-math-optimizations نیز مشخص شده باشد. دلیل این امر آن است که سختافزار NEON استاندارد IEEE 754 را برای محاسبات ممیز شناور بهطور کامل پیادهسازی نمیکند (بهویژه مقادیر غیرعادی یا denormal را صفر در نظر میگیرد)، بنابراین استفاده از دستورالعملهای NEON ممکن است منجر به کاهش دقت شود.
همچنین میتوانید با استفاده از ویژگیها یا دستورات عملیافتهٔ (pragmas) تابع target("fpu=") نام fpu را در سطح تابع تعیین کنید.
- -mfp16-format=name
- قالب نوع دادهٔ ممیز شناور با نیمدقت "__fp16" را مشخص میکند. نامهای مجاز عبارتند از none، ieee و alternative؛ حالت پیشفرض none است، که در این حالت نوع "__fp16" تعریف نمیشود.
- -mstructure-size-boundary=n
- اندازهٔ
تمام
ساختارها
(structures) و
اجتماعها
(unions) به مضربی
از تعداد
بیتهای
تعیینشده
توسط این
گزینه رو به
بالا گرد
میشود.
مقادیر
مجاز
عبارتند از
8، 32 و 64. مقدار
پیشفرض
برای
زنجیرهابزارهای
مختلف
متفاوت است.
برای
زنجیرهابزار
با هدف COFF
مقدار
پیشفرض 8
است. مقدار 64
تنها در
صورتی مجاز
است که ABI
زیربنایی
از آن
پشتیبانی
کند.
تعیین یک عدد بزرگتر میتواند کدی سریعتر و کارآمدتر تولید کند، اما همچنین میتواند اندازهٔ برنامه را افزایش دهد. مقادیر مختلف احتمالاً ناسازگار هستند. کدی که با یک مقدار کامپایل شده است، در صورت تبادل اطلاعات با استفاده از ساختارها یا اجتماعها، لزوماً نمیتواند با کد یا کتابخانههایی که با مقدار دیگری کامپایل شدهاند کار کند.
این گزینه منسوخ شده است.
- -mabort-on-noreturn
- در انتهای یک تابع "noreturn" یک فراخوانی به تابع "abort" تولید میکند. این فراخوانی در صورتی که تابع تلاش کند بازگردد، اجرا میشود.
- -mlong-calls
- -mno-long-calls
- به
کامپایلر
دستور
میدهد
فراخوانیهای
تابع را با
بارگذاری
اولیهٔ
نشانی تابع
در یک ثبات
و سپس انجام
یک
فراخوانی
زیرروال (subroutine call)
بر روی این
ثبات انجام
دهد. این
سوئیچ در
صورتی لازم
است که تابع
مقصد خارج
از محدودهٔ
آدرسدهی
۶۴
مگابایتی
نسخهٔ
مبتنی بر
آفست
دستورالعمل
فراخوانی
زیرروال
قرار داشته
باشد.
حتی اگر این سوئیچ فعال باشد، همهٔ فراخوانیهای تابع به فراخوانیهای بلند تبدیل نمیشوند. قاعدهٔ سرانگشتی (heuristic) این است که توابع ایستا (static)، توابعی که دارای مشخصهٔ "short_call" هستند، توابعی که درون محدودهٔ یک دستورالعمل "#pragma no_long_calls" قرار دارند، و توابعی که تعاریف آنها قبلاً درون واحد ترجمهٔ جاری کامپایل شده است، به فراخوانیهای بلند تبدیل نمیشوند. استثناهای این قاعده عبارتند از تعاریف توابع ضعیف (weak)، توابع دارای مشخصهٔ "long_call" یا مشخصهٔ "section"، و توابعی که درون محدودهٔ دستورالعمل "#pragma long_calls" هستند، که همواره به فراخوانیهای بلند تبدیل میشوند.
این قابلیت بهطور پیشفرض فعال نیست. تعیین -mno-long-calls رفتار پیشفرض را بازمیگرداند، درست مانند قرار دادن فراخوانیهای تابع در محدودهٔ یک دستورالعمل "#pragma long_calls_off". توجه داشته باشید این سوئیچها تاثیری بر چگونگی تولید کد توسط کامپایلر برای مدیریت فراخوانی توابع از طریق اشارهگرهای تابع ندارند.
- -msingle-pic-base
- با ثبات مورد استفاده برای آدرسدهی PIC به عنوان فقطخواندنی رفتار میکند، به جای اینکه آن را در پیشدرآمد (prologue) هر تابع بارگذاری کند. سیستم زمان اجرا مسئول مقداردهی اولیه به این ثبات با یک مقدار مناسب پیش از شروع اجرا است.
- -mpic-register=reg
- ثبات مورد استفاده برای آدرسدهی PIC را مشخص میکند. برای حالت پایهٔ استاندارد PIC، حالت پیشفرض هر ثبات مناسبی است که توسط کامپایلر تعیین شود. برای حالت پایهٔ تکی PIC، اگر مقصد مبتنی بر EABI باشد یا بررسی پشته (stack-checking) فعال باشد، حالت پیشفرض R9 است، در غیر این صورت حالت پیشفرض R10 خواهد بود.
- -mpic-data-is-text-relative
- فرض میکند
که
جابهجایی
میان
بخشهای text و
data در زمان
پیوند
ایستا (static link)
ثابت است.
این امر
امکان
استفاده از
عملیاتهای
آدرسدهی
وابسته به PC
(PC-relative) را برای
دسترسی به
دادههایی
که مشخص است
در بخش data
قرار دارند
فراهم
میسازد.
برای مقاصد
غیر VxWorks RTP، این
گزینه
بهطور
پیشفرض
فعال است.
هنگامی که
در چنین
مقاصدی
غیرفعال
شود،
گزینهٔ -msingle-pic-base
را بهطور
پیشفرض
فعال خواهد
کرد..IP -mpoke-function-name 4
نام هر تابع
را
مستقیماً
پیش از
پیشدرآمد
تابع (prologue)، در
بخش text
مینویسد.
کد
تولیدشده
شبیه به این
است:
t0 .ascii "arm_poke_function_name", 0 .align t1 .word 0xff000000 + (t1 - t0) arm_poke_function_name mov ip, sp stmfd sp!, {fp, ip, lr, pc} sub fp, ip, #4هنگام انجام بازگردانی پشته (stack backtrace)، کد میتواند مقدار "pc" ذخیرهشده در "fp + 0" را بازرسی کند. اگر تابع ردگیری سپس مکان "pc - 12" را بررسی کند و ۸ بیت بالایی آن تنظیم شده باشند، متوجه میشویم که یک نام تابع بلافاصله پیش از این مکان تعبیه شده و دارای طول "((pc[-3]) & 0xff000000)" است.
- -mthumb
- -marm
- تولید کد را
بین
حالتهای
اجرایی ARM و Thumb
انتخاب
میکند.
حالت
پیشفرض
برای بیشتر
پیکربندیها،
تولید کدی
است که در
وضعیت ARM
اجرا شود،
اما این
پیشفرض
میتواند
با
پیکربندی GCC
با گزینه
پیکربندی
--with-mode=state تغییر
یابد.
همچنین میتوانید با استفاده از ویژگیها یا عملگرهای pragma تابعیِ target("thumb") و target("arm")، حالت ARM یا Thumb را برای هر تابع بازنویسی کنید.
- -mtpcs-frame
- یک فریم پشته تولید میکند که با استاندارد فراخوانی رویه Thumb (یا TPCS) برای تمام توابع غیربرگ (non-leaf) سازگار است. (تابع برگ تابعی است که هیچ تابع دیگری را فراخوانی نمیکند.) پیشفرض -mno-tpcs-frame است.
- -mtpcs-leaf-frame
- یک فریم پشته تولید میکند که با استاندارد فراخوانی رویه Thumb برای تمام توابع برگ (leaf) سازگار است. (تابع برگ تابعی است که هیچ تابع دیگری را فراخوانی نمیکند.) پیشفرض -mno-apcs-leaf-frame است.
- -mcallee-super-interworking
- به تمام توابع با دید بیرونی (externally visible) در فایل در حال کامپایل، یک سرآیند مجموعه دستورالعمل ARM میدهد که پیش از اجرای بقیه تابع، به حالت Thumb جابهجا میشود. این کار اجازه میدهد این توابع از کدهای غیر-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) مورد استفاده برای دسترسی به فضای ذخیرهسازی محلی رشته را مشخص میکند. دو dialect پشتیبانی میشوند---gnu و gnu2. لهجهی gnu طرح اصلی GNU را برای پشتیبانی از مدلهای پویای محلی و سراسری TLS انتخاب میکند. لهجهی gnu2 طرح توصیفگر GNU را برمیگزیند که کارایی بهتری را برای کتابخانههای اشتراکی فراهم میسازد. طرح توصیفگر GNU با طرح اصلی سازگار است، اما به پشتیبانی جدیدی در اسمبلر، پیونددهنده و کتابخانه نیاز دارد. مدلهای TLS اجرای اولیه (initial exec) و اجرای محلی (local exec) تحت تأثیر این گزینه قرار نمیگیرند و همیشه از طرح اصلی استفاده میکنند.
- -mword-relocations
- تنها برای مقادیر با اندازه کلمه (یعنی R_ARM_ABS32) بازآرایی مطلق (absolute relocations) تولید میکند. این گزینه بهطور پیشفرض در مقصدهایی (مانند uClinux و SymbianOS) که بارگذار زمان اجرا این محدودیت را تحمیل میکند، و همچنین هنگامی که -fpic یا -fPIC مشخص شده باشد فعال است. این گزینه با -mslow-flash-data تداخل دارد.
- -mfix-cortex-m3-ldrd
- برخی از هستههای Cortex-M3 میتوانند در هنگام استفاده از دستورالعملهای "ldrd" با رجیسترهای پایه و مقصد همپوشان، موجب خرابی دادهها شوند. این گزینه از تولید این دستورالعملها جلوگیری میکند. این گزینه بهطور پیشفرض زمانی که -mcpu=cortex-m3 مشخص شده باشد فعال است.
- -mfix-cortex-a57-aes-1742098
- -mno-fix-cortex-a57-aes-1742098
- -mfix-cortex-a72-aes-1655431
- -mno-fix-cortex-a72-aes-1655431
- کاهش اثر (یا غیرفعالسازی کاهش اثر) یک اشکال سختافزاری (erratum) در Cortex-A57 و Cortex-A72 را فعال میکند که بر دستورالعملهای رمزنگاری AES اثر میگذارد. این گزینه بهطور پیشفرض هنگامی که -mcpu=cortex-a57 یا -mcpu=cortex-a72 مشخص شده باشد فعال است.
- -munaligned-access
- -mno-unaligned-access
- خواندن و
نوشتن
مقادیر ۱۶ و
۳۲ بیتی را
از
آدرسهایی
که تراز ۱۶
یا ۳۲ بیتی
ندارند
فعال (یا
غیرفعال)
میکند.
بهطور
پیشفرض
دسترسی
ترازنشده
برای تمام
معماریهای
پیش از ARMv6،
تمام ARMv6-M و
معماریهای
پایه ARMv8-M Baseline
غیرفعال
است، و برای
تمام
معماریهای
دیگر فعال
میباشد.
اگر دسترسی
ترازنشده
فعال
نباشد،
کلمات در
ساختارهای
داده فشرده
(packed) هر بار یک
بایت
خوانده یا
نوشته
میشوند.
خصیصه ARM با عنوان "Tag_CPU_unaligned_access" بسته به تنظیم این گزینه، در فایل شیء تولیدشده بر روی true یا false تنظیم میشود. در صورت فعال بودن دسترسی ترازنشده، نماد پیشپردازنده "__ARM_FEATURE_UNALIGNED" نیز تعریف میشود.
- -mslow-flash-data
- فرض میکند که بارگذاری داده از flash کندتر از واکشی دستورالعمل است. بنابراین بارگذاری تحتاللفظی (literal load) برای دستیابی به کارایی بهتر به حداقل میرسد. این گزینه فقط هنگام کامپایل برای ARMv7 M-profile پشتیبانی میشود و بهطور پیشفرض غیرفعال است. این گزینه با -mword-relocations تداخل دارد.
- -masm-syntax-unified
- فرض میکند که اسمبلر درونخطی از نحو asm یکپارچه (unified asm syntax) استفاده میکند. حالت پیشفرض در حال حاضر خاموش است که بهمعنای نحو تفکیکشده (divided syntax) میباشد. این گزینه روی Thumb2 اثری ندارد؛ با این حال ممکن است در نگارشهای آینده GCC تغییر کند. نحو تفکیکشده باید منسوخ تلقی شود.
- -mrestrict-it
- تولید بلوکهای IT را محدود میکند تا با قوانین ARMv8-A مطابقت داشته باشند. بلوکهای IT تنها میتوانند شامل یک تکدستورالعمل ۱۶ بیتی از یک مجموعه دستورالعمل منتخب باشند. این گزینه برای حالت ARMv8-A Thumb بهطور پیشفرض روشن است.
- -mpure-code
- اجازه نمیدهد دادههای ثابت در بخشهای کد قرار گیرند. علاوه بر این، هنگام کامپایل برای قالب شیء 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
- رابط FDPIC ABI را
انتخاب
میکند که
از
توصیفگرهای
تابع ۶۴
بیتی برای
نشان دادن
اشارهگرها
به توابع
استفاده
میکند.
هنگامی که
کامپایلر
برای
مقصدهای
"arm-*-uclinuxfdpiceabi"
پیکربندی
شده باشد،
این گزینه
بهطور
پیشفرض
روشن است و
در صورتی که
هیچیک از
گزینههای
مرتبط با PIC/PIE
ارائه نشده
باشد، به
معنی -fPIE است.
در سایر
مقصدها،
این گزینه
تنها
ویژگیهای
تولید کد
ویژه FDPIC را
فعال
میکند، و
کاربر باید
در صورت
نیاز
گزینههای
مرتبط با PIC/PIE
را صریحاً
ارائه دهد.
توجه داشته باشید که پیوند ایستا پشتیبانی نمیشود زیرا همچنان هنگام بازآرایی خودکار برنامه (self-relocates)، پیونددهنده پویا را درگیر میکند. اگر چنین رفتاری قابل قبول است، از گزینههای -static و -Wl,-dynamic-linker استفاده کنید.
گزینه معکوس -mno-fdpic برای ساخت هسته Linux با استفاده از همان زنجیره ابزار ("arm-*-uclinuxfdpiceabi") که برای ساخت برنامههای فضای کاربر به کار رفته، مفید (و الزامی) است..IP -mbranch-protection=features 4 فعالسازی ویژگیهای محافظت از انشعاب (تنها armv8.1-m.main).
features میتواند یکی از حالتهای زیر را داشته باشد:
none کد را بدون محافظت از انشعاب یا امضای نشانی بازگشت تولید میکند.
standard کد را با تمام ویژگیهای محافظت از انشعاب فعال در سطح استانداردشان تولید میکند.
pac-ret کد را با تنظیم امضای نشانی بازگشت در سطح استاندارد آن تولید میکند، که عبارت است از امضای تمام توابعی که نشانی بازگشت را در حافظه ذخیره میکنند.
pac-ret+leaf امضای pac-ret را گسترش میدهد تا توابع برگ (leaf) را حتی اگر نشانی بازگشت را در حافظه ننویسند، شامل شود.
bti دستورالعملهای landing-pad را در اهداف مجاز دستورالعملهای انشعاب غیرمستقیم اضافه میکند.
اگر پشتیبانی از افزونهٔ معماری +pacbti فعال نشده باشد (مثلاً از طریق -march=)، تمام عملیاتهای محافظت از انشعاب و امضای نشانی بازگشت مقید به استفاده از تنها دستورالعملهای تعریفشده در فضای architectural-NOP خواهند بود. کد تولیدشده با نسخههای پیشین معماری سازگار رو به عقب باقی میماند، اما امنیت تکمیلی میتواند در هنگام اجرا روی پردازندههایی که از افزونهٔ PACBTI پشتیبانی میکنند فعال شود.
اعمال اجباری هدف انشعاب با استفاده از BTI تنها در صورتی میتواند در هنگام اجرا فعال شود که تمام کدهای برنامه دستکم با -mbranch-protection=bti کامپایل شده باشند.
هر تنظیمی غیر از none تنها در armv8-m.main یا جدیدتر پشتیبانی میشود.
پیشفرض، تولید کد بدون محافظت از انشعاب یا امضای نشانی بازگشت است.
- -mvectorize-with-neon-quad
- -mvectorize-with-neon-double
- کنترل اینکه آیا برداریسازی از ثباتهای quad-word یا double-word در NEON استفاده کند یا خیر. پیشفرض -mvectorize-with-neon-quad است.
گزینههای 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"
- قطعات «کلاسیک» با حداکثر ۸ کبیبایت (KiB) حافظهٔ برنامه. mcu = "attiny22", "attiny26", "at90s2313", "at90s2323", "at90s2333", "at90s2343", "at90s4414", "at90s4433", "at90s4434", "at90c8534", "at90s8515", "at90s8535".
- "avr25"
- قطعات «کلاسیک» با حداکثر ۸ کبیبایت (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"
- قطعات «کلاسیک» با ۱۶ کبیبایت تا ۶۴ کبیبایت (KiB) حافظهٔ برنامه. mcu = "at76c711", "at43usb355".
- "avr31"
- قطعات «کلاسیک» با ۱۲۸ کبیبایت (KiB) حافظهٔ برنامه. mcu = "atmega103", "at43usb320".
- "avr35"
- قطعات «کلاسیک» با ۱۶ کبیبایت تا ۶۴ کبیبایت (KiB) حافظهٔ برنامه و دارای دستورالعمل "MOVW". mcu = "attiny167", "attiny1634", "atmega8u2", "atmega16u2", "atmega32u2", "ata5505", "ata6617c", "ata664251", "at90usb82", "at90usb162".
- "avr4"
- قطعات «بهبودیافته» با حداکثر ۸ کبیبایت (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"
- قطعات «بهبودیافته» با ۱۶ کبیبایت تا ۶۴ کبیبایت (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"
- قطعات «بهبودیافته» با ۱۲۸ کبیبایت (KiB) حافظهٔ برنامه. mcu = "atmega128", "atmega128a", "atmega128rfa1", "atmega128rfr2", "atmega1280", "atmega1281", "atmega1284", "atmega1284p", "atmega1284rfr2", "at90can128", "at90usb1286", "at90usb1287".
- "avr6"
- قطعات «بهبودیافته» با شمارندهٔ دستور (PC) سهبایتی، یعنی با بیش از ۱۲۸ کبیبایت (KiB) حافظهٔ برنامه. mcu = "atmega256rfr2", "atmega2560", "atmega2561", "atmega2564rfr2".
- "avrxmega2"
- قطعات «XMEGA» با بیش از ۸ کبیبایت و حداکثر ۶۴ کبیبایت (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» با حداکثر ۶۴ کبیبایت (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", "avr16la14", "avr16la20", "avr16la28", "avr16la32", "avr32da28", "avr32da28s", "avr32da32", "avr32da32s", "avr32da48", "avr32da48s", "avr32db28", "avr32db32", "avr32db48", "avr32dd14", "avr32dd20", "avr32dd28", "avr32dd32", "avr32du14", "avr32du20", "avr32du28", "avr32du32", "avr32ea28", "avr32ea32", "avr32ea48", "avr32eb14", "avr32eb20", "avr32eb28", "avr32eb32", "avr32la14", "avr32la20", "avr32la28", "avr32la32", "avr32sd20", "avr32sd28", "avr32sd32".
- "avrxmega4"
- قطعات «XMEGA» با بیش از ۶۴ کبیبایت و حداکثر ۱۲۸ کبیبایت (KiB) حافظهٔ برنامه. mcu = "atxmega64a3", "atxmega64a3u", "atxmega64a4u", "atxmega64b1", "atxmega64b3", "atxmega64c3", "atxmega64d3", "atxmega64d4", "avr128da28", "avr128da28s", "avr128da32", "avr128da32s", "avr128da48", "avr128da48s", "avr128da64", "avr128da64s", "avr128db28", "avr128db32", "avr128db48", "avr128db64".
- "avrxmega5"
- قطعات «XMEGA» با بیش از ۶۴ کبیبایت و حداکثر ۱۲۸ کبیبایت (KiB) حافظهٔ برنامه و بیش از ۶۴ کبیبایت RAM. mcu = "atxmega64a1", "atxmega64a1u".
- "avrxmega6"
- قطعات «XMEGA» با بیش از ۱۲۸ کبیبایت (KiB) حافظهٔ برنامه. mcu = "atxmega128a3", "atxmega128a3u", "atxmega128b1", "atxmega128b3", "atxmega128c3", "atxmega128d3", "atxmega128d4", "atxmega192a3", "atxmega192a3u", "atxmega192c3", "atxmega192d3", "atxmega256a3", "atxmega256a3b", "atxmega256a3bu", "atxmega256a3u", "atxmega256c3", "atxmega256d3", "atxmega384c3", "atxmega384d3".
- "avrxmega7"
- قطعات «XMEGA» با بیش از ۱۲۸ کبیبایت (KiB) حافظهٔ برنامه و بیش از ۶۴ کبیبایت RAM. mcu = "atxmega128a1", "atxmega128a1u", "atxmega128a4u".
- "avrtiny"
- قطعات دارای هستهٔ Tiny از نوع «Reduced Tiny» تنها با ۱۶ ثبات همهمنظوره و ۵۱۲ بایت تا ۴ کبیبایت (KiB) حافظهٔ برنامه. mcu = "attiny4", "attiny5", "attiny9", "attiny10", "attiny102", "attiny104", "attiny20", "attiny40".
- "avr1"
- این ISA توسط هستهٔ کمینهٔ AVR پیادهسازی شده و تنها برای اسمبلر پشتیبانی میشود. mcu = "attiny11", "attiny12", "attiny15", "attiny28", "at90s1200".
- -mabsdata
- فرض میکند که تمام دادهها در حافظهٔ ایستا میتوانند توسط دستورالعملهای LDS / STS در دسترس قرار گیرند. این گزینه تنها بر قطعات Reduced Tiny مانند ATtiny40 اثر دارد. همچنین صفت متغیر "absdata" را در بخش AVR Attributes,variable attribute ببینید.
- -mcvt
- استفاده از
یک جدول
بردار
فشرده (CVT یا compact
vector table). برخی
قطعات از یک
CVT با تنها
چهار ورودی
پشتیبانی
میکنند: 0=Reset،
1=NMI، 2=Prio1 IRQ، 3=Prio0 IRQs. این
گزینه کد
راهاندازی
را بهجای
کد معمول
"crtmcu.o"،
از
"crtmcu-cvt.o"
پیوند
میدهد.
علاوه بر
فراهمسازی
یک جدول
بردار
فشرده، کد
راهاندازی
بیت
"CPUINT_CTRLA.CPUINT_CVT"
را تنظیم
خواهد کرد
که CVT را روی
قطعه فعال
میکند.
هنگامی که نمیخواهید کد راهاندازی بیت "CPUINT_CTRLA.CPUINT_CVT" را تنظیم کند، میتوانید نماد "__init_cvt" را برآورده کنید تا کد مربوطه دیگر از "libmcu.a" آورده نشود. برای نمونه، میتوانید با "-Wl,--defsym,__init_cvt=0" پیوند دهید.
کد راهاندازی CVT از نسخهٔ AVR-LibC v2.3 ("https://github.com/avrdudes/avr-libc/issues/1010") به بعد در دسترس است.
- -mdouble=bits
- -mlong-double=bits
- اندازه (به بیت) نوع دادههای "double" یا به ترتیب "long double" را تنظیم میکند. مقادیر ممکن برای bits برابر 32 و 64 هستند. مجاز بودن یا نبودن یک مقدار مشخص برای bits به گزینههای پیکربندی "--with-double=" و "--with-long-double=" ("https://gcc.gnu.org/install/configure.html#avr") بستگی دارد، و همین موضوع برای مقادیر پیشفرض گزینهها نیز صدق میکند.
- -mgas-isr-prologues
- روالهای سرویس وقفه (ISRها) میتوانند از شبهدستور "__gcc_isr" پشتیبانیشده توسط GNU Binutils استفاده کنند. اگر این گزینه فعال باشد، این ویژگی همچنان میتواند برای ISRهای جداگانه از طریق صفت تابع AVR 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 Attributes,,"OS_task" روی "main" است. در صورت فعال بودن بهینهسازی، این گزینه بهطور پیشفرض فعال است.
- -mno-call-main
- "main" را از
این طریق
اجرا
نمیکند:
XCALL main XJMP exit
در عوض، "main" را در بخش ".init9" ("https://avrdudes.github.io/avr-libc/avr-libc-user-manual/mem_sections.html#sec_dot_init") قرار میدهد تا نیازی به فراخوانی نباشد. با تنظیم این گزینه، کاربر اعلام میکند که "main" بازنمیگردد.
این گزینه میتواند برای دستگاههایی با منابع بسیار محدود به منظور صرفهجویی در چند بایت کد و فضای پشته استفاده شود. این گزینه از AVR-LibC v2.3 ("https://github.com/avrdudes/avr-libc/issues/1012") طبق انتظار عمل خواهد کرد. در نسخههای قدیمیتر، هیچ بهبودی در عملکرد حاصل نخواهد شد.
- -mno-interrupts
- کد تولیدشده با وقفههای سختافزاری سازگار نیست. اندازه کد کوچکتر میشود.
- -mrelax
- در صورت
امکان، سعی
میکند
دستورالعمل
"CALL" یا
"JMP" را با
دستورالعمل
کوتاهتر
"RCALL" یا
"RJMP"
جایگزین
کند. تنظیم
-mrelax صرفاً
گزینه --mlink-relax
را به خط
فرمان
اسمبلر و
گزینه --relax را
به خط فرمان
پیونددهنده
اضافه
میکند.
تعدیل پرش (Jump relaxing) توسط پیونددهنده انجام میشود، زیرا آفستهای پرش پیش از جانمایی کد مشخص نیستند. بنابراین، کد اسمبلی تولیدشده توسط کامپایلر یکسان است، اما ممکن است دستورالعملهای درون فایل اجرایی با دستورالعملهای کد اسمبلی تفاوت داشته باشند.
اگر به استابهای پیونددهنده (linker stubs) نیاز باشد، تعدیل باید فعال شود؛ بخش مربوط به "EIND" و استابهای پیونددهنده را در زیر ببینید.
- -mpmem-wrap-around
- چرخش سرریز (wrap-around) شمارنده برنامه را در تعدیل پیونددهنده فعال میکند.
- -mrodata-in-ram
- -mno-rodata-in-ram
- بخشهای
".rodata" را
برای
دادههای
فقطخواندنی
به ترتیب در
RAM یا در
حافظه
برنامه
مستقر
میکند.
برای بیشتر
دستگاهها،
انتخابی
وجود ندارد
و این گزینه
بیشتر شبیه
به یک بررسی
اولیه (assertion)
عمل میکند.
از نسخه ۱۴ به بعد و برای دستگاههای AVR64* و AVR128*، بخش ".rodata" بهطور پیشفرض در حافظه فلش قرار میگیرد، به شرطی که پشتیبانی لازم در 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 v2.3، این کتابخانه شامل کدهایی است که برای عملکرد درست یک برنامه حیاتی هستند. بهویژه، شامل بخشهایی از کد راهاندازی است، مانند: "__init_sp" ("https://github.com/avrdudes/avr-libc/issues/1011") برای مقداردهی اولیه اشارهگر پشته با نماد "__stack"، "__init_cvt" ("https://github.com/avrdudes/avr-libc/issues/1010") برای تنظیم سختافزار جهت استفاده از جدول بردار فشرده با -mcvt، "__call_main" ("https://github.com/avrdudes/avr-libc/issues/1012") برای فراخوانی "main" و "exit"، و "__do_flmap_init" ("https://github.com/avrdudes/avr-libc/issues/931") برای تنظیم FLMAP طبق نماد "__flmap".
- -nodevicespecs
- عبارت
-specs=device-specs/specs-mcu را
به خط فرمان
راهانداز
کامپایلر
اضافه
نمیکند.
کاربر
مسئولیت
تأمین
گزینههای
مناسب خط
فرمان برای
زیرفرایندهایی
چون خود
کامپایلر،
اسمبلر و
پیونددهنده
را
میپذیرد.
این بدان
معناست که
کاربر باید
فایل
مشخصات (specs)
اختصاصی
دستگاه خود
را از طریق
-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 (AVR Optimization Options)
گزینههای زیر گزینههای بهینهسازی خالص هستند. گزینههای -mgas-isr-prologues، -mmain-is-OS_task، -mno-call-main و -mrelax از موارد بالا تنها تقریباً گزینههای بهینهسازی محسوب میشوند، زیرا مواردی نادر وجود دارد که در آنها تفاوت در تولید کد اهمیت پیدا میکند.
- -maccumulate-args
- آرگومانهای
خروجی تابع
را انباشته
کرده و فضای
پشته مورد
نیاز برای
آرگومانهای
خروجی تابع
را یک بار
در
مقدمه/مؤخره
تابع تخصیص
داده/آزاد
میکند.
بدون این
گزینه،
آرگومانهای
خروجی پیش
از
فراخوانی
تابع در
پشته قرار
داده شده (push) و
پس از آن
برداشته
میشوند (pop).
همچنین
گزینه
بهینهسازی
-fdefer-pop را در Optimize
Options,,optimization option
ببینید.
برداشتن آرگومانها از پشته پس از فراخوانی تابع میتواند در AVR پرهزینه باشد، به طوری که انباشتن فضای پشته ممکن است به فایلهای اجرایی کوچکتری منجر شود زیرا پس از چنین فراخوانی تابعی نیازی به حذف آرگومانها از پشته نخواهد بود.
این گزینه میتواند باعث کاهش اندازه کد برای توابعی شود که چندین بار توابعی را فراخوانی میکنند که آرگومانهای خود را در پشته دریافت میکنند، مانند فراخوانی توابع شبیه به printf.
- -mbranch-cost=cost
- هزینه انشعاب را برای دستورالعملهای انشعاب شرطی روی cost تنظیم میکند. مقادیر معقول برای cost اعداد صحیح، کوچک و غیرمنفی هستند. هزینه پیشفرض انشعاب 0 است.
- -mcall-prologues
- مقدمهها/مؤخرههای توابع بهصورت فراخوانی زیرروالهای مناسب بسط مییابند. اندازه کد کوچکتر میشود.
- -mfuse-add
- -mno-fuse-add
- -mfuse-add=level
- دسترسیهای غیرمستقیم به حافظه را روی دستگاههای تقلیلیافته Tiny بهینهسازی میکند. حالت پیشفرض برای بهینهسازیهای -Og و -O1 از مقدار "level=1" و برای بهینهسازیهای بالاتر از مقدار "level=2" استفاده میکند. مقادیر معتبر برای level عبارتند از 0، 1 و 2.
- -mfuse-move
- -mno-fuse-move
- اجرای یک مرحله بهینهسازی پس از بارگذاری مجدد (post reload) که تلاش میکند دستورالعملهای move را ادغام کرده و دستورالعملهای چندبایتی را به عملیاتهای ۸ بیتی تقسیم کند. حالت پیشفرض برای بهینهسازی -O1 از "level=3" و برای بهینهسازیهای بالاتر از "level=23" استفاده میکند. مقادیر معتبر برای level در محدوده 0 ... 23 هستند که یک مقدار در مبنای مختلط (mixed radix) ۳:۲:۲:۲ است. هر رقم جنبهای از بهینهسازی را کنترل میکند.
- -mfuse-move2
- اجرای یک مرحله بهینهسازی پس از ترکیب (post combine) که تلاش میکند دستورالعملهای move را با یکدیگر ادغام کند.
- -mstrict-X
- استفاده از
ثبات آدرس
"X" به
شیوهای که
توسط
سختافزار
پیشنهاد
شده است.
این بدان
معناست که
"X" تنها
در
آدرسدهی
غیرمستقیم،
پسافزایشی
(post-increment) یا
پیشکاهشی
(pre-decrement) استفاده
میشود.
بدون این گزینه، ممکن است از ثبات "X" همانند "Y" یا "Z" استفاده شود که در این صورت با دستورالعملهای اضافی شبیهسازی خواهد شد. بهعنوان مثال، بارگذاری یک مقدار با آدرسدهی "X+const" با مقدار نامنفی کوچک "const < 64" در یک ثبات Rn به صورت زیر انجام میشود:
adiw r26, const ; X += const ld <Rn>, X ; <Rn> = *X sbiw r26, const ; X -= const
- -msplit-bit-shift
- تقسیم شیفتهای چندبایتی با آفست ثابت به یک شیفت با آفست بایتی و یک شیفت باقیمانده با آفست غیربایتی. این بهینهسازی به طور پیشفرض برای -O2 و بالاتر، شامل -Os اما بدون -Oz، فعال است. تقسیم شیفتها با آفست ثابتی که مضربی از ۸ است توسط -mfuse-move کنترل میشود.
- -msplit-ldst
- تقسیم بارگذاریها و ذخیرهسازیهای چندبایتی به چندین بارگذاری و ذخیرهسازی بایتی. این بهینهسازی به طور پیشفرض برای -O2 و بالاتر فعال است.
- -muse-nonzero-bits
- فعالسازی بهینهسازیهایی که تنها زمانی امکانپذیر هستند که برخی بیتها در یک ثبات همیشه صفر باشند. این بهینهسازی به طور پیشفرض برای -O2 و بالاتر فعال است.
"EIND" و دستگاههایی با بیش از ۱۲۸ کیبیبایت حافظه فلش (Flash)
اشارهگرها در این پیادهسازی ۱۶ بیتی هستند. آدرس یک تابع یا برچسب به عنوان آدرس کلمهای (word address) نشان داده میشود تا پرشها و فراخوانیهای غیرمستقیم بتوانند هر آدرس کدی در محدوده ۶۴ کیبیکلمه را هدف قرار دهند.
به منظور تسهیل پرش غیرمستقیم در دستگاههایی با بیش از ۱۲۸ کیبیبایت فضای حافظه برنامه، یک ثبات کارکرد خاص به نام "EIND" وجود دارد که هنگام استفاده از دستورالعملهای "EICALL" یا "EIJMP" به عنوان پرارزشترین بخش آدرس هدف عمل میکند.
پرشها و فراخوانیهای غیرمستقیم در این دستگاهها توسط کامپایلر به شرح زیر مدیریت میشوند و مشمول برخی محدودیتها هستند:
- کامپایلر هرگز "EIND" را مقداردهی نمیکند.
- کامپایلر از "EIND" به صورت ضمنی در دستورالعملهای "EICALL"/"EIJMP" استفاده میکند، یا ممکن است "EIND" را مستقیماً بخواند تا یک فراخوانی/پرش غیرمستقیم را به وسیله یک دستورالعمل "RET" شبیهسازی کند.
- کامپایلر فرض میکند که "EIND" هرگز در طول کد راهاندازی (startup) یا در حین اجرای برنامه تغییر نمیکند. بهویژه، "EIND" در مقدمه/پایانبندی تابع یا روتین سرویس وقفه ذخیره/بازیابی نمیشود.
- برای فراخوانیهای غیرمستقیم به توابع و goto محاسبهشده، پیونددهنده تکهکدهای واسط (stubs) تولید میکند. استابها سکوهای پرشی هستند که گاهی trampolines نیز نامیده میشوند. بنابراین، فراخوانی/پرش غیرمستقیم به چنین استابی میپرد. این استاب شامل یک پرش مستقیم به آدرس مورد نظر است.
- آرامسازی پیونددهنده (Linker relaxation) باید فعال باشد تا پیونددهنده در همه شرایط بتواند استابها را به درستی تولید کند. گزینه کامپایلر -mrelax و گزینه پیونددهنده --relax را ببینید. مواردی استثنایی وجود دارد که پیونددهنده باید استابها را تولید کند اما بدون فعال بودن 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" در اسکریپت پیونددهنده تعریف شده است.
- استابها در صورتی به طور خودکار توسط پیونددهنده تولید میشوند که این دو شرط برقرار باشند:
- -<آدرس یک برچسب با استفاده از اصلاحگر "gs" گرفته شده باشد>
- (مخفف generate stubs)
مانند:
LDI r24, lo8(gs(<func>)) LDI r25, hi8(gs(<func>))
- -<مکان نهایی آن برچسب در یک قطعه کد باشد>
- خارج از قطعهای که استابها در آن قرار دارند.
- *
- کامپایلر در شرایط زیر چنین اصلاحگرهای "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)(); }در عوض، باید یک استاب تنظیم شود، به این معنا که تابع باید از طریق یک نماد ("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" را در اسکریپت پیونددهنده تعریف کرد..PP مدیریت ثباتهای کاربرد خاص "RAMPD"، "RAMPX"، "RAMPY" و "RAMPZ"
برخی از دستگاههای AVR از حافظههایی بزرگتر از محدودهٔ ۶۴ کیبیبایت که با اشارهگرهای ۱۶ بیتی قابل دسترسی هستند پشتیبانی میکنند. برای دسترسی به مکانهای حافظه در خارج از این محدودهٔ ۶۴ کیبیبایتی، از محتوای یک ثبات "RAMP" بهعنوان بخش بالایی آدرس استفاده میشود: ثبات آدرس "X"، "Y" یا "Z" بهترتیب با ثبات کاربرد خاص "RAMPX"، "RAMPY" یا "RAMPZ" الحاق میشود تا یک آدرس عریض حاصل شود. بهطور مشابه، "RAMPD" همراه با آدرسدهی مستقیم بهکار میرود.
- کد راهاندازی (startup)، ثباتهای کاربرد خاص "RAMP" را با صفر مقداردهی اولیه میکند.
- اگر از یک AVR Named Address Spaces,فضای آدرس نامگذاریشده بهجز عمومی یا "__flash" استفاده شود، آنگاه "RAMPZ" پیش از عملیات بر حسب نیاز مقداردهی میشود.
- اگر دستگاه از حافظهٔ RAM بزرگتر از ۶۴ کیبیبایت پشتیبانی کند و کامپایلر برای انجام یک عملیات نیاز به تغییر "RAMPZ" داشته باشد، "RAMPZ" پس از پایان عملیات مجدداً به صفر بازنشانی میشود.
- اگر دستگاه دارای یک ثبات "RAMP" مشخص باشد، بخش مقدمه/خاتمهٔ (prologue/epilogue) روتین 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) نباید از روی دستورالعملهای ۳۲ بیتی پرش انجام دهند. دستورالعملهای پرش عبارتاند از: "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__"
- کامپایلر از صفتهای تابع signal(num) و interrupt(num) در AVR Attributes,,function attributes با آرگومان 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__"
- مشابه موارد بالا، اما به جای "double" برای "long double".
- "__WITH_DOUBLE_COMPARISON__"
- بازتابدهنده گزینه پیکربندی "--with-double-comparison={tristate|bool|libf7}" ("https://gcc.gnu.org/install/configure.html#avr") بوده و به مقدار 2 یا 3 تعریف میشود.
- "__WITH_LIBF7_LIBGCC__"
- "__WITH_LIBF7_MATH__"
- "__WITH_LIBF7_MATH_SYMBOLS__"
- بازتابدهنده گزینه پیکربندی "--with-libf7={libgcc|math|math-symbols}" ("https://gcc.gnu.org/install/configure.html#avr") است.
گزینههای داخلی AVR (AVR Internal Options)
گزینههای زیر به صورت داخلی توسط کامپایلر و برای ارتباط بین فایلهای مشخصات (specs) دستگاه و بدنه اصلی کامپایلر استفاده میشوند. نیازی به تنظیم دستی این گزینهها ندارید؛ بهویژه آنکه آنها گزینههای بهینهسازی نیستند. استفاده نادرست از این گزینهها ممکن است به کدهای نامطلوب یا اشتباه منجر شود. این موارد صرفاً جهت کامل بودن مستندات و برای درک بهتر فایلهای مشخصات دستگاه ("https://gcc.gnu.org/wiki/avr-gcc#spec-files") مستند شدهاند.
- -mn-flash=num
- فرض میکند که حافظه فلش اندازهای برابر با num برابر 64 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" را ترکیب میکنند..PP گزینههای 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 بازبینی تراشه (silicon revision) پردازندهٔ Blackfin هدف را مشخص میکند. تمام راهکارهای رفع اشکال (workaround) موجود برای بازبینی تراشهٔ هدف فعال میشوند. اگر sirevision برابر none باشد، هیچ راهکاری فعال نخواهد شد. اگر sirevision برابر any باشد، تمام راهکارها برای پردازندهٔ هدف فعال میشوند. ماکروی "__SILICON_REVISION__" به صورت دو رقم هگزادسیمال که نشاندهندهٔ شمارههای اصلی و فرعی در بازبینی تراشه هستند تعریف میشود. اگر sirevision برابر none باشد، ماکروی "__SILICON_REVISION__" تعریف نمیشود. اگر sirevision برابر any باشد، "__SILICON_REVISION__" به عنوان 0xffff تعریف میشود. اگر این sirevision اختیاری استفاده نشود، GCC جدیدترین بازبینی تراشهٔ شناختهشده برای پردازندهٔ Blackfin هدف را فرض میکند.
کامپایلر GCC یک ماکروی پیشپردازنده برای cpu مشخصشده تعریف میکند. برای زنجیره ابزار bfin-elf، اگر -msim داده نشده باشد، این گزینه باعث پیوند خوردن BSP سختافزاری ارائهشده توسط libgloss میشود.
بدون این گزینه، بهطور پیشفرض bf532 به عنوان پردازنده استفاده میشود.
توجه داشته باشید که پشتیبانی از bf561 ناقص است. برای bf561، تنها ماکروی پیشپردازنده تعریف میشود.
- -msim
- مشخص میکند که برنامه روی شبیهساز اجرا خواهد شد. این گزینه باعث پیوند خوردن BSP شبیهساز ارائهشده توسط libgloss میشود. این گزینه تنها بر زنجیره ابزار bfin-elf اثرگذار است. برخی گزینههای دیگر مانند -mid-shared-library و -mfdpic بهطور ضمنی -msim را فعال میکنند.
- -momit-leaf-frame-pointer
- اشارهگر قاب (frame pointer) را در توابع برگ (leaf functions) در یک ثبات نگه نمیدارد. این کار از دستورالعملهای ذخیره، برپایی و بازیابی اشارهگرهای قاب جلوگیری کرده و یک ثبات اضافی را در توابع برگ آزاد میسازد.
- -mspecld-anomaly
- -mno-specld-anomaly
- هنگامی که فعال باشد، کامپایلر اطمینان حاصل میکند که کد تولیدشده شامل بارگذاریهای حدسی (speculative loads) پس از دستورهای پرش نباشد. در صورت استفاده از این گزینه، "__WORKAROUND_SPECULATIVE_LOADS" تعریف میشود.
- -mcsync-anomaly
- -mno-csync-anomaly
- هنگامی که فعال باشد، کامپایلر اطمینان حاصل میکند که کد تولیدشده بلافاصله پس از انشعابهای شرطی شامل دستورالعملهای CSYNC یا SSYNC نباشد. در صورت استفاده از این گزینه، "__WORKAROUND_SPECULATIVE_SYNCS" تعریف میشود.
- -mlow64k
- -mno-low64k
- هنگامی که فعال باشد، کامپایلر مختار است از این آگاهی که کل برنامه در 64k پایینی حافظه جا میگیرد بهرهبرداری کند. رفتار پیشفرض این است که فرض شود برنامه میتواند به هر اندازه بزرگ باشد (-mno-low64k).
- -mstack-check-l1
- بررسی پشته (stack checking) را با استفاده از اطلاعات قرار دادهشده در حافظهٔ L1 scratchpad توسط هستهٔ uClinux انجام میدهد.
- -mid-shared-library
- -mno-id-shared-library
- کدی تولید میکند که از کتابخانههای مشترک از طریق روش شناسهٔ کتابخانه (library ID) پشتیبانی میکند. این کار امکان اجرای درجا (execute in place) و استفاده از کتابخانههای مشترک را در محیطهای فاقد مدیریت حافظهٔ مجازی فراهم میسازد. این گزینه بهطور ضمنی شامل -fPIC است. با مقصد bfin-elf، این گزینه بهطور ضمنی -msim را نیز در بر دارد. حالت پیشفرض -mno-id-shared-library است تا کدی تولید کند که فرض نکند از کتابخانههای مشترک مبتنی بر شناسه استفاده میشود.
- -mleaf-id-shared-library
- -mno-leaf-id-shared-library
- کدی تولید
میکند که
از
کتابخانههای
مشترک از
طریق روش
شناسهٔ
کتابخانه
پشتیبانی
میکند،
اما فرض
میکند که
این
کتابخانه
یا فایل
اجرایی به
هیچ
کتابخانه
مشترک
دیگری بر
پایهٔ
شناسه
پیوند
نمیخورد.
این به
کامپایلر
اجازه
میدهد تا
کدهای
سریعتری
برای
پرشها و
فراخوانیها
تولید کند.
حالت پیشفرض -mno-leaf-id-shared-library است که در آن هیچ فرضی مبنی بر عدم پیوند به کتابخانههای مشترک مبتنی بر شناسه وجود ندارد؛ در نتیجه کد کندتری برای دستورالعملهای پرش و فراخوانی تولید میشود.
- شمارهٔ شناسایی کتابخانهٔ مشترک مبتنی بر شناسه را که کامپایل میشود مشخص میکند. مشخص کردن مقدار 0 کد فشردهتری تولید میکند؛ مشخص کردن مقادیر دیگر تخصیص آن شماره به کتابخانهٔ جاری را تحمیل میکند، اما از نظر فضا یا زمان بهینهتر از حذف این گزینه نیست.
- -msep-data
- -mno-sep-data
- کدی تولید میکند که امکان قرارگیری قطعهٔ داده (data segment) در ناحیهای متفاوت از حافظه نسبت به قطعهٔ متن (text segment) را فراهم میآورد. این ویژگی با حذف بازنشانیها (relocations) نسبت به بخش متن، اجرای درجا را در محیطهای فاقد مدیریت حافظهٔ مجازی ممکن میکند. حالت پیشفرض -mno-sep-data است که به GCC میگوید کدی تولید کند که فرض میکند قطعهٔ داده به دنبال قطعهٔ متن قرار دارد.
- -mlong-calls
- -mno-long-calls
- به
کامپایلر
دستور
میدهد
فراخوانیهای
تابع را با
بارگذاری
اولیهٔ
آدرس تابع
در یک ثبات
و سپس انجام
فراخوانی
زیرروال (subroutine call)
روی این
ثبات انجام
دهد. این
گزینه در
صورتی لازم
است که تابع
هدف خارج از
محدودهٔ
آدرسدهی 24
بیتی دستور
فراخوانی
زیرروال
مبتنی بر
آفست قرار
داشته باشد.
این قابلیت بهطور پیشفرض فعال نیست. مشخص کردن -mno-long-calls رفتار پیشفرض را بازیابی میکند. توجه داشته باشید که این گزینهها تاثیری بر نحوهٔ تولید کد کامپایلر جهت مدیریت فراخوانی توابع از طریق اشارهگر تابع ندارند.
- -mfast-fp
- پیوند با کتابخانهٔ ممیز شناور سریع را انجام میدهد. این کتابخانه به منظور بهبود کارایی، برخی از قوانین استاندارد ممیز شناور IEEE را برای بررسی ورودیها در برابر «عدد نیست» (NAN) سهلگیرانهتر اعمال میکند.
- -minline-plt
- درونخطیسازی (inlining) مدخلهای PLT را در فراخوانی توابعی که اتصال محلی (local binding) آنها مشخص نیست فعال میکند. این گزینه بدون -mfdpic هیچ اثری ندارد.
- -mmulticore
- یک برنامهٔ
مستقل برای
پردازندههای
چندهستهای
Blackfin میسازد.
این گزینه
باعث
استفاده از
فایلهای
آغازین (start files) و
اسکریپتهای
پیوند
مناسبِ
چندهستهای
شده و
ماکروی
"__BFIN_MULTICORE" را
تعریف
میکند. این
گزینه فقط
همراه با
-mcpu=bf561[-sirevision]
قابل
استفاده
است.
این گزینه میتواند با -mcorea یا -mcoreb استفاده شود که مدل برنامهنویسی یک-برنامه-بهازای-هر-هسته را انتخاب میکند. بدون -mcorea یا -mcoreb، مدل برنامهنویسی تک-برنامه/دو-هستهای استفاده خواهد شد. در این مدل، تابع اصلی Core B باید با نام "coreb_main" تعریف شود.
اگر از این گزینه استفاده نشود، مدل برنامهنویسی تکهستهای استفاده میشود.
- -mcorea
- هنگام استفاده از مدل برنامهنویسی یک-برنامه-بهازای-هر-هسته، یک برنامهٔ مستقل برای Core A از BF561 میسازد. فایلهای آغازین و اسکریپتهای پیوند مناسب برای پشتیبانی از Core A استفاده شده و ماکروی "__BFIN_COREA" تعریف میشود. این گزینه فقط در کنار -mmulticore قابل استفاده است.
- -mcoreb
- هنگام استفاده از مدل برنامهنویسی یک-برنامه-بهازای-هر-هسته، یک برنامهٔ مستقل برای Core B از BF561 میسازد. فایلهای آغازین و اسکریپتهای پیوند مناسب برای پشتیبانی از Core B استفاده شده و ماکروی "__BFIN_COREB" تعریف میشود. هنگام استفاده از این گزینه، باید به جای "main" از "coreb_main" استفاده شود. این گزینه فقط در کنار -mmulticore قابل استفاده است.
- -msdram
- یک برنامهٔ مستقل برای SDRAM میسازد. فایلهای آغازین و اسکریپتهای پیوند مناسب برای قرار دادن برنامه در SDRAM استفاده شده و ماکروی "__BFIN_SDRAM" تعریف میشود. بارگذار (loader) باید پیش از بارگذاری برنامه، SDRAM را مقداردهی اولیه کند..IP -micplb 4 فرض میکند که ICPLBها در زمان اجرا فعال هستند. این گزینه بر راهحلهای دور زدن برخی ناهنجاریها تأثیر میگذارد. برای مقصدهای لینوکس، پیشفرض این است که فرض شود ICPLBها فعال هستند؛ برای برنامههای مستقل (standalone)، پیشفرض غیرفعال است.
گزینههای C6X
- -march=name
- این گزینه نام معماری مقصد را مشخص میکند. GCC از این نام برای تعیین اینکه چه نوع دستورالعملهایی را هنگام تولید کد اسمبلی میتواند صادر کند، استفاده میکند. نامهای مجاز عبارتند از: c62x، c64x، c64x+، c67x، c67x+، c674x.
- -mbig-endian
- تولید کد برای یک مقصد big-endian.
- -mlittle-endian
- تولید کد برای یک مقصد little-endian. این حالت پیشفرض است.
- -msim
- فایلهای راهاندازی (startup) و اسکریپت پیونددهنده مناسب برای شبیهساز را انتخاب میکند.
- -msdata=default
- دادههای سراسری و ایستای کوچک را در بخش ".neardata" قرار میدهد که توسط ثبات "B14" به آن اشاره میشود. دادههای سراسری و ایستای کوچک مقداردهینشده را در بخش ".bss" که مجاور بخش ".neardata" است قرار میدهد. دادههای فقطخواندنی کوچک را در بخش ".rodata" قرار میدهد. بخشهای متناظر مورد استفاده برای دادههای بزرگ عبارتند از ".fardata"، ".far" و ".const".
- -msdata=all
- تمام دادهها، و نه فقط اشیاء کوچک، را در بخشهای اختصاصیافته برای دادههای کوچک قرار میدهد و از آدرسدهی نسبی به ثبات "B14" برای دسترسی به آنها استفاده میکند.
- -msdata=none
- از بخشهای اختصاصیافته برای دادههای کوچک استفاده نمیکند و از آدرسهای مطلق برای دسترسی به تمام دادهها بهره میگیرد. تمام دادههای سراسری و ایستای مقداردهیشده را در بخش ".fardata" و تمام دادههای مقداردهینشده را در بخش ".far" قرار میدهد. تمام دادههای ثابت را در بخش ".const" قرار میدهد.
- -mdsbt
- برای ABI کتابخانه اشتراکی DSBT کامپایل میکند. این گزینه برای کامپایل با -fpic یا -fPIC الزامی است، و به معنای اعمال -fpic میباشد.
- -mlong-calls
- از تولید فراخوانیهای نسبی به شمارنده برنامه (PC-relative) خودداری میکند؛ در عوض از ارجاع غیرمستقیم استفاده میکند.
گزینههای CRIS
این گزینهها به طور خاص برای پورتهای CRIS تعریف شدهاند.
- -march=architecture-type
- -mcpu=architecture-type
- کد را برای معماری مشخصشده تولید میکند. گزینههای موجود برای architecture-type به ترتیب شامل v3، v8 و v10 برای ETRAX 4، ETRAX 100 و ETRAX 100 LX است. پیشفرض v0 است.
- -mtune=architecture-type
- همه جنبههای قابلتنظیم در کد تولیدشده، به جز ABI و مجموعه دستورالعملهای در دسترس را برای architecture-type بهینهسازی میکند. گزینههای موجود برای architecture-type مشابه -march=architecture-type هستند.
- -mmax-stackframe=n
- هنگامی که فریم پشته (stack frame) یک تابع از n بایت فراتر رود، هشدار میدهد.
- -metrax4
- -metrax100
- گزینههای -metrax4 و -metrax100 به ترتیب نامهای دیگر -march=v3 و -march=v8 هستند.
- -mmul-bug-workaround
- -mno-mul-bug-workaround
- باگ موجود در دستورالعملهای "muls" و "mulu" را برای مدلهای پردازندهای که این مشکل در آنها وجود دارد دور میزند. این گزینه به صورت پیشفرض غیرفعال است.
- -mpdebug
- اطلاعات مفصل مربوط به اشکالزدایی مخصوص CRIS را در کد اسمبلی فعال میکند. این گزینه همچنین اثر خاموش کردن نشانگر کد قالببندیشدهی #NO_APP را در ابتدای فایل اسمبلی برای اسمبلر دارد.
- -mcc-init
- از نتایج کدهای شرط (condition-code) حاصل از دستورالعمل قبلی استفاده نمیکند؛ همیشه پیش از استفاده از کدهای شرط، دستورالعملهای مقایسه و آزمایش را صادر میکند.
- -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، مقدمه و مؤخره عادی تابع که فریم پشته را برپا میکنند حذف میشوند و هیچ دستورالعمل بازگشت یا توالی بازگشتی در کد تولید نمیشود. از این گزینه تنها به همراه بررسی چشمی کد کامپایلشده استفاده کنید: هنگامی که ثباتهای محافظتشده در فراخوانی (call-saved) باید ذخیره شوند یا فضای ذخیرهسازی برای متغیرهای محلی باید تخصیص یابد، هیچ هشدار یا خطایی صادر نمیشود.
- -mbest-lib-options
- -moverride-best-lib-options
- گزینه -mbest-lib-options گزینههایی را انتخاب میکند که بیشترین امکانات ممکن را تحت گزینههای دیگر فعال میکنند. این گزینه حالت no- ندارد، اما گزینه -moverride-best-lib-options آن را صرفنظر از ترتیب نسبی دو گزینه در خط فرمان، غیرفعال میکند.
- -mtrap-using-break8
- تلهها (traps) را به عنوان break 8 صادر میکند. این حالت پیشفرض برای CRIS v3 و بالاتر است. در صورت غیرفعال بودن، فراخوانیهای "abort" به جای آن استفاده میشوند.
- -mtrap-unaligned-atomic
- بررسیهایی صادر میکند که موجب اجرای دستورالعملهای break 8 هنگام اعمال توابع توکار اتمیک بر روی حافظه ناتراز میشوند.
- -munaligned-atomic-may-use-library
- توابع توکار اتمیکی را که ممکن است روی دادههای ناتراز اعمال شوند، از طریق فراخوانی توابع کتابخانهای مدیریت میکند. این گزینه بر -mtrap-unaligned-atomic اولویت دارد.
- -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.
- -mbig-endian
- -mlittle-endian
- کد big- یا little-endian را انتخاب میکند. پیشفرض little-endian است.
- -mfloat-abi=name
- مشخص
میکند که
از کدام ABI
ممیز شناور
استفاده
شود. مقادیر
مجاز
عبارتند از:
soft، softfp و hard.
مشخص کردن soft باعث میشود GCC خروجی حاوی فراخوانیهای کتابخانهای برای عملیات ممیز شناور تولید کند. softfp امکان تولید کد با استفاده از دستورالعملهای سختافزاری ممیز شناور را فراهم میکند، اما همچنان از قراردادهای فراخوانی soft-float استفاده میکند. hard امکان تولید دستورالعملهای ممیز شناور را فراهم کرده و از قراردادهای فراخوانی ویژه FPU استفاده میکند.
پیشفرض به پیکربندی مقصد خاص بستگی دارد. توجه داشته باشید که ABIهای hard-float و soft-float از نظر پیوند سازگار نیستند؛ شما باید تمام برنامه خود را با همان ABI کامپایل کرده و با مجموعهای سازگار از کتابخانهها پیوند دهید.
- -mdouble-float
- -mno-double-float
- هنگامی که -mhard-float فعال است، تولید دستورالعملهای ممیز شناور با دقت مضاعف (double-precision) را فعال میکند. این حالت به جز هنگام کامپایل برای CK803، پیشفرض است.
- -mfdivdu
- -mno-fdivdu
- هنگامی که -mhard-float فعال است، تولید دستورالعملهای "frecipd"، "fsqrtd" و "fdivd" را فعال میکند. این حالت به جز هنگام کامپایل برای CK803، پیشفرض است.
- -mfpu=fpu
- پردازنده ممیز شناور را انتخاب میکند. این گزینه تنها همراه با -mhard-float قابل استفاده است. مقادیر مجاز برای fpu عبارتند از: fpv2_sf (معادل با -mno-double-float -mno-fdivdu)، fpv2 (-mdouble-float -mno-divdu)، و fpv2_divd (-mdouble-float -mdivdu).
- -melrw
- -mno-elrw
- دستورالعمل گسترشیافته "lrw" را فعال میکند. این گزینه برای CK801 بهطور پیشفرض روشن و در غیر این صورت خاموش است.
- -mistack
- -mno-istack
- دستورالعملهای
پشته وقفه
را فعال
میکند؛
پیشفرض
خاموش است.
گزینه -mistack برای پردازش ویژگیهای تابع "interrupt" و "isr" مورد نیاز است.
- -mmp
- -mno-mp
- دستورالعملهای چندپردازندهای را فعال میکند؛ پیشفرض خاموش است.
- -mcp
- -mno-cp
- دستورالعملهای کمکپردازنده را فعال میکند؛ پیشفرض خاموش است.
- -mcache
- -mno-cache
- دستورالعملهای کمکپردازنده را فعال میکند؛ پیشفرض خاموش است.
- -msecurity
- -mno-security
- دستورالعملهای امنیتی C-SKY را فعال میکند؛ پیشفرض خاموش است.
- -mtrust
- -mno-trust
- دستورالعملهای اعتماد C-SKY را فعال میکند؛ پیشفرض خاموش است.
- -mdsp
- -mno-dsp
- -medsp
- -mno-edsp
- -mvdsp
- -mno-vdsp
- به ترتیب دستورالعملهای C-SKY DSP، Enhanced DSP یا Vector DSP را فعال میکند. پیشفرض همه این گزینهها خاموش است.
- -mdiv
- -mno-div
- دستورالعملهای تقسیم را تولید میکند. پیشفرض خاموش است.
- -msmart
- -mno-smart
- کد را برای Smart Mode تولید میکند، که فقط از ثباتهای شمارهگذاریشده 0-7 استفاده میکند تا امکان استفاده از دستورالعملهای 16-بیتی فراهم شود. این گزینه برای CK801 که این رفتار در آن الزامی است نادیده گرفته میشود، و برای CK802 بهطور پیشفرض روشن است. برای سایر مقاصد، پیشفرض خاموش است.
- -mhigh-registers
- -mno-high-registers
- با استفاده از ثباتهای بالا با شمارههای 16-31 کد تولید میکند. این گزینه در CK801، CK802، یا CK803 پشتیبانی نمیشود، و بهطور پیشفرض برای سایر پردازندهها فعال است.
- -manchor
- -mno-anchor
- با استفاده از نشانیهای نماد لنگر سراسری کد تولید میکند.
- -mpushpop
- تولید کد با استفاده از دستورالعملهای "push" و "pop". این گزینه بهطور پیشفرض فعال است.
- -mmultiple-stld
- -mno-multiple-stld
- تولید کد با استفاده از دستورالعملهای "stm" و "ldm". این گزینه در CK801 پشتیبانی نمیشود، اما بهطور پیشفرض روی سایر پردازندهها فعال است.
- -mconstpool
- -mno-constpool
- ایجاد استخرهای مقادیر ثابت (constant pools) در کامپایلر به جای موکول کردن آن به اسملبر. این گزینه پیشفرض است و برای تولید کد صحیح روی CK801 و CK802 الزامی میباشد، و در سایر پردازندهها اختیاری است.
- -mstack-size
- -mno-stack-size
- درج دستورالعملهای هدایتی ".stack_size" برای هر تابع در خروجی اسمبلی. این گزینه بهطور پیشفرض غیرفعال است.
- -mccrt
- -mno-ccrt
- تولید کد برای زماناجرای کامپایلر C-SKY به جای libgcc. این گزینه بهطور پیشفرض غیرفعال است.
- -mbranch-cost=n
- تنظیم هزینهٔ انشعاب به تقریباً "n" دستورالعمل. مقدار پیشفرض ۱ است.
- -msched-prolog
- -mno-sched-prolog
- اجازه به زمانبندی دنبالههای پیشدرآمد (prologue) و پسدرآمد (epilogue) تابع. استفاده از این گزینه میتواند منجر به کدی شود که با نیازمندیهای prologue در C-SKY V2 ABI سازگار نبوده و قابل اشکالزدایی یا ردیابی به عقب (backtrace) نباشد. این گزینه بهطور پیشفرض غیرفعال است.
- -msim
- -mno-sim
- پیوند با کتابخانه libsemi.a که با شبیهساز سازگار است. فقط برای کامپایلر ELF قابل اعمال است.
گزینههای Cygwin و MinGW
این گزینههای اضافی برای مقصدهای Microsoft Windows در دسترس هستند:
- -mconsole
- این گزینه مشخص میکند که یک برنامه کنسولی تولید شود؛ با دستور دادن به پیونددهنده برای تنظیم نوع زیرسیستم سرآیند PE مورد نیاز برای برنامههای کنسولی. این گزینه برای مقصدهای Cygwin و MinGW در دسترس بوده و بهطور پیشفرض روی این مقصدها فعال است.
- -mcrtdll=library
- پیشپردازش، کامپایل یا پیوند با کتابخانه DLL زماناجرای C مشخصشده (library). این گزینه ماکروهای از پیش تعریفشدهٔ "__CRTDLL__"، "__MSVCRT__"، "_UCRT" و "__MSVCRT_VERSION__" را برای CRT library مشخصشده تنظیم میکند، فایل راهانداز را برای CRT library انتخاب کرده و با CRT library پیوند میدهد. نامهای شناختهشدهٔ کتابخانه CRT برای پیشپردازنده عبارتند از: "crtdll*"، "msvcrt10*"، "msvcrt20*"، "msvcrt40*"، "msvcr40*"، "msvcrtd*"، "msvcrt-os*"، "msvcr70*"، "msvcr71*"، "msvcr80*"، "msvcr90*"، "msvcr100*"، "msvcr110*"، "msvcr120*" و "ucrt*". اگر این گزینه مشخص نشود، کتابخانه وارداتی پیشفرض MinGW با نام "msvcrt" برای پیوند استفاده میشود و هیچ تنظیم دیگری برای پیشپردازنده انجام نخواهد شد. کتابخانه وارداتی MinGW با نام "msvcrt" صرفاً یک پیوند نمادین به (یا کپی از) یک کتابخانه وارداتی CRT MinGW دیگر است که هنگام کامپایل MinGW انتخاب شده است. کتابخانه وارداتی MinGW با نام "msvcrt-os" برای کتابخانه DLL زماناجرای CRT سیستم ویندوز "msvcrt.dll" است و در بیشتر موارد، کتابخانه وارداتی پیشفرض MinGW به شمار میرود. بهطور کلی، تغییر دادن CRT DLL نیازمند کامپایل مجدد تمام MinGW CRT است. این گزینه صرفاً برای مقاصد آزمایشی و تجربی است. این گزینه برای مقصدهای MinGW در دسترس است.
- -mdll
- این گزینه برای مقصدهای Cygwin و MinGW در دسترس است. این گزینه مشخص میکند که یک DLL---یک کتابخانه پیوند پویا (dynamic link library)---تولید شود، و انتخاب آبجکت راهاندازی و نقطه ورود زماناجرای مورد نیاز را امکانپذیر میسازد.
- -mnop-fun-dllimport
- این گزینه برای مقصدهای Cygwin و MinGW در دسترس است. این گزینه مشخص میکند که صفت "dllimport" نادیده گرفته شود.
- -mthreads
- پشتیبانی از مدیریت استثنای امن در برابر نخها (thread-safe) در MinGW. برنامههایی که به مدیریت استثنای thread-safe متکی هستند باید تمام کد را با گزینهٔ -mthreads کامپایل و پیوند کنند. هنگام کامپایل، -mthreads ماکروی -D_MT را تعریف میکند؛ هنگام پیوند، یک کتابخانه کمکی ویژه برای نخها به نام -lmingwthrd را پیوند میدهد که دادههای مدیریت استثنا به ازای هر نخ را پاکسازی میکند.
- -municode
- این گزینه برای مقصدهای MinGW-w64 در دسترس است. این گزینه موجب میشود ماکروی پیشپردازنده "UNICODE" از پیش تعریف گردد، و کد راهاندازی زماناجرای دارای قابلیت یونیکد انتخاب شود.
- -mwin32
- این گزینه برای مقصدهای Cygwin و MinGW در دسترس است. این گزینه مشخص میکند که ماکروهای از پیش تعریفشده معمول Microsoft Windows در پیشپردازنده تنظیم شوند، اما تاثیری بر انتخاب کتابخانه زماناجرا/کد راهاندازی ندارد.
- -mwindows
- این گزینه برای مقصدهای Cygwin و MinGW در دسترس است. این گزینه مشخص میکند که با دستور دادن به پیونددهنده برای تنظیم مناسب نوع زیرسیستم سرآیند PE، یک برنامه با واسط کاربری گرافیکی (GUI) تولید شود.
- -fno-set-stack-executable
- این گزینه برای مقصدهای MinGW در دسترس است. مشخص میکند که پرچم قابل اجرا بودن برای پشتهٔ مورد استفاده توسط توابع تو در تو (nested functions) تنظیم نشود. این مورد برای باینریهایی که در حالت هسته (kernel mode) سیستمعامل Microsoft Windows اجرا میشوند ضروری است، چرا که در آنجا User32 API که برای تنظیم مجوزهای اجرایی به کار میرود، در دسترس نیست.
- -fwritable-relocated-rdata
- این گزینه برای مقصدهای MinGW و Cygwin در دسترس است. مشخص میکند که دادههای بازآراییشده در بخش فقطخواندنی، در بخش ".data" قرار گیرند. این مورد برای زمانهای اجرای قدیمیتری که از تغییر بخشهای ".rdata" برای شبهبازآرایی (pseudo-relocation) پشتیبانی نمیکنند، ضروری است.
- -mpe-aligned-commons
- این گزینه برای مقصدهای Cygwin و MinGW در دسترس است. مشخص میکند که پسوند GNU برای قالب فایل PE که امکان ترازسازی صحیح متغیرهای COMMON را فراهم میکند، هنگام تولید کد استفاده شود. اگر GCC تشخیص دهد که اسملبر مقصد یافتشده در طول پیکربندی از این قابلیت پشتیبانی میکند، این گزینه بهطور پیشفرض فعال است.
- -muse-libstdc-wrappers
- استفاده از پوششهای (wrappers) DLL در Cygwin برای پشتیبانی از عملگرهای "new" و "delete" در C++.
همچنین برای گزینههای استاندارد، بخش گزینههای x86 را ببینید.
گزینههای Darwin
این گزینهها برای همه معماریهایی که سیستمعامل Darwin را اجرا میکنند، تعریف شدهاند.
کامپایلر FSF GCC در Darwin فایلهای شیء چندمعماری («fat») ایجاد نمیکند؛ این کامپایلر یک فایل شیء برای تکمعماریای که GCC برای هدف قرار دادن آن ساخته شده است، میسازد. کامپایلر GCC شرکت Apple در Darwin در صورت استفاده از چندین گزینهٔ -arch فایلهای «fat» ایجاد میکند؛ این کار را با چند بار اجرا کردن کامپایلر یا پیونددهنده و پیوست کردن نتایج به یکدیگر با استفاده از lipo انجام میدهد.
زیرنوع فایل ایجادشده (مانند ppc7400 یا ppc970 یا i686) توسط پرچمهایی تعیین میشود که ISA هدف GCC را مشخص میکنند، مانند -mcpu یا -march. از گزینهٔ -force_cpusubtype_ALL میتوان برای بازنویسی و لغو این رفتار استفاده کرد.
ابزارهای Darwin هنگام مواجهه با عدم تطابق ISA، رفتارهای متفاوتی نشان میدهند. اسملبر، as، تنها اجازه استفاده از دستورالعملهایی را میدهد که برای زیرنوعِ فایلی که در حال تولید آن است معتبر باشند، بنابراین نمیتوانید دستورالعملهای ۶۴ بیتی را در یک فایل شیء ppc750 قرار دهید. پیونددهنده برای کتابخانههای اشتراکی، /usr/bin/libtool، در صورتی که خواسته شود کتابخانهای اشتراکی با زیرنوعی با محدودیت کمتر نسبت به فایلهای ورودیاش بسازد، شکست میخورد و خطا چاپ میکند (به عنوان مثال، تلاش برای قرار دادن یک فایل شیء ppc970 در یک کتابخانهٔ ppc7400). پیونددهنده برای برنامههای اجرایی، ld، بدون ایجاد هشدار، محدودکنندهترین زیرنوع را از میان تمام فایلهای ورودیاش به برنامه اجرایی اختصاص میدهد..IP -Fdir 4 دایرکتوری چارچوب (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 معتبر است.
- -arch name
- تولید خروجی برای معماری name. همانطور که در بالا توضیح داده شد، GCC خروجی را برای معماریای تولید میکند که برای آن پیکربندی شده است، و از گزینههای معمول خود برای انتخاب گونههای زیرمعماری بهره میگیرد. گزینهٔ -arch برای سازگاری پذیرفته میشود، اما اگر name با تعریف خود GCC از معماری مقصد ناسازگار باشد، خطایی تشخیص داده میشود.
- -dependency-file filename
- نام مستعاری برای گزینهٔ پیشپردازندهٔ -MF filename.
- -fapple-kext
- تولید کد برای افزونههای بارگذاریپذیر هسته (kext) در Darwin.
- -gused
- تولید اطلاعات اشکالزدایی برای نمادهایی که استفاده شدهاند. برای قالب اشکالزدایی stabs، این گزینه -feliminate-unused-debug-symbols را فعال میکند. این گزینه بهطور پیشفرض روشن (ON) است.
- -gfull
- تولید اطلاعات اشکالزدایی برای تمامی نمادها و انواع (types).
- -matt-stubs
- -mno-att-stubs
- فعالسازی stubهای PIC به سبک AT&T. این حالت در صورت پشتیبانی توسط معماری مقصد، پیشفرض است (در حال حاضر تنها x86).
- -mconstant-cfstrings
- -fconstant-cfstrings
- هنگامی که
زماناجرای
NeXT استفاده
میشود
(پیشفرض در
این
سیستمها)،
هرگونه
تنظیمات
-fconstant-string-class را
نادیده
میگیرد و
سبب میشود
لیترالهای
"@"...""
بهصورت
رشتههای
ثابت CoreFoundation
چیدمان
شوند.
گزینهٔ -fconstant-cfstrings نام مستعاری برای -mconstant-cfstrings است.
- -mdynamic-no-pic
- تولید کد مناسب برای فایلهای اجرایی (نه کتابخانههای اشتراکی). این گزینه با -fpic، -fPIC، -fpie یا -fPIE ناسازگار است.
- -mfix-and-continue
- -ffix-and-continue
- -findirect-data
- تولید کد مناسب برای توسعه با چرخهٔ بازخورد سریع، مانند امکان بارگذاری پویای فایلهای .o توسط GDB در برنامههای در حال اجرا. گزینههای -findirect-data و -ffix-and-continue جهت سازگاری با گذشته ارائه شدهاند.
- -mkernel
- فعالسازی حالت توسعهٔ هسته. گزینهٔ -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 تنظیم میکند.
- -mmacosx-version-min=version
- -asm_macosx_version_min=version
- گزینهٔ
-mmacosx-version-min مشخص
میکند که
قدیمیترین
نسخهٔ MacOS X که
این فایل
اجرایی بر
روی آن اجرا
خواهد شد،
version است.
مقادیر
معمول
پشتیبانیشده
برای version
شامل 12،
10.12 و 10.5.8
است.
اگر کامپایلر طوری ساخته شده باشد که بهطور پیشفرض از سرآیندهای سیستم استفاده کند، پیشفرض این گزینه همان نسخهٔ سیستمی است که کامپایلر روی آن اجرا میشود؛ در غیر این صورت، پیشفرض اتخاذ انتخابهایی است که با بیشترین تعداد سیستمها و پایگاههای کد ممکن سازگار باشند.
گزینهٔ -asm_macosx_version_min=version مشابه است، اما راهانداز GCC اطلاعات version آن را تنها به اسمبلر ارسال میکند.
- -mone-byte-bool
- پیشفرضهای
نوع "bool"
را
بازنویسی
میکند تا
"sizeof(bool)==1"
شود. بهطور
پیشفرض
مقدار
sizeof(bool)
هنگام
کامپایل
برای Darwin/PowerPC
برابر با
4 و
هنگام
کامپایل
برای Darwin/x86
برابر با
1 است،
بنابراین
این گزینه
هیچ تأثیری
روی x86 ندارد.
هشدار: سوئیچ -mone-byte-bool سبب میشود GCC کدی تولید کند که با کد تولیدشده بدون این سوئیچ سازگاری باینری (binary compatible) ندارد. استفاده از این سوئیچ ممکن است نیازمند کامپایل مجدد تمام ماژولهای دیگر یک برنامه، از جمله کتابخانههای سیستمی باشد. از این سوئیچ برای مطابقت با یک مدل دادهای غیرپیشفرض استفاده کنید.
- -msymbol-stubs
- -mno-symbol-stubs
- اجبار به تولید stubهای ارجاع غیرمستقیم به نمادهای خارجی برای مراجع PIC. بهطور پیشفرض، اگر نسخهٔ پیونددهندهٔ مقصد (-mtarget-linker) به اندازهٔ کافی برای الزام آنها قدیمی باشد، این گزینه بهطور خودکار فعال میشود.
- -mtarget-linker=version
- -mtarget-linker version
- نسخهٔ پیونددهندهٔ ld64 مقصد را تعیین کرده و هر نسخهٔ تعیینشده در پیکربندی GCC را نادیده میگیرد. نسخههای جدیدتر پیونددهنده در برخی موارد، برای نمونه برای کد PIC، از تولید کد بهبودیافته پشتیبانی میکنند.
- -ObjC
- معادل -x objective-c؛ مشخص میکند که ورودی، کد منبع Objective-C است.
- -ObjC++
- معادل -x objective-c++؛ مشخص میکند که ورودی، کد منبع Objective-C++ است.
- -Wnonportable-cfstrings
- -Wno-nonportable-cfstrings
- هشدار در صورتی که اشیاء رشتهای ثابت CoreFoundation شامل نویسههای غیرقابلحمل (non-portable) باشند. این هشدار بهطور پیشفرض فعال است.
- -all_load
- تمام اعضای کتابخانههای آرشیو ایستا را بارگذاری میکند. برای اطلاعات بیشتر به ld(1) مراجعه کنید.
- -arch_errors_fatal
- سبب میشود خطاهای مربوط به فایلهایی که معماری نادرست دارند، مهلک (fatal) تلقی شوند.
- -bind_at_load
- سبب میشود فایل خروجی بهگونهای نشانهگذاری شود که پیونددهندهٔ پویا تمام مراجع تعریفنشده را هنگام بارگذاری یا اجرای فایل متصل (bind) کند.
- -bundle
- یک فایل در قالب بستهبندی (bundle) با فرمت Mach-o تولید میکند. برای اطلاعات بیشتر به ld(1) مراجعه کنید..IP "-bundle_loader executable" 4 این گزینه executable (فایل اجرایی) را مشخص میکند که فایل خروجی ساختِ در حال پیوند را بارگذاری خواهد کرد. برای اطلاعات بیشتر صفحه راهنمای ld(1) را ببینید.
- -dynamiclib
- هنگامی که این گزینه داده شود، GCC هنگام پیوند، با استفاده از دستور libtool در Darwin، به جای یک فایل اجرایی، یک کتابخانه پویا تولید میکند.
- -force_cpusubtype_ALL
- این گزینه باعث میشود که فایل خروجی GCC زیرنوع ALL را داشته باشد، به جای زیرنوعی که توسط گزینه -mcpu یا -march تعیین میشود.
- -nodefaultrpaths
- مسیرهای اجرای (run paths) پیشفرض برای دایرکتوریهای کتابخانه کامپایلر را به فایلهای اجرایی، ماژولها یا کتابخانههای پویا اضافه نکن. در macOS 10.5 و جدیدتر، runpath تعبیهشده بهطور پیشفرض اضافه میشود مگر اینکه کاربر -nodefaultrpaths را به خط پیوند اضافه کند. مسیرهای اجرا برای ساخت روی macOS نسخه 10.11 یا جدیدتر مورد نیاز هستند (و بنابراین الزامی شدهاند).
- -nodefaultexport
- برونریزیهای پیشفرض نمادها را به ماژولها یا کتابخانههای پویا اضافه نکن.
- -allowable_client client_name
- -client_name
- -compatibility_version
- -current_version
- -dead_strip
- -dylib_file
- -dylinker
- -dylinker_install_name
- -dynamic
- -exported_symbols_list
- -filelist
- -flat_namespace
- -force_flat_namespace
- -framework
- -headerpad_max_install_names
- -image_base
- -init symbol-name
- -install_name
- -keep_private_externs
- -pagezero_size
- -preload
- -read_only_relocs
- -sectalign
- -sectcreate
- -seg_addr_table
- -seg1addr
- -segaddr
- -segprot
- -segs_read_only_addr
- -segs_read_write_addr
- -sub_library
- -sub_umbrella
- -twolevel_namespace
- -twolevel_namespace_hints
- -umbrella
- -undefined
- -unexported_symbols_list
- -weak_framework
- -weak_reference_mismatches
- -whatsloaded
- -whyload
- این گزینهها به پیونددهنده Darwin فرستاده میشوند. صفحه راهنمای پیونددهنده Darwin آنها را با جزئیات شرح میدهد.
گزینههای DEC Alpha
این گزینههای -m برای پیادهسازیهای DEC Alpha تعریف شدهاند:
- -mno-soft-float
- -msoft-float
- از
دستورالعملهای
سختافزاری
ممیز شناور
برای
عملیاتهای
ممیز شناور
استفاده کن
(استفاده
نکن).
هنگامی که
-msoft-float مشخص
شود، از
توابع
موجود در libgcc.a
برای انجام
عملیاتهای
ممیز شناور
استفاده
میشود. مگر
اینکه
آنها با
روتینهایی
که عملیات
ممیز شناور
را
شبیهسازی
میکنند
جایگزین
شوند، یا به
گونهای
کامپایل
شوند که
چنین
روتینهای
شبیهسازی
را
فراخوانی
کنند، این
روتینها
دستورالعملهای
ممیز شناور
صادر
میکنند.
اگر برای یک
Alpha بدون
عملیاتهای
ممیز شناور
کامپایل
میکنید،
باید مطمئن
شوید که
کتابخانه
طوری ساخته
شده باشد که
آنها را
فراخوانی
نکند.
توجه داشته باشید که پیادهسازیهای Alpha بدون عملیات ممیز شناور نیز ملزم به داشتن ثباتهای ممیز شناور هستند.
- -mfp-regs
- -mno-fp-regs
- تولید کدی
که از
مجموعه
ثباتهای
ممیز شناور
استفاده
میکند
(استفاده
نمیکند).
گزینه -mno-fp-regs
به طور ضمنی
-msoft-float را نیز
در بر دارد.
اگر از
مجموعه
ثباتهای
ممیز شناور
استفاده
نشود،
عملوندهای
ممیز شناور
همانند
اعداد صحیح
در
ثباتهای
عدد صحیح
منتقل
میشوند و
نتایج ممیز
شناور به
جای $f0 در
$0
بازگردانده
میشوند.
این یک
توالی
فراخوانی
غیراستاندارد
است،
بنابراین
هر تابعی با
آرگومان یا
مقدار
بازگشتی
ممیز شناور
که توسط کدی
کامپایلشده
با -mno-fp-regs
فراخوانی
شود، باید
خودش نیز با
این گزینه
کامپایل
شده باشد.
یک کاربرد متداول این گزینه، ساخت کرنلی است که از هیچ ثبات ممیز شناوری استفاده نمیکند و بنابراین نیازی به ذخیره و بازیابی آنها ندارد.
- -mieee
- معماری Alpha سختافزار ممیز شناوری را پیادهسازی میکند که برای بیشترین کارایی بهینهسازی شده است. این معماری تا حد زیادی با استاندارد ممیز شناور IEEE سازگار است. با این حال، برای سازگاری کامل، به دستیار نرمافزاری نیاز دارد. این گزینه کدی کاملاً سازگار با IEEE تولید میکند، بهجز اینکه inexact-flag نگهداری نمیشود (در ادامه را ببینید). اگر این گزینه فعال شود، ماکروی پیشپردازنده "_IEEE_FP" در حین کامپایل تعریف میگردد. کد حاصل کارایی کمتری دارد، اما میتواند بهدرستی از اعداد غیرنرمال (denormalized numbers) و مقادیر استثنایی IEEE مانند «ناعدد» (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
- این گزینه تعیین میکند که چه تلههای (traps) مربوط به ممیز شناور فعال باشند. کامپایلرهای دیگر Alpha این گزینه را -fptm trap-mode مینامند. حالت تله را میتوان روی یکی از چهار مقدار تنظیم کرد:
- n
- این تنظیم پیشفرض (عادی) است. تنها تلههایی فعال هستند که نمیتوان آنها را در نرمافزار غیرفعال کرد (برای نمونه، تله تقسیم بر صفر)..IP u 4 علاوه بر تلههای فعالشده با n، تلههای زیرریز (underflow) نیز فعال میشوند.
- su
- مانند u، اما دستورالعملها به عنوان امن برای تکمیل نرمافزاری علامتگذاری میشوند (برای جزئیات به راهنمای معماری Alpha مراجعه کنید).
- sui
- مانند su، اما تلههای نادقیق (inexact traps) نیز فعال میشوند.
- -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 در مقدمه تابع در فایل اسمبلی تولیدشده است.
- -mbuild-constants
- بهطور
معمول GCC یک
ثابت عدد
صحیح ۳۲
بیتی یا ۶۴
بیتی را
بررسی
میکند تا
ببیند آیا
میتواند
آن را در دو
یا سه
دستورالعمل
از
ثابتهای
کوچکتر
بسازد یا
خیر. اگر
نتواند،
ثابت را به
عنوان یک
لیترال در
خروجی قرار
میدهد و
کدی تولید
میکند تا
آن را در
زمان اجرا
از بخش داده
بارگذاری
کند.
از این گزینه استفاده کنید تا GCC ملزم شود تمام ثابتهای عدد صحیح را با استفاده از کد بسازد، حتی اگر به دستورالعملهای بیشتری نیاز داشته باشد (حداکثر شش مورد).
معمولاً از این گزینه برای ساخت یک بارگذار پویای کتابخانه اشتراکی استفاده میکنید. از آنجا که این بارگذار خود یک کتابخانه اشتراکی است، باید پیش از اینکه بتواند متغیرها و ثابتها را در بخش داده خود پیدا کند، خود را در حافظه بازنشانی (relocate) کند.
- -mbwx
- -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 باید کدی امن در برابر چندنخی و سیگنال ناهمگام برای دسترسیهای حافظه بایت و کلمه (word) تراز شده تولید کند یا خیر.
- -msafe-partial
- -mno-safe-partial
- مشخص میکند که آیا GCC باید کدی امن در برابر چندنخی و سیگنال ناهمگام برای دسترسیهای جزئی حافظه تولید کند یا خیر؛ از جمله دسترسیهای خرد به دادههای ناتراز و همچنین دسترسیهای بلوکی به بخشهای ابتدایی و انتهایی انواع تجمیعی (aggregate types) یا سایر اشیایی در حافظه که به ترتیب در یک مرز داده ۶۴ بیتی تراز شده شروع یا پایان نمییابند.
- -mfloat-vax
- -mfloat-ieee
- تولید کدی که به جای دقت یگانه و دوگانه IEEE، از محاسبات ممیز شناور VAX F و G استفاده میکند (یا استفاده نمیکند).
- -mexplicit-relocs
- -mno-explicit-relocs
- اسمبلرهای قدیمیتر Alpha راهی برای تولید بازنشانیهای نماد به جز از طریق ماکروهای اسمبلر ارائه نمیکردند. استفاده از این ماکروها اجازه زمانبندی بهینه دستورالعملها را نمیدهد. بسته GNU Binutils از نسخه 2.12 از یک نحو جدید پشتیبانی میکند که به کامپایلر اجازه میدهد بهطور صریح مشخص کند کدام بازنشانیها باید بر روی کدام دستورالعملها اعمال شوند. این گزینه بیشتر برای اشکالزدایی مفید است، زیرا GCC هنگام ساخت، قابلیتهای اسمبلر را شناسایی کرده و پیشفرض را بر همان اساس تنظیم میکند.
- -msmall-data
- -mlarge-data
- هنگامی که
-mexplicit-relocs فعال
باشد،
دادههای
ایستا از
طریق
بازنشانیهای
نسبی به gp (gp-relative)
قابل
دسترسی
هستند. وقتی
از -msmall-data
استفاده
میشود،
اشیایی به
طول ۸ بایت
یا کوچکتر
در یک
«ناحیه
داده کوچک»
(بخشهای
".sdata" و
".sbss")
قرار
میگیرند و
از طریق
بازنشانیهای
۱۶ بیتی از
ثبات $gp
مورد
دسترسی
قرار
میگیرند.
این امر
اندازه
ناحیه داده
کوچک را به 64KB
محدود
میکند،
اما به
متغیرها
اجازه
میدهد
مستقیماً
از طریق یک
دستورالعمل
واحد قابل
دسترسی
باشند.
پیشفرض -mlarge-data است. با این گزینه ناحیه داده به کمی کمتر از 2GB محدود میشود. برنامههایی که به بیش از 2GB داده نیاز دارند باید از "malloc" یا "mmap" برای تخصیص داده در هیپ (heap) به جای بخش داده برنامه استفاده کنند.
هنگام تولید کد برای کتابخانههای اشتراکی، -fpic متضمن -msmall-data و -fPIC متضمن -mlarge-data است.
- -msmall-text
- -mlarge-text
- وقتی -msmall-text
استفاده
میشود،
کامپایلر
فرض میکند
که کد کل
برنامه (یا
کتابخانه
اشتراکی) در
4MB جا
میگیرد و
بنابراین
با یک
دستورالعمل
پرش (branch) قابل
دسترسی است.
هنگامی که
-msmall-data
استفاده
میشود،
کامپایلر
میتواند
فرض کند که
همه
نمادهای
محلی مقدار
$gp
یکسانی
دارند و
بنابراین
تعداد
دستورالعملهای
مورد نیاز
برای
فراخوانی
یک تابع را
از ۴ به ۱
کاهش دهد.
پیشفرض -mlarge-text است..IP -mcpu=cpu_type 4 مجموعه دستورالعمل و پارامترهای زمانبندی دستورالعمل را برای نوع ماشین cpu_type تنظیم میکند. میتوانید نام سبک EV یا شماره تراشه متناظر آن را مشخص کنید. کامپایلر GCC از پارامترهای زمانبندی برای خانواده پردازندههای EV4، EV5 و EV6 پشتیبانی کرده و مقادیر پیشفرض مجموعه دستورالعمل را بر اساس پردازنده مشخصشده انتخاب مینماید. اگر نوع پردازنده را مشخص نکنید، پیشفرض GCC پردازندهای خواهد بود که کامپایلر روی آن ساخته شده است.
مقادیر پشتیبانیشده برای cpu_type عبارتند از:
- ev4
- ev45
- 21064
- زمانبندی مطابق با EV4 انجام میشود و هیچ افزونه مجموعه دستورالعملی ندارد.
- ev5
- 21164
- زمانبندی مطابق با EV5 انجام میشود و هیچ افزونه مجموعه دستورالعملی ندارد.
- ev56
- 21164a
- زمانبندی مطابق با EV5 انجام میشود و از افزونه BWX پشتیبانی میکند.
- pca56
- 21164pc
- 21164PC
- زمانبندی مطابق با EV5 انجام میشود و از افزونههای BWX و MAX پشتیبانی میکند.
- ev6
- 21264
- زمانبندی مطابق با EV6 انجام میشود و از افزونههای BWX، FIX و MAX پشتیبانی میکند.
- ev67
- 21264a
- زمانبندی مطابق با EV6 انجام میشود و از افزونههای BWX، CIX، FIX و MAX پشتیبانی میکند.
زنجیرهابزارهای بومی (Native toolchains) همچنین از مقدار native پشتیبانی میکنند که بهترین گزینه معماری را برای پردازنده میزبان انتخاب میکند. در صورتی که GCC پردازنده را شناسایی نکند، -mcpu=native هیچ اثری نخواهد داشت.
- -mtune=cpu_type
- فقط
پارامترهای
زمانبندی
دستورالعمل
را برای نوع
ماشین cpu_type
تنظیم
میکند.
مجموعه
دستورالعمل
تغییر
نمیکند.
زنجیرهابزارهای بومی همچنین از مقدار native پشتیبانی میکنند که بهترین گزینه معماری را برای پردازنده میزبان انتخاب میکند. در صورتی که GCC پردازنده را شناسایی نکند، -mtune=native هیچ اثری نخواهد داشت.
- -mmemory-latency=time
- میزان
تأخیر (latency)
فرضی برای
زمانبند
را در
مراجعات
حافظه
معمول
آنطور که
توسط
برنامه
دیده
میشود
تعیین
میکند. این
مقدار به
شدت به
الگوهای
دسترسی به
حافظه مورد
استفاده
برنامه و
اندازه
حافظه نهان
(کش) خارجی
ماشین
وابسته است.
گزینههای معتبر برای time عبارتند از:
- number
- یک عدد دهدهی نمایانگر چرخههای کلاک (clock cycles).
- L1
- L2
- L3
- main
- کامپایلر شامل تخمینهایی از تعداد چرخههای کلاک برای سختافزار «معمول» EV4 و EV5 برای حافظههای نهان سطح ۱، ۲ و ۳ (که Dcache، Scache و Bcache نیز نامیده میشوند) و همچنین حافظه اصلی است. توجه داشته باشید که L3 فقط برای EV5 معتبر است.
- -mtls-kernel
- برای اشارهگر ریسه، بهجای "rduniq"، دستور "rdval" را صادر میکند.
- -mtls-size=bitsize
- اندازه بیتی آفستهای بیواسطه (immediate) در TLS را مشخص میکند. مقادیر معتبر برای bitsize برابر 16، 32 و 64 است؛ پیشفرض 32 میباشد.
- -mlong-double-128
- -mlong-double-64
- اندازه نوع "long double" را مشخص میکند. توجه داشته باشید که -mlong-double-128 با ممیز شناور VAX ناسازگار است.
گزینههای eBPF (eBPF Options)
- -mframe-limit=bytes
- حد سختگیرانه (hard limit) را برای اندازه فریمها، به بایت، تعیین میکند. در حال حاضر مقداری که میتوان مشخص کرد باید کوچکتر یا مساوی با 32767 باشد. پیشفرض آن هر محدودیتی است که نسخه هدف هسته لینوکس اعمال میکند.
- -mbig-endian
- تولید کد برای یک هدف big-endian (بزرگبایتی).
- -mlittle-endian
- تولید کد برای یک هدف little-endian (کوچکبایتی). این حالت پیشفرض است.
- -mjmpext
- -mno-jmpext
- فعال یا غیرفعال کردن تولید دستورالعملهای اضافه پرش شرطی (conditional-branch). برای CPU v2 و بالاتر فعال است.
- -mjmp32
- -mno-jmp32
- فعال یا غیرفعال کردن تولید دستورالعملهای پرش ۳۲ بیتی. برای CPU v3 و بالاتر فعال است.
- -malu32
- -mno-alu32
- فعال یا غیرفعال کردن تولید دستورالعملهای ۳۲ بیتی ALU. برای CPU v3 و بالاتر فعال است.
- -mv3-atomics
- -mno-v3-atomics
- فعال یا غیرفعال کردن دستورالعملهای عملیات اتمیک عمومی معرفیشده در CPU v3. برای CPU v3 و بالاتر فعال است.
- -mbswap
- -mno-bswap
- فعال یا غیرفعال کردن دستورالعملهای تعویض بایت (byte swap). برای CPU v4 و بالاتر فعال است.
- -msdiv
- -mno-sdiv
- فعال یا غیرفعال کردن دستورالعملهای تقسیم علامتدار و باقیمانده (modulus). برای CPU v4 و بالاتر فعال است..IP -msmov 4
- -mno-smov
- فعال یا غیرفعال کردن دستورالعملهای انتقال (move) و بارگذاری از حافظه با بسط علامت (sign-extending). برای CPU نسخهٔ v4 و بالاتر فعال است.
- -mcpu=version
- این گزینه
مشخص
میکند
کدام نسخه
از ISA متعلق
به eBPF هدف
قرار گیرد.
ممکن است
نسخههای
جدیدتر
توسط همهٔ
هستهها
پشتیبانی
نشوند.
مقدار
پیشفرض v4
است.
مقادیر پشتیبانیشده برای version عبارتند از:
- v1
- نخستین ISA پایدار eBPF بدون قابلیتها یا افزونههای ویژه.
- v2
- پشتیبانی از افزونههای پرش، همانند -mjmpext.
- v3
- تمام ویژگیهای v2، بهعلاوهٔ:
- -<عملیاتهای پرش ۳۲ بیتی، مانند -mjmp32>
- -<عملیاتهای ALU ۳۲ بیتی، مانند -malu32>
- -<عملیاتهای اتمی عمومی، مانند -mv3-atomics>
- v4
- تمام ویژگیهای v3، بهعلاوهٔ:
- -<دستورالعملهای تعویض بایت، مانند -mbswap>
- -<دستورالعملهای تقسیم و باقیماندهٔ علامتدار، مانند -msdiv>
- -<دستورالعملهای انتقال و بارگذاری از حافظه با بسط علامت، مانند -msmov>
- -mco-re
- -mno-co-re
- فعال یا غیرفعال کردن پشتیبانی از «یکبار کامپایل - همهجا اجرا» در BPF (اصطلاحاً CO-RE). پشتیبانی از BPF CO-RE هنگام تولید اطلاعات اشکالزدایی BTF برای هدف BPF (-gbtf) بهطور پیشفرض فعال است.
- -mxbpf
- تولید کد برای یک نسخهٔ گسترشیافته از BPF، که برخی از محدودیتهای اعمالشده توسط معماری BPF را کاهش میدهد:
- -<ذخیره و بازیابی ثباتهای callee-saved بهترتیب در ورود و>
- خروج از تابع.
- -masm=dialect
- خروجی دادن
دستورالعملهای
اسمبلی با
استفاده از
dialect (لهجهٔ)
انتخابشده
برای eBPF.
پیشفرض pseudoc
است.
مقادیر پشتیبانیشده برای dialect عبارتند از:
- -minline-memops-threshold=bytes
- آستانهٔ اندازهای را به بایت مشخص میکند که memmove، memcpy و memset در آن یا کمتر از آن باید همواره بهصورت درونخطی (inline) گسترش یابند. عملیاتی که با اندازههای بزرگتر از این آستانه سروکار دارند باید بهجای گسترش درونخطی با استفاده از فراخوانی کتابخانهای پیادهسازی شوند، اما از آنجا که BPF اجازهٔ فراخوانیهای کتابخانهای (libcalls) را نمیدهد، فراتر رفتن از این آستانه منجر به خطای زمان کامپایل میشود. پیشفرض 1024 بایت است.
- -Wco-re
- فعال کردن هشدارها برای سناریوهایی که در آنها -mco-re فعال است، اما ممکن است تولید کد سازگار با CO-RE امکانپذیر نباشد.
گزینههای FR30
این گزینهها بهطور خاص برای پورت FR30 تعریف شدهاند.
- -msmall-model
- استفاده از مدل فضای آدرس کوچک. این گزینه میتواند کد کوچکتری تولید کند، اما فرض را بر این میگذارد که تمام مقادیر نمادین و آدرسها در یک محدودهٔ ۲۰ بیتی جای میگیرند.
- -mno-lsim
- فرض میکند که پشتیبانی زمان اجرا فراهم شده است و نیازی به گنجاندن کتابخانهٔ شبیهساز (libsim.a) در خط فرمان پیونددهنده نیست.
گزینههای FRV
- -mgpr-32
- تنها استفاده از ۳۲ ثبات اول همهمنظوره (general-purpose).
- -mgpr-64
- استفاده از تمام ۶۴ ثبات همهمنظوره.
- -mfpr-32
- تنها استفاده از ۳۲ ثبات اول ممیز شناور (floating-point).
- -mfpr-64
- استفاده از تمام ۶۴ ثبات ممیز شناور.
- -mhard-float
- استفاده از دستورالعملهای سختافزاری برای عملیات ممیز شناور.
- -msoft-float
- استفاده از روالهای کتابخانهای برای عملیات ممیز شناور.
- -malloc-cc
- تخصیص پویای ثباتهای کد وضعیت (condition code).
- -mfixed-cc
- تلاش نکردن برای تخصیص پویای ثباتهای کد وضعیت، فقط استفاده از "icc0" و "fcc0".
- -mdword
- -mno-dword
- کنترل اینکه آیا ABI از دستورالعملهای کلمهٔ دوگانه (double-word) استفاده کند یا خیر.
- -mdouble
- -mno-double
- فعال یا غیرفعال کردن استفاده از دستورالعملهای ممیز شناور با دقت مضاعف (double).
- -mmedia
- -mno-media
- فعال یا غیرفعال کردن استفاده از دستورالعملهای رسانهای (media).
- -mmuladd
- -mno-muladd
- فعال یا غیرفعال کردن استفاده از دستورالعملهای ضرب و جمع/تفریق.
- -mfdpic
- انتخاب FDPIC ABI، که از توصیفکنندههای تابع برای نمایش اشارهگرها به توابع استفاده میکند. بدون هرگونه گزینهٔ مربوط به PIC/PIE، متضمن -fPIE است. با -fpic یا -fpie، فرض میکند که مدخلهای GOT و دادههای کوچک در محدودهٔ ۱۲ بیتی از آدرس پایهٔ GOT قرار دارند؛ با -fPIC یا -fPIE، آفستهای GOT بهصورت ۳۲ بیتی محاسبه میشوند. با هدف bfin-elf، این گزینه متضمن -msim است..IP -minline-plt 4 فعالسازی درونخطیسازی (inlining) مدخلهای PLT در فراخوانی توابعی که مشخص نیست بهصورت محلی مقید (bind) میشوند یا خیر. این گزینه بدون -mfdpic هیچ اثری ندارد. در صورت بهینهسازی برای سرعت و کامپایل برای کتابخانههای اشتراکی (یعنی -fPIC یا -fpic)، یا هنگامی که گزینهٔ بهینهسازی مانند -O3 یا بالاتر در خط فرمان مشخص شده باشد، بهطور پیشفرض فعال است.
- -mTLS
- هنگام تولید کد thread-local، یک بخش (segment) بزرگ TLS را فرض میکند.
- -mtls
- هنگام تولید کد thread-local، بخش (segment) بزرگ TLS را فرض نمیکند.
- -mgprel-ro
- فعالسازی استفاده از بازنشانیهای (relocations) "GPREL" در FDPIC ABI برای دادههایی که مشخص است در بخشهای فقطخواندنی (read-only) قرار دارند. این گزینه بهطور پیشفرض فعال است، بهجز در موارد -fpic یا -fpie: اگرچه ممکن است به کوچکتر شدن جدول آفست سراسری (GOT) کمک کند، اما ۱ دستورالعمل را با ۴ دستورالعمل معاوضه میکند. در -fPIC یا -fPIE، ۳ دستورالعمل را با ۴ دستورالعمل معاوضه میکند که یکی از آنها میتواند بین چند نماد به اشتراک گذاشته شود، و همچنین از نیاز به یک مدخل GOT برای نماد ارجاعشده جلوگیری میکند، بنابراین احتمال بهبود کارایی در آن بیشتر است. در غیر این صورت، میتوان از -mno-gprel-ro برای غیرفعال کردن آن استفاده کرد.
- -multilib-library-pic
- پیوند دادن با کتابخانههای pic (مربوط به کتابخانه، نه FD). این گزینه بهطور ضمنی توسط -mlibrary-pic و همچنین توسط -fPIC و -fpic بدون -mfdpic اعمال میشود. هرگز نباید نیاز به استفادهٔ صریح از آن داشته باشید.
- -mlinked-fp
- پیروی از الزام EABI مبنی بر ایجاد همیشگی یک اشارهگر فریم (frame pointer) در زمان تخصیص یک فریم پشته (stack frame). این گزینه بهطور پیشفرض فعال است و میتواند با -mno-linked-fp غیرفعال شود.
- -mlong-calls
- استفاده از آدرسدهی غیرمستقیم برای فراخوانی توابع خارج از واحد کامپایل (compilation unit) فعلی. این امکان را فراهم میکند که توابع در هر کجای فضای آدرسدهی ۳۲-بیتی قرار گیرند.
- -malign-labels
- تلاش برای تراز کردن برچسبها روی یک مرز ۸-بایتی با درج NOPها در بستهٔ (packet) قبلی. این گزینه تنها زمانی مؤثر است که بستهبندی VLIW فعال باشد. این گزینه بستههای جدیدی ایجاد نمیکند؛ تنها NOPها را به بستههای موجود اضافه میکند.
- -mlibrary-pic
- تولید کد EABI مستقل از موقعیت (position-independent).
- -macc-4
- تنها از چهار ثبات اول انباشتگر چندرسانهای (media accumulator) استفاده میکند.
- -macc-8
- از هر هشت ثبات انباشتگر چندرسانهای (media accumulator) استفاده میکند.
- -mpack
- -mno-pack
- فعال یا غیرفعال کردن بستهبندی دستورالعملهای VLIW.
- -mno-eflags
- نشانهگذاری نکردن سوئیچهای ABI در e_flags.
- -mcond-move
- -mno-cond-move
- فعال یا
غیرفعال
کردن
استفاده از
دستورالعملهای
انتقال
شرطی (conditional-move)؛
این گزینه
بهطور
پیشفرض
فعال است.
این گزینه عمدتاً برای اشکالزدایی کامپایلر است و احتمالاً در نگارشهای آینده حذف خواهد شد.
- -mscc
- -mno-scc
- فعال یا
غیرفعال
کردن
استفاده از
دستورالعملهای
مقداردهی
شرطی (conditional set)؛
این گزینه
بهطور
پیشفرض
فعال است.
این گزینه عمدتاً برای اشکالزدایی کامپایلر است و احتمالاً در نگارشهای آینده حذف خواهد شد.
- -mcond-exec
- -mno-cond-exec
- فعال یا
غیرفعال
کردن
استفاده از
اجرای
شرطی؛ این
گزینه
بهطور
پیشفرض
فعال است.
این گزینه عمدتاً برای اشکالزدایی کامپایلر است و احتمالاً در نگارشهای آینده حذف خواهد شد.
- -mvliw-branch
- -mno-vliw-branch
- فعال یا
غیرفعال
کردن یک گام
بهینهسازی
برای
بستهبندی
پرشها (branches)
در
دستورالعملهای
VLIW؛ این
گزینه
بهطور
پیشفرض
فعال است.
این گزینه عمدتاً برای اشکالزدایی کامپایلر است و احتمالاً در نگارشهای آینده حذف خواهد شد.
- -mmulti-cond-exec
- -mno-multi-cond-exec
- فعال یا
غیرفعال
کردن
بهینهسازی
"&&" و
"||" در
اجرای
شرطی؛ این
گزینه
بهطور
پیشفرض
فعال است.
این گزینه عمدتاً برای اشکالزدایی کامپایلر است و احتمالاً در نگارشهای آینده حذف خواهد شد.
- -mnested-cond-exec
- -mno-nested-cond-exec
- فعال یا
غیرفعال
کردن
بهینهسازیهای
اجرای شرطی
تودرتو؛
این گزینه
بهطور
پیشفرض
فعال است.
این گزینه عمدتاً برای اشکالزدایی کامپایلر است و احتمالاً در نگارشهای آینده حذف خواهد شد.
- -moptimize-membar
- -mno-optimize-membar
- این گزینه دستورالعملهای اضافهٔ "membar" را از کد تولیدشده توسط کامپایلر حذف میکند. این گزینه بهطور پیشفرض فعال است.
- -mtomcat-stats
- باعث میشود gas آمار tomcat را چاپ کند.
- -mcpu=cpu
- انتخاب نوع پردازندهای که کد برای آن تولید میشود. مقادیر ممکن عبارتند از: frv، fr550، tomcat، fr500، fr450، fr405، fr400، fr300 و simple.
گزینههای FT32
این گزینهها بهطور خاص برای پورت FT32 تعریف شدهاند.
- -msim
- مشخص میکند که برنامه روی شبیهساز اجرا خواهد شد. این امر باعث میشود که یک راهانداز (startup) و کتابخانهٔ زمان اجرای جایگزین پیوند داده شوند. نباید از این گزینه هنگام تولید برنامههایی که قرار است روی سختافزار واقعی اجرا شوند استفاده کنید؛ شما باید کتابخانهٔ زمان اجرای خود را برای هرگونه توابع I/O که نیاز است فراهم کنید.
- -mnodiv
- از دستورالعملهای div و mod استفاده نمیکند.
- -mft32b
- فعالسازی استفاده از دستورالعملهای گسترشیافتهٔ پردازندهٔ FT32B.
- -mcompress
- فشردهسازی تمام کدها با استفاده از طرح فشردهسازی کد Ft32B.
- -mnopm
- کدی که حافظهٔ برنامه (program memory) را بخواند تولید نمیکند.
گزینههای GNU/Linux
این گزینههای -m برای مقصدهای GNU/Linux تعریف شدهاند:
- -mglibc
- استفاده از کتابخانهٔ GNU C. این گزینه پیشفرض است، مگر در مقصدهای *-*-linux-*uclibc*، *-*-linux-*musl* و *-*-linux-*android*..IP -muclibc 4 استفاده از کتابخانهٔ سی uClibc. این رفتار پیشفرض روی هدفهای *-*-linux-*uclibc* است.
- -mmusl
- استفاده از کتابخانهٔ سی musl. این رفتار پیشفرض روی هدفهای *-*-linux-*musl* است.
- -mbionic
- استفاده از کتابخانهٔ سی Bionic. این رفتار پیشفرض روی هدفهای *-*-linux-*android* است.
- -mandroid
- -mno-android
- کامپایل
کدی سازگار
با بستر Android.
این رفتار
پیشفرض
روی
هدفهای
*-*-linux-*android* است.
هنگام کامپایل، این گزینه بهطور پیشفرض -mbionic، -fPIC، -fno-exceptions و -fno-rtti را فعال میکند. هنگام پیوند دادن، این گزینه باعث میشود راهانداز GCC گزینههای مخصوص Android را به پیونددهنده ارسال کند. در نهایت، این گزینه باعث میشود ماکروی پیشپردازندهٔ "__ANDROID__" تعریف شود.
این گزینه را میتوان بهطور کامل با -mno-android غیرفعال کرد.
- -tno-android-cc
- غیرفعال کردن اثرات کامپایلیِ -mandroid؛ یعنی گزینههای -mbionic، -fPIC، -fno-exceptions و -fno-rtti بهطور پیشفرض فعال نشوند.
- -tno-android-ld
- غیرفعال کردن اثرات پیوندزدنِ -mandroid؛ یعنی ارسال گزینههای پیوند استاندارد لینوکس به پیونددهنده.
گزینههای H8/300
این گزینههای -m برای پیادهسازیهای H8/300 تعریف شدهاند:
- -mrelax
- کوتاه کردن برخی از ارجاعات آدرس در زمان پیوند در صورت امکان؛ از گزینهٔ پیونددهندهٔ -relax استفاده میکند.
- -mh
- تولید کد برای H8/300H.
- -ms
- تولید کد برای H8S.
- -mn
- تولید کد برای H8S و H8/300H در حالت عادی. این سوییچ باید همراه با -mh یا -ms استفاده شود.
- -msx
- تولید کد H8SX.
- -ms2600
- تولید کد برای H8S/2600. این سوییچ باید همراه با -ms استفاده شود.
- -mquickcall
- استفاده از ثباتها برای ارسال آرگومانها.
- -mslowbyte
- کند در نظر گرفتن دسترسی به حافظه در مقیاس بایت.
- -mexr
- -mno-exr
- ذخیره کردن ثباتهای گسترشیافته روی پشته، پیش از اجرای توابعی که دارای صفت "monitor" هستند. پیشفرض -mexr است. این گزینه تنها برای هدفهای 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
- -mno-atomic-libcalls
- تولید
فراخوانیهای
کتابخانهای
(libcalls) برای
بارگذاریها
و
ذخیرهسازیهای
اتمیک در
صورت
غیرفعال
بودن
فراخوانیهای
کتابخانهای
sync. این گزینه
بهطور
پیشفرض
فعال است.
این گزینه
فقط بر
تولید
فراخوانیهای
کتابخانهای
اتمیک توسط
بخش پشتی HPPA
اثر
میگذارد.
هر دو پیادهسازیِ فراخوانیهای کتابخانهای sync و libatomic از قفلگذاری استفاده میکنند. در نتیجه، ذخیرهسازیهای پردازنده نسبت به سایر عملیات اتمیک، اتمیک نیستند. بارگذاریهای پردازنده تا اندازهٔ DImode نسبت به دیگر عملیات اتمیک بهشرطی اتمیک هستند که در قالب یک دسترسی یکتا پیادهسازی شده باشند.
معماری PA-RISC به جز دستورالعمل "ldcw"، در سختافزار از هیچ عملیات اتمیکی پشتیبانی نمیکند. بنابراین، تمام پشتیبانی اتمیک با استفاده از فراخوانیهای کتابخانهای sync و atomic پیادهسازی میشود. پشتیبانی فراخوانیهای کتابخانهای sync در libgcc.a موجود است. پشتیبانی فراخوانیهای کتابخانهای اتمیک در libatomic قرار دارد.
این گزینه برای ذخیرهسازیهای اتمیک فراخوانیهای "__atomic_exchange" تولید میکند. همچنین مدیریت ویژهای برای دسترسیهای اتمیک DImode روی هدفهای ۳۲ بیتی فراهم میسازد.
- -mcaller-copies
- فراخواننده آرگومانهای تابعی را که با ارجاع پنهان ارسال شدهاند رونوشت میکند. این گزینه باید با احتیاط استفاده شود چرا که با زماناجرای ۳۲ بیتی پیشفرض سازگار نیست. با این حال، تنها دادههای تجمعی (aggregates) بزرگتر از هشت بایت با ارجاع پنهان ارسال میشوند و این گزینه سازگاری بهتری با OpenMP فراهم میکند.
- -mcoherent-ldcw
- استفاده از اشارهگر کنترل حافظهٔ نهان همگام (coherent cache-control hint) برای ldcw/ldcd.
- -mdisable-fpregs
- غیرفعال کردن ثباتهای ممیز شناور. معادل با -msoft-float.
- -mdisable-indexing
- جلوگیری از استفادهٔ کامپایلر از حالتهای آدرسدهی اندیسدار. این کار از برخی مشکلات نسبتاً مبهم هنگام کامپایل کدهای تولیدشده توسط MIG تحت MACH جلوگیری میکند.
- -mfast-indirect-calls
- تولید کدی
که فرض
میکند
فراخوانیها
هرگز از
مرزهای
فضایی عبور
نمیکنند.
این کار به GCC
اجازه
میدهد کدی
تولید کند
که
فراخوانیهای
غیرمستقیم
سریعتری
انجام دهد.
این گزینه در حضور کتابخانههای اشتراکی یا توابع تودرتو کار نمیکند.
- -mfixed-range=register-range
- تولید کدی که با بازهٔ ثباتهای دادهشده مانند ثباتهای ثابت برخورد میکند. ثبات ثابت ثباتی است که تخصیصدهندهٔ ثبات نمیتواند از آن استفاده کند. این گزینه هنگام کامپایل کد هسته مفید است. بازهٔ ثبات بهصورت دو ثبات که با یک خط تیره جدا شدهاند مشخص میشود. میتوان چندین بازهٔ ثبات را با ویرگول جدا کرده و تعیین کرد.
- -mgas
- فعالسازی استفاده از دستورالعملهای اسمبلری که فقط GAS آنها را متوجه میشود.
- -mgnu-ld
- استفاده از گزینههای مخصوص GNU ld. این کار هنگام ساخت یک کتابخانهٔ اشتراکی، -shared را به ld ارسال میکند. این رفتار پیشفرض هنگامی است که GCC بهصورت صریح یا ضمنی با پیونددهندهٔ GNU پیکربندی شده باشد. این گزینه تأثیری در این که کدام ld فراخوانی شود ندارد؛ فقط پارامترهای ارسالی به آن ld را تغییر میدهد. پیونددهندهٔ ld فراخوانیشده توسط گزینهٔ پیکربندی --with-ld، مسیر جستجوی برنامهٔ GCC و در نهایت متغیر PATH کاربر تعیین میگردد. پیونددهندهٔ مورداستفادهٔ GCC را میتوان با استفاده از which `gcc -print-prog-name=ld` چاپ کرد. این گزینه تنها در GCC نگارش ۶۴ بیتی HP-UX، یعنی پیکربندیشده با hppa*64*-*-hpux*، در دسترس است..IP -mhp-ld 4 استفاده از گزینههای مخصوص ld در HP. این گزینه هنگام ساخت یک کتابخانهٔ اشتراکی، -b را به ld و در تمام پیوندها +Accept TypeMismatch را به ld ارسال میکند. این رفتار پیشفرض است زمانی که GCC، به طور صریح یا ضمنی، با پیونددهندهٔ HP پیکربندی شده باشد. این گزینه بر اینکه کدام ld فراخوانی شود اثر نمیگذارد؛ فقط پارامترهایی را که به آن 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
- تولید کدی
که از
توالیهای
فراخوانی
طولانی
استفاده
میکند. این
امر
اطمینان
میدهد که
یک
فراخوانی
همواره
قادر است به
stubهای
تولیدشده
توسط
پیونددهنده
دسترسی
داشته باشد.
پیشفرض
این است که
فراخوانیهای
طولانی
تنها
هنگامی
تولید شوند
که فاصلهٔ
محل
فراخوانی
تا آغاز
تابع یا
واحد ترجمه
(بسته به
مورد)، از
محدودهٔ از
پیشتعیینشده
توسط نوع
انشعابِ
مورد
استفاده
فراتر رود.
این
محدودیتها
برای
فراخوانیهای
عادی به
ترتیب برای
معماریهای
PA 2.0 و PA 1.X برابر
با
۷٬۶۰۰٬۰۰۰
و ۲۴۰٬۰۰۰
بایت است.
فراخوانیهای
همسطح (sibling calls)
همواره به
۲۴۰٬۰۰۰
بایت محدود
هستند.
فاصلهها هنگام استفاده از گزینهٔ -ffunction-sections، یا هنگام استفادهٔ همزمان از گزینههای -mgas و -mno-portable-runtime تحت HP-UX همراه با پیونددهندهٔ SOM از ابتدای توابع اندازهگیری میشوند.
معمولاً استفاده از این گزینه مطلوب نیست زیرا کارایی را کاهش میدهد. با این حال، ممکن است در برنامههای بزرگ، بهویژه زمانی که از پیوند جزئی (partial linking) برای ساخت برنامه استفاده میشود، مفید باشد.
انواع فراخوانیهای طولانی استفادهشده به قابلیتهای اسمبلر و پیونددهنده و نوع کدی که تولید میشود بستگی دارد. تأثیر آن روی سیستمهایی که از فراخوانیهای مطلق طولانی و فراخوانیهای نسبی به PC یا مبتنی بر تفاضل نمادِ PIC طولانی پشتیبانی میکنند، باید نسبتاً اندک باشد. اما در سیستمهای ۳۲-بیتی ELF در کد PIC از یک فراخوانی غیرمستقیم استفاده میشود که بسیار طولانی است.
- -mlong-load-store
- تولید توالیهای بارگذاری و ذخیرهٔ ۳-دستوری، آنگونه که گاهی توسط پیونددهندهٔ HP-UX 10 مورد نیاز است. این گزینه معادل با گزینهٔ +k در کامپایلرهای HP است.
- -mno-space-regs
- تولید کدی
که فرض
میکند هدف
فاقد
ثباتهای
فضایی (space registers)
است. این به GCC
اجازه
میدهد تا
فراخوانیهای
غیرمستقیم
سریعتری
تولید کرده
و از
حالتهای
آدرسدهی
اندیسی
مقیاسبندینشده
(unscaled index address modes)
استفاده
کند.
چنین کدی برای سیستمهای PA سطح ۰ و هستهها مناسب است.
- -mordered
- فرض میکند که ارجاعات حافظه مرتب هستند و نیازی به حائلها (barriers) نیست.
- -mportable-runtime
- استفاده از قراردادهای فراخوانی سازگار (portable) پیشنهادشده توسط HP برای سیستمهای ELF.
- -mschedule=cpu-type
- زمانبندی کد بر اساس محدودیتهای نوع ماشین cpu-type. گزینههای انتخابی برای cpu-type عبارتند از 700، 7100، 7100LC، 7200، 7300 و 8000. برای تعیین گزینهٔ زمانبندی مناسب برای ماشین خود، در سامانهٔ HP-UX به /usr/lib/sched.models مراجعه کنید. زمانبندی پیشفرض 8000 است.
- -msio
- -mwsio
- گزینهٔ -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 و
نسخههای
پس از آن در
دسترس است.
مقادیر
پیشفرض
برای HP-UX 10.00
برابر 93،
برای HP-UX 10.10 تا 11.00
برابر 95، و
برای HP-UX 11.11 و پس
از آن برابر
98 است.
گزینهٔ -munix=93 همان پیشتعریفهای GCC 3.3 و 3.4 را فراهم میکند. گزینهٔ -munix=95 پیشتعریفهای اضافی برای "XOPEN_UNIX" و "_XOPEN_SOURCE_EXTENDED"، و فایل آغازین unix95.o را فراهم میآورد. گزینهٔ -munix=98 پیشتعریفهای اضافی برای "_XOPEN_UNIX"، "_XOPEN_SOURCE_EXTENDED"، "_INCLUDE__STDC_A1_SOURCE" و "_INCLUDE_XOPEN_SOURCE_500"، و فایل آغازین unix98.o را فراهم میکند.
بسیار مهم است که توجه داشته باشید این گزینه رابطهای توابع کتابخانهای گوناگون را دگرگون میکند. همچنین بر رفتار عملیاتی کتابخانهٔ C تأثیر میگذارد. از این رو، در استفاده از این گزینه به احتیاط فوقالعادهای نیاز است.
کد کتابخانهای که قرار است با بیش از یک استاندارد UNIX کار کند، باید متغیر "__xpg4_extended_mask" را حسب مورد بررسی، مقداردهی و بازیابی نماید. بیشتر نرمافزارهای GNU این قابلیت را ارائه نمیدهند.
- -nolibdld
- جلوگیری از تولید گزینههای پیوند برای جستجوی libdld.sl هنگامی که گزینهٔ -static در HP-UX 10 و بالاتر مشخص شده است.
- -static
- پیادهسازی
کتابخانهٔ C
در HP-UX برای
تابع
"setlocale" به
libdld.sl وابستگی
دارد. هیچ
نسخهٔ
آرشیوی از
libdld.sl وجود
ندارد.
بنابراین
زمانی که
گزینهٔ -static
مشخص
میشود،
برای رفع
این
وابستگی به
گزینههای
پیوند خاصی
نیاز است.
در HP-UX 10 و پس از آن، هنگام تعیین گزینهٔ -static، گردانندهٔ GCC گزینههای لازم برای پیوند با libdld.sl را اضافه میکند. این موضوع باعث میشود دودویی حاصل، پویا باشد. در پورت ۶۴-بیتی، پیونددهندهها در هر صورت به طور پیشفرض دودوییهای پویا تولید میکنند. از گزینهٔ -nolibdld میتوان برای جلوگیری از افزودن این گزینههای پیوند توسط گردانندهٔ GCC استفاده کرد.
- -threads
- افزودن پشتیبانی از چندریسمانی با کتابخانهٔ dce thread تحت HP-UX. این گزینه پرچمها را برای هر دو بخش پیشپردازنده و پیونددهنده تنظیم میکند.
گزینههای IA-64
اینها گزینههای -m هستند که برای معماری Intel IA-64 تعریف شدهاند.
- -mbig-endian
- تولید کد برای یک هدف با ترتیب بایت بزرگتر اول (big-endian). این حالت برای HP-UX پیشفرض است.
- -mlittle-endian
- تولید کد برای یک هدف با ترتیب بایت کوچکتر اول (little-endian). این حالت برای AIX5 و GNU/Linux پیشفرض است.
- -mgnu-as
- -mno-gnu-as
- تولید (یا عدم تولید) کد برای اسمبلر GNU. این حالت پیشفرض است.
- -mgnu-ld
- -mno-gnu-ld
- تولید (یا عدم تولید) کد برای پیونددهندهٔ GNU. این حالت پیشفرض است.
- -mno-pic
- تولید کدی که از ثبات اشارهگر سراسری (global pointer register) استفاده نمیکند. حاصل، کد ناوابسته به موقعیت نیست و از ABI معماری IA-64 تخطی میکند.
- -mvolatile-asm-stop
- -mno-volatile-asm-stop
- تولید کردن (یا نکردن) یک بیت توقف (stop bit) بلافاصله پیش و پس از عبارتهای volatile asm.
- -mregister-names
- -mno-register-names
- تولید کردن (یا نکردن) نامهای ثبات in، loc و out برای ثباتهای پشتهای (stacked registers). این کار ممکن است خروجی اسمبلر را خواناتر کند.
- -mno-sdata
- -msdata
- غیرفعالسازی (یا فعالسازی) بهینهسازیهایی که از بخش دادههای کوچک (small data section) استفاده میکنند. این کار ممکن است برای دور زدن اشکالات بهینهساز مفید باشد.
- -mconstant-gp
- تولید کدی که از یک مقدار ثابت منفرد برای اشارهگر سراسری (global pointer) استفاده میکند. این گزینه هنگام کامپایل کردن کد هسته مفید است.
- -mauto-pic
- تولید کدی که خودجابهجاپذیر (self-relocatable) باشد. این گزینه مستلزم -mconstant-gp است. این مورد هنگام کامپایل کردن کد سفتافزار (firmware) کاربرد دارد.
- -minline-float-divide-min-latency
- تولید کد برای تقسیمهای درونخطی (inline) مقادیر ممیز شناور با استفاده از الگوریتم کمینه تأخیر (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" تولید نشود.
- -mno-dwarf2-asm
- -mdwarf2-asm
- کد اسمبلی برای اطلاعات اشکالزدایی شماره خطِ DWARF تولید نشود (یا بشود). این گزینه ممکن است هنگام استفاده نکردن از اسمبلر گنو (GNU assembler) مفید باشد.
- -mearly-stop-bits
- -mno-early-stop-bits
- اجازه دادن به قرارگیری بیتهای توقف زودتر از موقعیت بلافاصله پیش از دستوری که بیت توقف را فعال کرده است. این کار میتواند زمانبندی دستورالعملها را بهبود بخشد، اما همواره اینگونه نیست.
- -mfixed-range=register-range
- تولید کدی که محدودهٔ ثبات دادهشده را به عنوان ثباتهای ثابت در نظر بگیرد. ثبات ثابت ثباتی است که تخصیصدهندهٔ ثبات (register allocator) نمیتواند از آن استفاده کند. این گزینه هنگام کامپایل کردن کد هسته مفید است. یک محدودهٔ ثبات بهصورت دو ثبات که با یک خط تیره از هم جدا شدهاند مشخص میشود. چندین محدودهٔ ثبات را میتوان بهصورت جداشده با کاما تعیین کرد.
- -mtls-size=tls-size
- اندازهٔ بیتی آفستهای بیواسطهٔ (immediate) TLS را مشخص میکند. مقادیر معتبر عبارتند از 14، 22 و 64.
- -mtune=cpu-type
- میزانسازی زمانبندی دستورالعملها برای یک CPU خاص. مقادیر معتبر عبارتند از itanium، itanium1، merced، itanium2 و mckinley.
- -milp32
- -mlp64
- تولید کد برای یک محیط ۳۲-بیتی یا ۶۴-بیتی. محیط ۳۲-بیتی مقادیر int، long و pointer را روی ۳۲ بیت تنظیم میکند. محیط ۶۴-بیتی int را روی ۳۲ بیت و long و pointer را روی ۶۴ بیت تنظیم میکند. اینها پرچمهای مختص HP-UX هستند.
- -mno-sched-br-data-spec
- -msched-br-data-spec
- (غیرفعال/فعال) کردن زمانبندی گمانهزن داده (data speculative scheduling) پیش از 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
- (غیرفعال/فعال) کردن زمانبندی گمانهزن کنترل (control speculative scheduling). این قابلیت تنها در طول زمانبندی ناحیه (یعنی پیش از reload) در دسترس است. این امر منجر به تولید دستورهای "ld.s" و دستورهای بررسی متناظر "chk.s" میشود. تنظیم پیشفرض غیرفعال است.
- -msched-br-in-data-spec
- -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-count-spec-in-critical-path
- -msched-count-spec-in-critical-path
- در صورت فعال بودن، وابستگیهای گمانهزنی در حین محاسبهٔ اولویتهای دستورالعملها لحاظ میشوند. این کار استفاده از گمانهزنی را کمی محافظهکارانهتر میکند. تنظیم پیشفرض غیرفعال است.
- -msched-spec-ldc
- -mno-sched-spec-ldc
- استفاده از بررسی گمانهزنی دادهٔ ساده. این گزینه بهطور پیشفرض فعال است..IP -msched-control-spec-ldc 4
- -mno-sched-control-spec-ldc
- استفاده از یک بررسی ساده برای حدسزنی کنترلی (control speculation). این گزینه بهطور پیشفرض فعال است.
- -msched-stop-bits-after-every-cycle
- -mno-sched-stop-bits-after-every-cycle
- قرار دادن یک بیت توقف پس از هر چرخه هنگام زمانبندی. این گزینه بهطور پیشفرض فعال است.
- -msched-fp-mem-deps-zero-cost
- -mno-sched-fp-mem-deps-zero-cost
- فرض اینکه بعید است ذخیرهها و بارگذاریهای ممیز شناور در صورت قرارگیری در یک گروه دستورالعمل، تداخلی ایجاد کنند. این گزینه بهطور پیشفرض غیرفعال است.
- -msel-sched-dont-check-control-spec
- -mno-sel-sched-dont-check-control-spec
- تولید بررسیها برای حدسزنی کنترلی در زمانبندی گزینشی (selective scheduling). این پرچم بهطور پیشفرض غیرفعال است.
- -msched-max-memory-insns=max-insns
- محدود کردن تعداد دستورالعملهای حافظه در هر گروه دستورالعمل، با اولویت پایینتر دادن به دستورالعملهای حافظه بعدی که سعی در زمانبندی در همان گروه دستورالعمل را دارند. اغلب برای جلوگیری از تداخل بنک حافظه نهان (cache bank conflicts) مفید است. مقدار پیشفرض 1 است.
- -msched-max-memory-insns-hard-limit
- -mno-sched-max-memory-insns-hard-limit
- محدودیت تعیینشده توسط msched-max-memory-insns را به یک حد سخت تبدیل میکند، و اجازه حضور بیش از آن تعداد را در یک گروه دستورالعمل نمیدهد. در غیر این صورت، محدودیت «نرم» است، به این معنی که با رسیدن به حد مجاز، عملیات غیرحافظهای ترجیح داده میشوند، اما عملیات حافظه همچنان ممکن است زمانبندی شوند.
گزینههای LM32
این گزینههای -m برای معماری LatticeMico32 تعریف شدهاند:
- -mbarrel-shift-enabled
- فعالسازی دستورالعملهای barrel-shift.
- -mdivide-enabled
- فعالسازی دستورالعملهای تقسیم و باقیمانده (modulus).
- -mmultiply-enabled
- فعالسازی دستورالعملهای ضرب.
- -msign-extend-enabled
- فعالسازی دستورالعملهای گسترش علامت (sign extend).
- -muser-enabled
- فعالسازی دستورالعملهای تعریفشده توسط کاربر.
گزینههای LoongArch
این گزینههای خط فرمان برای مقصدهای LoongArch تعریف شدهاند:
- -march=arch-type
- تولید
دستورالعملها
برای نوع
ماشین arch-type.
-march=arch-type به GCC
اجازه
میدهد کدی
تولید کند
که ممکن است
بر روی
پردازندههایی
غیر از
پردازنده
مشخصشده
اصلاً اجرا
نشود.
انتخابها برای arch-type عبارتند از:
- native
- نوع پردازنده محلی شناساییشده توسط کامپایلر بومی.
- loongarch64
- پردازنده عمومی ۶۴ بیتی LoongArch.
- la464
- پردازنده مبتنی بر LA464 معماری LoongArch به همراه LSX و LASX.
- la664
- پردازنده مبتنی بر LA664 معماری LoongArch به همراه LSX، LASX و تمام دستورالعملهای LoongArch v1.1.
- la64v1.0
- نسخه 1.0 از ISA معماری LoongArch64.
- la64v1.1
- نسخه 1.1 از ISA معماری LoongArch64.
- la32v1.0
- نسخه 1.0 از ISA معماری LoongArch32.
- la32rv1.0
- نسخه 1.0 از ISA کاهشیافته LoongArch32 (Reduced ISA).
اطلاعات بیشتر درباره نسخههای ISA معماری LoongArch را میتوان در https://github.com/loongson/la-toolchain-conventions یافت.
- -mtune=tune-type
- بهینهسازی
کد
تولیدشده
برای
پردازنده
مقصد
مشخصشده.
انتخابها برای tune-type عبارتند از:
- native
- نوع پردازنده محلی شناساییشده توسط کامپایلر بومی.
- generic
- پردازنده عمومی LoongArch.
- loongarch64
- پردازنده عمومی ۶۴ بیتی LoongArch.
- la464
- هسته LoongArch LA464.
- la664
- هسته LoongArch LA664.
- loongarch32
- پردازنده عمومی ۳۲ بیتی LoongArch.
- -mabi=base-abi-type
- تولید کد برای قرارداد فراخوانی (calling convention) مشخصشده. base-abi-type میتواند یکی از موارد زیر باشد:
- lp64d
- برای ارسال پارامترها از ثباتهای همهمنظوره ۶۴ بیتی و ثباتهای ممیز شناور ۳۲/۶۴ بیتی استفاده میکند. مدل داده LP64 است، که در آن int برابر ۳۲ بیت بوده، در حالی که long int و اشارهگرها ۶۴ بیتی هستند.
- lp64f
- برای ارسال پارامترها از ثباتهای همهمنظوره ۶۴ بیتی و ثباتهای ممیز شناور ۳۲ بیتی استفاده میکند. مدل داده LP64 است، که در آن int برابر ۳۲ بیت بوده، در حالی که long int و اشارهگرها ۶۴ بیتی هستند.
- lp64s
- برای ارسال پارامترها از ثباتهای همهمنظوره ۶۴ بیتی و بدون هیچ ثبات ممیز شناور استفاده میکند. مدل داده LP64 است، که در آن int برابر ۳۲ بیت بوده، در حالی که long int و اشارهگرها ۶۴ بیتی هستند.
- -mfpu=fpu-type
- تولید کد برای نوع FPU مشخصشده، که میتواند یکی از موارد زیر باشد:
- 64
- مجاز دانستن استفاده از دستورالعملهای سختافزاری ممیز شناور برای عملیات ۳۲ بیتی و ۶۴ بیتی.
- 32
- مجاز دانستن استفاده از دستورالعملهای سختافزاری ممیز شناور برای عملیات ۳۲ بیتی.
- none
- 0
- از استفاده از دستورالعملهای سختافزاری ممیز شناور جلوگیری میکند.
- -msimd=simd-type
- تولید دستورالعملهای SIMD در LoongArch را برای برداریسازی و از طریق توابع توکار (builtin) فعال میکند. مقدار میتواند یکی از موارد زیر باشد:
- lasx
- تولید دستورالعملها از افزونه ۲۵۶ بیتی LoongArch Advanced SIMD Extension (LASX) و افزونه ۱۲۸ بیتی LoongArch SIMD Extension (LSX) را فعال میکند.
- lsx
- تولید دستورالعملها از افزونه ۱۲۸ بیتی LoongArch SIMD Extension (LSX) را فعال میکند.
- none
- هیچ دستورالعمل SIMD مربوط به LoongArch نباید تولید شود.
- -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
- هزینه انشعابها را تقریباً برابر با n دستورالعمل تنظیم میکند.
- -maddr-reg-reg-cost=n
- هزینه ADDRESS_REG_REG را روی مقدار محاسبهشده با n تنظیم میکند.
- -mcheck-zero-division
- -mno-check-zero-divison
- هنگام تقسیم عدد صحیح بر صفر، تله ایجاد میکند (ایجاد نمیکند). حالت پیشفرض -mcheck-zero-division برای -O0 یا -Og، و -mno-check-zero-division برای سایر سطوح بهینهسازی است.
- -mbreak-code=code
- یک دستورالعمل "break" code برای تلههای غیرقابلبازیابی از سوی "__builtin_trap" یا موارد درجشده توسط کامپایلر (برای نمونه یک مسیر نادرست که با -fisolate-erroneous-paths-dereference ایزوله شده است) تولید میکند، یا یک دستورالعمل "amswap.w $r0, $r1, $r0" ایجاد میکند که در صورت منفی بودن مقدار code یا بزرگتر بودن آن از ۳۲۷۶۷، سختافزار را وادار به فعال کردن استثنای Instruction Not-defined Exception مینماید. مقدار پیشفرض -1 است، به این معنی که از دستورالعمل "amswap.w" استفاده میشود.
- -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
- دادههای سراسری و ایستا با اندازه کوچکتر از num بایت را در یک بخش داده کوچک (small data section) قرار میدهد. مقدار پیشفرض 0 است.
- -mmax-inline-memcpy-size=n
- تمام جابهجاییهای بلوکی (مانند فراخوانیهای "memcpy" یا کپیهای ساختار) با اندازه کمتر یا مساوی با n بایت را درونخطی میکند. مقدار پیشفرض n برابر ۱۰۲۴ است.
- -mcmodel=code-model
- مدل کد را روی یکی از موارد زیر تنظیم میکند:
- tiny-static (هنوز پیادهسازی نشده)
- tiny (هنوز پیادهسازی نشده)
- normal
- بخش کد (text segment) باید در فضای آدرسدهی ۱۲۸ مگابایتی قرار داشته باشد. بخش داده (data segment) باید در فضای آدرسدهی ۲ گیگابایتی باشد.
- medium
- بخش کد و بخش داده هر دو باید درون فضای آدرسدهی ۲ گیگابایتی قرار داشته باشند. این مدل کد پیشفرض است، مگر آنکه GCC با --with-cmodel= برای تعیین مدل کد پیشفرض دیگری پیکربندی شده باشد.
- large (هنوز پیادهسازی نشده)
- extreme
- این حالت اندازه بخش کد و بخش داده را محدود نمیکند. گزینه -mcmodel=extreme با -fplt و/یا -mexplicit-relocs=none ناسازگار است.
- -mexplicit-relocs=style
- -mexplicit-relocs
- -mno-explicit-relocs
- تعیین
میکند چه
زمانی از
عملگرهای
بازآرایی
اسمبلر در
مواجهه با
آدرسهای
نمادین
استفاده
شود. راهکار
جایگزین
استفاده از
ماکروهای
اسمبلر است
که ممکن است
زمانبندی
دستورالعملها
را محدود
کند اما
امکان 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 فعال باشد.
به منظور سازگاری با نسخههای گذشته، گزینه -mexplicit-relocs معادل -mexplicit-relocs=always، و گزینه -mno-explicit-relocs معادل -mexplicit-relocs=none است..IP -mdirect-extern-access 4
- -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 بهدلیل سرریز بازنشانی (relocation overflow) توسط اسمبلر رد شوند)، در غیر این صورت -mno-relax اعمال میگردد.
- -mpass-mrelax-to-as
- -mno-pass-mrelax-to-as
- ارسال (عدم ارسال) گزینه -mrelax یا -mno-relax به اسمبلر. مقدار پیشفرض در زمان ساخت GCC با تشخیص پشتیبانی اسمبلر متناظر تعیین میشود: اگر اسمبلر از گزینه -mrelax پشتیبانی کند، -mpass-mrelax-to-as و در غیر این صورت -mno-pass-mrelax-to-as اعمال خواهد شد. این گزینه بیشتر برای اشکالزدایی یا سازگاری متقابل با اسمبلرهایی غیر از اسمبلر زمان ساخت کاربرد دارد.
- -mrecip
- این گزینه استفاده از دستورالعملهای تخمین معکوس و تخمین معکوس جذر را به همراه گامهای اضافی نیوتن-رافسون (Newton-Raphson) جهت افزایش دقت، بهجای انجام تقسیم یا جذر و تقسیم برای آرگومانهای ممیز شناور فعال میکند. این دستورالعملها تنها زمانی تولید میشوند که -funsafe-math-optimizations همراه با -ffinite-math-only و -fno-trapping-math فعال باشد. این گزینه بهطور پیشفرض غیرفعال است. پیش از استفاده از این گزینه، باید مطمئن شوید که پردازنده هدف از دستورالعملهای "frecipe" و "frsqrte" پشتیبانی میکند. توجه داشته باشید که هرچند توان عملیاتی (throughput) این توالی بالاتر از توان عملیاتی دستورالعملهای غیرمعکوس است، اما دقت آن میتواند تا ۲ ulp کاهش یابد (بهعنوان مثال، معکوس 1.0 برابر با 0.99999994 میشود).
- -mrecip=opt
- این گزینه مشخص میکند کدامیک از دستورالعملهای تخمین معکوس اجازه استفاده دارند. آرگومان opt فهرستی از گزینهها است که با کاما از هم جدا شدهاند، و میتوان پیش از هر گزینه یک ! قرار داد تا عملکرد آن معکوس شود:
- all
- تمام دستورالعملهای تخمین را فعال میکند.
- default
- دستورالعملهای پیشفرض را فعال میکند که معادل -mrecip است.
- none
- تمام دستورالعملهای تخمین را غیرفعال میکند که معادل -mno-recip است.
- div
- تقریب را برای تقسیم اسکالر فعال میکند.
- vec-div
- تقریب را برای تقسیم برداری فعال میکند.
- sqrt
- تقریب را برای ریشه دوم (جذر) اسکالر فعال میکند.
- vec-sqrt
- تقریب را برای ریشه دوم (جذر) برداری فعال میکند.
- rsqrt
- تقریب را برای معکوس جذر اسکالر فعال میکند.
- vec-rsqrt
- تقریب را برای معکوس جذر برداری فعال میکند.
بنابراین، برای مثال، -mrecip=all,!sqrt تمامی تقریبهای معکوس را به جز جذر اسکالر فعال میسازد.
- -mfrecipe
- -mno-frecipe
- استفاده (عدم استفاده) از دستورالعملهای "frecipe.{s/d}" و "frsqrte.{s/d}". هنگام کامپایل با -march=la664، این گزینه بهطور پیشفرض فعال است؛ در غیر این صورت مقدار پیشفرض -mno-frecipe خواهد بود.
- -mdiv32
- -mno-div32
- استفاده (عدم استفاده) از دستورالعملهای "div.w[u]" و "mod.w[u]" با ورودیهایی که علامت آنها گسترش نیافته است (not sign-extended). هنگام کامپایل با -march=la664، این گزینه بهطور پیشفرض فعال است؛ در غیر این صورت مقدار پیشفرض -mno-div32 خواهد بود.
- -mlam-bh
- -mno-lam-bh
- استفاده (عدم استفاده) از دستورالعملهای "am{swap/add}[_db].{b/h}". هنگام کامپایل با -march=la664، این گزینه بهطور پیشفرض فعال است؛ در غیر این صورت مقدار پیشفرض -mno-lam-bh خواهد بود.
- -mlamcas
- -mno-lamcas
- استفاده (عدم استفاده) از دستورالعملهای "amcas[_db].{b/h/w/d}". هنگام کامپایل با -march=la664، این گزینه بهطور پیشفرض فعال است؛ در غیر این صورت مقدار پیشفرض -mno-lamcas خواهد بود.
- -mld-seq-sa
- -mno-ld-seq-sa
- تعیین میکند که آیا به یک سد بارگذاری-بارگذاری همنشانی ("dbar 0x700") نیاز است یا خیر. هنگام کامپایل با -march=la664، این گزینه بهطور پیشفرض فعال است. در غیر این صورت مقدار پیشفرض -mno-ld-seq-sa خواهد بود که یعنی به سد بارگذاری-بارگذاری نیاز است.
- -mscq
- -mno-scq
- استفاده (عدم استفاده) از دستورالعمل ذخیرهسازی شرطی ۱۶ بایتی "sc.q". اگر نوع ماشین تعیینشده با -march= از این دستورالعمل پشتیبانی کند مقدار پیشفرض -mscq و در غیر این صورت -mno-scq است.
- -mtls-dialect=opt
- این گزینه مشخص میکند کدام شیوه TLS برای مدلهای پویای عمومی (general dynamic) و پویای محلی (local dynamic) مورد استفاده قرار گیرد. آرگومان opt میتواند یکی از مقادیر زیر باشد:
- -mannotate-tablejump
- -mno-annotate-tablejump
- هنگامی که از جدول پرش برای بهینهسازی عبارت "switch" استفاده میشود، یک بخش یادداشتگذاری ".discard.tablejump_annotate" ایجاد میکند تا دستورالعمل "jirl" و جدول پرش را به یکدیگر مرتبط سازد. برخی ابزارهای خارجی، برای نمونه objtool در سامانه ساخت هسته لینوکس، جهت تحلیل جریان کنترل به این حاشیهنویسی نیاز دارند. مقدار پیشفرض -mno-annotate-tablejump است..PP گزینههای LynxOS
این گزینهها برای اهداف LynxOS در دسترس هستند.
- استفاده از کتابخانههای اشتراکی. مقدار پیشفرض پیوند دادن با کتابخانههای ایستا است.
- -mthreads
- پشتیبانی از چندنخی.
- -mlegacy-threads
- پشتیبانی از چندنخی قدیمی (legacy). این گزینه با -mthreads ناسازگار است.
گزینههای M32C
- -mcpu=name
- پردازندهای را که کد برای آن تولید میشود انتخاب میکند. name میتواند یکی از موارد r8c برای سری R8C/Tiny، m16c برای سری M16C (تا 60/)، m32cm برای سری M16C/80، یا m32c برای سری M32C/80 باشد.
- -msim
- مشخص میکند که برنامه بر روی شبیهساز اجرا خواهد شد. این امر موجب پیوند خوردن یک کتابخانهٔ زمان اجرای جایگزین میشود که برای مثال، از ورودی/خروجی فایل پشتیبانی میکند. هنگام تولید برنامههایی که بر روی سختافزار واقعی اجرا خواهند شد نباید از این گزینه استفاده کنید؛ باید برای هر تابع ورودی/خروجی مورد نیاز، کتابخانهٔ زمان اجرای خود را ارائه دهید.
- -memregs=number
- تعداد شبهثباتهای مبتنی بر حافظه را که GCC هنگام تولید کد استفاده میکند مشخص مینماید. این شبهثباتها مانند ثباتهای واقعی استفاده میشوند، بنابراین نوعی مصالحه بین توانایی GCC در گنجاندن کد در ثباتهای موجود و افت کاراییِ ناشی از استفاده از حافظه به جای ثباتها وجود دارد. توجه داشته باشید که تمام پیمانهها در یک برنامه باید با مقدار یکسانی برای این گزینه کامپایل شوند. به همین دلیل، نباید از این گزینه با کتابخانههای زمان اجرای پیشفرض GCC استفاده کنید.
گزینههای M32R/D
این گزینههای -m برای معماریهای Renesas M32R/D تعریف شدهاند:
- -m32r2
- تولید کد برای M32R/2.
- -m32rx
- تولید کد برای M32R/X.
- -m32r
- تولید کد برای M32R. این مقدار پیشفرض است.
- -mmodel=small
- فرض میکند
تمام شیءها
در ۱۶
مگابایت
پایینی
حافظه قرار
دارند (به
طوری که
آدرسهای
آنها
بتواند با
دستورالعمل
"ld24"
بارگذاری
شود)، و فرض
میکند
تمام
زیرروالها
با
دستورالعمل
"bl" قابل
دسترسی
هستند. این
مقدار
پیشفرض
است.
آدرسپذیری یک شیء خاص را میتوان با ویژگی "model" تعیین کرد.
- -mmodel=medium
- فرض میکند شیءها ممکن است در هر کجای فضای آدرسدهی ۳۲ بیتی باشند (کامپایلر دستورالعملهای "seth/add3" را برای بارگذاری آدرسهای آنها تولید میکند)، و فرض میکند تمام زیرروالها با دستورالعمل "bl" قابل دسترسی هستند.
- -mmodel=large
- فرض میکند شیءها ممکن است در هر کجای فضای آدرسدهی ۳۲ بیتی باشند (کامپایلر دستورالعملهای "seth/add3" را برای بارگذاری آدرسهای آنها تولید میکند)، و فرض میکند زیرروالها ممکن است با دستورالعمل "bl" قابل دسترسی نباشند (کامپایلر توالی دستورالعملِ بسیار کُندترِ "seth/add3/jl" را تولید میکند).
- -msdata=none
- غیرفعال
کردن
استفاده از
ناحیهٔ
دادههای
کوچک.
متغیرها در
یکی از
بخشهای
".data"،
".bss"، یا
".rodata"
قرار
میگیرند
(مگر اینکه
ویژگی
"section"
مشخص شده
باشد). این
مقدار
پیشفرض
است.
ناحیهٔ دادههای کوچک شامل بخشهای ".sdata" و ".sbss" است. شیءها را میتوان با ویژگی "section" و با استفاده از یکی از این بخشها، بهطور صریح در ناحیهٔ دادههای کوچک قرار داد.
- -msdata=sdata
- قرار دادن دادههای سراسری و ایستای کوچک در ناحیهٔ دادههای کوچک، اما بدون تولید کد ویژه برای ارجاع به آنها.
- -msdata=use
- قرار دادن دادههای سراسری و ایستای کوچک در ناحیهٔ دادههای کوچک، و تولید دستورالعملهای ویژه برای ارجاع به آنها.
- -G num
- قرار دادن
شیءهای
سراسری و
ایستای
کوچکتر یا
مساوی با num
بایت در
بخشهای
دادههای
کوچک یا BSS
کوچک، به
جای
بخشهای
عادی داده
یا BSS. مقدار
پیشفرض num
برابر 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 مورد استفاده برای تخلیهٔ حافظهٔ نهان را تعیین میکند. مقدار پیشفرض 12 است. شمارههای معتبر بین 0 و 15 هستند (شامل هر دو).
- -mno-flush-trap
- مشخص میکند که حافظهٔ نهان با استفاده از trap تخلیه نشود.
- -mflush-func=name
- نام تابع سیستمعامل را برای فراخوانی جهت تخلیهٔ حافظهٔ نهان مشخص میکند. مقدار پیشفرض _flush_cache است، اما فراخوانی تابع تنها در صورتی استفاده میشود که trap در دسترس نباشد.
- -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
- 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
- 5249 : 5249
- 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 یا یک گزینه غیر GNU برای -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 شما کدی برای شبیهسازی آن دستورالعملها ندارد، از این گزینه استفاده کنید.
- -m68302
- تولید کد برای 68302.
- -m68332
- تولید کد برای 68332.
- -m68851
- واحد 68851 یک MMU خارجی برای پردازنده 68020 بود. کامپایلر GCC این گزینه را میپذیرد، اما از آن استفاده نمیکند.
- -mcpu32
- تولید
خروجی برای
CPU32. زمانی که
کامپایلر
برای
سیستمهای
مبتنی بر CPU32
پیکربندی
شده باشد،
این حالت
پیشفرض
است. این
گزینه
معادل -march=cpu32
است.
از این گزینه برای میکروکنترلرهایی با هسته CPU32 یا CPU32+ استفاده کنید، شامل 68330، 68331، 68332، 68333، 68334، 68336، 68340، 68341، 68349 و 68360.
- -mfidoa
- تولید کد برای Fido A.
- -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). این
شامل
استفاده از
دستورالعملهای
سختافزاری
ممیز شناور
(floating-point) میشود.
این گزینه
معادل -mcpu=547x
است و اکنون
به نفع آن
گزینه
منسوخ شده
است..IP -m68020-40 4
تولید
خروجی برای
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 است.
- -mdiv
- -mno-div
- تولید کردن
(یا نکردن)
دستورالعملهای
سختافزاری
تقسیم و
باقیمانده
برای ColdFire. اگر
-march بدون -mcpu
استفاده
شود، مقدار
پیشفرض
برای
معماریهای
ColdFire فعال ("on") و
برای
معماریهای
M680x0 غیرفعال
("off") است. در
غیر این
صورت،
مقدار
پیشفرض از
پردازندهٔ
مقصد گرفته
میشود (یا
پردازندهٔ
پیشفرض،
یا
پردازندهای
که با -mcpu
مشخص شده
است). برای
نمونه،
پیشفرض
برای -mcpu=5206
برابر با "off"
و برای -mcpu=5206e
برابر با "on"
است.
هنگامی که این گزینه فعال باشد، GCC ماکروی "__mcfhwdiv__" را تعریف میکند.
- -mshort
- -mno-short
- -mnoshort
- در نظر گرفتن نوع "int" بهصورت ۱۶ بیتی، همانند "short int". علاوه بر این، پارامترهای ارسالشده روی پشته حتی در مقصدهایی که API آنها ارتقا به ۳۲ بیت را الزامی کرده است، در یک مرز ۱۶ بیتی تراز میشوند. این گزینه بهطور پیشفرض غیرفعال است.
- -mbitfield
- -mno-bitfield
- -mnobitfield
- کنترل استفاده از دستورالعملهای میدانبیتی (bit-field). گزینههای -m68000، -mcpu32 و -m5200 مستلزم -mnobitfield هستند؛ گزینهٔ -m68020 مستلزم -mbitfield است.
- -mrtd
- -mno-rtd
- -mnortd
- کنترل
استفاده از
یک قرارداد
فراخوانی
تابع
متفاوت، که
در آن
توابعی با
تعداد
مشخصی
آرگومان،
با
دستورالعمل
"rtd"
بازمیگردند
که
آرگومانهای
آنها را
هنگام
بازگشت از
پشته خارج (pop)
میکند. این
کار یک
دستورالعمل
در
فراخواننده
صرفهجویی
میکند
زیرا نیازی
به خارج
کردن
آرگومانها
از پشته در
آنجا نیست.
این قرارداد فراخوانی با قراردادی که بهطور معمول در Unix استفاده میشود ناسازگار است، بنابراین اگر نیاز به فراخوانی کتابخانههای کامپایلشده با کامپایلر Unix دارید، نمیتوانید از آن استفاده کنید.
همچنین، شما باید پیشنمونههای تابع (function prototypes) را برای تمام توابعی که تعداد متغیری از آرگومانها را دریافت میکنند (از جمله "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
- -mno-sep-data
- همراه با
-msep-data، کدی
تولید
میکند که
امکان
قرارگیری
قطعه داده (data
segment) را در
ناحیهای
از حافظه
متفاوت از
قطعه کد (text segment)
فراهم
میسازد.
این کار
اجرای در جا
(execute-in-place) را در
محیطهای
فاقد
مدیریت
حافظهٔ
مجازی
امکانپذیر
میسازد.
این گزینه
مستلزم -fPIC
است.
این گزینه بهطور پیشفرض غیرفعال است؛ GCC کدی تولید میکند که فرض میکند قطعه داده بعد از قطعه متن قرار دارد.
- -mid-shared-library
- -mno-id-shared-library
- در صورت
فعال بودن،
کدی تولید
میکند که
از طریق روش
شناسهٔ
کتابخانه (library
ID) از
کتابخانههای
اشتراکی
پشتیبانی
مینماید.
این کار
اجرای در جا
و استفاده
از
کتابخانههای
اشتراکی را
در
محیطهای
فاقد
مدیریت
حافظهٔ
مجازی میسر
میکند. این
گزینه
مستلزم -fPIC
است.
این گزینه بهطور پیشفرض غیرفعال است.
- شماره شناسایی کتابخانهٔ اشتراکی مبتنی بر شناسه را که در حال کامپایل است مشخص میکند. تعیین مقدار 0 کدی فشردهتر تولید میکند؛ تعیین مقادیر دیگر تخصیص آن شماره به کتابخانهٔ فعلی را اجباری میسازد، اما از نظر فضا یا زمان بهینهتر از نادیده گرفتن این گزینه نیست.
- -mxgot
- -mno-xgot
- هنگام
تولید کد
مستقل از
موقعیت
برای ColdFire، کدی
تولید
میکند که
در صورت
داشتن بیش
از ۸۱۹۲
مدخل در
جدول GOT نیز
کار کند.
این کد
بزرگتر و
کندتر از کد
تولیدشده
بدون این
گزینه است.
در
پردازندههای
M680x0 به این
گزینه
نیازی
نیست؛ -fPIC
کفایت
میکند.
بهطور معمول، GCC برای بارگذاری مقادیر از جدول GOT از یک تکدستورالعمل استفاده میکند. اگرچه این کار نسبتاً کارآمد است، اما تنها در صورتی کار میکند که جدول GOT کوچکتر از حدود 64k باشد. هر اندازهای بزرگتر از آن باعث میشود پیونددهنده خطایی مانند زیر گزارش دهد:
relocation truncated to fit: R_68K_GOT16O foobar
اگر چنین اتفاقی افتاد، باید کد خود را با -mxgot دوباره کامپایل کنید. سپس باید با جداول GOT بسیار بزرگ کار کند. با این حال، کد تولیدشده با -mxgot کارایی کمتری دارد، زیرا برای واکشی مقدار یک نماد سراسری ۴ دستورالعمل زمان میبرد.
توجه داشته باشید که برخی از پیونددهندهها، از جمله نسخههای جدیدتر پیونددهندهٔ GNU، میتوانند چندین GOT ایجاد کرده و مدخلهای GOT را مرتب کنند. اگر چنین پیونددهندهای دارید، تنها زمانی باید از -mxgot استفاده کنید که یک فایل شیء تک را کامپایل میکنید که به بیش از ۸۱۹۲ مدخل GOT دسترسی دارد. تعداد بسیار کمی از پروندهها چنین هستند.
این گزینهها هیچ تأثیری ندارند مگر اینکه GCC در حال تولید کد مستقل از موقعیت باشد..IP -mxtls 4 پشتیبانی از بخش TLS بزرگتر از 64K. ملاحظات استفاده از این گزینه مشابه موارد ذکرشده برای -mxgot در بالا است؛ آدرسدهی پیشفرض با آفست ۱۶ بیتی برای TLS کارآمدتر است، اما ممکن است برای برخی برنامهها ناکافی باشد.
- -mlong-jump-table-offsets
- استفاده از آفستهای ۳۲ بیتی در جدولهای "switch". حالت پیشفرض استفاده از آفستهای ۱۶ بیتی است.
گزینههای MCore
اینها گزینههای -m تعریفشده برای پردازندههای Motorola M*Core هستند.
- -mhardlit
- -mno-hardlit
- درج درونخطی ثوابت در جریان کد، چنانچه بتوان آن را در دو دستورالعمل یا کمتر انجام داد.
- -mdiv
- -mno-div
- استفاده از دستورالعمل تقسیم. (بهطور پیشفرض فعال است).
- -mrelax-immediates
- -mno-relax-immediates
- مجاز دانستن مقادیر فوری (immediates) با اندازه دلخواه در عملیات بیتی.
- -mwide-bitfields
- -mno-wide-bitfields
- در نظر گرفتن همیشگی فیلدهای بیتی به اندازه "int".
- -m4byte-functions
- -mno-4byte-functions
- اجبار به تراز شدن تمام توابع روی مرز ۴ بایتی.
- -mcallgraph-data
- -mno-callgraph-data
- تولید اطلاعات گراف فراخوانی (callgraph).
- -mslow-bytes
- -mno-slow-bytes
- ترجیح دادن دسترسی کلمهای (word access) هنگام خواندن مقادیر بایتی.
- -mlittle-endian
- -mbig-endian
- تولید کد به ترتیب برای مقصد little-endian یا big-endian. حالت پیشفرض big-endian است. کد little-endian تنها با -m340 پشتیبانی میشود.
- -m210
- تولید کد برای پردازنده 210.
- -m340
- تولید کد برای پردازنده 340.
- -mno-lsim
- فرض بر این گذاشته شود که پشتیبانی زمان اجرا فراهم شده است و بنابراین کتابخانه شبیهساز (libsim.a) از خط فرمان پیونددهنده حذف شود.
- -mstack-increment=size
- تنظیم حداکثر مقدار برای یک عملیات افزایش پشته منفرد. مقادیر بزرگ میتوانند سرعت برنامههایی را که شامل توابعی با نیاز به فضای پشته زیاد هستند افزایش دهند، اما در صورتی که پشته بیش از حد گسترش یابد، میتوانند باعث بروز خطای دسترسی غیرمجاز به حافظه (segmentation fault) نیز بشوند. مقدار پیشفرض 0x1000 است.
گزینههای MicroBlaze
- -msoft-float
- استفاده از شبیهسازی نرمافزاری برای ممیز شناور (پیشفرض).
- -mhard-float
- استفاده از دستورالعملهای سختافزاری ممیز شناور.
- -mmemcpy
- عدم بهینهسازی انتقال بلوکها، استفاده از "memcpy".
- -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
- -mno-xl-soft-mul
- استفاده از شبیهسازی نرمافزاری ضرب. این گزینه بهطور پیشفرض فعال است.
- -mxl-soft-div
- -mno-xl-soft-div
- استفاده از شبیهسازی نرمافزاری برای تقسیم. این گزینه بهطور پیشفرض فعال است.
- -mxl-barrel-shift
- استفاده از تغییردهنده بشکهای (barrel shifter) سختافزاری.
- -mxl-pattern-compare
- استفاده از دستورالعملهای مقایسه الگو.
- -msmall-divides
- استفاده از بهینهسازی جستجو در جدول (table lookup) برای تقسیم اعداد صحیح علامتدار کوچک.
- -mxl-gp-opt
- استفاده از بخشهای ".sdata"/".sbss" با آدرسدهی نسبی به GP.
- -mxl-multiply-high
- استفاده از دستورالعملهای ضرب بالا (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
- برای برنامههایی که با استفاده از بارگذار بوت (bootloader) بارگذاری میشوند. این مدل از فایل راهاندازی crt2.o استفاده میکند که فاقد گرداننده بردار بازنشانی (reset vector handler) پردازنده است. این وضعیت برای انتقال کنترل هنگام بازنشانی پردازنده به بارگذار بوت بهجای خود برنامه مناسب است.
- novectors
- برای برنامههایی که به هیچیک از بردارهای MicroBlaze نیازی ندارند. این گزینه ممکن است برای برنامههایی که درون یک برنامه پایشگر (monitoring) اجرا میشوند کاربرد داشته باشد. این مدل از crt3.o بهعنوان فایل راهاندازی استفاده میکند.
- -mpic-data-is-text-relative
- فرض میکند که جابهجایی میان بخشهای text و data در زمان پیوند ایستا ثابت است. این امر اجازه میدهد دادهها بهجای GOT، با آفست از ابتدای آدرس text ارجاع داده شوند، چرا که آدرسدهی وابسته به PC پشتیبانی نمیشود.
گزینههای MIPS
- -EB
- -meb
- تولید کد با ترتیب بایت بزرگپایان (big-endian).
- -EL
- -mel
- تولید کد با ترتیب بایت کوچکپایان (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.
allegrex، مقدار
ویژه from-abi
سازگارترین
معماری را
برای ABI
انتخابشده
برمیگزیند
(یعنی mips1
برای ABIهای
۳۲ بیتی و mips3
برای ABIهای
۶۴ بیتی).
زنجیره ابزار بومی Linux/GNU همچنین از مقدار native پشتیبانی میکند که بهترین گزینه معماری را برای پردازنده میزبان انتخاب مینماید. در صورتی که GCC پردازنده را شناسایی نکند، -march=native هیچ تاثیری نخواهد داشت.
در نام پردازندهها، پسوند 000 میتواند بهصورت k مخفف شود (برای مثال، -march=r2k). پیشوندها اختیاری هستند و vr ممکن است بهصورت r نوشته شود.
نامهایی با قالب nf2_1 به پردازندههایی با FPUهایی اشاره دارند که با نصف سرعت کلاک هسته کار میکنند، نامهایی با قالب nf1_1 به پردازندههایی با FPUهایی با سرعت کلاک برابر با هسته اشاره دارند، و نامهایی با قالب nf3_2 به پردازندههایی اشاره دارند که نسبت کلاک FPU به هسته در آنها ۳:۲ است. به دلایل سازگاری، nf بهعنوان مترادفی برای nf2_1 پذیرفته میشود، درحالیکه nx و bfx بهعنوان مترادفهایی برای nf1_1 پذیرفته میشوند.
کامپایلر GCC بر اساس مقدار این گزینه، دو ماکرو تعریف میکند. اولین مورد "_MIPS_ARCH" است که نام معماری هدف را بهصورت یک رشته مشخص میکند. دومین ماکرو قالبی بهصورت "_MIPS_ARCH_foo" دارد که در آن foo مقدار بزرگنویسیشده "_MIPS_ARCH" است. برای مثال، -march=r2000 مقدار "_MIPS_ARCH" را برابر با "r2000" قرار میدهد و ماکروی "_MIPS_ARCH_R2000" را تعریف میکند.
توجه داشته باشید که ماکروی "_MIPS_ARCH" از نامهای پردازندهای که در بالا ذکر شد استفاده میکند. به عبارت دیگر، شامل پیشوند کامل بوده و 000 را بهصورت k مخفف نمیکند. در مورد from-abi، ماکرو نام معماری حلشده را تعیین میکند (یا "mips1" یا "mips3"). در صورت عدم تعیین گزینه -march، این ماکرو نام معماری پیشفرض را مشخص میکند.
- -mtune=arch
- بهینهسازی
برای 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
- -mflip-mips16
- تولید کد MIPS16 بهصورت یکدرمیان روی توابع. این گزینه برای آزمون رگرسیونِ تولید کد ترکیبی MIPS16/غیر-MIPS16 ارائه شده است و برای استفادهٔ عادی در کامپایل کد کاربر در نظر گرفته نشده است.
- -minterlink-compressed
- -mno-interlink-compressed
- الزام (عدم
الزام) به
اینکه کدی
که از ISA
استاندارد
MIPS
(فشردهنشده)
استفاده
میکند، با
کد MIPS16 و microMIPS
سازگار با
پیوند (link-compatible)
باشد، و
بالعکس.
برای مثال، کدی که از کدگذاری استاندارد 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 حالت پیشفرض است.
- -mplt
- -mno-plt
- فرض کردن
(فرض نکردن)
اینکه
پیونددهندههای
ایستا و
پویا از PLTها
و
رونوشتهای
جابجایی (copy
relocations)
پشتیبانی
میکنند.
این گزینه
تنها بر -mno-shared
-mabicalls اثر
میگذارد.
برای n64 ABI، این
گزینه بدون
-msym32 هیچ
تأثیری
ندارد.
میتوانید با پیکربندی GCC با --with-mips-plt، گزینهٔ -mplt را پیشفرض کنید. در غیر این صورت پیشفرض -mno-plt است.
- -mxgot
- -mno-xgot
- برداشتن
(برنداشتن)
محدودیتهای
معمول روی
اندازهٔ
جدول آفست
سراسری (GOT).
دستور GCC معمولاً از یک دستورالعمل برای بارگذاری مقادیر از GOT استفاده میکند. اگرچه این کار نسبتاً کارآمد است، اما تنها در صورتی کار میکند که GOT کوچکتر از حدود 64k باشد. هر مقداری بزرگتر باعث میشود پیونددهنده خطایی مانند زیر را گزارش کند:
relocation truncated to fit: R_MIPS_GOT16 foobar
اگر این رخ داد، باید کد خود را با -mxgot دوباره کامپایل کنید. این گزینه با GOTهای بسیار بزرگ کار میکند، اگرچه کد کارایی کمتری نیز خواهد داشت، زیرا واکشی مقدار یک نماد سراسری نیازمند سه دستورالعمل است.
توجه داشته باشید که برخی از پیونددهندهها میتوانند چندین GOT بسازند. اگر چنین پیونددهندهای دارید، تنها زمانی باید از -mxgot استفاده کنید که یک فایل شیء منفرد به بیش از 64k از مدخلهای GOT دسترسی داشته باشد. که بسیار بهندرت چنین است.
این گزینهها هیچ اثری ندارند مگر اینکه GCC در حال تولید کد مستقل از موقعیت باشد.
- -mgp32
- فرض میکند که ثباتهای همهمنظوره دارای پهنای ۳۲ بیتی هستند.
- -mgp64
- فرض میکند که ثباتهای همهمنظوره دارای پهنای ۶۴ بیتی هستند.
- -mfp32
- فرض میکند که ثباتهای ممیز شناور دارای پهنای ۳۲ بیتی هستند.
- -mfp64
- فرض میکند که ثباتهای ممیز شناور دارای پهنای ۶۴ بیتی هستند.
- -mfpxx
- هیچ فرضی دربارهٔ پهنای ثباتهای ممیز شناور در نظر نمیگیرد.
- -mhard-float
- استفاده از دستورالعملهای کمکپردازندهٔ ممیز شناور.
- -msoft-float
- عدم استفاده از دستورالعملهای کمکپردازندهٔ ممیز شناور. در عوض، پیادهسازی محاسبات ممیز شناور را با استفاده از فراخوانیهای کتابخانهای انجام میدهد.
- -mno-float
- معادل با -msoft-float است، اما علاوهبر آن تصریح میکند که برنامهٔ در حال کامپایل هیچ عملیات ممیز شناوری را انجام نمیدهد. این گزینه در حال حاضر تنها توسط برخی پیکربندیهای سختافزارِ خام (bare-metal) در MIPS پشتیبانی میشود، که ممکن است مجموعهٔ ویژهای از کتابخانهها را انتخاب کند که فاقد هرگونه پشتیبانی ممیز شناور هستند (برای نمونه، شامل قالبهای ممیز شناور "printf"). اگر کدی که با -mno-float کامپایل شده است تصادفاً شامل عملیاتهای ممیز شناور باشد، احتمالاً در زمان پیوند یا زمان اجرا با شکست مواجه خواهد شد..IP -msingle-float 4 فرض بر این قرار میگیرد که پردازندهٔ کمکی ممیز شناور تنها از عملیات با دقت یگانه (single-precision) پشتیبانی میکند.
- -mdouble-float
- فرض بر این قرار میگیرد که پردازندهٔ کمکی ممیز شناور از عملیات با دقت مضاعف (double-precision) پشتیبانی میکند. این مقدار پیشفرض است.
- -modd-spreg
- -mno-odd-spreg
- استفاده از ثباتهای ممیز شناور با دقت یگانه و شمارهٔ فرد را برای o32 ABI فعال میکند. این حالت پیشفرض برای پردازندههایی است که پشتیبانی آنها از این ثباتها شناخته شده است. هنگام استفاده از o32 FPXX ABI، گزینهٔ -mno-odd-spreg بهطور پیشفرض فعال است.
- -mabs=2008
- -mabs=legacy
- این
گزینهها
نحوهٔ
رفتار با
دادههای
ممیز شناور
ویژهٔ
ناعدد (NaN) در IEEE 754
را با
دستورالعملهای
ماشینی
"abs.fmt"
و
"neg.fmt"
کنترل
میکنند.
بهطور پیشفرض یا هنگامی که -mabs=legacy استفاده میشود، رفتار موروثی (legacy) انتخاب میگردد. در این حالت این دستورالعملها حسابی در نظر گرفته میشوند و در جاهایی که عملکرد صحیح نیاز است و عملوند ورودی ممکن است یک NaN باشد، از آنها اجتناب میشود. در عوض، دنبالهٔ طولانیتری از دستورالعملها که بیت علامت دادهٔ ممیز شناور را بهطور دستی دستکاری میکنند استفاده میشود، مگر اینکه گزینهٔ -ffinite-math-only نیز مشخص شده باشد.
گزینهٔ -mabs=2008 رفتار منطبق بر IEEE 754-2008 را انتخاب میکند. در این حالت این دستورالعملها غیرحسابی تلقی میشوند و بنابراین در همهٔ حالات، بهویژه در جایی که عملوند ورودی یک NaN باشد، بهدرستی کار میکنند. از این رو، این دستورالعملها همیشه برای عملیات مربوطه استفاده میشوند.
- -mnan=2008
- -mnan=legacy
- این
گزینهها
کدگذاری
دادههای
ممیز شناور
ویژهٔ
ناعدد (NaN) در IEEE 754
را کنترل
میکنند.
گزینهٔ -mnan=legacy کدگذاری موروثی (legacy) را انتخاب میکند. در این حالت، NaNهای ساکت (qNaNs) با ۰ بودن بیت نخست فیلد معنادار انتهایی (trailing significand) و NaNهای نشانهدهنده (sNaNs) با ۱ بودن بیت نخست فیلد معنادار انتهایی مشخص میشوند.
گزینهٔ -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" را برابر با 1 تعریف میکند.
- -mdspr2
- -mno-dspr2
- از بازنگری ۲ از MIPS DSP ASE استفاده میکند (استفاده نمیکند). این گزینه ماکروهای پیشپردازندهٔ "__mips_dsp" و "__mips_dspr2" را تعریف میکند. همچنین "__mips_dsp_rev" را برابر با 2 تعریف میکند.
- -msmartmips
- -mno-smartmips
- از MIPS SmartMIPS ASE استفاده میکند (استفاده نمیکند).
- -mpaired-single
- -mno-paired-single
- از دستورالعملهای ممیز شناور paired-single استفاده میکند (استفاده نمیکند). این گزینه نیازمند فعال بودن پشتیبانی سختافزاری از ممیز شناور است.
- -mdmx
- -mno-mdmx
- از دستورالعملهای MIPS Digital Media Extension استفاده میکند (استفاده نمیکند). این گزینه تنها هنگام تولید کد ۶۴ بیتی قابل استفاده است و نیازمند فعال بودن پشتیبانی سختافزاری از ممیز شناور است.
- -mips3d
- -mno-mips3d
- از MIPS-3D ASE استفاده میکند (استفاده نمیکند). گزینهٔ -mips3d متضمن -mpaired-single است.
- -mmicromips
- -mno-micromips
- کد microMIPS تولید
میکند
(تولید
نمیکند).
تولید کد microMIPS میتواند به ازای هر تابع بهوسیلهٔ صفتهای "micromips" و "nomicromips" نیز کنترل شود.
- -mmt
- -mno-mt
- از دستورالعملهای چندریسمانی MT Multithreading استفاده میکند (استفاده نمیکند).
- -mmcu
- -mno-mcu
- از دستورالعملهای MIPS MCU ASE استفاده میکند (استفاده نمیکند).
- -meva
- -mno-eva
- از دستورالعملهای MIPS Enhanced Virtual Addressing استفاده میکند (استفاده نمیکند).
- -mvirt
- -mno-virt
- از دستورالعملهای MIPS Virtualization (VZ) استفاده میکند (استفاده نمیکند).
- -mxpa
- -mno-xpa
- از دستورالعملهای MIPS eXtended Physical Address (XPA) استفاده میکند (استفاده نمیکند).
- -mcrc
- استفاده (عدم استفاده) از دستورالعملهای Cyclic Redundancy Check (CRC) در MIPS.
- -mginv
- -mno-ginv
- استفاده (عدم استفاده) از دستورالعملهای Global INValidate (GINV) در MIPS.
- -mmsa
- -mno-msa
- استفاده (عدم استفاده) از دستورالعملهای افزونهی MIPS MSA.
- -mloongson-mmi
- -mno-loongson-mmi
- استفاده (عدم استفاده) از دستورالعملهای چندرسانهای MIPS Loongson (معروف به MMI).
- -mloongson-ext
- -mno-loongson-ext
- استفاده (عدم استفاده) از دستورالعملهای MIPS Loongson EXTensions (EXT).
- -mloongson-ext2
- -mno-loongson-ext2
- استفاده (عدم استفاده) از دستورالعملهای MIPS Loongson EXTensions r2 (EXT2).
- -mlong64
- اجبار نوعهای "long" به داشتن پهنای ۶۴ بیت. برای توضیحات مربوط به مقدار پیشفرض و نحوهی تعیین اندازهی اشارهگر (pointer)، به -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
- قرار دادن
تعاریف
دادههای
با دید
خارجی (externally-visible)
در یک بخش
دادههای
کوچک (small data section)،
در صورتی که
اندازهی
آن دادهها
بزرگتر از
num بایت
نباشد. بدین
ترتیب GCC
میتواند
دسترسیهای
کارآمدتری
به دادهها
تولید کند؛
برای
جزئیات به
-mgpopt مراجعه
کنید.
مقدار پیشفرض گزینه -G به پیکربندی بستگی دارد.
- -mlocal-sdata
- -mno-local-sdata
- تعمیم دادن
(تعمیم
ندادن)
رفتار -G به
دادههای
محلی نیز،
مانند
متغیرهای static
در زبان C.
گزینه -mlocal-sdata
در تمام
پیکربندیها
پیشفرض
است.
اگر پیونددهنده (linker) هشدار دهد که یک برنامه بیش از حد از دادههای کوچک استفاده میکند، میتوانید بازسازی بخشهای کماهمیتتر از نظر کارایی را با -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 به اندازهی کافی بزرگ پیوند (link) دهید.
سادهترین راه برای برآورده کردن این محدودیتها، کامپایل و پیوند دادن تمام پودمانها با گزینه یکسان -G است. با این حال، ممکن است بخواهید کتابخانهای بسازید که از چندین محدودیت مختلف دادههای کوچک پشتیبانی کند. این کار را میتوانید با کامپایل کردن کتابخانه با بالاترین مقدار پشتیبانیشدهی -G و به علاوه استفاده از -mno-extern-sdata برای جلوگیری از فرضیات کتابخانه در مورد دادههای با تعریف خارجی انجام دهید.
- -mgpopt
- -mno-gpopt
- استفاده
(عدم
استفاده) از
دسترسیهای
وابسته به GP
(یا GP-relative) برای
نمادهایی
که مشخص شده
در بخش
دادههای
کوچک قرار
دارند؛ به
-G، -mlocal-sdata و -mextern-sdata
مراجعه
کنید. گزینه
-mgpopt در تمامی
پیکربندیها
پیشفرض
است.
گزینه -mno-gpopt برای مواردی سودمند است که ممکن است ثبات $gp مقدار "_gp" را نداشته باشد. برای مثال، اگر کد بخشی از یک کتابخانه باشد که ممکن است در یک مانیتور بوت (boot monitor) به کار رود، برنامههایی که روتینهای مانیتور بوت را فراخوانی میکنند مقداری ناشناخته را در $gp ارسال خواهند کرد. (در چنین شرایطی، خود مانیتور بوت معمولاً با -G0 کامپایل میشود.)
گزینه -mno-gpopt به معنای فعال بودن ضمنی گزینههای -mno-local-sdata و -mno-extern-sdata است.
- -membedded-data
- -mno-embedded-data
- تخصیص متغیرها در وهله اول به بخش دادههای فقطخواندنی (read-only data section) در صورت امکان، سپس در صورت امکان به بخش دادههای کوچک، و در غیر این صورت در بخش data. این کار کدی تولید میکند که اندکی از حالت پیشفرض کندتر است، اما مقدار حافظهی RAM مورد نیاز در زمان اجرا را کاهش میدهد و بنابراین ممکن است در برخی از سامانههای تعبیهشده (embedded systems) ترجیح داده شود.
- -muninit-const-in-rodata
- -mno-uninit-const-in-rodata
- قرار دادن متغیرهای مقداردهینشدهی "const" در بخش دادههای فقطخواندنی. این گزینه فقط در ترکیب با -membedded-data معنادار است.
- -mcode-readable=setting
- مشخص کردن اینکه آیا GCC مجاز است کدهایی تولید کند که از بخشهای قابل اجرا بخوانند یا خیر. سه تنظیم ممکن وجود دارد:
- -mcode-readable=yes
- دستورالعملها میتوانند آزادانه به بخشهای قابل اجرا دسترسی داشته باشند. این تنظیم پیشفرض است.
- -mcode-readable=pcrel
- دستورالعملهای بارگذاری وابسته به PC در MIPS16 میتوانند به بخشهای قابل اجرا دسترسی پیدا کنند، اما سایر دستورالعملها نباید چنین کنند. این گزینه روی پردازندههای 4KSc و 4KSd زمانی که بیت Read Inhibit در TLBهای کد تنظیم شده است مفید واقع میشود. همچنین روی پردازندههایی که میتوان آنها را با یک رابط دوگانه دستورالعمل/داده SRAM پیکربندی کرد و مانند M4K بهطور خودکار بارگذاریهای وابسته به PC را به RAM دستورالعمل هدایت میکنند، سودمند است.
- -mcode-readable=no
- دستورالعملها نباید به بخشهای قابل اجرا دسترسی داشته باشند. این گزینه روی مقصدهایی کاربرد دارد که با رابط دوگانه دستورالعمل/داده SRAM پیکربندی شدهاند اما (برخلاف M4K) بارگذاریهای وابسته به PC را بهطور خودکار به RAM دستورالعمل هدایت نمیکنند.
در مقصدهای SDE، گزینه -mcode-data-in-code بهعنوان نام مستعار سنتی برای -mcode-readable=no و -mcode-xonly برای -mcode-readable=pcrel در دسترس است.
- -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
- تلهگذاری
کردن
(تلهگذاری
نکردن)
هنگام
تقسیم عدد
صحیح بر
صفر.
پیشفرض -mcheck-zero-division است.
- -mdivide-traps
- -mdivide-breaks
- سیستمهای
MIPS تقسیم بر
صفر را با
تولید یک
تلهٔ شرطی
یا یک دستور
break بررسی
میکنند.
استفاده از
تلهها به
کد
کمحجمتری
منجر
میشود،
اما فقط در MIPS II
و نسخههای
بعد از آن
پشتیبانی
میشود.
همچنین،
برخی از
نسخههای
هستهٔ Linux
دارای باگی
هستند که
مانع از
تولید
سیگنال
مناسب
("SIGFPE")
توسط تله
میشود. از
-mdivide-traps برای
اجازه دادن
به تلههای
شرطی در
معماریهایی
که از آنها
پشتیبانی
میکنند، و
از -mdivide-breaks برای
اجبار به
استفاده از
دستورات break
استفاده
کنید.
پیشفرض معمولاً -mdivide-traps است، اما میتوان آن را در زمان پیکربندی با استفاده از --with-divide=breaks بازنویسی کرد. بررسیهای تقسیم بر صفر را میتوان با استفاده از -mno-check-zero-division بهطور کامل غیرفعال کرد.
- -mload-store-pairs
- -mno-load-store-pairs
- فعال (غیرفعال) کردن بهینهسازی که دستورات بارگذاری یا ذخیرهسازی متوالی را برای فعالکردن پیوند بارگذاری/ذخیرهسازی (load/store bonding) جفت میکند. این گزینه بهطور پیشفرض فعال است اما تنها زمانی اعمال میشود که معماری انتخابشده از bonding پشتیبانی کند.
- -mstrict-align
- -mno-strict-align
- -munaligned-access
- -mno-unaligned-access
- غیرفعال (فعال) کردن دسترسی مستقیم غیرازتراز برای MIPS Release 6. MIPSr6 نیازمند پشتیبانی از دسترسی غیرازتراز در بارگذاری/ذخیرهسازی است، چه از طریق سختافزار یا با تلهگذاری و شبیهسازی. در حالت دوم ممکن است هستهٔ سیستمعامل به -mstrict-align نیاز داشته باشد. گزینههای -munaligned-access و -mno-unaligned-access منسوخ شدهاند و تنها برای سازگاری با گذشته ارائه میشوند.
- -mmemcpy
- -mno-memcpy
- اجبار (عدم اجبار) به استفاده از "memcpy" برای جابهجاییهای بلوکی غیرساده. پیشفرض -mno-memcpy است، که به GCC اجازه میدهد اکثر کپیهای با اندازهٔ ثابت را درونخطی (inline) کند.
- -mlong-calls
- -mno-long-calls
- غیرفعال
(فعال) کردن
استفاده از
دستور
"jal".
فراخوانی
توابع با
استفاده از
"jal"
کارآمدتر
است اما
نیاز دارد
که
فراخواننده
و
فراخواندهشده
در یک قطعهٔ
(segment) ۲۵۶
مگابایتی
یکسان
باشند.
این گزینه بر روی کدهای abicalls اثری ندارد. پیشفرض -mno-long-calls است.
- -mmad
- -mno-mad
- فعال (غیرفعال) کردن استفاده از دستورات "mad"، "madu" و "mul"، همانگونه که توسط مجموعه دستورات R4650 ارائه شدهاند.
- -mimadd
- -mno-imadd
- فعال (غیرفعال) کردن استفاده از دستورات عدد صحیح "madd" و "msub". پیشفرض در معماریهایی که از "madd" و "msub" پشتیبانی میکنند -mimadd است، بهجز در معماری 74k که مشخص شد در آن کد کندتری تولید میکند.
- -mfused-madd
- -mno-fused-madd
- فعال
(غیرفعال)
کردن
استفاده از
دستورات
ضرب-انباشت
(multiply-accumulate) ممیز
شناور، در
صورت در
دسترس بودن
آنها.
پیشفرض
-mfused-madd است.
در پردازندهٔ R8000 هنگامی که از دستورات ضرب-انباشت استفاده میشود، حاصلضرب میانی با دقت بینهایت محاسبه میشود و تابع بیت FCSR Flush to Zero نخواهد بود. این موضوع ممکن است در برخی شرایط نامطلوب باشد. در سایر پردازندهها نتیجه از نظر عددی با محاسبات معادل که با استفاده از دستورات مجزای ضرب، جمع، تفریق و منفیسازی انجام میشوند، یکسان است.
- -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:
- -
- یک شیفت کلمهٔ مضاعف یا متغیر اگر بلافاصله پس از شروع یک تقسیم عدد صحیح اجرا شود، ممکن است نتیجهٔ نادرستی بدهد.
- -mfix-r10000
- -mno-fix-r10000
- دور زدن برخی از ایرادات سختافزاری (errata) پردازنده R10000:
- -
- دنبالههای "ll"/"sc" ممکن است در نگارشهای پیش از 3.0 رفتار تجزیهناپذیر (اتمیک) نداشته باشند. آنها ممکن است در نگارشهای 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
- -mno-fix-vr4130
- دور زدن ایرادات سختافزاری "mflo"/"mfhi" در VR4130. راهحلهای دور زدن بهجای GCC توسط اسمبلر پیادهسازی شدهاند، اگرچه در صورت در دسترس بودن دستورالعملهای "macc"، "macchi"، "dmacc" و "dmacchi" در VR4130، کامپایلر GCC از بهکارگیری "mflo" و "mfhi" خودداری میکند.
- -mfix-sb1
- -mno-fix-sb1
- دور زدن برخی از ایرادات سختافزاری هستهٔ پردازندهٔ SB-1. (این پرچم در حال حاضر ایرادات ممیز شناور "F1" و "F2" در نگارش 2 هستهٔ SB-1 را دور میزند.)
- -mfix4300
- -mno-fix4300
- دور زدن ایرادی در تراشههای اولیهٔ VR4300 که باعث میشود عملیات ضرب با عملوندهای خاص، ضربهای بلافاصله پس از خود را مخدوش کنند.
- -mr10k-cache-barrier=setting
- مشخص
میکند که
آیا GCC باید
برای
جلوگیری از
اثرات
جانبی
اجرای حدسی
(speculation) در
پردازندههای
R10K،
مانعهای
حافظهٔ
نهان (cache barriers) درج
کند یا خیر.
مشابه بسیاری از پردازندهها، R10K تلاش میکند نتیجهٔ یک پرش شرطی را پیشبینی کرده و بهطور حدسی دستورالعملهای شاخهٔ «طیشده» ("taken") را اجرا کند. در صورتی که نتیجهٔ پیشبینی نادرست باشد، این دستورالعملها بعداً لغو (abort) میشوند. با این حال، در R10K حتی دستورالعملهای لغوشده نیز میتوانند اثرات جانبی داشته باشند.
این مشکل فقط بر ذخیرهسازیهای هسته و بسته به سیستم، بارگذاریهای هسته تأثیر میگذارد. به عنوان مثال، یک ذخیرهسازی که بهطور حدسی اجرا شده ممکن است حافظهٔ مقصد را در حافظهٔ نهان بارگذاری کند و خط حافظهٔ نهان را به عنوان کثیف (dirty) علامتگذاری کند، حتی اگر خود عملیات ذخیرهسازی بعداً لغو شود. اگر یک عملیات DMA پیش از تخلیه شدن (flush) خط «کثیف» در همان ناحیه از حافظه بنویسد، دادههای موجود در حافظهٔ نهان روی دادههای منتقلشده توسط DMA بازنویسی میشوند. برای توضیحات کامل، از جمله دیگر مشکلات احتمالی، به دفترچهٔ راهنمای پردازندهٔ R10K مراجعه کنید.
یک راهحل دور زدن این است که پیش از هر دسترسی به حافظه که ممکن است بهطور حدسی اجرا شود و حتی در صورت لغو شدن اثرات جانبی داشته باشد، دستورالعملهای مانع حافظهٔ نهان درج شوند. گزینهٔ -mr10k-cache-barrier=setting پیادهسازی GCC از این راهحل را کنترل میکند. این گزینه فرض میکند که دسترسیهای لغوشده به هر بایتی در نواحی زیر فاقد اثرات جانبی هستند:
- 1.
- حافظهٔ اشغالشده توسط فریم پشتهٔ تابع فعلی؛
- 2.
- حافظهٔ اشغالشده توسط آرگومان ورودی پشته؛
- 3.
- حافظهٔ اشغالشده توسط شیئی با نشانی ثابت در زمان پیوند (link-time-constant).
این وظیفهٔ هسته است که اطمینان حاصل کند دسترسیهای حدسی به این نواحی واقعاً ایمن هستند.
اگر برنامهٔ ورودی شامل اعلان تابعی مانند زیر باشد:
void foo (void);
آنگاه پیادهسازی "foo" باید امکان اجرای حدسی دستورهای "j foo" و "jal foo" را فراهم کند. GCC این محدودیت را برای توابعی که خودش کامپایل میکند رعایت مینماید، و انتظار دارد که توابع غیر GCC (مانند کدهای اسمبلی دستنویس) نیز همین کار را انجام دهند.
این گزینه سه حالت دارد:
- -mr10k-cache-barrier=load-store
- درج یک مانع حافظهٔ نهان قبل از هر بارگذاری یا ذخیرهسازی که ممکن است بهطور حدسی اجرا شود و حتی در صورت لغو شدن اثرات جانبی داشته باشد.
- -mr10k-cache-barrier=store
- درج یک مانع حافظهٔ نهان قبل از هر ذخیرهسازی که ممکن است بهطور حدسی اجرا شود و حتی در صورت لغو شدن اثرات جانبی داشته باشد.
- -mr10k-cache-barrier=none
- غیرفعال کردن درج مانعهای حافظهٔ نهان. این حالت پیشفرض است.
- -mflush-func=func
- -mno-flush-func
- تابعی را که باید برای تخلیهٔ حافظههای نهان دستورالعمل (I-cache) و داده (D-cache) فراخوانی شود مشخص میکند، یا این که از فراخوانی هرگونه تابعی از این دست جلوگیری میکند. در صورت فراخوانی، این تابع باید همان آرگومانهای تابع متداول "_flush_func" را بپذیرد، یعنی نشانی محدودهٔ حافظهای که حافظهٔ نهان برای آن تخلیه میشود، اندازهٔ محدودهٔ حافظه، و عدد 3 (جهت تخلیهٔ هر دو حافظهٔ نهان). مقدار پیشفرض به معماری هدفی که GCC برای آن پیکربندی شده است بستگی دارد، اما عموماً یا "_flush_func" است یا "__cpu_flush".
- -mbranch-cost=num
- هزینهٔ پرشها را تقریباً به اندازهٔ num دستورالعمل «ساده» تعیین میکند. این هزینه تنها یک روش تخمین اکتشافی است و تضمینی برای تولید نتایج یکسان در میان نگارشهای مختلف وجود ندارد. هزینهٔ صفر به شکلی حشوآمیز مقدار پیشفرضی را برمیگزیند که بر پایهٔ تنظیمات -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
- این
گزینهها
تعیین
میکنند که
کدام شکل از
پرشها (branches)
تولید شوند.
مقدار
پیشفرض
-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 فعلی موجود بوده و شکاف تأخیر با موفقیت پر شود، از آن استفاده گردد. اگر شکاف تأخیر پر نشود، در صورت موجود بودن، یک پرش فشرده انتخاب میشود.
- -mfp-exceptions
- -mno-fp-exceptions
- مشخص
میکند که
آیا
استثناهای
ممیز شناور
(FP exceptions) فعال
هستند یا
خیر. این
مورد بر
نحوه
زمانبندی
دستورالعملهای
FP برای برخی
پردازندهها
تأثیر
میگذارد.
حالت
پیشفرض
این است که
استثناهای
FP فعال
باشند.
بهعنوان مثال، در SB-1، اگر استثناهای FP غیرفعال باشند و در حال تولید کد ۶۴ بیتی باشیم، میتوانیم از هر دو خطلوله (pipe) ممیز شناور استفاده کنیم. در غیر این صورت، تنها میتوان از یک خطلوله FP استفاده کرد.
- -mvr4130-align
- -mno-vr4130-align
- خطلوله VR4130
از نوع
سوپراسکالر
دوطرفه (two-way superscalar)
است، اما
تنها در
صورتی
میتواند
دو
دستورالعمل
را با هم
صادر (issue) کند
که اولین
دستورالعمل
در مرز ۸
بایتی تراز
(aligned) شده باشد.
هنگامی که
این گزینه
فعال باشد،
GCC
جفتدستورالعملهایی
را که به
تشخیص آن
باید
بهطور
موازی اجرا
شوند تراز
میکند.
این گزینه تنها هنگام بهینهسازی برای VR4130 اثر دارد. این گزینه معمولاً کد را سریعتر میکند، اما به قیمت بزرگتر شدن اندازه آن تمام میشود. این گزینه بهطور پیشفرض در سطح بهینهسازی -O3 فعال است.
- -msynci
- -mno-synci
- فعال
(غیرفعال)
کردن تولید
دستورالعملهای
"synci" در
معماریهایی
که از آن
پشتیبانی
میکنند.
دستورالعملهای
"synci" (در
صورت فعال
بودن) هنگام
کامپایل
"__builtin___clear_cache"
تولید
میشوند.
پیشفرض این گزینه -mno-synci است، اما میتوان با پیکربندی GCC با --with-synci این پیشفرض را لغو کرد.
هنگام کامپایل کد برای سیستمهای تکپردازندهای، استفاده از "synci" معمولاً ایمن است. با این حال، در بسیاری از سیستمهای چندهستهای (SMP)، حافظه نهان (cache) دستورالعمل را در تمام هستهها باطل نمیکند و ممکن است به رفتار تعریفنشده منجر شود.
- -mrelax-pic-calls
- -mno-relax-pic-calls
- تلاش برای
تبدیل
فراخوانیهای
PIC که
معمولاً از
طریق ثبات
$25 ارسال
میشوند،
به
فراخوانیهای
مستقیم. این
امر تنها در
صورتی
امکانپذیر
است که
پیونددهنده
(linker) بتواند
مقصد را در
زمان پیوند
حل (resolve) کند و
مقصد در
محدوده یک
فراخوانی
مستقیم
باشد.
گزینه -mrelax-pic-calls پیشفرض است در صورتی که GCC برای استفاده از یک اسمبلر و پیونددهندهای پیکربندی شده باشد که از دستور اسمبلی ".reloc" پشتیبانی میکنند و -mexplicit-relocs برقرار باشد. با -mno-explicit-relocs، این بهینهسازی میتواند تنها توسط اسمبلر و پیونددهنده بدون نیاز به کمک کامپایلر انجام شود.
- -mmcount-ra-address
- -mno-mcount-ra-address
- تولید (تولید نکردن) کدی که به "_mcount" اجازه میدهد نشانی بازگشت تابع فراخواننده را تغییر دهد. در صورت فعال بودن، این گزینه رابط معمول "_mcount" را با یک پارامتر جدید ra-address گسترش میدهد که دارای نوع "intptr_t *" است و در ثبات $12 فرستاده میشود. سپس "_mcount" میتواند با انجام هر دو عمل زیر، نشانی بازگشت را تغییر دهد:
- بازگرداندن نشانی جدید در ثبات $31.
- ذخیره نشانی جدید در "*ra-address"، در صورتی که ra-address غیرتهی باشد.
پیشفرض -mno-mcount-ra-address است.
- -mframe-header-opt
- -mno-frame-header-opt
- فعال
(غیرفعال)
کردن
بهینهسازی
سرایند قاب
(frame header) در o32 ABI.
هنگام
استفاده از
o32 ABI،
فراخوانی
توابع ۱۶
بایت را در
پشته تخصیص
میدهد تا
تابع
فراخواندهشده
آرگومانهای
ثبات را در
آن بنویسد.
در صورت
فعال بودن،
این
بهینهسازی
در صورتی که
مشخص شود
سرایند قاب
بلااستفاده
است از
تخصیص آن
جلوگیری
میکند.
این بهینهسازی بهطور پیشفرض در تمام سطوح بهینهسازی غیرفعال است.
- -mlxc1-sxc1
- -mno-lxc1-sxc1
- در صورت امکان، فعال (غیرفعال) کردن تولید دستورالعملهای "lwxc1"، "swxc1"، "ldxc1" و "sdxc1". بهطور پیشفرض فعال است.
- -mmadd4
- -mno-madd4
- در صورت امکان، فعال (غیرفعال) کردن تولید دستورالعملهای ۴ عملوندی "madd.s"، "madd.d" و دستورالعملهای مرتبط. بهطور پیشفرض فعال است.
گزینههای MMIX (MMIX Options)
این گزینهها برای MMIX تعریف شدهاند:
- -mlibfuncs
- -mno-libfuncs
- مشخص میکند که توابع کتابخانهای درونی (intrinsic) در حال کامپایل هستند، که صرفنظر از اندازه، همه مقادیر را در ثباتها منتقل میکنند.
- -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
- کد تولیدشده را وادار میکند (وادار نمیکند) که در هر تابع تنها یک نقطهٔ خروج داشته باشد.
- -mset-data-start=address
- هنگام پیوند دادن، شروع بخش داده را روی address تنظیم میکند.
- -mset-program-start=address
- -mno-set-program-start
- هنگام پیوند دادن، نشانی شروع برنامه را روی address تنظیم میکند. مقدار پیشفرض آن 0x100 است مگر اینکه از -mno-set-program-start برای نادیده گرفتن کامل این گزینه استفاده شود.
گزینههای MN10300
این گزینههای -m برای معماریهای Matsushita MN10300 تعریف شدهاند:
- -mmult-bug
- -mno-mult-bug
- در صورت فعال بودن، کدی تولید میکند تا از اشکالات دستورالعملهای ضرب در پردازندههای MN10300 اجتناب شود. این حالت پیشفرض است.
- -mam33
- -mno-am33
- کدی با استفاده از ویژگیهای خاص پردازندهٔ AM33 تولید میکند. حالت پیشفرض -mno-am33 است.
- -mam33-2
- -mno-am33-2
- کدی با استفاده از ویژگیهای خاص پردازندهٔ AM33/2.0 تولید میکند. حالت پیشفرض -mno-am33-2 است.
- -mam34
- -mno-am34
- کدی با استفاده از ویژگیهای خاص پردازندهٔ AM34 تولید میکند. حالت پیشفرض -mno-am34 است.
- -mtune=cpu-type
- هنگام زمانبندی دستورالعملها، از ویژگیهای زمانبندی نوع پردازندهٔ مشخصشده استفاده میکند. این کار نوع پردازندهٔ هدف را تغییر نمیدهد. نوع CPU باید یکی از mn10300، am33، am33-2 یا am34 باشد.
- -mreturn-pointer-on-d0
- -mno-return-pointer-on-d0
- هنگام تولید تابعی که اشارهگر برمیگرداند، اشارهگر را در هر دو ثبات "a0" و "d0" برمیگرداند. در غیر این صورت، اشارهگر فقط در "a0" بازگردانده میشود و تلاش برای فراخوانی چنین توابعی بدون پیشنمونه منجر به خطا خواهد شد. توجه داشته باشید که این گزینه بهطور پیشفرض فعال است؛ برای غیرفعال کردن آن از -mno-return-pointer-on-d0 استفاده کنید.
- -mno-crt0
- فایل شیء مقداردهی اولیهٔ زمان اجرای C را پیوند نمیدهد.
- -mrelax
- به
پیونددهنده
نشان
میدهد که
باید یک
مرحله
بهینهسازی
آزادسازی
(relaxation) را برای
کوتاهتر
کردن
انشعابها،
فراخوانیها
و
نشانیهای
حافظهٔ
مطلق انجام
دهد. این
گزینه فقط
زمانی
تأثیر دارد
که در خط
فرمان برای
مرحلهٔ
نهایی
پیوند
استفاده
شود.
این گزینه اشکالزدایی نمادین را غیرممکن میسازد.
- -mliw
- -mno-liw
- به کامپایلر اجازه میدهد در صورتی که هدف پردازندهٔ AM33 یا جدیدتر باشد، دستورالعملهای Long Instruction Word را تولید کند. این گزینه بهطور پیشفرض فعال است. -mliw ماکروی پیشپردازندهٔ "__LIW__" را تعریف میکند؛ -mno-liw ماکروی پیشپردازندهٔ "__NO_LIW__" را تعریف میکند.
- -msetlb
- -mno-setlb
- به کامپایلر اجازه میدهد در صورتی که هدف پردازندهٔ AM33 یا جدیدتر باشد، دستورالعملهای SETLB و Lcc را تولید کند. این گزینه بهطور پیشفرض فعال است. -msetlb ماکروی پیشپردازندهٔ "__SETLB__" را تعریف میکند؛ -mno-setlb ماکروی پیشپردازندهٔ "__NO_SETLB__" را تعریف میکند.
گزینههای Moxie
- -meb
- کد با ترتیب بایت بزرگانتها (big-endian) تولید میکند. این حالت پیشفرض برای پیکربندیهای moxie-*-* است.
- -mel
- کد با ترتیب بایت کوچکانتها (little-endian) تولید میکند.
- -mmul.x
- -mno-mul.x
- دستورالعملهای mul.x و umul.x را تولید میکند. این گزینه بهطور پیشفرض برای پیکربندیهای moxiebox-*-* فعال است.
- -mno-crt0
- فایل شیء مقداردهی اولیهٔ زمان اجرای C را پیوند نمیدهد.
گزینههای MSP430 این گزینهها برای MSP430 تعریف شدهاند:
- -masm-hex
- مجبور کردن خروجی اسمبلی به استفاده همیشگی از مقادیر ثابت هگزادسیمال. به طور معمول این مقادیر ثابت اعدادی دهدهی علامتدار هستند، اما این گزینه برای مجموعه آزمون (testsuite) و/یا مقاصد زیباییشناختی در دسترس است.
- -mmcu=name
- انتخاب MCU
هدف. این
مورد برای
ایجاد یک
نماد
پیشپردازنده
C بر اساس
نام MCU
استفاده
میشود که
به حروف
بزرگ تبدیل
شده و
پیشوند و
پسوند __
میگیرد.
این نماد به
نوبه خود
توسط فایل
سرایند msp430.h
برای
انتخاب یک
فایل
سرایند
مکمل
اختصاصی MCU
به کار
میرود.
این گزینه همچنین ISA مورد استفاده را تعیین میکند. اگر نام MCU بهگونهای باشد که مشخصاً فقط از 430 ISA پشتیبانی کند، همان انتخاب میشود؛ در غیر این صورت 430X ISA انتخاب خواهد شد. نام عمومی MCU به صورت msp430 نیز میتواند برای انتخاب 430 ISA استفاده شود. به طور مشابه، نام عمومی msp430x برای MCU، معماری 430X ISA را انتخاب میکند.
علاوه بر این، یک اسکریپت پیونددهنده اختصاصی MCU به خط فرمان پیونددهنده افزوده میشود. نام اسکریپت، همان نام MCU به همراه پسوند .ld است. بنابراین، مشخص کردن -mmcu=xxx در خط فرمان gcc، نماد پیشپردازنده C به صورت "__XXX__" را تعریف کرده و باعث میشود پیونددهنده به دنبال اسکریپتی با نام xxx.ld بگردد.
معماری ISA و پشتیبانی ضرب سختافزاری برای MCUهای گوناگون درون GCC به صورت سختکد شده قرار دارد. با این حال، یک فایل خارجی devices.csv میتواند برای گسترش پشتیبانی از دستگاهها فراتر از موارد سختکد شده به کار رود.
کامپایلر GCC فایل devices.csv را با استفاده از روشهای زیر و بر اساس ترتیب تقدم دادهشده جستجو میکند، به طوری که روش اول نسبت به روش دوم و روش دوم نسبت به روش سوم اولویت دارد.
- مسیر include مشخصشده با -I و -L
- فایل devices.csv در هر یک از دایرکتوریهای تعیینشده توسط مسیرهای include و مسیرهای جستجوی کتابخانه پیونددهنده جستجو میشود.
- مسیر مشخصشده توسط متغیر محیطی MSP430_GCC_INCLUDE_DIR
- مقدار متغیر محیطی سراسری MSP430_GCC_INCLUDE_DIR را برابر مسیر کامل دایرکتوری حاوی devices.csv قرار دهید تا GCC این دایرکتوری را برای یافتن devices.csv جستجو کند. اگر devices.csv پیدا شود، این دایرکتوری همچنین به عنوان یک مسیر include و مسیر کتابخانه پیونددهنده ثبت میشود. بنابراین فایلهای سرایند و اسکریپتهای پیونددهنده در این دایرکتوری میتوانند بدون تعیین دستی -I و -L در خط فرمان استفاده شوند.
- دایرکتوری msp430-elf{,bare}/include/devices
- در نهایت، GCC مسیر msp430-elf{,bare}/include/devices را از دایرکتوری ریشه زنجیره ابزار بررسی میکند. این دایرکتوری در نصب پیشفرض وجود ندارد، اما اگر آن را ایجاد کرده و devices.csv را در آن کپی کرده باشید، دادههای MCU خوانده میشوند. همانند بالا، این دایرکتوری نیز به عنوان یک مسیر include و مسیر کتابخانه پیونددهنده ثبت میشود.
اگر هیچیک از روشهای جستجوی بالا devices.csv را پیدا نکنند، از دادههای سختکد شده MCU استفاده میشود.
- -mwarn-mcu
- -mno-warn-mcu
- این گزینه هشدارهای مربوط به تداخل میان نام MCU مشخصشده توسط گزینه -mmcu و ISA تعیینشده با گزینه -mcpu و/یا پشتیبانی ضرب سختافزاری تعیینشده با گزینه -mhwmult را فعال یا غیرفعال میکند. همچنین هشدارهای مربوط به نامهای ناشناخته MCU را تغییر وضعیت میدهد. این گزینه به صورت پیشفرض فعال است.
- -msim
- پیوند دادن به کتابخانههای زمان اجرا و اسکریپت پیونددهنده شبیهساز. این گزینه هر اسکریپتی را که ممکن است توسط گزینه -mmcu= انتخاب شود، بازنویسی میکند.
- -mlarge
- استفاده از مدل آدرسدهی بزرگ (اشارهگرهای ۲۰ بیتی، "size_t" ۲۰ بیتی).
- -msmall
- استفاده از مدل آدرسدهی کوچک (اشارهگرهای ۱۶ بیتی، "size_t" ۱۶ بیتی).
- -mrelax
- این گزینه به اسمبلر و پیونددهنده ارسال میشود و به پیونددهنده اجازه میدهد بهینهسازیهای خاصی را انجام دهد که تا زمان پیوند نهایی قابل اجرا نیستند.
- mhwmult=type
- نوع ضرب
سختافزاری
پشتیبانیشده
توسط هدف را
شرح میدهد.
مقادیر
پذیرفتهشده
برای type
عبارتند از:
none برای عدم
وجود ضرب
سختافزاری،
16bit برای ضرب
اولیه
منحصراً ۱۶
بیتی
پشتیبانیشده
توسط MCUهای
نخستین، 32bit
برای ضرب
۱۶/۳۲ بیتی
پشتیبانیشده
توسط MCUهای
بعدی و f5series
برای ضرب
۱۶/۳۲ بیتی
پشتیبانیشده
توسط MCUهای
سری F5. مقدار
auto نیز
میتواند
داده شود؛
این حالت به
GCC اعلام
میکند که
پشتیبانی
ضرب
سختافزاری
را بر اساس
نام MCU
مشخصشده
توسط گزینه
-mmcu استنتاج
کند. اگر
گزینه -mmcu
مشخص نشده
باشد یا نام
MCU شناسایی
نشود،
هیچگونه
پشتیبانی
ضرب
سختافزاری
در نظر
گرفته
نمیشود.
مقدار
پیشفرض
"auto" است.
ضربهای سختافزاری معمولاً با فراخوانی یک روال کتابخانهای انجام میشوند که باعث صرفهجویی در فضای کد تولیدشده میشود. با این حال هنگام کامپایل با -O3 یا بالاتر، ضربکننده سختافزاری به صورت درونخطی (inline) فراخوانی میشود. این امر کدی حجیمتر اما سریعتر تولید میکند.
روالهای ضرب سختافزاری وقفهها را در حین اجرا غیرفعال کرده و پس از اتمام، وضعیت پیشین وقفه را بازمیگردانند. این رفتار استفاده از آنها را هم در گردانندههای وقفه و هم در کدهای عادی ایمن میسازد.
- -minrt
- فعالسازی استفاده از یک محیط زمان اجرای حداقل، بدون پشتیبانی از مقداردهندههای اولیه ایستا یا سازندهها. این گزینه برای دستگاههای با محدودیت شدید حافظه طراحی شده است. کامپایلر نمادهای ویژهای را در برخی اشیاء میگنجاند که به پیونددهنده و زمان اجرا میگویند کدام بخشهای کد مورد نیاز هستند.
- -mtiny-printf
- فعالسازی
توابع
کتابخانهای
"printf" و
"puts" با
حجم کد
کاهشیافته.
پیادهسازیهای
tiny این
توابع
بازورود (reentrant)
نیستند،
بنابراین
در
برنامههای
چندنخی
باید با
احتیاط
استفاده
شوند.
پشتیبانی از جریانها (streams) حذف شده و رشته مورد نظر برای چاپ همیشه از طریق فراخوانی سیستمی "write" به stdout ارسال میشود. رشته پیش از ارسال به write بافر نمیشود.
این گزینه نیازمند Newlib Nano IO است، بنابراین GCC باید با --enable-newlib-nano-formatted-io پیکربندی شده باشد.
- -mmax-inline-shift=n
- این گزینه
یک عدد صحیح
n بین ۰ تا
۶۴ (شامل هر
دو) را
دریافت
کرده و
حداکثر
تعداد
دستورهای
شیفت
درونخطی
را تعیین
میکند که
باید برای
انجام یک
عملیات
شیفت با
مقداری
ثابت تولید
شوند.
هنگامی که
نیاز باشد
از این
مقدار
فراتر رفته
شود، به جای
آن از یک
تابع کمکی mspabi
استفاده
میشود.
مقدار
پیشفرض ۴
است.
این مورد تنها بر حالتهایی اثر میگذارد که در آنها شیفت به میزان چندین موقعیت با یک دستور واحد قابل انجام نباشد (مانند تمام شیفتهای بزرگتر از ۱ در 430 ISA).
شیفتهای یک مقدار ۳۲ بیتی دستکم دو برابر هزینهبر هستند، بنابراین مقدار دادهشده به این گزینه بر ۲ تقسیم شده و مقدار حاصل به جای آن استفاده میشود.
- -mcode-region=where
- -mdata-region=where
- این گزینهها به کامپایلر اعلام میکنند که توابع و دادههای فاقد یکی از صفتهای "lower"، "upper"، "either" یا "section" را در کجا قرار دهد. مقادیر ممکن برای where عبارتند از lower، upper، either یا any. سه مورد اول مانند صفت متناظر خود عمل میکنند. چهارمین مقدار ممکن یعنی any، گزینه پیشفرض است. این حالت جایگذاری را به طور کامل به اسکریپت پیونددهنده و چگونگی تخصیص بخشهای استاندارد (".text"، ".data" و غیره) به نواحی حافظه واگذار میکند.
- -muse-lower-region-prefix
- افزودن پیشوند .lower به نام بخشها هنگام کامپایل با -mcode-region=lower یا -mdata-region=lower. به صورت پیشفرض غیرفعال است.
- -msilicon-errata=name[,name...]
- این گزینه درخواستی را به اسمبلر ارسال میکند تا اصلاحیههای مربوط به ایرادهای سیلیکونی (silicon errata) نامبرده را فعال کند. برای جزئیات به مستندات اسمبلر مراجعه کنید.
- -msilicon-errata-warn=name[,name...]
- این گزینه درخواستی را به اسمبلر ارسال میکند تا در صورت احتمال نیاز به اعمال یک ایراد سیلیکونی نامبرده، پیامهای هشدار را فعال کند. برای جزئیات به مستندات اسمبلر مراجعه کنید.
- -mwarn-devices-csv
- -mno-warn-devices-csv
- هشدار در صورت پیدا نشدن devices.csv یا بروز خطا در تجزیه آن (پیشفرض: فعال).
گزینههای NDS32 این گزینهها برای پیادهسازیهای NDS32 تعریف شدهاند:
- -mbig-endian
- -EB
- تولید کد در حالت big-endian.
- -mlittle-endian
- -EL
- تولید کد در حالت little-endian.
- -mabi=2
- -mfloat-abi=soft
- استفاده از ABI ممیز شناور نرمافزاری.
- -mabi=2fp+
- -mfloat-abi=hard
- استفاده از ABI ممیز شناور سختافزاری.
- -mreduced-regs
- استفاده از مجموعه ثباتهای کاهشیافته برای تخصیص ثباتها.
- -mfull-regs
- استفاده از مجموعه ثباتهای کامل برای تخصیص ثباتها.
- -malways-align
- همترازسازی همیشگی نقطه ورود تابع، مقصدهای پرش، و نشانی بازگشت.
- -malign-functions
- همتراز کردن نقطه ورود تابع با مرز ۴ بایتی.
- -mfp-as-gp
- -mno-fp-as-gp
- فعال/غیرفعال کردن بهینهسازی fp-as-gp.
- -mcmov
- -mno-cmov
- فعال/غیرفعال کردن تولید دستورالعملهای انتقال شرطی (conditional move).
- -mhw-abs
- -mno-hw-abs
- فعال/غیرفعال کردن تولید دستورالعملهای سختافزاری abs.
- -mext-perf
- -mno-ext-perf
- فعال/غیرفعال کردن تولید دستورالعملهای افزونه کارایی (performance extension).
- -mext-perf2
- -mno-ext-perf2
- فعال/غیرفعال کردن تولید دستورالعملهای افزونه ۲ کارایی.
- -mext-string
- -mno-ext-string
- فعال/غیرفعال کردن تولید دستورالعملهای افزونه رشته (string extension).
- -mext-dsp
- -mno-ext-dsp
- فعال/غیرفعال کردن تولید دستورالعملهای افزونه DSP.
- -mext-fpu-fma
- -mno-ext-fpu-fma
- فعال/غیرفعال کردن تولید دستورالعملهای ضرب-تجمع (multiply-accumulation) ممیز شناور.
- -mext-fpu-sp
- -mno-ext-fpu-sp
- فعال/غیرفعال کردن تولید دستورالعملهای ممیز شناور با دقت یگانه (single-precision).
- -mext-fpu-dp
- -mno-ext-fpu-dp
- فعال/غیرفعال کردن تولید دستورالعملهای ممیز شناور با دقت مضاعف (double-precision).
- -mv3push
- -mno-v3push
- فعال/غیرفعال کردن تولید دستورالعملهای v3 push25/pop25.
- -m16-bit
- -mno-16-bit
- فعال/غیرفعال کردن تولید دستورالعملهای ۱۶ بیتی.
- -mvh
- -mno-vh
- فعال/غیرفعال کردن پشتیبانی از Virtual Hosting.
- -misr-vector-size=num
- تعیین اندازه هر بردار وقفه، که باید ۴ یا ۱۶ باشد.
- -misr-secure=num
- تعیین سطح امنیت c-isr برای کل فایل.
- -mcache-block-size=num
- تعیین اندازه هر بلوک حافظه پنهان (cache)، که باید توانی از ۲ بین ۴ و ۵۱۲ باشد.
- -march=arch
- معماری هدف را تعیین میکند. arch میتواند یکی از موارد v2، v3، v3j، v3m، v3f، یا v3s باشد.
- -mcpu=cpu
- پردازنده (CPU) هدف کامپایل را مشخص میکند. cpu میتواند یکی از موارد n6، n650، n7، n705، n8، n801، sn8، sn801، s8، s801، e8، e801، n820، s830، e830، n9، n903، n903a، n968، n968a، n10، n1033، n1033a، n1033-fpu، n1033-spu، n1068، n1068a، n1068-fpu، n1068a-fpu، d10، d1088، d1088-fpu، d1088-spu، n15، d15، n15s، d15s، n15f، d15f، n12، n1213، n1233، n1233-fpu، n1233-spu، n13، n1337، n1337-fpu، n1337-spu، یا simple باشد.
- -mconfig-fpu=num
- یک مقدار پیکربندی FPU از 0 تا 7 را تعیین میکند؛ 0--3 طبق مشخصات FPU است، و 4--7 متناظر با 0--3 هستند.
- -mconfig-mul=type
- پیکربندی دستور ضرب را تعیین میکند. type میتواند یکی از موارد fast، fast1 (معادل fast)، fast2، یا slow باشد. پیشفرض fast1 است.
- -mconfig-register-ports=kind
- تعداد درگاههای خواندن/نوشتن برای هستههای n9/n10 را تعیین میکند. مقدار باید 3r2w یا 2r1w باشد.
- -mcmodel=code-model
- مدل کد را بر روی یکی از موارد زیر تنظیم میکند:
- small
- تمامی بخشهای داده و دادههای فقط-خواندنی باید در فضای آدرسدهی 512KB قرار گیرند. بخش متن (text segment) باید در فضای آدرسدهی 16MB قرار گیرد..IP medium 4 بخش داده باید درون محدودهٔ 512KB باشد، در حالی که بخش دادههای فقطخواندنی میتواند در فضای آدرسدهی 4GB قرار گیرد. بخش کد (text) همچنان باید در فضای آدرسدهی 16MB باشد.
- large
- تمام بخشهای کد و داده میتوانند درون فضای آدرسدهی 4GB قرار گیرند.
مقدار پیشفرض در مقصدهای GNU/Linux برابر large و در سایر مقصدهای ELF برابر medium است.
- -mctor-dtor
- -mno-ctor-dtor
- فعال/غیرفعال کردن ویژگی سازنده/ویرانگر (constructor/destructor).
- -mrelax
- -mno-relax
- فعال/غیرفعال کردن گزینهٔ پیونددهنده برای سادهسازی و کوتاهسازی دستورالعملها (instruction relaxation).
- -mrelax-hint
- -mno-relax-hint
- فعال/غیرفعال کردن درج راهنماها برای پیونددهنده جهت انجام سادهسازی دستورالعملها.
- -msched-prolog-epilog
- -mno-sched-prolog-epilog
- فعال/غیرفعال کردن زمانبندی توالی مقدمه (prologue) و مؤخره (epilogue) تابع.
- -mret-in-naked-func
- -mno-ret-in-naked-func
- فعال/غیرفعال کردن تولید دستورالعملهای بازگشت در توابع عریان (naked functions). این گزینه بهطور پیشفرض فعال است.
- -malways-save-lp
- -mno-always-save-lp
- فعال/غیرفعال کردن ذخیرهٔ همیشگی $lp روی پشته.
- -munaligned-access
- -mno-unaligned-access
- فعال/غیرفعال کردن دسترسیهای غیرهمتراز به کلمه (word) و نیمکلمه (halfword) برای دادههای بستهبندیشده (packed).
- -minline-asm-r15
- -mno-inline-asm-r15
- مجاز/غیرمجاز کردن استفاده از r15 برای اسمبلی درونخطی (inline asm).
گزینههای Nvidia PTX
این گزینهها برای Nvidia PTX تعریف شدهاند:
- -m64
- نادیده گرفته میشود، اما برای سازگاری با نسخههای پیشین حفظ شده است. تنها ABI ۶۴-بیتی پشتیبانی میشود.
- -march=architecture-string
- تولید کد
برای
معماری
مقصد
مشخصشده
در PTX ISA.
رشتههای
معماری
معتبر
عبارتند از:
sm_30، sm_35، sm_37،
sm_50، 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.0، 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
- -mno-optimize
- فعال/غیرفعال کردن بهینهسازیهای اجرای بخشبندیشده (partitioned execution). این گزینه در صورت انتخاب هر سطحی از بهینهسازی، بهطور پیشفرض فعال است.
- -msoft-stack
- -mno-soft-stack
- برای -mno-soft-stack
(حالت
پیشفرض،
مگر اینکه
-mgomp مشخص شده
باشد)، از
پشتههای
«بومی» (native) در
PTX استفاده
میشود؛ به
این معنا که
کدی تولید
میشود که
از حافظهٔ
".local" یا
مستقیماً
از "alloca"
در PTX برای
فضای پشته
استفاده
میکند. مگر
اینکه -mptx=7.3 یا
بالاتر و
-march=sm_52 یا
بالاتر
فعال
باشند،
آرایههای
با طول
متغیر و
تخصیص
پویای
حافظه روی
پشته با
"alloca"
پشتیبانی
نمیشوند.
برای -msoft-stack (که توسط -mgomp اعمال میشود)، کدی تولید میشود که از حافظهٔ ".local" یا "alloca" در PTX مستقیماً برای ذخیرهسازی پشته استفاده نمیکند. در عوض، یک اشارهگر پشته به ازای هر warp بهطور صریح نگهداری میشود. این کار تخصیص پشته با طول متغیر (با آرایههای با طول متغیر یا "alloca") را ممکن میسازد، و زمانی که حافظهٔ سراسری (global memory) برای ذخیرهسازی زیرین استفاده شود، دسترسی به متغیرهای خودکار (automatic) را از دیگر نخها یا با استفاده از دستورالعملهای اتمیک (atomic) امکانپذیر میکند. این شیوهٔ تولید کد برای بارسپاری در OpenMP استفاده میشود، اما خود گزینه بهتنهایی صرفاً جهت آزمایش کامپایلر ارائه شده است؛ برای تولید کد مناسب جهت پیوند در برنامههایی که از بارسپاری OpenMP استفاده میکنند، از گزینهٔ -mgomp بهره بگیرید.
- -msoft-stack-reserve-local=size
- تعیین اندازهٔ حافظهٔ ".local" مورد استفاده برای پشته در زمانی که مقدار دقیق آن مشخص نیست. مقدار پیشفرض آن 128 است.
- -muniform-simt
- -mno-uniform-simt
- فعال/غیرفعال کردن روشی از تولید کد که امکان اجرای همهٔ نخها در هر warp را فراهم میکند، در حالی که وضعیت حافظه و اثرات جانبی را بهگونهای حفظ میکند که گویی خارج از نواحی SIMD در OpenMP، تنها یک نخ در هر warp فعال بوده است. تمام عملیات اتمیک و فراخوانیهای زماناجرا ("malloc"، "free"، "vprintf") بهصورت مشروط اجرا میشوند (تنها در صورتی که اندیس lane فعلی برابر با اندیس lane اصلی باشد)، و ثباتی که مقداری به آن منتسب میشود از طریق یک دستورالعمل shuffle از lane اصلی کپی میگردد. در خارج از نواحی SIMD، شناسهٔ lane 0 به عنوان اصلی (master) عمل میکند؛ درون آنها، هر نخ خود را به عنوان master میبیند. آرایهٔ حافظهٔ اشتراکی "int __nvptx_uni[]" ماسکهای بیتیِ تمامصفر یا تمامیک را برای هر warp ذخیره میکند که نشاندهندهٔ وضعیت فعلی است (مقدار 0 در خارج از نواحی SIMD). هر نخ میتواند ماسک بیتی واقع در موقعیت "tid.y" را با اندیس lane فعلی AND بیتی کند تا اندیس lane اصلی محاسبه شود..IP -mgomp 4
- -mno-gomp
- فعال/غیرفعال کردن تولید کد برای استفاده در برونسپاری محاسبات (offloading) در OpenMP. گزینهٔ -mgomp گزینههای -msoft-stack و -muniform-simt را فعال کرده و گونهٔ multilib متناظر را انتخاب میکند.
گزینههای OpenRISC
این گزینهها برای OpenRISC تعریف شدهاند:
- -mboard=name
- پیکربندی زمان اجرای مخصوص یک برد. این مقدار برای پیوند کتابخانهٔ برد newlib به پیونددهنده ارسال میشود. پیشفرض "or1ksim" است.
- -msoft-div
- -mhard-div
- انتخاب دستورالعملهای تقسیم نرمافزاری یا سختافزاری ("l.div"، "l.divu"). پیشفرض، تقسیم سختافزاری است.
- -msoft-mul
- -mhard-mul
- انتخاب دستورالعملهای ضرب نرمافزاری یا سختافزاری ("l.mul"، "l.muli"). پیشفرض، ضرب سختافزاری است.
- -msoft-float
- -mhard-float
- انتخاب نرمافزاری یا سختافزاری بودن برای عملیات ممیز شناور. پیشفرض، نرمافزاری است.
- -mdouble-float
- هنگامی که -mhard-float انتخاب شده باشد، تولید دستورالعملهای ممیز شناور با دقت مضاعف (double-precision) را فعال میکند. بهطور پیشفرض از توابع libgcc برای انجام عملیات ممیز شناور با دقت مضاعف استفاده میشود.
- -munordered-float
- هنگامی که -mhard-float انتخاب شده باشد، تولید دستورالعملهای مقایسه و تنظیم پرچم ممیز شناور نامرتب ("lf.sfun*") را فعال میکند. بهطور پیشفرض از توابع libgcc برای انجام عملیات مقایسه و تنظیم پرچم ممیز شناور نامرتب استفاده میشود.
- -mcmov
- تولید دستورالعملهای انتقال شرطی ("l.cmov") را فعال میکند. بهطور پیشفرض معادلهای آنها با استفاده از مقداردهی و انشعاب (set and branch) تولید میشوند.
- -mror
- تولید دستورالعملهای چرخش به راست ("l.ror") را فعال میکند. بهطور پیشفرض از توابع libgcc برای انجام عملیات چرخش به راست استفاده میشود.
- -mrori
- تولید دستورالعملهای چرخش به راست با مقدار بیدرنگ ("l.rori") را فعال میکند. بهطور پیشفرض از توابع libgcc برای انجام عملیات چرخش به راست با مقدار بیدرنگ استفاده میشود.
- -msext
- تولید دستورالعملهای گسترش علامت ("l.ext*") را فعال میکند. بهطور پیشفرض از بارگذاریهای حافظه برای انجام گسترش علامت استفاده میشود.
- -msfimm
- تولید دستورالعملهای مقایسه و تنظیم پرچم با مقدار بیدرنگ ("l.sf*i") را فعال میکند. بهطور پیشفرض دستورالعملهای بیشتری تولید میشوند تا ابتدا مقدار بیدرنگ را در یک ثبات ذخیره کنند.
- -mshftimm
- تولید دستورالعملهای شیفت با مقدار بیدرنگ ("l.srai"، "l.srli"، "l.slli") را فعال میکند. بهطور پیشفرض دستورالعملهای بیشتری تولید میشوند تا ابتدا مقدار بیدرنگ را در یک ثبات ذخیره کنند.
- -mcmodel=small
- تولید کد OpenRISC برای مدل کوچک (small): جدول GOT به 64k و پرشهای فراخوانی تابع به آفستهای 64M محدود هستند. این مدل پیشفرض است.
- -mcmodel=large
- تولید کد OpenRISC برای مدل بزرگ (large): اندازهٔ جدول GOT میتواند تا 4G رشد کند و پرشهای فراخوانی تابع میتوانند کل فضای نشانی 4G را هدف قرار دهند.
گزینههای PDP-11
این گزینهها برای PDP-11 تعریف شدهاند:
- -mfpu
- استفاده از ممیز شناور سختافزاری FPP. این حالت پیشفرض است. (ممیز شناور FIS در PDP-11/40 پشتیبانی نمیشود.) مستلزم -m45 است.
- -msoft-float
- عدم استفاده از ممیز شناور سختافزاری.
- -mac0
- -mno-ac0
- با -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" شانزده بیتی (16-bit). این حالت پیشفرض است.
- -mint32
- -mno-int16
- استفاده از "int" سی و دو بیتی (32-bit).
- -msplit
- هدف دارای فضای داده و دستورالعمل تفکیکشده است. مستلزم -m45 است.
- -munix-asm
- استفاده از نحو اسمبلر Unix.
- -mdec-asm
- استفاده از نحو اسمبلر DEC.
- -mgnu-asm
- استفاده از نحو اسمبلر GNU. این حالت پیشفرض است.
- -mlra
- استفاده از تخصیصدهندهٔ ثبات جدید LRA. بهطور پیشفرض، از تخصیصدهندهٔ قدیمی «reload» استفاده میشود.
گزینههای Picolibc
این گزینهها همگردانی و پیوند را هنگام استفاده از Picolibc کنترل میکنند:
- --oslib=library
- جستجوی کتابخانهای با نام library پس از کتابخانهٔ C، که امکان تعریف نمادهای تعریفنشده توسط کتابخانهٔ C را با این کتابخانه فراهم میکند. کتابخانهٔ C، libgcc و این کتابخانه بین پرچمهای --start-group و --end-group قرار میگیرند تا هرکدام بتوانند به نمادهای موجود در دیگری ارجاع دهند. برای بسیاری از اهداف، Picolibc گونهای از semihost ارائه میدهد (که با --oslib=semihost مشخص میشود) که عملکردهای اساسی سیستمعامل را در حدی فراهم میکند که از ورودی/خروجی کنسول و فایل هنگام اجرا در شبیهساز یا هنگام استفاده از دیباگر درونمداری پشتیبانی کند.
- --crt0=[none|minimal|hosted|semihost]
- جایگزین کردن نام پیشفرض crt0.o با crt0-variant.o. گونهٔ none هیچ کد راهاندازی ارائه نمیدهد، و به شما امکان میدهد کد خود را فراهم کنید. minimal برپاسازی اولیهٔ حافظه را انجام میدهد اما هیچ سازندهای را فراخوانی نمیکند. هنگامی که هیچ گزینهٔ -crt0 مشخص نشده باشد، کد مقداردهی اولیهٔ پیشفرض، فراخوانی به تمام سازندهها را میافزاید. گزینهٔ hosted هنگام بازگشت از "main"، یک فراخوانی به "exit" اضافه میکند. گزینهٔ semihost به یک پارامتر خط فرمان ارائهشده از طریق رابط semihosting دسترسی مییابد و آن را بر اساس فاصلهها به آرگومانها تقسیم کرده و آرایهٔ رشتههای حاصل را در "argc" و "argv" به "main" ارسال میکند. در برخی از اهداف، از جمله AArch64، ARC، ARM، LoongArch، M680x0، RISC-V، SH و x86، گونهٔ semihost همچنین استثناهای سختافزاری را به دام انداخته و اطلاعات را در کنسول چاپ میکند. توجه داشته باشید که --crt0=semihost به APIهای ارائهشده توسط --oslib=semihost وابسته است..IP --printf=[d|f|l|i|m] 4 گونهٔ "printf" را انتخاب میکند. Picolibc پنج گونهٔ متفاوت "printf" ارائه میدهد که همراه با کاهش اندازهٔ کد، سطوح عملکردی کمتری فراهم میکنند. d سطح پیشفرض است که انطباق کامل با C17 و POSIX.1-2024 را ارائه میدهد. f همان مجموعه ویژگیها را فراهم میکند، اما بهجای مقادیر "double" از مقادیر "float" که با ماکروی "printf_float" ارسال میشوند پشتیبانی میکند. l تمام پشتیبانی از ممیز شناور (floating-point) و پارامترهای مکانی POSIX را حذف میکند. i اعداد صحیح را به مقادیری که بزرگتر از "long" نباشند محدود میکند. m پشتیبانی از بیشتر گزینههای قالببندی از جمله پهنا (width) و دقت (precision) را حذف میکند. قالبها و آرگومانها همچنان بهدرستی تجزیه میشوند، اما خروجی به این پارامترها پایبند نخواهد بود.
- --scanf=[d|f|l|i|m]
- گونهٔ "scanf" را انتخاب میکند. Picolibc پنج گونهٔ متفاوت "scanf" ارائه میدهد که همراه با کاهش اندازهٔ کد، سطوح عملکردی کمتری فراهم میکنند. d سطح پیشفرض است که انطباق کامل با C17 و POSIX.1-2024 را ارائه میدهد. f پشتیبانی از مقادیر "double" را حذف میکند. l تمام پشتیبانی از ممیز شناور را حذف میکند. i اعداد صحیح را به مقادیری که بزرگتر از "long" نباشند محدود میکند. m پشتیبانی از مشخصکنندههای تبدیل %[ را حذف میکند.
گزینههای PowerPC
این موارد در زیر فهرست شدهاند
گزینههای PRU
این گزینههای خط فرمان برای هدف PRU تعریف شدهاند:
- -minrt
- پیوند با
حداقل محیط
زمان اجرا
(runtime). این
گزینه
میتواند
اندازهٔ
فایل
باینری
نهایی ELF را
به میزان
چشمگیری
کاهش دهد،
اما برخی از
ویژگیهای
استاندارد
زمان اجرای
C حذف
میشوند.
این گزینه پشتیبانی از مقداردهندههای اولیه و سازندههای استاتیک (static initializers and constructors) را غیرفعال میکند. توجه داشته باشید که کامپایلر ممکن است همچنان کدهایی با مقداردهندهها و سازندههای استاتیک تولید کند. اطمینان از عدم استفاده از این ویژگیها در برنامهٔ مبدأ بر عهدهٔ برنامهنویس است.
کد راهاندازی (startup) کمینه، آرگومانهای "argc" و "argv" را به "main" ارسال نمیکند، بنابراین تابع "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 را به پیونددهنده ارسال کند.
- -mloop
- -mno-loop
- اجازه دادن (یا ندادن) به GCC برای استفاده از دستور LOOP.
- -mmul
- -mno-mul
- اجازه دادن (یا ندادن) به GCC برای استفاده از واحد ضربکنندهٔ PRU.
- -mfillzero
- -mno-fillzero
- اجازه دادن (یا ندادن) به GCC برای استفاده از دستورهای FILL و ZERO.
- -mabi=variant
- مشخص کردن گونهٔ ABI برای تولید کد. گزینهٔ -mabi=ti گونهٔ دستنخوردهٔ TI ABI را انتخاب میکند، در حالی که -mabi=gnu گونهای از GNU را برمیگزیند که با فرضیات خاص GCC سازگاری طبیعیتری دارد. تفاوتها به شرح زیر است:
- اندازهٔ اشارهگر تابع
- TI ABI مشخص میکند که اشارهگرهای تابع (کد) ۱۶ بیتی هستند، در حالی که GNU فقط از اشارهگرهای داده و کد ۳۲ بیتی پشتیبانی میکند.
- اشارهگر اختیاری مقدار بازگشتی
- مقادیر بازگشتی تابع که بزرگتر از ۶۴ بیت هستند با استفاده از یک اشارهگر پنهان به عنوان نخستین آرگومان تابع ارسال میشوند. با این حال، TI ABI الزام میکند که در صورت عدم استفادهٔ فراخواننده از مقدار بازگشتی، این اشارهگر میتواند NULL باشد. GNU همواره یک اشارهگر مقدار بازگشتی معتبر ارسال کرده و انتظار دارد.
- اندازهٔ Struct حاوی فیلدهای بیتی
- TI ABI الزام
میکند که
اگر struct حاوی
فیلد بیتی
باشد،
اندازهٔ آن
توسط نوع
فیلد بیتی
تعیین شود.
از سوی
دیگر، GNU
کمترین
تعداد
بایتهایی
را که
بتواند
فیلد بیتی
را در خود
جای دهد
تخصیص
میدهد.
برای مثال، TI ABI برای این struct مقدار ۴ بایت رزرو میکند، در حالی که GNU یک بایت رزرو مینماید:
struct S { int i:1; }; - اندازهٔ دسترسی برای فیلدهای بیتی فرار (Volatile)
- TI ABI الزام
میکند که
دسترسی به
فیلدهای
بیتی volatile با
استفاده از
نوع آنها
انجام شود.
در مقابل، GNU ABI
از
کوچکترین
نوع عدد
صحیح
متناسب با
فیلد بیتی
استفاده
میکند.
برای مثال، TI ABI برای فیلد بیتی زیر به یک بارگذاری (load) منفرد ۴ بایتی نیاز دارد. GNU یک بارگذاری ۱ بایتی تولید میکند:
struct S { volatile int i:1; };
پیادهسازی کنونی -mabi=ti در صورت تشخیص هر یک از ساختارهای کدی بالا، صرفاً یک خطای کامپایل صادر میکند. در نتیجه، کتابخانهٔ استاندارد C نمیتواند ساخته شود و هنگام پیوند با -mabi=ti حذف میشود.
قابلیت Relaxation یک ویژگی GNU است و به دلایل ایمنی هنگام استفاده از -mabi=ti غیرفعال است. زنجیره ابزار TI بازنشانیها (relocations) را برای دستورهای QBBx تولید نمیکند، بنابراین پیونددهندهٔ GNU هنگام کوتاه کردن شبهدستورهای مجاور LDI32 نمیتواند آنها را تنظیم کند.
گزینههای RISC-V
این گزینههای خط فرمان برای اهداف RISC-V تعریف شدهاند:
- -mbranch-cost=n
- تنظیم هزینهٔ انشعابها (branches) به تقریباً n دستورالعمل.
- -mabi=ABI-string
- مشخص کردن
قرارداد
فراخوانی (calling
convention) اعداد
صحیح و ممیز
شناور. ABI-string
شامل دو بخش
است:
اندازهٔ
انواع عدد
صحیح و
ثباتهای
مورد
استفاده
برای انواع
ممیز شناور.
برای مثال
-march=rv64ifd -mabi=lp64d به
این معناست
که long و
اشارهگرها
۶۴ بیتی
هستند (که
بهطور
ضمنی int را
۳۲ بیتی
تعریف
میکند)، و
مقادیر
ممیز شناور
تا پهنای ۶۴
بیت در
ثباتهای F
ارسال
میشوند.
این را
مقایسه
کنید با -march=rv64ifd
-mabi=lp64f که
همچنان به
کامپایلر
اجازه
میدهد
کدهایی با
استفاده از
افزونههای
F و D تولید
کند اما فقط
به مقادیر
ممیز شناور
تا پهنای ۳۲
بیت اجازه
میدهد در
ثباتها
ارسال
شوند؛ یا
-march=rv64ifd -mabi=lp64 که در
آن هیچ
آرگومان
ممیز
شناوری در
ثباتها
ارسال
نمیشود.
مقدار پیشفرض این آرگومان وابسته به سیستم است؛ اگر قرارداد فراخوانی خاصی مد نظرتان است باید آن را صریحاً مشخص کنید. قراردادهای فراخوانی معتبر عبارتند از: ilp32، ilp32f، ilp32d، lp64، lp64f و lp64d. پیادهسازی برخی از قراردادهای فراخوانی بر روی بعضی از معماریهای مجموعه دستورالعمل (ISAها) غیرممکن است: برای مثال، -march=rv32if -mabi=ilp32d نامعتبر است زیرا ABI نیازمند ارسال مقادیر ۶۴ بیتی در ثباتهای F است، در حالی که ثباتهای F تنها ۳۲ بیت پهنا دارند. همچنین ABIهای ilp32e که فقط با معماری rv32e قابل استفاده است و lp64e که فقط با معماری rv64e قابل استفاده است نیز وجود دارند. این ABIها در حال حاضر بهخوبی مشخص نشدهاند و در معرض تغییر هستند.
- -mfdiv
- -mno-fdiv
- استفاده کردن یا نکردن از دستورهای سختافزاری تقسیم و ریشهٔ دوم (جذر) ممیز شناور. این گزینه نیازمند افزونههای F یا D برای ثباتهای ممیز شناور است. حالت پیشفرض در صورت پشتیبانی معماری مشخصشده از این دستورها، استفاده از آنهاست.
- -mfence-tso
- -mno-fence-tso
- دستورالعمل fence.tso را استفاده میکند یا نمیکند، که در برخی پردازندهها (از جمله پردازندههای شرکت T-Head) پیادهسازی نشده است. اگر دستورالعمل fence.tso در دسترس نباشد، بهجای آن از یک fence قویتر استفاده میشود.
- -mdiv
- -mno-div
- دستورالعملهای سختافزاری برای تقسیم اعداد صحیح را استفاده میکند یا نمیکند. این گزینه نیازمند افزونهٔ M است. حالت پیشفرض در صورتی که معماری مشخصشده دارای این دستورالعملها باشد، استفاده از آنها است.
- -misa-spec=ISA-spec-string
- نسخهٔ مشخصات ISA غیرممتاز RISC-V (که قبلاً سطح کاربر خوانده میشد) را که کد تولیدشده باید با آن مطابقت داشته باشد مشخص میکند. مقادیر ممکن برای ISA-spec-string عبارتند از:
- 2.2
- تولید کد منطبق با نسخهٔ 2.2.
- 20190608
- تولید کد منطبق با نسخهٔ 20190608.
- 20191213
- تولید کد منطبق با نسخهٔ 20191213.
پیشفرض -misa-spec=20191213 است، مگر اینکه GCC با --with-isa-spec= برای مشخص کردن نسخهٔ پیشفرض متفاوتی پیکربندی شده باشد.
- -march=[ISA|Profile|Profile_ISA|processor-string]
- تولید کد
برای ISA یا
نمایهٔ (profile)
دادهشدهٔ
RISC-V یا ترکیبی
از آنها
(مانند rv64im،
rvi20u64، rvi20u64_zbb).
نامهای
ISAها و
نمایهها
باید با
حروف کوچک
باشند.
مثالها
شامل rv64i، rv32g،
rv32e، rv32imaf، rva22u64 و
rva23u64 هستند.
برای ترکیب
یک نمایهٔ
نامگذاریشده
با
افزونههای
اختیاری RISC-V
ISA، ابتدا
نمایه را
مشخص کرده و
سپس
نام(های)
افزونه را
با استفاده
از یک زیرخط
بهعنوان
جداکننده
اضافه کنید
(مانند rvi20u64_zca_zcb،
rva23u64_zacas). علاوه
بر این،
مقدار
ویژهٔ help (-march=help)
برای فهرست
کردن تمام
افزونههای
پشتیبانیشده
پذیرفته
میشود.
گزینهٔ -march=unset باعث میشود کامپایلر هرگونه گزینهٔ -march=... را که پیشتر در خط فرمان ظاهر شده نادیده بگیرد، و بهگونهای رفتار کند که گویی این گزینه هرگز داده نشده است. این برای اطمینان از اینکه معماری از گزینهٔ -mcpu گرفته میشود مفید است، و در صورتی که هنگام استفاده از -march=unset هیچ گزینهٔ -mcpu مشخص نشده باشد منجر به خطا خواهد شد.
نحو رشتهٔ ISA بهصورت زیر تعریف شده است:
- رشته باید با rv32 یا rv64 شروع شود و به دنبال آن i، e، یا g بیاید، که به عنوان ISA پایه نامیده میشود.
- بخش بعدی رشته فهرستی از نامهای افزونهها است. نامهای افزونه را میتوان به چندحرفی (مانند zba) و تکحرفی (مانند v) دستهبندی کرد. افزونههای تکحرفی میتوانند بهصورت پشتسرهم ظاهر شوند، اما افزونههای چندحرفی باید با زیرخط از یکدیگر جدا شوند.
- یک زیرخط میتواند در هر کجای پس از ISA پایه قرار گیرد. این کار هیچ تأثیر خاصی ندارد اما برای بهبود خوانایی استفاده میشود و میتواند به عنوان جداکننده عمل کند.
- نامهای افزونه ممکن است شامل یک شماره نسخهٔ اختیاری باشند، که از نحو <major>p<minor> یا <major> پیروی میکند (مانند m2p1 یا m2).
افزونههای پشتیبانیشده در زیر فهرست شدهاند:
- نام افزونه : نسخهٔ پشتیبانیشده : توضیحات
- g
- @tab - @tab افزونهٔ پایهٔ محاسبات همهمنظوره؛ g به i، m، a، f، d، zicsr و zifencei بسط مییابد.
- e
- @tab 2.0 @tab افزونهٔ پایهٔ اعداد صحیح تقلیلیافته
- i
- @tab 2.0 2.1 @tab افزونهٔ پایهٔ اعداد صحیح
- m
- @tab 2.0 @tab افزونهٔ ضرب و تقسیم اعداد صحیح
- a
- @tab 2.0 2.1 @tab افزونهٔ عملیات اتمیک (Atomic)
- f
- @tab 2.0 2.2 @tab افزونهٔ ممیز شناور با دقت یگانه
- d
- @tab 2.0 2.2 @tab افزونهٔ ممیز شناور با دقت دوگانه
- c
- @tab 2.0 @tab افزونهٔ دستورالعملهای فشرده (Compressed)
- b
- @tab 1.0 @tab افزونهٔ استاندارد برای توابع دستکاری بیت
- v
- @tab 1.0 @tab افزونهٔ برداری (Vector)
- h
- @tab 1.0 @tab افزونهٔ هایپروایزر (Hypervisor)
- zic64b
- @tab 1.0 @tab اندازهٔ بلوک حافظهٔ نهان ۶۴ بایت است
- zicbom
- @tab 1.0 @tab افزونهٔ مدیریت بلوک حافظهٔ نهان
- zicbop
- @tab 1.0 @tab افزونهٔ پیشواکشی (Prefetch) بلوک حافظهٔ نهان
- zicboz
- @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 پشتیبانی میکند
- zicfilp
- @tab 1.0 @tab افزونهٔ پد فرود (Landing pad) یکپارچگی جریان کنترل
- zicfiss
- @tab 1.0 @tab افزونهٔ پشتهٔ سایه (Shadow stack) یکپارچگی جریان کنترل
- zicntr
- @tab 2.0 @tab افزونهٔ استاندارد برای شمارندهها و زمانسنجهای پایه
- zicond
- @tab 1.0 @tab افزونهٔ عملیاتهای شرطی اعداد صحیح
- zicsr
- @tab 2.0 @tab افزونهٔ دسترسی به ثباتهای کنترل و وضعیت (CSR).IP zifencei 4 @tab 2.0 @tab افزونهٔ حائل واکشی دستور
- zihintntl
- @tab 1.0 @tab افزونهٔ نشانههای محلیبودن غیرزمانی
- zihintpause
- @tab 2.0 @tab افزونهٔ نشانهٔ مکث
- zihpm
- @tab 2.0 @tab افزونهٔ استاندارد برای شمارندههای کارایی سختافزاری
- zimop
- @tab 1.0 @tab افزونهٔ عملیاتهای ممکن (may-be-operations)
- zilsd
- @tab 1.0 @tab افزونهٔ دستورهای جفت بارگذاری/ذخیره
- zmmul
- @tab 1.0 @tab افزونهٔ ضرب عدد صحیح
- za128rs
- @tab 1.0 @tab اندازهٔ مجموعهٔ رزرو ۱۲۸ بایت
- za64rs
- @tab 1.0 @tab اندازهٔ مجموعهٔ رزرو ۶۴ بایت
- zaamo
- @tab 1.0 @tab افزونهٔ عملیاتهای اتمیک حافظه
- zabha
- @tab 1.0 @tab افزونهٔ عملیاتهای اتمیک حافظه برای بایت و نیمکلمه
- zacas
- @tab 1.0 @tab افزونهٔ دستورهای اتمیک مقایسه و جاگذاری (compare-and-swap)
- zalrsc
- @tab 1.0 @tab زیرمجموعهٔ load-reserved/store-conditional از افزونهٔ A
- zawrs
- @tab 1.0 @tab افزونهٔ انتظار روی مجموعهٔ رزرو
- zama16b
- @tab 1.0 @tab بارگذاریها، ذخیرهها و AMOهای ناهمتراز که کاملاً درون یک مرز ۱۶ بایتی با همترازی طبیعی قرار دارند، اتمیک هستند
- zfa
- @tab 1.0 @tab افزونهٔ ممیز شناور تکمیلی
- zfbfmin
- @tab 1.0 @tab افزونهٔ پشتیبانی حداقلی از BF16
- zfh
- @tab 1.0 @tab افزونهٔ ممیز شناور با دقت نیمه
- zfhmin
- @tab 1.0 @tab افزونهٔ حداقلی ممیز شناور با دقت نیمه
- zfinx
- @tab 1.0 @tab افزونهٔ ممیز شناور با دقت یگانه در ثباتهای عدد صحیح
- zdinx
- @tab 1.0 @tab افزونهٔ ممیز شناور با دقت مضاعف در ثباتهای عدد صحیح
- zca
- @tab 1.0 @tab افزونهٔ دستورهای فشردهٔ عدد صحیح
- zcb
- @tab 1.0 @tab افزونهٔ دستورهای فشردهٔ ساده
- zcd
- @tab 1.0 @tab افزونهٔ بارگذاریها و ذخیرههای فشردهٔ ممیز شناور با دقت مضاعف
- zce
- @tab 1.0 @tab افزونههای دستورهای فشرده برای پردازندههای تعبیهشده
- zcf
- @tab 1.0 @tab افزونهٔ بارگذاریها و ذخیرههای فشردهٔ ممیز شناور با دقت یگانه
- zcmop
- @tab 1.0 @tab افزونهٔ عملیاتهای ممکن فشرده (may-be-operations)
- zcmp
- @tab 1.0 @tab افزونهٔ push و pop فشرده
- zcmt
- @tab 1.0 @tab افزونهٔ دستور پرش جدولی
- zclsd
- @tab 1.0 @tab افزونهٔ دستورهای جفت بارگذاری/ذخیرهٔ فشرده
- zba
- @tab 1.0 @tab افزونهٔ محاسبهٔ نشانی
- zbb
- @tab 1.0 @tab افزونهٔ پایهای دستکاری بیت
- zbc
- @tab 1.0 @tab افزونهٔ ضرب بدون رقم نقلی
- zbkb
- @tab 1.0 @tab افزونهٔ دستکاری بیت برای رمزنگاری
- zbkc
- @tab 1.0 @tab افزونهٔ ضرب بدون رقم نقلی برای رمزنگاری
- zbkx
- @tab 1.0 @tab افزونهٔ جایگشت ماتریسی (crossbar) برای رمزنگاری
- zbs
- @tab 1.0 @tab افزونهٔ عملیاتهای تکبیتی
- zk
- @tab 1.0 @tab افزونهٔ استاندارد رمزنگاری اسکالر
- zkn
- @tab 1.0 @tab افزونهٔ مجموعه الگوریتمهای NIST
- zknd
- @tab 1.0 @tab افزونهٔ رمزگشایی AES
- zkne
- @tab 1.0 @tab افزونهٔ رمزگذاری AES
- zknh
- @tab 1.0 @tab افزونهٔ توابع درهمسازی
- zkr
- @tab 1.0 @tab افزونهٔ منبع آنتروپی
- zks
- @tab 1.0 @tab افزونهٔ مجموعه الگوریتمهای ShangMi
- zksed
- @tab 1.0 @tab افزونهٔ رمز قالبی SM4.IP zksh 4 @tab 1.0 @tab افزونهٔ تابع درهمسازی SM3
- zkt
- @tab 1.0 @tab افزونهٔ تأخیر اجرای مستقل از داده
- ztso
- @tab 1.0 @tab افزونهٔ ترتیب کامل ذخیرهسازی
- zvbb
- @tab 1.0 @tab افزونهٔ برداری دستکاری پایهای بیتها
- zvbc
- @tab 1.0 @tab افزونهٔ برداری ضرب بدون رقم نقلی
- zve32f
- @tab 1.0 @tab افزونههای برداری برای پردازندههای تعبیهشده
- zve32x
- @tab 1.0 @tab افزونههای برداری برای پردازندههای تعبیهشده
- zve64d
- @tab 1.0 @tab افزونههای برداری برای پردازندههای تعبیهشده
- zve64f
- @tab 1.0 @tab افزونههای برداری برای پردازندههای تعبیهشده
- zve64x
- @tab 1.0 @tab افزونههای برداری برای پردازندههای تعبیهشده
- zvfbfmin
- @tab 1.0 @tab افزونهٔ برداری تبدیلات BF16
- zvfbfwma
- @tab 1.0 @tab افزونهٔ برداری ضرب/جمع گسترشیابندهٔ BF16
- zvfh
- @tab 1.0 @tab افزونهٔ برداری ممیز شناور با دقت نیمه
- zvfhmin
- @tab 1.0 @tab افزونهٔ برداری حداقلی ممیز شناور با دقت نیمه
- zvkb
- @tab 1.0 @tab افزونهٔ برداری دستکاری بیت برای رمزنگاری
- zvkg
- @tab 1.0 @tab افزونهٔ برداری GCM/GMAC
- zvkn
- @tab 1.0 @tab افزونهٔ برداری مجموعه الگوریتمهای NIST، zvkn گسترش مییابد به
- zvknc
- @tab 1.0 @tab افزونهٔ برداری مجموعه الگوریتمهای NIST با ضرب بدون رقم نقلی، zvknc
- zvkned
- @tab 1.0 @tab افزونهٔ برداری رمز قالبی AES
- zvkng
- @tab 1.0 @tab افزونهٔ برداری مجموعه الگوریتمهای NIST با GCM، zvkng گسترش مییابد
- zvknha
- @tab 1.0 @tab افزونهٔ برداری درهمسازی امن SHA-2
- zvknhb
- @tab 1.0 @tab افزونهٔ برداری درهمسازی امن SHA-2
- zvks
- @tab 1.0 @tab افزونهٔ برداری مجموعه الگوریتمهای ShangMi، zvks گسترش مییابد
- zvksc
- @tab 1.0 @tab افزونهٔ برداری مجموعه الگوریتمهای ShangMi با ضرب بدون رقم نقلی،
- zvksed
- @tab 1.0 @tab افزونهٔ برداری رمز قالبی SM4
- zvksg
- @tab 1.0 @tab افزونهٔ برداری مجموعه الگوریتمهای ShangMi با GCM
- zvksh
- @tab 1.0 @tab افزونهٔ برداری درهمسازی امن SM3
- zvkt
- @tab 1.0 @tab افزونهٔ برداری تأخیر اجرای مستقل از داده
- zvl1024b
- @tab 1.0 @tab افزونههای استاندارد حداقل طول بردار
- zvl128b
- @tab 1.0 @tab افزونههای استاندارد حداقل طول بردار
- zvl16384b
- @tab 1.0 @tab افزونهٔ استاندارد حداقل طول بردار
- zvl2048b
- @tab 1.0 @tab افزونههای استاندارد حداقل طول بردار
- zvl256b
- @tab 1.0 @tab افزونههای استاندارد حداقل طول بردار
- zvl32768b
- @tab 1.0 @tab افزونهٔ استاندارد حداقل طول بردار
- zvl32b
- @tab 1.0 @tab افزونههای استاندارد حداقل طول بردار
- zvl4096b
- @tab 1.0 @tab افزونههای استاندارد حداقل طول بردار
- zvl512b
- @tab 1.0 @tab افزونههای استاندارد حداقل طول بردار
- zvl64b
- @tab 1.0 @tab افزونههای استاندارد حداقل طول بردار
- zvl65536b
- @tab 1.0 @tab افزونهٔ استاندارد حداقل طول بردار
- zvl8192b
- @tab 1.0 @tab افزونهٔ استاندارد حداقل طول بردار
- zhinx
- @tab 1.0 @tab افزونهٔ ممیز شناور با دقت نیمه در ثباتهای عدد صحیح
- zhinxmin
- @tab 1.0 @tab افزونهٔ حداقلی ممیز شناور با دقت نیمه در ثباتهای عدد صحیح
- sdtrig
- @tab 1.0 @tab افزونهٔ محرکهای اشکالزدایی
- sha
- @tab 1.0 @tab افزونهٔ هایپروایزر بهبودیافته
- shcounterenw
- @tab 1.0 @tab پشتیبانی از فعالسازهای قابلنوشتن برای هر شمارندهٔ پشتیبانیشده.IP shgatpa 4 @tab 1.0 @tab پشتیبانی از حالت SvNNx4 برای تمام حالتهای پشتیبانیشده توسط satp
- shlcofideleg
- @tab 1.0 @tab واگذاری وقفههای LCOFI به VS-mode
- shtvala
- @tab 1.0 @tab ثبات htval تمام مقادیر مورد نیاز را فراهم میکند
- shvstvala
- @tab 1.0 @tab ثبات vstval تمام مقادیر مورد نیاز را فراهم میکند
- shvstvecd
- @tab 1.0 @tab ثبات vstvec از حالت direct پشتیبانی میکند
- shvsatpa
- @tab 1.0 @tab ثبات vsatp از تمام حالتهای پشتیبانیشده توسط satp پشتیبانی میکند
- smaia
- @tab 1.0 @tab افزونه معماری پیشرفته وقفه (AIA)
- smcntrpmf
- @tab 1.0 @tab فیلترسازی حالت ممتاز برای cycle و instret
- smcsrind
- @tab 1.0 @tab دسترسی غیرمستقیم به CSR در سطح ماشین
- smepmp
- @tab 1.0 @tab بهبودهای PMP برای دسترسی به حافظه و جلوگیری از اجرا در حالت ماشین
- smmpm
- @tab 1.0 @tab افزونه ماسکگذاری اشارهگر در حالت سرپرست
- smnpm
- @tab 1.0 @tab افزونه ماسکگذاری اشارهگر در حالت سرپرست
- smrnmi
- @tab 1.0 @tab وقفههای غیرقابلماسک با قابلیت ازسرگیری
- smstateen
- @tab 1.0 @tab افزونه فعالسازی وضعیت
- smdbltrp
- @tab 1.0 @tab افزونههای تله مضاعف (Double trap)
- ssaia
- @tab 1.0 @tab افزونه معماری پیشرفته وقفه برای حالت سرپرست
- ssccptr
- @tab 1.0 @tab حافظه اصلی از خواندن جدول صفحه پشتیبانی میکند
- sscofpmf
- @tab 1.0 @tab افزونه سرریز شمارنده و فیلترسازی
- sscounterenw
- @tab 1.0 @tab پشتیبانی از فعالسازهای قابل نوشتن برای هر شمارنده پشتیبانیشده
- sscsrind
- @tab 1.0 @tab دسترسی غیرمستقیم به CSR در حالت سرپرست
- ssnpm
- @tab 1.0 @tab افزونه ماسکگذاری اشارهگر در حالت سرپرست
- sspm
- @tab 1.0 @tab افزونه ماسکگذاری اشارهگر در حالت سرپرست
- ssstateen
- @tab 1.0 @tab افزونه فعالسازی وضعیت در حالت سرپرست
- sstc
- @tab 1.0 @tab افزونه وقفههای زمانسنج در حالت سرپرست
- sstvala
- @tab 1.0 @tab ثبات stval تمام مقادیر مورد نیاز را فراهم میکند
- sstvecd
- @tab 1.0 @tab ثبات stvec از حالت direct پشتیبانی میکند
- ssstrict
- @tab 1.0 @tab کدگذاریهای رزروشده پیادهسازینشده موجب خطای دستور غیرمجاز (illegal instruction) میشوند و هیچ افزونه ناسازگاری وجود ندارد
- ssdbltrp
- @tab 1.0 @tab افزونههای تله مضاعف (Double trap)
- ssu64xl
- @tab 1.0 @tab مقدار UXLEN=64 باید پشتیبانی شود
- supm
- @tab 1.0 @tab افزونه ماسکگذاری اشارهگر در حالت کاربر
- svinval
- @tab 1.0 @tab افزونه باطلسازی دقیق حافظه پنهان ترجمه نشانی
- svnapot
- @tab 1.0 @tab افزونه پیوستگی ترجمه NAPOT
- svpbmt
- @tab 1.0 @tab افزونه انواع حافظه مبتنی بر صفحه
- svvptc
- @tab 1.0 @tab افزونه بینیازکننده از دستورهای مدیریت حافظه پس از معتبر علامتزدن PTEها
- svadu
- @tab 1.0 @tab افزونه بهروزرسانی سختافزاری بیتهای A/D
- svade
- @tab 1.0 @tab ایجاد استثنا هنگامی که بهروزرسانی سختافزاری بیتهای A/D غیرفعال است
- svbare
- @tab 1.0 @tab حالت bare برای satp پشتیبانی میشود
- xcvalu
- @tab 1.0 @tab افزونه متفرقه ALU در Core-V
- xcvbi
- @tab 1.0 @tab افزونه انشعاب فوری (immediate branch) در Core-V
- xcvelw
- @tab 1.0 @tab افزونه بارگذاری کلمه رویداد در Core-V
- xcvmac
- @tab 1.0 @tab افزونه ضرب-تجمع در Core-V
- xcvsimd
- @tab 1.0 @tab افزونه SIMD در Core-V
- xsfcease
- @tab 1.0 @tab افزونه دستور CEASE در SiFive
- xsfvcp
- @tab 1.0 @tab افزونه پردازنده کمکی برداری VCIX در SiFive
- xsfvfnrclipxfqf
- @tab 1.0 @tab دستورهای برش محدودهدار FP32-to-int8 در SiFive.IP xsfvqmaccdod 4 @tab 1.0 @tab افزونه ضرب ماتریسی int8 در SiFive
- xsfvqmaccqoq
- @tab 1.0 @tab افزونه ضرب ماتریسی int8 در SiFive
- 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 افزونه ضرب-انباشت (multiply-accumulate) T-head
- xtheadmemidx
- @tab 1.0 @tab افزونه عملیات اندیسدار حافظه T-head
- xtheadmempair
- @tab 1.0 @tab افزونه عملیات حافظه با دو GPR در T-head
- xtheadsync
- @tab 1.0 @tab افزونه همگامسازی چندهستهای T-head
- xtheadvector
- @tab 1.0 @tab افزونه برداری T-head
- xventanacondops
- @tab 1.0 @tab افزونه عملیات شرطی عدد صحیح Ventana
- xmipscmov
- @tab 1.0 @tab افزونه انتقال شرطی Mips
- xmipscbop
- @tab 1.0 @tab افزونه پیشواکشی (prefetch) Mips
- xandesperf
- @tab 5.0 @tab افزونه کارایی Andes
- xandesbfhcvt
- @tab 5.0 @tab افزونه تبدیل bfloat16 در Andes
- xandesvbfhcvt
- @tab 5.0 @tab افزونه برداری تبدیل bfloat16 در Andes
- xandesvsintload
- @tab 5.0 @tab افزونه برداری بارگذاری INT4 در Andes
- xandesvpackfph
- @tab 5.0 @tab افزونه برداری بستهبندیشده FP16 در Andes
- xandesvdot
- @tab 5.0 @tab افزونه برداری ضرب نقطهای Andes
- xsmtvdot
- @tab 1.0 @tab افزونه برداری ضرب نقطهای SpacemiT
هنگامی که -march= مشخص نشده باشد، GCC از تنظیمات -mcpu استفاده میکند.
اگر هر دوی -march و -mcpu= مشخص نشده باشند، مقدار پیشفرض برای این آرگومان وابسته به سیستم است؛ اگر افزونهٔ معماری خاصی مد نظر شماست، باید آن را بهصورت صریح مشخص کنید.
هنگامی که مشخصات فنی RISC-V یک افزونه را وابسته به افزونههای دیگر تعریف کرده باشد، چنانچه آن افزونهها بهطور صریح اضافه نشده باشند، GCC بهصورت ضمنی افزونههای وابسته را به مجموعه افزونههای فعالشده اضافه میکند.
نام هسته (Core Name)
- -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-p450,
sifive-p670,
thead-c906,
xt-c908,
xt-c908v,
xt-c910,
xt-c910v2,
xt-c920,
xt-c920v2,
tt-ascalon-x,
tt-ascalon-d8,
xiangshan-nanhu,
xiangshan-kunminghu,
mips-p8700,
andes-n22,
andes-n25,
andes-a25,
andes-nx25,
andes-ax25,
andes-a27,
andes-ax27,
andes-n225,
andes-d23,
andes-n45,
andes-nx45,
andes-a45,
andes-ax45,
spacemit-x60.
توجه داشته باشید که -mcpu گزینههای -march یا -mtune را لغو (بازنویسی) نمیکند.
نام تنظیم (Tune Name).IP -mtune=processor-string 4 بهینهسازی خروجی برای پردازنده دادهشده، که بر اساس ریزمعماری یا نام پردازنده مشخص تعیین میشود. مقادیر مجاز برای این گزینه عبارتند از:
generic،
rocket،
sifive-3-series،
sifive-5-series،
sifive-7-series،
sifive-p400-series،
sifive-p600-series،
tt-ascalon-x،
tt-ascalon-d8،
thead-c906،
xt-c908،
xt-c908v،
xt-c910،
xt-c910v2،
xt-c920،
xt-c920v2،
xiangshan-nanhu،
xiangshan-kunminghu،
spacemit-x60،
generic-ooo،
size،
mips-p8700،
andes-25-series،
andes-23-series،
andes-45-series،
و تمام گزینههای معتبر برای -mcpu=.
هنگامی که -mtune= مشخص نشده باشد، GCC از تنظیمات -mcpu استفاده میکند. اگر هیچکدام مشخص نشده باشند، مقدار پیشفرض generic است.
انتخاب size برای استفاده کاربران نهایی در نظر گرفته نشده است. این گزینه هنگامی که -Os مشخص شده باشد استفاده میشود. این مقدار اطلاعات هزینه دستورالعمل ارائهشده توسط -mtune= را بازنویسی میکند، اما اطلاعات خط لوله (pipeline) را بازنویسی نمیکند. این کار به کاهش اندازه کد در عین حفظ کارایی مناسب کمک میکند.
- -mpreferred-stack-boundary=num
- تلاش برای
تراز
نگهداشتن
مرز پشته
روی مرز ۲
به توان num
بایت. اگر
-mpreferred-stack-boundary مشخص
نشده باشد،
پیشفرض ۴
است (۱۶
بایت یا ۱۲۸
بیت).
هشدار: اگر از این سوییچ استفاده میکنید، باید تمام پودمانها، از جمله کتابخانهها را با همین مقدار بسازید. این امر شامل کتابخانههای سیستم و پودمانهای راهاندازی نیز میشود.
- -msmall-data-limit=n
- قرار دادن دادههای سراسری و ایستای کوچکتر از n بایت درون یک بخش ویژه (در برخی اهداف).
- -msave-restore
- -mno-save-restore
- استفاده یا عدم استفاده از کد پرولوگ و اپیلوگ کوچکتر اما کندتر که از فراخوانی توابع کتابخانهای استفاده میکند. پیشفرض، استفاده از پرولوگها و اپیلوگهای درونخطیِ سریع است.
- -mmovcc
- -mno-movcc
- تولید یا عدم تولید توالیهای کد انتقال شرطی بدون انشعاب حتی برای اهدافی که دستورالعملهای خاصی برای عملیات شرطی ندارند. در صورت فعال بودن، در جاهایی که سودمند باشد توالیهایی از عملیات ALU با استفاده از دستورالعملهای پایه ISA اعداد صحیح تولید میشود.
- -minline-atomics
- -mno-inline-atomics
- استفاده یا عدم استفاده از کد شبیهسازی اتمی زیرکلمهای (subword atomic) کوچکتر اما کندتر که از فراخوانیهای توابع libatomic استفاده میکند. پیشفرض، استفاده از عملیات اتمی زیرکلمهای درونخطیِ سریع است که نیازی به libatomic ندارند.
- -minline-strlen
- -mno-inline-strlen
- تلاش یا عدم تلاش برای درونخطی کردن فراخوانیهای "strlen" در صورت امکان. درونخطیسازی تنها در صورتی ممکن است که رشته بهدرستی تراز شده باشد و دستورالعملهای پردازش شتابیافته در دسترس باشند. پیشفرض، درونخطی کردن فراخوانیهای "strlen" است.
- -minline-strcmp
- -mno-inline-strcmp
- تلاش یا عدم تلاش برای درونخطی کردن فراخوانیهای "strcmp" در صورت امکان. درونخطیسازی تنها در صورتی ممکن است که رشتهها بهدرستی تراز شده باشند و دستورالعملهای پردازش شتابیافته در دسترس باشند. پیشفرض، درونخطی کردن فراخوانیهای "strcmp" است.
- -minline-strncmp
- -mno-inline-strncmp
- تلاش یا عدم تلاش برای درونخطی کردن فراخوانیهای "strncmp" در صورت امکان. درونخطیسازی تنها در صورتی ممکن است که رشتهها بهدرستی تراز شده باشند و دستورالعملهای پردازش شتابیافته در دسترس باشند. پیشفرض، درونخطی کردن فراخوانیهای "strncmp" است.
- -mstringop-strategy=strategy
- مشخص کردن یک راهبرد خاص برای درونخطیسازی عملیات رشته و حافظه. strategy میتواند یکی از مقادیر auto، libcall، scalar یا vector باشد.
- -mshorten-memrefs
- -mno-shorten-memrefs
- تلاش یا عدم تلاش برای بهرهگیری بیشتر از دستورالعملهای بارگذاری/ذخیره فشرده از طریق جایگزین کردن بارگذاری/ذخیرهٔ 'ثبات پایه + آفست بزرگ' با یک بارگذاری/ذخیرهٔ جدید از 'پایه جدید + آفست کوچک'. اگر پایه جدید در یک ثبات فشرده ذخیره شود، بارگذاری/ذخیره جدید نیز میتواند فشرده شود. در حال حاضر فقط بارگذاری/ذخیرههای عدد صحیح ۳۲ بیتی را هدف قرار میدهد.
- -mstrict-align
- -mno-strict-align
- تولید یا عدم تولید دسترسیهای حافظه ترازنشده. مقدار پیشفرض بسته به این که آیا پردازندهای که برای آن بهینهسازی میکنیم از دسترسی ترازنشده سریع پشتیبانی میکند یا خیر تنظیم میشود.
- -mscalar-strict-align
- -mno-scalar-strict-align
- تولید یا عدم تولید دسترسیهای حافظه ترازنشده. مقدار پیشفرض بسته به این که آیا پردازندهای که برای آن بهینهسازی میکنیم از دسترسی ترازنشده سریع پشتیبانی میکند یا خیر تنظیم میشود. این گزینه یک نام مستعار برای -mstrict-align است.
- -mvector-strict-align
- -mno-vector-strict-align
- تولید یا عدم تولید دسترسیهای حافظه برداری ترازنشده. مقدار پیشفرض روی غیرفعال تنظیم شده است، مگر آنکه پردازندهای که برای آن بهینهسازی میکنیم صراحتاً از دسترسیهای حافظه برداری با عناصر ترازنشده (element-misaligned) پشتیبانی کند.
- -mmax-vectorization
- -mno-max-vectorization
- فعال یا غیرفعال کردن بازنویسیِ مدل هزینهٔ بردارساز بهگونهای که برداریسازی همواره سودمند به نظر برسد. برخلاف -fno-vect-cost-model یا -fvect-cost-model=unlimited، این گزینه مقایسهٔ هزینه بین حالتهای مختلف برداری را خاموش نمیکند.
- -mcmodel=medlow
- تولید کد برای مدل کد medium-low. برنامه و نمادهای تعریفشدهٔ ایستای (statically defined) آن باید درون یک محدودهٔ آدرس منفرد ۲ گیبیبایتی (2 GiB) و بین آدرسهای مطلق -2 GiB و +2 GiB قرار گیرند. برنامهها میتوانند بهصورت ایستا یا پویا پیوند (link) داده شوند. این مدل کد پیشفرض است، مگر اینکه GCC با گزینهٔ --with-cmodel= جهت مشخص کردن مدل کد پیشفرضی دیگر پیکربندی شده باشد.
- -mcmodel=medany
- تولید کد
برای مدل کد
medium-any. برنامه و
نمادهای
تعریفشدهٔ
ایستای آن
باید درون
هر محدودهٔ
آدرس منفرد
۲
گیبیبایتی
(2 GiB) قرار
گیرند.
برنامهها
میتوانند
بهصورت
ایستا یا
پویا پیوند
داده شوند.
کدهای تولیدشده توسط مدل کد medium-any مستقل از موقعیت (position-independent) هستند، اما تضمینی وجود ندارد که هنگام پیوند شدن درون فایلهای اجرایی یا کتابخانههای مستقل از موقعیت، بهدرستی عمل کنند.
- -mcmodel=large
- تولید کد برای مدل کد large، که هیچ محدودیتی در اندازه یا محل قرارگیری نمادها ندارد.
- -mexplicit-relocs
- -mno-explicit-relocs
- استفاده یا عدم استفاده از عملگرهای بازآرایی (relocation) اسمبلر در هنگام کار با آدرسهای نمادین. روش جایگزین، استفاده از ماکروهای اسمبلر است که ممکن است بهینهسازی را محدود کند.
- -mrelax
- -mno-relax
- بهرهگیری از آزادسازیهای پیونددهنده (linker relaxations) جهت کاهش تعداد دستورالعملهای مورد نیاز برای تحقق آدرسهای نماد. حالت پیشفرض، استفاده از آزادسازیهای پیونددهنده است.
- -mriscv-attribute
- -mno-riscv-attribute
- تولید کردن (یا تولید نکردن) ویژگیهای RISC-V جهت ثبت اطلاعات بیشتر در شیءهای ELF. این قابلیت حداقل به binutils نسخهٔ 2.32 نیاز دارد.
- -mcsr-check
- -mno-csr-check
- بررسی ثباتهای کنترل و وضعیت (CSR) را فعال یا غیرفعال میکند.
- -momit-leaf-frame-pointer
- اشارهگر فریم (frame pointer) را در توابع برگ (leaf functions) در ثبات نگه نمیدارد. این کار از اجرای دستورالعملهای ذخیره، برپاسازی و بازیابی اشارهگرهای فریم جلوگیری کرده و یک ثبات اضافی در توابع برگ در دسترس قرار میدهد.
- -malign-data=type
- نحوهٔ تراز کردن متغیرها و ثابتهای آرایهای، ساختاری (structure) یا دادههای اشتراکی (union) توسط GCC را کنترل میکند. مقادیر پشتیبانیشده برای type عبارتاند از xlen که از پهنای ثبات x بهعنوان مقدار تراز استفاده میکند، و natural که تراز طبیعی را به کار میگیرد. پیشفرض xlen است.
- -mbig-endian
- تولید کد با ترتیب بایت بزرگبایان (big-endian). زمانی که GCC برای یک هدف riscv64be-*-* یا riscv32be-*-* پیکربندی شده باشد، این حالت پیشفرض است. پشتیبانی از بزرگبایان در RISC-V آزمایشی است؛ ABI آن هنوز پایدار نیست و ممکن است در نسخههای بعدی دستخوش تغییرات ناسازگار شود.
- -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. این حالت پیشفرض است.
- -mrvv-vector-bits=value
- نحوهٔ تفسیر تعداد بیتهای یک ثبات برداری RVV که از گزینهٔ -march= دریافت شده را مشخص میکند. پارامتر value بهصورت یک کلمهٔ کلیدی رشتهای تعیین میشود و میتواند یکی از مقادیر scalable یا zvl باشد. پیشفرض scalable است که به GCC دستور میدهد این مقدار را بهعنوان حداقل در نظر بگیرد، در حالی که zvl به GCC اعلام میکند دقیقاً از همان تعداد بیت مشخصشده استفاده کند.
- -mrvv-max-lmul=value
- این گزینه امکان کنترل صریح بیشینهٔ ضریب طول (LMUL) مورد استفاده در تولید کد برای افزونههای برداری RISC-V (یا RVV) را فراهم میآورد. پارامتر value بهصورت یک کلمهٔ کلیدی رشتهای تعیین میشود و میتواند یکی از مقادیر m1، m2، m4، m8 یا dynamic باشد. مقدار پیشفرض بهمنظور سازگاری با سختافزارهای موجود که از گزینههای دیگر پشتیبانی نمیکنند، m1 است.
- -madjust-lmul-cost
- -mno-adjust-lmul-cost
- این گزینه مدل هزینهٔ مورد استفاده برای زمانبندی دستورالعملهای برداری را بهگونهای تنظیم میکند که تأخیر (latency) دستورالعملها را در ضریب طول RVV، یعنی LMUL، ضرب کند. این گزینه بهطور پیشفرض غیرفعال است.
- -mautovec-segment
- -mno-autovec-segment
- فعال یا غیرفعال کردن تولید دستورالعملهای برداری بارگذاری/ذخیرهسازی قطعه (segment load/store). این گزینه بهطور پیشفرض فعال است.
گزینههای 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=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" برای استفاده در گردانندههای وقفه رزرو شدهاند. با فعال بودن این گزینه، این ثباتها میتوانند در توابع عادی نیز استفاده شوند.
- -mrelax
- -mno-relax
- فعال/غیرفعال کردن بازچینی (relaxation) در اسمبلر و پیونددهنده. این گزینه به طور پیشفرض در -Os فعال است.
- -mes0
- فرض میکند مقدار "ES" در تمام طول اجرای برنامه صفر است و از آن برای آدرسدهی دادههای فقطخواندنی استفاده میکند.
- -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 تعریف شدهاند:
- -mcpu=cpu_type
- نوع
معماری،
نحوهٔ
استفاده از
ثباتها، و
پارامترهای
زمانبندی
دستورالعمل
را برای نوع
ماشین 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، future، powerpc،
powerpc64، powerpc64le، rs64،
و native.
گزینههای -mcpu=powerpc، -mcpu=powerpc64، و -mcpu=powerpc64le انواع ماشین با معماری PowerPC خالص ۳۲-بیتی (با هر ترتیبی از بایت)، PowerPC ۶۴-بیتی big endian، و PowerPC ۶۴-بیتی little endian را با فرض یک مدل پردازندهٔ عمومی و مناسب برای اهداف زمانبندی مشخص میکنند.
تعیین native به عنوان نوع پردازنده، گزینهٔ معماری متناظر با پردازندهٔ میزبان سیستمی را که عمل کامپایل را انجام میدهد شناسایی و انتخاب میکند. -mcpu=native در صورتی که GCC پردازنده را شناسایی نکند، اثری نخواهد داشت.
سایر گزینهها یک پردازندهٔ خاص را مشخص میکنند. کدی که تحت این گزینهها تولید میشود روی همان پردازنده به بهترین شکل اجرا میشود و ممکن است روی پردازندههای دیگر به هیچ وجه اجرا نشود.
گزینههای -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 -mdense-math -mrop-protect
گزینههای خاص تعیینشده برای هر پردازندهٔ مشخص بین نگارشهای مختلف کامپایلر متفاوت است و بستگی به این دارد که چه تنظیمی کد بهینهتری برای آن پردازنده تولید میکند؛ این لزوماً نمایانگر قابلیتهای واقعی سختافزار نیست. اگر مایل به تنظیم یک گزینهٔ جداگانه روی مقداری مشخص هستید، میتوانید آن را پس از گزینهٔ -mcpu تعیین کنید؛ مانند -mcpu=970 -mno-altivec.
در AIX، گزینههای -maltivec و -mpowerpc64 در حال حاضر توسط گزینهٔ -mcpu فعال یا غیرفعال نمیشوند زیرا AIX پشتیبانی کاملی از این گزینهها ندارد. اگر مطمئن هستید که در محیط شما کار خواهد کرد، همچنان میتوانید آنها را به طور مستقل فعال یا غیرفعال کنید.
در موارد دیگر، توصیه میکنیم به جای گزینههایی که تولید دستورالعملهای خاص را کنترل میکنند، از گزینهٔ -mcpu=cpu_type استفاده کنید.
- -mtune=cpu_type
- پارامترهای زمانبندی دستورالعمل را برای نوع ماشین cpu_type تنظیم میکند، اما برخلاف -mcpu=cpu_type نوع معماری یا نحوهٔ استفاده از ثباتها را تغییر نمیدهد. همان مقادیر مربوط به cpu_type که برای -mcpu به کار میروند، برای -mtune نیز استفاده میشوند. اگر هر دو مشخص شوند، کد تولید شده از معماری و ثباتهای تعیینشده توسط -mcpu، اما از پارامترهای زمانبندی تنظیمشده توسط -mtune استفاده میکند.
- -mpowerpc64
- -mno-powerpc64
- گزینهٔ -mpowerpc64 به GCC اجازه میدهد دستورالعملهای ۶۴-بیتی اضافی موجود در معماری کامل PowerPC64 را تولید کرده و با ثباتهای عمومی (GPRها) به عنوان مقادیر ۶۴-بیتی و کلمهٔ مضاعف (doubleword) رفتار کند. حالت پیشفرض در GCC گزینهٔ -mno-powerpc64 است.
- -mcmodel=small
- کد PowerPC64 را برای مدل small تولید میکند: جدول TOC به 64k محدود است.
- -mcmodel=medium
- کد PowerPC64 را برای مدل medium تولید میکند: اندازهٔ TOC و سایر دادههای ایستا میتواند در مجموع تا 4G باشد. این حالت پیشفرض برای لینوکس ۶۴-بیتی است.
- -mcmodel=large
- کد PowerPC64 را برای مدل large تولید میکند: اندازهٔ TOC میتواند تا 4G باشد. سایر دادهها و کدها تنها توسط فضای آدرسدهی ۶۴-بیتی محدود میشوند.
- -mprofile-kernel
- این گزینه در اهداف PowerPC64 GNU/Linux در دسترس است. هنگامی که همراه با -pg استفاده شود، موجب میشود فراخوانیهای "mcount" به جای بعد از مقدمهٔ تابع، قبل از آن درج شوند.
- -maltivec
- -mno-altivec
- کدی تولید
میکند که
از
دستورالعملهای
AltiVec استفاده
میکند
(استفاده
نمیکند)، و
همچنین
استفاده از
توابع
درونی (built-in) را
فعال
میکند که
دسترسی
مستقیمتری
به مجموعه
دستورالعملهای
AltiVec را ممکن
میسازند.
ممکن است
برای تطبیق
ABI فعلی با
بهبودهای ABI
مربوط به AltiVec،
به تنظیم
-mabi=altivec نیز
نیاز داشته
باشید.
هنگامی که -maltivec استفاده میشود، ترتیب عناصر برای توابع ذاتی (intrinsics) AltiVec مانند "vec_splat"، "vec_extract" و "vec_insert" با ترتیب عناصر آرایه متناظر با اندیاننس (endianness) مقصد تطابق دارد. بدین معنا که عنصر صفر در هدفگیری یک پلتفرم big-endian نشاندهنده چپترین عنصر در یک ثبات برداری، و در پلتفرم little-endian نشاندهنده راستترین عنصر در یک ثبات برداری است.
- -mpowerpc-gpopt
- -mno-powerpc-gpopt
- تعیین -mpowerpc-gpopt به GCC اجازه میدهد از دستورالعملهای اختیاری معماری PowerPC در گروه General Purpose، شامل جذر ممیز شناور، استفاده کند. تعیین
- -mpowerpc-gfxopt
- -mno-powerpc-gfxopt
- -mpowerpc-gfxopt به GCC اجازه میدهد از دستورالعملهای اختیاری معماری PowerPC در گروه Graphics، شامل انتخاب ممیز شناور (floating-point select)، استفاده کند.
- -mmfcrf
- -mno-mfcrf
- گزینه -mmfcrf به GCC اجازه میدهد دستورالعمل انتقال از فیلد ثبات شرطی (move from condition register field) پیادهسازیشده روی پردازنده POWER4 و سایر پردازندههای پشتیبانیکننده از معماری PowerPC V2.01 را تولید کند.
- -mpopcntb
- -mno-popcntb
- گزینه -mpopcntb به GCC اجازه میدهد دستورالعملهای popcount و تخمین معکوس ممیز شناور با دقت مضاعف (double-precision FP reciprocal estimate) پیادهسازیشده روی پردازنده POWER5 و سایر پردازندههای پشتیبانیکننده از معماری PowerPC V2.02 را تولید کند.
- -mpopcntd
- -mno-popcntd
- گزینه -mpopcntd به GCC اجازه میدهد دستورالعمل popcount پیادهسازیشده روی پردازنده POWER7 و سایر پردازندههای پشتیبانیکننده از معماری PowerPC V2.06 را تولید کند.
- -mfprnd
- -mno-fprnd
- گزینه -mfprnd به GCC اجازه میدهد دستورالعملهای گرد کردن ممیز شناور به عدد صحیح (FP round to integer) پیادهسازیشده روی پردازنده +POWER5 و سایر پردازندههای پشتیبانیکننده از معماری PowerPC V2.03 را تولید کند.
- -mcmpb
- -mno-cmpb
- گزینه -mcmpb به GCC اجازه میدهد دستورالعمل مقایسه بایتها (compare bytes) پیادهسازیشده روی پردازنده POWER6 و سایر پردازندههای پشتیبانیکننده از معماری PowerPC V2.05 را تولید کند.
- -mhard-dfp
- -mno-hard-dfp
- گزینه -mhard-dfp به GCC اجازه میدهد دستورالعملهای سختافزاری ممیز شناور دهدهی (decimal floating-point) پیادهسازیشده در برخی پردازندههای POWER را تولید کند.
- -mvrsave
- -mno-vrsave
- هنگام تولید کد AltiVec، دستورالعملهای VRSAVE را تولید میکند.
- -msecure-plt
- کدی تولید میکند که به ld و ld.so اجازه میدهد تا فایلهای اجرایی و کتابخانههای اشتراکی را با بخشهای غیرقابلاجرای ".plt" و ".got" بسازند. این یک گزینه ABI مربوط به PowerPC 32-bit SYSV است.
- -mbss-plt
- کدی تولید میکند که از یک بخش BSS ".plt" استفاده میکند که توسط ld.so پر میشود، و نیازمند بخشهای ".plt" و ".got" است که هم قابلنوشتن و هم قابلاجرا باشند. این یک گزینه ABI مربوط به PowerPC 32-bit SYSV است.
- -msplit-patch-nops
- هنگام افزودن NOPها برای یک ناحیه قابل وصلهزدن از طریق گزینه -fpatchable-function-entry، دستورات NOP «پیشین» را قبل از نقطه ورود سراسری (global entry point) و دستورات NOP «پسین» را پس از نقطه ورود محلی (local entry point) درج میکند. این کار باعث میشود توالی NOPها در زمان تولید نقطه ورود سراسری غیرمتوالی باشد. بدون این گزینه، NOPها مستقیماً قبل و بعد از نقطه ورود محلی درج میشوند، که آنها را متوالی میکند اما نقطه ورود سراسری و محلی را از یکدیگر دورتر میسازد. اگر تنها یک نقطه ورود منفرد تولید شود، این گزینه هیچ اثری ندارد.
- -misel
- -mno-isel
- این گزینه تولید دستورالعملهای ISEL را فعال یا غیرفعال میکند.
- -mvsx
- -mno-vsx
- کدی تولید میکند که از دستورالعملهای برداری/اسکالر (VSX) استفاده میکند (استفاده نمیکند)، و همچنین استفاده از توابع درونی (built-in) را فعال میکند که دسترسی مستقیمتری به مجموعه دستورالعملهای VSX را ممکن میسازند.
- -mcrypto
- -mno-crypto
- استفاده از توابع درونی که دسترسی مستقیم به دستورالعملهای رمزنگاری اضافهشده در نسخه 2.07 از ISA معماری PowerPC را ممکن میسازند فعال (غیرفعال) میکند.
- -mhtm
- -mno-htm
- استفاده از توابع درونی که دسترسی مستقیم به دستورالعملهای حافظه تراکنشی سختافزاری (HTM) اضافهشده در نسخه 2.07 از ISA معماری PowerPC را ممکن میسازند فعال (غیرفعال) میکند.
- -mpower8-fusion
- -mno-power8-fusion
- کدی تولید میکند که برخی عملیاتهای عدد صحیح را مجاور هم نگه میدارد (نگه نمیدارد) تا بتوان این دستورالعملها را در پردازندههای power8 و جدیدتر با یکدیگر ادغام کرد.
- -mquad-memory
- -mno-quad-memory
- کدی تولید میکند که از دستورالعملهای حافظه کلمه چهارگانه (quad word) غیراتمیک استفاده میکند (استفاده نمیکند). گزینه -mquad-memory نیازمند استفاده از حالت 64-bit است.
- -mquad-memory-atomic
- -mno-quad-memory-atomic
- کدی تولید میکند که از دستورالعملهای حافظه کلمه چهارگانه (quad word) اتمیک استفاده میکند (استفاده نمیکند). گزینه -mquad-memory-atomic نیازمند استفاده از حالت 64-bit است..IP -mfloat128 4
- -mno-float128
- فعال/غیرفعال
کردن
کلیدواژه
__float128 برای
ممیز شناور
۱۲۸ بیتی IEEE و
استفاده از
شبیهسازی
نرمافزاری
یا
دستورالعملهای
سختافزاری
برای ممیز
شناور ۱۲۸
بیتی IEEE.
برای استفاده از پشتیبانی ممیز شناور ۱۲۸ بیتی IEEE، مجموعه دستورالعملهای VSX (-mvsx) باید فعال باشد. ممیز شناور ۱۲۸ بیتی IEEE تنها روی Linux پشتیبانی میشود.
گزینه -mfloat128 بهطور پیشفرض در سیستمهای PowerPC Linux که از مجموعه دستورالعملهای VSX استفاده میکنند فعال، و در سایر سیستمها غیرفعال است.
اگر از مجموعه دستورالعملهای ISA 3.0 (-mcpu=power9) روی یک سیستم ۶۴ بیتی استفاده کنید، پشتیبانی ممیز شناور ۱۲۸ بیتی IEEE همچنین تولید دستورالعملهای ممیز شناور ۱۲۸ بیتی ISA 3.0 IEEE را فعال میکند. در غیر این صورت، اگر تولید دستورالعملهای ISA 3.0 را مشخص نکنید یا یک سیستم ۳۲ بیتی big-endian را هدف قرار دهید، ممیز شناور ۱۲۸ بیتی IEEE با شبیهسازی نرمافزاری مدیریت میشود.
- -mfloat128-hardware
- -mno-float128-hardware
- فعال/غیرفعال
کردن
استفاده از
دستورالعملهای
سختافزاری
ISA 3.0 برای
پشتیبانی
از نوع
دادهی __float128.
گزینه -mfloat128-hardware بهطور پیشفرض در سیستمهای PowerPC Linux که از مجموعه دستورالعملهای ISA 3.0 استفاده میکنند فعال، و در سایر سیستمها غیرفعال است.
- -m32
- -m64
- تولید کد برای محیطهای ۳۲ بیتی یا ۶۴ بیتی مقصدهای Darwin و SVR4 (شامل GNU/Linux). محیط ۳۲ بیتی مقادیر int، long و اشارهگر را روی ۳۲ بیت تنظیم میکند و کدی تولید مینماید که روی هر نوعی از PowerPC اجرا میشود. محیط ۶۴ بیتی int را روی ۳۲ بیت و long و اشارهگر را روی ۶۴ بیت تنظیم میکند، و همانند -mpowerpc64 کدی برای PowerPC64 تولید مینماید.
- -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 جلوگیری میکند و -mno-sum-in-toc کامپایلر GCC را وادار میسازد تا به جای قرار دادن مجموع یک آدرس و یک ثابت در TOC، کدی برای محاسبه آن در زمان اجرا تولید کند. میتوانید یک یا هر دوی این گزینهها را مشخص کنید. هر کدام از آنها به بهای صرفهجویی در فضای TOC، باعث میشوند GCC کدی اندکی کندتر و بزرگتر تولید کند.
اگر با وجود مشخص کردن هر دوی این گزینهها همچنان فضای TOC تمام شد، به جای آنها -mminimal-toc را مشخص کنید. این گزینه باعث میشود GCC برای هر فایل تنها یک مدخل TOC ایجاد کند. در صورت استفاده از این گزینه، GCC کدی تولید میکند که کندتر و حجیمتر است اما فضای فوقالعاده اندکی از TOC را مصرف میکند. شاید مایل باشید از این گزینه تنها برای فایلهایی استفاده کنید که شامل کدهای با دفعات اجرای کمتر هستند.
- -maix64
- -maix32
- فعالسازی ABI و قرارداد فراخوانی ۶۴ بیتی AIX: اشارهگرهای ۶۴ بیتی، نوع "long" ۶۴ بیتی، و زیرساخت مورد نیاز برای پشتیبانی از آنها. مشخص کردن -maix64 بهطور ضمنی به معنای -mpowerpc64 است، در حالی که -maix32 رابط ABI شصت و چهار بیتی را غیرفعال کرده و بهطور ضمنی شامل -mno-powerpc64 است. پیشفرض GCC گزینه -maix32 است.
- -mxl-compat
- -mno-xl-compat
- تولید کدی
که در زمان
استفاده از
ABI سازگار با
AIX، تطابق
بیشتری با
معناشناسی
کامپایلر IBM XL
دارد.
آرگومانهای
ممیز شناور
علاوه بر
FPRهای
آرگومان،
فراتر از
ناحیه
ذخیره ثبات
(RSA) روی پشته (stack)
به توابع
دارای
پیشنمونه
ارسال
میشوند. در
زمان
مقایسه
مقادیر و
تبدیل به double،
فرض نکنید
که double با
بیشترین
ارزش در
مقدار long double صد
و بیست و
هشت بیتی
بهدرستی
گرد شده
است. از نام
نمادهای XL
برای
روالهای
پشتیبانی long
double استفاده
میکند.
قرارداد فراخوانی AIX برای مدیریت یک حالت مبهم در استاندارد K&R C که تابعی آدرس آرگومانهایش را با تعداد آرگومانی کمتر از مقدار اعلانشده دریافت میکند، گسترش یافت اما در ابتدا مستند نشد. کامپایلرهای IBM XL هنگامی که یک زیرروال بدون بهینهسازی کامپایل میشود، به آرگومانهای ممیز شناوری که در RSA جای نمیگیرند از طریق پشته دسترسی پیدا میکنند. از آنجا که ذخیره همیشگی آرگومانهای ممیز شناور روی پشته ناکارآمد است و بهندرت نیاز میشود، این گزینه بهطور پیشفرض فعال نیست و تنها زمان فراخوانی زیرروالهای کامپایلشده توسط کامپایلرهای IBM XL بدون بهینهسازی ضرورت دارد.
- -mpe
- پشتیبانی از IBM RS/6000 SP Parallel Environment (PE). برنامهای را که برای استفاده از ارسال پیام نوشته شده است با کد راهانداز ویژهای پیوند میدهد تا اجرای برنامه امکانپذیر شود. سیستم باید PE را در مکان استاندارد (/usr/lpp/ppe.poe/) نصب داشته باشد، یا فایل specs باید با استفاده از گزینه -specs= بازنویسی شود تا مسیر دایرکتوری مناسب مشخص گردد. محیط موازی (Parallel Environment) از رشتهها (threads) پشتیبانی نمیکند، بنابراین گزینه -mpe و گزینه -pthread با یکدیگر ناسازگار هستند.
- -malign-natural
- -malign-power
- در
سیستمهای
AIX، نسخه ۳۲
بیتی Darwin، و
نسخه ۶۴
بیتی PowerPC GNU/Linux،
گزینه -malign-natural
ترازبندی
تعریفشده
توسط ABI را
برای انواع
بزرگتر،
مانند doubleهای
ممیز
شناور، بر
روی مرز
طبیعی
مبتنی بر
اندازه
آنها
نادیده
گرفته و
بازنویسی
میکند.
گزینه -malign-power
به GCC دستور
میدهد تا
از قوانین
ترازبندی
مشخصشده
در ABI پیروی
کند.
پیشفرض GCC
ترازبندی
استانداردی
است که در ABI
تعریف شده
است.
در Darwin ۶۴ بیتی، ترازبندی طبیعی (natural alignment) پیشفرض است و گزینه -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) و ذخیره آدرس قاب قبلی وجود دارد؛ این بدان معناست کدی که قاب پشته را در جریان وقفهها یا سیگنالها پیمایش میکند ممکن است دادههای مخدوش دریافت کند.
- -mavoid-indexed-addresses
- -mno-avoid-indexed-addresses
- تولید کدی که تلاش میکند از دستورالعملهای بارگذاری یا ذخیرهسازی نمایهدار (indexed) اجتناب کند (اجتناب نکند). این دستورالعملها در شرایط خاصی مانند پیمایش آرایههای بزرگی که از مرز 16M عبور میکنند، میتوانند روی پردازندههای Power6 افت کارایی به همراه داشته باشند. این گزینه هنگام هدفگیری Power6 بهطور پیشفرض فعال و در غیر این صورت غیرفعال است..IP -mfused-madd 4
- -mno-fused-madd
- تولید کدی که از دستورالعملهای ضرب و انباشت (multiply and accumulate) ممیز شناور استفاده میکند (یا نمیکند). در صورت استفاده از ممیز شناور سختافزاری، این دستورالعملها به صورت پیشفرض تولید میشوند. گزینه وابسته به ماشینِ -mfused-madd اکنون به گزینه مستقل از ماشینِ -ffp-contract=fast نگاشت شده است، و -mno-fused-madd به -ffp-contract=off نگاشت میشود.
- -mmulhw
- -mno-mulhw
- تولید کدی که در پردازندههای IBM 405، 440، 464 و 476 از دستورالعملهای ضرب و ضرب-انباشت نیمکلمه (half-word) استفاده میکند (یا نمیکند). هنگام هدفگیری این پردازندهها، این دستورالعملها به صورت پیشفرض تولید میشوند.
- -mdlmzb
- -mno-dlmzb
- تولید کدی که در پردازندههای IBM 405، 440، 464 و 476 از دستورالعمل جستجوی رشتهی dlmzb استفاده میکند (یا نمیکند). هنگام هدفگیری این پردازندهها، این دستورالعمل به صورت پیشفرض تولید میشود.
- -mno-bit-align
- -mbit-align
- در
سامانههای
System V.4 و PowerPC توکار
(embedded)،
ساختارها
(structures) و
اجتماعهایی
(unions) که شامل
میدانهای
بیتی (bit-fields)
هستند را
مجبور به
تراز شدن با
نوع پایه
میدان بیتی
نمیکند
(میکند).
به عنوان مثال، به طور پیشفرض ساختاری که تنها شامل ۸ میدان بیتی "unsigned" با طول ۱ است، در مرز ۴ بایتی تراز شده و اندازهای برابر ۴ بایت دارد. با استفاده از -mno-bit-align، ساختار در مرز ۱ بایتی تراز شده و اندازه آن ۱ بایت خواهد بود.
- -mbit-word
- -mno-bit-word
- اجازه دادن به میدانهای بیتی برای عبور از مرزهای کلمه (word).
- -mno-strict-align
- -mstrict-align
- در سامانههای System V.4 و PowerPC توکار، فرض نمیکند (میکند) که ارجاعات حافظه ناتراز (unaligned) توسط سامانه مدیریت میشوند.
- -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 پیوند داده شوند.
- -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
- این گزینه مشخص میکند که در طول زمانبندی دستورالعملها، کدام وابستگیها توسط هدف پرهزینه (costly) در نظر گرفته شوند. آرگومان dependence_type یکی از مقادیر زیر را میپذیرد:
- no
- هیچ وابستگیای پرهزینه نیست.
- all
- تمام وابستگیها پرهزینه هستند.
- true_store_to_load
- یک وابستگی واقعی از ذخیره به بارگذاری (store to load) پرهزینه است.
- store_to_load
- هرگونه وابستگی از ذخیره به بارگذاری پرهزینه است.
- number
- هر وابستگیای که زمان تأخیر (latency) آن بزرگتر یا مساوی با number باشد، پرهزینه است.
- -minsert-sched-nops=scheme
- این گزینه مشخص میکند که از کدام طرح درج NOP در طول دومین مرحله زمانبندی استفاده شود. آرگومان scheme یکی از مقادیر زیر را میپذیرد:
- no
- NOP درج نشود.
- pad
- طبق گروهبندی زمانبند، هر گروه گسیلی که شیارهای صدور (issue slots) خالی داشته باشد با NOP پر شود.
- regroup_exact
- درج NOP برای انتقال اجباری دستورالعملهای دارای وابستگی پرهزینه به گروههای مجزا. طبق گروهبندی تخمینی پردازنده، دقیقاً به همان تعداد لازم NOP درج میشود تا یک دستورالعمل به گروه جدید منتقل شود.
- number
- درج NOP برای انتقال اجباری دستورالعملهای دارای وابستگی پرهزینه به گروههای مجزا. به تعداد number دستور NOP درج میشود تا یک دستورالعمل به گروه جدید منتقل شود.
- -mcall-sysv
- در سامانههای System V.4 و PowerPC توکار، کد را با استفاده از قراردادهای فراخوانی منطبق بر پیشنویس مارس ۱۹۹۵ از مکمل پردازنده PowerPC برای رابط باینری کاربردی System V کامپایل میکند. این حالت پیشفرض است مگر اینکه GCC را با استفاده از powerpc-*-eabiaix پیکربندی کرده باشید..IP -mcall-sysv-eabi 4
- -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 توکار، کد را برای سامانهٔ گنو بر پایهٔ لینوکس (Linux-based GNU) کامپایل میکند.
- -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
- تمام ساختارها (structures) را در حافظه برمیگرداند (همانطور که توسط ABI مربوط به AIX مشخص شده است).
- -msvr4-struct-return
- ساختارهای کوچکتر از ۸ بایت را در ثباتها برمیگرداند (همانطور که توسط SVR4 ABI مشخص شده است).
- -mabi=abi-type
- گسترش ABI فعلی با یک افزونهٔ خاص، یا حذف چنین افزونهای. مقدارهای معتبر عبارتند از: altivec، no-altivec، ibmlongdouble، ieeelongdouble، elfv1، elfv2، و برای AIX: vec-extabi، vec-default.
- -mabi=ibmlongdouble
- تغییر دادن ABI فعلی برای استفاده از long double با دقت گسترشیافتهٔ IBM. اگر پیشفرض سامانهٔ شما استفاده از long double با دقت گسترشیافتهٔ IEEE باشد، به احتمال زیاد این گزینه کار نخواهد کرد. اگر نوع long double را از دقت گسترشیافتهٔ IEEE تغییر دهید، کامپایلر هشداری صادر میکند مگر آنکه از گزینهٔ -Wno-psabi استفاده کنید. نیازمند فعال بودن -mlong-double-128 است.
- -mabi=ieeelongdouble
- تغییر دادن ABI فعلی برای استفاده از long double با دقت گسترشیافتهٔ IEEE. اگر پیشفرض سامانهٔ شما استفاده از long double با دقت گسترشیافتهٔ IBM باشد، به احتمال زیاد این گزینه کار نخواهد کرد. اگر نوع long double را از دقت گسترشیافتهٔ IBM تغییر دهید، کامپایلر هشداری صادر میکند مگر آنکه از گزینهٔ -Wno-psabi استفاده کنید. نیازمند فعال بودن -mlong-double-128 است.
- -mabi=elfv1
- تغییر دادن ABI فعلی برای استفاده از ELFv1 ABI. این ABI پیشفرض برای لینوکس ۶۴ بیتی 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" برای اشاره به یک ناحیهٔ دادههای کوچک منفرد استفاده میکند. اگر GCC را با استفاده از یکی از گزینههای powerpc*-*-eabi* پیکربندی کرده باشید، گزینهٔ -meabi بهطور پیشفرض فعال است.
- -msdata=eabi
- در سامانههای System V.4 و PowerPC توکار، دادههای کوچک سراسری و ایستای "const" و مقداردهی اولیه شده را در بخش ".sdata2" قرار میدهد، که توسط ثبات "r2" به آن اشاره میشود. دادههای کوچک سراسری و ایستای مقداردهی اولیه شدهٔ غیر-"const" را در بخش ".sdata" قرار میدهد، که توسط ثبات "r13" به آن اشاره میشود. دادههای کوچک سراسری و ایستای مقداردهینشده را در بخش ".sbss" قرار میدهد، که مجاور بخش ".sdata" است. گزینهٔ -msdata=eabi با گزینهٔ -mrelocatable ناسازگار است. گزینهٔ -msdata=eabi همچنین گزینهٔ -memb را نیز فعال میکند.
- -msdata=sysv
- در سامانههای System V.4 و PowerPC توکار، دادههای کوچک سراسری و ایستا را در بخش ".sdata" قرار میدهد، که توسط ثبات "r13" به آن اشاره میشود. دادههای کوچک سراسری و ایستای مقداردهینشده را در بخش ".sbss" قرار میدهد، که مجاور بخش ".sdata" است. گزینهٔ -msdata=sysv با گزینهٔ -mrelocatable ناسازگار است.
- -msdata=default
- -msdata
- در سامانههای System V.4 و PowerPC توکار، اگر -meabi استفاده شده باشد، کد را مانند -msdata=eabi کامپایل میکند، در غیر این صورت کد را مانند -msdata=sysv کامپایل میکند.
- -msdata=data
- در سامانههای System V.4 و PowerPC توکار، دادههای کوچک سراسری را در بخش ".sdata" قرار میدهد. دادههای کوچک سراسری مقداردهینشده را در بخش ".sbss" قرار میدهد. با این حال، از ثبات "r13" برای آدرسدهی دادههای کوچک استفاده نمیکند. این رفتار پیشفرض است مگر آنکه از گزینههای دیگر -msdata استفاده شود..IP -msdata=none 4
- -mno-sdata
- در سیستمهای تعبیهشدهٔ PowerPC، تمام دادههای سراسری و ایستای مقداردهیشده را در بخش ".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
- بهطور
پیشفرض
فرض میکند
که تمام
فراخوانیها
دوردست
هستند،
بهطوری که
توالی
فراخوانی
طولانیتر
و
پرهزینهتری
مورد نیاز
است. این
کار برای
فراخوانیهای
دورتر از ۳۲
مگابایت
(۳۳٬۵۵۴٬۴۳۲
بایت) از
مکان فعلی
لازم است.
اگر
کامپایلر
تشخیص دهد
که
فراخوانی
نمیتواند
تا این
اندازه دور
باشد، یک
فراخوانی
کوتاه
تولید
میشود. این
تنظیم را
میتوان با
مشخصهٔ
تابع
"shortcall" یا
با #pragma longcall(0)
لغو کرد.
برخی از پیونددهندهها توانایی تشخیص فراخوانیهای خارج از محدوده و تولید کد واسط (glue code) بهصورت درجا را دارند. در این سیستمها، فراخوانیهای طولانی غیرضروری هستند و کد کندتری تولید میکنند. در زمان نگارش این متن، پیونددهندهٔ AIX و همچنین پیونددهندهٔ GNU برای PowerPC/64 قادر به انجام این کار هستند. برنامهریزی شده است که این ویژگی به پیونددهندهٔ GNU برای سیستمهای ۳۲ بیتی PowerPC نیز اضافه شود.
در PowerPC64 ELFv2 و سیستمهای ۳۲ بیتی PowerPC با پیونددهندههای جدیدتر GNU، نرمافزار GCC میتواند فراخوانیهای طولانی را با استفاده از یک توالی فراخوانی درونخطی PLT تولید کند (به -mpltseq مراجعه کنید). معماری PowerPC با -mbss-plt و همچنین PowerPC64 ELFv1 (موتور بزرگ / big-endian) از فراخوانیهای درونخطی PLT پشتیبانی نمیکنند.
در سیستمهای Darwin/PPC، عبارت "#pragma longcall" موجب تولید "jbsr callee, L42" بههمراه یک branch island (کد واسط) میشود. دو آدرس مقصد نمایانگر callee و branch island هستند. پیونددهندهٔ Darwin/PPC آدرس اول را ترجیح میدهد و چنانچه دستور "bl" در PPC مستقیماً به تابع فراخواندهشده برسد، یک "bl callee" تولید میکند؛ در غیر این صورت، پیونددهنده برای فراخوانی جزیرهٔ انشعاب (branch island) عبارت "bl L42" را تولید مینماید. جزیرهٔ انشعاب به انتهای بدنهٔ تابع فراخواننده پیوست میشود؛ این بخش آدرس کامل ۳۲ بیتی callee را محاسبه کرده و به آن میپرد.
در سیستمهای 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 و اشیای جابهجاشدنی (relocatable) ۳۲ بیتی PowerPC با -mbss-plt نباید با یکدیگر پیوند داده شوند.
- -mtls-markers
- -mno-tls-markers
- علامتگذاری (یا عدم علامتگذاری) فراخوانیهای "__tls_get_addr" با یک بازنشانی (relocation) که آرگومان تابع را مشخص میکند. بازنشانی به پیونددهنده اجازه میدهد تا بهمنظور بهینهسازی TLS، فراخوانی تابع را با اطمینان به دستورالعملهای راهاندازی آرگومان پیوند دهد، که این امر به نوبهٔ خود به GCC اجازه میدهد زمانبندی بهتری روی این توالی انجام دهد.
- -mrecip
- -mno-recip
- این گزینه استفاده از دستورالعملهای تخمین معکوس و تخمین ریشهٔ دوم معکوس را همراه با مراحل اضافی نیوتن-رافسون جهت افزایش دقت، بهجای انجام مستقیم تقسیم یا جذر و تقسیم برای آرگومانهای ممیز شناور، فعال میکند. هنگام استفاده از -mrecip باید از گزینهٔ -ffast-math (یا دستکم -funsafe-math-optimizations، -ffinite-math-only، -freciprocal-math و -fno-trapping-math) استفاده کنید. توجه داشته باشید در حالی که توان عملیاتی (throughput) این توالی معمولاً بالاتر از توان عملیاتی دستورالعملهای غیرمعکوس است، اما دقت این توالی میتواند برای ریشههای دوم معکوس تا 2 ulp (بهعنوان مثال، معکوس 1.0 برابر با 0.99999994 میشود) کاهش یابد.
- -mrecip=opt
- این گزینه مشخص میکند کدام دستورالعملهای تخمین معکوس میتوانند استفاده شوند. opt فهرستی از گزینهها است که با ویرگول جدا شدهاند و میتوان قبل از آنها علامت "!" قرار داد تا گزینه نقیض شود:
- all
- تمام دستورالعملهای تخمین را فعال میکند.
- default
- دستورالعملهای پیشفرض را فعال میکند که معادل با -mrecip است.
- none
- تمام دستورالعملهای تخمین را غیرفعال میکند که معادل با -mno-recip است.
- div
- دستورالعملهای تقریب معکوس را هم برای دقت تکی (single precision) و هم دقت دوگانه (double precision) فعال میکند.
- divf
- دستورالعملهای تقریب معکوس با دقت تکی را فعال میکند.
- divd
- دستورالعملهای تقریب معکوس با دقت دوگانه را فعال میکند.
- rsqrt
- دستورالعملهای تقریب معکوس ریشهٔ دوم را هم برای دقت تکی و هم دقت دوگانه فعال میکند.
- rsqrtf
- دستورالعملهای تقریب معکوس ریشهٔ دوم با دقت تکی را فعال میکند.
- rsqrtd
- دستورالعملهای تقریب معکوس ریشهٔ دوم با دقت دوگانه را فعال میکند.
بنابراین، بهعنوان مثال، -mrecip=all,!rsqrtd تمام دستورالعملهای تخمین معکوس را فعال میکند، بهجز دستورالعملهای "FRSQRTE"، "XSRSQRTEDP" و "XVRSQRTEDP" که محاسبات معکوس ریشهٔ دوم با دقت دوگانه را انجام میدهند.
- -mno-recip-precision
- فرض میکند (فرض نمیکند) که دستورالعملهای تخمین معکوس، دقتی بالاتر از آنچه توسط PowerPC ABI الزامی شده است ارائه میدهند. انتخاب -mcpu=power6، -mcpu=power7 یا -mcpu=power8 بهطور خودکار -mrecip-precision را فعال میکند. دستورالعملهای تخمین ریشه دوم با دقت مضاعف بهطور پیشفرض روی ماشینهای با دقت پایین تولید نمیشوند، چرا که تخمینی ارائه نمیدهند که پس از سه گام همگرا شود.
- -mveclibabi=type
- نوع ABI مورد استفاده را برای برداریسازی توابع درونی با استفاده از یک کتابخانه خارجی مشخص میکند. تنها نوع پشتیبانیشده در حال حاضر 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
- هنگامی که گزینهٔ -funsafe-math-optimizations برای بهینهسازی گرد کردن مقادیر ممیز شناور به عدد صحیح ۶۴ بیتی و بازگشت به ممیز شناور استفاده میشود، دستورالعمل "friz" را تولید میکند (تولید نمیکند). اگر عدد ممیز شناور بزرگتر از آن باشد که در یک عدد صحیح بگنجد، دستورالعمل "friz" مقدار یکسانی برنمیگرداند.
- -mpointers-to-nested-functions
- -mno-pointers-to-nested-functions
- کدی را برای بارگذاری ثبات زنجیره ایستا ("r11") هنگام فراخوانی از طریق یک اشارهگر در سیستمهای AIX و لینوکس ۶۴ بیتی تولید میکند (تولید نمیکند)، در مواردی که یک اشارهگر تابع به توصیفگری ۳ کلمهای اشاره میکند که حاوی آدرس تابع، مقدار TOC برای بارگذاری در ثبات "r2"، و مقدار زنجیره ایستا برای بارگذاری در ثبات "r11" است. گزینهٔ -mpointers-to-nested-functions بهطور پیشفرض فعال است. اگر از -mno-pointers-to-nested-functions استفاده کنید، نمیتوانید توابع تودرتو یا توابع کامپایلشده در زبانهای دیگر را که از زنجیره ایستا استفاده میکنند، از طریق اشارهگر فراخوانی کنید.
- -msave-toc-indirect
- -mno-save-toc-indirect
- در صورتی که تابع در سیستمهای AIX و لینوکس ۶۴ بیتی از طریق اشارهگر فراخوانی شود، کدی برای ذخیره مقدار TOC در مکان رزروشده پشته در مقدمه تابع تولید میکند (تولید نمیکند). اگر مقدار TOC در مقدمه ذخیره نشود، دقیقاً قبل از فراخوانی از طریق اشارهگر ذخیره میشود. گزینهٔ -mno-save-toc-indirect پیشفرض است.
- -mcompat-align-parm
- -mno-compat-align-parm
- کدی را جهت
ارسال
پارامترهای
ساختار با
حداکثر
تراز ۶۴
بیت، برای
سازگاری با
نسخههای
قدیمیتر
GCC، تولید
میکند
(تولید
نمیکند).
نسخههای قدیمیتر GCC (پیش از 4.9.0) به اشتباه پارامترهای ساختاری را که دارای عضوی نیازمند تراز ۱۲۸ بیتی بودند، روی مرز ۱۲۸ بیتی تراز نمیکردند. این مورد در نسخههای جدیدتر GCC اصلاح شده است. از این گزینه میتوان برای تولید کدی که با توابع کامپایلشده با نسخههای قدیمیتر GCC سازگار باشد استفاده کرد.
گزینهٔ -mno-compat-align-parm پیشفرض است.
- -mstack-protector-guard=guard
- -mstack-protector-guard-reg=reg
- -mstack-protector-guard-offset=offset
- کد حفاظت از
پشته را با
استفاده از
قناری در guard
تولید
میکند.
مکانهای
پشتیبانیشده
عبارتاند
از global برای
قناری
سراسری یا
tls برای
قناری به
ازای هر
رشته در
بلوک TLS
(پیشفرض در
GNU libc نسخهٔ 2.4 یا
بالاتر).
با انتخاب مورد دوم، گزینههای -mstack-protector-guard-reg=reg و -mstack-protector-guard-offset=offset علاوه بر این مشخص میکنند که از کدام ثبات به عنوان ثبات پایه برای خواندن قناری و از چه آفستی از آن ثبات پایه استفاده شود. پیشفرض این موارد همان است که در ABI مربوطه تعیین شده است.
- -mpcrel
- -mno-pcrel
- آدرسدهی وابسته به شمارنده برنامه (pc-relative) را تولید میکند (تولید نمیکند). گزینهٔ -mpcrel نیازمند فعال بودن مدل کد متوسط (-mcmodel=medium) و آدرسدهی پیشوندی (-mprefixed) است.
- -mprefixed
- -mno-prefixed
- حالتهای آدرسدهی را با استفاده از دستورالعملهای بارگذاری و ذخیره پیشوندی تولید میکند (تولید نمیکند). گزینهٔ -mprefixed نیازمند فعال بودن گزینهٔ -mcpu=power10 (یا بالاتر) است.
- -mmma
- -mno-mma
- دستورالعملهای MMA را تولید میکند (تولید نمیکند). گزینهٔ -mma نیازمند فعال بودن گزینهٔ -mcpu=power10 (یا بالاتر) است.
- -mdense-math
- -mno-dense-math
- دستورالعملهای Dense Math Facility (DMF) را تولید میکند (تولید نمیکند). گزینهٔ -mdense-math نیازمند فعال بودن گزینهٔ -mcpu=future (یا بالاتر) است.
- -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" تولید میکند (تولید نمیکند).
- -msplat-word-constant
- -mno-splat-word-constant
- کدی تولید میکند (تولید نمیکند) که از دستورالعمل "XXSPLTIW" استفاده میکند. این گزینه بهطور پیشفرض فعال است.
- -msplat-float-constant
- تولید (عدم تولید) کدی که از دستورالعمل "XXSPLTIDP" استفاده میکند. این گزینه بهطور پیشفرض فعال است.
- -mieee128-constant
- -mno-ieee128-constant
- تولید (عدم تولید) کدی که از دستورالعمل "LXVKQ" استفاده میکند. این گزینه بهطور پیشفرض فعال است.
- -mwarn-altivec-long
- -mno-warn-altivec-long
- فعال یا غیرفعال کردن هشدارها دربارهٔ استفاده از نوع منسوخشدهٔ vector long ... در Altivec. این گزینه بهطور پیشفرض فعال است.
گزینههای RX
این گزینههای خط فرمان برای مقصدهای RX تعریف شدهاند:
- -m64bit-doubles
- -m32bit-doubles
- تنظیم اندازهٔ نوع دادهٔ "double" روی ۶۴ بیت (-m64bit-doubles) یا ۳۲ بیت (-m32bit-doubles). مقدار پیشفرض -m32bit-doubles است. نکته: سختافزار ممیز شناور RX تنها روی مقادیر ۳۲ بیتی کار میکند، به همین دلیل پیشفرض -m32bit-doubles است.
- -fpu
- -nofpu
- استفاده از
سختافزار
ممیز شناور
RX را فعال (-fpu)
یا غیرفعال
(-nofpu) میکند.
پیشفرض
برای سری RX600
فعال و برای
سری RX200
غیرفعال
است.
با این حال، دستورالعملهای ممیز شناور تنها برای مقادیر ممیز شناور ۳۲ بیتی تولید میشوند، بنابراین در صورت استفاده از گزینهٔ -m64bit-doubles، از سختافزار FPU برای مقادیر double استفاده نمیشود.
نکته: اگر گزینهٔ -fpu فعال باشد، آنگاه -funsafe-math-optimizations نیز بهطور خودکار فعال میشود. علت این امر آن است که دستورالعملهای FPU در RX ذاتاً ناامن هستند.
- -mcpu=name
- نوع
پردازندهٔ
RX مقصد را
انتخاب
میکند. در
حال حاضر سه
نوع
پشتیبانی
میشود:
سختافزار
عمومی
سریهای RX600
و RX200 و
پردازندهٔ
خاص RX610.
مقدار
پیشفرض RX600
است.
تنها تفاوت میان RX600 و RX610 این است که RX610 از دستورالعمل "MVTIPL" پشتیبانی نمیکند.
سری RX200 فاقد واحد سختافزاری ممیز شناور است و بنابراین هنگام انتخاب این نوع، -nofpu بهطور پیشفرض فعال میشود.
- -mbig-endian-data
- -mlittle-endian-data
- دادهها (و نه کد) را در قالب big-endian ذخیره میکند. پیشفرض -mlittle-endian-data است، یعنی ذخیرهٔ دادهها در قالب little-endian.
- -msmall-data-limit=N
- حداکثر
اندازهٔ
متغیرهای
سراسری و
ایستا بر
حسب بایت را
مشخص
میکند که
میتوانند
در ناحیهٔ
دادههای
کوچک (small data area)
قرار گیرند.
استفاده از
ناحیهٔ
دادههای
کوچک
میتواند
به تولید
کدی
کوچکتر و
سریعتر
بیانجامد،
اما
اندازهٔ
این ناحیه
محدود است و
این بر
عهدهٔ
برنامهنویس
است که
اطمینان
یابد این
ناحیه
سرریز
نمیکند.
همچنین
هنگامی که
ناحیهٔ
دادههای
کوچک به کار
میرود،
یکی از
ثباتهای RX
(معمولاً
"r13") برای
اشاره به
این ناحیه
رزرو
میشود،
بنابراین
دیگر برای
استفاده
توسط
کامپایلر
در دسترس
نخواهد بود.
اگر
متغیرها
بهجای
نگهداری
در این ثبات
در پشته
قرار
گیرند، این
امر
میتواند
منجر به کدی
کندتر یا
بزرگتر
شود.
توجه داشته باشید که متغیرهای مشترک (متغیرهایی که مقداردهی اولیه نشدهاند) و مقادیر ثابت در ناحیهٔ دادههای کوچک قرار نمیگیرند، چرا که به بخشهای دیگری در فایل اجرایی خروجی اختصاص مییابند.
مقدار پیشفرض صفر است که این ویژگی را غیرفعال میکند. توجه داشته باشید که این ویژگی در سطوح بهینهسازی بالاتر (-O2 و غیره) بهطور پیشفرض فعال نمیشود، زیرا رزرو کردن یک ثبات میتواند اثرات زیانباری در پی داشته باشد. این به عهدهٔ برنامهنویس است که با آزمایش دریابد آیا این ویژگی برای برنامهاش سودمند است یا خیر. برای آگاهی از نحوهٔ انتخاب ثبات واقعی حامل اشارهگر ناحیهٔ دادههای کوچک، به توضیحات گزینهٔ -mpid مراجعه کنید.
- -msim
- -mno-sim
- استفاده از زماناجرای شبیهساز (simulator runtime). پیشفرض، استفاده از زماناجرای خاص برد libgloss است.
- -mas100-syntax
- -mno-as100-syntax
- هنگام تولید خروجی اسمبلی، از نحوی سازگار با اسمبلر AS100 شرکت Renesas استفاده میکند. این نحو توسط اسمبلر GAS نیز قابل درک است، اما محدودیتهایی دارد و به همین دلیل بهطور پیشفرض تولید نمیشود.
- -mmax-constant-size=N
- حداکثر
اندازه (بر
حسب بایت)
برای یک
ثابت را
تعیین
میکند که
میتواند
به عنوان یک
عملوند در
دستورالعمل
RX استفاده
شود. اگرچه
مجموعه
دستورالعملهای
RX اجازه
میدهد
ثابتهایی
با طول
حداکثر ۴
بایت در
دستورالعملها
به کار
روند، اما
مقدار
طولانیتر
به معنای
دستورالعمل
طولانیتر
است. بدین
ترتیب در
برخی شرایط
ممکن است
محدود کردن
اندازهٔ
ثابتهای
مورد
استفاده در
دستورالعملها
سودمند
باشد.
ثابتهایی
که بیش از
حد بزرگ
باشند، در
یک مخزن
مقادیر
ثابت (constant pool)
قرار گرفته
و از طریق
ارجاع
غیرمستقیم
ثبات (register indirection)
مورد اشاره
قرار
میگیرند.
مقدار N میتواند بین ۰ تا ۴ باشد. مقدار ۰ (پیشفرض) یا ۴ به این معناست که ثابتها با هر اندازهای مجاز هستند.
- -mrelax
- کاهشسازی پیونددهنده (linker relaxation) را فعال میکند. کاهشسازی پیونددهنده فرایندی است که در آن پیونددهنده با یافتن نگارشهای کوتاهتر از دستورالعملهای مختلف، تلاش میکند حجم برنامه را کاهش دهد. بهطور پیشفرض غیرفعال است.
- -mint-register=N
- تعداد ثباتهایی را که باید برای توابع گردانندهٔ وقفهٔ سریع (fast interrupt handler) رزرو شوند مشخص میکند. مقدار N میتواند بین ۰ تا ۴ باشد. مقدار ۱ بدین معناست که ثبات "r13" برای استفادهٔ اختصاصی گردانندههای وقفهٔ سریع رزرو میشود. مقدار ۲ ثباتهای "r13" و "r12" را رزرو میکند. مقدار ۳ ثباتهای "r13"، "r12" و "r11" را رزرو میکند، و مقدار ۴ ثباتهای "r13" تا "r10" را رزرو مینماید. مقدار ۰ (پیشفرض) هیچ ثباتی را رزرو نمیکند.
- -msave-acc-in-interrupts
- مشخص میکند که توابع گردانندهٔ وقفه باید ثبات انباشتگر (accumulator) را حفظ کنند. این کار تنها زمانی ضروری است که کدهای عادی ممکن باشد از ثبات انباشتگر استفاده کنند، برای نمونه به این دلیل که ضربهای ۶۴ بیتی انجام میدهند. پیشفرض این است که انباشتگر نادیده گرفته شود زیرا این کار گردانندههای وقفه را سریعتر میکند.
- -mpid
- -mno-pid
- تولید
دادههای
مستقل از
موقعیت (position-independent
data) را فعال
میکند. در
صورت فعال
بودن،
هرگونه
دسترسی به
دادههای
ثابت از
طریق یک
آفست نسبت
به یک نشانی
پایه که در
یک ثبات
نگهداری
میشود
انجام
میگیرد.
این امر
اجازه
میدهد
مکان
دادههای
ثابت در
زمان اجرا
تعیین شود
بدون آنکه
نیازی به
بازنشانی
مکان (relocation)
فایل
اجرایی
باشد، که
مزیتی برای
برنامههای
تعبیهشده
با
محدودیتهای
شدید حافظه
به شمار
میرود.
دادههایی
که قابل
تغییر
هستند تحت
تأثیر این
گزینه قرار
نمیگیرند.
توجه داشته باشید که استفاده از این ویژگی، یک ثبات (معمولاً "r13") را برای نشانی پایهٔ دادههای ثابت رزرو میکند. این کار میتواند بهویژه در توابع پیچیده به تولید کدی کندتر یا بزرگتر بیانجامد.
ثبات واقعیِ انتخابشده برای نگهداری نشانی پایهٔ دادههای ثابت به این بستگی دارد که آیا گزینههای خط فرمان -msmall-data-limit یا -mint-register فعال باشند یا خیر. با شروع از ثبات "r13" و پیشروی به سمت پایین، ثباتها ابتدا برای برآورده کردن نیازهای -mint-register، سپس -mpid و در نهایت -msmall-data-limit تخصیص مییابند. بنابراین این امکان وجود دارد که اگر هر دو گزینهٔ -mint-register=4 و -mpid در خط فرمان مشخص شده باشند، ثبات ناحیهٔ دادههای کوچک "r8" باشد.
این ویژگی بهطور پیشفرض فعال نیست. مقدار پیشفرض را میتوان با استفاده از گزینهٔ خط فرمان -mno-pid بازیابی کرد.
- -mno-warn-multiple-fast-interrupts
- -mwarn-multiple-fast-interrupts
- از صدور پیام هشدار توسط GCC در صورتی که هنگام کامپایل یک فایل بیش از یک گردانندهٔ وقفهٔ سریع بیابد، جلوگیری میکند. پیشفرض، صدور هشدار برای هر گردانندهٔ وقفهٔ سریعِ اضافیِ یافتشده است، چرا که RX تنها از یک وقفه از این دست پشتیبانی میکند.
- -mallow-string-insns
- -mno-allow-string-insns
- استفاده از
دستورالعملهای
دستکاری
رشتهٔ
"SMOVF"،
"SCMPU"،
"SMOVB"،
"SMOVU"،
"SUNTIL"،
"SWHILE" و
همچنین
دستورالعمل
"RMPA" را
فعال یا
غیرفعال
میکند. این
دستورالعملها
ممکن است
دادهها را
پیشواکشی
(prefetch) کنند که
در صورت
دسترسی به
یک ثبات I/O،
انجام آن
ایمن نیست.
(برای
اطلاعات
بیشتر به
بخش 12.2.7 از RX62N Group User's Manual
مراجعه
کنید).
پیشفرض، مجاز دانستن این دستورالعملها است، اما برای GCC ممکن نیست که همهٔ شرایطی را که ممکن است در آنها یک دستورالعمل رشته برای دسترسی به یک ثبات I/O به کار رود بهطور قابلاطمینان تشخیص دهد، بنابراین استفاده از آنها نمیتواند بهطور خودکار غیرفعال شود. در عوض، متکی بر برنامهنویس است که در صورت دسترسی برنامهاش به فضای I/O، از گزینهٔ -mno-allow-string-insns استفاده کند.
هنگامی که این دستورالعملها فعال باشند، GCC نماد پیشپردازندهٔ C با نام "__RX_ALLOW_STRING_INSNS__" را تعریف میکند، در غیر این صورت نماد "__RX_DISALLOW_STRING_INSNS__" را تعریف مینماید.
- -mjsr
- -mno-jsr
- استفادهٔ انحصاری (یا غیرانحصاری) از دستورالعملهای "JSR" برای دسترسی به توابع. از این گزینه میتوان هنگامی استفاده کرد که اندازهٔ کد از محدودهٔ دستورالعملهای "BSR" فراتر رود. توجه داشته باشید که -mno-jsr به معنای عدم استفاده از "JSR" نیست، بلکه به این معناست که هر نوع انشعابی ممکن است به کار رود.
- -mlra
- استفاده از تخصیصدهندهٔ جدید ثبات LRA. بهطور پیشفرض، از تخصیصدهندهٔ قدیمی «reload» استفاده میشود.
نکته: گزینهٔ خط فرمان عمومی GCC یعنی -ffixed-reg، هنگام استفاده به همراه صفتِ تابع "interrupt"، برای پورت RX اهمیت ویژهای دارد. این صفت نشاندهندهٔ تابعی است که برای پردازش وقفههای سریع در نظر گرفته شده است. GCC تضمین میکند که تنها از ثباتهای "r10"، "r11"، "r12" و/یا "r13" استفاده کند و این امر نیز تنها به شرطی است که استفادهٔ معمول از ثباتهای متناظر از طریق گزینههای خط فرمان -ffixed-reg یا -mint-register محدود شده باشد.
گزینههای S/390 و zSeries
اینها گزینههای -m تعریفشده برای معماری S/390 و zSeries هستند.
- -mhard-float
- -msoft-float
- استفاده (عدم استفاده) از دستورالعملها و ثباتهای سختافزاری ممیز شناور برای محاسبات ممیز شناور. هنگامی که -msoft-float مشخص شود، توابع موجود در libgcc.a برای انجام عملیات ممیز شناور به کار میروند. هنگامی که -mhard-float مشخص شود، کامپایلر دستورالعملهای ممیز شناور IEEE را تولید میکند. این حالت پیشفرض است.
- -mhard-dfp
- -mno-hard-dfp
- استفاده (عدم استفاده) از دستورالعملهای سختافزاری ممیز شناور دهدهی برای عملیات ممیز شناور دهدهی. هنگامی که -mno-hard-dfp مشخص شود، توابع موجود در libgcc.a برای انجام عملیات ممیز شناور دهدهی به کار میروند. هنگامی که -mhard-dfp مشخص شود، کامپایلر دستورالعملهای سختافزاری ممیز شناور دهدهی را تولید میکند. این گزینه برای -march=z9-ec یا بالاتر پیشفرض است.
- -mlong-double-64
- -mlong-double-128
- این گزینهها اندازهٔ نوع دادهٔ "long double" را کنترل میکنند. اندازهٔ ۶۴ بیتی، نوع دادهٔ "long double" را معادل با نوع "double" قرار میدهد. این حالت پیشفرض است.
- -mbackchain
- -mno-backchain
- ذخیره (عدم
ذخیره) آدرس
فریم
فراخواننده
به عنوان
اشارهگر
زنجیرهٔ
بازگشتی (backchain)
در فریم
پشتهٔ
فراخوانیشونده.
یک backchain ممکن
است برای
اشکالزدایی
توسط
ابزارهایی
که اطلاعات
فریم
فراخوانی DWARF
را متوجه
نمیشوند،
مورد نیاز
باشد.
هنگامی که
-mno-packed-stack فعال
باشد،
اشارهگر backchain
در انتهای
فریم پشته
ذخیره
میشود؛
هنگامی که
-mpacked-stack فعال
باشد، backchain در
بالاترین
کلمه (word) از
ناحیهٔ
۹۶/۱۶۰
بایتی
ذخیرهٔ
ثباتها
قرار
میگیرد.
بهطور کلی، کدی که با -mbackchain کامپایل شده باشد از نظر فراخوانی با کد کامپایلشده با -mno-backchain سازگار است؛ با این حال، استفاده از backchain برای اهداف اشکالزدایی معمولاً نیازمند این است که کل باینری با -mbackchain ساخته شود. توجه داشته باشید که ترکیب -mbackchain، -mpacked-stack و -mhard-float پشتیبانی نمیشود. برای ساخت هستهٔ لینوکس، از -msoft-float استفاده کنید.
پیشفرض بر این است که backchain نگهداری نشود.
- -mpacked-stack
- -mno-packed-stack
- استفاده
(عدم
استفاده) از
چیدمان
فشردهٔ
پشته (packed stack layout).
هنگامی که
-mno-packed-stack مشخص
شود،
کامپایلر
از تمامی
فیلدهای
ناحیهٔ
۹۶/۱۶۰
بایتیِ
ذخیرهٔ
ثبات تنها
برای مقاصد
پیشفرض
آنها
استفاده
میکند؛
فیلدهای
استفادهنشده
همچنان
فضای پشته
را اشغال
خواهند کرد.
هنگامی که
-mpacked-stack مشخص
شود،
شیارهای
ذخیرهٔ
ثبات
بهصورت
متراکم در
بالای
ناحیهٔ
ذخیرهٔ
ثبات
بستهبندی
میشوند؛
فضای
استفادهنشده
برای اهداف
دیگر
مجدداً به
کار گرفته
میشود که
امکان
استفادهٔ
بهینهتر
از فضای
پشتهٔ
موجود را
فراهم
میکند. با
این حال،
هنگامی که
-mbackchain نیز
فعال باشد،
بالاترین
کلمه از
ناحیهٔ
ذخیره
همواره
برای
ذخیرهٔ backchain
استفاده
میشود و
ثبات آدرس
بازگشت
همواره دو
کلمه
پایینتر
از backchain ذخیره
خواهد شد.
تا زمانی که از backchain فریم پشته استفاده نشود، کد تولیدشده با -mpacked-stack از نظر فراخوانی با کد تولیدشده با -mno-packed-stack سازگار است. توجه داشته باشید که برخی از انتشارهای غیر FSF از GCC 2.95 برای S/390 یا zSeries کدی تولید میکردند که از backchain فریم پشته در زمان اجرا استفاده میکرد، نه صرفاً برای اهداف اشکالزدایی. چنین کدهایی از نظر فراخوانی با کد کامپایلشده با -mpacked-stack سازگار نیستند. همچنین توجه داشته باشید که ترکیب -mbackchain، -mpacked-stack و -mhard-float پشتیبانی نمیشود. برای ساخت هستهٔ لینوکس از -msoft-float استفاده کنید.
پیشفرض، عدم استفاده از چیدمان فشردهٔ پشته است.
- -msmall-exec
- -mno-small-exec
- تولید (یا عدم تولید) کد با استفاده از دستورالعمل "bras" برای انجام فراخوانیهای زیرروال. این گزینه تنها زمانی بهطور قابلاطمینان کار میکند که اندازهٔ کل فایل اجرایی از 64k فراتر نرود. پیشفرض، استفاده از دستورالعمل "basr" است که این محدودیت را ندارد.
- -m64
- -m31
- هنگامی که -m31 مشخص شود، کدی مطابق با ABI گنو/لینوکس برای S/390 تولید میشود. هنگامی که -m64 مشخص شود، کدی مطابق با ABI گنو/لینوکس برای zSeries تولید میشود. این امر بهویژه به GCC اجازه میدهد تا دستورالعملهای ۶۴ بیتی تولید کند. برای مقصدهای s390، پیشفرض -m31 است، در حالی که مقصدهای s390x بهطور پیشفرض از -m64 استفاده میکنند. توجه داشته باشید که -m31 منسوخ شده است و پشتیبانی از آن حذف خواهد شد.
- -mzarch
- -mesa
- هنگامی که -mzarch مشخص شود، کدی با استفاده از دستورالعملهای موجود در z/Architecture تولید میشود. هنگامی که -mesa مشخص شود، کدی با استفاده از دستورالعملهای موجود در ESA/390 تولید میشود. توجه داشته باشید که -mesa همراه با -m64 امکانپذیر نیست. هنگام تولید کد مطابق با ABI گنو/لینوکس برای S/390، پیشفرض -mesa است. هنگام تولید کد مطابق با ABI گنو/لینوکس برای zSeries، پیشفرض -mzarch است..IP -mhtm 4
- -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) و قراردادهای فراخوانی (calling conventions) تغییر میدهد. در صورتی که مقادیر نوع برداری در زمینهای مرتبط با 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 را بگنجانید. -mzvector بهطور پیشفرض غیرفعال است.
- -mmvcle
- -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 به عنوان نوع پردازنده میتواند برای انتخاب بهترین گزینهٔ معماری برای پردازندهٔ میزبان به کار رود. -march=native در صورتی که GCC پردازنده را شناسایی نکند هیچ اثری ندارد.
- -mtune=cpu-type
- میزانسازی و تنظیم تمام جنبههای قابل اعمال کد تولیدشده برای cpu-type، به جز ABI و مجموعهٔ دستورالعملهای در دسترس. فهرست مقادیر cpu-type مشابه -march است. پیشفرض، مقدار استفادهشده برای -march است.
- -mtpf-trace
- -mno-tpf-trace
- تولید کدی که انشعابهای خاص سیستمعامل TPF OS را به زیرروالهای ردگیری (trace routines) در سیستمعامل اضافه کند (یا اضافه نکند). این گزینه بهطور پیشفرض خاموش است، حتی هنگام کامپایل برای TPF OS.
- -mtpf-trace-skip
- -mno-tpf-trace-skip
- تولید کدی که مقصدهای پیشفرض انشعاب فعالشده توسط -mtpf-trace را تغییر دهد (یا ندهد) تا به روالهای ردگیری تخصصی اشاره کنند که قابلیت نادیدهگرفتن انتخابی ورودیهای ردگیری تابع را برای TPF OS فراهم میسازند. این گزینه بهطور پیشفرض خاموش است، حتی هنگام کامپایل برای TPF OS و مشخص کردن -mtpf-trace.
- -mmain
- برای مقصد TPF OS، از این گزینه هنگام پیونددادن استفاده کنید تا کد راهاندازی (startup code) و سایر گزینههای پیونددهنده جهت تولید یک شیء اصلی (main object) اضافه شوند.
- -mfused-madd
- -mno-fused-madd
- تولید کدی که از دستورالعملهای ضرب و انباشت ممیز شناور (floating-point multiply and accumulate) استفاده کند (یا نکند). این دستورالعملها در صورت استفاده از ممیز شناور سختافزاری بهطور پیشفرض تولید میشوند.
- -mwarn-framesize=framesize
- صدور یک
هشدار در
صورتی که
تابع جاری
از اندازهٔ
فریم (frame size)
دادهشده
تجاوز کند.
از آنجا که
این یک
بررسی در
زمان
کامپایل
است،
لزوماً به
این معنا
نیست که
هنگام
اجرای
برنامه
حتماً یک
مشکل واقعی
پیش بیاید.
هدف آن
شناسایی
توابعی است
که به
احتمال
بسیار زیاد
موجب سرریز
پشته (stack overflow)
میشوند.
این گزینه
برای
محیطهایی
با اندازهٔ
پشتهٔ
محدود،
مانند
هستهٔ
لینوکس،
مفید است.
مقدار صفر این هشدار را غیرفعال میکند؛ که این حالت پیشفرض است.
- -mwarn-dynamicstack
- -mno-warn-dynamicstack
- صدور هشدار در صورتی که تابع "alloca" را فراخوانی کند یا از آرایههای با اندازهٔ پویا استفاده نماید. این کار معمولاً در شرایطی با اندازهٔ پشتهٔ محدود، ایدهٔ نامناسبی است.
- -mstack-guard=stack-guard
- -mstack-size=stack-size
- -mno-stack-guard
- -mno-stack-size
- اگر این
گزینهها
فعال
باشند، بخش
پشتی (back end)
معماری S/390
دستورالعملهای
اضافی را در
مقدمهٔ
تابع (function prologue)
صادر
میکند که
اگر
اندازهٔ
پشته به
اندازهٔ
stack-guard بایت
فراتر از
stack-size برود،
یک تله (trap) را
تحریک
میکند (به
خاطر داشته
باشید که
پشته در S/390 رو
به پایین
رشد
میکند).
اگر گزینهٔ
stack-guard حذف
شود،
کوچکترین
توان ۲ که
بزرگتر از
اندازهٔ
فریمِ تابع
کامپایلشده
است انتخاب
میشود.
این گزینهها برای کمک به اشکالزدایی مشکلات سرریز پشته در نظر گرفته شدهاند. کد اضافی تولیدشده بار پردازشی (overhead) ناچیزی ایجاد میکند و بنابراین میتواند در سیستمهای شبهتولید نیز بدون افت چشمگیر کارایی استفاده شود.
مقادیر دادهشده باید دقیقاً توانی از ۲ باشند و stack-size باید بزرگتر از stack-guard بوده و از 64k تجاوز نکند. برای کارآمد بودن، کد اضافی فرض میکند که پشته از آدرسی تراز شده با مقدار دادهشده توسط stack-size آغاز میشود.
گزینهٔ -mstack-guard= تنها میتواند همراه با -mstack-size= استفاده شود. میتوانید این گزینهها را در خط فرمان به ترتیب با -mno-stack-guard و -mno-stack-size بازنویسی و لغو کنید.
- -mhotpatch=pre-halfwords,post-halfwords
- اگر گزینهٔ
hotpatch فعال
باشد، یک
مقدمهٔ
تابع
«وصلهزنی
حین اجرا»
(hot-patching) برای
تمام توابع
موجود در
واحد
کامپایل
تولید
میشود. پیش
از برچسب
تابع،
تعداد
مشخصشده
از
دستورالعملهای
دو بایتی NOP
قرار
میگیرد
(pre-halfwords،
حداکثر 1000000).
پس از
برچسب، 2 * post-halfwords
بایت با
استفاده از
بزرگترین
دستورالعملهای
شبه NOP مجاز
در معماری
اضافه
میشود
(حداکثر 1000000).
اگر هر دو آرگومان صفر باشند، hotpatching غیرفعال میشود.
این گزینه را میتوان برای توابع منفرد با استفاده از مشخصهٔ "hotpatch" لغو و بازنویسی کرد.
- -mpic-data-is-text-relative
- -mno-pic-data-is-text-relative
- هنگام کامپایل برای S/390 با -fpic یا -fPIC، معمولاً GCC کدی با استفاده از آدرسدهی نسبی بین کد و داده تولید میکند. با این حال، برای وصلهزدن زنده (hotpatching) ممکن است نیاز باشد بخشهای جدید ".text" معرفی شوند در حالی که از بخشهای ".data" و ".bss" موجود استفاده میشود. در این حالت، از -mno-pic-data-is-text-relative برای اجبار به آدرسدهی از طریق GOT استفاده کنید.
- -mstack-protector-guard=guard
- -mstack-protector-guard-record
- کد محافظت
از پشته را
با استفاده
از مقدار
قناری در guard
تولید
میکند.
مکانهای
پشتیبانیشده
عبارتند از
global برای یک
قناری
سراسری یا
tls برای یک
قناری
بهازای هر
رشته در
بلوک TLS
(پیشفرض).
گزینهٔ -mstack-protector-guard-record منجر به تولید بخش "__stack_protector_loc" میشود که حاوی اشارهگرهایی به تمام دستورالعملهایی است که آدرس نگهبان (guard) سراسری را بارگذاری میکنند. بنابراین، این گزینه تنها در ترکیب با -mstack-protector-guard=global کارایی دارد. کاربرد در نظر گرفتهشده برای هسته لینوکس است.
- -mindirect-branch=choice
- -mindirect-branch-jump=choice
- -mindirect-branch-call=choice
- -mfunction-return=choice
- -mfunction-return-mem=choice
- -mfunction-return-reg=choice
- این گروه از
گزینهها،
آسیبپذیریهای
امنیتی
مربوط به
اجرای حدسی
(speculative execution) و
پیشبینی
انشعاب
غیرمستقیم
را با
فعالسازی
جایگزینی
انشعابهای
غیرمستقیم
و
بازگشتهای
توابع با
انشعابهای
مستقیم به
یک thunk رفع
میکنند.
مشخص کردن مقدار keep برای choice باعث تولید کد پیشفرض میشود. مقدار thunk تولید thunkهای خارجازخط را راهاندازی کرده و انشعاب پیشتر غیرمستقیم را با یک انشعاب مستقیم به thunk جایگزین میکند. مقدار thunk-extern مانند thunk جایگزینی انشعاب را انجام میدهد اما thunkها را تولید نمیکند. مقدار thunk-inline تنها همراه با -mindirect-branch-jump در دسترس است؛ برای پشتیبانی از بازپیچی درست پشته (stack unwinding) و مدیریت استثناها، در برنامههای فضای کاربر باید ترجیحاً نسبت به thunk استفاده شود.
گزینهٔ -mindirect-branch مقادیر -mindirect-branch-jump و -mindirect-branch-call را تنظیم میکند. گزینهٔ -mfunction-return مقادیر -mfunction-return-reg و -mfunction-return-mem را تنظیم میکند.
تمام این گزینهها را میتوان بر مبنای هر تابع و با استفاده از ویژگیهای تابع (function attributes) نیز تنظیم کرد.
- -mindirect-branch-table
- -mno-indirect-branch-table
- این گزینه در ترکیب با گزینههای -mindirect-branch و -mfunction-return مفید است. هنگامی که فعال باشد، باعث تولید جدولهایی میشود که به مکانهای انشعابی که توسط آن گزینهها وصله شدهاند اشاره دارند. این جدولها در بخشهایی به نامهای ".s390_indirect_jump"، ".s390_indirect_call"، ".s390_return_reg"، و ".s390_return_mem" منتشر میشوند. هر بخش شامل آرایهای از عناصر ۳۲ بیتی است؛ هر مدخل مقدار آفست از خود مدخل تا مکان وصلهشده را نگهداری میکند.
- -mfentry
- -mno-fentry
- هنگامی که در ترکیب با گزینهٔ -pg استفاده شود، کد پروفایلسازی را با استفاده از قلاب "__fentry__" ارائهشده در GLIBC 2.29 یا بالاتر تولید میکند. این قابلیت تنها برای کد ۶۴ بیتی در دسترس است. اگر این گزینه فعال نباشد، پروفایلسازی در عوض از قلاب با کارایی کمترِ "_mcount" استفاده میکند.
- -mrecord-mcount
- -mno-record-mcount
- هنگامی که فعال باشد، یک بخش "__mcount_loc" با مکانهای تمام فراخوانیهای پروفایلسازی تولیدشده به "_mcount" یا "__fentry__" تولید میکند.
- mnop-mcount
- mno-nop-mcount
- به جای تولید فراخوانیها به "_mcount" یا "__fentry__" با -pg، یک توالی از دستورالعملهای no-op با همان طول را در مکانهایی که فراخوانیها قرار میگرفتند درج میکند. این میتواند در ترکیب با گزینهٔ -mrecord-mcount برای وصله کردن توالیهای فراخوانی در فایل شیء، بدون نیاز به کامپایل مجدد آن استفاده شود.
- -mpreserve-args
- -mno-preserve-args
- هنگامی که فعال باشد، تمام ثباتهای آرگومان را در پشته ذخیره کرده و اطلاعات CFI متناظر را تولید میکند. این برای برنامههایی که قصد پیادهسازی بازپیچی پشتهٔ (stack unwinding) اختصاصی خود را دارند و به آرگومانهای تابع نیاز دارند، مفید است.
- -munaligned-symbols
- -mno-unaligned-symbols
- فرض میکند که نمادهای خارجی با تراز طبیعی ۱، به طور بالقوه ناتراز هستند. به طور پیشفرض، طبق دستورالعمل IBM Z ABI تمام نمادهای بدون تراز صریح، روی مرز ۲ بایتی تراز در نظر گرفته میشوند.
گزینههای SH
این گزینههای -m برای پیادهسازیهای SH تعریف شدهاند:
- -m1
- تولید کد برای SH1.
- -m2
- تولید کد برای SH2.
- -m2e
- تولید کد برای SH2e.
- -m2a-nofpu
- تولید کد برای SH2a بدون FPU، یا برای SH2a-FPU به گونهای که از واحد ممیز شناور استفاده نشود.
- -m2a-single-only
- تولید کد برای SH2a-FPU به گونهای که هیچ عملیات ممیز شناور با دقت مضاعف استفاده نشود.
- -m2a-single
- تولید کد برای SH2a-FPU با فرض اینکه واحد ممیز شناور به طور پیشفرض در حالت دقت منفرد است.
- -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 با فرض اینکه واحد ممیز شناور به طور پیشفرض در حالت دقت منفرد است..IP -m4-100-single-only 4 تولید کد برای SH4-100 بهگونهای که از هیچ عملیات ممیز شناور با دقت مضاعف استفاده نشود.
- -m4-200
- تولید کد برای SH4-200.
- -m4-200-nofpu
- تولید کد برای 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-400
- تولید کد برای SH4-400 (بدون 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
- -mno-renesas
- پیروی از قراردادهای فراخوانی تعریفشده توسط Renesas. پیشفرض برای تمام مقاصد زنجیره ابزار SH برابر با -mno-renesas است که از قراردادهای فراخوانی تعریفشده برای GCC پیش از ارائهٔ قراردادهای Renesas استفاده میکند.
- -mnomacsave
- علامتگذاری ثبات "MAC" بهعنوان تخریبپذیر در فراخوانی (call-clobbered)، حتی اگر -mrenesas داده شده باشد.
- -mieee
- -mno-ieee
- کنترل انطباق مقایسههای ممیز شناور با استاندارد IEEE، که بر نحوهٔ مدیریت مواردی که نتیجهٔ مقایسه نامرتب (unordered) است تأثیر میگذارد. بهطور پیشفرض -mieee بهصورت ضمنی فعال است. اگر -ffinite-math-only فعال باشد، -mno-ieee بهطور ضمنی تنظیم میشود که منجر به مقایسههای سریعترِ بزرگتر-مساوی و کوچکتر-مساوی در ممیز شناور میگردد. تنظیمات ضمنی را میتوان با مشخص کردن -mieee یا -mno-ieee لغو کرد.
- -minline-ic_invalidate
- -mno-inline-ic_invalidate
- درونخطیسازی کد برای نامعتبرسازی ورودیهای حافظهٔ نهان دستورالعمل پس از راهاندازی ترامپولینهای توابع تو در تو (nested function trampolines). این گزینه در صورتی که -musermode برقرار باشد و گزینهٔ تولید کدِ انتخابشده (مانند -m4) اجازهٔ استفاده از دستورالعمل "icbi" را ندهد، هیچ اثری ندارد. اگر گزینهٔ تولید کدِ انتخابشده اجازهٔ استفاده از دستورالعمل "icbi" را ندهد و -musermode برقرار نباشد، کد درونخطیشده آرایه آدرس حافظهٔ نهان دستورالعمل را مستقیماً با یک نوشتن انجمنی (associative write) دستکاری میکند. این کار نهتنها در زمان اجرا به حالت ممتاز (privileged mode) نیاز دارد، بلکه در صورتی که سطر حافظهٔ نهان از طریق TLB نگاشت شده باشد و سپس نگاشت آن لغو شده باشد نیز شکست میخورد.
- -misize
- تخلیه اندازه و مکان دستورالعمل در کد اسمبلی.
- -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
- تولید توالیهای اتمی نرمافزاری که از یک متغیر در بلوک کنترل رشته (TCB) استفاده میکنند. این یک گونه از توالیهای gUSA است که میتواند روی اهداف SH1* و SH2* نیز استفاده شود. توالیهای اتمی تولیدشده به پشتیبانی اضافی از سوی کد مدیریت وقفه/استثنای سیستم نیاز دارند و فقط برای سیستمهای تکهستهای مناسب هستند. هنگام استفاده از این مدل، پارامتر gbr-offset= نیز باید مشخص شود.
- soft-imask
- تولید توالیهای اتمی نرمافزاری که با تنظیم "SR.IMASK = 1111" بهطور موقت وقفهها را غیرفعال میکنند. این مدل تنها زمانی کار میکند که برنامه در حالت ممتاز اجرا شود و فقط برای سیستمهای تکهستهای مناسب است. نیازی به پشتیبانی اضافی از سوی کد مدیریت وقفه/استثنای سیستم نیست. این مدل بهطور پیشفرض زمانی که هدف "sh*-*-linux*" و SH1* یا SH2* باشد فعال است.
- hard-llcs
- تولید توالیهای اتمی سختافزاری فقط با استفاده از دستورالعملهای "movli.l" و "movco.l". این قابلیت فقط در SH4A موجود است و برای سیستمهای چندهستهای مناسب است. از آنجا که دستورالعملهای سختافزاری فقط از متغیرهای اتمی ۳۲ بیتی پشتیبانی میکنند، دسترسی به متغیرهای ۸ یا ۱۶ بیتی با دسترسیهای ۳۲ بیتی شبیهسازی میشود. کدی که با این گزینه کامپایل شده باشد، در صورت اجرا روی یک سیستم SH4A با سایر سیستمهای مدیریت وقفه/استثنای مدلهای اتمی نرمافزاری نیز سازگار است. برای این مدل نیازی به پشتیبانی اضافی از سوی کد مدیریت وقفه/استثنای سیستم نیست..IP gbr-offset= 4 این پارامتر، افست بر حسب بایت متغیر را در ساختار بلوک کنترل رشته (thread control block) مشخص میکند که باید توسط توالیهای اتمیک تولیدشده هنگام انتخاب مدل soft-tcb استفاده شود. برای سایر مدلها این پارامتر نادیده گرفته میشود. مقدار مشخصشده باید مضرب صحیحی از چهار و در بازه ۰-۱۰۲۰ باشد.
- strict
- این پارامتر از استفاده ترکیبی چندین مدل اتمیک، حتی در صورت سازگار بودن آنها، جلوگیری میکند و کامپایلر را وادار میسازد تا توالیهای اتمیک را تنها بر اساس مدل مشخصشده تولید کند.
- -mtas
- تولید آپکد "tas.b" برای "__atomic_test_and_set". توجه داشته باشید که بسته به پیکربندی سختافزاری و نرمافزاری خاص، این مورد به دلیل تخلیه خطوط حافظه پنهان عملوند که توسط دستور "tas.b" تحمیل میشود، میتواند کارایی کلی را کاهش دهد. در پردازندههای چندهستهای SH4A، دستور "tas.b" باید با احتیاط استفاده شود زیرا میتواند در برخی پیکربندیهای حافظه پنهان منجر به خرابی دادهها گردد.
- -mprefergot
- هنگام تولید کد مستقل از موقعیت (position-independent code)، فراخوانیهای تابع به جای Procedure Linkage Table با استفاده از Global Offset Table صادر شوند.
- -musermode
- -mno-usermode
- اجازه ندادن (اجازه دادن) به کامپایلر برای تولید کد حالت ممتاز (privileged mode). مشخص کردن -musermode همچنین در صورتی که کد درونخطی در حالت کاربر کار نکند، -mno-inline-ic_invalidate را اعمال میکند. -musermode زمانی که هدف "sh*-*-linux*" باشد، حالت پیشفرض است. اگر هدف *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 است. تعیین این مورد برای اهدافی که فاقد دستورهای جابجایی پویا (dynamic shift) هستند، به طور پیشفرض به "call-div1" بازمیگردد.
هنگامی که راهبرد تقسیم مشخص نشده باشد، راهبرد پیشفرض بر اساس هدف فعلی انتخاب میشود. برای SH2A راهبرد پیشفرض استفاده از دستورهای "divs" و "divu" به جای فراخوانیهای توابع کتابخانهای است.
- -maccumulate-outgoing-args
- -mno-accumulate-outgoing-args
- فضا را به جای هر فراخوانی، یکبار برای آرگومانهای خروجی در پیشدرآمد تابع (function prologue) رزرو میکند. این کار به طور کلی برای کارایی و اندازه کد سودمند است، و همچنین برای بازپیچی پشته (unwinding) به جهت جلوگیری از تغییر فریم پشته در کدهای شرطی مورد نیاز است. -maccumulate-outgoing-args به طور پیشفرض فعال است.
- -mdivsi3_libfunc=name
- تنظیم نام تابع کتابخانهای مورد استفاده برای تقسیم علامتدار ۳۲ بیتی به name. این گزینه تنها بر نام استفادهشده در راهبردهای تقسیم call اثر میگذارد، و کامپایلر همچنان انتظار همان مجموعههای ثباتهای ورودی/خروجی/تغییریافته (clobbered) را دارد درست مانند اینکه این گزینه مشخص نشده باشد.
- -mfixed-range=register-range
- تولید کد با در نظر گرفتن بازه ثبات مشخصشده به عنوان ثباتهای ثابت (fixed registers). یک ثبات ثابت ثباتی است که تخصیصدهنده ثبات نمیتواند از آن استفاده کند. این گزینه هنگام کامپایل کد هسته کاربرد دارد. بازه ثبات به صورت دو ثبات که با یک خط تیره جدا شدهاند مشخص میشود. میتوان چندین بازه ثبات را با کاما جدا کرد.
- -mbranch-cost=num
- هزینه برای یک دستور انشعاب را برابر با num در نظر میگیرد. مقادیر بالاتر باعث میشوند کامپایلر در صورت امکان کدهای بیشتری بدون انشعاب تولید کند. در صورت عدم تعیین، این مقدار بسته به نوع پردازندهای که برای آن کامپایل صورت میگیرد انتخاب میشود.
- -mzdcbranch
- -mno-zdcbranch
- فرض کردن (فرض نکردن) اینکه دستورهای انشعاب شرطی با جابجایی صفر "bt" و "bf" سریع هستند. اگر -mzdcbranch مشخص شود، کامپایلر توالیهای کد انشعاب با جابجایی صفر را ترجیح میدهد. این گزینه به طور پیشفرض هنگام تولید کد برای SH4 و SH4A فعال است. میتوان آن را صراحتاً با تعیین -mno-zdcbranch غیرفعال کرد.
- -mcbranch-force-delay-slot
- استفاده اجباری از شکافهای تاخیر (delay slots) برای انشعابهای شرطی، که در صورت پیدا نشدن دستور مناسب، شکاف تاخیر را با یک دستور "nop" پر میکند. این گزینه به صورت پیشفرض غیرفعال است. میتوان آن را برای دور زدن باگهای سختافزاری یافتشده در پردازنده اصلی SH7055 فعال کرد.
- -mfsca
- -mno-fsca
- اجازه دادن یا ندادن به کامپایلر برای صدور دستور "fsca" جهت تقریبهای سینوس و کسینوس. گزینه -mfsca باید در ترکیب با -funsafe-math-optimizations استفاده شود. این گزینه به طور پیشفرض هنگام تولید کد برای SH4A فعال است. استفاده از -mno-fsca تقریبهای سینوس و کسینوس را حتی در صورت فعال بودن -funsafe-math-optimizations غیرفعال میکند.
- -mfsrra
- -mno-fsrra
- اجازه دادن یا ندادن به کامپایلر برای صدور دستور "fsrra" جهت تقریبهای جذر معکوس (reciprocal square root). گزینه -mfsrra باید در ترکیب با -funsafe-math-optimizations و -ffinite-math-only استفاده شود. این گزینه به طور پیشفرض هنگام تولید کد برای SH4A فعال است. استفاده از -mno-fsrra تقریبهای جذر معکوس را حتی در صورت فعال بودن -funsafe-math-optimizations و -ffinite-math-only غیرفعال میکند.
- -mpretend-cmove
- -mno-pretend-cmove
- ترجیح دادن یا ترجیح ندادن انشعابهای شرطی با جابجایی صفر برای الگوهای دستور انتقال شرطی (conditional move). این کار میتواند به کدهای سریعتر در پردازنده SH4 منجر شود.
- -mfdpic
- -mno-fdpic
- تولید کد با استفاده از FDPIC ABI.
- -mlra
- -mno-lra
- استفاده از تخصیصدهنده ثبات جدید LRA. به طور پیشفرض، تخصیصدهنده قدیمی «reload» استفاده میشود.
گزینههای Solaris 2 (Solaris 2 Options)
این گزینهها در Solaris 2 پشتیبانی میشوند:
- -mclear-hwcap
- -mno-clear-hwcap
- گزینهٔ -mclear-hwcap به کامپایلر اعلام میکند قابلیتهای سختافزاری ایجادشده توسط اسمبلر Solaris را حذف کند. این کار تنها زمانی لازم است که فایلهای شیء از افزونههای ISA استفاده میکنند که توسط ماشین فعلی پشتیبانی نمیشود، اما در زمان اجرا بررسی میکنند که آیا باید از آنها استفاده شود یا خیر.
- -mimpure-text
- -mno-impure-text
- گزینهٔ
-mimpure-text، در
صورت
استفاده در
کنار -shared، به
کامپایلر
میگوید
هنگام
پیوند یک
شیء
اشتراکی، -z
text را به
پیونددهنده
ارسال نکند.
با استفاده
از این
گزینه،
میتوانید
کدهای
وابسته به
موقعیت را
در یک شیء
اشتراکی
پیوند دهید.
گزینهٔ -mimpure-text پیام خطای پیونددهنده مبنی بر «relocations remain against allocatable but non-writable sections» را فرونشانی میکند. با این حال، بازنشانیهای ضروری موجب فعالسازی copy-on-write میشوند و شیء اشتراکی در عمل بین فرایندها به اشتراک گذاشته نمیشود. به جای استفاده از -mimpure-text، باید تمام کد منبع را با -fpic یا -fPIC کامپایل کنید.
- -gsctf
- تولید Solaris CTF. باید هم برای کامپایل و هم برای پیوند استفاده شود. برای اطلاعات بیشتر ctf(7) را ببینید. این ویژگی تنها از Solaris 11.4 SRU 84 به بعد پشتیبانی میشود که پشتیبانی لازم به زنجیرهٔ ابزار اضافه شد.
گزینههای SPARC
این گزینههای -m در SPARC پشتیبانی میشوند:
- -mno-app-regs
- -mapp-regs
- برای تولید
خروجی با
استفاده از
ثباتهای
سراسری ۲ تا
۴، که SPARC SVR4 ABI
آنها را
برای
برنامهها
رزرو کرده
است، -mapp-regs را
مشخص کنید.
همانند
ثبات
سراسری ۱،
هر یک از
ثباتهای
سراسری ۲ تا
۴ به عنوان
یک ثبات
تخصیصپذیر
در نظر
گرفته
میشوند که
فراخوانیهای
تابع مقدار
آنها را
رونویسی (clobber)
میکنند.
این رفتار
پیشفرض
است.
برای سازگاری کامل با SVR4 ABI به قیمت مقداری افت کارایی، -mno-app-regs را مشخص کنید. شما باید کتابخانهها و نرمافزارهای سیستمی را با این گزینه کامپایل کنید.
- -mflat
- -mno-flat
- با -mflat،
کامپایلر
دستورالعملهای
save/restore را تولید
نمیکند و
از یک مدل
پنجرهٔ
ثبات
«مسطح» یا
منفرد
استفاده
میکند. این
مدل با مدل
معمول
پنجرهٔ
ثبات
سازگار است.
ثباتهای
محلی و
ثباتهای
ورودی (۰--۵)
همچنان به
عنوان
ثباتهای
«call-saved» در نظر
گرفته
میشوند و
در صورت
نیاز روی
پشته ذخیره
میشوند.
با -mno-flat (پیشفرض)، کامپایلر دستورالعملهای save/restore را تولید میکند (به جز در توابع برگ). این حالت کاری معمول است.
- -mfpu
- -mhard-float
- تولید خروجی حاوی دستورالعملهای ممیز شناور. این حالت پیشفرض است.
- -mno-fpu
- -msoft-float
- تولید
خروجی حاوی
فراخوانیهای
کتابخانهای
برای ممیز
شناور.
هشدار:
کتابخانههای
لازم برای
تمام اهداف
SPARC در دسترس
نیستند.
معمولاً از
امکانات
کامپایلر C
معمول
ماشین
استفاده
میشود،
اما این کار
را
نمیتوان
مستقیماً
در کامپایل
متقاطع
انجام داد.
باید
خودتان
تمهیدات
لازم را
برای فراهم
کردن توابع
کتابخانهای
مناسب جهت
کامپایل
متقاطع در
نظر بگیرید.
اهداف
تعبیهشدهٔ
sparc-*-aout و sparclite-*-*
پشتیبانی
نرمافزاری
از ممیز
شناور را
ارائه
میدهند.
گزینهٔ -msoft-float قرارداد فراخوانی را در فایل خروجی تغییر میدهد؛ بنابراین تنها زمانی مفید است که تمام یک برنامه را با این گزینه کامپایل کنید. بهویژه، برای اینکه این مورد کار کند، باید 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
۳۲ بیتی، در
توابعی که
ساختارها
یا unionها را
بازمیگردانند
کد بررسی
تولید
میکند تا
عدم تطابق
اندازه بین
دو طرف
فراخوانیهای
تابع را
شناسایی
کند.
پیشفرض -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 تولید میکند. این گزینه دستورالعملهای ضرب عدد صحیح، ضرب/انباشت، گام تقسیم عدد صحیح و پویش ("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 بهینهسازی میکند.
- -mtune=cpu_type
- پارامترهای
زمانبندی
دستورالعملها
را برای نوع
ماشین 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 کدی تولید میکند که از افزونههای مجموعه دستورالعمل تصویری (VIS) در UltraSPARC بهره میبرد. مقدار پیشفرض -mno-vis است.
- -mvis2
- -mno-vis2
- با -mvis2، کامپایلر GCC کدی تولید میکند که از نگارش ۲٫۰ افزونههای مجموعه دستورالعمل تصویری UltraSPARC بهره میبرد. هنگام هدف قرار دادن پردازندهای که از این دستورالعملها پشتیبانی میکند (مانند UltraSPARC-III و بعد از آن)، پیشفرض -mvis2 است. تنظیم -mvis2 همچنین -mvis را نیز فعال میکند.
- -mvis3
- -mno-vis3
- با -mvis3، کامپایلر GCC کدی تولید میکند که از نگارش ۳٫۰ افزونههای مجموعه دستورالعمل تصویری UltraSPARC بهره میبرد. هنگام هدف قرار دادن پردازندهای که از این دستورالعملها پشتیبانی میکند (مانند niagara-3 و بعد از آن)، پیشفرض -mvis3 است. تنظیم -mvis3 همچنین -mvis2 و -mvis را نیز فعال میکند.
- -mvis3b
- -mno-vis3b
- با -mvis3b، کامپایلر GCC کدی تولید میکند که از نگارش ۳٫۰ افزونههای مجموعه دستورالعمل تصویری UltraSPARC به همراه دستورالعملهای تکمیلی VIS معرفیشده در Oracle SPARC Architecture 2011 بهره میبرد. هنگام هدف قرار دادن پردازندهای که از این دستورالعملها پشتیبانی میکند (مانند niagara-7 و بعد از آن)، پیشفرض -mvis3b است. تنظیم -mvis3b همچنین گزینههای -mvis3، -mvis2 و -mvis را نیز فعال میکند.
- -mvis4
- -mno-vis4
- با -mvis4، کامپایلر GCC کدی تولید میکند که از نگارش ۴٫۰ افزونههای مجموعه دستورالعمل تصویری UltraSPARC بهره میبرد. هنگام هدف قرار دادن پردازندهای که از این دستورالعملها پشتیبانی میکند (مانند niagara-7 و بعد از آن)، پیشفرض -mvis4 است. تنظیم -mvis4 همچنین گزینههای -mvis3b، -mvis3، -mvis2 و -mvis را نیز فعال میکند.
- -mvis4b
- -mno-vis4b
- با -mvis4b، کامپایلر GCC کدی تولید میکند که از نگارش ۴٫۰ افزونههای مجموعه دستورالعمل تصویری UltraSPARC به همراه دستورالعملهای تکمیلی VIS معرفیشده در Oracle SPARC Architecture 2017 بهره میبرد. هنگام هدف قرار دادن پردازندهای که از این دستورالعملها پشتیبانی میکند (مانند m8 و بعد از آن)، پیشفرض -mvis4b است. تنظیم -mvis4b همچنین گزینههای -mvis4، -mvis3b، -mvis3، -mvis2 و -mvis را نیز فعال میکند.
- -mcbcond
- -mno-cbcond
- با -mcbcond، کامپایلر GCC کدی تولید میکند که از دستورالعملهای Compare-and-Branch-on-Condition (مقایسه و انشعاب بر اساس شرط) در UltraSPARC بهره میبرد. هنگام هدف قرار دادن پردازندهای که از این دستورالعملها پشتیبانی میکند (مانند Niagara-4 و بعد از آن)، پیشفرض -mcbcond است.
- -mfmaf
- -mno-fmaf
- با -mfmaf، کامپایلر GCC کدی تولید میکند که از دستورالعملهای ممیز شناور ضرب-جمع ادغامشده (Fused Multiply-Add) در UltraSPARC بهره میبرد. هنگام هدف قرار دادن پردازندهای که از این دستورالعملها پشتیبانی میکند (مانند Niagara-3 و بعد از آن)، پیشفرض -mfmaf است.
- -mfsmuld
- -mno-fsmuld
- با -mfsmuld، کامپایلر GCC کدی تولید میکند که از دستورالعمل ضرب ممیز شناور دقت یگانه به دوگانه (FsMULd) بهره میبرد. هنگام هدف قرار دادن پردازندهای که از نگارشهای معماری V8 یا V9 به همراه FPU پشتیبانی میکند (بهجز -mcpu=leon)، پیشفرض -mfsmuld است..IP -mpopc 4
- -mno-popc
- با فعال بودن -mpopc، کامپایلر GCC کدی تولید میکند که از دستور Population Count پردازنده UltraSPARC بهره میبرد. هنگام هدفگیری پردازندهای که از چنین دستورالعملی پشتیبانی میکند، مانند Niagara-2 و نسخههای پس از آن، حالت پیشفرض -mpopc است.
- -msubxc
- -mno-subxc
- با فعال بودن -msubxc، کامپایلر GCC کدی تولید میکند که از دستور Subtract-Extended-with-Carry پردازنده UltraSPARC بهره میبرد. هنگام هدفگیری پردازندهای که از چنین دستورالعملی پشتیبانی میکند، مانند Niagara-7 و جدیدتر، حالت پیشفرض -msubxc است.
- -mfix-at697f
- راهکار مستندشده برای رفع نقص سختافزاری (erratum) یگانه پردازنده Atmel AT697F را فعال میکند (که متناظر با نقص شماره ۱۳ پردازنده AT697E است).
- -mfix-ut699
- راهکارهای مستندشده برای نقصهای محاسبات ممیز شناور و ابطال حافظه نهان داده (data cache nullify) در پردازنده UT699 را فعال میکند.
- -mfix-ut700
- راهکار مستندشده برای نقص ذخیرهسازیهای متوالی (back-to-back store) در پردازنده UT699E/UT700 را فعال میکند.
- -mfix-gr712rc
- راهکار مستندشده برای نقص ذخیرهسازیهای متوالی (back-to-back store) در پردازنده GR712RC را فعال میکند.
این گزینههای -m علاوه بر موارد فوق، بر روی پردازندههای SPARC-V9 در محیطهای ۶۴ بیتی پشتیبانی میشوند:
- -m32
- -m64
- تولید کد برای یک محیط ۳۲ بیتی یا ۶۴ بیتی. محیط ۳۲ بیتی مقادیر int، long و اشارهگرها (pointer) را روی ۳۲ بیت تنظیم میکند. محیط ۶۴ بیتی مقدار int را روی ۳۲ بیت و مقادیر long و اشارهگر را روی ۶۴ بیت تنظیم میکند.
- -mptr32
- -mptr64
- به ترتیب استفاده از اشارهگرهای ۳۲ یا ۶۴ بیتی. بر خلاف گزینههای -m32 و -m64، این گزینه تنها روی اندازه اشارهگر تأثیر میگذارد و تغییری در ABI ایجاد نمیکند.
- -mcmodel=which
- مدل کد (code model) را روی یکی از موارد زیر تنظیم میکند:
- medlow
- مدل کد متوسط/پایین (Medium/Low): آدرسهای ۶۴ بیتی؛ برنامهها باید در ۳۲ بیت پایین حافظه پیوند داده شوند. برنامهها میتوانند به صورت ایستا یا پویا پیوند (link) شوند.
- medmid
- مدل کد متوسط/میانه (Medium/Middle): آدرسهای ۶۴ بیتی؛ برنامهها باید در ۴۴ بیت پایین حافظه پیوند داده شوند، اندازه بخشهای text و data باید کمتر از ۲ گیگابایت باشد و بخش data باید در فاصله حداکثر ۲ گیگابایتی از بخش text قرار گیرد.
- medany
- مدل کد متوسط/هرکجا (Medium/Anywhere): آدرسهای ۶۴ بیتی؛ برنامهها ممکن است در هر کجای حافظه پیوند داده شوند، اندازه بخشهای text و data باید کمتر از ۲ گیگابایت باشد و بخش data باید در فاصله حداکثر ۲ گیگابایتی از بخش text قرار گیرد.
- embmedany
- مدل کد متوسط/هرکجا برای سامانههای توکار (embedded): آدرسهای ۶۴ بیتی؛ اندازه بخشهای text و data باید کمتر از ۲ گیگابایت باشد، و هر دو میتوانند از هر کجای حافظه آغاز شوند (در زمان پیوند تعیین میشود). ثبات سراسری %g4 به مبنای بخش data اشاره میکند. برنامهها به صورت ایستا پیوند داده میشوند و قابلیت PIC پشتیبانی نمیشود.
- -mmemory-model=mem-model
- تنظیم مدل حافظه فعال روی پردازنده روی یکی از مقادیر زیر:
این مدلهای حافظه بهطور رسمی در پیوست D راهنمای معماری SPARC-V9 و مطابق با مقدار تعیینشده در فیلد "PSTATE.MM" پردازنده تعریف شدهاند.
- -mstack-bias
- -mno-stack-bias
- با فعال بودن -mstack-bias، کامپایلر GCC فرض میکند که اشارهگر پشته، و اشارهگر فریم (در صورت وجود)، دارای آفست -2047 هستند که هنگام ارجاع به فریم پشته باید دوباره افزوده شود. این حالت پیشفرض در حالت ۶۴ بیتی است. در غیر این صورت، عدم وجود چنین آفستی فرض میشود.
گزینههای System V
این گزینههای اضافی در System V Release 4 به منظور سازگاری با سایر کامپایلرها در آن سیستمها در دسترس هستند:
- -G
- ایجاد یک شیء اشتراکی (shared object). توصیه میشود بهجای این گزینه از -symbolic یا -shared استفاده شود.
- -YP,dirs
- جستجوی دایرکتوریهای dirs، و نه هیچ مسیر دیگری، برای یافتن کتابخانههای مشخصشده با -l.
- -Ym,dir
- جستجو در دایرکتوری dir برای یافتن پیشپردازنده M4. اسمبلر از این گزینه استفاده میکند.
گزینههای 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 را فعال میکند..IP -mtda=n 4 متغیرهای ایستا یا سراسری را که اندازهٔ آنها 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-relative) را غیرفعال (یا دوباره فعال) میکند.
- -msoft-float
- -mhard-float
- تولید دستورالعملهای ممیز شناور سختافزاری را غیرفعال (یا دوباره فعال) میکند. این گزینه تنها زمانی اثرگذار است که معماری مقصد V850E2V3 یا بالاتر باشد. اگر دستورالعملهای ممیز شناور سختافزاری تولید شوند، نماد پیشپردازندهٔ سی "__FPU_OK__" تعریف میشود، در غیر این صورت نماد "__NO_FPU__" تعریف خواهد شد.
- -mloop
- استفاده از دستورالعمل LOOP معماری e3v5 را فعال میکند. هنگام انتخاب معماری e3v5 استفاده از این دستورالعمل بهطور پیشفرض فعال نیست، زیرا کاربرد آن هنوز در مرحلهٔ آزمایشی است.
- -mrh850-abi
- -mghs
- پشتیبانی از نسخهٔ RH850 از V850 ABI را فعال میکند. این حالت پیشفرض است. با این نسخه از ABI، قوانین زیر اعمال میشوند:
- ساختارها و اجتماعهای با اندازهٔ عدد صحیح (integer)، به جای ثبات از طریق یک اشارهگر حافظه بازگردانده میشوند.
- ساختارها و اجتماعهای بزرگ (با اندازهای بیش از ۸ بایت) با مقدار (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
- -mno-big-switch
- کدی مناسب برای جدولهای switch بزرگ تولید میکند. تنها زمانی از این گزینه استفاده کنید که اسمبلر یا پیونددهنده در مورد انشعابهای خارج از محدوده درون یک جدول switch هشدار یا خطا دهند.
- -mapp-regs
- -mno-app-regs
- گزینهٔ -mapp-regs باعث میشود r2 و r5 در کدهای تولیدشده توسط کامپایلر مورد استفاده قرار گیرند. این تنظیم، پیشفرض است. گزینهٔ -mno-app-regs باعث میشود با r2 و r5 به عنوان ثباتهای ثابت برخورد شود..IP -msmall-sld 4
- -mno-small-sld
- فعال یا غیرفعال کردن استفاده از دستورالعملهای بارگذاری کوتاه (short load).
- -mno-strict-align
- ترازسازی سختگیرانهٔ دادهها را تحمیل نمیکند.
- -mjump-tables-in-data-section
- -mno-jump-tables-in-data-section
- فعال یا غیرفعال کردن قرارگیری جدولهای پرش برای دستورات switch در بخش ".data" بهجای بخش ".code". پیشفرض -mno-jump-tables-in-data-section است.
گزینههای VAX
این گزینههای -m برای VAX تعریف شدهاند:
- -munix
- دستورالعملهای پرش خاصی ("aobleq" و غیره) را که اسمبلر Unix برای VAX نمیتواند در بازههای طولانی مدیریت کند، در خروجی تولید نمیکند.
- -mgnu
- با این فرض که اسمبلر GNU در حال استفاده است، آن دستورالعملهای پرش را در خروجی تولید میکند.
- -md
- -md-float
- برای اعداد ممیز شناور با دقت مضاعف بهجای G_floating از قالب دادهای D_floating استفاده میکند.
- -mg
- -mg-float
- برای اعداد ممیز شناور با دقت مضاعف بهجای D_floating از قالب دادهای G_floating استفاده میکند.
- -mlra
- -mno-lra
- تخصیص محلی ثباتها (Local Register Allocation) را فعال میکند. این قابلیت برای VAX هنوز آزمایشی است، بنابراین کامپایلر بهطور پیشفرض از reload استاندارد استفاده میکند.
- -mvaxc-alignment
- از قراردادهای VAXC برای ترازسازی اعضای ساختار (structure) استفاده میکند.
- -mqmath
- -mno-qmath
- فعال یا غیرفعال کردن الگوهای دستورالعمل جدید برای جمع و تفریق اعداد صحیح ۶۴ بیتی.
گزینههای Visium
- -mdebug
- هنگام پیوند دادن برنامههایی که ورودی/خروجی فایل انجام میدهند و قرار است روی یک مقصد MCM اجرا شوند، از این گزینه استفاده کنید. این گزینه باعث پیوند خوردن کتابخانههای libc.a و libdebug.a میشود. باید برنامه را روی مقصد تحت کنترل استاب دیباگ از راه دور GDB اجرا کنید.
- -msim
- هنگام پیوند دادن برنامههایی که ورودی/خروجی فایل انجام میدهند و قرار است روی شبیهساز اجرا شوند، از این گزینه استفاده کنید. این گزینه باعث پیوند خوردن کتابخانههای libc.a و libsim.a میشود.
- -mfpu
- -mhard-float
- تولید کد حاوی دستورالعملهای ممیز شناور. این حالت پیشفرض است.
- -mno-fpu
- -msoft-float
- تولید کد
حاوی
فراخوانیهای
کتابخانهای
برای ممیز
شناور.
گزینهٔ -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 آغاز میشود بهعنوان روال اصلی برای دیباگر.
- -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 است و مسیرهای کتابخانه برای هر دو انتخاب یکسان است.
- -mvthreads
- پیوند دادن به محیط زمان اجرای VxWorks AE vThread.
- -non-static
- پیوند دادن یک فایل اجرایی RTP به کتابخانههای اشتراکی بهجای کتابخانههای ایستا. گزینههای -static و -shared نیز میتوانند برای RTPها استفاده شوند؛ -static پیشفرض است..IP -Bstatic 4
- -Bdynamic
- این گزینهها به پیونددهنده منتقل میشوند. آنها برای سازگاری با 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،
سطح
ریزمعماری
متناظر را
از psABI مربوط
به x86-64 انتخاب
میکنند. در
ABIهایی غیر
از psABI برای x86-64،
این
گزینهها
همان
ویژگیهای
CPU را انتخاب
میکنند که
psABI برای x86-64
برای آن سطح
ریزمعماری
خاص مستند
کرده است.
از آنجا که این مقادیرِ 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 MCU، بر پایه پردازنده 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
- pentium3m
- پردازنده 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 با پشتیبانی از افزونههای ۶۴ بیتی و مجموعههای دستورالعمل MMX، SSE، SSE2، SSE3، CX16 و FXSR.
- core2
- پردازنده Intel Core 2 با پشتیبانی از افزونههای ۶۴ بیتی و مجموعههای دستورالعمل MMX، SSE، SSE2، SSE3، SSSE3، CX16، SAHF و FXSR.
- nehalem
- corei7
- پردازنده Intel Nehalem با پشتیبانی از افزونههای ۶۴ بیتی و مجموعههای دستورالعمل MMX، SSE، SSE2، SSE3، SSSE3، SSE4.1، SSE4.2، POPCNT، CX16، SAHF و FXSR.
- westmere
- پردازنده Intel Westmere با پشتیبانی از افزونههای ۶۴ بیتی و مجموعههای دستورالعمل MMX، SSE، SSE2، SSE3، SSSE3، SSE4.1، SSE4.2، POPCNT، CX16، SAHF، FXSR و PCLMUL.
- sandybridge
- corei7-avx
- پردازنده Intel Sandy Bridge با پشتیبانی از افزونههای ۶۴ بیتی و مجموعههای دستورالعمل MMX، SSE، SSE2، SSE3، SSSE3، SSE4.1، SSE4.2، POPCNT، CX16، SAHF، FXSR، AVX، XSAVE و PCLMUL.
- ivybridge
- core-avx-i
- پردازنده Intel Ivy Bridge با پشتیبانی از افزونههای ۶۴ بیتی و مجموعههای دستورالعمل MMX، SSE، SSE2، SSE3، SSSE3، SSE4.1، SSE4.2، POPCNT، CX16، SAHF، FXSR، AVX، XSAVE، PCLMUL، FSGSBASE، RDRND و F16C.
- haswell
- core-avx2
- پردازنده Intel Haswell با پشتیبانی از افزونههای ۶۴ بیتی و مجموعههای دستورالعمل 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 با پشتیبانی از افزونههای ۶۴ بیتی و مجموعههای دستورالعمل 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 با پشتیبانی از افزونههای ۶۴ بیتی و مجموعههای دستورالعمل 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..IP skylake-avx512 4 پردازنده سرور Intel Skylake با افزونههای 64-بیتی و پشتیبانی از مجموعه دستورالعملهای MMX، SSE، SSE2، SSE3، SSSE3، SSE4.1، SSE4.2، POPCNT، CX16، SAHF، FXSR، AVX، XSAVE، PCLMUL، FSGSBASE، RDRND، F16C، AVX2، BMI، BMI2، LZCNT، FMA، MOVBE، HLE، RDSEED، ADCX، PREFETCHW، AES، CLFLUSHOPT، XSAVEC، XSAVES، SGX، AVX512F، CLWB، AVX512VL، AVX512BW، AVX512DQ و AVX512CD.
- cascadelake
- پردازنده Intel Cascade Lake با افزونههای 64-بیتی و پشتیبانی از مجموعه دستورالعملهای MMX، SSE، SSE2، SSE3، SSSE3، SSE4.1، SSE4.2، POPCNT، CX16، SAHF، FXSR، AVX، XSAVE، PCLMUL، FSGSBASE، RDRND، F16C، AVX2، BMI، BMI2، LZCNT، FMA، MOVBE، HLE، RDSEED، ADCX، PREFETCHW، AES، CLFLUSHOPT، XSAVEC، XSAVES، SGX، AVX512F، CLWB، AVX512VL، AVX512BW، AVX512DQ، AVX512CD و AVX512VNNI.
- cannonlake
- پردازنده سرور Intel Cannon Lake با افزونههای 64-بیتی و پشتیبانی از مجموعه دستورالعملهای MMX، SSE، SSE2، SSE3، SSSE3، SSE4.1، SSE4.2، POPCNT، CX16، SAHF، FXSR، AVX، XSAVE، PCLMUL، FSGSBASE، RDRND، F16C، AVX2، BMI، BMI2، LZCNT، FMA، MOVBE، HLE، RDSEED، ADCX، PREFETCHW، AES، CLFLUSHOPT، XSAVEC، XSAVES، SGX، AVX512F، AVX512VL، AVX512BW، AVX512DQ، AVX512CD، PKU، AVX512VBMI، AVX512IFMA و SHA.
- cooperlake
- پردازنده Intel Cooper Lake با افزونههای 64-بیتی و پشتیبانی از مجموعه دستورالعملهای MMX، SSE، SSE2، SSE3، SSSE3، SSE4.1، SSE4.2، POPCNT، CX16، SAHF، FXSR، AVX، XSAVE، PCLMUL، FSGSBASE، RDRND، F16C، AVX2، BMI، BMI2، LZCNT، FMA، MOVBE، HLE، RDSEED، ADCX، PREFETCHW، AES، CLFLUSHOPT، XSAVEC، XSAVES، SGX، AVX512F، CLWB، AVX512VL، AVX512BW، AVX512DQ، AVX512CD، AVX512VNNI و AVX512BF16.
- icelake-client
- پردازنده کلاینت Intel Ice Lake با افزونههای 64-بیتی و پشتیبانی از مجموعه دستورالعملهای MMX، SSE، SSE2، SSE3، SSSE3، SSE4.1، SSE4.2، POPCNT، CX16، SAHF، FXSR، AVX، XSAVE، PCLMUL، FSGSBASE، RDRND، F16C، AVX2، BMI، BMI2، LZCNT، FMA، MOVBE، HLE، RDSEED، ADCX، PREFETCHW، AES، CLFLUSHOPT، XSAVEC، XSAVES، SGX، AVX512F، AVX512VL، AVX512BW، AVX512DQ، AVX512CD، PKU، AVX512VBMI، AVX512IFMA، SHA، AVX512VNNI، GFNI، VAES، AVX512VBMI2، VPCLMULQDQ، AVX512BITALG، RDPID و AVX512VPOPCNTDQ.
- icelake-server
- پردازنده سرور Intel Ice Lake با افزونههای 64-بیتی و پشتیبانی از مجموعه دستورالعملهای MMX، SSE، SSE2، SSE3، SSSE3، SSE4.1، SSE4.2، POPCNT، CX16، SAHF، FXSR، AVX، XSAVE، PCLMUL، FSGSBASE، RDRND، F16C، AVX2، BMI، BMI2، LZCNT، FMA، MOVBE، HLE، RDSEED، ADCX، PREFETCHW، AES، CLFLUSHOPT، XSAVEC، XSAVES، SGX، AVX512F، AVX512VL، AVX512BW، AVX512DQ، AVX512CD، PKU، AVX512VBMI، AVX512IFMA، SHA، AVX512VNNI، GFNI، VAES، AVX512VBMI2، VPCLMULQDQ، AVX512BITALG، RDPID، AVX512VPOPCNTDQ، PCONFIG، WBNOINVD و CLWB.
- tigerlake
- پردازنده Intel Tiger Lake با افزونههای 64-بیتی و پشتیبانی از مجموعه دستورالعملهای MMX، SSE، SSE2، SSE3، SSSE3، SSE4.1، SSE4.2، POPCNT، CX16، SAHF، FXSR، AVX، XSAVE، PCLMUL، FSGSBASE، RDRND، F16C، AVX2، BMI، BMI2، LZCNT، FMA، MOVBE، HLE، RDSEED، ADCX، PREFETCHW، AES، CLFLUSHOPT، XSAVEC، XSAVES، SGX، AVX512F، AVX512VL، AVX512BW، AVX512DQ، AVX512CD، PKU، AVX512VBMI، AVX512IFMA، SHA، AVX512VNNI، GFNI، VAES، AVX512VBMI2، VPCLMULQDQ، AVX512BITALG، RDPID، AVX512VPOPCNTDQ، MOVDIRI، MOVDIR64B، CLWB، AVX512VP2INTERSECT و KEYLOCKER.
- rocketlake
- پردازنده Intel Rocket Lake با افزونههای 64-بیتی و پشتیبانی از مجموعه دستورالعملهای MMX، SSE، SSE2، SSE3، SSSE3، SSE4.1، SSE4.2، POPCNT، CX16، SAHF، FXSR، AVX، XSAVE، PCLMUL، FSGSBASE، RDRND، F16C، AVX2، BMI، BMI2، LZCNT، FMA، MOVBE، HLE، RDSEED، ADCX، PREFETCHW، AES، CLFLUSHOPT، XSAVEC، XSAVES، AVX512F، AVX512VL، AVX512BW، AVX512DQ، AVX512CD، PKU، AVX512VBMI، AVX512IFMA، SHA، AVX512VNNI، GFNI، VAES، AVX512VBMI2، VPCLMULQDQ، AVX512BITALG، RDPID و AVX512VPOPCNTDQ.
- alderlake
- raptorlake
- meteorlake
- gracemont
- پردازنده Intel Alder Lake/Raptor Lake/Meteor Lake/Gracemont با افزونههای 64-بیتی و پشتیبانی از مجموعه دستورالعملهای MOVBE، MMX، SSE، SSE2، SSE3، SSSE3، SSE4.1، SSE4.2، POPCNT، CX16، AES، PREFETCHW، PCLMUL، RDRND، XSAVE، XSAVEC، XSAVES، XSAVEOPT، FSGSBASE، PTWRITE، RDPID، SGX، GFNI-SSE، CLWB، MOVDIRI، MOVDIR64B، WAITPKG، ADCX، AVX، AVX2، BMI، BMI2، F16C، FMA، LZCNT، PCONFIG، PKU، VAES، VPCLMULQDQ، SERIALIZE، HRESET، KL، WIDEKL و AVX-VNNI.
- arrowlake
- پردازنده Intel Arrow Lake با افزونههای 64-بیتی و پشتیبانی از مجموعه دستورالعملهای MOVBE، MMX، SSE، SSE2، SSE3، SSSE3، SSE4.1، SSE4.2، POPCNT، CX16، AES، PREFETCHW، PCLMUL، RDRND، XSAVE، XSAVEC، XSAVES، XSAVEOPT، FSGSBASE، PTWRITE، RDPID، SGX، GFNI-SSE، CLWB، MOVDIRI، MOVDIR64B، WAITPKG، ADCX، AVX، AVX2، BMI، BMI2، F16C، FMA، LZCNT، PCONFIG، PKU، VAES، VPCLMULQDQ، SERIALIZE، HRESET، KL، WIDEKL، AVX-VNNI، UINTR، AVXIFMA، AVXVNNIINT8، AVXNECONVERT و CMPCCXADD.
- arrowlake-s
- lunarlake
- پردازنده Intel Arrow Lake S/Lunar Lake با افزونههای 64-بیتی و پشتیبانی از مجموعه دستورالعملهای MOVBE، MMX، SSE، SSE2، SSE3، SSSE3، SSE4.1، SSE4.2، POPCNT، CX16، 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.
- pantherlake
- wildcatlake
- پردازنده Intel Panther Lake/Wildcat Lake با افزونههای 64-بیتی و پشتیبانی از مجموعه دستورالعملهای MOVBE، MMX، SSE، SSE2، SSE3، SSSE3، SSE4.1، SSE4.2، POPCNT، CX16، 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.
- novalake
- پردازنده Intel Nova Lake با افزونههای 64-بیتی و پشتیبانی از مجموعه دستورالعملهای MOVBE، MMX، SSE، SSE2، SSE3، SSSE3، SSE4.1، SSE4.2، POPCNT، CX16، 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، APX_F، AVX10.1، AVX10.2 و MOVRS.
- sapphirerapids
- emeraldrapids
- پردازنده Intel Sapphire Rapids/Emerald Rapids با افزونههای 64-بیتی و پشتیبانی از مجموعه دستورالعملهای MMX، SSE، SSE2، SSE3، SSSE3، SSE4.1، SSE4.2، POPCNT، CX16، SAHF، FXSR، AVX، XSAVE، PCLMUL، FSGSBASE، RDRND، F16C، AVX2، BMI، BMI2، LZCNT، FMA، MOVBE، HLE، RDSEED، ADCX، PREFETCHW، AES، CLFLUSHOPT، XSAVEC، XSAVES، SGX، AVX512F، AVX512VL، AVX512BW، AVX512DQ، AVX512CD، PKU، AVX512VBMI، AVX512IFMA، SHA، AVX512VNNI، GFNI، VAES، AVX512VBMI2، VPCLMULQDQ، AVX512BITALG، RDPID، AVX512VPOPCNTDQ، PCONFIG، WBNOINVD، CLWB، 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-بیتی و پشتیبانی از مجموعه دستورالعملهای 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-بیتی و پشتیبانی از مجموعه دستورالعملهای 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-بیتی و پشتیبانی از مجموعه دستورالعملهای 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، MOVRS و AMX-MOVRS.
- bonnell
- atom
- پردازنده Intel Bonnell با پشتیبانی از افزونههای 64-bit و مجموعهدستورهای MOVBE، MMX، SSE، SSE2، SSE3، SSSE3 و CX16.
- 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، CX16، 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، CX16، 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، CX16، AES، PREFETCHW، PCLMUL، RDRND، XSAVE، XSAVEC، XSAVES، XSAVEOPT، FSGSBASE، PTWRITE، RDPID، SGX، GFNI-SSE، CLWB، MOVDIRI، MOVDIR64B، CLDEMOTE، WAITPKG، ADCX، AVX، AVX2، BMI، BMI2، F16C، FMA، LZCNT، PCONFIG، PKU، VAES، VPCLMULQDQ، SERIALIZE، HRESET، AVX-VNNI، ENQCMD، UINTR، AVXIFMA، AVXVNNIINT8، AVXNECONVERT، CMPCCXADD، AVXVNNIINT16، SHA512، SM3، SM4، USER_MSR و PREFETCHI.
- k6
- پردازنده AMD K6 با پشتیبانی از مجموعهدستورهای MMX.
- k6-2
- k6-3
- نسخههای بهبودیافته از پردازنده AMD K6 با پشتیبانی از مجموعهدستورهای MMX و 3DNow!.
- athlon
- athlon-tbird
- پردازنده AMD Athlon با پشتیبانی از مجموعهدستورهای MMX، 3dNOW!، enhanced 3DNow! و دستورالعملهای پیشواکشی SSE.
- athlon-4
- athlon-xp
- athlon-mp
- پردازنده بهبودیافته AMD Athlon با پشتیبانی از MMX، 3DNow!، enhanced 3DNow! و مجموعهدستورهای کامل SSE.
- k8
- opteron
- athlon64
- athlon-fx
- پردازندههای مبتنی بر هسته AMD K8 با پشتیبانی از مجموعهدستورهای x86-64، شامل پردازندههای AMD Opteron، Athlon 64 و Athlon 64 FX. (این گزینه ابرمجموعهای از MMX، SSE، SSE2، 3DNow!، enhanced 3DNow! و افزونههای مجموعهدستور 64-bit است.)
- k8-sse3
- opteron-sse3
- athlon64-sse3
- نسخههای بهبودیافته از هستههای AMD K8 با پشتیبانی از مجموعهدستورهای SSE3.
- amdfam10
- barcelona
- پردازندههای مبتنی بر هستههای AMD Family 10h با پشتیبانی از مجموعهدستورهای x86-64. (این گزینه ابرمجموعهای از CX16، MMX، SSE، SSE2، SSE3، SSE4A، 3DNow!، enhanced 3DNow!، ABM و افزونههای مجموعهدستور 64-bit است.)
- bdver1
- پردازندههای مبتنی بر هستههای 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 است.).IP znver6 4 پردازندههای مبتنی بر هستههای 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، AVXVNNIINT8، AVXIFMA، AVX512FP16، AVXNECONVERT، AVX512BMM و افزونههای مجموعه دستورات 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.
- c86-4g-m4
- پردازندهٔ HYGON c86-4g-m4 با پشتیبانی از مجموعه دستورات x86-64، MMX، SSE، SSE2، SSE3، SSE4A، CX16، ABM، SSSE3، SSE4.1، SSE4.2، AES، PCLMUL، AVX، AVX2، BMI، BMI2، F16C، FMA، PRFCHW، FXSR، SHA، XSAVE، XSAVEOPT، XSAVEC، FSGSBASE، RDRND، MOVBE، MWAITX، ADX، RDSEED، CLZERO، CLFLUSHOPT، XSAVES، LZCNT و POPCNT.
- c86-4g-m6
- پردازندهٔ HYGON c86-4g-m6 با پشتیبانی از مجموعه دستورات x86-64، MMX، SSE، SSE2، SSE3، SSE4A، CX16، ABM، SSSE3، SSE4.1، SSE4.2، AES، PCLMUL، AVX، AVX2، BMI، BMI2، F16C، FMA، PRFCHW، FXSR، SHA، XSAVE، XSAVEOPT، XSAVEC، FSGSBASE، RDRND، MOVBE، MWAITX، ADX، RDSEED، CLZERO، CLFLUSHOPT، XSAVES، LZCNT و POPCNT.
- c86-4g-m7
- پردازندهٔ HYGON c86-4g-m7 با پشتیبانی از مجموعه دستورات x86-64، MMX، SSE، SSE2، SSE3، SSE4A، CX16، ABM، SSSE3، SSE4.1، SSE4.2، AES، PCLMUL، AVX، AVX2، BMI، BMI2، F16C، FMA، PRFCHW، FXSR، SHA، XSAVE، XSAVEOPT، XSAVEC، FSGSBASE، RDRND، MOVBE، MWAITX، ADX، RDSEED، CLZERO، CLFLUSHOPT، XSAVES، LZCNT، POPCNT، AVX512F، AVX512DQ، AVX512IFMA، AVX512CD، AVX512BW، AVX512VL، AVX512BF16، AVX512VBMI، AVX512VBMI2، GFNI، AVX512VNNI، VAES، AVX512BITALG، AVX512VPOPCNTDQ، AVX512VP2INTERSECT، AVXVNNI، VPCLMULQDQ و WBNOINVD.
- c86-4g-m8
- پردازندهٔ HYGON c86-4g-m8 با پشتیبانی از مجموعه دستورات x86-64، MMX، SSE، SSE2، SSE3، SSE4A، CX16، ABM، SSSE3، SSE4.1، SSE4.2، AES، PCLMUL، AVX، AVX2، BMI، BMI2، F16C، FMA، PRFCHW، FXSR، SHA، XSAVE، XSAVEOPT، XSAVEC، FSGSBASE، RDRND، MOVBE، MWAITX، ADX، RDSEED، CLZERO، CLFLUSHOPT، XSAVES، LZCNT، POPCNT، AVX512F، AVX512DQ، AVX512IFMA، AVX512CD، AVX512BW، AVX512VL، AVX512BF16، AVX512VBMI، AVX512VBMI2، GFNI، AVX512VNNI، VAES، AVX512BITALG، AVX512VPOPCNTDQ، AVX512VP2INTERSECT، AVXVNNI، VPCLMULQDQ و WBNOINVD.
- -mtune=cpu-type
- تمام موارد
قابل اعمال
بر کد
تولیدشده
را برای cpu-type
تنظیم و
بهینهسازی
میکند، به
جز ABI و
مجموعه
دستورات
دردسترس. در
حالی که
انتخاب یک
cpu-type خاص،
امور را
بهطور
مناسب برای
آن تراشهٔ
معین
زمانبندی
میکند،
کامپایلر
کدی تولید
نخواهد کرد
که نتواند
روی نوع
ماشین
پیشفرض
اجرا شود،
مگر اینکه
از گزینهٔ
-march=cpu-type
استفاده
کنید. برای
نمونه، اگر
GCC برای i686-pc-linux-gnu
پیکربندی
شده باشد،
آنگاه -mtune=pentium4
کدی تولید
میکند که
برای Pentium 4
بهینهسازی
شده اما
همچنان روی
ماشینهای
i686 اجرا
میشود.
گزینههای انتخابی برای cpu-type همانند انتخابهای موجود برای -march هستند. علاوه بر این، -mtune از ۲ انتخاب اضافه برای cpu-type پشتیبانی میکند:
- generic
- تولید کد
بهینهسازیشده
برای
رایجترین
پردازندههای
IA32/AMD64/EM64T. اگر
پردازندهای
را که کد
شما روی آن
اجرا خواهد
شد
میشناسید،
باید
بهجای -mtune=generic
از گزینهٔ
متناظر -mtune
یا -march
استفاده
نمایید. اما
اگر دقیقاً
نمیدانید
کاربران
برنامهٔ
شما چه
پردازندهای
در اختیار
خواهند
داشت، باید
از این
گزینه
استفاده
کنید.
همگام با ورود پردازندههای جدید به بازار، رفتار این گزینه تغییر خواهد کرد. بنابراین، اگر به نسخهٔ جدیدتری از GCC ارتقا دهید، تولید کد کنترلشده توسط این گزینه برای بازتاب پردازندههایی که در زمان انتشار آن نسخه از GCC بیشترین رواج را داشتهاند، تغییر خواهد کرد.
گزینهای تحت عنوان -march=generic وجود ندارد، زیرا -march بیانگر مجموعه دستوراتی است که کامپایلر مجاز به استفاده از آنهاست، و هیچ مجموعه دستور عمومی قابل اعمالی برای همهٔ پردازندهها وجود ندارد. در مقابل، -mtune پردازنده (یا در این مورد، مجموعهای از پردازندهها) را مشخص میکند که کد برای آن بهینهسازی میشود..IP intel 4 تولید کدی که برای جدیدترین پردازندههای Intel بهینهسازی شده است، که برای این نسخه از GCC شامل Haswell و Silvermont میشوند. اگر پردازندهای را که کد شما روی آن اجرا خواهد شد میشناسید، باید بهجای -mtune=intel از گزینهٔ متناظر -mtune یا -march استفاده کنید. اما اگر میخواهید برنامهتان هم روی Diamond Rapids و هم روی Clearwater Forest عملکرد بهتری داشته باشد، باید از این گزینه استفاده کنید.
با عرضهٔ پردازندههای جدید Intel به بازار، رفتار این گزینه تغییر خواهد کرد. بنابراین، اگر به نسخهٔ جدیدتری از GCC ارتقا دهید، تولید کدِ کنترلشده توسط این گزینه تغییر خواهد کرد تا منعکسکنندهٔ جدیدترین پردازندههای Intel در زمان انتشار آن نسخه از GCC باشد.
گزینهای به نام -march=intel وجود ندارد، زیرا -march نشاندهندهٔ مجموعه دستورالعملهایی است که کامپایلر میتواند استفاده کند، و هیچ مجموعه دستورالعمل مشترکی وجود ندارد که برای همهٔ پردازندهها قابلاعمال باشد. در مقابل، -mtune پردازنده (یا در این مورد، مجموعهای از پردازندهها) را مشخص میکند که کد برای آن بهینهسازی میشود.
گزینههای زیر امکان کنترل دقیقتری را بر روی اینکه کدام افزونههای مجموعه دستورالعمل توسط GCC هدف قرار گیرند، فراهم میکنند. هر یک دارای یک گزینهٔ متناظر -mno- برای غیرفعال کردن استفاده از این دستورالعملها است.
این افزونهها همچنین بهصورت توابع توکار (built-in functions) در دسترس هستند: برای جزئیات توابعی که با این گزینهها فعال و غیرفعال میشوند، x86 Built-in Functions را ببینید.
این گزینهها GCC را قادر میسازند تا از این دستورالعملهای گسترشیافته در کد تولیدشده استفاده کند. برنامههایی که تشخیص پردازنده را در زمان اجرا انجام میدهند، باید برای هر معماری پشتیبانیشده فایلهای جداگانهای را با پرچمهای مناسب کامپایل کنند. بهویژه، فایلی که حاوی کد تشخیص پردازنده است باید بدون این گزینهها کامپایل شود.
برای کنترل اینکه آیا دستورالعملهای 387 یا SSE/AVX بهطور خودکار برای محاسبات ممیز شناور تولید شوند یا خیر، گزینهٔ -mfpmath= را در زیر ببینید.
- -mmmx
- پشتیبانی از توابع توکار MMX.
- -msse
- پشتیبانی از توابع توکار و تولید کد MMX و SSE.
- -msse2
- پشتیبانی از توابع توکار و تولید کد MMX، SSE و SSE2.
- -msse3
- پشتیبانی از توابع توکار و تولید کد MMX، SSE، SSE2 و SSE3.
- -mssse3
- پشتیبانی از توابع توکار و تولید کد MMX، SSE، SSE2، SSE3 و SSSE3.
- -msse4.1
- پشتیبانی از توابع توکار و تولید کد MMX، SSE، SSE2، SSE3، SSSE3 و SSE4.1.
- -msse4.2
- پشتیبانی از توابع توکار و تولید کد MMX، SSE، SSE2، SSE3، SSSE3، SSE4.1 و SSE4.2.
- -msse4
- پشتیبانی
از توابع
توکار و
تولید کد MMX،
SSE، SSE2، SSE3، SSSE3، SSE4.1 و
SSE4.2.
توجه داشته باشید که -msse4 هر دو پشتیبانی از SSE4.1 و SSE4.2 را فعال میکند، در حالی که -mno-sse4 آن ویژگیها را خاموش میکند؛ هیچیک از اَشکال این گزینه بر پشتیبانی از SSE4A، که بهطور جداگانه توسط -msse4a کنترل میشود، تأثیری ندارد.
- -msse4a
- پشتیبانی از توابع توکار و تولید کد MMX، SSE، SSE2، SSE3 و SSE4A.
- -mavx
- پشتیبانی از توابع توکار و تولید کد MMX، SSE، SSE2، SSE3، SSSE3، SSE4.1، SSE4.2 و AVX.
- -mavx2
- پشتیبانی از توابع توکار و تولید کد MMX، SSE، SSE2، SSE3، SSSE3، SSE4.1، SSE4.2، AVX و AVX2.
- -mavx512f
- پشتیبانی از توابع توکار و تولید کد MMX، SSE، SSE2، SSE3، SSSE3، SSE4.1، SSE4.2، AVX، AVX2 و AVX512F.
- -mavx512cd
- پشتیبانی از توابع توکار و تولید کد MMX، SSE، SSE2، SSE3، SSSE3، SSE4.1، SSE4.2، AVX، AVX2، AVX512F و AVX512CD.
- -mavx512vl
- پشتیبانی از توابع توکار و تولید کد MMX، SSE، SSE2، SSE3، SSSE3، SSE4.1، SSE4.2، AVX، AVX2، AVX512F و AVX512VL.
- -mavx512bw
- پشتیبانی از توابع توکار و تولید کد MMX، SSE، SSE2، SSE3، SSSE3، SSE4.1، SSE4.2، AVX، AVX2، AVX512F و AVX512BW.
- -mavx512dq
- پشتیبانی از توابع توکار و تولید کد MMX، SSE، SSE2، SSE3، SSSE3، SSE4.1، SSE4.2، AVX، AVX2، AVX512F و AVX512DQ.
- -mavx512ifma
- پشتیبانی از توابع توکار و تولید کد MMX، SSE، SSE2، SSE3، SSSE3، SSE4.1، SSE4.2، AVX، AVX2، AVX512F و AVX512IFMA.
- -mavx512vbmi
- پشتیبانی از توابع توکار و تولید کد MMX، SSE، SSE2، SSE3، SSSE3، SSE4.1، SSE4.2، AVX، AVX2، AVX512F و AVX512VBMI.
- -mavx512vpopcntdq
- پشتیبانی از توابع توکار و تولید کد MMX، SSE، SSE2، SSE3، SSSE3، SSE4.1، SSE4.2، AVX، AVX2، AVX512F و AVX512VPOPCNTDQ.
- -mavx512vp2intersect
- پشتیبانی از توابع توکار و تولید کد AVX512VP2INTERSECT.
- -mavx512vnni
- پشتیبانی از توابع توکار و تولید کد AVX512VNNI.
- -mavx512vbmi2
- پشتیبانی از توابع توکار و تولید کد MMX، SSE، SSE2، SSE3، SSSE3، SSE4.1، SSE4.2، AVX، AVX2، AVX512F و AVX512VBMI2.
- -mavx512bf16
- پشتیبانی از توابع توکار و تولید کد MMX، SSE، SSE2، SSE3، SSSE3، SSE4.1، SSE4.2، AVX، AVX2، AVX512F و AVX512BF16.
- -mavx512fp16
- پشتیبانی از توابع توکار و تولید کد MMX، SSE، SSE2، SSE3، SSSE3، SSE4.1، SSE4.2، AVX، AVX2، AVX512F و AVX512-FP16.
- -mavx512bitalg
- پشتیبانی از توابع توکار و تولید کد MMX، SSE، SSE2، SSE3، SSSE3، SSE4.1، SSE4.2، AVX، AVX2، AVX512F و AVX512BITALG.
- -mavx512bmm
- پشتیبانی از توابع توکار و تولید کد AVX512BMM.
- -mavxvnni
- پشتیبانی از توابع توکار و تولید کد MMX، SSE، SSE2، SSE3، SSSE3، SSE4.1، SSE4.2، AVX، AVX2 و AVXVNNI.
- -mavxifma
- پشتیبانی از توابع توکار و تولید کد MMX، SSE، SSE2، SSE3، SSSE3، SSE4.1، SSE4.2، AVX، AVX2 و AVXIFMA.
- -mavxvnniint8
- پشتیبانی از توابع توکار و تولید کد MMX، SSE، SSE2، SSE3، SSSE3، SSE4.1، SSE4.2، AVX، AVX2 و AVXVNNIINT8.
- -mavxneconvert
- پشتیبانی از توابع توکار و تولید کد MMX، SSE، SSE2، SSE3، SSSE3، SSE4.1، SSE4.2، AVX، AVX2 و AVXNECONVERT.
- -mavxvnniint16
- پشتیبانی از توابع توکار و تولید کد MMX، SSE، SSE2، SSE3، SSSE3، SSE4.1، SSE4.2، AVX، AVX2 و AVXVNNIINT16.
- -mavx10.1
- پشتیبانی از توابع توکار و تولید کد MMX، SSE، SSE2، SSE3، SSSE3، SSE4.1، SSE4.2، AVX، AVX2 و AVX10.1.
- -mavx10.2
- پشتیبانی از توابع توکار و تولید کد MMX، SSE، SSE2، SSE3، SSSE3، SSE4.1، SSE4.2، AVX، AVX2، AVX10.1 و AVX10.2.
- -msha
- پشتیبانی از توابع توکار و تولید کد SHA1 و SHA256.
- -maes
- پشتیبانی از توابع توکار و تولید کد AES.
- -mpclmul
- پشتیبانی از توابع توکار و تولید کد PCLMUL.
- -mclflushopt
- پشتیبانی از دستورالعملهای CLFLUSHOPT..IP -mclwb 4 پشتیبانی از دستور CLWB.
- -mfsgsbase
- پشتیبانی از توابع توکار و تولید کد FSGSBASE.
- -mptwrite
- پشتیبانی از توابع توکار و تولید کد PTWRITE.
- -mrdrnd
- پشتیبانی از توابع توکار و تولید کد RDRND.
- -mf16c
- پشتیبانی از توابع توکار و تولید کد F16C.
- -mfma
- پشتیبانی از توابع توکار و تولید کد MMX، SSE، SSE2، SSE3، SSSE3، SSE4.1، SSE4.2، AVX و FMA.
- -mfma4
- پشتیبانی از توابع توکار و تولید کد FMA4.
- -mpconfig
- پشتیبانی از توابع توکار و تولید کد PCONFIG.
- -mwbnoinvd
- پشتیبانی از توابع توکار و تولید کد WBNOINVD.
- -mprfchw
- پشتیبانی از دستور PREFETCHW.
- -mrdpid
- پشتیبانی از توابع توکار و تولید کد RDPID.
- -mrdseed
- پشتیبانی از دستور RDSEED.
- -msgx
- پشتیبانی از توابع توکار و تولید کد SGX.
- -mxop
- پشتیبانی از توابع توکار و تولید کد XOP.
- -mlwp
- پشتیبانی از توابع توکار و تولید کد LWP.
- -m3dnow
- پشتیبانی از توابع توکار !3DNow.
- -m3dnowa
- پشتیبانی از توابع توکار !Athlon 3Dnow.
- -mpopcnt
- پشتیبانی از تولید کد دستور popcnt.
- -mabm
- پشتیبانی از تولید کد دستورهای عملیات بیتی پیشرفته (ABM).
- -madx
- پشتیبانی از دستورهای add-carry با حفظ پرچم.
- -mbmi
- پشتیبانی از توابع توکار و تولید کد BMI.
- -mbmi2
- پشتیبانی از توابع توکار و تولید کد BMI2.
- -mlzcnt
- پشتیبانی از تابع توکار و تولید کد LZCNT.
- -mfxsr
- پشتیبانی از دستورهای FXSAVE و FXRSTOR.
- -mxsave
- پشتیبانی از دستورهای XSAVE و XRSTOR.
- -mxsaveopt
- پشتیبانی از دستور XSAVEOPT.
- -mxsavec
- پشتیبانی از دستورهای XSAVEC.
- -mxsaves
- پشتیبانی از دستورهای XSAVES و XRSTORS.
- -mrtm
- پشتیبانی از توابع توکار و تولید کد RTM.
- -mhle
- پشتیبانی از پیشوندهای Hardware Lock Elision.
- -mtbm
- پشتیبانی از توابع توکار و تولید کد TBM.
- -mmwaitx
- پشتیبانی از توابع توکار و تولید کد MWAITX و MONITORX.
- -mclzero
- پشتیبانی از توابع توکار و تولید کد CLZERO.
- -mpku
- پشتیبانی از توابع توکار و تولید کد PKU.
- -mgfni
- پشتیبانی از توابع توکار و تولید کد GFNI.
- -mvaes
- پشتیبانی از توابع توکار و تولید کد VAES.
- -mwaitpkg
- پشتیبانی از توابع توکار و تولید کد WAITPKG.
- -mvpclmulqdq
- پشتیبانی از توابع توکار و تولید کد VPCLMULQDQ.
- -mmovdiri
- پشتیبانی از توابع توکار و تولید کد MOVDIRI.
- -mmovdir64b
- پشتیبانی از توابع توکار و تولید کد MOVDIR64B.
- -menqcmd
- پشتیبانی از توابع توکار و تولید کد ENQCMD.
- -muintr
- پشتیبانی از توابع توکار و تولید کد UINTR.
- -mtsxldtrk
- پشتیبانی از توابع توکار و تولید کد TSXLDTRK.
- -mcldemote
- پشتیبانی از توابع توکار و تولید کد CLDEMOTE.
- -mserialize
- پشتیبانی از توابع توکار و تولید کد SERIALIZE.
- -mamx-tile
- پشتیبانی از توابع توکار و تولید کد AMX-TILE.
- -mamx-int8
- پشتیبانی از توابع توکار و تولید کد AMX-INT8.
- -mamx-bf16
- پشتیبانی از توابع توکار و تولید کد AMX-BF16.
- -mhreset
- پشتیبانی از توابع توکار و تولید کد HRESET.
- -mkl
- پشتیبانی از توابع توکار و تولید کد KL.
- -mwidekl
- پشتیبانی از توابع توکار و تولید کد WIDEKL.
- -mcmpccxadd
- پشتیبانی از توابع توکار و تولید کد MMX، SSE، SSE2، SSE3، SSSE3، SSE4.1، SSE4.2، AVX، AVX2 و CMPCCXADD.
- -mamx-fp16
- پشتیبانی از توابع توکار و تولید کد AMX-FP16.
- -mprefetchi
- پشتیبانی از توابع توکار و تولید کد PREFETCHI.
- -mraoint
- پشتیبانی از توابع توکار و تولید کد RAOINT.
- -mamx-complex
- پشتیبانی از توابع توکار و تولید کد AMX-COMPLEX.
- -msm3
- پشتیبانی از توابع توکار و تولید کد MMX، SSE، SSE2، SSE3، SSSE3، SSE4.1، SSE4.2، AVX و SM3.
- -msm4
- پشتیبانی از توابع توکار و تولید کد MMX، SSE، SSE2، SSE3، SSSE3، SSE4.1، SSE4.2، AVX و SM4.
- -msha512
- پشتیبانی از توابع توکار و تولید کد MMX، SSE، SSE2، SSE3، SSSE3، SSE4.1، SSE4.2، AVX و SHA512..IP -mapxf 4 پشتیبانی از تولید کد برای ویژگیهای APX، شامل EGPR، PUSH2POP2، NDD، PPX، NF، CCMP و ZU.
- -musermsr
- پشتیبانی از توابع توکار و تولید کد برای USER_MSR.
- -mamx-avx512
- پشتیبانی از توابع توکار و تولید کد برای MMX، SSE، SSE2، SSE3، SSSE3، SSE4.1، SSE4.2، AVX، AVX2، AVX10.1، AVX10.2 و AMX-AVX512.
- -mamx-tf32
- پشتیبانی از توابع توکار و تولید کد برای AMX-TF32.
- -mamx-fp8
- پشتیبانی از توابع توکار و تولید کد برای AMX-FP8.
- -mmovrs
- پشتیبانی از توابع توکار و تولید کد برای MOVRS.
- -mamx-movrs
- پشتیبانی از توابع توکار و تولید کد برای AMX-MOVRS.
این گزینههای اضافی برای خانوادهٔ پردازندههای x86 در دسترس هستند.
- -mfpmath=unit
- تولید محاسبات ممیز شناور برای واحد انتخابی unit. انتخابها برای unit عبارتند از:
- 387
- استفاده از
پردازندهٔ
کمکی ممیز
شناور
استاندارد
387 که روی
اکثر
تراشهها
موجود است و
در غیر این
صورت
شبیهسازی
میشود. کد
کامپایلشده
با این
گزینه
تقریباً در
همهجا
اجرا
میشود.
نتایج موقت
بهجای دقت
مشخصشده
توسط نوع
داده، با
دقت ۸۰ بیتی
محاسبه
میشوند که
ممکن است در
مقایسه با
اکثر
تراشههای
دیگر به
نتایجی کمی
متفاوت
منجر شود.
برای
توضیحات
دقیقتر
-ffloat-store را
ببینید.
این گزینه، انتخاب پیشفرض برای اهداف غیرِ Darwin در x86-32 است.
- sse
- استفاده از
دستورالعملهای
ممیز شناور
اسکالر
موجود در
مجموعه
دستورالعملهای
SSE. این
مجموعه
دستورالعمل
توسط
پردازندههای
Pentium III و
جدیدتر، و
در خط تولید
AMD توسط
تراشههای
Athlon-4، Athlon XP و Athlon MP
پشتیبانی
میشود.
نسخههای
اولیه
مجموعه
دستورالعمل
SSE تنها از
محاسبات با
دقت یگانه
(single-precision)
پشتیبانی
میکنند،
بنابراین
محاسبات با
دقت دوگانه
(double) و دقت
گسترشیافته
(extended-precision) همچنان
با استفاده
از 387 انجام
میشوند.
نسخههای
بعدی که
تنها در
پردازندههای
Pentium 4 و AMD x86-64 موجود
هستند، از
محاسبات با
دقت دوگانه
نیز
پشتیبانی
میکنند.
برای کامپایلر x86-32، باید از سوییچهای -march=cpu-type، -msse یا -msse2 برای فعالسازی افزونههای SSE و اثرگذار کردن این گزینه استفاده کنید. برای کامپایلر x86-64، این افزونهها بهطور پیشفرض فعال هستند.
کد حاصل باید در بیشتر موارد بهطور قابل توجهی سریعتر باشد و از مشکلات ناپایداری عددی کدهای 387 جلوگیری کند، اما ممکن است برخی از کدهای موجود را که انتظار متغیرهای موقت ۸۰ بیتی دارند، با مشکل مواجه کند.
این انتخاب، پیشفرض برای کامپایلر x86-64، اهداف Darwin x86-32، و انتخاب پیشفرض برای اهداف x86-32 دارای مجموعه دستورالعملهای SSE2 هنگام فعال بودن -ffast-math است.
هنگامی که از -mavx (یا گزینهٔ دیگری که افزونههای AVX را فعال میکند) استفاده شود، GCC دستورالعملهای SSE را غیرفعال میکند. در عوض، در صورت نیاز دستورالعملهای جدید AVX یا معادلهای AVX را برای تمامی دستورالعملهای SSE تولید میکند.
- sse,387
- sse+387
- both
- تلاش برای استفاده همزمان از هر دو مجموعه دستورالعمل. این کار عملاً تعداد ثباتهای در دسترس را دو برابر میکند، و در تراشههای دارای واحدهای اجرایی جداگانه برای 387 و SSE، منابع اجرایی را نیز دو برابر میسازد. از این گزینه با احتیاط استفاده کنید زیرا هنوز آزمایشی است، چرا که تخصیصدهندهٔ ثباتهای GCC واحدهای تابعی مجزا را بهخوبی مدلسازی نمیکند که میتواند منجر به کارایی ناپایدار شود.
- -mieee-fp
- -mno-ieee-fp
- کنترل اینکه آیا کامپایلر از مقایسههای ممیز شناور IEEE استفاده کند یا خیر. این مقایسهها حالتی را که نتیجه مقایسه بدون ترتیب (unordered) است، بهدرستی مدیریت میکنند.
- -m80387
- -mhard-float
- تولید خروجی حاوی دستورالعملهای 80387 برای ممیز شناور.
- -mno-80387
- -msoft-float
- تولید
خروجی حاوی
فراخوانیهای
کتابخانهای
برای ممیز
شناور.
هشدار: کتابخانههای مورد نیاز بخشی از GCC نیستند. بهطور معمول از امکانات کامپایلر C متداول ماشین استفاده میشود، اما این کار در کامپایل متقاطع بهطور مستقیم امکانپذیر نیست. شما باید تدابیر لازم را برای فراهم کردن توابع کتابخانهای مناسب برای کامپایل متقاطع بیندیشید.
در ماشینهایی که یک تابع، نتایج ممیز شناور را در پشتهٔ ثباتهای 80387 بازمیگرداند، ممکن است حتی در صورت استفاده از -msoft-float نیز برخی از کدهای عملیاتی (opcodes) ممیز شناور صادر شوند.
- -mno-fp-ret-in-387
- عدم
استفاده از
ثباتهای FPU
برای
مقادیر
بازگشتی
توابع.
در قرارداد فراخوانی معمول، توابع مقادیر با انواع "float" و "double" را در یک ثبات FPU بازمیگردانند، حتی اگر FPU وجود نداشته باشد. ایده این است که سیستمعامل باید یک FPU را شبیهسازی کند.
گزینهٔ -mno-fp-ret-in-387 باعث میشود این مقادیر در عوض در ثباتهای معمولی CPU بازگردانده شوند.
- -mno-fancy-math-387
- برخی شبیهسازهای 387 از دستورالعملهای "sin"، "cos" و "sqrt" برای 387 پشتیبانی نمیکنند. این گزینه را مشخص کنید تا از تولید این دستورالعملها جلوگیری شود. این گزینه زمانی که -march نشان دهد CPU هدف همیشه دارای FPU است و در نتیجه نیازی به شبیهسازی دستورالعمل وجود ندارد، نادیده گرفته میشود. این دستورالعملها تولید نمیشوند مگر اینکه از سوییچ -funsafe-math-optimizations نیز استفاده کنید.
- -malign-double
- -mno-align-double
- کنترل
اینکه آیا GCC
متغیرهای
با نوع
"double"،
"long double" و
"long long" را
در یک مرز
دو کلمهای
(two-word) یا یک
کلمهای (one-word)
همتراز
کند یا خیر.
همتراز
کردن
متغیرهای
"double" روی
یک مرز دو
کلمهای،
کدی تولید
میکند که
روی Pentium تا حدی
سریعتر
اجرا
میشود،
البته به
بهای مصرف
حافظهٔ
بیشتر.
در x86-64، گزینهٔ -malign-double بهطور پیشفرض فعال است.
هشدار: در صورت استفاده از سوییچ -malign-double، ساختارهای حاوی انواع فوق متفاوت از مشخصات منتشرشده رابط باینری کاربردی (ABI) برای x86-32 همتراز میشوند و از نظر باینری با ساختارهای موجود در کدهایی که بدون این سوییچ کامپایل شدهاند سازگار نخواهند بود.
- -m96bit-long-double
- -m128bit-long-double
- این
سوییچها
اندازهٔ
نوع "long double"
را کنترل
میکنند.
رابط
باینری
برنامهبردی
(ABI) در x86-32
اندازه را
۹۶ بیت مشخص
میکند،
بنابراین
-m96bit-long-double در
حالت ۳۲
بیتی
پیشفرض
است.
معماریهای مدرن (Pentium و جدیدتر) ترجیح میدهند "long double" روی یک مرز ۸ یا ۱۶ بایتی همتراز شود. در آرایهها یا ساختارهای منطبق بر ABI، این کار امکانپذیر نیست. بنابراین، مشخص کردن -m128bit-long-double با افزودن صفرهای ۳۲ بیتی اضافی (padding) به "long double"، آن را روی یک مرز ۱۶ بایتی همتراز میکند.
در کامپایلر x86-64، گزینهٔ -m128bit-long-double انتخاب پیشفرض است زیرا ABI آن مشخص میکند که "long double" باید روی مرز ۱۶ بایتی همتراز باشد.
توجه داشته باشید که هیچیک از این گزینهها دقت اضافی فراتر از استاندارد ۸۰ بیتی x87 برای نوع "long double" فراهم نمیکنند.
هشدار: اگر مقدار پیشفرض را برای ABI هدف خود لغو (override) کنید، این کار اندازهٔ ساختارها و آرایههای حاوی متغیرهای "long double" را تغییر میدهد و همچنین قرارداد فراخوانی توابعی که آرگومان "long double" میگیرند را دگرگون میسازد. از این رو، آنها با کدهایی که بدون این سوییچ کامپایل شدهاند سازگاری دودویی نخواهند داشت..IP -mlong-double-64 4
- -mlong-double-80
- -mlong-double-128
- این
گزینهها
اندازه نوع
"long double" را
کنترل
میکنند.
اندازه ۶۴
بیتی، نوع
"long double" را
معادل نوع
"double"
قرار
میدهد. این
مقدار
پیشفرض
برای
کتابخانه Bionic C
۳۲ بیتی
است. اندازه
۱۲۸ بیتی،
نوع "long double"
را معادل
نوع "__float128"
قرار
میدهد. این
مقدار
پیشفرض
برای
کتابخانه Bionic C
۶۴ بیتی
است.
هشدار: اگر مقدار پیشفرض را برای ABI مقصد خود لغو کنید، این کار اندازه ساختارها و آرایههای حاوی متغیرهای "long double" و همچنین قرارداد فراخوانی تابع را برای توابعی که "long double" میپذیرند تغییر میدهد. بنابراین، آنها با کدهایی که بدون این گزینه کامپایل شدهاند سازگاری دودویی (binary-compatible) نخواهند داشت.
- -malign-data=type
- چگونگی تراز کردن متغیرها توسط GCC را کنترل میکند. مقادیر پشتیبانیشده برای type عبارتند از: compat از مقدار تراز افزایشیافته سازگار با GCC نسخه 4.8 و پیش از آن استفاده میکند، abi از مقدار تراز مشخصشده توسط psABI استفاده میکند، و cacheline از مقدار تراز افزایشیافته برای مطابقت با اندازه خط حافظه نهان (cache line size) استفاده میکند. مقدار پیشفرض compat است.
- -mlarge-data-threshold=threshold
- هنگامی که -mcmodel=medium یا -mcmodel=large مشخص شده باشد، اشیاء دادهای بزرگتر از threshold در بخشهای داده بزرگ (large data sections) قرار میگیرند. مقدار پیشفرض 65535 است.
- -mrtd
- از یک
قرارداد
فراخوانی
تابع
متفاوت
استفاده
میکند که
در آن
توابعی با
تعداد
ثابتی از
آرگومانها
با دستور
"ret
num"
بازمیگردند؛
این دستور
هنگام
بازگشت،
آرگومانهای
آنها را از
پشته
برمیدارد
(pop میکند).
این کار با
حذف نیاز به
برداشتن
آرگومانها
در بخش
فراخواننده
(caller)، موجب
صرفهجویی
در یک
دستورالعمل
میشود.
میتوانید با استفاده از ویژگی تابع "stdcall" مشخص کنید که یک تابع به طور جداگانه با این ترتیب فراخوانی شود. همچنین میتوانید با استفاده از ویژگی تابع "cdecl"، گزینه -mrtd را لغو کنید.
هشدار: این قرارداد فراخوانی با قراردادی که به طور معمول در Unix استفاده میشود ناسازگار است، بنابراین در صورتی که نیاز به فراخوانی کتابخانههای کامپایلشده با کامپایلر Unix دارید نمیتوانید از آن استفاده کنید.
همچنین، باید اعلان اولیه تابع (function prototype) را برای تمام توابعی که تعداد متغیری از آرگومانها را میپذیرند (از جمله "printf") فراهم کنید؛ در غیر این صورت برای فراخوانی آن توابع، کد نادرستی تولید میشود.
علاوه بر این، اگر تابعی را با آرگومانهای بیش از حد فراخوانی کنید، کد به شدت نادرستی حاصل خواهد شد. (به طور معمول، آرگومانهای اضافی بدون هیچ آسیبی نادیده گرفته میشوند.)
- -mregparm=num
- کنترل
میکند چه
تعداد ثبات
(register) برای
ارسال
آرگومانهای
عدد صحیح (integer)
استفاده
شود. به طور
پیشفرض،
هیچ ثباتی
برای ارسال
آرگومانها
استفاده
نمیشود و
حداکثر
میتوان از
۳ ثبات
استفاده
کرد.
میتوانید
این رفتار
را برای یک
تابع مشخص
با استفاده
از ویژگی
تابع
"regparm"
کنترل کنید.
هشدار: اگر از این گزینه استفاده کنید و مقدار num غیرصفر باشد، باید تمام ماژولها، از جمله هرگونه کتابخانه را با همین مقدار بسازید. این امر شامل کتابخانههای سیستم و ماژولهای راهاندازی (startup modules) نیز میشود.
- -msseregparm
- از
قراردادهای
ارسال با
ثبات SSE برای
آرگومانها
و مقادیر
بازگشتی float و
double استفاده
میکند.
میتوانید
این رفتار
را برای یک
تابع مشخص
با استفاده
از ویژگی
تابع
"sseregparm"
کنترل کنید.
هشدار: اگر از این گزینه استفاده کنید باید تمام ماژولها، از جمله هرگونه کتابخانه را با همین مقدار بسازید. این امر شامل کتابخانههای سیستم و ماژولهای راهاندازی نیز میشود.
- -mvect8-ret-in-mem
- بردارهای ۸ بایتی را به جای ثباتهای MMX در حافظه بازمیگرداند. این مقدار پیشفرض در VxWorks برای مطابقت با ABI کامپایلرهای Sun Studio تا نسخه ۱۲ است. فقط در صورتی از این گزینه استفاده کنید که نیاز به حفظ سازگاری با کدهای موجودِ تولیدشده توسط آن نسخههای پیشین کامپایلر یا نسخههای قدیمیتر GCC دارید.
- -mpc32
- -mpc64
- -mpc80
- دقت ممیز
شناور 80387 را
روی ۳۲، ۶۴
یا ۸۰ بیت
تنظیم
میکند.
هنگامی که
-mpc32 مشخص
شود، بخش
معنادار (significand)
نتایج
محاسبات
ممیز شناور
تا ۲۴ بیت
گرد میشود
(single precision یا دقت
یگانه)؛
گزینه -mpc64
بخش
معنادار
نتایج
محاسبات
ممیز شناور
را تا ۵۳
بیت گرد
میکند (double precision
یا دقت
دوگانه) و -mpc80
بخش
معنادار
نتایج
محاسبات
ممیز شناور
را تا ۶۴
بیت گرد
میکند (extended double
precision یا دقت
دوگانه
گسترشیافته)
که مقدار
پیشفرض
است. هنگامی
که از این
گزینه
استفاده
شود،
محاسبات
ممیز شناور
در دقتهای
بالاتر
بدون تنظیم
صریح کلمه
کنترلی FPU در
دسترس
برنامهنویس
نخواهد بود.
تنظیم گرد کردن محاسبات ممیز شناور روی مقداری کمتر از ۸۰ بیت پیشفرض میتواند سرعت اجرای برخی برنامهها را ۲٪ یا بیشتر بهبود بخشد. توجه داشته باشید که برخی از کتابخانههای ریاضی فرض میکنند محاسبات ممیز شناور با دقت گسترشیافته (۸۰ بیتی) به طور پیشفرض فعال است؛ روتینهای چنین کتابخانههایی اگر از این گزینه برای تنظیم دقت کمتر از دقت گسترشیافته استفاده شود، ممکن است دچار افت چشمگیر دقت شوند، که معمولاً به دلیل پدیدهای موسوم به «حذف فاجعهبار» (catastrophic cancellation) رخ میدهد.
- -mdaz-ftz
- -mno-daz-ftz
- پرچمهای flush-to-zero (FTZ) و denormals-are-zero (DAZ) در ثبات MXCSR برای کنترل محاسبات ممیز شناور استفاده میشوند. گزینههای -Ofast، -ffast-math یا -funsafe-math-optimizations معمولاً کدهای راهاندازی (startup code) را پیوند میدهند که این پرچمها را تنظیم میکند، مگر هنگام ساخت یک کتابخانه اشتراکی (-shared). میتوانید از گزینههای -mdaz-ftz و -mno-daz-ftz برای فعالسازی یا غیرفعالسازی صریح تنظیم این پرچمها، صرفنظر از سایر گزینههای پاسدادهشده به GCC، استفاده کنید.
- -mstackrealign
- پشته را در بدو ورود دوباره تراز میکند. در معماری x86، گزینه -mstackrealign یک پیشدرآمد (prologue) و پسدرآمد (epilogue) جایگزین تولید میکند که در صورت لزوم پشته زمان اجرا را دوباره تراز میکند. این گزینه امکان ترکیب کدهای قدیمی را که تراز پشته ۴ بایتی دارند با کدهای مدرنی که تراز پشته ۱۶ بایتی را برای سازگاری با SSE حفظ میکنند، فراهم میسازد. همچنین ویژگی "force_align_arg_pointer" را ببینید که برای توابع به صورت جداگانه قابل اعمال است.
- -mstack-arg-probe
- کد کاوش پشته (stack probing) را در پیشدرآمد تابع تولید میکند.
- -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" اگر به صورت ۱۶ بایتی تراز نباشد ممکن است به درستی کار نکند.
برای اطمینان از تراز صحیح این مقادیر روی پشته، مرز پشته باید حداقل به اندازه تراز مورد نیاز هر مقداری که روی پشته ذخیره میشود، تراز باشد. علاوه بر این، هر تابع باید به شکلی تولید شود که پشته را تراز نگه دارد. بنابراین فراخوانی تابعی که با مرز پشته ترجیحی بالاتری کامپایل شده از درون تابعی که با مرز پشته ترجیحی پایینتری کامپایل شده است، به احتمال زیاد تراز پشته را به هم میزند. توصیه میشود کتابخانههایی که از بازفراخوانیها (callbacks) استفاده میکنند همواره از تنظیم پیشفرض بهره ببرند.
این تراز اضافی فضای پشته بیشتری مصرف میکند و عموماً اندازه کد را افزایش میدهد. کدهایی که به مصرف فضای پشته حساس هستند، مانند سیستمهای تعبیهشده (embedded systems) و هستههای سیستمعامل، ممکن است بخواهند تراز ترجیحی را به -mpreferred-stack-boundary=2 کاهش دهند.
- -mdump-tune-features
- این گزینه به GCC دستور میدهد تا نام قابلیتهای بهینهسازی عملکرد (performance tuning) پردازنده x86 و تنظیمات پیشفرض آنها را تخلیه (dump) کند. این نامها را میتوان در -mtune-ctrl=feature-list استفاده کرد..IP -mtune-ctrl=feature-list 4 این گزینه برای کنترل دقیق و ریزدانهای ویژگیهای تولید کد x86 استفاده میشود. feature-list فهرستی از نامهای feature است که با کاما از هم جدا شدهاند. همچنین -mdump-tune-features را ببینید. در صورت مشخص شدن، اگر پیش از نام feature علامت ^ نیامده باشد، فعال میشود؛ در غیر این صورت غیرفعال خواهد شد. -mtune-ctrl=feature-list برای استفاده توسط توسعهدهندگان GCC در نظر گرفته شده است. استفاده از آن ممکن است به مسیرهای کدی منجر شود که با آزمونها پوشش داده نشدهاند و میتواند بهطور بالقوه منجر به خطاهای درونی کامپایلر (ICEs) یا خطاهای زمان اجرا شود.
- -mno-default
- این گزینه به GCC دستور میدهد که تمام ویژگیهای قابل تنظیم (tunable) را غیرفعال کند. همچنین -mtune-ctrl=feature-list و -mdump-tune-features را ببینید.
- -mcld
- این گزینه به GCC دستور میدهد که یک دستورالعمل "cld" را در پیشدرآمد (prologue) توابعی که از دستورالعملهای رشتهای استفاده میکنند صادر کند. دستورالعملهای رشتهای به پرچم DF وابسته هستند تا بین حالت افزایش خودکار یا کاهش خودکار انتخاب کنند. در حالی که ABI مشخص میکند پرچم DF در هنگام ورود به تابع باید پاک شود، برخی از سیستمعاملها با پاک نکردن پرچم DF در توزیعکنندههای استثنای (exception dispatchers) خود، از این مشخصه تخطی میکنند. گرداننده استثنا میتواند با پرچم فعال DF فراخوانی شود، که در صورت استفاده از دستورالعملهای رشتهای منجر به جهتدهی اشتباه میشود. این گزینه میتواند بهطور پیشفرض در مقصدهای ۳۲ بیتی x86 با پیکربندی GCC از طریق گزینه پیکربندی --enable-cld فعال شود. تولید دستورالعملهای "cld" در این حالت میتواند با گزینه کامپایلر -mno-cld متوقف شود.
- -mvzeroupper
- این گزینه به GCC دستور میدهد تا قبل از انتقال جریان کنترل به خارج از تابع، یک دستورالعمل "vzeroupper" صادر کند تا جریمه تغییر وضعیت از AVX به SSE به حداقل برسد و همچنین توابع درونی (intrinsics) غیرضروری "zeroupper" حذف شوند.
- -mstv
- -mno-stv
- فعال/غیرفعال کردن گذرگاه اسکالر به برداریسازی (Scalar to Vectorization) که محاسبات اعداد صحیح ۶۴ بیتی را به محاسبات برداری تبدیل میکند. این بهینهسازی به -O2 و بالاتر محدود است.
- -mprefer-avx128
- این گزینه به GCC دستور میدهد در برداریساز خودکار (auto-vectorizer)، به جای دستورالعملهای ۲۵۶ بیتی AVX از دستورالعملهای ۱۲۸ بیتی AVX استفاده کند.
- -mprefer-vector-width=opt
- این گزینه به GCC دستور میدهد به جای مقدار پیشفرض در بستار (پلتفرم) انتخابشده، از پهنای بردار opt بیتی در دستورالعملها استفاده کند.
- -mpartial-vector-fp-math
- -mno-partial-vector-fp-math
- این گزینه
به GCC امکان
میدهد تا
عملیات
ممیز
شناوری را
تولید کند
که ممکن است
بر مجموعه
پرچمهای
وضعیت ممیز
شناور در
بردارهای
جزئی تأثیر
بگذارند،
در جایی که
عناصر
بردار در
بخش پایینی
رجیستر ۱۲۸
بیتی SSE قرار
دارند. مگر
اینکه -fno-trapping-math
مشخص شده
باشد،
کامپایلر
با صفر کردن
تمام
عملوندهای
ورودی در
بخش
بالاییِ
استفادهنشده
رجیستر
بردار،
رفتار صحیح
را تضمین
میکند.
توجه داشته
باشید که با
استفاده از
توابع
توکار یا
اسمبلی
درونخطی (inline
assembly) با
آرگومانهای
بردار
جزئی،
مقادیر
غیرعدد (NaNs)،
اعداد
غیرعادی (denormal)
یا نامعتبر
میتوانند
به بخش
بالایی
بردار نشت
کنند و در
صورت فعال
بودن -fno-trapping-math
باعث بروز
مشکلات
عملکردی
احتمالی
شوند. این
مشکلات را
میتوان با
پاکسازی
دستی بخش
بالایی
رجیستر
آرگومان
بردار جزئی
یا با
استفاده از
-mdaz-ftz برای
تنظیم پرچم
denormals-are-zero (DAZ) در
رجیستر MXCSR
برطرف کرد.
این گزینه بهطور پیشفرض فعال است.
- -mmove-max=bits
- این گزینه به GCC دستور میدهد که حداکثر تعداد بیتهایی را که میتوان بهطور کارآمد از حافظه به حافظه منتقل کرد، به bits تنظیم کند. مقادیر معتبر bits برابر ۱۲۸، ۲۵۶ و ۵۱۲ هستند.
- -mstore-max=bits
- این گزینه به GCC دستور میدهد که حداکثر تعداد بیتهایی را که میتوان بهطور کارآمد در حافظه ذخیره کرد، به bits تنظیم کند. مقادیر معتبر bits برابر ۱۲۸، ۲۵۶ و ۵۱۲ هستند.
- none
- هیچ محدودیت اضافهای فراتر از آنچه توسط پلتفرم انتخابشده تعریف شده است بر GCC اعمال نشود.
- 128
- ترجیح پهنای بردار ۱۲۸ بیتی برای دستورالعملها.
- 256
- ترجیح پهنای بردار ۲۵۶ بیتی برای دستورالعملها.
- 512
- ترجیح پهنای بردار ۵۱۲ بیتی برای دستورالعملها.
- -mnoreturn-no-callee-saved-registers
- این گزینه توابع دارای ویژگی "noreturn" یا تعیینکننده "_Noreturn" را با ذخیره نکردن رجیسترهای حفظشده توسط فراخواندهشده (callee-saved) که در تابع استفاده میشوند (به جز رجیستر "BP") در پیشدرآمد تابع بهینهسازی میکند. این گزینه میتواند در اشکالزدایی فراخوانندهِ تابع "noreturn" یا هر تابع دیگری در مراتب بالاتر پشته فراخوانی اختلال ایجاد کند، بنابراین بهطور پیشفرض فعال نیست.
- -mcx16
- این گزینه به GCC امکان میدهد تا دستورالعملهای "CMPXCHG16B" را در کد ۶۴ بیتی برای پیادهسازی عملیات compare-and-exchange روی اشیاء ۱۲۸ بیتی با تراز ۱۶ بایتی تولید کند. این قابلیت برای بهروزرسانیهای اتمیک ساختارهای دادهای که اندازهشان بیش از یک کلمه ماشین است مفید است. کامپایلر از این دستورالعمل برای پیادهسازی __sync Builtins استفاده میکند. با این حال، برای __atomic Builtins که روی اعداد صحیح ۱۲۸ بیتی کار میکنند، همواره از یک فراخوانی کتابخانهای استفاده میشود.
- -msahf
- این گزینه تولید دستورالعملهای "SAHF" را در کد ۶۴ بیتی فعال میکند. پردازندههای اولیه Intel Pentium 4 با پشتیبانی از Intel 64، پیش از معرفی گام Pentium 4 G1 در دسامبر ۲۰۰۵، فاقد دستورالعملهای "LAHF" و "SAHF" بودند که توسط AMD64 پشتیبانی میشوند. اینها به ترتیب دستورالعملهای بارگذاری و ذخیره برای برخی از پرچمهای وضعیت هستند. در حالت ۶۴ بیتی، دستورالعمل "SAHF" برای بهینهسازی توابع توکار "fmod"، "drem" و "remainder" استفاده میشود؛ برای جزئیات Other Builtins را ببینید.
- -mmovbe
- این گزینه استفاده از دستورالعمل "movbe" را برای بهینهسازی جابهجایی بایتها (byte swapping) در موجودیتهای چهار و هشت بایتی فعال میکند.
- -mshstk
- گزینه -mshstk توابع توکار پشته سایه (shadow stack) از فناوری اجرای جریان کنترل (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
فعال باشد.
توجه داشته
باشید که با
وجود
بالاتر
بودن توان
عملیاتی (throughput)
این توالی
نسبت به
دستورالعمل
غیرمعکوس،
دقت توالی
میتواند
تا ۲ ulp کاهش
یابد (به
عنوان مثال
معکوس 1.0
برابر با 0.99999994
میشود).
توجه داشته باشید که 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
- فعال کردن تقریب برای تقسیم اسکالر..IP vec-div 4 فعالسازی تقریب برای تقسیم برداریشده.
- sqrt
- فعالسازی تقریب برای جذر نردهای (اسکالر).
- vec-sqrt
- فعالسازی تقریب برای جذر برداریشده.
بنابراین، برای مثال، -mrecip=all,!sqrt تمام تقریبهای معکوس را به جز جذر فعال میکند.
- -mveclibabi=type
- نوع ABI مورد
استفاده
برای
برداریسازی
دستورهای
درونی (intrinsics) با
استفاده از
یک
کتابخانه
خارجی را
مشخص
میکند.
مقادیر
پشتیبانیشده
برای type
عبارتند از
svml برای
کتابخانه
ریاضی
بردار
کوتاه Intel (Intel short vector math
library)، aocl برای
کتابخانه
ریاضی (LibM) از
کتابخانههای
بهینهسازی
پردازنده AMD
(AOCL) و acml برای
کتابخانه
ریاضی
بازنشستهشده
AMD core math library (که 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 برای Microsoft ABI. پیشفرض، استفاده از Microsoft ABI هنگام هدفگیری Microsoft Windows و SysV ABI در تمامی سیستمهای دیگر است. میتوانید این رفتار را برای توابع خاص با استفاده از مشخصههای تابع "ms_abi" و "sysv_abi" کنترل کنید.
- -masm=dialect
- دستورالعملهای اسمبلی را با استفاده از dialect (گویش) انتخابشده خروجی میدهد. همچنین بر اینکه کدام گویش برای "asm" پایه و "asm" گسترشیافته استفاده شود اثر میگذارد. گزینههای پشتیبانیشده (به ترتیب گویش) عبارتند از att یا intel. پیشفرض att است. سیستمعامل Darwin از intel پشتیبانی نمیکند.
- -mforce-indirect-call
- تمام فراخوانیهای توابع را مجبور به غیرمستقیم بودن میکند. این گزینه هنگام استفاده از Intel Processor Trace که اطلاعات زمانبندی دقیقتری را برای فراخوانیهای توابع تولید میکند، مفید است.
- -mmanual-endbr
- دستورالعمل ENDBR را در نقطه ورود تابع فقط از طریق مشخصه تابع "cf_check" درج میکند. این گزینه زمانی که همراه با گزینه -fcf-protection=branch برای کنترل درج ENDBR در ورود تابع استفاده شود، مفید است.
- -mcet-switch
- بهطور پیشفرض، تجهیز (instrumentation) سازوکار CET روی دستورهای switch که از یک جدول پرش استفاده میکنند خاموش بوده و ردیابی شاخه غیرمستقیم غیرفعال است. از آنجا که جدولهای پرش در حافظه فقطخواندنی ذخیره میشوند، این امر منجر به از دست رفتن مستقیم استحکامبخشی نمیشود. اما اگر اندیس جدول پرش توسط مهاجم کنترل شود، ممکن است پرش غیرمستقیم توسط CET مهار نشود. این گزینه تجهیز CET را روشن میکند تا ردیابی شاخه غیرمستقیم برای دستورهای switch دارای جدولهای پرش فعال شود، که باعث میشود مقاصد پرش از طریق هر پرش غیرمستقیمی قابل دسترسی باشند.
- -mcall-ms2sysv-xlogues
- به دلیل تفاوتها در ABIهای ۶۴-بیتی، هر تابع Microsoft ABI که یک تابع System V ABI را فراخوانی میکند باید RSI، RDI و XMM6-15 را مخدوششده (clobbered) فرض کند. بهطور پیشفرض، کد ذخیره و بازیابی این ثباتها به صورت درونی (inline) صادر میشود، که منجر به پیشدرآمدها و پسدرآمدهای نسبتاً طولانی میگردد. استفاده از -mcall-ms2sysv-xlogues پیشدرآمدها و پسدرآمدهایی صادر میکند که از تکهکدهای رابط (stubs) در بخش ایستا از libgcc برای انجام این ذخیرهها و بازیابیها استفاده میکنند، و بدین ترتیب اندازه تابع را به بهای چند دستورالعمل اضافی کاهش میدهد.
- -mtls-dialect=type
- تولید کد برای دسترسی به حافظه محلی نخ (thread-local storage) با استفاده از قراردادهای gnu یا gnu2. گزینه gnu پیشفرض محافظهکارانه است؛ gnu2 کارآمدتر است، اما ممکن است نیازمندیهای زمان کامپایل و زمان اجرایی اضافه کند که در همه سیستمها قابل برآورده شدن نباشند.
- -mpush-args
- -mno-push-args
- از عملیاتهای PUSH برای ذخیره پارامترهای خروجی استفاده میکند. این روش کوتاهتر است و معمولاً به همان اندازه روشِ استفاده از عملیاتهای SUB/MOV سریع است و بهطور پیشفرض فعال میباشد. در برخی موارد، غیرفعال کردن آن ممکن است به دلیل زمانبندی بهبودیافته و وابستگیهای کاهشیافته، کارایی را بهبود بخشد.
- -maccumulate-outgoing-args
- در صورت فعال بودن، حداکثر مقدار فضای مورد نیاز برای آرگومانهای خروجی در پیشدرآمد تابع محاسبه میشود. این روش در اکثر پردازندههای مدرن به دلیل کاهش وابستگیها، زمانبندی بهبودیافته و کاهش استفاده از پشته هنگامی که مرز ترجیحی پشته برابر با ۲ نباشد، سریعتر است. نکته منفی، افزایش قابل توجه در اندازه کد است. این سوییچ متضمن -mno-push-args است.
- -mms-bitfields
- -mno-ms-bitfields
- فعال/غیرفعال
کردن چینش
فیلد بیتی
(bit-field) سازگار
با
کامپایلر
بومی Microsoft Windows.
اگر "packed" روی یک ساختار استفاده شود، یا اگر فیلدهای بیتی استفاده شوند، ممکن است Microsoft ABI ساختار را به گونهای متفاوت از روش معمول GCC بچیند. به ویژه هنگام جابهجایی دادههای بستهبندیشده (packed) میان توابع کامپایلشده با GCC و کامپایلر بومی مایکروسافت (خواه از طریق فراخوانی تابع یا به عنوان داده در یک فایل)، ممکن است دسترسی به هر دو قالب مورد نیاز باشد.
این گزینه بهطور پیشفرض برای مقاصد Microsoft Windows فعال است. این رفتار همچنین میتواند به صورت محلی با استفاده از مشخصههای متغیر یا نوع کنترل شود. برای اطلاعات بیشتر، x86 Attributes را ببینید.
الگوریتم چینش ساختار در مایکروسافت به استثنای بستهبندی فیلدهای بیتی، نسبتاً ساده است. فاصلهگذاری (padding) و ترازسازی (alignment) اعضای ساختارها و اینکه آیا یک فیلد بیتی میتواند از مرز یک واحد ذخیرهسازی عبور کند یا خیر، توسط این قوانین تعیین میشوند:
- 1. اعضای ساختار به صورت متوالی و به همان ترتیبی که
- اعلان شدهاند ذخیره میشوند: نخستین عضو کمترین نشانی حافظه و آخرین عضو بیشترین نشانی را دارد.
- 2. هر شیء داده دارای الزامات ترازسازی است. الزامات ترازسازی
- برای تمام
دادهها به
جز
ساختارها،
یونیونها
(unions) و
آرایهها،
یا برابر با
اندازه شیء
است یا
اندازه
بستهبندی
فعلی
(مشخصشده
با مشخصه
"aligned" یا
دستور
"pack" pragma)، هر
کدام که
کمتر باشد.
برای
ساختارها،
یونیونها
و
آرایهها،
الزامات
ترازسازی
برابر با
بزرگترین
الزامات
ترازسازی
اعضای آن
است. به هر
شیء یک آفست
اختصاص
مییابد به
طوری که:
offset % alignment_requirement == 0
- 3. فیلدهای بیتی مجاور در یک واحد تخصیص ۱، ۲ یا ۴ بایتی بستهبندی میشوند
- اگر نوعهای صحیح هماندازه باشند و فیلد بیتی بعدی بدون عبور از مرز تحمیلشده توسط الزامات ترازسازی مشترک فیلدهای بیتی، در واحد تخصیص جاری جای گیرد.
کامپایلر MSVC فیلدهای بیتی با طول صفر را به روشهای زیر تفسیر میکند:.IP "۱. اگر یک میدان-بیتی با طول صفر بین دو میدان-بیتی درج شود که" 4 بهطور معمول ادغام میشوند، آن میدانهای بیتی ادغام نخواهند شد.
برای نمونه:
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
- مقصد عملیاتهای رشتهای درونخطیشده را تراز نکن. این سوییچ اندازهٔ کد را کاهش داده و در صورتی که مقصد از پیش تراز شده باشد اما GCC از آن مطلع نباشد، کارایی را بهبود میبخشد.
- -minline-all-stringops
- بهطور پیشفرض، GCC عملیاتهای رشتهای را تنها زمانی درونخطی میکند که مشخص باشد مقصد دستکم روی یک مرز ۴ بایتی تراز است. این گزینه درونخطیسازی بیشتری را ممکن ساخته و اندازهٔ کد را افزایش میدهد، اما ممکن است کارایی کدهایی را که برای طولهای کوتاه به سرعت بالای "memcpy" و "memset" وابسته هستند، بهبود بخشد. این گزینه بسط درونخطی "strlen" را برای تمامی ترازهای اشارهگر فعال میکند.
- -minline-stringops-dynamically
- برای عملیاتهای رشتهای با اندازهٔ نامشخص، از بررسیهای زمان اجرا به همراه کد درونخطی برای بلوکهای کوچک و فراخوانی کتابخانه برای بلوکهای بزرگ استفاده کن.
- -mstringop-strategy=alg
- الگوریتم ابتکاری تصمیمگیری داخلی را برای انتخاب الگوریتم خاص مورد استفاده جهت درونخطیسازی عملیاتهای رشتهای بازنویسی کن. مقادیر مجاز برای alg عبارتند از:
- -mmemcpy-strategy=strategy
- الگوریتم ابتکاری تصمیمگیری داخلی را برای تعیین اینکه آیا "__builtin_memcpy" باید درونخطی شود و در صورت معلوم بودن اندازهٔ مورد انتظار عملیات رونوشت، از چه الگوریتم درونخطی استفاده شود، بازنویسی کن. strategy فهرستی از سهگانههای alg:max_size:dest_align است که با کاما از هم جدا شدهاند. مقدار alg در -mstringop-strategy مشخص میشود، و max_size حداکثر اندازه به بایت را مشخص میکند که الگوریتم درونخطی alg برای آن مجاز است. برای آخرین سهگانه، مقدار max_size باید -1 باشد. مقدار max_size سهگانهها در فهرست باید به ترتیب صعودی مشخص شود. حداقل اندازه به بایت برای alg، برای نخستین سهگانه برابر 0 و برای سهگانههای بعدی برابر با "max_size + 1" بازهٔ پیشین است.
- -mmemset-strategy=strategy
- این گزینه شبیه به -mmemcpy-strategy= است، با این تفاوت که بازشدن "__builtin_memset" را کنترل میکند.
- -momit-leaf-frame-pointer
- اشارهگر چارچوب را در توابع برگ در یک ثبات نگه ندار. این کار از دستورالعملهای ذخیره، برپایی و بازگردانی اشارهگر چارچوب جلوگیری کرده و یک ثبات اضافی را در توابع برگ در دسترس قرار میدهد. گزینهٔ -momit-leaf-frame-pointer اشارهگر چارچوب را برای توابع برگ حذف میکند که ممکن است اشکالزدایی را دشوارتر سازد.
- -mtls-direct-seg-refs
- -mno-tls-direct-seg-refs
- تعیین
میکند که
آیا
متغیرهای TLS
را میتوان
با
آفستهایی
از ثبات بخش
TLS (%gs برای
۳۲ بیتی،
%fs برای
۶۴ بیتی)
مورد
دسترسی
قرار داد،
یا اینکه
اشارهگر
پایهٔ رشته
باید اضافه
شود. معتبر
بودن یا
نبودن این
مورد بستگی
به
سیستمعامل
دارد و
اینکه آیا
بخش را طوری
نگاشت
میکند که
کل ناحیهٔ TLS
را پوشش دهد
یا خیر.
برای سیستمهایی که از کتابخانهٔ سی گنو (GNU C Library) استفاده میکنند، پیشفرض فعال است.
- -msse2avx
- -mno-sse2avx
- مشخص میکند که اسمبلر باید دستورالعملهای SSE را با پیشوند VEX کدگذاری کند. گزینهٔ -mavx این ویژگی را بهطور پیشفرض فعال میکند.
- -mfentry
- -mno-fentry
- اگر پروفایلسازی فعال باشد (-pg)، فراخوانی شمارندهٔ پروفایلسازی را پیش از پرولوگ (prologue) قرار میدهد. نکته: در معماریهای x86 مشخصهٔ "ms_hook_prologue" در حال حاضر برای -mfentry و -pg امکانپذیر نیست.
- -mrecord-mcount
- -mno-record-mcount
- اگر پروفایلسازی فعال باشد (-pg)، بخشی (section) تولید میکند که شامل اشارهگرهایی به هر فراخوانی پروفایلسازی است؛ این ویژگی برای وصلهزدن خودکار فراخوانیها سودمند است. میتوانید از گزینهٔ mfentry-section= برای تنظیم نام این بخش استفاده کنید؛ مقدار پیشفرض آن __mcount_loc است.
- -mnop-mcount
- -mno-nop-mcount
- اگر پروفایلسازی فعال باشد (-pg)، فراخوانیهای توابع پروفایلسازی را به صورت NOP تولید میکند. این ویژگی زمانی مفید است که این فراخوانیها باید بعداً بهطور پویا وصله شوند. این مورد احتمالاً تنها همراه با -mrecord-mcount کاربرد دارد.
- -minstrument-return=type
- همراه با -pg -mfentry، خروجهای تابع را بر اساس type مجهزسازی (instrument) میکند که میتواند یکی از موارد none برای عدم مجهزسازی، call برای ایجاد فراخوانی به "__return__"، یا nop5 برای تولید یک توالی ۵ بایتی nop باشد. این گزینه فقط بازگشتهای واقعی منتهی به یک "ret" را مجهزسازی میکند، نه فراخوانیهای همسطح (sibling calls) از طریق یک پرش را.
- -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 در شرایطی که هیچ آرگومان متغیری در ثباتهای برداری ارسال نمیشود، استفاده کرد.
- -m8bit-idiv
- -mno-8bit-idiv
- روی برخی پردازندهها، مانند Intel Atom، تقسیم عدد صحیح بدون علامت ۸ بیتی بسیار سریعتر از تقسیم عدد صحیح ۳۲ بیتی/۶۴ بیتی است. این گزینه یک بررسی زمان اجرا ایجاد میکند. اگر هر دو مقسوم و مقسومعلیه در محدودهٔ 0 تا 255 باشند، تقسیم عدد صحیح بدون علامت ۸ بیتی به جای تقسیم عدد صحیح ۳۲ بیتی/۶۴ بیتی به کار میرود.
- -mavx256-split-unaligned-load
- -mavx256-split-unaligned-store
- بارگذاری و ذخیرهسازی غیرهمتراز ۳۲ بایتی AVX را به دو قسمت تقسیم میکند.
- -mstack-protector-guard=guard
- -mstack-protector-guard-reg=reg
- -mstack-protector-guard-offset=offset
- -mstack-protector-guard-symbol=symbol
- کد محافظت
از پشته را
با استفاده
از قناری (canary)
در guard تولید
میکند.
مکانهای
پشتیبانیشده
عبارتند از
global برای
قناری
سراسری یا
tls برای
قناری
اختصاصی هر
رشته در
بلوک TLS
(پیشفرض).
این گزینه
فقط هنگامی
اثر دارد که
-fstack-protector یا -fstack-protector-all
تعیین شده
باشد.
با انتخاب حالت دوم، گزینههای -mstack-protector-guard-reg=reg و -mstack-protector-guard-offset=offset علاوه بر این مشخص میکنند که کدام ثبات سگمنت (%fs یا %gs) به عنوان ثبات پایه برای خواندن قناری، و از چه آفستی نسبت به آن ثبات پایه استفاده شود. مقدار پیشفرض آنها همان است که در ABI مربوطه مشخص شده است.
گزینهٔ -mstack-protector-guard-symbol=symbol آفست را با یک ارجاع نمادین به یک قناری در بلوک TLS بازنویسی میکند.
- -mgeneral-regs-only
- کدی تولید میکند که فقط از ثباتهای همهمنظوره استفاده میکند. این کار از استفاده کامپایلر از ثباتهای ممیز شناور، برداری، ماسک و کران جلوگیری میکند.
- -mrelax-cmpxchg-loop
- هنگام ایجاد یک حلقهٔ مقایسه و جابهجایی برای __sync Builtins و __atomic Builtins که فاقد یک دستورالعمل بومی هستند، با صادر کردن یک بارگذاری اتمیک قبل از دستورالعمل "CMPXCHG"، و استفاده از دستورالعمل "PAUSE" جهت صرفهجویی در مصرف انرژی پردازنده هنگام راهاندازی مجدد حلقه، عملیات را برای حالتهای دارای رقابت شدید بهینهسازی میکند.
- -mindirect-branch=choice
- فراخوانی و
پرش
غیرمستقیم
را با choice
تبدیل
میکند.
مقدار
پیشفرض keep
است که
فراخوانی و
پرش
غیرمستقیم
را
دستنخورده
باقی
میگذارد.
thunk
فراخوانی و
پرش
غیرمستقیم
را به ثانک (thunk)
فراخوانی و
بازگشت
تبدیل
میکند. thunk-inline
فراخوانی و
پرش
غیرمستقیم
را به ثانک
فراخوانی و
بازگشت
درونخطی (inlined)
تبدیل
میکند. thunk-extern
فراخوانی و
پرش
غیرمستقیم
را به ثانک
فراخوانی و
بازگشت
خارجی که در
یک فایل شیء
جداگانه
ارائه
میشود
تبدیل
میکند.
میتوانید
این رفتار
را برای یک
تابع خاص با
استفاده از
مشخصهٔ
تابع
"indirect_branch"
کنترل کنید.
توجه داشته باشید که -mcmodel=large با -mindirect-branch=thunk و -mindirect-branch=thunk-extern ناسازگار است زیرا تابع ثانک ممکن است در مدل کد بزرگ (large code model) در دسترس نباشد.
توجه داشته باشید که -mindirect-branch=thunk-extern با -fcf-protection=branch سازگار است زیرا ثانک خارجی میتواند طوری ساخته شود که بررسی جریان کنترل را فعال کند.
- -mfunction-return=choice
- بازگشت از
تابع را با
choice تبدیل
میکند.
مقدار
پیشفرض keep
است که
بازگشت
تابع را
دستنخورده
باقی
میگذارد.
thunk بازگشت
تابع را به
ثانک
فراخوانی و
بازگشت
تبدیل
میکند. thunk-inline
بازگشت
تابع را به
ثانک
فراخوانی و
بازگشت
درونخطی
تبدیل
میکند. thunk-extern
بازگشت
تابع را به
ثانک
فراخوانی و
بازگشت
خارجی که در
یک فایل شیء
جداگانه
ارائه شده
است تبدیل
میکند.
میتوانید
این رفتار
را برای یک
تابع خاص با
استفاده از
مشخصهٔ
تابع
"function_return"
کنترل کنید.
توجه داشته باشید که -mindirect-return=thunk-extern با -fcf-protection=branch سازگار است زیرا ثانک خارجی میتواند طوری ساخته شود که بررسی جریان کنترل را فعال کند.
توجه داشته باشید که -mcmodel=large با -mfunction-return=thunk و -mfunction-return=thunk-extern ناسازگار است زیرا تابع ثانک ممکن است در مدل کد بزرگ در دسترس نباشد.
- -mindirect-branch-register
- فراخوانی و پرش غیرمستقیم را از طریق ثبات اجباری میکند.
- -mharden-sls=choice
- کدی تولید میکند تا اثرات حدس و گمان مستقیم (SLS) را با choice کاهش دهد. مقدار پیشفرض none است که تمام مقاومسازیهای SLS را غیرفعال میکند. return مقاومسازی SLS را برای بازگشتهای تابع فعال میکند. indirect-jmp مقاومسازی SLS را برای پرشهای غیرمستقیم فعال میکند. all تمام مقاومسازیهای SLS را فعال میکند.
- -mindirect-branch-cs-prefix
- پیشوند CS را به دستورهای call و jmp به ثانکهای غیرمستقیمی که مقصد شاخهٔ آنها در ثباتهای r8-r15 است اضافه میکند، تا طول دستورات call و jmp برابر با ۶ بایت شود. این کار اجازه میدهد که آنها در زمان اجرا بهطور بالقوه با lfence; call *%r8-r15 یا lfence; jmp *%r8-r15 جایگزین شوند.
- -mapx-inline-asm-use-gpr32
- بهطور پیشفرض، استفاده از EGPR در قیدهای اسمبلی درونخطی غیرفعال است زیرا GCC نمیتواند تشخیص دهد که آیا دستورات asm از GP32 پشتیبانی میکنند یا خیر. اگر اسمبلی درونخطی شما میتواند EGPR را مدیریت کند، از -mapx-inline-asm-use-gpr32 استفاده کنید.
- -mgather
- -mscatter
- به ترتیب، برداریسازی را برای دستورالعملهای gather و scatter فعال میکند.
این سوئیچهای -m افزون بر موارد بالا، روی پردازندههای x86-64 در محیطهای ۶۴ بیتی پشتیبانی میشوند.
- -m32
- -m64
- -mx32
- -m16
- تولید کد
برای یک
محیط ۱۶
بیتی، ۳۲
بیتی یا ۶۴
بیتی. گزینه
-m32 نوعهای
"int"،
"long" و
اشارهگر
را روی ۳۲
بیت تنظیم
میکند و
کدی تولید
میکند که
در حالت ۳۲
بیتی اجرا
میشود.
گزینه -m64 نوع "int" را روی ۳۲ بیت و نوعهای "long" و اشارهگر را روی ۶۴ بیت تنظیم کرده و کدی برای معماری x86-64 تولید میکند. تنها در Darwin، گزینه -m64 گزینههای -fno-pic و -mdynamic-no-pic را نیز غیرفعال میکند.
گزینه -mx32 نوعهای "int"، "long" و اشارهگر را روی ۳۲ بیت تنظیم کرده و کدی برای معماری x86-64 تولید میکند.
گزینه -m16 مانند -m32 عمل میکند، با این تفاوت که دستورالعمل اسمبلی ".code16gcc" را در ابتدای خروجی اسمبلی درج میکند تا فایل اجرایی بتواند در حالت ۱۶ بیتی اجرا شود.
- -miamcu
- گزینه -miamcu کدی منطبق بر psABI پردازندههای Intel MCU تولید میکند. این گزینه نیازمند فعال بودن گزینه -m32 است.
- -mno-red-zone
- از بهاصطلاح «منطقه قرمز» (red zone) برای کد x86-64 استفاده نشود. منطقه قرمز توسط ABI معماری x86-64 الزامی شده است؛ این منطقه یک ناحیه ۱۲۸ بایتی پس از مکان اشارهگر پشته است که توسط گردانندههای سیگنال یا وقفه تغییر داده نمیشود و بنابراین میتواند برای دادههای موقت بدون نیاز به تنظیم اشارهگر پشته استفاده شود. فلگ -mno-red-zone این منطقه قرمز را غیرفعال میکند.
- -mcmodel=small
- تولید کد برای مدل کد کوچک (small code model): برنامه و نمادهای آن باید در ۲ گیگابایت پایینی فضای آدرس پیوند (link) داده شوند. اشارهگرها ۶۴ بیتی هستند. برنامهها میتوانند به صورت ایستا یا پویا پیوند داده شوند. این، مدل کد پیشفرض است.
- -mcmodel=kernel
- تولید کد برای مدل کد هسته (kernel code model). هسته در ۲ گیگابایت منفی فضای آدرس اجرا میشود. این مدل باید برای کد هسته لینوکس استفاده شود.
- -mcmodel=medium
- تولید کد برای مدل متوسط (medium model): برنامه در ۲ گیگابایت پایینی فضای آدرس پیوند داده میشود. نمادهای کوچک نیز در آنجا قرار میگیرند. نمادهایی با اندازه بزرگتر از -mlarge-data-threshold در بخشهای داده بزرگ یا BSS قرار داده میشوند و میتوانند بالای ۲ گیگابایت مستقر شوند. برنامهها میتوانند به صورت ایستا یا پویا پیوند داده شوند.
- -mcmodel=large
- تولید کد برای مدل بزرگ (large model). این مدل هیچ فرضی درباره آدرسها و اندازه بخشها در نظر نمیگیرد.
- -maddress-mode=long
- تولید کد برای حالت آدرس بلند (long address mode). این گزینه فقط برای محیطهای ۶۴ بیتی و x32 پشتیبانی میشود. این حالت، حالت آدرسدهی پیشفرض برای محیطهای ۶۴ بیتی است.
- -maddress-mode=short
- تولید کد برای حالت آدرس کوتاه (short address mode). این گزینه فقط برای محیطهای ۳۲ بیتی و x32 پشتیبانی میشود. این حالت، حالت آدرسدهی پیشفرض برای محیطهای ۳۲ بیتی و x32 است.
- -mneeded
- -mno-needed
- تولید ویژگی گنو GNU_PROPERTY_X86_ISA_1_NEEDED برای مقصد لینوکس به منظور مشخص کردن سطح ریزمعماری ISA مورد نیاز برای اجرای باینری.
- -mno-direct-extern-access
- بدون -fpic یا
-fPIC، همواره
از
اشارهگر GOT
برای
دسترسی به
نمادهای
خارجی
استفاده
میشود. با
-fpic یا -fPIC،
دسترسی به
نمادهای
محافظتشده
همانند
نمادهای
محلی
مدیریت
میشود.
حالت
پیشفرض
-mdirect-extern-access است.
هشدار: کتابخانههای مشترک کامپایلشده با -mno-direct-extern-access و فایل اجرایی کامپایلشده با -mdirect-extern-access ممکن است در صورت استفاده از نمادهای محافظتشده در کتابخانههای مشترک و فایل اجرایی، دارای سازگاری دودویی نباشند.
- -munroll-only-small-loops
- -mno-unroll-only-small-loops
- کنترل باز کردن محافظهکارانه حلقههای کوچک. این گزینه بهطور پیشفرض با -O2 فعال است و حلقههای دارای کمتر از ۴ دستورالعمل را ۱ بار باز میکند. این امر موجب بهرهوری بهتر از خط لوله رمزگشایی دستورالعملها در پردازندههای امروزی میشود. میتوانید این قابلیت را با -mno-unroll-only-small-loops غیرفعال کنید، همچنین در صورتی که گزینههای عمومیتر -funroll-loops یا -funroll-all-loops فعال یا صراحتاً غیرفعال شوند نیز غیرفعال میشود.
- -mdispatch-scheduler
- فعالسازی زمانبندی دستورالعملها. این قابلیت تنها در پردازندههای bdver1، bdver2، bdver3، bdver4 و znver1 پشتیبانی میشود و علاوه بر این نیازمند -fschedule-insns -fsched-pressure است.
- -mlam=choice
- قابلیت LAM (پوششدهی آدرس خطی) اجازه میدهد بیتهای خاصی در اشارهگر برای فراداده (metadata) استفاده شوند. مقدار پیشفرض none است. با u48، بیتهای اشارهگر در موقعیتهای 62:48 میتوانند برای فراداده استفاده شوند؛ با u57، بیتهای اشارهگر در موقعیتهای 62:57 میتوانند برای فراداده به کار روند.
گزینههای x86 Windows
گزینههای Xstormy16
این گزینهها برای Xstormy16 تعریف شدهاند:
- -msim
- انتخاب فایلهای راهاندازی و اسکریپت پیونددهنده مناسب برای شبیهساز.
گزینههای Xtensa
این گزینهها برای مقصدهای Xtensa پشتیبانی میشوند:
- -mconst16
- -mno-const16
- فعال یا غیرفعال کردن استفاده از دستورالعملهای "CONST16" برای بارگذاری مقادیر ثابت. در صورت فعال بودن، دستورالعملهای "CONST16" همواره به جای دستورالعملهای استاندارد "L32R" استفاده میشوند. استفاده از "CONST16" بهطور پیشفرض تنها در صورتی فعال است که دستورالعمل "L32R" در دسترس نباشد.
- -mserialize-volatile
- -mno-serialize-volatile
- هنگامی که این گزینه فعال باشد، GCC دستورالعملهای "MEMW" را پیش از ارجاعات حافظه "volatile" درج میکند تا سازگاری ترتیبی تضمین شود. پیشفرض -mserialize-volatile است. از -mno-serialize-volatile برای حذف دستورالعملهای "MEMW" استفاده کنید.
- -mforce-no-pic
- -mno-force-no-pic
- برای مقاصدی مانند GNU/Linux که در آنها تمام کدهای حالت کاربر Xtensa باید کد مستقل از موقعیت (PIC) باشند، این گزینه PIC را برای کامپایل کد هسته غیرفعال میکند.
- -mtext-section-literals
- -mno-text-section-literals
- این گزینهها مدیریت استخرهای مقادیر مستقیم (literal pools) را کنترل میکنند. پیشفرض -mno-text-section-literals است که مقادیر مستقیم را در یک بخش مجزا در فایل خروجی قرار میدهد. این کار اجازه میدهد استخر مقادیر مستقیم در یک RAM/ROM داده قرار گیرد، و همچنین به پیونددهنده اجازه میدهد استخرهای مقادیر مستقیم را از فایلهای شیء مجزا ادغام کند تا مقادیر مستقیم اضافی حذف شده و اندازه کد بهبود یابد. با -mtext-section-literals، مقادیر مستقیم در بخش text پراکنده میشوند تا در نزدیکترین فاصله ممکن نسبت به مراجع خود قرار گیرند. این ویژگی ممکن است برای فایلهای اسمبلی بزرگ ضروری باشد. مقادیر مستقیم مربوط به هر تابع، درست قبل از همان تابع قرار میگیرند.
- -mauto-litpools
- -mno-auto-litpools
- این گزینهها مدیریت استخرهای مقادیر مستقیم را کنترل میکنند. پیشفرض -mno-auto-litpools است که مقادیر مستقیم را در یک بخش مجزا در فایل خروجی قرار میدهد مگر اینکه -mtext-section-literals استفاده شده باشد. با -mauto-litpools مقادیر مستقیم توسط اسمبلر در بخش text پراکنده میشوند. کامپایلر دستورالعملهای صریح ".literal" تولید نمیکند و مقادیر مستقیم را با دستورالعملهای "MOVI" به جای "L32R" درون ثباتها بارگذاری میکند تا به اسمبلر اجازه دهد عمل آزادسازی (relaxation) را انجام داده و مقادیر مستقیم را بر حسب نیاز جایگذاری کند. این گزینه به اسمبلر امکان میدهد چندین استخر مقادیر مستقیم به ازای هر تابع ایجاد کرده و توابع بسیار بزرگ را اسمبل کند، کاری که ممکن است با -mtext-section-literals امکانپذیر نباشد..IP -mtarget-align 4
- -mno-target-align
- هنگامی که این گزینه فعال باشد، GCC به اسمبلر دستور میدهد تا دستورالعملها را به طور خودکار تراز کند تا جریمههای انشعاب به بهای کاهش مقداری از تراکم کد کم شوند. اسمبلر تلاش میکند دستورالعملهای متراکم را گسترش دهد تا اهداف انشعاب و دستورالعملهای پس از دستورالعملهای فراخوانی تراز شوند. اگر دستورالعملهای متراکمِ ایمنِ پیشین به اندازه کافی برای تراز کردن یک هدف وجود نداشته باشد، هیچ گسترشی انجام نمیشود. پیشفرض -mtarget-align است. این گزینهها روی نحوه رفتار با دستورالعملهای خودتراز مانند "LOOP" تأثیری ندارند؛ اسمبلر همیشه آنها را، چه با گسترش دستورالعملهای متراکم و چه با درج دستورالعملهای NOP، تراز میکند.
- -mlongcalls
- -mno-longcalls
- هنگامی که این گزینه فعال باشد، GCC به اسمبلر دستور میدهد تا فراخوانیهای مستقیم را به فراخوانیهای غیرمستقیم ترجمه کند، مگر اینکه بتواند تعیین کند که مقصد فراخوانی مستقیم در محدوده مجازِ دستورالعمل فراخوانی قرار دارد. این ترجمه معمولاً برای فراخوانی توابع در فایلهای منبع دیگر رخ میدهد. به طور مشخص، اسمبلر یک دستورالعمل مستقیم "CALL" را به یک "L32R" و به دنبال آن یک دستورالعمل "CALLX" ترجمه میکند. پیشفرض -mno-longcalls است. این گزینه باید در برنامههایی استفاده شود که مقصد فراخوانی میتواند به طور بالقوه خارج از محدوده باشد. این گزینه در اسمبلر پیادهسازی شده است، نه کامپایلر؛ بنابراین کد اسمبلی تولیدشده توسط GCC همچنان دستورالعملهای فراخوانی مستقیم را نشان میدهد---برای دیدن دستورالعملهای واقعی به کد شیء دیاسمبلشده نگاه کنید. توجه داشته باشید که اسمبلر برای هر فراخوانی بینفایلی از فراخوانی غیرمستقیم استفاده میکند، نه فقط آنهایی که واقعاً خارج از محدوده هستند.
- -mabi=name
- تولید کد برای ABI مشخصشده. مقادیر مجاز عبارتند از: call0 و windowed. مقدار پیشفرض ABI توسط پیکربندی هسته Xtensa انتخاب میشود.
- -mabi=call0
- هنگامی که این گزینه فعال باشد، پارامترهای تابع در ثباتهای "a2" تا "a7" ارسال میشوند، ثباتهای "a12" تا "a15" توسط فراخواننده ذخیره میشوند (caller-saved)، و ثبات "a15" ممکن است به عنوان اشارهگر فریم استفاده شود. هنگامی که این نسخه از 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
این موارد در زیر فهرست شدهاند:
محیط (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_ALL تنظیم شده باشد، مقدار LC_CTYPE و LC_MESSAGES را بازنویسی میکند؛ در غیر این صورت، LC_CTYPE و LC_MESSAGES به مقدار متغیر محیطی LANG بازمیگردند. اگر هیچیک از این متغیرها تنظیم نشده باشند، رفتار GCC به طور پیشفرض روی حالت سنتی زبان انگلیسی C قرار میگیرد.
این متغیرهای محیطی بر کدگذاری فایلهای ورودی و رشتهها در فایلهای خروجی تولیدشده توسط GCC تأثیری ندارند؛ این موارد به ترتیب توسط گزینههای -finput-charset و -fexec-charset کنترل میشوند.
- TMPDIR
- اگر TMPDIR تنظیم شده باشد، دایرکتوری مورد استفاده برای فایلهای موقت را مشخص میکند. GCC از فایلهای موقت برای نگهداری خروجی یک مرحله از کامپایل که قرار است به عنوان ورودی مرحله بعدی استفاده شود بهره میبرد: برای مثال، خروجی پیشپردازنده، که ورودی خود کامپایلر است.
- GCC_DIAGNOSTICS_LOG
- اگر GCC_DIAGNOSTICS_LOG
تنظیم شده
باشد،
اطلاعات
اضافی
درباره
زیرسیستم
تشخیص
منتشر
خواهد شد.
اگر روی یک
مقدار خالی
تنظیم شود،
اطلاعات در
stderr نوشته
خواهد شد؛
در غیر این
صورت، GCC
تلاش خواهد
کرد آن فایل
را باز کرده
و اطلاعات
را در آن
بنویسد.
محتوا و قالب دقیق اطلاعات ممکن است تغییر کند؛ این قابلیت برای استفاده توسعهدهندگان 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 که برای پیونددهی استفاده میشوند، به کار میرود.
علاوه بر این، این پیشوند به روشی غیرمعمول در یافتن دایرکتوریهای جستجو برای فایلهای سرآیند به کار میرود. برای هر یک از دایرکتوریهای استانداردی که نام آنها به طور معمول با /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 به عنوان یک کامپایلر محلی (native) پیکربندی شده باشد، در صورتی که نتواند فایلهای پیونددهنده خاص را با استفاده از GCC_EXEC_PREFIX پیدا کند، دایرکتوریهای مشخصشده را بررسی میکند. پیونددهی با استفاده از GCC همچنین از این دایرکتوریها هنگام جستجو برای کتابخانههای معمولی مربوط به گزینه -l استفاده میکند (اما دایرکتوریهای مشخصشده با -L اولویت دارند)..IP GCC_EXTRA_DIAGNOSTIC_OUTPUT 4 اگر GCC_EXTRA_DIAGNOSTIC_OUTPUT روی یکی از مقادیر زیر تنظیم شده باشد، هنگام صدور راهنماییهای تصحیح (fix-it hints)، متن اضافی به stderr فرستاده میشود. گزینههای -fdiagnostics-parseable-fixits و -fno-diagnostics-parseable-fixits نسبت به این متغیر محیطی اولویت دارند.
- fixits-v1
- صدور راهنماییهای تصحیح قابلتجزیه، معادل با -fdiagnostics-parseable-fixits. به طور خاص، ستونها به صورت تعداد بایتها بیان میشوند که از بایت ۱ برای ستون ابتدایی آغاز میشود.
- fixits-v2
- مانند "fixits-v1"، اما ستونها مطابق با -fdiagnostics-column-unit=display به عنوان ستونهای نمایشی بیان میشوند.
- EXPERIMENTAL_SARIF_SOCKET
- اگر EXPERIMENTAL_SARIF_SOCKET در
محیط تنظیم
شده باشد،
کامپایلر
تلاش
میکند به
یک UNIX domain stream socket با
آن نام متصل
شود و برای
هر تشخیصی
که رخ
میدهد، یک
اعلان JSON-RPC 2.0 از
نوع "OnSarifResult"
به آن
بفرستد، که
در آن مقدار
اعلان یک
شیء "result"
در SARIF است.
اگر EXPERIMENTAL_SARIF_SOCKET تنظیم شده باشد و کامپایلر نتواند به آن متصل شود، بیدرنگ با شکست مواجه خواهد شد.
این قابلیت آزمایشی است و ممکن است بدون اطلاع قبلی تغییر کند یا حذف شود.
برخی متغیرهای محیطی دیگر بر رفتار پیشپردازنده تأثیر میگذارند.
- CPATH
- C_INCLUDE_PATH
- CPLUS_INCLUDE_PATH
- OBJC_INCLUDE_PATH
- مقدار هر
متغیر،
فهرستی از
دایرکتوریها
است که با
یک نویسه
ویژه،
بسیار شبیه
به PATH، از
یکدیگر جدا
شدهاند تا
فایلهای
سرایند در
آنها
جستجو شوند.
نویسه
ویژه،
"PATH_SEPARATOR"،
وابسته به
هدف (target) است و
در زمان
ساخت GCC مشخص
میشود.
برای
هدفهای
مبتنی بر Microsoft
Windows این نویسه
یک
نقطهویرگول
(semicolon) و برای
تقریباً
تمام
هدفهای
دیگر یک
دونقطه (colon)
است.
متغیر CPATH فهرستی از دایرکتوریها را مشخص میکند تا بهگونهای جستجو شوند که گویی با -I تعیین شدهاند، اما پس از هر مسیری که با گزینههای -I در خط فرمان داده شده است. این متغیر محیطی صرفنظر از این که کدام زبان در حال پیشپردازش است استفاده میشود.
باقی متغیرهای محیطی تنها هنگام پیشپردازش زبان خاص مشخصشده اعمال میشوند. هر کدام فهرستی از دایرکتوریها را برای جستجو تعیین میکنند، گویی که با -isystem مشخص شدهاند، اما پس از هر مسیری که با گزینههای -isystem در خط فرمان داده شده باشد.
در تمام این متغیرها، یک عنصر خالی به کامپایلر دستور میدهد تا دایرکتوری کاری فعلیاش را جستجو کند. عناصر خالی میتوانند در ابتدا یا انتهای یک مسیر ظاهر شوند. برای نمونه، اگر مقدار CPATH برابر با ":/special/include" باشد، همان اثری را دارد که -I. -I/special/include خواهد داشت.
- DEPENDENCIES_OUTPUT
- اگر این
متغیر
تنظیم شده
باشد،
مقدار آن
نحوه خروجی
دادن
وابستگیها
را برای Make،
بر پایه
فایلهای
سرایند
غیرسیستمی
پردازششده
توسط
کامپایلر،
مشخص
میکند.
فایلهای
سرایند
سیستمی در
خروجی
وابستگی
نادیده
گرفته
میشوند.
مقدار DEPENDENCIES_OUTPUT میتواند صرفاً یک نام فایل باشد، که در این صورت قواعد Make در آن فایل نوشته میشوند و نام هدف (target) از روی نام فایل منبع حدس زده میشود. یا اینکه مقدار میتواند به فرم file target باشد که در آن صورت، قواعد در فایل file و با استفاده از target به عنوان نام هدف نوشته میشوند.
به عبارت دیگر، این متغیر محیطی معادل ترکیب گزینههای -MM و -MF، به همراه یک سوییچ اختیاری -MT است.
- SUNPRO_DEPENDENCIES
- این متغیر مشابه DEPENDENCIES_OUTPUT است (بالا را ببینید)، با این تفاوت که فایلهای سرایند سیستمی نادیده گرفته نمیشوند، بنابراین بر -M دلالت دارد و نه -MM. با این حال، وابستگی به فایل ورودی اصلی حذف میشود.
- SOURCE_DATE_EPOCH
- اگر این
متغیر
تنظیم شود،
مقدار آن یک
برچسب
زمانی UNIX را
مشخص
میکند تا
به جای
تاریخ و
زمان فعلی
در
ماکروهای
"__DATE__" و
"__TIME__"
استفاده
شود، به
طوری که
برچسبهای
زمانی
تعبیهشده
بازتولیدپذیر
(reproducible) شوند.
مقدار SOURCE_DATE_EPOCH باید یک برچسب زمانی UNIX باشد، که به صورت تعداد ثانیهها (بدون احتساب ثانیههای کبیسه) از تاریخ 01 Jan 1970 00:00:00 که در قالب ASCII نمایش داده شده، تعریف میشود؛ دقیقاً همانند خروجی "date +%s" در GNU/Linux و سایر سیستمهایی که از پسوند %s در دستور "date" پشتیبانی میکنند.
این مقدار باید یک برچسب زمانی مشخص، مانند آخرین زمان تغییر سورسکد یا بسته باشد و باید توسط فرایند ساخت تنظیم شود..SH "گزارش باگها (BUGS)" برای دستورالعملهای مربوط به گزارش باگها، ببینید: https://gcc.gnu.org/bugs.
پاورقیها (FOOTNOTES)
- 1.
- در برخی سیستمها، gcc -shared برای کارکرد صحیح سازندهها (constructors) نیازمند ساخت کد واسط (stub) کمکی است. در سیستمهای چندکتابخانهای (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)
برای مشاهده مشارکتکنندگان GCC، مدخل Info مربوط به gcc یا https://gcc.gnu.org/onlinedocs/gcc/Contributors.html را ببینید.
کپیرایت و تکثیر (COPYRIGHT)
کپیرایت © 1988-2026 متعلق است به Free Software Foundation, Inc.
اجازه کپی، توزیع و/یا تغییر این سند تحت شرایط «مجوز مستندات آزاد گنو» (GNU Free Documentation License)، نسخه 1.3 یا هر نسخه جدیدتر منتشرشده توسط بنیاد نرمافزارهای آزاد اعطا میشود؛ با بخشهای تغییرناپذیر «GNU General Public License» و «Funding Free Software»، متنهای روی جلد (الف) (پایین را ببینید)، و با متنهای پشت جلد (ب) (پایین را ببینید). نسخهای از این مجوز در صفحه راهنمای gfdl(7) گنجانده شده است.
(الف) متن روی جلد FSF عبارت است از:
یک راهنمای گنو
(ب) متن پشت جلد FSF عبارت است از:
شما در کپی و تغییر این راهنمای گنو، همانند نرمافزار گنو، آزاد هستید. نسخههای منتشرشده توسط بنیاد نرمافزارهای آزاد، برای توسعه گنو کمکهای مالی جمعآوری میکنند.
| 2026-08-10 | gcc-16.2.1 |