| 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 را فراخوانی میکنید، معمولاً پیشپردازش، کامپایل، اسمبلی و پیونددهی را انجام میدهد. «گزینههای سراسری» (overall options) به شما این امکان را میدهند که این فرایند را در یک مرحلهٔ میانی متوقف کنید. برای نمونه، گزینهٔ -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 است. این راهنما تنها یکی از این دو فرم را مستند میکند، یعنی هر کدام که پیشفرض نباشد.
برخی گزینهها یک یا چند آرگومان دریافت میکنند که معمولاً با یک فاصله یا علامت مساوی (=) از نام گزینه جدا میشوند. مگر آنکه بهگونهٔ دیگری مستند شده باشد، یک آرگومان میتواند عددی یا رشته باشد. آرگومانهای عددی معمولاً باید اعداد صحیح کوچک نامنفی (unsigned) در مبنای ۱۰ یا ۱۶ (هگزادسیمال) باشند. آرگومانهای هگزادسیمال باید با پیشوند 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) -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) -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) -meb -mel -mmul.x -mno-crt0
گزینههای MSP430 (گزینههای MSP430) -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) -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) -m64 -march=arch -misa=arch -march-map=arch -mptx=version -mmainkernel -moptimize -msoft-stack -msoft-stack-reserve-local=size -muniform-simt -mgomp
گزینههای OpenRISC (گزینههای OpenRISC) -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) -mfpu -msoft-float -mac0 -m40 -m45 -m10 -mint32 -mint16 -msplit -munix-asm -mdec-asm -mgnu-asm -mlra
گزینههای Picolibc (گزینههای Picolibc) --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) -mmcu=mcu -minrt -mno-relax -mloop -mmul -mfillzero -mabi=variant
گزینههای RISC-V (گزینههای RISC-V) -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) -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 و PowerPC) -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) -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 و zSeries) -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) -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) -mclear-hwcap -mno-clear-hwcap -mimpure-text -mno-impure-text -gsctf
گزینههای SPARC (گزینههای SPARC) -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) -YP,paths -Ym,dir
گزینههای V850 (گزینههای V850) -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) -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 ویندوز گزینههای 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 "گزینههای کنترل نوع خروجی (Options Controlling the Kind of Output)" کامپایل میتواند تا چهار مرحله را شامل شود: پیشپردازش، کامپایل اصلی، اسمبلی و پیونددهی، همواره به همین ترتیب. GCC قادر است چندین فایل را پیشپردازش کرده و در قالب چند فایل ورودی اسمبلر، یا یک فایل ورودی اسمبلر کامپایل کند؛ سپس هر فایل ورودی اسمبلر یک فایل شیء (object file) تولید میکند، و پیونددهی، تمامی فایلهای شیء (چه آنهایی که تازه کامپایل شدهاند و چه آنهایی که به عنوان ورودی مشخص شدهاند) را در یک فایل اجرایی ترکیب میکند.
برای هر فایل ورودی مشخص، پسوند نام فایل تعیین میکند که چه نوع کامپایلی باید انجام گیرد:
- file.c
- کد منبع C که باید پیشپردازش شود.
- file.i
- کد منبع C که نباید پیشپردازش شود.
- file.ii
- کد منبع ++C که نباید پیشپردازش شود.
- file.m
- کد منبع Objective-C. توجه داشته باشید که برای کارکرد یک برنامهٔ Objective-C باید پیونددهی با کتابخانهٔ libobjc انجام شود.
- file.mi
- کد منبع Objective-C که نباید پیشپردازش شود.
- file.mm
- file.M
- کد منبع ++Objective-C. توجه داشته باشید که برای کارکرد یک برنامهٔ ++Objective-C باید پیونددهی با کتابخانهٔ libobjc انجام شود. توجه کنید که .M دقیقاً به یک حرف بزرگ M اشاره دارد.
- file.mii
- کد منبع ++Objective-C که نباید پیشپردازش شود.
- file.h
- فایل سرآیند (header) زبانهای C، ++C، Objective-C یا ++Objective-C برای تبدیل شدن به یک سرآیند پیشکامپایلشده (پیشفرض)، یا فایل سرآیند C و ++C برای تبدیل شدن به یک مشخصهٔ Ada (از طریق سوییچ -fdump-ada-spec).
- file.cc
- file.cp
- file.cxx
- file.cpp
- file.CPP
- file.c++
- file.C
- کد منبع ++C که باید پیشپردازش شود. توجه داشته باشید که در .cxx، هر دو حرف آخر باید دقیقاً x باشند. به همین ترتیب، .C دقیقاً به یک حرف بزرگ C اشاره دارد.
- file.mm
- file.M
- کد منبع ++Objective-C که باید پیشپردازش شود.
- file.mii
- کد منبع ++Objective-C که نباید پیشپردازش شود.
- file.hh
- file.H
- file.hp
- file.hxx
- file.hpp
- file.HPP
- file.h++
- file.tcc
- فایل سرآیند ++C برای تبدیل شدن به یک سرآیند پیشکامپایلشده یا مشخصهٔ Ada.
- file.f
- file.for
- file.ftn
- file.fi
- کد منبع Fortran با قالب ثابت (fixed form) که نباید پیشپردازش شود.
- file.F
- file.FOR
- file.fpp
- file.FPP
- file.FTN
- کد منبع Fortran با قالب ثابت که باید پیشپردازش شود (با پیشپردازندهٔ سنتی).
- file.f90
- file.f95
- file.f03
- file.f08
- file.fii
- کد منبع Fortran با قالب آزاد (free form) که نباید پیشپردازش شود.
- file.F90
- file.F95
- file.F03
- file.F08
- کد منبع Fortran با قالب آزاد که باید پیشپردازش شود (با پیشپردازندهٔ سنتی).
- file.cob
- file.COB
- file.cbl
- file.CBL
- کد منبع COBOL.
- file.go
- کد منبع Go.
- file.d
- کد منبع D.
- file.di
- فایل رابط (interface) زبان D.
- file.dd
- کد مستندات زبان D (به صورت Ddoc).
- file.ads
- فایل کد منبع Ada شامل اعلان یک واحد کتابخانهای (اعلان یک بسته، زیربرنامه یا generic، یا نمونهسازی generic)، یا اعلان تغییر نام یک واحد کتابخانهای (اعلان تغییر نام یک بسته، generic یا زیربرنامه). به چنین فایلهایی specs نیز میگویند.
- file.adb
- فایل کد منبع Ada شامل بدنهٔ یک واحد کتابخانهای (بدنهٔ یک زیربرنامه یا بسته). به چنین فایلهایی bodies نیز میگویند.
- file.s
- کد اسمبلی..IP file.S 4
- file.sx
- کد اسمبلی که باید پیشپردازش شود.
- other
- یک فایل شیء که مستقیماً به مرحلهٔ پیوند داده میشود. با هر نام فایلی بدون پسوند شناختهشده، به این صورت رفتار میشود.
میتوانید زبان ورودی را با گزینهٔ -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
- فایلهای
منبع را
کامپایل یا
اسمبلی
میکند،
اما پیوند
نمیزند.
مرحلهٔ
پیوند
اصلاً
انجام
نمیشود.
خروجی
نهایی به
صورت یک
فایل شیء
برای هر
فایل منبع
خواهد بود.
بهطور پیشفرض، نام فایل شیء برای یک فایل منبع با جایگزین کردن پسوند .c، .i، .s و غیره با .o ساخته میشود.
فایلهای ورودی ناشناخته که نیازی به کامپایل یا اسمبلی ندارند، نادیده گرفته میشوند.
- -S
- --assemble
- پس از
مرحلهٔ
کامپایلِ
صرف متوقف
میشود؛
سرهمبندی
(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 فقط خروجی اصلی را نامگذاری میکند، اما بر نامگذاری خروجیهای کمکی و رونوشت (dump) نیز تأثیر میگذارد. مثالهای زیر را ببینید. مگر در صورت بازنویسی، هر دو خروجی کمکی و رونوشت در همان دایرکتوری خروجی اصلی قرار میگیرند. در خروجیهای کمکی، پسوند فایل ورودی با پسوند نوع فایل خروجی کمکی جایگزین میشود؛ در خروجیهای رونوشت، پسوند فایل رونوشت به پسوند فایل ورودی الحاق میگردد. در دستورهای کامپایل، نام پایهٔ هر دو خروجی کمکی و رونوشت همان نام پایهٔ خروجی اصلی است؛ در دستورهای کامپایل و پیوند، نام خروجی اصلی (منهای پسوند اجرایی) با نام فایل ورودی ترکیب میشود. اگر هر دو نام پایهٔ یکسانی داشته باشند (بدون در نظر گرفتن پسوند)، نتیجهٔ ترکیب همان نام پایه خواهد بود؛ در غیر این صورت، با یک خط تیره از هم جدا و به یکدیگر الحاق میشوند.
gcc -c foo.c ...
از foo.o به عنوان خروجی اصلی استفاده میکند و خروجیهای کمکی و رونوشتها را در کنار آن قرار میدهد؛ مثلاً فایل کمکی foo.dwo برای -gsplit-dwarf، و فایل رونوشت foo.c.???r.final برای -fdump-rtl-final.
اگر یک فایل خروجیِ غیرپیونددهنده بهطور صریح مشخص شده باشد، فایلهای کمکی و رونوشت بهطور پیشفرض همان نام پایه را میگیرند:
gcc -c foo.c -o dir/foobar.o ...
خروجیهای کمکی را به نام dir/foobar.* و خروجیهای رونوشت را به نام dir/foobar.c.* نامگذاری خواهد کرد.
یک خروجی پیونددهنده در عوض خروجیهای کمکی و رونوشت را پیشوندگذاری میکند:
gcc foo.c bar.c -o dir/foobar ...
بهطور کلی خروجیهای کمکی را به نام dir/foobar-foo.* و dir/foobar-bar.*، و خروجیهای رونوشت را به نام dir/foobar-foo.c.* و dir/foobar-bar.c.* نامگذاری خواهد کرد.
تنها استثنای موارد بالا زمانی است که فایل اجرایی با تک فایل ورودی، نام پایهٔ مشترکی داشته باشد:
gcc foo.c -o dir/foo ...
که در این صورت خروجیهای کمکی به نام dir/foo.* و خروجیهای رونوشت به نام dir/foo.c.* نامگذاری میشوند.
مکان و نامهای خروجیهای کمکی و رونوشت را میتوان با گزینههای -dumpbase، -dumpbase-ext، -dumpdir، -save-temps=cwd، و -save-temps=obj تنظیم کرد.
- -dumpbase dumpbase
- --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-* درخواست شدهاند) با پسوند نام ورودی، و فایلهای خروجی کمکی (مواردی که با سایر گزینههای غیر dump درخواست شدهاند، مانند "-save-temps"، "-gsplit-dwarf"، "-fcallgraph-info") بدون آن.
تمایز مشابه پسوند خروجیهای dump و کمکی را میتوان برای -dumpbase basename.suf که بهصراحت داده شده است، با مشخص کردن -dumpbase-ext .suf نیز به دست آورد.
اگر dumpbase بهصراحت با هر مؤلفهٔ دایرکتوری مشخص شود، هرگونه مشخصهٔ dumppfx (مانند -dumpdir یا -save-temps=*) نادیده گرفته میشود، و dumpbase بهجای الحاق به آن، کاملاً جایگزین آن میشود:
gcc foo.c -c -o dir/foo.o -dumpbase alt/foo \ -dumpdir pfx- -save-temps=cwd ...
خروجیهای کمکی و dump به نام alt/foo.* ایجاد میکند، و dir/ در -o، پیشوند ./ ضمنی ناشی از -save-temps=cwd، و pfx- در -dumpdir را نادیده میگیرد.
هنگامی که -dumpbase در دستوری مشخص شود که چندین ورودی را کامپایل میکند، یا کامپایل کرده و سپس پیوند میدهد، ممکن است با dumppfx ترکیب شود، همانطور که ذیل -dumpdir مشخص شده است. سپس، هر فایل ورودی با استفاده از dumppfx ترکیبی کامپایل میشود، و مقادیر پیشفرض برای dumpbase و auxdropsuf برای هر فایل ورودی محاسبه میگردد:
gcc foo.c bar.c -c -dumpbase main ...
foo.o و bar.o را به عنوان خروجیهای اصلی ایجاد میکند، و با استفاده از dumpbase به عنوان پیشوند، از رونویسی خروجیهای کمکی و dump جلوگیری کرده و خروجیهای کمکی و dump با نامهای main-foo.* و main-bar.* میسازد.
یک رشتهٔ خالی که به عنوان dumpbase مشخص شود، از تأثیر نام پایهٔ خروجی در نامگذاری خروجیهای کمکی و dump حین کامپایل جلوگیری میکند، و مقادیر پیشفرض را محاسبه مینماید:
gcc -c foo.c -o dir/foobar.o -dumpbase " ...
خروجیهای کمکی را به نام dir/foo.* و خروجیهای dump را به نام dir/foo.c.* نامگذاری خواهد کرد. توجه کنید که چگونه نامهای پایهٔ آنها از نام ورودی گرفته میشود، اما دایرکتوری همچنان بهطور پیشفرض همان دایرکتوری خروجی است.
dumpbase با رشتهٔ خالی مانع از استفاده از نام پایهٔ خروجی برای خروجیهای مرحلهٔ پیوند نمیشود:
gcc foo.c bar.c -o dir/foobar -dumpbase " -flto ...
کامپایل فایلهای مبدأ، خروجیهای کمکی را به نام dir/foo.* و dir/bar.*، و خروجیهای dump را به نام dir/foo.c.* و dir/bar.c.* نامگذاری خواهد کرد. بازکامپایلسازی LTO در حین پیوند از dir/foobar. به عنوان پیشوند برای فایلهای dump و کمکی استفاده خواهد کرد.
- -dumpbase-ext auxdropsuf
- --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 صریح یا پیشفرض الحاق میشوند (یا اگر شامل مؤلفههای دایرکتوری باشند، آن را بازنویسی میکنند)، بهطوری که هر یک از کامپایلهای چندگانه خروجیهای کمکی و dump با نامهای متفاوتی دریافت میکنند.
gcc foo.c bar.c -c -dumpdir dir/pfx- -dumpbase main ...
خروجیهای کمکی dump را به dir/pfx-main-foo.* و dir/pfx-main-bar.* میدهد، و dumpbase- را به dumppfx الحاق میکند. خروجیهای dump پسوند فایل ورودی را حفظ میکنند: به ترتیب dir/pfx-main-foo.c.* و dir/pfx-main-bar.c.*. با کامپایل تکورودی مقایسه کنید: gcc foo.c -c -dumpdir dir/pfx- -dumpbase main ...
که با اعمال -dumpbase به یک منبع منفرد، یک dumpbase جداگانه به ازای هر فایل ورودی محاسبه و الحاق نمیکند. خروجیهای کمکی و dump آن در dir/pfx-main.* قرار میگیرند.
هنگام کامپایل و سپس پیوند دادنِ چندین فایل ورودی، یک dumppfx پیشفرض یا صراحتاً مشخصشده نیز تحت تبدیل dumpbase در بالا قرار میگیرد (مثلاً کامپایل foo.c و bar.c در بالا، اما بدون -c). اگر نه -dumpdir و نه -dumpbase داده نشده باشند، نام پایه خروجی پیونددهنده منهای auxdropsuf (در صورت تعیین) یا پسوند فایل اجرایی (در غیر این صورت)، بهعلاوه یک خط تیره، در عوض به dumppfx پیشفرض الحاق میشود. با این حال توجه داشته باشید که برخلاف موارد پیشین پیوند دادن:
gcc foo.c bar.c -dumpdir dir/pfx- -o main ...
نام خروجی main را به dumppfx الحاق نمیکند، زیرا -dumpdir صراحتاً مشخص شده است. هدف این است که dumppfx صراحتاً مشخصشده بتواند در صورت تمایل شامل نام خروجی مشخصشده به عنوان بخشی از پیشوند باشد؛ تنها یک -dumpbase صراحتاً مشخصشده با آن ترکیب میشود تا از نادیده گرفتنِ ساده یک گزینه معنادار جلوگیری شود.
هنگام کامپایل و سپس پیوند دادن از یک فایل ورودی واحد، نام پایه خروجی پیونددهنده تنها در صورتی مانند بالا به dumppfx پیشفرض الحاق میشود که نام پایه مشترکی با نام فایل ورودی واحد نداشته باشد. این موضوع در موارد پیوند تکورودی در بالا پوشش داده شد، اما نه با یک -dumpdir صریح که مانع این ترکیب میشود، حتی اگر توسط -save-temps=* لغو شده باشد:
gcc foo.c -dumpdir alt/pfx- -o dir/main.exe -save-temps=cwd ...
خروجیهای کمکی با نام foo.* و خروجیهای dump با نام foo.c.* در دایرکتوری کاری فعلی ایجاد میشوند، همانگونه که در نهایت توسط -save-temps=cwd درخواست شده است.
برای جمعبندی همهچیز در قالب یک جریان داده شهودی هرچند اندکی غیردقیق: نام خروجی اصلی به یک بخش دایرکتوری و یک بخش نام پایه (basename) تقسیم میشود؛ dumppfx روی اولی تنظیم میشود، مگر اینکه توسط -dumpdir یا -save-temps=* جایگزین شود، و dumpbase روی دومی تنظیم میشود، مگر اینکه توسط -dumpbase جایگزین شود. اگر چندین ورودی یا پیونددهی وجود داشته باشد، این dumpbase ممکن است با dumppfx ترکیب شود و از هر فایل ورودی گرفته شود. نام خروجیهای کمکی برای هر ورودی با ترکیب dumppfx، dumpbase منهای پسوند، و پسوند خروجی کمکی تشکیل میشود؛ نام خروجیهای dump تنها از این جهت تفاوت دارند که پسوند dumpbase در آنها حفظ میشود.
در مورد خروجیهای کمکی و dump که هنگام بازکامپایل LTO ایجاد میشوند، ترکیبی از dumppfx و dumpbase، همانطور که داده شده یا از نام خروجی پیونددهنده (و نه از ورودیها) مشتق شده است، حتی در مواردی که این ترکیب در غیر این صورت بدین شکل استفاده نمیشد، با یک نقطه انتهایی به جای خط تیره افزودهشده توسط کامپایلر (در صورت وجود)، به عنوان گزینه -dumpdir به lto-wrapper ارسال میشود؛ از آنجا که این برنامه در فرآیند پیوند درگیر است، معمولاً هیچ -dumpbase و -dumpbase-ext دریافت نمیکند و آنها را نادیده میگیرد.
هنگام اجرای زیرکامپایلرها، lto-wrapper نام مراحل LTO را به dumppfx دریافتی الحاق میکند، اطمینان حاصل میکند که شامل یک مؤلفه دایرکتوری باشد تا هرگونه -dumpdir را لغو کند، و آن را به عنوان -dumpbase به زیرکامپایلرها ارسال میکند.
- -v
- --verbose
- دستورهای اجراشده برای اجرای مراحل کامپایل را (روی خروجی خطای استاندارد) چاپ میکند. همچنین شماره نسخه برنامه راهانداز کامپایلر، پیشپردازنده و خود کامپایلر را چاپ میکند.
- -###
- مانند -v است، با این تفاوت که دستورها اجرا نمیشوند و آرگومانها درون علامت نقلقول قرار میگیرند، مگر اینکه تنها حاوی نویسههای الفبایی-عددی یا "./-_" باشند. این گزینه برای اسکریپتهای پوسته جهت دریافت خطوط فرمان تولیدشده توسط راهانداز مفید است.
- --help
- توضیحاتی درباره گزینههای خط فرمان شناختهشده توسط gcc را (روی خروجی استاندارد) چاپ میکند. اگر گزینه -v نیز مشخص شده باشد، --help به فرایندهای گوناگون فراخوانیشده توسط gcc نیز منتقل میشود تا آنها بتوانند گزینههای خط فرمانی را که میپذیرند نمایش دهند. اگر گزینه -Wextra نیز (پیش از گزینه --help) مشخص شده باشد، گزینههای خط فرمانی که هیچ مستنداتی به آنها مرتبط نیست نیز نمایش داده میشوند.
- --target-help
- توضیحاتی از گزینههای خط فرمان خاصِ هدف را برای هر ابزار (روی خروجی استاندارد) چاپ میکند. برای برخی اهداف ممکن است اطلاعات تکمیلی خاص هدف نیز چاپ شود.
- --help={class|[^]qualifier}[,...]
- توضیحاتی درباره گزینههای خط فرمان شناختهشده توسط کامپایلر که در تمام کلاسها و تعیینکنندههای مشخصشده میگنجند را (روی خروجی استاندارد) چاپ میکند. کلاسهای پشتیبانیشده عبارتند از:
- optimizers
- تمام گزینههای بهینهسازی پشتیبانیشده توسط کامپایلر را نمایش میدهد.
- warnings
- تمام گزینههای مهارکننده پیامهای هشدار تولیدشده توسط کامپایلر را نمایش میدهد.
- target
- گزینههای خاصِ هدف را نمایش میدهد. با این حال، برخلاف گزینه --target-help، گزینههای خاصِ هدفِ پیونددهنده و اسمبلر نمایش داده نمیشوند؛ زیرا این ابزارها در حال حاضر از نحو گسترشیافته --help= پشتیبانی نمیکنند.
- params
- مقدارهای شناختهشده توسط گزینه --param را نمایش میدهد.
- language
- گزینههای پشتیبانیشده برای language را نمایش میدهد، که در آن language نام یکی از زبانهای پشتیبانیشده در این نسخه از GCC است. اگر گزینهای توسط همه زبانها پشتیبانی شود، باید کلاس common انتخاب شود.
- common
- گزینههایی را که میان تمام زبانها مشترک هستند نمایش میدهد.
تعیینکنندههای پشتیبانیشده عبارتند از:
- undocumented
- فقط گزینههایی را نمایش میدهد که مستندسازی نشدهاند.
- joined
- گزینههایی را نمایش میدهد که آرگومانی را میپذیرند که پس از علامت مساوی در همان قطعه متن پیوسته قرار دارد، مانند: --help=target.
- separate
- گزینههایی را نمایش میدهد که آرگومانی را میپذیرند که به صورت یک کلمه مجزا پس از گزینه اصلی قرار میگیرد، مانند: -o output-file.
بنابراین به عنوان مثال برای نمایش تمام سوئیچهای مستندنشده خاصِ هدف که توسط کامپایلر پشتیبانی میشوند، از این دستور استفاده کنید:
--help=target,undocumented
معنای یک تعیینکننده را میتوان با قرار دادن نویسه ^ به عنوان پیشوند معکوس کرد؛ بنابراین به عنوان مثال برای نمایش تمام گزینههای هشدار دودویی (یعنی مواردی که یا روشن هستند یا خاموش و هیچ آرگومانی نمیپذیرند) که دارای توضیحات هستند، از این دستور استفاده کنید:
--help=warnings,^joined,^undocumented
آرگومان --help= نباید صرفاً از تعیینکنندههای معکوسشده تشکیل شود.
ترکیب چندین کلاس امکانپذیر است، هرچند که این کار معمولاً خروجی را آنچنان محدود میکند که چیزی برای نمایش باقی نمیماند. با این حال، یک مورد که کارساز است، زمانی است که یکی از کلاسها target باشد. به عنوان مثال، برای نمایش تمام گزینههای بهینهسازی خاصِ هدف، از این دستور استفاده کنید:
--help=target,optimizers
گزینه --help= میتواند در خط فرمان تکرار شود. هر بار استفاده متوالی، کلاس درخواستی گزینههای خود را نمایش میدهد و مواردی را که قبلاً نمایش داده شدهاند نادیده میگیرد. اگر --help نیز در هر کجای خط فرمان مشخص شده باشد، بر هر گزینه --help= اولویت دارد.
اگر گزینه -Q در خط فرمان پیش از گزینه --help= ظاهر شود، متن توصیفی نمایش داده شده توسط --help= تغییر میکند. به جای توصیف گزینههای نمایش داده شده، مشخص میشود که آیا آن گزینه فعال، غیرفعال یا روی مقدار خاصی تنظیم شده است (به شرطی که کامپایلر در نقطهای که گزینه --help= استفاده میشود این موضوع را بداند).
در اینجا
یک مثال
کوتاه شده
از پورت ARM
برای gcc
آورده شده
است: % gcc -Q -mabi=2 --help=target -c The following
options are target specific: -mabi= 2 -mabort-on-noreturn [disabled] -mapcs
[disabled]
خروجی نسبت به اثرات گزینههای پیشین خط فرمان حساس است، بنابراین به عنوان مثال میتوان با استفاده از دستور زیر دریافت که چه بهینهسازیهایی در -O2 فعال هستند:
-Q -O2 --help=optimizers
همچنین میتوانید با استفاده از دستورهای زیر پی ببرید کدام بهینهسازیهای دودویی توسط -O3 فعال میشوند:
gcc -c -Q -O3 --help=optimizers > /tmp/O3-opts gcc -c -Q -O2 --help=optimizers > /tmp/O2-opts diff /tmp/O2-opts /tmp/O3-opts | grep enabled
- --version
- شماره نسخه و کپیرایت GCC فراخوانیشده را نمایش میدهد.
- -pass-exit-codes
- --pass-exit-codes
- به طور معمول برنامهٔ gcc در صورتی که هر یک از مراحل کامپایلر یک کد خروج ناموفق بازگرداند، با کد ۱ خارج میشود. اگر -pass-exit-codes را مشخص کنید، برنامهٔ gcc در عوض با بزرگترین کد خطای عددی تولیدشده توسط هر مرحلهای که نشاندهندهٔ خطا باشد خارج خواهد شد. فرانتاندهای C، C++ و Fortran در صورت مواجهه با خطای داخلی کامپایلر، کد ۴ را بازمیگردانند.
- -pipe
- --pipe
- به جای فایلهای موقت، از لولهها (pipeها) برای ارتباط میان مراحل مختلف کامپایل استفاده میکند. این گزینه در برخی سیستمها که اسمبلر قادر به خواندن از یک لوله نیست کار نخواهد کرد؛ اما اسمبلر GNU مشکلی در این باره ندارد.
- -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++، فایلهای مشخصات معادل Ada (موسوم به Ada specs) را تولید میکند.
- -fada-spec-parent=unit
- در ترکیب با -fdump-ada-spec[-slim] در بالا، مشخصات Ada را به عنوان واحدهای فرزندِ واحد والد unit تولید میکند.
- -fdump-go-spec=file
- برای فایلهای ورودی در هر زبانی، اعلانهای معادل Go را در file تولید میکند. این گزینه اعلانهای "const"، "type"، "var" و "func" زبان Go را ایجاد میکند که میتواند روش مفیدی برای آغاز نوشتن یک رابط Go برای کدهای نوشتهشده به زبانهای دیگر باشد.
- @file
- گزینههای
خط فرمان را
از file
میخواند.
گزینههای
خواندهشده
به جای
گزینهٔ
اصلی @file درج
میشوند.
اگر file وجود
نداشته
باشد یا
قابل
خواندن
نباشد، با
این گزینه
به صورت
تحتاللفظی
رفتار شده و
حذف نخواهد
شد.
گزینهها در file با نویسههای فاصله (whitespace) از یکدیگر جدا میشوند. یک نویسهٔ فاصله را میتوان با قرار دادن کل گزینه در نقلقول تکی یا دوتایی در داخل گزینه گنجاند. هر نویسهای (از جمله بکاسلش) را میتوان با افزودن یک بکاسلش در ابتدای آن، در گزینه قرار داد. خود file نیز میتواند شامل گزینههای @file اضافی باشد؛ هر نوع از این گزینهها به صورت بازگشتی پردازش خواهند شد..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 را فراخوانی کرده و بهطور خودکار پیوند دادن (linking) با کتابخانهٔ 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 با اصلاحات اعمالشده در اصلاحیهٔ شماره ۱.
- c99
- c9x
- iso9899:1999
- iso9899:199x
- استاندارد ISO C99. این استاندارد به جز باگها و مسائل مربوط به محاسبات ممیز شناور (floating-point) (عمدتاً، ولی نه کاملاً، مرتبط با قابلیتهای اختیاری 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 برای جدید یا O برای قدیمی، در نخستین نویسه پس از شماره خط و دونقطه)، و این که از یک اعلان آمده است یا از یک تعریف (C یا F بهترتیب، در نویسه بعدی). در صورت تعریف توابع، فهرستی از آرگومانها به سبک K&R به همراه اعلانهایشان نیز درون توضیحات، پس از اعلان ارائه میشود.
- -fno-asm
- کلمات
"asm"،
"inline" یا
"typeof" را
به عنوان
کلمه کلیدی
شناسایی
نمیکند،
تا کد
بتواند از
این کلمات
به عنوان
شناسه
استفاده
کند.
میتوانید
به جای
آنها از
کلمات
کلیدی
"__asm__"،
"__inline__" و
"__typeof__"
استفاده
کنید. در C،
گزینه -ansi
شامل -fno-asm
میشود.
در C++، کلمه "inline" یک کلمه کلیدی استاندارد است و تحت تأثیر این سوییچ قرار نمیگیرد. ممکن است بخواهید به جای آن از پرچم -fno-gnu-keywords استفاده کنید که "typeof" را غیرفعال میکند اما به "asm" و "inline" کاری ندارد. در حالت C99 (-std=c99 یا -std=gnu99)، این سوییچ تنها روی کلمات کلیدی "asm" و "typeof" اثر میگذارد، زیرا "inline" در ISO C99 یک کلمه کلیدی استاندارد است. در حالت C23 (-std=c23 یا -std=gnu23)، این سوییچ تنها بر کلمه کلیدی "asm" تأثیر میگذارد، چرا که "typeof" در ISO C23 یک کلمه کلیدی استاندارد است.
- -fno-builtin
- -fno-builtin-function
- توابع
توکاری (built-in)
را که
پیشوند
آنها با
__builtin_ آغاز
نمیشود،
شناسایی
نمیکند.
GCC بهطور معمول کدهای ویژهای تولید میکند تا برخی توابع توکار را با کارایی بیشتری مدیریت کند؛ به عنوان مثال، فراخوانیهای "alloca" ممکن است تبدیل به دستورالعملهای تکی شوند که پشته را مستقیماً تنظیم میکنند، و فراخوانیهای "memcpy" ممکن است به حلقههای کپی درونخطی (inline) تبدیل شوند. کد حاصل اغلب هم کوچکتر و هم سریعتر است، اما چون فراخوانیهای تابع دیگر به شکل واقعی ظاهر نمیشوند، شما نمیتوانید روی آن فراخوانیها نقطه توقف (breakpoint) بگذارید، و همچنین نمیتوانید رفتار توابع را با پیوند زدن به یک کتابخانه دیگر تغییر دهید. علاوه بر این، هنگامی که یک تابع به عنوان تابع توکار شناخته میشود، ممکن است GCC از اطلاعات مربوط به آن تابع برای هشدار دادن درباره مشکلات مربوط به فراخوانیهای آن تابع، یا برای تولید کد کارآمدتر استفاده کند، حتی اگر کد حاصل همچنان حاوی فراخوانیهایی به آن تابع باشد. برای نمونه، هشدارهایی با -Wformat برای فراخوانیهای نادرست به "printf" داده میشود زمانی که "printf" توکار است و مشخص شده است که "strlen" حافظه سراسری (global memory) را تغییر نمیدهد.
با گزینه -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" علامتگذاری شدهاند. این یک ویژگی آزمایشی است که امکان آزمون واحد گذرگاههای GIMPLE را فراهم میآورد.
- -fgnu-tm
- هنگامی که
گزینهٔ -fgnu-tm
مشخص شود،
کامپایلر
کدی برای
گونهٔ
لینوکسی
سند مشخصات
فعلی ABI
حافظهٔ
تراکنشی (Transactional
Memory) اینتل
(نگارش ۱.۱،
۶ مه ۲۰۰۹)
تولید
میکند. این
یک ویژگی
آزمایشی
است که با
تغییر
مشخصات
رسمی، ممکن
است رابط آن
در
نگارشهای
آیندهٔ GCC
تغییر کند.
لطفاً توجه
داشته
باشید که
این ویژگی
روی همهٔ
معماریها
پشتیبانی
نمیشود.
برای اطلاعات بیشتر دربارهٔ پشتیبانی GCC از حافظهٔ تراکنشی،
توجه داشته باشید که ویژگی حافظهٔ تراکنشی همراه با استثناهای غیرفراخوانی (-fnon-call-exceptions) پشتیبانی نمیشود.
- -fgnu89-inline
- گزینهٔ -fgnu89-inline
به GCC دستور
میدهد که
در حالت C99 از
معناشناسی
سنتی GNU برای
توابع
"inline"
استفاده
کند.
استفاده از این گزینه تقریباً معادل افزودن صفت تابع "gnu_inline" به تمام توابع درونخطی (inline) است.
گزینهٔ -fno-gnu89-inline صراحتاً به GCC دستور میدهد که در حالت C99 یا gnu99 از معناشناسی C99 برای "inline" استفاده کند (یعنی رفتار پیشفرض را تعیین میکند). این گزینه در حالتهای -std=c90 یا -std=gnu90 پشتیبانی نمیشود.
ماکروهای پیشپردازندهٔ "__GNUC_GNU_INLINE__" و "__GNUC_STDC_INLINE__" میتوانند برای بررسی این که کدام معناشناسی برای توابع "inline" حاکم است، استفاده شوند.
- -fhosted
- تصریح میکند که کامپایل یک محیط میزبانیشده (hosted) را هدف قرار میدهد. این گزینه متضمن -fbuiltin است. محیط میزبان محیطی است که در آن تمام کتابخانهٔ استاندارد در دسترس است و در آن نوع بازگشتی "main" از نوع "int" است. تقریباً همه چیز بهجز هسته نمونهای از آن هستند. این گزینه معادل -fno-freestanding است.
- -flax-vector-conversions
- اجازه دادن به تبدیلهای ضمنی بین بردارهایی با تعداد عناصر متفاوت و/یا نوعهای عنصر ناسازگار. این گزینه نباید برای کدهای جدید استفاده شود.
- -fms-extensions
- پذیرش برخی
ساختارهای
غیراستاندارد
مورد
استفاده در
فایلهای
سرآیند
مایکروسافت.
در کد ++C، این گزینه اجازه میدهد نام اعضا در ساختارها مشابه با اعلانهای نوع پیشین باشند.
typedef int UOW; struct ABC { UOW UOW; };برخی موارد از فیلدهای بدون نام در ساختارها و اجتماعها (unions) تنها با این گزینه پذیرفته میشوند.
توجه داشته باشید که این گزینه برای همهٔ هدفها غیرفعال است بهجز هدفهای x86 که از ms-abi استفاده میکنند.
- -fpermitted-flt-eval-methods=style
- استاندارد
ISO/IEC TS 18661-3 مقادیر
مجاز جدیدی
را برای
"FLT_EVAL_METHOD"
تعریف
میکند که
نشان
میدهند
عملیات و
ثوابت
دارای یک
نوع معنایی
که قالب
مبادلهای
(interchange) یا
گسترشیافته
است، باید
با دقت و
دامنهٔ آن
نوع
ارزیابی
شوند. این
مقادیر
جدید
فوقمجموعهای
از مقادیر
مجاز تحت 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 است. پیشفرض در حالت گویش گنو (-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 است که کمترین سختگیری را دارد. در این حالت، تمام آرایههای انتهایی ساختارها به عنوان اعضای آرایهٔ انعطافپذیر تلقی میشوند.
دو سطح دیگر بین 0 و 3 وجود دارد که برای پشتیبانی از کدهای قدیمیتر ارائه شدهاند؛ کدهایی که از افزونهٔ آرایه با طول صفر GCC ([0]) یا آرایهٔ تکعنصری ([1]) به عنوان اعضای آرایهٔ انعطافپذیر استفاده میکنند. هنگامی که level برابر 1 باشد، آرایهٔ انتهایی زمانی به عنوان عضو آرایهٔ انعطافپذیر در نظر گرفته میشود که به صورت []، [0]، یا [1] اعلان شده باشد. هنگامی که level برابر 2 باشد، آرایهٔ انتهایی تنها زمانی به عنوان عضو آرایهٔ انعطافپذیر تلقی میشود که به صورت [] یا [0] اعلان شده باشد.
شما میتوانید این رفتار را برای یک فیلد آرایهٔ انتهایی خاص از یک ساختار با استفاده از صفت متغیر "strict_flex_array" کنترل کنید.
گزینهٔ -fstrict_flex_arrays با گزینهٔ -Wstrict-flex-arrays تعامل دارد.
- -fsso-struct=endianness
- ترتیب
پیشفرض
ذخیرهسازی
اسکالرِ
ساختارها و
اجتماعها
(unions) را روی
ترتیب بایت
(endianness)
مشخصشده
تنظیم
میکند.
مقادیر
مجاز
عبارتند از
big-endian، little-endian و native
برای ترتیب
بایت بومی
معماری هدف
(پیشفرض).
این گزینه
برای C++
پشتیبانی
نمیشود.
هشدار: اگر ترتیب بایت مشخصشده با ترتیب بایت بومی هدف یکسان نباشد، سوییچ -fsso-struct باعث میشود GCC کدی تولید کند که با کد تولیدشده بدون این سوییچ سازگاری باینری ندارد.
گزینههای کنترل گویش 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
- پیش از کامپایل هر فایل مبدئی که صراحتاً در خط فرمان مشخص شده باشد، رابطهای ماژول کامپایلشده (compiled module interfaces) را برای واحد سرآیند <bits/stdc++.h> و ماژولهای std و std.compat میسازد. هدف این است که برای ساخت برنامههای سادهای که با یک دستور از import std; استفاده میکنند، کاربردی و مفید باشد.
- -fabi-version=n
- از نسخهٔ n
رابط
دودویی
برنامه (ABI)
زبان C++
استفاده
میکند.
مقدار
پیشفرض
نسخهٔ 0 است.
نسخهٔ 0 به نسخهای اشاره دارد که بیشترین انطباق را با مشخصات C++ ABI دارد. بنابراین، ABI بهدستآمده با استفاده از نسخهٔ 0 با برطرف شدن باگهای ABI در نسخههای مختلف G++ تغییر خواهد کرد.
نسخهٔ 1، نسخهای از C++ ABI است که نخستینبار در G++ 3.2 ظاهر شد.
نسخهٔ 2، نسخهای از C++ ABI است که نخستینبار در G++ 3.4 ظاهر شد و تا G++ 4.9 نسخهٔ پیشفرض بود.
نسخهٔ 3، خطایی را در درهمسازی (mangling) یک آدرس ثابت به عنوان آرگومان الگو تصحیح میکند.
نسخهٔ 4، که نخستینبار در G++ 4.5 ظاهر شد، یک درهمسازی استاندارد برای نوعهای برداری (vector types) پیادهسازی میکند.
نسخهٔ 5، که نخستینبار در G++ 4.6 ظاهر شد، درهمسازی صفت const/volatile روی نوعهای اشارهگر تابع، decltype یک اعلان ساده (plain decl)، و استفاده از یک پارامتر تابع در اعلان پارامتری دیگر را تصحیح میکند.
نسخهٔ 6، که نخستینبار در G++ 4.7 ظاهر شد، رفتار ارتقای شمارشهای با حوزه (scoped enums) در C++11 و درهمسازی بستههای آرگومان الگو (template argument packs)، const/static_cast، پیشوندهای ++ و --، و تابع حوزهٔ کلاسِ استفادهشده به عنوان آرگومان الگو را تصحیح میکند.
نسخهٔ 7، که نخستینبار در G++ 4.8 ظاهر شد، nullptr_t را به عنوان یک نوع توکار در نظر میگیرد و درهمسازی لانبداها (lambdas) را در حوزهٔ آرگومان پیشفرض تصحیح میکند.
نسخهٔ 8، که نخستینبار در G++ 4.9 ظاهر شد، رفتار جایگزینی نوعهای تابع دارای توصیفکنندههای function-cv-qualifiers را تصحیح میکند.
نسخهٔ 9، که نخستینبار در G++ 5.2 ظاهر شد، ترازسازی (alignment) "nullptr_t" را تصحیح میکند.
نسخهٔ 10، که نخستینبار در G++ 6.1 ظاهر شد، درهمسازی صفتهایی که بر هویت نوع تأثیر میگذارند، مانند صفتهای قرارداد فراخوانی ia32 (مانند stdcall) را اضافه میکند.
نسخهٔ 11، که نخستینبار در G++ 7 ظاهر شد، درهمسازی عبارتهای ...sizeof و نام عملگرها را تصحیح میکند. برای چندین موجودیت با نام یکسان درون یک تابع که در حوزههای متفاوتی اعلان شدهاند، درهمسازی اکنون از دوازدهمین رخداد به بعد تغییر میکند. همچنین این گزینه فعال بودن -fnew-inheriting-ctors را نیز در پی دارد.
نسخهٔ 12، که نخستینبار در G++ 8 ظاهر شد، قراردادهای فراخوانی را برای کلاسهای خالی روی معماری هدف x86_64 و برای کلاسهایی که تنها دارای سازندههای رونوشت/انتقال حذفشده (deleted copy/move constructors) هستند تصحیح میکند. این نسخه به طور تصادفی قرارداد فراخوانی را برای کلاسهای دارای سازندهٔ رونوشت حذفشده و سازندهٔ انتقال بدیهی (trivial move constructor) تغییر میدهد.
نسخهٔ 13، که نخستینبار در G++ 8.2 ظاهر شد، تغییر تصادفی در نسخهٔ 12 را برطرف میکند.
نسخهٔ 14، که نخستینبار در G++ 10 ظاهر شد، درهمسازی عبارت nullptr را تصحیح میکند.
نسخهٔ 15، که نخستینبار در G++ 10.3 ظاهر شد، پسرفت (regression) برچسب ABI در G++ 10 را تصحیح میکند.
نسخهٔ 16، که نخستینبار در G++ 11 ظاهر شد، درهمسازی "__alignof__" را تغییر میدهد تا از "alignof" و نامهای عملگر وابسته (dependent operator names) متمایز شود.
نسخهٔ 17، که نخستینبار در G++ 12 ظاهر شد، چیدمان (layout) کلاسهایی را که از کلاسهای تجمیعی (aggregate classes) با مقداردهندههای پیشفرض عضو در C++14 به بالا ارثبری میکنند، اصلاح میکند.
نسخهٔ 18، که نخستینبار در G++ 13 ظاهر شد، درهمسازی لانبداهایی را که زمینهٔ (context) اضافی دارند، اصلاح میکند.
نسخهٔ 19، که نخستینبار در G++ 14 ظاهر شد، درهمسازی متصلکنندههای ساختاریافته (structured bindings) جهت دربرگرفتن برچسبهای ABI، مدیریت اعضای [[no_unique_address]] دارای توصیفکنندهٔ cv، و درهمسازی قیدهای C++20 روی الگوهای توابع را اصلاح و اضافه میکند.
نسخهٔ 20، که نخستینبار در G++ 15 ظاهر شد، درهمسازی لانبداها در مقداردهندههای عضو دادهای ایستا (static data member initializers) را اصلاح میکند.
نسخهٔ 21، که نخستینبار در G++ 16 ظاهر شد، شکار (capture) غیرضروری در لانبداهای 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" در کد قابل مشاهده باشد یا از قلابهای (hooks) "malloc" استفاده شده باشد، اما اگر برنامهای این عملگرها را جایگزین کند ممکن است برآورده نشود. این رفتار بهطور پیشفرض فعال است. با گزینهٔ "-fno-assume-sane-operators-new-delete" کامپایلر GCC باید فرض کند همهٔ این فراخوانیها (چه از عبارتهای new یا delete و چه فراخوانی مستقیم) ممکن است وضعیت سراسری را بخوانند و بنویسند، مگر اینکه خلاف آن ثابت شود (مثلاً هنگامی که GCC پیادهسازی آنها را کامپایل میکند). اگر آن عملگرها جایگزین شدهاند یا ممکن است جایگزین شوند و کد باید چنین رفتاری را انتظار داشته باشد، از این گزینه استفاده کنید.
- -fchar8_t
- -fno-char8_t
- فعالسازی
پشتیبانی
از "char8_t"
مطابق با
تصویب آن در
C++20. این شامل
افزودن نوع
پایهایِ
جدید
"char8_t"،
تغییراتی
در انواع
لیترالهای
نویسهای و
رشتهای UTF-8،
امضاهای
جدید برای
لیترالهای
تعریفشده
توسط کاربر
(user-defined literals)،
بهروزرسانیهای
کتابخانهٔ
استانداردِ
مرتبط و
ماکروهای
آزمون
ویژگیِ
جدید
"__cpp_char8_t" و
"__cpp_lib_char8_t"
است.
این گزینه امکان سربارگذاری توابع را برای رشتههای معمولی و 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 خوشساخت است، اما هنگام مشخص کردن -fchar8_t بدساخت است.
const char *cp = u8"xx";// error: invalid conversion from // `const char8_t*' to `const char*' int f(const char*); auto v = f(u8"xx"); // error: invalid conversion from // `const char8_t*' to `const char*' std::string s{u8"xx"}; // error: no matching function for call to // `std::basic_string<char>::basic_string()' using namespace std::literals; s = u8"xx"s; // error: conversion from // `basic_string<char8_t>' to non-scalar // type `basic_string<char>' requested - -fcheck-new
- بررسی میکند که اشارهگر بازگردانده شده توسط "operator new" قبل از تلاش برای تغییر حافظهٔ تخصیصیافته، غیرتهی (non-null) باشد. این بررسی معمولاً غیرضروری است زیرا استاندارد C++ مشخص میکند که "operator new" تنها در صورتی 0 را برمیگرداند که بهصورت throw() اعلان شده باشد، که در این حالت کامپایلر حتی بدون این گزینه نیز همیشه مقدار بازگشتی را بررسی میکند. در تمام موارد دیگر، هنگامی که "operator new" مشخصات استثنای غیرخالی دارد، اتمام حافظه با پرتاب "std::bad_alloc" اعلام میشود. همچنین نگاه کنید به new (nothrow).
- -fconcepts
- فعالسازی
پشتیبانی
از ویژگی C++ Concepts
برای محدود
کردن
آرگومانهای
الگو. با -std=c++20
و بالاتر،
مفاهیم (Concepts)
بخشی از
استاندارد
زبان
هستند،
بنابراین
-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 که در حافظهپنهان نگهداری خواهند شد، روی 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)
که
قراردادها
با آن
ارزیابی
میشوند
روی semantic.
مقادیر در دسترس برای حالت ارزیابی عبارتند از:
'"ignored"' بررسیهای قرارداد حذف خواهند شد، بدون اینکه هیچ بررسیای در زمان کامپایل یا زمان اجرا اضافه شود.
'"observed"' بررسیهای قرارداد (در زمان اجرا) انجام میشوند و در صورت ناموفق بودن، گردانندهای فراخوانی میشود که امکان انجام اقداماتی مانند ثبت وقایع یا انتشار هشدارهای زمان اجرا را فراهم میکند. هنگامی که گرداننده بازگردد، اجرای کد ادامه مییابد. در زمان کامپایل، بررسیها برای ارزیابیهای "constexpr" انجام میشوند، در این حالت در صورت ناموفق بودن بررسی، یک پیام تشخیصی صادر میشود.
'"enforce"' بررسیهای قرارداد انجام میشوند و در صورت ناموفق بودن، گرداننده فراخوانی میشود. هنگامی که گرداننده بازگردد، اجرای کد پایان مییابد و از ادامهٔ آن فراتر از مورد ناموفق جلوگیری میشود. در زمان کامپایل، بررسیها روی "constexpr" اعمال میشوند و در صورت ناموفق بودن، برنامه بدساخت تلقی شده و یک خطا صادر میشود.
'"quick_enforce"' بررسیهای قرارداد (در زمان اجرا) انجام میشوند و در صورت ناموفق بودن، اجرا بلافاصله (بدون فراخوانی هیچ گردانندهای) پایان مییابد. در زمان کامپایل تفاوتی در رفتار بین این گزینه و حالت "enforce" وجود ندارد، زیرا هیچ گردانندهای در زمان کامپایل فراخوانی نمیشود..IP -fcontracts-conservative-ipa 4 این گزینه از اقدام تحلیل بینرویهای (inter-procedural analysis یا IPA) هنگامی که بدنهٔ یک تابع درونخطی (inline) در یک TU مشخص قابل مشاهده است، جلوگیری میکند. این امر شرایطی را پوشش میدهد که شرایط ارزیابی قرارداد مجاز به تفاوت بین TUهای مختلف باشند، که به این معنی است که چنین اقداماتی بالقوه نادرست خواهند بود.
- -fcontract-checks-outlined
- بهطور پیشفرض، بررسیهای قرارداد برای شرایط "pre" و "post" بهصورت درونخطی (in-line) در بدنهٔ توابع بسط مییابند. این گزینه باعث میشود در عوض یک تابع کوچک (شامل بررسیها) ایجاد شود که در موقعیت مربوطه فراخوانی گردد. این امر اجازه میدهد معیارهای متفاوتی برای کامپایل بخش بررسی و بقیهٔ بدنهٔ تابع اعمال شود.
- -fcontract-disable-optimized-checks
- هنگامی که بررسیهای شرایط "pre" و "post" برونخط (outlined) میشوند (با استفاده از -fcontract-checks-outlined)، این گزینه مراحل بهینهسازی را برای آن توابع غیرفعال میکند که میتواند از حذف ناخواستهٔ مراحل بررسی جلوگیری نماید.
- -fcontracts-client-check=mode
- این گزینه
درج
بررسیها
را در
محلهای
فراخوانی
(بررسی در
سمت
فراخواننده
یا caller-side) فعال
میکند.
مقدار mode مشخص میکند کدام بررسیهای قرارداد انجام شوند: '"none"' بدون بررسی در سمت فراخواننده/کلاینت (پیشفرض)
'"pre"' پیششرطها در سمت فراخواننده/کلاینت بررسی میشوند.
'"all"' هر دو پیششرطها و پسشرطها در سمت فراخواننده/کلاینت بررسی میشوند.
- -fcontracts-definition-check=mode
- این گزینه
امکان
غیرفعال
کردن
بررسیهای
سمت
فراخوانده/تعریف
(callee/definition-side) را
فراهم
میکند، که
در غیر این
صورت هنگام
فعال بودن
قابلیت
قراردادها
بهطور
پیشفرض
فعال هستند.
متغیر mode مقادیر '"on"' و '"off"' را میپذیرد.
- -fcoroutines
- پشتیبانی از افزونهٔ کوروتینهای C++ را فعال میکند. با -std=c++20 و بالاتر، کوروتینها بخشی از استاندارد زبان هستند، بنابراین -fcoroutines بهطور پیشفرض فعال است.
- -fdiagnostics-all-candidates
- به بخش پیشانی (front end) C++ اجازه میدهد هنگام شکست در رفع ابهام بارگذاری بیشازحد (overload resolution)، تمام کاندیداها را ذکر کند، از جمله هنگامی که یک تابع حذفشده (deleted function) انتخاب میشود.
- -fdump-lang-
- -fdump-lang-switch
- -fdump-lang-switch-options
- -fdump-lang-switch-options=filename
- تخلیهٔ (dump) اطلاعات مختص C++ را کنترل میکند. بخشهای options و filename همانطور که در گزینهٔ -fdump-tree شرح داده شده رفتار میکنند. مقادیر switch زیر پذیرفته میشوند:
- all
- تمام موارد زیر را فعال میکند.
- class
- اطلاعات سلسلهمراتب کلاس را تخلیه میکند. اطلاعات جدول مجازی (virtual table) صادر میشود مگر آنکه 'slim' مشخص شده باشد.
- module
- اطلاعات ماژول را تخلیه میکند. گزینههای lineno (مکانها)، graph (دسترسپذیری)، blocks (خوشهها)، uid (سریالسازی)، alias (قابل ادغام)، asmname (Elrond)، eh (نگاشتکننده) و vops (ماکروها) ممکن است اطلاعات بیشتری ارائه دهند.
- raw
- دادههای خام درخت درونی را تخلیه میکند.
- tinst
- توالی
نمونهسازیهای
قالب (template instantiations)
را تخلیه
میکند که
برای نمایش
عمق بازگشت
تورفتگی
دارند.
گزینهٔ lineno
مکان در کد
منبع را که
نمونهسازی
در آن آغاز
شده اضافه
میکند، و
گزینهٔ details
همچنین
جایگزینیهای
پیشازنمونهسازی
را، مانند
مواردی که
هنگام
استنتاج
آرگومان
قالب انجام
شده، تخلیه
میکند.
خطوط در تخلیهٔ .tinst با I برای یک نمونهسازی، S برای یک جایگزینی دیگر، و R[IS] برای زمینهٔ بازگشاییشدهٔ یک نمونهسازی بهتعویقافتاده آغاز میشوند.
- -fno-elide-constructors
- استاندارد
C++ به یک
پیادهسازی
اجازه
میدهد از
ایجاد شیء
موقتی که
تنها برای
مقداردهی
اولیهٔ شیء
دیگری از
همان نوع
استفاده
میشود
صرفنظر
کند. مشخص
کردن این
گزینه آن
بهینهسازی
را غیرفعال
کرده و G++ را
مجبور
میکند در
تمام موارد
سازندهٔ
رونوشت (copy constructor)
را
فراخوانی
کند. این
گزینه
همچنین
باعث
میشود G++
توابع عضو
بدیهی (trivial member functions)
را
فراخوانی
کند که در
غیر این
صورت
بهصورت
درونخطی
بسط
مییافتند.
در C++17، کامپایلر ملزم به حذف این اشیای موقت است، اما این گزینه همچنان بر توابع عضو بدیهی تأثیر میگذارد.
- -fno-enforce-eh-specs
- کدی برای بررسی نقض مشخصات استثنا (exception specifications) در زمان اجرا تولید نمیکند. این گزینه استاندارد C++ را نقض میکند، اما ممکن است برای کاهش اندازهٔ کد در ساختهای نهایی مفید باشد، بسیار شبیه به تعریف "NDEBUG". این امر به کد کاربر اجازهٔ پرتاب استثناها در نقض مشخصات استثنا را نمیدهد؛ کامپایلر همچنان بر اساس مشخصات استثنا بهینهسازی انجام میدهد، بنابراین پرتاب یک استثنای غیرمنتظره منجر به رفتار تعریفنشده (undefined behavior) در زمان اجرا خواهد شد.
- -fextern-tls-init
- -fno-extern-tls-init
- استانداردهای
C++11 و OpenMP به
متغیرهای
"thread_local" و
"threadprivate"
اجازه
میدهند
دارای
مقداردهی
اولیهٔ
پویا (زمان
اجرا)
باشند. برای
پشتیبانی
از این امر،
هرگونه
استفاده از
چنین
متغیری از
طریق یک
تابع لفاف
(wrapper) انجام
میشود که
هرگونه
مقداردهی
اولیهٔ
لازم را
انجام
میدهد.
هنگامی که
استفاده و
تعریف
متغیر در یک
واحد ترجمه
(TU) یکسان
باشد، این
سربار
میتواند
با
بهینهسازی
حذف شود،
اما هنگامی
که استفاده
در یک واحد
ترجمهٔ
متفاوت
باشد،
سربار قابل
توجهی وجود
دارد حتی
اگر متغیر
در واقع
نیازی به
مقداردهی
اولیهٔ
پویا
نداشته
باشد. اگر
برنامهنویس
مطمئن باشد
که هیچ
استفادهای
از متغیر در
یک TU
غیرتعریفکننده
نیازی به
راهاندازی
مقداردهی
اولیهٔ
پویا ندارد
(خواه به
این دلیل که
متغیر
بهصورت
ایستا
مقداردهی
اولیه شده
است، یا
استفاده از
متغیر در TU
تعریفکننده
پیش از
هرگونه
استفاده در
TU دیگر اجرا
خواهد شد)،
میتواند
با گزینهٔ
-fno-extern-tls-init از این
سربار
جلوگیری
کند.
در اهدافی که از نامهای مستعار نماد (symbol aliases) پشتیبانی میکنند، مقدار پیشفرض -fextern-tls-init است. در اهدافی که از نامهای مستعار نماد پشتیبانی نمیکنند، مقدار پیشفرض -fno-extern-tls-init است.
- -ffold-simple-inlines
- -fno-fold-simple-inlines
- به بخش پیشانی C++ اجازه میدهد فراخوانیهای "std::move"، "std::forward"، "std::addressof"، "std::to_underlying" و "std::as_const" را تا کند (fold). در مقایسه با درونخطسازی، این بدان معناست که هیچ اطلاعات اشکالزدایی برای چنین فراخوانیهایی تولید نخواهد شد. از آنجا که این توابع بهندرت برای اشکالزدایی جالب توجه هستند، این پرچم بهطور پیشفرض فعال است مگر آنکه -fno-inline فعال باشد.
- -fno-gnu-keywords
- "typeof" را بهعنوان کلیدواژه شناسایی نمیکند، تا کد بتواند از این کلمه بهعنوان یک شناسه استفاده کند. میتوانید بهجای آن از کلیدواژهٔ "__typeof__" استفاده کنید. این گزینه توسط لهجههای اکید ISO C++ اعمال میشود: -ansi، -std=c++98، -std=c++11 و غیره.
- -fno-immediate-escalation
- ارتقای
تابع فوری
(immediate function escalation) را که
به موجب آن
توابع خاصی
میتوانند
مطابق آنچه
در P2564R3 مشخص
شده به consteval
ارتقا
یابند،
فعال
نمیکند.
برای مثال:
consteval int id(int i) { return i; } constexpr int f(auto t) { return t + id(t); // id causes f<int> to be promoted to consteval } void g(int i) { f (3); }در C++20 کامپایل میشود: تابع "f" یک تابع ارتقایابندهٔ فوری است (بهدلیل وجود "auto"، یک قالب تابع است و بهصورت "constexpr" اعلان شده است) و id(t) یک عبارت ارتقایابندهٔ فوری است، بنابراین "f" به "consteval" ارتقا مییابد. در نتیجه، فراخوانی id(t) در یک زمینهٔ فوری (immediate context) قرار دارد، بنابراین مجبور نیست یک مقدار ثابت تولید کند (این همان سازوکاری است که امکان ترکیب توابع consteval را فراهم میکند). با این حال، با -fno-immediate-escalation، تابع "f" به "consteval" ارتقا نمییابد، و از آنجا که فراخوانی تابع consteval یعنی id(t) یک عبارت ثابت نیست، کامپایلر کد را رد میکند.
این گزینه بهطور پیشفرض روشن است؛ تنها در حالت C++20 یا بالاتر مؤثر واقع میشود..IP -fimplicit-constexpr 4 توابع inline را در صورتی که شرایط یک تابع constexpr را برآورده کنند، بهطور ضمنی constexpr در نظر میگیرد. این گزینه میتواند در حالت C++14 یا بالاتر استفاده شود. این امر میتواند منجر به تغییر مقداردهی اولیه از پویا به ایستا و بهینهسازیهای دیگر شود.
- -fno-implicit-templates
- هرگز برای الگوهای غیر-inline که بهطور ضمنی (یعنی از طریق استفاده) نمونهسازی شدهاند، کد تولید نمیکند؛ تنها برای نمونهسازیهای صریح کد تولید میکند. اگر از این گزینه استفاده میکنید، باید ساختار کد خود را طوری تنظیم کنید که شامل تمام نمونهسازیهای صریح لازم باشد تا در زمان پیوند با نمادهای تعریفنشده مواجه نشوید.
- -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 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
- اعلانهای توکار توابعی که توسط ANSI/ISO C الزامی نشدهاند را غیرفعال میکند. این توابع شامل "ffs"، "alloca"، "_exit"، "index"، "bzero"، "conjf" و سایر توابع مرتبط هستند.
- -fnothrow-opt
- مشخصه استثنای throw() را بهگونهای در نظر میگیرد که گویی یک مشخصه "noexcept" است تا بار اضافی اندازه بخش کد را نسبت به تابعی بدون مشخصه استثنا کاهش داده یا حذف کند. اگر تابع دارای متغیرهای محلی از نوعهایی با تخریبکنندههای غیربدیهی باشد، مشخصه استثنا در واقع تابع را کوچکتر میکند زیرا پاکسازیهای EH برای آن متغیرها میتوانند بهینهسازی و حذف شوند. اثر معنایی این است که پرتاب استثنا از تابعی با چنین مشخصه استثنایی منجر به فراخوانی "terminate" به جای "unexpected" میشود.
- -fno-operator-names
- با کلمات کلیدی نام عملگر شامل "and"، "bitand"، "bitor"، "compl"، "not"، "or" و "xor" به عنوان کلمات کلیدی هممعنی رفتار نمیکند.
- -fno-optional-diags
- پیامهای تشخیصی و هشدارهایی را که استاندارد میگوید نیازی به صدور آنها توسط کامپایلر نیست، غیرفعال میکند. در حال حاضر تنها چنین هشداری که توسط G++ صادر میشود مربوط به نامی است که معانی متعددی در یک کلاس دارد.
- -fno-pretty-templates
- هنگامی که یک پیام خطا به تخصیص یک الگوی تابع اشاره دارد، کامپایلر معمولاً امضای الگو را به همراه آرگومانهای الگو و هرگونه typedef یا typename موجود در امضا چاپ میکند (برای مثال "void f(T) [with T = int]" به جای "void f(int)") تا مشخص باشد کدام الگو درگیر است. هنگامی که یک پیام خطا به تخصیص یک الگوی کلاس اشاره دارد، کامپایلر هرگونه آرگومان الگویی را که با آرگومانهای الگوی پیشفرض آن الگو مطابقت دارند، حذف میکند. اگر هر یک از این رفتارها به جای آسانتر کردن درک پیام خطا، آن را دشوارتر کند، میتوانید از -fno-pretty-templates برای غیرفعال کردن آنها استفاده کنید.
- -frange-for-ext-temps
- تمدید طول عمر اشیاء موقت در حلقههای مبتنی بر بازه (range-based for) در C++ را فعال میکند. با -std=c++23 و بالاتر این بخشی از استاندارد زبان است، بنابراین طول عمر اشیاء موقت بهطور پیشفرض تا انتهای حلقه تمدید میشود. این گزینه امکان فعالسازی این رفتار را در نسخههای قدیمیتر استاندارد نیز فراهم میکند.
- -freflection
- قابلیت بازتابی (Reflection) آزمایشی C++26 را فعال میکند.
- -fno-rtti
- تولید
اطلاعات
مربوط به هر
کلاس دارای
توابع
مجازی را
برای
استفاده
توسط
قابلیتهای
شناسایی
نوع زمان
اجرا (RTTI) در C++
("dynamic_cast" و
"typeid")
غیرفعال
میکند. اگر
از این
بخشهای
زبان
استفاده
نمیکنید،
میتوانید
با استفاده
از این پرچم
مقداری در
فضا
صرفهجویی
کنید. توجه
داشته
باشید که
مدیریت
استثنا نیز
از همین
اطلاعات
استفاده
میکند،
اما G++ آن را
در صورت
نیاز تولید
مینماید.
عملگر
"dynamic_cast"
همچنان
میتواند
برای
تبدیلهایی
که نیازی به
اطلاعات
نوع در زمان
اجرا
ندارند،
یعنی تبدیل
به "void *"
یا به
کلاسهای
پایه
غیرمبهم،
استفاده
شود.
ترکیب کدهای کامپایلشده با -frtti با کدهای کامپایلشده با -fno-rtti ممکن است کار نکند. برای مثال، اگر کلاسی که با -fno-rtti کامپایل شده است به عنوان پایه برای کلاسی که با -frtti کامپایل شده استفاده شود، ممکن است پیوند برنامهها با شکست مواجه شود.
- -fsized-deallocation
- اعلانهای
عمومی
توکارِ
void operator delete (void *, std::size_t) noexcept; void operator delete[] (void *, std::size_t) noexcept;
معرفیشده در C++14 را فعال میکند. این گزینه برای توابع آزادسازی حافظه جایگزین تعریفشده توسط کاربر که مثلاً از اندازه شیء برای تسریع آزادسازی استفاده میکنند، مفید است. این گزینه بهطور پیشفرض در -std=c++14 و بالاتر فعال است. پرچم -Wsized-deallocation درباره مکانهایی که ممکن است بخواهند تعریفی اضافه کنند هشدار میدهد.
- -fstrict-enums
- به کامپایلر اجازه میدهد تا با استفاده از این فرض بهینهسازی کند که مقدار یک نوع شمارشی (enumerated type) تنها میتواند یکی از مقادیر شمارش (طبق تعریف در استاندارد C++؛ اساساً مقداری که میتواند با حداقل تعداد بیتهای لازم برای نمایش تمام شمارندهها نمایش داده شود) باشد. در صورتی که برنامه از یک تبدیل صریح برای تبدیل یک مقدار عدد صحیح دلخواه به نوع شمارشی استفاده کند، این فرض ممکن است نامعتبر باشد. این گزینه برای نوعهای شمارشی با نوع زیرین (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
- حداکثر تعداد یادداشتهای نمونهسازی الگو را برای یک اخطار یا خطای منفرد روی n تنظیم میکند. مقدار پیشفرض ۱۰ است.
- -ftemplate-depth=n
- حداکثر عمق نمونهسازی را برای کلاسهای الگو روی n تنظیم میکند. تعیین محدودیت برای عمق نمونهسازی الگو جهت تشخیص بازگشتهای بیپایان هنگام نمونهسازی کلاسهای الگو ضروری است. برنامههای منطبق با استاندارد ANSI/ISO C++ نباید به عمق حداکثری بیش از ۱۷ (در C++11 به ۱۰۲۴ تغییر کرد) اتکا کنند. مقدار پیشفرض ۹۰۰ است، زیرا در برخی شرایط کامپایلر ممکن است پیش از رسیدن به ۱۰۲۴ با کمبود فضای پشته (stack) مواجه شود.
- -fno-threadsafe-statics
- کد اضافی را برای استفاده از روالهای مشخصشده در C++ ABI جهت مقداردهی اولیهی نخامن (thread-safe) متغیرهای ایستای محلی تولید نمیکند. میتوانید از این گزینه برای کاهش جزئی اندازهٔ کد در برنامههایی که نیازی به نخامن بودن ندارند استفاده کنید.
- -fuse-cxa-atexit
- مخربها (destructors) را برای اشیائی با طول عمر ذخیرهسازی ایستا بهجای تابع "atexit" با تابع "__cxa_atexit" ثبت میکند. این گزینه برای مدیریت کاملاً منطبق با استانداردِ مخربهای ایستا مورد نیاز است، اما تنها در صورتی کار میکند که کتابخانهٔ C شما از "__cxa_atexit" پشتیبانی کند.
- -fno-use-cxa-get-exception-ptr
- از روال زمان اجرای "__cxa_get_exception_ptr" استفاده نمیکند. این امر باعث میشود "std::uncaught_exception" نادرست عمل کند، اما اگر این روال زمان اجرا در دسترس نباشد، ضروری است.
- -fvisibility-inlines-hidden
- این سوئیچ
اعلام
میکند که
کاربر
تلاشی برای
مقایسهٔ
اشارهگرها
به توابع یا
متدهای
درونخطی (inline)
در مواردی
که
آدرسهای
دو تابع در
اشیاء
اشتراکی
متفاوتی
گرفته
شدهاند،
انجام
نمیدهد.
اثر این گزینه این است که GCC میتواند عملاً متدهای درونخطی را با "__attribute__ ((visibility ("hidden")))" نشانهگذاری کند تا در جدول صادرات (export table) یک DSO ظاهر نشوند و هنگام استفاده در داخل همان DSO نیازی به ارجاع غیرمستقیم PLT نداشته باشند. فعالسازی این گزینه میتواند تأثیر چشمگیری بر زمان بارگذاری و پیوند یک DSO بگذارد، زیرا هنگامی که کتابخانه استفادهٔ گستردهای از الگوها میکند، اندازهٔ جدول صادرات پویا را بهشدت کاهش میدهد.
رفتار این سوئیچ کاملاً با نشانهگذاری مستقیم متدها بهعنوان پنهان (hidden) یکسان نیست، چرا که بر متغیرهای ایستای محلی تابع اثر نمیگذارد و باعث نمیشود کامپایلر استنتاج کند که تابع تنها در یک شئ اشتراکی تعریف شده است.
میتوانید برای لغو اثر این سوئیچ روی یک متد، آن را بهطور صریح با یک وضعیت دیداری نشانهگذاری کنید. برای نمونه، اگر میخواهید اشارهگرها به یک متد درونخطی خاص را مقایسه کنید، میتوانید آن را با دیداری پیشفرض نشانهگذاری نمایید. نشانهگذاری کلاس دربرگیرنده با دیداری صریح اثری ندارد.
متدهای درونخطی که بهطور صریح نمونهسازی شدهاند (explicitly instantiated) تحت تأثیر این گزینه قرار نمیگیرند، چرا که پیوند آنها در غیر این صورت ممکن است از مرز کتابخانهٔ اشتراکی عبور کند.
- -fvisibility-ms-compat
- این پرچم
تلاش
میکند با
استفاده از
تنظیمات
دیداری،
مدل پیوند C++
در GCC را با Microsoft Visual
Studio سازگار
کند.
این پرچم تغییرات زیر را در مدل پیوند GCC اعمال میکند:
- 1.
- دیداری پیشفرض را مانند -fvisibility=hidden روی "hidden" تنظیم میکند.
- 2.
- انواع، اما نه اعضای آنها، بهطور پیشفرض پنهان نیستند.
- 3.
- قاعدهٔ تعریف واحد (One Definition Rule یا ODR) برای انواعی بدون مشخصات دیداری صریح که در بیش از یک شئ اشتراکی تعریف شدهاند، آسانتر میشود: این اعلانها در صورتی مجاز هستند که هنگام عدم استفاده از این گزینه نیز مجاز باشند.
در کدهای جدید بهتر است از -fvisibility=hidden استفاده شود و کلاسهایی که قرار است از بیرون نمایان باشند صادر (export) شوند. متأسفانه این احتمال وجود دارد که کدها، شاید تصادفاً، به رفتار Visual Studio وابسته باشند.
از پیامدهای این تغییرات این است که اعضای دادهای ایستای یکسان از نظر نوع و نام که در اشیاء اشتراکی متفاوتی تعریف شدهاند مجزا خواهند بود، بنابراین تغییر یکی دیگری را تغییر نمیدهد؛ و اینکه اشارهگرها به توابع عضو تعریفشده در اشیاء اشتراکی مختلف ممکن است برابر مقایسه نشوند. هنگامی که این پرچم اعمال شود، تعریف متفاوت انواعِ دارای نام یکسان نقض ODR محسوب میشود.
- -fno-weak
- از پشتیبانی نماد ضعیف (weak symbol) استفاده نمیکند، حتی اگر توسط پیونددهنده ارائه شده باشد. بهطور پیشفرض، G++ در صورت در دسترس بودن از نمادهای ضعیف استفاده میکند. این گزینه صرفاً برای آزمایش وجود دارد و نباید توسط کاربران نهایی استفاده شود؛ چرا که منجر به کدی ضعیفتر شده و هیچ مزیتی ندارد. این گزینه ممکن است در نسخههای بعدی G++ حذف شود.
- -fext-numeric-literals (فقط C++ و Objective-C++)
- پسوندهای لیترال عددی موهومی (imaginary)، ممیز ثابت (fixed-point) یا تعریفشده توسط ماشین را به عنوان افزونههای GNU میپذیرد. وقتی این گزینه خاموش باشد، با این پسوندها مانند پسوندهای لیترال عددی تعریفشده توسط کاربر در C++11 رفتار میشود. این گزینه بهطور پیشفرض برای تمامی گویشهای پیش از C++11 و تمامی گویشهای GNU فعال است: -std=c++98، -std=gnu++98، -std=gnu++11، -std=gnu++14. این گزینه بهطور پیشفرض برای ISO C++11 به بعد (-std=c++11، ...) غیرفعال است.
- -nostdinc++
- در دایرکتوریهای استاندارد مخصوص C++ به دنبال فایلهای سرایند (header files) جستجو نمیکند، اما سایر دایرکتوریهای استاندارد را همچنان جستجو مینماید. (این گزینه هنگام ساخت کتابخانهٔ C++ استفاده میشود.)
- -flang-info-include-translate
- -flang-info-include-translate-not
- -flang-info-include-translate=header
- دربارهٔ رویدادهای ترجمهٔ include اطلاعرسانی میکند. اولی ترجمههای include پذیرفتهشده را ذکر میکند، دومی ترجمههای include ردشده را ثبت میکند. شکل header ترجمههای include مربوط به آن سرایند مشخص را گزارش میدهد. اگر header به شکل "user" یا "<system>" باشد، با استفاده از مسیر include به یک سرایند کاربری یا سیستمی خاص تطبیق داده میشود.
- -flang-info-module-cmi
- -flang-info-module-cmi=module
- دربارهٔ نام مسیرهای واسط ماژول کامپایلشده (CMI) اطلاع میدهد. اولی تمام نام مسیرهای CMI خواندهشده را ثبت میکند. شکل module خواندن CMI یک ماژول مشخص را گزارش میدهد. module میتواند یک ماژول نامگذاریشده یا یک واحد سرایند (header-unit) باشد (مورد اخیر یا با نام مسیری حاوی جداکنندههای دایرکتوری یا با قرارگیری در "<>" یا "" مشخص میشود).
- -stdlib=libstdc++,libc++
- هنگامی که G++ برای پشتیبانی از این گزینه پیکربندی شده باشد، امکان تعیین کتابخانههای زمان اجرای جایگزین C++ را فراهم میکند. دو گزینه موجود است: libstdc++ (زمان اجرای پیشفرض و بومی C++ برای G++) و libc++ که زمان اجرای C++ نصبشده روی برخی سیستمهای عامل است (مثلاً نسخههای Darwin از Darwin11 به بعد). این گزینه G++ را تغییر میدهد تا از سرایندهای کتابخانهٔ مشخصشده استفاده کند و هنگام نیاز به زمان اجرای C++ برای پیوند دادن، بهترتیب "-lstdc++" یا "-lc++" را صادر نماید.
علاوه بر این، این گزینههای هشدار تنها برای برنامههای C++ کاربرد دارند:
- -Wabi-tag (فقط C++ و Objective-C++)
- هنگامی که نوعی با یک برچسب ABI در زمینهای استفاده شود که فاقد آن برچسب ABI است، هشدار میدهد. برای اطلاعات بیشتر دربارهٔ برچسبهای ABI، بخش C++ Attributes را ببینید.
- -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 درباره استفاده از عبارت کاما (comma expression) در داخل یک عبارت اندیسگذاری هشدار میدهد. این شیوه استفاده در C++20 منسوخ شده است و در C++23 حذف خواهد شد. با این حال، عبارت کامایی که در "( )" محصور شده باشد منسوخ نیست. مثال:
void f(int *a, int b, int c) { a[b,c]; // deprecated in C++20, invalid in C++23 a[(b,c)]; // OK }در C++23، قرار دادن عبارتهای جداشده با کاما در داخل کروشه اندیسگذاری زمانی معتبر است که یک عملگر اندیسگذاری سربارگذاریشده (overloaded) یافت شود و از تعداد و انواع درست آرگومانها پشتیبانی کند. کامپایلر 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) روی نوعی
که هیچ
راهنمای
استنتاج (deduction guide)
صریحی برای
آن نوشته
نشده است،
هشدار
میدهد. این
هشدار
مواردی را
مشخص
میکند که
در آنها CTAD
تنها به این
دلیل موفق
شده است که
کامپایلر
راهنماهای
استنتاج
ضمنی را
سنتز کرده
است، که
ممکن است مد
نظر
برنامهنویس
نبوده باشد.
برخی
راهنماهای
شیوهنامه،
CTAD را تنها
روی انواعی
مجاز
میدانند
که صراحتاً
«اعلام
آمادگی» (opt-in)
کرده
باشند؛
یعنی روی
انواعی که
برای
پشتیبانی
از CTAD طراحی
شدهاند.
این هشدار
را میتوان
با الگوی
زیر
فرونشاند:
struct allow_ctad_t; // any name works template <typename T> struct S { S(T) { } }; // Guide with incomplete parameter type will never be considered. S(allow_ctad_t) -> S<void>; - -Wctor-dtor-privacy (تنها C++ و Objective-C++)
- زمانی هشدار میدهد که یک کلاس غیرقابل استفاده به نظر برسد چرا که تمام سازندهها یا مخربهای آن کلاس خصوصی (private) هستند و کلاس فاقد هرگونه تابع یا کلاس دوست (friend) یا توابع عضو ایستا و عمومی (public static) است. همچنین اگر هیچ متد غیرخصوصی وجود نداشته باشد و دستکم یک تابع عضو خصوصی که سازنده یا مخرب نیست موجود باشد، هشدار میدهد.
- -Wdangling-reference (تنها C++ و Objective-C++)
- زمانی که یک
مرجع (reference) به
یک شیء موقت
که طول عمر
آن به پایان
رسیده است
مقید (bound) شود،
هشدار
میدهد.
برای مثال:
int n = 1; const int& r = std::max(n - 1, n + 1); // r is dangling
در مثال بالا، دو شیء موقت ایجاد میشود (یکی برای هر آرگومان) و مرجعی به یکی از آن اشیای موقت بازگردانده میشود. با این حال، هر دو شیء موقت در انتهای عبارت کامل (full expression) نابود میشوند، بنابراین مرجع "r" معلق (dangling) باقی میماند. این هشدار همچنین مراجع معلق را در فهرستهای راهاندازی اعضا (member initializer lists) تشخیص میدهد:
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) است.
این هشدار را میتوان با استفاده از مشخصه (attribute) "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++)
- هشدار
مربوط به
حالتی را
غیرفعال
میکند که
در آن
تبدیلهای
حسابی
معمول روی
عملوندهایی
اعمال
میشود که
یکی از نوع
شمارشی (enumeration) و
دیگری از
نوع شمارشی
متفاوتی
است. این
تبدیل در 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++)
- هشدار
مربوط به
حالتی را
غیرفعال
میکند که
در آن
تبدیلهای
حسابی
معمول روی
عملوندهایی
اعمال
میشود که
یکی از نوع
شمارشی و
دیگری از
نوع ممیز
شناور (floating-point)
است. این
تبدیل در 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 با نوع زیربنایی مشخصشده و بدون فهرست اعضا، در اعلانی غیر از یک اعلان مستقل از enum استفاده شود. بهطور پیشفرض فعال است. این هشدار با -pedantic-errors به یک خطا ارتقا مییابد.
- -Wno-init-list-lifetime (تنها C++ و Objective-C++)
- دربارهٔ استفادههایی از "std::initializer_list" که احتمالاً منجر به اشارهگرهای معلق (dangling pointers) میشوند، هشدار نمیدهد. از آنجا که با آرایهٔ زیربنایی یک "initializer_list" مانند یک شیء موقت معمولی در C++ رفتار میشود، ممکن است اشارهگری به آرایه بهطور ناخواسته پس از پایان طولعمر آن نگه داشته شود. برای مثال:
- اگر تابعی یک "initializer_list" موقت یا یک متغیر محلی "initializer_list" را برگرداند، طولعمر آرایه در انتهای دستور return پایان مییابد، بنابراین مقدار بازگرداندهشده دارای یک اشارهگر معلق خواهد بود.
- اگر یک عبارت new یک "initializer_list" ایجاد کند، آرایه تنها تا پایان عبارت کامل (full-expression) دربرگیرنده زنده میماند، بنابراین "initializer_list" در heap دارای یک اشارهگر معلق خواهد بود.
- هنگامی که
به یک متغیر
"initializer_list"
مقداری از
یک فهرست
مقداردهی
محصور در
آکولاد
انتساب
داده شود،
آرایهٔ
موقت
ایجادشده
برای سمت
راستِ
انتساب
تنها تا
پایان
عبارت کامل
دوام
میآورد،
بنابراین
در دستور
بعدی متغیر
"initializer_list" یک
اشارهگر
معلق دارد.
// li's initial underlying array lives as long as li std::initializer_list<int> li = { 1,2,3 }; // assignment changes li to point to a temporary array li = { 4, 5 }; // now the temporary is gone and li has a dangling pointer int i = li.begin()[0] // undefined behavior - هنگامی که یک سازندهٔ فهرست (list constructor) اشارهگر "begin" را از آرگومان "initializer_list" ذخیره میکند، این کار طولعمر آرایه را افزایش نمیدهد؛ بنابراین اگر یک متغیر کلاس از روی یک "initializer_list" موقت ساخته شود، اشارهگر در انتهای عبارتِ اعلان متغیر معلق میماند.
- -Winvalid-constexpr
- هنگامی که
یک تابع
هرگز یک
عبارت ثابت
(constant expression) تولید
نمیکند،
هشدار
میدهد. در C++20
و پیش از
آن، برای هر
تابع و قالب
تابعِ
"constexpr"،
باید حداقل
یک مجموعه
از
آرگومانهای
تابع در
دستکم یک
نمونهسازی
(instantiation) وجود
داشته باشد
بهگونهای
که
فراخوانی
تابع یا
سازنده
بتواند یک
زیرعبارتِ
ارزیابیشده
از یک عبارت
ثابت هسته (core
constant expression) باشد. C++23
این
محدودیت را
حذف کرد،
بنابراین
ممکن است
تابع یا
قالب تابعی
با "constexpr"
وجود داشته
باشد که هیچ
فراخوانی
از آن شرایط
لازم برای
یک core constant expression را
برآورده
نکند.
این هشدار بهطور پیشفرض در C++20 و پیش از آن به عنوان یک هشدار دقیق (pedantic) فعال است. در C++23، میتوان -Winvalid-constexpr را فعال کرد که در آن حالت یک هشدار معمولی خواهد بود. برای مثال:
void f (int& i); constexpr void g (int& i) { // Warns by default in C++20, in C++23 only with -Winvalid-constexpr. f(i); } - -Winvalid-imported-macros
- معتبر بودن تمام تعاریف ماکروهای واردشده (imported) را در پایان کامپایل بررسی میکند. این گزینه بهطور پیشفرض فعال نیست، چرا که تعیین آن نیازمند پردازش اضافه است. این گزینه ممکن است هنگام آمادهسازی مجموعههایی از 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" یک
شیء از نوع
کلاس باشد و
نوشتن در
چنین شیئی
ممکن است
سازندهٔ
غیربدیهی
(non-trivial) یا
حذفشده (deleted)
یا انتساب
کپی کلاس را
دور بزند،
صحت const یا
کپسولهسازی
را نقض کند،
یا
اشارهگرهای
جدول مجازی
(vtable) را خراب
کند، هشدار
میدهد.
تغییر دادن
نمایش
حافظهای
چنین
اشیائی
ممکن است
ناورداهایی
(invariants) را که
توسط توابع
عضو کلاس
حفظ
میشوند،
نقض کند.
برای مثال،
فراخوانی
"memset" در
زیر
تعریفنشده
است زیرا یک
شیء کلاس
غیربدیهی
را تغییر
میدهد و
بنابراین
گزارش
میشود. روش
امن برای
مقداردهی
اولیه یا
پاککردن
حافظهٔ
اشیائی از
این نوع،
استفاده از
سازنده یا
عملگر
انتساب
مناسب در
صورت وجود
است.
std::string str = "abc"; memset (&str, 0, sizeof str);
گزینهٔ -Wclass-memaccess با -Wall فعال میشود. تبدیل صریح (cast) اشارهگر شیء کلاس به "void *" یا به نوعی که بتواند بهطور ایمن توسط تابع حافظهٔ خام مورد دسترسی قرار گیرد، این هشدار را متوقف میکند..IP "-Wnon-virtual-dtor (تنها C++ و Objective-C++)" 4 هنگامی که یک کلاس دارای توابع مجازی و یک مخرب غیرمجازی در دسترس در خود یا در یک کلاس پایهٔ چندریختی در دسترس باشد هشدار میدهد، که در این حالت حذف یک نمونه از کلاس مشتقشده از طریق اشارهگری به خود کلاس یا کلاس پایه ممکن اما ناامن است. اگر -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++)
- هنگامی که
ترتیب
مقداردهندههای
اعضا در کد
با ترتیبی
که باید
اجرا شوند
مطابقت
ندارد،
هشدار
میدهد.
برای نمونه:
struct A { int i; int j; A(): j (0), i (1) { } };کامپایلر مقداردهندههای اعضا را برای "i" و "j" بهگونهای بازآرایی میکند تا با ترتیب اعلان اعضا مطابقت داشته باشد، و هشداری مبنی بر این موضوع صادر میکند. این هشدار توسط -Wall فعال میشود.
- -Wno-pessimizing-move (تنها C++ و Objective-C++)
- این هشدار
زمانی
اعلام
میشود که
فراخوانی
"std::move"
مانع از حذف
کپی (copy elision) شود.
یک سناریوی
متداول
برای رخداد
حذف کپی،
بازگشت از
تابعی با
نوع
بازگشتی
کلاس است،
به شرطی که
عبارت
بازگرداندهشده
نام یک شیء
خودکار
غیر-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
مبتنی بر
بازه در C++ یک
کپی
غیرضروری
ایجاد کند.
این وضعیت
زمانی رخ
میدهد که
اعلان بازه
یک مرجع
نباشد، در
حالی که
احتمالاً
باید باشد.
برای نمونه:
struct S { char arr[128]; }; void fn () { S arr[5]; for (const auto x : arr) { ... } }زمانی که نوع کپیشده یک نوع به صورت ناچیز قابل کپی (trivially-copyable) باشد که اندازهٔ آن کمتر از ۶۴ بایت است، هشدار نمیدهد.
این هشدار همچنین زمانی اخطار میدهد که متغیر حلقه در یک حلقهٔ for مبتنی بر بازه، با مقداری از یک نوع متفاوت مقداردهی اولیه شود که منجر به کپی شدن گردد. برای نمونه:
void fn() { int arr[10]; for (const double &x : arr) { ... } }در مثال بالا، در هر تکرار حلقه یک مقدار موقت از نوع "double" ایجاد و نابود میشود، که مرجع "const double &" به آن متصل میگردد.
این هشدار توسط -Wall فعال میشود.
- -Wredundant-tags (تنها C++ و Objective-C++)
- دربارهٔ class-key
و enum-key زائد در
ارجاع به
انواع کلاس
و انواع
شمارشی در
زمینههایی
که میتوان
کلید را
بدون ایجاد
ابهام حذف
کرد، هشدار
میدهد.
برای نمونه:
struct foo; struct foo *p; // warn that keyword struct can be eliminated
از سوی دیگر، در این مثال هیچ هشداری صادر نمیشود:
struct foo; void foo (); // "hides" struct foo void bar (struct foo&); // no warning, keyword struct is necessary
- -Wno-subobject-linkage (تنها C++ و Objective-C++)
- اگر یک نوع کلاس دارای کلاس پایه یا فیلدی باشد که نوع آن از فضای نام ناشناس (anonymous namespace) استفاده میکند یا به نوعی بدون پیوند (linkage) وابسته است، هشدار نده. اگر نوع A به نوع B با پیوند داخلی یا بدون پیوند وابسته باشد، تعریف آن در چندین واحد ترجمه نقض ODR خواهد بود، زیرا معنای B در هر واحد ترجمه متفاوت است. اگر A فقط در یک واحد ترجمه ظاهر شود، بهترین راه برای خاموش کردن هشدار این است که با قرار دادن آن در یک فضای نام ناشناس، به آن نیز پیوند داخلی داده شود. کامپایلر این هشدار را برای انواع تعریفشده در فایل اصلی .C صادر نمیکند، زیرا بعید است که آنها دارای تعاریف چندگانه باشند. -Wsubobject-linkage بهطور پیشفرض فعال است.
- -Weffc++ (تنها C++ و Objective-C++)
- دربارهٔ نقض رهنمودهای شیوهنامهٔ زیر برگرفته از سری کتابهای Effective C++ نوشتهٔ Scott Meyers هشدار میدهد:
- برای کلاسهایی با حافظهٔ تخصیصیافته بهصورت پویا، یک سازندهٔ کپی و یک عملگر انتساب تعریف کنید.
- مقداردهی اولیه را به انتساب در سازندهها ترجیح دهید.
- کاری کنید که "operator=" مرجعی به *this بازگرداند.
- هنگامی که باید یک شیء را بازگردانید، سعی نکنید مرجع بازگردانید.
- بین حالتهای پیشوندی و پسوندی عملگرهای افزایش و کاهش تمایز قائل شوید.
- هرگز "&&"، "||"، یا "," را سربارگذاری نکنید.
این گزینه همچنین -Wnon-virtual-dtor را فعال میکند، که آن هم یکی از توصیههای Effective C++ است. با این حال، بررسی گسترش یافته است تا دربارهٔ عدم وجود مخرب مجازی در کلاسهای پایهٔ غیرچندریختی در دسترس نیز هشدار دهد.
هنگام انتخاب این گزینه، توجه داشته باشید که سرآیندهای کتابخانهٔ استاندارد از همهٔ این رهنمودها پیروی نمیکنند؛ از grep -v برای فیلتر کردن این هشدارها استفاده کنید. غیرفعال کردن هشدار درباره مواردی که یک کنترلکننده استثنا توسط کنترلکننده دیگری سایهاندازی (shadow) میشود، که میتواند نشاندهنده ترتیب نادرست کنترلکنندههای استثنا باشد.
- -Wsfinae-incomplete (فقط C++ و Objective-C++)
- هشدار
درباره
کلاسی که
ناقص تشخیص
داده
میشود، یا
تابعی با
نوع
بازگشتی auto
که هنوز
استنتاج
نشده است،
در
زمینهای
که منجر به
شکست
جایگزینی
(substitution failure) به جای
خطا
میشود، و
سپس کلاس یا
تابع بعداً
در واحد
ترجمه (translation unit)
تعریف
میگردد.
این امر
مشکلساز
است چرا که
نمونهسازیهای
قالب یا
بررسیهای
concept بسته به
اینکه
ابتدا قبل
یا بعد از
تعریف رخ
دهند ممکن
است نتایج
متفاوتی
داشته
باشند.
این هشدار بهطور پیشفرض فعال است. -Wsfinae-incomplete=2 هشداری را در نقطه شکست جایگزینی اضافه میکند تا پیگیری مشکلات نشانگذاریشده توسط حالت پیشفرض آسانتر شود.
- -Wstrict-null-sentinel (فقط C++ و Objective-C++)
- هشدار درباره استفاده از یک "NULL" بدون تبدیل نوع (uncasted) بهعنوان نشانه پایانی (sentinel). هنگام کامپایل صرفاً با GCC، این یک sentinel معتبر است، زیرا "NULL" به "__null" تعریف شده است. اگرچه این مقدار یک ثابت اشارهگر تهی است و نه یک اشارهگر تهی، تضمین میشود که اندازهای برابر با یک اشارهگر داشته باشد. با این حال این استفاده در میان کامپایلرهای مختلف قابلحمل (portable) نیست.
- -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++)
- غیرفعال کردن هشدارها هنگامی که توابع دوست غیرقالبی (non-template friend functions) درون یک قالب اعلان میشوند. در نسخههای بسیار قدیمی GCC که پیش از پیادهسازی استاندارد ISO بودند، اعلانهایی مانند friend int foo(int)، که در آنها نام دوست یک شناسه غیرواجد شرایط (unqualified-id) است، میتوانستند بهعنوان یک تخصیص خاص (specialization) از یک تابع قالب تفسیر شوند؛ این هشدار برای تشخیص مشکلات سازگاری وجود دارد و بهطور پیشفرض فعال است.
- -Wold-style-cast (فقط C++ و Objective-C++)
- هشدار در صورت استفاده از تبدیل نوع قدیمی (سبک C) به یک نوع غیر void در یک برنامه C++. تبدیل نوعهای سبک جدید ("dynamic_cast"، "static_cast"، "reinterpret_cast" و "const_cast") کمتر در معرض اثرات ناخواسته هستند و جستجوی آنها بسیار آسانتر است.
- -Woverloaded-virtual (فقط C++ و Objective-C++)
- -Woverloaded-virtual=n
- هشدار
هنگامی که
یک اعلان
تابع،
توابع
مجازی را از
یک کلاس
پایه پنهان
(hide) میکند.
برای مثال،
در:
struct A { virtual void f(); }; struct B: public A { void f(int); // does not override };نسخه کلاس "A" از "f" در "B" پنهان میشود و کدی مانند:
B* b; b->f();
کامپایل نمیشود.
در مواردی که امضاهای متفاوت تصادفی نیستند، سادهترین راهحل افزودن یک using-declaration به کلاس مشتقشده برای آشکار کردن مجدد تابع پایه است، مانند افزودن "using A::f;" به "B".
پسوند سطح اختیاری رفتار را هنگامی که تمام اعلانها در کلاس مشتقشده توابع مجازی کلاس پایه را بازنویسی (override) میکنند کنترل میکند، حتی اگر تمام توابع پایه بازنویسی نشده باشند:
struct C { virtual void f(); virtual void f(int); }; struct D: public C { void f(int); // does override }این الگو کمتر احتمال دارد یک اشتباه باشد؛ اگر D صرفاً بهصورت مجازی استفاده شود، ممکن است کاربر به این نتیجه رسیده باشد که معناشناسی کلاس پایه برای برخی از بارگذاریهای بیش از حد (overloads) مناسب است.
در سطح ۱، این حالت هشداری صادر نمیکند؛ در سطح ۲ هشدار میدهد. گزینه -Woverloaded-virtual بهتنهایی سطح ۲ را انتخاب میکند. سطح ۱ در -Wall گنجانده شده است.
- -Wno-pmf-conversions (فقط C++ و Objective-C++)
- غیرفعال کردن پیام تشخیصی برای تبدیل یک اشارهگر مقید به تابع عضو (bound pointer to member function) به یک اشارهگر معمولی.
- -Wsign-promo (فقط C++ و Objective-C++)
- هشدار هنگامی که حل بارگذاری بیش از حد (overload resolution) ارتقا از یک نوع بدون علامت یا شمارشی به یک نوع علامتدار را به تبدیل به یک نوع بدون علامت با اندازه یکسان ترجیح میدهد. نسخههای قبلی G++ سعی در حفظ وضعیت بدون علامت داشتند، اما استاندارد رفتار فعلی را الزامی کرده است.
- -Wtemplates (فقط C++ و Objective-C++)
- هشدار هنگام مواجهه با اعلان یک قالب اولیه (primary template). برخی از قوانین کدنویسی استفاده از قالبها را منع میکنند و این گزینه میتواند برای اعمال آن قانون استفاده شود. این هشدار درون فایلهای سرایند سیستمی، مانند STL، غیرفعال است، بنابراین همچنان میتوان از STL استفاده کرد. همچنین میتوان قالبها را نمونهسازی یا تخصیص داد.
- -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-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 یک
ماژول
فرستاده
میشود،
خطا است. با
این حال،
درون
مقداردهندهٔ
اولیهٔ یک
متغیر یا در
بدنهٔ یک
تابع
غیرخطی (non-inline)،
این یک افشا
محسوب
نمیشود و
خطایی صادر
نمیگردد.
این وضعیت میتواند موجب شود الگوهای متغیر یا تابع در صورت ارجاع به چنین موجودیتی به طور تصادفی غیرقابل استفاده شوند، زیرا سایر واحدهای ترجمهای که الگو را وارد (import) میکنند، هرگز قادر به نمونهسازی آن نخواهند بود. این هشدار تلاش میکند مواردی را که این حالت ممکن است رخ دهد شناسایی کند. وجود یک نمونهسازی صریح (explicit instantiation) این هشدار را خاموش میکند.
این پرچم توسط -Wextra فعال میشود.
- -Wno-expose-global-module-tu-local
- افشای یک
موجودیت
محلی واحد
ترجمه از
طریق رابط
ماژول
نامعتبر
است، زیرا
این کار
ممکن است
باعث نقض ODR
شده و به
شکل خطاهای
پیوند یا
رفتارهای
غیرمنتظرهٔ
دیگر بروز
پیدا کند.
با این
وجود،
بسیاری از
کتابخانههای
موجود،
موجودیتهای
TU-local را در
رابط خود
اعلان
میکنند، و
اجتناب از
افشای این
موجودیتها
در برخی
موارد ممکن
است دشوار
باشد.
به عنوان یک افزونه، GCC اجازهٔ افشای متغیرها و توابع درونی اعلانشده در قطعهٔ ماژول سراسری (global module fragment) را میدهد. این هشدار رخ دادن چنین افشای نامعتبری را نشان میدهد و میتواند با استفاده از عملوندهای پیشپردازندهٔ تشخیصی (diagnostic pragmas) در محل افشا، یا در نقطهٔ اعلان اعلانِ درونی خاموش شود. این قاعده در مورد اعلانهای "export using" که چنین موجودیتهایی را نام میبرند نیز اعمال میشود.
در صورت ترکیب با -Wtemplate-names-tu-local، کامپایلر GCC همچنین دربارهٔ ارجاعات غیر از نوع افشا به موجودیتهای TU-local در بدنهٔ الگوها هشدار خواهد داد. چنین الگوهایی همچنان میتوانند در سایر TUها نمونهسازی شوند اما خطرات فوق در رابطه با افشای موجودیتهای محلی واحد ترجمه همچنان برقرار است.
این هشدار به طور پیشفرض فعال است و توسط -pedantic-errors به یک خطا ارتقا مییابد.
- -Wno-external-tu-local
- هنگام نام
بردن از یک
موجودیت TU-local
در خارج از
واحد
ترجمهای
که در آن
اعلان شده
است، هشدار
میدهد.
چنین
اعلانهایی
در طول
جستجوی نام
(name lookup) نادیده
گرفته
خواهند شد.
این حالت
میتواند
هنگام
انجام 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++)
- هنگامی که یک تابع تبدیل (conversion function) یک شیء را به همان نوع، به یک کلاس پایه از آن نوع، یا به void تبدیل میکند، هشدار ندهد؛ چنین تابع تبدیلی هرگز فراخوانی نخواهد شد.
- -Wvolatile (فقط C++ و Objective-C++)
- دربارهٔ
استفادههای
منسوخشده
از
توصیفگر
"volatile"
هشدار
میدهد. این
شامل
عبارتهای
پسوندی و
پیشوندی
"++" و
"--" برای
انواع
دارای
توصیفگر
"volatile"،
استفاده از
انتسابهای
ساده در
مواردی که
عملوند سمت
چپ یک نوع
غیرکلاسیِ
توصیفشده
با "volatile"
است برای
مقدار
آنها،
انتسابهای
مرکب که
عملوند سمت
چپ آنها یک
نوع
غیرکلاسیِ
توصیفشده
با "volatile"
است، نوع
بازگشتی
تابع
توصیفشده
با "volatile"،
نوع
پارامتر
توصیفشده
با "volatile"،
و
اتصالهای
ساختیافته
(structured bindings) از یک
نوع
توصیفشده
با "volatile"
میشود. این
کاربرد در C++20
منسوخ شده
است.
این گزینه به طور پیشفرض با -std=c++20 فعال میشود. پیش از -std=c++20، با مشخص کردن صریح -Wdeprecated فعال میگردد.
- -Waligned-new
- -Waligned-new=[none|global|all]
- دربارهٔ
عبارت new از
نوعی که به
ترازبندی
(alignment)
بزرگتری
نسبت به
alignof(std::max_align_t)
نیاز دارد
اما از یک
تابع تخصیص
بدون
پارامتر
ترازبندی
صریح
استفاده
میکند،
هشدار
میدهد. این
گزینه توسط
-Wall فعال
میشود.
به طور معمول این گزینه تنها دربارهٔ توابع تخصیص سراسری هشدار میدهد، اما -Waligned-new=all دربارهٔ توابع تخصیص عضو کلاس نیز هشدار صادر میکند.
- -Wno-placement-new
- -Wplacement-new=n
- هشدار
درباره
عبارتهای
placement new با رفتار
تعریفنشده
(undefined behavior)، مانند
ساخت یک شیء
در بافری که
از نوع آن
شیء کوچکتر
است. برای
مثال،
عبارت placement new
زیر تشخیص
داده
میشود
زیرا سعی
میکند
آرایهای
از ۶۴ عدد
صحیح را در
بافری
بسازد که
اندازه آن
تنها ۶۴
بایت است.
char buf [64]; new (buf) int[64];
این هشدار بهطور پیشفرض فعال است.
- -Wplacement-new=1
- این سطح
هشدار
پیشفرض
-Wplacement-new است. در
این سطح،
هشدار برای
برخی
ساختارهای
اکیداً
تعریفنشده
که GCC آنها
را به عنوان
افزونههایی
(extensions) برای
سازگاری با
کدهای
قدیمی مجاز
میداند،
صادر
نمیشود.
برای
نمونه،
عبارت
"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 که دریافت را از طریق مرجع (reference) انجام نمیدهند. با -Wcatch-value=1 (یا بهطور خلاصه -Wcatch-value) درباره نوعهای کلاس چندریختی (polymorphic) که به صورت مقداری (by value) دریافت میشوند، هشدار میدهد. با -Wcatch-value=2 درباره تمام نوعهای کلاس که به صورت مقداری دریافت میشوند، هشدار میدهد. با -Wcatch-value=3 درباره تمام نوعهایی که از طریق مرجع دریافت نمیشوند، هشدار میدهد. -Wcatch-value با -Wall فعال میشود.
- -Wconditionally-supported (فقط C++ و Objective-C++)
- هشدار برای ساختارهای مشروطبهپشتیبانی (conditionally-supported طبق C++11 [intro.defs]).
- -Wno-defaulted-function-deleted (فقط C++ و Objective-C++)
- هشدار هنگامی که یک تابع صراحتاً پیشفرضشده (defaulted) توسط کامپایلر حذف (deleted) میشود. این وضعیت زمانی میتواند رخ دهد که نوع اعلانشدهٔ تابع با نوع تابعی که بهطور ضمنی اعلان میشد مطابقت نداشته باشد. این هشدار بهطور پیشفرض فعال است.
- -Wno-delete-incomplete (فقط C++ و Objective-C++)
- عدم صدور هشدار هنگام حذف (delete) یک اشارهگر به نوع ناقص (incomplete type)، که ممکن است در زمان اجرا منجر به رفتار تعریفنشده شود. این هشدار بهطور پیشفرض فعال است.
- -Wextra-semi (فقط C++ و Objective-C++)
- هشدار
درباره
نقطهویرگولهای
اضافه.
زمینههای
گوناگونی
وجود دارد
که یک
نقطهویرگول
اضافه ممکن
است در
آنها رخ
دهد. یکی از
آنها
نقطهویرگول
پس از
تعاریف
توابع
درونکلاسی
(in-class) است که در
تمام
گویشهای C++
معتبر است
(و هرگز یک pedwarn
محسوب
نمیشود):
struct S { void foo () {}; };مورد دیگر نقطهویرگول اضافه در دامنهٔ فضای نام (namespace scope) است که از C++11 به بعد مجاز شده است (بنابراین در C++98 یک pedwarn است):
struct S { }; ;و مورد دیگر نقطهویرگول اضافه در تعاریف کلاس است که از C++11 به بعد مجاز شده است (بنابراین در C++98 یک pedwarn است):
struct S { int a; ; }; - -Wno-global-module (فقط C++ و Objective-C++)
- غیرفعال کردن پیام اخطار برای زمانی که قطعهٔ ماژول سراسری (global module fragment) یک واحد ماژول، فقط از دستورالعملهای پیشپردازنده تشکیل نشده باشد.
- -Wno-inaccessible-base (فقط C++ و Objective-C++)
- این گزینه
هشدارهایی
را کنترل
میکند که
هنگام
غیرقابل
دسترس بودن
یک کلاس
پایه در
کلاس
مشتقشده
از آن به
دلیل ابهام
رخ میدهد.
این هشدار
بهطور
پیشفرض
فعال است.
توجه داشته
باشید که
هشدار برای
کلاسهای
پایه مجازی
مبهم، با
گزینه -Wextra
فعال
میشود.
struct A { int a; }; struct B : A { }; struct C : B, A { }; - -Wno-inherited-variadic-ctor
- نادیده گرفتن هشدارها درباره استفاده از سازندههای ارثبریشدهٔ C++11، هنگامی که کلاس پایه موروثی دارای یک سازنده با آرگومانهای متغیر به سبک C (variadic constructor) باشد؛ این هشدار بهطور پیشفرض فعال است زیرا سهنقطه (...) به ارث برده نمیشود.
- -Wno-invalid-offsetof (فقط C++ و Objective-C++)
- نادیده
گرفتن
هشدارهای
ناشی از
اِعمال
ماکروی
"offsetof" روی
یک نوع غیر POD
(یا non-POD). بر
اساس
استاندارد
ISO C++ سال ۲۰۱۴،
اعمال
"offsetof" روی
نوعی که
چیدمان
غیراستاندارد
(non-standard-layout) دارد
تعریفنشده
است. با این
حال، در
پیادهسازیهای
موجود C++،
معمولاً
"offsetof"
نتایج
معناداری
میدهد. این
پرچم برای
کاربرانی
است که
میدانند
در حال
نوشتن کد
غیرقابلحمل
(nonportable) هستند و
عمداً
تصمیم
گرفتهاند
هشدار
مربوط به آن
را نادیده
بگیرند.
ممکن است محدودیتهای مربوط به "offsetof" در نسخهٔ آیندهٔ استاندارد C++ کاهش یابد.
- -Wsized-deallocation (فقط C++ و Objective-C++)
- هشدار
درباره
تعریف یک
تابع
آزادسازی
حافظه بدون
اندازه (unsized deallocation
function)
void operator delete (void *) noexcept; void operator delete[] (void *) noexcept;
بدون تعریف تابع متناظر آزادسازی با اندازه (sized deallocation function)
void operator delete (void *, std::size_t) noexcept; void operator delete[] (void *, std::size_t) noexcept;
یا برعکس. این هشدار با -Wextra همراه با -fsized-deallocation فعال میشود.
- -Wsuggest-final-types
- هشدار درباره نوعهایی با متدهای مجازی که اگر نوع با مشخصکنندهٔ "final" در C++11 اعلان میشد، یا در صورت امکان در یک فضای نام ناشناس (anonymous namespace) اعلان میشد، کیفیت کد بهبود مییافت. این کار به GCC اجازه میدهد فراخوانیهای چندریختی را با تهاجم بیشتری غیرمجازیسازی (devirtualize) کند. این هشدار همراه با بهینهسازی زمان پیوند (link-time optimization)، جایی که اطلاعات مربوط به گراف سلسلهمراتب کلاسها کاملتر است، اثربخشی بیشتری دارد.
- -Wsuggest-final-methods
- هشدار درباره متدهای مجازی که اگر متد با مشخصکنندهٔ "final" در C++11 اعلان میشد، یا در صورت امکان نوع آن در یک فضای نام ناشناس یا با مشخصکنندهٔ "final" اعلان میشد، کیفیت کد بهبود مییافت. این هشدار همراه با بهینهسازی زمان پیوند (link-time optimization)، جایی که اطلاعات مربوط به گراف سلسلهمراتب کلاسها کاملتر است، اثربخشی بیشتری دارد. توصیه میشود ابتدا پیشنهادهای -Wsuggest-final-types را بررسی کرده و سپس با نشانهگذاریهای جدید برنامه را دوباره بسازید (rebuild).
- -Wsuggest-override
- هشدار درباره بازنویسی (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، نام کلاس پیشفرض "NXConstantString" است و در صورت استفاده از زمان اجرای NeXT، نام آن "NSConstantString" خواهد بود (پایینتر را ببینید). روی پلتفرمهای Darwin / macOS، در صورت وجود گزینهٔ -fconstant-cfstrings، این گزینه بر تنظیمات -fconstant-string-class تقدم مییابد و موجب میشود تا لیترالهای "@"..."" بهصورت رشتههای ثابت CoreFoundation چیده شوند. توجه داشته باشید که -fconstant-cfstrings یک نام مستعار برای گزینهٔ معادل وابسته به مقصدِ -mconstant-cfstrings است.
- -fgnu-runtime
- تولید کد شیء سازگار با زمان اجرای استاندارد GNU Objective-C. این حالت برای بیشتر انواع سیستمها پیشفرض است.
- -fnext-runtime
- تولید خروجی سازگار با زمان اجرای NeXT. این حالت برای سیستمهای مبتنی بر NeXT، از جمله Darwin / macOS، پیشفرض است. ماکروی "__NEXT_RUNTIME__" تنها زمانی از پیش تعریف میشود که از این گزینه استفاده شود.
- -fno-nil-receivers
- فرض میکند که تمام ارسالهای پیام در Objective-C ("[receiver message:arg]") در این واحد ترجمه اطمینان میدهند که گیرنده "nil" نیست. این امر امکان استفاده از نقاط ورود کارآمدتر در زمان اجرا را فراهم میسازد. این گزینه تنها همراه با زمان اجرای NeXT و نسخهٔ 0 یا 1 از ABI در دسترس است.
- -fobjc-abi-version=n
- استفاده از نسخهٔ n از ABI مربوط به Objective-C برای زمان اجرای انتخابشده. این گزینه در حال حاضر تنها برای زمان اجرای NeXT پشتیبانی میشود. در آن حالت، نسخهٔ 0 همان ABI سنتی (۳۲ بیتی) بدون پشتیبانی از مشخصهها (properties) و دیگر امکانات اضافهشده در Objective-C 2.0 است. نسخهٔ 1 همان ABI سنتی (۳۲ بیتی) همراه با پشتیبانی از مشخصهها و دیگر امکانات اضافهشده در Objective-C 2.0 است. نسخهٔ 2 همان ABI مدرن (۶۴ بیتی) است. اگر چیزی تعیین نشود، مقدار پیشفرض روی ماشینهای مقصد ۳۲ بیتی نسخهٔ 0 و روی ماشینهای مقصد ۶۴ بیتی نسخهٔ 2 خواهد بود.
- -fobjc-call-cxx-cdtors
- برای هر
کلاس Objective-C،
بررسی
میکند که
آیا متغیر
نمونهای
از آن، یک
شیء C++ با یک
سازندهٔ
پیشفرض
غیربدیهی
(non-trivial) است یا
خیر. در این
صورت، یک
متد نمونهٔ
ویژهٔ "- (id)
.cxx_construct" تولید
میکند که
سازندههای
پیشفرض
غیربدیهی
را به ترتیب
روی تمامی
اینگونه
متغیرهای
نمونه اجرا
کرده و سپس
"self" را
برمیگرداند.
بهطور
مشابه،
بررسی
میکند که
آیا متغیر
نمونهای
شیء C++ با یک
ویرانگر (destructor)
غیربدیهی
است یا خیر،
و اگر چنین
باشد، متد
ویژهٔ "- (void)
.cxx_destruct" را
تولید
میکند که
تمامی چنین
ویرانگرهای
پیشفرضی
را به ترتیب
معکوس اجرا
مینماید.
متدهای "- (id) .cxx_construct" و "- (void) .cxx_destruct" که بدینگونه تولید شدهاند، تنها روی متغیرهای نمونهای عمل میکنند که در کلاس فعلی Objective-C اعلان شدهاند و نه متغیرهایی که از ابرکلاسها به ارث رسیدهاند. فراخوانی همهٔ چنین متدهایی در سلسلهمراتب وراثت یک شیء بر عهدهٔ زمان اجرای Objective-C است. متدهای "- (id) .cxx_construct" بلافاصله پس از تخصیص نمونهٔ شیء جدید توسط زمان اجرا فراخوانی میشوند؛ متدهای "- (void) .cxx_destruct" بلافاصله پیش از آنکه زمان اجرا نمونهٔ شیء را آزاد سازد، فراخوانی میگردند.
تا زمان نگارش این راهنما، تنها زمان اجرای NeXT در Mac OS X 10.4 و جدیدتر از فراخوانی متدهای "- (id) .cxx_construct" و "- (void) .cxx_destruct" پشتیبانی میکند.
- -fobjc-direct-dispatch
- امکان پرشهای سریع به توزیعکنندهٔ پیام (message dispatcher) را فراهم میکند. در Darwin این کار از طریق comm page انجام میشود.
- -fobjc-exceptions
- پشتیبانی نحوی برای مدیریت ساختاریافتهٔ استثناها در Objective-C را، مشابه آنچه توسط C++ ارائه میشود، فعال میکند. این گزینه برای استفاده از کلیدواژههای Objective-C شامل @try، @throw، @catch، @finally و @synchronized الزامی است. این گزینه با هر دو زمان اجرای GNU و NeXT در دسترس است (اما در Mac OS X 10.2 و قدیمیتر همراه با زمان اجرای NeXT در دسترس نیست).
- -fobjc-gc
- فعالسازی بازیافت حافظه (garbage collection یا GC) در برنامههای Objective-C و Objective-C++. این گزینه تنها با زمان اجرای NeXT در دسترس است؛ زمان اجرای GNU پیادهسازی متفاوتی از بازیافت حافظه دارد که به پرچمهای خاص کامپایلر نیازی ندارد.
- -fobjc-nilcheck
- برای زمان اجرای NeXT با نسخهٔ 2 از ABI، گیرندهٔ nil را در فراخوانیهای متد پیش از انجام فراخوانی واقعی متد بررسی میکند. این رفتار پیشفرض است و میتوان آن را با استفاده از -fno-objc-nilcheck غیرفعال کرد. متدهای کلاس و فراخوانیهای super صرف نظر از اینکه این پرچم روی چه مقداری تنظیم شده باشد، هرگز برای nil بررسی نمیشوند. در حال حاضر زمانی که از زمان اجرای GNU یا نسخهٔ قدیمیتر ABI زمان اجرای NeXT استفاده شود، این پرچم اثری ندارد.
- -fobjc-std=objc1
- پیروی از نحو زبان Objective-C 1.0، زبانی که توسط GCC 4.0 شناسایی میشود. این مورد تنها بر امکانات افزودهشدهٔ Objective-C به زبان C/C++ تأثیر میگذارد؛ این گزینه بر پیروی از استانداردهای C/C++ تأثیری ندارد، که آن مورد با پرچمهای مجزای گزینههای گویش C/C++ واپایش میشود. هنگامی که از این گزینه همراه با کامپایلر Objective-C یا Objective-C++ استفاده شود، هرگونه نحو Objective-C که برای GCC 4.0 شناختهشده نباشد رد میشود. این گزینه زمانی مفید است که بخواهید اطمینان حاصل کنید کد Objective-C شما میتواند با نسخههای قدیمیتر GCC کامپایل شود.
- -freplace-objc-classes
- تولید یک نشانگر ویژه که به ld(1) دستور میدهد فایل شیء حاصل را بهصورت ایستا پیوند نزند، و در عوض به dyld(1) اجازه دهد که آن را در زمان اجرا بارگذاری کند. این گزینه همراه با حالت اشکالزدایی Fix-and-Continue به کار میرود، جایی که فایل شیء مورد نظر ممکن است در طول اجرای برنامه بازکامپایل شده و بهصورت پویا بازبارگذاری شود، بدون آنکه نیازی به راهاندازی مجدد خود برنامه باشد. در حال حاضر، قابلیت Fix-and-Continue تنها همراه با زمان اجرای NeXT در Mac OS X 10.3 و جدیدتر در دسترس است.
- -fzero-link
- هنگام کامپایل برای زمان اجرای NeXT، کامپایلر بهطور معمول فراخوانیهای objc_getClass("...") را (هنگامی که نام کلاس در زمان کامپایل معلوم باشد) با ارجاعهای ایستای کلاسی که در زمان بارگذاری مقداردهی اولیه میشوند جایگزین میکند، که این امر کارایی زمان اجرا را بهبود میبخشد. مشخص کردن پرچم -fzero-link این رفتار را لغو کرده و موجب میشود فراخوانیهای objc_getClass("...") حفظ شوند. این گزینه در حالت اشکالزدایی Zero-Link مفید است، زیرا اجازه میدهد پیادهسازیهای منفرد کلاس در حین اجرای برنامه تغییر داده شوند. زمان اجرای GNU در حال حاضر بدون در نظر گرفتن گزینههای خط فرمان، همواره فراخوانیهای objc_get_class("...") را حفظ میکند.
- -fno-local-ivars
- بهطور پیشفرض در Objective-C میتوان به متغیرهای نمونه از درون متدهای کلاسی که در آن اعلان شدهاند دسترسی داشت، درست گویی که آنها متغیرهای محلی هستند. این امر میتواند منجر به سایهاندازی (shadowing) میان متغیرهای نمونه و سایر متغیرهایی شود که با همان نام یا بهصورت محلی درون یک متد کلاس یا بهصورت سراسری اعلان شدهاند. مشخص کردن پرچم -fno-local-ivars این رفتار را غیرفعال کرده و بدینترتیب از مشکلات سایهاندازی متغیرها جلوگیری میکند.
- -fivar-visibility=[public|protected|private|package]
- میزان دیدِ پیشفرض متغیر نمونه را روی گزینهٔ مشخصشده تنظیم میکند، تا متغیرهای نمونهای که خارج از دامنهٔ هرگونه دستورالعمل اصلاحکنندهٔ دسترسی اعلان شدهاند، بهطور پیشفرض دیدِ تعیینشده را داشته باشند.
- -gen-decls
- تخلیهٔ (dump) اعلانهای رابط (interface declarations) برای همهٔ کلاسهای مشاهدهشده در فایل منبع، در فایلی به نام sourcename.decl.
- -Wassign-intercept (تنها Objective-C و Objective-C++)
- هشدار در هر زمانی که یک انتساب در Objective-C توسط بازیافتکنندهٔ حافظه (garbage collector) رهگیری شود.
- -Wno-property-assign-default (تنها Objective-C و Objective-C++)
- اگر برای مشخصهٔ (property) یک شیء Objective-C هیچ معناشناسی انتسابی (assign semantics) مشخص نشده باشد، هشداری داده نشود.
- -Wno-protocol (تنها Objective-C و Objective-C++)
- اگر کلاسی اعلان کند که یک پروتکل را پیادهسازی میکند، برای هر متدی در پروتکل که توسط کلاس پیادهسازی نشده باشد، یک هشدار صادر میشود. رفتار پیشفرض این است که برای هر متدی که بهطور صریح در کلاس پیادهسازی نشده هشدار صادر شود، حتی اگر پیادهسازی متد از ابرکلاس به ارث رسیده باشد. اگر از گزینهٔ -Wno-protocol استفاده کنید، متدهای به ارث رسیده از ابرکلاس، پیادهسازیشده تلقی میشوند و هشداری برای آنها صادر نخواهد شد..IP "-Wobjc-root-class (تنها Objective-C و Objective-C++)" 4 چنانچه یک رابط کلاس (class interface) فاقد ابرکلاس باشد، هشدار میدهد. به عنوان مثال، بیشتر کلاسها از "NSObject" (یا "Object") ارثبری میکنند. هنگام اعلان کلاسهایی که قرار است کلاس ریشه باشند، میتوان با نشانهگذاری رابط آنها توسط "__attribute__((objc_root_class))" از این هشدار صرفنظر کرد.
- -Wselector (تنها Objective-C و Objective-C++)
- اگر در حین کامپایل، چند متد با انواع مختلف برای یک انتخابگر (selector) یکسان یافت شود، هشدار میدهد. این بررسی بر روی فهرست متدها در مرحله نهایی کامپایل انجام میشود. علاوه بر این، بررسی جداگانهای برای هر انتخابگری که در یک عبارت @selector(...) ظاهر شده و متد متناظر با آن در طول کامپایل یافت شده باشد، انجام میگیرد. از آنجا که این بررسیها جدول متدها را تنها در پایان کامپایل پیمایش میکنند، چنانچه مرحله نهایی کامپایل حاصل نشود (مثلاً به دلیل بروز خطا هنگام کامپایل یا استفاده از گزینه -fsyntax-only)، این هشدارها تولید نمیشوند.
- -Wstrict-selector-match (تنها Objective-C و Objective-C++)
- هنگام تلاش برای ارسال پیام با استفاده از یک انتخابگر به گیرندهای از نوع "id" یا "Class"، چنانچه چندین متد با انواع آرگومان و/یا انواع بازگشتی متفاوت برای آن انتخابگر یافت شود، هشدار میدهد. هنگامی که این پرچم غیرفعال است (که رفتار پیشفرض میباشد)، کامپایلر در صورتی که تفاوتهای یافتشده محدود به انواعی باشد که اندازه و تراز (alignment) یکسانی دارند، از این هشدارها چشمپوشی میکند.
- -Wundeclared-selector (تنها Objective-C و Objective-C++)
- اگر یک عبارت @selector(...) که به یک انتخابگر اعلاننشده اشاره دارد یافت شود، هشدار میدهد. یک انتخابگر زمانی اعلاننشده تلقی میشود که هیچ متدی با آن نام پیش از عبارت @selector(...)، چه به صراحت در یک اعلان @interface یا @protocol، یا به طور ضمنی در یک بخش @implementation اعلان نشده باشد. این گزینه همواره بررسیهای خود را به محض یافتن عبارت @selector(...) انجام میدهد، در حالی که -Wselector این بررسیها را تنها در مرحله نهایی کامپایل به انجام میرساند. این کار همچنین این شیوه نگارش کد را اعمال میکند که متدها و انتخابگرها باید حتماً پیش از استفاده اعلان شوند.
- -print-objc-runtime-info
- یک هدر C تولید میکند که بزرگترین ساختار پاسدادهشده با مقدار (by value) را، در صورت وجود، توصیف مینماید.
گزینههای مهار OpenMP و OpenACC (Options Controlling OpenMP and OpenACC)
کامپایلر GCC با گزینه -fopenmp از افزونههای OpenMP برای زبانهای C، C++ و Fortran پشتیبانی میکند. به طور مشابه، افزونههای OpenACC در هر سه زبان با گزینه -fopenacc پشتیبانی میشوند.
- -foffload=disable
- -foffload=default
- -foffload=target-list
- مشخص
میکند که
برای کدام
مقصدهای
برونسپاری
(offload targets) در OpenMP و OpenACC
باید کد
تولید شود.
رفتار
پیشفرض،
معادل -foffload=default،
تولید کد
برای تمامی
مقصدهای
برونسپاری
پشتیبانیشده
است. حالت
-foffload=disable کد را
تنها برای
میزبان
پشتیبان (host fallback)
تولید
میکند، در
حالی که
-foffload=target-list کد را
فقط برای
فهرست
مشخصشدهای
از مقصدهای
برونسپاری
که با کاما
جدا
شدهاند،
تولید
مینماید.
مقصدهای برونسپاری در قالب سهتایی هدف (target-triplet) درونی GCC مشخص میشوند. میتوانید کامپایلر را با گزینه -v اجرا کنید تا فهرست مقصدهای برونسپاری پیکربندیشده را ذیل "OFFLOAD_TARGET_NAMES" مشاهده نمایید.
- -foffload-options=options
- -foffload-options=target-triplet-list=options
- با استفاده
از -foffload-options=options،
کامپایلر GCC
گزینههای
(options)
مشخصشده
را به
کامپایلرهای
تمامی
مقصدهای
برونسپاریِ
فعال منتقل
میکند.
میتوانید
با ساختار
-foffload-options=target-list=options
گزینههایی
را مشخص
کنید که
تنها بر روی
یک یا چند
مقصد معین
اعمال شوند.
target-list فهرستی
جداشده با
کاما در
همان قالب
گزینه -foffload=
است.
خطوط فرمان متداول عبارتند از:
-foffload-options='-fno-math-errno -ffinite-math-only' \ -foffload-options=nvptx-none=-latomic -foffload-options=amdgcn-amdhsa=-march=gfx906 - -fopenacc
- پردازش راهنماهای (directives) دستورالعملهای OpenACC شامل #pragma acc در C/C++ و !$acc در فرترن با فرم آزاد (free-form) و !$acc، c$acc و *$acc در فرترن با فرم ثابت (fixed-form) را فعال میکند. این گزینه مستلزم -pthread است، بنابراین تنها روی مقصدهایی پشتیبانی میشود که از -pthread پشتیبانی میکنند.
- -fopenacc-dim=geom
- ابعاد محاسباتی پیشفرض را برای نواحی موازی برونسپاریشدهای که صریحاً آنها را تعیین نکردهاند، مشخص میکند. مقدار geom یک سهتایی از اندازههای جداشده با : به ترتیب برای gang، worker و vector است. برای استفاده از مقدار پیشفرض مختص به یک مقصد، میتوان یک اندازه را حذف کرد.
- -fopenmp
- پردازش
راهنماهای
OpenMP شامل #pragma omp،
[[omp::decl(...)]]، [[omp::directive(...)]] و
[[omp::sequence(...)]] را در C/C++
فعال
میکند. در
Fortran، راهنمای
!$omp و نشانگر
کامپایل
شرطی (sentinel) !$ را
فعال
میسازد. در
فرترن با
فرم منبع
ثابت،
نشانگرها
همچنین
میتوانند
با 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 فعال میسازد. در فرترن با فرم منبع ثابت، نشانگرها میتوانند با c یا * نیز آغاز شوند. سایر راهنماهای OpenMP نادیده گرفته میشوند. مگر اینکه -fopenmp نیز به طور جداگانه مشخص شده باشد، ناحیه "loop" مستقل از بند (clause) تعیینشده "bind"، به ناحیه وظیفه جاری متصل (bind) میشود.
- -fopenmp-target-simd-clone
- -fopenmp-target-simd-clone=device-type
- علاوه بر
تولید
نسخههای
همسان (clones) SIMD
برای
توابعی که
با راهنمای
"declare simd"
نشانهگذاری
شدهاند،
هنگام فعال
بودن این
گزینه،
کامپایلر GCC
همچنین
نسخههای
همسانی را
برای توابع
نشانهگذاریشده
با راهنمای
OpenMP به نام
"declare target" که
برای
برداریسازی
(vectorization) مناسب
هستند
تولید
میکند. device-type
میتواند
یکی از
مقادیر
"none"،
"host"،
"nohost" و
"any" باشد
که با کلمات
کلیدی بند
"device_type" در
راهنمای
"declare target"
مطابقت
دارند؛
نسخههای
همسان برای
اشتراک
دستگاههای
مشخصشده
تولید
میگردند.
-fopenmp-target-simd-clone معادل
-fopenmp-target-simd-clone=any و
-fno-openmp-target-simd-clone
معادل
-fopenmp-target-simd-clone=none است.
در سطح بهینهسازی -O2 و بالاتر (به جز -Os یا -Og)، این بهینهسازی به طور پیشفرض بر روی -fopenmp-target-simd-clone=nohost تنظیم میشود؛ در غیر این صورت به طور پیشفرض غیرفعال است..SS "گزینههای کنترل قالببندی پیامهای عیبیابی" بهطور سنتی، پیامهای عیبیابی بدون در نظر گرفتن ویژگیهای دستگاه خروجی (مانند عرض آن و غیره) قالببندی میشدند. میتوانید از گزینههای شرحدادهشده در زیر برای کنترل الگوریتم قالببندی پیامهای عیبیابی استفاده کنید؛ برای نمونه، تعداد نویسهها در هر خط، یا اینکه اطلاعات مکان در کد منبع هر چند وقت یکبار باید گزارش شوند. توجه داشته باشید که ممکن است برخی پیشرانههای (front end) زبانها این گزینهها را رعایت نکنند.
- -fmessage-length=n
- تلاش
میکند
پیامهای
خطا را طوری
قالببندی
کند که در
خطوطی با
حدود n
نویسه جای
گیرند. اگر
n صفر باشد،
هیچ شکست
خطی (line-wrapping)
انجام
نمیشود؛
هر پیام خطا
در یک خط
تکی نمایش
مییابد.
این رفتار
پیشفرض
برای همهٔ
پیشرانهها
است.
نکته - این گزینه بر نمایش دستورالعملهای پیشپردازندهٔ #error و #warning، و ویژگی (attribute) deprecated برای توابع/نوعها/متغیرها نیز اثر میگذارد. با این حال، بر عملگرهای عملیافتهٔ pragma GCC warning و pragma GCC error تأثیری ندارد.
- -fdiagnostics-plain-output
- این گزینه درخواست میکند که خروجی عیبیابی تا حد امکان ساده و ابتدایی باشد، که ممکن است هنگام اجرای dejagnu یا ابزارهای دیگری که نیاز به تجزیهٔ خروجی عیبیابی دارند و ترجیح میدهند این خروجی در گذر زمان پایدارتر بماند، مفید واقع شود. -fdiagnostics-plain-output در حال حاضر معادل گزینههای زیر است: -fno-diagnostics-show-caret -fno-diagnostics-show-line-numbers -fdiagnostics-color=never -fdiagnostics-urls=never -fdiagnostics-path-format=separate-events -fdiagnostics-text-art-charset=none -fno-diagnostics-show-event-links -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 برای رنگآمیزی مسیرهای رویدادهای جریان کنترل آنطور که توسط -fdiagnostics-path-format= چاپ میشوند؛ مانند شناسهٔ رویدادهای منفرد و خطوط نشاندهندهٔ فراخوانیها و بازگشتهای میانروالها (interprocedural).
- "range1="
- زیررشتهٔ SGR برای نخستین محدودهٔ اضافی.
- "range2="
- زیررشتهٔ SGR برای دومین محدودهٔ اضافی.
- "locus="
- زیررشتهٔ SGR برای اطلاعات مکان، مانند file:line یا file:line:column و غیره.
- "quote="
- زیررشتهٔ SGR برای اطلاعات چاپشده در میان علامتهای نقلقول.
- "fnname="
- زیررشتهٔ SGR برای نامهای توابع ++C.
- "targs="
- زیررشتهٔ SGR برای مقیدسازیهای پارامتر قالب تابع ++C.
- "fixit-insert="
- زیررشتهٔ SGR برای راهنماییهای تصحیح (fix-it) که متنی را برای درج یا جایگزینی پیشنهاد میدهند.
- "fixit-delete="
- زیررشتهٔ SGR برای راهنماییهای تصحیح (fix-it) که متنی را برای حذف پیشنهاد میدهند.
- "diff-filename="
- زیررشتهٔ SGR برای سرآیند نام فایلها درون وصلههای (patch) تولیدشده.
- "diff-hunk="
- زیررشتهٔ SGR برای ابتدای قطعهها (hunk) درون وصلههای تولیدشده.
- "diff-delete="
- زیررشتهٔ SGR برای خطوط حذفشده درون وصلههای تولیدشده.
- "diff-insert="
- زیررشتهٔ SGR برای خطوط درجشده درون وصلههای تولیدشده.
- "type-diff="
- زیررشتهٔ SGR برای برجستهسازی نوعهای ناهمخوان درون آرگومانهای قالب در پیشرانهٔ ++C.
- "valid="
- زیررشتهٔ SGR برای برجستهسازی عناصر معتبر درون نمودارهای هنر متنی (text art).
- "invalid="
- زیررشتهٔ SGR برای برجستهسازی عناصر نامعتبر درون نمودارهای هنر متنی (text art).
- "highlight-a="
- "highlight-b="
- زیررشتههای SGR برای ایجاد تضاد دیداری میان دو چیز متفاوت در پیامهای تشخیصی، مانند یک جفت نوع دادهای ناهمخوان. ببینید: -fdiagnostics-show-highlight-colors.
- -fdiagnostics-urls[=WHEN]
- از
توالیهای
فرار برای
جاسازی
پیوندها
(URLها) در
پیامهای
تشخیصی
استفاده
میکند.
برای مثال،
هنگامی که
-fdiagnostics-show-option متنی
را شامل
گزینهٔ خط
فرمانی که
آن پیام
تشخیصی را
کنترل
میکند
نمایش
میدهد، یک
URL برای
مستندات آن
گزینه
جاسازی
میکند.
مقدار WHEN میتواند never، always یا auto باشد. مقدار auto باعث میشود GCC توالیهای فرار URL را تنها زمانی به کار ببرد که خطای استاندارد یک ترمینال باشد، و کامپایلر در پوستهٔ emacs یا هر ترمینال گرافیکی دیگری که ناسازگاری آن با این قابلیت شناختهشده است اجرا نشود؛ به زیر نگاه کنید.
مقدار پیشفرض به نحوهٔ پیکربندی کامپایلر بستگی دارد. این مقدار میتواند هر یک از گزینههای WHEN بالا باشد.
همچنین GCC میتواند (از طریق گزینهٔ زمان پیکربندی --with-diagnostics-urls=auto-if-env) به گونهای پیکربندی شود که مقدار پیشفرض آن تحت تأثیر متغیرهای محیطی قرار گیرد. تحت چنین پیکربندی، در صورتی که هر یک از متغیرهای محیطی GCC_URLS یا TERM_URLS در محیط کامپایلر موجود و غیرخالی باشند، پیشفرض GCC به auto تغییر میکند، یا اگر هیچکدام موجود نباشند پیشفرض never خواهد بود.
با این حال، حتی با تعیین -fdiagnostics-urls=always نیز این رفتار وابسته به متغیرهای محیطی مذکور است: اگر GCC_URLS روی مقدار خالی یا no تنظیم شده باشد، هیچ پیوندی در پیامهای تشخیصی جاسازی نمیشود. اگر روی st تنظیم شده باشد، پیوندها از توالیهای فرار ST استفاده میکنند. اگر روی bel (پیشفرض) تنظیم شده باشد، پیوندها از توالیهای فرار 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 را کنترل میکند. مقدار پیشفرض آن ۶ است.
- -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) در
قالبی قابل
تجزیه با
ماشین،
مناسب برای
استفاده
توسط
محیطهای
توسعه
یکپارچه (IDE).
برای هر
تصحیح، یک
سطر پس از
پیام
تشخیصی
مربوطه چاپ
خواهد شد که
با رشتهی
«fix-it:» آغاز
میشود.
برای مثال:
fix-it:"test.c":{45:3-45:21}:"gtk_widget_show_all"موقعیت به صورت یک بازه نیمهباز، بیانشده به تعداد بایتها و با شروع از بایت ۱ برای ستون نخست نشان داده میشود. در مثال بالا، بایتهای ۳ تا ۲۰ از سطر ۴۵ فایل «test.c» باید با رشته دادهشده جایگزین شوند:
00000000011111111112222222222 12345678901234567890123456789 gtk_widget_showall (dlg); ^^^^^^^^^^^^^^^^^^ gtk_widget_show_all
نام فایل و رشته جایگزین، نویسه بکاسلش را به صورت «\\»، تب را به صورت «\t»، خط جدید را به صورت «\n»، نقلقول دوتایی را به صورت «\"» و نویسههای غیرقابل چاپ را به صورت هشتهشتی (مانند تب عمودی به صورت «\013») گریز (escape) میدهند.
یک رشته جایگزین خالی نشان میدهد که بازه دادهشده باید حذف شود. یک بازه خالی (مانند «45:3-45:3») نشان میدهد که رشته باید در موقعیت دادهشده درج گردد.
- -fdiagnostics-generate-patch
- چاپ
راهنماهای
تصحیح در stderr
با قالب
یکپارچه
تفاوت (unified diff)،
پس از چاپ
هر پیام
تشخیصی.
برای مثال:
--- test.c +++ test.c @ -42,5 +42,5 @ void show_cb(GtkDialog *dlg) { - gtk_widget_showall(dlg); + gtk_widget_show_all(dlg); }خروجی diff ممکن است طبق همان قواعد پیامهای تشخیصی رنگی شود یا نشود (نگاه کنید به -fdiagnostics-color).
- -fdiagnostics-show-template-tree
- در
فرانتاند
C++، هنگام
چاپ
پیامهای
تشخیصی که
عدم تطابق
انواع الگو
(template types) را نشان
میدهند،
مانند:
could not convert 'std::map<int, std::vector<double> >()' from 'map<[...],vector<double>>' to 'map<[...],vector<float>>
پرچم -fdiagnostics-show-template-tree چاپ یک ساختار درختمانند را فعال میکند که بخشهای مشترک و متفاوت انواع را نشان میدهد، مانند:
map< [...], vector< [double != float]>>بخشهایی که متفاوت هستند با رنگ برجسته میشوند (در این مورد «double» و «float»).
- -fno-elide-type
- بهطور
پیشفرض،
هنگامی که
فرانتاند
C++ پیامهای
تشخیصی
مربوط به
عدم تطابق
انواع الگو
را چاپ
میکند،
بخشهای
مشترک
انواع به
صورت «[...]»
چاپ
میشوند تا
پیام خطا
سادهتر
شود. برای
مثال:
could not convert 'std::map<int, std::vector<double> >()' from 'map<[...],vector<double>>' to 'map<[...],vector<float>>
مشخص کردن پرچم -fno-elide-type مانع از این رفتار میشود. این پرچم همچنین بر خروجی پرچم -fdiagnostics-show-template-tree تأثیر میگذارد.
- -fdiagnostics-path-format=KIND
- تعیین نحوه
چاپ
مسیرهای
رخدادهای
جریان
کنترل (control-flow 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) این گزینه هنگام چاپ مسیرهای جریان کنترل (control-flow) مرتبط با یک پیام تشخیصی، اطلاعات بیشتری ارائه میدهد. اگر این گزینه مشخص شود، عمق پشته برای هر توالی از رخدادها در -fdiagnostics-path-format=inline-events چاپ خواهد شد. اگر همراه با -fdiagnostics-path-format=separate-events مشخص شود، عمق پشته و اعلان تابع هنگام چاپ هر رخداد ضمیمه خواهد شد. این گزینه برای استفادهٔ توسعهدهندگان GCC و توسعهدهندگان افزونه در هنگام اشکالزدایی پیامهای تشخیصی که جریان کنترل میانروالی (interprocedural) را گزارش میکنند، در نظر گرفته شده است. - -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 و راهنمای سبک GNU است. برخی ابزارها ممکن است با مبدأ 0 عملکرد بهتری داشته باشند؛ هر مقدار غیرمنفی را میتوان مشخص کرد.
- -fdiagnostics-escape-format=FORMAT
-
هنگامی که GCC خطوط کد مبدأ مربوط به یک پیام تشخیصی را چاپ میکند، معمولاً سعی دارد بایتهای مبدأ را مستقیماً چاپ کند. با این حال، برخی از پیامهای تشخیصی به مشکلات کدگذاری در پروندهٔ مبدأ مربوط میشوند، مانند UTF-8 ناهنجار (malformed) یا مشکلات مربوط به یکسانسازی یونیکد (Unicode normalization). این پیامهای تشخیصی نشانهگذاری میشوند تا GCC هنگام چاپ خطوط مبدأ مربوطه، بایتهایی را که اسکی قابل چاپ نیستند نویسهگردانی (escape) کند. این گزینه نحوهٔ نویسهگردانی چنین بایتهایی را کنترل میکند. قالب پیشفرض FORMAT، یعنی unicode، نویسههای یونیکدی را که اسکی قابل چاپ نیستند به صورت <U+XXXX> نمایش میدهد، و بایتهایی را که با نویسهٔ یونیکدی دارای کدگذاری معتبر UTF-8 مطابقت ندارند، به صورت شانزدهشانزدهی و به شکل <XX> نمایش میدهد. برای مثال، خطی از کد مبدأ که شامل رشتهٔ before و به دنبال آن نویسهٔ یونیکد U+03C0 (یعنی «GREEK SMALL LETTER PI» با کدگذاری UTF-8 برابر با 0xCF 0x80) و سپس بایت 0xBF (یک بایت دنبالهٔ سرگردان UTF-8) و به دنبال آن رشتهٔ after باشد، برای چنین پیام تشخیصی به این صورت چاپ خواهد شد: before<U+03C0><BF>afterتنظیم FORMAT روی bytes تمام بایتهای اسکی غیرقابلچاپ را به صورت <XX> نمایش میدهد و در نتیجه کدگذاری زیربنایی نویسههای یونیکد غیراسکی را نشان میدهد. برای مثال بالا، مورد زیر چاپ خواهد شد:
before<CF><80><BF>after
- -fdiagnostics-text-art-charset=CHARSET
- برخی
پیامهای
تشخیصی
میتوانند
شامل
نمودارهای
«هنر متنی»
(text art) باشند:
مصورسازیهایی
که از متن
ایجاد
شدهاند و
برای
مشاهده با
قلمهای
تکعرض (monospaced)
در نظر
گرفته
شدهاند.
این گزینه تعیین میکند در صورت وجود، از چه نویسههایی برای چاپ چنین نمودارهایی استفاده شود. مقدار CHARSET برابر با none، ascii، unicode، یا emoji است.
مقدار none از چاپ چنین نمودارهایی جلوگیری میکند. مقدار ascii اطمینان حاصل میکند که چنین نمودارهایی صرفاً اسکی («هنر اسکی») باشند. مقدار unicode اجازهٔ استفادهٔ محتاطانه از نویسههای ترسیمی یونیکد (مانند نویسههای رسم کادر) را میدهد. مقدار emoji علاوه بر این، امکان استفاده از ایموجی را در خروجی میافزاید (مانند ارسال U+26A0 WARNING SIGN و به دنبال آن U+FE0F VARIATION SELECTOR-16 جهت انتخاب گونهٔ ایموجی نویسه).
پیشفرض emoji است، به جز زمانی که متغیر محیطی LANG روی C تنظیم شده باشد که در آن صورت پیشفرض ascii خواهد بود.
- -fno-diagnostics-show-nesting
- برخی
پیامهای
تشخیصی GCC
دارای
ساختار
درختی
داخلی از
زیرتشخیصهای
تودرتو
هستند،
مانند
مشکلاتی که
هنگام
نمونهسازی
الگوهای ++C
رخ میدهند.
بهطور پیشفرض، GCC از تورفتگی و نشانههای گلولهای (bullet points) در خروجی متنی خود برای نمایش ساختار تودرتوی این پیامهای تشخیصی استفاده میکند، اطلاعات مکان را برای شفافتر شدن ساختار به خطوط جداگانه منتقل مینماید، و اطلاعات تکراری زائد را حذف میکند.
انتخاب -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)" هشدارها پیامهای تشخیصی هستند که ساختارهایی را گزارش میکنند که ذاتاً نادرست نیستند، اما پرخطرند یا نشان میدهند که ممکن است خطایی رخ داده باشد.
گزینههای مستقل از زبان زیر هشدارهای خاصی را فعال نمیکنند، بلکه انواع پیامهای تشخیصی تولیدشده توسط GCC را کنترل میکنند.
- -fsyntax-only
- کد را تنها برای خطاهای نحو (syntax) بررسی میکند، اما فراتر از آن کاری انجام نمیدهد.
- -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) اثربخشتر است. برخی هشدارهای دیگر ممکن است تا زمانی که بهینهسازی فعال نشود اصلاً صادر نشوند. هرچند بهینهسازی به طور کلی کارایی هشدارها در مورد مشکلات جریان کنترل (control flow) و جریان داده (data-flow) را بهبود میبخشد، در برخی موارد ممکن است باعث نتایج مثبت کاذب (false positive) نیز بشود.
- -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 برای استفاده از کلیدواژههای جایگزینی که نامشان با __ شروع شده و پایان مییابد، پیام هشداری صادر نمیکند. این فرمت جایگزین همچنین میتواند برای غیرفعال کردن هشدارها برای انواع غیر ISO مربوط به __intN، یعنی __intN__ به کار رود. هشدارهای سختگیرانه (pedantic) در عبارتی که پس از "__extension__" میآید نیز غیرفعال میشوند. با این حال، تنها فایلهای سرآیند سیستمی باید از این راههای گریز استفاده کنند؛ برنامههای کاربردی باید از آنها اجتناب کنند.
برخی هشدارها دربارهٔ برنامههای ناسازگار با استاندارد، توسط گزینههایی غیر از -Wpedantic کنترل میشوند؛ در بسیاری از موارد آنها به صورت ضمنی توسط -Wpedantic فعال میشوند اما میتوان آنها را به طور جداگانه با گزینهٔ خاص خودشان غیرفعال کرد، مانند -Wpedantic -Wno-pointer-sign.
در جایی که استاندارد مشخصشده با -std یک گویش گسترشیافتهٔ گنو از C مانند gnu90 یا gnu99 را نشان میدهد، یک استاندارد پایه (base standard) متناظر وجود دارد، یعنی همان نسخه از 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++) کلاس پایه در سازنده کپی (copy constructor) یک کلاس مشتقشده مقداردهی اولیه نشود.
- -Wabi (تنها در C، Objective-C، C++ و Objective-C++)
- درباره
کدهایی که
تحت تأثیر
تغییرات ABI
قرار
گرفتهاند
هشدار
میدهد. این
شامل
کدهایی است
که ممکن است
با C++ ABI مستقل
از سازنده و
همچنین psABI
مربوط به
مقصد (target) خاص
سازگار
نباشند.
هشدارهای
مورد دوم
بهطور
جداگانه
توسط -Wpsabi نیز
کنترل
میشوند،
که توسط -Wabi
فعال
میشود.
از آنجا که اکنون رفتار پیشفرض G++ بهروزرسانی ABI در هر انتشار عمده است، -Wabi معمولاً فقط در صورتی درباره مشکلات سازگاری C++ ABI هشدار میدهد که در یک سری از انتشارات، بررسی جدیدی برای مشکلی در ABI که پس از انتشار اولیه کشف شده است اضافه شده باشد. در صورتی که نسخه قدیمیتری از ABI (با -fabi-version=n) انتخاب شود، -Wabi درباره موارد بیشتری هشدار میدهد.
همچنین میتوان -Wabi را همراه با یک شماره نسخه صریح استفاده کرد تا درباره سازگاری C++ ABI با یک سطح مشخص از -fabi-version هشدار دهد؛ برای مثال -Wabi=2 برای هشدار درباره تغییرات نسبت به -fabi-version=2.
اگر یک شماره نسخه صریح مشخص شود و -fabi-compat-version تعیین نشده باشد، از شماره نسخه این گزینه برای نامهای مستعار سازگاری استفاده میشود. اگر هیچ شماره نسخه صریحی با این گزینه ارائه نشود، اما -fabi-compat-version مشخص شده باشد، از آن شماره نسخه برای هشدارهای C++ ABI استفاده میشود.
اگرچه تلاش شده است تا درباره همه چنین مواردی هشدار داده شود، احتمالاً مواردی وجود دارند که علیرغم تولید کد ناسازگار توسط G++، درباره آنها هشداری داده نمیشود. همچنین ممکن است مواردی وجود داشته باشد که با وجود سازگار بودن کد تولیدشده، هشدار صادر شود.
اگر نگران این موضوع هستید که کد تولیدشده توسط G++ ممکن است از نظر باینری با کد تولیدشده توسط دیگر کامپایلرها سازگار نباشد، باید کد خود را بازنویسی کنید تا از این هشدارها جلوگیری شود.
ناسازگاریهای شناختهشده در -fabi-version=2 (که از GCC 3.4 تا 4.9 پیشفرض بود) عبارتند از:
extern int N;
template <int &> struct S {};
void n (S<N>) {2}
این مورد در -fabi-version=3 رفع شد.
- انواع
برداری SIMD که
با استفاده
از "__attribute
((vector_size))" تعریف
میشدند،
به روشی
غیراستاندارد
mangle میشدند
که امکان
سربارگذاری
(overloading) توابعی
که بردارها
را با
اندازههای
متفاوت
میپذیرند
فراهم
نمیکرد.
روش دستکاری نام (mangling) در -fabi-version=4 تغییر یافت.
- عبارتهای
"__attribute ((const))" و
"noreturn"
بهصورت
توصیفکنندههای
نوع (type qualifiers)
کدگذاری (mangle)
میشدند، و
"decltype" از
یک تعریف
ساده حذف (folded away)
میشد.
این مشکلات دستکاری نام در -fabi-version=5 رفع شدند.
- شمارندههای
دامنهدار
(Scoped enumerators) که
بهعنوان
آرگومان به
یک تابع
چندآرگومانی
(variadic) ارسال
میشدند،
مانند
شمارندههای
بیدامنه
ارتقا (promote)
مییافتند
و باعث
ایجاد خطا
توسط
"va_arg"
میشدند. در
اکثر
هدفها (targets)،
این امر در
عمل بر ABI
ارسال
پارامترها
تأثیری
نمیگذارد،
زیرا هیچ
راهی برای
ارسال
آرگومانی
کوچکتر از
"int" وجود
ندارد.
همچنین، ABI دستکاری نام بستههای آرگومان قالب (template argument packs)، "const_cast"، "static_cast"، افزایش/کاهش پیشوندی، و یک تابع با دامنه کلاس (class scope) که بهعنوان آرگومان قالب استفاده میشود را تغییر داد.
این مشکلات در -fabi-version=6 اصلاح شدند.
- توابع
لامبدا در
دامنه
آرگومان
پیشفرض
بهصورت
نادرست mangle
میشدند، و
ABI روش mangling برای
"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، رفع شد.
- ویژگیهای
مختص به
معماری هدف
(Target-specific attributes) که بر
هویت یک نوع
تأثیر
میگذارند،
مانند
قراردادهای
فراخوانی ia32
روی یک نوع
تابع (مانند
stdcall، regparm و غیره)،
روی نام
دستکاریشده
(mangled name) تأثیری
نداشتند که
منجر به
تداخل نام
در زمان
استفاده از
اشارهگرهای
تابع
بهعنوان
آرگومانهای
قالب میشد.
این مورد در -fabi-version=10، مقدار پیشفرض برای GCC 6.1، رفع شد.
- -Wpsabi (تنها C، Objective-C، C++ و Objective-C++)
- گزینهٔ -Wpsabi
هشدارهای
مربوط به
تغییرات ABI
مختص
پردازنده
را فعال
میکند،
مانند
تغییرات در
نیازمندیهای
ترازبندی
یا نحوهٔ
ارسال
آرگومانهای
تابع. در
چندین
معماری
مقصد، از
جمله AArch64، ARM، x86،
MIPS، RS6000/PowerPC و S/390،
این جزئیات
در
نسخههای
مختلف GCC و/یا
نسخههای
مختلف
استانداردهای
زبانهای C
یا C++
بهگونهای
تغییر
کردهاند
که بر
سازگاری
باینری
کدهای
کامپایلشده
تأثیر
میگذارند.
با -Wpsabi، GCC
میتواند
موارد
بالقوه
ناسازگار
را تشخیص
داده و
دربارهٔ
آنها
هشدار دهد.
گزینهٔ -Wpsabi بهطور پیشفرض فعال است، و همچنین توسط -Wabi نیز بهصورت ضمنی فعال میشود.
- -Wno-changes-meaning (تنها C++ و Objective-C++)
- زبان C++
ایجاب
میکند که
استفادههای
بدون توصیف
(unqualified) از یک نام
در درون یک
کلاس، در
سرتاسر
دامنهٔ
کامل کلاس
معنای
یکسانی
داشته
باشند؛
بنابراین،
تعریف مجدد
یک نام پس
از استفاده
از آن
ناصحیح (ill-formed)
است:
struct A; struct B1 { A a; typedef A A; }; // warning, 'A' changes meaning struct B2 { A a; struct A { }; }; // error, 'A' changes meaningبهطور پیشفرض، حالت B1 تنها یک هشدار است زیرا هر دو اعلان دارای یک نوع یکسان هستند، در حالی که حالت B2 یک خطا به شمار میرود. هر دو پیام تشخیصی را میتوان با -Wno-changes-meaning غیرفعال کرد. در غیر این صورت، میتوان حالت خطا را با -Wno-error=changes-meaning یا -fpermissive به یک هشدار تنزل داد.
هر دو پیام تشخیصی توسط -fms-extensions نیز سرکوب میشوند.
- -Wchar-subscripts
- اگر اندیس
یک آرایه از
نوع "char"
باشد هشدار
میدهد. این
یک دلیل
متداول
برای بروز
خطا است،
زیرا
برنامهنویسان
اغلب
فراموش
میکنند که
این نوع روی
برخی
ماشینها
علامتدار
(signed) است.
@xref{Characters implementation}، و
"char" type signedness
را ببینید.
این هشدار توسط -Wall فعال میشود. در صورت فعال بودن، هشدار صرفنظر از اینکه "char" بهطور پیشفرض روی مقصد بدون علامت است یا خیر صادر میشود، و همچنین تحت تأثیر گزینههای -fsigned-char یا -funsigned-char قرار نمیگیرد.
- -Wno-coverage-mismatch
- در صورت استفاده از گزینهٔ -fprofile-use، اگر دادههای بازخورد پروفایل (feedback profiles) تطابق نداشته باشند، هشدار میدهد. اگر یک فایل مبدأ در فاصلهٔ بین کامپایل با -fprofile-generate و -fprofile-use تغییر کند، فایلهای حاوی بازخورد پروفایل ممکن است با فایل مبدأ تطابق نداشته باشند و GCC نتواند از اطلاعات بازخورد پروفایل استفاده کند. بهطور پیشفرض، این هشدار فعال است و بهعنوان خطا تلقی میشود. برای غیرفعال کردن هشدار میتوان از -Wno-coverage-mismatch یا برای جلوگیری از خطاشدن آن از -Wno-error=coverage-mismatch استفاده کرد. غیرفعال کردن خطا برای این هشدار میتواند منجر به تولید کدهایی با بهینهسازی ضعیف شود و فقط در صورت تغییرات بسیار جزئی مانند اصلاح باگها در یک پایگاهکد موجود مفید است. غیرفعال کردن کامل این هشدار توصیه نمیشود.
- -Wno-coverage-too-many-conditions
- اگر -fcondition-coverage استفاده شود و یک عبارت دارای عبارات شرطی بیش از حد باشد و GCC از پوشش (coverage) صرفنظر کند، هشدار میدهد. زمانی که تعداد جملات موجود در عبارت شرطی بیشتر از تعداد بیتهای یک "gcov_type_unsigned" باشد، بررسی پوشش رها میشود. این هشدار بهطور پیشفرض فعال است.
- -Wno-coverage-too-many-paths
- اگر -fpath-coverage استفاده شود و یک تابع مسیرهای بسیار زیادی داشته باشد و GCC از پوشش صرفنظر کند، هشدار میدهد. صرفنظر کردن توسط -fpath-coverage-limit کنترل میشود. این هشدار بهطور پیشفرض فعال است.
- -Wno-coverage-invalid-line-number
- در صورتی که
تابعی به
دلیل
ماکروهای
شمارهخط (linenum
macros) نامعتبر،
زودتر از
شروعش به
پایان
برسد،
هشدار
میدهد. این
هشدار تنها
با فعال
بودن --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" انجام شود، زیرا مقادیر مستقیم ممیز شناور (floating-point literals) بهطور ضمنی از نوع "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" و
غیره را
بررسی
میکند تا
مطمئن شود
نوع
آرگومانهای
ارائهشده
متناسب با
رشتهٔ قالب
(format string)
مشخصشده
است و
تبدیلات
مشخصشده
در رشتهٔ
قالب معنا
دارند و
معتبر
هستند. این
بررسی شامل
توابع
استاندارد
و توابع
دیگری است
که با
ویژگیهای
قالب (format attributes)
مشخص
شدهاند،
در
خانوادههای
"printf"،
"scanf"،
"strftime" و
"strfmon" (یک
افزونهٔ X/Open،
که در
استاندارد C
وجود ندارد)
(یا سایر
خانوادههای
مختص
معماری
مقصد).
اینکه
کدام توابع
بدون مشخص
شدن صریح
ویژگیهای
قالب بررسی
میشوند به
نسخهٔ
استاندارد
انتخابشده
بستگی
دارد، و
اینگونه
بررسیهای
توابع بدون
مشخص بودن
ویژگیهای
مذکور،
توسط -ffreestanding یا
-fno-builtin
غیرفعال
میشوند.
قالبها بر اساس ویژگیهای قالب پشتیبانیشده توسط GNU libc نسخهٔ ۲٫۲ بررسی میگردند. اینها شامل تمام ویژگیهای ISO C90 و C99 و همچنین ویژگیهایی از مشخصات Single Unix و برخی افزونههای BSD و GNU هستند. پیادهسازیهای دیگر کتابخانهها ممکن است از همهٔ این ویژگیها پشتیبانی نکنند؛ GCC از هشدار دادن دربارهٔ ویژگیهایی که فراتر از محدودیتهای یک کتابخانهٔ خاص هستند پشتیبانی نمیکند. با این حال، اگر -Wpedantic همراه با -Wformat استفاده شود، دربارهٔ ویژگیهای قالبی که در نسخهٔ استاندارد انتخابشده وجود ندارند هشدار داده میشود (اما نه برای قالبهای "strfmon"، زیرا آنها در هیچ نسخهای از استاندارد C نیستند).
- -Wformat
- گزینه -Wformat معادل -Wformat=1 است، و -Wno-format معادل -Wformat=0 میباشد. از آنجا که -Wformat همچنین آرگومانهای قالب تهی (null) را برای چندین تابع بررسی میکند، -Wformat متضمن -Wnonnull نیز هست. برخی از جنبههای این سطح از بررسی قالب را میتوان با این گزینهها غیرفعال کرد: -Wno-format-contains-nul، -Wno-format-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 (SUS) بیان میکند که چنین آرگومانهای استفادهنشدهای مجاز هستند.
- -Wformat-overflow
- -Wformat-overflow=level
- درباره فراخوانیهای توابع ورودی/خروجی قالببندیشده مانند "sprintf" و "vsprintf" که ممکن است باعث سرریز بافر مقصد شوند هشدار میدهد. هنگامی که تعداد دقیق بایتهای نوشتهشده توسط یک دستورالعمل قالب در زمان کامپایل قابل تعیین نباشد، بر اساس روشهای اکتشافی که به آرگومان level و بهینهسازی وابستهاند برآورد میشود. در حالی که فعالسازی بهینهسازی در بیشتر موارد دقت هشدار را بهبود میبخشد، ممکن است منجر به مثبتهای کاذب نیز بشود.
- -Wformat-overflow
- -Wformat-overflow=1
- سطح 1 از
-Wformat-overflow که با -Wformat
فعال
میشود،
رویکردی
محافظهکارانه
اتخاذ
میکند که
تنها
درباره
فراخوانیهایی
هشدار
میدهد که
به احتمال
زیاد باعث
سرریز بافر
میشوند. در
این سطح،
فرض میشود
آرگومانهای
عددی
دستورالعملهای
قالب با
مقادیر
نامعلوم
دارای
مقدار یک
هستند، و
رشتههایی
با طول
نامعلوم
خالی فرض
میشوند.
آرگومانهای
عددی که
مشخص است به
زیرمجموعهای
از نوع خود
محدود
شدهاند،
یا
آرگومانهای
رشتهای که
خروجی
آنها چه با
دقت
دستورالعمل'شان
یا با
مجموعهای
متناهی از
رشتههای
لفظی محدود
شده باشد،
فرض
میشوند
مقداری را
در آن
محدوده
اختیار
کنند که
منجر به
بیشترین
بایت در
خروجی شود.
به عنوان
مثال،
فراخوانی
"sprintf" زیر
شناسایی
میشود
زیرا حتی
اگر هر دو a
و b برابر
با صفر
باشند،
نویسه
پایانی NUL
('\0') که
توسط تابع
به بافر
مقصد الحاق
میشود،
فراتر از
انتهای آن
نوشته
خواهد شد.
افزایش
اندازه
بافر به
مقدار تنها
یک بایت
برای رفع
هشدار کافی
است، گرچه
ممکن است
برای
جلوگیری از
سرریز کافی
نباشد.
void f (int a, int b) { char buf [13]; sprintf (buf, "a = %i, b = %i\n", a, b); } - -Wformat-overflow=2
- سطح 2
همچنین
درباره
فراخوانیهایی
هشدار
میدهد که
در صورت
وجود
آرگومانی
با طول یا
بزرگی کافی
ممکن است
باعث سرریز
بافر مقصد
شوند. در
سطح 2، فرض
میشود
آرگومانهای
عددی
نامعلوم
دارای
کمترین
مقدار
قابلنمایش
برای انواع
علامتدار
با دقت
بیشتر از ۱،
و در غیر
این صورت
دارای
بیشترین
مقدار
قابلنمایش
هستند.
آرگومانهای
رشتهای
نامعلوم که
نتوان طول
آنها را چه
با دقت
دستورالعمل'شان،
یا با
مجموعهای
متناهی از
رشتههای
لفظی که
ممکن است به
آنها
ارزیابی
شوند، یا
آرایه
نویسهای
که ممکن است
به آن اشاره
کنند محدود
در نظر
گرفت،
دارای ۱
نویسه فرض
میشوند.
در سطح 2، فراخوانی در مثال بالا مجدداً شناسایی میشود، اما این بار به این دلیل که با برابر بودن a با یک مقدار ۳۲ بیتی "INT_MIN"، اولین دستورالعمل %i برخی از ارقام خود را فراتر از انتهای بافر مقصد خواهد نوشت. برای ایمن کردن فراخوانی صرفنظر از مقادیر این دو متغیر، اندازه بافر مقصد باید حداقل به ۳۴ بایت افزایش یابد. GCC حداقل اندازه بافر را در یک یادداشت اطلاعاتی در ادامه هشدار میآورد.
یک جایگزین برای افزایش اندازه بافر مقصد، محدود کردن دامنه مقادیر قالببندیشده است. بیشینه طول آرگومانهای رشتهای را میتوان با مشخص کردن دقت در دستورالعمل قالب محدود کرد. هنگامی که بتوان آرگومانهای عددی دستورالعملهای قالب را محدودتر از دقت نوع آنها فرض کرد، انتخاب یک اصلاحکننده طول مناسب برای مشخصکننده قالب، اندازه بافر مورد نیاز را کاهش خواهد داد. به عنوان مثال، اگر در نمونه بالا بتوان فرض کرد که a و b در محدوده دقت نوع "short int" هستند، استفاده از دستورالعمل قالب %hi یا تبدیل نوع آرگومان به "short"، بیشینه اندازه مورد نیاز بافر را به ۲۴ بایت کاهش میدهد.
void f (int a, int b) { char buf [23]; sprintf (buf, "a = %hi, b = %i\n", a, (short)b); }
- -Wno-format-zero-length
- اگر -Wformat مشخص شده باشد، درباره قالبهای با طول صفر هشدار نده. استاندارد C مشخص میکند که قالبهای با طول صفر مجاز هستند.
- -Wformat-nonliteral
- اگر -Wformat مشخص شده باشد، همچنین در صورتی که رشته قالب یک رشته لفظی نباشد و در نتیجه قابل بررسی نباشد هشدار بده، مگر اینکه تابع قالب آرگومانهای قالب خود را به صورت یک "va_list" دریافت کند.
- -Wformat-security
- اگر -Wformat مشخص شده باشد، همچنین درباره استفادههایی از توابع قالب که نشاندهنده مشکلات امنیتی احتمالی هستند هشدار بده. در حال حاضر، این گزینه درباره فراخوانیهای توابع "printf" و "scanf" که در آنها رشته قالب یک رشته لفظی نبوده و هیچ آرگومان قالبی وجود ندارد (مانند "printf (foo);") هشدار میدهد. اگر رشته قالب از ورودی غیرقابلاعتماد آمده باشد و حاوی %n باشد، این میتواند یک رخنه امنیتی باشد. (این هشدار در حال حاضر زیرمجموعهای از مواردی است که -Wformat-nonliteral درباره آنها هشدار میدهد، اما در آینده ممکن است هشدارهایی به -Wformat-security افزوده شوند که در -Wformat-nonliteral گنجانده نشدهاند.)
- -Wformat-signedness
- اگر -Wformat مشخص شده باشد، همچنین در صورتی که رشته قالب نیازمند یک آرگومان بدون علامت (unsigned) باشد اما آرگومان دارای علامت (signed) باشد، و برعکس، هشدار بده.
- -Wformat-truncation
- -Wformat-truncation=level
- درباره فراخوانیهای توابع ورودی/خروجی قالببندیشده مانند "snprintf" و "vsnprintf" که ممکن است به کوتاه شدن خروجی منجر شوند هشدار میدهد. هنگامی که تعداد دقیق بایتهای نوشتهشده توسط یک دستورالعمل قالب در زمان کامپایل قابل تعیین نباشد، بر اساس روشهای اکتشافی که به آرگومان level و بهینهسازی وابستهاند برآورد میشود. در حالی که فعالسازی بهینهسازی در بیشتر موارد دقت هشدار را بهبود میبخشد، ممکن است منجر به مثبتهای کاذب نیز بشود. به جز مواردی که خلاف آن ذکر شده، این گزینه از همان منطق -Wformat-overflow استفاده میکند.
- -Wformat-truncation
- -Wformat-truncation=1
- سطح 1 از -Wformat-truncation که با -Wformat فعال میشود، رویکردی محافظهکارانه اتخاذ میکند که تنها درباره فراخوانیهای توابع با اندازه محدود هشدار میدهد که مقدار بازگشتی آنها استفاده نشده است و به احتمال زیاد منجر به کوتاه شدن خروجی میشوند.
- -Wformat-truncation=2
- سطح 2 همچنین درباره فراخوانیهای توابع با اندازه محدود هشدار میدهد که مقدار بازگشتی آنها استفاده شده است و در صورت وجود آرگومانی با طول یا بزرگی کافی ممکن است منجر به کوتاه شدن خروجی شوند.
- -Wnonnull
- دربارهٔ
ارسال یک
اشارهگر
تهی (null pointer) برای
آرگومانهایی
که توسط صفت
تابع
"nonnull" به
عنوان
نیازمند یک
مقدار
غیرتهی
مشخص
شدهاند،
هشدار
میدهد.
-Wnonnull در -Wall و -Wformat گنجانده شده است. این گزینه میتواند با گزینهٔ -Wno-nonnull غیرفعال شود.
- -Wnonnull-compare
- هنگامی که
درون تابع،
یک آرگومان
نشانهگذاریشده
با صفت تابع
"nonnull" با null
مقایسه
شود، هشدار
میدهد.
-Wnonnull-compare در -Wall گنجانده شده است. این گزینه میتواند با گزینهٔ -Wno-nonnull-compare غیرفعال شود.
- -Wnull-dereference
- اگر کامپایلر مسیرهایی را شناسایی کند که به دلیل ارجاعزدایی یک اشارهگر null، موجب رفتار خطاآمیز یا تعریفنشده میشوند، هشدار میدهد. این گزینه تنها زمانی فعال است که -fdelete-null-pointer-checks فعال باشد، که در بیشتر مقاصد با بهینهسازیها فعال میشود. دقت هشدارها به گزینههای بهینهسازی بهکاررفته بستگی دارد.
- -Wno-musttail-local-addr
- دربارهٔ ارسال یک اشارهگر (یا در C++، یک ارجاع) به متغیر محلی یا برچسب به عنوان آرگومان یک فراخوانی "musttail" هشدار نده. آن متغیرها پیش از دستور tail call از حوزه خارج میشوند.
- -Wmaybe-musttail-local-addr
- هنگامی که
نشانی یک
متغیر محلی
بتواند به
یک
فراخوانی
"musttail" درز
پیدا کند،
مگر اینکه
پیش از
فراخوانی
"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]
مجاز
دانسته شده
حذف نکند،
هشدار
میدهد. این
حذف کپی
معمولاً به
عنوان
بهینهسازی
مقدار
بازگشتی
نامگذاریشده
(Named Return Value Optimization)
شناخته
میشود.
برای
نمونه، در
مثال زیر
کامپایلر
نمیتواند
کپی را از
هر دو متغیر
v1 و v2 حذف کند،
بنابراین
هیچکدام
را حذف
نمیکند.
std::vector<int> f() { std::vector<int> v1, v2; // ... if (cond) return v1; else return v2; // warning: not eliding copy } - -Winfinite-recursion
- دربارهٔ
فراخوانیهای
بازگشتی
بیپایان
هشدار
میدهد. این
هشدار در
همهٔ سطوح
بهینهسازی
عمل میکند
اما برای
تشخیص
بازگشت
بیپایان
در
فراخوانیهای
بین دو یا
چند تابع،
به
بهینهسازی
نیاز دارد.
-Winfinite-recursion در -Wall
گنجانده
شده است.
با -Wanalyzer-infinite-recursion مقایسه کنید که هشدار مشابهی ارائه میدهد، اما به روشی متفاوت (به عنوان بخشی از -fanalyzer) پیادهسازی شده است.
- -Winit-self (تنها C، C++، Objective-C و Objective-C++)
- دربارهٔ
متغیرهای
مقداردهینشدهای
که با
خودشان
مقداردهی
اولیه
میشوند
هشدار
میدهد.
توجه داشته
باشید این
گزینه تنها
همراه با
گزینهٔ -Wuninitialized
قابل
استفاده
است.
برای نمونه، GCC دربارهٔ مقداردهینشده بودن "i" در قطعهکد زیر، تنها زمانی هشدار میدهد که -Winit-self مشخص شده باشد:
int f() { int i = i; return i; }این هشدار در C++ توسط -Wall فعال میشود.
- -Wno-implicit-int (تنها C و Objective-C)
- این گزینه
هشدارها را
در مواردی
که یک
اعلان،
نوعی را
مشخص
نمیکند
کنترل
میکند. این
هشدار به
صورت
پیشفرض،
به عنوان یک
خطا، در C99 و
گویشهای
پسین C، و
همچنین
توسط -Wall
فعال است.
این خطا
میتواند
با استفاده
از -fpermissive (به
همراه برخی
خطاهای
دیگر)، یا
تنها برای
همین خطا،
با -Wno-error=implicit-int به
یک هشدار
تنزل یابد.
این هشدار توسط -pedantic-errors به یک خطا ارتقا مییابد.
- -Wno-implicit-function-declaration (تنها C و Objective-C)
- این گزینه
هشدارها را
هنگامی که
تابعی پیش
از اعلان
شدن
استفاده
میشود
کنترل
میکند. این
هشدار به
طور
پیشفرض،
به عنوان یک
خطا، در C99 و
گویشهای
پسین C، و
همچنین
توسط -Wall
فعال است.
این خطا
میتواند
با استفاده
از -fpermissive (به
همراه برخی
خطاهای
دیگر)، یا
تنها برای
همین خطا،
با -Wno-error=implicit-function-declaration
به یک هشدار
تنزل پیدا
کند.
این هشدار توسط -pedantic-errors به یک خطا ارتقا مییابد.
- -Wimplicit (تنها C و Objective-C)
- همانند -Wimplicit-int و -Wimplicit-function-declaration است. این هشدار توسط -Wall فعال میشود.
- -Whardened
- هنگامی که
-fhardened
گزینهای
از مجموعهٔ
خود را فعال
نکرده باشد
(که برای آن
-fhardened را
ببینید)،
هشدار
میدهد.
برای
نمونه،
استفادهٔ
همزمان از
-fhardened و -fstack-protector در
خط فرمان
باعث
میشود -Whardened
هشدار دهد،
زیرا -fstack-protector-strong
توسط -fhardened
فعال
نخواهد شد.
این هشدار به طور پیشفرض فعال است و تنها زمانی اثر دارد که -fhardened فعال باشد.
- -Wimplicit-fallthrough
- -Wimplicit-fallthrough معادل -Wimplicit-fallthrough=3 است و -Wno-implicit-fallthrough با -Wimplicit-fallthrough=0 یکسان است.
- -Wimplicit-fallthrough=n
- هنگامی که
یک حالت switch به
حالت بعدی
سرازیر شود
(fall through رخ دهد)،
هشدار
میدهد.
برای نمونه:
switch (cond) { case 1: a = 1; break; case 2: a = 2; case 3: a = 3; break; }این گزینه زمانی که آخرین عبارت یک case نتواند به حالت بعدی سرازیر شود هشداری صادر نمیکند؛ برای مثال زمانی که یک عبارت return یا فراخوانی تابعی که با صفت noreturn اعلان شده وجود داشته باشد. -Wimplicit-fallthrough= همچنین عبارتهای کنترل جریان مانند ifها را در نظر میگیرد و تنها در موارد مقتضی هشدار میدهد. برای نمونه:
switch (cond) { case 1: if (i > 3) { bar (5); break; } else if (i < 1) { bar (0); } else return; default: ... }از آنجا که مواردی وجود دارد که در آنها سرازیر شدن یک case در ساختار 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" صادر نمیشود، زیرا این معمولاً نشاندهندهٔ کد تولیدشده بهصورت خودکار است و هیچ فرضی دربارهٔ چیدمان فایلی که دستورالعمل به آن ارجاع میدهد، نمیتوان داشت.
این هشدار توسط -Wall در C و C++ فعال میشود.
- -Wmissing-attributes
- زمانی
هشدار
میدهد که
در اعلان یک
تابع، یک یا
چند مشخصه
وجود
نداشته
باشد در
حالی که یک
تابع مرتبط
با آن
مشخصهها
اعلان شده و
نبود آنها
ممکن است بر
درستی یا
کارایی کد
تولیدشده
تأثیر
نامطلوب
بگذارد.
برای
نمونه، این
هشدار برای
اعلان
نامهای
مستعاری
صادر
میشود که
از
مشخصهها
برای تعیین
الزامات
کمتر
محدودکننده
نسبت به
اهداف خود
استفاده
میکنند.
این وضعیت
معمولاً
نشاندهندهٔ
یک فرصت
بالقوه
برای
بهینهسازی
است. در
مقابل،
گزینهٔ
-Wattribute-alias=2
هشدارهایی
را کنترل
میکند که
هنگام
محدودکنندهتر
بودن نام
مستعار
نسبت به هدف
صادر
میشوند؛
وضعیتی که
میتواند
به تولید کد
نادرست
منجر شود.
مشخصههای
مورد بررسی
شامل
"alloc_align"،
"alloc_size"،
"cold"،
"const"،
"hot"،
"leaf"،
"malloc"،
"nonnull"،
"noreturn"،
"nothrow"،
"pure"،
"returns_nonnull" و
"returns_twice"
هستند.
در C++، این هشدار زمانی صادر میشود که یک تخصیص صریح از یک الگوی اولیه که با مشخصهٔ "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
- این گزینه هشدارهای مربوط به نبود نمایههای بازخورد (feedback profiles) را در هنگام استفاده از گزینهٔ -fprofile-use کنترل میکند. این گزینه مواردی را تشخیص میدهد که در آنها یک تابع جدید یا فایل جدید بین کامپایل با -fprofile-generate و -fprofile-use، بدون تولید مجدد نمایهها، افزوده شده باشد. در این موارد، فایلهای دادهٔ بازخورد نمایه، به ترتیب فاقد هرگونه اطلاعات بازخورد نمایه برای تابع یا فایل تازه افزوده شده هستند. همچنین، در حالتی که فایلهای شمارش دادههای نمایه (.gcda) حذف شوند، GCC نمیتواند از هیچگونه اطلاعات بازخورد نمایه استفاده کند. در تمامی این موارد، هشدارهایی صادر میشوند تا به شما اطلاع دهند که موعد مرحلهٔ تولید نمایه فرا رسیده است. نادیده گرفتن این هشدار میتواند منجر به کدی با بهینهسازی ضعیف شود. میتوان از -Wno-missing-profile برای غیرفعال کردن هشدار استفاده کرد، اما این کار توصیه نمیشود و فقط باید زمانی انجام شود که فقدان دادههای نمایه توجیهپذیر باشد.
- -Wmismatched-dealloc
- برای
فراخوانی
توابع
آزادسازی
حافظه (deallocation) با
آرگومانهای
اشارهگری
که از توابع
تخصیصی
بازگردانده
شدهاند
اما تابع
نخست
آزادساز
مناسبی
برای آن
نیست،
هشدار
میدهد. یک
جفت تابع را
میتوان با
استفاده از
مشخصهٔ
"malloc" به
عنوان
تخصیصدهنده
و آزادساز
متناظر با
یکدیگر
پیوند داد.
مگر اینکه
توسط
گزینهٔ -fno-builtin
غیرفعال
شده باشد،
توابع
استاندارد
"calloc"،
"malloc"،
"realloc" و
"free"، و
همچنین
صورتهای
متناظر
"operator new" و
"operator delete" در
C++، بهطور
ضمنی به
عنوان
تخصیصدهندهها
و
آزادسازهای
متناظر در
نظر گرفته
میشوند. در
مثال زیر،
"mydealloc"
آزادساز
برای
اشارهگرهای
بازگرداندهشده
از "myalloc"
است.
void mydealloc (void*); __attribute__ ((malloc (mydealloc, 1))) void* myalloc (size_t); void f (void) { void *p = myalloc (32); // ...use p... free (p); // warning: not a matching deallocator for myalloc mydealloc (p); // ok }در C++، گزینهٔ مرتبط -Wmismatched-new-delete عدم تطابقهای مربوط به "operator new" یا "operator delete" را تشخیص میدهد.
گزینهٔ -Wmismatched-dealloc در -Wall گنجانده شده است.
- -Wmultistatement-macros
- دربارهٔ
ماکروهای
چنددستوری
ناامن
هشدار
میدهد که
به نظر
میرسد
توسط
عبارتی
مانند
"if"،
"else"،
"for"،
"switch" یا
"while"
محافظت
شدهاند،
اما پس از
بسط ماکرو
تنها
نخستین
دستور
عملاً
محافظت
میشود.
برای مثال:
#define DOIT x++; y++ if (c) DOIT;
مقدار "y" را بدون شرط افزایش خواهد داد، نه فقط زمانی که شرط "c" برقرار باشد. این مشکل معمولاً با محصور کردن ماکرو درون یک حلقهٔ do-while برطرف میشود:
#define DOIT do { x++; y++; } while (0) if (c) DOIT;این هشدار در C و C++ توسط -Wall فعال میشود.
- -Wparentheses
- اگر
پرانتزها
در شرایط
خاصی حذف
شده باشند
هشدار
میدهد؛
مانند
زمانی که یک
انتساب (assignment)
در
زمینهای
رخ میدهد
که یک مقدار
درستی (truth value)
مورد
انتظار
است، یا
هنگامی که
عملگرهایی
تو در تو
شدهاند که
ترتیب
اولویت
آنها اغلب
باعث
سردرگمی
افراد
میشود.
همچنین در صورت وجود مقایسهای مانند "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" به
خودش منتقل
(move) میشود،
هشدار
میدهد.
چنین
"std::move"ی
معمولاً
هیچ اثری
ندارد.
struct T { ... }; void fn() { T t; ... t = std::move (t); }این هشدار توسط -Wall فعال میشود.
- -Wsequence-point
- دربارهٔ
کدهایی
هشدار
میدهد که
ممکن است به
دلیل نقض
قواعد نقاط
توالی (sequence point) در
استانداردهای
C و C++ دارای
معانی
تعریفنشده
(undefined semantics) باشند.
استانداردهای C و C++ ترتیب ارزیابی عبارتها در یک برنامهٔ C/C++ را برحسب نقاط توالی (sequence points) تعریف میکنند، که نشاندهندهٔ یک ترتیب جزئی بین اجرای بخشهایی از برنامه است: بخشهایی که پیش از نقطهٔ توالی اجرا میشوند، و بخشهایی که پس از آن اجرا میگردند. این نقاط پس از ارزیابی یک عبارت کامل (عبارتی که بخشی از یک عبارت بزرگتر نیست)، پس از ارزیابی نخستین عملوند عملگرهای "&&"، "||"، "? :" یا "," (کاما)، پیش از فراخوانی یک تابع (اما پس از ارزیابی آرگومانهای آن و عبارتی که تابع فراخواندهشده را مشخص میکند)، و در جاهای مشخص دیگری رخ میدهند. بهجز مواردی که با قواعد نقاط توالی بیان شدهاند، ترتیب ارزیابی زیرعبارتهای یک عبارت نامشخص است. همهٔ این قواعد تنها یک ترتیب جزئی را بیان میکنند نه یک ترتیب کلی؛ زیرا برای مثال اگر دو تابع درون یک عبارت فراخوانی شوند و هیچ نقطهٔ توالی بین آنها وجود نداشته باشد، ترتیبی که در آن توابع فراخوانی میشوند نامشخص است. با این حال، کمیتهٔ استانداردها مقرر کرده است که فراخوانی توابع با یکدیگر همپوشانی ندارند.
مشخص نیست که در فاصلهٔ بین نقاط توالی، اعمال تغییرات در مقادیر شیءها چه زمانی رخ میدهد. برنامههایی که رفتار آنها به این موضوع وابسته است، رفتار تعریفنشده (undefined behavior) دارند؛ استانداردهای C و C++ تصریح میکنند که «بین نقطهٔ توالی پیشین و پسین، مقدار ذخیرهشدهٔ یک شیء در اثر ارزیابی یک عبارت باید حداکثر یک بار تغییر یابد. علاوه بر این، مقدار قبلی تنها باید به منظور تعیین مقداری که قرار است ذخیره شود خوانده شود.». اگر برنامهای این قوانین را نقض کند، نتایج روی هر پیادهسازی خاص کاملاً غیرقابل پیشبینی خواهد بود.
نمونههایی از کدهای با رفتار تعریفنشده عبارتند از "a = a++;"، "a[n] = b[n++]" و "a[i++] = i;". برخی از موارد پیچیدهتر توسط این گزینه تشخیص داده نمیشوند و ممکن است گهگاه نتیجهٔ مثبت کاذب (false positive) ایجاد کند، اما در کل مشخص شده است که در شناسایی این دست از مشکلات در برنامهها نسبتاً مؤثر است.
استاندارد C++17 ترتیب ارزیابی عملوندها را در موارد بیشتری تعریف خواهد کرد: بهویژه این که نیاز دارد سمت راست یک انتساب پیش از سمت چپ آن ارزیابی شود، بنابراین مثالهای بالا دیگر تعریفنشده نخواهند بود. اما این گزینه همچنان دربارهٔ آنها هشدار میدهد تا به برنامهنویسان کمک کند از نوشتن کدی که در C و نگارشهای قبلی C++ تعریفنشده است خودداری کنند.
متن استاندارد به گونهای گیجکننده نگاشته شده است؛ از این رو دربارهٔ معنای دقیق قواعد نقاط توالی در موارد ظریف و پیچیده مباحثاتی وجود دارد. پیوندها به گفتگوهای این مسئله، از جمله تعاریف رسمی پیشنهادی، را میتوان در برگهٔ مطالعاتی GCC در https://gcc.gnu.org/readings.html یافت.
این هشدار برای C و C++ توسط -Wall فعال میشود..IP -Wno-return-local-addr 4 درباره بازگرداندن یک اشارهگر (یا در ++C، یک ارجاع) به متغیری که پس از بازگشت تابع از محدوده (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
فعال باشد
که اولویت
دارد).
همچنین اگر
اجرا به
انتهای
بدنه تابع
برسد، یا
اگر تابع
اصلاً شامل
هیچ دستور return
نباشد،
هشدار
میدهد.
تلاش برای استفاده از مقدار بازگشتی یک تابع غیر-"void" بهجز "main" که با رسیدن به آکولاد بسته خاتمهدهنده تابع، جریان اجرا از انتهای آن خارج میشود، رفتاری تعریفنشده است.
برخلاف C، در ++C خارج شدن از انتهای یک تابع غیر-"void" بهجز "main" منجر به رفتار تعریفنشده میشود، حتی زمانی که از مقدار تابع استفاده نشود.
این هشدار در ++C بهطور پیشفرض و در غیر این صورت با -Wall فعال میشود.
- -Wno-shift-count-negative
- هشدارهای مربوط به منفی بودن تعداد شیفت را کنترل میکند. این هشدار بهطور پیشفرض فعال است.
- -Wno-shift-count-overflow
- هشدارهای مربوط به بزرگتر یا مساوی بودن تعداد شیفت با پهنای بیتی (bit width) نوع داده را کنترل میکند. این هشدار بهطور پیشفرض فعال است.
- -Wshift-negative-value
- در صورت شیفت به چپ یک مقدار منفی، هشدار میدهد. این هشدار توسط -Wextra در حالتهای C99 (و جدیدتر) و C++11 تا C++17 فعال میشود.
- -Wno-shift-overflow
- -Wshift-overflow=n
- این گزینهها هشدارهای سرریز شیفت به چپ را کنترل میکنند.
- -Wshift-overflow=1
- این سطح هشدارِ -Wshift-overflow است و بهطور پیشفرض در حالتهای C99 و C++11 (و جدیدتر) فعال است. این سطح هشدار درباره شیفت به چپ مقدار 1 به داخل بیت علامت (sign bit) هشدار نمیدهد. (با این حال، در C، چنین سرریزی در زمینههایی که عبارت ثابت صحیح الزامی است، همچنان رد میشود.) در حالت C++20 (و جدیدتر) هیچ هشداری صادر نمیشود، زیرا شیفتهای به چپ علامتدار همواره سرریز چرخشی (wrap) دارند.
- -Wshift-overflow=2
- این سطح هشدار علاوه بر این، درباره شیفت به چپ مقدار 1 به داخل بیت علامت هشدار میدهد، مگر اینکه حالت C++14 (یا جدیدتر) فعال باشد.
- -Wswitch
- هرگاه یک دستور "switch" دارای شاخصی از نوع شمارشی (enumerated) باشد و فاقد "case" برای یک یا چند مورد از کدهای نامگذاریشده آن شمارش باشد، هشدار میدهد. (وجود برچسب "default" مانع این هشدار میشود.) برچسبهای "case" که متناظر با شمارندهها (enumerators) نیستند نیز در صورت استفاده از این گزینه باعث ایجاد هشدار میشوند، مگر اینکه شمارش با صفت "flag_enum" مشخص شده باشد. این هشدار با -Wall فعال میشود.
- -Wswitch-default
- هرگاه یک دستور "switch" فاقد حالت "default" باشد، هشدار میدهد.
- -Wswitch-enum
- هرگاه یک دستور "switch" دارای شاخصی از نوع شمارشی باشد و فاقد "case" برای یک یا چند مورد از کدهای نامگذاریشده آن شمارش باشد، هشدار میدهد. برچسبهای "case" که متناظر با شمارندهها نیستند نیز هنگام استفاده از این گزینه باعث هشدار میشوند، مگر اینکه شمارش با صفت "flag_enum" مشخص شده باشد. تنها تفاوت بین -Wswitch و این گزینه در این است که این گزینه حتی در صورت وجود برچسب "default" نیز برای کدهای شمارشی از قلم افتاده هشدار میدهد.
- -Wno-switch-bool
- زمانی که یک
دستور
"switch"
دارای
شاخصی از
نوع بولی (boolean)
باشد و
مقادیر case
خارج از
محدوده نوع
بولی
باشند،
هشدار
نمیدهد.
میتوان
این هشدار
را با تبدیل
نوع (cast) عبارت
کنترلی به
نوعی غیر از
"bool"
سرکوب کرد.
برای مثال:
switch ((int) (a == 4)) { ... }این هشدار بهطور پیشفرض برای برنامههای C و ++C فعال است.
- -Wno-switch-outside-range
- این گزینه هشدارهای مربوط به زمانی را کنترل میکند که مقدار یک "switch" case خارج از محدوده نوع داده مربوط به خود باشد. این هشدار بهطور پیشفرض برای برنامههای C و ++C فعال است.
- -Wno-switch-unreachable
- زمانی که یک
دستور
"switch"
حاوی
دستورهایی
بین عبارت
کنترلی و
نخستین
برچسب case
باشد که
هرگز اجرا
نخواهند
شد، هشدار
نمیدهد.
برای مثال:
switch (cond) { i = 15; ... case 5: ... }گزینه -Wswitch-unreachable در صورتی که دستور بین عبارت کنترلی و نخستین برچسب case صرفاً یک اعلان (declaration) باشد، هشدار نمیدهد:
switch (cond) { int i; ... case 5: i = 5; ... }این هشدار بهطور پیشفرض برای برنامههای C و ++C فعال است.
- -Wsync-nand (تنها در C و ++C)
- هنگام استفاده از توابع توکار "__sync_fetch_and_nand" و "__sync_nand_and_fetch" هشدار میدهد. معناشناسی (semantics) این توابع در GCC 4.4 تغییر کرده است.
- -Wtrivial-auto-var-init
- زمانی که "-ftrivial-auto-var-init" نتواند متغیر خودکار (automatic variable) را مقداردهی اولیه کند، هشدار میدهد. یک وضعیت متداول، متغیر خودکاری است که بین عبارت کنترلی و نخستین برچسب 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 (اما نه
برای C++)
مستلزم
-Wunused-const-variable=1 است.
این هشدار
توسط -Wall
فعال
میشود.
برای نادیده گرفتن این هشدار، از صفت "unused" استفاده کنید.
- -Wunused-const-variable
- -Wunused-const-variable=n
- هر زمان که
یک متغیر static
ثابت (const)،
صرفنظر از
اعلان آن،
استفاده
نشده باشد
هشدار
میدهد.
برای نادیده گرفتن این هشدار، از صفت "unused" استفاده کنید.
- -Wunused-const-variable=1
- درباره
متغیرهای static
const
استفادهنشده
که در واحد
ترجمه اصلی
تعریف
شدهاند
هشدار
میدهد،
اما درباره
متغیرهای static
const
اعلانشده
در
سرآیندهای
گنجاندهشده
(included) هشدار
نمیدهد.
گزینه -Wunused-const-variable=1 در C توسط -Wunused-variable یا -Wunused فعال میشود، اما برای C++ خیر. در C این اعلان باعث تخصیص حافظه برای متغیر میشود، اما در C++ این مورد خطا نیست زیرا متغیرهای const جایگزین "#define"ها میشوند.
- -Wunused-const-variable=2
- این سطح هشدار، درباره متغیرهای static ثابتِ استفادهنشده در فایلهای سرآیند (به استثنای سرآیندهای سیستم) نیز هشدار میدهد. این سطح معادل شکل کوتاه -Wunused-const-variable است. این سطح باید به صراحت هم در C و هم در C++ درخواست شود زیرا ممکن است پاکسازی تمام سرآیندهای گنجاندهشده دشوار باشد.
- -Wunused-value
- هر زمان که
یک دستور،
نتیجهای
را محاسبه
کند که به
صراحت
استفاده
نمیشود
هشدار
میدهد.
برای
نادیده
گرفتن این
هشدار،
عبارت
استفادهنشده
را به "void"
نوعگردانی
(cast) کنید. این
شامل یک
عبارت-دستور
یا سمت چپ
یک عبارت
کاما بدون
اثرات
جانبی
میشود. به
عنوان
مثال،
عبارتی
مانند
"x[i,j]"
باعث ایجاد
هشدار
میشود، در
حالی که
"x[(void)i,j]"
هشداری
تولید
نمیکند.
این هشدار توسط -Wall فعال میشود.
- -Wunused
- ترکیب تمام
گزینههای
-Wunused بالا، به
جز مواردی
که طبق
مستندات
باید
صراحتاً
مشخص شوند.
برای دریافت هشدار درباره پارامتر استفادهنشده تابع، باید یا -Wextra -Wunused را مشخص کنید (توجه داشته باشید که -Wall مستلزم -Wunused است)، یا به طور جداگانه -Wunused-parameter و/یا -Wunused-but-set-parameter را مشخص نمایید.
گزینه -Wunused به جای -Wunused-const-variable، تنها -Wunused-const-variable=1 را فعال میکند، و آن هم فقط برای C است و نه C++.
- -Wuse-after-free (تنها در C، Objective-C، C++ و Objective-C++)
- -Wuse-after-free=n
- درباره استفاده از اشارهگرها به اشیاء به صورت پویا تخصیصیافته که با فراخوانی یک تابع آزادسازی حافظه، وضعیت آنها نامعین (indeterminate) شده است هشدار میدهد. این هشدار در تمامی سطوح بهینهسازی فعال است اما ممکن است با بهینهسازی نتایج متفاوتی نسبت به بدون بهینهسازی حاصل کند. -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
- در سطح ۳،
این هشدار
همچنین
استفاده از
اشارهگرهای
نامعین را
در عبارات
برابری
تشخیص
میدهد.
تمام
استفادهها
از
اشارهگرهای
نامعین
تعریفنشده
(undefined) هستند،
اما
آزمونهای
برابری
گاهی پس از
فراخوانی
"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)
شود، هشدار
میدهد. این
هشدار
زمانی رخ
نمیدهد که
یک شیء
کلاسی به یک
نوع
غیرمرجع (non-reference)
تبدیل شود،
زیرا این
روشی برای
ایجاد یک
شیء موقت
است:
struct S { }; void g (S&&); void f (S&& arg) { g (S(arg)); // make arg prvalue so that it can bind to S&& } - -Wuninitialized
- اگر شیئی با
طول دورهٔ
ذخیرهسازی
خودکار یا
تخصیصیافته،
بدون اینکه
مقداردهی
اولیه شده
باشد
استفاده
شود، هشدار
میدهد. در
C++، همچنین
اگر یک مرجع
غیرایستا
یا یک عضو
غیرایستای
"const" در
کلاسی بدون
سازنده
ظاهر شود،
هشدار
میدهد.
علاوه بر این، ارسال یک اشارهگر (یا در C++، یک مرجع) به یک شیء مقداردهینشده به یک آرگومان واجد شرایط "const" در یک تابع توکار که مشخص است شیء را میخواند، نیز توسط این هشدار تشخیص داده میشود. (-Wmaybe-uninitialized برای توابع عادی صادر میشود.)
اگر میخواهید دربارهٔ کدی که از مقدار مقداردهینشدهٔ متغیر در مقداردهی اولیهٔ خودش استفاده میکند هشدار دریافت کنید، از گزینهٔ -Winit-self استفاده نمایید.
این هشدارها هم برای تکتک عناصر مقداردهینشدهٔ متغیرهای ساختار (structure)، اجتماع (union) یا آرایه و هم برای متغیرهایی که بهطور کامل مقداردهی اولیه نشدهاند رخ میدهند. آنها برای متغیرها یا عناصری که بهصورت "volatile" اعلان شدهاند اتفاق نمیافتند. از آنجا که این هشدارها به بهینهسازی وابسته هستند، متغیرها یا عناصر دقیقی که برای آنها هشدار صادر میشود به گزینههای بهینهسازی دقیق و نسخهٔ GCC مورد استفاده بستگی دارد.
توجه داشته باشید که ممکن است برای متغیری که تنها برای محاسبهٔ مقداری استفاده میشود که خود آن مقدار هرگز استفاده نمیشود هشداری داده نشود، زیرا چنین محاسباتی ممکن است پیش از چاپ هشدارها توسط تحلیل جریان داده (data flow analysis) حذف شوند.
در C++، این هشدار همچنین دربارهٔ استفاده از اشیاء مقداردهینشده در فهرستهای مقداردهی اولیهٔ اعضا (member-initializer-lists) هشدار میدهد. برای نمونه، GCC در قطعهکد زیر دربارهٔ مقداردهینشده بودن "b" هشدار میدهد:
struct A { int a; int b; A() : a(b) { } }; - -Wno-invalid-memory-model
- این گزینه
هشدارها را
برای
فراخوانیهای
__atomic 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 در بسیاری از موقعیتها (موارد منفی کاذب یا false negatives) به دلیل بهینهسازیهایی که از رفتار نامعین استفادههای مقداردهینشده بهره میبرند، مانند انتشار ثابت (constant propagation)، هشداری صادر نمیکند.
این هشدارها اختیاری شدهاند زیرا ممکن است GCC نتواند تشخیص دهد چه زمانی کد با وجود اینکه به نظر دارای خطا میرسد، در واقع درست است. در اینجا نمونهای از نحوهٔ رخ دادن این وضعیت آمده است:
{ int x; switch (y) { case 1: x = 1; break; case 2: x = 4; break; case 3: x = 5; } foo (x); }اگر مقدار "y" همواره ۱، ۲ یا ۳ باشد، در این صورت "x" همواره مقداردهی اولیه شده است، اما GCC این موضوع را نمیداند. برای فرونشاندن هشدار، باید یک حالت پیشفرض (default case) با assert(0) یا کدی مشابه ارائه دهید.
این گزینه همچنین زمانی هشدار میدهد که یک متغیر خودکارِ غیر-volatile ممکن است بر اثر فراخوانی "longjmp" تغییر کند. کامپایلر تنها فراخوانیهای "setjmp" را میبیند. کامپایلر نمیتواند بداند "longjmp" در کجا فراخوانی خواهد شد؛ در واقع، یک مدیر سیگنال (signal handler) میتواند آن را در هر نقطهای از کد فراخوانی کند. در نتیجه، ممکن است حتی زمانی که در واقع هیچ مشکلی وجود ندارد نیز هشدار دریافت کنید، زیرا "longjmp" در عمل نمیتواند در نقطهای که باعث مشکل میشود فراخوانی شود.
اگر تمام توابع مورد استفاده را که هرگز بازنمیگردند بهصورت "noreturn" اعلان کنید، میتوان از برخی هشدارهای کاذب جلوگیری کرد.
این هشدار توسط -Wall یا -Wextra فعال میشود.
- -Wunknown-pragmas
- هنگامی که با یک دایرکتیو "#pragma" مواجه شود که توسط GCC شناختهشده نیست، هشدار میدهد. اگر از این گزینهٔ خط فرمان استفاده شود، هشدارها حتی برای عملیاختههای (pragmaهای) ناشناخته در فایلهای سرآیند سیستمی نیز صادر میشوند. در صورتی که هشدارها فقط توسط گزینهٔ خط فرمان -Wall فعال شده باشند، چنین وضعیتی رخ نخواهد داد.
- -Wno-pragmas
- دربارهٔ استفادههای نادرست از pragmaها، مانند پارامترهای نادرست، نحو نامعتبر یا تداخل میان آنها هشدار نده. همچنین -Wunknown-pragmas را ببینید.
- -Wno-pragma-once-outside-header
- زمانی که "#pragma once" در فایلی استفاده میشود که فایل سرآیند نیست (مانند یک فایل اصلی)، هشدار نده.
- -Wno-prio-ctor-dtor
- اگر اولویتی بین 0 تا 100 برای سازنده یا ویرانگر استفاده شود، هشدار نده. استفاده از صفتهای سازنده و ویرانگر به شما این امکان را میدهد که برای کنترل ترتیب اجرای آنها پیش از فراخوانی "main" یا پس از بازگشت از آن، یک اولویت تعیین کنید. مقادیر اولویت باید بزرگتر از 100 باشند، زیرا کامپایلر مقادیر اولویت بین 0--100 را برای پیادهسازی رزرو میکند.
- -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 همچنان کد را خراب میکند، زیرا منفی کاذب بسیار کمی دارد. با این حال، موارد مثبت کاذب زیادی دارد. برای تمام تبدیلهای اشارهگر بین انواع احتمالاً ناسازگار، حتی اگر هرگز ارجاعزدایی نشوند، هشدار میدهد. تنها در بخش جلویی (front end) اجرا میشود.
سطح ۲: تهاجمی، سریع، نه چندان دقیق. ممکن است همچنان مثبت کاذبهای زیادی داشته باشد (البته نه به اندازه سطح ۱)، و منفی کاذبهای اندک (اما احتمالاً بیشتر از سطح ۱). برخلاف سطح ۱، تنها زمانی هشدار میدهد که از متغیری آدرس گرفته شود. درباره انواع ناقص (incomplete types) هشدار میدهد. تنها در front end اجرا میشود.
سطح ۳ (پیشفرض برای -Wstrict-aliasing): باید مثبت کاذبهای بسیار کم و منفی کاذبهای اندکی داشته باشد. هنگام فعال بودن بهینهسازی، کمی کندتر از سطوح ۱ یا ۲ است. الگوی رایج pun+dereference را در front end مدیریت میکند: "*(int*)&some_float". اگر بهینهسازی فعال باشد، در بخش پشتی (back end) نیز اجرا میشود، جایی که با موارد چنددستوری با استفاده از اطلاعات حساس به جریان اشاره به (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
- برای
کدهایی که
میتوان به
صورت ایستا
تشخیص داد
باعث سرریز
بافر (buffer overflow) یا
سرریز
حافظه
میشوند
هشدار
میدهد،
مانند
فراخوانیهای
"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 از «بررسی اندازه شیء نوع یک» برای تعیین اندازهٔ اشیاء مقصد استفاده میکند. در این تنظیم، گزینه در مورد سرریزها هنگام نوشتن در اعضای بزرگترین اشیاء کاملی که اندازهٔ دقیق آنها مشخص است هشدار میدهد. با این حال، برای نوشتن بیش از حد در اعضای مشابه از اشیاء ناشناختهای که با اشارهگر به آنها ارجاع داده شده است هشداری نمیدهد، زیرا ممکن است به آرایههایی شامل تعداد نامشخصی از عناصر اشاره کنند. این تنظیم، حالت پیشفرض این گزینه است.
- -Wstringop-overflow=3
- گزینهٔ -Wstringop-overflow=3 از «بررسی اندازه شیء نوع دو» برای تعیین اندازهٔ اشیاء مقصد استفاده میکند. در این تنظیم، گزینه در مورد سرریز شدن از کوچکترین شیء یا عضو داده هشدار میدهد. این سختگیرانهترین تنظیم این گزینه است که ممکن است به صدور هشدار برای کدهای امن منجر شود.
- -Wstringop-overflow=4
- گزینهٔ -Wstringop-overflow=4 از «بررسی اندازه شیء نوع سه» برای تعیین اندازهٔ اشیاء مقصد استفاده میکند. در این تنظیم، گزینه دربارهٔ سرریز هر عضوی از اعضای داده هشدار میدهد، و هنگامی که مقصد یکی از چند شیء باشد، از اندازهٔ بزرگترین آنها برای تصمیمگیری در مورد صدور هشدار استفاده میکند. مشابه -Wstringop-overflow=3، این تنظیمِ گزینه نیز ممکن است موجب صدور هشدار برای کدهای بیخطر شود.
- -Wno-stringop-overread
- دربارهٔ
فراخوانی
توابع
دستکاری
رشته مانند
"memchr" یا
"strcpy" که
مشخص شده
است فراتر
از انتهای
دنبالهٔ
مبدأ
میخوانند،
هشدار
میدهد.
گزینهٔ -Wstringop-overread بهطور پیشفرض فعال است.
- -Wno-stringop-truncation
- برای
فراخوانی
توابع
محدودشدهٔ
دستکاری
رشته مانند
"strncat"،
"strncpy" و
"stpncpy" که
ممکن است
رشتهٔ
کپیشده را
کوتاه کرده
یا مقصد را
بدون تغییر
رها کنند،
هشدار ندهد.
در مثال زیر، فراخوانی "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") اگر نتواند اثبات کند که تابع بهطور عادی بازمیگردد. یک تابع در صورتی بهطور عادی بازمیگردد که فاقد حلقهٔ نامحدود باشد و با پرتاب استثنا (throwing)، فراخوانی "abort" یا به دام افتادن (trapping) بهطور غیرعادی پایان نپذیرد. این تحلیل به گزینهٔ -fipa-pure-const نیاز دارد که بهطور پیشفرض در -O و سطوح بالاتر فعال است. سطوح بالاتر بهینهسازی، دقت این تحلیل را بهبود میبخشند.
- -Wsuggest-attribute=format
- -Wmissing-format-attribute
- دربارهٔ
اشارهگرهای
تابعی که
ممکن است
نامزد
دریافت
صفتهای
"format"
باشند
هشدار
میدهد.
توجه داشته
باشید که
اینها
صرفاً
نامزدهای
احتمالی
هستند و نه
قطعی. GCC حدس
میزند
اشارهگرهای
تابعیِ
دارای صفت
"format" که
در انتساب،
مقداردهی
اولیه،
ارسال
پارامتر یا
عبارتهای
بازگشت (return) به
کار
رفتهاند،
باید دارای
یک صفت
"format"
متناظر در
نوع حاصل
باشند. به
این معنا که
سمت چپ
انتساب یا
مقداردهی
اولیه، نوع
متغیرِ
پارامتر،
یا نوع
بازگشتی
تابع
دربرگیرنده
به ترتیب
باید صفت
"format" را
نیز داشته
باشند تا از
هشدار
اجتناب شود.
همچنین GCC دربارهٔ تعاریف توابعی که ممکن است نامزد صفتهای "format" باشند هشدار میدهد. مجدداً، اینها تنها نامزدهای احتمالی هستند. GCC حدس میزند که صفتهای "format" ممکن است برای هر تابعی که تابعی مانند "vprintf" یا "vscanf" را فراخوانی میکند مناسب باشد، اما این امر ممکن است همیشه برقرار نباشد، و ممکن است برخی از توابعی که صفتهای "format" برای آنها مناسب است شناسایی نشوند.
- -Wsuggest-attribute=cold
- دربارهٔ توابعی که ممکن است نامزد صفت "cold" باشند هشدار میدهد. این قابلیت بر پایهٔ تشخیص ایستا بوده و بهطور کلی تنها در مورد توابعی هشدار میدهد که همیشه به فراخوانی یک تابع "cold" دیگر منجر میشوند، مانند توابع پوششی (wrappers) برای "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
- زمانی که تجهیز کردن پروفایلسازی درخواست شده باشد، اما نتوان آن را روی تابع خاصی اعمال کرد، هشدار میدهد.
- -Walloca-larger-than=byte-size
- این گزینه
در صورت
فراخوانی
"alloca" با
یک آرگومان
عدد صحیح که
مقدار آن یا
صفر است و
یا توسط یک
گزارهٔ
کنترلی که
مقدار آن را
حداکثر به
byte-size محدود
کند مهار
نشده است،
هشدار
میدهد.
همچنین
برای
فراخوانیهایی
به "alloca"
که مقدار
کران در
آنها
نامشخص است
هشدار
میدهد.
آرگومانهای
از نوع غیر
عدد صحیح،
حتی اگر به
نظر برسد که
در محدودهٔ
مورد
انتظار
محدود
شدهاند،
نامحدود در
نظر گرفته
میشوند.
به عنوان مثال، یک حالت مقید از "alloca" میتواند به شکل زیر باشد:
void func (size_t n) { void *p; if (n <= 1000) p = alloca (n); else p = malloc (n); f (p); }در مثال بالا، ارسال "-Walloca-larger-than=1000" هیچ هشداری ایجاد نمیکند زیرا مشخص است فراخوانی "alloca" حداکثر ۱۰۰۰ بایت است. با این حال، اگر "-Walloca-larger-than=500" فرستاده میشد، کامپایلر یک هشدار صادر میکرد.
از سوی دیگر، استفادههای نامقید مواردی از استفاده از "alloca" بدون گزارهٔ کنترلی جهت محدود کردن آرگومان صحیح آن هستند. برای مثال:
void func () { void *p = alloca (n); f (p); }اگر "-Walloca-larger-than=500" فرستاده شود، کد بالا موجب صدور یک هشدار میشود، اما این بار به دلیل عدم وجود بررسی محدوده.
توجه داشته باشید که حتی کدی به ظاهر درست که شامل اعداد صحیح علامتدار است نیز میتواند موجب هشدار شود:
void func (signed int n) { if (n < 500) { p = alloca (n); f (p); } }در مثال بالا، n میتواند منفی باشد، که سبب میشود آرگومانی بزرگتر از حد انتظار بهطور ضمنی در فراخوانی "alloca" تبدیل نوع شود.
این گزینه همچنین زمانی که "alloca" درون یک حلقه استفاده شود هشدار میدهد.
-Walloca-larger-than=PTRDIFF_MAX بهطور پیشفرض فعال است اما معمولاً تنها زمانی مؤثر است که -ftree-vrp فعال باشد (پیشفرض برای -O2 و بالاتر).
همچنین ببینید: -Wvla-larger-than=byte-size.
- -Wno-alloca-larger-than
- هشدارهای -Walloca-larger-than= را غیرفعال میکند. این گزینه معادل -Walloca-larger-than=SIZE_MAX یا بزرگتر است.
- -Warith-conversion
- درباره
تبدیلهای
ضمنی ناشی
از عملیات
حسابی
هشدار
میدهد،
حتی زمانی
که تبدیل
عملوندها
به همان نوع
نتواند
مقادیر
آنها را
تغییر دهد.
این گزینه
بر
هشدارهای
-Wconversion، -Wfloat-conversion و
-Wsign-conversion تأثیر
میگذارد.
void f (char c, int i) { c = c + i; // warns with B<-Wconversion> c = c + 1; // only warns with B<-Warith-conversion> } - -Warray-bounds
- -Warray-bounds=n
- درباره
اندیسها
یا
آفستهای
خارج از
محدوده در
آرایهها
هشدار
میدهد. این
هشدار توسط
-Wall فعال
میشود. این
گزینه
هنگامی که
-ftree-vrp فعال
باشد
مؤثرتر است
(پیشفرض
برای -O2 و
بالاتر)،
اما
زیرمجموعهای
از موارد
حتی بدون
بهینهسازی
نیز صادر
میشوند.
بهطور پیشفرض، آرایهٔ پایانی یک ساختار توسط -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
- این سطح هشدار همچنین درباره نتایج میانی محاسبات اشارهگر که ممکن است مقادیر خارج از محدوده تولید کنند هشدار میدهد. این سطح هشدار ممکن است تعداد بیشتری مثبت کاذب ایجاد کند و بهطور پیشفرض غیرفعال است.
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]
- درباره
نویسههای
کنترلی
دوجهته
احتمالاً
گمراهکننده
در 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 فراخوانی شوند، هشدار میدهد. چنین فراخوانیهایی ممکن است مقادیر نامعین برگردانند یا باعث خرابی برنامه شوند. این هشدار در -Wall گنجانده شده است.
- -Wno-discarded-qualifiers (فقط C و Objective-C)
- در صورت نادیده گرفته شدن توصیفکنندههای نوع روی اشارهگرها، هشدار نمیدهد. به طور معمول، کامپایلر زمانی که یک متغیر "const char *" به تابعی ارسال شود که پارامتری از نوع "char *" میپذیرد، هشدار صادر میکند. از این گزینه میتوان برای فرونشاندن چنین هشداری استفاده کرد.
- -Wno-discarded-array-qualifiers (فقط C و Objective-C)
- اگر توصیفکنندههای نوع در آرایههایی که هدف اشارهگر هستند نادیده گرفته شوند، هشدار نمیدهد. به طور معمول، کامپایلر اگر یک متغیر "const int (*)[]" به تابعی ارسال شود که پارامتری از نوع "int (*)[]" میپذیرد، هشدار میدهد. از این گزینه میتوان برای فرونشاندن چنین هشداری استفاده کرد.
- -Wno-incompatible-pointer-types (فقط C و Objective-C)
- هنگامی که
تبدیلی بین
اشارهگرهایی
با انواع
ناسازگار
صورت
میگیرد،
هشدار
نمیدهد.
این هشدار
برای
مواردی است
که با -Wno-pointer-sign
پوشش داده
نمیشوند؛
گزینهای
که برای
انتساب یا
ارسال
آرگومان
اشارهگر
با
علامتداری
(signedness) متفاوت،
هشدار
میدهد.
به طور پیشفرض، در C99 و گویشهای جدیدتر C، کامپایلر GCC با این موضوع به عنوان یک خطا برخورد میکند. این خطا میتواند با استفاده از -fpermissive (همراه با برخی خطاهای دیگر)، یا برای این خطا به تنهایی با -Wno-error=incompatible-pointer-types به یک هشدار تنزل داده شود.
این هشدار توسط -pedantic-errors به یک خطا ارتقا مییابد.
- -Wno-int-conversion (فقط C و Objective-C)
- درباره
تبدیلهای
ناسازگار
عدد صحیح به
اشارهگر و
اشارهگر
به عدد صحیح
هشدار
نمیدهد.
این هشدار
مربوط به
تبدیلهای
ضمنی است؛
برای
تبدیلهای
صریح
میتوان از
هشدارهای
-Wno-int-to-pointer-cast و -Wno-pointer-to-int-cast
استفاده
کرد.
به طور پیشفرض، در C99 و گویشهای جدیدتر C، کامپایلر GCC با این موضوع به عنوان یک خطا برخورد میکند. این خطا میتواند با استفاده از -fpermissive (همراه با برخی خطاهای دیگر)، یا برای این خطا به تنهایی با -Wno-error=int-conversion به یک هشدار تنزل داده شود.
این هشدار توسط -pedantic-errors به یک خطا ارتقا مییابد.
- -Wzero-as-null-pointer-constant
- هنگامی که از لفظ 0 به عنوان ثابت اشارهگر تهی استفاده شود، هشدار میدهد.
- -Wzero-length-bounds
- درباره
دسترسی به
عناصر
اعضای
آرایهای
با طول صفر
که ممکن است
با سایر
اعضای همان
شیء
همپوشانی
داشته
باشند،
هشدار
میدهد.
اعلان
آرایههای
با طول صفر
داخلی
توصیه
نمیشود
زیرا
دسترسی به
آنها
تعریفنشده
است.
برای مثال، دو ذخیرهسازی اول در تابع "bad" گزارش میشوند، زیرا عناصر آرایه با اعضای بعدی "b" و "c" همپوشانی دارند. ذخیرهسازی سوم توسط -Warray-bounds گزارش میشود، زیرا فراتر از مرزهای شیء دربرگیرنده است.
struct X { int a[0]; int b, c; }; struct X x; void bad (void) { x.a[0] = 0; // -Wzero-length-bounds x.a[1] = 1; // -Wzero-length-bounds x.a[2] = 2; // -Warray-bounds }گزینه -Wzero-length-bounds توسط -Warray-bounds فعال میشود.
- -Wno-div-by-zero
- درباره تقسیم عدد صحیح بر صفر در زمان کامپایل هشدار نمیدهد. درباره تقسیم ممیز شناور بر صفر هشداری داده نمیشود، چرا که میتواند روشی معتبر برای به دست آوردن بینهایتها و مقادیر NaN باشد.
- -Wsystem-headers
- پیامهای هشدار را برای ساختارهای موجود در فایلهای سرآیند سیستم چاپ میکند. هشدارهای ناشی از سرآیندهای سیستم معمولاً نادیده گرفته میشوند، با این فرض که معمولاً نشاندهنده مشکلات واقعی نبوده و صرفاً خواندن خروجی کامپایلر را دشوارتر میسازند. استفاده از این گزینه خط فرمان به GCC میگوید هشدارهای سرآیندهای سیستم را طوری منتشر کند که گویی در کد کاربر رخ دادهاند. با این حال، توجه داشته باشید که استفاده از -Wall در ترکیب با این گزینه، درباره پراگماهای ناشناخته در سرآیندهای سیستم هشدار نمیدهد---برای آن، باید -Wunknown-pragmas نیز استفاده شود.
- -Wtautological-compare
- اگر یک
مقایسه با
خود همواره
به درست یا
نادرست
ارزیابی
شود، هشدار
میدهد. این
هشدار
اشتباهات
مختلفی را
شناسایی
میکند؛
مانند:
int i = 1; ... if (i > i) { ... }این هشدار همچنین درباره مقایسههای بیتی که همواره به درست یا نادرست ارزیابی میشوند نیز هشدار میدهد؛ برای نمونه:
if ((a & 16) == 10) { ... }همواره نادرست (false) خواهد بود.
این هشدار توسط -Wall فعال میشود.
- -Wtrailing-whitespace
- -Wtrailing-whitespace=kind
- درباره فاصلههای خالی انتهایی در انتهای خطوط، از جمله درون کامنتها، اما به استثنای فاصلههای خالی انتهایی در رشتههای لفظی خام، هشدار میدهد. "-Wtrailing-whitespace" معادل "-Wtrailing-whitespace=blanks" است و فقط درباره نویسههای فاصله و تب افقی انتهایی هشدار میدهد. "-Wtrailing-whitespace=any" درباره آنها یا نویسههای انتهایی پرش صفحه (form feed) یا تب عمودی هشدار میدهد. "-Wno-trailing-whitespace" یا "-Wtrailing-whitespace=none" این هشدار را غیرفعال میکند که وضعیت پیشفرض است. این یک هشدار مربوط به سبک کدنویسی است.
- -Wleading-whitespace=kind
- درباره ایرادات سبکی در فاصلههای خالی ابتدای خط هشدار میدهد، اما نه درباره مقدار تورفتگی. برخی پروژهها از سبکهای کدنویسی استفاده میکنند که در آن فقط از فاصلهها برای تورفتگی استفاده میشود، دیگران فقط از تبها استفاده میکنند، و دیگران از صفر یا چند تب (برای مضارب "-ftabstop=n") و به دنبال آن صفر یا کمتر از n فاصله استفاده میکنند. هیچ هشداری روی خطوطی که صرفاً شامل نویسههای فاصله خالی هستند صادر نمیشود (اگرچه ممکن است هشدار "-Wtrailing-whitespace=" صادر شود)، و هیچ هشداری درون رشتههای لفظی خام داده نمیشود. همچنین برای فاصلههای خالی ابتدای خط درون کامنتهای چندخطی، هشدار صادر میشود. "-Wleading-whitespace=spaces" برای پروژههایی که میخواهند تورفتگی را فقط با فاصله انجام دهند، درباره هر فاصله خالی ابتدای خط به غیر از فاصلهها هشدار میدهد. "-Wleading-whitespace=tabs" برای پروژههایی که میخواهند تورفتگی را فقط با تبهای افقی انجام دهند، درباره هر فاصله خالی ابتدای خط به غیر از تبهای افقی هشدار میدهد. "-Wleading-whitespace=blanks" درباره فاصلههای خالی ابتدای خط به غیر از فاصلهها و تبهای افقی، یا درباره تب افقی پس از یک فاصله در فاصلههای خالی ابتدای خط، یا درباره n یا تعداد بیشتری فاصله متوالی در فاصلههای خالی ابتدای خط (که در آن n آرگومان "-ftabstop=n" است و به طور پیشفرض 8 میباشد) هشدار میدهد. "-Wleading-whitespace=none" این هشدار را غیرفعال میکند که وضعیت پیشفرض است. این یک هشدار مربوط به سبک کدنویسی است.
- -Wtrampolines
- درباره ترامپولینهای ایجادشده برای اشارهگرها به توابع تو در تو هشدار میدهد. یک ترامپولین، قطعه کوچکی از داده یا کد است که در زمان اجرا روی پشته ساخته میشود، هنگامی که آدرس یک تابع تو در تو گرفته شده باشد، و برای فراخوانی غیرمستقیم تابع تو در تو استفاده میگردد. برای برخی از مقصدهای کامپایل، این ساختار تنها از داده تشکیل شده و بنابراین به رفتار خاصی نیاز ندارد. اما برای بیشتر مقصدها، از کد تشکیل شده و بنابراین نیازمند آن است که پشته قابل اجرا (executable) باشد تا برنامه به درستی کار کند.
- -Wfloat-equal
- اگر مقادیر
ممیز شناور
در
مقایسههای
برابری
استفاده
شوند،
هشدار
میدهد.
ایده پشت این هشدار آن است که گاهی اوقات (برای برنامهنویس) راحتتر است که مقادیر ممیز شناور را به عنوان تقریبهایی از اعداد حقیقی با دقت بینهایت در نظر بگیرد. اگر چنین کاری انجام میدهید، باید (از طریق تحلیل کد یا روشی دیگر) حداکثر خطای ممکن یا محتملی را که این محاسبه ایجاد میکند محاسبه نمایید و هنگام انجام مقایسهها آن را در نظر بگیرید (و همچنین هنگام تولید خروجی، اما آن مسئله دیگری است). به طور خاص، به جای بررسی برابری، باید بررسی کنید که آیا دو مقدار دارای بازههای همپوشان هستند یا خیر؛ و این کار با عملگرهای رابطهای انجام میشود، بنابراین مقایسههای برابری احتمالاً اشتباه هستند.
- -Wtraditional (فقط C و Objective-C)
- درباره ساختارهای خاصی که در C سنتی و ISO C رفتار متفاوتی دارند، هشدار میدهد. همچنین درباره ساختارهای ISO C که در C سنتی هیچ معادلی ندارند، و/یا ساختارهای مسئلهداری که باید از آنها اجتناب شود، هشدار میدهد.
- پارامترهای ماکرو که درون رشتههای لفظی در بدنه ماکرو ظاهر میشوند. در 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).
- تداخل شناسهها با برچسبها (labels). C سنتی فاقد یک فضاینام جداگانه برای برچسبها است.
- مقداردهی اولیه اجتماعات (unions). اگر مقداردهنده اولیه صفر باشد، از هشدار صرفنظر میشود. این کار با این فرض انجام میشود که مقداردهنده اولیه صفر در کد کاربر مشروط به مثلاً "__STDC__" قرار گرفته تا از هشدارهای مقداردهنده اولیه جاافتاده جلوگیری شود و در حالت C سنتی به مقداردهی اولیه پیشفرض به صفر متکی است.
- تبدیلها توسط پیشنمونهها (prototypes) بین مقادیر نقطه ثابت/ممیز شناور و برعکس. نبود این پیشنمونهها هنگام کامپایل با C سنتی باعث بروز مشکلات جدی میشود. این زیرمجموعهای از هشدارهای تبدیل ممکن است؛ برای مجموعه کامل از -Wtraditional-conversion استفاده کنید.
- استفاده از تعاریف تابع به سبک ISO C. این هشدار عمداً برای اعلانهای پیشنمونه یا توابع با تعداد آرگومان متغیر صادر نمیشود زیرا این ویژگیهای ISO C هنگام استفاده از ماکروهای سازگاری با C سنتی در libiberty یعنی "PARAMS" و "VPARAMS" در کد شما ظاهر میشوند. این هشدار همچنین برای توابع تو در تو نادیده گرفته میشود، زیرا آن ویژگی در حال حاضر یک افزونه GCC است و بنابراین ربطی به سازگاری با C سنتی ندارد.
- -Wtraditional-conversion (تنها C و Objective-C)
- هشدار میدهد اگر یک پیشنمونه باعث تبدیل نوعی شود که با آنچه برای همان آرگومان در غیاب یک پیشنمونه رخ میداد متفاوت باشد. این شامل تبدیلهای نقطه ثابت به شناور و برعکس، و تبدیلهایی است که پهنا یا علامتداری یک آرگومان نقطه ثابت را تغییر میدهند، مگر زمانی که همانند ارتقای پیشفرض باشد.
- -Wdeclaration-after-statement (تنها C و Objective-C)
- هشدار
میدهد
زمانی که
اعلانی پس
از یک عبارت
در یک بلوک
یافت شود.
این ساختار
که از C++
شناخته شده
است، با ISO C99
معرفی شد و
به طور
پیشفرض در
GCC مجاز است.
توسط ISO C90
پشتیبانی
نمیشود.
این هشدار با -pedantic-errors به یک خطا ارتقا مییابد.
- -Wshadow
- هشدار میدهد هر زمان که یک متغیر محلی یا اعلان نوع، متغیر، پارامتر، نوع، عضو کلاس (در C++)، یا متغیر نمونه (در Objective-C) دیگری را سایهاندازی (shadow) کند، یا هر زمان که یک تابع توکار سایهاندازی شود. توجه داشته باشید که در C++، اگر یک متغیر محلی یک typedef صریح را سایهاندازی کند، کامپایلر هشدار میدهد، اما اگر یک struct/class/enum را سایهاندازی کند، خیر. اگر این هشدار فعال باشد، شامل تمام موارد سایهاندازی محلی نیز میشود. این بدان معناست که -Wno-shadow=local و -Wno-shadow=compatible-local در صورت استفاده از -Wshadow نادیده گرفته میشوند. همانند -Wshadow=global است.
- -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
- هشدار میدهد اگر اندازه یک قاب تابع از 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"، آرایههای با طول متغیر، یا ساختارهای مرتبط، هنگام تصمیمگیری برای صدور هشدار توسط کامپایلر لحاظ میشود.
پیام ارائهشده مطابق با خروجی -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
- دربارهٔ هر
چیزی که به
«اندازهٔ»
یک نوع تابع
یا "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
- اگر یک مقایسه به دلیل محدودهٔ محدود نوع داده همیشه درست یا همیشه نادرست باشد، هشدار میدهد، اما برای عبارتهای ثابت هشداری صادر نمیکند. برای مثال، اگر یک متغیر بدون علامت با "<" یا ">=" با صفر مقایسه شود، هشدار میدهد. این هشدار توسط -Wextra نیز فعال میشود.
- -Wabsolute-value (فقط C و Objective-C)
- هنگام فراخوانی توابع استانداردی که قدر مطلق یک آرگومان را محاسبه میکنند، در صورتی که تابع استاندارد مناسبتری در دسترس باشد، هشدار میدهد. برای مثال، فراخوانی abs(3.14) باعث ایجاد هشدار میشود زیرا تابع مناسب برای محاسبهٔ قدر مطلق یک آرگومان از نوع double، تابع "fabs" است. این گزینه همچنین زمانی که آرگومان در فراخوانی چنین تابعی دارای یک نوع بدون علامت باشد، هشدار میدهد. این هشدار را میتوان با یک تبدیل نوع صریح مهار کرد؛ همچنین توسط -Wextra فعال میشود.
- -Wcomment
- -Wcomments
- هر زمان که توالی شروع توضیح /* درون یک توضیح /* ظاهر شود، یا هر زمان که یک ترکیب بکاسلش-خط جدید در یک توضیح // دیده شود، هشدار میدهد. این هشدار توسط -Wall فعال میشود.
- -Wtrigraphs
- اگر
سهنویسهایها
(trigraphs) مشاهده
شوند که
ممکن است
معنای
برنامه را
تغییر
دهند،
هشدار
میدهد. در
مورد
سهنویسهایهای
درون
توضیحات
هشداری
داده
نمیشود،
مگر مواردی
که یک خط
جدید
گریزدار
تشکیل دهند.
این گزینه بهطور ضمنی توسط -Wall فعال میشود. اگر -Wall مشخص نشده باشد، این گزینه همچنان فعال است مگر اینکه trigraphs فعال باشند. برای استفاده از تبدیل سهنویسهای بدون هشدارها، در حالی که سایر هشدارهای -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)
- زمانی که فراخوانی یک تابع به یک نوع ناسازگار تبدیل شود، هشدار میدهد. برای مثال، اگر فراخوانی تابعی که یک نوع عدد صحیح برمیگرداند به یک نوع اشارهگر تبدیل شود، هشدار میدهد.
- -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 موجود هستند، هشدار میدهد. برای نمونه، دربارهٔ استفاده از ساختارها و اجتماعات بینام، توصیفکنندهٔ نوع "_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"،
استفاده از
نحو [[]] برای
صفتها،
استفاده از
نوعهای
ممیز شناور
دهدهی و
موارد
مشابه
هشدار
میدهد. این
گزینه
مستقل از
حالت
استانداردهای
فعال است.
هشدارها در
عبارتی که
پس از
"__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]"
داده
میشود تا
کپی کردن
آدرس یکی از
آنها در یک
اشارهگر
غیر-"const"
از نوع "char
*" هشداری
تولید کند.
این
هشدارها به
شما کمک
میکنند در
زمان
کامپایل
کدهایی را
بیابید که
میتوانند
برای نوشتن
درون یک
ثابت
رشتهای
تلاش کنند،
اما تنها در
صورتی که در
استفاده از
"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) به اشیایی با طول عمر ذخیرهسازی خودکار پس از پایان یافتن طول عمر آنها هشدار میدهد. این شامل متغیرهای محلی اعلانشده در بلوکهای تودرتو، لیترالهای مرکب (compound literals) و سایر اشیاء موقت بدوننام است. علاوه بر این، در مورد ذخیره کردن نشانی چنین اشیایی در اشارهگرهای درزکرده (escaped pointers) نیز هشدار میدهد. این هشدار در تمام سطوح بهینهسازی فعال است، اما ممکن است با بهینهسازی نتایج متفاوتی نسبت به حالت بدون بهینهسازی داشته باشد.
- -Wdangling-pointer=1
- در سطح ۱، هشدار فقط استفادههای بدون قید و شرط از اشارهگرهای معلق را تشخیص میدهد.
- -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;
}
در این مثال، آرایهٔ a هنگام استفاده از اشارهگر s خارج از حوزه (scope) است. از آنجا که کدی که "s" را مقداردهی میکند مشروط است، این هشدار در سطح ۲ فعال میشود.
extern void frob (const char *);
void h (char *s)
{
if (!s)
{
char a[12] = "tmpname";
s = a;
}
// warning: dangling pointer 's' to 'a' may be used
frob (s);
}
- -Wdate-time
- هنگامی که با ماکروهای "__TIME__"، "__DATE__" یا "__TIMESTAMP__" مواجه شود هشدار میدهد، زیرا ممکن است از کامپایلهای بازتولیدپذیر با تطابق دقیق بیتی جلوگیری کنند.
- -Wempty-body
- اگر یک بدنهٔ خالی در دستورهای "if"، "else" یا "do while" رخ دهد، هشدار میدهد. این هشدار همچنین با -Wextra فعال میشود.
- -Wno-endif-labels
- دربارهٔ نشانههای سرگردان (stray tokens) پس از "#else" و "#endif" هشدار نده.
- -Wenum-compare
- دربارهٔ مقایسهٔ بین مقادیر انواع شمارشی مختلف هشدار میدهد. در ++C، عدم تطابق انواع شمارشی در عبارتهای شرطی نیز تشخیص داده میشود و هشدار بهطور پیشفرض فعال است. در C این هشدار توسط -Wall فعال میشود.
- -Wenum-conversion
- هنگامی که مقداری از یک نوع شمارشی بهطور ضمنی به یک نوع شمارشی دیگر تبدیل شود، هشدار میدهد. این هشدار در C با -Wextra فعال میشود.
- -Wenum-int-mismatch (فقط C و Objective-C)
- دربارهٔ
عدم تطابق
میان یک نوع
شمارشی و یک
نوع عدد
صحیح در
اعلانها
هشدار
میدهد.
برای نمونه:
enum E { l = -1, z = 0, g = 1 }; int foo(void); enum E foo(void);در C، یک نوع شمارشی با "char"، یک نوع عدد صحیح علامتدار، یا یک نوع عدد صحیح بدون علامت سازگار است. با این حال، از آنجا که انتخاب نوع زیربناییِ یک نوع شمارشی وابسته به پیادهسازی (implementation-defined) است، چنین عدم تطابقهایی ممکن است باعث مشکلات قابلیت انتقال (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
- برای تبدیلهای ضمنی که ممکن است علامت یک مقدار عدد صحیح را تغییر دهند، مانند انتساب یک عبارت صحیح علامتدار به یک متغیر صحیح بدون علامت، هشدار میدهد. یک تبدیل صریح (explicit cast) این هشدار را بیاثر میکند. در C، این گزینه همچنین توسط -Wconversion فعال میشود.
- -Wflex-array-member-not-at-end (تنها در C و C++)
- هنگامی که
ساختاری
شامل یک عضو
آرایه
انعطافپذیر
C99 به عنوان
فیلد آخر،
در انتهای
یک ساختار
دیگر قرار
نگرفته
باشد،
هشدار
میدهد. این
هشدار برای
نمونه در
مورد کد زیر
صادر
میشود:
struct flex { int length; char data[]; }; struct mid_flex { int m; struct flex flex_data; int n; }; - -Wfloat-conversion
- برای تبدیلهای ضمنی که دقت یک مقدار حقیقی را کاهش میدهند، هشدار میدهد. این شامل تبدیل از مقادیر حقیقی به عدد صحیح، و از مقادیر حقیقی با دقت بالاتر به مقادیر با دقت پایینتر است. این گزینه همچنین توسط -Wconversion فعال میشود.
- -Wno-scalar-storage-order
- در مورد ساختارهای مشکوک مرتبط با ترتیب معکوس ذخیرهسازی اسکالر (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)" بوده است. این پیام هشدار تنها در صورتی صادر میشود که آرگومان سوم یک لیترال صفر باشد. در غیر این صورت، اگر عبارتی باشد که به صفر تقلیل یابد، یا تبدیل نوعِ صفر به نوعی دیگر باشد، احتمال جابهجا شدن اشتباهی آرگومانها بسیار کمتر است و هشداری صادر نمیشود. این هشدار توسط -Wall فعال میشود.
- -Waddress
- دربارهٔ
استفادههای
مشکوک از
عبارتهای
آدرس هشدار
میدهد. این
موارد شامل
مقایسهٔ
آدرس یک
تابع یا یک
شیء
اعلانشده
با مقدار
ثابت
اشارهگر
تهی (null pointer constant)
است، مانند:
void f (void); void g (void) { if (!f) // warning: expression evaluates to false abort (); }مقایسهٔ یک اشارهگر با یک رشتهٔ لفظی (string literal)، مانند:
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) ارزیابی میشود (نمادهای ضعیف استثنا هستند)، بنابراین استفاده از آنها در یک عبارت شرطی ممکن است نشاندهندهٔ پرانتزهای جاافتاده در فراخوانی تابع یا عدم ارجاعزدایی (dereference) در یک عبارت آرایه باشد. زیرمجموعهٔ این هشدار برای اشارهگرهای شیء میتواند با تبدیل نوع عملوند اشارهگر به یک نوع عدد صحیح مانند "intptr_t" یا "uintptr_t" نادیده گرفته شود. مقایسهها در برابر رشتههای لفظی منجر به رفتار نامشخص (unspecified behavior) شده و قابل حمل نیستند، و نشان میدهند که احتمالاً مقصود فراخوانی "strcmp" بوده است. اگر عبارت مشکوک حاصل بسط یک ماکرو باشد، این هشدار صادر نمیشود. هشدار -Waddress توسط -Wall فعال میشود.
- -Wno-address-of-packed-member
- هنگامی که آدرس یک عضو بستهبندیشده (packed member) از ساختار (struct) یا اجتماع (union) گرفته میشود (که معمولاً منجر به مقدار اشارهگر ناتراز میشود)، هشدار نمیدهد. این گزینه به طور پیشفرض فعال است.
- -Wlogical-op
- دربارهٔ
استفادههای
مشکوک از
عملگرهای
منطقی در
عبارتها
هشدار
میدهد. این
شامل
استفاده از
عملگرهای
منطقی در
بافتهایی
است که
احتمالاً
انتظار
عملگر بیتی
میرود.
همچنین
زمانی که
عملوندهای
یک عملگر
منطقی
یکسان
باشند،
هشدار
میدهد:
extern int a; if (a < 0 && a < 0) { ... } - -Wlogical-not-parentheses
- دربارهٔ
استفاده از
نقیض منطقی
(logical not) روی
عملوند سمت
چپ یک
مقایسه
هشدار
میدهد. اگر
عملوند سمت
راست یک
عبارت بولی
در نظر
گرفته شود،
این گزینه
هشدار
نمیدهد.
هدف آن
شناسایی
کدهای
مشکوکی
مانند کد
زیر است:
int a; ... if (!a > 1) { ... }با قرار دادن عملوند سمت چپ درون پرانتز میتوان از صدور این هشدار جلوگیری کرد:
if ((!a) > 1) { ... }این هشدار توسط -Wall فعال میشود..IP -Waggregate-return 4 اگر توابعی که ساختارها (structures) یا اجتماعها (unions) را بازمیگردانند تعریف یا فراخوانی شوند، هشدار میدهد. (در زبانهایی که امکان بازگرداندن آرایه وجود دارد، این مورد نیز موجب صدور هشدار میشود.)
- -Wno-aggressive-loop-optimizations
- اگر کامپایلر رفتار تعریفنشدهای را در حلقهای با تعداد تکرار ثابت تشخیص دهد، هشدار نمیدهد. گزینهٔ -Waggressive-loop-optimizations بهطور پیشفرض فعال است.
- -Wno-attributes
- اگر یک
"__attribute__"
غیرمنتظره
استفاده
شود، مانند
صفتهای (attributes)
ناشناخته،
صفتهای
تابع
اعمالشده
روی
متغیرها و
غیره،
هشدار
نمیدهد.
این گزینه
مانع از
خطاهای
مربوط به
استفادهٔ
نادرست از
صفتهای
پشتیبانیشده
نمیشود.
هشدارهای مربوط به استفادههای ناصحیح (ill-formed) از صفتهای استاندارد، با -pedantic-errors به خطا تبدیل میشوند.
علاوه بر این، با استفاده از -Wno-attributes= میتوان هشدارهای مربوط به صفتهای با حوزهٔ ناشناخته (در C++11 و C23) را نادیده گرفت. برای نمونه، -Wno-attributes=vendor::attr هشدار دربارهٔ اعلان زیر را غیرفعال میکند:
[[vendor::attr]] void f();
همچنین میتوان با استفاده از -Wno-attributes=vendor:: هشدار دربارهٔ تمام صفتها در یک فضای نام را غیرفعال کرد که از هشدار دربارهٔ هر دوی این اعلانها جلوگیری میکند:
[[vendor::safe]] void f(); [[vendor::unsafe]] void f2();
توجه داشته باشید که -Wno-attributes= به معنای اعمال -Wno-attributes نیست.
- -Wno-builtin-declaration-mismatch
- هشدار
میدهد اگر
یک تابع
توکار (built-in) با
امضای
ناسازگار
یا به صورت
یک غیرتابع
اعلان شود،
یا زمانی که
یک تابع
توکار
اعلانشده
با نوعی که
فاقد
پیشنمونه
(prototype) است با
آرگومانهایی
فراخوانی
شود که
انواع
ارتقایافتهٔ
آنها با
آنچه تابع
انتظار
دارد
مطابقت
نداشته
باشد.
هنگامی که
-Wextra مشخص شده
باشد،
همچنین در
صورتی که یک
تابع
توکارِ
آرگومانپذیر
بدون
پیشنمونه
اعلان شود،
هشدار
میدهد.
هشدار
-Wbuiltin-declaration-mismatch
بهطور
پیشفرض
فعال است.
برای
جلوگیری از
این هشدار،
سرآیند
مناسب را
درج کنید تا
پیشنمونههای
توابع
توکار وارد
حوزه شوند.
برای نمونه، فراخوانی "memset" در زیر توسط این هشدار شناسایی میشود زیرا تابع مقداری از نوع "size_t" را به عنوان آرگومان خود انتظار دارد، اما نوع 32 برابر با "int" است. با -Wextra، اعلان تابع نیز شناسایی و گزارش میشود.
extern void* memset (); void f (void *d) { memset (d, '\0', 32); } - -Wno-builtin-macro-redefined
- اگر ماکروهای توکار خاصی بازتعریف شوند، هشدار نمیدهد. این گزینه هشدارهای مربوط به بازتعریف "__TIMESTAMP__"، "__TIME__"، "__DATE__"، "__FILE__" و "__BASE_FILE__" را سرکوب میکند.
- -Wkeyword-macro
- اگر یک کلمهٔ کلیدی به عنوان ماکرو تعریف شود یا لغو تعریف گردد، هشدار میدهد. برای C++، شناسههای دارای معنای خاص یا شناسههای صفتهای استاندارد نیز بررسی و گزارش میشوند. این هشدار بهطور پیشفرض برای C++26 در صورت استفاده از "-Wpedantic" فعال است و در آن حالت یک pedwarn صادر میکند.
- -Wfree-labels (فقط C و Objective-C)
- اگر یک
برچسب (label) به
چیزی غیر از
یک دستور
اعمال شود،
یا در
انتهای یک
عبارت مرکب
(compound statement) قرار
گیرد،
هشدار
میدهد.
چنین
برچسبهایی
در C23 و
گویشهای
بعدی C مجاز
هستند و در
سایر
گویشها به
عنوان
افزونهٔ GCC
در دسترس
میباشند.
این هشدار همچنین توسط -Wc11-c23-compat فعال میشود. در صورت ساخت برای نسخهای از C پیش از C23، توسط -pedantic-errors به یک خطا تبدیل میشود.
- -Wheader-guard
- هشدار میدهد اگر یک محافظ درج چندبارهٔ معتبر در سرآیند پیشپردازنده، دارای دستور "#define" بلافاصله پس از دستور "#ifndef" یا "#if !defined" محافظ باشد که ماکرویی متفاوت از ماکروی محافظ با نامی مشابه تعریف میکند، ماکروی واقعی محافظ درج چندباره در دستور متناظر "#ifndef" در انتهای سرآیند تعریف نشده باشد، و دستور "#define" یک ماکروی شبهشیء (object-like) با تعریف خالی ایجاد کند. در چنین مواردی، اغلب یک غلط املایی ساده در نام محافظ رخ داده است؛ چه در دستور "#ifndef" یا "#if !defined" و چه در دستور بعدی "#define". این هشدار توسط -Wall فعال میشود.
- -Wstrict-prototypes (فقط C و Objective-C)
- اگر تابعی بدون مشخص کردن نوع آرگومانها اعلان یا تعریف شود، هشدار میدهد. (تعریف تابع به سبک قدیمی در صورتی که پیش از آن اعلانی حاوی نوع آرگومانها آمده باشد، بدون هشدار مجاز است.)
- -Wold-style-declaration (فقط C و Objective-C)
- دربارهٔ کاربردهای منسوخشده در یک اعلان، مطابق با استاندارد C، هشدار میدهد. برای نمونه، اگر مشخصکنندههای ردهٔ حافظه مانند "static" اولین بخش یک اعلان نباشند، هشدار میدهد. این هشدار همچنین با -Wextra فعال میشود.
- -Wold-style-definition (فقط C و Objective-C)
- اگر از تعریف تابع به سبک قدیمی استفاده شود، هشدار میدهد. این هشدار حتی در صورت وجود یک پیشنمونهٔ قبلی نیز داده میشود. تعریفی که از () استفاده میکند در حالت C23 یک تعریف به سبک قدیمی محسوب نمیشود، زیرا در این حالت معادل (void) است، اما برای استانداردهای قدیمیتر تعریفی به سبک قدیمی تلقی میشود.
- -Wmultiple-parameter-fwd-decl-lists (فقط C و Objective-C)
- اگر بیش از یک فهرست از پیشاعلانهای پارامترها در پیشنمونهٔ تابع ظاهر شود، هشدار میدهد. این هشدار همچنین با -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)
- اگر
پارامتر یک
تابع بدون
مشخصکنندهٔ
نوع در
توابع به
سبک K&R اعلان
شود، هشدار
میدهد:
void foo(bar) { }این هشدار همچنین با -Wextra فعال میشود.
- -Wno-declaration-missing-parameter-type (فقط C و Objective-C)
- اگر اعلان
یک تابع
شامل نام
پارامتر
بدون نوع
باشد،
هشدار
نمیدهد.
چنین
اعلانهای
تابعی
پیشنمونهٔ
تابع را
ارائه
نمیدهند و
مانع از
بیشتر
بررسیهای
نوع در
فراخوانی
توابع
میشوند.
این هشدار بهطور پیشفرض فعال است. در C99 و گویشهای بعدی C، با آن به عنوان یک خطا برخورد میشود. این خطا میتواند با استفاده از -fpermissive (همراه با برخی خطاهای دیگر)، یا فقط برای همین خطا با -Wno-error=declaration-missing-parameter-type، به یک هشدار تنزل یابد.
این هشدار با -pedantic-errors به یک خطا ارتقا مییابد.
- -Wmissing-prototypes (فقط C و Objective-C)
- اگر یک تابع سراسری (global) بدون اعلان پیشنمونهٔ قبلی تعریف شود، هشدار میدهد. این هشدار حتی در صورتی که خودِ تعریف یک پیشنمونه ارائه دهد نیز صادر میشود. از این گزینه برای تشخیص توابع سراسری که اعلان پیشنمونهٔ متناظری در فایل سرآیند ندارند استفاده کنید. این گزینه برای C++ معتبر نیست زیرا تمامی اعلانهای توابع در آن پیشنمونه ارائه میدهند و یک اعلان نامنطبق به جای تداخل با اعلان پیشین، یک سربارگذاری (overload) ایجاد میکند. برای تشخیص اعلانهای مفقود در C++ از -Wmissing-declarations استفاده کنید.
- -Wmissing-variable-declarations (فقط C و Objective-C)
- اگر یک متغیر سراسری بدون اعلان قبلی تعریف شود، هشدار میدهد. از این گزینه برای تشخیص متغیرهای سراسری که فاقد اعلان extern متناظر در یک فایل سرآیند هستند استفاده کنید.
- -Wmissing-declarations
- اگر یک تابع
سراسری
بدون اعلان
قبلی تعریف
شود، هشدار
میدهد. این
کار حتی اگر
خود تعریف
یک
پیشنمونه
ارائه دهد
نیز انجام
میشود. از
این گزینه
برای یافتن
توابع
سراسری که
در
فایلهای
سرآیند
اعلان
نشدهاند
استفاده
کنید. در C،
برای
توابعی که
پیشتر
اعلانهای
بدون
پیشنمونه
داشتهاند
هشداری
صادر
نمیشود؛
برای تشخیص
پیشنمونههای
مفقود از
-Wmissing-prototypes
استفاده
کنید. در C++،
برای
الگوهای
تابع (function templates)،
توابع
درونخطی (inline)
یا توابع
موجود در
فضاهای نام
ناشناس
هشداری
داده
نمیشود..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 این گزینه دربارهٔ مقداردهندهٔ اولیهٔ صفر عمومی (universal zero initializer) { 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> };در اینجا satisfied برابر با true خواهد بود اگر C<T> یک عبارت معتبر باشد، که برای همهٔ 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. }در موارد نادر ممکن است هشدارهای مثبت کاذب (false positive) ایجاد شود. برای فرونشاندن این هشدار، عبارت را درون پرانتز قرار دهید. برای نمونه، مورد زیر بهصورت یک قالب پردازش میشود، حتی در جایی که m و N اعداد صحیح هستند:
void NotATemplate (my_class t) { int N = 5; bool test = t.m < N > (0); // Treated as a template. test = (t.m < N) > (0); // Same meaning, but not treated as a template. }این هشدار را میتوان با -Wno-missing-template-keyword غیرفعال کرد.
- -Wno-multichar
- اگر یک ثابت چندنویسهای ('FOOF') استفاده شود، هشدار ندهد. معمولاً این موارد نشاندهندهٔ یک اشتباه تایپی در کد کاربر هستند، زیرا دارای مقادیر وابسته به پیادهسازی (implementation-defined) بوده و نباید در کدهای پرتابل استفاده شوند.
- -Wnormalized=[none|id|nfc|nfkc]
- در ISO C و ISO C++، دو
شناسنده (identifier)
متفاوت
محسوب
میشوند
اگر
توالیهای
متفاوتی از
نویسهها
باشند. با
این حال،
گاهی اوقات
وقتی از
نویسههای
خارج از
مجموعه
نویسههای
پایهٔ 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
- دربارهٔ استفاده از توابعی که با ویژگی (attribute) "warning" اعلان شدهاند، هشدار ندهد. بهطور پیشفرض، این هشدار فعال است. میتوان از -Wno-attribute-warning برای غیرفعال کردن هشدار یا از -Wno-error=attribute-warning برای جلوگیری از تبدیل شدن آن به خطا هنگام کامپایل با پرچم -Werror استفاده کرد.
- -Wno-deprecated
- دربارهٔ
استفاده از
ویژگیهای
منسوخشده
(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
- دربارهٔ سرریز زمان کامپایل (compile-time overflow) در عبارتهای ثابت هشدار ندهد.
- -Wno-odr
- دربارهٔ نقضهای قانون یک تعریف (One Definition Rule) در حین بهینهسازی زمان پیوند (LTO) هشدار میدهد. بهطور پیشفرض فعال است.
- -Wopenacc-parallelism
- دربارهٔ انتخابهای بالقوه زیربهینهٔ مربوط به موازیسازی در OpenACC هشدار میدهد.
- -Wno-openmp
- دربارهٔ کدهای مشکوک در OpenMP هشدار میدهد.
- -Wopenmp-simd
- اگر مدل هزینهٔ بردارساز (vectorizer cost model)، دستورالعمل simd تعیینشده توسط کاربر در OpenMP را لغو کند، هشدار میدهد. گزینهٔ -fsimd-cost-model=unlimited میتواند برای تعدیل مدل هزینه استفاده شود.
- -Woverride-init (فقط C و Objective-C)
- هشدار
میدهد اگر
هنگام
استفاده از
مقداردهندههای
اولیهٔ
تعیینشده
(designated initializers)، یک
فیلد
مقداردهیشدهٔ
بدون اثرات
جانبی
بازنویسی
(override) شود.
این هشدار در -Wextra گنجانده شده است. برای دریافت سایر هشدارهای -Wextra بدون این هشدار، از -Wextra -Wno-override-init استفاده کنید..IP "-Wno-override-init-side-effects (فقط C و Objective-C)" 4 اگر فیلدی که با اثرات جانبی مقداردهی اولیه شده است هنگام استفاده از مقداردهندههای مشخص (designated initializers) بازنویسی شود، هشدار ندهد. این هشدار بهطور پیشفرض فعال است.
- -Wpacked
- اگر به یک
ساختار
ویژگی
"packed"
داده شده
باشد، اما
ویژگی
"packed" هیچ
تأثیری بر
چیدمان یا
اندازه
ساختار
نداشته
باشد،
هشدار
میدهد.
چنین
ساختارهایی
ممکن است
بدون داشتن
فایده
چندانی
ناتراز
شوند. برای
نمونه، در
این کد
متغیر
"f.x" در
"struct bar"
ناتراز است
حتی با
اینکه خودِ
"struct bar"
ویژگی
"packed" را
ندارد:
struct foo { int x; char a, b, c, d; } __attribute__((packed)); struct bar { char z; struct foo f; }; - -Wnopacked-bitfield-compat
- نسخههای
سری ۴.۱، ۴.۲
و ۴.۳
کامپایلر 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++)
- اگر فیلدی
از ساختار
با
ترازبندی
صریحاً
مشخصشده
در یک
ساختار یا
یونیون
فشرده (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
اعلان شده
است نتواند
درونخطی
شود، هشدار
میدهد. حتی
با وجود این
گزینه،
کامپایلر
در مورد
شکست در
درونخطیسازی
توابع
اعلانشده
در
سرایندهای
سیستمی
هشدار
نمیدهد.
کامپایلر از روشهای اکتشافی (heuristics) گوناگونی برای تعیین درونخطی شدن یا نشدن یک تابع استفاده میکند. برای نمونه، کامپایلر اندازه تابع مورد نظر برای درونخطی شدن و میزان درونخطیسازی انجامشده در تابع فعلی را مد نظر قرار میدهد. بنابراین، تغییرات بهظاهر کماهمیت در برنامه مبدأ میتواند سبب ظاهر شدن یا ناپدید شدن هشدارهای تولیدشده توسط -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 هشدار میدهد. این هشدار در صورت استفاده از -finput-charset=UTF-8 در C++23 بهطور پیشفرض روشن است و با -pedantic-errors به یک خطا تبدیل میشود.
- -Wno-unicode
- شکلهای نامعتبر توالیهای گریز جداشده (delimited) یا نامگذاریشده را که به عنوان توکنهای مجزا پردازش میشوند، عیبیابی نمیکند. گزینه 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 and Objective-C++ only)
- هشدارهای
مربوط به
استفاده از
"^"،
عملگر XOR، در
مواردی که
به نظر
میرسد
منظور کد
توانرسانی
بوده است را
غیرفعال
میکند.
بهطور
خاص، این
هشدار
زمانی رخ
میدهد که
سمت چپ ثابت
دهدهی ۲ یا
۱۰ باشد و
سمت راست
نیز یک ثابت
دهدهی
باشد.
در C و C++، عملگر "^" به معنای XOR است، در حالی که در برخی زبانهای دیگر (مانند TeX و برخی نسخههای BASIC) به معنای توانرسانی است.
این هشدار را میتوان با تبدیل یکی از عملوندها به هگزادسیمال یا با کامپایل کردن از طریق -Wno-xor-used-as-pow بیصدا کرد.
- -Wdisabled-optimization
- اگر یک گام بهینهسازی درخواستی غیرفعال شده باشد، هشدار میدهد. این هشدار معمولاً نشاندهنده ایرادی در کد شما نیست؛ بلکه صرفاً نشان میدهد که بهینهسازهای GCC قادر به پردازش کارآمد کد نیستند. اغلب، مشکل این است که کد شما بسیار حجیم یا بسیار پیچیده است؛ GCC از بهینهسازی برنامههایی که خودِ فرایند بهینهسازی آنها احتمالاً زمان بیش از حدی میبرد، خودداری میکند.
- -Wpointer-sign (C and Objective-C only)
- برای ارسال
آرگومان
اشارهگر
یا انتساب
با
علامتداری
(signedness) متفاوت،
هشدار
میدهد. این
گزینه فقط
برای C و Objective-C
پشتیبانی
میشود. این
گزینه
بهطور
ضمنی توسط
-Wall و -Wpedantic فعال
میشود، و
با -Wno-pointer-sign
میتوان آن
را غیرفعال
کرد.
این هشدار توسط -pedantic-errors به یک خطا ارتقا مییابد.
- -Wstack-protector
- این گزینه تنها زمانی فعال است که -fstack-protector فعال باشد. این گزینه در مورد توابعی که در برابر کوبیدن پشته (stack smashing) محافظت نشدهاند هشدار میدهد.
- -Woverlength-strings
- در مورد
ثابتهای
رشتهای که
طولانیتر
از طول
«حداقل
بیشینه»
مشخصشده
در
استاندارد C
هستند
هشدار
میدهد.
کامپایلرهای
امروزی
عموماً
ثابتهای
رشتهای
بسیار
طولانیتر
از حداقلِ
استاندارد
را مجاز
میدانند،
اما
برنامههای
بسیار
سازگار (portable)
باید از
استفاده از
رشتههای
طولانیتر
خودداری
کنند.
این محدودیت بعد از الحاق ثابتهای رشتهای اعمال میشود و نویسه پایانی NUL را به حساب نمیآورد. در C90، این حد ۵۰۹ نویسه بود؛ در C99، به ۴۰۹۵ افزایش یافت. استاندارد C++98 یک حداقل بیشینه تجویزی را تعیین نمیکند، بنابراین رشتههای بیش از حد طولانی در C++ تشخیص داده نمیشوند.
این گزینه بهطور ضمنی توسط -Wpedantic فعال میشود، و با -Wno-overlength-strings قابل غیرفعال شدن است.
- -Wunsuffixed-float-constants (C and Objective-C only)
- برای هر ثابت ممیز شناور که پسوند ندارد، یک هشدار صادر میکند. هنگامی که همراه با -Wsystem-headers استفاده شود، درباره چنین ثابتهایی در فایلهای سرآیند سیستم هشدار میدهد. این ویژگی هنگام آمادهسازی کد برای استفاده با عملگر کاربردی ساختیافته "FLOAT_CONST_DECIMAL64" از افزونه ممیز شناور دهدهی برای C99 میتواند مفید باشد.
- -Wno-lto-type-mismatch
- در طول بهینهسازی زمان پیوند (LTO)، درباره عدم تطابق نوع در اعلانهای سراسری از واحدهای کامپایل متفاوت هشدار نمیدهد. نیازمند فعال بودن -flto است. بهطور پیشفرض فعال است.
- -Wno-designated-init (C and Objective-C only)
- هشدارهایی را که هنگام استفاده از مقداردهی اولیه مکانی (positional) برای یک ساختار علامتگذاریشده با ویژگی "designated_init" صادر میشوند، فرونشانی میکند..SS "گزینههای کنترل تحلیل ایستا (Options That Control Static Analysis)"
- -fanalyzer
- این گزینه
یک تحلیل
ایستای
جریان
برنامه را
فعال
میکند که
به دنبال
مسیرهای
میانروالی
«جالبتوجه»
درون کد
میگردد و
برای
مشکلاتِ
یافتشده
در آنها،
هشدارهایی
صادر
مینماید.
این تحلیل به مراتب پرهزینهتر و سنگینتر از سایر هشدارهای GCC است.
از نظر فنی، این ابزار یک اجرای نمادین هدایتشده با پوشش را روی کدِ در حال کامپایل انجام میدهد. این تحلیل نه صائب (sound) است و نه کامل (complete): میتواند هشدارهای مثبت کاذب و منفی کاذب داشته باشد. این ابزار برای یافتن اشکالات برنامهنویسی است، نه ابزاری برای اثبات درستی برنامه.
این تحلیلگر در این نگارش تنها برای استفاده بر روی کد 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
فعال باشد،
تحلیلگر
از روشهای
مکاشفهای
(heuristic) مختلفی
برای
ردگیری
وضعیت
حافظه
استفاده
میکند،
اما این
روشها در
مواجهه با
کدهای بیش
از حد
پیچیده
ممکن است
ناکام
بمانند.
بهطور پیشفرض، اگر عبارتها از یک حد درونی فراتر روند، تحلیل بدون هشدار ردگیری مقادیر آنها را متوقف کرده و به یک نمایش نادقیق برای چنین عبارتهایی بازمیگردد. گزینهٔ -Wanalyzer-symbol-too-complex در صورت وقوع این حالت، هشدار میدهد.
- -Wanalyzer-too-complex
- اگر -fanalyzer
فعال باشد،
تحلیلگر
از روشهای
مکاشفهای
گوناگونی
برای بررسی
جریان
کنترل و
جریان داده
در برنامه
استفاده
میکند،
اما این
روشها
ممکن است در
مواجهه با
کدهای بیش
از حد
پیچیده
شکست
بخورند.
بهطور پیشفرض، اگر کد برای کاوش کامل تحلیلگر بیش از حد پیچیده باشد و به یک حد درونی برسد، تحلیل بدون اعلام پیام متوقف میشود. گزینهٔ -Wanalyzer-too-complex در صورت وقوع این رویداد، هشدار میدهد.
- -Wno-analyzer-allocation-size
- این هشدار
نیازمند -fanalyzer
است که آن
را فعال
میکند؛
برای
غیرفعال
کردن آن، از
-Wno-analyzer-allocation-size
استفاده
کنید.
این اعلان تشخیصی برای مسیرهایی در کد هشدار میدهد که در آنها اشارهگری به یک بافر به گونهای انتساب مییابد که به بافری با اندازهای اشاره کند که مضربی از "sizeof (*pointer)" نیست.
ببینید CWE-131: Incorrect Calculation of Buffer Size ("https://cwe.mitre.org/data/definitions/131.html").
- -Wno-analyzer-deref-before-check
- این هشدار
نیازمند -fanalyzer
است که آن
را فعال
میکند؛
برای
غیرفعال
کردن آن، از
-Wno-analyzer-deref-before-check
استفاده
کنید.
این اعلان تشخیصی دربارهٔ مسیرهایی درون کد هشدار میدهد که در آنها یک اشارهگر *پس از* اینکه ارجاعزدایی (dereference) شد، برای "NULL" بررسی میشود؛ امری که نشان میدهد ممکن بوده اشارهگر NULL باشد. چنین مواردی بیانگر آن است که بررسی برای NULL یا زائد است، یا اینکه باید به قبل از ارجاعزدایی اشارهگر منتقل شود.
این اعلان تشخیصی همچنین مقادیری را که به یک آرگومان تابع نشانهگذاریشده با "__attribute__((nonnull))" ارسال میشوند، به عنوان مقادیری که به یک مقدار غیر-NULL نیاز دارند در نظر میگیرد و بنابراین در صورتی که چنین مقادیری پس از بازگشت از فراخوانی آن تابع برای "NULL" بررسی شوند، اخطار میدهد.
گزارش این اعلان تشخیصی در صورت فعال بودن هر سطحی از بهینهسازی بعید است، چرا که منطق بهینهسازی GCC معمولاً چنین بررسیهایی برای NULL را زائد دانسته و پیش از آنکه تحلیلگر آنها را «ببیند»، با بهینهسازی حذف میکند. بنابراین، هنگام تلاش برای راهاندازی این اعلان تشخیصی، بهینهسازی باید غیرفعال باشد.
- -Wno-analyzer-double-fclose
- این هشدار
نیازمند -fanalyzer
است که آن
را فعال
میکند؛
برای
غیرفعال
کردن آن، از
-Wno-analyzer-double-fclose
استفاده
کنید.
این اعلان تشخیصی دربارهٔ مسیرهایی درون کد هشدار میدهد که در آنها ممکن است "fclose" بیش از یکبار روی یک "FILE *" فراخوانی شود.
ببینید CWE-1341: Multiple Releases of Same Resource or Handle ("https://cwe.mitre.org/data/definitions/1341.html").
- -Wno-analyzer-double-free
- این هشدار
نیازمند -fanalyzer
است که آن
را فعال
میکند؛
برای
غیرفعال
کردن آن، از
-Wno-analyzer-double-free
استفاده
کنید.
این اعلان تشخیصی دربارهٔ مسیرهایی درون کد هشدار میدهد که در آنها ممکن است یک تابع آزادسازی حافظه (deallocator) بیش از یکبار روی یک اشارهگر فراخوانی شود، چه "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 استفاده کنید.
این اعلان خطایابی برای مسیرهایی در کد هشدار میدهد که در آنها یک توصیفکننده فایلِ باز نشت پیدا میکند.
رجوع کنید به CWE-775: Missing Release of File Descriptor or Handle after Effective Lifetime ("https://cwe.mitre.org/data/definitions/775.html").
- -Wno-analyzer-fd-phase-mismatch
- این هشدار
نیازمند -fanalyzer
است که آن
را فعال
میکند؛
برای
غیرفعالسازی
آن از -Wno-analyzer-fd-phase-mismatch
استفاده
کنید.
این اعلان خطایابی برای مسیرهایی در کد هشدار میدهد که در آنها عملیاتی در فاز نادرستی از چرخه حیات یک توصیفکننده فایل تلاش شده است. برای نمونه، این گزینه هنگام تلاش برای فراخوانی "accept" روی یک سوکت جریانی که هنوز "listen" با موفقیت روی آن فراخوانی نشده است، هشدار خواهد داد.
رجوع کنید به CWE-666: Operation on Resource in Wrong Phase of Lifetime ("https://cwe.mitre.org/data/definitions/666.html").
- -Wno-analyzer-fd-type-mismatch
- این هشدار
نیازمند -fanalyzer
است که آن
را فعال
میکند؛
برای
غیرفعالسازی
آن از -Wno-analyzer-fd-type-mismatch
استفاده
کنید.
این اعلان خطایابی برای مسیرهایی در کد هشدار میدهد که در آنها عملیاتی روی نوع نادرستی از توصیفکننده فایل تلاش شده است. برای نمونه، این گزینه هنگام تلاش برای استفاده از عملیاتهای سوکت روی یک توصیفکننده فایل که از طریق "open" به دست آمده است، یا هنگام تلاش برای استفاده از عملیات سوکت جریانی روی یک سوکت دیتاگرام هشدار خواهد داد.
- -Wno-analyzer-fd-use-after-close
- این هشدار
نیازمند -fanalyzer
است که آن
را فعال
میکند؛
برای
غیرفعالسازی
آن از -Wno-analyzer-fd-use-after-close
استفاده
کنید.
این اعلان خطایابی برای مسیرهایی در کد هشدار میدهد که در آنها خواندن یا نوشتن روی یک توصیفکننده فایلِ بستهشده فراخوانی میشود.
همچنین این اعلان خطایابی برای مسیرهایی در کد هشدار میدهد که در آنها تابعی با ویژگی "fd_arg (N)" یا "fd_arg_read (N)" یا "fd_arg_write (N)" با یک توصیفکننده فایل بستهشده در آرگومان ارجاعشده "N" فراخوانی شود.
- -Wno-analyzer-fd-use-without-check
- این هشدار
نیازمند -fanalyzer
است که آن
را فعال
میکند؛
برای
غیرفعالسازی
آن از
-Wno-analyzer-fd-use-without-check
استفاده
کنید.
این اعلان خطایابی برای مسیرهایی در کد هشدار میدهد که در آنها یک توصیفکننده فایل بدون بررسی معتبر بودن آن استفاده میشود.
همچنین این اعلان خطایابی برای مسیرهایی در کد هشدار میدهد که در آنها تابعی با ویژگی "fd_arg (N)" یا "fd_arg_read (N)" یا "fd_arg_write (N)" با یک توصیفکننده فایل، در آرگومان ارجاعشده "N"، بدون بررسی معتبر بودن فراخوانی شود.
- -Wno-analyzer-file-leak
- این هشدار
نیازمند -fanalyzer
است که آن
را فعال
میکند؛
برای
غیرفعالسازی
آن از -Wno-analyzer-file-leak
استفاده
کنید.
این اعلان خطایابی برای مسیرهایی در کد هشدار میدهد که در آنها یک شیء جریان "FILE *" از "<stdio.h>" نشت پیدا میکند.
رجوع کنید به CWE-775: Missing Release of File Descriptor or Handle after Effective Lifetime ("https://cwe.mitre.org/data/definitions/775.html").
- -Wno-analyzer-free-of-non-heap
- این هشدار
نیازمند -fanalyzer
است که آن
را فعال
میکند؛
برای
غیرفعالسازی
آن از -Wno-analyzer-free-of-non-heap
استفاده
کنید.
این اعلان خطایابی برای مسیرهایی در کد هشدار میدهد که در آنها "free" روی یک اشارهگر خارج از هیپ (مانند بافری روی پشته یا یک متغیر سراسری) فراخوانی میشود.
رجوع کنید به CWE-590: Free of Memory not on the Heap ("https://cwe.mitre.org/data/definitions/590.html").
- -Wno-analyzer-imprecise-fp-arithmetic
- این هشدار
نیازمند -fanalyzer
است که آن
را فعال
میکند؛
برای
غیرفعالسازی
آن از
-Wno-analyzer-imprecise-fp-arithmetic
استفاده
کنید.
این اعلان خطایابی برای مسیرهایی در کد هشدار میدهد که در آنها محاسبات ممیز شناور در مکانهایی که به محاسبات دقیق نیاز است، استفاده شدهاند. این اعلان خطایابی در حال حاضر تنها برای استفاده از عملوندهای ممیز شناور درون محاسبه اندازه تخصیص حافظه هشدار میدهد.
- -Wno-analyzer-infinite-loop
- این هشدار
نیازمند -fanalyzer
است که آن
را فعال
میکند؛
برای
غیرفعالسازی
آن از -Wno-analyzer-infinite-loop
استفاده
کنید.
این اعلان خطایابی برای مسیرهایی در کد هشدار میدهد که به نظر میرسد به یک حلقه بینهایت ختم میشوند.
به طور مشخص، تحلیلگر زمانی این هشدار را صادر میکند که حلقهای را «مشاهده کند» که در آن:
- هیچ کار قابلمشاهدهای از بیرون در داخل حلقه انجام نشود
- هیچ راهی برای خروج از حلقه وجود نداشته باشد
- تحلیلگر در سراسر حلقه به اندازه کافی از وضعیت برنامه مطمئن باشد تا بداند موارد بالا برقرار هستند
یک حالت برای صدور این هشدار زمانی است که یک مسیر اجرایی در حلقه وجود دارد که پیمودن آن مسیر در یک تکرار به این معناست که همان مسیر در تمام تکرارهای بعدی نیز پیموده خواهد شد.
برای نمونه، مورد زیر را در نظر بگیرید:
while (1)
{
char opcode = *cpu_state.pc;
switch (opcode)
{
case OPCODE_FOO:
handle_opcode_foo (&cpu_state);
break;
case OPCODE_BAR:
handle_opcode_bar (&cpu_state);
break;
}
}
تحلیلگر برای مورد بالا خطا خواهد گرفت، چرا که اگر "opcode" هیچگاه با هیچیک از موارد مطابقت نداشته باشد، دستور "switch" از حالت ضمنیِ "default" پیروی خواهد کرد، که باعث میشود بدنه حلقه با تغییر نیافتن "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").
در مواردی که تحلیلگر توانایی آن را داشته باشد، یک نمودار متنی تولید میکند که رابطه مکانی میان ناحیه حافظهای که پیشبینی شده مورد دسترسی قرار گیرد را در مقایسه با محدوده مجاز حافظه مصورسازی میکند: این که آیا همپوشانی دارند، مماس هستند، یا فاصله آنها کم یا زیاد است؛ کدامیک در حافظه جلوتر یا عقبتر است، اندازههای نسبی، جهت دسترسی (خواندن در برابر نوشتن)، و در برخی موارد، مقادیر دادههای دخیل. میتوان نمایش این نمودار را با استفاده از -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"، یک اشارهگر به متغیر محلی خودکار یا یک بافر واقع روی پشته تحویل داده میشود.
ببینید: 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 پیادهسازیشده در بخشهای ابتدایی (front ends) کامپایلر 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"، به قاب پشتهای ارجاع میدهد که دیگر وجود ندارد و به احتمال زیاد منجر به کرش نرمافزار (یا حتی عواقب بدتر) خواهد شد.
- -Wno-analyzer-tainted-allocation-size
- این هشدار
نیازمند -fanalyzer
است که آن
را فعال
میکند؛
برای
غیرفعال
کردن آن از
-Wno-analyzer-tainted-allocation-size
استفاده
کنید.
این پیام تشخیصی برای مسیرهایی در کد هشدار میدهد که در آنها مقداری که ممکن است تحت کنترل یک مهاجم باشد، بدون اعتبارسنجی و پاکسازی به عنوان اندازه یک تخصیص حافظه استفاده شده است، به طوری که مهاجم میتواند تخصیص مقداری بیش از حد بزرگ را تحمیل کرده و بهطور بالقوه باعث حمله محرومسازی از سرویس (DoS) شود.
ببینید: CWE-789: Memory Allocation with Excessive Size Value ("https://cwe.mitre.org/data/definitions/789.html").
- -Wno-analyzer-tainted-assertion
- این هشدار
نیازمند -fanalyzer
است که آن
را فعال
میکند؛
برای
غیرفعال
کردن آن از
-Wno-analyzer-tainted-assertion
استفاده
کنید.
این پیام تشخیصی برای مسیرهایی در کد هشدار میدهد که در آنها مقداری که میتواند تحت کنترل یک مهاجم باشد، بدون اعتبارسنجی اولیه به عنوان بخشی از یک شرط استفاده شده است، و آن شرط از فراخوانی تابعی که با صفت "noreturn" مشخص شده محافظت میکند (مانند تابع "__builtin_unreachable"). چنین توابعی معمولاً نشاندهنده خاتمه غیرعادی برنامه هستند، مانند گردانندههای شکست اعتبارسنجی (assertion failure handlers). برای نمونه:
assert (some_tainted_value < SOME_LIMIT);
در چنین مواردی:
- *
- هنگامی که بررسی ادعا غیرفعال است، مانند زمان تعریف "NDEBUG"، مهاجم میتواند دادههایی را تزریق کند که فرآیند را تخریب کند، زیرا این دادهها احتمالاً پیششرطی را که کد فرض کرده است نقض میکنند.
توجه داشته باشید هنگامی که بررسی ادعا غیرفعال است، ادعاها معمولاً توسط پیشپردازنده پیش از آنکه تحلیلگر فرصت «دیدن» آنها را داشته باشد حذف میشوند، بنابراین این اعلان تشخیصی تنها میتواند در ساختهایی هشدار تولید کند که بررسی ادعا در آنها فعال باشد.
برای مقاصد این هشدار، هر تابعی که با مشخصهٔ "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 برای
غیرفعال
کردن آن
استفاده
کنید.
این اعلان تشخیصی دربارهٔ مسیرهایی در کد هشدار میدهد که در آنها مقداری که میتواند تحت کنترل مهاجم باشد، بدون پاکسازی به عنوان اندیس دسترسی به یک آرایه استفاده میشود، به طوری که مهاجم میتواند یک دسترسی خارج از محدوده را تزریق کند.
ببینید 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
برای
غیرفعال
کردن آن
استفاده
کنید.
این اعلان تشخیصی دربارهٔ مسیرهایی در کد هشدار میدهد که در آنها اشارهگری مرجعزدایی میشود که به متغیری در یک قاب پشتهٔ بیاستفاده (stale stack frame) اشاره دارد.
- -Wno-analyzer-va-arg-type-mismatch
- این هشدار
نیازمند -fanalyzer
است که آن
را فعال
میکند؛ از
-Wno-analyzer-va-arg-type-mismatch برای
غیرفعال
کردن آن
استفاده
کنید.
این اعلان تشخیصی دربارهٔ مسیرهای میانروالی در کد هشدار میدهد که در آنها تحلیلگر تلاشی برای استفاده از "va_arg" جهت استخراج مقداری که به یک فراخوانی با تعداد متغیر آرگومان ارسال شده را شناسایی میکند، اما از نوعی استفاده میشود که با نوع عبارت ارسالشده به فراخوانی همخوانی ندارد.
ببینید CWE-686: Function Call With Incorrect Argument Type ("https://cwe.mitre.org/data/definitions/686.html").
- -Wno-analyzer-va-list-exhausted
- این هشدار
نیازمند -fanalyzer
است که آن
را فعال
میکند؛ از
-Wno-analyzer-va-list-exhausted برای
غیرفعال
کردن آن
استفاده
کنید.
این اعلان تشخیصی دربارهٔ مسیرهای میانروالی در کد هشدار میدهد که در آنها تحلیلگر تلاشی برای استفاده از "va_arg" جهت دسترسی به مقدار بعدی ارسالشده به یک فراخوانی با تعداد متغیر آرگومان را شناسایی میکند، اما تمام مقادیر درون "va_list" از پیش مصرف شدهاند.
ببینید CWE-685: Function Call With Incorrect Number of Arguments ("https://cwe.mitre.org/data/definitions/685.html").
- -Wno-analyzer-va-list-leak
- این هشدار
نیازمند -fanalyzer
است که آن
را فعال
میکند؛ از
-Wno-analyzer-va-list-leak برای
غیرفعال
کردن آن
استفاده
کنید.
این اعلان تشخیصی دربارهٔ مسیرهای میانروالی در کد هشدار میدهد که در آنها تحلیلگر تشخیص میدهد که "va_start" یا "va_copy" روی یک "va_list" بدون فراخوانی متناظر با "va_end" فراخوانی شده است.
- -Wno-analyzer-va-list-use-after-va-end
- این هشدار
نیازمند -fanalyzer
است که آن
را فعال
میکند؛ از
-Wno-analyzer-va-list-use-after-va-end
برای
غیرفعال
کردن آن
استفاده
کنید.
این اعلان تشخیصی دربارهٔ مسیرهای میانروالی در کد هشدار میدهد که در آنها تحلیلگر تلاشی برای استفاده از یک "va_list" پس از آنکه "va_end" روی آن فراخوانی شده است را تشخیص میدهد. "va_list"..IP -Wno-analyzer-write-to-const 4 این هشدار نیازمند -fanalyzer است که آن را فعال میکند؛ برای غیرفعال کردن آن از -Wno-analyzer-write-to-const استفاده کنید.
این پیام تشخیصی درباره مسیرهایی از کد هشدار میدهد که در آنها تحلیلگر تلاشی برای نوشتن در یک شیء "const" از طریق اشارهگر را شناسایی میکند. با این حال، تحلیلگر اولویتی برای شناسایی چنین مسیرهایی قائل نمیشود، بنابراین موارد منفی کاذب در مقایسه با سایر هشدارها محتملتر هستند.
- -Wno-analyzer-write-to-string-literal
- این هشدار
نیازمند -fanalyzer
است که آن
را فعال
میکند؛
برای
غیرفعال
کردن آن از
-Wno-analyzer-write-to-string-literal
استفاده
کنید.
این پیام تشخیصی درباره مسیرهایی از کد هشدار میدهد که در آنها تحلیلگر تلاشی برای نوشتن در یک لیترال رشتهای (string literal) از طریق اشارهگر را شناسایی میکند. با این حال، تحلیلگر اولویتی برای شناسایی چنین مسیرهایی قائل نمیشود، بنابراین موارد منفی کاذب در مقایسه با سایر هشدارها محتملتر هستند.
- -Wno-analyzer-use-of-uninitialized-value
- این هشدار
نیازمند -fanalyzer
است که آن
را فعال
میکند؛
برای
غیرفعال
کردن آن از
-Wno-analyzer-use-of-uninitialized-value
استفاده
کنید.
این پیام تشخیصی درباره مسیرهایی از کد هشدار میدهد که در آنها از یک مقدار مقداردهینشده استفاده شده است.
ببینید: CWE-457: Use of Uninitialized Variable ("https://cwe.mitre.org/data/definitions/457.html").
تحلیلگر دانشی از پیش تعریفشده درباره رفتار توابع مدیریت حافظه زیر دارد:
- *<"alloca">
- *<توابع توکار "__builtin_alloc",>
- "__builtin_alloc_with_align"، @item "__builtin_calloc"، "__builtin_free"، "__builtin_malloc"، "__builtin_memcpy"، "__builtin_memcpy_chk"، "__builtin_memset"، "__builtin_memset_chk"، "__builtin_realloc"، "__builtin_stack_restore" و "__builtin_stack_save"
- *<"calloc">
- *<"free">
- *<"malloc">
- *<"memset">
- *<"operator delete">
- *<"operator delete []">
- *<"operator new">
- *<"operator new []">
- *<"realloc">
- *<"strdup">
- *<"strndup">
درباره توابع زیر برای کار با توصیفکنندههای فایل (file descriptors):
- *<"open">
- *<"close">
- *<"creat">
- *<"dup"، "dup2" و "dup3">
- *<"isatty">
- *<"pipe" و "pipe2">
- *<"read">
- *<"write">
- *<"socket"، "bind"، "listen"، "accept" و "connect">
درباره توابع زیر برای کار با جریانهای "<stdio.h>":
- *<توابع توکار "__builtin_fprintf",>
- "__builtin_fprintf_unlocked"، "__builtin_fputc"، "__builtin_fputc_unlocked"، "__builtin_fputs"، "__builtin_fputs_unlocked"، "__builtin_fwrite"، "__builtin_fwrite_unlocked"، "__builtin_printf"، "__builtin_printf_unlocked"، "__builtin_putc"، "__builtin_putchar"، "__builtin_putchar_unlocked"، "__builtin_putc_unlocked"، "__builtin_puts"، "__builtin_puts_unlocked"، "__builtin_vfprintf" و "__builtin_vprintf"
- *<"fopen">
- *<"fclose">
- *<"ferror">
- *<"fgets">
- *<"fgets_unlocked">
- *<"fileno">
- *<"fread">
- *<"getc">
- *<"getchar">
- *<"fprintf">
- *<"printf">
- *<"fwrite">
و درباره توابع زیر:
- *<توابع توکار "__builtin_expect",>
- "__builtin_expect_with_probability"، "__builtin_strchr"، "__builtin_strcpy"، "__builtin_strcpy_chk"، "__builtin_strlen"، "__builtin_va_copy" و "__builtin_va_start"
- *<افزونههای گنو "error" و "error_at_line">
- *<"getpass">
- *<"longjmp">
- *<"putenv">
- *<"setjmp">
- *<"siglongjmp">
- *<"signal">
- *<"sigsetjmp">
- *<"strcat">
- *<"strchr">
- *<"strlen">
علاوه بر این، توابع متعددی با پیشوند "__analyzer_" معنای ویژهای برای تحلیلگر دارند که در راهنمای داخلی GCC شرح داده شدهاند. پارامترهای داخلی گوناگونی که از طریق --param قابل تنظیم هستند، برای کنترل فرایند پیمایش به کار میروند؛ این موارد نیز در راهنمای داخلی GCC مستند شدهاند.
گزینههای زیر تحلیلگر را کنترل میکنند:
- -fanalyzer-assume-nothrow
- بهطور
پیشفرض،
اگر -fexceptions
فعال باشد،
تحلیلگر
فرض میکند
که
فراخوانی
هر تابعِ
بدون مشخصه
"nothrow"
میتواند
یک استثنا
ایجاد کند.
این امر
میتواند
به شناسایی
مسیرهای
اجرایی که
به دلیل دور
زدن کدهای
پاکسازی
توسط
استثناها
دچار نشت
میشوند
کمک کند،
اما ممکن
است هنگام
استفاده از
سرآیندهایی
که
نویسندهشان
مشخصه
"nothrow" را
اضافه
نکرده است،
منجر به
هشدارهای
مثبت کاذب
شود.
اگر -fanalyzer-assume-nothrow فعال باشد، تحلیلگر فرض خواهد کرد که توابع خارجی هیچ استثنایی صادر نمیکنند. این کار ممکن است برای کاهش «نویز» تحلیلگر هنگام فعالسازی -fexceptions در کد C مفید باشد، اما اگر استثنایی توسط مواردی که کد C فراخوانی میکند برانگیخته شود، میتواند مشکلات واقعی را پنهان کند.
- -fanalyzer-call-summaries
- تحلیل
بینروالی
را با
محاسبه اثر
فراخوانیهای
خاص
سادهتر
میکند،
بهجای
آنکه تمام
مسیرهای
درون تابع
را از محل
فراخوانی
تا هر
بازگشت
ممکن
پیمایش کند.
در صورت فعال بودن، خلاصههای فراخوانی فقط برای توابعی که بیش از یک محل فراخوانی دارند و به اندازه کافی پیچیده هستند، استفاده میشوند.
- -fanalyzer-checker=name
- تحلیلگر را تنها به اجرای بررسیکننده نامبرده محدود کرده و آن را فعال میکند.
- -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
- این گزینه
برای
توسعهدهندگان
تحلیلگر
در نظر
گرفته شده
است.
بهطور پیشفرض تحلیلگر هنگام ساخت گراف بسطیافته خود، تلاش میکند با ادغام وضعیتهای به اندازه کافی مشابه در هر نقطه از برنامه، فرایند تحلیل را ساده کند. با -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 در مقایسه با سایر ابزارهای تحلیل کد نسبتاً دیر اجرا میشود و برخی بهینهسازیها قبلاً روی کد اعمال شدهاند. بهویژه درونخطسازی توابع ممکن است رخ داده باشد، که منجر میشود مسیرهای اجرای بینروالی صادرشده توسط تحلیلگر حاوی فریمهای تابعی باشند که با فریمهای موجود در کد مبدأ اصلی مطابقت ندارند.
بهطور پیشفرض، تحلیلگر تلاش میکند فریمهای اولیه تابع را بازسازی کند و رویدادهایی را نمایش دهد که فراخوانیهای درونخطشده را نشان میدهند.
با -fno-analyzer-undo-inlining میتوان این بازسازی اطلاعات فریم اولیه را غیرفعال کرد که ممکن است هنگام رفع اشکال مسائل مربوط به تحلیلگر مفید باشد.
- -fanalyzer-verbose-edges
- این گزینه برای توسعهدهندگان تحلیلگر در نظر گرفته شده است. این گزینه جزئیات مشروحتر و سطحپایینتری را در توصیف جریان کنترل درون مسیرهای تشخیصی فعال میکند.
- -fanalyzer-verbose-state-changes
- این گزینه برای توسعهدهندگان تحلیلگر در نظر گرفته شده است. این گزینه جزئیات مشروحتر و سطحپایینتری را در توصیف رویدادهای مربوط به ماشینهای وضعیت درون مسیرهای تشخیصی فعال میکند.
- -fanalyzer-verbosity=level
- این گزینه
پیچیدگی
مسیرهای
جریان
کنترل
صادرشده
برای
پیامهای
تشخیصی
تحلیلگر
را کنترل
میکند.
مقدار level میتواند یکی از موارد زیر باشد:
- 0
- در این سطح، رویدادهای فراخوانی و بازگشت بینروالی، همراه با مرتبطترین رویدادهای تغییر وضعیت مربوط به یک پیام تشخیصی نمایش داده میشوند. برای مثال، برای خطای دو بار آزادسازی (double-"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
- تولید گزارشهای تشخیصی که نشان میدهد گرهها در «گراف بسطیافته» در چه موقعیتی نسبت به کد منبع برنامه قرار دارند.
- -fdump-analyzer-exploded-nodes-2
- تخلیهٔ یک نمایش متنی از «گراف بسطیافته» در file.eg.txt.
- -fdump-analyzer-exploded-nodes-3
- تخلیهٔ یک نمایش متنی از «گراف بسطیافته» در قالب یک فایل تخلیه بهازای هر گره، در file.eg-id.txt. این کار معمولاً منجر به تعداد زیادی فایل تخلیه میشود.
- -fdump-analyzer-exploded-paths
- تخلیهٔ یک نمایش متنی از «مسیر بسطیافته» برای هر مورد تشخیصی در file.idx.kind.epath.txt.
- -fdump-analyzer-feasibility
- تخلیهٔ جزئیات درونی دربارهٔ جستجوی تحلیلگر برای مسیرهای شدنی (feasible paths). جزئیات در قالبی مناسب برای مشاهده با GraphViz در نامفایلهایی به شکل file.*.fg.dot، file.*.tg.dot، و file.*.fpath.txt نوشته میشوند.
- -fdump-analyzer-infinite-loop
- تخلیهٔ جزئیات درونی دربارهٔ جستجوی تحلیلگر برای حلقههای بینهایت. جزئیات در قالبی مناسب برای مشاهده با GraphViz در نامفایلهایی به شکل file.*.infinite-loop.dot نوشته میشوند.
- -fdump-analyzer-json
- تخلیهٔ یک نمایش فشردهشده از ساختار درونی تحلیلگر در قالب JSON در file.analyzer.json.gz. قالب دقیق ممکن است تغییر کند.
- -fdump-analyzer-state-purge
- مشابه -fdump-analyzer-supergraph، نمایشی از «ابَرگراف» (supergraph) مناسب برای مشاهده با GraphViz تخلیه میشود، اما گراف با اطلاعاتی درباره اینکه چه وضعیتی در هر گره پاکسازی خواهد شد نشانهگذاری میشود. گراف در file.state-purge.dot نوشته میشود.
- -fdump-analyzer-supergraph
- تخلیهٔ نمایشهایی از «ابَرگراف» مناسب برای مشاهده با GraphViz در file.supergraph.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 بهبود میبخشد، اما احتمالاً باعث فروپاشی سایر اشکالزداها یا خودداری آنها از خواندن برنامه میشود. اگر میخواهید با اطمینان کنترل کنید که آیا این اطلاعات اضافی تولید شوند یا خیر، از -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 دیگر از DWARF نسخهٔ 1 پشتیبانی نمیکند، که تفاوتهای اساسی با نسخهٔ 2 و بعد از آن دارد. به دلایل تاریخی، برخی دیگر از گزینههای مرتبط با DWARF (مانند -fno-dwarf2-cfi-asm) ارجاع به نسخهٔ 2 DWARF را در نام خود حفظ کردهاند، اما بر تمام نسخههای DWARF که در حال حاضر پشتیبانی میشوند اعمال میشوند.
- -gbtf
- درخواست اطلاعات اشکالزدایی BTF. قالب BTF قالب اشکالزدایی پیشفرض برای هدف eBPF است. در سایر هدفها، مانند x86، اطلاعات اشکالزدایی BTF میتواند همراه با اطلاعات اشکالزدایی DWARF تولید شود، به شرطی که هر دو قالب اشکالزدایی بهطور صریح از طریق گزینههای خط فرمان مربوطهشان فعال شده باشند.
- -gprune-btf
- -gno-prune-btf
- هرس کردن
اطلاعات BTF
پیش از
صدور. هنگام
هرس کردن،
فقط
اطلاعات
نوع برای
نوعهای
استفادهشده
توسط
متغیرهای
سراسری و
توابع در
حوزهٔ فایل
صادر خواهد
شد. اگر
کامپایل
برای هدف BPF
با فعال
بودن BPF CO-RE
انجام
گیرد،
اطلاعات
نوع برای
نوعهای
استفادهشده
در
بازنشانیهای
BPF CO-RE نیز صادر
خواهد شد.
علاوه بر
این،
نوعهای struct و
union که فقط از
طریق
اشارهگر
از اعضای
سایر
نوعهای struct
یا union ارجاع
داده
شدهاند،
هرس شده و
با BTF_KIND_FWD
جایگزین
میشوند،
گویی آن
نوعها فقط
بهصورت
اعلانهای
پیشاپیش در
ورودی حضور
داشتهاند.
این گزینه اندازهٔ اطلاعات BTF تولیدشده را به میزان چشمگیری کاهش میدهد، اما با از دست رفتن قابل توجه اطلاعات تفصیلی نوع همراه است. این گزینه در درجهٔ اول هنگام کامپایل برای هدف BPF مفید است تا اندازهٔ شیء حاصل به حداقل برسد، و اطلاعات BTF که ارتباط مستقیمی با فرایند بارگذاری برنامهٔ BPF ندارند حذف شوند.
این گزینه هنگام تولید اطلاعات BTF برای هدف BPF بهطور پیشفرض فعال است.
- -gctf
- -gctflevel
- درخواست
اطلاعات
اشکالزدایی
CTF و استفاده
از level برای
تعیین
میزان
اطلاعات
اشکالزدایی
CTF که باید
تولید شود.
اگر -gctf بدون
مقداری
برای level مشخص
شود، سطح
پیشفرض
اطلاعات
اشکالزدایی
CTF برابر با 2
خواهد بود.
اطلاعات اشکالزدایی CTF میتواند همزمان با اطلاعات اشکالزدایی DWARF تولید شود، در صورتی که هر دو قالب اشکالزدایی بهطور صریح از طریق گزینههای خط فرمان مربوطه فعال شده باشند.
سطح 0 هیچگونه اطلاعات اشکالزدایی CTF تولید نمیکند. بنابراین، -gctf0 گزینهٔ -gctf را لغو میکند.
سطح 1 اطلاعات CTF را تنها برای ردگیریها (tracebacks) تولید میکند. این اطلاعات شامل اطلاعات محل فراخوانی (callsite) است، اما شامل اطلاعات نوع نمیشود.
سطح 2 اطلاعات نوع را فقط برای موجودیتها (توابع، اشیاء داده و غیره) در حوزهٔ فایل یا حوزهٔ سراسری تولید میکند..IP -gvms 4 تولید اطلاعات اشکالزدایی در قالب اشکالزدایی Alpha/VMS (در صورت پشتیبانی). این قالبی است که توسط DEBUG در سیستمهای Alpha/VMS استفاده میشود.
- -gcodeview
- تولید اطلاعات اشکالزدایی در قالب اشکالزدایی CodeView (در صورت پشتیبانی). این قالبی است که توسط Microsoft Visual C++ در Windows استفاده میشود.
- -glevel
- -ggdblevel
- -gvmslevel
- درخواست
اطلاعات
اشکالزدایی
و همچنین
استفاده از
level برای
مشخص کردن
میزان
اطلاعات.
سطح
پیشفرض ۲
است.
سطح 0 بههیچوجه اطلاعات اشکالزدایی تولید نمیکند. بنابراین، -g0 اثر -g را خنثی میکند.
سطح 1 حداقل اطلاعات را تولید میکند؛ در حدی که برای ایجاد ردگیری بازگشتی (backtrace) در بخشهایی از برنامه که قصد اشکالزدایی آنها را ندارید کافی باشد. این اطلاعات شامل شرح توابع، متغیرهای خارجی و جدولهای شماره خطوط است، اما اطلاعاتی درباره متغیرهای محلی در بر ندارد.
سطح 2 تنظیم معمول برای تولید کد قابل اشکالزدایی است. خروجی اشکالزدایی شامل تمام اطلاعات سطح 1 بهعلاوه اطلاعات مربوط به متغیرهای محلی و typedefها است تا امکان پیمایش گامبهگام کد و بررسی وضعیت آن فراهم شود. برای کدهای C++، اطلاعات بیشتری نیز جهت کمک به اشکالزدایی فضای نام (namespace)، کلاس و توابع الگو صادر میشود.
سطح 3 شامل اطلاعات اضافی است، مانند تمامی تعاریف ماکرو موجود در برنامه. برخی از اشکالزداها هنگام استفاده از -g3 از بسط ماکرو پشتیبانی میکنند.
اگر از چند گزینه -g، همراه با شماره سطح یا بدون آن استفاده کنید، آخرین گزینه از این دست مؤثر خواهد بود.
گزینه -gdwarf برای جلوگیری از سردرگمی با -gdwarf-level، سطح اشکالزدایی چسبیده را نمیپذیرد. بهجای آن، از یک گزینه اضافی -glevel برای تغییر سطح اشکالزدایی برای DWARF استفاده کنید.
- -fno-eliminate-unused-debug-symbols
- بهطور پیشفرض، هیچ اطلاعات اشکالزدایی برای نمادهایی که در عمل استفاده نشدهاند تولید نمیشود. اگر اطلاعات اشکالزدایی را برای همه نمادها میخواهید، از این گزینه استفاده کنید.
- -femit-class-debug-always
- بهجای درج اطلاعات اشکالزدایی برای یک کلاس C++ تنها در یک فایل هدف (object file)، آن را در تمام فایلهای هدفی که از آن کلاس استفاده میکنند درج میکند. این گزینه باید تنها با اشکالزداهایی استفاده شود که قادر به مدیریت روش معمول GCC در درج اطلاعات اشکالزدایی برای کلاسها نیستند، چرا که استفاده از این گزینه اندازه اطلاعات اشکالزدایی را تا دو برابر افزایش میدهد.
- -fno-merge-debug-strings
- پیونددهنده (linker) را هدایت میکند تا رشتههای یکسان در اطلاعات اشکالزدایی در فایلهای هدف مختلف را با یکدیگر ادغام نکند. ادغام توسط همه اسمبلرها یا پیونددهندهها پشتیبانی نمیشود. ادغام اندازه اطلاعات اشکالزدایی در فایل خروجی را به بهای افزایش زمان پردازش پیونددهی کاهش میدهد. ادغام بهطور پیشفرض فعال است.
- -fdebug-prefix-map=old=new
- هنگام کامپایل فایلهای واقع در پوشه old، اطلاعات اشکالزدایی را طوری ثبت میکند که گویی فایلها در پوشه new قرار دارند. از این گزینه میتوان برای جایگزینی مسیر زمان ساخت با مسیر زمان نصب در اطلاعات اشکالزدایی استفاده کرد. همچنین میتوان با استفاده از . برای new، مسیر مطلق را به یک مسیر نسبی تبدیل کرد. این کار میتواند ساختهای بازتولیدپذیرتری فراهم کند که مستقل از مکان هستند، اما ممکن است به یک دستور اضافی برای آگاهسازی GDB از محل یافتن فایلهای منبع نیاز داشته باشد. همچنین -ffile-prefix-map و -fcanon-prefix-map را ببینید.
- -fvar-tracking
- گذرگاه
ردیابی
متغیر (variable tracking pass)
را اجرا
میکند. این
گذرگاه
محاسبه
میکند که
متغیرها در
هر موقعیت
از کد کجا
ذخیره
شدهاند.
سپس
اطلاعات
اشکالزدایی
بهتری
تولید
میشود (در
صورتی که
قالب
اطلاعات
اشکالزدایی
از این
اطلاعات
پشتیبانی
کند).
این گزینه هنگام کامپایل با بهینهسازی (-Os، -O، -O2، ...) و اطلاعات اشکالزدایی (-g)، در صورتی که قالب اطلاعات اشکالزدایی از آن پشتیبانی کند، بهطور پیشفرض فعال است.
- -fvar-tracking-assignments
- انتسابها
به
متغیرهای
کاربر را در
اوایل
مراحل
کامپایل
حاشیهنویسی
میکند و
تلاش
میکند این
حاشیهنویسیها
را در سراسر
کامپایل تا
انتها حفظ
کند تا
اطلاعات
اشکالزدایی
در حین
بهینهسازی
بهبود یابد.
استفاده از
-gdwarf-4 همراه با
آن توصیه
میشود.
این گزینه حتی در صورت غیرفعال بودن var-tracking نیز میتواند فعال شود، که در این حالت حاشیهنویسیها ایجاد و نگهداری میشوند، اما در پایان کنار گذاشته میشوند. بهطور پیشفرض، این پرچم همراه با -fvar-tracking فعال است، مگر زمانی که زمانبندی انتخابی (selective scheduling) فعال باشد.
- -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، چنانچه -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
- افزودن
شمارههای
نمای
پیشروندهٔ
استنباطشده
از جدول
شماره خط به
فهرستهای
مکان متغیر.
این کار
مصرفکنندگان
اطلاعات
اشکالزدایی
را قادر
میسازد تا
وضعیت را در
نقاط مشخصی
از برنامه
بررسی
کنند، حتی
اگر هیچ
دستورالعمل
مرتبط با
مکانهای
مبدأ
متناظر در
آن نقطه
وجود
نداشته
باشد. اگر
اسمبلر
فاقد
پشتیبانی
از
شمارههای
view در
جدولهای
شماره خط
باشد، این
کار موجب
میشود
کامپایلر
جدول شماره
خط را صادر
کند که
معمولاً
باعث
میشود تا
حدی کمتر
فشرده
باشند.
جدولهای
شماره خط و
فهرستهای
مکان
تقویتشده
کاملاً با
گذشته
سازگارند،
بنابراین
میتوانند
توسط
مصرفکنندگان
اطلاعات
اشکالزدایی
که از این
تقویتها
آگاه
نیستند نیز
مصرف شوند،
هرچند سودی
نیز از
آنها
نخواهند
برد.
این گزینه هنگام تولید خروجی اطلاعات اشکالزدایی DWARF 2 در سطح عادی، تا زمانی که اسمبلر پشتیبانی کند، -fvar-tracking-assignments فعال باشد و -gstrict-dwarf فعال نباشد، بهطور پیشفرض فعال است. هنگامی که پشتیبانی اسمبلر در دسترس نیست، این گزینه همچنان ممکن است فعال شود، اما GCC را مجبور به صادر کردن جدولهای شماره خط داخلی میکند، و اگر -ginternal-reset-location-views فعال نباشد، به احتمال بسیار زیاد منجر به عدم تطابق بیصدای نماهای مکان خواهد شد.
یک بازنمود پیشنهادی برای شمارههای view وجود دارد که با قالب فهرست مکان معرفیشده در DWARF 5 سازگار با گذشته نیست و میتواند با -gvariable-location-views=incompat5 فعال شود. این گزینه ممکن است در آینده حذف شود و صرفاً به عنوان یک پیادهسازی مرجع از بازنمود پیشنهادی ارائه شده است. انتظار نمیرود مصرفکنندگان اطلاعات اشکالزدایی از این قالب گسترشیافته پشتیبانی کنند و قادر به رمزگشایی فهرستهای مکان که از آن استفاده میکنند نخواهند بود.
- -ginternal-reset-location-views
- -gno-internal-reset-location-views
- تلاش برای تعیین نماهای مکانی که میتوانند از فهرستهای نمای مکان حذف شوند. این امر مستلزم آن است که کامپایلر برآوردهای بسیار دقیقی از طول دستورالعملها داشته باشد که همیشه اینگونه نیست، و در صورت استفاده از اسمبلری که از فهرستهای نمای مکان پشتیبانی نمیکند، ممکن است باعث تولید بیصدای فهرستهای نمای نادرست شود. اسمبلر گنو هرگونه خطای از این دست را به عنوان "view number mismatch" پرچمگذاری میکند. این گزینه تنها روی پورتهایی فعال است که یک تابع برآورد قابل اتکا تعریف کرده باشند.
- -ginline-points
- -gno-inline-points
- تولید اطلاعات اشکالزدایی گسترشیافته برای توابع درونخطیشده. نشانگرهای ردیابی نمای مکان در نقاط ورودی درونخطی درج میشوند تا آدرس و شمارههای view بتوانند محاسبه شده و در اطلاعات اشکالزدایی خروجی داده شوند. این گزینه میتواند مستقل از نماهای مکان فعال شود، که در این حالت شمارههای view خروجی داده نمیشوند، اما فقط میتواند همراه با مرزهای دستور فعال شود و تنها در صورتی بهطور پیشفرض فعال است که نماهای مکان فعال باشند.
- -gz[=type]
- تولید بخشهای اشکالزدایی فشردهشده در قالب DWARF، در صورت پشتیبانی. اگر type داده نشود، نوع پیشفرض به قابلیتهای اسمبلر و پیونددهندهٔ مورد استفاده بستگی دارد. type میتواند یکی از موارد none (عدم فشردهسازی بخشهای اشکالزدایی)، zlib (استفاده از فشردهسازی zlib در قالب ELF gABI) یا zstd (استفاده از فشردهسازی zstd در قالب ELF gABI) باشد. اگر پیونددهنده از نوشتن بخشهای اشکالزدایی فشرده پشتیبانی نکند، این گزینه رد میشود. در غیر این صورت، اگر اسمبلر از آنها پشتیبانی نکند، -gz هنگام تولید فایلهای شیء بدون هشدار نادیده گرفته میشود.
- -femit-struct-debug-baseonly
- درج
اطلاعات
اشکالزدایی
برای انواع
ساختارمانند
تنها زمانی
که نام
پایهٔ فایل
مبدأ
کامپایل با
نام پایهٔ
فایلی که
ساختار در
آن تعریف
شده مطابقت
داشته باشد.
این گزینه اندازهٔ اطلاعات اشکالزدایی را به میزان قابل توجهی کاهش میدهد، اما با احتمال از دست رفتن چشمگیر اطلاعات نوع برای اشکالزدا. برای گزینهای کمتر تهاجمی به -femit-struct-debug-reduced مراجعه کنید. برای کنترل با جزئیات بیشتر به -femit-struct-debug-detailed مراجعه کنید.
این گزینه تنها با خروجی اشکالزدایی DWARF کار میکند.
- -femit-struct-debug-reduced
- درج
اطلاعات
اشکالزدایی
برای انواع
ساختارمانند
تنها زمانی
که نام
پایهٔ فایل
مبدأ
کامپایل با
نام پایهٔ
فایلی که
نوع در آن
تعریف شده
مطابقت
داشته
باشد، مگر
اینکه
ساختار یک
الگو باشد
یا در یک
سرآیند
سیستمی
تعریف شده
باشد.
این گزینه اندازهٔ اطلاعات اشکالزدایی را بهطور چشمگیری کاهش میدهد، با مقداری احتمال از دست رفتن اطلاعات نوع برای اشکالزدا. برای گزینهای تهاجمیتر به -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
- صادر کردن اطلاعات بازپیچی 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 از اجرای بسیاری از مراحل (passes) بهینهسازی جلوگیری میکند.
بسته به معماری مقصد (target) و نحوهٔ پیکربندی GCC، ممکن است در هر سطح -O مجموعهای کمی متفاوت از بهینهسازیها نسبت به موارد ذکرشده در اینجا فعال شود. میتوانید GCC را با -Q --help=optimizers فراخوانی کنید تا از مجموعهٔ دقیق بهینهسازیهای فعالشده در هر سطح آگاه شوید.
- -O
- -O1
- --optimize
- بهینهسازی.
کامپایلِ
بهینهساز
تا حدودی
زمان
بیشتری
میبرد و
برای یک
تابع بزرگ
به حافظهٔ
بسیار
بیشتری
نیاز دارد.
با -O، کامپایلر تلاش میکند تا بدون انجام بهینهسازیهایی که زمان زیادی از کامپایل میگیرند، اندازهٔ کد و زمان اجرا را کاهش دهد.
گزینهٔ -O سطح بهینهسازی پیشنهادی برای کدهای حجیم تولیدشده توسط ماشین (machine-generated) است، زیرا تعادلی معقول بین زمان لازم برای کامپایل و مصرف حافظه ایجاد میکند: سطوح بالاتر بهینهسازی، بهینهسازیهایی با پیچیدگی الگوریتمی بیشتری نسبت به -O انجام میدهند.
گزینهٔ -O پرچمهای بهینهسازی زیر را فعال میکند:
-fauto-inc-dec -fbranch-count-reg -fcombine-stack-adjustments -fcompare-elim -fcprop-registers -fdce -fdefer-pop -fdelayed-branch -fdse -fforward-propagate -fguess-branch-probability -fif-conversion -fif-conversion2 -finline-functions-called-once -fipa-modref -fipa-profile -fipa-pure-const -fipa-reference -fipa-reference-addressable -fivopts -fmerge-constants -fmove-loop-invariants -fmove-loop-stores -fomit-frame-pointer -freorder-blocks -fshrink-wrap -fshrink-wrap-separate -fsplit-wide-types -fssa-backprop -fssa-phiopt -ftree-bit-ccp -ftree-ccp -ftree-ch -ftree-coalesce-vars -ftree-copy-prop -ftree-dce -ftree-dominator-opts -ftree-dse -ftree-forwprop -ftree-fre -ftree-phiprop -ftree-pta -ftree-scev-cprop -ftree-sink -ftree-slsr -ftree-sra -ftree-ter -funit-at-a-time
- -O2
- بهینهسازی
حتی بیشتر.
کامپایلر GCC
تقریباً
تمام
بهینهسازیهای
پشتیبانیشده
را که متضمن
مصالحهای
میان فضا و
سرعت
نیستند،
انجام
میدهد. در
مقایسه با
-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
را فعال
میکند که
اطلاعات
اشکالزدایی
را در prologue و epilogue
توابع بهتر
از -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
- بسیاری از
CPUها هنگامی
که یک
بارگذاری (load)
تا حدی به
ذخیرهسازیهای
(stores) کوچکتر
قبلی
وابسته
باشد، برای
چرخههای
متعددی
متوقف (stall)
میشوند.
این مرحله
تلاش
میکند
چنین
مواردی را
شناسایی
کند و با
تغییر
ترتیب
بارگذاری و
ذخیرهسازی
و سپس اصلاح
مقدار
بارگذاریشده،
از این
جریمه
زمانی
جلوگیری
نماید.
بهطور پیشفرض غیرفعال است.
- -ffp-contract=style
- -ffp-contract=off ادغام
عبارات
ممیز شناور
را غیرفعال
میکند.
-ffp-contract=fast ادغام
عبارات
ممیز شناور
را مانند
ایجاد
عملیاتهای
ضرب و جمع
ادغامشده
(fused multiply-add)، در
صورتی که
معماری
مقصد
پشتیبانی
بومی از
آنها
داشته
باشد، فعال
میسازد.
-ffp-contract=on ادغام
عبارات
ممیز شناور
را در صورت
مجاز بودن
توسط
استاندارد
زبان فعال
میکند. این
قابلیت
برای C و C++
پیادهسازی
شده است که
در آن،
ادغام درون
یک عبارت
مجاز است،
اما در میان
دستورهای
مختلف مجاز
نیست.
مقدار پیشفرض برای زبان C در حالت منطبق بر استاندارد (-std=c11 یا مشابه آن) -ffp-contract=off و در غیر این صورت -ffp-contract=fast است.
- -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های ۸، ۱۶،
۳۲ و ۶۴
بیتی را با
چندجملهای
ثابت بدون
بیت آغازین
۱، هم برای
حالت بیت رو
به جلو (bit-forward) و
هم بیت
معکوس (bit-reversed)
شناسایی
مینماید.
اگر معماری
مقصد از
دستورالعمل
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 هیچ تابعی را، بهجز مواردی که با صفت "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 و گذر
اصلی
درونخطیسازی،
درونخطی
کن. این کار
پروفایلسازی
را به میزان
چشمگیری
کمهزینهتر
و معمولاً
درونخطیسازی
را در
برنامههایی
با
زنجیرههای
طولانی از
توابع
دربرگیرنده
(wrapper) تودرتو
سریعتر
میکند.
بهطور پیشفرض فعال است.
- -fipa-sra
- جایگزینی
اسکالر
میانروالی
دادههای
تجمعی (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" اعلان شدهاند، حتی در صورتی که تابع در تمام فراخوانندههای خود درونخطی شده باشد، در فایل شیء درج کن. این سوییچ بر توابعی که از افزونهٔ "extern inline" در GNU C90 استفاده میکنند تأثیری ندارد. در C++، تمام توابع درونخطی را در فایل شیء درج کن.
- -fkeep-static-functions
- توابع "static" را در فایل شیء درج کن، حتی اگر آن تابع هرگز استفاده نشود.
- -fkeep-static-consts
- متغیرهای
اعلانشده
بهصورت
"static const" را
زمانی که
بهینهسازی
فعال نیست
در خروجی
درج کن، حتی
اگر به آن
متغیرها
ارجاع داده
نشده باشد.
کامپایلر GCC این گزینه را بهطور پیشفرض فعال میکند. اگر میخواهید کامپایلر را بدون در نظر گرفتن روشن یا خاموش بودن بهینهسازی، وادار به بررسی ارجاع داده شدن به یک متغیر کنید، از گزینه -fno-keep-static-consts استفاده نمایید.
- -fmerge-constants
- تلاش برای
ادغام
ثوابت
یکسان
(ثوابت
رشتهای و
ثوابت ممیز
شناور) در
میان
واحدهای
مختلف
کامپایل.
اگر اسمبلر و پیونددهنده پشتیبانی کنند، این گزینه در کامپایل بهینهشده پیشفرض است. برای جلوگیری از این رفتار، از -fno-merge-constants استفاده کنید.
در سطوح -O1، -O2، -O3 و -Os فعال است.
- -fmerge-all-constants
- تلاش برای
ادغام
ثوابت
یکسان و
متغیرهای
یکسان.
این گزینه متضمن -fmerge-constants است. علاوه بر -fmerge-constants، این گزینه مواردی مانند آرایههای مقداردهیشده با مقادیر ثابت یا متغیرهای ثابت مقداردهیشده با انواع صحیح یا ممیز شناور را نیز در نظر میگیرد. زبانهایی مانند C یا C++ الزام میکنند که هر متغیر، از جمله چندین نمونه از همان متغیر در فراخوانیهای بازگشتی، مکانهای حافظهٔ مجزایی داشته باشند؛ بنابراین استفاده از این گزینه منجر به رفتاری مغایر با استاندارد میشود.
- -fmodulo-sched
- زمانبندی مدولو تابشی (SMS) را بلافاصله پیش از اولین گذر زمانبندی اجرا کن. این گذر درونیترین حلقهها را بررسی کرده و دستورالعملهای آنها را با همپوشانی تکرارهای مختلف بازآرایی میکند.
- -fmodulo-sched-allow-regmoves
- زمانبندی مدولو بر پایهٔ SMS تهاجمیتری را با مجاز شمردن انتقالهای ثبات (register moves) انجام بده. با تنظیم این پرچم، برخی یالهای پادوابستگی حذف میشوند که این امر تولید reg-moveها را بر اساس تحلیل دامنه حیات فعال میکند. این گزینه تنها با فعال بودن -fmodulo-sched مؤثر است.
- -fno-branch-count-reg
- گذر
بهینهسازی
را که به
دنبال
فرصتهایی
برای
استفاده از
دستورالعملهای
«کاهش و
پرش» (decrement and branch)
روی یک ثبات
شمارنده به
جای
توالیهای
دستوری که
یک ثبات را
کاهش داده،
آن را با
صفر مقایسه
کرده و سپس
بر اساس
نتیجه پرش
میکنند
میگردد،
غیرفعال کن.
این گزینه
تنها بر روی
معماریهایی
معنا دارد
که از چنین
دستورالعملهایی
پشتیبانی
میکنند،
از جمله x86،
PowerPC، IA-64 و S/390. توجه
داشته
باشید که
گزینه -fno-branch-count-reg
دستورالعملهای
کاهش و پرش
واردشده
توسط سایر
گذرهای
بهینهسازی
را از جریان
دستورالعملهای
تولیدشده
حذف
نمیکند.
حالت پیشفرض در -O1 و بالاتر، بهجز -Og، برابر با -fbranch-count-reg است.
- -fno-function-cse
- آدرسهای
توابع را در
ثباتها
قرار نده؛
کاری کن که
هر
دستورالعملی
که یک تابع
ثابت را
فراخوانی
میکند،
صریحاً
حاوی آدرس
تابع باشد.
این گزینه منجر به کدی با کارایی کمتر میشود، اما ممکن است برخی ترفندهای نامتعارف که خروجی اسمبلی را دستکاری میکنند، با بهینهسازیهای انجامشده در صورت عدم استفاده از این گزینه، دچار سردرگمی و اختلال شوند.
حالت پیشفرض -ffunction-cse است.
- -ffuse-ops-with-volatile-access
- بهینهسازی
محدودی از
عملیاتها
با دسترسی
به حافظه
فرّار (volatile) را
در صورتی که
این کار
معناشناسی
مشخصشده
را تغییر
ندهد، مجاز
بدان.
حالت پیشفرض -ffuse-ops-with-volatile-access است.
- -fno-zero-initialized-in-bss
- اگر معماری
هدف از بخش BSS
پشتیبانی
کند، GCC
بهطور
پیشفرض
متغیرهایی
را که با
صفر
مقداردهی
اولیه
شدهاند در
BSS قرار
میدهد. این
کار
میتواند
در اندازه
کد حاصل
صرفهجویی
کند.
این گزینه این رفتار را غیرفعال میکند، زیرا برخی برنامهها صریحاً به قرار گرفتن متغیرها در بخش داده (data section) وابسته هستند---برای نمونه، به این منظور که فایل اجرایی نهایی بتواند آغاز آن بخش را پیدا کند و/یا فرضیاتی بر اساس آن داشته باشد.
حالت پیشفرض -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
- یک گذر حذف
سراسری
زیرعبارتهای
مشترک را
اجرا
میکند. این
گذر همچنین
انتشار
سراسری
مقادیر
ثابت و
رونوشت را
انجام
میدهد.
نکته: هنگام کامپایل برنامهای که از computed goto (یک قابلیت توسعهیافته در GCC) استفاده میکند، در صورتی که گذر حذف سراسری زیرعبارتهای مشترک را با افزودن -fno-gcse به خط فرمان غیرفعال کنید، ممکن است کارایی زمان اجرای بهتری به دست آورید.
در سطوح -O2، -O3 و -Os فعال است.
- -fgcse-lm
- هنگامی که
-fgcse-lm فعال
باشد، حذف
سراسری
زیرعبارتهای
مشترک تلاش
میکند
بارگذاریهایی
را که تنها
توسط
ذخیرهسازیهای
روی خودشان
باطل
میشوند
جابهجا
کند. این
امر اجازه
میدهد تا
حلقهای
شامل توالی
بارگذاری/ذخیرهسازی
(load/store) به یک
بارگذاری
خارج از
حلقه و یک
رونوشت/ذخیرهسازی
درون حلقه
تغییر یابد.
بهطور پیشفرض در صورت فعال بودن -fgcse فعال است.
- -fgcse-sm
- هنگامی که
-fgcse-sm فعال
باشد، یک
گذر انتقال
ذخیرهسازی
پس از حذف
سراسری
زیرعبارتهای
مشترک اجرا
میشود. این
گذر تلاش
میکند تا
ذخیرهسازیها
را به خارج
از حلقهها
منتقل کند.
هنگامی که
در ترکیب با
-fgcse-lm استفاده
شود،
حلقههای
حاوی توالی
بارگذاری/ذخیرهسازی
را میتوان
به یک
بارگذاری
پیش از حلقه
و یک
ذخیرهسازی
پس از حلقه
تغییر داد.
در هیچ سطح بهینهسازی فعال نیست.
- -fgcse-las
- هنگامی که
-fgcse-las فعال
باشد، گذر
حذف سراسری
زیرعبارتهای
مشترک،
بارگذاریهای
مازادی را
که پس از
ذخیرهسازی
در همان
مکان حافظه
رخ میدهند
حذف میکند
(هم
افزونگیهای
جزئی و هم
کامل).
در هیچ سطح بهینهسازی فعال نیست.
- -fgcse-after-reload
- هنگامی که
-fgcse-after-reload فعال
باشد، یک
گذر حذف
بارگذاریهای
مازاد پس از
reload انجام
میشود. هدف
این گذر،
پاکسازی
سرریزهای
اضافی (redundant spilling)
است.
توسط -O3، -fprofile-use و -fauto-profile فعال میشود.
- -faggressive-loop-optimizations
- این گزینه به بهینهساز حلقه اعلام میکند که از محدودیتهای زبان برای استخراج کرانهای تعداد تکرارهای یک حلقه استفاده کند. فرض بر این است که کد حلقه با ایجاد مواردی مانند سرریز اعداد صحیح علامتدار یا دسترسی به خارج از محدودهٔ آرایهها، رفتار تعریفنشده ایجاد نمیکند. کرانهای تعداد تکرار یک حلقه برای هدایت باز کردن حلقه (loop unrolling)، لایهبرداری (peeling) و بهینهسازیهای آزمون خروج از حلقه استفاده میشوند. این گزینه بهطور پیشفرض فعال است.
- -funconstrained-commons
- این گزینه به کامپایلر اعلام میکند که متغیرهای تعریفشده در بلوکهای common (مانند فرترن) ممکن است بعداً با آرایههای طولانیتر انتهایی بازنویسی شوند. این کار از بهینهسازیهای خاصی که به دانستن کرانهای آرایه وابستهاند جلوگیری میکند.
- -fcrossjumping
- تبدیل پرش
متقاطع (cross-jumping)
را انجام
میدهد. این
تبدیل
کدهای
یکسان را
یکپارچه
کرده و
اندازهٔ کد
را کاهش
میدهد. کد
حاصل ممکن
است کارایی
بهتری نسبت
به حالت
بدون پرش
متقاطع
داشته یا
نداشته
باشد.
در سطوح -O2، -O3 و -Os فعال است.
- -fauto-inc-dec
- افزایش یا کاهش نشانیها را با دسترسیهای حافظه ترکیب میکند. این گذر در معماریهایی که دستورالعملی برای پشتیبانی از این قابلیت ندارند همیشه نادیده گرفته میشود. بهطور پیشفرض در -O1 و بالاتر در معماریهایی که از آن پشتیبانی میکنند فعال است.
- -fdce
- حذف کدهای مرده (DCE) را روی RTL انجام میدهد. بهطور پیشفرض در -O1 و بالاتر فعال است.
- -fdse
- حذف ذخیرهسازیهای مرده (DSE) را روی RTL انجام میدهد. بهطور پیشفرض در -O1 و بالاتر فعال است.
- -fif-conversion
- تلاش برای
تبدیل
پرشهای
شرطی به
معادلهای
فاقد
انشعاب (branch-less).
این شامل
استفاده از
انتقالهای
شرطی،
دستورالعملهای
min، max،
پرچمهای
تنظیم و abs، و
برخی
ترفندهای
قابل انجام
با محاسبات
حسابی
استاندارد
است.
استفاده از
اجرای شرطی
روی
تراشههایی
که این
قابلیت را
دارند توسط
-fif-conversion2 کنترل
میشود.
در سطوح -O1، -O2، -O3، -Os فعال است، اما نه همراه با -Og.
- -fif-conversion2
- استفاده از
اجرای شرطی
(در صورت در
دسترس بودن)
برای تبدیل
پرشهای
شرطی به
معادلهای
فاقد
انشعاب.
در سطوح -O1، -O2، -O3، -Os فعال است، اما نه همراه با -Og.
- -fdeclone-ctor-dtor
- ساختار ABI در ++C
نیازمند
چندین
نقطهٔ ورود
برای
سازندهها
و
ویرانگرها
است: یکی
برای
زیرشیء
پایه، یکی
برای شیء
کامل، و یکی
برای
ویرانگر
مجازی که پس
از آن operator delete را
فراخوانی
میکند.
برای
سلسلهمراتب
دارای
پایههای
مجازی،
گونههای
پایه و کامل
رونوشتهای
همسان (clones)
هستند که به
معنی وجود
دو رونوشت
از تابع
است. با این
گزینه،
گونههای
پایه و کامل
به thunkهایی
تبدیل
میشوند که
یک
پیادهسازی
مشترک را
فراخوانی
میکنند.
توسط -Os فعال میشود.
- -fdelete-null-pointer-checks
- فرض را بر
این
میگذارد
که
برنامهها
نمیتوانند
بهصورت
ایمن
اشارهگرهای
تهی (null pointers) را
مرجعزدایی
کنند، و هیچ
کد یا عنصر
دادهای در
نشانی صفر
قرار ندارد.
این گزینه
بهینهسازیهای
تاشدگی
ثابت ساده
را در تمامی
سطوح
بهینهسازی
فعال
میکند.
علاوه بر
این، سایر
گذرهای
بهینهسازی
در GCC از این
پرچم برای
کنترل
تحلیلهای
جریان
دادهٔ
سراسری
استفاده
میکنند که
بررسیهای
بیفایده
برای
اشارهگرهای
تهی را حذف
مینمایند؛
این
تحلیلها
فرض
میکنند که
دسترسی به
حافظه در
نشانی صفر
همواره
منجر به تله
(trap) میشود،
بنابراین
اگر
اشارهگری
پس از
مرجعزدایی
شدن بررسی
شود،
نمیتواند
تهی باشد.
با این حال توجه داشته باشید که در برخی محیطها این فرض برقرار نیست. برای برنامههایی که به آن رفتار وابستهاند، از -fno-delete-null-pointer-checks برای غیرفعال کردن این بهینهسازی استفاده کنید.
این گزینه بهطور پیشفرض در بیشتر مقاصد فعال است. در AVR و MSP430، این گزینه کاملاً غیرفعال است.
گذرهایی که از اطلاعات جریان داده استفاده میکنند بهطور مستقل در سطوح مختلف بهینهسازی فعال میشوند.
- -fdevirtualize
- تلاش برای تبدیل فراخوانی توابع مجازی به فراخوانیهای مستقیم. این کار هم درون یک روال و هم بهصورت بینروالی بهعنوان بخشی از درونریزی غیرمستقیم (-findirect-inlining) و انتشار بینروالی مقادیر ثابت (-fipa-cp) انجام میشود. در سطوح -O2، -O3 و -Os فعال است.
- -fdevirtualize-speculatively
- تلاش برای تبدیل فراخوانیهای توابع مجازی به فراخوانیهای مستقیم تخمینی (speculative direct calls). بر پایهٔ تحلیل گراف وراثت نوع، برای یک فراخوانی مشخص، مجموعهٔ مقاصد محتمل تعیین میشود. اگر این مجموعه کوچک باشد، ترجیحاً با اندازهٔ ۱، فراخوانی به یک عبارت شرطی تبدیل میشود که بین فراخوانیهای مستقیم و غیرمستقیم تصمیمگیری میکند. فراخوانیهای تخمینی بهینهسازیهای بیشتری مانند درونریزی (inlining) را ممکن میسازند. هرگاه پس از بهینهسازیهای بیشتر بیفایده به نظر برسند، دوباره به شکل اولیهٔ خود بازگردانده میشوند.
- -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 مقدار یک شیء تنها تحتتأثیر تغییرات رخداده در طول دورهٔ حیات آن (lifetime) قرار میگیرد: هنگامی که سازنده (constructor) آغاز میشود، شیء مقداری نامشخص دارد و هرگونه تغییر در طول حیات شیء، پس از نابودی آن مرده تلقی میشود. در حالت عادی، حذف ذخیرهسازیهای مرده (dead store elimination) از این موضوع بهره میبرد؛ اگر کد شما به ماندگاری مقدار فضای ذخیرهسازی شیء فراتر از طول عمر آن متکی است، میتوانید از این پرچم برای غیرفعال کردن این بهینهسازی استفاده کنید. جهت حفظ ذخیرهسازیهای پیش از آغاز سازنده (برای مثال به این دلیل که operator new شما فضای شیء را پاک میکند) و در عین حال مرده در نظر گرفتن شیء پس از نابودکننده (destructor)، میتوانید از -flifetime-dse=1 استفاده کنید. رفتار پیشفرض را میتوان صراحتاً با -flifetime-dse=2 انتخاب کرد. -flifetime-dse=0 معادل -fno-lifetime-dse است.
- -flive-range-shrinkage
- تلاش برای کاهش فشار ثباتها (register pressure) از طریق کاهش دامنهٔ زندهبودن ثباتها (live range shrinkage). این گزینه برای پردازندههای سریعی که دارای مجموعه ثباتهای کوچک یا متوسط هستند مفید است.
- -fira-algorithm=algorithm
- استفاده از الگوریتم رنگآمیزی مشخصشده برای تخصیصدهندهٔ یکپارچهٔ ثباتها (IRA). آرگومان algorithm میتواند priority باشد که رنگآمیزی اولویتدار چاو (Chow's priority coloring) را تعیین میکند، یا CB که رنگآمیزی چایتین-بریگز (Chaitin-Briggs coloring) را مشخص میسازد. رنگآمیزی چایتین-بریگز برای تمام معماریها پیادهسازی نشده است، اما برای مقصدهایی که از آن پشتیبانی میکنند، از آنجا که کد بهتری تولید میکند، حالت پیشفرض است.
- -fira-region=region
- استفاده از ناحیههای مشخصشده برای تخصیصدهندهٔ یکپارچهٔ ثباتها (IRA). آرگومان region باید یکی از موارد زیر باشد:
- all
- استفاده از تمام حلقهها بهعنوان ناحیههای تخصیص ثبات. این مقدار میتواند بهترین نتایج را برای ماشینهایی با مجموعه ثباتهای کوچک یا نامنظم ارائه دهد.
- mixed
- استفاده از تمام حلقهها بهجز حلقههای دارای فشار ثبات کم بهعنوان ناحیهها. این مقدار معمولاً در اکثر موارد و برای بیشتر معماریها بهترین نتایج را ارائه میدهد، و هنگام کامپایل با بهینهسازی برای سرعت (-O، -O2، ...) بهطور پیشفرض فعال است.
- one
- استفاده از تمام توابع بهصورت یک ناحیهٔ واحد. این مقدار معمولاً کوچکترین اندازهٔ کد را به همراه دارد و بهطور پیشفرض برای -Os یا -O0 فعال است.
- -fira-hoist-pressure
- استفاده از
IRA برای
ارزیابی
فشار ثبات
در مرحلهٔ
بالا کشیدن
کد (code hoisting pass) جهت
تصمیمگیری
در مورد
بالا کشیدن
عبارات. این
گزینه
معمولاً
منجر به کد
کوچکتر
میشود،
اما
میتواند
کامپایلر
را کُند
کند.
این گزینه در سطح -Os برای تمام مقصدها فعال است.
- -fira-loop-pressure
- استفاده از
IRA برای
ارزیابی
فشار ثبات
در حلقهها
جهت
تصمیمگیری
در مورد
انتقال
مقادیر
ثابت حلقه (loop
invariants). این
گزینه
معمولاً
روی
ماشینهایی
با مجموعه
ثباتهای
بزرگ (>= 32
ثبات) به
تولید
کدهای
سریعتر و
کوچکتر
میانجامد،
اما
میتواند
کامپایلر
را کُند
کند.
این گزینه در سطح -O3 برای برخی مقصدها فعال است.
- -fno-ira-share-save-slots
- غیرفعالسازی اشتراکگذاری خانههای پشته (stack slots) مورد استفاده برای ذخیرهٔ ثباتهای سختافزاری استفادهشده در فراخوانی که در طول یک فراخوانی زنده میمانند. هر ثبات سختافزاری یک خانهٔ پشتهٔ جداگانه دریافت میکند و در نتیجه فریمهای پشتهٔ تابع بزرگتر میشوند.
- -fno-ira-share-spill-slots
- غیرفعالسازی اشتراکگذاری خانههای پشتهٔ تخصیصیافته به شبهثباتها (pseudo-registers). هر شبهثباتی که ثبات سختافزاری دریافت نکند یک خانهٔ پشتهٔ مجزا دریافت میکند و در نتیجه فریمهای پشتهٔ تابع بزرگتر میشوند.
- -flra-remat
- فعالسازی
بازتولید
حساس به CFG در
LRA. بهجای
بارگذاری
مقادیر
شبهثباتهای
سرریزشده
(spilled pseudos)، اگر
مقرونبهصرفه
باشد LRA تلاش
میکند
مقادیر را
مجدداً
بازتولید
(محاسبه
مجدد) کند.
در سطوح -O2، -O3 و -Os فعال میشود.
- -fdelayed-branch
- در صورت
پشتیبانی
ماشین
مقصد، تلاش
میکند تا
دستورالعملها
را به منظور
بهرهبرداری
از
شکافهای
دستورالعمل
موجود پس از
پرشهای با
تأخیر (delayed branch)
بازآرایی
کند.
در سطوح -O1، -O2، -O3 و -Os فعال میشود، اما در -Og فعال نیست.
- -fschedule-insns
- در صورت
پشتیبانی
ماشین
مقصد، تلاش
میکند
دستورالعملها
را برای حذف
توقفهای
اجرایی (execution stalls)
ناشی از
دردسترسنبودن
دادههای
مورد نیاز
بازآرایی
کند. این
گزینه به
ماشینهایی
با
دستورالعملهای
کندِ
بارگذاری
حافظه یا
ممیز شناور
کمک
میکند،
چرا که
اجازه
میدهد تا
زمان نیاز
به نتیجهٔ
بارگذاری
یا
دستورالعمل
ممیز
شناور،
سایر
دستورالعملها
صادر و اجرا
شوند.
بهطور معمول در سطوح بهینهسازی -O2 و -O3 فعال است. با این حال، بسیاری از مقصدها این رفتار را بازنویسی میکنند. برای مثال در x86 در تمامی سطوح غیرفعال است، در حالی که در AArch64 تنها در -O3 فعال است.
- -fschedule-insns2
- مشابه -fschedule-insns،
اما پس از
انجام
تخصیص
ثبات، یک
دور اضافی
از
زمانبندی
دستورالعملها
را درخواست
میکند. این
گزینه
بهویژه در
ماشینهایی
با تعداد
ثباتهای
نسبتاً کم و
جایی که
دستورالعملهای
بارگذاری
حافظه بیش
از یک چرخه
زمان
میبرند،
مفید است.
در سطوح -O2، -O3 و -Os فعال میشود.
- -fno-sched-interblock
- غیرفعال کردن زمانبندی دستورالعملها در میان بلوکهای پایه (basic blocks)، که معمولاً هنگام زمانبندی پیش از تخصیص ثبات، یعنی با -fschedule-insns یا در -O2 یا بالاتر، فعال است.
- -fno-sched-spec
- غیرفعال کردن جابهجایی گمانهزنانهٔ (speculative motion) دستورالعملهای غیربارگذاری، که معمولاً هنگام زمانبندی پیش از تخصیص ثبات، یعنی با -fschedule-insns یا در -O2 یا بالاتر، فعال است.
- -fsched-pressure
- فعال کردن زمانبندی دستورالعملها با در نظر گرفتن فشار ثباتها پیش از تخصیص ثبات. این گزینه تنها زمانی معنادار است که زمانبندی پیش از تخصیص ثبات فعال باشد، یعنی با -fschedule-insns یا در -O2 یا بالاتر. استفاده از این گزینه میتواند با جلوگیری از افزایش فشار ثبات فراتر از تعداد ثباتهای سختافزاری در دسترس و سرریزهای متعاقب در تخصیص ثبات، کد تولیدشده را بهبود بخشد و اندازهٔ آن را کاهش دهد.
- -fsched-spec-load
- اجازه دادن به جابهجایی گمانهزنانهٔ برخی از دستورالعملهای بارگذاری. این گزینه تنها زمانی معنادار است که زمانبندی پیش از تخصیص ثبات فعال باشد، یعنی با -fschedule-insns یا در -O2 یا بالاتر.
- -fsched-spec-load-dangerous
- اجازه دادن به جابهجایی گمانهزنانهٔ دستورالعملهای بارگذاری بیشتر. این گزینه تنها زمانی معنادار است که زمانبندی پیش از تخصیص ثبات فعال باشد، یعنی با -fschedule-insns یا در -O2 یا بالاتر.
- -fsched-stalled-insns
- -fsched-stalled-insns=n
- تعریف میکند چه تعداد دستورالعمل (در صورت وجود) میتوانند در طول دومین دور زمانبندی، پیش از موعد از صف دستورالعملهای متوقفشده به فهرست آماده منتقل شوند. -fno-sched-stalled-insns به این معنی است که هیچ دستورالعملی پیش از موعد منتقل نمیشود، و -fsched-stalled-insns=0 یعنی هیچ محدودیتی برای تعداد دستورالعملهای صفبندیشده که میتوانند پیش از موعد منتقل شوند وجود ندارد. -fsched-stalled-insns بدون مقدار معادل -fsched-stalled-insns=1 است.
- -fsched-stalled-insns-dep
- -fsched-stalled-insns-dep=n
- مشخص میکند که چه تعداد گروه دستورالعمل (چرخهها) برای وابستگی به یک دستورالعمل متوقفشده که نامزد حذف زودهنگام از صف دستورالعملهای متوقفشده است، بررسی شوند. این گزینه تنها در طی گام دوم زمانبندی، و تنها در صورتی که -fsched-stalled-insns استفاده شده باشد تأثیر دارد. -fno-sched-stalled-insns-dep معادل با -fsched-stalled-insns-dep=0 است. -fsched-stalled-insns-dep بدون مقدار معادل با -fsched-stalled-insns-dep=1 است.
- -fsched2-use-superblocks
- هنگام
زمانبندی
پس از تخصیص
ثبات، از
زمانبندی
ابربلوک (superblock
scheduling) استفاده
میکند. این
کار امکان
جابهجایی
در میان
مرزهای
بلوک پایه
را فراهم
کرده و منجر
به
زمانبندیهای
سریعتر
میشود. این
گزینه
آزمایشی
است، چرا که
تمام
توصیفهای
ماشین
استفادهشده
توسط GCC
پردازنده
را به
اندازه
کافی دقیق
مدلسازی
نمیکنند
تا از نتایج
غیرقابلاتکای
این
الگوریتم
جلوگیری
شود.
این گزینه تنها هنگام زمانبندی پس از تخصیص ثبات معنا دارد، یعنی همراه با -fschedule-insns2 یا در -O2 یا بالاتر.
- -fsched-group-heuristic
- ابتکار گروهی (group heuristic) را در زمانبند فعال میکند. این ابتکار به دستورالعملی که به یک گروه زمانبندی تعلق دارد اولویت میدهد. این گزینه بهطور پیشفرض هنگام فعال بودن زمانبندی، یعنی همراه با -fschedule-insns یا -fschedule-insns2 یا در -O2 یا بالاتر فعال است.
- -fsched-critical-path-heuristic
- ابتکار مسیر بحرانی (critical-path heuristic) را در زمانبند فعال میکند. این ابتکار به دستورالعملهای روی مسیر بحرانی اولویت میدهد. این گزینه بهطور پیشفرض هنگام فعال بودن زمانبندی، یعنی همراه با -fschedule-insns یا -fschedule-insns2 یا در -O2 یا بالاتر فعال است.
- -fsched-spec-insn-heuristic
- ابتکار دستورالعملهای گمانهزنانه (speculative instruction heuristic) را در زمانبند فعال میکند. این ابتکار به دستورالعملهای گمانهزنانه با ضعف وابستگی بیشتر اولویت میدهد. این گزینه بهطور پیشفرض هنگام فعال بودن زمانبندی، یعنی همراه با -fschedule-insns یا -fschedule-insns2 یا در -O2 یا بالاتر فعال است.
- -fsched-rank-heuristic
- ابتکار رتبه (rank heuristic) را در زمانبند فعال میکند. این ابتکار به دستورالعمل متعلق به بلوک پایهای با اندازه یا بسامد بزرگتر اولویت میدهد. این گزینه بهطور پیشفرض هنگام فعال بودن زمانبندی، یعنی همراه با -fschedule-insns یا -fschedule-insns2 یا در -O2 یا بالاتر فعال است.
- -fsched-last-insn-heuristic
- ابتکار آخرین دستورالعمل (last-instruction heuristic) را در زمانبند فعال میکند. این ابتکار به دستورالعملی که وابستگی کمتری به آخرین دستورالعمل زمانبندیشده دارد اولویت میدهد. این گزینه بهطور پیشفرض هنگام فعال بودن زمانبندی، یعنی همراه با -fschedule-insns یا -fschedule-insns2 یا در -O2 یا بالاتر فعال است.
- -fsched-dep-count-heuristic
- ابتکار تعداد وابستگیها (dependent-count heuristic) را در زمانبند فعال میکند. این ابتکار به دستورالعملی که دستورالعملهای بیشتری به آن وابسته هستند اولویت میدهد. این گزینه بهطور پیشفرض هنگام فعال بودن زمانبندی، یعنی همراه با -fschedule-insns یا -fschedule-insns2 یا در -O2 یا بالاتر فعال است.
- -fspeculatively-call-stored-functions
- تلاش میکند تا در صورتی که تمام ذخیرهسازیهای مرئی در یک فیلد ساختار فقط یک نامزد واحد را ذخیره کنند، فراخوانیهای غیرمستقیم اشارهگرهای تابع بارگذاریشده از آن فیلد را به فراخوانی مستقیم تبدیل کند. هنگام انجام این کار، فراخوانی به یک عبارت شرطی تبدیل میشود که بین فراخوانی مستقیم و فراخوانی غیرمستقیم اصلی تصمیم میگیرد. این فراخوانیهای گمانهزنانه اغلب بهینهسازیهای بیشتری مانند درونخطیسازی (inlining) را ممکن میسازند. چنانچه پس از بهینهسازی بیشتر بیفایده به نظر برسند، به شکل اصلی خود بازگردانده میشوند.
- -freschedule-modulo-scheduled-loops
- زمانبندی پیمانهای (modulo scheduling) پیش از زمانبندی سنتی انجام میشود. اگر حلقهای بهصورت پیمانهای زمانبندی شده باشد، گامهای بعدی زمانبندی ممکن است زمانبندی آن را تغییر دهند. از این گزینه برای واپایش این رفتار استفاده کنید.
- -fselective-scheduling
- دستورالعملها را با استفاده از الگوریتم زمانبندی انتخابی (selective scheduling) زمانبندی میکند. زمانبندی انتخابی به جای اولین گام زمانبند اجرا میشود.
- -fselective-scheduling2
- دستورالعملها را با استفاده از الگوریتم زمانبندی انتخابی زمانبندی میکند. زمانبندی انتخابی به جای دومین گام زمانبند اجرا میشود.
- -fsel-sched-pipelining
- خطلولهسازی نرمافزاری (software pipelining) درونیترین حلقهها را در حین زمانبندی انتخابی فعال میکند. این گزینه هیچ تأثیری ندارد مگر اینکه یکی از گزینههای -fselective-scheduling یا -fselective-scheduling2 فعال باشد.
- -fsel-sched-pipelining-outer-loops
- هنگام خطلولهسازی حلقهها در حین زمانبندی انتخابی، حلقههای بیرونی را نیز خطلولهسازی میکند. این گزینه هیچ تأثیری ندارد مگر اینکه -fsel-sched-pipelining فعال باشد.
- -fsemantic-interposition
- برخی قالبهای شیء، مانند ELF، اجازه میانگذاری (interposing) نمادها توسط پیونددهنده پویا را میدهند. این بدان معناست که برای نمادهای صادرشده از DSO، کامپایلر نمیتواند انتشار بینروالها، درونخطیسازی و سایر بهینهسازیها را با این فرض که تابع یا متغیر مربوطه ممکن است تغییر کند، انجام دهد. در حالی که این قابلیت، برای مثال برای بازنویسی توابع تخصیص حافظه با یک پیادهسازی اشکالزدایی مفید است، از نظر کیفیت کد پرهزینه است. با گزینه -fno-semantic-interposition کامپایلر فرض میکند که اگر میانگذاری برای توابع رخ دهد، تابع بازنویسیکننده دقیقاً همان معناشناسی (و عوارض جانبی) را خواهد داشت. به همین ترتیب، اگر میانگذاری برای متغیرها رخ دهد، سازنده متغیر یکسان خواهد بود. این پرچم روی توابعی که صریحاً inline تعریف شدهاند (جایی که هرگز اجازه داده نمیشود میانگذاری معناشناسی را تغییر دهد) و برای نمادهایی که صریحاً weak تعریف شدهاند، هیچ تأثیری ندارد.
- -fshrink-wrap
- دیباچههای تابع (prologues) را تنها پیش از بخشهایی از تابع درج میکند که به آن نیاز دارند، به جای اینکه در ابتدای تابع قرار گیرد. این پرچم بهطور پیشفرض در -O و بالاتر فعال است.
- -fshrink-wrap-separate
- بخشهای مجزای دیباچه و مؤخره (epilogue) را بهطور جداگانه جمعوجور میکند (shrink-wrap)، بهگونهای که آن بخشها تنها در صورت نیاز اجرا شوند. این گزینه بهطور پیشفرض روشن است، اما هیچ تأثیری ندارد مگر اینکه -fshrink-wrap نیز فعال بوده و هدف (target) از آن پشتیبانی کند.
- -fcaller-saves
- تخصیص
مقادیر به
ثباتهایی
را که توسط
فراخوانیهای
تابع مخدوش
(clobber) میشوند،
با درج
دستورالعملهای
اضافه جهت
ذخیره و
بازیابی
ثباتها در
اطراف این
فراخوانیها
فعال
میکند.
چنین
تخصیصی
تنها زمانی
انجام
میشود که
به نظر برسد
به کدی بهتر
منجر
میشود.
این گزینه در برخی ماشینها، معمولاً ماشینهایی که ثباتهای حفظشده در فراخوانی (call-preserved) برای استفاده به عنوان جایگزین ندارند، همیشه بهطور پیشفرض فعال است.
در سطوح -O2، -O3 و -Os فعال است.
- -fcombine-stack-adjustments
- تنظیمات
پشته
(دستورات push و
pop) و ارجاعات
حافظه پشته
را ردیابی
کرده و سپس
تلاش
میکند
راههایی
برای ترکیب
آنها
بیابد.
بهطور پیشفرض در -O1 و بالاتر فعال است.
- -fipa-ra
- در صورتی که
ثباتهای
ذخیرهشونده
توسط
فراخواننده
(caller save) توسط هیچ
تابع
فراخوانیشدهای
استفاده
نشوند، از
آنها برای
تخصیص
استفاده
میکند. در
این صورت
نیازی به
ذخیره و
بازیابی
آنها در
اطراف
فراخوانیها
نیست. این
کار تنها در
صورتی ممکن
است که
توابع
فراخوانیشده
بخشی از
همان واحد
ترجمه تابع
فعلی بوده و
پیش از آن
کامپایل
شده باشند.
در سطوح -O2، -O3 و -Os فعال است، با این حال این گزینه در صورتی که کد تولیدشده برای پروفایلسازی ابزاربندی شود (-p یا -pg) یا اگر نتوان نحوه استفاده فراخواندهشده (callee) از ثبات را بهطور دقیق دانست (این وضعیت در اهدافی رخ میدهد که دیباچهها و مؤخرهها را در RTL آشکار نمیکنند)، غیرفعال میشود.
- -fconserve-stack
- تلاش برای کمینهسازی مصرف پشته. کامپایلر تلاش میکند فضای پشته کمتری مصرف کند، حتی اگر این کار برنامه را کندتر سازد. این گزینه متضمن تنظیم پارامتر large-stack-frame روی 100 و پارامتر large-stack-frame-growth روی 400 است.
- -ftree-reassoc
- انجمنپذیری مجدد (reassociation) را روی درختها انجام میدهد. این پرچم بهطور پیشفرض در -O1 و بالاتر فعال است.
- -fcode-hoisting
- بالابردن کد (code hoisting) را انجام میدهد. بالابردن کد سعی میکند ارزیابی عباراتی را که در تمام مسیرها به سمت خروج تابع اجرا میشوند، تا حد امکان به مراحل اولیهتر منتقل کند. این کار بهویژه به عنوان یک بهینهسازی اندازه کد مفید است، اما اغلب به سرعت کد نیز کمک میکند. این پرچم بهطور پیشفرض در -O2 و بالاتر فعال است.
- -ftree-pre
- حذف افزونگی جزئی (PRE) را روی درختها انجام میدهد. این پرچم بهطور پیشفرض در -O2 و -O3 فعال است.
- -ftree-partial-pre
- حذف افزونگی جزئی (PRE) را تهاجمیتر میکند. این پرچم بهطور پیشفرض در -O3 فعال است.
- -ftree-forwprop
- انتشار رو به جلو (forward propagation) را روی درختها انجام میدهد. این پرچم بهطور پیشفرض در -O1 و بالاتر فعال است.
- -ftree-fre
- حذف افزونگی کامل (FRE) را روی درختها انجام میدهد. تفاوت بین FRE و PRE در این است که FRE تنها عباراتی را در نظر میگیرد که در تمام مسیرهای منتهی به محاسبات زائد محاسبه شده باشند. این تحلیل سریعتر از PRE است، هرچند افزونگیهای کمتری را شناسایی میکند. این پرچم بهطور پیشفرض در -O1 و بالاتر فعال است..IP -ftree-phiprop 4 انتقال رو به بالای بارگذاریها (load hoisting) از اشارهگرهای شرطی را روی درختها انجام میدهد. این مرحله بهطور پیشفرض در -O1 و بالاتر فعال است.
- -fhoist-adjacent-loads
- بارگذاریها از هر دو شاخه یک if-then-else را در صورتی که بارگذاریها از مکانهای مجاور در یک ساختار یکسان باشند و معماری مقصد دارای دستور انتقال شرطی (conditional move) باشد، بهطور حدسی بالا میکشد. این پرچم بهطور پیشفرض در -O2 و بالاتر فعال است.
- -ftree-copy-prop
- انتشار کپی (copy propagation) را روی درختها انجام میدهد. این مرحله عملیات کپی غیرضروری را حذف میکند. این پرچم بهطور پیشفرض در -O1 و بالاتر فعال است.
- -fipa-pure-const
- تشخیص میدهد که کدام توابع خالص (pure) یا ثابت (constant) هستند. بهطور پیشفرض در -O1 و بالاتر فعال است.
- -fipa-reference
- تشخیص میدهد کدام متغیرهای ایستا (static) از واحد ترجمه فراتر نمیروند. بهطور پیشفرض در -O1 و بالاتر فعال است.
- -fipa-reference-addressable
- متغیرهای ایستای فقطخواندنی، فقطنوشتنی و غیرقابل آدرسدهی را تشخیص میدهد. بهطور پیشفرض در -O1 و بالاتر فعال است.
- -fipa-reorder-for-locality
- زنجیرههای فراخوانی را در چیدمان باینری کنار یکدیگر گروهبندی میکند تا محلیبودن کد (code 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
- در صورت فعال بودن، انتشار میانروالی دامنههای مقادیر (value ranges) را انجام میدهد. این پرچم بهطور پیشفرض در -O2 فعال است. این گزینه نیازمند فعال بودن -fipa-cp است.
- -fipa-icf-functions
- -fipa-icf-variables
- -fipa-icf
- ادغام
کدهای
یکسان (Identical Code Folding)
را برای
توابع
(-fipa-icf-functions)،
متغیرهای
فقطخواندنی
(-fipa-icf-variables)، یا هر
دو (-fipa-icf)
انجام
میدهد. این
بهینهسازی
اندازه کد
را کاهش
میدهد و
ممکن است با
جایگزین
کردن یک
تابع با
تابعی
معادل با
نامی
متفاوت،
بازگشایی
پشته (unwind stack) را
مختل کند.
این
بهینهسازی
در صورت
فعال بودن
بهینهسازی
زمان
پیوند،
مؤثرتر عمل
میکند.
اگرچه این رفتار مشابه بهینهسازی ICF در پیونددهنده Gold است، اما ICF در GCC در سطوح متفاوتی عمل میکند و بنابراین بهینهسازیها یکسان نیستند - همارزیهایی وجود دارند که فقط توسط GCC یافت میشوند و همارزیهایی که فقط توسط Gold پیدا میشوند.
گزینه -fipa-icf بهطور پیشفرض در -O2 و -Os فعال است.
- -flate-combine-instructions
- دو مرحله
ترکیب
دستورالعمل
را فعال
میکند که
نسبتاً در
مراحل
پایانی
فرایند
کامپایل
اجرا
میشوند.
یکی از این
مراحل قبل
از تخصیص
ثبات و
دیگری پس از
تخصیص ثبات
اجرا
میشود. هدف
اصلی این
مراحل،
جایگزینی
تعاریف در
تمام موارد
استفاده
است.
اکثر معماریهای مقصد این پرچم را بهطور پیشفرض در -O2 و -Os فعال میکنند.
- -flive-patching=level
- بهینهسازیهای
GCC را برای
تولید
خروجی
مناسب جهت
وصلهزدن
زنده (live-patching)
کنترل
میکند.
اگر بهینهسازی کامپایلر از بدنه یک تابع یا اطلاعات استخراجشده از بدنه آن برای بهینهسازی/تغییر تابع دیگری استفاده کند، تابع دوم را تابع تأثیرپذیرفته (impacted function) از تابع اول مینامند. اگر تابعی وصله شود، توابع تأثیرپذیرفته از آن نیز باید وصله شوند.
توابع تأثیرپذیرفته توسط بهینهسازیهای میانروالی کامپایلر تعیین میشوند. برای نمونه، فراخواننده زمانی تأثیر میپذیرد که تابعی درون فراخوانندهاش درونریزی (inline) شود، تابعی همتاسازی شود و فراخوانندهاش برای فراخوانی این همتای جدید تغییر یابد، یا اطلاعات خلوص/ثابتبودن تابع برای بهینهسازی فراخوانندههای مستقیم یا غیرمستقیم آن استخراج شود، و غیره.
معمولاً هر چه بهینهسازیهای IPA بیشتری فعال باشند، تعداد توابع تأثیرپذیرفته برای هر تابع بیشتر خواهد بود. به منظور کنترل تعداد توابع تأثیرپذیرفته و محاسبه آسانتر فهرست توابع تأثیرپذیرفته، بهینهسازیهای IPA را میتوان بهطور جزئی در دو سطح مختلف فعال کرد.
آرگومان level باید یکی از موارد زیر باشد:
- inline-clone
- فقط
بهینهسازیهای
درونریزی
و همتاسازی
را فعال
میکند که
شامل
درونریزی،
همتاسازی،
جایگزینی
نردهای
میانروالی
تجمعات و
درونریزی
جزئی است.
در نتیجه،
هنگام
وصلهزدن
یک تابع،
تمام
فراخوانندههای
آن و
فراخوانندههای
همتاهای آن
متأثر شده و
بنابراین
لازم است
آنها نیز
وصله شوند.
گزینه -flive-patching=inline-clone پرچمهای بهینهسازی زیر را غیرفعال میکند: -fwhole-program -fipa-pta -fipa-reference -fipa-ra -fipa-icf -fipa-icf-functions -fipa-icf-variables -fipa-bit-cp -fipa-vrp -fipa-pure-const -fipa-reference-addressable -fipa-stack-alignment -fipa-modref
- inline-only-static
- فقط
درونریزی
توابع
ایستا را
فعال
میکند. در
نتیجه،
هنگام
وصلهزدن
یک تابع
ایستا،
تمام
فراخوانندههای
آن متأثر
شده و
بنابراین
باید آنها
نیز وصله
شوند.
علاوه بر تمام پرچمهایی که -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
- انتشار شرطی تنکِ ثابتهای بیتی را روی درختها انجام داده و اطلاعات همترازی اشارهگرها را منتشر میکند. این گذر تنها روی متغیرهای اسکالر محلی عمل کرده و بهطور پیشفرض در -O1 و بالاتر، بهجز -Og، فعال است. این گزینه نیازمند فعال بودن -ftree-ccp است.
- -ftree-ccp
- انتشار شرطی تنکِ ثابتها (CCP) را روی درختها انجام میدهد. این گذر تنها روی متغیرهای اسکالر محلی عمل کرده و بهطور پیشفرض در -O1 و بالاتر فعال است.
- -fssa-backprop
- اطلاعات مربوط به کاربردهای یک مقدار را در امتداد زنجیرهٔ تعریف به سمت بالا منتشر میکند تا تعاریف سادهسازی شوند. برای نمونه، اگر علامت یک مقدار هرگز اهمیتی نداشته باشد، این گذر عملیات علامت را حذف میکند. این پرچم بهطور پیشفرض در -O1 و بالاتر فعال است.
- -fssa-phiopt
- تطبیق الگو را روی گرههای SSA PHI برای بهینهسازی کدهای شرطی انجام میدهد. این گذر بهطور پیشفرض در -O1 و بالاتر، بهجز -Og، فعال است.
- -ftree-switch-conversion
- مقداردهیهای اولیهٔ ساده در یک ساختار switch را به مقداردهیهای اولیه از یک آرایهٔ اسکالر تبدیل میکند. این پرچم بهطور پیشفرض در -O2 و بالاتر فعال است.
- -ftree-tail-merge
- به دنبال توالیهای کد یکسان میگردد. در صورت یافتن، یکی را با یک پرش به دیگری جایگزین میکند. این بهینهسازی به ادغام دنباله (tail merging) یا پرش متقاطع (cross jumping) معروف است. این پرچم بهطور پیشفرض در -O2 و بالاتر فعال است. زمان کامپایل در این گذر میتواند با استفاده از پارامتر max-tail-merge-comparisons و پارامتر max-tail-merge-iterations محدود شود.
- -ftree-cselim
- حذف ذخیرهسازیهای شرطی را روی درختها انجام میدهد. این پرچم بهطور پیشفرض در -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) انجام میدهد. این گزینه همچنین ریسهبندی پرشها (برای کاهش پرشهای متوالی به پرشهای دیگر) را انجام میدهد. این پرچم بهطور پیشفرض در -O1 و بالاتر فعال است.
- -ftree-dse
- حذف ذخیرهسازیهای مرده (DSE) را روی درختها انجام میدهد. ذخیرهسازی مرده عملیات ذخیرهای در مکانی از حافظه است که پس از آن، بدون هیچ بارگذاری مداخلهگری، توسط یک ذخیرهسازی دیگر بازنویسی میشود. در این حالت ذخیرهسازی پیشین میتواند حذف شود. این پرچم بهطور پیشفرض در -O1 و بالاتر فعال است.
- -ftree-ch
- رونوشتبرداری از سرآیند حلقه را روی درختها انجام میدهد. این امر سودمند است چرا که بازدهی بهینهسازیهای جابهجایی کد را افزایش میدهد. همچنین صرفهجویی در یک پرش را به همراه دارد. این پرچم بهطور پیشفرض در -O1 و بالاتر فعال است. این گزینه برای -Os فعال نمیشود، زیرا معمولاً اندازهٔ کد را افزایش میدهد.
- -ftree-loop-optimize
- بهینهسازیهای حلقه را روی درختها انجام میدهد. این پرچم بهطور پیشفرض در -O1 و بالاتر فعال است.
- -ftree-loop-linear
- -floop-strip-mine
- -floop-block
- بهینهسازیهای حلقههای تودرتو را انجام میدهد. معادل -floop-nest-optimize است. برای استفاده از این تبدیل کد، GCC باید با --with-isl پیکربندی شده باشد تا زیرساخت تبدیل حلقهٔ Graphite فعال گردد.
- -fgraphite-identity
- تبدیل همانی را برای graphite فعال میکند. برای هر SCoP نمایش چندوجهی تولید شده و مجدداً به gimple تبدیل میشود. با استفاده از -fgraphite-identity میتوان هزینهها یا مزایای تبدیل GIMPLE -> GRAPHITE -> GIMPLE را ارزیابی کرد. همچنین برخی بهینهسازیهای کمینه توسط تولیدکنندهٔ کد isl انجام میشود، مانند تفکیک شاخص و حذف کدهای مرده در حلقهها.
- -floop-nest-optimize
- بهینهساز حلقههای تودرتو بر پایهٔ isl را فعال میکند. این یک بهینهساز عمومی حلقههای تودرتو بر اساس الگوریتمهای بهینهسازی Pluto است. این گزینه ساختار حلقهای را که برای مکانمندی دادهها و موازیسازی بهینه شده است محاسبه میکند. این گزینه آزمایشی است.
- -floop-parallelize-all
- از تحلیل وابستگی دادهٔ Graphite برای شناسایی حلقههایی که قابلیت موازیسازی دارند استفاده میکند. تمام حلقههایی را که طبق تحلیل فاقد وابستگیهای وابسته به دورِ حلقه (loop carried dependences) هستند، بدون بررسی سودآور بودن موازیسازی، موازی میکند.
- -ftree-coalesce-vars
- هنگام تبدیل برنامه به خارج از نمایش SSA، تلاش میکند به جای متغیرهای موقت کامپایلر، با ادغام نسخههای مختلف متغیرهای تعریفشده توسط کاربر، حجم رونوشتبرداریها را کاهش دهد. این امر ممکن است توانایی عیبیابی برنامهای بهینهشده را که با -fno-var-tracking-assignments کامپایل شده است بهشدت محدود کند. در صورت نفی، این پرچم مانع ادغام متغیرهای کاربر در SSA میشود. این گزینه در صورت فعال بودن بهینهسازی بهطور پیشفرض فعال است و در غیر این صورت اثر اندکی دارد.
- -ftree-loop-if-convert
- تلاش میکند تا پرشهای شرطی در درونیترین حلقهها را به معادلهای بدون انشعاب تبدیل کند. هدف، حذف جریان کنترل از درونیترین حلقهها به منظور بهبود توانایی مرحلهٔ بردارسازی در مدیریت این حلقهها است. این گزینه در صورت فعال بودن بردارسازی بهطور پیشفرض فعال است.
- -ftree-loop-distribution
- توزیع حلقه
را انجام
میدهد. این
پرچم
میتواند
کارایی
حافظهٔ
نهان را روی
بدنههای
بزرگ حلقه
بهبود
بخشیده و
امکان
اعمال
بهینهسازیهای
بیشتر روی
حلقه،
مانند
موازیسازی
یا
بردارسازی
را فراهم
کند. برای
نمونه،
حلقهٔ
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 zero تبدیل میشود.
- -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
- انجام برداریسازی در سطح بلوک پایه (SLP) روی درختها. این پرچم به صورت پیشفرض در -O2 و توسط -ftree-vectorize، -fprofile-use و -fauto-profile فعال میشود.
- -ftrivial-auto-var-init=choice
- مقداردهی
اولیه
متغیرهای
محلی
خودکار یا
اشیاء موقت
با یک الگو
یا با صفر،
به منظور
افزایش
امنیت و
پیشبینیپذیری
برنامه از
طریق
جلوگیری از
افشا و
استفاده از
حافظه
مقداردهینشده.
کامپایلر 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) اتفاق نمیافتد.
توجه داشته باشید که مقادیر مقدارده اولیه، چه zero و چه pattern، به بازنمایی دادهها (در حافظه یا ثباتهای ماشین) اشاره دارند تا به تفسیر آنها به عنوان مقادیر عددی. این تمایز ممکن است در زبانهایی که از انواع داده با بایاس (bias) یا ضرایب ضمنی پشتیبانی میکنند، و با افزونههایی نظیر hardbool اهمیت داشته باشد. برای مثال، متغیری که از ۸ بیت برای نمایش مقادیر (بایاسشده) در محدوده "range 160..400" استفاده میکند، بسته به choice با الگوهای بیتی 0x00 یا 0xFE مقداردهی خواهد شد، صرف نظر از اینکه آیا این بازنماییها نشاندهنده مقادیری در آن محدوده هستند یا خیر؛ و حتی اگر باشند، تفسیر مقدار موجود در متغیر به مقدار بایاس بستگی خواهد داشت. یک متغیر hardbool که مثلاً از 0x5A و 0xA5 به ترتیب برای "false" و "true" استفاده میکند، با هر دو انتخاب choice مربوط به مقداردهی اولیه به دام (trap) میافتد، یعنی مقداردهی zero به بازنمایی مربوط به "false" تبدیل نخواهد شد، حتی اگر این کار برای متغیر "static" از همان نوع انجام شود. این بدان معناست که الگوی مقدارده اولیه عموماً به نوع متغیر مقداردهیشده وابسته نیست. یک استثنای قابل توجه این است که متغیرهای بولی (نامقاومسازیشده) که درون ثباتها جای میگیرند، حتی در صورت درخواست pattern با مقدار "false" (صفر) مقداردهی میشوند.
میتوانید این رفتار را برای یک متغیر خاص با استفاده از ویژگی استاندارد متغیر "uninitialized" یا در C++26 با استفاده از ویژگی "[[indeterminate]]" کنترل کنید. مدل هزینه مورد استفاده برای بردارسازی را تغییر میدهد. آرگومان model باید یکی از مقادیر unlimited، dynamic، cheap یا very-cheap باشد. در مدل unlimited فرض میشود مسیر کد برداریشده همیشه سودمند است، در حالی که در مدل dynamic یک بررسی در زمان اجرا از مسیر کد برداریشده محافظت میکند تا تنها برای تعداد تکرارهایی فعال شود که احتمالاً سریعتر از اجرای حلقه اسکالر اصلی خواهند بود. مدل cheap بردارسازی حلقههایی را که انجام آن هزینهبر است غیرفعال میکند؛ مثلاً به دلیل نیاز به بررسیهای زمان اجرا برای وابستگی داده یا تراز بودن، اما در غیر این صورت معادل مدل dynamic است. مدل very-cheap در صورت نیاز به هرگونه بررسی زمان اجرا برای وابستگی داده یا تراز بودن، بردارسازی حلقهها را غیرفعال میکند؛ همچنین بردارسازی حلقههای خاتمه (epilogue) را نیز غیرفعال میکند اما در غیر این صورت معادل مدل cheap است.
مدل هزینه پیشفرض به دیگر پرچمهای بهینهسازی بستگی دارد و یا dynamic است یا cheap.
- -fsimd-cost-model=model
- مدل هزینه مورد استفاده برای بردارسازی حلقههای مشخصشده با دایرکتیو OpenMP simd را تغییر میدهد. آرگومان model باید یکی از مقادیر unlimited، dynamic یا cheap باشد. تمامی مقادیر model همان مفهوم شرح دادهشده در -fvect-cost-model را دارند و بهطور پیشفرض از مدل هزینه تعریفشده با -fvect-cost-model استفاده میشود.
- -ftree-vrp
- انتشار محدوده مقادیر (Value Range Propagation) را روی درختها انجام میدهد. این عملیات شبیه به گذرگاه انتشار ثوابت است، اما به جای مقادیر، محدودهای از مقادیر منتشر میشوند. این امر به بهینهسازها امکان میدهد بررسیهای غیرضروری محدوده مانند بررسی حدود آرایهها و بررسی اشارهگر تهی (null pointer) را حذف کنند. این گزینه بهطور پیشفرض در سطوح -O2 و بالاتر فعال است. حذف بررسی اشارهگر تهی تنها در صورتی انجام میشود که -fdelete-null-pointer-checks فعال باشد.
- -fsplit-paths
- مسیرهایی را که به یالهای بازگشتی حلقه منتهی میشوند، تقسیم میکند. این امر میتواند حذف کدهای مرده و حذف عبارات مشترک فرعی را بهبود بخشد. این گزینه بهطور پیشفرض در سطوح -O3 و بالاتر فعال است.
- -fsplit-ivs-in-unroller
- بیان
مقادیر
متغیرهای
القایی در
تکرارهای
بعدی حلقه
بازشده را
با استفاده
از مقدار
موجود در
تکرار اول
فعال
میکند. این
کار
زنجیرههای
طولانی
وابستگی را
میشکند و
در نتیجه
کارایی
گذرگاههای
زمانبندی
را بهبود
میبخشد.
ترکیبی از -fweb و CSE اغلب برای رسیدن به اثر مشابه کافی است. با این حال، در مواردی که بدنه حلقه پیچیدهتر از یک بلوک پایه منفرد است، این روش قابل اطمینان نیست. همچنین روی برخی معماریها به دلیل محدودیتهای موجود در گذرگاه CSE بههیچوجه کار نمیکند.
این بهینهسازی بهطور پیشفرض فعال است.
- -fvariable-expansion-in-unroller
- با این
گزینه،
کامپایلر
هنگام باز
کردن حلقه،
چندین
رونوشت از
برخی
متغیرهای
محلی ایجاد
میکند که
میتواند
به ایجاد
کدی با
کارایی
برتر منجر
شود.
این بهینهسازی بهطور پیشفرض برای مقصدهای PowerPC فعال است، اما در غیر این صورت بهطور پیشفرض غیرفعال است.
- -fpartial-inlining
- بخشهایی
از توابع را
درونخطی (inline)
میکند. این
گزینه تنها
زمانی
تأثیر دارد
که خودِ
درونخطیسازی
با
گزینههای
-finline-functions یا -finline-small-functions
فعال شده
باشد.
در سطوح -O2، -O3 و -Os فعال است.
- -fpredictive-commoning
- بهینهسازی
اشتراکپذیری
پیشبینانه
را انجام
میدهد؛
یعنی
استفاده
مجدد از
محاسبات
(بهویژه
بارگذاریها
و
ذخیرهسازیهای
حافظه) که
در
تکرارهای
قبلی
حلقهها
انجام شده
است.
این گزینه در سطح -O3 فعال است. همچنین توسط -fprofile-use و -fauto-profile نیز فعال میشود.
- -fprefetch-loop-arrays
- در صورت
پشتیبانی
ماشین
مقصد،
دستورالعملهایی
برای
پیشواکشی
(prefetch) حافظه
تولید
میکند تا
عملکرد
حلقههایی
که به
آرایههای
بزرگ
دسترسی
دارند
بهبود یابد.
این گزینه ممکن است کدی بهتر یا بدتر تولید کند؛ نتایج بهشدت به ساختار حلقهها درون کد منبع بستگی دارد.
در سطح -Os غیرفعال است.
- -fno-printf-return-value
- ثوابت را
جایگزین
مقادیر
بازگشتی
مشخص توابع
خروجی
قالببندیشده
مانند
"sprintf"،
"snprintf"،
"vsprintf" و
"vsnprintf" (اما
نه "printf"
یا "fprintf")
نمیکند.
این تبدیل
به GCC امکان
میدهد تا
شاخهها را
بر اساس
مقدار
بازگشتی
شناختهشده
این توابع —
هنگامی که
با
آرگومانهای
ثابت
فراخوانی
شدهاند یا
مقادیر
آنها در
محدودهای
قرار دارد
که تعیین
دقیق مقدار
بازگشتی را
ممکن
میسازد —
بهینهسازی
یا حتی حذف
کند. برای
نمونه،
هنگامی که
-fprintf-return-value فعال
است، هم
شاخه و هم
بدنه دستور
"if" (اما
نه
فراخوانی
"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
- هرگونه
بهینهسازی
روزنهای
(peephole) مختص به
ماشین را
غیرفعال
میکند.
تفاوت بین
-fno-peephole و -fno-peephole2 در
نحوه
پیادهسازی
آنها در
کامپایلر
است؛ برخی
مقصدها از
یکی، برخی
از دیگری و
تعداد
اندکی از هر
دو استفاده
میکنند.
-fpeephole بهطور پیشفرض فعال است. -fpeephole2 در سطوح -O2، -O3 و -Os فعال است.
- -fno-guess-branch-probability
- احتمالات
انشعاب را
با استفاده
از روشهای
ابتکاری (heuristics)
حدس
نمیزند.
اگر احتمالات انشعاب توسط بازخورد تحلیل کارایی (-fprofile-arcs) ارائه نشده باشند، GCC از روشهای ابتکاری برای حدس زدن آنها استفاده میکند. این روشهای ابتکاری بر پایه نمودار جریان کنترل هستند. اگر برخی احتمالات انشعاب توسط "__builtin_expect" مشخص شده باشند، روشهای ابتکاری برای حدس زدن احتمالات انشعاب برای بقیه نمودار جریان کنترل با در نظر گرفتن اطلاعات "__builtin_expect" به کار گرفته میشوند. تعاملات میان روشهای ابتکاری و "__builtin_expect" میتواند پیچیده باشد و در برخی موارد، ممکن است غیرفعال کردن روشهای ابتکاری مفید باشد تا درک اثرات "__builtin_expect" آسانتر گردد.
همچنین میتوان احتمال مورد انتظار عبارت را با استفاده از تابع توکار "__builtin_expect_with_probability" مشخص کرد.
پیشفرض در سطوح -O، -O2، -O3 و -Os برابر با -fguess-branch-probability است.
- -freorder-blocks
- بلوکهای
پایه را در
تابع
کامپایلشده
مجدداً
مرتب
میکند تا
تعداد
انشعابهای
پیمودهشده
کاهش یافته
و محلی بودن
کد (locality) بهبود
یابد.
در سطوح -O1، -O2، -O3 و -Os فعال است.
- -freorder-blocks-algorithm=algorithm
- از
الگوریتم
مشخصشده
برای
بازترتیب
بلوکهای
پایه
استفاده
میکند.
آرگومان algorithm
میتواند
simple باشد که
اندازه کد
را افزایش
نمیدهد
(مگر گاهی
به دلیل
اثرات
ثانویه
مانند
ترازسازی)،
یا stc، یعنی
الگوریتم
«software trace cache» که
تلاش
میکند
تمام
کدهایی را
که مکرراً
اجرا
میشوند در
کنار
یکدیگر
قرار دهد و
با ایجاد
رونوشتهای
اضافی از
کد، تعداد
انشعابهای
اجراشده را
به حداقل
برساند.
پیشفرض در سطوح -O1 و -Os برابر با simple، و در سطوح -O2 و -O3 برابر با stc است.
- -freorder-blocks-and-partition
- علاوه بر
بازترتیب
بلوکهای
پایه در
تابع
کامپایلشده
به منظور
کاهش تعداد
انشعابهای
پیمودهشده،
بلوکهای
پایه داغ و
سرد را به
بخشهای
جداگانهای
از
فایلهای
اسمبلی و .o
افرازش
میکند تا
عملکرد
صفحهبندی
و محلی بودن
حافظه
پنهان
بهبود یابد.
این بهینهسازی در حضور مدیریت استثنا یا جدولهای بازپیچی (unwind tables) (روی مقصدهایی که از طرحهای اختصاصی مقصد یا setjump/longjump استفاده میکنند)، برای بخشهای linkonce، برای توابعی با ویژگی بخش تعریفشده توسط کاربر و روی هر معماری که از بخشهای نامگذاریشده پشتیبانی نمیکند، بهطور خودکار خاموش میشود. هنگامی که -fsplit-stack استفاده میشود این گزینه بهطور پیشفرض فعال نیست (به منظور جلوگیری از خطاهای پیونددهنده)، اما ممکن است بهطور صریح فعال شود (در صورت استفاده از یک پیونددهنده سازگار).
برای x86 در سطوح -O2، -O3 و -Os فعال است.
- -freorder-functions
- توابع را در
فایل شیء
مجدداً
مرتب
میکند تا
محلی بودن
کد بهبود
یابد.
برخلاف
-fipa-reorder-for-locality، این
گزینه
گروهبندی
تمام
توابعِ
درون یک
دسته (hot/normal/cold/never-executed)
را در کنار
هم در
اولویت
قرار
میدهد. این
کار با
استفاده از
زیربخشهای
ویژه
".text.hot"
برای
توابعی که
بیشتر اجرا
میشوند و
".text.unlikely"
برای
توابعی که
احتمال
اجرای
آنها کم
است،
پیادهسازی
میشود.
بازترتیب
توسط
پیونددهنده
انجام
میشود،
بنابراین
قالب فایل
شیء باید از
بخشهای
نامگذاریشده
پشتیبانی
کند و
پیونددهنده
باید آنها
را به روشی
معقول در
جای خود
قرار دهد.
این گزینه مؤثر نخواهد بود مگر اینکه یا بازخورد تحلیل کارایی ارائه دهید (برای جزئیات -fprofile-arcs را ببینید) یا به صورت دستی توابع را با ویژگیهای "hot" یا "cold" نشانهگذاری کنید.
در سطوح -O2، -O3 و -Os فعال است..IP -fstrict-aliasing 4 به کامپایلر اجازه میدهد سختگیرانهترین قوانین نام مستعار (aliasing) قابل اعمال بر زبان در حال کامپایل را فرض کند. برای C (و ++C)، این گزینه بهینهسازیها را بر پایه نوع عبارات فعال میکند. بهویژه، دسترسی به شیئی از یک نوع از طریق عبارتی با نوعی دیگر مجاز نیست، مگر اینکه نوعها compatible types (نوعهای سازگار) باشند، فقط در علامتدار بودن (signedness) یا توصیفکنندهها (qualifiers) تفاوت داشته باشند، یا عبارت دارای یک نوع نویسهای (character type) باشد. دسترسی به اشیاء اسکالر از طریق نوع برداری متناظر نیز مجاز است.
برای نمونه، یک "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 رفتاری تعریفنشده (undefined behavior) است، اما GCC آن را به عنوان یک افزونه پشتیبانی میکند. بنابراین، کد بالا طبق انتظار کار میکند. با این حال، کد زیر ممکن است اینگونه کار نکند:
int f() { union a_union t; int* ip; t.d = 3.0; ip = &t.i; return *ip; }به همین ترتیب، دسترسی از طریق دریافت آدرس، تبدیل نوع (cast) اشارهگر حاصل و ارجاعزدایی (dereferencing) نتیجه، دارای رفتاری تعریفنشده است، حتی اگر تبدیل نوع از یک نوع union استفاده کند؛ مانند:
int f() { double d = 3.0; return ((union a_union *) &d)->i; }گزینهٔ -fstrict-aliasing در سطوح بهینهسازی -O2، -O3 و -Os فعال میشود.
- -fipa-strict-aliasing
- کنترل
میکند که
آیا قوانین
-fstrict-aliasing فراتر
از مرزهای
توابع
اعمال شوند
یا خیر.
توجه داشته
باشید که
اگر چندین
تابع درون
یک تابع
بهصورت
درونخطی (inline)
ادغام
شوند،
دسترسیهای
حافظه دیگر
عبور از مرز
تابع محسوب
نمیشوند.
گزینهٔ -fipa-strict-aliasing بهطور پیشفرض فعال است و تنها در ترکیب با -fstrict-aliasing اثرگذار خواهد بود.
- -falign-functions
- -falign-functions=n
- -falign-functions=n:m
- -falign-functions=n:m:n2
- -falign-functions=n:m:n2:m2
- شروع توابع
را با پرش
حداکثر m-1
بایت، روی
توان بعدی
عدد دوِ
بزرگتر یا
مساوی با n
تراز (align)
میکند. این
کار تضمین
میکند که
حداقل m
بایت اول
تابع
بتواند
توسط
پردازنده
بدون عبور
از مرز
ترازِ n
بایتی
واکشی (fetch) شود.
این یک
بهینهسازی
کارایی کد
است و از
ترازسازی
برای
توابعی که
سرد (cold -
کمکاربرد)
در نظر
گرفته
میشوند
صرفنظر
میگردد.
اگر
ترازسازی
برای تمام
توابع
الزامی
است، از
-fmin-function-alignment
استفاده
کنید.
اگر m تعیین نشده باشد، مقدار پیشفرض آن n خواهد بود.
مثالها: -falign-functions=32 توابع را روی مرز ۳۲ بایتی بعدی تراز میکند، -falign-functions=24 تنها در صورتی روی مرز ۳۲ بایتی بعدی تراز میکند که این کار با پرش ۲۳ بایت یا کمتر میسر باشد، و -falign-functions=32:7 تنها در صورتی روی مرز ۳۲ بایتی بعدی تراز میکند که با پرش ۶ بایت یا کمتر امکانپذیر باشد.
جفت دوم مقادیر n2:m2 امکان تعیین یک تراز ثانویه را فراهم میکند: -falign-functions=64:7:32:3 در صورتی که با پرش ۶ بایت یا کمتر امکانپذیر باشد، روی مرز ۶۴ بایتی بعدی تراز میکند؛ در غیر این صورت، اگر با پرش ۲ بایت یا کمتر ممکن باشد، روی مرز ۳۲ بایتی بعدی تراز مینماید. اگر m2 مشخص نشده باشد، مقدار پیشفرض آن n2 خواهد بود.
برخی از اسمبلرها این پرچم را فقط زمانی پشتیبانی میکنند که n توانی از دو باشد؛ در چنین حالتی، مقدار به سمت بالا گرد میشود.
گزینههای -fno-align-functions و -falign-functions=1 معادل یکدیگرند و به معنای عدم ترازسازی توابع هستند.
اگر n مشخص نشده یا صفر باشد، از یک مقدار پیشفرض وابسته به معماری ماشین استفاده میشود. حداکثر مقدار مجاز برای گزینهٔ n برابر با 65536 است.
در سطوح -O2 و -O3 فعال میشود.
- -flimit-function-alignment
- اگر این گزینه فعال باشد، کامپایلر تلاش میکند از تراز بیشازحد (overaligning) و غیرضروری توابع خودداری کند. این گزینه میکوشد به اسمبلر دستور دهد به میزان تعیینشده با -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)
را جبران
میکند. این
یک
بهینهسازی
کارایی کد
است و از
ترازسازی
برای
حلقههایی
که سرد
(کمکاربرد)
در نظر
گرفته
میشوند
صرفنظر
میگردد.
اگر -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
- همتراز
کردن
مقصدهای
انشعاب با
یک مرز از
توان دو،
برای
مقاصدی که
تنها با پرش
قابل
دسترسی
هستند. در
این حالت،
نیازی به
اجرای هیچ
دستورالعمل
صوری نیست.
این یک
بهینهسازی
برای
کارایی کد
است و از
همترازی
برای
پرشهایی
که سرد تلقی
میشوند،
صرفنظر
میشود.
اگر -falign-labels از این مقدار بزرگتر باشد، در این صورت مقدار آن بهجای این مقدار استفاده میشود.
پارامترهای این گزینه مشابه گزینهٔ -falign-functions هستند. گزینههای -fno-align-jumps و -falign-jumps=1 معادل یکدیگرند و به این معنا هستند که حلقهها همتراز نمیشوند.
اگر n مشخص نشود یا صفر باشد، از مقدار پیشفرض وابسته به ماشین استفاده میشود. بیشترین مقدار مجاز برای گزینهٔ n برابر ۶۵۵۳۶ است.
در سطوح -O2 و -O3 فعال میشود.
- -fmin-function-alignment
- تعیین حداقل همترازی توابع با توان بعدی از دو که بزرگتر یا مساوی با n باشد. برخلاف -falign-functions، این همترازی برای تمام توابع (حتی آنهایی که سرد تلقی میشوند) نیز اعمال میشود. همچنین این همترازی تحت تأثیر -flimit-function-alignment قرار نمیگیرد.
- -fno-allocation-dce
- عدم حذف
تخصیصهای
استفادهنشده
در ++C (با
استفاده از
عملگر
"new" و
عملگر
"delete") در
حذف کدهای
مرده (dead code elimination).
همچنین ببینید: -fmalloc-dce.
- -fallow-store-data-races
- به
کامپایلر
اجازه
میدهد
بهینهسازیهایی
را انجام
دهد که ممکن
است
رقابتهای
دادهای
جدیدی در
ذخیرهسازیها
(stores) ایجاد
کند، بدون
آنکه
اثبات کند
متغیر
نمیتواند
بهطور
همروند
توسط سایر
ریسهها
دسترسی شود.
این گزینه
بر
بهینهسازی
دادههای
محلی
تأثیری
ندارد. اگر
مشخص باشد
که
دادههای
سراسری
توسط چندین
ریسه
دسترسی
نخواهند
شد،
استفاده از
این گزینه
ایمن است.
نمونههایی از بهینهسازیهای فعالشده توسط -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)
خودداری
میکند.
آنها را به
همان
ترتیبی که
در فایل
ورودی ظاهر
شدهاند
خروجی
میدهد.
هنگامی که
از این
گزینه
استفاده
میشود،
متغیرهای
ایستای
بدون ارجاع
حذف
نمیشوند.
این گزینه
برای
پشتیبانی
از کدهای
موجود که به
ترتیب خاصی
وابستهاند
در نظر
گرفته شده
است. برای
کدهای
جدید، بهتر
است در صورت
امکان از
صفتها (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) را
آنگونه که
معمولاً
برای مقاصد
تخصیص ثبات
به کار
میروند
میسازد و
به هر وب یک
شبهثبات
جداگانه
اختصاص
میدهد. این
کار به گذر
تخصیص ثبات
اجازه
میدهد
مستقیماً
روی
شبهثباتها
عمل کند، و
همچنین
چندین گذر
بهینهسازی
دیگر مانند
CSE،
بهینهساز
حلقه و
حذفکنندهٔ
کدهای
مردهٔ
بدیهی را
تقویت
مینماید.
با این حال،
میتواند
اشکالزدایی
را غیرممکن
سازد، زیرا
متغیرها
دیگر در یک
«ثبات
خانگی»
باقی
نمیمانند.
بهطور پیشفرض با -funroll-loops فعال است.
- -fwhole-program
- فرض میکند
که واحد
ترجمهٔ
فعلی
نمایانگر
کل برنامهٔ
در حال
کامپایل
است. تمام
توابع و
متغیرهای
عمومی به
استثنای
"main" و
مواردی که
با صفت
"externally_visible"
ادغام
شدهاند،
به توابع
ایستا
تبدیل شده و
در عمل با
شدت بیشتری
توسط
بهینهسازهای
میانرویهای
بهینهسازی
میشوند.
همراه با -flto این گزینه کاربرد محدودی دارد. در بیشتر موارد، فهرست دقیق نمادهای استفادهشده یا صادرشده از باینری از طریق اطلاعات تفکیک که توسط افزونهٔ پیونددهنده به بهینهساز زمان پیوند فرستاده میشود، مشخص است. با این حال اگر از هیچ افزونهٔ پیونددهندهای استفاده نشود یا در حین مرحلهٔ پیوند افزایشی هنگام تولید کد نهایی (با -flto -flinker-output=nolto-rel)، همچنان مفید خواهد بود.
- -flto[=n]
- این گزینه
بهینهساز
استاندارد
زمان پیوند
را اجرا
میکند.
هنگامی که
با کد منبع
فراخوانی
شود، GIMPLE (یکی
از
نمایشهای
درونی GCC) را
تولید کرده
و آن را در
بخشهای
ویژهٔ ELF در
فایل شیء
مینویسد.
هنگامی که
فایلهای
شیء با
یکدیگر
پیوند داده
میشوند،
بدنهٔ
تمامی
توابع از
این
بخشهای ELF
خوانده شده
و
بهگونهای
نمونهسازی
میشوند که
گویی بخشی
از همان
واحد ترجمه
بودهاند.
برای استفاده از بهینهساز زمان پیوند، -flto و گزینههای بهینهسازی باید هم در زمان کامپایل و هم در طول پیوند نهایی مشخص شوند. توصیه میشود که تمام فایلهای شرکتکننده در یک پیوند را با گزینههای یکسان کامپایل کرده و این گزینهها را در زمان پیوند نیز مشخص نمایید. به عنوان مثال:
gcc -c -O2 -flto foo.c gcc -c -O2 -flto bar.c gcc -o myprog -flto -O2 foo.o bar.o
دو فراخوانی نخست GCC، یک نمایش بایتکدی از GIMPLE را در بخشهای ویژهٔ ELF درون foo.o و bar.o ذخیره میکنند. فراخوانی نهایی بایتکد GIMPLE را از foo.o و bar.o میخواند، دو فایل را در یک تصویر درونی واحد ادغام کرده، و نتیجه را طبق روال معمول کامپایل میکند. از آنجا که هر دو فایل foo.o و bar.o در یک تصویر واحد ادغام میشوند، این امر سبب میشود تمامی تحلیلها و بهینهسازیهای میانرویهای در GCC در سراسر این دو فایل عمل کنند گویی که یک فایل واحد بودهاند. این بدان معناست که برای مثال، بخش درونخطکننده قادر است توابع موجود در 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 به دستور پیوند، این تصمیم خودکار را لغو کنید.
برای کارآمد کردن بهینهسازی کل برنامه، لازم است فرضیات خاصی در نظر گرفته شود. کامپایلر باید بداند چه توابع و متغیرهایی خارج از واحد بهینهسازیشده در زمان پیوند، توسط کتابخانهها و زمان اجرا قابل دسترسی هستند. در صورت پشتیبانی توسط پیونددهنده، افزونهٔ پیونددهنده (ببینید: -fuse-linker-plugin) اطلاعات نمادهای استفادهشده و نمادهای از بیرون قابل مشاهده را به کامپایلر ارسال میکند. هنگامی که افزونهٔ پیونددهنده در دسترس نباشد، باید از -fwhole-program استفاده شود تا به کامپایلر اجازهٔ اعمال این فرضیات داده شود، که این امر منجر به تصمیمگیریهای تهاجمیتر در بهینهسازی میگردد.
هنگامی که یک فایل با -flto بدون -fuse-linker-plugin کامپایل میشود، فایل شیء تولیدشده از یک فایل شیء معمولی بزرگتر خواهد بود زیرا شامل بایتکدهای GIMPLE و کد نهایی معمول است (ببینید: -ffat-lto-objects). این بدان معناست که فایلهای شیء حاوی اطلاعات LTO میتوانند مانند فایلهای شیء معمولی پیوند داده شوند؛ اگر -fno-lto به پیونددهنده داده شود، هیچ بهینهسازی میانرویهای اعمال نخواهد شد. توجه داشته باشید که با فعال بودن -fno-fat-lto-objects مرحلهٔ کامپایل سریعتر است، اما نمیتوانید یک پیوند معمولی و غیر LTO بر روی آنها انجام دهید.
هنگام تولید باینری نهایی، GCC بهینهسازیهای زمان پیوند را تنها بر روی فایلهایی اعمال میکند که شامل بایتکد باشند. بنابراین، شما میتوانید فایلهای شیء و کتابخانهها را با بایتکدهای GIMPLE و کدهای شیء نهایی ترکیب کنید. GCC بهطور خودکار انتخاب میکند که کدام فایلها در حالت LTO بهینهسازی شوند و کدام فایلها بدون پردازش بیشتر پیوند یابند.
بهطور کلی، گزینههای تعیینشده در زمان پیوند بر گزینههای تعیینشده در زمان کامپایل ارجحیت دارند، اگرچه در برخی موارد GCC تلاش میکند گزینههای زمان پیوند را بر پایهٔ تنظیمات استفادهشده در کامپایل فایلهای ورودی استنتاج کند.
اگر گزینهٔ سطح بهینهسازی -O را در زمان پیوند مشخص نکنید، GCC از بالاترین سطح بهینهسازی استفادهشده هنگام کامپایل فایلهای شیء استفاده میکند. توجه داشته باشید که تعیین گزینهٔ سطح بهینهسازی صرفاً در زمان پیوند و نه در زمان کامپایل، عموماً بیاثر است؛ این امر دو دلیل دارد: نخست اینکه کامپایل بدون بهینهسازی، گذرهایی از کامپایلر را که اطلاعات لازم برای بهینهسازی مؤثر در زمان پیوند را گردآوری میکنند، متوقف میسازد. دوم اینکه برخی از گذرهای اولیهٔ بهینهسازی تنها در زمان کامپایل قابل اجرا هستند و نه در زمان پیوند.
برخی پرچمهای تولید کد وجود دارند که توسط GCC هنگام تولید بایتکدها حفظ میشوند، چرا که باید در حین پیوند نهایی استفاده شوند. در حال حاضر، گزینههای زیر و تنظیمات آنها از نخستین فایل شیئی که صریحاً آنها را تعیین کرده باشد گرفته میشوند: -fcommon، -fexceptions، -fnon-call-exceptions، -fgnu-tm و تمامی پرچمهای هدف -m.
گزینههای -fPIC، -fpic، -fpie و -fPIE بر اساس طرح زیر با یکدیگر ترکیب میشوند: B<-fPIC> + B<-fpic> = B<-fpic> B<-fPIC> + B<-fno-pic> = B<-fno-pic> B<-fpic/-fPIC> + (no option) = (no option) B<-fPIC> + B<-fPIE> = B<-fPIE> B<-fpic> + B<-fPIE> = B<-fpie> B<-fPIC/-fpic> + B<-fpie> = B<-fpie>
پرچمهای مشخصی که ABI را تغییر میدهند باید در تمام واحدهای کامپایل با یکدیگر مطابقت داشته باشند، و تلاش برای لغو این موارد در زمان پیوند با یک مقدار ناسازگار نادیده گرفته میشود. این شامل گزینههایی مانند -freg-struct-return و -fpcc-struct-return است.
گزینههای دیگری مانند -ffp-contract، -fno-strict-overflow، -fwrapv، -fno-trapv یا -fno-strict-aliasing به مرحلهٔ پیوند منتقل شده و برای واحدهای ترجمهٔ ناسازگار بهطور محافظهکارانهای ادغام میشوند. بهویژه -fno-strict-overflow، -fwrapv و -fno-trapv تقدم دارند؛ و برای مثال -ffp-contract=off بر -ffp-contract=fast تقدم دارد. میتوانید آنها را در زمان پیوند بازنویسی کنید.
گزینههای تشخیصی مانند -Wstringop-overflow به مرحلهٔ پیوند منتقل میشوند و تنظیمات آنها با مرحلهٔ کامپایل در سطح دانهبندی تابع مطابقت دارد. توجه داشته باشید که این موضوع تنها برای هشدارهای تشخیصی صادرشده در طول بهینهسازی اهمیت دارد. همچنین توجه داشته باشید که دگرگونیهای کد مانند درونخطیسازی (inlining) میتوانند منجر به فعال یا غیرفعال شدن هشدارها برای بخشهایی از کد شوند که با تنظیمات در زمان کامپایل سازگار نیستند.
هنگامی که نیاز دارید گزینهها را از طریق -Wa یا -Xassembler به اسمبلر منتقل کنید، مطمئن شوید که یا چنین واحدهای ترجمهای را با -fno-lto کامپایل نمایید یا بهطور هماهنگ از گزینههای یکسان اسمبلر در تمام واحدهای ترجمه استفاده کنید. به عنوان راهکاری دیگر، میتوانید گزینههای اسمبلر را در زمان پیوند LTO نیز مشخص کنید.
برای فعالسازی تولید اطلاعات اشکالزدایی باید -g را در زمان کامپایل مشخص کنید. اگر هر یک از فایلهای ورودی در زمان پیوند با فعال بودن تولید اطلاعات اشکالزدایی ساخته شده باشند، پیوند نیز تولید اطلاعات اشکالزدایی را فعال خواهد کرد. هرگونه تنظیمات تفصیلی اطلاعات اشکالزدایی مانند سطح dwarf در -gdwarf-5 باید صراحتاً در خط فرمان پیونددهنده تکرار شوند و ادغام تنظیمات متفاوت در واحدهای ترجمهٔ مختلف توصیه نمیشود.
اگر LTO با اشیایی با پیوند C روبهرو شود که با انواع ناسازگار در واحدهای ترجمهٔ جداگانه اعلان شدهاند تا با یکدیگر پیوند داده شوند (رفتار تعریفنشده مطابق با ISO C99 6.2.7)، ممکن است یک پیام تشخیصی غیرمهلک صادر شود. با این حال رفتار در زمان اجرا همچنان تعریفنشده است. پیامهای تشخیصی مشابهی ممکن است برای سایر زبانها نیز صادر گردد.
ویژگی دیگر LTO این است که میتوان بهینهسازیهای بینروالی را روی فایلهای نوشتهشده به زبانهای مختلف اعمال کرد:
gcc -c -flto foo.c g++ -c -flto bar.cc gfortran -c -flto baz.f90 g++ -o myprog -flto -O3 foo.o bar.o baz.o -lgfortran
توجه داشته باشید که پیوند نهایی با g++ انجام میشود تا کتابخانههای زمان اجرای C++ دریافت شوند و -lgfortran برای دریافت کتابخانههای زمان اجرای Fortran اضافه شده است. بهطور کلی، هنگام ترکیب زبانها در حالت LTO، باید از همان گزینههای دستور پیوند استفاده کنید که هنگام ترکیب زبانها در یک کامپایل معمولی (غیر LTO) به کار میبرید.
اگر فایلهای شیءِ حاوی بایتکد GIMPLE در یک آرشیو کتابخانه، مانند libfoo.a ذخیره شده باشند، در صورتی که از یک پیونددهنده با پشتیبانی از افزونه استفاده کنید، استخراج و استفاده از آنها در یک پیوند LTO ممکن خواهد بود. برای ایجاد کتابخانههای ایستای مناسب برای LTO، بهجای ar و ranlib از gcc-ar و gcc-ranlib استفاده کنید؛ برای نمایش نمادهای فایلهای شیء با بایتکد GIMPLE از gcc-nm استفاده نمایید. این دستورها مستلزم آن هستند که ar، ranlib و nm با پشتیبانی از افزونه کامپایل شده باشند. در زمان پیوند، از پرچم -fuse-linker-plugin استفاده کنید تا اطمینان حاصل شود که کتابخانه در فرایند بهینهسازی LTO شرکت میکند:
gcc -o myprog -O2 -flto -fuse-linker-plugin a.o b.o -lfoo
با فعال بودن افزونهٔ پیونددهنده، پیونددهنده فایلهای GIMPLE مورد نیاز را از libfoo.a استخراج کرده و آنها را به GCC در حال اجرا تحویل میدهد تا آنها را به بخشی از تصویر یکپارچهشدهٔ GIMPLE برای بهینهسازی تبدیل کند.
اگر از پیونددهندهای با پشتیبانی از افزونه استفاده نمیکنید و/یا افزونهٔ پیونددهنده را فعال نمیکنید، اشیای درون libfoo.a طبق روال معمول استخراج و پیوند داده میشوند، اما در فرایند بهینهسازی LTO شرکت نمیکنند. برای اینکه یک کتابخانهٔ ایستا هم برای بهینهسازی LTO و هم برای پیوند معمول مناسب باشد، فایلهای شیء آن را با -flto -ffat-lto-objects کامپایل کنید.
بهینهسازیهای زمان پیوند برای عمل کردن نیازی به حضور کل برنامه ندارند. اگر برنامه نیازی به بروندهی هیچ نمادی نداشته باشد، میتوان -flto و -fwhole-program را با هم ترکیب کرد تا به بهینهسازهای بینروالی اجازه داده شود از فرضیات تهاجمیتری بهره ببرند که ممکن است منجر به بهبود فرصتهای بهینهسازی شود. زمانی که افزونهٔ پیونددهنده فعال است، نیازی به استفاده از -fwhole-program نیست (نگاه کنید به -fuse-linker-plugin).
پیادهسازی کنونی LTO هیچ تلاشی برای تولید بایتکدی که بین انواع مختلف میزبانها قابلحمل باشد نمیکند. فایلهای بایتکد نسخهبندی شدهاند و بررسی سختگیرانهای روی نسخهها اعمال میشود، بنابراین فایلهای بایتکد تولیدشده در یک نسخه از GCC با نسخههای قدیمیتر یا جدیدتر GCC کار نمیکنند.
بهینهسازی زمان پیوند بر روی سیستمهایی غیر از آنهایی که از ترکیب ELF و DWARF استفاده میکنند، با تولید اطلاعات اشکالزدایی سازگاری خوبی ندارد.
اگر مقدار اختیاری n را مشخص کنید، بهینهسازی و تولید کد انجامشده در زمان پیوند، با بهرهگیری از یک برنامهٔ make نصبشده، بهصورت موازی در قالب n کار موازی اجرا میشود. متغیر محیطی MAKE میتواند برای تعیین برنامهای دیگر به کار رود.
همچنین میتوانید -flto=jobserver را مشخص کنید تا از حالت job server مربوط به GNU make برای تعیین تعداد کارهای موازی استفاده شود. این ویژگی زمانی مفید است که Makefile فراخوانندهٔ GCC از قبل بهصورت موازی در حال اجرا باشد. برای اینکه این سازوکار کار کند، باید یک علامت + در ابتدای دستور العمل در Makefile والد قرار دهید. این گزینه احتمالاً تنها در صورتی کار میکند که MAKE همان GNU make باشد. حتی بدون مقدار این گزینه، GCC تلاش میکند job server در حال اجرای GNU make را بهطور خودکار شناسایی کند.
از -flto=auto استفاده کنید تا در صورت وجود، از job server مربوط به GNU make استفاده شود، یا در غیر این صورت به تشخیص خودکار تعداد رشتههای پردازندهٔ موجود در سیستم بازگردد.
- -flto-partition=alg
- الگوریتم افراز مورد استفاده توسط بهینهساز زمان پیوند را مشخص میکند. مقدار میتواند 1to1 برای تعیین افرازی بازتابدهندهٔ فایلهای منبع اصلی باشد، یا balanced برای تعیین افراز به تکههایی با اندازهٔ یکسان (در صورت امکان)، یا max برای ایجاد افراز جدید به ازای هر نماد در صورت امکان، یا cache برای متعادل ساختن اندازهٔ تکهها در عین نگهداشتن نمادهای مرتبط در کنار یکدیگر جهت ذخیرهسازی بهتر در حافظهٔ پنهان در LTO افزایشی. مشخص کردن none به عنوان الگوریتم، افراز و جاریسازی را بهطور کامل غیرفعال میکند. مقدار پیشفرض balanced است. اگرچه 1to1 میتواند به عنوان یک راهکار موقت برای مسائل گوناگونِ ترتیب کد استفاده شود، افراز max تنها برای آزمایشهای داخلی در نظر گرفته شده است. مقدار one مشخص میکند که دقیقاً یک افراز باید استفاده شود، در حالی که مقدار none مرحلهٔ افراز را نادیده گرفته و گام بهینهسازی زمان پیوند را مستقیماً از فاز WPA اجرا میکند.
- -flto-incremental=path
- حالت LTO
افزایشی را
فعال
میکند،
همراه با
قرار گرفتن
حافظهٔ
پنهان آن در
دایرکتوری
موجودِ
ارائهشده.
این
میتواند
چرخههای
ویرایش-کامپایل
را با LTO
بهطور
چشمگیری
کوتاهتر
کند.
هنگام استفاده با LTO (-flto)، خروجی واحدهای ترجمه در داخل LTO در حافظهٔ پنهان ذخیره میشود. واحدهای ترجمهٔ ذخیرهشده در حافظهٔ پنهان احتمالاً هنگام کامپایل مجدد با تغییرات اندک در کد دوباره استفاده میشوند که منجر به کاهش زمان کامپایل مجدد میگردد.
چندین نمونه از GCC میتوانند بهصورت موازی از یک حافظهٔ پنهان مشترک استفاده کنند.
- -flto-incremental-cache-size=n
- تعداد مدخلهای حافظهٔ پنهان در LTO افزایشی را مشخص میکند که پس از آن مدخلهای قدیمی هرس میشوند. این یک محدودیت نرم است و ممکن است بهطور موقت مدخلهای بیشتری وجود داشته باشد.
- -flto-compression-level=n
- این گزینه سطح فشردهسازی مورد استفاده برای زبان میانیِ نوشتهشده در فایلهای شیء LTO را مشخص میکند، و تنها در ترکیب با حالت LTO (-flto) معنادار است. در حال حاضر GCC از دو الگوریتم فشردهسازی LTO پشتیبانی میکند. برای zstd، مقادیر معتبر از 0 (بدون فشردهسازی) تا 19 (حداکثر فشردهسازی) هستند، در حالی که zlib از مقادیر 0 تا 9 پشتیبانی میکند. مقادیر خارج از این محدوده به حداقل یا حداکثر مقادیر پشتیبانیشده محدود میشوند. اگر گزینه مشخص نشود، یک تنظیم فشردهسازی متعادل پیشفرض استفاده خواهد شد.
- -flto-toplevel-asm-heuristics
- روشهای
اکتشافی را
برای یافتن
نمادهای
استفادهشده
در "asm"
پایه در سطح
بالا فعال
میکند. این
کار
بهینهسازیهای
زمان پیوند
را که
میتوانند
باعث تغییر
نام یا حذف
این نمادها
شوند و منجر
به خطاهای
نبود نماد
توسط
پیونددهنده
گردند،
محدود
میسازد.
این پرچم برای پروژههایی در نظر گرفته شده است که هنوز به استفاده از "asm" گسترشیافته در سطح بالا روی نیاوردهاند؛ روشی که کاربرد نماد را مستقیماً و بدون نتایج مثبت کاذب مشخص میکند.
روشهای اکتشافی ساده هستند و کد اسمبلی را تجزیه نمیکنند. روشهای اکتشافی کد اسمبلی سطح بالا را برای تمام شناسههای ممکن بررسی میکنند؛ اگر شناسهای در میان نمادهای اعلانشده یافت شود، آن نماد برای محدود کردن بهینهسازیهای زمان پیوند علامتگذاری میشود. نمادهای ایستا بهینهسازیهای بیشتری را غیرفعال میکنند. همچنین شناسههایی که پس از آنها ':' قرار دارد بهینهسازیهای بیشتری را غیرفعال میسازند، زیرا ممکن است یک نماد تعریفشده بهصورت محلی در اسمبلی باشند، حتی زمانی که اعلان با 'extern' مشخص شده باشد..IP -fuse-linker-plugin 4 استفاده از یک افزایهٔ پیونددهنده را در طول بهینهسازی زمان پیوند (LTO) فعال میکند. این گزینه به پشتیبانی از افزایه در پیونددهنده وابسته است که در 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 غیرفربه (non-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
- تلاش
میکند
دستورالعملهای
add را با
ادغام در
بارگذاریها/ذخیرهسازیهای
حافظه حذف
کند.
در سطوح -O2 و -O3 فعال میشود.
- -fcprop-registers
- پس از تخصیص
ثبات و
تفکیک
دستورالعمل
پس از تخصیص
ثبات، یک
گذر انتشار
کپی (copy-propagation)
اجرا
میکند تا
وابستگیهای
زمانبندی
را کاهش
داده و گاهی
اوقات عمل
کپی را حذف
کند.
در سطوح -O1، -O2، -O3 و -Os فعال میشود.
- -fprofile-correction
- پروفایلهای
جمعآوریشده
با استفاده
از دودویی
سنجیدهشده
(instrumented binary) برای
برنامههای
چندنخی
ممکن است به
دلیل
شمارشهای
از دست رفته
ناهمگون
باشند.
هنگامی که
این گزینه
مشخص شود، 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 روی یک سیستم مقصد پشتیبانیشدهٔ GNU/Linux است. برای اطلاعات بیشتر، 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++ پیروی میکند؛ بهویژه، هم تبدیل نوعها (casts) و هم انتسابها باعث میشوند مقادیر به انواع معنایی خود گرد شوند (در حالی که -ffloat-store تنها بر انتسابها تأثیر میگذارد). این گزینه بهطور پیشفرض برای C یا C++ در صورت استفاده از یک گزینهٔ انطباق دقیق مانند -std=c99 یا -std=c++17 فعال میشود. گزینهٔ -ffast-math صرفنظر از این که گزینهٔ انطباق دقیق استفاده شده باشد یا خیر، بهطور پیشفرض -fexcess-precision=fast را فعال میکند. اگر -fexcess-precision=16 مشخص شود، ثوابت و نتایج عبارات با انواع "_Float16" و "__bf16" بدون دقت مازاد محاسبه میشوند.
گزینهٔ -fexcess-precision=standard برای زبانهایی غیر از C یا C++ پیادهسازی نشده است. در معماری x86، اگر -mfpmath=sse یا -mfpmath=sse+387 مشخص شده باشد، این گزینه هیچ اثری ندارد؛ در حالت اول، معناشناسی IEEE بدون دقت مازاد اعمال میشود، و در حالت دوم، گرد کردن غیرقابلپیشبینی است..IP -ffloat-store 4 متغیرهای ممیز شناور (floating-point) را در ثباتها ذخیره نکن، و از گزینههای دیگری که ممکن است خوانده شدن مقدار ممیز شناور از ثبات یا حافظه را تحت تأثیر قرار دهند جلوگیری کن. این گزینه معمولاً جای خود را به -fexcess-precision=standard داده است که حالت کلیتری دارد. اگر از -ffloat-store استفاده میکنید، ممکن است لازم باشد برنامهٔ خود را تغییر دهید تا محاسبات میانی را صریحاً در متغیرهای موقت ذخیره کند؛ زیرا -ffloat-store گرد کردن به قالب IEEE را تنها هنگام انتسابها انجام میدهد و بر خلاف -fexcess-precision=standard، آن را روی تبدیل نوعها (casts) اعمال نمیکند.
- -ffast-math
- گزینههای
-fno-math-errno، -funsafe-math-optimizations،
-ffinite-math-only، -fno-rounding-math،
-fno-signaling-nans، -fcx-limited-range و
-fexcess-precision=fast را
تنظیم
میکند.
این گزینه باعث تعریف ماکروی پیشپردازندهٔ "__FAST_MATH__" میشود.
این گزینه توسط هیچیک از گزینههای -O بهجز -Ofast فعال نمیشود، زیرا میتواند خروجی نادرستی برای برنامههایی که به پیادهسازی دقیق قواعد یا مشخصات IEEE یا ISO برای توابع ریاضی وابسته هستند به همراه داشته باشد. با این حال، ممکن است برای برنامههایی که به تضمینهای این مشخصات نیاز ندارند، کد سریعتری تولید کند.
- -fno-math-errno
- پس از
فراخوانی
توابع
ریاضی که با
یک
دستورالعمل
واحد اجرا
میشوند
(مانند
"sqrt")،
مقدار
"errno" را
تنظیم نکن.
برنامهای
که برای
مدیریت
خطاهای
ریاضی به
استثناهای
IEEE متکی است،
ممکن است
بخواهد از
این پرچم
برای سرعت
بیشتر ضمن
حفظ
سازگاری با
محاسبات
ریاضی IEEE
استفاده
کند.
این گزینه توسط هیچیک از گزینههای -O بهجز -Ofast فعال نمیشود، زیرا میتواند خروجی نادرستی برای برنامههایی که به پیادهسازی دقیق قواعد یا مشخصات IEEE یا ISO برای توابع ریاضی وابسته هستند ایجاد کند. با این حال، ممکن است برای برنامههایی که به تضمینهای این مشخصات نیازی ندارند، کد سریعتری به دست دهد.
پیشفرض -fmath-errno است.
در سامانههای Darwin، کتابخانهٔ ریاضی هرگز "errno" را تنظیم نمیکند. بنابراین دلیلی ندارد که کامپایلر این احتمال را در نظر بگیرد، و -fno-math-errno حالت پیشفرض است.
- -funsafe-math-optimizations
- بهینهسازیهایی
را برای
محاسبات
ممیز شناور
مجاز
میکند که
(الف) فرض
میکنند
آرگومانها
و نتایج
معتبر
هستند و (ب)
ممکن است
استانداردهای
IEEE یا ANSI را نقض
کنند.
هنگامی که
در زمان
پیوند (link time)
استفاده
شود، ممکن
است شامل
کتابخانهها
یا
فایلهای
راهاندازی
(startup) شود که
کلمهٔ
کنترلی
پیشفرض FPU
یا سایر
بهینهسازیهای
مشابه را
تغییر
میدهند.
این گزینه توسط هیچیک از گزینههای -O بهجز -Ofast فعال نمیشود، زیرا میتواند خروجی نادرستی برای برنامههایی ایجاد کند که به پیادهسازی دقیق قواعد یا مشخصات IEEE یا ISO برای توابع ریاضی وابسته هستند. با این حال، ممکن است برای برنامههایی که به تضمینهای این مشخصات نیازی ندارند، کد سریعتری به بار آورد. گزینههای -fno-signed-zeros، -fno-trapping-math، -fassociative-math و -freciprocal-math را فعال میکند.
پیشفرض -fno-unsafe-math-optimizations است.
- -fassociative-math
- شرکتپذیری
مجدد (re-association)
عملوندها
را در
رشتهای از
عملیاتهای
ممیز شناور
مجاز
میکند. این
کار با
احتمال
تغییر دادن
نتیجهٔ
محاسبات،
استانداردهای
زبانهای ISO C
و C++ را نقض
میکند.
توجه:
بازآرایی
(re-ordering) ممکن است
علامت صفر
را تغییر
دهد،
مقادیر NaN را
نادیده
بگیرد، و
سرریز
زیرین (underflow) یا
سرریز
زبرین (overflow)
ایجاد یا
مهار کند (و
بنابراین
نمیتوان
آن را در
کدهایی
استفاده
کرد که به
رفتارهای
گرد کردن
مانند "(x +
2**52) - 2**52" متکی
هستند).
همچنین
ممکن است
مقایسههای
ممیز شناور
را
بازآرایی
کند و
بنابراین
نباید
زمانی که
مقایسههای
مرتبشده (ordered
comparisons) مورد
نیاز است به
کار گرفته
شود. این
گزینه
نیازمند
این است که
هر دو
گزینهٔ -fno-signed-zeros
و -fno-trapping-math فعال
باشند.
علاوه بر
این، همراه
با -frounding-math
کاربرد
چندانی
ندارد. برای
Fortran، این
گزینه
زمانی که هر
دو گزینهٔ
-fno-signed-zeros و -fno-trapping-math
برقرار
باشند،
بهطور
خودکار
فعال
میشود.
پیشفرض -fno-associative-math است.
- -freciprocal-math
- اجازه
میدهد تا
در صورت
امکانپذیر
شدن
بهینهسازیها،
به جای
تقسیم بر یک
مقدار از
معکوس آن
مقدار
استفاده
شود. به
عنوان مثال
"x / y"
میتواند
با "x * (1/y)"
جایگزین
شود؛ امری
که اگر
"(1/y)"
مشمول حذف
زیرعبارتهای
مشترک (common subexpression
elimination) شود،
بسیار مفید
است. توجه
داشته
باشید که
این کار دقت
را کاهش
میدهد و
تعداد
عملیاتهای
ممیز شناور
(flops) روی آن
مقدار را
افزایش
میدهد.
پیشفرض -fno-reciprocal-math است.
- -ffinite-math-only
- بهینهسازیهایی
را برای
محاسبات
ممیز شناور
مجاز
میکند که
فرض
میکنند
آرگومانها
و نتایج، NaN
یا +-Inf نیستند.
این گزینه توسط هیچیک از گزینههای -O بهجز -Ofast فعال نمیشود، زیرا میتواند خروجی نادرستی برای برنامههایی به همراه داشته باشد که به پیادهسازی دقیق قواعد یا مشخصات IEEE یا ISO برای توابع ریاضی وابسته هستند. با این حال، ممکن است برای برنامههایی که به ضمانتهای این مشخصات نیازی ندارند، کد سریعتری به دست دهد.
پیشفرض -fno-finite-math-only است.
- -fno-signed-zeros
- بهینهسازیهایی
را برای
محاسبات
ممیز شناور
مجاز
میکند که
علامتدار
بودن صفر را
نادیده
میگیرند.
محاسبات IEEE
رفتار
مقادیر
متمایز +0.0 و -0.0
را مشخص
میکند که
این امر
مانع از
سادهسازی
عباراتی
مانند x+0.0 یا 0.0*x
میشود (حتی
همراه با
-ffinite-math-only). این
گزینه به
این معناست
که علامت
نتیجهٔ صفر
اهمیتی
ندارد.
پیشفرض -fsigned-zeros است.
- -fno-trapping-math
- کد را با
این فرض
کامپایل
میکند که
عملیاتهای
ممیز شناور
نمیتوانند
تلههای
قابل
مشاهده
برای کاربر
(user-visible traps) ایجاد
کنند. این
تلهها
شامل تقسیم
بر صفر،
سرریز
زبرین (overflow)،
سرریز
زیرین (underflow)،
نتیجهٔ
غیردقیق و
عملیات
نامعتبر
است. این
گزینه
نیازمند
این است که
-fno-signaling-nans
برقرار
باشد. تنظیم
این گزینه
مثلاً در
صورتی که
فرد به
محاسبات
ریاضی
«بدون
توقف» (non-stop)
استاندارد
IEEE متکی
باشد، ممکن
است امکان
تولید
کدهای
سریعتر را
فراهم کند.
این گزینه توسط هیچیک از گزینههای -O بهجز -Ofast فعال نمیشود، زیرا میتواند خروجی نادرستی برای برنامههای وابسته به پیادهسازی دقیق قواعد یا مشخصات IEEE یا ISO برای توابع ریاضی به بار آورد.
پیشفرض -ftrapping-math است.
نسخههای آیندهٔ GCC ممکن است کنترل دقیقتری روی این تنظیم با استفاده از پراگمای "FENV_ACCESS" در C99 ارائه دهند. این گزینهٔ خط فرمان همراه با -frounding-math برای تعیین وضعیت پیشفرض "FENV_ACCESS" استفاده خواهد شد.
- -frounding-math
- تبدیلها و
بهینهسازیهایی
را که رفتار
پیشفرض
گرد کردن
ممیز شناور
(گرد کردن
به
نزدیکترین
مقدار یا
round-to-nearest) را فرض
میکنند،
غیرفعال
میکند. این
گزینه باید
برای
برنامههایی
تعیین شود
که حالت گرد
کردن ممیز
شناور (FP) را
بهصورت
پویا تغییر
میدهند،
یا ممکن است
با یک حالت
گرد کردن
غیرپیشفرض
اجرا شوند.
این گزینه
ادغام
مقادیر
ثابت (constant folding) در
عبارات
ممیز شناور
در زمان
کامپایل (که
ممکن است
تحت تأثیر
حالت گرد
کردن باشد)
و تبدیلات
ریاضی
ناامن در
حضور
حالتهای
گرد کردن
وابسته به
علامت را
غیرفعال
میسازد.
پیشفرض -fno-rounding-math است.
این گزینه آزمایشی است و در حال حاضر تضمین نمیکند که تمام بهینهسازیهای GCC تحت تأثیر حالت گرد کردن را غیرفعال کند. نسخههای آیندهٔ GCC ممکن است کنترل دقیقتری روی این تنظیم با استفاده از پراگمای "FENV_ACCESS" در C99 فراهم آورند. این گزینهٔ خط فرمان همراه با -ftrapping-math برای تعیین وضعیت پیشفرض "FENV_ACCESS" به کار خواهد رفت.
- -fsignaling-nans
- کد را با
این فرض
کامپایل
میکند که
مقادیر
ممیز شناور
سیگنالدهندهٔ
IEEE (یا signaling NaNs) ممکن
است در حین
عملیاتهای
ممیز شناور
تلههای
قابل
مشاهده
برای کاربر
تولید کنند.
تنظیم این
گزینه
بهینهسازیهایی
را که ممکن
است تعداد
استثناهای
قابل
مشاهده با
مقادیر signaling NaN
را تغییر
دهند،
غیرفعال
میکند. این
گزینه
مستلزم -ftrapping-math
است.
این گزینه باعث تعریف شدن ماکروی پیشپردازندهٔ "__SUPPORT_SNAN__" میشود.
پیشفرض -fno-signaling-nans است.
این گزینه آزمایشی است و در حال حاضر تضمین نمیکند که تمام بهینهسازیهای GCC را که بر رفتار signaling NaN تأثیر میگذارند غیرفعال سازد.
- -fsingle-precision-constant
- با مقادیر ثابت ممیز شناور به عنوان دقت تکی (single precision) رفتار میکند، به جای اینکه آنها را بهطور ضمنی به ثوابت با دقت دوگانه (double-precision) تبدیل کند.
- -fcx-limited-range
- هنگام فعال
بودن، این
گزینه
بیانگر این
است که در
حین انجام
تقسیم
اعداد
مختلط
نیازی به
مرحلهٔ
کاهش بازه (range
reduction) نیست.
همچنین هیچ
بررسی مبنی
بر اینکه
آیا نتیجهٔ
ضرب یا
تقسیم
اعداد
مختلط
برابر با
"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 خارج
میشود،
تعداد
دفعات
اجرای
قوسها را
در فایلی به
نام 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
- بازآرایی
توابع بر
اساس ابزار
دقیق
پروفایل،
اولین زمان
اجرای یک
تابع را
جمعآوری
کرده و این
توابع را به
ترتیب
صعودی مرتب
میکند؛ با
این هدف که
راهاندازی
برنامه از
طریق
بارگذاری
کارآمدتر
بخشهای
متنی
بهینهسازی
شود.
با -fprofile-use فعال میشود.
- -fvpt
- اگر با -fprofile-arcs
ترکیب شود،
این گزینه
به
کامپایلر
دستور
میدهد تا
کدی برای
جمعآوری
اطلاعات
درباره
مقادیر
عبارتها
اضافه کند.
همراه با -fbranch-probabilities، دادههای جمعآوریشده را بازخوانی کرده و عملاً بهینهسازیها را بر اساس آنها انجام میدهد. در حال حاضر این بهینهسازیها شامل تخصیص ویژه عملیات تقسیم با استفاده از آگاهی درباره مقدار مخرج است.
با -fprofile-use و -fauto-profile فعال میشود.
- -frename-registers
- تلاش
میکند تا
با استفاده
از
ثباتهای
باقیمانده
پس از تخصیص
ثباتها،
از
وابستگیهای
کاذب در
کدهای
زمانبندیشده
جلوگیری
کند. این
بهینهسازی
بیشترین
فایده را
برای
پردازندههایی
با
ثباتهای
زیاد دارد.
با این حال،
بسته به
قالب
اطلاعات
اشکالزدایی
اتخاذشده
توسط هدف،
میتواند
اشکالزدایی
را غیرممکن
کند، زیرا
متغیرها
دیگر در یک
«ثبات
اصلی» باقی
نمیمانند.
به طور پیشفرض با -funroll-loops فعال میشود.
- -fschedule-fusion
- یک گذر
وابسته به
هدف را روی
جریان
دستورالعملها
انجام
میدهد تا
دستورالعملهای
همنوع را
در کنار
یکدیگر
زمانبندی
کند؛ زیرا
ماشین هدف
میتواند
در صورتی که
این
دستورالعملها
در جریان
دستورالعمل
مجاور هم
باشند،
آنها را با
کارایی
بیشتری
اجرا کند.
در سطوح -O2، -O3 و -Os فعال میشود.
- -fdep-fusion
- جفتهای
قابل
ادغامِ
عملیات
ماکرو
متشکل از
دستورالعملهای
تککاربردی
و موارد
استفادهشان
را تشخیص
داده و چنین
جفتهایی
را در جریان
دستورالعمل
کنار
یکدیگر
قرار
میدهد تا
فرصتهای
ادغام در
سختافزار
افزایش
یابد. این
گذر یک بار
قبل از
تخصیص ثبات
و بار دیگر
قبل از
تغییر نام
ثبات اجرا
میشود.
در سطوح -O2، -O3 و -Os فعال میشود.
- -ftracer
- تکرار
دنباله را
برای
بزرگتر
کردن
اندازه
اَبَربلوک
انجام
میدهد. این
تبدیل،
جریان
کنترل تابع
را ساده
کرده و به
سایر
بهینهسازیها
اجازه
میدهد
کارایی
بهتری
داشته
باشند.
توسط -fprofile-use و -fauto-profile فعال میشود.
- -funroll-loops
- حلقههایی
را باز
میکند که
تعداد
تکرار
آنها در
زمان
کامپایل یا
هنگام ورود
به حلقه
قابل تعیین
باشد. گزینه
-funroll-loops به طور
ضمنی شامل
-frerun-cse-after-loop، -fweb و
-frename-registers است.
همچنین
پوستهکنی
کامل حلقه
(یعنی حذف
کامل
حلقههایی
با تعداد
تکرار ثابت
و کم) را
روشن
میکند. این
گزینه
اندازه کد
را بزرگتر
میکند و
ممکن است
اجرای آن را
سریعتر
بکند یا
نکند.
توسط -fprofile-use و -fauto-profile فعال میشود.
- -funroll-all-loops
- تمام حلقهها را باز میکند، حتی اگر تعداد تکرار آنها هنگام ورود به حلقه نامشخص باشد. این کار معمولاً اجرای برنامهها را کُندتر میکند. گزینه -funroll-all-loops شامل همان گزینههای ضمنی -funroll-loops است.
- -fpeel-loops
- حلقههایی
را
پوستهکنی
میکند که
اطلاعات
کافی مبنی
بر اینکه
زیاد تکرار
نمیشوند
وجود داشته
باشد (از
طریق
بازخورد
پروفایل یا
تحلیل
ایستا).
همچنین
پوستهکنی
کامل حلقه
(یعنی حذف
کامل
حلقههایی
با تعداد
تکرار ثابت
و کم) را
فعال
میکند.
توسط -O3، -fprofile-use و -fauto-profile فعال میشود.
- -fmalloc-dce
- کنترل
میکند که
آیا "malloc"
(و گونههای
آن مانند
"calloc" یا
"strdup") در
صورتی که
مقدار
بازگشتی
آنها فقط
به عنوان
پارامتر
فراخوانی
"free"
استفاده
شده یا با
"NULL"
مقایسه شده
باشد،
میتواند
با
بهینهسازی
حذف شود یا
خیر. اگر -fmalloc-dce=1
استفاده
شود، فقط
فراخوانیهای
"free" مجاز
هستند، در
حالی که با
-fmalloc-dce=2
مقایسهها
با
اشارهگر
"NULL" نیز
برای حذف،
امن در نظر
گرفته
میشوند.
پیشفرض -fmalloc-dce=2 است. همچنین -fallocation-dce را ببینید.
- -fmove-loop-invariants
- گذر انتقال ناورداهای حلقه را در بهینهساز حلقه RTL فعال میکند. در سطح -O1 و بالاتر، به جز -Og فعال است.
- -fmove-loop-stores
- گذر انتقال ذخیرهسازیهای حلقه را در بهینهساز حلقه GIMPLE فعال میکند. این کار ذخیرهسازیهای ناوردا را به بعد از پایان حلقه منتقل میکند و در ازای آن، مقدار ذخیرهشده را در طول تکرارها درون یک ثبات نگه میدارد. توجه داشته باشید برای اینکه این گزینه اثرگذار باشد، باید -ftree-loop-im نیز فعال باشد. در سطح -O1 و بالاتر، به جز -Og فعال است.
- -fsplit-loops
- اگر
حلقهای
شامل شرطی
باشد که
همواره
برای یک بخش
از فضای
تکرار درست
و برای بخش
دیگر
نادرست
است، آن را
به دو حلقه
تقسیم
میکند.
توسط -fprofile-use و -fauto-profile فعال میشود.
- -funswitch-loops
- انشعابهایی
با شرطهای
ناوردای
حلقه را به
بیرون از
حلقه منتقل
میکند،
همراه با
نسخههای
تکراری
حلقه روی هر
دو انشعاب
(که با توجه
به نتیجه
شرط اصلاح
شدهاند).
توسط -fprofile-use و -fauto-profile فعال میشود.
- -fversion-loops-for-strides
- اگر
حلقهای
روی یک
آرایه با
گام متغیر
پیمایش
میکند،
نسخه دیگری
از حلقه
ایجاد
میکند که
فرض میکند
گام همیشه
یک است.
برای مثال:
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] = ...;این قابلیت به ویژه برای آرایههای با شکل مفروض در Fortran سودمند است، جایی که (برای نمونه) با فرض دسترسیهای پیوسته، برداریسازی بهتری را امکانپذیر میسازد. این پرچم به طور پیشفرض در -O3 فعال است. همچنین توسط -fprofile-use و -fauto-profile فعال میشود.
- -ffunction-sections
- در صورتی که
مقصد از
بخشهای
اختیاری
پشتیبانی
کند، هر
تابع یا قلم
داده را در
بخش
اختصاصی
خودش در
فایل خروجی
قرار
میدهد. نام
تابع یا نام
قلم داده،
نام بخش
مربوطه در
فایل خروجی
را مشخص
میکند.
از این گزینهها در سامانههایی استفاده کنید که پیونددهنده (linker) میتواند بهینهسازیهایی را برای بهبود محلیسازی ارجاع (locality of reference) در فضای دستورالعملها انجام دهد. بیشتر سامانههایی که از قالب شیء ELF استفاده میکنند، دارای پیونددهندههایی با چنین بهینهسازیهایی هستند. در AIX، پیونددهنده بخشها (CSECTها) را بر اساس نمودار فراخوانی بازآرایی میکند. تأثیر بر کارایی متغیر است.
همراه با جمعآوری زباله توسط پیونددهنده (گزینهٔ --gc-sections پیونددهنده)، این گزینهها ممکن است منجر به فایلهای اجرایی با پیوند ایستا (statically-linked) کوچکتری (پس از حذف نمادها یا strip کردن) شوند.
در سامانههای ELF/DWARF این گزینهها کیفیت اطلاعات اشکالزدایی (debug) را کاهش نمیدهند. با قالبهای دیگر فایلهای شیء/اطلاعات اشکالزدایی ممکن است مشکلاتی وجود داشته باشد.
تنها زمانی از این گزینهها استفاده کنید که مزایای چشمگیری به همراه داشته باشند. وقتی این گزینهها را مشخص میکنید، اسمبلر و پیونددهنده فایلهای شیء و اجرایی بزرگتری ایجاد میکنند و همچنین کندتر عمل میکنند. این گزینهها بر تولید کد تأثیر میگذارند. آنها از انجام بهینهسازیهای کامپایلر و اسمبلر که از مکانهای نسبی درون یک واحد ترجمه (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) یا
جلوگیری از
نشت
اطلاعات از
طریق
ثباتها
افزایش
یابد.
مقادیر ممکن برای choice همانند ویژگی "zero_call_used_regs" است. پیشفرض skip است.
میتوانید این رفتار را برای یک تابع خاص با استفاده از ویژگی تابع "zero_call_used_regs" کنترل کنید.
گزینههای مجهزسازی برنامه (Program Instrumentation Options)
GCC از تعدادی گزینهٔ خط فرمان پشتیبانی میکند که افزودن مجهزسازی زمان اجرا (run-time instrumentation) به کدهایی را که بهطور عادی تولید میکند، کنترل مینمایند. برای نمونه، یکی از اهداف مجهزسازی، جمعآوری آمار پروفایلسازی برای استفاده در یافتن نقاط داغ برنامه (hot spots)، تحلیل پوشش کد، یا بهینهسازیهای هدایتشده با پروفایل است. دستهٔ دیگری از مجهزسازی برنامه، افزودن بررسیهای زمان اجرا برای شناسایی خطاهای برنامهنویسی مانند ارجاع به اشارهگرهای نامعتبر یا دسترسیهای خارج از محدودهٔ آرایه، و همچنین حملات عمدی خصمانه مانند درهمشکستن پشته (stack smashing) یا ربودن vtable در C++ است. همچنین یک قلاب (hook) عمومی وجود دارد که میتواند برای پیادهسازی سایر اشکال ردیابی یا مجهزسازی در سطح تابع به منظور اشکالزدایی یا تحلیل برنامه استفاده شود.
- -p
- --profile
- -fprofile
- -pg
- تولید کد
اضافی برای
نوشتن
اطلاعات
پروفایلسازی
مناسب برای
برنامهٔ
تحلیل prof
(برای -p،
--profile، و -fprofile) یا
gprof (برای -pg).
شما باید
هنگام
کامپایل
کردن
فایلهای
منبعی که
مایلید
دربارهشان
داده
جمعآوری
شود از این
گزینه
استفاده
کنید، و
همچنین
باید هنگام
پیوند دادن
(linking) نیز آن را
به کار
ببرید.
میتوانید از ویژگی تابع "no_instrument_function" برای لغو پروفایلسازی توابع خاص در هنگام کامپایل با این گزینهها استفاده کنید.
- -fprofile-arcs
- کدی اضافه
میکند تا
کمانهای
(arcs) جریان
برنامه
مجهزسازی
شوند. در
طول اجرا،
برنامه ثبت
میکند که
هر انشعاب و
فراخوانی
چند بار
اجرا شده و
چند بار
مسیر
انشعاب طی
شده یا
بازگشته
است. در
مقصدهایی
که از
سازندهها
(constructors) با
پشتیبانی
از اولویت
پشتیبانی
میکنند،
پروفایلسازی
بهدرستی
سازندهها،
نابودکنندهها
(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
برنامه را
با یک بار
کاری نمونه
(workload) اجرا
کنید تا
اطلاعات
پروفایل
کمانها (arc profile)
تولید شود.
این کار را
میتوان به
هر تعداد
بار تکرار
کرد. شما
میتوانید
نمونههای
همروندی
از برنامه
خود را اجرا
نمایید، و
به شرطی که
سیستمفایل
از
قفلگذاری
(locking) پشتیبانی
کند،
فایلهای
داده
بهدرستی
بهروزرسانی
خواهند شد.
به جز در
مواردی که
یک گزینهٔ
گویش اکید ISO C
فعال باشد،
فراخوانیهای
"fork"
تشخیص داده
شده و بدون
شمارش
مضاعف
بهدرستی
مدیریت
میشوند.
علاوه بر این، یک فایل شیء (object file) میتواند چندین بار بازکامپایل شود و تا زمانی که فایل منبع و گزینههای کامپایلر بدون تغییر باقی بمانند، فایل .gcda متناظر ادغام میشود.
- برای بهینهسازیهای مبتنی بر پروفایل (profile-directed optimizations)، فایلهای منبع را دوباره با همان گزینههای بهینهسازی و تولید کد به اضافهٔ -fbranch-probabilities کامپایل کنید.
- برای تحلیل پوشش آزمون (test coverage analysis)، از gcov برای ایجاد اطلاعات خوانا برای انسان از فایلهای .gcno و .gcda استفاده نمایید. برای اطلاعات بیشتر به مستندات gcov مراجعه کنید.
با گزینهٔ -fprofile-arcs، کامپایلر GCC برای هر تابع از برنامه شما یک گراف جریان برنامه ایجاد کرده و سپس یک درخت پوشا (spanning tree) برای آن گراف پیدا میکند. تنها کمانهایی که روی درخت پوشا نیستند باید ابزارگذاری (instrument) شوند: کامپایلر کدی اضافه میکند تا تعداد دفعات اجرای این کمانها را شمارش کند. هنگامی که یک کمان تنها خروجی یا تنها ورودیِ یک بلوک باشد، کد ابزارگذاری میتواند به همان بلوک اضافه شود؛ در غیر این صورت، برای نگهداری کد ابزارگذاری باید یک بلوک پایهای (basic block) جدید ایجاد شود.
با -fcondition-coverage، برای هر عبارت شرطی در برنامه شما، GCC یک مجموعه بیتی (bitset) ایجاد کرده و مقادیر بولی اجراشدهای را که تأثیر مستقلی بر نتیجهٔ آن عبارت دارند ثبت میکند.
با -fpath-coverage، کامپایلر GCC مسیرهای اصلی (prime paths) پیمودهشدهٔ هر تابع را پیدا، شمارش و ثبت میکند، مگر آنکه تعداد مسیرها از حد کنترلشده توسط -fpath-coverage-limit فراتر رود. اگر از حد مجاز فراتر رود، تابع ابزارگذاری نمیشود؛ دقیقاً مانند این است که -fpath-coverage استفاده نشده باشد. یک مسیر اصلی طولانیترین دنباله از بلوکهای یکتا (بهجز احتمالاً اولی و آخری) است که زیرمسیر هیچ مسیر دیگری نباشد.
- -ftest-coverage
- تولید یک فایل یادداشت (notes file) که ابزار پوشش کد 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
را نیز
ببینید.
هنگامی که یک فایل اجرایی در یک محیط موازی کلان (massive parallel) اجرا میشود، توصیه میشود که پروفایل در پوشههای متفاوتی ذخیره شود. این کار را میتوان با متغیرهایی در path که در زمان اجرا صادر (export) میشوند انجام داد:
- %p
- شناسه فرایند (process ID).
- %q{VAR}
- مقدار متغیر محیطی VAR.
- -fprofile-generate
- -fprofile-generate=path
- فعالسازی
گزینههایی
که معمولاً
برای
ابزارگذاری
برنامه جهت
تولید
پروفایلِ
مفید برای
بازکامپایل
بعدی با
بهینهسازی
مبتنی بر
بازخورد
پروفایل
استفاده
میشوند.
شما باید
-fprofile-generate را هم
در زمان
کامپایل و
هم در زمان
پیوند (linking)
برنامهٔ
خود به کار
ببرید.
گزینههای زیر فعال میشوند: -fprofile-arcs، -fprofile-values، -finline-functions، و -fipa-bit-cp.
اگر path مشخص شده باشد، GCC برای یافتن فایلهای دادهٔ بازخورد پروفایل به path مراجعه میکند. به -fprofile-dir مراجعه کنید.
برای بهینهسازی برنامه بر اساس اطلاعات پروفایل جمعآوریشده، از -fprofile-use استفاده کنید.
- -fprofile-info-section
- -fprofile-info-section=name
- ثبت
اطلاعات
پروفایل در
بخش (section)
مشخصشده
به جای
استفاده از
سازنده/ویرانگر
(constructor/destructor). اگر name
مشخص شده
باشد، نام
بخش همان
است؛ در غیر
این صورت
نام بخش به
طور
پیشفرض
".gcov_info"
خواهد بود.
یک
اشارهگر
به اطلاعات
پروفایل
تولیدشده
توسط -fprofile-arcs در
بخش
مشخصشده
برای هر
واحد ترجمه
(translation unit) قرار
میگیرد.
این گزینه
ثبت
اطلاعات
پروفایل از
طریق یک
سازنده و
همچنین
پردازش
اطلاعات
پروفایل از
طریق یک
ویرانگر را
غیرفعال
میکند. این
گزینه برای
استفاده در
محیطهای
میزبانیشده
(hosted) مانند GNU/Linux
در نظر
گرفته نشده
است؛ بلکه
محیطهای
مستقل (freestanding
مانند
سیستمهای
تعبیهشده)
با منابع
محدود را
هدف قرار
میدهد که
از
سازندهها/ویرانگرها
یا
ورودی/خروجی
فایل در
کتابخانهٔ 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; for (unsigned i = 0; i < n; ++i) printf ("%02x", c[i]); } static void filename (const char *f, void *arg) { __gcov_filename_to_gcfn (f, dump, arg ); } static void * allocate (unsigned length, void *arg) { return malloc (length); } static void dump_gcov_info (void) { const struct gcov_info *const *info = __gcov_info_start; const struct gcov_info *const *end = __gcov_info_end; /* Obfuscate variable to prevent compiler optimizations. */ __asm__ ("" : "+r" (info)); while (info != end) { void *arg = NULL; __gcov_info_to_gcda (*info, filename, dump, allocate, arg); putchar ('\n'); ++info; } } int main (void) { dump_gcov_info (); return 0; }زیرفرمان merge-stream از ابزار gcov-tool میتواند برای تبدیل جریان دادهٔ سریالیشده (deserialize) که توسط توابع "__gcov_filename_to_gcfn" و "__gcov_info_to_gcda" تولید شده است، و ادغام اطلاعات پروفایل در فایلهای .gcda روی سیستمفایل میزبان به کار رود..IP -fprofile-note=path 4 اگر path مشخص شده باشد، GCC فایل .gcno را در مکان path ذخیره میکند. اگر این گزینه را با چند فایل منبع ترکیب کنید، فایل .gcno بازنویسی خواهد شد.
- -fprofile-prefix-path=path
- این گزینه میتواند در ترکیب با profile-generate=profile_dir و profile-use=profile_dir استفاده شود تا به GCC اطلاع دهد دایرکتوری پایهٔ درخت منبعِ ساختهشده کجاست. بهطور پیشفرض، profile_dir شامل فایلهایی با مسیرهای مطلق درهمریخته از تمامی فایلهای شیء پروژهٔ ساختهشده خواهد بود. این امر زمانی که دایرکتوری استفادهشده برای ساخت باینری مجهزسازیشده با دایرکتوری استفادهشده برای ساخت باینری بهینهسازیشده با بازخورد پروفایل تفاوت داشته باشد مطلوب نیست، زیرا دادههای پروفایل در طول ساخت بهینهشده پیدا نخواهند شد. در چنین شرایطی، میتوان از -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
باشد. مقدار
اول برای
برنامههای
تکنخی
مفید است،
در حالی که
دومی با
تولید کد
نخامن، از
خرابی
پروفایل
جلوگیری
میکند.
هشدار: وقتی برنامهای تمام نخها را بهدرستی الحاق نکند (یا یک نخ جداشده ایجاد کند)، فایل پروفایل همچنان ممکن است خراب شود.
استفاده از prefer-atomic در صورت پشتیبانی توسط معماری مقصد به atomic، و در غیر این صورت به single تبدیل میشود. راهانداز GCC هنگامی که -pthread در خط فرمان وجود داشته باشد، بهطور خودکار prefer-atomic را انتخاب میکند، در غیر این صورت روش پیشفرض single است.
اگر atomic انتخاب شود، اطلاعات پروفایل بر پایهٔ اصل نهایت تلاش با استفاده از عملیاتهای اتمیک بهروزرسانی میشوند. در حالت ایدهآل، اطلاعات پروفایل از طریق عملیاتهای اتمیک در سختافزار بهروز میشوند. با این حال، اگر پلتفرم مقصد از عملیاتهای اتمیک مورد نیاز در سختافزار پشتیبانی نکند ولی libatomic در دسترس باشد، اطلاعات پروفایل از طریق فراخوانیهای libatomic بهروزرسانی میشوند. اگر پلتفرم مقصد نه از عملیاتهای اتمیک سختافزاری پشتیبانی کند و نه libatomic در دسترس باشد، اطلاعات پروفایل بهصورت اتمیک بهروز نمیشود و یک هشدار صادر خواهد شد. در این حالت، اطلاعات پروفایلسازی بهدستآمده برای برنامههای چندنخی ممکن است خراب باشد.
به دلایل کارایی، اگر از شمارندههای ۶۴ بیتی برای اطلاعات پروفایلسازی استفاده شود و پلتفرم مقصد تنها از عملیاتهای اتمیک ۳۲ بیتی در سختافزار پشتیبانی کند، بهروزرسانیهای پروفایلسازیِ حساس به عملکرد با استفاده از دو عملیات اتمیک ۳۲ بیتی برای بهروزرسانی هر شمارنده انجام میشوند. اگر سیگنالی این دو عملیات بهروزرسانی یک شمارنده را قطع کند، اطلاعات پروفایلسازی ممکن است در وضعیتی ناسازگار قرار گیرد.
- -fprofile-filter-files=regex
- تنها
توابعی از
فایلها را
مجهزسازی
میکند که
نام آنها
با هر یک از
عبارتهای
منظم
(جداشده با
نقطهویرگول)
مطابقت
داشته باشد.
برای مثال، -fprofile-filter-files=main\.c;module.*\.c فقط main.c و تمام فایلهای C را که با 'module' شروع میشوند، مجهزسازی خواهد کرد.
- -fprofile-exclude-files=regex
- تنها
توابعی از
فایلها را
مجهزسازی
میکند که
نام آنها
با هیچیک
از
عبارتهای
منظم
(جداشده با
نقطهویرگول)
مطابقت
نداشته
باشد.
برای مثال، -fprofile-exclude-files=/usr/.* از مجهزسازی تمامی فایلهایی که در پوشهٔ /usr/ قرار دارند جلوگیری میکند.
- -fprofile-reproducible=[multithreaded|parallel-runs|serial]
- سطح
تکرارپذیری
پروفایل
جمعآوریشده
توسط
"-fprofile-generate" را
کنترل
میکند. این
امر امکان
بازسازی
برنامه با
خروجی
یکسان را
فراهم
میآورد که
برای نمونه
در
بستههای
توزیع مفید
است.
با مقدار -fprofile-reproducible=serial، پروفایل جمعآوریشده توسط -fprofile-generate تکرارپذیر است، به شرطی که برنامهٔ آموزشدادهشده در هر بار اجرای مرحلهٔ آموزش رفتار یکسانی داشته باشد، چندنخی نباشد و جریاندهی دادههای پروفایل همیشه با همان ترتیب انجام شود. توجه داشته باشید که جریاندهی پروفایل در پایان اجرای برنامه و همچنین پیش از فراخوانی تابع "fork" رخ میدهد.
توجه داشته باشید که بسیار معمول است که تعداد دفعات اجرای برخی از بخشهای برنامهها، برای مثال به طول نام فایلهای موقت یا تصادفیسازی فضای حافظه (که ممکن است نرخ برخورد جدول درهمسازی را تحت تأثیر قرار دهد) بستگی داشته باشد. چنین بخشهای تکرارناپذیری از برنامه را میتوان با صفت تابع "no_instrument_function" نشانهگذاری کرد. ابزار gcov-dump به همراه -l میتواند برای تخلیهٔ دادههای جمعآوریشده و اطمینان از اینکه آنها واقعاً تکرارپذیر هستند استفاده شود.
با مقدار -fprofile-reproducible=parallel-runs، پروفایل جمعآوریشده صرفنظر از ترتیب جریاندهی دادهها به فایلهای gcda، تکرارپذیر میماند. این تنظیم امکان اجرای چندین نمونه از برنامهٔ مجهزسازیشده را بهصورت موازی (مانند استفاده از "make -j") فراهم میسازد. این کار کیفیت دادههای جمعآوریشده را کاهش میدهد، بهویژه در پروفایلسازی فراخوانیهای غیرمستقیم.
- -fsanitize=address
- فعالسازی
AddressSanitizer، یک
شناساگر
سریع
خطاهای
حافظه.
دستورالعملهای
دسترسی به
حافظه
مجهزسازی
میشوند تا
باگهای
خارج از
محدوده و
استفاده پس
از
آزادسازی
را شناسایی
کنند. این
گزینه
-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 نیز استفاده کنید تا خروجی معنادارتری تولید شود. برای دریافت ردگیریهای پشتهٔ دقیقتر، میتوان از گزینههایی مانند -O0، -O1 یا -Og (که برای نمونه، از درونخطسازی اکثر توابع جلوگیری میکنند)، -fno-optimize-sibling-calls (که از بهینهسازی فراخوانیهای همسطح و بازگشتی انتهایی جلوگیری میکند؛ این گزینه بهطور ضمنی برای -O0، -O1 یا -Og فعال است) یا -fno-ipa-icf (که یکسانسازی کدهای یکسان را برای توابع غیرفعال میکند) استفاده کرد. استفاده از -fno-omit-frame-pointer نیز ردگیری پشته را بهبود میبخشد. از آنجا که چندین بار اجرای برنامه ممکن است به دلیل ASLR (تصادفیسازی چیدمان فضای آدرس)، ردگیریهایی با آدرسهای متفاوت تولید کند، ممکن است خاموش کردن ASLR مطلوب باشد. در لینوکس، این کار با setarch `uname -m` -R ./prog امکانپذیر است.
- -fsanitize=kernel-address
- فعالسازی AddressSanitizer برای هستهٔ لینوکس. برای جزئیات بیشتر به https://github.com/google/kernel-sanitizers مراجعه کنید.
- -fsanitize=hwaddress
- فعالسازی AddressSanitizer بهکمک سختافزار، که از توانایی سختافزار برای نادیده گرفتن بایت بالایی اشارهگر جهت شناسایی خطاهای حافظه با سربار حافظهٔ کم استفاده میکند. دستورالعملهای دسترسی به حافظه مجهزسازی میشوند تا باگهای خارج از محدوده و استفاده پس از آزادسازی را تشخیص دهند. این گزینه -fsanitize-address-use-after-scope را فعال میکند. برای جزئیات بیشتر به https://clang.llvm.org/docs/HardwareAssistedAddressSanitizerDesign.html مراجعه کنید. رفتار زمان اجرا را میتوان با استفاده از متغیر محیطی HWASAN_OPTIONS تحت تأثیر قرار داد. هنگامی که روی "help=1" تنظیم شود، گزینههای موجود در زمان راهاندازی برنامهٔ مجهزسازیشده نمایش داده میشوند. این گزینه نمیتواند با -fsanitize=thread یا -fsanitize=address ترکیب شود، و در حال حاضر تنها روی AArch64 در دسترس است.
- -fsanitize=kernel-hwaddress
- فعالسازی
AddressSanitizer بهکمک
سختافزار
برای
کامپایل
هستهٔ
لینوکس.
مشابه با
-fsanitize=kernel-address اما با
استفاده از
یک روش
مجهزسازی
جایگزین، و
مشابه با
-fsanitize=hwaddress اما با
تفاوتهای
مجهزسازی
که برای
کامپایل
هستهٔ
لینوکس
ضروری
هستند. این
تفاوتها
برای
جلوگیری از
فراخوانیهای
راهاندازی
اولیهٔ
کتابخانهٔ
hwasan و در نظر
گرفتن
مقدار
متفاوت در
بایت
بالایی
اشارهگر
پشته است.
نکته: این گزینه مقادیر پیشفرض متفاوتی نسبت به -fsanitize=hwaddress دارد. مجهزسازی پشته و فراخوانیهای alloca بهطور پیشفرض فعال نیستند. استفاده از برچسب فریم تصادفی برای مجهزسازی هسته پیادهسازی نشده است.
- -fsanitize=memtag-stack
- استفاده از دستورالعملهای Memory Tagging Extension بهجای مجهزسازی کد جهت امکان تشخیص خطاهای حافظه. مشابه HWASAN، این روش نیز یک روش احتمالی است. این گزینه فقط در معماریهای AArch64 که از Memory Tagging Extension پشتیبانی میکنند در دسترس است.
- -fsanitize=pointer-compare
- عملیات مقایسه (<، <=، >، >=) با عملوندهای اشارهگر را مجهزسازی میکند. این گزینه باید با -fsanitize=kernel-address یا -fsanitize=address ترکیب شود. این گزینه نمیتواند با -fsanitize=thread ترکیب شود. نکته: بهطور پیشفرض این بررسی در زمان اجرا غیرفعال است. برای فعال کردن آن، "detect_invalid_pointer_pairs=2" را به متغیر محیطی ASAN_OPTIONS اضافه کنید. استفاده از "detect_invalid_pointer_pairs=1" عملیات نامعتبر را تنها زمانی شناسایی میکند که هر دو اشارهگر ناتهی باشند..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، یک
سازوکار
بهبود
امنیت برای
محافظت از
برنامهها
در برابر
بازنویسی
آدرس
بازگشت
(مانند
سرریزهای
بافر پشته).
سازوکار آن
بدین صورت
است که آدرس
بازگشت
تابع را در
پرولوگ (prologue)
تابع در یک
پشته
فراخوانی
سایه که
بهطور
جداگانه
تخصیص
یافته
ذخیره
میکند و در
اپیلوگ (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، یک شناساگر نشت حافظه. این گزینه تنها برای پیوند دادن (linking) برنامههای اجرایی کاربرد دارد. برنامه اجرایی با کتابخانهای پیوند میخورد که تابع "malloc" و سایر توابع تخصیص حافظه را بازنویسی میکند. برای جزئیات بیشتر به https://github.com/google/sanitizers/wiki/AddressSanitizerLeakSanitizer مراجعه کنید. رفتار زمان اجرا را میتوان با استفاده از متغیر محیطی LSAN_OPTIONS تنظیم کرد. این گزینه نمیتواند با -fsanitize=thread ترکیب شود.
- -fsanitize=undefined
- فعالسازی UndefinedBehaviorSanitizer، یک شناساگر سریع رفتار تعریفنشده (undefined behavior). محاسبات گوناگون برای تشخیص رفتار تعریفنشده در زمان اجرا ابزارگذاری میشوند. برای جزئیات بیشتر به https://clang.llvm.org/docs/UndefinedBehaviorSanitizer.html مراجعه کنید. رفتار زمان اجرا را میتوان با استفاده از متغیر محیطی UBSAN_OPTIONS تنظیم کرد. زیرگزینههای فعلی عبارتند از:
- -fsanitize=shift
- این گزینه بررسی تعریفنشده نبودن نتیجه عملیات تغییر مکان بیتی (shift) را فعال میکند. توجه داشته باشید که تعاریف دقیق رفتار تعریفنشده بین C و ++C و همچنین بین ISO C90 و C99 و غیره کمی تفاوت دارد. این گزینه شامل دو زیرگزینه است: -fsanitize=shift-base و -fsanitize=shift-exponent.
- -fsanitize=shift-exponent
- این گزینه بررسی منفی نبودن آرگومان دوم عملیات شیفت و کوچکتر بودن آن از دقت آرگومان اول ارتقایافته (promoted) را فعال میکند.
- -fsanitize=shift-base
- اگر آرگومان دوم عملیات شیفت در محدوده مجاز باشد، تعریفنشده نبودن نتیجه عملیات شیفت را بررسی میکند. توجه داشته باشید که تعاریف دقیق رفتار تعریفنشده بین C و ++C و همچنین بین ISO C90 و C99 و غیره اندکی تفاوت دارد.
- -fsanitize=integer-divide-by-zero
- تشخیص تقسیم عدد صحیح بر صفر.
- -fsanitize=unreachable
- با این گزینه، کامپایلر فراخوانی تابع توکار "__builtin_unreachable" را به یک فراخوانی پیام تشخیصی تبدیل میکند. هنگام رسیدن اجرای برنامه به فراخوانی "__builtin_unreachable"، رفتار برنامه تعریفنشده است.
- -fsanitize=vla-bound
- این گزینه به کامپایلر دستور میدهد مثبت بودن اندازه آرایههای با طول متغیر (VLA) را بررسی کند.
- -fsanitize=null
- این گزینه بررسی اشارهگرها را فعال میکند. بهویژه برنامهای که با این گزینه کامپایل شده باشد، هنگام تلاش برای ارجاعزدایی یک اشارهگر NULL، یا مقید شدن یک مرجع (احتمالاً یک مرجع rvalue) به اشارهگر NULL، یا فراخوانی یک متد روی شیئی که توسط یک اشارهگر NULL نشان داده شده است، پیام خطا صادر خواهد کرد.
- -fsanitize=return
- این گزینه بررسی عبارت بازگشت (return) را فعال میکند. برنامههای کامپایلشده با این گزینه، در صورتی که اجرای یک تابع با خروجی غیر void بدون بازگرداندن یک مقدار پایان یابد، پیام خطا صادر میکنند. این گزینه تنها در ++C کاربرد دارد.
- -fsanitize=signed-integer-overflow
- این گزینه
بررسی
سرریز
محاسبات
اعداد صحیح
علامتدار
را فعال
میکند. این
گزینه
بررسی
میکند که
حاصل
"+"،
"*"، و هر
دو حالت
یگانی و
دودویی
"-" در
محاسبات
اعداد صحیح
علامتدار
دچار سرریز
نشود.
همچنین
تقسیم
علامتدار
"INT_MIN / -1" را
نیز تشخیص
میدهد.
توجه داشته
باشید که
قوانین
ارتقای نوع
اعداد صحیح
(integer promotion) باید در
نظر گرفته
شوند؛
بنابراین،
نمونه زیر
سرریز
محسوب
نمیشود:
signed char a = SCHAR_MAX; a++;
- -fsanitize=bounds
- این گزینه ابزارگذاری مرزهای آرایه را فعال میکند. دسترسیهای گوناگون خارج از محدوده تشخیص داده میشوند. اعضای آرایه با طول منعطف (flexible array members)، آرایههای مشابه عضو منعطف، و مقداردهیهای اولیه متغیرها با طول عمر ایستا ابزارگذاری نمیشوند؛ به استثنای آرایههای مشابه عضو منعطف که گزینههای "-fstrict-flex-arrays" یا "-fstrict-flex-arrays=" یا ویژگیهای "strict_flex_array" مشخص کرده باشند که نباید با آنها مانند آرایههای با عضو منعطف رفتار شود.
- -fsanitize=bounds-strict
- این گزینه ابزارگذاری سختگیرانه مرزهای آرایه را فعال میکند. بیشتر دسترسیهای خارج از محدوده شناسایی میشوند، از جمله آرایههای مشابه عضو منعطف. مقداردهندههای اولیه متغیرها با طول عمر ایستا ابزارگذاری نمیشوند.
- -fsanitize=alignment
- این گزینه بررسی همترازی اشارهگرها را در هنگام ارجاعزدایی آنها، یا هنگامی که یک مرجع به هدفی با همترازی ناکافی مقید میشود، یا هنگامی که یک متد یا سازنده روی شیئی با همترازی ناکافی فراخوانی میگردد، فعال میکند.
- -fsanitize=object-size
- این گزینه ابزارگذاری ارجاعات حافظه را با استفاده از تابع "__builtin_dynamic_object_size" فعال میکند. دسترسیهای گوناگونِ خارج از محدوده اشارهگرها تشخیص داده میشوند.
- -fsanitize=float-divide-by-zero
- تشخیص تقسیم ممیز شناور بر صفر. برخلاف دیگر گزینههای مشابه، -fsanitize=float-divide-by-zero توسط -fsanitize=undefined فعال نمیشود، زیرا تقسیم ممیز شناور بر صفر میتواند روشی معتبر برای تولید مقادیر بینهایت (infinities) و NaN باشد.
- -fsanitize=float-cast-overflow
- این گزینه بررسی تبدیل نوع ممیز شناور به عدد صحیح را فعال میکند. بررسی میشود که نتیجه تبدیل دچار سرریز نشود. برخلاف گزینههای مشابه دیگر، -fsanitize=float-cast-overflow توسط -fsanitize=undefined فعال نمیشود. این گزینه هنگام فعال بودن استثناهای "FE_INVALID" بهخوبی کار نمیکند.
- -fsanitize=nonnull-attribute
- این گزینه ابزارگذاری فراخوانیها را برای بررسی این موضوع که مقادیر تهی به آرگومانهایی که با ویژگی "nonnull" بهعنوان نیازمند مقدار غیر تهی مشخص شدهاند ارسال نشوند، فعال میکند.
- -fsanitize=returns-nonnull-attribute
- این گزینه ابزارگذاری دستورهای بازگشت (return) را در توابعی که با ویژگی تابع "returns_nonnull" علامتگذاری شدهاند فعال میسازد تا از بازگرداندن مقادیر تهی در چنین توابعی جلوگیری و آنها را شناسایی کند.
- -fsanitize=bool
- این گزینه ابزارگذاری بارگذاری مقادیر از متغیرهای bool را فعال میکند. اگر مقداری به غیر از 0 یا 1 بارگذاری شود، یک خطای زمان اجرا صادر خواهد شد..IP -fsanitize=enum 4 این گزینه ابزاردقیقسازی (instrumentation) بارگذاریها از یک نوع enum را فعال میکند. اگر مقداری خارج از محدودهٔ مقادیر تعریفشده برای نوع enum بارگذاری شود، یک خطای زمان اجرا صادر میشود.
- -fsanitize=vptr
- این گزینه ابزاردقیقسازی فراخوانی توابع عضو C++، دسترسی به اعضا و برخی تبدیلها میان اشارهگرها به کلاسهای پایه (base) و مشتقشده (derived) را فعال میکند تا صحت نوع پویای شیء ارجاعشده بررسی شود.
- -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" در هر بلوک پایه (basic block) وارد میکند.
- -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) و
به همین
ترتیب
برنامهنویسی
مبتنی بر
فراخوانی/پرش
(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 پیادهسازی مبتنی بر فناوری ارتقای امنیت جریان کنترل اینتل (CET) را ارائه میدهد که برای پردازندههای i686 یا جدیدتر کار میکند..IP -fharden-compares 4 برای هر آزمون منطقی که از بهینهسازیهای gimple باقی میماند و شرطی در یک انشعاب شرطی نیست (برای نمونه، شرطهای بررسیشده برای جابهجاییهای شرطی، یا ذخیره در متغیرهای بولی)، کد اضافهای برای محاسبه و راستیآزمایی شرط معکوس و فراخوانی "__builtin_trap" در صورت عدم تطابق نتایج تولید میکند. برای پوشش تمام شرطیها، همراه با -fharden-conditional-branches استفاده شود.
- -fharden-conditional-branches
- برای هر انشعاب شرطی غیربرداری که از بهینهسازیهای gimple باقی میماند، کد اضافهای برای محاسبه و راستیآزمایی شرط معکوس و فراخوانی "__builtin_trap" در صورت غیرمنتظره بودن نتیجه تولید میکند. برای پوشش تمام شرطیها، همراه با -fharden-compares استفاده شود.
- -fharden-control-flow-redundancy
- کد
اضافهای
تولید
میکند تا
هنگام ورود
به
بلوکهای
پایه،
مقادیر
بولی تنظیم
شوند و در
زمان خروج
از تابع،
چنانچه
مقادیر
بولی مسیر
اجرایی
سازگار با
گراف جریان
کنترل
تشکیل
ندهند،
راستیآزمایی
انجام شده و
تله (trap)
بگذارد.
راستیآزمایی پیش از بازگشتها، پیش از فراخوانیهای پایانی اجباری (پایین را ببینید) و بهصورت اختیاری، پیش از استثناهای گریزان با -fhardcfr-check-exceptions، پیش از فراخوانیهای بازگشتی با -fhardcfr-check-returning-calls، و پیش از فراخوانیهای noreturn با -fhardcfr-check-noreturn-calls انجام میشود.
بهینهسازی فراخوانی پایانی بسیار دیر رخ میدهد و نمیتواند بر افزونگی جریان کنترل اثر بگذارد، اما برای فراخوانیهایی که توسط بخشهای پیشین زبان بهعنوان فراخوانیهای پایانی اجباری مشخص شدهاند و هر فراخوانی که به اندازهٔ کافی زود بهعنوان فراخوانی پایانی بالقوه علامتگذاری شده باشد نیز راستیآزمایی پیش از فراخوانی صادر میشود؛ هرچند این احتمالات صرفاً نظری هستند، چرا که این شرایط تنها با استفاده از افزونههای سفارشی کامپایلر محقق میشوند.
- -fhardcfr-skip-leaf
- گزینهٔ -fharden-control-flow-redundancy را در توابع برگ (leaf) غیرفعال میکند.
- -fhardcfr-check-exceptions
- هنگامی که -fharden-control-flow-redundancy فعال است، مسیر اجرای ثبتشده را در نقاط گریز استثنا در برابر گراف جریان کنترل بررسی میکند؛ گویی بدنهٔ تابع در یک گردانندهٔ پاکسازی پوشانده شده است که بررسی را انجام داده و استثنا را دوباره برمیانگیزد. این گزینه بهطور پیشفرض فعال است؛ برای غیرفعال کردن آن از -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" با گردانندهٔ پاکسازی بهطور ضمنی اضافهشده خودداری میکند، زیرا نسبت به بررسی انجامشده پیش از فراخوانی تکراری خواهد بود؛ اما سایر گردانندهها یا پاکسازیها در تابع، در صورت فعال شدن، مسیر اجرای ثبتشده را تغییر داده و با رسیدن به یک نقطهٔ بازرسی دیگر، آن را مجدداً بررسی میکنند. این نقطهٔ بازرسی حتی میتواند یک فراخوانی "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 استفاده میشود.
این گزینه برای استفاده در ساختهای محیط عملیاتی در نظر گرفته شده است، نه صرفاً در ساختهای اشکالزدایی.
در حال حاضر، -fhardened تنها بر روی مقصدهای GNU/Linux پشتیبانی میشود.
گزینهٔ -fhardened تنها در صورتی یک گزینهٔ خاص را فعال میکند که از قبل در جایی از خط فرمان مشخص نشده باشد. برای نمونه، -fhardened -fstack-protector فقط -fstack-protector را فعال خواهد کرد، نه -fstack-protector-strong را.
- -fstack-protector
- کد اضافهای برای بررسی سرریزهای بافر، مانند حملات درهمشکستن پشته (stack smashing) تولید میکند. این کار با افزودن یک متغیر نگهبان (guard variable) به توابع دارای اشیاء آسیبپذیر انجام میشود. این شامل توابعی است که "alloca" را فراخوانی میکنند، و توابعی با بافرهای بزرگتر از یا مساوی ۸ بایت. متغیرهای نگهبان هنگام ورود به تابع مقداردهی اولیه شده و هنگام خروج از تابع بررسی میشوند. اگر بررسی نگهبان ناموفق باشد، یک پیام خطا چاپ شده و برنامه خارج میشود. فقط متغیرهایی که واقعاً روی پشته تخصیص یافتهاند در نظر گرفته میشوند؛ متغیرهای حذفشده بر اثر بهینهسازی یا متغیرهای تخصیصیافته در ثباتها به حساب نمیآیند.
- -fstack-protector-all
- مشابه -fstack-protector است با این تفاوت که تمام توابع محافظت میشوند.
- -fstack-protector-strong
- مشابه -fstack-protector است اما توابع بیشتری را برای محافظت شامل میشود --- توابعی که دارای تعاریف آرایهٔ محلی هستند، یا ارجاعاتی به نشانیهای فریم محلی دارند. فقط متغیرهایی که واقعاً روی پشته تخصیص یافتهاند در نظر گرفته میشوند؛ متغیرهای حذفشده بر اثر بهینهسازی یا متغیرهای تخصیصیافته در ثباتها به حساب نمیآیند.
- -fstack-protector-explicit
- مشابه -fstack-protector است اما فقط از توابعی محافظت میکند که ویژگی "stack_protect" را داشته باشند.
- -fstack-check
- کدی تولید
میکند تا
اطمینان
حاصل شود که
از مرز پشته
فراتر
نمیروید.
اگر در
محیطی با
چندین رشته
(thread) برنامه را
اجرا
میکنید
باید این
پرچم را
مشخص کنید،
اما در یک
محیط
تکرشتهای
بهندرت
نیاز به
تعیین آن
دارید،
زیرا اگر
تنها یک
پشته وجود
داشته
باشد،
سرریز پشته
تقریباً در
تمام
سیستمها
بهطور
خودکار
تشخیص داده
میشود.
توجه داشته باشید که این گزینه عملاً باعث انجام بررسی نمیشود؛ سیستمعامل یا زمان اجرای زبان باید این کار را انجام دهد. این گزینه باعث تولید کدی میشود تا اطمینان حاصل شود که آنها متوجه گسترش پشته میشوند.
علاوه بر این میتوانید یک پارامتر رشتهای مشخص کنید: no به معنای عدم بررسی است، generic به معنای اجبار به استفاده از بررسی به سبک قدیمی است، و specific به معنای استفاده از بهترین روش بررسی است و با -fstack-check خالی معادل است.
بررسی به سبک قدیمی یک سازوکار عمومی است که به هیچ پشتیبانی ویژهٔ مقصد در کامپایلر نیاز ندارد اما معایب زیر را به همراه دارد:
- 1.
- راهبرد تخصیص تغییریافته برای اشیاء بزرگ: در صورتی که اندازهٔ آنها از یک آستانهٔ ثابت فراتر رود، همواره بهطور پویا تخصیص مییابند. توجه داشته باشید که این ممکن است معناشناسی برخی کدها را تغییر دهد.
- 2.
- محدودیت ثابت در اندازهٔ فریم ایستای توابع: هنگامی که یک تابع خاص از این حد فراتر میرود، بررسی پشته قابل اتکا نیست و یک هشدار توسط کامپایلر صادر میشود.
- 3.
- ناکارآمدی: به دلیل هر دوی راهبرد تخصیص تغییریافته و پیادهسازی عمومی، کارایی کد دچار افت میشود.
توجه داشته باشید که اگر پشتیبانی از مقصد در کامپایلر اضافه نشده باشد، بررسی پشته به سبک قدیمی همچنین روش جایگزین (fallback) برای specific خواهد بود.
گزینهٔ -fstack-check= برای نیازهای Ada در تشخیص بازگشت بینهایت و سرریزهای پشته طراحی شده است. specific گزینهای عالی هنگام کامپایل کدهای Ada است. این گزینه عموماً برای محافظت در برابر حملات برخورد پشته (stack-clash) کافی نیست. برای محافظت در برابر آنها باید از -fstack-clash-protection استفاده کنید. کدی برای جلوگیری از حملات سبک برخورد پشته (stack clash) تولید میکند. وقتی این گزینه فعال باشد، کامپایلر فضای پشته را در هر نوبت تنها به اندازه یک صفحه (page) تخصیص میدهد و به هر صفحه بلافاصله پس از تخصیص دسترسی پیدا میکند. بدین ترتیب، این گزینه از جهش تخصیصها از روی صفحات محافظ پشته (stack guard page) ارائهشده توسط سیستمعامل جلوگیری میکند.
بیشتر اهداف (targets) بهطور کامل از محافظت در برابر برخورد پشته پشتیبانی نمیکنند. با این حال، در آن اهداف -fstack-clash-protection از تخصیصهای پویای پشته محافظت خواهد کرد. همچنین در صورتی که هدف از -fstack-check=specific پشتیبانی کند، -fstack-clash-protection ممکن است محافظت محدودی برای تخصیصهای ایستان پشته نیز فراهم کند.
- -fstack-limit-register=reg
- -fstack-limit-symbol=sym
- -fno-stack-limit
- کدی تولید
میکند تا
اطمینان
حاصل شود که
پشته فراتر
از یک مقدار
مشخص، اعم
از مقدار یک
ثبات (register) یا
آدرس یک
نماد (symbol)، رشد
نمیکند.
اگر به پشته
بزرگتری
نیاز باشد،
یک سیگنال
در زمان
اجرا ارسال
(raise) میشود.
برای اکثر
اهداف،
سیگنال قبل
از اینکه
پشته از مرز
فراتر رود
ایجاد
میشود،
بنابراین
میتوان
سیگنال را
بدون اتخاذ
تمهیدات
ویژه
دریافت و
مدیریت کرد.
به عنوان مثال، اگر پشته از آدرس مطلق 0x80000000 آغاز شده و رو به پایین رشد کند، میتوانید از پرچمهای -fstack-limit-symbol=__stack_limit و -Wl,--defsym,__stack_limit=0x7ffe0000 برای اعمال یک محدودیت پشته ۱۲۸ کیلوبایتی استفاده کنید. توجه داشته باشید که این ممکن است تنها با پیونددهنده گنو (GNU linker) کار کند.
میتوانید بررسی محدودیت پشته را بهصورت محلی با استفاده از مشخصه تابع (function attribute) "no_stack_limit" بازنویسی (override) کنید.
- -fsplit-stack
- کدی تولید
میکند تا
پشته پیش از
سرریز شدن
بهطور
خودکار
تقسیم شود.
برنامه
حاصل دارای
یک پشته
ناپیوسته
خواهد بود
که تنها در
صورتی ممکن
است سرریز
کند که
برنامه
قادر به
تخصیص
حافظه
بیشتر
نباشد. این
قابلیت
هنگام
اجرای
برنامههای
چندنخی (threaded)
بسیار مفید
است، چرا که
دیگر نیازی
به محاسبه
اندازه
مناسب پشته
برای هر نخ
(thread) وجود
ندارد. این
ویژگی در
حال حاضر
فقط برای
اهداف x86 که
گنو/لینوکس
را اجرا
میکنند
پیادهسازی
شده است.
وقتی کدی که با -fsplit-stack کامپایل شده است، کدی را فراخوانی کند که بدون -fsplit-stack کامپایل شده باشد، ممکن است فضای پشته زیادی برای اجرای کد دوم در دسترس نباشد. اگر کامپایل کردن تمام کدها، از جمله کدهای کتابخانهای، با -fsplit-stack امکانپذیر نباشد، پیونددهنده میتواند این فراخوانیها را بهگونهای اصلاح کند که کد کامپایلشده بدون -fsplit-stack همیشه دارای پشته بزرگی باشد. پشتیبانی از این قابلیت در پیونددهنده gold در نسخه 2.21 و نسخههای بعدی GNU Binutils پیادهسازی شده است.
- -fstrub=disable
- پاکسازی پشته (stack scrubbing) را بهطور کامل غیرفعال کرده و هرگونه مشخصه "strub" را نادیده میگیرد.
- -fstrub=strict
- حالت پیشفرض توابع را به "strub" از نوع "disabled" تنظیم میکند و این محدودیت را بهطور سختگیرانه (strict) اعمال میکند که تنها توابع مرتبط با حالتهای قابل فراخوانیِ "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
- حالت "strub" از نوع "at-calls" را در صورت امکان فعال میکند. کاربرد اصلی این گزینه برای آزمایش است. این گزینه سازوکار "strub" را در سناریوهایی که کاملاً محلی به یک واحد ترجمه (translation unit) هستند میآزماید. این حالتِ "strub" رابط توابع را تغییر میدهد، بنابراین هر تابعی که برای سایر واحدهای ترجمه مرئی باشد، یا آدرس آن گرفته شده باشد، تحت تأثیر این گزینه قرار نخواهد گرفت. گزینههای بهینهسازی نیز ممکن است بر امکانپذیری تأثیر بگذارند. برای جزئیات در مورد الزامات امکانپذیری و واجد شرایط بودن، به مستندات مشخصه "strub" مراجعه کنید.
- -fstrub=internal
- حالت "strub" از نوع "internal" را در صورت امکان فعال میکند. کاربرد اصلی این گزینه برای آزمایش است. این گزینه برای آزمودن کامل بخشهایی از سازوکار "strub" در نظر گرفته شده است که حالت کمبازدهتر اما حافظ رابط (interface-preserving) "strub" را پیادهسازی میکنند. توابعی که تحت تأثیر این گزینه قرار نگیرند، بسیار نادر هستند.
- -fstrub=all
- یکی از حالتهای "strub" را در صورت امکان فعال میکند. هنگامی که هر دو حالت strub امکانپذیر باشند، "at-calls" ارجحیت دارد. گزینه -fdump-ipa-strubm مشخصههای تابعی را اضافه میکند که مشخص میسازد کدام حالت برای هر تابع انتخاب شده است. کاربرد اصلی این گزینه برای آزمایش و آزمودن دقیق سازوکار "strub" است.
- -fvtable-verify=[std|preinit|none]
- این گزینه
تنها هنگام
کامپایل
کدهای ++C در
دسترس است.
این گزینه
قابلیت
امنیتیای
را فعال (یا
در صورت
استفاده از
-fvtable-verify=none
غیرفعال)
میکند که
در زمان
اجرا، برای
هر
فراخوانی
مجازی (virtual call)،
بررسی
میکند که
آیا
اشارهگر vtable
که
فراخوانی
از طریق آن
انجام
میشود
برای نوع
شیء معتبر
است و تخریب
یا
بازنویسی
نشده است یا
خیر. اگر
اشارهگر vtable
نامعتبری
در زمان
اجرا
شناسایی
شود، خطایی
گزارش شده و
اجرای
برنامه
بلافاصله
متوقف
میشود.
این گزینه باعث میشود که ساختارهای داده زمان اجرا در هنگام راهاندازی برنامه ساخته شوند، که برای اعتبارسنجی اشارهگرهای vtable به کار میروند. گزینههای std و preinit زمان ساخته شدن این ساختارهای داده را کنترل میکنند. در هر دو حالت، ساختارهای داده قبل از رسیدن اجرا به "main" ساخته میشوند. استفاده از -fvtable-verify=std باعث میشود ساختارهای داده پس از بارگذاری و مقداردهی اولیه کتابخانههای مشترک (shared libraries) ساخته شوند. -fvtable-verify=preinit باعث میشود که آنها قبل از بارگذاری و مقداردهی اولیه کتابخانههای مشترک ساخته شوند.
اگر این گزینه چندین بار با مقادیر متفاوت در خط فرمان ظاهر شود، none بالاترین اولویت را نسبت به هر دو مقدار std و preinit دارد؛ preinit نیز نسبت به std اولویت دارد.
- -fvtv-debug
- هنگامی که
همراه با
-fvtable-verify=std یا -fvtable-verify=preinit
استفاده
شود، باعث
فراخوانی
نسخههای
اشکالزدایی
توابع زمان
اجرا برای
قابلیت
اعتبارسنجی
vtable میشود.
این پرچم
همچنین
باعث
میشود
کامپایلر
اطلاعات
مربوط به
اشارهگرهای
vtable یافتشده
برای هر
کلاس را ثبت
کند. این
اطلاعات در
فایلی به
نام vtv_set_ptr_data.log در
دایرکتوری
مشخصشده
توسط متغیر
محیطی VTV_LOGS_DIR
(در صورت
تعریف) یا
در
دایرکتوری
کاری جاری
نوشته
میشود.
نکته: این قابلیت دادهها را به فایل لاگ پیوست (append) میکند. اگر یک فایل لاگ تازه میخواهید، حتماً هرگونه فایل موجود را حذف کنید.
- -fvtv-counts
- این یک پرچم
اشکالزدایی
است. هنگامی
که همراه با
-fvtable-verify=std یا -fvtable-verify=preinit
استفاده
شود، باعث
میشود
کامپایلر
تعداد کل
فراخوانیهای
مجازی که با
آنها
مواجه
میشود و
تعداد
بررسیهای
اعتبارسنجی
درجشده را
ردگیری کند.
همچنین
تعداد
فراخوانیهای
توابع
کتابخانهای
زمان اجرای
خاصی را که
درج میکند
شمارش کرده
و این
اطلاعات را
برای هر
واحد
کامپایل
ثبت میکند.
کامپایلر
این
اطلاعات را
در فایلی به
نام vtv_count_data.log در
دایرکتوری
مشخصشده
توسط متغیر
محیطی VTV_LOGS_DIR
(در صورت
تعریف) یا
در
دایرکتوری
کاری جاری
مینویسد.
همچنین
اندازه
مجموعههای
اشارهگر vtable
را برای هر
کلاس شمارش
کرده و این
اطلاعات را
در vtv_class_set_sizes.log در
همان
دایرکتوری
مینویسد.
نکته: این قابلیت دادهها را به فایلهای لاگ پیوست (append) میکند. برای داشتن فایلهای لاگ تازه، حتماً فایلهای موجود را حذف کنید.
- -finstrument-functions
- فراخوانیهای
سنجش و پایش
(instrumentation) را برای
ورود و خروج
به توابع
تولید
میکند.
دقیقاً پس
از ورود به
تابع و
دقیقاً پیش
از خروج از
آن، توابع
تحلیل
کارایی (profiling)
زیر با آدرس
تابع جاری و
محل
فراخوانی
آن (call site)
فراخوانی
میشوند.
(در برخی
پلتفرمها،
"__builtin_return_address"
فراتر از
تابع جاری
کار
نمیکند،
بنابراین
اطلاعات
محل
فراخوانی
ممکن است در
غیر این
صورت برای
توابع
تحلیل
کارایی در
دسترس
نباشد.)
void __cyg_profile_func_enter (void *this_fn, void *call_site); void __cyg_profile_func_exit (void *this_fn, void *call_site);نخستین آرگومان، آدرس شروع تابع جاری است که ممکن است دقیقاً در جدول نمادها جستجو شود.
این سنجش و پایش برای توابعی که بهصورت درونخطی (inline) در سایر توابع گسترش مییابند نیز انجام میشود. فراخوانیهای تحلیل کارایی نشان میدهند که تابع درونخطی از نظر مفهومی در کجا وارد و خارج شده است. این بدان معناست که نسخههای آدرسپذیر چنین توابعی باید در دسترس باشند. اگر تمام استفادههای شما از یک تابع بهصورت درونخطی گسترش یابد، این امر ممکن است به معنای افزایش بیشتر اندازه کد باشد. اگر در کد C خود از "extern inline" استفاده کنید، باید یک نسخه آدرسپذیر از چنین توابعی ارائه شود. (در هر صورت معمولاً همینگونه است، اما اگر شانس بیاورید و بهینهساز همیشه توابع را درونخطی کند، ممکن است بدون ارائه نسخههای ایستا کارتان راه افتاده باشد.)
به یک تابع میتوان مشخصه "no_instrument_function" را اختصاص داد، که در این صورت این سنجش و پایش برای آن انجام نمیشود. از این مشخصه میتوان برای نمونه برای توابع تحلیل کارایی فهرستشده در بالا، روتینهای وقفه با اولویت بالا و هر تابعی که نمیتوان توابع تحلیل کارایی را بهطور ایمن از آن فراخوانی کرد (مانند گردانندههای سیگنال، در صورتی که روالهای تحلیل کارایی خروجی تولید کنند یا حافظه تخصیص دهند) استفاده کرد..IP -finstrument-functions-once 4 این گزینه مشابه -finstrument-functions است، اما توابع پروفایلسازی تنها یکبار به ازای هر تابع ابزارگذاریشده فراخوانی میشوند؛ بدین معنا که نخستین تابع پروفایلسازی پس از اولین ورود به تابع ابزارگذاریشده و دومین تابع پروفایلسازی پیش از خروج متناظر با این نخستین ورود فراخوانی میشود.
تعریف "once" برای اهداف این گزینه تا حدی مبهم است، زیرا پیادهسازی در برابر شرایط رقابت دادهای (data races) محافظت نشده است. در نتیجه، پیادهسازی تنها تضمین میکند که توابع پروفایلسازی دستکم (least) یکبار به ازای هر فرآیند و حداکثر (most) یکبار به ازای هر رشته فراخوانی شوند، اما فراخوانیها همواره جفت هستند؛ به این معنا که اگر رشتهای تابع نخست را فراخوانی کند، در ادامه تابع دوم را نیز فراخوانی خواهد کرد، مگر آنکه هرگز به خروج از تابع ابزارگذاریشده نرسد.
- -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> &)"، نه نام درهمپیچیده (mangled) داخلی (مانند "_Z4blahRSt6vectorIiSaIiEE"). تطبیق روی زیررشتهها انجام میشود: اگر پارامتر sym زیررشتهای از نام تابع باشد، یک تطابق در نظر گرفته میشود. برای شناسههای گسترشیافته C99 و C++، نام تابع باید در UTF-8 داده شود، نه با استفاده از نامهای نویسه همگانی (universal character names).
- -fpatchable-function-entry=N[,M]
- تعداد N
دستور NOP را
درست در
ابتدای هر
تابع تولید
میکند،
بهطوریکه
نقطه ورود
تابع پیش از
Mامین NOP
قرار
میگیرد.
اگر M حذف
شود، مقدار
پیشفرض آن
0 خواهد
بود تا نقطه
ورود تابع
دقیقاً به
آدرس
نخستین NOP
اشاره کند.
دستورالعملهای
NOP فضای
اضافی رزرو
میکنند که
در صورت
قابل نوشتن
بودن بخش کد
(code segment)،
میتواند
برای
وصلهکردن
(patching) هرگونه
ابزارگذاری
دلخواه در
زمان اجرا
استفاده
شود. مقدار
این فضا
بهطور
غیرمستقیم
از طریق
تعداد NOPها
قابل کنترل
است؛ دستور
NOP
استفادهشده
با
دستورالعملی
که توسط
رابط پشتی
(back-end) داخلی GCC
یعنی
"gen_nop"
صادر
میشود
مطابقت
دارد. این
رفتار
وابسته به
هدف (target-specific) است
و ممکن است
به گونه
معماری و/یا
سایر
گزینههای
کامپایل
نیز بستگی
داشته باشد.
به منظور شناسایی در زمان اجرا، آدرسهای آغازین این نواحی که متناظر با ورودیهای توابع مربوطه منهای M هستند، علاوه بر این در بخش "__patchable_function_entries" از باینری نهایی جمعآوری میشوند.
توجه داشته باشید که مقدار "__attribute__ ((patchable_function_entry (N,M)))" بر گزینه خط فرمان -fpatchable-function-entry=N,M تقدم دارد. این ویژگی میتواند برای افزایش اندازه ناحیه یا حذف کامل آن در یک تابع منفرد به کار رود. اگر "N=0" باشد، هیچ مکان لایهگذاری (pad) ثبت نمیشود.
دستورالعملهای 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
نشانهگذاری
(tokenized) شده و
طوری
پردازش
میشود که
گویی در فاز
سوم ترجمه
در یک دستور
#define ظاهر شده
است.
بهویژه،
تعریف با
نویسههای
خط جدید (newline)
درون آن قطع
میشود.
اگر پیشپردازنده را از یک شل یا برنامهای شبیه به شل فراخوانی میکنید، ممکن است لازم باشد از نحو نقلقول (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
دور ریخته
میشود.
ماکروهایی
که تعریف
میکند
تعریفشده
باقی
میمانند.
این ویژگی
به شما
امکان
میدهد
تمام
ماکروها را
از یک فایل
سرآیند
دریافت
کنید بدون
آنکه
اعلانهای
آن نیز
پردازش
شوند.
تمام فایلهای مشخصشده با -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 به درایور مستلزم استفاده از -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)
برای هر
وابستگی به
جز فایل
اصلی اضافه
کند،
بهگونهای
که هر یک به
هیچچیز
وابسته
نباشند. این
قواعد
ساختگی (dummy)
خطاهایی را
که make در
صورت حذف
فایلهای
سرآیند
بدون
بهروزرسانی
متناظر Makefile
میدهد،
دور
میزنند.
این یک نمونه خروجی معمول است: test.o: test.c test.h test.h:
- -MT target
- تغییر هدف (target)
قاعدهای
که با تولید
وابستگیها
ایجاد
میشود.
بهطور
پیشفرض CPP
نام فایل
ورودی اصلی
را
میگیرد،
مؤلفههای
دایرکتوری
و هرگونه
پسوند فایل
مانند .c را
حذف
میکند، و
پسوند شیء (object)
معمول
پلتفرم را
میافزاید.
نتیجهٔ
نهایی، هدف
خواهد بود.
گزینهٔ -MT هدف را دقیقاً روی رشتهای که مشخص میکنید تنظیم میکند. اگر چند هدف میخواهید، میتوانید آنها را بهعنوان یک آرگومان واحد به -MT بدهید، یا از چندین گزینهٔ -MT استفاده کنید.
برای مثال، -MT '$(objpfx)foo.o' ممکن است چنین خروجی دهد:
$(objpfx)foo.o: foo.c
- -MQ target
- مشابه -MT،
با این
تفاوت که
نویسههای
خاص برای Make
را گریزدهی
(quote) میکند.
-MQ '$(objpfx)foo.o' چنین
نتیجهای
میدهد:
$$(objpfx)foo.o: foo.c
هدف پیشفرض بهطور خودکار گریزدهی میشود، درست مثل اینکه با -MQ مشخص شده باشد.
- -MD
- --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)، پیوند
خطوط جدید
گریزخورده،
و پردازش
بیشتر
رهنمودها
را غیرفعال
میکند.
پیشپردازنده
همچنان
توضیحها
(کامنتها)
را شناسایی
و حذف
میکند، تا
بتوانید
فایلی را که
با -C
پیشپردازش
شده است
بدون مشکل
به
کامپایلر
ارسال کنید.
در این حالت
پیشپردازندهٔ
یکپارچه
چیزی بیش از
یک
نشانهگذار
(tokenizer) برای
بخشهای
جلویی (front ends)
نیست.
اگر فایل ورودی یکی از پسوندهای .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. پیشفرض 200 است.
- -fsearch-include-path[=kind]
- جستجوی
فایلهای
ورودی در
مسیر #include، نه
صرفاً در
دایرکتوری
جاری. این
بهویژه با
ماژولهای
C++20 کاربرد
دارد، که
برای آنها
هم واحدهای
سرآیند و هم
واحدهای
رابط ماژول
باید
مستقیماً
کامپایل
شوند:
g++ -c -std=c++20 -fmodules -fsearch-include-path bits/stdc++.h bits/std.cc
مقدار kind بهطور پیشفرض user است که در مسیر جستجوی #include "..." به جستجو میپردازد؛ همچنین میتوانید بهطور صریح system را برای مسیر جستجوی "#include <...>" مشخص کنید.
- -ftabstop=width
- تنظیم فاصلهٔ بین توقفهای تب (tab stops). این به پیشپردازنده کمک میکند تا شماره ستونهای درستی را در هشدارها یا خطاها گزارش دهد، حتی اگر تبها روی خط وجود داشته باشند. اگر مقدار کمتر از 1 یا بیشتر از 100 باشد، گزینه نادیده گرفته میشود. مقدار پیشفرض 8 است.
- -ftrack-macro-expansion[=level]
- ردیابی
مکان
نشانهها (tokens)
در طول
بسطهای
ماکرو. این
به
کامپایلر
اجازه
میدهد تا
هنگام بروز
خطای
کامپایل
درون یک بسط
ماکرو،
اطلاعات
تشخیصی
دربارهٔ
پشتهٔ بسط
ماکروی
فعلی صادر
کند.
استفاده از
این گزینه
باعث
میشود
پیشپردازنده
و کامپایلر
حافظهٔ
بیشتری
مصرف کنند.
پارامتر 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، هشدارهایی دربارهٔ توالیهای بدفرم واحدهای کد صادر میشود. در غیر این صورت، در صورتی که مجموعه نویسههای ورودی با مجموعه نویسههای زمان اجرا همخوانی داشته باشد، هیچ پیام تشخیصی صادر نمیشود. در صورت مغایرت، توالیهای بدفرم واحدهای کد در طول تبدیل کدگذاری به مجموعه نویسههای زمان اجرا منجر به خطا خواهند شد..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 از این دایرکتوری، در صورت وجود در ورودی پیشپردازششده، به عنوان دایرکتوری ثبتشده به عنوان دایرکتوری کاری جاری در برخی قالبهای اطلاعات اشکالزدایی استفاده میکند. این گزینه در صورت فعال بودن اطلاعات اشکالزدایی، به صورت ضمنی فعال میشود، اما میتوان با شکل نقیض -fno-working-directory از آن جلوگیری کرد. اگر پرچم -P در خط فرمان وجود داشته باشد، این گزینه هیچ اثری ندارد، زیرا اصلاً هیچ دستورالعمل "#line" منتشر نمیشود.
- -C
- --comments
- توضیحات
(کامنتها)
را حذف
نکنید. تمام
توضیحات به
فایل خروجی
منتقل
میشوند،
به جز
توضیحات
درون
دستورالعملهای
پردازششده،
که همراه با
خود
دستورالعمل
حذف
میگردند.
هنگام استفاده از -C باید برای اثرات جانبی آماده باشید؛ این گزینه باعث میشود پیشپردازنده با کامنتها به عنوان نشانههایی (tokens) مستقل رفتار کند. برای مثال، کامنتهایی که در ابتدای یک خط دستورالعمل بالقوه قرار میگیرند، باعث میشوند آن خط به یک خط کد معمولی تبدیل شود، زیرا اولین نشانه در آن خط دیگر # نخواهد بود.
- -CC
- --comments-in-macros
- توضیحات
را، حتی در
حین بسط
ماکرو (macro expansion)،
دور نریزید.
این گزینه
شبیه به -C
است، با این
تفاوت که
توضیحات
موجود در
ماکروها
نیز در جایی
که ماکرو
بسط
مییابد،
به فایل
خروجی
منتقل
میشوند.
علاوه بر اثرات جانبی گزینه -C، گزینه -CC باعث میشود تمام توضیحات به سبک ++C درون یک ماکرو، به توضیحات به سبک C تبدیل شوند. این کار برای جلوگیری از این است که استفاده بعدی از آن ماکرو سهواً باعث کامنت شدن ادامه آن خط از کد مبدأ نشود.
گزینه -CC عموماً برای پشتیبانی از توضیحات lint به کار میرود.
- -P
- --no-line-commands
- از تولید نشانگرهای خط در خروجی پیشپردازنده جلوگیری میکند. این گزینه ممکن است هنگام اجرای پیشپردازنده روی متنی که کد C نیست و به برنامهای ارسال میشود که ممکن است با نشانگرهای خط دچار سردرگمی شود، مفید باشد.
- -traditional
- --traditional
- -traditional-cpp
- --traditional-cpp
- تلاش
میکند تا
رفتار
پیشپردازندههای
C پیش از
استاندارد
را، در
مقایسه با
پیشپردازندههای
C استاندارد
ISO، تقلید
کند. برای
جزئیات
بیشتر به
راهنمای 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
استفاده
شود،
اطلاعات
اشکالزدایی
مربوط به
نقشههای
موقعیت را
تخلیه (dump)
میکند. پیش
از هر
نشانهوند
(token) در خروجی،
اطلاعات
نقشهٔ
موقعیتی که
به آن تعلق
دارد درج
میشود.
هنگامی که بدون -E از درون GCC استفاده شود، این گزینه هیچ اثری ندارد.
- -Wp,option
- میتوانید از -Wp,option برای دور زدن گردانندهٔ کامپایلر (compiler driver) و ارسال مستقیم option به پیشپردازنده استفاده کنید. اگر option شامل کاما باشد، در محل کاماها به چندین گزینه تفکیک میشود. با این حال، بسیاری از گزینهها پیش از تحویل به پیشپردازنده، توسط گردانندهٔ کامپایلر اصلاح، ترجمه یا تفسیر میشوند، و -Wp این مرحله را بهصورت اجباری دور میزند. رابط کاربری مستقیم پیشپردازنده مستندسازی نشده و دستخوش تغییر است، بنابراین در صورت امکان باید از بهکارگیری -Wp خودداری کنید و اجازه دهید خود گرداننده گزینهها را مدیریت کند.
- -Xpreprocessor option
- گزینهٔ option
را
بهعنوان
یک گزینه به
پیشپردازنده
ارسال
میکند.
میتوانید
از این
گزینه برای
ارسال
گزینههای
پیشپردازندهٔ
مختص سیستم
که GCC آنها
را شناسایی
نمیکند
استفاده
کنید.
اگر میخواهید گزینهای را ارسال کنید که یک آرگومان میگیرد، باید دوبار از -Xpreprocessor استفاده کنید؛ یکبار برای گزینه و یکبار برای آرگومان آن.
- -no-integrated-cpp
- --no-integrated-cpp
- پیشپردازش را بهعنوان یک مرحلهٔ مجزا پیش از کامپایل انجام میدهد. بهطور پیشفرض، GCC پیشپردازش را بهعنوان بخشی یکپارچه از نشانهگذاری (tokenization) و تجزیه (parsing) ورودی انجام میدهد. اگر این گزینه مشخص شود، فرانتاند مناسب زبان (cc1، cc1plus یا cc1obj بهترتیب برای C، C++ و Objective-C) در عوض دوبار فراخوانی میشود؛ یکبار تنها برای پیشپردازش و یکبار برای کامپایل واقعی ورودی پیشپردازششده. این گزینه ممکن است همراه با گزینههای -B یا -wrapper برای تعیین یک پیشپردازندهٔ جایگزین یا انجام پردازشهای اضافی روی کد منبع برنامه بین پیشپردازش عادی و کامپایل مفید باشد.
ارسال گزینهها به اسمبلر (Passing Options to the Assembler)
میتوانید گزینهها را به اسمبلر ارسال کنید.
- -Wa,option
- گزینهٔ option را بهعنوان گزینهای به اسمبلر ارسال میکند. اگر option حاوی کاما باشد، در محل کاماها به چندین گزینه تفکیک میشود.
- -Xassembler option
- --for-assembler=option
- --for-assembler option
- گزینهٔ option
را
بهعنوان
گزینهای
به اسمبلر
ارسال
میکند.
میتوانید
از این برای
ارسال
گزینههای
اسمبلر
مختص سیستم
که GCC آنها
را شناسایی
نمیکند
استفاده
کنید.
اگر میخواهید گزینهای را ارسال کنید که آرگومان میگیرد، باید دوبار از -Xassembler استفاده کنید؛ یکبار برای گزینه و یکبار برای آرگومان..SS "گزینههای پیوند دادن (Options for Linking)" این گزینهها زمانی اعمال میشوند که کامپایلر فایلهای شیء (object files) را در قالب یک فایل خروجی اجرایی پیوند میزند. در صورتی که کامپایلر مرحلهٔ پیوند را انجام ندهد، این گزینهها بیاثر خواهند بود.
- object-file-name
- نام فایلی که به پسوند شناختهشدهٔ خاصی ختم نشود، به عنوان نام یک فایل شیء یا کتابخانه در نظر گرفته میشود. (فایلهای شیء بر اساس محتویات فایل توسط پیونددهنده از کتابخانهها تشخیص داده میشوند.) در صورت انجام پیوند، این فایلهای شیء به عنوان ورودی پیونددهنده استفاده میشوند.
- -c
- -S
- -E
- اگر هر یک از این گزینهها استفاده شود، پیونددهنده اجرا نمیشود و نباید از نام فایلهای شیء به عنوان آرگومان استفاده کرد.
- -flink-libatomic
- پیوند دادن libatomic را در صورت پشتیبانی توسط مقصد (target) فعال میکند؛ این گزینه بهطور پیشفرض فعال است. فرم نقیض آن، -fno-link-libatomic، میتواند برای غیرفعال کردن صریح پیوند دادن libatomic استفاده شود.
- -flinker-output=type
- این گزینه
تولید کدِ
بهینهساز
زمان پیوند
را کنترل
میکند.
بهطور
پیشفرض،
خروجی
پیونددهنده
بهصورت
خودکار
توسط
افزونهٔ
پیونددهنده
تعیین
میشود.
برای
اشکالزدایی
کامپایلر و
در صورتی که
پیوند
افزایشی با
یک فایل شیء
غیر LTO مد نظر
باشد،
کنترل دستی
type
میتواند
مفید باشد.
اگر type برابر با exec باشد، تولید کد یک باینری ایستا (static binary) ایجاد میکند. در این حالت -fpic و -fpie هر دو غیرفعال میشوند.
اگر type برابر با dyn باشد، تولید کد یک کتابخانهٔ مشترک (shared library) ایجاد میکند. در این حالت -fpic یا -fPIC حفظ میشود، اما بهطور خودکار فعال نمیگردد. این امر امکان ساخت کتابخانههای مشترک بدون کد مستقل از موقعیت را روی معماریهایی که این کار در آنها امکانپذیر است (مانند x86)، فراهم میکند.
اگر type برابر با pie باشد، تولید کد یک فایل اجرایی -fpie تولید میکند. این حالت بهینهسازیهای مشابهی با exec دارد، با این تفاوت که اگر -fpie در زمان کامپایل مشخص شده باشد، غیرفعال نمیشود.
اگر type برابر با rel باشد، کامپایلر فرض میکند که پیوند افزایشی (incremental linking) انجام میشود. بخشهای حاوی کد میانی برای بهینهسازی زمان پیوند ادغام شده، از پیش بهینهسازی میشوند و در فایل شیء حاصل خروجی داده میشوند. علاوه بر این، اگر -ffat-lto-objects مشخص شده باشد، کد باینری برای پیوندهای غیر LTO آینده نیز تولید میشود. فایل شیء حاصل از پیوند افزایشی کوچکتر از یک کتابخانهٔ ایستا است که از همان فایلهای شیء تولید شده باشد. در زمان پیوند، با این فرض که بیشتر شیءهای درون کتابخانه استفاده شوند، نتیجهٔ پیوند افزایشی همچنین سریعتر از یک کتابخانهٔ ایستا بارگذاری میشود.
در نهایت، nolto-rel کامپایلر را برای پیوند افزایشی پیکربندی میکند به گونهای که تولید کد اجباری میشود، یک باینری نهایی تولید شده و کد میانی برای بهینهسازیهای بعدی زمان پیوند حذف (strip) میشود. هنگامی که چندین فایل شیء با هم پیوند داده میشوند، کد حاصل نسبت به حالتی که بهینهسازیهای زمان پیوند غیرفعال است بهینهتر خواهد بود (برای مثال، درونریزی میانماژولی یا cross-module inlining رخ میدهد)، اما بیشتر مزایای بهینهسازی کل برنامه (whole-program optimizations) از دست میرود.
در طول پیوند افزایشی (با استفاده از -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
- استفاده از پیونددهندهٔ مدرن (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
- در زمان پیوند دادن از فایلهای راهانداز (startup files) استاندارد سیستم استفاده نکنید. کتابخانههای استاندارد سیستم به صورت عادی استفاده میشوند، مگر اینکه از -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 threads) پیوند برقرار کن. این گزینه در مقصدهای GNU/Linux، بیشتر مشتقات دیگر Unix و همچنین مقصدهای x86 Cygwin و MinGW پشتیبانی میشود. در برخی مقصدها این گزینه پرچمهایی را نیز برای پیشپردازنده تنظیم میکند، بنابراین باید به طور یکنواخت هم برای کامپایل و هم برای پیوند استفاده شود.
- -r
- یک شیء بازمکانپذیر به عنوان خروجی تولید کن. این عمل به عنوان پیوند جزئی (partial linking) نیز شناخته میشود.
- -rdynamic
- در مقصدهایی که پشتیبانی میکنند، پرچم -export-dynamic را به پیونددهندهٔ ELF ارسال کن. این گزینه به پیونددهنده دستور میدهد تمام نمادها را، و نه تنها نمادهای استفادهشده، به جدول نمادهای پویا اضافه کند. این گزینه برای برخی از کاربردهای "dlopen" یا برای امکان دریافت ردپای پشته (backtrace) از درون برنامه مورد نیاز است.
- -s
- تمام جدول نمادها و اطلاعات بازآرایی (relocation) را از فایل اجرایی حذف کن.
- -static
- --static
- در سیستمهایی که از پیوند پویا پشتیبانی میکنند، این گزینه اولویت بالاتری نسبت به -pie داشته و از پیوند با کتابخانههای مشترک جلوگیری میکند. در سایر سیستمها، این گزینه اثری ندارد.
- یک شیء مشترک (shared object) تولید کن که بتواند بعداً برای ساختن یک فایل اجرایی با دیگر اشیاء پیوند داده شود. همهٔ سیستمها از این گزینه پشتیبانی نمیکنند. برای نتایج قابل پیشبینی، هنگام مشخص کردن این گزینهٔ پیونددهنده، باید همان مجموعه گزینههای استفادهشده برای کامپایل (-fpic، -fPIC یا زیرگزینههای مدل) را نیز مشخص کنید.[1]
- -static-libgcc
- در
سیستمهایی
که libgcc را به
صورت یک
کتابخانهٔ
مشترک
ارائه
میدهند،
این
گزینهها
به ترتیب
استفاده از
نسخهٔ
مشترک یا
ایستا را
اجباری
میکنند.
اگر هنگام
پیکربندی
کامپایلر
هیچ نسخهٔ
مشترکی از
libgcc ساخته
نشده باشد،
این
گزینهها
هیچ اثری
ندارند.
موقعیتهای متعددی وجود دارد که در آنها یک برنامه کاربردی باید به جای نسخهٔ ایستا از نسخهٔ مشترک libgcc استفاده کند. متداولترین حالت زمانی است که برنامه بخواهد استثناها (exceptions) را میان کتابخانههای مشترک مختلف پرتاب و دریافت (throw and catch) کند. در این حالت، هر یک از کتابخانهها و همچنین خود برنامه باید از libgcc مشترک استفاده کنند.
بنابراین، راهانداز G++ هر زمان که یک کتابخانهٔ مشترک یا یک فایل اجرایی اصلی را میسازید، به طور خودکار -shared-libgcc را اضافه میکند؛ زیرا برنامههای C++ معمولاً از استثناها استفاده میکنند و این رویکرد صحیح است.
در مقابل، اگر از راهانداز GCC برای ایجاد کتابخانههای مشترک استفاده کنید، ممکن است متوجه شوید که آنها همیشه با نسخهٔ مشترک libgcc پیوند داده نمیشوند. اگر GCC در زمان پیکربندی خود تشخیص دهد که شما یک پیونددهندهٔ غیر گنو یا یک پیونددهندهٔ GNU دارید که از گزینهٔ --eh-frame-hdr پشتیبانی نمیکند، به صورت پیشفرض نسخهٔ مشترک libgcc را درون کتابخانههای مشترک پیوند میدهد. در غیر این صورت، از پیونددهنده بهره گرفته و پیوند با نسخهٔ مشترک libgcc را بهینهسازی و حذف میکند و به طور پیشفرض با نسخهٔ ایستای libgcc پیوند برقرار میکند. این امر اجازه میدهد استثناها درون چنین کتابخانههای مشترکی منتشر شوند، بدون اینکه هزینههای بازآرایی در زمان بارگذاری کتابخانه تحمیل شود.
با این حال، اگر قرار است یک کتابخانه یا فایل اجرایی اصلی استثناها را پرتاب یا دریافت کند، باید آن را با استفاده از راهانداز G++ یا با بهکارگیری گزینهٔ -shared-libgcc پیوند دهید تا مطمئن شوید با libgcc مشترک پیوند برقرار میکند.
- -static-libasan
- هنگامی که از گزینهٔ -fsanitize=address برای پیوند دادن یک برنامه استفاده میشود، راهانداز GCC به طور خودکار با libasan پیوند میخورد. اگر libasan به عنوان یک کتابخانهٔ مشترک در دسترس باشد و گزینهٔ -static استفاده نشده باشد، پیوند با نسخهٔ مشترک libasan برقرار خواهد شد. گزینهٔ -static-libasan به راهانداز GCC هدایت میکند که libasan را به صورت ایستا پیوند دهد، بدون اینکه لزوماً سایر کتابخانهها به صورت ایستا پیوند داده شوند.
- -static-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
بهعنوان
یک گزینه به
پیونددهنده
(linker).
میتوانید
از این
گزینه برای
ارائهٔ
گزینههای
پیونددهندهٔ
مختص سیستم
که 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 برای بازنویسی (override) یک فایل سرآیند سیستم و جایگزین کردن نسخهٔ خودتان استفاده کنید، چرا که این دایرکتوریها پیش از دایرکتوریهای استاندارد فایلهای سرآیند سیستم جستجو میشوند. با این حال، نباید از این گزینه برای افزودن دایرکتوریهای حاوی فایلهای سرآیند سیستمیِ ارائهشده توسط سازنده (vendor-supplied) استفاده کنید؛ برای این منظور از -isystem استفاده نمایید.
گزینههای -isystem و -idirafter همچنین دایرکتوری را بهعنوان یک دایرکتوری سیستمی علامتگذاری میکنند، تا از همان رفتار ویژهای که برای دایرکتوریهای استاندارد سیستم اعمال میشود برخوردار شود.
اگر یک دایرکتوری استاندارد include سیستم یا دایرکتوری مشخصشده با -isystem، با -I نیز مشخص شده باشد، گزینهٔ -I نادیده گرفته میشود. دایرکتوری همچنان جستجو میشود اما بهعنوان یک دایرکتوری سیستمی در جایگاه عادی خود در زنجیرهٔ include سیستم. این امر برای اطمینان از این است که سازوکار GCC برای اصلاح سرآیندهای سیستمی دارای اشکال و ترتیب دستورالعمل "#include_next" بهطور ناخواسته تغییر نکند. اگر واقعاً نیاز به تغییر ترتیب جستجوی دایرکتوریهای سیستمی دارید، از گزینههای -nostdinc و/یا -isystem استفاده کنید.
- -I-
- --include-barrier
- تقسیم مسیر
include. این گزینه
منسوخ شده
است (deprecated).
لطفاً
بهجای آن
برای
دایرکتوریهای
-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 که عملاً نام دایرکتوری را مشخص میکنند، بر کتابخانهها در پیونددهنده نیز اعمال میشوند، زیرا کامپایلر این گزینهها را به گزینههای -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)" این گزینههای مستقل از ماشین، قراردادهای رابط (interface conventions) مورد استفاده در تولید کد را کنترل میکنند.
بیشتر آنها هم شکل مثبت و هم شکل منفی دارند؛ شکل منفی -ffoo بهصورت -fno-foo است. در جدول زیر، تنها یکی از اشکال ذکر شده است---شکلی که پیشفرض نیست. شما میتوانید شکل دیگر را با حذف یا افزودن no- به دست آورید.
- -fstack-reuse=reuse-level
- این گزینه
استفاده
مجدد از
فضای پشته (stack)
را برای
متغیرهای
محلی/خودکار
(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 اثر یکدیگر را لغو میکنند؛ بنابراین استفاده از -ftrapv -fwrapv در خط فرمان منجر به موثر بودن -fwrapv میشود. توجه داشته باشید که تنها گزینههای فعال اثر یکدیگر را لغو میکنند؛ بنابراین استفاده از -ftrapv -fwrapv -fno-wrapv در خط فرمان منجر به موثر بودن -ftrapv خواهد شد.
- -fwrapv
- این گزینه به کامپایلر دستور میدهد فرض کند سرریز محاسباتی علامتدار در جمع، تفریق و ضرب با استفاده از نمایش مکمل دو (twos-complement) دور میزند (wrap around). این پرچم برخی بهینهسازیها را فعال و برخی دیگر را غیرفعال میسازد. گزینههای -ftrapv و -fwrapv اثر یکدیگر را لغو میکنند؛ بنابراین استفاده از -ftrapv -fwrapv در خط فرمان منجر به موثر بودن -fwrapv میشود. توجه داشته باشید که تنها گزینههای فعال اثر یکدیگر را لغو میکنند؛ بنابراین استفاده از -ftrapv -fwrapv -fno-wrapv در خط فرمان منجر به موثر بودن -ftrapv خواهد شد.
- -fwrapv-pointer
- این گزینه به کامپایلر دستور میدهد فرض کند سرریز محاسبات اشارهگر در جمع و تفریق با استفاده از نمایش مکمل دو دور میزند. این پرچم برخی از بهینهسازیهایی را که سرریز اشارهگر را نامعتبر فرض میکنند، غیرفعال میسازد.
- -fstrict-overflow
- این گزینه متضمن -fno-wrapv -fno-wrapv-pointer است و در صورت منفی شدن، بر -fwrapv -fwrapv-pointer دلالت دارد.
- -fexceptions
- مدیریت استثناها (exception handling) را فعال میکند. کد اضافی مورد نیاز برای انتشار استثناها را تولید میکند. برای برخی از مقاصد، این به این معنی است که GCC اطلاعات بازگشایی فریم (frame unwind) را برای تمام توابع تولید میکند که گرچه بر اجرای برنامه تأثیری ندارد، میتواند سربار حجم دادهٔ قابلتوجهی ایجاد کند. اگر این گزینه را مشخص نکنید، GCC آن را بهطور پیشفرض برای زبانهایی مانند C++ که معمولاً به مدیریت استثنا نیاز دارند فعال کرده و برای زبانهایی مانند C که بهطور معمول به آن نیازی ندارند غیرفعال میکند. با این حال، ممکن است هنگام کامپایل کد C که نیاز به تعامل صحیح با گردانندههای استثنای نوشتهشده در C++ دارد، نیاز به فعال کردن این گزینه داشته باشید. همچنین اگر برنامههای قدیمیتر C++ را که از مدیریت استثنا استفاده نمیکنند کامپایل میکنید، ممکن است بخواهید این گزینه را غیرفعال کنید.
- -fnon-call-exceptions
- کدی تولید میکند که به دستورالعملهای تلهگذار (trapping instructions) اجازه میدهد استثنا پرتاب کنند. توجه داشته باشید که این ویژگی به پشتیبانی زمان اجرای وابسته به بستر نیاز دارد که در همه جا موجود نیست. علاوه بر این، تنها به دستورالعملهای تلهگذار اجازه پرتاب استثنا میدهد، یعنی ارجاعات حافظه یا دستورالعملهای ممیز شناور (floating-point). این گزینه اجازه نمیدهد استثناها از گردانندههای سیگنال دلخواه مانند "SIGALRM" پرتاب شوند. این گزینه -fexceptions را فعال میکند.
- -fdelete-dead-exceptions
- در نظر میگیرد که دستورالعملهایی که ممکن است استثنا پرتاب کنند اما در غیر این صورت نقشی در اجرای برنامه ندارند، میتوانند در بهینهسازی حذف شوند. این گزینه بر فراخوانی توابع تأثیری ندارد، مگر توابعی که دارای ویژگیهای "pure" یا "const" هستند. این گزینه همانطور که مشخصات زبان اجازه میدهد، بهطور پیشفرض برای کامپایلرهای Ada و C++ فعال است. مراحلی از بهینهسازی که باعث حذف استثناهای مرده میشوند، بهطور مستقل در سطوح بهینهسازی مختلف فعال میگردند.
- -funwind-tables
- مشابه -fexceptions است، با این تفاوت که تنها دادههای ایستا (static data) مورد نیاز را تولید میکند، اما به هیچ شکل دیگری روی کد تولیدشده تأثیر نمیگذارد. شما معمولاً نیازی به فعال کردن این گزینه ندارید؛ در عوض، پردازشگر زبانی که به این سازوکار نیاز دارد، آن را از طرف شما فعال میکند.
- -fasynchronous-unwind-tables
- در صورت پشتیبانی ماشین مقصد، جدول بازگشایی (unwind table) را در قالب DWARF تولید میکند. این جدول در مرز هر دستورالعمل دقیق است، بنابراین میتواند برای بازگشایی پشته در رویدادهای ناهمگام (مانند دیباگر یا زبالهروب) استفاده شود.
- -fno-gnu-unique
- در سیستمهایی با اسمبلر GNU و کتابخانه C جدید، کامپایلر C++ از پیوند (binding) "STB_GNU_UNIQUE" استفاده میکند تا اطمینان حاصل کند تعاریف اعضای دادهای ایستای الگو و متغیرهای محلی ایستا در توابع برخط (inline functions) حتی در حضور "RTLD_LOCAL" یکتا هستند؛ این امر برای جلوگیری از بروز مشکل در مواردی ضروری است که کتابخانهای توسط دو افزونهٔ مختلف با "RTLD_LOCAL" استفاده شده و به تعریفی در یکی از آنها وابسته است و بنابراین با دیگری در مورد اتصال نماد اختلاف پیدا میکند. اما این موضوع باعث میشود "dlclose" برای اشیاء اشتراکی پویای (DSO) تحتتأثیر نادیده گرفته شود؛ اگر برنامه شما به راهاندازی مجدد یک DSO از طریق "dlclose" و "dlopen" متکی است، میتوانید از -fno-gnu-unique استفاده کنید.
- -fpcc-struct-return
- مقادیر
«کوتاه»
"struct" و
"union" را
مانند
مقادیر
طولانیتر،
بهجای
ثباتها (registers)
در حافظه
برمیگرداند.
این
قرارداد
کارایی
کمتری
دارد، اما
این مزیت را
دارد که
امکان
فراخوانی
متقابل
میان
فایلهای
کامپایلشده
با GCC و
فایلهای
کامپایلشده
با سایر
کامپایلرها،
بهویژه Portable C
Compiler (pcc) را فراهم
میکند.
قرارداد دقیق برای بازگرداندن ساختارها در حافظه به ماکروهای پیکربندی مقصد بستگی دارد.
ساختارها و اجتماعات کوتاه مواردی هستند که اندازه و تراز (alignment) آنها با یکی از انواع عدد صحیح مطابقت دارد.
هشدار: کدی که با گزینه -fpcc-struct-return کامپایل شده باشد با کدی که با گزینه -freg-struct-return کامپایل شده است سازگاری باینری ندارد. از آن برای انطباق با یک واسط باینری کاربردی (ABI) غیرپیشفرض استفاده کنید..IP -freg-struct-return 4 در صورت امکان، مقادیر "struct" و "union" را در ثباتها بازمیگرداند. این روش برای ساختارهای کوچک کارآمدتر از -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 (تعاریف
مشروط)
شناخته
میشوند،
را کنترل
میکند.
تعاریف
مشروط از
اعلان
متغیر با
کلیدواژهٔ
"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
- اطلاعات
توضیحی
بیشتری در
کد اسمبلی
تولیدشده
قرار
میدهد تا
خوانایی آن
افزایش
یابد. این
گزینه
معمولاً
فقط برای
کسانی مفید
است که
واقعاً
نیاز به
خواندن کد
اسمبلی
تولیدشده
دارند
(احتمالاً
هنگام
اشکالزدایی
خودِ
کامپایلر).
گزینهٔ پیشفرض، -fno-verbose-asm، باعث حذف اطلاعات اضافی میشود و هنگام مقایسهٔ دو فایل اسمبلی کاربرد دارد.
توضیحات اضافهشده شامل موارد زیر است:
- اطلاعات مربوط به نسخهٔ کامپایلر و گزینههای خط فرمان،
- خطوط کد منبع مرتبط با دستورالعملهای اسمبلی، به صورت FILENAME:LINENUMBER:CONTENT OF LINE،
- راهنماییهایی دربارهٔ اینکه کدام عبارات سطح بالا با عملوندهای مختلف دستورالعمل اسمبلی مطابقت دارند.
برای مثال، با در نظر گرفتن این فایل منبع C:
int test (int n)
{
int i;
int total = 0;
for (i = 0; i < n; i++)
total += i * i;
return total;
}
کامپایل به اسمبلی (x86_64) از طریق -S و ارسال مستقیم نتیجه به stdout از طریق -o -
gcc -S test.c -fverbose-asm -Os -o -
خروجی مشابه این تولید میکند:
.file "test.c"
# GNU C11 (GCC) version 7.0.0 20160809 (experimental) (x86_64-pc-linux-gnu)
[...snip...]
# options passed:
[...snip...]
.text
.globl test
.type test, @function
test:
.LFB0:
.cfi_startproc
# test.c:4: int total = 0;
xorl %eax, %eax # <retval>
# test.c:6: for (i = 0; i < n; i++)
xorl %edx, %edx # i
.L2:
# test.c:6: for (i = 0; i < n; i++)
cmpl %edi, %edx # n, i
jge .L5 #,
# test.c:7: total += i * i;
movl %edx, %ecx # i, tmp92
imull %edx, %ecx # i, tmp92
# test.c:6: for (i = 0; i < n; i++)
incl %edx # i
# test.c:7: total += i * i;
addl %ecx, %eax # tmp92, <retval>
jmp .L2 #
.L5:
# test.c:10: }
ret
.cfi_endproc
.LFE0:
.size test, .-test
.ident "GCC: (GNU) 7.0.0 20160809 (experimental)"
.section .note.GNU-stack,"",@progbits
این توضیحات بیشتر برای انسانها در نظر گرفته شدهاند تا ماشینها، و از این رو ساختار دقیق توضیحات ممکن است تغییر کند.
- -frecord-gcc-switches
- این سوییچ باعث میشود خط فرمان استفادهشده برای فراخوانی کامپایلر، در فایل شیء در حال ایجاد ثبت شود. این سوییچ تنها روی برخی مقاصد پیادهسازی شده است و قالب دقیق ثبت به مقصد و قالب فایل باینری بستگی دارد، اما معمولاً به شکل بخشی حاوی متن ASCII ظاهر میشود. این سوییچ با سوییچ -fverbose-asm مرتبط است، اما آن سوییچ اطلاعات را تنها به عنوان یادداشت در فایل خروجی اسمبلی ثبت میکند، بنابراین هرگز به فایل شیء راه نمییابد. همچنین برای روش دیگری از ذخیرهٔ گزینههای کامپایلر در فایل شیء، -grecord-gcc-switches را ببینید.
- -fpic
- در صورت
پشتیبانی
در ماشین
مقصد، کد
مستقل از
موقعیت (PIC)
مناسب برای
استفاده در
یک
کتابخانهٔ
مشترک را
تولید
میکند.
چنین کدی از
طریق یک
جدول آفست
سراسری (GOT) به
تمامی
نشانیهای
ثابت
دسترسی
پیدا
میکند.
بارگذار
پویا
ورودیهای
GOT را هنگام
شروع
برنامه رفع
میکند
(بارگذار
پویا بخشی
از GCC نیست؛
بلکه بخشی
از
سیستمعامل
است). اگر
اندازهٔ GOT
برای فایل
اجرایی
پیوندیافته
از بیشینه
اندازهٔ
مخصوص
ماشین
تجاوز کند،
پیامی از
پیونددهنده
مبنی بر کار
نکردن -fpic
دریافت
خواهید
کرد؛ در این
حالت، به
جای آن با -fPIC
دوباره
کامپایل
کنید. (این
مقادیر
حداکثر، در
SPARC برابر 8k، در
AArch64 برابر 28k و
در m68k و RS/6000
برابر 32k است.
معماری x86
چنین
محدودیتی
ندارد.)
کد مستقل از موقعیت به پشتیبانی ویژهای نیاز دارد و بنابراین تنها روی ماشینهای خاصی عمل میکند. برای x86، کامپایلر GCC از PIC برای System V پشتیبانی میکند اما برای Sun 386i پشتیبانی نمیکند. کد تولیدشده برای IBM RS/6000 همواره مستقل از موقعیت است.
هنگامی که این پرچم فعال باشد، ماکروهای "__pic__" و "__PIC__" با مقدار 1 تعریف میشوند..IP -fPIC 4 در صورت پشتیبانی در ماشین مقصد، کد مستقل از موقعیت (position-independent code) تولید میکند که برای پیوند پویا مناسب بوده و از هرگونه محدودیت روی اندازه جدول آفست سراسری (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 از آزمونهای بیت (bit tests) استفاده نکن، حتی در مواردی که نسبت به سایر راهبردهای تولید کد کارآمدتر باشد.
- -ffixed-reg
- با ثبات با
نام reg به
عنوان یک
ثبات ثابت (fixed)
رفتار کن؛
کد
تولیدشده
هرگز نباید
به آن ارجاع
دهد (مگر
احتمالاً
به عنوان
اشارهگر
پشته،
اشارهگر
فریم یا در
یک نقش ثابت
دیگر).
reg باید نام یک ثبات باشد. نامهای ثبات پذیرفتهشده وابسته به ماشین هستند و در ماکروی "REGISTER_NAMES" در فایل ماکروی توصیف ماشین تعریف شدهاند.
این پرچم شکل نقیض ندارد، زیرا یک انتخاب سهگانه را مشخص میکند.
- -fcall-used-reg
- با ثبات با
نام reg به
عنوان یک
ثبات قابل
تخصیص
رفتار کن که
توسط
فراخوانیهای
تابع
دستخوش
تغییر (clobber)
میشود. این
ثبات ممکن
است برای
متغیرهای
موقت یا
متغیرهایی
که در طول
یک
فراخوانی
بقا ندارند
تخصیص یابد.
توابعی که
به این شیوه
کامپایل
میشوند
ثبات reg را
ذخیره و
بازیابی
نمیکنند.
استفاده از این پرچم برای اشارهگر فریم یا اشارهگر پشته خطا است. استفاده از این پرچم برای سایر ثباتهایی که نقشهای ثابت و فراگیر در مدل اجرای ماشین دارند، نتایج فاجعهباری به همراه دارد.
این پرچم شکل نقیض ندارد، زیرا یک انتخاب سهگانه را مشخص میکند.
- -fcall-saved-reg
- با ثبات با
نام reg به
عنوان یک
ثبات قابل
تخصیص
رفتار کن که
توسط توابع
ذخیره و
نگهداری
میشود. این
ثبات حتی
میتواند
برای
متغیرهای
موقت یا
متغیرهایی
تخصیص یابد
که در طول
یک
فراخوانی
پابرجا
میمانند.
توابعی که
به این روش
کامپایل
میشوند،
در صورت
استفاده از
ثبات reg، آن
را ذخیره و
بازیابی
میکنند.
استفاده از این پرچم برای اشارهگر فریم یا اشارهگر پشته خطا است. استفاده از این پرچم برای سایر ثباتهایی که نقشهای ثابت و فراگیر در مدل اجرای ماشین دارند، نتایج فاجعهباری به بار میآورد.
نوع متفاوتی از فاجعه از استفاده از این پرچم برای ثباتی ناشی میشود که ممکن است مقادیر بازگشتی تابع در آن قرار گیرند.
این پرچم شکل نقیض ندارد، زیرا یک انتخاب سهگانه را مشخص میکند.
- -fpack-struct[=n]
- بدون تعیین
یک مقدار،
تمام اعضای
ساختار (struct) را
بدون هیچ
شکافی در
کنار هم
بستهبندی
کن. هنگامی
که مقداری
مشخص شود
(که باید
توان کوچکی
از دو
باشد)،
اعضای
ساختار را
مطابق این
مقدار
بستهبندی
کن که
نمایانگر
بیشینه
تراز (alignment) است
(یعنی
اشیایی با
الزامات
تراز
پیشفرض
بزرگتر از
این مقدار،
به صورت
بالقوه
بدون تراز
در موقعیت
مناسب بعدی
خروجی داده
میشوند).
هشدار: گزینه -fpack-struct باعث میشود GCC کدی تولید کند که با کد تولیدشده بدون این گزینه سازگاری باینری (binary compatible) ندارد. علاوه بر این، کد را غیربهینه میکند. از آن برای انطباق با یک واسط دودویی کاربردی (ABI) غیرپیشفرض استفاده کنید.
- -fleading-underscore
- این گزینه و
همتای آن،
-fno-leading-underscore، نحوه
نمایش
نمادهای C
را در فایل
شیء (object file)
بهاجبار
تغییر
میدهند.
یکی از
کاربردهای
آن، کمک به
پیوند با
کدهای
اسمبلی
قدیمی است.
هشدار: گزینه -fleading-underscore باعث میشود GCC کدی تولید کند که با کد تولیدشده بدون این گزینه سازگاری باینری ندارد. از آن برای انطباق با یک واسط دودویی کاربردی غیرپیشفرض استفاده کنید. همه مقصدها پشتیبانی کاملی از این گزینه ارائه نمیدهند.
- -ftls-model=model
- مدل حافظه
محلی نخ (thread-local storage)
مورد
استفاده را
تغییر
میدهد.
آرگومان model
باید یکی از
مقادیر
global-dynamic، local-dynamic،
initial-exec یا local-exec
باشد. توجه
داشته
باشید که
این انتخاب
مشمول
بهینهسازی
است:
کامپایلر
ممکن است
برای
نمادهایی
که بیرون از
واحد ترجمه
(translation unit) مرئی
نیستند، یا
در صورتی که
-fpic در خط
فرمان داده
نشده باشد،
از مدل
کارآمدتری
استفاده
کند.
پیشفرض بدون -fpic برابر initial-exec است؛ با -fpic پیشفرض برابر global-dynamic خواهد بود.
- -ftrampolines
- برای
مقصدهایی
که معمولاً
برای توابع
تو در تو به
ترامپولینها
(trampolines) نیاز
دارند،
همیشه به
جای
استفاده از
توصیفکنندهها
(descriptors) آنها را
تولید کن.
در غیر این
صورت، برای
مقصدهایی
که به آنها
نیازی
ندارند،
مانند HP-PA یا
IA-64، هیچ کاری
انجام نده.
ترامپولین تکه کد کوچکی است که در زمان اجرا روی پشته ایجاد میشود، هنگامی که نشانی یک تابع تو در تو گرفته شده باشد، و برای فراخوانی غیرمستقیم تابع تو در تو به کار میرود. بنابراین، برای عملکرد صحیح برنامه نیازمند آن است که پشته قابل اجرا (executable) باشد.
گزینه -fno-trampolines به طور پیشفرض بر اساس هر زبان فعال است تا به کامپایلر اجازه دهد در صورتی که عدم ایجاد آنها را امن تشخیص دهد، از تولید آنها خودداری کرده و آنها را با توصیفکنندهها جایگزین کند. توصیفکنندهها تنها از داده تشکیل شدهاند، اما کد تولیدشده باید برای تعامل با آنها آماده باشد. در زمان نگارش این متن، -fno-trampolines به طور پیشفرض تنها برای Ada فعال است.
علاوه بر این، در صورت وجود توابع تو در تو، کدی که با -ftrampolines کامپایل شده باشد با کدی که با -fno-trampolines کامپایل شده است سازگاری باینری ندارد. بنابراین این گزینه باید در سطح کل برنامه به کار گرفته شده و با نهایت دقت مدیریت شود.
برای زبانهایی غیر از Ada، گزینههای "-ftrampolines" و "-fno-trampolines" در حال حاضر اثری ندارند و روی پلتفرمهایی که برای توابع تو در تو به ترامپولین نیاز دارند، ترامپولینها همیشه تولید میشوند.
- -ftrampoline-impl=[stack|heap]
- بهطور پیشفرض، ترامپولینها روی پشته ایجاد میشوند. با این حال، برخی پلتفرمها (مانند Apple M1) اجازه پشته قابل اجرا را نمیدهند. کامپایل با -ftrampoline-impl=heap فراخوانیهایی به "__gcc_nested_func_ptr_created" و "__gcc_nested_func_ptr_deleted" تولید میکند تا فضا برای ترامپولین را روی هیپ قابل اجرا تخصیص داده و آزاد کند. این توابع در libgcc پیادهسازی شدهاند و تنها روی مقصدهای خاصی ارائه میشوند: Darwin نگارش x86_64، لینوکس نگارشهای x86_64 و aarch64. لطفاً توجه داشته باشید: هیچ تضمینی وجود ندارد که ترامپولینهای هیپ بهدرستی آزاد شوند اگر شما "setjmp" انجام دهید، توابع تو در تو را نمونهسازی کنید و سپس با "longjmp" به وضعیتی پیش از تخصیص آن توابع تو در تو بازگردید.
- -fvisibility=[default|internal|hidden|protected]
- قابلیت
مشاهده (visibility)
پیشفرض
نمادهای
تصویر ELF را
روی گزینه
مشخصشده
تنظیم
میکند---تمام
نمادها با
این ویژگی
نشانهگذاری
میشوند
مگر اینکه
درون کد لغو
شوند.
استفاده از
این ویژگی
میتواند
زمان پیوند
و بارگذاری
کتابخانههای
شیء مشترک (shared
object) را بهطور
چشمگیری
بهبود
بخشد، کد
بهینهتری
تولید کند،
امکان
برونریزی
نزدیک به
بینقص API را
فراهم سازد
و از تداخل
نمادها
جلوگیری
کند.
اکیداً
توصیه
میشود که
از این
گزینه در
تمامی
اشیاء
مشترکی که
توزیع
میکنید
استفاده
کنید.
علیرغم نامگذاری، default همواره به معنای عمومی (public) است؛ یعنی قابلیت پیوند داده شدن از خارج از شیء مشترک را داراست. گزینههای protected و internal در کاربردهای دنیای واقعی عملاً بیاستفاده هستند، بنابراین تنها گزینه پرکاربرد دیگر hidden است. در صورتی که -fvisibility مشخص نشده باشد، پیشفرض default است، یعنی تمام نمادها عمومی میشوند.
توضیح مناسبی از مزایای ناشی از اطمینان از برخورداری نمادهای ELF از قابلیت مشاهده صحیح، در مقاله «How To Write Shared Libraries» نوشته اولریش درپر (Ulrich Drepper) (قابل دسترسی در https://www.akkadia.org/drepper) ارائه شده است---با این حال، راهکار برتری که به کمک این گزینه میسر شده، به جای پنهان نشانهگذاری کردن نمادها هنگامی که پیشفرض عمومی است، این است که پیشفرض را مخفی (hidden) قرار داده و موارد مورد نظر را عمومی (public) علامتگذاری کنید. این شیوه معمول کار با DLLها در ویندوز است و با -fvisibility=hidden و "__attribute__ ((visibility("default")))" به جای "__declspec(dllexport)"، معنایی تقریباً یکسان با ساختاری مشابه به دست میآورید. این امر یک موهبت بزرگ برای افرادی است که روی پروژههای چندسکویی کار میکنند.
برای کسانی که پشتیبانی از قابلیت مشاهده را به کدهای موجود اضافه میکنند، دستور "#pragma GCC visibility" میتواند مفید باشد. نحوه کار آن به این صورت است که اعلانهایی را که میخواهید قابلیت مشاهده برای آنها تنظیم شود، در میان (برای مثال) "#pragma GCC visibility push(hidden)" و "#pragma GCC visibility pop" محصور میکنید. به خاطر داشته باشید که قابلیت مشاهده نماد باید به عنوان بخشی از قرارداد واسط API دیده شود و از این رو تمام کدهای جدید باید همیشه در صورتی که قابلیت مشاهده غیرپیشفرض است آن را مشخص کنند؛ یعنی اعلانهایی که تنها برای استفاده در DSO محلی هستند باید همیشه به صراحت پنهان (hidden) نشانهگذاری شوند تا از سربار ارجاع غیرمستقیم PLT جلوگیری شود---کاملاً شفاف ساختن این امر به خوانایی و مستندسازی خودکار کد نیز کمک میکند. توجه داشته باشید که با توجه به الزامات استاندارد ISO C++، عملگرهای "operator new" و "operator delete" همواره باید دارای قابلیت مشاهده default باشند.
آگاه باشید که سرایندهای (headers) خارج از پروژه شما، به ویژه سرایندهای سیستمی و سرایندهای مربوط به هر کتابخانه دیگری که استفاده میکنید، ممکن است انتظار نداشته باشند که با قابلیت مشاهدهای غیر از پیشفرض کامپایل شوند. ممکن است لازم باشد پیش از گنجاندن هر یک از این سرایندها، به صراحت عبارت "#pragma GCC visibility push(default)" را قید کنید.
اعلانهای "extern" تحت تأثیر -fvisibility قرار نمیگیرند، بنابراین بخش زیادی از کد را میتوان بدون هیچ تغییری مجدداً با -fvisibility=hidden کامپایل کرد. با این حال، این بدان معناست که فراخوانی توابع "extern" بدون قابلیت مشاهده صریح از PLT استفاده میکند، بنابراین مؤثرتر است که از "__attribute ((visibility))" و/یا "#pragma GCC visibility" استفاده کنید تا به کامپایلر اعلام کنید کدام اعلانهای "extern" باید به عنوان مخفی در نظر گرفته شوند.
توجه داشته باشید که -fvisibility بر موجودیتهای پیوند مبهم (vague linkage) در C++ تأثیر میگذارد. این بدان معناست که به عنوان مثال، یک کلاس استثنا که قرار است بین DSOها پرتاب شود باید به صراحت با قابلیت مشاهده default نشانهگذاری شود تا گرههای type_info میان DSOها یکپارچه شوند.
نمای کلی از این تکنیکها، مزایای آنها و نحوه استفاده از آنها در نشانی https://gcc.gnu.org/wiki/Visibility قرار دارد..IP -fstrict-volatile-bitfields 4 این گزینه باید زمانی استفاده شود که دسترسیها به میدانهای بیتی فرار (volatile bit-fields) (یا سایر فیلدهای ساختار، هرچند که کامپایلر معمولاً در هر حال به این نوعها احترام میگذارد) باید از یک دسترسی واحد با پهنای نوع آن فیلد، و در صورت امکان تراز شده با یک تراز طبیعی استفاده کنند. برای مثال، هدفهایی با ثباتهای جانبی نگاشتشده در حافظه (memory-mapped peripheral registers) ممکن است نیاز داشته باشند که تمام چنین دسترسیهایی ۱۶ بیتی باشند؛ با این پرچم میتوانید تمام میدانهای بیتی جانبی را بهصورت "unsigned short" تعریف کنید (با فرض این که short در این هدفها ۱۶ بیتی است) تا GCC را وادار کنید بهجای یک دسترسی احتمالاً کارآمدتر ۳۲ بیتی، از دسترسیهای ۱۶ بیتی استفاده کند.
اگر این گزینه غیرفعال باشد، کامپایلر از کارآمدترین دستورالعمل استفاده میکند. در مثال قبلی، این ممکن است یک دستورالعمل بارگذاری (load) ۳۲ بیتی باشد، حتی اگر به بایتهایی دسترسی پیدا کند که شامل هیچ بخشی از میدان بیتی نیستند، یا به ثباتهای نگاشتشده در حافظهای که ارتباطی با ثبات در حال بهروزرسانی ندارند دسترسی یابد.
در برخی موارد، مانند زمانی که مشخصه "packed" بر روی فیلد یک ساختار اعمال شده است، ممکن است دسترسی به فیلد با یک خواندن یا نوشتن منفرد که برای ماشین هدف بهدرستی تراز شده باشد امکانپذیر نباشد. در این حالت GCC بهجای تولید کدی که در زمان اجرا دچار خطا (fault) شده یا نتیجه را ناقص (truncate) میکند، به تولید دسترسیهای متعدد بازمیگردد.
نکته: با توجه به محدودیتهای مدل حافظه C/C++11، دسترسیهای نوشتن مجاز به دستکاری اعضای غیر میدان بیتی نیستند. بنابراین توصیه میشود تمام بیتهای نوع فیلد را بهعنوان اعضای میدان بیتی تعریف کنید.
مقدار پیشفرض این گزینه توسط رابط دودویی کاربردی (ABI) برای پردازنده هدف تعیین میشود.
- -fsync-libcalls
- این گزینه
کنترل
میکند که
آیا
نمونههای
برونخط (out-of-line)
خانواده
توابع
"__sync"
مجاز به
استفاده
برای
پیادهسازی
خانواده
توابع
"__atomic" در C++11
هستند یا
خیر.
مقدار پیشفرض این گزینه فعال است، بنابراین تنها فرم مفید این گزینه -fno-sync-libcalls است. این گزینه در پیادهسازی کتابخانه زمان اجرای libatomic استفاده میشود.
- -fzero-init-padding-bits=value
- صفر کردن
تضمینی
بیتهای
فاصلهساز
(padding bits) در
مقداردهندههای
متغیرهای
خودکار.
برخی
زبانها
مقداردهی
اولیه صفر
بیتهای
فاصلهساز
را در موارد
خاصی تضمین
میکنند؛
برای مثال C23
هنگام
استفاده از
مقداردهندههای
خالی
("{}")، یا C++
هنگام
استفاده از
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" (در صورت وجود) و فاصلهگذاری انتهایی در ساختار (در صورت وجود).
گزینههای توسعهدهنده GCC (GCC Developer Options)
این بخش گزینههای خط فرمانی را شرح میدهد که در درجه اول مورد توجه توسعهدهندگان GCC هستند، از جمله گزینههایی برای پشتیبانی از آزمایش کامپایلر و بررسی اشکالات کامپایلر و مشکلات کارایی در زمان کامپایل. این موارد شامل گزینههایی است که خروجیهای اشکالزدایی (debug dumps) را در نقاط مختلف کامپایل تولید میکنند؛ آمارهایی مانند مصرف حافظه و زمان اجرا را چاپ میکنند؛ و اطلاعاتی در مورد پیکربندی GCC، مانند محل جستجوی کتابخانهها، نمایش میدهند. بهندرت پیش میآید که برای کارهای عادی کامپایل و پیوند به استفاده از هر یک از این گزینهها نیاز داشته باشید.
بسیاری از گزینههای توسعهدهنده که باعث میشوند GCC خروجی را در یک فایل ذخیره کند، یک پسوند اختیاری =filename میپذیرند. میتوانید stdout یا - را برای ارسال به خروجی استاندارد، و stderr را برای خطای استاندارد مشخص کنید.
اگر =filename حذف شود، یک نام پیشفرض برای فایل خروجی با الحاق نام پایه فایل خروجی، شماره گذر (pass number)، حرف فاز و نام گذر ساخته میشود. نام پایه فایل خروجی، نام فایل خروجی تولید شده توسط کامپایلر است (در صورتی که بهطور صریح مشخص شده باشد و یک فایل اجرایی نباشد)؛ در غیر این صورت نام فایل منبع خواهد بود. شماره گذر بر اساس ترتیبی که گذرها در مدیر گذر (pass manager) کامپایلر ثبت میشوند تعیین میگردد. این ترتیب عموماً همان ترتیب اجرا است، اما گذرهای ثبتشده توسط افزونهها، گذرهای وابسته به هدف، یا گذرهایی که به هر شکل دیگری دیر ثبت شدهاند، شمارهای بالاتر از گذر با نام final دریافت میکنند، حتی اگر زودتر اجرا شوند. حرف فاز یکی از موارد i (تحلیل میانروال)، l (مختص زبان)، r (RTL)، یا t (درخت) است. فایلها در دایرکتوری فایل خروجی ایجاد میشوند.
- -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. این گذر تنها روی معماریهایی اجرا میشود که دستورالعملهای auto inc یا auto 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) را فعال میکنند..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
- تخلیه پس از تخصیص مکرر ثباتها (iterated register allocation).
- -fdump-rtl-jump
- تخلیه پس از دومین بهینهسازی پرش.
- -fdump-rtl-loop2
- -fdump-rtl-loop2 تخلیه را پس از گذرهای بهینهسازی حلقه RTL فعال میکند.
- -fdump-rtl-mach
- تخلیه پس از اجرای گذر بازسازماندهی وابسته به ماشین، در صورت وجود آن گذر.
- -fdump-rtl-mode_sw
- تخلیه پس از حذف تعویض حالتهای زائد.
- -fdump-rtl-rnreg
- تخلیه پس از شمارهگذاری مجدد ثباتها.
- -fdump-rtl-outof_cfglayout
- تخلیه پس از تبدیل از حالت cfglayout.
- -fdump-rtl-peephole2
- تخلیه پس از گذر روزنهای (peephole).
- -fdump-rtl-postreload
- تخلیه پس از بهینهسازیهای پس از بارگذاری مجدد (post-reload).
- -fdump-rtl-pro_and_epilogue
- تخلیه پس از تولید مقدمه و مؤخره توابع.
- -fdump-rtl-sched1
- -fdump-rtl-sched2
- -fdump-rtl-sched1 و -fdump-rtl-sched2 تخلیه را پس از گذرهای زمانبندی بلوک پایه فعال میکنند.
- -fdump-rtl-ree
- تخلیه پس از حذف بسط با علامت/صفر (sign/zero extension).
- -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
- تخلیه پس از تبدیل ثباتهای «flat register file» مربوط به GCC به ثباتهای شبهپشتهای x87. این گذر فقط روی گونههای x86 اجرا میشود.
- -fdump-rtl-subreg1
- -fdump-rtl-subreg2
- -fdump-rtl-subreg1 و -fdump-rtl-subreg2 تخلیه را پس از دو گذر گسترش subreg فعال میکنند.
- -fdump-rtl-vartrack
- تخلیه پس از ردگیری متغیرها.
- -fdump-rtl-vregs
- تخلیه پس از تبدیل ثباتهای مجازی به ثباتهای سختافزاری.
- -fdump-rtl-web
- تخلیه پس از تفکیک بازه حیات (live range splitting).
- -fdump-rtl-regclass
- -fdump-rtl-subregs_of_mode_init
- -fdump-rtl-subregs_of_mode_finish
- -fdump-rtl-dfinit
- -fdump-rtl-dfinish
- این رونوشتها تعریف شدهاند اما همیشه فایلهای خالی تولید میکنند.
- -da
- --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) به یک فایل. نام فایل با الحاق یک پسوند خاص سوئیچ به انتهای نام فایل مبدأ تولید میشود، و فایل در همان پوشه فایل خروجی ایجاد میگردد. رونوشتهای زیر امکانپذیر هستند:
- all
- تمام رونوشتهای تحلیل بینروالی را فعال میکند.
- cgraph
- تخلیه اطلاعات درباره بهینهسازی گراف فراخوانی (call-graph)، حذف توابع بدون استفاده، و تصمیمات مربوط به درونخطیسازی (inlining).
- inline
- تخلیه پس از درونخطیسازی توابع.
- strubm
- تخلیه پس از انتخاب حالتهای "strub" و ثبت این انتخابها به عنوان ویژگیهای تابع.
- strub
- تخلیه تبدیلات "strub": تغییرات واسط، بستهبندی توابع (function wrapping)، و درج فراخوانیهای توکار (builtin) برای پاکسازی پشته (stack scrubbing) و نشانهگذاری (watermarking).
علاوه بر این، گزینههای -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.
- عددی که تابعی که در گراف فراخوانی کلون میشود را بهطور یکتا مشخص میکند. توجه داشته باشید که این عدد تنها در یک واحد ترجمه (compilation unit) یا در تحلیل کل برنامه (whole-program analysis) یکتا است، اما احتمالاً در این دو فاز متفاوت خواهد بود.
- 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" از آن استفاده میشود. کاربرد اصلی آن، سهولت کار هنگام بازگشت از نامهای دستکاریشده (mangled) در فایل اسمبلی است.
- slim
- هنگام
تخلیهٔ
نمایشهای
میانی بخش
فرانتاند
(front-end)، صرفاً
به خاطر
دسترسی به
یک حوزه (scope)،
از تخلیهٔ
اعضای آن
حوزه یا
بدنهٔ تابع
جلوگیری
میکند. این
موارد را
تنها زمانی
تخلیه
میکند که
مستقیماً
از مسیر
دیگری قابل
دستیابی
باشند.
هنگام تخلیهٔ درختهای قالببندیشده (pretty-printed trees)، این گزینه مانع از تخلیهٔ بدنهٔ ساختارهای کنترلی میشود.
هنگام تخلیهٔ RTL، چاپ RTL را به جای نمایش پیشفرض شبهلیسپ، به شکل فشرده (slim) انجام میدهد.
- raw
- چاپ یک نمایش خام از درخت. بهطور پیشفرض، درختها با فرمت مناسب به یک نمایش شبهC درمیآیند (pretty-printed).
- details
- فعالسازی تخلیههای پرجزئیاتتر (توسط همهٔ گزینههای تخلیه پشتیبانی نمیشود). همچنین اطلاعات حاصل از گذرهای بهینهسازی را شامل میشود.
- stats
- فعالسازی تخلیهٔ آمارهای گوناگون دربارهٔ گذر (توسط همهٔ گزینههای تخلیه پشتیبانی نمیشود).
- blocks
- فعالسازی نمایش مرزهای بلوک پایه (basic block) (در تخلیههای خام غیرفعال است).
- graph
- برای هر یک
از دیگر
فایلهای
تخلیهٔ
مشخصشده
(-fdump-rtl-pass)،
نمایشی از
گراف جریان
کنترل را که
برای
مشاهده با GraphViz
مناسب است
در file.passid.pass.dot
تخلیه
میکند. هر
تابع درون
فایل به
صورت یک
زیرگراف
خوشقالب
چاپ
میشود،
بهطوری که
GraphViz میتواند
تمام آنها
را در یک
نمودار
واحد رسم
کند.
خروجی RTL همواره به صورت فشرده (slim) تخلیه میشود.
- vops
- فعالسازی نمایش عملوندهای مجازی برای هر دستور.
- lineno
- فعالسازی نمایش شماره خط برای دستورها.
- uid
- فعالسازی نمایش شناسهٔ یکتا ("DECL_UID") برای هر متغیر.
- verbose
- فعالسازی نمایش تخلیهٔ درخت برای هر دستور.
- eh
- فعالسازی نمایش شماره ناحیهٔ EH دربرگیرندهٔ هر دستور.
- scev
- فعالسازی نمایش جزئیات تحلیل تکامل اسکالر (scev).
- optimized
- فعالسازی نمایش اطلاعات بهینهسازی (تنها در گذرهای خاصی موجود است).
- missed
- فعالسازی نمایش اطلاعات بهینهسازیهای انجامنشده (تنها در گذرهای خاصی موجود است).
- note
- فعالسازی سایر اطلاعات تفصیلی بهینهسازی (تنها در گذرهای خاصی موجود است).
- folding
- فعالسازی تخلیهٔ اطلاعات دربارهٔ الگوهای تطبیق و سادهسازی (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 برای گذرهای tree (و حرف 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
- بهطور پیشفرض، تنها پیامهای «سطح بالا» صادر میشوند. این گزینه پیامهای اضافی با جزئیات بیشتر را فعال میکند که احتمالاً تنها برای توسعهدهندگان 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 بازنویسی میشود. اگر یک خروجی تجمیعشده از چندین واحد ترجمه مورد نیاز است، باید به جای آن از 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
اطلاعات مربوط به بهینهسازیهای از دست رفته و نیز مکانهای بهینهسازیشده از تمام گذرهای inlining را در 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 است، بهصورت مجموعهای از پیامها به همراه پروندهٔ مبدأ، شمارهٔ خط و شمارهٔ ستون، به همراه دادههای تکمیلی زیر برای هر پیام:
- شمارش دفعات اجرای کدی که بهینهسازی میشود، به همراه فرادادههایی دربارهٔ این که آیا حاصل دادههای واقعی تحلیل عملکرد (profile) است یا تنها یک تخمین؛ که به مصرفکنندگان امکان اولویتبندی پیامها بر اساس میزان تکرار اجرای کد (hotness) را میدهد،
- نام تابعِ کدی که بهینهسازی میشود، در صورت کاربرد،
- «زنجیرهٔ درونخطیسازی» (inlining chain) برای کدی که بهینهسازی میشود، تا زمانی که یک تابع در چندین جای مختلف درونخطی شود (که خود آنها نیز ممکن است درونخطی شده باشند)، خواننده بتواند میان رونوشتها تمایز قائل شود،
- شیءهایی که بخشهایی از پیام را که به عبارتها، گزارهها یا گرههای جدول نماد اشاره دارند شناسایی میکنند، دستهٔ هر یک از آنها را مشخص میکنند، و در صورت دسترسی، مکان آنها در کد مبدأ را ارائه میدهند،
- گذر (pass) مربوط به GCC که پیام را صادر کرده است، و
- موقعیتی در کد خود GCC که پیام از آنجا صادر شده است
افزون بر این، برخی از پیامها بهصورت منطقی درون پیامهای دیگر تو در تو شدهاند که بازتابدهندهٔ جزئیات پیادهسازی گذرهای بهینهسازی است.
- -fsched-verbose=n
- روی
مقصدهایی
که از
زمانبندی
دستورالعملها
(instruction scheduling)
استفاده
میکنند،
این گزینه
میزان
خروجی
اشکالزداییای
را که
زمانبند
در
پروندههای
تخلیه (dump) چاپ
میکند،
مهار
میکند.
برای مقادیر n بزرگتر از صفر، -fsched-verbose همان اطلاعات -fdump-rtl-sched1 و -fdump-rtl-sched2 را خروجی میدهد. برای مقادیر n بزرگتر از یک، همچنین احتمالهای بلوک پایه، اطلاعات دقیق فهرست آماده و اطلاعات unit/insn را در خروجی میآورد. برای مقادیر 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 گرهٔ گراف فراخوانی تابع (call graph node) درون یکی از محدودههای مشخصشده قرار گیرد، pass برای آن تابع غیرفعال میشود. شناسهٔ uid در سرآیند تابع در یک پروندهٔ dump نمایش داده میشود، و نامهای گذرها را میتوان با استفاده از گزینهٔ -fdump-passes تخلیه کرد.
- -fdisable-tree-pass
- -fdisable-tree-pass=range-list
- غیرفعالسازی گذر درختی به نام 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 مراجعه کنید.
چند مثال از نحوهٔ استفاده از این گزینهها در زیر آورده شده است.
# غیرفعالسازی ccp1 برای تمام توابع -fdisable-tree-ccp1 # غیرفعالسازی باز کردن کامل برای تابعی که uid گره cgraph آن برابر ۱ است -fenable-tree-cunroll=1 # غیرفعالسازی gcse2 برای توابع در محدودههای [1,1]، # [300,400] و [400,1000] # غیرفعالسازی gcse2 برای توابع foo و foo2 -fdisable-rtl-gcse2=foo,foo2 # غیرفعالسازی درونخطیسازی اولیه -fdisable-tree-einline # غیرفعالسازی درونخطیسازی ipa -fdisable-ipa-inline # فعالسازی باز کردن کامل درختی -fenable-tree-unroll
- -fchecking
- -fchecking=n
- فعالسازی بررسی سازگاری درونی (internal consistency checking). مقدار پیشفرض به پیکربندی کامپایلر بستگی دارد. -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
time) مصرفشده
توسط هر
زیرپردازه
در توالی
کامپایل.
برای
فایلهای
منبع C، این
شامل خود
کامپایلر و
اسمبلر است
(بهعلاوه
پیونددهنده
در صورت
انجام
پیوند).
بدون مشخص کردن یک فایل خروجی، خروجی به این صورت خواهد بود:
# cc1 0.12 0.01 # as 0.00 0.01
اولین عدد در هر خط «زمان کاربر» (user time) است، یعنی زمانی که صرف اجرای خود برنامه شده است. عدد دوم «زمان سیستم» (system time) است، زمانی که صرف اجرای روتینهای سیستمعامل از طرف برنامه شده است. هر دو عدد به ثانیه هستند.
با مشخص کردن یک فایل خروجی، خروجی به انتهای فایل نامبرده اضافه میشود و به این صورت خواهد بود:
0.12 0.01 cc1 <options> 0.00 0.01 as <options>
«زمان کاربر» و «زمان سیستم» به پیش از نام برنامه منتقل میشوند، و گزینههای فرستادهشده به برنامه نمایش داده میشوند تا بتوان بعداً تشخیص داد چه فایلی و با چه گزینههایی در حال کامپایل بوده است.
- -fdump-final-insns[=file]
- تخلیه بازنمود درونی نهایی (RTL) در file. اگر آرگومان اختیاری حذف شود (یا اگر file برابر با "." باشد)، نام فایل تخلیه با افزودن ".gkd" به نام پایهٔ تخلیه تعیین میشود، -dumpbase را ببینید.
- -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
درخواست
شده به
کامپایلر
ارسال
میشود.
فایلهای
تخلیه و
فایلهای
موقت
نگهداریشده
در طول
کامپایل
دوم به
گونهای
تغییر نام
مییابند
که پسوند
اضافی
".gk" را
داشته
باشند تا از
بازنویسی
موارد
تولیدشده
توسط
کامپایل
اول
جلوگیری
شود.
هنگامی که این گزینه به گردانندهٔ کامپایلر ارسال شود، باعث رد شدن از کامپایل اول میشود، که این کار جز برای اشکالزدایی خود کامپایلر کاربرد چندانی ندارد.
- -gtoggle
- تولید اطلاعات اشکالزدایی را خاموش میکند، در صورتی که عدم استفاده از این گزینه باعث تولید آن میشد؛ در غیر این صورت آن را در سطح ۲ روشن میکند. جایگاه این آرگومان در خط فرمان اهمیتی ندارد؛ این گزینه پس از پردازش تمام گزینههای دیگر اعمال میشود، و صرفنظر از اینکه چند بار مشخص شده باشد، تنها یک بار اعمال میگردد. این گزینه عمدتاً برای استفاده همراه با -fcompare-debug در نظر گرفته شده است.
- -fvar-tracking-assignments-toggle
- وضعیت -fvar-tracking-assignments را معکوس میکند، به همان شیوهای که -gtoggle وضعیت -g را معکوس میکند.
- -Q
- هنگامی که
در خط فرمان
پیش از --help=
استفاده
شود، -Q به
عنوان
تغییردهندهٔ
خروجی
راهنما عمل
میکند.
در غیر این صورت، این گزینه باعث میشود که کامپایلر نام هر تابع را هنگام کامپایل شدن چاپ کند، و آمارههایی را دربارهٔ هر گذر (pass) پس از اتمام آن چاپ نماید.
- -ftime-report
- باعث
میشود
کامپایلر
پس از اتمام
هر گذر،
آمارههایی
را دربارهٔ
زمان
مصرفشده
توسط آن در stderr
چاپ کند.
اگر خروجی SARIF برای پیامهای تشخیصی از طریق -fdiagnostics-format=sarif-file یا -fdiagnostics-format=sarif-stderr درخواست شده باشد، اطلاعات -ftime-report در عوض به شکل JSON و به عنوان بخشی از خروجی SARIF تولید میشود. قالب دقیق این دادههای JSON ممکن است تغییر کند، و مقادیر به دلیل ثبت شدن در مکانی کمی متفاوت درون کامپایلر، ممکن است دقیقاً با مقادیر صادرشده در stderr مطابقت نداشته باشند.
- -ftime-report-details
- ثبت زمان مصرفشده توسط بخشهای زیرساختی بهطور جداگانه برای هر گذر.
- -fira-verbose=n
- کنترل میزان جزئیات فایل تخلیه برای تخصیصدهنده یکپارچهٔ ثبات (IRA). مقدار پیشفرض ۵ است. اگر مقدار n بزرگتر یا مساوی ۱۰ باشد، خروجی تخلیه با همان قالبِ n منهای ۱۰ به stderr ارسال میشود.
- -flto-report
- گزارشی
حاوی
جزئیات
درونی
دربارهٔ
سازوکار
بهینهساز
زمان پیوند
(LTO) چاپ
میکند.
محتویات
این گزارش
از نسخهای
به نسخه
دیگر
متفاوت است.
این گزینه
برای
استفاده
توسعهدهندگان
GCC هنگام
پردازش
فایلهای
شیء در حالت
LTO (از طریق -flto)
در نظر
گرفته شده
است.
بهطور پیشفرض غیرفعال است.
- -flto-report-wpa
- مانند -flto-report، اما گزارش را تنها برای فاز WPA بهینهسازی زمان پیوند چاپ میکند.
- -fmem-report
- باعث میشود کامپایلر پس از اتمام کار، آمارههایی دربارهٔ تخصیص حافظهٔ دائمی چاپ کند.
- -fmem-report-wpa
- باعث میشود کامپایلر تنها برای فاز WPA، آمارههایی دربارهٔ تخصیص حافظهٔ دائمی چاپ کند.
- -fpre-ipa-mem-report
- -fpost-ipa-mem-report
- باعث میشود کامپایلر آمارههایی را دربارهٔ تخصیص حافظهٔ دائمی پیش یا پس از بهینهسازی بینروالی (IPA) چاپ کند.
- -fmultiflags
- این گزینه
امکان
استفاده از
"TFLAGS"
آگاه از multilib
را برای
ساخت
کتابخانههای
مقصد با
گزینههایی
متفاوت از
آنهایی که
کامپایلر
بهطور
پیشفرض
برای
استفاده
پیکربندی
شده است، از
طریق
مشخصات (specs)
تعیینشده
توسط
ساختار
درونی
کامپایلر،
مقصد، یا
سازندگان
در زمان
پیکربندی،
فراهم
میکند.
مانند "TFLAGS"، این به کتابخانههای مقصد اجازه میدهد برای محیطهای پایهٔ سازگار و قابلحمل ساخته شوند، در حالی که کامپایلر بهطور پیشفرض محیطهای پیشرفتهتر را هدف میگیرد. این ویژگی از آنجا سودمند است که اگر پیشفرضها برای محیط مقصد ایدهآل نباشند، کاربران میتوانند بهسادگی پیشفرضهای پیکربندیشده کامپایلر را برای ساخت برنامههای خود لغو کنند، در حالی که بازسازی کتابخانههای زمان اجرا معمولاً چندان آسان یا مطلوب نیست.
برخلاف "TFLAGS"، استفاده از specs امکان انتخاب پرچمهای مختلف را برای multilibهای گوناگون فراهم میکند. روش پیادهسازی آن، ساخت به کمک دستور make TFLAGS=-fmultiflags، پس از پیکربندی با گزینهٔ --with-specs=%{fmultiflags:...} است.
این گزینه پس از اتمام پردازش self spec گرداننده، توسط گرداننده (driver) کنار گذاشته میشود.
همچنین میتوان با پیکربندی یک کامپایلر non-bootstrap بهصورت --with-specs='%{!fmultiflags:%emissing TFLAGS}' و ساخت کامپایلر و کتابخانههای مقصد، از این گزینه برای بررسی استفاده شدن "TFLAGS" در ساخت تمامی کتابخانههای مقصد بهره برد..IP -fprofile-report 4 باعث میشود کامپایلر آمارهایی دربارهٔ سازگاری پروفایل (تخمینزدهشده) و اثر گذرهای مجزا چاپ کند.
- -fstack-usage
- باعث میشود کامپایلر اطلاعات مصرف پشته (stack) را برای برنامه، بهازای هر تابع در خروجی بنویسد. نام فایل خروجی با افزودن .su به auxname ساخته میشود. اگر نام فایل خروجی صراحتاً مشخص شده باشد و یک فایل اجرایی نباشد، auxname از نام آن تولید میشود، در غیر این صورت نام پایه (basename) فایل مبدأ خواهد بود. هر مدخل از سه فیلد تشکیل شده است:
- نام تابع.
- تعداد بایتها.
- یک یا چند توصیفکننده: "static"، "dynamic"، "bounded".
توصیفکنندهٔ "static" به این معنی است که تابع پشته را بهصورت ایستا مدیریت میکند: تعداد ثابتی بایت برای فریم هنگام ورود به تابع تخصیص یافته و هنگام خروج از تابع آزاد میشود؛ هیچ تنظیم دیگری روی پشته در درون تابع صورت نمیگیرد. فیلد دوم همین تعداد بایت ثابت است.
توصیفکنندهٔ "dynamic" به این معنی است که تابع پشته را بهصورت پویا مدیریت میکند: علاوهبر تخصیص ایستای شرحدادهشده در بالا، تنظیماتی روی پشته در بدنهٔ تابع انجام میشود، برای مثال برای push/pop کردن آرگومانها هنگام فراخوانی توابع. اگر توصیفکنندهٔ "bounded" نیز وجود داشته باشد، میزان این تنظیمات در زمان کامپایل محدود (کراندار) است و فیلد دوم کران بالای کل میزان پشتهٔ استفادهشده توسط تابع است. اگر وجود نداشته باشد، میزان این تنظیمات در زمان کامپایل نامحدود است و فیلد دوم صرفاً بخش کراندار را نشان میدهد.
- -fstats
- در پایان کامپایل، آماری دربارهٔ پردازش فرانتاند (front-end) منتشر میکند. این گزینه فقط توسط فرانتاند C++ پشتیبانی میشود و اطلاعات آن عموماً فقط برای تیم توسعهٔ G++ مفید است.
- -fdbg-cnt-list
- نام و کران بالای شمارنده را برای همهٔ شمارندههای اشکالزدایی چاپ میکند.
- -fdbg-cnt=counter-value-list
- کران پایین و کران بالای شمارندهٔ اشکالزدایی داخلی را تعیین میکند. counter-value-list فهرستی جداشده با کاما از چندتاییهای name:lower_bound1-upper_bound1 [:lower_bound2-upper_bound2...] است که نام شمارنده و فهرستی از بازههای بسته را تعیین میکند. مقدار lower_bound اختیاری است و در صورت تعییننشدن، با صفر مقداردهی اولیه میشود. برای مثال با -fdbg-cnt=dce:2-4:10-11,tail_call:10، دستور dbg_cnt(dce) فقط برای فراخوانیهای دوم، سوم، چهارم، دهم و یازدهم مقدار درست (true) برمیگرداند. برای dbg_cnt(tail_call) مقدار درست برای ۱۰ فراخوانی نخست بازگردانده میشود.
- -print-autofdo-gcov-version
- --print-autofdo-gcov-version
- نسخهٔ فعلی GCOV مورد استفاده توسط زیرساخت AutoFDO را چاپ میکند.
- -print-file-name=library
- --print-file-name=library
- --print-file-name library
- نام کامل و مطلق فایل کتابخانهٔ library را که هنگام پیوند زدن استفاده میشود چاپ میکند - و کار دیگری انجام نمیدهد. با این گزینه، 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)، دو عدد جداشده با نقطه (نسخهٔ اصلی و فرعی) یا سه عدد جداشده با نقطه (نسخهٔ اصلی، فرعی و patchlevel) باشد..IP -dumpfullversion 4 چاپ نگارش کامل کامپایلر---و انجام ندادن هیچ کار دیگری. خروجی همواره شامل سه عدد است که با نقطه از یکدیگر جدا شدهاند: نگارش اصلی (major)، فرعی (minor) و وصله (patchlevel).
- -dumpspecs
- چاپ مشخصات (specs) توکار کامپایلر---و انجام ندادن هیچ کار دیگری. (این گزینه هنگام ساخته شدن خودِ GCC استفاده میشود.)
- --param name=value
- --param=name=value
- بهطور
سنتی GCC به
جای مقادیر
ثابت
سختکدشده،
از
پارامترهایی
استفاده
میکند که
میتوان
آنها را در
خط فرمان
برای نشان
دادن
محدودیتهای
دلخواه
کامپایلر
یا روشهای
اکتشافی (heuristics)
مشخص کرد.
بسیاری از
پارامترها
به
بهینهسازی
مربوط
میشوند؛
برای
نمونه، GCC
توابعی را
که بیش از
تعداد
معینی
دستورالعمل
داشته
باشند
درونخطی (inline)
نمیکند.
تحلیلگر
ایستا نیز
به همین
صورت از
پارامترها
برای محدود
کردن
پیچیدگی
بهره
میبرد،
بهینهسازی
زمان پیوند
(LTO) از
پارامترها
برای کنترل
افراز (partitioning)
استفاده
میکند، و
مواردی از
این دست.
پارامترهای
دیگر
جنبههایی
از GCC را که
کاملاً
داخلی
هستند
کنترل
میکنند،
مانند
راهبرد
تخصیص
حافظه و
جمعآوری
زباله (garbage collection).
برخی دیگر
نیز
رفتارهای
وابسته به
معماری
مقصد را
کنترل
مینمایند.
گزینهٔ --param یک رابط یکپارچه برای مشخص کردن مقادیر این پارامترهای کامپایلر فراهم میکند. با این حال، نام پارامترهای خاص و مفهوم مقادیر به سازوکارهای درونی کامپایلر وابسته هستند و ممکن است در نگارشهای آینده بدون اطلاع قبلی تغییر کنند. شما نباید برای کامپایل صحیح برنامهٔ خود به تنظیمات پارامترها وابسته باشید. این پارامترها از طریق خط فرمان صرفاً برای راحتی توسعهدهندگان در اشکالزدایی مشکلات کامپایل، یا در برخی موارد، برای ارائهٔ راهحلهای موقت (workarounds) در برابر باگهای کامپایلر دردسترس قرار گرفتهاند.
گزینههای وابسته به معماری مقصد (Target-Specific Options)
هر ماشین مقصدی که توسط GCC پشتیبانی میشود میتواند گزینههای مختص به خود را داشته باشد---برای نمونه، برای اینکه به شما اجازه دهد برای گونهٔ خاصی از پردازنده یا یک ABI معین کامپایل کنید، یا بهینهسازیهای مختص آن ماشین را کنترل نمایید. بهطور مشابه، GCC همچنین دارای گزینههایی است که مختص سیستمعاملها یا محیطهای زمان اجرای خاص در مقصد هستند.
بهطور قراردادی، نام گزینههای وابسته به ماشین با -m آغاز میشود. برخی از پیکربندیهای کامپایلر از گزینههای وابسته به مقصد اضافی نیز پشتیبانی میکنند که معمولاً برای سازگاری با سایر کامپایلرها در همان بستر (platform) در نظر گرفته شدهاند.
گزینههای 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
- جلوگیری از تولید یا مجاز دانستن دسترسیهای حافظهای که ممکن است بر روی مرز طبیعی شیء (همانطور که در مشخصات معماری توصیف شده) همتراز نباشند.
- -momit-leaf-frame-pointer
- -mno-omit-leaf-frame-pointer
- حذف کردن یا نگهداشتن اشارهگر فریم (frame pointer) در توابع برگ (leaf functions). رفتار اول، حالت پیشفرض است.
- -mstack-protector-guard=guard
- -mstack-protector-guard-reg=reg
- -mstack-protector-guard-offset=offset
- تولید کد
محافظت از
پشته با
استفاده از
قناری (canary) در
guard.
مکانهای
پشتیبانیشده
عبارتند از
global برای یک
قناری
سراسری یا
sysreg برای یک
قناری در یک
ثبات
سیستمی
مناسب.
با انتخاب گزینهٔ دوم، گزینههای -mstack-protector-guard-reg=reg و -mstack-protector-guard-offset=offset علاوه بر این مشخص میکنند که کدام ثبات سیستمی بهعنوان ثبات پایه برای خواندن قناری استفاده شود و از چه آفستی نسبت به آن ثبات پایه. هیچ ثبات یا آفست پیشفرضی وجود ندارد زیرا این امکان کاملاً برای استفاده در هستهٔ Linux در نظر گرفته شده است.
- -mtls-dialect=desc
- استفاده از توصیفگرهای TLS (TLS descriptors) بهعنوان سازوکار حافظهٔ محلی ریسه (thread-local storage) برای دسترسیهای پویای متغیرهای TLS. این حالت پیشفرض است.
- -mtls-dialect=traditional
- استفاده از TLS سنتی بهعنوان سازوکار حافظهٔ محلی ریسه برای دسترسیهای پویای متغیرهای TLS.
- -mtls-size=size
- مشخص کردن اندازهٔ بیت برای آفستهای بیواسطهٔ 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
- فعال یا غیرفعال کردن تولید کدهای اضافی جهت ردگیری اجرای حدسی (speculative execution) از طریق شاخههای شرطی. سپس کامپایلر میتواند در زمان بسط فراخوانیهای "__builtin_speculation_safe_value" از این وضعیت ردگیری استفاده کند تا امکان ایجاد توالی کد کارآمدتری فراهم شود.
- -moutline-atomics
- -mno-outline-atomics
- فعال یا
غیرفعال
کردن
فراخوانی
به توابع
کمکی
درونخطنشده
(out-of-line helpers) برای
پیادهسازی
عملیاتهای
اتمیک (atomic).
این توابع
کمکی در
زمان اجرا
تعیین
میکنند که
آیا امکان
استفاده از
دستورالعملهای
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 برای بردارسازی خودکار (auto-vectorization) استفاده شود فراهم گردد. بر خلاف -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 GNU/Linux در دسترس بوده و باعث میشود کامپایلر معماری سامانه میزبان را برگزیند. این گزینه در صورتی که کامپایلر نتواند معماری سامانه میزبان را تشخیص دهد، هیچ اثری نخواهد داشت. هنگامی که -march=native مشخص شود و هیچ گزینه -mcpu یا -mtune دیگری داده نشده باشد، GCC پردازنده میزبان را به عنوان پردازنده مبنای بهینهسازی و نیز استخراج ویژگیهای معماری انتخاب میکند؛ به بیان دیگر، با -march=native همانند -mcpu=native رفتار میشود.
مقادیر مجاز برای feature در زیربخش مربوط به aarch64-feature-modifiers,,-march and -mcpu Feature Modifiers فهرست شدهاند. در صورت تعیین تغییردهندههای متناقض، راستترین ویژگی اعمال میشود.
کامپایلر GCC از name برای تعیین نوع دستورالعملهایی که میتواند در زمان تولید کد اسمبلی صادر کند، استفاده میکند. چنانچه -march بدون مشخصکردن هیچیک از گزینههای -mtune یا -mcpu تعیین شود، کد تولیدی بهگونهای بهینهسازی میگردد که روی طیف وسیعی از پردازندههای هدفی که معماری مربوطه را پیادهسازی کردهاند کارایی خوبی داشته باشد.
- -mtune=name
- نام
پردازنده
هدفی را
مشخص
میکند که GCC
باید
کارایی کد
را برای آن
تنظیم (tune) کند.
مقادیر
مجاز برای
این گزینه
عبارتند از:
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 GNU/Linux مقدار native کارایی را برای سامانه میزبان بهینهسازی میکند. در صورتی که کامپایلر نتواند پردازنده سامانه میزبان را شناسایی کند، این گزینه تأثیری نخواهد داشت.
چنانچه هیچیک از گزینههای -mtune=، -mcpu= یا -march= تعیین نشده باشند، کد بهگونهای بهینهسازی میشود که در طیف وسیعی از پردازندههای هدف کارایی مناسبی ارائه دهد.
نمیتوان به این گزینه پسوند تغییردهندههای ویژگی (feature modifiers) افزود..IP -mcpu=name 4 نام پردازندهٔ هدف را مشخص میکند که میتواند به صورت اختیاری با یک یا چند اصلاحکنندهٔ قابلیت (feature modifier) پسوندگذاری شود. این گزینه به شکل -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
- تصمیمات
تنظیم (tuning)
اتخاذشده
توسط بخش
پشتی (back-end) را
در پاسخ به
سوییچ -mtune=
لغو و
بازنویسی
میکند.
ساختار
دستوری،
مفاهیم و
مقادیر
پذیرفتهشده
برای string در
این گزینه
تضمین
نمیشود که
در میان
نگارشهای
مختلف
یکپارچه
بماند.
این گزینه تنها برای استفاده در هنگام توسعهٔ GCC در نظر گرفته شده است.
- -mpc-relative-literal-loads
- -mno-pc-relative-literal-loads
- بارگذاریهای مقادیر لفظی نسبی به PC (شمارندهٔ برنامه) را فعال یا غیرفعال میکند. با این گزینه، استخرهای مقادیر لفظی (literal pools) با استفاده از یک دستورالعمل منفرد در دسترس قرار گرفته و پس از هر تابع صادر میشوند. این امر حداکثر اندازهٔ توابع را به 1MB محدود میکند. این گزینه بهطور پیشفرض برای -mcmodel=tiny فعال است.
- -msign-return-address=scope
- دامنهٔ توابعی را که امضای آدرس بازگشت روی آنها اعمال میشود انتخاب میکند. مقادیر مجاز عبارتند از none که امضای آدرس بازگشت را غیرفعال میکند، non-leaf که امضای اشارهگر را برای توابعی که توابع برگ (leaf) نیستند فعال میسازد، و all که امضای اشارهگر را برای تمام توابع فعال میکند. مقدار پیشفرض none است. این گزینه به نفع -mbranch-protection منسوخ شده است.
- -mbranch-protection=features
- قابلیتهای
محافظت از
انشعاب
مورد
استفاده را
انتخاب
میکند. features
میتواند
یکی از
شکلهای
زیر را
داشته باشد:
مقدار none پیشفرض است و تمام انواع محافظت از انشعاب را غیرفعال میکند.
مقدار standard تمام انواع قابلیتهای محافظت از انشعاب را فعال میکند. اگر قابلیتی گزینههای تنظیم بیشتری داشته باشد، standard آن را روی سطح استاندارد خود قرار میدهد.
مقدار pac-ret امضای آدرس بازگشت را در سطح استاندارد خود فعال میکند: امضای توابعی که آدرس بازگشت را در حافظه ذخیره میکنند (توابع غیربرگ عملاً همیشه این کار را انجام میدهند) با استفاده از A-key.
مقدار pac-ret+leaf امضای pac-ret را گسترش میدهد تا توابع برگ را نیز شامل شود.
مقادیر 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
- رونوشتی از گام ادغام جفت بارگذاری/ذخیرهسازی در 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) خروجی مستقل از طول بردار تولید میکند. تمام مقادیر دیگر کدهای وابسته به طول بردار تولید میکنند. رفتار این مقادیر ممکن است در نگارشهای آینده تغییر کند و به هیچ مقداری جز scalable نباید برای تولید کدی که بین طولهای مختلف بردار SVE سختافزاری قابلحمل (portable) باشد، اتکا کرد.
پیشفرض -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
- دستورالعملهای Scalable Vector Extension را فعال میکند. این گزینه همچنین دستورالعملهای Advanced SIMD و ممیز شناور را فعال میسازد.
- lse
- دستورالعملهای Large System Extension را فعال میکند. این گزینه بهطور پیشفرض برای -march=armv8.1-a فعال است..IP rdma 4 فعالسازی دستورالعملهای Round Double Multiply Accumulate. این گزینه بهطور پیشفرض برای -march=armv8.1-a فعال است.
- fp16
- فعالسازی افزونهٔ FP16. این گزینه همچنین دستورالعملهای ممیز شناور را فعال میکند.
- fp16fml
- فعالسازی افزونهٔ FP16 fmla. این گزینه همچنین افزونههای FP16 و دستورالعملهای ممیز شناور را فعال میکند. این گزینه بهطور پیشفرض برای -march=armv8.4-a فعال است. استفاده از این گزینه با معماریهای پیش از Armv8.2-A پشتیبانی نمیشود.
- rcpc
- فعالسازی افزونهٔ RCpc. این گزینه استفاده از دستورالعملهای LDAPR را برای معناشناسی اتمیک بارگذاری-اکتساب (load-acquire atomic semantics) فعال کرده و آن را به اسمبلر منتقل میکند، که امکان استفاده از دستورالعملهای افزونهٔ RCpc را در عبارتهای inline asm فراهم میسازد.
- 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
- فعالسازی دستورالعملهای bitperm در SVE2. این گزینه همچنین دستورالعملهای SVE2 را فعال میکند.
- sve2-sm4
- فعالسازی دستورالعملهای sm4 در SVE2. این گزینه همچنین دستورالعملهای SVE2 را فعال میکند.
- sve2-aes
- فعالسازی دستورالعملهای aes در SVE2. این گزینه همچنین دستورالعملهای SVE2 را فعال میکند.
- sve2-sha3
- فعالسازی دستورالعملهای sha3 در SVE2. این گزینه همچنین دستورالعملهای SVE2 را فعال میکند.
- sve2p1
- فعالسازی دستورالعملهای SVE2.1. این گزینه همچنین دستورالعملهای SVE2 را فعال میکند.
- tme
- فعالسازی افزونهٔ حافظه تراکنشی (Transactional Memory Extension).
- i8mm
- فعالسازی دستورالعملهای ضرب ماتریسی عدد صحیح ۸ بیتی. این گزینه همچنین دستورالعملهای ممیز شناور و Advanced SIMD را فعال میکند. این گزینه بهطور پیشفرض برای -march=armv8.6-a فعال است. استفاده از این گزینه با معماریهای پیش از Armv8.2-A پشتیبانی نمیشود.
- f32mm
- فعالسازی دستورالعملهای ضرب ماتریسی ممیز شناور ۳۲ بیتی. این گزینه همچنین دستورالعملهای SVE را فعال میکند. استفاده از این گزینه با معماریهای پیش از Armv8.2-A پشتیبانی نمیشود.
- f64mm
- فعالسازی دستورالعملهای ضرب ماتریسی ممیز شناور ۶۴ بیتی. این گزینه همچنین دستورالعملهای SVE را فعال میکند. استفاده از این گزینه با معماریهای پیش از Armv8.2-A پشتیبانی نمیشود.
- bf16
- فعالسازی دستورالعملهای ممیز شناور با دقت نیمهٔ مغز (brain half-precision). این گزینه همچنین دستورالعملهای ممیز شناور و Advanced SIMD را فعال میکند. این گزینه بهطور پیشفرض برای -march=armv8.6-a فعال است. استفاده از این گزینه با معماریهای پیش از Armv8.2-A پشتیبانی نمیشود.
- ls64
- فعالسازی دستورالعملهای بارگذاری و ذخیرهٔ اتمیک ۶۴ بایتی برای شتابدهندهها.
- mops
- فعالسازی دستورالعملها برای شتاببخشی به عملیاتهای حافظه مانند "memcpy"، "memmove" و "memset". این گزینه بهطور پیشفرض برای -march=armv8.8-a فعال است.
- flagm
- فعالسازی افزونهٔ دستورالعملهای دستکاری پرچم (Flag Manipulation).
- flagm2
- فعالسازی دستورالعملهای تبدیل پرچم FlagM2.
- pauth
- فعالسازی افزونهٔ اعتبارسنجی اشارهگر (Pointer Authentication Extension).
- cssc
- فعالسازی دستورالعملهای Common Short Sequence Compression.
- cmpbr
- فعالسازی دستورالعملهای کوتاهتر مقایسه و انشعاب، شامل "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).
- 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 نسخه ۲ (SME 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 Extension.
- tlbid
- فعالسازی افزونه دامنههای TLBI (TLBI Domains Extension).
- gcie
- فعالسازی افزونه رابط پردازنده GICv5 (کنترلکننده وقفه عمومی).
- 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 دستورالعمل «ساده» تنظیم میکند. این هزینه تنها یک تخمین تجربی است و تضمینی برای ایجاد نتایج یکسان در نسخههای مختلف وجود ندارد.
- -mcmove
- -mno-cmove
- تولید انتقالهای شرطی (conditional moves) را فعال میکند.
- -mnops=num
- پیش از هر دستورالعمل تولیدشده دیگر، به تعداد num دستور NOP درج میکند.
- -mno-soft-cmpsf
- -msoft-cmpsf
- برای مقایسههای ممیز شناور با دقت یگانه، یک دستورالعمل "fsub" صادر کرده و پرچمها را بررسی میکند. این روش سریعتر از مقایسه نرمافزاری است، اما میتواند در حضور NaNها، یا زمانی که دو عدد کوچکِ متفاوت به گونهای مقایسه میشوند که تفاضل آنها صفر محاسبه میشود، نتایج نادرستی به دنبال داشته باشد. پیشفرض -msoft-cmpsf است که از مقایسههای نرمافزاری کُندتر، اما سازگار با IEEE استفاده میکند.
- -mstack-offset=num
- آفست بین بالای پشته و اشارهگر پشته را تنظیم میکند. برای مثال، مقدار ۸ به این معنی است که هشت بایت در محدوده "sp+0...sp+7" میتوانند توسط توابع برگ (leaf functions) بدون تخصیص پشته استفاده شوند. مقادیر غیر از 8 یا 16 آزمایشنشده هستند و بعید است کار کنند. همچنین توجه داشته باشید که این گزینه ABI را تغییر میدهد؛ کامپایل کردن برنامهای با آفست پشتهای متفاوت از آنچه کتابخانهها با آن کامپایل شدهاند عموماً کار نخواهد کرد. این گزینه اگر بخواهید بررسی کنید که آیا یک آفست پشته متفاوت کد بهتری تولید میکند یا خیر مفید است، اما برای استفاده عملی از آفست پشته متفاوت جهت ساخت برنامههای کاربردی، توصیه میشود زنجیره ابزار با گزینه مناسب --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
- حالت غالب
واحد ممیز
شناور (FPU) را
تنظیم
میکند. این
گزینه حالت
ممیز
شناوری را
مشخص
میکند که
در زمان
فراخوانی و
بازگشت
تابع ارائه
و مورد
انتظار است.
تطبیق این
حالت با
حالتی که
بیشتر در
ابتدای
تابع مورد
نیاز است،
میتواند
با اجتناب
از تعویض
حالتهای
غیرضروری،
برنامههای
شما را
کوچکتر و
سریعتر
کند.
مقدار 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
- حداکثر تراز (alignment) برای انواع حالت برداری SIMD. مقدار num میتواند ۴ یا ۸ باشد. پیشفرض ۸ است. توجه داشته باشید که این یک تغییر در ABI است، حتی اگر بسیاری از رابطهای توابع کتابخانهای در صورتی که از حالتهای برداری SIMD در مواردی که اندازه یا تراز انواع مربوطه را تحت تأثیر قرار میدهند استفاده نکنند، دستنخورده باقی بمانند.
- -msplit-vecmove-early
- -mno-split-vecmove-early
- انتقالهای برداری را پیش از reload به انتقالهای تککلمهای تقسیم میکند. از نظر تئوری این کار میتواند تخصیص ثبات بهتری ارائه دهد، اما تاکنون به نظر میرسد به طور کلی عکس آن رخ میدهد.
- -m1reg-reg
- یک ثبات را برای نگهداری مقدار ثابت -1 مشخص میکند، که بارگذاری مقادیر ثابت منفی کوچک و ماسکهای بیتی (bitmasks) خاص را سریعتر میسازد. مقادیر مجاز برای reg عبارتند از r43 و r63، که استفاده از آن ثبات را به عنوان یک ثبات ثابت (fixed register) مشخص میکنند، و 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
گزینههای زیر گونه معماری را که کد برای آن کامپایل میشود، کنترل میکنند:
- -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 همراه با افزونه ممیز شناور با دقت یگانه.
- em4_fpuda
- کامپایل برای پردازنده ARC EM4 DMIPS همراه با دستورالعملهای ممیز شناور با دقت یگانه و کمکی دقت دوگانه.
- hs
- کامپایل برای پردازنده ARC HS بدون هیچ افزونه سختافزاری به جز دستورالعملهای اتمیک.
- 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" و ضرب ۳۲ در ۱۶ بیتی.
- arc600_mul64
- کامپایل برای پردازنده ARC 600 با فعال بودن دستورالعملهای "norm" و خانواده "mul64".
- arc601_norm
- کامپایل برای پردازنده ARC 601 با فعال بودن دستورالعملهای "norm"..IP arc601_mul32x16 4 کامپایل برای پردازندهٔ ARC 601 با فعال بودن دستورهای "norm" و ضرب 32x16-bit.
- arc601_mul64
- کامپایل برای پردازندهٔ ARC 601 با فعال بودن دستورهای "norm" و خانوادهٔ "mul64".
- nps400
- کامپایل برای ARC 700 بر روی تراشهٔ NPS400.
- em_mini
- کامپایل برای پیکربندی کمینهگرای ARC EM با مجموعه ثباتهای کاهشیافته.
- -mdpfp
- -mdpfp-compact
- تولید دستورهای FPX با دقت مضاعف (double-precision)، بهینهشده برای پیادهسازی فشرده (compact).
- -mdpfp-fast
- تولید دستورهای FPX با دقت مضاعف، بهینهشده برای پیادهسازی سریع (fast).
- -mno-dpfp-lrsr
- -mdpfp-lrsr
- کنترل اینکه آیا دستورهای "lr" و "sr" از ثباتهای کمکی افزونهٔ FPX استفاده کنند یا خیر. این گزینه بهطور پیشفرض فعال است.
- -mea
- تولید دستورهای محاسباتی گسترشیافته. در حال حاضر تنها "divaw"، "adds"، "subs" و "sat16" پشتیبانی میشوند. فقط برای -mcpu=ARC700 معتبر است.
- -mmul32x16
- تولید دستورهای ضرب و ضرب-انباشت (multiply-accumulate) 32x16-bit.
- -mmul64
- تولید دستورهای "mul64" و "mulu64". فقط برای -mcpu=ARC600 معتبر است.
- -mnorm
- تولید دستورهای "norm". اگر -mcpu=ARC700 فعال باشد، این گزینه پیشفرض است.
- -mspfp
- -mspfp-compact
- تولید دستورهای FPX با دقت یگانه (single-precision)، بهینهشده برای پیادهسازی فشرده (compact).
- -mspfp-fast
- تولید دستورهای FPX با دقت یگانه، بهینهشده برای پیادهسازی سریع (fast).
- -msimd
- فعالسازی تولید دستورهای ARC SIMD از طریق توابع توکار مختص معماری مقصد. فقط برای -mcpu=ARC700 معتبر است.
- -msoft-float
- این گزینه نادیده گرفته میشود؛ صرفاً برای سازگاری ارائه شده است. کد ممیز شناور نرمافزاری بهطور پیشفرض تولید میشود و این پیشفرض میتواند با گزینههای FPX بازنویسی شود؛ -mspfp، -mspfp-compact یا -mspfp-fast برای دقت یگانه، و -mdpfp، -mdpfp-compact یا -mdpfp-fast برای دقت مضاعف.
- -mswap
- تولید دستورهای "swap".
- -matomic
- این گزینه استفاده از افزونهٔ بارگذاری قفلشده/ذخیرهسازی شرطی (locked load/store conditional) را جهت پیادهسازی توابع توکار اتمیک حافظه فعال میکند. برای هستههای ARC 6xx یا ARC EM در دسترس نیست.
- -mdiv-rem
- فعالسازی دستورهای "div" و "rem" برای هستههای ARCv2.
- -mcode-density
- -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
- پشتیبانی از ARC HS SIMD..IP 8 4
- plus_macd
- پشتیبانی از SIMD در ARC HS.
- 9
- plus_qmacw
- پشتیبانی از SIMD در ARC HS.
این گزینه تنها برای هستههای ARCv2 در دسترس است.
- -mfpu=fpu
- پشتیبانی از افزونههای سختافزاری ممیز شناور خاص را برای هستههای ARCv2 فعال میکند. مقادیر پشتیبانیشده برای fpu عبارتند از:
- fpus
- پشتیبانی از افزونههای سختافزاری ممیز شناور با دقت یگانه را فعال میکند.
- fpud
- پشتیبانی از افزونههای سختافزاری ممیز شناور با دقت مضاعف را فعال میکند. افزونهٔ ممیز شناور با دقت یگانه نیز فعال میشود. برای 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
- به اسمبلر منتقل میشود تا افزونهٔ شرطی بارگذاری/ذخیرهٔ قفلشده را فعال کند. همچنین نماد پیشپردازندهٔ "__Xlock" را تنظیم میکند.
- -mswape
- به اسمبلر منتقل میشود تا دستورالعمل افزونهٔ تعویض ترتیب بایت را فعال کند. همچنین نماد پیشپردازندهٔ "__Xswape" را تنظیم میکند.
- -mxy
- به اسمبلر منتقل میشود تا افزونهٔ حافظهٔ XY را فعال کند. همچنین نماد پیشپردازندهٔ "__Xxy" را تنظیم میکند.
گزینههای زیر نحوهٔ حاشیهنویسی کد اسمبلی را کنترل میکنند:
- -misize
- دستورالعملهای اسمبلر را با آدرسهای تخمینی حاشیهنویسی میکند.
گزینههای زیر به پیونددهنده منتقل میشوند:
- -marclinux
- -mno-arclinux
- به پیونددهنده منتقل میشود تا استفاده از شبیهسازی "arclinux" را مشخص کند. این گزینه بهطور پیشفرض در زنجیرههای ابزار ساختهشده برای اهداف "arc-linux-uclibc" و "arceb-linux-uclibc" هنگامی که پروفایلسازی درخواست نشده باشد، فعال است.
- -marclinux_prof
- -mno-arclinux_prof
- به پیونددهنده منتقل میشود تا استفاده از شبیهسازی "arclinux_prof" را مشخص کند. این گزینه بهطور پیشفرض در زنجیرههای ابزار ساختهشده برای اهداف "arc-linux-uclibc" و "arceb-linux-uclibc" هنگامی که پروفایلسازی درخواست شده باشد، فعال است.
گزینههای زیر معناشناسی کد تولیدشده را کنترل میکنند:
- -mlong-calls
- فراخوانیها را بهصورت فراخوانیهای غیرمستقیم از طریق ثبات تولید میکند، و بدین ترتیب دسترسی به کل محدودهٔ آدرسدهی 32 بیتی را فراهم میسازد.
- -mmedium-calls
- -mno-medium-calls
- برای فراخوانیها از محدودهٔ آدرسدهی کمتر از 25 بیت که آفستِ در دسترس برای یک دستورالعمل شاخهبندی و پیوند نامشروط است، استفاده نمیکند. اجرای شرطی فراخوانیهای توابع مهار میشود تا امکان استفاده از محدودهٔ 25 بیتی، بهجای محدودهٔ 21 بیتی همراه با شاخهبندی و پیوند شرطی، فراهم گردد. این گزینه رفتار پیشفرض برای زنجیرههای ابزار ساختهشده برای اهداف "arc-linux-uclibc" و "arceb-linux-uclibc" است..IP "-G num" 4 تعریفهای دادههای دارای دید بیرونی (externally-visible) را در صورتی که آن داده بزرگتر از num بایت نباشد، در یک بخش دادههای کوچک (small data section) قرار میدهد. مقدار پیشفرض num برای هر پیکربندی ARC برابر ۴، یا در هنگام وجود عملیات بارگذاری/ذخیرهسازی دوگانه برابر ۸ است.
- -mno-sdata
- ارجاعهای sdata تولید نمیکند. این حالت پیشفرض برای زنجیرهابزارهای ساختهشده برای هدفهای "arc-linux-uclibc" و "arceb-linux-uclibc" است.
- -mvolatile-cache
- -mno-volatile-cache
- نحوهٔ دسترسی به ارجاعهای فرار (volatile) را کنترل میکند. حالت پیشفرض -mvolatile-cache است که از دسترسیهای حافظهٔ معمول کششده برای ارجاعهای فرار استفاده میکند. برای فعال کردن دور زدن کش (cache bypass) برای ارجاعهای فرار، از -mno-volatile-cache استفاده کنید.
گزینههای زیر تولید کد را دقیقتر تنظیم میکنند:
- -mauto-modify-reg
- استفاده از پیش/پساصلاح (pre/post modify) همراه با جابهجایی ثبات را فعال میکند.
- -mno-brcc
- -mbrcc
- این گزینه گذر ویژهٔ هدف در arc_reorg را برای تولید دستورالعملهای مقایسه-و-انشعاب ("brcc") کنترل میکند، که به طور پیشفرض فعال است. این گزینه اثری بر تولید این دستورالعملها از طریق گذر ترکیبکننده (combiner pass) ندارد.
- -mcase-vector-pcrel
- از جدولهای switch case وابسته به PC برای فعالسازی کوتاهسازی جدول case استفاده میکند. این حالت برای -Os پیشفرض است.
- -mno-cond-exec
- گذر ویژهٔ
ARCompact را برای
تولید
دستورالعملهای
اجرای شرطی
غیرفعال
میکند.
به دلیل زمانبندی شکاف تأخیر (delay slot) و برهمکنش میان تعداد عملوندها، اندازههای مقادیر ثابت، طول دستورالعملها و پشتیبانی از اجرای شرطی، گذر مستقل از هدف برای تولید اجرای شرطی اغلب ناکافی است؛ از این رو پورت ARC یک گذر اختصاصی را حفظ کرده است که سعی میکند پس از انجام تخصیص ثبات، کوتاهسازی انشعاب، و زمانبندی شکاف تأخیر، فرصتهای بیشتری برای تولید اجرای شرطی بیابد. این گذر عموماً، اما نه همیشه، کارایی و اندازهٔ کد را به بهای زمان کامپایل بیشتر بهبود میبخشد، و به همین دلیل گزینهای برای غیرفعال کردن آن در نظر گرفته شده است. اگر به دلیل شرطی شدن دستورالعملهای فراخوانی با مشکل فراتر رفتن آنها از بازهٔ آفست مجاز مواجه شدید، باید در عوض استفاده از -mmedium-calls را مد نظر قرار دهید.
- -mearly-cbranchsi
- استفاده از الگوی "cbranchsi" پیش از بازبارگذاری (pre-reload) را فعال میکند.
- -mindexed-loads
- استفاده از بارگذاریهای نمایهدار (indexed loads) را فعال میکند. این امر میتواند مشکلساز باشد زیرا برخی بهینهسازها در پی آن فرض میکنند که ذخیرهسازیهای نمایهدار (indexed stores) نیز وجود دارند، در حالی که چنین نیست.
- -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
- علاوه بر این، ترازبندی حلقهها و کدهای پس از موانع (barriers) نادیده گرفته میشود.
- 3
- علاوه بر این، ترازبندی اختیاری دادهها نادیده گرفته شده و گزینهٔ Os فعال میشود.
هنگامی که -Os در حال اجرا باشد، این مقدار به صورت پیشفرض 3 است. در غیر این صورت، رفتار سیستم در صورت تعیین نشدن این گزینه معادل سطح 1 خواهد بود.
- -mtune=cpu
- پارامترهای
زمانبندی
دستورالعمل
را برای cpu
تنظیم
میکند و هر
مقداری را
که به صورت
ضمنی با -mcpu=
تعیین شده
باشد، لغو
مینماید.
مقدارهای پشتیبانیشده برای cpu عبارتند از:
- ARC600
- میزانسازی برای پردازندهٔ ARC600.
- ARC601
- میزانسازی برای پردازندهٔ ARC601.
- ARC700
- میزانسازی برای پردازندهٔ ARC700 با بلوک ضربکنندهٔ استاندارد.
- ARC700-xmac
- میزانسازی برای پردازندهٔ ARC700 با بلوک XMAC.
- ARC725D
- میزانسازی برای پردازندهٔ ARC725D.
- ARC750D
- میزانسازی برای پردازندهٔ ARC750D.
- core3
- میزانسازی برای پردازندهٔ نوع core3 معماری ARCv2. این گزینه استفاده از دستورالعمل "dbnz" را فعال میکند.
- release31a
- میزانسازی برای ARC4x انتشار 3.10a.
- -mmultcost=num
- هزینهای که برای یک دستورالعمل ضرب در نظر گرفته میشود، به طوری که 4 معادل یک دستورالعمل عادی است.
گزینههای ARM
این گزینههای -m برای پورت ARM تعریف شدهاند:
- -mabi=name
- تولید کد برای ABI مشخصشده. مقدارهای مجاز عبارتند از: apcs-gnu، atpcs، aapcs و aapcs-linux.
- -mapcs-frame
- برای تمام توابع یک قاب پشته (stack frame) سازگار با استاندارد فراخوانی رویهٔ ARM تولید میکند، حتی اگر این کار برای اجرای صحیح کد اکیداً ضروری نباشد. مشخص کردن -fomit-frame-pointer همراه با این گزینه باعث میشود قاب پشته برای توابع برگ (leaf functions) تولید نشود. مقدار پیشفرض -mno-apcs-frame است. این گزینه منسوخ شده است.
- -mapcs
- این گزینه مترادفی برای -mapcs-frame است و منسوخ شده است.
- -mthumb-interwork
- کدی تولید میکند که از فراخوانی میان مجموعهدستورالعملهای ARM و Thumb پشتیبانی کند. بدون این گزینه، در معماریهای پیش از v5، نمیتوان از این دو مجموعهدستورالعمل با اطمینان درون یک برنامه استفاده کرد. مقدار پیشفرض -mno-thumb-interwork است، چرا که با تعیین -mthumb-interwork کد تا حدی بزرگتر تولید میشود. در پیکربندیهای AAPCS این گزینه بیمعنی است.
- -msched-prolog
- -mno-sched-prolog
- اجازه دادن یا جلوگیری از بازآرایی دستورالعملها در پیشدرآمد تابع (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 از نظر پیوند سازگار نیستند؛ شما باید کل برنامهٔ خود را با همان ABI کامپایل کرده و با مجموعهای سازگار از کتابخانهها پیوند دهید.
- -mgeneral-regs-only
- تولید کدی که تنها از ثباتهای همهمنظوره استفاده میکند. این کار از استفادهٔ کامپایلر از ثباتهای ممیز شناور و Advanced SIMD جلوگیری میکند اما هیچ محدودیتی بر اسمبلر اعمال نخواهد کرد.
- -mlittle-endian
- تولید کد برای پردازندهای که در حالت little-endian کار میکند. این پیشفرض برای همهٔ پیکربندیهای استاندارد است.
- -mbig-endian
- تولید کد برای پردازندهای که در حالت big-endian کار میکند؛ پیشفرض کامپایل کردن کد برای یک پردازندهٔ little-endian است.
- -mbe8
- -mbe32
- هنگام پیوند دادن یک تصویر (image) big-endian، قالب بین BE8 و BE32 را انتخاب میکند. این گزینه روی تصاویر little-endian هیچ اثری ندارد و نادیده گرفته میشود. پیشفرض به معماری مقصدِ انتخابشده بستگی دارد. برای ARMv6 و معماریهای جدیدتر پیشفرض BE8 است، و برای معماریهای قدیمیتر پیشفرض BE32 است. قالب BE32 توسط ARM منسوخ شده است.
- -march=name[+extension...]
- این گزینه
نام معماری
مقصد ARM را
مشخص
میکند. GCC از
این نام
برای تعیین
اینکه
هنگام
تولید کد
اسمبلی چه
نوع
دستورالعملهایی
را
میتواند
صادر کند،
استفاده
میکند. این
گزینه
میتواند
در کنار یا
به جای
گزینهٔ -mcpu=
استفاده
شود.
نامهای مجاز عبارتند از: armv4t، armv5t، armv5te، armv6، armv6j، armv6k، armv6kz، armv6t2، armv6z، armv6zk، armv7، armv7-a، armv7ve، armv8-a، armv8.1-a، armv8.2-a، armv8.3-a، armv8.4-a، armv8.5-a، armv8.6-a، armv9-a، armv7-r، armv8-r، armv6-m، armv6s-m، armv7-m، armv7e-m، armv8-m.base، armv8-m.main، armv8.1-m.main، iwmmxt و iwmmxt2.
علاوه بر این، معماریهای زیر که فاقد پشتیبانی از حالت اجرای Thumb هستند، شناسایی میشوند ولی پشتیبانی از آنها منسوخ شده است: armv4.
بسیاری از معماریها از افزونهها پشتیبانی میکنند. اینها را میتوان با افزودن +extension به انتهای نام معماری اضافه کرد. گزینههای افزونه به ترتیب پردازش میشوند و قابلیتها انباشته میگردند. یک افزونه همچنین هرگونه افزونهٔ پایهای لازم را که به آن وابسته است فعال میکند. برای مثال، افزونهٔ +crypto همیشه افزونهٔ +simd را فعال خواهد کرد. استثنا در ساختار تجمعی، برای افزونههایی است که با +no... شروع میشوند: این افزونهها گزینهٔ مشخصشده و هر افزونهٔ دیگری را که ممکن است به حضور آن افزونه وابسته باشد غیرفعال میکنند.
برای مثال، -march=armv7-a+simd+nofp+vfpv4 معادل نوشتن -march=armv7-a+vfpv4 است، چرا که گزینهٔ +simd به طور کامل توسط گزینهٔ +nofp که پس از آن میآید غیرفعال میشود.
بیشتر نامهای افزونهها به طور عمومی نامگذاری شدهاند، اما اثری دارند که به معماری اعمالشده روی آن وابسته است. به عنوان مثال، گزینهٔ +simd میتواند روی هر دو معماری armv7-a و armv8-a اعمال شود، اما افزونههای اصلی 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
- دستورالعملهای Advanced SIMD (Neon) v1 و ممیز شناور VFPv3، همراه با عملیات تبدیل ممیز شناور با نیمدقت.
- +neon-vfpv4
- دستورالعملهای Advanced SIMD (Neon) v2 و ممیز شناور VFPv4.
- +nosimd
- غیرفعالسازی دستورالعملهای Advanced SIMD (ممیز شناور را غیرفعال نمیکند).
- +nofp
- غیرفعالسازی دستورالعملهای ممیز شناور و Advanced SIMD.
- armv7ve
- نسخه گسترشیافته معماری ARMv7-A همراه با پشتیبانی از مجازیسازی.
- +fp
- دستورالعملهای ممیز شناور VFPv4، همراه با ۱۶ ثبات با دقت مضاعف. افزونه +vfpv4-d16 میتواند بهعنوان یک نام مستعار برای این افزونه استفاده شود.
- +simd
- دستورالعملهای Advanced SIMD (Neon) v2 و ممیز شناور VFPv4. افزونه +neon-vfpv4 میتواند بهعنوان یک نام مستعار برای این افزونه استفاده شود.
- +vfpv3-d16
- دستورالعملهای ممیز شناور VFPv3، همراه با ۱۶ ثبات با دقت مضاعف.
- +vfpv3
- دستورالعملهای ممیز شناور VFPv3، همراه با ۳۲ ثبات با دقت مضاعف.
- +vfpv3-d16-fp16
- دستورالعملهای ممیز شناور VFPv3، همراه با ۱۶ ثبات با دقت مضاعف و عملیات تبدیل ممیز شناور با نیمدقت.
- +vfpv3-fp16
- دستورالعملهای ممیز شناور VFPv3، همراه با ۳۲ ثبات با دقت مضاعف و عملیات تبدیل ممیز شناور با نیمدقت.
- +vfpv4-d16
- دستورالعملهای ممیز شناور VFPv4، همراه با ۱۶ ثبات با دقت مضاعف.
- +vfpv4
- دستورالعملهای ممیز شناور VFPv4، همراه با ۳۲ ثبات با دقت مضاعف.
- +neon
- دستورالعملهای Advanced SIMD (Neon) v1 و ممیز شناور VFPv3. افزونه +neon-vfpv3 میتواند بهعنوان یک نام مستعار برای این افزونه استفاده شود.
- +neon-fp16
- دستورالعملهای Advanced SIMD (Neon) v1 و ممیز شناور VFPv3، همراه با عملیات تبدیل ممیز شناور با نیمدقت.
- +nosimd
- غیرفعالسازی دستورالعملهای Advanced SIMD (ممیز شناور را غیرفعال نمیکند).
- +nofp
- غیرفعالسازی دستورالعملهای ممیز شناور و Advanced SIMD.
- +crc
- دستورالعملهای بررسی افزونگی چرخهای (CRC).
- +simd
- دستورالعملهای Advanced SIMD و ممیز شناور ARMv8-A.
- +crypto
- دستورالعملهای رمزنگاری.
- +nocrypto
- غیرفعالسازی دستورالعملهای رمزنگاری.
- +nofp
- غیرفعالسازی دستورالعملهای ممیز شناور، Advanced SIMD و رمزنگاری.
- +sb
- دستورالعمل سد گمانهزنی (Speculation Barrier).
- +predres
- دستورالعملهای محدودیت پیشبینی داده و اجرا.
- +simd
- دستورالعملهای Advanced SIMD و ممیز شناور ARMv8.1-A.
- +crypto
- دستورالعملهای رمزنگاری. این گزینه همچنین دستورالعملهای Advanced SIMD و ممیز شناور را فعال میکند.
- +nocrypto
- غیرفعالسازی دستورالعملهای رمزنگاری.
- +nofp
- غیرفعالسازی دستورالعملهای ممیز شناور، Advanced SIMD و رمزنگاری.
- +sb
- دستورالعمل سد گمانهزنی (Speculation Barrier).
- +predres
- دستورالعملهای محدودیت پیشبینی داده و اجرا.
- +fp16
- دستورالعملهای پردازش داده ممیز شناور با نیمدقت. این گزینه همچنین دستورالعملهای Advanced SIMD و ممیز شناور را فعال میکند.
- +fp16fml
- افزونه fmla ممیز شناور با نیمدقت. این گزینه همچنین افزونه ممیز شناور با نیمدقت و دستورالعملهای Advanced SIMD و ممیز شناور را فعال میکند.
- +simd
- دستورالعملهای Advanced SIMD و ممیز شناور ARMv8.1-A.
- +crypto
- دستورالعملهای رمزنگاری. این گزینه همچنین دستورالعملهای Advanced SIMD و ممیز شناور را فعال میکند.
- +dotprod
- فعالسازی افزونه ضرب داخلی (Dot Product). این گزینه همچنین دستورالعملهای Advanced SIMD را فعال میکند.
- +nocrypto
- غیرفعالسازی افزونه رمزنگاری.
- +nofp
- غیرفعالسازی دستورالعملهای ممیز شناور، Advanced SIMD و رمزنگاری.
- +sb
- دستورالعمل سد گمانهزنی (Speculation Barrier).
- +predres
- دستورالعملهای محدودیت پیشبینی داده و اجرا.
- +i8mm
- دستورالعملهای ضرب ماتریسی اعداد صحیح ۸ بیتی. این گزینه همچنین دستورالعملهای Advanced SIMD و ممیز شناور را فعال میکند..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) روی کمکپردازندههای انتخابشده بر اساس شمارههای ارائهشده در گزینهها در محدودهٔ ۰ تا ۷.
- +pacbti
- فعالسازی افزونهٔ Pointer Authentication and Branch Target Identification.
- +dsp
- دستورالعملهای DSP.
- +nodsp
- غیرفعالسازی افزونهٔ DSP.
- +fp
- دستورالعملهای ممیز شناور با دقت یگانه.
- +fp.dp
- دستورالعملهای ممیز شناور با دقت یگانه و مضاعف.
- +nofp
- غیرفعالسازی افزونهٔ ممیز شناور.
- +cdecp0, +cdecp1, ... , +cdecp7
- فعالسازی Custom Datapath Extension (CDE) روی کمکپردازندههای انتخابشده بر اساس شمارههای ارائهشده در گزینهها در محدودهٔ ۰ تا ۷.
- +crc
- دستورالعملهای Cyclic Redundancy Check (CRC).
- +fp.sp
- دستورالعملهای ممیز شناور FPv5 با دقت یگانه.
- +simd
- دستورالعملهای ممیز شناور و Advanced SIMD مربوط به ARMv8-A.
- +crypto
- دستورالعملهای رمزنگاری.
- +nocrypto
- غیرفعالسازی دستورالعملهای رمزنگاری.
- +nofp
- غیرفعالسازی دستورالعملهای ممیز شناور، Advanced SIMD و رمزنگاری.
گزینهٔ -march=native باعث میشود کامپایلر معماری رایانهٔ ساخت را بهطور خودکار تشخیص دهد. در حال حاضر، این قابلیت فقط در GNU/Linux پشتیبانی میشود و همهٔ معماریها شناسایی نمیشوند. اگر تشخیص خودکار ناموفق باشد، این گزینه هیچ تاثیری نخواهد داشت.
گزینهٔ -march=unset باعث میشود کامپایلر تمام گزینههای -march=... را که پیشتر در خط فرمان آمدهاند نادیده بگیرد و بهگونهای عمل کند که گویی این گزینه هرگز داده نشده است. این ویژگی برای جلوگیری از هشدارهای مربوط به تداخل گزینههای CPU و معماری زمانی که این دو مشخصات متفاوتی از معماری را ارائه میدهند، مفید است.
- -mtune=name
- این گزینه
نام
پردازندهٔ
ARM هدف را
مشخص
میکند که GCC
باید
کارایی کد
را برای آن
تنظیم کند.
برای برخی
پیادهسازیهای
ARM، میتوان
با استفاده
از این
گزینه به
کارایی
بهتری دست
یافت.
نامهای
مجاز
عبارتند از:
arm7tdmi، arm7tdmi-s، arm710t،
arm720t، arm740t، strongarm،
strongarm110، strongarm1100،
strongarm1110، arm8، arm810،
arm9، arm9e، arm920،
arm920t، arm922t، arm946e-s،
arm966e-s، arm968e-s،
arm926ej-s، arm940t، arm9tdmi،
arm10tdmi، arm1020t،
arm1026ej-s، arm10e، arm1020e،
arm1022e، arm1136j-s،
arm1136jf-s، mpcore،
mpcorenovfp، arm1156t2-s،
arm1156t2f-s، arm1176jz-s،
arm1176jzf-s، generic-armv7-a،
cortex-a5، cortex-a7، cortex-a8،
cortex-a9، cortex-a12،
cortex-a15، cortex-a17،
cortex-a32، cortex-a35،
cortex-a53، cortex-a55،
cortex-a57، cortex-a72،
cortex-a73، cortex-a75،
cortex-a76، cortex-a76ae،
cortex-a77، cortex-a78،
cortex-a78ae، cortex-a78c،
cortex-a710، ares، cortex-r4،
cortex-r4f، cortex-r5،
cortex-r7، cortex-r8،
cortex-r52، cortex-r52plus،
cortex-m0، cortex-m0plus،
cortex-m1، cortex-m3، cortex-m4،
cortex-m7، cortex-m23،
cortex-m33، cortex-m35p،
cortex-m52، cortex-m55،
cortex-m85، cortex-x1،
cortex-x1c، cortex-m1.small-multiply،
cortex-m0.small-multiply،
cortex-m0plus.small-multiply، exynos-m1،
marvell-pj4، neoverse-n1،
neoverse-n2، neoverse-v1،
xscale، iwmmxt، iwmmxt2،
ep9312، fa526، fa626،
fa606te، fa626te، fmp626،
fa726te، star-mc1، xgene1.
علاوه بر این، این گزینه میتواند مشخص کند که GCC باید کارایی کد را برای یک سامانهٔ big.LITTLE بهینهسازی کند. نامهای مجاز عبارتند از: cortex-a15.cortex-a7، cortex-a17.cortex-a7، cortex-a57.cortex-a53، cortex-a72.cortex-a53، cortex-a72.cortex-a35، cortex-a73.cortex-a53، cortex-a75.cortex-a55، cortex-a76.cortex-a55.
گزینهٔ -mtune=generic-arch مشخص میکند که GCC باید کارایی را برای ترکیبی از پردازندهها در معماری arch تنظیم کند. هدف، تولید کدی است که روی پرکاربردترین پردازندههای فعلی بهخوبی اجرا شود، و تعادلی میان بهینهسازیهایی که به نفع برخی CPUهای این رده است و اجتناب از افت کارایی در دیگر CPUها برقرار نماید. با آمدن و رفتن مدلهای 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 و Branch Target Identification را در cortex-m52 و cortex-m85 غیرفعال میکند.
- +nomve
- دستورالعملهای عدد صحیح و ممیز شناور با دقت یگانهٔ M-Profile Vector Extension (MVE) را در cortex-m52، cortex-m55 و cortex-m85 غیرفعال میکند.
- +nomve.fp
- دستورالعملهای ممیز شناور با دقت یگانهٔ M-Profile Vector Extension (MVE) را در cortex-m52، cortex-m55 و cortex-m85 غیرفعال میکند.
- +cdecp0, +cdecp1, ... , +cdecp7
- افزونهٔ Custom Datapath Extension (CDE) را روی پردازندههای کمکی (coprocessors) انتخابشده با توجه به شمارههای ارائهشده در گزینهها در محدودهٔ 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
- بخش دقت دوگانهٔ (double-precision) دستورالعملهای ممیز شناور را در cortex-r5، cortex-r7، cortex-r8، cortex-r52، cortex-r52plus و cortex-m7 غیرفعال میکند.
- +nosimd
- دستورالعملهای SIMD (اما نه ممیز شناور) را در generic-armv7-a، cortex-a5، cortex-a7 و cortex-a9 غیرفعال میکند.
- +crypto
- دستورالعملهای رمزنگاری را در cortex-a32، cortex-a35، cortex-a53، cortex-a55، cortex-a57، cortex-a72، cortex-a73، cortex-a75، exynos-m1، xgene1، cortex-a57.cortex-a53، cortex-a72.cortex-a53، cortex-a73.cortex-a35، cortex-a73.cortex-a53 و cortex-a75.cortex-a55 فعال میکند.
علاوه بر این، شبههدف generic-armv7-a بهطور پیشفرض از VFPv3 با ۱۶ ثبات با دقت دوگانه استفاده میکند. این شبههدف از گزینههای افزونهٔ زیر پشتیبانی میکند: mp، sec، vfpv3-d16، vfpv3، vfpv3-d16-fp16، vfpv3-fp16، vfpv4-d16، vfpv4، neon، neon-vfpv3، neon-fp16، neon-vfpv4. معانی آنها همانند افزونههای مربوط به -march=armv7-a است.
همچنین -mcpu=generic-arch نیز مجاز بوده و معادل با -march=arch -mtune=generic-arch است. برای اطلاعات بیشتر -mtune را ببینید.
گزینهٔ -mcpu=native باعث میشود کامپایلر پردازندهٔ رایانهٔ میزبان ساخت را بهطور خودکار شناسایی کند. در حال حاضر، این قابلیت تنها در 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 را برای محاسبات ممیز شناور بهطور کامل پیادهسازی نمیکند (بهویژه مقادیر غیرنرمال بهصورت صفر در نظر گرفته میشوند)، بنابراین استفاده از دستورالعملهای NEON ممکن است منجر به کاهش دقت شود.
همچنین میتوانید نام fpu را در سطح تابع با استفاده از صفتهای تابع یا عملگرهای عملافزای (pragmas) target("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
- تولید فراخوانی تابع "abort" در انتهای یک تابع "noreturn". در صورتی که تابع تلاش کند مقداری بازگرداند، این دستور اجرا میشود.
- -mlong-calls
- -mno-long-calls
- به
کامپایلر
دستور
میدهد تا
فراخوانیهای
تابع را
ابتدا با
بارگذاری
نشانی تابع
درون یک
ثبات و سپس
انجام یک
فراخوانی
زیرروال (subroutine call)
روی این
ثبات انجام
دهد. این
سوییچ در
حالتی مورد
نیاز است که
تابع مقصد
خارج از
محدودهٔ
آدرسدهی
۶۴
مگابایتی
نسخهٔ
مبتنی بر
آفست از
دستورالعمل
فراخوانی
زیرروال
قرار داشته
باشد.
حتی با فعال بودن این سوییچ، همهٔ فراخوانیهای توابع به فراخوانیهای طولانی تبدیل نمیشوند. قاعدهٔ سرانگشتی این است که توابع 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 در زمان
پیوند
ایستا ثابت
است. این
امر اجازه
میدهد تا
از عملیات
آدرسدهی
نسبی به PC
برای
دسترسی به
دادههایی
که معلوم
است در بخش
داده قرار
دارند
استفاده
شود. برای
مقاصد غیر VxWorks
RTP، این
گزینه
بهطور
پیشفرض
فعال است.
در صورت
غیرفعال
شدن روی
چنین
مقاصدی،
گزینهٔ -msingle-pic-base
را بهطور
پیشفرض
فعال خواهد
کرد..IP -mpoke-function-name 4
نام هر تابع
را دقیقاً
پیش از
دیباچهٔ
تابع (function prologue) در
بخش text
مینویسد.
کد
تولیدشده
شبیه به این
است:
t0 .ascii "arm_poke_function_name", 0 .align t1 .word 0xff000000 + (t1 - t0) arm_poke_function_name mov ip, sp stmfd sp!, {fp, ip, lr, pc} sub fp, ip, #4هنگام انجام ردیابی رو به عقب پشته (stack backtrace)، کد میتواند مقدار "pc" ذخیرهشده در "fp + 0" را بررسی کند. اگر تابع ردیاب سپس به مکان "pc - 12" نگاه کند و ۸ بیت بالایی تنظیم شده باشند، آنگاه میدانیم که یک نام تابع بلافاصله پیش از این مکان جاسازی شده است و طولی برابر با "((pc[-3]) & 0xff000000)" دارد.
- -mthumb
- -marm
- بین تولید
کدی که در
وضعیتهای
ARM یا Thumb اجرا
میشود،
انتخاب
میکند.
پیشفرض در
بیشتر
پیکربندیها
تولید کدی
است که در
وضعیت ARM
اجرا شود،
اما این
پیشفرض را
میتوان با
پیکربندی GCC
با گزینهٔ
پیکربندی
--with-mode=state تغییر
داد.
همچنین میتوانید حالت ARM و Thumb را برای هر تابع با استفاده از ویژگیهای تابعی (function attributes) یا پراگماهای target("thumb") و target("arm") بازنویسی کنید.
- -mtpcs-frame
- برای همهٔ توابع غیربرگی (non-leaf)، یک فریم پشته (stack frame) سازگار با استاندارد فراخوانی رویهٔ بندانگشتی (Thumb Procedure Call Standard) تولید میکند. (یک تابع برگی تابعی است که هیچ تابع دیگری را فراخوانی نمیکند.) پیشفرض -mno-tpcs-frame است.
- -mtpcs-leaf-frame
- برای همهٔ توابع برگی (leaf)، یک فریم پشته سازگار با استاندارد فراخوانی رویهٔ بندانگشتی (Thumb Procedure Call Standard) تولید میکند. (یک تابع برگی تابعی است که هیچ تابع دیگری را فراخوانی نمیکند.) پیشفرض -mno-apcs-leaf-frame است.
- -mcallee-super-interworking
- به همهٔ توابع قابلمشاهده از بیرون (externally visible) در فایلی که کامپایل میشود، یک سرآیند مجموعه دستورالعمل ARM میدهد که پیش از اجرای بقیهٔ تابع به حالت Thumb جابهجا میشود. این کار اجازه میدهد این توابع از کدهای بدون قابلیت کارکرد متقابل (non-interworking) فراخوانی شوند. این گزینه در پیکربندیهای AAPCS معتبر نیست، چرا که کارکرد متقابل (interworking) بهطور پیشفرض فعال است.
- -mcaller-super-interworking
- اجازه میدهد فراخوانیها از طریق اشارهگرهای تابع (از جمله توابع مجازی) صرفنظر از اینکه کد مقصد برای کارکرد متقابل کامپایل شده است یا خیر، بهدرستی اجرا شوند. در صورت فعال بودن این گزینه، هزینهٔ اجرای یک اشارهگر تابع دارای سربار اندکی خواهد بود. این گزینه در پیکربندیهای AAPCS معتبر نیست، چرا که کارکرد متقابل بهطور پیشفرض فعال است.
- -mtp=name
- مدل دسترسی را برای اشارهگر حافظهٔ محلی ریسه (thread local storage) مشخص میکند. مدل 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
- تنها بازنشانیهای مطلق (absolute relocations) را روی مقادیر با اندازهٔ کلمه (یعنی R_ARM_ABS32) ایجاد میکند. این گزینه بهطور پیشفرض در مقصدهایی (uClinux، SymbianOS) که بارگذار زمان اجرا این محدودیت را تحمیل میکند و نیز هنگامی که -fpic یا -fPIC مشخص شده باشد، فعال است. این گزینه با -mslow-flash-data تداخل دارد.
- -mfix-cortex-m3-ldrd
- برخی از هستههای Cortex-M3 هنگامی که از دستورالعملهای "ldrd" با ثباتهای مقصد و پایهٔ همپوشان استفاده شود، میتوانند باعث خرابی دادهها شوند. این گزینه از تولید این دستورالعملها جلوگیری میکند. این گزینه زمانی که -mcpu=cortex-m3 مشخص شده باشد، بهطور پیشفرض فعال است.
- -mfix-cortex-a57-aes-1742098
- -mno-fix-cortex-a57-aes-1742098
- -mfix-cortex-a72-aes-1655431
- -mno-fix-cortex-a72-aes-1655431
- کاهش اثر (یا غیرفعال کردن کاهش اثر) یک اشکال سختافزاری (erratum) در Cortex-A57 و Cortex-A72 را که بر دستورالعملهای رمزنگاری AES تأثیر میگذارد، فعال (یا غیرفعال) میکند. این گزینه بهطور پیشفرض در صورت مشخص شدن -mcpu=cortex-a57 یا -mcpu=cortex-a72 فعال است.
- -munaligned-access
- -mno-unaligned-access
- خواندن و
نوشتن
مقادیر ۱۶ و
۳۲ بیتی را
از
نشانیهایی
که
ترازبندی
۱۶ یا ۳۲
بیتی
ندارند،
فعال (یا
غیرفعال)
میکند.
بهطور
پیشفرض
دسترسی
ناتراز
برای همهٔ
معماریهای
پیش از ARMv6،
تمام ARMv6-M و
برای
معماریهای
پایهای ARMv8-M
غیرفعال
است و برای
تمام
معماریهای
دیگر فعال
است. اگر
دسترسی
ناتراز
فعال
نباشد،
کلمهها در
ساختارهای
دادهای
فشرده (packed) هر
بار یک بایت
مورد
دسترسی
قرار
میگیرند.
صفت ARM با عنوان "Tag_CPU_unaligned_access" در فایل شیء تولیدشده، بسته به مقدار این گزینه، بر روی true یا false تنظیم میشود. اگر دسترسی ناتراز فعال باشد، نماد پیشپردازندهٔ "__ARM_FEATURE_UNALIGNED" نیز تعریف میشود.
- -mslow-flash-data
- فرض میکند که بارگذاری دادهها از حافظهٔ فلش کندتر از واکشی دستورالعمل است. بنابراین، بارگذاری مستقیم مقادیر (literal load) برای کارایی بهتر به حداقل میرسد. این گزینه تنها هنگام کامپایل برای نمایهٔ ARMv7 M پشتیبانی میشود و بهطور پیشفرض غیرفعال است. این گزینه با -mword-relocations تداخل دارد.
- -masm-syntax-unified
- فرض میکند که اسمبلر درونخطی (inline assembler) از نحو یکپارچهٔ asm (unified asm syntax) استفاده میکند. پیشفرض در حال حاضر غیرفعال است که نشاندهندهٔ نحو تفکیکشده (divided syntax) است. این گزینه هیچ تأثیری بر Thumb2 ندارد؛ با این حال، ممکن است در نسخههای بعدی GCC تغییر کند. نحو تفکیکشده باید منسوخشده در نظر گرفته شود.
- -mrestrict-it
- تولید بلوکهای IT را محدود میکند تا با قوانین ARMv8-A مطابقت داشته باشند. بلوکهای IT تنها میتوانند شامل یک دستورالعمل ۱۶ بیتی منفرد از مجموعهای منتخب از دستورالعملها باشند. این گزینه بهطور پیشفرض برای حالت ARMv8-A Thumb فعال است.
- -mpure-code
- اجازه نمیدهد دادههای ثابت در بخشهای کد قرار گیرند. علاوه بر این، هنگام کامپایل برای قالب شیء ELF، به تمام بخشهای text ویژگیِ بخشیِ مخصوص پردازندهٔ ELF یعنی "SHF_ARM_PURECODE" داده میشود. این گزینه تنها هنگام تولید کد غیر pic برای مقصدهای نمایهٔ M در دسترس است.
- -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 را هنگام استفاده از 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 است و برای استفاده در کدهای فضای کاربری مناسب نیست.
- -mfdpic
- -mno-fdpic
- رابط
دودویی
کاربردی (ABI)
از نوع FDPIC را
انتخاب
میکند که
از
توصیفگرهای
تابع ۶۴
بیتی برای
نمایش
اشارهگرها
به توابع
استفاده
میکند.
هنگامی که
کامپایلر
برای
مقصدهای
"arm-*-uclinuxfdpiceabi"
پیکربندی
شده باشد،
این گزینه
بهطور
پیشفرض
فعال است و
در صورتی که
هیچیک از
گزینههای
مرتبط با PIC/PIE
ارائه نشده
باشد، به
معنی -fPIE
خواهد بود.
در سایر
مقصدها،
این گزینه
تنها
ویژگیهای
تولید کد
مخصوص FDPIC را
فعال
میکند و
کاربر باید
در صورت
نیاز
گزینههای
مرتبط با PIC/PIE
را صراحتاً
ارائه دهد.
توجه داشته باشید که پیوند ایستا پشتیبانی نمیشود، زیرا هنگامی که برنامه خود را بازنشانی میکند، همچنان پیونددهندهٔ پویا را درگیر میسازد. اگر چنین رفتاری قابل قبول است، از گزینههای -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 را گسترش میدهد تا توابع برگ را حتی اگر نشانی بازگشت را در حافظه ننویسند، شامل شود.
bti دستورالعملهای landing-pad را در مقصدهای مجاز دستورالعملهای انشعاب غیرمستقیم اضافه میکند.
اگر پشتیبانی از افزونهٔ معماری +pacbti (مثلاً از طریق -march=) فعال نباشد، آنگاه تمام عملیات محافظت از انشعاب و امضای نشانی بازگشت محدود به استفاده از دستورالعملهایی هستند که در فضای معماری 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" و یک فایل مشخصات قطعه ("https://gcc.gnu.org/wiki/avr-gcc#spec-files") با نام "specs-mcu" است. تنها مورد آخر توسط کامپایلر بر اساس "mcu"های پشتیبانیشده در زیر ارائه میشود. باقی موارد توسط AVR-LibC ("https://github.com/avrdudes/avr-libc")، یا به واسطهٔ فایلهای "atpack" ("https://gcc.gnu.org/wiki/avr-gcc#atpack") از سازندهٔ سختافزار پشتیبانی میشوند.
- "avr2"
- قطعات «Classic» با حداکثر 8 KiB حافظهٔ برنامه. mcu = "attiny22", "attiny26", "at90s2313", "at90s2323", "at90s2333", "at90s2343", "at90s4414", "at90s4433", "at90s4434", "at90c8534", "at90s8515", "at90s8535".
- "avr25"
- قطعات «Classic» با حداکثر 8 KiB حافظهٔ برنامه و دارای دستورالعمل "MOVW". mcu = "attiny13", "attiny13a", "attiny24", "attiny24a", "attiny25", "attiny261", "attiny261a", "attiny2313", "attiny2313a", "attiny43u", "attiny44", "attiny44a", "attiny45", "attiny48", "attiny441", "attiny461", "attiny461a", "attiny4313", "attiny84", "attiny84a", "attiny85", "attiny87", "attiny88", "attiny828", "attiny841", "attiny861", "attiny861a", "ata5272", "ata6616c", "at86rf401".
- "avr3"
- قطعات «Classic» با 16 KiB تا 64 KiB حافظهٔ برنامه. mcu = "at76c711", "at43usb355".
- "avr31"
- قطعات «Classic» با 128 KiB حافظهٔ برنامه. mcu = "atmega103", "at43usb320".
- "avr35"
- قطعات «Classic» با 16 KiB تا 64 KiB حافظهٔ برنامه و دارای دستورالعمل "MOVW". mcu = "attiny167", "attiny1634", "atmega8u2", "atmega16u2", "atmega32u2", "ata5505", "ata6617c", "ata664251", "at90usb82", "at90usb162".
- "avr4"
- قطعات «Enhanced» با حداکثر 8 KiB حافظهٔ برنامه. mcu = "atmega48", "atmega48a", "atmega48p", "atmega48pa", "atmega48pb", "atmega8", "atmega8a", "atmega8hva", "atmega88", "atmega88a", "atmega88p", "atmega88pa", "atmega88pb", "atmega8515", "atmega8535", "ata5795", "ata6285", "ata6286", "ata6289", "ata6612c", "at90pwm1", "at90pwm2", "at90pwm2b", "at90pwm3", "at90pwm3b", "at90pwm81".
- "avr5"
- قطعات «Enhanced» با 16 KiB تا 64 KiB حافظهٔ برنامه. mcu = "atmega16", "atmega16a", "atmega16hva", "atmega16hva2", "atmega16hvb", "atmega16hvbrevb", "atmega16m1", "atmega16u4", "atmega161", "atmega162", "atmega163", "atmega164a", "atmega164p", "atmega164pa", "atmega165", "atmega165a", "atmega165p", "atmega165pa", "atmega168", "atmega168a", "atmega168p", "atmega168pa", "atmega168pb", "atmega169", "atmega169a", "atmega169p", "atmega169pa", "atmega32", "atmega32a", "atmega32c1", "atmega32hvb", "atmega32hvbrevb", "atmega32m1", "atmega32u4", "atmega32u6", "atmega323", "atmega324a", "atmega324p", "atmega324pa", "atmega324pb", "atmega325", "atmega325a", "atmega325p", "atmega325pa", "atmega328", "atmega328p", "atmega328pb", "atmega329", "atmega329a", "atmega329p", "atmega329pa", "atmega3250", "atmega3250a", "atmega3250p", "atmega3250pa", "atmega3290", "atmega3290a", "atmega3290p", "atmega3290pa", "atmega406", "atmega64", "atmega64a", "atmega64c1", "atmega64hve", "atmega64hve2", "atmega64m1", "atmega64rfr2", "atmega640", "atmega644", "atmega644a", "atmega644p", "atmega644pa", "atmega644rfr2", "atmega645", "atmega645a", "atmega645p", "atmega649", "atmega649a", "atmega649p", "atmega6450", "atmega6450a", "atmega6450p", "atmega6490", "atmega6490a", "atmega6490p", "ata5790", "ata5790n", "ata5791", "ata6613c", "ata6614q", "ata5782", "ata5831", "ata8210", "ata8510", "ata5787", "ata5835", "ata5700m322", "ata5702m322", "at90pwm161", "at90pwm216", "at90pwm316", "at90can32", "at90can64", "at90scr100", "at90usb646", "at90usb647", "at94k", "m3000".
- "avr51"
- قطعات «Enhanced» با 128 KiB حافظهٔ برنامه. mcu = "atmega128", "atmega128a", "atmega128rfa1", "atmega128rfr2", "atmega1280", "atmega1281", "atmega1284", "atmega1284p", "atmega1284rfr2", "at90can128", "at90usb1286", "at90usb1287".
- "avr6"
- قطعات «Enhanced» با PC سهبایتی، یعنی با بیش از 128 KiB حافظهٔ برنامه. mcu = "atmega256rfr2", "atmega2560", "atmega2561", "atmega2564rfr2".
- "avrxmega2"
- قطعات «XMEGA» با بیش از 8 KiB و حداکثر 64 KiB حافظهٔ برنامه. mcu = "atxmega8e5", "atxmega16a4", "atxmega16a4u", "atxmega16c4", "atxmega16d4", "atxmega16e5", "atxmega32a4", "atxmega32a4u", "atxmega32c3", "atxmega32c4", "atxmega32d3", "atxmega32d4", "atxmega32e5", "avr64da28", "avr64da28s", "avr64da32", "avr64da32s", "avr64da48", "avr64da48s", "avr64da64", "avr64da64s", "avr64db28", "avr64db32", "avr64db48", "avr64db64", "avr64dd14", "avr64dd20", "avr64dd28", "avr64dd32", "avr64du28", "avr64du32", "avr64ea28", "avr64ea32", "avr64ea48", "avr64sd28", "avr64sd32", "avr64sd48".
- "avrxmega3"
- قطعات «XMEGA» با حداکثر 64 KiB ترکیب حافظهٔ برنامه و RAM، و با حافظهٔ برنامهٔ قابل مشاهده در فضای نشانی RAM. mcu = "attiny202", "attiny204", "attiny212", "attiny214", "attiny402", "attiny404", "attiny406", "attiny412", "attiny414", "attiny416", "attiny416auto", "attiny417", "attiny424", "attiny426", "attiny427", "attiny804", "attiny806", "attiny807", "attiny814", "attiny816", "attiny817", "attiny824", "attiny826", "attiny827", "attiny1604", "attiny1606", "attiny1607", "attiny1614", "attiny1616", "attiny1617", "attiny1624", "attiny1626", "attiny1627", "attiny3214", "attiny3216", "attiny3217", "attiny3224", "attiny3226", "attiny3227", "atmega808", "atmega809", "atmega1608", "atmega1609", "atmega3208", "atmega3209", "atmega4808", "atmega4809", "avr16dd14", "avr16dd20", "avr16dd28", "avr16dd32", "avr16du14", "avr16du20", "avr16du28", "avr16du32", "avr16ea28", "avr16ea32", "avr16ea48", "avr16eb14", "avr16eb20", "avr16eb28", "avr16eb32", "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» با بیش از 64 KiB و حداکثر 128 KiB حافظهٔ برنامه. mcu = "atxmega64a3", "atxmega64a3u", "atxmega64a4u", "atxmega64b1", "atxmega64b3", "atxmega64c3", "atxmega64d3", "atxmega64d4", "avr128da28", "avr128da28s", "avr128da32", "avr128da32s", "avr128da48", "avr128da48s", "avr128da64", "avr128da64s", "avr128db28", "avr128db32", "avr128db48", "avr128db64".
- "avrxmega5"
- قطعات «XMEGA» با بیش از 64 KiB و حداکثر 128 KiB حافظهٔ برنامه و بیش از 64 KiB حافظهٔ RAM. mcu = "atxmega64a1", "atxmega64a1u".
- "avrxmega6"
- قطعات «XMEGA» با بیش از 128 KiB حافظهٔ برنامه. mcu = "atxmega128a3", "atxmega128a3u", "atxmega128b1", "atxmega128b3", "atxmega128c3", "atxmega128d3", "atxmega128d4", "atxmega192a3", "atxmega192a3u", "atxmega192c3", "atxmega192d3", "atxmega256a3", "atxmega256a3b", "atxmega256a3bu", "atxmega256a3u", "atxmega256c3", "atxmega256d3", "atxmega384c3", "atxmega384d3".
- "avrxmega7"
- قطعات «XMEGA» با بیش از 128 KiB حافظهٔ برنامه و بیش از 64 KiB حافظهٔ RAM. mcu = "atxmega128a1", "atxmega128a1u", "atxmega128a4u".
- "avrtiny"
- قطعات هستهٔ Tiny از نوع «Reduced Tiny» تنها با ۱۶ ثبات همهمنظوره و 512 B تا 4 KiB حافظهٔ برنامه. mcu = "attiny4", "attiny5", "attiny9", "attiny10", "attiny102", "attiny104", "attiny20", "attiny40".
- "avr1"
- این ISA توسط هستهٔ کمینهٔ AVR پیادهسازی شده و تنها برای اسمبلر پشتیبانی میشود. mcu = "attiny11", "attiny12", "attiny15", "attiny28", "at90s1200".
- -mabsdata
- فرض میکند که تمام دادهها در حافظهٔ ایستا میتوانند توسط دستورالعملهای LDS / STS قابلدسترسی باشند. این گزینه تنها روی قطعات Reduced Tiny مانند ATtiny40 اثر دارد. همچنین ویژگی متغیر "absdata" در AVR Attributes,variable attribute را ببینید.
- -mcvt
- از یک compact vector table
(جدول بردار
فشرده)
استفاده
میکند.
برخی قطعات
از یک CVT تنها
با چهار
مدخل
پشتیبانی
میکنند: 0=Reset،
1=NMI، 2=Prio1 IRQ، 3=Prio0 IRQs. این
گزینه کد
راهانداز
را به جای
"crtmcu.o"
معمول، از
"crtmcu-cvt.o"
پیوند
میدهد.
جدای از
ارائهٔ یک
جدول بردار
فشرده، کد
راهانداز
بیت
"CPUINT_CTRLA.CPUINT_CVT"
را تنظیم
خواهد کرد
که CVT را روی
قطعه فعال
میکند.
هنگامی که نمیخواهید کد راهانداز بیت "CPUINT_CTRLA.CPUINT_CVT" را تنظیم کند، میتوانید نماد "__init_cvt" را برآورده سازید تا کد مربوطه دیگر از "libmcu.a" واکشی نشود. برای نمونه، میتوانید با "-Wl,--defsym,__init_cvt=0" پیوند دهید.
کد راهانداز CVT از نگارش AVR-LibC v2.3 ("https://github.com/avrdudes/avr-libc/issues/1010") در دسترس است.
- -mdouble=bits
- -mlong-double=bits
- اندازه (برحسب بیت) نوعهای "double" یا "long double" را به ترتیب تعیین میکند. مقدارهای ممکن برای bits برابر ۳۲ و ۶۴ هستند. مجاز بودن یا نبودن یک مقدار مشخص برای bits به گزینههای پیکربندی "--with-double=" و "--with-long-double=" ("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 stubها نیاز باشد، relaxing باید فعال باشد؛ بخش مربوط به "EIND" و linker stubها را در زیر ببینید.
- -mpmem-wrap-around
- چرخش شمارنده برنامه (program counter wrap-around) را در بهینهسازی پیونددهنده (linker relaxation) فعال میکند.
- -mrodata-in-ram
- -mno-rodata-in-ram
- بخشهای
".rodata" را
برای
دادههای
فقطخواندنی
به ترتیب در
RAM یا در
حافظه
برنامه
قرار
میدهد.
برای بیشتر
دستگاهها،
انتخابی
وجود ندارد
و این گزینه
بیشتر شبیه
یک ادعا عمل
میکند.
از نسخه ۱۴ و برای دستگاههای AVR64* و AVR128*، در صورتی که پشتیبانی لازم در GNU Binutils (PR31124 ("https://sourceware.org/PR31124")) در دسترس باشد، ".rodata" بهطور پیشفرض در حافظه فلش مستقر میشود. در این حالت، میتوان از -mrodata-in-ram برای بازگشت به چیدمان قدیمی با قرارگیری ".rodata" در RAM استفاده کرد.
- -mtiny-stack
- تنها ۸ بیت پایینی اشارهگر پشته را تغییر میدهد.
- -mfract-convert-truncate
- امکان استفاده از برش (truncation) بهجای گرد کردن به سمت صفر را برای نوعهای ممیز ثابت کسری فراهم میکند.
- -nodevicelib
- به
کتابخانه
خاص دستگاه
در 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=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
- آرگومانهای
خروجی تابع
را انباشته
کرده و فضای
پشته مورد
نیاز برای
آرگومانهای
خروجی تابع
را یکبار
در
مقدمه/مؤخره
تابع (prologue/epilogue)
اختصاص
داده یا
آزاد
میکند.
بدون این
گزینه،
آرگومانهای
خروجی پیش
از
فراخوانی
تابع روی
پشته قرار
گرفته و پس
از آن
برداشته
میشوند.
همچنین
گزینه
بهینهسازی
-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 بهینهسازی میکند. پیشفرض از "level=1" برای بهینهسازیهای -Og و -O1، و از "level=2" برای بهینهسازیهای بالاتر استفاده میکند. مقدارهای معتبر برای level عبارتند از 0، 1 و 2.
- -mfuse-move
- -mno-fuse-move
- اجرای یک گام بهینهسازی پس از بارگذاری مجدد (post reload) که تلاش میکند دستورالعملهای انتقال (move) را ادغام کرده و دستورالعملهای چندبایتی را به عملیاتهای ۸ بیتی تقسیم کند. حالت پیشفرض برای بهینهسازی -O1 از "level=3"، و برای بهینهسازیهای بالاتر از "level=23" استفاده میکند. مقادیر معتبر برای level در محدودهٔ 0 تا 23 هستند که یک مقدار در مبنای مختلط ۳:۲:۲:۲ است. هر رقم جنبهای از بهینهسازی را کنترل میکند.
- -mfuse-move2
- اجرای یک گام بهینهسازی پس از ترکیب (post combine) که تلاش میکند دستورالعملهای انتقال را ادغام کند.
- -mstrict-X
- استفاده از
ثبات آدرس
"X" به
روش
پیشنهادی
سختافزار.
این بدان
معناست که
"X" فقط
در
آدرسدهی
غیرمستقیم،
پسافزایشی
(post-increment) یا
پیشکاهشی
(pre-decrement) استفاده
میشود.
بدون این گزینه، ثبات "X" ممکن است به همان روشی که از "Y" یا "Z" استفاده میشود به کار گرفته شود، که در این صورت توسط دستورالعملهای اضافی شبیهسازی خواهد شد. به عنوان مثال، بارگذاری یک مقدار با آدرسدهی "X+const" با یک مقدار غیرمنفی کوچک "const < 64" درون یک ثبات Rn به این صورت انجام میشود:
adiw r26, const ; X += const ld <Rn>, X ; <Rn> = *X sbiw r26, const ; X -= const
- -msplit-bit-shift
- تقسیم شیفتهای چندبایتی با آفست ثابت به یک شیفت با آفست بایتی و یک شیفت باقیمانده با آفست غیربایتی. این بهینهسازی بهطور پیشفرض برای -O2 و بالاتر، شامل -Os اما بدون -Oz، فعال است. تقسیم شیفتها با آفست ثابتی که مضربی از ۸ باشد، توسط -mfuse-move کنترل میشود.
- -msplit-ldst
- تقسیم بارگذاریها و ذخیرهسازیهای چندبایتی به چندین بارگذاری و ذخیرهسازی بایتی. این بهینهسازی بهطور پیشفرض برای -O2 و بالاتر فعال است.
- -muse-nonzero-bits
- فعالسازی بهینهسازیهایی که تنها زمانی امکانپذیر هستند که برخی بیتها در یک ثبات همیشه صفر باشند. این بهینهسازی بهطور پیشفرض برای -O2 و بالاتر فعال است.
"EIND" و دستگاههایی با بیش از ۱۲۸ کیبیبایت حافظه فلش
اشارهگرها در این پیادهسازی ۱۶ بیتی هستند. آدرس یک تابع یا برچسب به عنوان آدرس کلمهای (word address) نمایش داده میشود تا پرشها و فراخوانیهای غیرمستقیم بتوانند هر آدرس کدی را در محدودهٔ ۶۴ کیلوکلمه هدف قرار دهند.
به منظور تسهیل پرش غیرمستقیم در دستگاههایی با بیش از ۱۲۸ کیبیبایت فضای حافظه برنامه، یک ثبات با عملکرد ویژه به نام "EIND" وجود دارد که هنگام استفاده از دستورالعملهای "EICALL" یا "EIJMP" به عنوان پرارزشترین بخش آدرس مقصد عمل میکند.
پرشها و فراخوانیهای غیرمستقیم در این دستگاهها توسط کامپایلر به شرح زیر مدیریت میشوند و مشمول برخی محدودیتها هستند:
- کامپایلر هرگز "EIND" را مقداردهی نمیکند.
- کامپایلر از "EIND" بهطور ضمنی در دستورالعملهای "EICALL"/"EIJMP" استفاده میکند یا ممکن است برای شبیهسازی یک فراخوانی/پرش غیرمستقیم با استفاده از دستورالعمل "RET"، مستقیماً "EIND" را بخواند.
- کامپایلر فرض میکند که "EIND" هرگز در طول کد راهاندازی یا در حین اجرای برنامه تغییر نمیکند. بهویژه، "EIND" در مقدمه/پایان (prologue/epilogue) توابع یا روالهای خدمت وقفه ذخیره/بازیابی نمیشود.
- برای فراخوانیهای غیرمستقیم توابع و دستور 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 محاسباتی.>
- -<در صورت استفاده از تابع 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 از حافظههایی بزرگتر از محدودهٔ 64 KiB که با اشارهگرهای ۱۶-بیتی قابل دسترسی هستند پشتیبانی میکنند. برای دسترسی به مکانهای حافظه در خارج از این محدودهٔ 64 KiB، از محتوای یک ثبات "RAMP" به عنوان بخش مرتبهبالای آدرس استفاده میشود: ثباتهای آدرس "X"، "Y" و "Z" به ترتیب با ثباتهای عملکرد خاص "RAMPX"، "RAMPY" و "RAMPZ" الحاق میشوند تا یک آدرس عریض به دست آید. به طور مشابه، "RAMPD" به همراه آدرسدهی مستقیم استفاده میشود.
- کد راهاندازی (startup code)، ثباتهای عملکرد خاص "RAMP" را با مقدار صفر مقداردهی اولیه میکند.
- اگر از یک AVR Named Address Spaces,فضای آدرس نامگذاریشده غیر از generic یا "__flash" استفاده شود، آنگاه "RAMPZ" در صورت نیاز پیش از عملیات مقداردهی میشود.
- اگر قطعه از حافظهٔ RAM بزرگتر از 64 KiB پشتیبانی کند و کامپایلر برای به سرانجام رساندن یک عملیات نیاز به تغییر "RAMPZ" داشته باشد، "RAMPZ" پس از عملیات مجدداً به صفر بازنشانی میشود.
- اگر قطعه دارای یک ثبات "RAMP" مشخص باشد، بخش پیشدرآمد/پسدرآمد (prologue/epilogue) روتین وقفه (ISR) آن ثبات SFR را ذخیره/بازیابی کرده و آن را با مقدار صفر مقداردهی اولیه میکند تا در صورتی که کد ISR (به طور ضمنی) از آن استفاده کند، مشکلی پیش نیاید.
- حافظهٔ RAM بزرگتر از 64 KiB توسط 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" است. این موضوع برای قطعاتی با بیش از 8 KiB حافظهٔ برنامه صادق است.
- "__AVR_HAVE_EIJMP_EICALL__"
- "__AVR_3_BYTE_PC__"
- قطعه دارای دستورالعملهای "EIJMP" و "EICALL" است. این موضوع برای قطعاتی با بیش از 128 KiB حافظهٔ برنامه صادق است. همچنین بدین معناست که شمارندهٔ برنامه (PC) دارای پهنای ۳ بایت است.
- "__AVR_2_BYTE_PC__"
- شمارندهٔ برنامه (PC) دارای پهنای ۲ بایت است. این موضوع برای قطعاتی با حداکثر 128 KiB حافظهٔ برنامه صادق است.
- "__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 SFR) را مانند "IN"، "OUT"، "SBI" و غیره آدرسدهی کنند، ممکن است از آدرسی متفاوت نسبت به زمانی که با دستورالعملهای دسترسی به RAM مانند "LD" یا "STS" آدرسدهی میشوند استفاده نمایند. این آفست به معماری دستگاه بستگی دارد و برای بهدست آوردن آدرس I/O متناظر، باید از آدرس RAM کسر شود.
- "__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 ۳۲ بیتی یا ۶۴ بیتی پشتیبانی کند. چیدمان واقعی با گزینهٔ -mdouble= مشخص میشود.
- "__DEFAULT_DOUBLE__"
- اندازهٔ "double" بر حسب بیت در صورتی که -mdouble= تنظیم نشده باشد. برای بررسی چیدمان "double" در یک برنامه، از ماکروی توکار "__SIZEOF_DOUBLE__" استفاده کنید.
- "__HAVE_LONG_DOUBLE32__"
- "__HAVE_LONG_DOUBLE64__"
- "__HAVE_LONG_DOUBLE_MULTILIB__"
- "__DEFAULT_LONG_DOUBLE__"
- مشابه بالا، اما برای "long double" به جای "double".
- "__WITH_DOUBLE_COMPARISON__"
- نشاندهندهٔ گزینهٔ پیکربندی "--with-double-comparison={tristate|bool|libf7}" ("https://gcc.gnu.org/install/configure.html#avr") بوده و برابر 2 یا 3 تعریف میشود.
- "__WITH_LIBF7_LIBGCC__"
- "__WITH_LIBF7_MATH__"
- "__WITH_LIBF7_MATH_SYMBOLS__"
- نشاندهندهٔ گزینهٔ پیکربندی "--with-libf7={libgcc|math|math-symbols}" ("https://gcc.gnu.org/install/configure.html#avr") است.
گزینههای داخلی AVR (AVR Internal Options)
گزینههای زیر به صورت داخلی توسط کامپایلر و برای برقراری ارتباط بین فایلهای مشخصات دستگاه (specs) و خود کامپایلر استفاده میشوند. نیازی نیست این گزینهها را به صورت دستی تنظیم کنید؛ بهویژه اینکه اینها گزینههای بهینهسازی نیستند. استفادهٔ نادرست از این گزینهها ممکن است به تولید کدهای غیربهینه یا نادرست منجر شود. آنها صرفاً برای جامعیت مستندات و به منظور درک بهتر فایلهای مشخصات دستگاه ("https://gcc.gnu.org/wiki/avr-gcc#spec-files") مستند شدهاند.
- -mn-flash=num
- فرض میکند که حافظهٔ فلش اندازهای معادل num برابر ۶۴ KiB دارد. این گزینه مشخص میکند که کدام فضاهای آدرس "__flashN" در دسترس هستند.
- -mflmap
- دستگاه دارای فیلد بیتی "FLMAP" واقع در ثبات کارکرد ویژهٔ "NVMCTRL_CTRLB" است.
- -mrmw
- فرض میکند که دستگاه از دستورالعملهای Read-Modify-Write شامل "XCH"، "LAC"، "LAS" و "LAT" پشتیبانی میکند.
- -mshort-calls
- فرض میکند که "RJMP" و "RCALL" میتوانند کل حافظهٔ برنامه را هدف قرار دهند. این گزینه برای ساخت و انتخاب multilib برای دستگاههای معماری "avrxmega3" استفاده میشود.
- -mskip-bug
- کد را بدون رد کردن دستورالعملهای ۳۲ بیتی ("CPSE"، "SBRS"، "SBRC"، "SBIS"، "SBIC") تولید میکند.
- -msp8
- با ثبات اشارهگر پشته به عنوان یک ثبات ۸ بیتی رفتار میکند؛ یعنی فرض میشود بایت بالای اشارهگر پشته صفر است. این گزینه توسط کامپایلر برای انتخاب و ساخت multilibها برای معماریهای "avr2" و "avr25" به کار میرود. این معماریها دستگاههای دارای "SPH" و فاقد آن را با یکدیگر ترکیب میکنند..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 هدف را مشخص میکند. تمام راهحلهای موقت موجود برای نسخهٔ سیلیکونِ هدف فعال میشوند. اگر 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
- هنگامی که فعال باشد، کامپایلر مجاز است از این آگاهی که کل برنامه در ۶۴ کیلوبایت پایین حافظه جای میگیرد استفاده کند. رفتار پیشفرض این است که فرض شود برنامه میتواند به هر اندازه بزرگ باشد (-mno-low64k).
- -mstack-check-l1
- بررسی پشته را با استفاده از اطلاعات قرار داده شده در حافظهٔ اسکرچپد (scratchpad) سطح ۱ (L1) توسط هستهٔ uClinux انجام میدهد.
- -mid-shared-library
- -mno-id-shared-library
- کدی تولید میکند که از طریق روش شناسهٔ کتابخانه از کتابخانههای اشتراکی پشتیبانی کند. این کار امکان اجرا درجا (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) نسبت به بخش text، امکان اجرا درجا را در محیطهای فاقد مدیریت حافظهٔ مجازی مهیا میسازد. پیشفرض -mno-sep-data است که به GCC اعلام میکند کدی تولید کند که در آن فرض میشود قطعه داده به دنبال قطعه متن قرار دارد.
- -mlong-calls
- -mno-long-calls
- به
کامپایلر
اعلام
میکند که
فراخوانی
توابع را
ابتدا با
بارگذاری
نشانی تابع
در یک ثبات
و سپس انجام
فراخوانی
زیرروال (subroutine call)
روی این
ثبات انجام
دهد. این
سوییچ
زمانی لازم
است که تابع
هدف خارج از
محدودهٔ
آدرسدهی
۲۴ بیتی در
نسخهٔ بر
پایهٔ
افستِ
دستورالعمل
فراخوانی
زیرروال
قرار داشته
باشد.
این قابلیت بهطور پیشفرض فعال نیست. مشخص کردن -mno-long-calls رفتار پیشفرض را بازیابی میکند. توجه داشته باشید این سوییچها تأثیری بر نحوهٔ تولید کد توسط کامپایلر برای مدیریت فراخوانی توابع از طریق اشارهگرهای تابع ندارند.
- -mfast-fp
- پیوند با کتابخانهٔ ممیز شناور سریع را انجام میدهد. این کتابخانه به جهت بهبود عملکرد، برخی از قوانین استاندارد ممیز شناور IEEE را برای بررسی ورودیها در برابر «غیرعدد» (NAN) نادیده میگیرد.
- -minline-plt
- درونخطیسازی (inlining) مدخلهای PLT را در فراخوانی توابعی که مشخص نیست بهصورت محلی مقید شده باشند، فعال میکند. این گزینه بدون -mfdpic بیاثر است.
- -mmulticore
- یک برنامهٔ
مستقل (standalone)
برای
پردازندههای
چندهستهای
Blackfin میسازد.
این گزینه
موجب
استفاده از
فایلهای
راهاندازی
و
اسکریپتهای
پیوند
مناسب با
پشتیبانی
از
چندهستهای
میشود و
ماکروی
"__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ها در زمان اجرا فعال هستند. این گزینه بر روی برخی از راهکارهای دور زدن ناهنجاریها اثر میگذارد. برای مقصدهای Linux، پیشفرض فرض بر فعال بودن ICPLBها است؛ برای برنامههای مستقل (standalone)، پیشفرض خاموش (غیرفعال) است.
گزینههای C6X
- -march=name
- این گزینه نام معماری مقصد را مشخص میکند. GCC از این نام برای تعیین اینکه چه نوع دستورالعملهایی میتواند هنگام تولید کد اسمبلی صادر کند، استفاده مینماید. نامهای مجاز عبارتند از: c62x، c64x، c64x+، c67x، c67x+، c674x.
- -mbig-endian
- تولید کد برای یک مقصد big-endian.
- -mlittle-endian
- تولید کد برای یک مقصد little-endian. این حالت پیشفرض است.
- -msim
- انتخاب فایلهای راهاندازی و اسکریپت پیونددهنده مناسب برای شبیهساز.
- -msdata=default
- دادههای سراسری و ایستای کوچک را در بخش ".neardata" قرار میدهد که توسط ثبات "B14" به آن اشاره میشود. دادههای سراسری و ایستای کوچک مقداردهینشده را در بخش ".bss"، که در مجاورت بخش ".neardata" است، قرار میدهد. دادههای فقطخواندنی کوچک را در بخش ".rodata" قرار میدهد. بخشهای متناظر مورد استفاده برای تکههای بزرگ داده، ".fardata"، ".far" و ".const" هستند.
- -msdata=all
- تمام دادهها، و نه تنها شیءهای کوچک را در بخشهای رزرو شده برای دادههای کوچک قرار میدهد و برای دسترسی به آنها از آدرسدهی نسبی به ثبات "B14" استفاده میکند.
- -msdata=none
- هیچ استفادهای از بخشهای رزرو شده برای دادههای کوچک نمیکند و برای دسترسی به همه دادهها از آدرسهای مطلق استفاده مینماید. تمام دادههای سراسری و ایستای مقداردهیشده را در بخش ".fardata" و تمام دادههای مقداردهینشده را در بخش ".far" قرار میدهد. تمام دادههای ثابت را در بخش ".const" قرار میدهد.
- -mdsbt
- کامپایل برای ABI کتابخانه مشترک DSBT. این گزینه برای کامپایل با -fpic یا -fPIC الزامی است و مستلزم -fpic میباشد.
- -mlong-calls
- از تولید فراخوانیهای وابسته به PC (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 بهینهسازی (tune) میکند. گزینههای انتخابی برای 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
- از نتایج کدهای شرطیِ دستورالعمل پیشین استفاده نمیکند؛ همیشه پیش از استفاده از کدهای شرطی، دستورالعملهای مقایسه و آزمون را صادر میکند.
- -mno-side-effects
- در حالتهای آدرسدهی غیر از پسافزایشی (post-increment)، دستورالعملهای دارای عوارض جانبی را صادر نمیکند.
- -mstack-align
- -mno-stack-align
- -mdata-align
- -mno-data-align
- -mconst-align
- -mno-const-align
- این گزینهها (گزینههای no-) ترتیبی میدهند (ترتیب را لغو میکنند) تا قاب پشته، دادههای منفرد و ثوابت برای حداکثر اندازه دسترسی تکی به داده در مدل پردازنده انتخابشده همتراز شوند. پیشفرض، تنظیم همترازی ۳۲ بیتی است. جزئیات ABI مانند چیدمان ساختار تحت تأثیر این گزینهها قرار نمیگیرند.
- -m32-bit
- -m16-bit
- -m8-bit
- مشابه گزینههای تراز پشته، داده و ثوابت در بالا، این گزینهها ترتیبی میدهند تا قاب پشته، دادههای قابل نوشتن و ثوابت همگی بهصورت ۳۲ بیتی، ۱۶ بیتی یا ۸ بیتی همتراز شوند. پیشفرض، همترازی ۳۲ بیتی است.
- -mno-prologue-epilogue
- -mprologue-epilogue
- با گزینه -mno-prologue-epilogue، مقدمه (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-endian یا little-endian را انتخاب میکند. پیشفرض little-endian است.
- -mfloat-abi=name
- مشخص
میکند که
از کدام ABI
ممیز شناور
استفاده
شود. مقادیر
مجاز
عبارتند از:
soft، softfp و hard.
مشخص کردن soft باعث میشود GCC خروجیای حاوی فراخوانیهای کتابخانهای برای عملیات ممیز شناور تولید کند. softfp اجازهٔ تولید کد با استفاده از دستورالعملهای سختافزاری ممیز شناور را میدهد، اما همچنان از قراردادهای فراخوانی soft-float استفاده میکند. hard امکان تولید دستورالعملهای ممیز شناور را فراهم کرده و از قراردادهای فراخوانی مخصوص FPU استفاده میکند.
مقدار پیشفرض به پیکربندی مشخص هدف بستگی دارد. توجه داشته باشید که ABIهای hard-float و soft-float از نظر پیونددهی سازگار نیستند؛ باید کل برنامهٔ خود را با یک ABI یکسان کامپایل کرده و با مجموعهای سازگار از کتابخانهها پیوند دهید.
- -mdouble-float
- -mno-double-float
- هنگامی که -mhard-float فعال است، تولید دستورالعملهای ممیز شناور با دقت مضاعف را فعال میکند. این حالت پیشفرض است، مگر هنگام کامپایل برای CK803.
- -mfdivdu
- -mno-fdivdu
- هنگامی که -mhard-float فعال است، تولید دستورالعملهای "frecipd"، "fsqrtd" و "fdivd" را فعال میکند. این حالت پیشفرض است، مگر هنگام کامپایل برای CK803.
- -mfpu=fpu
- پردازندهٔ ممیز شناور را انتخاب میکند. این گزینه تنها همراه با -mhard-float قابل استفاده است. مقادیر مجاز برای fpu عبارتند از: fpv2_sf (معادل -mno-double-float -mno-fdivdu)، fpv2 (-mdouble-float -mno-divdu)، و fpv2_divd (-mdouble-float -mdivdu).
- -melrw
- -mno-elrw
- دستورالعمل گسترشیافتهٔ "lrw" را فعال میکند. این گزینه برای CK801 بهطور پیشفرض فعال و در غیر این صورت غیرفعال است.
- -mistack
- -mno-istack
- دستورالعملهای
پشتهٔ وقفه
را فعال
میکند؛
پیشفرض
غیرفعال
است.
گزینهٔ -mistack برای رسیدگی به صفتهای تابع "interrupt" و "isr" الزامی است.
- -mmp
- -mno-mp
- دستورالعملهای چندپردازندهای را فعال میکند؛ پیشفرض غیرفعال است.
- -mcp
- -mno-cp
- دستورالعملهای کمکپردازنده را فعال میکند؛ پیشفرض غیرفعال است.
- -mcache
- -mno-cache
- دستورالعملهای کمکپردازنده را فعال میکند؛ پیشفرض غیرفعال است.
- -msecurity
- -mno-security
- دستورالعملهای امنیتی C-SKY را فعال میکند؛ پیشفرض غیرفعال است.
- -mtrust
- -mno-trust
- دستورالعملهای C-SKY trust را فعال میکند؛ پیشفرض غیرفعال است.
- -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" دستورالعمل. مقدار پیشفرض 1 است.
- -msched-prolog
- -mno-sched-prolog
- اجازه دادن به زمانبندی توالیهای مقدمه (prologue) و مؤخره (epilogue) توابع. استفاده از این گزینه میتواند منجر به تولید کدی شود که با نیازمندیهای مقدمه C-SKY V2 ABI سازگار نبوده و امکان دیباگ یا ردیابی پشته (backtrace) آن وجود نداشته باشد. این گزینه بهطور پیشفرض غیرفعال است.
- -msim
- -mno-sim
- پیوند دادن کتابخانه libsemi.a که با شبیهساز سازگار است. فقط برای کامپایلر ELF قابل اعمال است.
گزینههای Cygwin و MinGW
این گزینههای اضافی برای مقصدهای Microsoft Windows در دسترس هستند:
- -mconsole
- این گزینه مشخص میکند که یک برنامه کنسولی باید تولید شود، با دستور به پیونددهنده برای تنظیم نوع زیرسیستم در سرآیند PE که برای برنامههای کنسولی مورد نیاز است. این گزینه برای مقصدهای Cygwin و MinGW موجود است و بهطور پیشفرض در آن مقصدها فعال است.
- -mcrtdll=library
- پیشپردازش، کامپایل یا پیوند با library CRT DLL سی مشخصشده. این گزینه ماکروهای از پیش تعریفشده "__CRTDLL__"، "__MSVCRT__"، "_UCRT" و "__MSVCRT_VERSION__" را برای library CRT مشخصشده تنظیم میکند، فایل آغازین را برای library CRT انتخاب کرده و با library CRT پیوند برقرار میکند. نامهای شناختهشدهٔ کتابخانه CRT برای پیشپردازنده عبارتند از: "crtdll*"، "msvcrt10*"، "msvcrt20*"، "msvcrt40*"، "msvcr40*"، "msvcrtd*"، "msvcrt-os*"، "msvcr70*"، "msvcr71*"، "msvcr80*"، "msvcr90*"، "msvcr100*"، "msvcr110*"، "msvcr120*" و "ucrt*". اگر این گزینه مشخص نشود، کتابخانه واردات پیشفرض MinGW یعنی "msvcrt" برای پیوند استفاده میشود و هیچ تنظیم دیگری برای پیشپردازنده انجام نخواهد شد. کتابخانه واردات MinGW با نام "msvcrt" صرفاً یک پیوند نمادین به (یا یک کپی از) یک کتابخانه واردات CRT دیگر در MinGW است که در هنگام کامپایل MinGW انتخاب شده است. کتابخانه واردات MinGW با نام "msvcrt-os" مربوط به کتابخانه CRT DLL سیستم ویندوز یعنی "msvcrt.dll" است و در اکثر موارد کتابخانه واردات پیشفرض MinGW به شمار میرود. بهطور کلی، تغییر CRT DLL نیازمند کامپایل مجدد کل MinGW CRT است. این گزینه صرفاً برای مقاصد آزمایشی و تست در نظر گرفته شده است. این گزینه برای مقصدهای MinGW در دسترس است.
- -mdll
- این گزینه برای مقصدهای Cygwin و MinGW در دسترس است. این گزینه مشخص میکند که یک DLL---یک کتابخانه پیوند پویا (dynamic link library)---باید تولید شود، و انتخاب آبجکت راهاندازی زمان اجرا (runtime startup object) و نقطه ورود مورد نیاز را ممکن میسازد.
- -mnop-fun-dllimport
- این گزینه برای مقصدهای Cygwin و MinGW در دسترس است. این گزینه مشخص میکند که ویژگی "dllimport" باید نادیده گرفته شود.
- -mthreads
- پشتیبانی از مدیریت استثنای امن از ریسه (thread-safe) در MinGW. برنامههایی که به مدیریت استثنای امن از ریسه متکی هستند باید تمام کد را با گزینه -mthreads کامپایل و پیوند دهند. هنگام کامپایل، -mthreads ماکروی -D_MT را تعریف میکند؛ هنگام پیوند دادن، یک کتابخانه کمکی ریسه ویژه را با نام -lmingwthrd پیوند میدهد که دادههای مدیریت استثنا به ازای هر ریسه را پاکسازی میکند.
- -municode
- این گزینه برای مقصدهای MinGW-w64 در دسترس است. این گزینه موجب میشود که ماکروی پیشپردازنده "UNICODE" از پیش تعریف شود، و کد راهاندازی زمان اجرای سازگار با یونیکد را انتخاب میکند.
- -mwin32
- این گزینه برای مقصدهای Cygwin و MinGW در دسترس است. این گزینه مشخص میکند که ماکروهای از پیش تعریفشده متداول Microsoft Windows در پیشپردازنده تنظیم شوند، اما تأثیری در انتخاب کد راهاندازی/کتابخانه زمان اجرا ندارد.
- -mwindows
- این گزینه برای مقصدهای Cygwin و MinGW در دسترس است. این گزینه مشخص میکند که یک برنامه گرافیکی (GUI) با دستور به پیونددهنده برای تنظیم مناسب نوع زیرسیستم سرآیند PE تولید شود.
- -fno-set-stack-executable
- این گزینه برای مقصدهای MinGW در دسترس است. این گزینه مشخص میکند که پرچم قابل اجرا بودن برای پشتهٔ مورد استفاده توسط توابع تو در تو تنظیم نشود. این مورد برای باینریهایی که در حالت هسته (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
- استفاده از پوششهای Cygwin DLL برای پشتیبانی از عملگرهای C++ شامل "new" و "delete".
همچنین برای گزینههای استاندارد، بخش گزینههای x86 را ببینید.
گزینههای Darwin
این گزینهها برای همه معماریهایی که سیستمعامل Darwin را اجرا میکنند تعریف شدهاند.
نسخه FSF GCC در Darwin فایلهای آبجکت «fat» ایجاد نمیکند؛ بلکه یک فایل آبجکت برای تکمعماریای که GCC برای آن ساخته شده ایجاد میکند. نسخه Apple GCC در Darwin در صورتی که گزینههای متعدد -arch استفاده شوند فایلهای «fat» ایجاد میکند؛ این کار را با اجرای چندینباره کامپایلر یا پیونددهنده و متصل کردن نتایج به یکدیگر با lipo انجام میدهد.
زیرنوع (subtype) فایل ایجادشده (مانند ppc7400 یا ppc970 یا i686) توسط پرچمهایی تعیین میشود که ISA هدف GCC را مشخص میکنند، مانند -mcpu یا -march. گزینه -force_cpusubtype_ALL میتواند برای لغو این موضوع استفاده شود.
ابزارهای Darwin در هنگام مواجهه با عدم تطابق در ISA رفتارهای متفاوتی دارند. اسمبلر، as، تنها به دستورالعملهایی اجازه استفاده میدهد که برای زیرنوع فایلی که تولید میکند معتبر باشند، بنابراین نمیتوانید دستورالعملهای ۶۴-بیتی را در یک فایل آبجکت ppc750 قرار دهید. پیونددهنده کتابخانههای اشتراکی، /usr/bin/libtool، اگر خواسته شود کتابخانهای اشتراکی با زیرنوعی با محدودیت کمتر نسبت به فایلهای ورودیاش بسازد، شکست میخورد و خطایی چاپ میکند (برای نمونه، تلاش برای قرار دادن یک فایل آبجکت ppc970 در یک کتابخانه ppc7400). پیونددهنده فایلهای اجرایی، ld، در سکوت محدودکنندهترین زیرنوع را در بین هر کدام از فایلهای ورودیاش به فایل اجرایی اختصاص میدهد..IP -Fdir 4 افزودن دایرکتوری فریمورک dir به ابتدای فهرست دایرکتوریهایی که باید برای فایلهای سرآیند جستجو شوند. این دایرکتوریها با دایرکتوریهای مشخصشده توسط گزینههای -I در هم آمیخته میشوند و به ترتیب از چپ به راست پیمایش میشوند.
یک دایرکتوری فریمورک، دایرکتوریای حاوی فریمورکها است. یک فریمورک دایرکتوریای است که مستقیماً شامل دایرکتوری Headers و/یا PrivateHeaders بوده و نام آن به .framework ختم میشود. نام یک فریمورک، نام این دایرکتوری بدون پسوند .framework است. سرآیندهای مرتبط با فریمورک در یکی از این دو دایرکتوری یافت میشوند، که ابتدا Headers جستجو میشود. یک زیرفریمورک، دایرکتوری فریمورکی است که در دایرکتوری Frameworks یک فریمورک قرار دارد. گنجاندن سرآیندهای زیرفریمورک تنها میتواند در سرآیند فریمورکی ظاهر شود که حاوی آن زیرفریمورک است، یا در سرآیند یک زیرفریمورک همسطح. دو زیرفریمورک در صورتی همسطح هستند که در یک فریمورک قرار داشته باشند. یک زیرفریمورک نباید همنام با یک فریمورک باشد؛ در صورت نقض این مورد یک هشدار صادر میشود. در حال حاضر یک زیرفریمورک نمیتواند زیرفریمورک داشته باشد؛ در آینده ممکن است این سازوکار برای پشتیبانی از این قابلیت گسترش یابد. فریمورکهای استاندارد را میتوان در /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
- تولید کد برای افزونههای هستهٔ قابل بارگذاری در Darwin.
- -gused
- تولید اطلاعات اشکالزدایی برای نمادهایی که استفاده شدهاند. برای قالب اشکالزدایی stabs، این گزینه -feliminate-unused-debug-symbols را فعال میکند. این گزینه بهطور پیشفرض روشن است.
- -gfull
- تولید اطلاعات اشکالزدایی برای همهٔ نمادها و نوعها.
- -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
- تولید کد مناسب برای توسعه با چرخش سریع، به گونهای که به GDB اجازه دهد فایلهای .o را به صورت پویا در برنامههای در حال اجرا بارگذاری کند. گزینههای -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 را تنظیم میکند. این حالت همچنین برای اهداف PowerPC، گزینههای -mno-altivec، -msoft-float، -fno-builtin و -mlong-branch را تنظیم مینماید.
- -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 کدی تولید کند که با کد تولیدشده بدون این سوییچ، سازگاری باینری ندارد. استفاده از این سوییچ ممکن است نیازمند کامپایل مجدد تمام ماژولهای دیگر یک برنامه، از جمله کتابخانههای سیستمی باشد. از این سوییچ برای انطباق با یک مدل دادهٔ غیرپیشفرض استفاده کنید.
- -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 حاوی نویسههای غیرقابلحمل باشند. این هشدار بهطور پیشفرض فعال است.
- -all_load
- بارگذاری تمام اعضای کتابخانههای آرشیو ایستا. برای اطلاعات بیشتر به ld(1) مراجعه کنید.
- -arch_errors_fatal
- باعث میشود خطاهای مربوط به فایلهایی با معماری نادرست، مهلک تلقی شوند.
- -bind_at_load
- باعث میشود فایل خروجی به نحوی علامتگذاری شود که پیونددهندهٔ پویا هنگام بارگذاری یا اجرای فایل، تمام مراجع تعریفنشده را پیوند دهد.
- -bundle
- تولید یک فایل در قالب Mach-o bundle. برای اطلاعات بیشتر به ld(1) مراجعه کنید..IP "-bundle_loader executable" 4 این گزینه executable (فایل اجرایی) را مشخص میکند که فایل خروجیِ ساخت در حال پیوند را بارگذاری خواهد کرد. برای اطلاعات بیشتر صفحه راهنمای ld(1) را ببینید.
- -dynamiclib
- هنگام ارسال این گزینه، GCC در زمان پیوند به جای یک فایل اجرایی، با استفاده از دستور libtool در Darwin یک کتابخانه پویا تولید میکند.
- -force_cpusubtype_ALL
- این گزینه باعث میشود فایل خروجی GCC به جای زیرنوعی که با گزینه -mcpu یا -march کنترل میشود، دارای زیرنوع ALL باشد.
- -nodefaultrpaths
- مسیرهای اجرای (run paths) پیشفرض برای دایرکتوریهای کتابخانه کامپایلر را به فایلهای اجرایی، پیمانهها یا کتابخانههای پویا اضافه نمیکند. در macOS نسخه 10.5 و جدیدتر، مسیر اجرای جاسازیشده (runpath) بهطور پیشفرض افزوده میشود، مگر اینکه کاربر -nodefaultrpaths را به خط پیوند اضافه کند. مسیرهای اجرا برای ساخت در macOS نسخه 10.11 یا بالاتر مورد نیاز هستند (و به همین دلیل اجباری شدهاند).
- -nodefaultexport
- صادرات نمادهای (symbol exports) پیشفرض را به پیمانهها یا کتابخانههای پویا اضافه نمیکند.
- -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) و مقادیر استثنایی 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
- این گزینه تعیین میکند چه تلههای مرتبط با ممیز شناوری فعال شوند. کامپایلرهای دیگر Alpha این گزینه را -fptm trap-mode مینامند. حالت تله را میتوان بر روی یکی از چهار مقدار زیر تنظیم کرد:
- n
- این مقدار پیشفرض (عادی یا normal) است. تنها تلههایی که فعال میشوند آنهایی هستند که نمیتوان آنها را در نرمافزار غیرفعال کرد (برای نمونه، تله تقسیم بر صفر)..IP u 4 علاوه بر تلههای فعالشده توسط n، تلههای زیرریز (underflow) نیز فعال میشوند.
- su
- مشابه u، اما دستورالعملها به گونهای علامتگذاری میشوند که برای تکمیل نرمافزاری ایمن باشند (برای جزئیات به راهنمای معماری Alpha مراجعه کنید).
- sui
- مشابه su، اما تلههای نادقیق (inexact) نیز فعال میشوند.
- -mfp-rounding-mode=rounding-mode
- حالت گرد کردن IEEE را مشخص میکند. سایر کامپایلرهای Alpha این گزینه را -fprm rounding-mode مینامند. مقدار rounding-mode میتواند یکی از موارد زیر باشد:
- n
- حالت گرد کردن عادی IEEE. اعداد ممیز شناور به سمت نزدیکترین عدد ماشین یا در صورت تساوی، به سمت عدد ماشین زوج گرد میشوند.
- m
- گرد کردن به سمت منفی بینهایت.
- c
- حالت گرد کردن مقطوع (Chopped). اعداد ممیز شناور به سمت صفر گرد میشوند.
- d
- حالت گرد کردن پویا (Dynamic). یک فیلد در ثبات کنترلی ممیز شناور (fpcr، به راهنمای مرجع معماری Alpha مراجعه کنید) حالت گرد کردن فعال را کنترل میکند. کتابخانه استاندارد C این ثبات را برای گرد کردن به سمت مثبت بینهایت مقداردهی اولیه میکند. بنابراین، مگر اینکه برنامه شما fpcr را تغییر دهد، d معادل گرد کردن به سمت مثبت بینهایت خواهد بود.
- -mtrap-precision=trap-precision
- در معماری Alpha، تلههای ممیز شناور نادقیق (imprecise) هستند. این بدان معناست که بدون کمک نرمافزاری، بازیابی از یک تله ممیز شناور غیرممکن است و اجرای برنامه معمولاً باید متوقف شود. کامپایلر GCC میتواند کدی تولید کند که به گردانندههای تله در سیستمعامل برای تعیین محل دقیقی که باعث تله ممیز شناور شده است، کمک کند. بسته به نیازمندیهای یک برنامه، سطوح متفاوتی از دقت را میتوان انتخاب کرد:
- p
- دقت در سطح برنامه (Program precision). این گزینه پیشفرض است و بدان معناست که گرداننده تله فقط میتواند تشخیص دهد کدام برنامه باعث بروز استثنای ممیز شناور شده است.
- f
- دقت در سطح تابع (Function precision). گرداننده تله میتواند تابعی را که باعث بروز استثنای ممیز شناور شده است تعیین کند.
- i
- دقت در سطح دستورالعمل (Instruction precision). گرداننده تله میتواند دستورالعمل دقیقی را که باعث ایجاد استثنای ممیز شناور شده است تعیین کند.
سایر کامپایلرهای Alpha گزینههای معادلی به نامهای -scope_safe و -resumption_safe ارائه میدهند.
- -mieee-conformant
- این گزینه کد تولید شده را به عنوان منطبق بر IEEE علامتگذاری میکند. نباید از این گزینه استفاده کنید مگر اینکه -mtrap-precision=i و همچنین یکی از گزینههای -mfp-trap-mode=su یا -mfp-trap-mode=sui را مشخص کرده باشید. تنها اثر آن، درج خط .eflag 48 در مقدمه تابع (function prologue) فایل اسمبلی تولید شده است.
- -mbuild-constants
- به طور
معمول GCC یک
مقدار ثابت
صحیح ۳۲ یا
۶۴ بیتی را
بررسی
میکند تا
ببیند آیا
میتواند
آن را از
ثوابت
کوچکتر در
دو یا سه
دستورالعمل
بسازد یا
خیر. اگر
نتواند،
مقدار ثابت
را به صورت
یک لیترال
(literal) در خروجی
قرار داده و
کدی برای
بارگذاری
آن از بخش
داده در
زمان اجرا
تولید
میکند.
از این گزینه برای ملزم کردن 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 باید کدی ایمن در برابر چندریسمانی (multi-thread) و سیگنالهای ناهمگام (async-signal) برای دسترسیهای حافظه بایت و کلمه تراز شده (aligned word) تولید کند یا خیر.
- -msafe-partial
- -mno-safe-partial
- مشخص میکند که آیا GCC باید کدی ایمن در برابر چندریسمانی و سیگنالهای ناهمگام برای دسترسیهای جزئی به حافظه تولید کند یا خیر؛ شامل دسترسیهای تکهتکه به دادههای ترازنشده و همچنین دسترسیهای بلوکی به بخشهای ابتدایی و انتهایی انواع تجمیعی (aggregate types) یا سایر اشیاء در حافظه که به ترتیب در یک مرز داده ۶۴ بیتی تراز شده شروع یا پایان نمییابند.
- -mfloat-vax
- -mfloat-ieee
- تولید کدی که به جای دقتهای یگانه و دوگانه IEEE، از محاسبات ممیز شناور VAX F و G استفاده میکند (یا استفاده نمیکند).
- -mexplicit-relocs
- -mno-explicit-relocs
- اسمبلرهای قدیمیتر Alpha روشی به جز ماکروهای اسمبلر برای تولید بازنشانیهای نماد (symbol relocations) ارائه نمیکردند. استفاده از این ماکروها مانع زمانبندی بهینه دستورالعملها میشود. بسته GNU Binutils از نگارش 2.12 از نحو جدیدی پشتیبانی میکند که به کامپایلر امکان میدهد به صورت صریح مشخص کند کدام بازنشانیها باید بر روی کدام دستورالعملها اعمال شوند. این گزینه بیشتر برای اشکالزدایی مفید است، زیرا GCC هنگام کامپایل شدن، قابلیتهای اسمبلر را تشخیص میدهد و مقدار پیشفرض را متناسب با آن تنظیم میکند.
- -msmall-data
- -mlarge-data
- هنگامی که
-mexplicit-relocs فعال
باشد،
دادههای
ایستا از
طریق
بازنشانیهای
gp-relative در
دسترس قرار
میگیرند.
وقتی از -msmall-data
استفاده
میشود،
اشیایی به
طول ۸ بایت
یا کوچکتر
در یک ناحیه
داده کوچک
(small data area، یعنی
بخشهای
".sdata" و
".sbss")
قرار
میگیرند و
از طریق
بازنشانیهای
۱۶ بیتی
نسبت به
ثبات $gp
در دسترس
خواهند بود.
این امر
اندازه
ناحیه داده
کوچک را به
۶۴
کیلوبایت
محدود
میکند،
اما اجازه
میدهد
متغیرها
مستقیماً
از طریق یک
دستورالعمل
در دسترس
باشند.
پیشفرض -mlarge-data است. با این گزینه ناحیه داده به کمی کمتر از ۲ گیگابایت محدود میشود. برنامههایی که به بیش از ۲ گیگابایت داده نیاز دارند باید به جای بخش داده برنامه، از "malloc" یا "mmap" برای تخصیص داده در هیپ استفاده کنند.
هنگام تولید کد برای کتابخانههای مشترک، -fpic متضمن -msmall-data و -fPIC متضمن -mlarge-data است.
- -msmall-text
- -mlarge-text
- هنگامی که
-msmall-text
استفاده
میشود،
کامپایلر
فرض میکند
که کد کل
برنامه (یا
کتابخانه
مشترک) در ۴
مگابایت
جای
میگیرد و
بنابراین
با یک دستور
انشعاب (branch instruction)
قابل
دستیابی
است. هنگامی
که -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) همچنین از مقدار native پشتیبانی میکنند که بهترین گزینه معماری را برای پردازنده میزبان انتخاب میکند. اگر GCC پردازنده را شناسایی نکند، -mcpu=native هیچ تأثیری نخواهد داشت.
- -mtune=cpu_type
- تنها
پارامترهای
زمانبندی
دستورالعمل
را برای نوع
ماشین cpu_type
تنظیم
میکند.
مجموعه
دستورالعمل
تغییری
نمیکند.
زنجیرهابزارهای بومی همچنین از مقدار native پشتیبانی میکنند که بهترین گزینه معماری را برای پردازنده میزبان انتخاب میکند. اگر GCC پردازنده را شناسایی نکند، -mtune=native هیچ تأثیری نخواهد داشت.
- -mmemory-latency=time
- میزان
تأخیری را
تنظیم
میکند که
زمانبند
باید برای
مراجعات
معمول به
حافظه،
همانطور
که توسط
برنامه
کاربردی
دیده
میشود، در
نظر بگیرد.
این عدد تا
حد زیادی به
الگوهای
دسترسی به
حافظه مورد
استفاده
توسط
برنامه و
اندازه
حافظه نهان
(cache) خارجی روی
ماشین
وابسته است.
گزینههای معتبر برای time عبارتند از:
- number
- یک عدد دهدهی که نشاندهنده چرخههای ساعت است.
- L1
- L2
- L3
- main
- کامپایلر حاوی تخمینهایی از تعداد چرخههای ساعت برای سختافزار «معمول» EV4 و EV5 برای حافظههای نهان سطح ۱، ۲ و ۳ (که Dcache، Scache و Bcache نیز نامیده میشوند) و همچنین حافظه اصلی است. توجه داشته باشید که L3 فقط برای EV5 معتبر است.
- -mtls-kernel
- به جای "rduniq"، دستور "rdval" را برای اشارهگر ریسه تولید میکند.
- -mtls-size=bitsize
- اندازه بیتی آفستهای بیدرنگ TLS را مشخص میکند. مقادیر معتبر برای bitsize عبارتند از 16، 32 و 64؛ مقدار پیشفرض آن 32 است.
- -mlong-double-128
- -mlong-double-64
- اندازه نوع داده "long double" را مشخص میکند. توجه داشته باشید که -mlong-double-128 با ممیز شناور VAX ناسازگار است.
گزینههای eBPF
- -mframe-limit=bytes
- حد قطعی اندازه فریمها را بر حسب بایت مشخص میکند. در حال حاضر، مقداری که میتوان مشخص کرد باید کمتر یا مساوی با 32767 باشد. مقدار پیشفرض، مقداری است که توسط نسخه هدف هسته لینوکس تعیین شده است.
- -mbig-endian
- تولید کد برای هدف بزرگپایان (big-endian).
- -mlittle-endian
- تولید کد برای هدف کوچکپایان (little-endian). این مقدار پیشفرض است.
- -mjmpext
- -mno-jmpext
- فعال یا غیرفعال کردن تولید دستورالعملهای پرش شرطی اضافی. برای CPU v2 و بالاتر فعال است.
- -mjmp32
- -mno-jmp32
- فعال یا غیرفعال کردن تولید دستورالعملهای پرش ۳۲ بیتی. برای CPU v3 و بالاتر فعال است.
- -malu32
- -mno-alu32
- فعال یا غیرفعال کردن تولید دستورالعملهای ۳۲ بیتی ALU. برای CPU v3 و بالاتر فعال است.
- -mv3-atomics
- -mno-v3-atomics
- فعال یا غیرفعال کردن دستورالعملهای عملیات اتمیک عمومی معرفیشده در CPU v3. برای CPU v3 و بالاتر فعال است.
- -mbswap
- -mno-bswap
- فعال یا غیرفعال کردن دستورالعملهای وارونسازی بایت (byte swap). برای CPU v4 و بالاتر فعال است.
- -msdiv
- -mno-sdiv
- فعال یا غیرفعال کردن دستورالعملهای تقسیم علامتدار و باقیمانده (modulus). برای CPU v4 و بالاتر فعال است..IP -msmov 4
- -mno-smov
- فعال یا غیرفعال کردن دستورالعملهای انتقال با گسترش علامت و بارگذاری از حافظه. برای CPU نسخهٔ v4 و بالاتر فعال است.
- -mcpu=version
- مشخص
میکند که
کدام نسخه
از eBPF ISA هدف
قرار گیرد.
ممکن است
نسخههای
جدیدتر
توسط همهٔ
هستهها
پشتیبانی
نشوند.
پیشفرض v4
است.
مقادیر پشتیبانیشده برای version عبارتند از:
- v1
- نخستین eBPF ISA پایدار بدون هیچ ویژگی خاص یا افزونهای.
- v2
- پشتیبانی از افزونههای پرش، همانند آنچه در -mjmpext آمده است.
- v3
- تمام ویژگیهای v2، بهعلاوهٔ:
- -<عملیاتهای پرش ۳۲ بیتی، مانند -mjmp32>
- -<عملیاتهای ALU ۳۲ بیتی، مانند -malu32>
- -<عملیاتهای اتمی عمومی، مانند -mv3-atomics>
- v4
- تمام ویژگیهای v3، بهعلاوهٔ:
- -<دستورالعملهای تعویض بایت، مانند -mbswap>
- -<دستورالعملهای تقسیم و باقیمانده علامتدار، مانند -msdiv>
- -<دستورالعملهای انتقال با گسترش علامت و بارگذاری از حافظه، مانند -msmov>
- -mco-re
- -mno-co-re
- فعال یا غیرفعال کردن پشتیبانی از BPF Compile Once - Run Everywhere (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 همواره باید بهصورت درونخطی بسط داده شوند. عملیاتی که با اندازههای بزرگتر از این آستانه سر و کار دارند، باید به جای بسط درونخطی با استفاده از فراخوانی کتابخانه پیادهسازی شوند؛ اما از آنجا که BPF اجازهٔ فراخوانیهای کتابخانهای (libcalls) را نمیدهد، فراتر رفتن از این آستانه منجر به خطای زمان کامپایل میشود. مقدار پیشفرض 1024 بایت است.
- -Wco-re
- فعال کردن هشدارها برای شرایطی که -mco-re فعال است، اما ممکن است تولید کد سازگار با CO-RE امکانپذیر نباشد.
گزینههای FR30
این گزینهها بهطور خاص برای پورت FR30 تعریف شدهاند.
- -msmall-model
- استفاده از مدل فضای آدرس کوچک. این گزینه میتواند کد کوچکتری تولید کند، اما فرض میکند که تمامی مقادیر نمادین و آدرسها در یک محدودهٔ ۲۰ بیتی جای میگیرند.
- -mno-lsim
- فرض را بر این میگذارد که پشتیبانی زمان اجرا فراهم شده است و بنابراین نیازی به گنجاندن کتابخانهٔ شبیهساز (libsim.a) در خط فرمان پیونددهنده نیست.
گزینههای FRV
- -mgpr-32
- تنها از ۳۲ ثبات همهمنظوره نخست استفاده شود.
- -mgpr-64
- از تمام ۶۴ ثبات همهمنظوره استفاده شود.
- -mfpr-32
- تنها از ۳۲ ثبات ممیز شناور نخست استفاده شود.
- -mfpr-64
- از تمام ۶۴ ثبات ممیز شناور استفاده شود.
- -mhard-float
- استفاده از دستورالعملهای سختافزاری برای عملیات ممیز شناور.
- -msoft-float
- استفاده از روالهای کتابخانهای برای عملیات ممیز شناور.
- -malloc-cc
- تخصیص پویای ثباتهای کد وضعیت.
- -mfixed-cc
- برای تخصیص پویای ثباتهای کد وضعیت تلاش نشود، تنها از "icc0" و "fcc0" استفاده شود.
- -mdword
- -mno-dword
- کنترل اینکه آیا ABI از دستورالعملهای کلمهٔ مضاعف (double-word) استفاده کند یا خیر.
- -mdouble
- -mno-double
- فعال یا غیرفعال کردن استفاده از دستورالعملهای ممیز شناور با دقت مضاعف (double).
- -mmedia
- -mno-media
- فعال یا غیرفعال کردن استفاده از دستورالعملهای چندرسانهای (media).
- -mmuladd
- -mno-muladd
- فعال یا غیرفعال کردن استفاده از دستورالعملهای ضرب و جمع/تفریق.
- -mfdpic
- انتخاب ABI مربوط به FDPIC، که از توصیفکنندههای تابع برای نمایش اشارهگرها به توابع استفاده میکند. بدون گزینههای مرتبط با PIC/PIE، متضمن -fPIE است. با -fpic یا -fpie، فرض میکند که ورودیهای GOT و دادههای کوچک در محدودهٔ ۱۲ بیتی از آدرس پایهٔ GOT قرار دارند؛ با -fPIC یا -fPIE، آفستهای GOT بهصورت ۳۲ بیتی محاسبه میشوند. در هدف bfin-elf، این گزینه متضمن -msim است..IP -minline-plt 4 فعالسازی درونخطی کردن (inlining) مدخلهای PLT در فراخوانی توابعی که مشخص نیست پیوند محلی دارند یا خیر. این گزینه بدون -mfdpic هیچ تأثیری ندارد. در صورت بهینهسازی برای سرعت و کامپایل برای کتابخانههای اشتراکی (یعنی -fPIC یا -fpic)، یا هنگامی که یک گزینه بهینهسازی مانند -O3 یا بالاتر در خط فرمان مشخص شده باشد، بهطور پیشفرض فعال است.
- -mTLS
- فرض کردن یک قطعه بزرگ TLS هنگام تولید کد thread-local.
- -mtls
- عدم فرض یک قطعه بزرگ TLS هنگام تولید کد thread-local.
- -mgprel-ro
- فعالسازی استفاده از بازنشانیهای "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 در بسته قبلی. این گزینه تنها زمانی تأثیر دارد که بستهبندی 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
- فعال یا
غیرفعال
کردن
استفاده از
اجرای شرطی
(conditional execution)؛ این
گزینه
بهطور
پیشفرض
فعال است.
این سوئیچ عمدتاً برای اشکالزدایی کامپایلر است و احتمالاً در نگارشهای آینده حذف خواهد شد.
- -mvliw-branch
- -mno-vliw-branch
- فعال یا
غیرفعال
کردن یک گام
بهینهسازی
برای
بستهبندی
انشعابها
در
دستورالعملهای
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
- عدم تولید کدی که حافظه برنامه را میخواند.
گزینههای GNU/Linux
این گزینههای -m برای مقصدهای GNU/Linux تعریف شدهاند:
- -mglibc
- استفاده از کتابخانه GNU C. این حالت پیشفرض است بهجز در مقصدهای *-*-linux-*uclibc*، *-*-linux-*musl* و *-*-linux-*android*..IP -muclibc 4 استفاده از کتابخانهٔ C بنام uClibc. این گزینه روی اهداف *-*-linux-*uclibc* پیشفرض است.
- -mmusl
- استفاده از کتابخانهٔ C بنام musl. این گزینه روی اهداف *-*-linux-*musl* پیشفرض است.
- -mbionic
- استفاده از کتابخانهٔ C بنام 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؛ یعنی ارسال گزینههای پیوند استاندارد Linux به پیونددهنده.
گزینههای H8/300
این گزینههای -m برای پیادهسازیهای H8/300 تعریف شدهاند:
- -mrelax
- کوتاهتر کردن برخی از ارجاعات آدرس در زمان پیوند، در صورت امکان؛ از گزینهٔ -relax پیونددهنده استفاده میکند.
- -mh
- تولید کد برای H8/300H.
- -ms
- تولید کد برای H8S.
- -mn
- تولید کد برای H8S و H8/300H در حالت عادی (normal mode). این سوییچ باید همراه با -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
- تولید libcallها
برای
بارگذاریها
و
ذخیرهسازیهای
اتمی در
زمان
غیرفعال
بودن
فراخوانیهای
sync. این گزینه
بهطور
پیشفرض
فعال است.
این گزینه
فقط بر
تولید
فراخوانیهای
کتابخانهای
اتمی توسط
بخش پشتی HPPA
تأثیر
میگذارد.
هر دو پیادهسازی فراخوانی کتابخانهای sync و libatomic از قفلگذاری استفاده میکنند. در نتیجه، ذخیرهسازیهای پردازنده نسبت به سایر عملیات اتمی، اتمی محسوب نمیشوند. بارگذاریهای پردازنده تا سقف DImode نسبت به سایر عملیات اتمی در صورتی که بهصورت یک دسترسی یکتا پیادهسازی شوند، اتمی هستند.
معماری PA-RISC در سختافزار از هیچ عملیات اتمی بهجز دستورالعمل "ldcw" پشتیبانی نمیکند. بنابراین، تمام پشتیبانیهای اتمی با استفاده از فراخوانیهای کتابخانهای sync و atomic پیادهسازی شدهاند. پشتیبانی فراخوانی کتابخانهای sync در libgcc.a و پشتیبانی فراخوانی کتابخانهای atomic در 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` مشاهده کرد. این گزینه تنها روی HP-UX GCC ۶۴ بیتی، یعنی پیکربندیشده با 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` چاپ کرد. این گزینه تنها در GCC ۶۴-بیتی HP-UX، یعنی پیکربندیشده با hppa*64*-*-hpux*، در دسترس است.
- -mlinker-opt
- فعالسازی مرحلهٔ بهینهسازی در پیونددهندهٔ HP-UX. توجه داشته باشید که این کار اشکالزدایی نمادین (symbolic debugging) را غیرممکن میکند.
- -mlong-calls
- تولید کدی
که از
توالیهای
فراخوانی
طولانی (long call)
استفاده
میکند. این
کار تضمین
میکند که
یک
فراخوانی
همواره
بتواند به
stubهای
تولیدشده
توسط
پیونددهنده
برسد. حالت
پیشفرض
این است که
فراخوانیهای
طولانی
تنها زمانی
تولید شوند
که فاصله از
محل
فراخوانی
تا ابتدای
تابع یا
واحد
ترجمه،
بسته به
مورد، از حد
از پیش
تعیینشدهای
که با نوع
انشعابِ
مورداستفاده
مشخص شده،
فراتر رود.
محدودیتها
برای
فراخوانیهای
عادی
بهترتیب
۷٬۶۰۰٬۰۰۰
و ۲۴۰٬۰۰۰
بایت برای
معماریهای
PA 2.0 و PA 1.X است.
فراخوانیهای
همنیا (sibling calls)
همیشه به
۲۴۰٬۰۰۰
بایت محدود
هستند.
هنگام استفاده از گزینهٔ -ffunction-sections، یا هنگام استفاده از گزینههای -mgas و -mno-portable-runtime همراه با یکدیگر تحت HP-UX با پیونددهندهٔ SOM، فواصل از ابتدای توابع اندازهگیری میشوند.
معمولاً استفاده از این گزینه مطلوب نیست چرا که کارایی را کاهش میدهد. با این حال، ممکن است در برنامههای بزرگ، بهویژه هنگامی که برای ساخت برنامه از پیونددهی جزئی (partial linking) استفاده میشود، مفید باشد.
انواع فراخوانیهای طولانیِ استفادهشده به قابلیتهای اسمبلر و پیونددهنده و نوع کد تولیدی بستگی دارد. تأثیر آن در سیستمهایی که از فراخوانیهای مطلق طولانی، و فراخوانیهای طولانی PIC بر اساس تفاوت نماد یا مرتبط با PC پشتیبانی میکنند باید نسبتاً اندک باشد. با این حال، در سیستمهای ۳۲-بیتی ELF در کد PIC از یک فراخوانی غیرمستقیم استفاده میشود که بسیار طولانی است.
- -mlong-load-store
- تولید توالیهای بارگذاری و ذخیرهسازی ۳-دستوری، آنطور که گاهی توسط پیونددهندهٔ HP-UX 10 موردنیاز است. این معادل گزینهٔ +k در کامپایلرهای HP است.
- -mno-space-regs
- تولید کدی
با این فرض
که مقصد
فاقد
ثباتهای
فضا (space registers) است.
این به GCC
اجازه
میدهد
فراخوانیهای
غیرمستقیم
سریعتری
تولید کند و
از
حالتهای
آدرسدهی
اندیس بدون
مقیاس
استفاده
نماید.
چنین کدی برای سیستمهای PA سطح ۰ و کرنلها مناسب است.
- -mordered
- فرض میکند که ارجاعات به حافظه مرتب هستند و نیازی به موانع (barriers) نیست.
- -mportable-runtime
- استفاده از قراردادهای فراخوانی قابلحمل پیشنهادشده توسط HP برای سیستمهای ELF.
- -mschedule=cpu-type
- زمانبندی کد بر اساس محدودیتهای نوع ماشین cpu-type. گزینههای انتخابی برای cpu-type عبارتند از 700، 7100، 7100LC، 7200، 7300 و 8000. برای تعیین گزینهٔ زمانبندی مناسب برای ماشین خود، به /usr/lib/sched.models در یک سیستم HP-UX مراجعه کنید. زمانبندی پیشفرض 8000 است.
- -msio
- -mwsio
- گزینهٔ -msio پیشتعریف "_SIO" را برای IO سرور تولید میکند. پیشفرض -mwsio است. این گزینه پیشتعریفهای "__hp9000s700"، "__hp9000s700__" و "_WSIO" را برای IO ایستگاه کاری تولید میکند. این گزینهها تحت HP-UX و HI-UX در دسترس هستند.
- -msoft-float
- تولید
خروجیِ
حاوی
فراخوانیهای
کتابخانهای
برای ممیز
شناور.
هشدار:
کتابخانههای
ضروری برای
تمام
مقصدهای HPPA
در دسترس
نیستند.
معمولاً از
امکانات
کامپایلر C
عادی ماشین
استفاده
میشود،
اما این کار
نمیتواند
مستقیماً
در کامپایل
متقابل
انجام شود.
باید
تمهیدات
لازم را
برای فراهم
کردن توابع
کتابخانهای
مناسب جهت
کامپایل
متقابل در
نظر بگیرید.
گزینهٔ -msoft-float قرارداد فراخوانی را در فایل خروجی تغییر میدهد؛ بنابراین تنها در صورتی مفید است که تمام یک برنامه را با این گزینه کامپایل کنید. بهویژه برای کارکرد صحیح آن، باید libgcc.a (کتابخانهای که همراه GCC ارائه میشود) را با -msoft-float کامپایل کنید.
- -msoft-mult
- استفاده از
ضرب
نرمافزاری
اعداد صحیح.
این گزینه استفاده از دستورالعمل "xmpyu" را غیرفعال میکند.
- -munix=unix-std
- تولید
پیشتعریفهای
کامپایلر و
انتخاب یک
فایل
آغازین
برای
استاندارد
مشخصشدهٔ
UNIX.
گزینههای
انتخابی
برای unix-std
عبارتند از
93، 95 و 98.
مقدار 93 در
تمام
نسخههای HP-UX
پشتیبانی
میشود.
مقدار 95 در HP-UX
10.10 و جدیدتر
در دسترس
است. مقدار
98 در HP-UX 11.11 و
جدیدتر
موجود است.
مقادیر
پیشفرض
عبارتند از
93 برای HP-UX 10.00،
مقدار 95
برای HP-UX 10.10 تا
11.00، و 98 برای HP-UX
11.11 و جدیدتر.
گزینهٔ -munix=93 همان پیشتعریفهای GCC 3.3 و 3.4 را فراهم میکند. گزینهٔ -munix=95 پیشتعریفهای اضافی برای "XOPEN_UNIX" و "_XOPEN_SOURCE_EXTENDED" و فایل آغازین unix95.o را فراهم میآورد. گزینهٔ -munix=98 پیشتعریفهای اضافی برای "_XOPEN_UNIX"، "_XOPEN_SOURCE_EXTENDED"، "_INCLUDE__STDC_A1_SOURCE" و "_INCLUDE_XOPEN_SOURCE_500" و فایل آغازین unix98.o را فراهم میکند.
مهم است توجه شود که این گزینه رابطهای روتینهای کتابخانهای گوناگون را تغییر میدهد. همچنین رفتار عملیاتی کتابخانهٔ C را تحت تأثیر قرار میدهد. بنابراین، در استفاده از این گزینه به دقت بسیار زیادی نیاز است.
کد کتابخانهای که قصد دارد با بیش از یک استاندارد UNIX کار کند باید متغیر "__xpg4_extended_mask" را بر حسب نیاز بررسی، تنظیم و بازیابی کند. بیشتر نرمافزارهای GNU این قابلیت را ارائه نمیدهند.
- -nolibdld
- جلوگیری از تولید گزینههای پیونددهی برای جستجوی libdld.sl هنگامی که گزینهٔ -static در HP-UX 10 و جدیدتر مشخص شده باشد.
- -static
- پیادهسازی
"setlocale" در
کتابخانهٔ C
در HP-UX دارای
وابستگی به
libdld.sl است.
نسخهٔ
بایگانیشدهای
از libdld.sl وجود
ندارد.
بنابراین،
هنگامی که
گزینهٔ -static
مشخص
میشود،
گزینههای
پیونددهی
ویژهای
برای رفع
این
وابستگی
موردنیاز
است.
در HP-UX 10 و جدیدتر، راهانداز GCC گزینههای لازم برای پیوند با libdld.sl را در صورت مشخص شدن گزینهٔ -static اضافه میکند. این امر باعث میشود باینری حاصل پویا باشد. در پورت ۶۴-بیتی، پیونددهندهها در هر حال بهطور پیشفرض باینریهای پویا تولید میکنند. میتوان از گزینهٔ -nolibdld برای جلوگیری از اضافه کردن این گزینههای پیونددهی توسط راهانداز GCC استفاده کرد.
- -threads
- افزودن پشتیبانی از چندریسمانی (multithreading) با کتابخانهٔ dce thread تحت HP-UX. این گزینه پرچمها را هم برای پیشپردازنده و هم برای پیونددهنده تنظیم میکند.
گزینههای IA-64 (IA-64 Options)
اینها گزینههای -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) استفاده نمیکند. نتیجه، کد مستقل از موقعیت نخواهد بود و 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) ثابت و یکتا استفاده میکند. این گزینه هنگام کامپایل کردن کد هسته (kernel) مفید است.
- -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 مفید باشد.
- -mearly-stop-bits
- -mno-early-stop-bits
- اجازه میدهد stop bitها زودتر از دستورالعملی که بلافاصله پیش از دستور راهانداز stop bit است قرار گیرند. این کار میتواند زمانبندی دستورالعملها را بهبود بخشد، اما نه لزوماً در همه شرایط.
- -mfixed-range=register-range
- تولید کدی که با بازه ثباتهای مشخصشده مانند ثباتهای ثابت رفتار میکند. ثبات ثابت ثباتی است که تخصیصدهنده ثبات (register allocator) نمیتواند از آن استفاده کند. این گزینه هنگام کامپایل کد هسته کاربرد دارد. بازه ثباتها با دو ثبات جداشده با یک خط پیوند مشخص میشود. چندین بازه ثبات را میتوان با کاما جدا کرد.
- -mtls-size=tls-size
- مشخص کردن اندازه بیتی آفستهای بیواسطه (immediate) در TLS. مقادیر معتبر عبارتند از 14، 22 و 64.
- -mtune=cpu-type
- تنظیم دقیق زمانبندی دستورالعملها برای یک پردازنده خاص. مقادیر معتبر عبارتند از itanium، itanium1، merced، itanium2 و mckinley.
- -milp32
- -mlp64
- تولید کد برای یک محیط ۳۲بیتی یا ۶۴بیتی. محیط ۳۲بیتی، int، long و اشارهگر را روی ۳۲ بیت تنظیم میکند. محیط ۶۴بیتی، int را روی ۳۲ بیت و long و اشارهگر را روی ۶۴ بیت تنظیم میکند. اینها پرچمهای اختصاصی 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
- قرار دادن یک بیت توقف (stop bit) پس از هر چرخه هنگام زمانبندی. این گزینه بهطور پیشفرض فعال است.
- -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
- تولید بررسیها برای گمانهزنی کنترلی در زمانبندی انتخابی. این پرچم بهطور پیشفرض غیرفعال است.
- -msched-max-memory-insns=max-insns
- محدود کردن تعداد دستورالعملهای حافظه در هر گروه دستورالعمل، با دادن اولویت کمتر به دستورالعملهای حافظه بعدی که سعی در زمانبندی در همان گروه دستورالعمل دارند. غالباً برای جلوگیری از تداخلهای بانک حافظه نهان مفید است. مقدار پیشفرض 1 است.
- -msched-max-memory-insns-hard-limit
- -mno-sched-max-memory-insns-hard-limit
- محدودیت مشخصشده توسط msched-max-memory-insns را به یک محدودیت سخت (hard limit) تبدیل میکند، و وجود بیش از آن تعداد را در یک گروه دستورالعمل مجاز نمیداند. در غیر این صورت، این حد «نرم» (soft) است؛ بدین معنی که با رسیدن به حد مجاز، عملیاتهای غیرحافظهای ترجیح داده میشوند، اما عملیاتهای حافظه همچنان ممکن است زمانبندی شوند.
گزینههای LM32
این گزینههای -m برای معماری LatticeMico32 تعریف شدهاند:
- -mbarrel-shift-enabled
- فعال کردن دستورالعملهای جابجایی بشکهای (barrel-shift).
- -mdivide-enabled
- فعال کردن دستورالعملهای تقسیم و باقیمانده (modulus).
- -mmultiply-enabled
- فعال کردن دستورالعملهای ضرب.
- -msign-extend-enabled
- فعال کردن دستورالعملهای گسترش علامت (sign extend).
- -muser-enabled
- فعال کردن دستورالعملهای تعریفشده توسط کاربر.
گزینههای LoongArch
این گزینههای خط فرمان برای مقصدهای LoongArch تعریف شدهاند:
- -march=arch-type
- تولید
دستورالعملها
برای نوع
ماشین arch-type.
-march=arch-type به GCC
اجازه
میدهد کدی
تولید کند
که ممکن است
روی
پردازندههایی
غیر از نوع
مشخصشده
اصلاً اجرا
نشود.
انتخابها برای arch-type عبارتند از:
- native
- نوع پردازنده محلی که توسط کامپایلر بومی تشخیص داده میشود.
- loongarch64
- پردازنده عمومی ۶۴ بیتی LoongArch.
- la464
- پردازنده مبتنی بر LA464 در LoongArch به همراه LSX و LASX.
- la664
- پردازنده مبتنی بر LA664 در LoongArch به همراه LSX و LASX و تمام دستورالعملهای نسخه ۱.۱ LoongArch.
- la64v1.0
- معماری LoongArch64 نسخه ISA 1.0.
- la64v1.1
- معماری LoongArch64 نسخه ISA 1.1.
- la32v1.0
- معماری LoongArch32 نسخه ISA 1.0.
- la32rv1.0
- معماری LoongArch32 کاهشیافته (Reduced ISA) نسخه 1.0.
اطلاعات بیشتر درباره نسخههای ISA برای LoongArch را میتوانید در https://github.com/loongson/la-toolchain-conventions بیابید.
- -mtune=tune-type
- بهینهسازی
کد
تولیدشده
برای
پردازنده
مقصد
دادهشده.
انتخابها برای tune-type عبارتند از:
- native
- نوع پردازنده محلی که توسط کامپایلر بومی تشخیص داده میشود.
- generic
- پردازنده عمومی LoongArch.
- loongarch64
- پردازنده عمومی ۶۴ بیتی LoongArch.
- la464
- هسته LA464 در LoongArch.
- la664
- هسته LA664 در LoongArch.
- 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
- فعالسازی تولید دستورالعملهای LoongArch SIMD برای برداریسازی (vectorization) و از طریق توابع توکار (builtin functions). این مقدار میتواند یکی از موارد زیر باشد:
- -msoft-float
- اجبار -mfpu=none و جلوگیری از استفاده از ثباتهای ممیز شناور برای انتقال پارامترها. این گزینه ممکن است ABI هدف را تغییر دهد.
- -msingle-float
- اجبار -mfpu=32 و مجاز ساختن استفاده از ثباتهای ممیز شناور ۳۲ بیتی برای انتقال پارامترها. این گزینه ممکن است ABI هدف را تغییر دهد.
- -mdouble-float
- اجبار -mfpu=64 و مجاز ساختن استفاده از ثباتهای ممیز شناور ۳۲/۶۴ بیتی برای انتقال پارامترها. این گزینه ممکن است ABI هدف را تغییر دهد.
- -mlasx
- -mno-lasx
- -mlsx
- -mno-lsx
- تنظیم تدریجی دامنهٔ افزونههای SIMD (شامل none / LSX / LASX) که کامپایلر میتواند برای تولید کد استفاده کند. فعالسازی LASX با -mlasx بهطور خودکار LSX را فعال میکند، و غیرفعالسازی LSX با -mno-lsx بهطور خودکار LASX را غیرفعال میسازد. این گزینههای ویژهٔ گرداننده بر وضعیت نهایی پیکربندی -msimd اثر میگذارند و بهترتیبی که در خط فرمان گردانندهٔ GCC ظاهر میشوند تغییرات تدریجی اعمال میکنند، و در نهایت گزینهٔ استاندارد و نهاییشدهٔ -msimd را که به خود کامپایلر ارسال میشود حاصل مینمایند.
- -mbranch-cost=n
- تنظیم هزینهٔ انشعابها به تقریباً n دستورالعمل.
- -maddr-reg-reg-cost=n
- تنظیم هزینهٔ ADDRESS_REG_REG به مقدار محاسبهشده توسط n.
- -mcheck-zero-division
- -mno-check-zero-divison
- ایجاد تله (عدم ایجاد تله) در صورت تقسیم عدد صحیح بر صفر. مقدار پیشفرض برای -O0 یا -Og برابر با -mcheck-zero-division، و برای سایر سطوح بهینهسازی برابر با -mno-check-zero-division است.
- -mbreak-code=code
- تولید یک دستورالعمل "break" code برای تلههای جبرانناپذیر از "__builtin_trap" یا موارد درجشده توسط کامپایلر (برای نمونه یک مسیر اشتباه ایزولهشده با -fisolate-erroneous-paths-dereference)، یا یک دستورالعمل "amswap.w $r0, $r1, $r0" که در صورت منفی بودن یا بزرگتر از ۳۲۷۶۷ بودن code باعث میشود سختافزار یک خطای Instruction Not-defined را برانگیزد. مقدار پیشفرض -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
- تعیین زمان
استفاده از
عملگرهای
بازآرایی
(relocation operators) اسمبلر
در مواجهه
با
آدرسهای
نمادین.
راهکار
جایگزین
استفاده از
ماکروهای
اسمبلر است
که ممکن است
زمانبندی
دستورالعملها
را محدود
کند اما
امکان
بهینهسازی
پیونددهنده
(linker relaxation) را
میدهد. با
-mexplicit-relocs=none،
ماکروهای
اسمبلر
همواره
استفاده
میشوند؛
با -mexplicit-relocs=always،
عملگرهای
بازآرایی
اسمبلر
همواره
استفاده
میشوند؛ و
با -mexplicit-relocs=auto،
کامپایلر
در جایی که
امکان
بهینهسازی
پیونددهنده
وجود ندارد
برای بهبود
کیفیت کد از
عملگرهای
بازآرایی،
و در سایر
جاها از
ماکروها
استفاده
میکند.
مقدار پیشفرض این گزینه بر اساس قابلیتهای اسمبلر شناساییشده در زمان ساخت 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 برای
نمادهای
خارجی با
دید
پیشفرض (default
visibility) استفاده
میشود،
اما برای
سایر
نمادهای
خارجی
استفاده
نمیشود.
با -mdirect-extern-access، از GOT استفاده نمیشود و همهٔ نمادهای خارجی بهصورت وابسته به PC آدرسدهی میشوند. این گزینه فقط برای محیطهایی مناسب است که در آنها هیچ پیوند پویایی انجام نمیشود؛ مانند سفتافزارها، هستههای سیستمعامل، یا فایلهای اجرایی پیوندشده با -static یا -static-pie. گزینهٔ -mdirect-extern-access با -fPIC یا -fpic سازگار نیست.
- -mrelax
- -mno-relax
- از سادهسازیهای پیونددهنده (linker relaxations) بهره میگیرد (یا نمیگیرد). اگر -mpass-mrelax-to-as فعال باشد، این گزینه به اسمبلر نیز فرستاده میشود. مقدار پیشفرض هنگام ساخت GCC با تشخیص پشتیبانیِ اسمبلرِ متناظر تعیین میشود: اگر اسمبلر هم از گزینهٔ -mrelax و هم از سادهسازی پرش شرطی پشتیبانی کند، -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" پشتیبانی میکند. توجه داشته باشید اگرچه توان عملیاتی این دنباله بیشتر از توان عملیاتی دستورالعمل غیرمعکوس است، اما دقت دنباله میتواند تا ۲ ulp کاهش یابد (یعنی معکوس 1.0 برابر با 0.99999994 میشود).
- -mrecip=opt
- این گزینه مشخص میکند کدام دستورالعملهای برآورد معکوس میتوانند استفاده شوند. آرگومان opt فهرستی از گزینهها است که با کاما از هم جدا شدهاند، و ممکن است پیش از آنها از علامت ! برای معکوس کردن گزینه استفاده شود:
- all
- تمام دستورالعملهای برآورد را فعال میکند.
- default
- دستورالعملهای پیشفرض را فعال میکند که معادل -mrecip است.
- none
- تمام دستورالعملهای برآورد را غیرفعال میکند که معادل -mno-recip است.
- div
- تقریب را برای تقسیم اسکالر فعال میکند.
- vec-div
- تقریب را برای تقسیم برداری فعال میکند.
- sqrt
- تقریب را برای جذر اسکالر فعال میکند.
- vec-sqrt
- تقریب را برای جذر برداری فعال میکند.
- rsqrt
- تقریب را برای جذر معکوس اسکالر فعال میکند.
- vec-rsqrt
- تقریب را برای جذر معکوس برداری فعال میکند.
بنابراین، به عنوان مثال، -mrecip=all,!sqrt تمام تقریبهای معکوس را به جز جذر اسکالر فعال میسازد.
- -mfrecipe
- -mno-frecipe
- استفاده (یا عدم استفاده) از دستورالعملهای "frecipe.{s/d}" و "frsqrte.{s/d}". هنگام همگردانی با -march=la664، این گزینه بهطور پیشفرض فعال است. در غیر این صورت، پیشفرض -mno-frecipe است.
- -mdiv32
- -mno-div32
- استفاده (یا عدم استفاده) از دستورالعملهای "div.w[u]" و "mod.w[u]" با ورودیای که علامت آن بسط داده نشده است (sign-extended). هنگام همگردانی با -march=la664، این گزینه بهطور پیشفرض فعال است. در غیر این صورت، پیشفرض -mno-div32 است.
- -mlam-bh
- -mno-lam-bh
- استفاده (یا عدم استفاده) از دستورالعملهای "am{swap/add}[_db].{b/h}". هنگام همگردانی با -march=la664، بهطور پیشفرض فعال است. در غیر این صورت، پیشفرض -mno-lam-bh است.
- -mlamcas
- -mno-lamcas
- استفاده (یا عدم استفاده) از دستورالعملهای "amcas[_db].{b/h/w/d}". هنگام همگردانی با -march=la664، بهطور پیشفرض فعال است. در غیر این صورت، پیشفرض -mno-lamcas است.
- -mld-seq-sa
- -mno-ld-seq-sa
- مشخص میکند که آیا به یک سد بارگذاری-بارگذاری (load-load barrier) برای آدرس یکسان ("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
- ایجاد یک بخش حاشیهنویسی به نام ".discard.tablejump_annotate" برای ایجاد ارتباط بین دستورالعمل "jirl" و جدول پرش هنگامی که از یک جدول پرش برای بهینهسازی عبارت "switch" استفاده میشود. برخی ابزارهای بیرونی، برای نمونه objtool در سامانهٔ ساخت هستهٔ لینوکس، برای تحلیل جریان کنترل به این حاشیهنویسی نیاز دارند. مقدار پیشفرض -mno-annotate-tablejump است..PP گزینههای LynxOS
این گزینهها برای مقصدهای LynxOS در دسترس هستند.
- استفاده از کتابخانههای اشتراکی. حالت پیشفرض، پیوند دادن با کتابخانههای ایستا است.
- -mthreads
- پشتیبانی از چندنخی (multi-threading).
- -mlegacy-threads
- پشتیبانی از چندنخی موروثی و قدیمی. این گزینه با -mthreads ناسازگار است.
گزینههای M32C
- -mcpu=name
- پردازندهای (CPU) که کد برای آن تولید میشود را انتخاب میکند. name میتواند یکی از مقادیر r8c برای سری R8C/Tiny، m16c برای سری M16C (تا /60)، m32cm برای سری M16C/80، یا m32c برای سری M32C/80 باشد.
- -msim
- مشخص میکند که برنامه روی شبیهساز (simulator) اجرا خواهد شد. این امر سبب میشود یک کتابخانهٔ زمان اجرای جایگزین پیوند داده شود که برای مثال، از ورودی/خروجی فایل پشتیبانی میکند. هنگام تولید برنامههایی که روی سختافزار واقعی اجرا خواهند شد، نباید از این گزینه استفاده کنید؛ برای هر تابع ورودی/خروجی که مورد نیاز است باید کتابخانهٔ زمان اجرای خود را ارائه دهید.
- -memregs=number
- تعداد شبهثباتهای (pseudo-registers) مبتنی بر حافظه را که GCC هنگام تولید کد به کار میگیرد مشخص میکند. این شبهثباتها مانند ثباتهای واقعی استفاده میشوند، بنابراین موازنهای بین توانایی GCC در جا دادن کد در ثباتهای موجود، و افت کارایی ناشی از استفاده از حافظه به جای ثباتها وجود دارد. توجه داشته باشید که تمام ماژولهای یک برنامه باید با مقدار یکسانی برای این گزینه کامپایل شوند. به همین دلیل، نباید از این گزینه با کتابخانههای زمان اجرای پیشفرض GCC استفاده کنید.
گزینههای M32R/D
این گزینههای -m برای معماریهای Renesas M32R/D تعریف شدهاند:
- -m32r2
- تولید کد برای M32R/2.
- -m32rx
- تولید کد برای M32R/X.
- -m32r
- تولید کد برای M32R. این مقدار پیشفرض است.
- -mmodel=small
- فرض را بر
این
میگذارد
که تمام
اشیاء در ۱۶
مگابایت
پایینی
حافظه قرار
دارند (به
طوری که
آدرس آنها
با
دستورالعمل
"ld24" قابل
بارگذاری
باشد)، و
فرض میکند
تمام
زیرروالها
با
دستورالعمل
"bl" در
دسترس
هستند. این
مقدار
پیشفرض
است.
قابلیت آدرسدهی یک شیء خاص را میتوان با مشخصهٔ "model" تعیین کرد.
- -mmodel=medium
- فرض میکند که اشیاء ممکن است در هر کجای فضای آدرس ۳۲ بیتی باشند (کامپایلر دستورالعملهای "seth/add3" را برای بارگذاری آدرسهای آنها تولید میکند)، و فرض میکند تمام زیرروالها با دستورالعمل "bl" در دسترس هستند.
- -mmodel=large
- فرض میکند که اشیاء ممکن است در هر کجای فضای آدرس ۳۲ بیتی باشند (کامپایلر دستورالعملهای "seth/add3" را برای بارگذاری آدرسهای آنها تولید میکند)، و فرض میکند ممکن است زیرروالها با دستورالعمل "bl" در دسترس نباشند (کامپایلر توالی دستورالعمل بسیار کندتر "seth/add3/jl" را تولید میکند).
- -msdata=none
- استفاده از
ناحیهٔ
دادههای
کوچک (small data area) را
غیرفعال
میکند.
متغیرها در
یکی از
بخشهای
".data"،
".bss"، یا
".rodata"
قرار
میگیرند
(مگر اینکه
مشخصهٔ
"section"
تعیین شده
باشد). این
مقدار
پیشفرض
است.
ناحیهٔ دادههای کوچک شامل بخشهای ".sdata" و ".sbss" است. اشیاء را میتوان با استفاده از مشخصهٔ "section" و به کار بردن یکی از این بخشها، بهطور صریح در ناحیهٔ دادههای کوچک قرار داد.
- -msdata=sdata
- دادههای سراسری و ایستای کوچک را در ناحیهٔ دادههای کوچک قرار میدهد، اما کد ویژهای برای ارجاع به آنها تولید نمیکند.
- -msdata=use
- دادههای سراسری و ایستای کوچک را در ناحیهٔ دادههای کوچک قرار میدهد و دستورالعملهای ویژهای برای ارجاع به آنها تولید میکند.
- -G num
- اشیاء
سراسری و
ایستا با
اندازهٔ
کوچکتر یا
مساوی با num
بایت را به
جای
بخشهای
معمولی data یا
BSS، در
بخشهای small data
یا BSS قرار
میدهد.
مقدار
پیشفرض num
برابر 8 است.
برای این که
این گزینه
تاثیری
داشته
باشد،
گزینهٔ -msdata
باید روی
یکی از
مقادیر sdata
یا use تنظیم
شده باشد.
تمام ماژولها باید با مقدار یکسان -G num کامپایل شوند. کامپایل با مقادیر مختلف num ممکن است کار کند یا نکند؛ اگر کار نکند، پیونددهنده یک پیام خطا صادر میکند---کد نادرست تولید نمیشود.
- -mdebug
- باعث میشود که کدهای مربوط به M32R در کامپایلر، آماری را نمایش دهند که ممکن است در اشکالزدایی برنامهها مفید باشد.
- -malign-loops
- -mno-align-loops
- تراز کردن تمام حلقهها روی یک مرز ۳۲ بایتی. این گزینه به طور پیشفرض غیرفعال است.
- -missue-rate=number
- صدور number دستورالعمل در هر چرخه. مقدار number تنها میتواند 1 یا 2 باشد.
- -mbranch-cost=number
- مقدار number فقط میتواند 1 یا 2 باشد. اگر 1 باشد، انشعابها به کدهای شرطی ترجیح داده میشوند؛ اگر 2 باشد، حالت معکوس اعمال میشود.
- -mflush-trap=number
- شمارهٔ تلهای (trap) که برای تخلیه و پاکسازی حافظهٔ نهان (cache flush) استفاده میشود را مشخص میکند. پیشفرض 12 است. اعداد معتبر از 0 تا 15 هستند.
- -mno-flush-trap
- مشخص میکند که حافظهٔ نهان را نمیتوان با استفاده از یک تله پاکسازی کرد.
- -mflush-func=name
- نام تابع سیستمعامل را برای فراخوانی جهت پاکسازی حافظهٔ نهان تعیین میکند. پیشفرض _flush_cache است، اما فراخوانی تابع تنها در صورتی استفاده میشود که تله در دسترس نباشد.
- -mno-flush-func
- نشان میدهد که هیچ تابع سیستمعاملی برای پاکسازی حافظهٔ نهان وجود ندارد.
گزینههای M680x0
اینها گزینههای -m هستند که برای پردازندههای M680x0 و ColdFire تعریف شدهاند. تنظیمات پیشفرض بستگی به این دارد که چه معماریای در زمان پیکربندی کامپایلر انتخاب شده باشد؛ مقادیر پیشفرض برای رایجترین گزینهها در ادامه آمده است.
- -march=arch
- تولید کد
برای یک
معماری
مجموعه
دستورالعمل
خاص در M680x0 یا
ColdFire. مقادیر
مجاز arch
برای
معماریهای
M680x0 عبارتند
از: 68000، 68010،
68020، 68030، 68040،
68060 و cpu32.
معماریهای
ColdFire بر اساس
ردهبندی ISA
مربوط به Freescale
انتخاب
میشوند و
مقادیر
مجاز
عبارتند از:
isaa، isaaplus، isab و
isac.
کامپایلر GCC هر زمان که در حال تولید کد برای یک مقصد ColdFire باشد، ماکروی "__mcfarch__" را تعریف میکند. مقدار arch در این ماکرو یکی از آرگومانهای -march ذکر شده در بالاست.
هنگامی که گزینههای -march و -mtune با یکدیگر استفاده شوند، کدی را انتخاب میکنند که روی خانوادهای از پردازندههای مشابه اجرا میشود اما برای یک ریزمعماری خاص بهینهسازی شده است.
- -mcpu=cpu
- تولید کد برای یک پردازندهٔ خاص از M680x0 یا ColdFire. مقادیر cpu برای M680x0 عبارتند از: 68000، 68010، 68020، 68030، 68040، 68060، 68302، 68332 و cpu32. پردازندههای 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 را انتخاب میکنند.
کامپایلر GCC هنگام بهینهسازی برای معماری 680x0 از نوع arch، ماکروهای "__mcarch" و "__mcarch__" را تعریف میکند. همچنین "mcarch" را تعریف میکند، مگر اینکه گزینهٔ -ansi یا گزینهٔ غیر گنو -std استفاده شده باشد. اگر GCC در حال بهینهسازی برای محدودهای از معماریها باشد، مانند آنچه توسط -mtune=68020-40 یا -mtune=68020-60 انتخاب میشود، ماکروها را برای تمامی معماریهای موجود در آن محدوده تعریف میکند.
همچنین GCC هنگام بهینهسازی برای ریزمعماری ColdFire از نوع uarch، ماکروی "__muarch__" را تعریف میکند که در آن uarch یکی از آرگومانهای ارائهشده در بالا است.
- -m68000
- -mc68000
- تولید
خروجی برای
68000. این گزینه
در صورتی که
کامپایلر
برای
سیستمهای
مبتنی بر 68000
پیکربندی
شده باشد،
پیشفرض
است. این
گزینه
معادل -march=68000
است.
از این گزینه برای میکروکنترلرهایی با هستهٔ 68000 یا EC000 استفاده کنید، از جمله 68008، 68302، 68306، 68307، 68322، 68328 و 68356.
- -m68010
- تولید خروجی برای 68010. این گزینه در صورتی که کامپایلر برای سیستمهای مبتنی بر 68010 پیکربندی شده باشد، پیشفرض است. این گزینه معادل -march=68010 است.
- -m68020
- -mc68020
- تولید خروجی برای 68020. این گزینه در صورتی که کامپایلر برای سیستمهای مبتنی بر 68020 پیکربندی شده باشد، پیشفرض است. این گزینه معادل -march=68020 است.
- -m68030
- تولید خروجی برای 68030. این گزینه هنگامی که کامپایلر برای سیستمهای مبتنی بر 68030 پیکربندی شده باشد، پیشفرض است. این گزینه معادل -march=68030 است.
- -m68040
- تولید
خروجی برای
68040. این گزینه
هنگامی که
کامپایلر
برای
سیستمهای
مبتنی بر 68040
پیکربندی
شده باشد،
پیشفرض
است. این
گزینه
معادل -march=68040
است.
این گزینه مانع استفاده از دستورالعملهای 68881/68882 میشود که باید در 68040 بهصورت نرمافزاری شبیهسازی شوند. اگر 68040 شما کدی برای شبیهسازی آن دستورالعملها ندارد، از این گزینه استفاده کنید.
- -m68060
- تولید
خروجی برای
68060. این گزینه
هنگامی که
کامپایلر
برای
سیستمهای
مبتنی بر 68060
پیکربندی
شده باشد،
پیشفرض
است. این
گزینه
معادل -march=68060
است.
این گزینه مانع استفاده از دستورالعملهای 68020 و 68881/68882 میشود که باید در 68060 بهصورت نرمافزاری شبیهسازی شوند. اگر 68060 شما کدی برای شبیهسازی آن دستورالعملها ندارد، از این گزینه استفاده کنید.
- -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).
این شامل
استفاده از
دستورالعملهای
ممیز شناور
سختافزاری
میشود. این
گزینه
معادل -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»
است. در غیر
این صورت،
مقدار
پیشفرض از
CPU هدف گرفته
میشود (یا CPU
پیشفرض،
یا
پردازندهای
که با -mcpu
مشخص شده
است). برای
مثال،
مقدار
پیشفرض
برای -mcpu=5206
برابر «off» و
برای -mcpu=5206e
برابر «on»
است.
هنگامی که این گزینه فعال باشد، GCC ماکروی "__mcfhwdiv__" را تعریف میکند.
- -mshort
- -mno-short
- -mnoshort
- نوع "int" را همانند "short int" با عرض ۱۶ بیت در نظر میگیرد. علاوه بر این، پارامترهای ارسالشده در پشته (stack) حتی روی اهدافی که API آنها ارتقا به ۳۲ بیت را الزامی کرده است، روی یک مرز ۱۶ بیتی تراز میشوند. این گزینه بهطور پیشفرض غیرفعال است.
- -mbitfield
- -mno-bitfield
- -mnobitfield
- استفاده از دستورالعملهای میدان بیتی (bit-field) را کنترل میکند. گزینههای -m68000، -mcpu32 و -m5200 مستلزم -mnobitfield هستند؛ گزینهٔ -m68020 مستلزم -mbitfield است.
- -mrtd
- -mno-rtd
- -mnortd
- استفاده از
یک قرارداد
فراخوانی
تابع (calling convention)
متفاوت را
کنترل
میکند که
در آن،
توابعی که
تعداد
ثابتی
آرگومان
میگیرند،
با
دستورالعمل
"rtd"
بازمیگردند
که
آرگومانهای
آنها را در
هنگام
بازگشت از
پشته
برمیدارد.
این کار یک
دستورالعمل
در
فراخواننده
صرفهجویی
میکند
زیرا دیگر
نیازی به
برداشتن
آرگومانها
از پشته در
آنجا نیست.
این قرارداد فراخوانی با قراردادی که بهطور معمول در 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 تراز میکند.
مستقیماً از حالت آدرسدهی وابسته به شمارنده برنامه (pc-relative) مربوط به 68000 استفاده میکند، به جای اینکه از یک جدول آفست سراسری (GOT) استفاده کند. در حال حاضر، این گزینه مستلزم -fpic است که حداکثر یک آفست ۱۶ بیتی را برای آدرسدهی وابسته به pc مجاز میداند. در حال حاضر -fPIC با -mpcrel پشتیبانی نمیشود، هرچند که ممکن است برای پردازندههای 68020 و بالاتر پشتیبانی شود.
- -mno-strict-align
- -mstrict-align
- فرض نمیکند (فرض میکند) که ارجاعات غیرتراز حافظه توسط سیستم رسیدگی میشوند.
- -msep-data
- -mno-sep-data
- با -msep-data، کدی
تولید
میکند که
به بخش داده
اجازه
میدهد در
ناحیهای
از حافظه
متفاوت با
بخش متن
قرار گیرد.
این امکان،
«اجرا
درجا» (execute-in-place)
را در محیطی
بدون
مدیریت
حافظه
مجازی
فراهم
میسازد.
این گزینه
مستلزم -fPIC
است.
این گزینه بهطور پیشفرض غیرفعال است؛ GCC کدی تولید میکند که فرض میکند بخش داده به دنبال بخش متن میآید.
- -mid-shared-library
- -mno-id-shared-library
- در صورت
فعال بودن،
کدی تولید
میکند که
از
کتابخانههای
اشتراکی از
طریق روش
شناسه
کتابخانه (library
ID) پشتیبانی
میکند. این
امکان،
اجرا درجا و
کتابخانههای
اشتراکی را
در یک محیط
بدون
مدیریت
حافظه
مجازی
فراهم
میسازد.
این گزینه
مستلزم -fPIC
است.
این گزینه بهطور پیشفرض غیرفعال است.
- شماره شناسایی کتابخانه اشتراکی مبتنی بر ID در حال کامپایل را مشخص میکند. مشخص کردن مقدار 0 کدی فشردهتر تولید میکند؛ مشخص کردن مقادیر دیگر تخصیص آن شماره را به کتابخانه فعلی اجباری میکند، اما از نظر فضا یا زمان بهینهتر از صرفنظر کردن از این گزینه نیست.
- -mxgot
- -mno-xgot
- هنگام
تولید کد
مستقل از
موقعیت (position-independent)
برای ColdFire، کدی
تولید
میکند که
در صورت
داشتن بیش
از ۸۱۹۲
مدخل در GOT
نیز کار
کند. این کد
بزرگتر و
کُندتر از
کدی است که
بدون این
گزینه
تولید
میشود. در
پردازندههای
M680x0، به این
گزینه
نیازی
نیست؛ -fPIC
کفایت
میکند.
بهطور معمول GCC از یک دستورالعمل واحد برای بارگذاری مقادیر از GOT استفاده میکند. گرچه این روش نسبتاً کارآمد است، اما تنها در صورتی کار میکند که GOT کوچکتر از حدود 64k باشد. هر مقداری بزرگتر از آن باعث میشود که پیونددهنده خطایی مانند زیر گزارش دهد:
relocation truncated to fit: R_68K_GOT16O foobar
اگر این اتفاق افتاد، باید کد خود را با -mxgot بازکامپایل کنید. آنگاه باید با GOTهای بسیار بزرگ کار کند. با این حال، کد تولیدشده با -mxgot کارایی کمتری دارد، زیرا واکشی مقدار یک نماد سراسری ۴ دستورالعمل زمان میبرد.
توجه داشته باشید که برخی پیونددهندهها، از جمله نسخههای جدیدتر پیونددهندهٔ GNU، میتوانند چندین GOT ایجاد کنند و مدخلهای GOT را مرتب نمایند. اگر چنین پیونددهندهای دارید، تنها زمانی باید از -mxgot استفاده کنید که یک فایل شیء (object file) منفرد را کامپایل میکنید که به بیش از ۸۱۹۲ مدخل 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
- مجاز دانستن مقادیر بیواسطه (immediate) با اندازه دلخواه در عملیات بیتی.
- -mwide-bitfields
- -mno-wide-bitfields
- در نظر گرفتن همیشگی میدانهای بیتی به اندازه "int".
- -m4byte-functions
- -mno-4byte-functions
- اجبار تمام توابع به تراز شدن روی مرز ۴-بایتی.
- -mcallgraph-data
- -mno-callgraph-data
- تولید اطلاعات گراف فراخوانی (callgraph).
- -mslow-bytes
- -mno-slow-bytes
- ترجیح دسترسی کلمهای (word) هنگام خواندن مقادیر بایتی.
- -mlittle-endian
- -mbig-endian
- تولید کد به ترتیب برای مقصد little-endian یا big-endian. حالت پیشفرض big-endian است. کد little-endian فقط با -m340 پشتیبانی میشود.
- -m210
- تولید کد برای پردازنده 210.
- -m340
- تولید کد برای پردازنده 340.
- -mno-lsim
- فرض بر این است که پشتیبانی زمان اجرا فراهم شده است، بنابراین کتابخانه شبیهساز (libsim.a) از خط فرمان پیونددهنده حذف میشود.
- -mstack-increment=size
- تنظیم حداکثر مقدار برای یک عملیات منفرد افزایش پشته (stack). مقادیر بزرگ میتوانند سرعت برنامههایی را که شامل توابعی با نیاز به فضای زیاد در پشته هستند افزایش دهند، اما در صورتی که پشته بیش از حد گسترش یابد ممکن است موجب بروز خطای قطعهبندی (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
- استفاده از دستورالعملهای ضرب بالا برای بخش بالایی حاصلضرب ۳۲×۳۲.
- -mxl-float-convert
- استفاده از دستورالعملهای سختافزاری تبدیل ممیز شناور.
- -mxl-float-sqrt
- استفاده از دستورالعمل سختافزاری جذر ممیز شناور.
- -mbig-endian
- تولید کد برای مقصد big-endian.
- -mlittle-endian
- تولید کد برای مقصد little-endian.
- -mxl-reorder
- استفاده از دستورالعملهای بازآرایی (جابهجایی و بارگذاری/ذخیره با بایت معکوسشده).
- -mxl-mode-app-model
- انتخاب مدل برنامه app-model. مدلهای معتبر عبارتند از:
- executable
- برنامه اجرایی عادی (پیشفرض)، از کد راهاندازی crt0.o استفاده میکند.
- xmdstub
- برای استفاده همراه با عامل دیباگ تهاجمی نرمافزاری مبتنی بر دیباگر ریزپردازنده زایلینکس (XMD) با نام xmdstub. این مدل از فایل راهاندازی crt1.o استفاده کرده و نشانی شروع برنامه را روی 0x800 تنظیم میکند.
- bootstrap
- برای برنامههایی که با استفاده از بارگذار بوت (bootloader) بارگذاری میشوند. این مدل از فایل راهاندازی crt2.o استفاده میکند که فاقد گرداننده بردار بازنشانی (reset vector handler) پردازنده است. این حالت برای انتقال کنترل در زمان بازنشانی پردازنده به بارگذار بوت بهجای برنامه مناسب است.
- novectors
- برای برنامههایی که به هیچیک از بردارهای MicroBlaze نیاز ندارند. این گزینه ممکن است برای برنامههایی که درون یک برنامه نظارتی اجرا میشوند مفید باشد. این مدل از crt3.o بهعنوان فایل راهاندازی استفاده میکند.
- -mpic-data-is-text-relative
- فرض میکند که میزان جابهجایی میان بخشهای text و data در زمان پیوند ایستا (static link time) ثابت است. این امر اجازه میدهد دادهها بهجای GOT، از طریق آفست از آدرس ابتدای text ارجاع داده شوند، چرا که آدرسدهی PC-relative پشتیبانی نمیشود.
گزینههای 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
سازگار
باشد، و
بالعکس.
برای نمونه، کدی که از رمزگذاری 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 از گونهای از ABI o32 پشتیبانی میکند که در آن ثباتهای ممیز شناور به جای ۳۲ بیت، ۶۴ بیت پهنا دارند. میتوانید این ترکیب را با -mabi=32 -mfp64 انتخاب کنید. این ABI بر دستورالعملهای "mthc1" و "mfhc1" تکیه دارد و بنابراین تنها برای پردازندههای MIPS32R2، MIPS32R3 و MIPS32R5 پشتیبانی میشود.
تخصیص ثباتها برای آرگومانها و مقادیر بازگشتی یکسان باقی میماند، اما هر مقدار اسکالر به جای یک جفت ثبات ۳۲ بیتی، در یک ثبات ۶۴ بیتی تکی ارسال میشود. برای نمونه، مقادیر ممیز شناور اسکالر فقط در $f0 بازگردانده میشوند، نه در یک جفت $f0/$f1. مجموعه ثباتهای ذخیرهشده در فراخوانی (call-saved) نیز از این جهت یکسان باقی میماند که ثباتهای با شمارهٔ زوج با دقت مضاعف (double-precision) ذخیره میشوند.
دو گونهٔ دیگر از ABI o32 برای امکانپذیر ساختن گذار از ثباتهای ۳۲ بیتی به ۶۴ بیتی پشتیبانی میشوند. اینها FPXX (-mfpxx) و FP64A (-mfp64 -mno-odd-spreg) هستند. پسوند FPXX الزام میکند که تمام کد باید در زمان اجرا با استفاده از ثباتهای ۳۲ بیتی یا ۶۴ بیتی بهدرستی اجرا شود. کد میتواند با FP32 یا FP64 پیوند متقابل داشته باشد، اما نه با هر دو. پسوند FP64A شبیه به پسوند FP64 است اما استفاده از ثباتهای با شمارهٔ فرد دقت منفرد (single-precision) را ممنوع میکند. این میتواند همراه با حالت "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 اشیاء جابهجاپذیر (relocatable) اثر میگذارد. استفاده از -mno-shared به طور کلی فایلهای اجرایی را هم کوچکتر و هم سریعتر میکند.
-mshared پیشفرض است.
- -mplt
- -mno-plt
- فرض کردن
(یا فرض
نکردن)
اینکه
پیونددهندههای
ایستا و
پویا از PLTها
و
بازنشانیهای
رونوشت (copy relocations)
پشتیبانی
میکنند.
این گزینه
فقط بر -mno-shared -mabicalls
اثر
میگذارد.
برای ABI n64، این
گزینه بدون
-msym32 هیچ
تأثیری
ندارد.
میتوانید با پیکربندی GCC با --with-mips-plt، گزینهٔ -mplt را پیشفرض قرار دهید. در غیر این صورت، پیشفرض -mno-plt است.
- -mxgot
- -mno-xgot
- برداشتن (یا
عدم
برداشتن)
محدودیتهای
معمول برای
اندازهٔ
جدول آفست
سرتاسری (GOT).
کامپایلر GCC معمولاً از یک دستورالعمل برای بارگذاری مقادیر از GOT استفاده میکند. اگرچه این کار نسبتاً کارآمد است، اما فقط در صورتی کار میکند که GOT کوچکتر از حدود 64k باشد. هر اندازهٔ بزرگتری باعث میشود پیونددهنده خطایی مانند این گزارش دهد:
relocation truncated to fit: R_MIPS_GOT16 foobar
اگر این اتفاق بیفتد، باید کد خود را دوباره با -mxgot کامپایل کنید. این گزینه با GOTهای بسیار بزرگ کار میکند، اگرچه کد کارایی کمتری نیز خواهد داشت، چرا که دریافت مقدار یک نماد سراسری نیازمند سه دستورالعمل است.
توجه داشته باشید که برخی از پیونددهندهها میتوانند چندین GOT ایجاد کنند. اگر چنین پیونددهندهای دارید، تنها زمانی باید از -mxgot استفاده کنید که یک فایل شیء تکی به بیش از 64k درآیه از جدول GOT دسترسی داشته باشد. پروندههای انگشتشماری چنین هستند.
این گزینهها هیچ اثری ندارند مگر اینکه GCC در حال تولید کد مستقل از موقعیت باشد.
- -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 کدگذاری موروثی را انتخاب میکند. در این حالت، NaNهای آرام (qNaNs) با ۰ بودن نخستین بیت از فیلد بخش اعشاری معنادار (significand) مشخص میشوند، در حالی که NaNهای علامتدهنده (sNaNs) با ۱ بودن نخستین بیت از فیلد بخش اعشاری معنادار مشخص میگردند.
گزینهٔ -mnan=2008 کدگذاری IEEE 754-2008 را انتخاب میکند. در این حالت، qNaNها با ۱ بودن نخستین بیت فیلد اعشاری معنادار، و sNaNها با ۰ بودن نخستین بیت فیلد اعشاری معنادار مشخص میشوند.
حالت پیشفرض -mnan=legacy است مگر اینکه GCC با --with-nan=2008 پیکربندی شده باشد.
- -mllsc
- -mno-llsc
- استفاده از
(عدم
استفاده از)
دستورالعملهای
ll، sc و sync
برای
پیادهسازی
توابع
توکار
حافظهٔ
اتمی.
هنگامی که
هیچیک از
گزینهها
مشخص نشده
باشد، GCC در
صورتی که
معماری
مقصد از
آنها
پشتیبانی
کند، این
دستورالعملها
را به کار
میبرد.
گزینهٔ -mllsc زمانی کاربرد دارد که محیط زمان اجرا بتواند این دستورالعملها را شبیهسازی کند، و -mno-llsc میتواند هنگام کامپایل برای ISAهای غیر استاندارد مفید باشد. میتوانید با پیکربندی GCC با --with-llsc و --without-llsc هر یک از این گزینهها را به حالت پیشفرض تبدیل کنید. --with-llsc برای برخی پیکربندیها حالت پیشفرض است؛ برای جزئیات به مستندات نصب مراجعه کنید.
- -mdsp
- -mno-dsp
- استفاده از (عدم استفاده از) نگارش ۱ از MIPS DSP ASE. این گزینه ماکروی پیشپردازندهٔ "__mips_dsp" را تعریف میکند. همچنین "__mips_dsp_rev" را با مقدار 1 تعریف مینماید.
- -mdspr2
- -mno-dspr2
- استفاده از (عدم استفاده از) نگارش ۲ از MIPS DSP ASE. این گزینه ماکروهای پیشپردازندهٔ "__mips_dsp" و "__mips_dspr2" را تعریف میکند. همچنین "__mips_dsp_rev" را با مقدار 2 تعریف مینماید.
- -msmartmips
- -mno-smartmips
- استفاده از (عدم استفاده از) MIPS SmartMIPS ASE.
- -mpaired-single
- -mno-paired-single
- استفاده از (عدم استفاده از) دستورالعملهای ممیز شناور تکدقت جفتشده (paired-single). این گزینه نیازمند فعال بودن پشتیبانی سختافزاری از ممیز شناور است.
- -mdmx
- -mno-mdmx
- استفاده از (عدم استفاده از) دستورالعملهای MIPS Digital Media Extension. این گزینه تنها در هنگام تولید کد ۶۴ بیتی قابل استفاده است و نیازمند فعال بودن پشتیبانی سختافزاری از ممیز شناور است.
- -mips3d
- -mno-mips3d
- استفاده از (عدم استفاده از) MIPS-3D ASE. گزینهٔ -mips3d متضمن -mpaired-single است.
- -mmicromips
- -mno-micromips
- تولید کردن
(تولید
نکردن) کد microMIPS.
تولید کد microMIPS میتواند بر پایهٔ هر تابع نیز توسط صفتهای "micromips" و "nomicromips" کنترل شود.
- -mmt
- -mno-mt
- استفاده از (عدم استفاده از) دستورالعملهای چندریسمانی MT.
- -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
- استفاده (عدم استفاده) از دستورالعملهای بررسی افزونگی چرخشی (CRC) در MIPS.
- -mginv
- -mno-ginv
- استفاده (عدم استفاده) از دستورالعملهای باطلسازی سراسری (GINV) در MIPS.
- -mmsa
- -mno-msa
- استفاده (عدم استفاده) از دستورالعملهای افزونهٔ MIPS MSA.
- -mloongson-mmi
- -mno-loongson-mmi
- استفاده (عدم استفاده) از دستورالعملهای افزونههای چندرسانهای MIPS Loongson موسوم به MMI.
- -mloongson-ext
- -mno-loongson-ext
- استفاده (عدم استفاده) از دستورالعملهای افزونههای (EXT) در MIPS Loongson.
- -mloongson-ext2
- -mno-loongson-ext2
- استفاده (عدم استفاده) از دستورالعملهای نسخهٔ ۲ افزونههای (EXT2) در MIPS Loongson.
- -mlong64
- اجبار انواع دادهٔ "long" به اندازهٔ ۶۴ بیتی. برای توضیحات مربوط به مقدار پیشفرض و نحوهٔ تعیین اندازهٔ اشارهگر، -mlong32 را ببینید.
- -mlong32
- اجبار
انواع
دادهٔ
"long"،
"int" و
اشارهگرها
به اندازهٔ
۳۲ بیتی.
اندازهٔ پیشفرض "int"ها، "long"ها و اشارهگرها به ABI بستگی دارد. تمام ABIهای پشتیبانیشده از "int"های ۳۲ بیتی استفاده میکنند. ABI نوع n64، مانند EABI شصتوچهار بیتی، از "long"های ۶۴ بیتی استفاده میکند؛ بقیه از "long"های ۳۲ بیتی بهره میبرند. اندازهٔ اشارهگرها برابر با اندازهٔ "long"ها یا اندازهٔ ثباتهای عدد صحیح (هرکدام که کوچکتر باشد) است.
- -msym32
- -mno-sym32
- فرض کردن (فرض نکردن) اینکه تمامی نمادها بدون توجه به ABI انتخابشده دارای مقادیر ۳۲ بیتی هستند. این گزینه در ترکیب با -mabi=64 و -mno-abicalls مفید است، چرا که به GCC اجازه میدهد ارجاعهای کوتاهتر و سریعتری به نشانیهای نمادین ایجاد کند.
- -G num
- قرار دادن
تعاریف
دادههای
قابلمشاهده
از خارج، در
یک بخش
دادههای
کوچک (small data section) در
صورتی که
اندازهٔ آن
داده
بزرگتر از
num بایت
نباشد. بدین
ترتیب GCC
میتواند
دسترسیهای
کارآمدتری
به دادهها
تولید کند؛
برای
جزئیات به
-mgpopt مراجعه
کنید.
گزینهٔ پیشفرض -G به پیکربندی بستگی دارد.
- -mlocal-sdata
- -mno-local-sdata
- تعمیم دادن
(تعمیم
ندادن)
رفتار -G به
دادههای
محلی نیز،
مانند
متغیرهای static
در زبان C.
گزینهٔ -mlocal-sdata
برای تمامی
پیکربندیها
پیشفرض
است.
اگر پیونددهنده خطا داد که برنامه از مقدار بسیار زیادی دادهٔ کوچک استفاده میکند، میتوانید بخشهایی را که از نظر کارایی کمتر حیاتی هستند با -mno-local-sdata بازسازی کنید. همچنین ممکن است بخواهید کتابخانههای بزرگ را با -mno-local-sdata بسازید تا کتابخانهها فضای بیشتری برای برنامهٔ اصلی باقی بگذارند.
- -mextern-sdata
- -mno-extern-sdata
- فرض کردن
(فرض نکردن)
اینکه
دادههای
تعریفشده
در خارج در
صورتی که
اندازهشان
در محدودهٔ
-G باشد، در
یک بخش
دادههای
کوچک قرار
دارند.
گزینهٔ -mextern-sdata
برای تمامی
پیکربندیها
پیشفرض
است.
اگر یک پودمان Mod را با -mextern-sdata -G num -mgpopt کامپایل کنید و Mod به متغیری به نام Var ارجاع دهد که بزرگتر از num بایت نیست، باید مطمئن شوید که Var در یک بخش دادههای کوچک قرار گرفته است. اگر Var توسط پودمان دیگری تعریف شده است، باید آن پودمان را با مقدار -G به اندازهٔ کافی بزرگ کامپایل کنید یا صفت "section" را به تعریف Var's اضافه کنید. اگر Var مشترک (common) باشد، باید برنامه را با تنظیم -G به اندازهٔ کافی بالا پیوند دهید.
سادهترین روش برای برآورده کردن این محدودیتها، کامپایل و پیوند دادن تمامی پودمانها با یک گزینهٔ -G یکسان است. با این حال، ممکن است بخواهید کتابخانهای بسازید که از چندین حد مختلف دادههای کوچک پشتیبانی کند. میتوانید این کار را با کامپایل کردن کتابخانه با بالاترین تنظیم -G پشتیبانیشده و علاوه بر آن، استفاده از -mno-extern-sdata انجام دهید تا کتابخانه از فرض کردن پیشفرضها دربارهٔ دادههای تعریفشده در خارج خودداری کند.
- -mgpopt
- -mno-gpopt
- استفاده
(عدم
استفاده) از
دسترسیهای
نسبی به GP
برای
نمادهایی
که مشخص است
در بخش
دادههای
کوچک قرار
دارند؛ به
-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
- تخصیص متغیرها ابتدا در بخش دادههای فقطخواندنی در صورت امکان، سپس در بخش دادههای کوچک در صورت امکان، و در غیر این صورت در بخش دادهها (data). این گزینه کدی کمی کُندتر از حالت پیشفرض تولید میکند، اما مقدار RAM مورد نیاز در حین اجرا را کاهش میدهد، بنابراین ممکن است برای برخی از سیستمهای تعبیهشده ترجیح داده شود.
- -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
- فعالسازی (غیرفعالسازی) استفاده از عملگرهای بازآرایی اسمبلر %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 و پس از آن
پشتیبانی
میشود.
همچنین،
برخی از
نسخههای
هستهٔ
لینوکس
دارای باگی
هستند که
مانع از
تولید
سیگنال
مناسب
("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 ویرایش ۶. MIPSr6 نیازمند پشتیبانی از دسترسی همترازنشده برای بارگذاری/ذخیرهسازی است، چه از طریق سختافزار یا تلهگذاری و شبیهسازی. در حالت دوم ممکن است هستهٔ سیستمعامل به -mstrict-align نیاز داشته باشد. گزینههای -munaligned-access و -mno-unaligned-access منسوخ شدهاند و تنها برای سازگاری با گذشته ارائه میشوند.
- -mmemcpy
- -mno-memcpy
- اجبار کردن (اجبار نکردن) به استفاده از "memcpy" برای انتقالهای بلوکی غیرساده. پیشفرض -mno-memcpy است، که به GCC اجازه میدهد بیشتر کپیهای با اندازهٔ ثابت را درونخطی (inline) کند.
- -mlong-calls
- -mno-long-calls
- غیرفعالسازی
(غیرفعال
نکردن)
استفاده از
دستور
"jal".
فراخوانی
توابع با
استفاده از
"jal"
کارآمدتر
است اما
مستلزم آن
است که
فراخواننده
و
فراخواندهشده
در همان بخش
۲۵۶
مگابایتی
باشند.
این گزینه هیچ اثری روی کد abicalls ندارد. پیشفرض -mno-long-calls است.
- -mmad
- -mno-mad
- فعالسازی (غیرفعالسازی) استفاده از دستورهای "mad"، "madu" و "mul"، آنگونه که توسط مجموعه دستورالعملهای معماری R4650 ارائه شده است.
- -mimadd
- -mno-imadd
- فعالسازی (غیرفعالسازی) استفاده از دستورهای عدد صحیح "madd" و "msub". پیشفرض روی معماریهایی که از "madd" و "msub" پشتیبانی میکنند -mimadd است، بهجز معماری 74k که مشخص شد در آن کد کندتری تولید میکند.
- -mfused-madd
- -mno-fused-madd
- فعالسازی
(غیرفعالسازی)
استفاده از
دستورهای
ضرب-جمع
ممیز
شناور، در
صورت در
دسترس بودن
آنها.
پیشفرض
-mfused-madd است.
در پردازندهٔ R8000 هنگام استفاده از دستورهای ضرب-جمع، حاصلضرب میانی با دقت نامتناهی محاسبه شده و مشمول بیت Flush to Zero در FCSR نمیشود. این رفتار ممکن است در برخی شرایط نامطلوب باشد. در پردازندههای دیگر، نتیجه از نظر عددی با محاسبهٔ معادل با استفاده از دستورهای جداگانهٔ ضرب، جمع، تفریق و قرینهسازی یکسان است.
- -nocpp
- به اسمبلر MIPS اعلام میکند که هنگام اسمبل کردن فایلهای اسمبلر کاربر (با پسوند .s)، پیشپردازندهٔ خود را روی آنها اجرا نکند.
- -mfix-24k
- -mno-fix-24k
- دور زدن اشکال سختافزاری 24K E48 (از دست رفتن دادهها در ذخیرهسازی هنگام پر کردن مجدد). این راهحلها به جای GCC توسط اسمبلر پیادهسازی شدهاند.
- -mfix-r4000
- -mno-fix-r4000
- دور زدن برخی اشکالات سختافزاری خاص پردازندهٔ R4000:
- یک جابهجایی دابلورد یا متغیر، در صورتی که بلافاصله پس از شروع تقسیم عدد صحیح اجرا شود، ممکن است نتیجهٔ نادرستی بدهد.
- یک جابهجایی دابلورد یا متغیر، در صورتی که حین اجرای ضرب عدد صحیح اجرا شود، ممکن است نتیجهٔ نادرستی بدهد.
- یک تقسیم عدد صحیح، در صورتی که در شکاف تأخیر (delay slot) یک پرش یا انشعاب برگزیده آغاز شود، ممکن است نتیجهٔ نادرستی بدهد.
- -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» را در بازبینی ۲ پردازنده SB-1 دور میزند.)
- -mfix4300
- -mno-fix4300
- دور زدن یک باگ در تراشههای اولیه VR4300 که باعث میشود عملیات ضرب با عملوندهای خاص، عملیات ضربی را که بلافاصله پس از آن میآید خراب کند.
- -mr10k-cache-barrier=setting
- مشخص
میکند که
آیا GCC باید
برای
جلوگیری از
عوارض
جانبی
اجرای حدسی
(speculation) در
پردازندههای
R10K،
مانعهای
حافظه نهان
(cache barriers) را درج
کند یا خیر.
همانند بسیاری از پردازندهها، R10K تلاش میکند نتیجه یک پرش شرطی را پیشبینی کند و دستورالعملهای شاخه «انتخابشده» را به صورت حدسی اجرا نماید. در صورتی که نتیجه پیشبینیشده نادرست باشد، بعداً اجرای این دستورالعملها را لغو میکند. با این حال، در R10K حتی دستورالعملهای لغو شده نیز میتوانند عوارض جانبی داشته باشند.
این مشکل تنها بر ذخیرهسازیهای هسته (kernel stores) و بسته به سیستم، بر بارگذاریهای هسته (kernel loads) تاثیر میگذارد. به عنوان مثال، یک ذخیرهسازی که به صورت حدسی اجرا شده است ممکن است حافظه هدف را در حافظه نهان بارگذاری کند و خط حافظه نهان را به عنوان کثیف (dirty) علامت بزند، حتی اگر خود عملیات ذخیرهسازی بعداً لغو شود. اگر یک عملیات DMA قبل از تخلیه خط «کثیف» در همان ناحیه از حافظه بنویسد، دادههای کششده روی دادههای نوشتهشده توسط DMA بازنویسی میشوند. برای توضیحات کامل شامل سایر مشکلات احتمالی، به راهنمای پردازنده R10K مراجعه کنید.
یک راهحل دور زدن، درج دستورالعملهای مانع حافظه نهان قبل از هر دسترسی به حافظه است که ممکن است به صورت حدسی اجرا شود و حتی در صورت لغو شدن عوارض جانبی داشته باشد. گزینه -mr10k-cache-barrier=setting پیادهسازی این راهحل را در GCC کنترل میکند. این گزینه فرض میکند که دسترسیهای لغو شده به هر بایتی در نواحی زیر عوارض جانبی ندارد:
- 1.
- حافظه اشغالشده توسط چارچوب پشته (stack frame) تابع جاری؛
- 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" را بپذیرد، یعنی آدرس محدوده حافظهای که کش آن تخلیه میشود، اندازه محدوده حافظه، و عدد ۳ (برای تخلیه هر دو حافظه نهان). مقدار پیشفرض به معماری هدفی که 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
- این
گزینهها
کنترل
میکنند که
کدام قالب
از
انشعابها
تولید شوند.
مقدار
پیشفرض
-mcompact-branches=optimal است.
گزینهٔ -mcompact-branches=never تضمین میکند که دستورالعملهای انشعاب فشرده هرگز تولید نشوند.
گزینهٔ -mcompact-branches=always تضمین میکند که در صورت موجود بودن، برای MIPS Release 6 به بعد یک دستورالعمل انشعاب فشرده تولید شود. اگر یک دستورالعمل انشعاب فشرده در دسترس نباشد (یا در نسخههای پیش از R6)، در عوض از قالب دارای شکاف تأخیر (delay slot) انشعاب استفاده میشود.
اگر برای مقصدهای MIPS16/microMIPS استفاده شود، در حال حاضر نادیده گرفته میشود. رفتار مربوط به MIPS16/microMIPS ممکن است در آینده تغییر کند، زیرا آنها دارای برخی دستورالعملهای انشعاب فشرده هستند.
گزینهٔ -mcompact-branches=optimal باعث میشود در صورتی که انشعاب شکاف تأخیر در ISA فعلی در دسترس باشد و شکاف تأخیر با موفقیت پر شود، از آن استفاده گردد. اگر شکاف تأخیر پر نشود، در صورت موجود بودن، یک انشعاب فشرده انتخاب میشود.
- -mfp-exceptions
- -mno-fp-exceptions
- مشخص
میکند که
آیا
استثناهای
ممیز شناور
(FP exceptions) فعال
هستند یا
خیر. این
مورد بر
نحوهٔ
زمانبندی
دستورالعملهای
FP برای برخی
پردازندهها
تأثیر
میگذارد.
پیشفرض
این است که
استثناهای
FP فعال
باشند.
به عنوان مثال، در SB-1، اگر استثناهای FP غیرفعال باشند و در حال تولید کد ۶۴ بیتی باشیم، میتوان از هر دو لولهخط FP استفاده کرد. در غیر این صورت، تنها میتوان از یک لولهخط FP استفاده نمود.
- -mvr4130-align
- -mno-vr4130-align
- لولهخط VR4130
یک
سوپراسکالر
دو جهته (two-way superscalar)
است، اما
تنها در
صورتی
میتواند
دو
دستورالعمل
را با هم
صادر کند که
دستورالعمل
اول در مرز
۸ بایتی
تراز شده
باشد.
هنگامی که
این گزینه
فعال باشد،
GCC
جفتدستورالعملهایی
را که به
نظرش باید
بهطور
موازی اجرا
شوند تراز
میکند.
این گزینه تنها هنگام بهینهسازی برای VR4130 تأثیر دارد. معمولاً کد را سریعتر میکند، اما به قیمت بزرگتر شدن حجم آن تمام میشود. این گزینه بهطور پیشفرض در سطح بهینهسازی -O3 فعال است.
- -msynci
- -mno-synci
- فعال
(غیرفعال)
کردن تولید
دستورالعملهای
"synci" در
معماریهایی
که از آن
پشتیبانی
میکنند.
دستورالعملهای
"synci" (در
صورت فعال
بودن) زمانی
تولید
میشوند که
"__builtin___clear_cache"
کامپایل
شود.
پیشفرض این گزینه -mno-synci است، اما میتوان با پیکربندی GCC همراه با --with-synci این پیشفرض را بازنویسی کرد.
هنگام کامپایل کردن کد برای سیستمهای تکپردازندهای، استفاده از "synci" معمولاً ایمن است. با این حال، در بسیاری از سیستمهای چندهستهای (SMP)، حافظهٔ نهان دستورالعمل را در همهٔ هستهها باطل نمیکند و ممکن است منجر به رفتار تعریفنشده شود.
- -mrelax-pic-calls
- -mno-relax-pic-calls
- تلاش برای
تبدیل
فراخوانیهای
PIC که
معمولاً از
طریق ثبات
$25 ارسال
میشوند به
فراخوانیهای
مستقیم. این
کار تنها در
صورتی
امکانپذیر
است که
پیونددهنده
بتواند
مقصد را در
زمان پیوند
حل کند و
مقصد در
محدودهٔ یک
فراخوانی
مستقیم
باشد.
در صورتی که GCC برای استفاده از یک اسمبلر و پیونددهندهای پیکربندی شده باشد که از دستورالعمل اسمبلی ".reloc" پشتیبانی میکنند و -mexplicit-relocs فعال باشد، گزینهٔ -mrelax-pic-calls پیشفرض خواهد بود. با گزینهٔ -mno-explicit-relocs، این بهینهسازی میتواند توسط اسمبلر و پیونددهنده به تنهایی و بدون کمک کامپایلر انجام شود.
- -mmcount-ra-address
- -mno-mcount-ra-address
- تولید (عدم تولید) کدی که به "_mcount" اجازه میدهد آدرس بازگشت تابع فراخواننده را تغییر دهد. در صورت فعال بودن، این گزینه رابط معمول "_mcount" را با یک پارامتر جدید ra-address گسترش میدهد که نوع "intptr_t *" دارد و در ثبات $12 ارسال میشود. سپس "_mcount" میتواند با انجام هر دوی موارد زیر، آدرس بازگشت را تغییر دهد:
- بازگرداندن آدرس جدید در ثبات $31.
- ذخیرهٔ آدرس جدید در "*ra-address"، در صورتی که ra-address غیرتهی باشد.
پیشفرض -mno-mcount-ra-address است.
- -mframe-header-opt
- -mno-frame-header-opt
- فعال
(غیرفعال)
کردن
بهینهسازی
سرآیند
فریم در o32 ABI.
هنگام
استفاده از
o32 ABI، توابع
فراخواننده
۱۶ بایت را
روی پشته
برای تابع
فراخواندهشده
تخصیص
میدهند تا
آرگومانهای
ثبات را
یادداشت
کند. در
صورت فعال
بودن، اگر
مشخص شود که
این سرآیند
فریم بدون
استفاده
است، این
بهینهسازی
از تخصیص آن
جلوگیری
میکند.
این بهینهسازی بهطور پیشفرض در تمام سطوح بهینهسازی غیرفعال است.
- -mlxc1-sxc1
- -mno-lxc1-sxc1
- در صورت امکان، فعال (غیرفعال) کردن تولید دستورالعملهای "lwxc1"، "swxc1"، "ldxc1" و "sdxc1". بهطور پیشفرض فعال است.
- -mmadd4
- -mno-madd4
- در صورت امکان، فعال (غیرفعال) کردن تولید دستورالعملهای ۴ عملوندیِ "madd.s"، "madd.d" و دستورالعملهای مرتبط. بهطور پیشفرض فعال است.
گزینههای MMIX
این گزینهها برای MMIX تعریف شدهاند:
- -mlibfuncs
- -mno-libfuncs
- مشخص میکند که توابع ذاتی کتابخانه در حال کامپایل هستند، که صرفنظر از اندازه، همهٔ مقادیر را در ثباتها منتقل میکنند.
- -mepsilon
- -mno-epsilon
- تولید دستورالعملهای مقایسهٔ ممیز شناور که با توجه به ثبات اپسیلون "rE" مقایسه میکنند.
- -mabi=mmixware
- -mabi=gnu
- تولید کدی که پارامترهای تابع و مقادیر بازگشتی را به نحوی منتقل میکند که (در تابع فراخواندهشده) به عنوان ثباتهای $0 به بعد دیده شوند، بر خلاف GNU ABI که از ثباتهای سراسری $231 به بعد استفاده میکند.
- -mzero-extend
- -mno-zero-extend
- هنگام خواندن دادهها از حافظه در اندازههای کوتاهتر از ۶۴ بیت، بهطور پیشفرض بهجای دستورالعملهای بسط-علامت، از دستورالعملهای بارگذاری بسط-صفر استفاده کند (استفاده نکند).
- -mknuthdiv
- -mno-knuthdiv
- علامت حاصل تقسیمی که دارای باقیمانده است را همعلامت با مقسومعلیه قرار میدهد. در حالت پیشفرض، یعنی -mno-knuthdiv، علامت باقیمانده از علامت مقسوم پیروی میکند. هر دو روش از نظر محاسباتی معتبر هستند، اما روش دوم تقریباً بهطور انحصاری استفاده میشود.
- -mtoplevel-symbols
- -mno-toplevel-symbols
- یک : به ابتدای تمام نمادهای سراسری اضافه میکند (اضافه نمیکند)، تا کد اسمبلی بتواند با دستورالعمل اسمبلی "PREFIX" استفاده شود.
- -melf
- تولید یک فایل اجرایی در قالب ELF، بهجای قالب پیشفرض mmo که توسط شبیهساز mmix استفاده میشود.
- -mbranch-predict
- -mno-branch-predict
- استفاده (عدم استفاده) از دستورالعملهای انشعاب محتمل، هنگامی که پیشبینی ایستای انشعاب نشاندهنده یک انشعاب محتمل باشد.
- -mbase-addresses
- -mno-base-addresses
- تولید کدی (عدم تولید کدی) که از آدرسهای پایه استفاده میکند. استفاده از یک آدرس پایه بهطور خودکار درخواستی (که توسط اسمبلر و پیونددهنده رسیدگی میشود) برای مقداردهی یک مقدار ثابت در یک ثبات سراسری ایجاد میکند. از این ثبات برای یک یا چند درخواست آدرس پایه در محدوده ۰ تا ۲۵۵ از مقدار نگهداریشده در ثبات استفاده میشود. این کار عموماً منجر به تولید کدی کوتاه و سریع میشود، اما تعداد دادههای متفاوتی که میتوان آدرسدهی کرد محدود است. این به آن معناست که برنامهای با حجم زیادی از دادههای ایستا ممکن است به -mno-base-addresses نیاز داشته باشد.
- -msingle-exit
- -mno-single-exit
- کد تولیدشده را وادار میکند (وادار نمیکند) که در هر تابع تنها یک نقطه خروج داشته باشد.
- -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 تعیینشده استفاده میکند. این گزینه نوع پردازنده هدف را تغییر نمیدهد. نوع 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 را از دایرکتوری ریشه زنجیره ابزار (toolchain) بررسی میکند. این دایرکتوری در نصب پیشفرض وجود ندارد، اما اگر آن را ایجاد کرده و 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) فراخوانی میشود. این امر کدی حجیمتر اما سریعتر تولید میکند.
روتینهای ضرب سختافزاری در حین اجرا وقفهها را غیرفعال کرده و پس از اتمام، وضعیت پیشین وقفه را بازمیگردانند. این ویژگی باعث میشود استفاده از آنها هم در داخل گردانندههای وقفه (interrupt handlers) و هم در کدهای عادی امن باشد.
- -minrt
- استفاده از یک محیط زمان اجرای (runtime) حداقل را بدون پشتیبانی از مقداردهندههای اولیهٔ ایستا یا سازندهها فعال میکند. این گزینه برای دستگاههای با محدودیت حافظه در نظر گرفته شده است. کامپایلر نمادهای ویژهای را در برخی از اشیاء (objects) میگنجاند که به پیونددهنده و زمان اجرا اطلاع میدهند کدام بخشهای کد مورد نیاز هستند.
- -mtiny-printf
- توابع
کتابخانهای
"printf" و
"puts" با
اندازه کد
کاهشیافته
را فعال
میکند.
پیادهسازیهای
tiny این
توابع
بازورود (reentrant)
نیستند،
بنابراین
در
برنامههای
چندنخی (multi-threaded)
باید با
احتیاط
استفاده
شوند.
پشتیبانی از جریانها (streams) حذف شده است و رشتههای چاپی همیشه از طریق فراخوان سیستمی "write" به stdout ارسال میشوند. رشته قبل از ارسال به write بافر نمیشود.
این گزینه به Newlib Nano IO نیاز دارد، بنابراین GCC باید با --enable-newlib-nano-formatted-io پیکربندی شده باشد.
- -mmax-inline-shift=n
- این گزینه
یک عدد صحیح
n بین ۰ تا
۶۴ (شامل هر
دو) میگیرد
و حداکثر
تعداد
دستورالعملهای
شیفت
درونخطی (inline)
را تعیین
میکند که
باید برای
انجام
عملیات
شیفت با
مقداری
ثابت صادر
شوند.
هنگامی که
نیاز به
فراتر رفتن
از این
مقدار
باشد، به
جای آن از
یک تابع
کمکی mspabi
استفاده
میشود.
مقدار
پیشفرض ۴
است.
این فقط مواردی را تحت تأثیر قرار میدهد که در آنها یک شیفت با چندین موقعیت نمیتواند با یک دستورالعمل واحد تکمیل شود (مانند تمام شیفتهای بزرگتر از ۱ در 430 ISA).
شیفتهای یک مقدار ۳۲ بیتی دستکم دو برابر هزینهبرتر هستند، بنابراین مقدار ارائهشده برای این گزینه بر ۲ تقسیم شده و مقدار حاصل به جای آن استفاده میشود.
- -mcode-region=where
- -mdata-region=where
- این گزینهها به کامپایلر میگویند توابع و دادههایی را که هیچیک از صفتهای (attributes) "lower"، "upper"، "either" یا "section" را ندارند در کجا قرار دهد. مقادیر ممکن برای where عبارتند از lower، upper، either یا any. سه مقدار اول رفتاری مشابه صفت مربوطه دارند. مقدار چهارم یعنی any پیشفرض است؛ این مقدار، جایگذاری را کاملاً به اسکریپت پیونددهنده و چگونگی تخصیص بخشهای استاندارد (".text"، ".data" و غیره) به نواحی حافظه واگذار میکند.
- -muse-lower-region-prefix
- هنگام کامپایل با -mcode-region=lower یا -mdata-region=lower، پیشوند .lower را به نام بخشها اضافه میکند. به طور پیشفرض غیرفعال است.
- -msilicon-errata=name[,name...]
- این گزینه درخواستی را به اسمبلر ارسال میکند تا اصلاحات مربوط به اشکالات سختافزاری (silicon errata) نامبردهشده را فعال کند. برای جزئیات به مستندات اسمبلر مراجعه کنید.
- -msilicon-errata-warn=name[,name...]
- این گزینه درخواستی را به اسمبلر ارسال میکند تا در صورت نیاز احتمالی به اعمال اصلاحات یک اشکال سختافزاری (silicon errata) نامبردهشده، پیامهای هشدار را فعال کند. برای جزئیات به مستندات اسمبلر مراجعه کنید.
- -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 ممیز شناور نرمافزاری (soft).
- -mabi=2fp+
- -mfloat-abi=hard
- استفاده از ABI ممیز شناور سختافزاری (hard).
- -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
- فعال/غیرفعال کردن تولید دستورالعملهای افزونه کارایی ۲ (performance extension 2).
- -mext-string
- -mno-ext-string
- فعال/غیرفعال کردن تولید دستورالعملهای افزونه رشته (string extension).
- -mext-dsp
- -mno-ext-dsp
- فعال/غیرفعال کردن تولید دستورالعملهای افزونه DSP.
- -mext-fpu-fma
- -mno-ext-fpu-fma
- فعال/غیرفعال کردن تولید دستورالعملهای ضرب و انباشت ممیز شناور (fused multiply-accumulate).
- -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
- اندازه هر بردار وقفه (interrupt vector) را تعیین میکند، که باید ۴ یا ۱۶ باشد.
- -misr-secure=num
- سطح امنیتی c-isr را برای کل فایل تعیین میکند.
- -mcache-block-size=num
- اندازه هر بلوک کَش (cache block) را تعیین میکند، که باید توانی از ۲ بین ۴ و ۵۱۲ باشد.
- -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--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
- مدل کد (code model) را روی یکی از موارد زیر تنظیم میکند:
- small
- تمام بخشهای داده (data) و دادههای فقط-خواندنی (read-only data) باید درون فضای آدرسدهی 512KB قرار گیرند. بخش کد (text segment) باید درون فضای آدرسدهی 16MB باشد..IP medium 4 بخش داده (data segment) باید درون ۵۱۲ کیلوبایت باشد، در حالی که بخش دادههای فقطخواندنی میتواند درون فضای آدرسدهی ۴ گیگابایت قرار گیرد. بخش متن (text segment) همچنان باید درون فضای آدرسدهی ۱۶ مگابایت باشد.
- large
- تمام بخشهای متن و داده میتوانند درون فضای آدرسدهی ۴ گیگابایت باشند.
مقدار پیشفرض در مقصدهای GNU/Linux برابر large و در سایر مقصدهای ELF برابر medium است.
- -mctor-dtor
- -mno-ctor-dtor
- فعال/غیرفعال کردن ویژگی سازنده/ویرانگر (constructor/destructor).
- -mrelax
- -mno-relax
- فعال/غیرفعال کردن گزینهٔ پیونددهنده برای تعدیل (relax) دستورالعملها.
- -mrelax-hint
- -mno-relax-hint
- فعال/غیرفعال کردن درج راهنماها (hints) برای پیونددهنده جهت انجام تعدیل.
- -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 شصت و چهار بیتی (64-bit) پشتیبانی میشود.
- -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. این گزینه برای اجرای مستقل (stand-alone) به جای برونسپاری محاسبات (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) برای ذخیرهسازی زیرین استفاده شود، امکان دسترسی به متغیرهای خودکار را از سایر رشتهها (threads) یا با دستورالعملهای اتمیک فراهم میکند. این شیوهٔ تولید کد برای برونسپاری محاسبات در OpenMP کاربرد دارد، اما این گزینه به تنهایی نیز جهت آزمایش کامپایلر ارائه شده است؛ برای تولید کد مناسب جهت پیوند به برنامههایی که از برونسپاری OpenMP استفاده میکنند، از گزینهٔ -mgomp استفاده کنید.
- -msoft-stack-reserve-local=size
- تعیین اندازهٔ حافظهٔ ".local" مورد استفاده برای پشته در زمانی که مقدار دقیق آن مشخص نیست. مقدار پیشفرض آن ۱۲۸ است.
- -muniform-simt
- -mno-uniform-simt
- فعال/غیرفعال کردن نوعی از تولید کد که امکان اجرای تمام رشتهها را در هر warp فراهم میکند، در حالی که وضعیت حافظه و اثرات جانبی را بهگونهای حفظ مینماید که گویی در خارج از نواحی OpenMP SIMD تنها یک رشته در هر warp فعال بوده است. تمام عملیات اتمیک و فراخوانیهای زمان اجرا ("malloc"، "free"، "vprintf") به صورت شرطی اجرا میشوند (تنها در صورتی که شاخص lane فعلی با شاخص lane اصلی برابر باشد)، و مقداری که به ثبات تخصیص داده میشود از طریق یک دستورالعمل shuffle از lane اصلی کپی میگردد. در خارج از نواحی SIMD، لاین ۰ (lane 0) اصلی است؛ در داخل، هر رشته خود را به عنوان اصلی تلقی میکند. آرایهٔ حافظهٔ اشتراکی "int __nvptx_uni[]" ماسکهای بیتی تمامصفر یا تمامیک را برای هر warp نگهداری میکند که نشاندهندهٔ حالت فعلی است (۰ در خارج از نواحی SIMD). هر رشته میتواند ماسک بیتی موجود در موقعیت "tid.y" را با شاخص lane فعلی AND بیتی کند تا شاخص lane اصلی محاسبه شود..IP -mgomp 4
- -mno-gomp
- فعال/غیرفعال کردن تولید کد برای استفاده در برونگذاری بار پردازشی (offloading) در OpenMP. -mgomp گزینههای -msoft-stack و -muniform-simt را فعال کرده، و گونهٔ multilib متناظر را انتخاب میکند.
گزینههای OpenRISC
این گزینهها برای OpenRISC تعریف شدهاند:
- -mboard=name
- پیکربندی زماناجرای (runtime) مخصوص برد. این مقدار برای پیوند کتابخانهٔ برد 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 انتخاب شده باشد، تولید دستورالعملهای ممیز شناور با دقت مضاعف را فعال میکند. بهطور پیشفرض از توابع 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 بازگردانده میشوند (fr0 در نحو اسمبلر Unix). مقدار پیشفرض، -mno-ac0، نتایج ممیز شناور را در حافظه بازمیگرداند.
- -m40
- تولید کد برای یک PDP-11/40. مستلزم -msoft-float و -mno-split است.
- -m45
- تولید کد برای یک PDP-11/45. این مقدار پیشفرض است.
- -m10
- تولید کد برای یک PDP-11/10. مستلزم -msoft-float و -mno-split است.
- -mint16
- -mno-int32
- استفاده از "int" ۱۶-بیتی. این مقدار پیشفرض است.
- -mint32
- -mno-int16
- استفاده از "int" ۳۲-بیتی.
- -msplit
- هدف دارای فضای تفکیکشدهٔ دستورالعمل و داده است. مستلزم -m45 است.
- -munix-asm
- استفاده از نحو اسمبلر Unix.
- -mdec-asm
- استفاده از نحو اسمبلر DEC.
- -mgnu-asm
- استفاده از نحو اسمبلر GNU. این مقدار پیشفرض است.
- -mlra
- استفاده از تخصیصدهندهٔ جدید ثبات LRA. بهطور پیشفرض، از تخصیصدهندهٔ قدیمی "reload" استفاده میشود.
گزینههای 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 یک فراخوانی به "exit" را هنگامی که "main" بازمیگردد اضافه میکند. 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 تمام پشتیبانی از ممیز شناور و پارامترهای مکانی 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" ارسال نمیکند، بنابراین تابع اخیر باید به صورت "int main (void)" تعریف شود. این مورد در حال حاضر برای بیشتر پروژههای سفتافزار روال معمول است.
- -mmcu=mcu
- گونهٔ
سختافزاری
PRU را برای
استفاده
مشخص
میکند. یک
فایل spec با
نام متناظر
بارگذاری
میشود که
اندازههای
ناحیهٔ
حافظه را به
پیونددهنده
(linker) ارسال
کرده و
ماکروهای C
ویژهٔ
سختافزار
را تعریف
میکند.
مجموعه Newlib تنها spec مربوط به "sim" را ارائه میدهد که برای اجرای آزمونهای رگرسیون با استفاده از شبیهساز در نظر گرفته شده است. مشخصات سختافزار واقعی را میتوان با نصب بستهٔ GnuPruMcu ("https://github.com/dinuxbg/gnuprumcu") به دست آورد.
- -mno-relax
- باعث میشود GCC گزینهٔ خط فرمان --no-relax را به جای گزینهٔ --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 الزامی
است که در
صورت وجود
هرگونه
میدان بیتی
(bit-field)،
اندازهٔ 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 قابل استفاده است و ABI نوع lp64e که تنها با rv64e میتواند استفاده شود. این ABIها در حال حاضر به طور کامل و دقیق مشخص نشدهاند و ممکن است تغییر یابند.
- -mfdiv
- -mno-fdiv
- استفاده یا عدم استفاده از دستورالعملهای سختافزاری تقسیم و جذر ممیز شناور. این گزینه نیازمند افزونههای F یا D برای ثباتهای ممیز شناور است. حالت پیشفرض در صورتی که معماری مشخصشده دارای این دستورالعملها باشد، استفاده از آنها است.
- -mfence-tso
- -mno-fence-tso
- استفاده کردن یا نکردن از دستورالعمل fence.tso، که در برخی پردازندهها (شامل پردازندههای ساخت T-Head) پیادهسازی نشده است. اگر دستورالعمل fence.tso در دسترس نباشد، بهجای آن از یک fence قویتر استفاده میشود.
- -mdiv
- -mno-div
- استفاده کردن یا نکردن از دستورالعملهای سختافزاری برای تقسیم اعداد صحیح. این ویژگی به افزونهٔ M نیاز دارد. پیشفرض این است که در صورت پشتیبانی معماری مشخصشده از این دستورالعملها، از آنها استفاده شود.
- -misa-spec=ISA-spec-string
- مشخص کردن نگارشی از مشخصات ISA بدون امتیاز (Unprivileged، که پیشتر سطح کاربر یا User-Level نامیده میشد) در RISC-V که کد تولیدشده باید با آن مطابقت داشته باشد. مقادیر ممکن برای ISA-spec-string عبارتند از:
- 2.2
- تولید کد مطابق با نگارش 2.2.
- 20190608
- تولید کد مطابق با نگارش 20190608.
- 20191213
- تولید کد مطابق با نگارش 20191213.
پیشفرض -misa-spec=20191213 است، مگر اینکه GCC با گزینهٔ --with-isa-spec= برای نگارش پیشفرض متفاوتی پیکربندی شده باشد.
- -march=[ISA|Profile|Profile_ISA|processor-string]
- تولید کد
برای ISA یا
نمایهٔ (profile)
دادهشده
در RISC-V یا
ترکیبی از
آنها
(مانند rv64im rvi20u64
rvi20u64_zbb).
نامهای
ISAها و
نمایهها
باید با
حروف کوچک
باشند.
نمونهها
شامل rv64i، rv32g،
rv32e، rv32imaf، rva22u64 و
rva23u64 هستند.
برای ترکیب
یک نمایهٔ
نامگذاریشده
با
افزونههای
اختیاری RISC-V
ISA، ابتدا
نمایه را
ذکر کرده و
سپس نام
افزونه(ها)
را با
استفاده از
خط زیر (underscore) به
عنوان
جداکننده
به آن پیوست
کنید (مانند
rvi20u64_zca_zcb rva23u64_zacas).
علاوه بر
این، مقدار
ویژهٔ help (-march=help)
برای فهرست
کردن تمام
افزونههای
پشتیبانیشده
پذیرفته
میشود.
گزینهٔ -march=unset باعث میشود کامپایلر تمام گزینههای -march=... را که پیشتر در خط فرمان آمدهاند نادیده بگیرد، و بهگونهای عمل کند که گویی این گزینه هرگز داده نشده است. این ویژگی برای اطمینان از اینکه معماری از گزینهٔ -mcpu دریافت میشود مفید است؛ همچنین در صورت استفاده از -march=unset اگر هیچ گزینهٔ -mcpu داده نشده باشد، منجر به خطا خواهد شد.
نحو (syntax) رشتهٔ ISA به صورت زیر تعریف میشود:
- رشته باید با rv32 یا rv64 آغاز شود و در ادامهٔ آن i، e یا g قرار گیرد که به آن ISA پایه گفته میشود.
- بخش بعدی رشته فهرستی از نامهای افزونه است. نامهای افزونه را میتوان به دستههای چندحرفی (مانند zba) و تکحرفی (مانند v) تقسیم کرد. افزونههای تکحرفی میتوانند بهصورت متوالی ظاهر شوند، اما افزونههای چندحرفی باید با خط زیر (underscore) از یکدیگر جدا شوند.
- خط زیر میتواند در هر جایی پس از 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 افزونهٔ ممیز شناور با دقت یگانه (Single-precision)
- d
- @tab 2.0 2.2 @tab افزونهٔ ممیز شناور با دقت دوگانه (Double-precision)
- 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 افزونهٔ پیشواکشی بلوک حافظهٔ نهان
- zicboz
- @tab 1.0 @tab افزونهٔ صفرسازی بلوک حافظهٔ نهان
- ziccamoa
- @tab 1.0 @tab حافظهٔ اصلی از تمام دستورالعملهای اتمیک در A پشتیبانی میکند
- ziccif
- @tab 1.0 @tab حافظهٔ اصلی از واکشی دستورالعمل با الزامات اتمیک بودن پشتیبانی میکند
- zicclsm
- @tab 1.0 @tab حافظهٔ اصلی از بارگذاریها/ذخیرهسازیهای ناتراز (misaligned) پشتیبانی میکند
- ziccrse
- @tab 1.0 @tab حافظهٔ اصلی از پیشرفت روبهجلو در توالیهای LR/SC پشتیبانی میکند
- zicfilp
- @tab 1.0 @tab افزونهٔ landing pad برای یکپارچگی جریان کنترل (CFI)
- zicfiss
- @tab 1.0 @tab افزونهٔ shadow stack برای یکپارچگی جریان کنترل (CFI)
- 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 افزونهٔ راهنمای توقف (pause)
- 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 افزونهٔ دستورالعملهای مقایسه و جاگذاری اتمی
- zalrsc
- @tab 1.0 @tab زیرمجموعهٔ بارگذاری-رزرو/ذخیرهسازی-مشروط افزونهٔ 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 افزونهٔ فشردهٔ عملیاتهای ممکن
- 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 افزونهٔ جایگشت تقاطعی برای رمزنگاری
- 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 افزونه ترتیب کل ذخیرهسازی (Total Store Ordering)
- 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 mode پشتیبانی میکند
- shvsatpa
- @tab 1.0 @tab ثبات vsatp از تمام حالتهای پشتیبانیشده توسط satp پشتیبانی میکند
- smaia
- @tab 1.0 @tab افزونه معماری پیشرفته وقفه
- 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 mode پشتیبانی میکند
- ssstrict
- @tab 1.0 @tab کدگذاریهای رزروشدهٔ پیادهسازینشده استثنای دستور غیرمجاز ایجاد میکنند و هیچ افزونه نامنطبقی وجود ندارد
- 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 افزونه بارگذاری کلمه رویداد (event load word) در Core-V
- xcvmac
- @tab 1.0 @tab افزونه ضرب و انباشت (multiply-accumulate) در 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 دستورهای برش محدودهای (ranged clip) از FP32 به 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 افزونه ضرب-انباشت 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 بهینهسازی خروجی برای پردازندهٔ دادهشده، مشخصشده توسط ریزمعماری یا نام یک پردازندهٔ (CPU) خاص. مقادیر مجاز برای این گزینه عبارتند از:
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
مشخص نشده
باشد،
مقدار
پیشفرض ۴
(۱۶ بایت یا
۱۲۸ بیت)
است.
هشدار: اگر از این سوئیچ استفاده کنید، باید تمام ماژولها را با همان مقدار بسازید، از جمله تمامی کتابخانهها. این مورد شامل کتابخانههای سیستم و ماژولهای راهاندازی (startup) نیز میشود.
- -msmall-data-limit=n
- قرار دادن دادههای سراسری (global) و ایستا (static) کوچکتر از n بایت در یک بخش (section) ویژه (روی برخی مقصدها).
- -msave-restore
- -mno-save-restore
- استفاده کردن یا نکردن از کدهای پیشدرآمد (prologue) و پسدرآمد (epilogue) کوچکتر اما کندتر که از فراخوانی توابع کتابخانهای استفاده میکنند. حالت پیشفرض استفاده از پیشدرآمدها و پسدرآمدهای درونخطی (inline) سریع است.
- -mmovcc
- -mno-movcc
- تولید کردن یا نکردن دنبالههای کد انتقال شرطیِ بدون انشعاب (branchless conditional-move) حتی روی مقصدهایی که دستورالعملهای خاصی برای عملیات شرطی ندارند. در صورت فعال بودن، در جاهایی که سودمند باشد، دنبالههایی از عملیات 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
- تلاش کردن یا نکردن برای بهرهگیری بیشتر از دستورالعملهای بارگذاری/ذخیرهسازی فشرده از طریق جایگزین کردن یک بارگذاری/ذخیرهسازی از نوع 'base register + large offset' با یک بارگذاری/ذخیرهسازیِ جدید از نوع 'new base + small offset'. اگر پایهٔ جدید در یک ثبات فشرده ذخیره شود، بارگذاری/ذخیرهسازی جدید میتواند فشرده شود. در حال حاضر فقط بارگذاری/ذخیرهسازیهای عدد صحیح ۳۲-بیتی را هدف قرار میدهد.
- -mstrict-align
- -mno-strict-align
- تولید نکردن یا تولید کردن دسترسیهای حافظهٔ ناتراز. مقدار پیشفرض بسته به این که پردازندهای که برای آن بهینهسازی میکنیم از دسترسی ناترازِ سریع پشتیبانی میکند یا خیر، تعیین میشود.
- -mscalar-strict-align
- -mno-scalar-strict-align
- تولید نکردن یا تولید کردن دسترسیهای حافظهٔ ناتراز. مقدار پیشفرض بسته به این که پردازندهای که برای آن بهینهسازی میکنیم از دسترسی ناترازِ سریع پشتیبانی میکند یا خیر، تعیین میشود. این گزینه نام مستعاری برای -mstrict-align است.
- -mvector-strict-align
- -mno-vector-strict-align
- تولید نکردن یا تولید کردن دسترسیهای حافظهٔ برداری ناتراز. مقدار پیشفرض روی خاموش (off) تنظیم شده است، مگر اینکه پردازندهای که برای آن بهینهسازی میکنیم صراحتاً از دسترسی حافظهٔ برداری با عناصر ناتراز (element-misaligned) پشتیبانی کند.
- -mmax-vectorization
- -mno-max-vectorization
- فعال یا غیرفعال کردن یک بازنویسی (override) برای مدل هزینه بردارساز بهگونهای که بردارسازی همیشه سودمند به نظر برسد. برخلاف -fno-vect-cost-model یا -fvect-cost-model=unlimited این گزینه مقایسه هزینه بین حالتهای برداری مختلف را خاموش نمیکند.
- -mcmodel=medlow
- تولید کد برای مدل کد medium-low. برنامه و نمادهای تعریفشده بهصورت ایستای آن باید درون یک بازه آدرس ۲ گیبیبایتی (2 GiB) منفرد قرار داشته و بین آدرسهای مطلق -2 GiB و +2 GiB واقع شوند. برنامهها میتوانند بهطور ایستا یا پویا پیوند زده شوند. این مدل کد پیشفرض است، مگر اینکه GCC با گزینه --with-cmodel= پیکربندی شده باشد که مدل کد پیشفرض متفاوتی را مشخص میکند.
- -mcmodel=medany
- تولید کد
برای مدل کد
medium-any. برنامه و
نمادهای
تعریفشده
بهصورت
ایستای آن
باید درون
هر بازه
آدرس ۲
گیبیبایتی
(2 GiB) منفردی
قرار گیرند.
برنامهها
میتوانند
بهصورت
ایستا یا
پویا پیوند
داده شوند.
کد تولیدشده توسط مدل کد medium-any مستقل از موقعیت (position-independent) است، اما تضمین نمیشود هنگام پیوند در فایلهای اجرایی یا کتابخانههای مستقل از موقعیت، به درستی کار کند.
- -mcmodel=large
- تولید کد برای یک مدل کد بزرگ (large)، که هیچ محدودیتی بر اندازه یا محل قرارگیری نمادها ندارد.
- -mexplicit-relocs
- -mno-explicit-relocs
- استفاده یا عدم استفاده از عملگرهای بازآرایی (relocation) اسمبلر هنگام تعامل با آدرسهای نمادین. راه جایگزین، استفاده از ماکروهای اسمبلر است که ممکن است بهینهسازی را محدود کند.
- -mrelax
- -mno-relax
- بهرهگیری از linker relaxations برای کاهش تعداد دستورالعملهای مورد نیاز جهت تحقق آدرس نمادها. پیشفرض، بهرهگیری از linker relaxations است.
- -mriscv-attribute
- -mno-riscv-attribute
- درج کردن (یا عدم درج) صفتهای RISC-V جهت ثبت اطلاعات اضافی در اشیاء ELF. این قابلیت نیازمند حداقل نسخه 2.32 از binutils است.
- -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-*-* پیکربندی شده باشد. پشتیبانی از big-endian در 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
- تولید کد
محافظت از
پشته با
استفاده از
قناری در guard.
مکانهای
پشتیبانیشده
عبارتند از
global برای یک
قناری
سراسری یا
tls برای
قناری به
ازای هر
رشته (thread) در
بلوک TLS.
با انتخاب مورد دوم، گزینههای -mstack-protector-guard-reg=reg و -mstack-protector-guard-offset=offset علاوهبراین تعیین میکنند که از چه ثباتی بهعنوان ثبات پایه برای خواندن قناری، و از چه آفستی نسبت به آن ثبات پایه استفاده شود. هیچ ثبات یا آفست پیشفرضی وجود ندارد چرا که این قابلیت تماماً برای استفاده در هسته لینوکس است.
- -mtls-dialect=desc
- استفاده از توصیفکنندههای TLS (TLS descriptors) بهعنوان سازوکار ذخیرهسازی محلی رشته (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
- فعالسازی یا غیرفعالسازی تولید دستورالعملهای بارگذاری/ذخیره قطعه برداری (vector 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 به عنوان نوع پردازنده، گزینه معماری متناظر با پردازنده میزبان سیستمی که کامپایل را انجام میدهد شناسایی و انتخاب میکند. در صورتی که GCC پردازنده را شناسایی نکند، -mcpu=native هیچ تاثیری نخواهد داشت.
سایر گزینهها یک پردازنده خاص را مشخص میکنند. کدی که تحت این گزینهها تولید میشود بر روی آن پردازنده به بهترین شکل اجرا میشود و ممکن است روی پردازندههای دیگر اصلاً اجرا نشود.
گزینههای -mcpu بهطور خودکار گزینههای زیر را فعال یا غیرفعال میکنند:
-maltivec -mfprnd -mhard-float -mmfcrf -mmultiple -mpopcntb -mpopcntd -mpowerpc64 -mpowerpc-gpopt -mpowerpc-gfxopt -mmulhw -mdlmzb -mmfpgpr -mvsx -mcrypto -mhtm -mpower8-fusion -mquad-memory -mquad-memory-atomic -mfloat128 -mfloat128-hardware -mprefixed -mpcrel -mmma -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 در -mtune همانند -mcpu به کار میروند. اگر هر دو مشخص شوند، کد تولید شده از معماری و ثباتهای تعیینشده توسط -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 فراهم
میکنند.
همچنین
ممکن است
لازم باشد
-mabi=altivec را برای
تطبیق ABI
فعلی با
بهبودهای AltiVec
ABI تنظیم
کنید.
هنگامی که -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، از جمله جذر ممیز شناور (floating-point square root)، استفاده کند.
- -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
- تولید دستورالعملهای VRSAVE هنگام تولید کد AltiVec.
- -msecure-plt
- تولید کدی که به ld و ld.so اجازه میدهد فایلهای اجرایی و کتابخانههای اشتراکی را با بخشهای غیرقابلاجرای ".plt" و ".got" بسازند. این یک گزینهٔ مربوط به PowerPC 32-bit SYSV ABI است.
- -mbss-plt
- تولید کدی که از بخش BSS ".plt" که توسط ld.so پر میشود، استفاده کرده و نیازمند بخشهای ".plt" و ".got" است که هم قابل نوشتن و هم قابل اجرا باشند. این یک گزینهٔ مربوط به PowerPC 32-bit SYSV ABI است.
- -msplit-patch-nops
- هنگام افزودن NOPها برای یک ناحیهٔ قابل وصله از طریق گزینهٔ -fpatchable-function-entry، NOPهای «قبل» را پیش از نقطهٔ ورود سراسری (global entry point) و NOPهای «بعد» را پس از نقطهٔ ورود محلی (local entry point) درج میکند. این کار باعث میشود هنگامی که یک نقطهٔ ورود سراسری تولید میشود، توالی NOPها غیرمتوالی باشد. بدون این گزینه، NOPها مستقیماً قبل و بعد از نقطهٔ ورود محلی درج میشوند، که باعث میشود متوالی باشند اما فاصلهٔ بین نقطهٔ ورود سراسری و محلی را افزایش میدهد. اگر تنها یک نقطهٔ ورود منفرد تولید شود، این گزینه هیچ اثری ندارد.
- -misel
- -mno-isel
- این گزینه تولید دستورالعملهای ISEL را فعال یا غیرفعال میکند.
- -mvsx
- -mno-vsx
- تولید کدی که از دستورالعملهای برداری/نردهای (VSX) استفاده میکند (استفاده نمیکند)، و همچنین فعالسازی استفاده از توابع درونی (built-in) که دسترسی مستقیمتری به مجموعه دستورالعملهای VSX را فراهم میسازند.
- -mcrypto
- -mno-crypto
- فعالسازی (غیرفعالسازی) استفاده از توابع درونی (built-in) که امکان دسترسی مستقیم به دستورالعملهای رمزنگاری اضافهشده در نسخهٔ 2.07 از PowerPC ISA را فراهم میکنند.
- -mhtm
- -mno-htm
- فعالسازی (غیرفعالسازی) استفاده از توابع درونی (built-in) که امکان دسترسی مستقیم به دستورالعملهای حافظهٔ تراکنشی سختافزاری (HTM) اضافهشده در نسخهٔ 2.07 از PowerPC ISA را فراهم میکنند.
- -mpower8-fusion
- -mno-power8-fusion
- تولید کدی که برخی از عملیاتهای عدد صحیح را در کنار یکدیگر نگه میدارد (نگه نمیدارد) تا دستورالعملها بتوانند در پردازندههای power8 و بعد از آن با یکدیگر ادغام شوند.
- -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 توسط GCC جلوگیری میکند و گزینه -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
داشته باشد.
آرگومانهای
ممیز شناور
ارسالی به
توابع
پیشنمونهدار
(prototyped)، علاوه
بر
رجیسترهای
آرگومان
ممیز شناور
(FPR)، فراتر از
ناحیه
ذخیره
رجیستر (RSA) در
پشته نیز
قرار
میگیرند.
در زمان
مقایسه
مقادیر و
تبدیل به double،
فرض نکنید
که
باارزشترین
double در مقدار
۱۲۸ بیتی long double
بهدرستی
گرد شده
است. برای
روالهای
پشتیبانی
از long double، از
نام
نمادهای XL
استفاده
کنید.
قرارداد فراخوانی AIX گسترش داده شد، اما در ابتدا مستندسازی نشده بود تا حالت مبهمی از K&R C را مدیریت کند؛ حالتی که در آن تابعی که آدرس آرگومانهایش را میگیرد با تعداد آرگومانهای کمتری نسبت به اعلان فراخوانی میشود. کامپایلرهای IBM XL در صورتی که یک زیرروال بدون بهینهسازی کامپایل شده باشد، به آرگومانهای ممیز شناوری که در RSA جا نمیشوند از طریق پشته دسترسی پیدا میکنند. از آنجا که ذخیره همیشگی آرگومانهای ممیز شناور در پشته ناکارآمد بوده و بهندرت لازم است، این گزینه بهصورت پیشفرض فعال نیست و تنها زمان فراخوانی زیرروالهای کامپایلشده توسط کامپایلرهای IBM XL بدون بهینهسازی ضرورت دارد.
- -mpe
- پشتیبانی از IBM RS/6000 SP Parallel Environment (PE). برنامهای را که برای استفاده از تبادل پیام (message passing) نوشته شده است با کد راهاندازی ویژهای پیوند میدهد تا امکان اجرای برنامه فراهم گردد. سیستم باید PE را در مسیر استاندارد (/usr/lpp/ppe.poe/) نصب داشته باشد، یا فایل specs باید با استفاده از گزینه -specs= بازنویسی شود تا مسیر دایرکتوری مناسب مشخص گردد. محیط Parallel Environment از ریسهها (threads) پشتیبانی نمیکند، بنابراین گزینه -mpe و گزینه -pthread با یکدیگر ناسازگار هستند.
- -malign-natural
- -malign-power
- در AIX،
سیستمهای
۳۲ بیتی Darwin و
۶۴ بیتی PowerPC
GNU/Linux، گزینه
-malign-natural
همترازی
مشخصشده
توسط ABI را
برای انواع
داده
بزرگتر
(مانند
مقادیر
ممیز شناور
double) نادیده
گرفته و
آنها را بر
اساس مرز
طبیعی
اندازهشان
همتراز
میکند.
گزینه -malign-power
به GCC دستور
میدهد از
قواعد
همترازی
تعریفشده
در ABI پیروی
کند. مقدار
پیشفرض GCC
بر روی
همترازی
استاندارد
تعریفشده
در ABI است.
در Darwin شصتوچهار بیتی، همترازی طبیعی پیشفرض است و گزینه -malign-power پشتیبانی نمیشود.
- -msoft-float
- -mhard-float
- تولید کدی که از مجموعه رجیسترهای ممیز شناور استفاده نمیکند (استفاده میکند). در صورت استفاده از گزینه -msoft-float و ارسال آن به GCC در زمان پیوند، شبیهسازی نرمافزاری ممیز شناور ارائه میشود.
- -mmultiple
- -mno-multiple
- تولید کدی که از دستورالعملهای بارگذاری چندکلمهای (load multiple word) و ذخیره چندکلمهای (store multiple word) استفاده میکند (استفاده نمیکند). این دستورالعملها بهصورت پیشفرض در سیستمهای POWER تولید میشوند و در سیستمهای PowerPC تولید نمیشوند. در سیستمهای little-endian مبتنی بر PowerPC از -mmultiple استفاده نکنید، زیرا این دستورالعملها در زمانی که پردازنده در حالت little-endian است کار نمیکنند. استثناها PPC740 و PPC750 هستند که این دستورالعملها را در حالت little-endian مجاز میدانند.
- -mupdate
- -mno-update
- تولید کدی که از دستورالعملهای بارگذاری یا ذخیرهای که رجیستر پایه را به نشانی مکان حافظه محاسبهشده بهروزرسانی میکنند، استفاده میکند (استفاده نمیکند). این دستورالعملها بهصورت پیشفرض تولید میشوند. در صورت استفاده از -mno-update، فاصله زمانی کوتاهی بین زمان بهروزرسانی اشارهگر پشته و ذخیره نشانی فریم قبلی وجود دارد؛ این امر بدان معناست که کدی که در حین وقفهها یا سیگنالها در فریم پشته پیمایش میکند ممکن است با دادههای مخدوش مواجه شود.
- -mavoid-indexed-addresses
- -mno-avoid-indexed-addresses
- تولید کدی که تلاش میکند از بهکارگیری دستورالعملهای نمایهدار بارگذاری یا ذخیرهسازی اجتناب کند (اجتناب نکند). این دستورالعملها در شرایط خاص، مانند پیمایش آرایههای بزرگی که از یک مرز 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،
ساختارها و
اجتماعهای
دارای
فیلدهای
بیتی (bit-fields) را
مجبور به
تراز شدن بر
پایه نوع
اصلی فیلد
بیتی
نمیکند (یا
میکند).
برای مثال، بهطور پیشفرض ساختاری که تنها شامل ۸ فیلد بیتی "unsigned" با طول ۱ است، در مرز ۴ بایتی تراز شده و اندازهای برابر با ۴ بایت دارد. با استفاده از -mno-bit-align، ساختار در مرز ۱ بایتی تراز شده و اندازه آن ۱ بایت خواهد بود.
- -mbit-word
- -mno-bit-word
- اجازه به فیلدهای بیتی برای عبور از مرزهای کلمه (word).
- -mno-strict-align
- -mstrict-align
- در System V.4 و سیستمهای تعبیهشده PowerPC، فرض نمیکند (یا میکند) که مراجعات حافظه ترازنشده توسط سیستم مدیریت میشوند.
- -mrelocatable
- -mno-relocatable
- تولید کدی که به یک فایل اجرایی ایستا اجازه میدهد (یا اجازه نمیدهد) در زمان اجرا به آدرس متفاوتی بازنشانی شود. یک بارگذار ساده سیستم تعبیهشده 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) اختصاص مییابد، کنترل میکند. آرگومان priority مقادیر 0، 1 یا 2 را میپذیرد تا (به ترتیب) هیچ اولویتی، بالاترین، یا دومین بالاترین اولویت را به دستورالعملهای دارای محدودیت در اسلات اعزام اختصاص دهد.
- -msched-costly-dep=dependence_type
- این گزینه کنترل میکند که کدام وابستگیها در طول زمانبندی دستورالعملها توسط هدف پرهزینه در نظر گرفته شوند. آرگومان 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
- هر گروه اعزامی (dispatch group) که بر اساس گروهبندی زمانبند، دارای اسلاتهای صدور خالی باشد، با NOP پُر شود.
- regroup_exact
- درج NOPها برای اجبار دستورالعملهای وابستهٔ پرهزینه به گروههای جداگانه. بر اساس گروهبندی تخمینی پردازنده، دقیقاً به تعداد لازم NOP درج میشود تا یک دستورالعمل به گروه جدید منتقل شود.
- number
- درج NOPها برای اجبار دستورالعملهای وابستهٔ پرهزینه به گروههای جداگانه. درج number دستورالعمل NOP برای انتقال یک دستورالعمل به گروه جدید.
- -mcall-sysv
- در System V.4 و سیستمهای تعبیهشده PowerPC، کد را با استفاده از قراردادهای فراخوانی منطبق با پیشنویس مارس ۱۹۹۵ ضمیمه پردازنده PowerPC برای System V Application Binary Interface کامپایل میکند. این حالت پیشفرض است مگر اینکه 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 توکار، کد را برای سیستم گنو مبتنی بر لینوکس کامپایل میکند.
- -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) را در حافظه بازمیگرداند (همانطور که توسط AIX ABI مشخص شده است).
- -msvr4-struct-return
- ساختارهای کوچکتر از ۸ بایت را در ثباتها بازمیگرداند (همانطور که توسط SVR4 ABI مشخص شده است).
- -mabi=abi-type
- واسط باینری کاربردی (ABI) فعلی را با یک افزونهٔ خاص گسترش میدهد، یا چنین افزونهای را حذف میکند. مقادیر معتبر عبارتند از: altivec، no-altivec، ibmlongdouble، ieeelongdouble، elfv1، elfv2، و برای AIX: vec-extabi، vec-default.
- -mabi=ibmlongdouble
- واسط ABI فعلی را برای استفاده از long double با دقت گسترشیافتهٔ IBM تغییر میدهد. اگر پیشفرض سامانهٔ شما استفاده از long double با دقت گسترشیافتهٔ IEEE باشد، این احتمالاً کار نخواهد کرد. اگر نوع long double را از دقت گسترشیافتهٔ IEEE تغییر دهید، کامپایلر یک هشدار صادر میکند مگر اینکه از گزینهٔ -Wno-psabi استفاده کنید. نیازمند فعال بودن -mlong-double-128 است.
- -mabi=ieeelongdouble
- واسط ABI فعلی را برای استفاده از long double با دقت گسترشیافتهٔ IEEE تغییر میدهد. اگر پیشفرض سامانهٔ شما استفاده از long double با دقت گسترشیافتهٔ IBM باشد، این احتمالاً کار نخواهد کرد. اگر نوع long double را از دقت گسترشیافتهٔ IBM تغییر دهید، کامپایلر یک هشدار صادر میکند مگر اینکه از گزینهٔ -Wno-psabi استفاده کنید. نیازمند فعال بودن -mlong-double-128 است.
- -mabi=elfv1
- واسط ABI فعلی را به استفاده از ELFv1 ABI تغییر میدهد. این، واسط ABI پیشفرض برای لینوکس ۶۴ بیتی PowerPC با ترتیب بایت بزرگانتها (big-endian) است. نادیدهگرفتن ABI پیشفرض نیازمند پشتیبانی سیستمی ویژه است و احتمالاً به شکلهای فاجعهباری با شکست مواجه میشود.
- -mabi=elfv2
- واسط ABI فعلی را به استفاده از ELFv2 ABI تغییر میدهد. این، واسط ABI پیشفرض برای لینوکس ۶۴ بیتی PowerPC با ترتیب بایت کوچکانتها (little-endian) است. نادیدهگرفتن ABI پیشفرض نیازمند پشتیبانی سیستمی ویژه است و احتمالاً به شکلهای فاجعهباری با شکست مواجه میشود.
- -mgnu-attribute
- -mno-gnu-attribute
- دستورالعملهای اسمبلی .gnu_attribute را درج میکند تا جفتهای برچسب/مقدار را در یک بخش .gnu.attributes تنظیم کند که دگرگونیهای ABI را در پارامترهای تابع یا مقادیر بازگشتی مشخص میکنند.
- -mprototype
- -mno-prototype
- روی سامانههای System V.4 و PowerPC توکار فرض میکند که تمام فراخوانیها به توابع با آرگومانهای متغیر به درستی پیشنمونهسازی شدهاند. در غیر این صورت، کامپایلر باید قبل از هر فراخوانی فاقد پیشنمونه، دستورالعملی برای تنظیم یا پاک کردن بیت ۶ ثبات کد شرط ("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، تمام دادههای سراسری و ایستا (static) مقداردهیشده را در بخش ".data" و تمام دادههای مقداردهینشده را در بخش ".bss" قرار میدهد.
- -mreadonly-in-sdata
- اشیاء فقطخواندنی را نیز در بخش ".sdata" قرار میدهد. این گزینه پیشفرض است.
- -mblock-move-inline-limit=num
- تمام انتقالهای بلوکی (مانند فراخوانیهای "memcpy" یا کپیهای ساختار) با اندازهٔ کمتر یا مساوی num بایت را بهصورت درونخطی (inline) درمیآورد. حداقل مقدار برای num در مقصدهای ۳۲ بیتی برابر با ۳۲ بایت و در مقصدهای ۶۴ بیتی برابر با ۶۴ بایت است. مقدار پیشفرض وابسته به معماری مقصد است.
- -mblock-compare-inline-limit=num
- کد درونخطیِ بدون حلقه را برای تمام مقایسههای بلوکی (مانند فراخوانیهای "memcmp" یا مقایسههای ساختار) که کمتر یا مساوی num بایت هستند تولید میکند. اگر num برابر با 0 باشد، تمام بسطهای درونخطی (بدون حلقه و حلقهدار) مقایسهٔ بلوک غیرفعال میشوند. مقدار پیشفرض وابسته به معماری مقصد است.
- -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 برابر با 8 است. سوئیچ -G num به پیونددهنده (linker) نیز ارسال میشود. تمام پیمانهها باید با مقدار یکسان -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 آدرس اول را ترجیح میدهد و چنانچه دستور PPC "bl" مستقیماً به تابع فراخواندهشده برسد، یک "bl callee" تولید میکند؛ در غیر این صورت، پیونددهنده دستور "bl L42" را برای فراخوانی branch island تولید مینماید. جزیرهٔ انشعاب (branch island) به بدنهٔ تابع فراخواننده پیوست میشود؛ این بخش آدرس کامل ۳۲ بیتی تابع فراخواندهشده را محاسبه کرده و به آن پرش میکند.
در سیستمهای Mach-O (Darwin)، این گزینه کامپایلر را هدایت میکند تا کد واسط را برای هر فراخوانی مستقیم ایجاد کند، و پیونددهندهٔ Darwin تصمیم میگیرد که آیا از آن استفاده کند یا آن را نادیده بگیرد.
در آینده، در صورتی که مشخص شود پیونددهنده قادر به تولید کدهای واسط است، ممکن است GCC تمام مشخصههای longcall را نادیده بگیرد.
- -mpltseq
- -mno-pltseq
- گزینهٔ -fno-plt و فراخوانیهای طولانی را با استفاده از یک دنبالهٔ فراخوانی PLT درونخطی پیادهسازی میکند (یا نمیکند)؛ این دنباله از پیوند تنبل (lazy linking) و فراخوانیهای طولانی به توابع در کتابخانههای مشترکِ بارگذاریشده از طریق dlopen پشتیبانی میکند. فراخوانیهای PLT درونخطی تنها در PowerPC64 ELFv2 و سیستمهای ۳۲ بیتی PowerPC با پیونددهندههای جدیدتر GNU پشتیبانی میشوند، و در صورتی که این پشتیبانی هنگام پیکربندی GCC شناسایی شود بهطور پیشفرض فعال هستند؛ همچنین در مورد PowerPC ۳۲ بیتی، این قابلیت مشروط به پیکربندی GCC با --enable-secureplt است. کدهای کامپایلشده با -mpltseq و اشیاء بازآدرسپذیر ۳۲ بیتی PowerPC با -mbss-plt ممکن است نتوانند با یکدیگر پیوند داده شوند.
- -mtls-markers
- -mno-tls-markers
- فراخوانیهای "__tls_get_addr" را با یک بازآدرسدهی (relocation) که آرگومان تابع را مشخص میکند نشانهگذاری میکند (یا نمیکند). این بازآدرسدهی به پیونددهنده اجازه میدهد تا برای بهینهسازی TLS، فراخوانی تابع را بهصورت مطمئن با دستورالعملهای راهاندازی آرگومان مرتبط سازد، که این موضوع به نوبهٔ خود به GCC اجازه میدهد دنباله را بهتر زمانبندی کند.
- -mrecip
- -mno-recip
- این گزینه استفاده از دستورالعملهای تخمین معکوس (reciprocal estimate) و تخمین معکوس ریشهٔ دوم را با گامهای تکمیلی نیوتن-رافسون جهت افزایش دقت، به جای انجام تقسیم یا جذر و تقسیم برای آرگومانهای ممیز شناور فعال میکند. شما باید هنگام استفاده از -mrecip، از گزینهٔ -ffast-math (یا حداقل -funsafe-math-optimizations، -ffinite-math-only، -freciprocal-math و -fno-trapping-math) استفاده کنید. توجه داشته باشید در حالی که توان عملیاتی دنباله عموماً بالاتر از توان عملیاتی دستورالعملهای غیرمعکوس است، دقت دنباله برای معکوس ریشههای دوم میتواند تا ۲ ulp کاهش یابد (یعنی معکوس 1.0 برابر با 0.99999994 میشود).
- -mrecip=opt
- این گزینه کنترل میکند که کدام دستورالعملهای تخمین معکوس مجاز به استفاده هستند. opt فهرستی از گزینههاست که با کاما از هم جدا شدهاند، و میتواند با یک "!" برای نقیض کردن گزینه همراه شود:
- all
- تمام دستورالعملهای تخمین را فعال میکند.
- default
- دستورالعملهای پیشفرض را فعال میکند که معادل با -mrecip است.
- none
- تمام دستورالعملهای تخمین را غیرفعال میکند که معادل با -mno-recip است.
- div
- دستورالعملهای تقریب معکوس را برای هر دو دقت یگانه (single precision) و مضاعف (double precision) فعال میکند.
- divf
- دستورالعملهای تقریب معکوس با دقت یگانه را فعال میکند.
- divd
- دستورالعملهای تقریب معکوس با دقت مضاعف را فعال میکند.
- rsqrt
- دستورالعملهای تقریب معکوس ریشهٔ دوم را برای هر دو دقت یگانه و مضاعف فعال میکند.
- rsqrtf
- دستورالعملهای تقریب معکوس ریشهٔ دوم با دقت یگانه را فعال میکند.
- rsqrtd
- دستورالعملهای تقریب معکوس ریشهٔ دوم با دقت مضاعف را فعال میکند.
بنابراین به عنوان مثال، -mrecip=all,!rsqrtd تمام دستورالعملهای تخمین معکوس را فعال میکند، به جز دستورالعملهای "FRSQRTE"، "XSRSQRTEDP" و "XVRSQRTEDP" که محاسبات معکوس ریشهٔ دوم با دقت مضاعف را انجام میدهند.
- -mno-recip-precision
- فرض میکند (فرض نمیکند) که دستورالعملهای برآورد معکوس، تخمینهایی با دقت بالاتر از آنچه توسط ABI مربوط به PowerPC الزامی شده است، ارائه میدهند. انتخاب -mcpu=power6، -mcpu=power7 یا -mcpu=power8 بهطور خودکار -mrecip-precision را فعال میکند. دستورالعملهای برآورد ریشه دوم با دقت مضاعف بهطور پیشفرض روی ماشینهای با دقت پایین تولید نمیشوند، زیرا تخمینی ارائه نمیدهند که پس از سه مرحله همگرا شود.
- -mveclibabi=type
- نوع ABI مورد استفاده برای برداریسازی توابع درونی با استفاده از یک کتابخانه خارجی را مشخص میکند. در حال حاضر تنها نوع پشتیبانیشده mass است، که استفاده از کتابخانههای سامانه شتابدهی ریاضیاتی (MASS) شرکت IBM's را برای برداریسازی توابع درونی با استفاده از کتابخانههای خارجی مشخص میکند. GCC در حال حاضر هنگام تولید کد برای power7 فراخوانیهایی به "acosd2"، "acosf4"، "acoshd2"، "acoshf4"، "asind2"، "asinf4"، "asinhd2"، "asinhf4"، "atan2d2"، "atan2f4"، "atand2"، "atanf4"، "atanhd2"، "atanhf4"، "cbrtd2"، "cbrtf4"، "cosd2"، "cosf4"، "coshd2"، "coshf4"، "erfcd2"، "erfcf4"، "erfd2"، "erff4"، "exp2d2"، "exp2f4"، "expd2"، "expf4"، "expm1d2"، "expm1f4"، "hypotd2"، "hypotf4"، "lgammad2"، "lgammaf4"، "log10d2"، "log10f4"، "log1pd2"، "log1pf4"، "log2d2"، "log2f4"، "logd2"، "logf4"، "powd2"، "powf4"، "sind2"، "sinf4"، "sinhd2"، "sinhf4"، "sqrtd2"، "sqrtf4"، "tand2"، "tanf4"، "tanhd2" و "tanhf4" ارسال میکند. هر دو گزینه -ftree-vectorize و -funsafe-math-optimizations نیز باید فعال باشند. کتابخانههای MASS باید در زمان پیوند مشخص شوند.
- -mfriz
- -mno-friz
- دستورالعمل "friz" را هنگامی که از گزینه -funsafe-math-optimizations برای بهینهسازی گرد کردن مقادیر ممیز شناور به عدد صحیح ۶۴ بیتی و بازگشت به ممیز شناور استفاده میشود، تولید میکند (تولید نمیکند). اگر عدد ممیز شناور بزرگتر از آن باشد که در یک عدد صحیح جا بگیرد، دستورالعمل "friz" مقدار یکسانی را برنمیگرداند.
- -mpointers-to-nested-functions
- -mno-pointers-to-nested-functions
- کدی را برای بارگذاری ثبات زنجیره ایستا ("r11") هنگام فراخوانی از طریق یک اشارهگر در سیستمهای AIX و لینوکس ۶۴ بیتی تولید میکند (تولید نمیکند)، جایی که یک اشارهگر تابع به یک توصیفگر ۳ کلمهای اشاره دارد که آدرس تابع، مقدار TOC برای بارگذاری در ثبات "r2"، و مقدار زنجیره ایستا برای بارگذاری در ثبات "r11" را مشخص میکند. گزینه -mpointers-to-nested-functions بهطور پیشفرض فعال است. اگر از -mno-pointers-to-nested-functions استفاده کنید، نمیتوانید از طریق اشارهگرها، توابع تودرتو یا توابعی که در زبانهای دیگر کامپایل شده و از زنجیره ایستا استفاده میکنند را فراخوانی کنید.
- -msave-toc-indirect
- -mno-save-toc-indirect
- اگر تابع از طریق یک اشارهگر در سیستمهای AIX و لینوکس ۶۴ بیتی فراخوانی انجام دهد، کدی را برای ذخیره مقدار TOC در مکان رزروشده پشته در مقدمه تابع (function prologue) تولید میکند (تولید نمیکند). اگر مقدار TOC در مقدمه ذخیره نشود، دقیقاً قبل از فراخوانی از طریق اشارهگر ذخیره میشود. گزینه -mno-save-toc-indirect حالت پیشفرض است.
- -mcompat-align-parm
- -mno-compat-align-parm
- کدی را برای
ارسال
پارامترهای
ساختار با
حداکثر
همترازی
۶۴ بیت، جهت
سازگاری با
نسخههای
قدیمیتر GCC
تولید
میکند
(تولید
نمیکند).
نسخههای قدیمیتر GCC (پیش از 4.9.0) به اشتباه هنگامی که یک ساختار شامل عضوی نیازمند همترازی ۱۲۸ بیتی بود، پارامتر ساختار را روی مرز ۱۲۸ بیتی همتراز نمیکردند. این مورد در نسخههای جدیدتر GCC اصلاح شده است. این گزینه ممکن است برای تولید کدی که با توابع کامپایلشده توسط نسخههای قدیمیتر GCC سازگار است، استفاده شود.
گزینه -mno-compat-align-parm پیشفرض است.
- -mstack-protector-guard=guard
- -mstack-protector-guard-reg=reg
- -mstack-protector-guard-offset=offset
- کد محافظت
پشته را با
استفاده از
قناری (canary) در
guard تولید
میکند.
مکانهای
پشتیبانیشده
عبارتند از
global برای
قناری
سراسری یا
tls برای
قناری به
ازای هر
رشته در
بلوک TLS
(پیشفرض با
نسخه 2.4 یا
جدیدتر GNU libc).
با انتخاب حالت دوم، گزینههای -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
- دستورالعملهای تسهیلات ریاضیات متراکم (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 نیز بهطور خودکار فعال میشود. دلیل این امر آن است که خود دستورالعملهای RX FPU ناامن هستند.
- -mcpu=name
- نوع
پردازندهی
RX مقصد را
انتخاب
میکند. در
حال حاضر سه
نوع
پشتیبانی
میشوند:
سختافزار
عمومی
سریهای RX600
و RX200، و
پردازندهی
خاص RX610.
مقدار
پیشفرض RX600
است.
تنها تفاوت میان RX600 و RX610 در این است که RX610 از دستورالعمل "MVTIPL" پشتیبانی نمیکند.
سری RX200 فاقد واحد سختافزاری ممیز شناور است و بنابراین هنگامی که این نوع انتخاب شود، -nofpu بهطور پیشفرض فعال میگردد.
- -mbig-endian-data
- -mlittle-endian-data
- دادهها (نه کدها) را در قالب big-endian ذخیره میکند. پیشفرض -mlittle-endian-data است؛ یعنی ذخیرهسازی دادهها در قالب little-endian.
- -msmall-data-limit=N
- حداکثر
اندازهی
متغیرهای
سراسری و
ایستا بر
حسب بایت را
مشخص
میکند که
میتوانند
در ناحیهی
دادههای
کوچک (small data area)
قرار گیرند.
استفاده از
این ناحیه
میتواند
به تولید
کدی
کوچکتر و
سریعتر
منجر شود،
اما
اندازهی
این ناحیه
محدود است و
برنامهنویس
باید
اطمینان
حاصل کند که
این ناحیه
سرریز نشود.
همچنین
هنگام
استفاده از
ناحیهی
دادههای
کوچک، یکی
از
ثباتهای RX
(معمولاً
"r13") برای
اشاره به
این ناحیه
رزرو
میشود،
بنابراین
دیگر برای
استفاده
توسط
کامپایلر
در دسترس
نخواهد بود.
این امر در
صورتی که
متغیرها به
جای
نگهداری در
این ثبات بر
روی پشته
قرار
گیرند،
میتواند
به کدی
کندتر و/یا
بزرگتر
منجر شود.
توجه داشته باشید، متغیرهای مشترک (متغیرهایی که مقداردهی اولیه نشدهاند) و مقادیر ثابت در ناحیهی دادههای کوچک قرار نمیگیرند، چرا که به بخشهای دیگری در فایل اجرایی خروجی تخصیص داده میشوند.
مقدار پیشفرض صفر است که این ویژگی را غیرفعال میکند. توجه داشته باشید که این ویژگی با سطوح بهینهسازی بالاتر (-O2 و غیره) بهطور پیشفرض فعال نمیشود، زیرا رزرو یک ثبات ممکن است اثرات زیانباری داشته باشد. این به عهدهی برنامهنویس است که با آزمایش دریابد آیا این ویژگی برای برنامهاش سودمند است یا خیر. برای توضیحات مربوط به نحوهی انتخاب ثبات واقعی جهت نگهداری اشارهگر ناحیهی دادههای کوچک، شرح گزینهی -mpid را ببینید.
- -msim
- -mno-sim
- از زمان اجرای شبیهساز (simulator runtime) استفاده میکند. حالت پیشفرض، استفاده از زمان اجرای خاص برد libgloss است.
- -mas100-syntax
- -mno-as100-syntax
- هنگام تولید خروجی اسمبلر، از نحوی استفاده میکند که با اسمبلر AS100 متعلق به شرکت Renesas سازگار است. این نحو توسط اسمبلر GAS نیز قابل پردازش است، اما محدودیتهایی دارد، بنابراین بهطور پیشفرض تولید نمیشود.
- -mmax-constant-size=N
- حداکثر
اندازهی
یک مقدار
ثابت (بر
حسب بایت)
را که
میتواند
بهعنوان
یک عملوند
در یک
دستورالعمل
RX استفاده
شود مشخص
میکند.
گرچه
مجموعهدستورالعملهای
RX اجازهی
استفاده از
ثوابتی تا
طول ۴ بایت
را در
دستورالعملها
میدهد،
اما مقدار
طولانیتر
به معنای
دستورالعمل
طولانیتر
است.
بنابراین
در برخی
شرایط
محدود کردن
اندازهی
ثوابت
استفادهشده
در
دستورالعملها
میتواند
سودمند
باشد.
ثوابتی که
بیش از حد
بزرگ
هستند، در
یک مخزن
مقادیر
ثابت (constant pool)
قرار گرفته
و از طریق
ارجاع
غیرمستقیم
ثباتها
فراخوانی
میشوند.
مقدار N میتواند عددی بین 0 تا 4 باشد. مقدار 0 (پیشفرض) یا 4 به این معناست که ثوابت با هر اندازهای مجاز هستند.
- -mrelax
- کاهش طول کد توسط پیونددهنده (linker relaxation) را فعال میکند. فرایندی است که طی آن پیونددهنده با یافتن نسخههای کوتاهتر از دستورالعملهای مختلف، تلاش میکند اندازهی برنامه را کاهش دهد. بهطور پیشفرض غیرفعال است.
- -mint-register=N
- تعداد ثباتهای رزروشده برای توابع گردانندهی وقفهی سریع را مشخص میکند. مقدار N میتواند بین 0 تا 4 باشد. مقدار 1 به این معنی است که ثبات "r13" برای استفادهی انحصاری گردانندههای وقفهی سریع رزرو میشود. مقدار 2 ثباتهای "r13" و "r12" را رزرو میکند. مقدار 3 ثباتهای "r13"، "r12" و "r11" را رزرو نموده و مقدار 4 ثباتهای "r13" تا "r10" را رزرو میکند. مقدار 0 (پیشفرض) هیچ ثباتی را رزرو نمیکند.
- -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 در صورتی که هنگام کامپایل یک فایل بیش از یک گرداننده وقفه سریع (fast interrupt handler) پیدا کند، جلوگیری میکند. حالت پیشفرض صدور هشدار برای هر گرداننده وقفه سریع اضافیِ پیدا شده است، زیرا 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 نماد پیشپردازنده سی "__RX_ALLOW_STRING_INSNS__" را تعریف میکند، و در غیر این صورت نماد "__RX_DISALLOW_STRING_INSNS__" را تعریف مینماید.
- -mjsr
- -mno-jsr
- فقط (یا نه فقط) از دستورالعملهای "JSR" برای دسترسی به توابع استفاده میکند. هنگامی که اندازه کد از محدوده دستورالعملهای "BSR" فراتر رود، میتوان از این گزینه استفاده کرد. توجه داشته باشید که -mno-jsr به معنای عدم استفاده از "JSR" نیست، بلکه به این معناست که از هر نوع پرشی (branch) میتوان استفاده کرد.
- -mlra
- از تخصیصدهنده ثبات جدید LRA استفاده میکند. بهطور پیشفرض، از تخصیصدهنده قدیمی "reload" استفاده میشود.
نکته: گزینه خط فرمان عمومی GCC به نام -ffixed-reg در پورت RX، هنگامی که همراه با ویژگی تابع "interrupt" استفاده شود، اهمیت ویژهای دارد. این ویژگی نشاندهنده تابعی است که برای پردازش وقفههای سریع در نظر گرفته شده است. 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
- آدرس قاب (frame)
فراخواننده
را به عنوان
اشارهگر backchain
در قاب پشته
فراخواندهشده
ذخیره
میکند (یا
ذخیره
نمیکند).
یک backchain ممکن
است برای
امکان
اشکالزدایی
با استفاده
از
ابزارهایی
که اطلاعات
قاب
فراخوانی DWARF
را تشخیص
نمیدهند،
لازم باشد.
هنگامی که
-mno-packed-stack فعال
باشد،
اشارهگر backchain
در انتهای
قاب پشته
ذخیره
میشود؛
هنگامی که
-mpacked-stack فعال
باشد، backchain در
بالاترین
کلمه (word) از
ناحیه
ذخیره ثبات
۹۶/۱۶۰
بایتی قرار
میگیرد.
بهطور کلی، کدی که با -mbackchain کامپایل شده است، از نظر فراخوانی با کدی که با -mno-backchain کامپایل شده سازگار است (call-compatible)؛ با این حال، استفاده از backchain برای اهداف اشکالزدایی معمولاً نیازمند این است که تمام باینری با -mbackchain ساخته شود. توجه داشته باشید که ترکیب -mbackchain، -mpacked-stack و -mhard-float پشتیبانی نمیشود. برای ساخت هسته لینوکس از -msoft-float استفاده کنید.
پیشفرض این است که backchain نگهداری نشود.
- -mpacked-stack
- -mno-packed-stack
- از چینش
پشته فشرده
(packed stack layout)
استفاده
میکند (یا
نمیکند).
هنگامی که
-mno-packed-stack مشخص
شود،
کامپایلر
تمام
فیلدهای
ناحیه
ذخیره ثبات
۹۶/۱۶۰
بایتی را
فقط برای
هدف
پیشفرض
آنها
استفاده
میکند؛
فیلدهای
بلااستفاده
همچنان
فضای پشته
را اشغال
میکنند.
هنگامی که
-mpacked-stack مشخص
شود،
شیارهای (slots)
ذخیره ثبات
بهصورت
متراکم در
بالای
ناحیه
ذخیره ثبات
چیده
میشوند؛
فضای
استفادهنشده
برای اهداف
دیگر
دوباره
استفاده
میشود، که
امکان
استفاده
بهینهتر
از فضای
پشته موجود
را فراهم
میآورد. با
این حال،
هنگامی که
-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 مربوط به GNU/Linux برای S/390 تولید میکند. هنگامی که -m64 مشخص شود، کدی منطبق بر ABI مربوط به GNU/Linux برای zSeries تولید میکند. این امر بهویژه به GCC اجازه میدهد دستورالعملهای ۶۴ بیتی تولید کند. برای مقاصد s390، پیشفرض -m31 است، در حالی که برای مقاصد s390x پیشفرض -m64 میباشد. توجه داشته باشید که -m31 منسوخ شده است و پشتیبانی از آن حذف خواهد شد.
- -mzarch
- -mesa
- هنگامی که -mzarch مشخص شود، کدی با استفاده از دستورالعملهای موجود در z/Architecture تولید میکند. هنگامی که -mesa مشخص شود، کدی با استفاده از دستورالعملهای موجود در ESA/390 تولید میکند. توجه داشته باشید که -mesa همراه با -m64 امکانپذیر نیست. هنگام تولید کدی که با ABI مربوط به GNU/Linux برای S/390 مطابقت دارد، پیشفرض -mesa است. هنگام تولید کدی که با ABI مربوط به GNU/Linux برای 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 استفاده شوند، یک دستور GAS .gnu_attribute برای نشانهگذاری فایل دودویی حاصل با ABI استفادهشده، اضافه میشود. گزینهٔ -mvx هنگام استفاده از -march=z13 بهطور پیشفرض فعال است.
- -mzvector
- -mno-zvector
- گزینهٔ -mzvector افزونههای زبان برداری و توابع توکار را که از دستورالعملهای قابلیت افزونهٔ برداری معرفیشده با نسل ماشین IBM z13 بهره میبرند، فعال میکند. این گزینه پشتیبانی از vector را بهعنوان یک کلمهٔ کلیدی برای تعریف متغیرها و آرگومانهای نوع برداری اضافه میکند. vector تنها زمانی در دسترس است که افزونههای GNU فعال باشند. هنگام درخواست تطابق دقیق با استانداردها، مثلاً با -std=c99، این کلمه بسط داده نمیشود. علاوه بر توابع توکار سطح پایین GCC، گزینهٔ -mzvector مجموعهای از توابع توکار اضافهشده برای سازگاری با پیادهسازیهای سبک AltiVec مانند Power و Cell را فعال میسازد. برای استفاده از این توابع توکار، باید فایل سرآیند vecintrin.h را بگنجانید. گزینهٔ -mzvector بهطور پیشفرض غیرفعال است.
- -mmvcle
- -mno-mvcle
- تولید (یا عدم تولید) کد با استفاده از دستورالعمل "mvcle" جهت انجام جابهجاییهای بلوکی. وقتی -mno-mvcle مشخص شود، در عوض از یک حلقهٔ "mvc" استفاده میشود. این گزینه پیشفرض است مگر اینکه بهینهسازی برای اندازه (size) فعال باشد.
- -mdebug
- -mno-debug
- چاپ کردن (یا نکردن) اطلاعات اشکالزدایی اضافی هنگام کامپایل. پیشفرض بر این است که اطلاعات اشکالزدایی چاپ نشود.
- -march=cpu-type
- تولید کدی
که بر روی cpu-type
اجرا شود،
که نام
سیستمی
نشاندهندهٔ
یک نوع
پردازندهٔ
خاص است.
مقادیر
ممکن برای
cpu-type عبارتند
از z900/arch5،
z990/arch6، z9-109،
z9-ec/arch7، z10/arch8،
z196/arch9، zEC12،
z13/arch11، z14/arch12،
z15/arch13، z16/arch14،
z17/arch15 و native.
پیشفرض -march=z900 است.
مشخص کردن native بهعنوان نوع پردازنده میتواند برای انتخاب بهترین گزینهٔ معماری متناسب با پردازندهٔ میزبان به کار رود. در صورتی که GCC پردازنده را شناسایی نکند، -march=native هیچ تأثیری نخواهد داشت.
- -mtune=cpu-type
- تنظیم و بهینهسازی کلیه موارد مربوط به کد تولیدشده متناسب با cpu-type، به استثنای ABI و مجموعه دستورالعملهای در دسترس. فهرست مقادیر ممکن برای cpu-type همانند گزینهٔ -march است. پیشفرض همان مقدار استفادهشده برای -march است.
- -mtpf-trace
- -mno-tpf-trace
- تولید کدی که انشعابهای مختص سیستمعامل TPF OS را به روالهای ردگیری (trace routines) در سیستمعامل اضافه کند (یا نکند). این گزینه بهطور پیشفرض غیرفعال است، حتی هنگام کامپایل برای TPF OS.
- -mtpf-trace-skip
- -mno-tpf-trace-skip
- تولید کدی که مقاصد پیشفرض انشعابِ فعالشده توسط -mtpf-trace را تغییر دهد (یا ندهد) تا به روالهای ردگیری تخصصی اشاره کنند که امکان رد کردن انتخابی ورودیهای ردگیری تابع را برای TPF OS فراهم میآورند. این گزینه بهطور پیشفرض خاموش است، حتی هنگام کامپایل برای TPF OS و مشخص کردن -mtpf-trace.
- -mmain
- برای مقصد TPF OS، از این گزینه هنگام پیوند دادن (link) جهت افزودن کد راهاندازی (startup code) و سایر گزینههای پیونددهنده برای تولید یک شیء اصلی استفاده کنید.
- -mfused-madd
- -mno-fused-madd
- تولید کدی که از دستورالعملهای ضرب و جمع ممیز شناور (multiply and accumulate) استفاده کند (یا نکند). در صورت استفاده از ممیز شناور سختافزاری، این دستورالعملها بهطور پیشفرض تولید میشوند.
- -mwarn-framesize=framesize
- صدور هشدار
در صورتی که
تابع فعلی
از اندازهٔ
فریم (frame size)
مشخصشده
فراتر رود.
از آنجا که
این بررسی
در زمان
کامپایل
انجام
میشود،
لزوماً به
این معنی
نیست که
هنگام
اجرای
برنامه
مشکلی
واقعی رخ
خواهد داد.
هدف آن
شناسایی
توابعی است
که با
بیشترین
احتمال
باعث سرریز
پشته (stack overflow)
میشوند.
این گزینه
برای
محیطهایی
با اندازهٔ
پشتهٔ
محدود
مانند
هستهٔ
لینوکس (Linux kernel)
کاربرد
دارد.
مقدار صفر این هشدار را غیرفعال میکند؛ که مقدار پیشفرض نیز هست.
- -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 مشخص
نشود،
کوچکترین
توان ۲
بزرگتر از
اندازهٔ
فریمِ تابع
کامپایلشده
برگزیده
میشود.
این گزینهها برای کمک به اشکالزدایی مسائل مربوط به سرریز پشته در نظر گرفته شدهاند. کد اضافی تولیدشده سربار ناچیزی ایجاد میکند و از این رو میتوان از آن در سیستمهای مشابه عملیاتی نیز بدون افت چشمگیر کارایی استفاده کرد.
مقادیر دادهشده باید دقیقاً از توانهای ۲ باشند و stack-size باید بزرگتر از stack-guard بوده و از 64k فراتر نرود. برای کارایی بیشتر، کد اضافه این فرض را در نظر میگیرد که پشته از آدرسی آغاز میشود که با مقدار ارائهشده توسط stack-size تراز شده است.
گزینهٔ -mstack-guard= تنها میتواند در کنار -mstack-size= به کار رود. شما میتوانید این گزینهها را در خط فرمان به ترتیب با -mno-stack-guard و -mno-stack-size بازنویسی (override) کنید.
- -mhotpatch=pre-halfwords,post-halfwords
- در صورت
فعال بودن
گزینهٔ hotpatch،
یک مقدمهٔ
تابع
"وصلهزنی
درجا" (hot-patching)
برای تمامی
توابع
موجود در
واحد ترجمه
تولید
میشود. پیش
از برچسب
تابع،
تعداد
مشخصشده
از
دستورالعملهای
دو بایتی NOP
درج میشود
(pre-halfwords،
حداکثر
۱۰۰۰۰۰۰).
پس از
برچسب، 2 * post-halfwords
بایت با
بهرهگیری
از
بزرگترین
دستورالعملهای
شبه-NOP که
معماری
مجاز
میداند
افزوده
میشود
(حداکثر
۱۰۰۰۰۰۰).
در صورتی که هر دو آرگومان صفر باشند، وصلهزنی درجا غیرفعال میشود.
این گزینه را میتوان برای توابع منفرد با استفاده از مشخصهٔ "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
- تولید کد
محافظت از
پشته با
استفاده از
قناری (canary) در
guard.
مکانهای
پشتیبانیشده
عبارتند از
global برای یک
قناری
سراسری یا
tls برای یک
قناری به
ازای هر
ریسه در
بلوک TLS
(پیشفرض).
گزینه -mstack-protector-guard-record منجر به تولید بخش "__stack_protector_loc" حاوی اشارهگرهایی به تمام دستورالعملهایی میشود که آدرس محافظ سراسری را بارگذاری میکنند. بنابراین، این گزینه تنها در ترکیب با -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 رفع
میکنند.
مشخص کردن choice به صورت keep موجب تولید کد پیشفرض میشود. thunk تولید thunkهای برونخط (out-of-line) را فعال کرده و انشعاب پیشتر غیرمستقیم را با یک انشعاب مستقیم به thunk جایگزین میکند. thunk-extern جایگزینی انشعاب را مانند thunk انجام میدهد اما thunkها را تولید نمیکند. thunk-inline تنها با -mindirect-branch-jump در دسترس است؛ در برنامههای فضای کاربر (user-space) باید استفاده از آن نسبت به thunk ترجیح داده شود تا از بازکردن صحیح پشته (stack unwinding) و رسیدگی به استثناها پشتیبانی گردد.
گزینه -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، کد پروفایلسازی را با استفاده از قلاب (hook) "__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 متناظر را تولید میکند. این ویژگی برای برنامههایی مفید است که میخواهند فرایند بازکردن پشته مخصوص خود را پیادهسازی کنند و نیاز به دسترسی به آرگومانهای تابع دارند.
- -munaligned-symbols
- -mno-unaligned-symbols
- فرض میکند که نمادهای خارجی با تراز طبیعی ۱، بهطور بالقوه ناتراز (unaligned) هستند. بهطور پیشفرض، فرض میشود تمام نمادهای فاقد تراز صریح، همانطور که توسط IBM Z ABI الزامی شده است، روی مرز ۲ بایتی تراز شدهاند.
گزینههای SH (SH Options)
این گزینههای -m برای پیادهسازیهای SH تعریف شدهاند:
- -m1
- تولید کد برای SH1.
- -m2
- تولید کد برای SH2.
- -m2e
- تولید کد برای SH2e.
- -m2a-nofpu
- تولید کد برای SH2a فاقد FPU، یا برای یک SH2a-FPU به گونهای که از واحد ممیز شناور استفاده نشود.
- -m2a-single-only
- تولید کد برای SH2a-FPU به گونهای که از هیچیک از عملیات ممیز شناور با دقت مضاعف (double-precision) استفاده نشود.
- -m2a-single
- تولید کد برای SH2a-FPU با فرض اینکه واحد ممیز شناور بهطور پیشفرض در حالت دقت منفرد (single-precision) است.
- -m2a
- تولید کد برای SH2a-FPU با فرض اینکه واحد ممیز شناور بهطور پیشفرض در حالت دقت مضاعف (double-precision) است.
- -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
- درونخطی کردن کد برای نامعتبرسازی ورودیهای حافظهٔ نهان دستورالعمل پس از برپایی ترامپولینهای توابع تودرتو. این گزینه در صورتی که -musermode فعال باشد و گزینهٔ تولید کدِ انتخابشده (مانند -m4) اجازهٔ استفاده از دستورالعمل "icbi" را ندهد، هیچ اثری ندارد. اگر گزینهٔ تولید کد انتخابشده اجازهٔ استفاده از دستورالعمل "icbi" را ندهد، و -musermode فعال نباشد، کد درونخطیشده آرایهٔ آدرس حافظهٔ نهان دستورالعمل را مستقیماً با یک نوشتن انجمنی دستکاری میکند. این امر نه تنها در زمان اجرا به حالت ممتاز (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 استفاده شود. برای سایر مدلها این پارامتر نادیده گرفته میشود. مقدار مشخصشده باید مضرب صحیحی از چهار و در محدودهٔ 0-1020 باشد.
- strict
- این پارامتر از استفادهٔ ترکیبی چندین مدل اتمیک، حتی در صورت سازگار بودن آنها، جلوگیری کرده و باعث میشود کامپایلر تنها دنبالههای اتمیک مدل مشخصشده را تولید کند.
- -mtas
- کد دستور (opcode) "tas.b" را برای "__atomic_test_and_set" تولید میکند. توجه داشته باشید که بسته به پیکربندی سختافزاری و نرمافزاری خاص، این امر به دلیل تخلیهٔ خط حافظهٔ نهان (cache line flush) عملوند که ناشی از دستور "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 را نیز در بر میگیرد. هنگامی که هدف "sh*-*-linux*" باشد، -musermode حالت پیشفرض است. اگر هدف SH1* یا SH2* باشد، -musermode هیچ تأثیری ندارد، زیرا در آنها حالت کاربر وجود ندارد.
- -multcost=number
- هزینهٔ فرضی برای یک دستور ضرب را تعیین میکند.
- -mdiv=strategy
- راهبرد تقسیم را برای استفاده در عملیات تقسیم اعداد صحیح تعیین میکند. strategy میتواند یکی از موارد زیر باشد:
- call-div1
- تابع کتابخانهای را فراخوانی میکند که از دستور تقسیم تکمرحلهای "div1" برای انجام عملیات استفاده میکند. تقسیم بر صفر نتیجهای نامشخص محاسبه کرده و ایجاد تله (trap) نمیکند. این حالت، بهجز برای SH4، SH2A و SHcompact، پیشفرض است.
- call-fp
- تابع کتابخانهای را فراخوانی میکند که عملیات را با ممیز شناور دقتمضاعف انجام میدهد. تقسیم بر صفر موجب خطای ممیز شناور (floating-point exception) میشود. این حالت برای SHcompact دارای FPU پیشفرض است. مشخص کردن این مورد برای مقاصدی که فاقد FPU دقتمضاعف هستند، به پیشفرض "call-div1" برمیگردد.
- call-table
- تابع کتابخانهای را فراخوانی میکند که از یک جدول جستجو برای مقسومعلیههای کوچک و از دستور "div1" با تفکیک حالت برای مقسومعلیههای بزرگتر استفاده میکند. تقسیم بر صفر نتیجهای نامشخص محاسبه کرده و ایجاد تله نمیکند. این حالت پیشفرض برای SH4 است. مشخص کردن این گزینه برای مقاصدی که فاقد دستورهای جابهجایی پویا هستند، به پیشفرض "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 را به عنوان هزینه برای یک دستور پرش (branch) در نظر میگیرد. مقادیر بالاتر باعث میشوند کامپایلر تلاش کند تا در صورت امکان کدهای بدون پرش بیشتری تولید کند. اگر مشخص نشود، مقدار بسته به نوع پردازندهای که برای آن کامپایل میشود انتخاب خواهد شد.
- -mzdcbranch
- -mno-zdcbranch
- فرض میکند (فرض نمیکند) که دستورهای پرش شرطی با جابهجایی صفر (zero displacement) "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" را برای تقریب معکوس ریشهٔ دوم تولید کند. گزینهٔ -mfsrra باید در ترکیب با -funsafe-math-optimizations و -ffinite-math-only استفاده شود. این گزینه هنگام تولید کد برای SH4A بهطور پیشفرض فعال است. استفاده از -mno-fsrra تقریبهای معکوس ریشهٔ دوم را غیرفعال میکند حتی اگر -funsafe-math-optimizations و -ffinite-math-only فعال باشند.
- -mpretend-cmove
- -mno-pretend-cmove
- پرشهای شرطی با جابهجایی صفر را برای الگوهای دستور انتقال شرطی ترجیح میدهد یا ترجیح نمیدهد. این کار میتواند منجر به ایجاد کدهای سریعتر در پردازندهٔ SH4 شود.
- -mfdpic
- -mno-fdpic
- کد را با استفاده از FDPIC ABI تولید میکند.
- -mlra
- -mno-lra
- از تخصیصدهندهٔ ثبات جدید LRA استفاده میکند. بهطور پیشفرض، از تخصیصدهندهٔ قدیمی "reload" استفاده میشود.
گزینههای Solaris 2
این گزینهها روی Solaris 2 پشتیبانی میشوند:
- -mclear-hwcap
- -mno-clear-hwcap
- -mclear-hwcap به کامپایلر اعلام میکند که قابلیتهای سختافزاری (hardware capabilities) ایجاد شده توسط اسمبلر Solaris را حذف کند. این کار فقط زمانی لازم است که فایلهای شیء از افزونههای ISA استفاده میکنند که توسط ماشین فعلی پشتیبانی نمیشود، اما در زمان اجرا بررسی میکنند که آیا باید از آنها استفاده شود یا خیر.
- -mimpure-text
- -mno-impure-text
- گزینهٔ -mimpure-text
در صورت
استفاده در
کنار -shared، به
کامپایلر
میگوید که
در هنگام
پیوند دادن
یک شیء
مشترک (shared object)،
مقدار -z text را
به
پیونددهنده
ارسال نکند.
با استفاده
از این
گزینه،
میتوانید
کدهای
وابسته به
موقعیت (position-dependent)
را به یک
شیء مشترک
پیوند دهید.
گزینهٔ -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
- گزینهٔ -mapp-regs
را برای
تولید
خروجی با
استفاده از
ثباتهای
سراسری ۲ تا
۴ مشخص کنید
که SPARC SVR4 ABI آنها
را برای
برنامهها
رزرو کرده
است. همانند
ثبات
سراسری ۱،
با هر یک از
ثباتهای
سراسری ۲ تا
۴ به عنوان
یک ثبات
قابلتخصیص
رفتار
میشود که
با
فراخوانیهای
توابع
بازنویسی
(clobbered) میشوند.
این حالت
پیشفرض
است.
برای سازگاری کامل با SVR4 ABI به قیمت مقداری افت کارایی، -mno-app-regs را مشخص کنید. شما باید کتابخانهها و نرمافزارهای سیستمی را با این گزینه کامپایل کنید.
- -mflat
- -mno-flat
- با -mflat،
کامپایلر
دستورالعملهای
save/restore را تولید
نمیکند و
از یک مدل
پنجرهٔ
ثبات
«مسطح» (flat) یا
تکی
استفاده
میکند. این
مدل با مدل
پنجرهٔ
ثبات
معمولی
سازگار است.
با
ثباتهای
محلی و
ثباتهای
ورودی (۰--۵)
همچنان به
عنوان
ثباتهای
«call-saved» رفتار
میشود و در
صورت نیاز
روی پشته
ذخیره
میشوند.
با -mno-flat (پیشفرض)، کامپایلر دستورالعملهای save/restore را تولید میکند (به جز برای توابع برگ). این حالت عملکرد عادی است.
- -mfpu
- -mhard-float
- تولید خروجی حاوی دستورالعملهای ممیز شناور (floating-point). این حالت پیشفرض است.
- -mno-fpu
- -msoft-float
- تولید
خروجی حاوی
فراخوانیهای
کتابخانهای
برای ممیز
شناور.
هشدار:
کتابخانههای
مورد نیاز
برای همهٔ
مقصدهای SPARC
در دسترس
نیستند. به
طور معمول
از امکانات
کامپایلر C
مرسوم
ماشین
استفاده
میشود،
اما این کار
مستقیماً
در کامپایل
متقابل (cross-compilation)
امکانپذیر
نیست. شما
باید
خودتان
تمهیدات
لازم را
برای فراهم
کردن توابع
کتابخانهای
مناسب جهت
کامپایل
متقابل در
نظر بگیرید.
مقصدهای
تعبیهشدهٔ
sparc-*-aout و sparclite-*-*
پشتیبانی
ممیز شناور
نرمافزاری
را ارائه
میدهند.
گزینهٔ -msoft-float قرارداد فراخوانی (calling convention) را در فایل خروجی تغییر میدهد؛ بنابراین تنها زمانی مفید است که تمام یک برنامه را با این گزینه کامپایل کنید. به ویژه، برای اینکه این قابلیت کار کند، باید libgcc.a (کتابخانهای که همراه GCC ارائه میشود) را با -msoft-float کامپایل کنید.
- -mhard-quad-float
- تولید خروجی حاوی دستورالعملهای ممیز شناور با کلمهٔ چهارگانه یا quad-word (از نوع long double).
- -msoft-quad-float
- تولید
خروجی حاوی
فراخوانیهای
کتابخانهای
برای
دستورالعملهای
ممیز شناور
quad-word (از نوع long double).
توابع
فراخوانیشده
همان
مواردی
هستند که در
SPARC ABI مشخص
شدهاند.
این حالت
پیشفرض
است.
تا زمان نگارش این متن، هیچ پیادهسازی از SPARC وجود ندارد که دارای پشتیبانی سختافزاری برای دستورالعملهای ممیز شناور quad-word باشد. همهٔ آنها برای هر یک از این دستورالعملها یک گردانندهٔ تله (trap handler) را فرامیخوانند و سپس گردانندهٔ تله تأثیر دستورالعمل را شبیهسازی میکند. به دلیل سربار گردانندهٔ تله، این روش بسیار کندتر از فراخوانی توابع کتابخانهای ABI است. بنابراین گزینهٔ -msoft-quad-float حالت پیشفرض است.
- -mno-unaligned-doubles
- -munaligned-doubles
- فرض میکند
که
متغیرهای double
همترازی ۸
بایتی
دارند. این
حالت
پیشفرض
است.
با -munaligned-doubles، کامپایلر GCC تنها زمانی فرض میکند که مقادیر double دارای همترازی ۸ بایتی هستند که در نوع دیگری گنجانده شده باشند یا دارای آدرس مطلق باشند. در غیر این صورت، فرض میکند که دارای همترازی ۴ بایتی هستند. مشخص کردن این گزینه از برخی مشکلات نادر سازگاری با کدهای تولید شده توسط کامپایلرهای دیگر جلوگیری میکند. این گزینه پیشفرض نیست زیرا به ویژه برای کدهای ممیز شناور منجر به افت کارایی میشود.
- -muser-mode
- -mno-user-mode
- کدی تولید نمیکند که فقط بتواند در حالت سرپرست (supervisor mode) اجرا شود. این موضوع تنها برای دستورالعمل "casa" که برای پردازندهٔ LEON3 صادر میشود صدق میکند. این حالت پیشفرض است.
- -mfaster-structs
- -mno-faster-structs
- با -mfaster-structs، کامپایلر فرض میکند که ساختارها (structures) باید دارای همترازی ۸ بایتی باشند. این امر استفاده از جفتدستورالعملهای "ldd" و "std" را برای رونوشتها در انتساب ساختار، به جای دو برابر جفتهای "ld" و "st" ممکن میسازد. با این حال، استفاده از این همترازیِ تغییریافته مستقیماً SPARC ABI را نقض میکند. از این رو، این گزینه فقط برای استفاده در مقاصدی در نظر گرفته شده که توسعهدهنده میپذیرد کد حاصل مستقیماً مطابق با قوانین ABI نیست.
- -mstd-struct-return
- -mno-std-struct-return
- با -mstd-struct-return،
کامپایلر
در توابعی
که
ساختارها
یا
اجتماعها
(unions) را
برمیگردانند،
کدهای
کنترلی
ایجاد
میکند تا
طبق ABI ۳۲
بیتی، عدم
تطابق
اندازه
میان دو طرف
فراخوانی
تابع را
تشخیص دهد.
پیشفرض -mno-std-struct-return است. این گزینه در حالت ۶۴ بیتی هیچ تأثیری ندارد.
- -mcpu=cpu_type
- مجموعه
دستورالعمل،
مجموعه
ثباتها و
پارامترهای
زمانبندی
دستورالعمل
را برای نوع
ماشین cpu_type
تنظیم
میکند.
مقادیر
پشتیبانیشده
برای cpu_type
عبارتند از:
v7، cypress، v8،
supersparc، hypersparc، leon،
leon3، leon3v7، leon5،
sparclite، f930، f934،
sparclite86x، sparclet، tsc701،
v9، ultrasparc، ultrasparc3،
niagara، niagara2، niagara3،
niagara4، niagara7 و m8.
زنجیره ابزارهای بومی Solaris و GNU/Linux از مقدار native نیز پشتیبانی میکنند که بهترین گزینهٔ معماری را برای پردازندهٔ میزبان برمیگزیند. اگر GCC پردازنده را شناسایی نکند، -mcpu=native هیچ تأثیری نخواهد داشت.
پارامترهای زمانبندی دستورالعمل پیشفرض برای مقادیری استفاده میشوند که یک معماری و نه یک پیادهسازی را انتخاب میکنند. این مقادیر عبارتند از: v7، v8، sparclite، sparclet، v9.
در ادامه فهرستی از هر معماری پشتیبانیشده و پیادهسازیهای پشتیبانیشدهٔ آنها آمده است.
بهطور پیشفرض (مگر اینکه طور دیگری پیکربندی شده باشد)، GCC کدی برای گونهٔ V7 از معماری SPARC تولید میکند. با -mcpu=cypress، کامپایلر علاوه بر آن، کد را برای تراشهٔ Cypress CY7C602 بهینهسازی میکند که در سری SPARCStation/SPARCServer 3xx به کار رفته است. این گزینه همچنین برای سیستمهای قدیمیتر SPARCStation 1، 2، IPX و غیره مناسب است.
با -mcpu=v8، کامپایلر GCC کدی برای گونهٔ V8 از معماری SPARC تولید میکند. تنها تفاوت آن با کد V7 این است که کامپایلر دستورالعملهای ضرب عدد صحیح و تقسیم عدد صحیح را صادر میکند که در SPARC-V8 وجود دارند اما در SPARC-V7 موجود نیستند. با -mcpu=supersparc، کامپایلر علاوه بر این، کد را برای تراشهٔ SuperSPARC بهینهسازی میکند، همانطور که در سریهای SPARCStation 10، 1000 و 2000 استفاده شده است.
با -mcpu=sparclite، کامپایلر GCC کدی برای گونهٔ SPARClite از معماری SPARC تولید میکند. این گزینه دستورالعملهای ضرب عدد صحیح، گام تقسیم عدد صحیح و پویش ("ffs") را که در SPARClite وجود دارند اما در SPARC-V7 نیستند، اضافه میکند. با -mcpu=f930، کامپایلر علاوه بر آن، کد را برای تراشهٔ Fujitsu MB86930 بهینهسازی میکند که نسخهٔ اولیهٔ SPARClite و فاقد FPU است. با -mcpu=f934، کامپایلر علاوه بر آن، کد را برای تراشهٔ Fujitsu MB86934 بهینهسازی میکند که نگارش جدیدتر SPARClite به همراه FPU است.
با -mcpu=sparclet، کامپایلر GCC کدی برای گونهٔ SPARClet از معماری SPARC تولید میکند. این گزینه دستورالعملهای ضرب عدد صحیح، ضرب/انباشت، گام تقسیم عدد صحیح و پویش ("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 نیز به کار برد، اما تنها مقادیر سودمند مواردی هستند که یک پیادهسازی خاص از پردازنده را انتخاب میکنند. این موارد عبارتند از: cypress، supersparc، hypersparc، leon، leon3، leon3v7، leon5، f930، f934، sparclite86x، tsc701، ultrasparc، ultrasparc3، niagara، niagara2، niagara3، niagara4، niagara7 و m8. در زنجیرهابزارهای بومی Solaris و GNU/Linux، مقدار native نیز قابل استفاده است.
- -mv8plus
- -mno-v8plus
- با -mv8plus، کامپایلر GCC کدی برای SPARC-V8+ ABI تولید میکند. تفاوت آن با V8 ABI در این است که ثباتهای سراسری و خروجی، ۶۴ بیتی در نظر گرفته میشوند. این گزینه بهطور پیشفرض در Solaris در حالت ۳۲ بیتی برای تمام پردازندههای SPARC-V9 فعال است.
- -mvis
- -mno-vis
- با -mvis، کامپایلر GCC کدی تولید میکند که از افزونههای UltraSPARC Visual Instruction Set بهره میبرد. حالت پیشفرض -mno-vis است.
- -mvis2
- -mno-vis2
- با -mvis2، کامپایلر GCC کدی تولید میکند که از نسخهٔ 2.0 افزونههای UltraSPARC Visual Instruction Set بهره میبرد. هنگامی که هدف، پردازندهای با پشتیبانی از این دستورالعملها باشد (مانند UltraSPARC-III و بعد از آن)، پیشفرض -mvis2 است. فعال کردن -mvis2 همچنین -mvis را نیز فعال میکند.
- -mvis3
- -mno-vis3
- با -mvis3، کامپایلر GCC کدی تولید میکند که از نسخهٔ 3.0 افزونههای UltraSPARC Visual Instruction Set بهره میبرد. هنگامی که هدف، پردازندهای با پشتیبانی از این دستورالعملها باشد (مانند niagara-3 و بعد از آن)، پیشفرض -mvis3 است. فعال کردن -mvis3 همچنین -mvis2 و -mvis را نیز فعال میکند.
- -mvis3b
- -mno-vis3b
- با -mvis3b، کامپایلر GCC کدی تولید میکند که از نسخهٔ 3.0 افزونههای UltraSPARC Visual Instruction Set به همراه دستورالعملهای تکمیلی VIS معرفیشده در Oracle SPARC Architecture 2011 بهره میبرد. هنگام هدف قرار دادن پردازندهای با پشتیبانی از چنین دستورالعملهایی (مانند niagara-7 و بعد از آن)، پیشفرض -mvis3b است. فعال کردن -mvis3b همچنین -mvis3، -mvis2 و -mvis را نیز فعال میکند.
- -mvis4
- -mno-vis4
- با -mvis4، کامپایلر GCC کدی تولید میکند که از نسخهٔ 4.0 افزونههای UltraSPARC Visual Instruction Set بهره میبرد. هنگام هدف قرار دادن پردازندهای با پشتیبانی از چنین دستورالعملهایی (مانند niagara-7 و بعد از آن)، پیشفرض -mvis4 است. فعال کردن -mvis4 همچنین -mvis3b، -mvis3، -mvis2 و -mvis را نیز فعال میکند.
- -mvis4b
- -mno-vis4b
- با -mvis4b، کامپایلر GCC کدی تولید میکند که از نسخهٔ 4.0 افزونههای UltraSPARC Visual Instruction Set به همراه دستورالعملهای تکمیلی VIS معرفیشده در Oracle SPARC Architecture 2017 بهره میبرد. هنگام هدف قرار دادن پردازندهای با پشتیبانی از چنین دستورالعملهایی (مانند m8 و بعد از آن)، پیشفرض -mvis4b است. فعال کردن -mvis4b همچنین -mvis4، -mvis3b، -mvis3، -mvis2 و -mvis را نیز فعال میکند.
- -mcbcond
- -mno-cbcond
- با -mcbcond، کامپایلر GCC کدی تولید میکند که از دستورالعملهای Compare-and-Branch-on-Condition در UltraSPARC بهره میبرد. هنگام هدف قرار دادن پردازندهای با پشتیبانی از چنین دستورالعملهایی (مانند Niagara-4 و بعد از آن)، پیشفرض -mcbcond است.
- -mfmaf
- -mno-fmaf
- با -mfmaf، کامپایلر GCC کدی تولید میکند که از دستورالعملهای ممیز شناور Fused Multiply-Add در UltraSPARC بهره میبرد. هنگام هدف قرار دادن پردازندهای با پشتیبانی از چنین دستورالعملهایی (مانند Niagara-3 و بعد از آن)، پیشفرض -mfmaf است.
- -mfsmuld
- -mno-fsmuld
- با -mfsmuld، کامپایلر GCC کدی تولید میکند که از دستورالعمل ضرب ممیز شناور دقت یگانه به دوگانه (FsMULd) بهره میبرد. هنگام هدف قرار دادن پردازندهای که از نگارشهای معماری V8 یا V9 به همراه FPU پشتیبانی میکند، پیشفرض -mfsmuld است، به استثنای -mcpu=leon..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 errata) در پردازنده UT699E/UT700 فعال میکند.
- -mfix-gr712rc
- راهکار مستندسازیشده را برای خطاهای ذخیرهسازی متوالی (back-to-back store errata) در پردازنده 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
- مدل کد Medium/Anywhere برای سیستمهای تعبیهشده (embedded): آدرسهای ۶۴ بیتی؛ قطعههای text و data باید اندازهای کمتر از ۲ گیگابایت داشته باشند و هر دو میتوانند از هر کجای حافظه شروع شوند (در زمان پیوند تعیین میشود). ثبات سراسری %g4 به ابتدای قطعه data اشاره میکند. برنامهها به صورت ایستا پیوند داده میشوند و PIC پشتیبانی نمیشود.
- -mmemory-model=mem-model
- مدل حافظه فعال روی پردازنده را روی یکی از موارد زیر تنظیم میکند:
این مدلهای حافظه بهطور رسمی در پیوست D راهنمای معماری SPARC-V9 تعریف شدهاند، به همان صورتی که در فیلد "PSTATE.MM" پردازنده مقداردهی میشوند.
- -mstack-bias
- -mno-stack-bias
- با -mstack-bias، کامپایلر GCC فرض میکند که اشارهگر پشته (stack pointer) و اشارهگر فریم (frame pointer، در صورت وجود) دارای آفست -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 بایت یا کمتر است را در ناحیهٔ دادهٔ بسیار کوچک که ثبات "ep" به آن اشاره میکند، قرار میدهد. ناحیهٔ دادهٔ بسیار کوچک در کل میتواند تا ۲۵۶ بایت را در خود جای دهد (۱۲۸ بایت برای ارجاعهای بایتی).
- -msda=n
- متغیرهای ایستا یا سراسری که اندازهٔ آنها n بایت یا کمتر است را در ناحیهٔ دادهٔ کوچک که ثبات "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" در حال تولید باشند، نماد پیشپردازندهٔ C با نام "__V850_CALLT__" تعریف میشود.
- -mrelax
- -mno-relax
- ارسال (یا عدم ارسال) گزینهٔ خط فرمان -mrelax به اسمبلر.
- -mlong-jumps
- -mno-long-jumps
- غیرفعال کردن (یا فعالسازی مجدد) تولید دستورالعملهای پرش وابسته به PC.
- -msoft-float
- -mhard-float
- غیرفعال کردن (یا فعالسازی مجدد) تولید دستورالعملهای ممیز شناور سختافزاری. این گزینه فقط زمانی اهمیت دارد که معماری هدف V850E2V3 یا بالاتر باشد. اگر دستورالعملهای سختافزاری ممیز شناور تولید شوند، نماد پیشپردازندهٔ C با نام "__FPU_OK__" تعریف میشود؛ در غیر این صورت نماد "__NO_FPU__" تعریف خواهد شد.
- -mloop
- استفاده از دستورالعمل LOOP در e3v5 را فعال میکند. هنگام انتخاب معماری e3v5، استفاده از این دستورالعمل بهطور پیشفرض فعال نیست زیرا استفاده از آن هنوز در مرحلهٔ آزمایشی است.
- -mrh850-abi
- -mghs
- پشتیبانی از نسخهٔ RH850 مربوط به V850 ABI را فعال میکند. این حالت پیشفرض است. در این نسخه از ABI، قوانین زیر اعمال میشوند:
- ساختارها و اجتماعهای هماندازهٔ اعداد صحیح (Integer sized) بهجای ثبات، از طریق اشارهگر حافظه بازگردانده میشوند.
- ساختارها و اجتماعهای بزرگ (با اندازهٔ بیش از ۸ بایت) با مقدار (by value) ارسال میشوند.
- توابع روی مرزهای ۱۶ بیتی تراز میشوند.
- گزینهٔ خط فرمان -m8byte-align پشتیبانی میشود.
- گزینهٔ خط فرمان -mdisable-callt بهطور پیشفرض فعال است. گزینهٔ خط فرمان -mno-disable-callt پشتیبانی نمیشود.
هنگامی که این نسخه از ABI فعال باشد، نماد پیشپردازندهٔ C با نام "__V850_RH850_ABI__" تعریف میشود.
- -mgcc-abi
- پشتیبانی از نسخهٔ قدیمی GCC مربوط به V850 ABI را فعال میکند. در این نسخه از ABI، قوانین زیر اعمال میشوند:
- ساختارها و اجتماعهای هماندازهٔ اعداد صحیح در ثبات "r10" بازگردانده میشوند.
- ساختارها و اجتماعهای بزرگ (با اندازهٔ بیش از ۸ بایت) از طریق ارجاع (by reference) ارسال میشوند.
- توابع روی مرزهای ۳۲ بیتی تراز میشوند، مگر آنکه بهینهسازی برای اندازه انجام شود.
- گزینهٔ خط فرمان -m8byte-align پشتیبانی نمیشود.
- گزینهٔ خط فرمان -mdisable-callt پشتیبانی میشود اما بهطور پیشفرض فعال نیست.
هنگامی که این نسخه از ABI فعال باشد، نماد پیشپردازندهٔ C با نام "__V850_GCC_ABI__" تعریف میشود.
- -m8byte-align
- -mno-8byte-align
- پشتیبانی از تراز شدن نوعهای "double" و "long long" روی مرزهای ۸ بایتی را فعال میکند. حالت پیشفرض این است که تراز همهٔ اشیاء حداکثر به ۴ بایت محدود شود. هنگامی که -m8byte-align اعمال شود، نماد پیشپردازندهٔ C با نام "__V850_8BYTE_ALIGN__" تعریف میشود.
- -mbig-switch
- -mno-big-switch
- تولید کد مناسب برای جدولهای switch بزرگ. از این گزینه تنها در صورتی استفاده کنید که اسمبلر یا پیونددهنده خطای انشعاب خارج از محدوده درون یک جدول switch گزارش دهد.
- -mapp-regs
- -mno-app-regs
- گزینهٔ -mapp-regs باعث استفاده از ثباتهای r2 و r5 در کد تولیدشده توسط کامپایلر میشود. این تنظیم پیشفرض است. گزینهٔ -mno-app-regs باعث میشود با r2 و r5 به عنوان ثباتهای ثابت (fixed) رفتار شود..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
- استفاده از قالب دادهٔ D_floating برای اعداد ممیز شناور با دقت مضاعف (double-precision) به جای G_floating.
- -mg
- -mg-float
- استفاده از قالب دادهٔ G_floating برای اعداد ممیز شناور با دقت مضاعف به جای D_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 آغاز میشود بهعنوان روال اصلی برای اشکالزدا (debugger).
- -mmalloc64
- استفادهٔ پیشفرض از روالهای تخصیص حافظهٔ ۶۴ بیتی.
- -mpointer-size=size
- تنظیم اندازهٔ پیشفرض اشارهگرها. گزینههای ممکن برای size عبارتند از 32 یا short برای اشارهگرهای ۳۲ بیتی، 64 یا long برای اشارهگرهای ۶۴ بیتی، و no برای پشتیبانی انحصاری از اشارهگرهای ۳۲ بیتی. گزینهٔ آخر دستور "pragma pointer_size" را غیرفعال میکند.
گزینههای VxWorks
گزینههای این بخش برای تمامی اهداف VxWorks تعریف شدهاند. گزینههای مختص سختافزار مقصد، همراه با سایر گزینههای مربوط به آن هدف فهرست شدهاند.
- -mrtp
- کامپایلر GCC میتواند هم برای هستههای VxWorks و هم برای فرآیندهای بلادرنگ (RTPها) کد تولید کند. این گزینه حالت را از مورد نخست به دومی تغییر میدهد. همچنین ماکروی پیشپردازندهٔ "__RTP__" را تعریف میکند.
- -msmp
- انتخاب محیطهای زمان اجرای SMP برای پیوند دادن. روی معماریهایی غیر از PowerPC و همچنین در VxWorks نسخهٔ ۷ به بعد در دسترس نیست؛ چرا که در آنها این انتخاب بخشی از پیکربندی ساخت VxWorks بوده و مسیرهای کتابخانه برای هر دو حالت یکسان است.
- -mvthreads
- پیوند دادن با محیط زمان اجرای VxWorks AE vThread.
- -non-static
- پیوند دادن یک فایل اجرایی RTP با کتابخانههای مشترک (shared) به جای کتابخانههای ایستا (static). گزینههای -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
مشخصشده
بهینهسازی
(tune) میکند،
-march=cpu-type به GCC
اجازه
میدهد کدی
تولید کند
که ممکن است
روی
پردازندههایی
غیر از
پردازنده
مشخصشده
اصلاً اجرا
نشود. مشخص
کردن -march=cpu-type
بهطور
ضمنی
بیانگر
-mtune=cpu-type نیز
هست، مگر
مواردی که
خلاف آن ذکر
شده باشد.
انتخابهای موجود برای cpu-type عبارتاند از:
- native
- این گزینه با تشخیص نوع پردازنده ماشین کامپایلکننده در زمان کامپایل، پردازنده مقصد را برای تولید کد انتخاب میکند. استفاده از -march=native تمام زیرمجموعههای دستورالعملی که توسط ماشین محلی پشتیبانی میشوند را فعال میکند (از این رو ممکن است نتیجه روی ماشینهای دیگر اجرا نشود). استفاده از -mtune=native کدی بهینهشده برای ماشین محلی تحت محدودیتهای مجموعه دستورالعملهای انتخابشده تولید میکند.
- x86-64
- یک پردازنده عمومی با افزونههای 64-bit و پشتیبانی از مجموعه دستورالعملهای MMX، SSE، SSE2 و FXSR.
- x86-64-v2
- x86-64-v3
- x86-64-v4
- این
انتخابها
برای cpu-type،
سطح
ریزمعماری
متناظر را
از psABI مربوط
به x86-64 انتخاب
میکنند. در
ABIهایی غیر
از x86-64 psABI، آنها
همان
ویژگیهای
پردازندهای
را انتخاب
میکنند که
x86-64 psABI برای آن
سطح
ریزمعماری
خاص مستند
کرده است.
از آنجا که این مقادیر cpu-type تنظیمات -mtune متناظری ندارند، استفاده از -march با این مقادیر بهینهسازی عمومی را فعال میکند. بهینهسازی خاص را میتوان با استفاده از گزینه -mtune=other-cpu-type به همراه مقدار مناسب برای other-cpu-type فعال کرد.
- i386
- پردازنده اصلی Intel i386.
- i486
- پردازنده Intel i486. (هیچ زمانبندیای برای این تراشه پیادهسازی نشده است.)
- i586
- pentium
- پردازنده Intel Pentium بدون پشتیبانی از MMX.
- lakemont
- میکروکنترلر (MCU) Intel Lakemont، مبتنی بر پردازنده Intel Pentium.
- pentium-mmx
- پردازنده Intel Pentium MMX، مبتنی بر هسته Pentium همراه با پشتیبانی از مجموعه دستورالعملهای MMX.
- pentiumpro
- پردازنده Intel Pentium Pro بدون پشتیبانی از MMX.
- i686
- هنگامی که همراه با -march استفاده شود، مجموعه دستورالعملهای Pentium Pro به کار گرفته میشوند، بنابراین کد روی تمام تراشههای خانواده i686 اجرا میشود. هنگامی که همراه با -mtune استفاده شود، معنایی مشابه با generic دارد.
- pentium2
- پردازنده Intel Pentium II، مبتنی بر هسته Pentium Pro با پشتیبانی از مجموعه دستورالعملهای MMX و FXSR.
- pentium3
- 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 با افزونههای 64-bit و پشتیبانی از مجموعه دستورالعملهای MMX، SSE، SSE2، SSE3، CX16 و FXSR.
- core2
- پردازنده Intel Core 2 با افزونههای 64-bit و پشتیبانی از مجموعه دستورالعملهای MMX، SSE، SSE2، SSE3، SSSE3، CX16، SAHF و FXSR.
- nehalem
- corei7
- پردازنده Intel Nehalem با افزونههای 64-bit و پشتیبانی از مجموعه دستورالعملهای MMX، SSE، SSE2، SSE3، SSSE3، SSE4.1، SSE4.2، POPCNT، CX16، SAHF و FXSR.
- westmere
- پردازنده Intel Westmere با افزونههای 64-bit و پشتیبانی از مجموعه دستورالعملهای MMX، SSE، SSE2، SSE3، SSSE3، SSE4.1، SSE4.2، POPCNT، CX16، SAHF، FXSR و PCLMUL.
- sandybridge
- corei7-avx
- پردازنده Intel Sandy Bridge با افزونههای 64-bit و پشتیبانی از مجموعه دستورالعملهای MMX، SSE، SSE2، SSE3، SSSE3، SSE4.1، SSE4.2، POPCNT، CX16، SAHF، FXSR، AVX، XSAVE و PCLMUL.
- ivybridge
- core-avx-i
- پردازنده Intel Ivy Bridge با افزونههای 64-bit و پشتیبانی از مجموعه دستورالعملهای MMX، SSE، SSE2، SSE3، SSSE3، SSE4.1، SSE4.2، POPCNT، CX16، SAHF، FXSR، AVX، XSAVE، PCLMUL، FSGSBASE، RDRND و F16C.
- haswell
- core-avx2
- پردازنده Intel Haswell با افزونههای 64-bit و پشتیبانی از مجموعه دستورالعملهای MMX، SSE، SSE2، SSE3، SSSE3، SSE4.1، SSE4.2، POPCNT، CX16، SAHF، FXSR، AVX، XSAVE، PCLMUL، FSGSBASE، RDRND، F16C، AVX2، BMI، BMI2، LZCNT، FMA، MOVBE و HLE.
- broadwell
- پردازنده Intel Broadwell با افزونههای 64-bit و پشتیبانی از مجموعه دستورالعملهای MMX، SSE، SSE2، SSE3، SSSE3، SSE4.1، SSE4.2، POPCNT، CX16، SAHF، FXSR، AVX، XSAVE، PCLMUL، FSGSBASE، RDRND، F16C، AVX2، BMI، BMI2، LZCNT، FMA، MOVBE، HLE، RDSEED، ADCX و PREFETCHW.
- skylake
- پردازنده Intel Skylake با افزونههای 64-bit و پشتیبانی از مجموعه دستورالعملهای MMX، SSE، SSE2، SSE3، SSSE3، SSE4.1، SSE4.2، POPCNT، CX16، SAHF، FXSR، AVX، XSAVE، PCLMUL، FSGSBASE، RDRND، F16C، AVX2، BMI، BMI2، LZCNT، FMA، MOVBE، HLE، RDSEED، ADCX، PREFETCHW، AES، CLFLUSHOPT، XSAVEC، XSAVES و SGX..IP skylake-avx512 4 پردازنده سرور 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، AVX512F، CLWB، AVX512VL، AVX512BW، AVX512DQ و AVX512CD.
- cascadelake
- پردازنده Intel Cascade Lake با افزونههای ۶۴-بیتی و پشتیبانی از مجموعه دستورهای 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 با افزونههای ۶۴-بیتی و پشتیبانی از مجموعه دستورهای 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 با افزونههای ۶۴-بیتی و پشتیبانی از مجموعه دستورهای 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 با افزونههای ۶۴-بیتی و پشتیبانی از مجموعه دستورهای 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 با افزونههای ۶۴-بیتی و پشتیبانی از مجموعه دستورهای 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 با افزونههای ۶۴-بیتی و پشتیبانی از مجموعه دستورهای 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 با افزونههای ۶۴-بیتی و پشتیبانی از مجموعه دستورهای 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 با افزونههای ۶۴-بیتی و پشتیبانی از مجموعه دستورهای 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 با افزونههای ۶۴-بیتی و پشتیبانی از مجموعه دستورهای 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 با افزونههای ۶۴-بیتی و پشتیبانی از مجموعه دستورهای 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 با افزونههای ۶۴-بیتی و پشتیبانی از مجموعه دستورهای 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 با افزونههای ۶۴-بیتی و پشتیبانی از مجموعه دستورهای 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 با افزونههای ۶۴-بیتی و پشتیبانی از مجموعه دستورهای 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 با افزونههای ۶۴-بیتی و پشتیبانی از مجموعه دستورهای 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 با افزونههای ۶۴-بیتی و پشتیبانی از مجموعه دستورهای 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 با افزونههای ۶۴-بیتی و پشتیبانی از مجموعه دستورهای 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 و دستورالعملهای ۶۴ بیتی است.)
- btver1
- پردازندههای مبتنی بر هستههای AMD Family 14h با پشتیبانی از مجموعه دستورالعملهای x86-64. (این گزینه دربرگیرندهٔ افزونههای مجموعه دستورالعملهای MMX، SSE، SSE2، SSE3، SSSE3، SSE4A، CX16، ABM و ۶۴ بیتی است.)
- btver2
- پردازندههای مبتنی بر هستههای AMD Family 16h با پشتیبانی از مجموعه دستورالعملهای x86-64. این گزینه شامل افزونههای مجموعه دستورالعملهای MOVBE، F16C، BMI، AVX، PCLMUL، AES، SSE4.2، SSE4.1، CX16، ABM، SSE4A، SSSE3، SSE3، SSE2، SSE، MMX و ۶۴ بیتی است.
- 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) در دسترس هستند: برای جزئیات توابعی که توسط این سوییچها فعال و غیرفعال میشوند، به x86 Built-in Functions مراجعه کنید.
این گزینهها GCC را قادر میسازند تا از این دستورالعملهای گسترشیافته در کد تولیدشده استفاده کند. برنامههایی که تشخیص CPU را در زمان اجرا (run-time) انجام میدهند، باید برای هر معماری پشتیبانیشده، فایلهای جداگانهای را با استفاده از پرچمهای مناسب کامپایل کنند. بهویژه، فایلی که شامل کد تشخیص CPU است باید بدون این گزینهها کامپایل شود.
برای کنترل اینکه آیا دستورالعملهای 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 موجود در
اکثر
تراشهها و
شبیهسازی
آن در غیر
این صورت.
کد
کامپایلشده
با این
گزینه
تقریباً در
همهجا
اجرا
میشود.
نتایج موقت
بهجای
دقتی که
توسط نوع
داده مشخص
شده، با دقت
80 بیتی
محاسبه
میشوند که
در مقایسه
با اکثر
تراشههای
دیگر به
نتایجی
اندکی
متفاوت
منجر
میشود.
برای
توضیحات
دقیقتر
-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 جلوگیری کند، اما ممکن است برخی از کدهای موجود را که انتظار دارند مقادیر موقت 80 بیتی باشند با مشکل مواجه کند.
این انتخاب پیشفرض برای کامپایلر 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 مرسوم ماشین استفاده میشود، اما این کار را نمیتوان مستقیماً در کامپایل متقابل (cross-compilation) انجام داد. باید تمهیدات لازم را خودتان برای ارائه توابع کتابخانهای مناسب برای کامپایل متقابل فراهم کنید.
در ماشینهایی که یک تابع نتایج ممیز شناور را در پشته ثبات 80387 برمیگرداند، ممکن است حتی در صورت استفاده از -msoft-float برخی از آپکدهای ممیز شناور صادر شوند.
- -mno-fp-ret-in-387
- عدم
استفاده از
ثباتهای FPU
برای
مقادیر
بازگشتی
توابع.
قرارداد فراخوانی معمول به این صورت است که توابع مقادیر با انواع "float" و "double" را در یک ثبات FPU بازمیگردانند، حتی اگر هیچ FPU وجود نداشته باشد. ایده این است که سیستمعامل باید یک FPU را شبیهسازی کند.
گزینه -mno-fp-ret-in-387 باعث میشود چنین مقادیری بهجای آن در ثباتهای معمولی CPU بازگردانده شوند.
- -mno-fancy-math-387
- برخی از شبیهسازهای 387 از دستورالعملهای "sin"، "cos" و "sqrt" برای 387 پشتیبانی نمیکنند. این گزینه را برای جلوگیری از تولید این دستورالعملها مشخص کنید. این گزینه زمانی که -march مشخص کند که CPU مقصد همواره دارای FPU است و بنابراین دستورالعمل نیازی به شبیهسازی ندارد، نادیده گرفته میشود. این دستورالعملها تولید نمیشوند مگر اینکه از سوییچ -funsafe-math-optimizations نیز استفاده کنید.
- -malign-double
- -mno-align-double
- کنترل
اینکه آیا
GCC متغیرهای
"double"،
"long double" و
"long long" را
روی یک مرز
دوکلمهای
تراز کند یا
یک مرز
تککلمهای.
تراز کردن
متغیرهای
"double" روی
یک مرز
دوکلمهای
کدی تولید
میکند که
روی
پردازندههای
Pentium تا حدی
سریعتر
اجرا
میشود، به
بهای مصرف
حافظه
بیشتر.
در x86-64، گزینه -malign-double بهطور پیشفرض فعال است.
هشدار: اگر از سوییچ -malign-double استفاده کنید، ساختارهای حاوی انواع بالا متفاوت از مشخصات منتشرشده رابط باینری برنامه کاربردی (ABI) برای x86-32 تراز میشوند و با ساختارهای موجود در کدهایی که بدون آن سوییچ کامپایل شدهاند سازگاری باینری ندارند.
- -m96bit-long-double
- -m128bit-long-double
- این
سوییچها
اندازه نوع
"long double" را
کنترل
میکنند.
رابط
باینری
برنامه
کاربردی (ABI)
در x86-32 اندازه
را 96 بیت
مشخص
میکند،
بنابراین
-m96bit-long-double در
حالت 32 بیتی
گزینه
پیشفرض
است.
معماریهای مدرن (Pentium و جدیدتر) ترجیح میدهند "long double" روی یک مرز 8 یا 16 بایتی تراز شود. در آرایهها یا ساختارهای مطابق با ABI، این امر ممکن نیست. بنابراین مشخص کردن -m128bit-long-double، نوع "long double" را با افزودن (padding) صفر 32 بیتی اضافی به آن، روی یک مرز 16 بایتی تراز میکند.
در کامپایلر x86-64، گزینه -m128bit-long-double انتخاب پیشفرض است زیرا ABI آن مشخص میکند که "long double" روی مرز 16 بایتی تراز شود.
توجه داشته باشید که هیچیک از این گزینهها دقت بیشتری نسبت به استاندارد x87 با 80 بیت برای یک "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" میپذیرند دگرگون میکند. در نتیجه، آنها با کدهایی که بدون این سوییچ کامپایل شدهاند سازگاری باینری نخواهند داشت.
- -malign-data=type
- نحوه تراز کردن متغیرها توسط GCC را کنترل میکند. مقادیر پشتیبانیشده برای type عبارتند از: compat از مقدار تراز افزایشیافته سازگار با GCC 4.8 و نسخههای پیش از آن استفاده میکند، abi از مقدار تراز مشخصشده توسط psABI استفاده میکند، و cacheline از مقدار تراز افزایشیافته جهت مطابقت با اندازه خط حافظه نهان (cache line) بهره میبرد. compat مقدار پیشفرض است.
- -mlarge-data-threshold=threshold
- هنگامی که -mcmodel=medium یا -mcmodel=large مشخص شده باشد، اشیاء داده بزرگتر از threshold در بخشهای داده بزرگ قرار میگیرند. مقدار پیشفرض ۶۵۵۳۵ است.
- -mrtd
- از قرارداد
فراخوانی
تابع
متفاوتی
استفاده
میکند که
در آن
توابعی با
تعداد
آرگومانهای
ثابت، با
دستورالعمل
"ret
num"
بازمیگردند
که هنگام
بازگشت
آرگومانهایشان
را از پشته
خارج (pop)
میکند. این
کار یک
دستورالعمل
در بخش
فراخواننده
صرفهجویی
میکند،
چرا که
نیازی به
خارج کردن
آرگومانها
در آنجا
نیست.
میتوانید با استفاده از صفت تابع "stdcall" مشخص کنید که یک تابع خاص با این توالی فراخوانی صدا زده شود. همچنین میتوانید با استفاده از صفت تابع "cdecl" گزینه -mrtd را لغو و بازنویسی کنید.
هشدار: این قرارداد فراخوانی با قراردادی که بهطور معمول در Unix استفاده میشود ناسازگار است، بنابراین اگر نیاز به فراخوانی کتابخانههای کامپایلشده با کامپایلر Unix دارید، نمیتوانید از آن استفاده کنید.
همچنین، باید اعلان اولیه تابع (prototype) را برای تمام توابعی که تعداد متغیری از آرگومانها را میپذیرند (از جمله "printf") مشخص کنید؛ در غیر این صورت کد نادرستی برای فراخوانی آن توابع تولید میشود.
علاوه بر این، اگر تابعی را با آرگومانهای بیش از حد فراخوانی کنید، کد بهشدت نادرستی حاصل خواهد شد. (بهطور معمول، آرگومانهای اضافی بدون مشکل نادیده گرفته میشوند.)
- -mregparm=num
- تعداد
ثباتهای
مورداستفاده
برای ارسال
آرگومانهای
عدد صحیح را
کنترل
میکند.
بهطور
پیشفرض
هیچ ثباتی
برای ارسال
آرگومانها
به کار
نمیرود و
حداکثر
میتوان از
۳ ثبات
استفاده
کرد.
میتوانید
این رفتار
را برای یک
تابع مشخص
با استفاده
از صفت تابع
"regparm"
کنترل کنید.
هشدار: اگر از این سوییچ استفاده کنید و num غیرصفر باشد، آنگاه باید تمامی ماژولها، از جمله هرگونه کتابخانه را با همان مقدار کامپایل کنید. این موضوع شامل کتابخانههای سیستمی و ماژولهای راهاندازی (startup) نیز میشود.
- -msseregparm
- از
قراردادهای
ارسال با
ثبات SSE برای
آرگومانها
و مقادیر
بازگشتی float و
double استفاده
میکند.
میتوانید
این رفتار
را برای یک
تابع مشخص
با استفاده
از صفت تابع
"sseregparm"
کنترل کنید.
هشدار: در صورت استفاده از این سوییچ، باید تمامی ماژولها، از جمله هرگونه کتابخانه را با همان مقدار بسازید. این موضوع شامل کتابخانههای سیستمی و ماژولهای راهاندازی نیز میشود.
- -mvect8-ret-in-mem
- بردارهای ۸ بایتی را به جای ثباتهای MMX در حافظه برمیگرداند. این مقدار پیشفرض در VxWorks است تا با ABI کامپایلرهای Sun Studio تا نسخه ۱۲ سازگار باشد. تنها در صورتی از این گزینه استفاده کنید که نیاز به حفظ سازگاری با کدهای موجودِ تولیدشده توسط آن نسخههای قبلی کامپایلر یا نسخههای قدیمیتر GCC دارید.
- -mpc32
- -mpc64
- -mpc80
- دقت ممیز
شناور
۸۰۳۸۷ را
روی ۳۲، ۶۴
یا ۸۰ بیت
تنظیم
میکند.
هنگامی که
-mpc32 مشخص
شود، بخش
معنادار
نتایج
عملیات
ممیز شناور
تا ۲۴ بیت
گرد
میشوند
(دقت
یگانه)؛ -mpc64
بخش
معنادار
نتایج
عملیات
ممیز شناور
را تا ۵۳
بیت گرد
میکند (دقت
مضاعف) و -mpc80
بخش
معنادار
نتایج
عملیات
ممیز شناور
را تا ۶۴
بیت گرد
میکند (دقت
مضاعف
گسترشیافته)
که مقدار
پیشفرض
است. هنگامی
که از این
گزینه
استفاده
شود،
عملیات
ممیز شناور
در دقتهای
بالاتر
بدون تنظیم
صریح کلمه
کنترل FPU در
دسترس
برنامهنویس
نخواهد بود.
تنظیم گرد کردن عملیات ممیز شناور به مقداری کمتر از ۸۰ بیت پیشفرض، میتواند سرعت اجرای برخی برنامهها را تا ۲٪ یا بیشتر افزایش دهد. توجه داشته باشید که برخی کتابخانههای ریاضی فرض میکنند عملیات ممیز شناور با دقت گسترشیافته (۸۰ بیتی) بهطور پیشفرض فعال است؛ در صورتی که از این گزینه برای تنظیم دقت روی مقداری کمتر از دقت گسترشیافته استفاده شود، روالهای موجود در چنین کتابخانههایی ممکن است دچار افت شدید دقت شوند، که معمولاً ناشی از پدیدهای موسوم به «حذف فاجعهبار» (catastrophic cancellation) است.
- -mdaz-ftz
- -mno-daz-ftz
- پرچمهای flush-to-zero (FTZ) و denormals-are-zero (DAZ) در ثبات MXCSR برای کنترل محاسبات ممیز شناور استفاده میشوند. گزینههای -Ofast، -ffast-math، یا -funsafe-math-optimizations معمولاً کدهای راهاندازیای را پیوند میزنند که این پرچمها را فعال میکنند، مگر هنگام ساخت یک کتابخانه مشترک (-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 ممکن است به خطاهای دسترسی به حافظه ترازنشده منجر گردند. علاوه بر این، آرگومانهای متغیر برای اشیاء تراز ۱۶ بایتی (شامل x87 long double و __int128) بهطور نادرست مدیریت میشوند که باعث نتایج اشتباه خواهد شد. باید تمام ماژولها را با -mpreferred-stack-boundary=3 بسازید، از جمله تمام کتابخانهها. این شامل کتابخانههای سیستمی و ماژولهای راهاندازی نیز میشود.
- -mincoming-stack-boundary=num
- فرض میکند
که پشته
ورودی روی
مرز ۲ به
توان num
بایت تراز
شده است.
اگر -mincoming-stack-boundary
تعیین نشده
باشد،
مقدار
مشخصشده
توسط -mpreferred-stack-boundary
استفاده
میشود.
در Pentium و Pentium Pro، مقادیر "double" و "long double" باید روی یک مرز ۸ بایتی تراز شوند (گزینه -malign-double را ببینید)، وگرنه با افت چشمگیر کارایی در زمان اجرا مواجه خواهند شد. در Pentium III، نوع داده Streaming SIMD Extension (SSE) یعنی "__m128" در صورت تراز نبودن با مرز ۱۶ بایتی ممکن است بهدرستی کار نکند.
برای اطمینان از تراز صحیح این مقادیر روی پشته، مرز پشته باید به اندازهای تراز باشد که توسط هر مقدار ذخیرهشده روی آن نیاز است. علاوه بر این، هر تابع باید بهگونهای تولید شود که پشته را تراز نگه دارد. بنابراین فراخوانی تابعی که با مرز پشته ترجیحی بالاتر کامپایل شده از داخل تابعی که با مرز پشته ترجیحی پایینتر کامپایل گردیده، به احتمال زیاد پشته را از حالت تراز خارج میکند. توصیه میشود کتابخانههایی که از توابع بازخوان (callback) استفاده میکنند، همواره از تنظیم پیشفرض بهره ببرند.
این تراز اضافی فضای بیشتری از پشته را مصرف میکند و عموماً باعث افزایش اندازه کد میشود. کدهایی که به مصرف فضای پشته حساس هستند، مانند سیستمهای تعبیهشده و هستههای سیستمعامل، ممکن است ترجیح دهند مقدار تراز پیشنهادی را با -mpreferred-stack-boundary=2 کاهش دهند.
- -mdump-tune-features
- این گزینه به GCC دستور میدهد نام ویژگیهای بهینهسازی کارایی 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 در نظر گرفته شده است. استفاده از آن ممکن است به مسیرهای کدی منجر شود که توسط آزمایشها پوشش داده نشدهاند و میتواند باعث بروز ICE در کامپایلر یا خطاهای زمان اجرا شود.
- -mno-default
- این گزینه به GCC دستور میدهد که تمام ویژگیهای قابل تنظیم (tunable) را غیرفعال کند. همچنین نگاه کنید به -mtune-ctrl=feature-list و -mdump-tune-features.
- -mcld
- این گزینه به GCC دستور میدهد که در مقدمهٔ (prologue) توابعی که از دستورالعملهای رشتهای استفاده میکنند، یک دستورالعمل "cld" صادر کند. دستورالعملهای رشتهای برای انتخاب میان حالت افزایش خودکار یا کاهش خودکار به پرچم DF وابسته هستند. اگرچه ABI مشخص میکند که پرچم DF باید هنگام ورود به تابع پاک شود، برخی از سیستمعاملها با پاک نکردن پرچم DF در توزیعکنندههای استثنای (exception dispatchers) خود این مشخصه را نقض میکنند. ممکن است گردانندهٔ استثنا (exception handler) با پرچم 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
را قادر
میسازد تا
عملیات
ممیز
شناوری
تولید کند
که ممکن است
مجموعهٔ
پرچمهای
وضعیت ممیز
شناور را
روی
بردارهای
جزئی (partial vectors)،
جایی که
عناصر
بردار در
بخش پایینی
ثبات ۱۲۸
بیتی SSE قرار
دارند، تحت
تأثیر قرار
دهند. مگر
اینکه -fno-trapping-math
مشخص شده
باشد،
کامپایلر
با پاکسازی
تمام
عملوندهای
ورودی برای
داشتن صفر
در بخش
بالاییِ
استفادهنشدهٔ
ثبات
برداری،
رفتار صحیح
را تضمین
میکند.
توجه داشته
باشید که با
استفاده از
توابع
داخلی یا
اسمبلی
درونخطی
با
آرگومانهای
بردار
جزئی،
مقادیر NaN،
غیرعادی (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 registers) که در تابع استفاده شدهاند (به جز ثبات "BP") در مقدمهٔ تابع، بهینهسازی میکند. این گزینه میتواند در اشکالزدایی فراخوانندهٔ تابع "noreturn" یا هر تابع دیگری بالاتر در پشتهٔ فراخوانی (call stack) تداخل ایجاد کند، بنابراین به صورت پیشفرض فعال نیست.
- -mcx16
- این گزینه GCC را قادر میسازد تا در کد ۶۴ بیتی، دستورالعملهای "CMPXCHG16B" را برای پیادهسازی عملیات مقایسه-و-تبادل روی شیءهای ۱۲۸ بیتی با همترازی ۱۶ بایتی تولید کند. این قابلیت برای بهروزرسانیهای اتمی ساختارهای دادهای که اندازهٔ آنها از یک کلمهٔ ماشین فراتر میرود مفید است. کامپایلر از این دستورالعمل برای پیادهسازی __sync Builtins استفاده میکند. با این حال، برای __atomic Builtins که روی اعداد صحیح ۱۲۸ بیتی کار میکنند، همواره از فراخوانی کتابخانه استفاده میشود.
- -msahf
- این گزینه تولید دستورالعملهای "SAHF" را در کد ۶۴ بیتی فعال میکند. پردازندههای اولیهٔ Intel Pentium 4 با پشتیبانی از Intel 64، پیش از معرفی استپینگ Pentium 4 G1 در دسامبر ۲۰۰۵، فاقد دستورالعملهای "LAHF" و "SAHF" بودند که توسط AMD64 پشتیبانی میشوند. این دستورالعملها به ترتیب برای بارگذاری و ذخیرهٔ برخی از پرچمهای وضعیت هستند. در حالت ۶۴ بیتی، از دستورالعمل "SAHF" برای بهینهسازی توابع توکار "fmod"، "drem" و "remainder" استفاده میشود؛ برای جزئیات به Other Builtins مراجعه کنید.
- -mmovbe
- این گزینه استفاده از دستورالعمل "movbe" را برای بهینهسازی جابهجایی بایتهای (byte swapping) موجودیتهای چهار و هشت بایتی فعال میکند.
- -mshstk
- گزینهٔ -mshstk توابع توکار پشتهٔ سایه (shadow stack) از فناوری اجرایی جریان کنترل x86 (یا CET) را فعال میکند.
- -mcrc32
- این گزینه توابع توکار "__builtin_ia32_crc32qi"، "__builtin_ia32_crc32hi"، "__builtin_ia32_crc32si" و "__builtin_ia32_crc32di" را برای تولید دستورالعمل ماشین "crc32" فعال میسازد.
- -mmwait
- این گزینه توابع توکار "__builtin_ia32_monitor" و "__builtin_ia32_mwait" را برای تولید دستورالعملهای ماشین "monitor" و "mwait" فعال میکند.
- -mrecip
- این گزینه
استفاده از
دستورالعملهای
"RCPSS" و
"RSQRTSS" (و
انواع
برداریشدهٔ
آنها
"RCPPS" و
"RSQRTPS") را
با یک
مرحلهٔ
اضافی
نیوتن-رافسون
(Newton-Raphson) برای
افزایش دقت
به جای
"DIVSS" و
"SQRTSS" (و
انواع
برداریشدهٔ
آنها) برای
آرگومانهای
ممیز شناور
با دقت
یگانه (single-precision)
فعال
میکند. این
دستورالعملها
تنها زمانی
تولید
میشوند که
-funsafe-math-optimizations
همراه با
-ffinite-math-only و -fno-trapping-math
فعال باشد.
توجه داشته
باشید که
اگرچه توان
عملیاتی
این توالی
بالاتر از
توان
عملیاتی
دستورالعمل
غیرمعکوس
است، دقت
توالی
میتواند
تا ۲ 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 short vector math
library)، aocl برای
کتابخانه
محاسباتی (LibM)
از AMD Optimizing CPU Libraries (AOCL) و acml
برای
کتابخانه
محاسباتی
هسته AMD که به
پایان دوره
پشتیبانی
رسیده است
(که AOCL-LibM
جانشین آن
است). برای
استفاده از
این گزینه،
باید هر دو
گزینه -ftree-vectorize و
-funsafe-math-optimizations فعال
باشند، و یک
کتابخانه
سازگار با ABI
مربوط به SVML
یا ACML در زمان
پیوند مشخص
شود.
در حال حاضر GCC فراخوانیهایی به "vmldExp2"، "vmldLn2"، "vmldLog102"، "vmldPow2"، "vmldTanh2"، "vmldTan2"، "vmldAtan2"، "vmldAtanh2"، "vmldCbrt2"، "vmldSinh2"، "vmldSin2"، "vmldAsinh2"، "vmldAsin2"، "vmldCosh2"، "vmldCos2"، "vmldAcosh2"، "vmldAcos2"، "vmlsExp4"، "vmlsLn4"، "vmlsLog104"، "vmlsPow4"، "vmlsTanh4"، "vmlsTan4"، "vmlsAtan4"، "vmlsAtanh4"، "vmlsCbrt4"، "vmlsSinh4"، "vmlsSin4"، "vmlsAsinh4"، "vmlsAsin4"، "vmlsCosh4"، "vmlsCos4"، "vmlsAcosh4" و "vmlsAcos4" را برای نوع تابع متناظر در هنگام استفاده از -mveclibabi=svml، "amd_vrs4_acosf"، "amd_vrs16_acosf"، "amd_vrd8_asin"، "amd_vrs4_asinf"، "amd_vrs8_asinf"، "amd_vrs16_asinf"، "amd_vrd2_atan"، "amd_vrd8_atan"، "amd_vrs4_atanf"، "amd_vrs8_atanf"، "amd_vrs16_atanf"، "amd_vrd2_cos"، "amd_vrd4_cos"، "amd_vrd8_cos"، "amd_vrs4_cosf"، "amd_vrs8_cosf"، "amd_vrs16_cosf"، "amd_vrs4_coshf"، "amd_vrs8_coshf"، "amd_vrd2_erf"، "amd_vrd4_erf"، "amd_vrd8_erf"، "amd_vrs4_erff"، "amd_vrs8_erff"، "amd_vrs16_erff"، "amd_vrd2_exp"، "amd_vrd4_exp"، "amd_vrd8_exp"، "amd_vrs4_expf"، "amd_vrs8_expf"، "amd_vrs16_expf"، "amd_vrd2_exp10"، "amd_vrs4_exp10f"، "amd_vrd2_exp2"، "amd_vrd4_exp2"، "amd_vrd8_exp2"، "amd_vrs4_exp2f"، "amd_vrs8_exp2f"، "amd_vrs16_exp2f"، "amd_vrs4_expm1f"، "amd_vrd2_log"، "amd_vrd4_log"، "amd_vrd8_log"، "amd_vrs4_logf"، "amd_vrs8_logf"، "amd_vrs16_logf"، "amd_vrd2_log10"، "amd_vrs4_log10f"، "amd_vrs8_log10f"، "amd_vrs16_log10f"، "amd_vrd2_log1p"، "amd_vrs4_log1pf"، "amd_vrd2_log2"، "amd_vrd4_log2"، "amd_vrd8_log2"، "amd_vrs4_log2f"، "amd_vrs8_log2f"، "amd_vrs16_log2f"، "amd_vrd2_pow"، "amd_vrd4_pow"، "amd_vrd8_pow"، "amd_vrs4_powf"، "amd_vrs8_powf"، "amd_vrs16_powf"، "amd_vrd2_sin"، "amd_vrd4_sin"، "amd_vrd8_sin"، "amd_vrs4_sinf"، "amd_vrs8_sinf"، "amd_vrs16_sinf"، "amd_vrd2_tan"، "amd_vrd4_tan"، "amd_vrd8_tan"، "amd_vrs16_tanf"، "amd_vrs4_tanhf"، "amd_vrs8_tanhf" و "amd_vrs16_tanhf" را برای نوع تابع متناظر در هنگام استفاده از -mveclibabi=aocl، و "__vrd2_sin"، "__vrd2_cos"، "__vrd2_exp"، "__vrd2_log"، "__vrd2_log2"، "__vrd2_log10"، "__vrs4_sinf"، "__vrs4_cosf"، "__vrs4_expf"، "__vrs4_logf"، "__vrs4_log2f"، "__vrs4_log10f" و "__vrs4_powf" را برای نوع تابع متناظر در هنگام استفاده از -mveclibabi=acml صادر میکند.
- -mabi=name
- برای قرارداد فراخوانی (calling convention) مشخصشده، کد تولید میکند. مقادیر مجاز عبارتند از sysv برای ABI مورد استفاده در GNU/Linux و سایر سیستمها، و ms برای Microsoft ABI. پیشفرض در هنگام هدف قرار دادن Microsoft Windows، استفاده از Microsoft ABI و در تمام سیستمهای دیگر 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
- بهطور پیشفرض، ابزارگذاری CET روی دستورهای switch که از جدول پرش (jump table) استفاده میکنند خاموش بوده و ردیابی شاخه غیرمستقیم غیرفعال است. از آنجا که جدولهای پرش در حافظه فقطخواندنی ذخیره میشوند، این امر منجر به از دست رفتن مستقیم مقاومسازی امنیتی (hardening) نمیشود. اما اگر اندیس جدول پرش تحت کنترل مهاجم باشد، ممکن است پرش غیرمستقیم توسط CET مهار نشود. این گزینه ابزارگذاری CET را روشن میکند تا ردیابی شاخه غیرمستقیم برای دستورهای switch دارای جدول پرش فعال شود، که باعث میشود مقاصد پرش از طریق هر پرش غیرمستقیمی قابل دستیابی باشند.
- -mcall-ms2sysv-xlogues
- به دلیل تفاوتها در ABIهای ۶۴ بیتی، هر تابع با Microsoft ABI که یک تابع با System V ABI را فراخوانی میکند، باید ثباتهای RSI، RDI و XMM6-15 را به عنوان تخریبشده (clobbered) در نظر بگیرد. بهطور پیشفرض، کد ذخیره و بازیابی این ثباتها به صورت درونخطی صادر میشود که منجر به مقدمهها (prologues) و مؤخرههای (epilogues) نسبتاً طولانی میگردد. استفاده از -mcall-ms2sysv-xlogues مقدمهها و مؤخرههایی صادر میکند که از تکهکدهای واسط (stubs) در بخش ایستا از libgcc برای انجام این ذخیره و بازیابیها استفاده میکنند، و بدین ترتیب اندازه تابع را به بهای چند دستورالعمل اضافی کاهش میدهد.
- -mtls-dialect=type
- کدی برای دسترسی به حافظه محلی رشته (thread-local storage) با استفاده از قراردادهای gnu یا gnu2 تولید میکند. گزینه gnu پیشفرض محافظهکارانه است؛ gnu2 کارآمدتر است، اما ممکن است نیازمندیهای زمان کامپایل و زمان اجرایی ایجاد کند که در تمام سیستمها قابل برآورده شدن نباشد.
- -mpush-args
- -mno-push-args
- از عملیات PUSH برای ذخیره پارامترهای ارسالی (outgoing) استفاده میکند. این روش کوتاهتر است و معمولاً سرعتی برابر با روش استفاده از عملیات 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) و ترازسازی اعضای ساختارها و اینکه آیا یک فیلد بیتی میتواند از مرز یک واحد ذخیرهسازی عبور کند یا خیر، با این قوانین تعیین میشوند:
- ۱. اعضای ساختار به صورت متوالی و به همان ترتیبی که اعلان شدهاند
- ذخیره میشوند: نخستین عضو کمترین آدرس حافظه و آخرین عضو بیشترین آدرس را دارد.
- ۲. هر شیء داده نیازمند ترازسازی است. نیازمندی ترازسازی
- برای تمام
دادهها به
جز
ساختارها،
یونیونها
(unions) و
آرایهها،
یا اندازه
شیء است یا
اندازه
بستهبندی
کنونی
(مشخصشده
با ویژگی
"aligned" یا
عملگر
کاربردی
"pack")، هر
کدام که
کمتر باشد.
برای
ساختارها،
یونیونها
و
آرایهها،
نیازمندی
ترازسازی
بزرگترین
نیازمندی
ترازسازی
اعضای آن
است. به هر
شیء یک آفست
اختصاص
مییابد
بهگونهای
که:
offset % alignment_requirement == 0
- ۳. فیلدهای بیتی مجاور در یک واحد تخصیص ۱، ۲ یا ۴ بایتی یکسان بستهبندی میشوند
- اگر انواع عددی صحیح اندازه یکسانی داشته باشند و اگر فیلد بیتی بعدی بدون عبور از مرز تحمیلشده توسط نیازمندیهای ترازسازی مشترک فیلدهای بیتی، در واحد تخصیص فعلی جا شود.
کامپایلر MSVC فیلدهای بیتی با طول صفر را به روشهای زیر تفسیر میکند:.IP "1. اگر یک فیلد بیتی با طول صفر بین دو فیلد بیتی درج شود که" 4 بهطور معمول ادغام میشوند، آن فیلدهای بیتی ادغام نمیشوند.
برای مثال:
struct
{
unsigned long bf_1 : 12;
unsigned long : 0;
unsigned long bf_2 : 12;
} t1;
اندازه "t1" همراه با فیلد بیتی با طول صفر برابر با ۸ بایت است. اگر فیلد بیتی با طول صفر حذف شود، اندازه "t1" برابر با ۴ بایت خواهد بود.
- 2. اگر یک فیلد بیتی با طول صفر پس از فیلد بیتی "foo" درج شود و
- تراز فیلد
بیتی با طول
صفر از عضوی
که پس از آن
میآید،
یعنی
"bar"،
بزرگتر
باشد،
"bar"
مطابق نوع
فیلد بیتی
با طول صفر
تراز
میشود.
برای مثال:
struct { char foo : 4; short : 0; char bar; } t2; struct { char foo : 4; short : 0; double bar; } t3;برای "t2"، عضو "bar" بهجای آفست ۱ در آفست ۲ قرار میگیرد. بر همین اساس، اندازه "t2" برابر با ۴ است. برای "t3"، فیلد بیتی با طول صفر تأثیری بر تراز "bar" و در نتیجه بر اندازه ساختار ندارد.
با در نظر گرفتن این موضوع، توجه به موارد زیر حائز اهمیت است:
- 1. اگر یک فیلد بیتی با طول صفر پس از یک فیلد بیتی معمولی بیاید، نوع
- فیلد بیتی با طول صفر ممکن است بر تراز کل ساختار تأثیر بگذارد. برای مثال، "t2" اندازهای برابر با ۴ بایت دارد، زیرا فیلد بیتی با طول صفر پس از یک فیلد بیتی معمولی آمده و از نوع short است.
- 2. حتی اگر پس از یک فیلد بیتی با طول صفر، یک فیلد بیتی معمولی نیاید،
- باز هم ممکن
است بر تراز
ساختار
تأثیر
بگذارد:
struct { char foo : 6; long : 0; } t4;در اینجا، "t4" مقدار ۴ بایت فضا اشغال میکند.
- 3. فیلدهای بیتی با طول صفر پس از اعضای غیر فیلد بیتی نادیده گرفته میشوند:
-
struct { char foo; long : 0; char bar; } t5;در اینجا، "t5" مقدار ۲ بایت فضا اشغال میکند.
- -mno-align-stringops
- مقصد عملیات رشتهای درونخطیشده را تراز نکن. این سوییچ در صورتی که مقصد از قبل تراز شده باشد اما GCC از آن مطلع نباشد، اندازه کد را کاهش داده و کارایی را بهبود میبخشد.
- -minline-all-stringops
- بهطور پیشفرض GCC عملیات رشتهای را تنها زمانی درونخطی میکند که مشخص باشد مقصد دستکم روی یک مرز ۴ بایتی تراز شده است. این گزینه درونخطیسازی بیشتری را فعال کرده و اندازه کد را افزایش میدهد، اما ممکن است کارایی کدی را که برای طولهای کوتاه به "memcpy" و "memset" سریع وابسته است، بهبود بخشد. این گزینه بازشدن درونخطی "strlen" را برای تمام ترازهای اشارهگر فعال میکند.
- -minline-stringops-dynamically
- برای عملیات رشتهای با اندازه نامشخص، از بررسیهای زمان اجرا به همراه کد درونخطی برای بلوکهای کوچک و فراخوانی کتابخانهای برای بلوکهای بزرگ استفاده کن.
- -mstringop-strategy=alg
- روش ابتکاری تصمیمگیری داخلی را برای الگوریتم خاصی که جهت درونخطیسازی عملیات رشتهای استفاده میشود لغو کن. مقادیر مجاز برای alg عبارتند از:
- -mmemcpy-strategy=strategy
- روش ابتکاری تصمیمگیری داخلی را برای تعیین اینکه آیا "__builtin_memcpy" باید درونخطی شود یا خیر و از چه الگوریتم درونخطیای هنگامی که اندازه مورد انتظار عملیات کپی مشخص است استفاده شود، بازنویسی کن. strategy فهرستی از سهگانههای alg:max_size:dest_align است که با کاما از هم جدا شدهاند. مقدار alg در -mstringop-strategy مشخص میشود، و max_size حداکثر اندازه به بایت را مشخص میکند که الگوریتم درونخطی alg با آن مجاز است. برای آخرین سهگانه، مقدار max_size باید -1 باشد. مقادیر max_size سهگانهها در فهرست باید به ترتیب صعودی مشخص شوند. کمینه اندازه به بایت برای alg برای نخستین سهگانه 0 و برای بازههای بعدی برابر با "max_size + 1" از بازه پیشین است.
- -mmemset-strategy=strategy
- این گزینه مشابه -mmemcpy-strategy= است، با این تفاوت که بازشدن "__builtin_memset" را کنترل میکند.
- -momit-leaf-frame-pointer
- اشارهگر چارچوب (frame pointer) را برای توابع برگ در یک ثبات نگه ندار. این کار از دستورالعملهای ذخیره، راهاندازی و بازگردانی اشارهگرهای چارچوب جلوگیری کرده و یک ثبات اضافه را در توابع برگ در دسترس قرار میدهد. گزینه -momit-leaf-frame-pointer اشارهگر چارچوب را برای توابع برگ حذف میکند، که ممکن است اشکالزدایی را دشوارتر سازد.
- -mtls-direct-seg-refs
- -mno-tls-direct-seg-refs
- کنترل
میکند که
آیا
متغیرهای TLS
میتوانند
با
آفستهایی
از ثبات
قطعه TLS
دسترسی
پیدا کنند
(%gs برای
۳۲ بیتی،
%fs برای
۶۴ بیتی)،
یا اینکه
اشارهگر
پایه ریسه
باید اضافه
شود. معتبر
بودن یا
نبودن این
حالت به
سیستمعامل
بستگی دارد
و اینکه آیا
قطعه را به
گونهای
نگاشت
میکند که
کل ناحیه TLS
را پوشش دهد
یا خیر.
برای سیستمهایی که از کتابخانه GNU C استفاده میکنند، پیشفرض روشن است.
- -msse2avx
- -mno-sse2avx
- مشخص میکند که اسمبلر باید دستورالعملهای SSE را با پیشوند VEX کدگذاری کند. گزینه -mavx این حالت را بهطور پیشفرض فعال میکند.
- -mfentry
- -mno-fentry
- اگر تحلیل کارایی (profiling) فعال باشد (-pg)، فراخوانی شمارنده تحلیل کارایی را قبل از مقدمه (prologue) قرار میدهد. نکته: در معماریهای x86 در حال حاضر صفت "ms_hook_prologue" برای -mfentry و -pg امکانپذیر نیست.
- -mrecord-mcount
- -mno-record-mcount
- اگر تحلیل کارایی فعال باشد (-pg)، بخشی ایجاد میکند که حاوی اشارهگرهایی به هر فراخوانی تحلیل کارایی است؛ این برای وصله کردن (patching) خودکار فراخوانیها مفید است. میتوانید از گزینه 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، تقسیم عدد صحیح بدون علامت ۸ بیتی بسیار سریعتر از تقسیم عدد صحیح ۳۲ بیتی یا ۶۴ بیتی است. این گزینه یک بررسی زمان اجرا تولید میکند. اگر هم مقسوم و هم مقسومعلیه در محدوده بین ۰ تا ۲۵۵ باشند، به جای تقسیم عدد صحیح ۳۲ بیتی یا ۶۴ بیتی، تقسیم ۸ بیتی بدون علامت استفاده میشود.
- -mavx256-split-unaligned-load
- -mavx256-split-unaligned-store
- عملیات بارگذاری (load) و ذخیرهسازی (store) ناتراز ۳۲ بایتی AVX را تفکیک میکند.
- -mstack-protector-guard=guard
- -mstack-protector-guard-reg=reg
- -mstack-protector-guard-offset=offset
- -mstack-protector-guard-symbol=symbol
- کد محافظت
از پشته را
با استفاده
از قناری در
guard تولید
میکند.
مکانهای
پشتیبانیشده
شامل global
برای قناری
سراسری یا
tls برای
قناری
بهازای هر
رشته در
بلوک TLS
(پیشفرض)
هستند. این
گزینه تنها
زمانی اثر
دارد که -fstack-protector
یا -fstack-protector-all
مشخص شده
باشد.
با انتخاب حالت دوم، گزینههای -mstack-protector-guard-reg=reg و -mstack-protector-guard-offset=offset افزون بر این مشخص میکنند که کدام ثبات قطعه (%fs یا %gs) به عنوان ثبات پایه برای خواندن قناری، و از چه آفستی نسبت به آن ثبات پایه استفاده شود. پیشفرض این گزینهها طبق آنچه در ABI مربوطه آمده تعیین میشود.
گزینه -mstack-protector-guard-symbol=symbol آفست را با یک ارجاع نماد به یک قناری در بلوک TLS بازنویسی (override) میکند.
- -mgeneral-regs-only
- کدی تولید میکند که فقط از ثباتهای همهمنظوره استفاده میکند. این کار از استفاده کامپایلر از ثباتهای ممیز شناور، برداری، ماسک و ثباتهای کران (bound registers) جلوگیری میکند.
- -mrelax-cmpxchg-loop
- هنگام تولید یک حلقه مقایسه و جایگزینی (compare-and-swap) برای توابع داخلی __sync Builtins و __atomic Builtins که فاقد یک دستورالعمل بومی هستند، با ارسال یک بارگذاری اتمی پیش از دستورالعمل "CMPXCHG" و استفاده از دستورالعمل "PAUSE" جهت کاهش مصرف توان پردازنده در زمان راهاندازی مجدد حلقه، کد را برای حالتهای دارای رقابت بالا بهینهسازی میکند.
- -mindirect-branch=choice
- فراخوانی و
پرش
غیرمستقیم
را با choice
تبدیل
میکند.
مقدار
پیشفرض keep
است که
فراخوانی و
پرش
غیرمستقیم
را بدون
تغییر نگه
میدارد. thunk
فراخوانی و
پرش
غیرمستقیم
را به thunk
فراخوانی و
بازگشت
تبدیل
میکند. thunk-inline
فراخوانی و
پرش
غیرمستقیم
را به thunk
درونخطی (inlined)
فراخوانی و
بازگشت
تبدیل
میکند. thunk-extern
فراخوانی و
پرش
غیرمستقیم
را به thunk
خارجی
فراخوانی و
بازگشت
ارائهشده
در یک فایل
شیء مجزا
تبدیل
میکند.
میتوانید
این رفتار
را برای یک
تابع مشخص
با استفاده
از صفت تابع
"indirect_branch"
کنترل کنید.
توجه داشته باشید که -mcmodel=large با -mindirect-branch=thunk و -mindirect-branch=thunk-extern ناسازگار است، چرا که ممکن است تابع thunk در مدل کد large قابل دسترس نباشد.
توجه داشته باشید که -mindirect-branch=thunk-extern با -fcf-protection=branch سازگار است، چرا که میتوان thunk خارجی را به گونهای پیکربندی کرد که بررسی جریان کنترل را فعال کند.
- -mfunction-return=choice
- بازگشت
تابع را با
choice تبدیل
میکند.
پیشفرض keep
است که
بازگشت
تابع را
بدون تغییر
نگه
میدارد. thunk
بازگشت
تابع را به thunk
فراخوانی و
بازگشت
تبدیل
میکند. thunk-inline
بازگشت
تابع را به thunk
درونخطی
فراخوانی و
بازگشت
تبدیل
میکند. thunk-extern
بازگشت
تابع را به thunk
خارجی
فراخوانی و
بازگشت
ارائهشده
در یک فایل
شیء مجزا
تبدیل
میکند.
میتوانید
این رفتار
را برای یک
تابع خاص با
استفاده از
صفت تابع
"function_return"
کنترل کنید.
توجه داشته باشید که -mindirect-return=thunk-extern با -fcf-protection=branch سازگار است، چرا که میتوان thunk خارجی را به گونهای پیکربندی کرد که بررسی جریان کنترل را فعال کند.
توجه داشته باشید که -mcmodel=large با -mfunction-return=thunk و -mfunction-return=thunk-extern ناسازگار است، چرا که ممکن است تابع thunk در مدل کد large قابل دسترس نباشد.
- -mindirect-branch-register
- فراخوانی و پرش غیرمستقیم را از طریق ثبات اجباری میکند.
- -mharden-sls=choice
- کدی برای مقابله با گمانهزنی خط مستقیم (SLS) با استفاده از choice تولید میکند. پیشفرض none است که تمام مقاومسازیهای SLS را غیرفعال میکند. return مقاومسازی SLS را برای بازگشتهای توابع فعال میکند. indirect-jmp مقاومسازی SLS را برای پرشهای غیرمستقیم فعال میکند. all تمامی مقاومسازیهای SLS را فعال میکند.
- -mindirect-branch-cs-prefix
- پیشوند CS را به فراخوانیها (call) و پرشهای (jmp) به سمت thunk غیرمستقیم با مقصد انشعاب در ثباتهای r8-r15 اضافه میکند، تا طول دستور call و jmp برابر با ۶ بایت شود. این به آنها امکان میدهد در زمان اجرا بتوانند با lfence; call *%r8-r15 یا lfence; jmp *%r8-r15 جایگزین شوند.
- -mapx-inline-asm-use-gpr32
- بهطور پیشفرض، استفاده از EGPR در قیدهای اسمبلی درونخطی غیرفعال است، زیرا GCC نمیتواند تشخیص دهد که آیا دستورالعملهای asm از GP32 پشتیبانی میکنند یا خیر. اگر اسمبلی درونخطی شما میتواند EGPR را مدیریت کند، از -mapx-inline-asm-use-gpr32 استفاده کنید.
- -mgather
- -mscatter
- به ترتیب برداریسازی (vectorization) را برای دستورالعملهای 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 الزامی شده است؛ این ناحیه فضایی ۱۲۸ بایتی پس از مکان اشارهگر پشته (stack pointer) است که توسط گردانندههای سیگنال یا وقفه تغییر نمیکند و بنابراین میتواند برای دادههای موقت بدون نیاز به تنظیم مجدد اشارهگر پشته استفاده شود. پرچم -mno-red-zone این منطقهٔ سرخ را غیرفعال میکند.
- -mcmodel=small
- تولید کد برای مدل کد کوچک (small code model): برنامه و نمادهای آن باید در ۲ گیگابایت پایینی فضای آدرس پیوند داده شوند. اشارهگرها ۶۴ بیتی هستند. برنامهها میتوانند به صورت ایستا یا پویا پیوند یابند. این مدل، مدل کد پیشفرض است.
- -mcmodel=kernel
- تولید کد برای مدل کد هسته (kernel code model). هسته در ۲ گیگابایت منفی از فضای آدرس اجرا میشود. این مدل باید برای کد هستهٔ لینوکس استفاده شود.
- -mcmodel=medium
- تولید کد برای مدل متوسط (medium model): برنامه در ۲ گیگابایت پایینی فضای آدرس پیوند مییابد. نمادهای کوچک نیز در آنجا قرار میگیرند. نمادهایی با اندازهٔ بزرگتر از -mlarge-data-threshold در بخشهای داده بزرگ یا BSS قرار میگیرند و میتوانند بالاتر از ۲ گیگابایت مستقر شوند. برنامهها میتوانند به صورت ایستا یا پویا پیوند یابند.
- -mcmodel=large
- تولید کد برای مدل بزرگ (large model). این مدل هیچ فرضیاتی دربارهٔ آدرسها و اندازههای بخشها در نظر نمیگیرد.
- -maddress-mode=long
- تولید کد برای حالت آدرس بلند (long address mode). این حالت تنها برای محیطهای ۶۴ بیتی و x32 پشتیبانی میشود. این حالت، حالت آدرس پیشفرض برای محیطهای ۶۴ بیتی است.
- -maddress-mode=short
- تولید کد برای حالت آدرس کوتاه (short address mode). این حالت تنها برای محیطهای ۳۲ بیتی و x32 پشتیبانی میشود. این حالت، حالت آدرس پیشفرض برای محیطهای ۳۲ بیتی و x32 است.
- -mneeded
- -mno-needed
- درج ویژگی گنو GNU_PROPERTY_X86_ISA_1_NEEDED برای مقصد لینوکس به منظور مشخص کردن سطح ISA ریزمعماریِ لازم برای اجرای باینری.
- -mno-direct-extern-access
- بدون -fpic یا
-fPIC، همواره
از
اشارهگر GOT
برای
دسترسی به
نمادهای
خارجی
استفاده کن.
با -fpic یا -fPIC،
با دسترسی
به نمادهای
محافظتشده
مانند
نمادهای
محلی رفتار
کن. مقدار
پیشفرض
-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=انتخاب
- ویژگی LAM (پوشش آدرس خطی یا linear-address masking) اجازه میدهد بیتهای خاصی از اشارهگر برای فراداده (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" را تولید نمیکند و مقادیر مستقیم را به جای "L32R"، با استفاده از دستورالعملهای "MOVI" در ثباتها بارگذاری میکند تا به اسمبلر اجازه دهد تنظیم فاصله (relaxation) را انجام داده و مقادیر مستقیم را بر حسب نیاز جایگذاری کند. این گزینه به اسمبلر اجازه میدهد چندین استخر مقادیر مستقیم به ازای هر تابع ایجاد کرده و توابع بسیار بزرگ را اسمبل کند؛ امری که ممکن است با -mtext-section-literals امکانپذیر نباشد..IP -mtarget-align 4
- -mno-target-align
- هنگامی که این گزینه فعال باشد، GCC به اسمبلر دستور میدهد تا دستورالعملها را به طور خودکار تراز کند تا جریمههای انشعاب (branch penalties) را به بهای مقداری کاهش تراکم کد، کاهش دهد. اسمبلر سعی میکند دستورالعملهای متراکم (density instructions) را گسترش دهد تا اهداف انشعاب و دستورالعملهای پس از دستورالعملهای فراخوانی (call) را تراز کند. اگر دستورالعملهای متراکمِ امنِ قبلی برای تراز کردن یک هدف کافی نباشد، هیچ گسترشی انجام نمیشود. پیشفرض -mtarget-align است. این گزینهها بر نحوه رفتار با دستورالعملهای خودتراز مانند "LOOP" تأثیری ندارند؛ اسمبلر همیشه آنها را چه با گسترش دستورالعملهای متراکم و چه با درج دستورالعملهای NOP تراز میکند.
- -mlongcalls
- -mno-longcalls
- هنگامی که این گزینه فعال باشد، GCC به اسمبلر دستور میدهد تا فراخوانیهای مستقیم را به فراخوانیهای غیرمستقیم تبدیل کند، مگر اینکه بتواند تشخیص دهد که مقصد فراخوانی مستقیم در محدوده مجازِ دستورالعملِ فراخوانی قرار دارد. این تبدیل معمولاً برای فراخوانی توابع در فایلهای منبع دیگر رخ میدهد. به طور مشخص، اسمبلر یک دستورالعمل مستقیم "CALL" را به یک "L32R" و به دنبال آن یک دستورالعمل "CALLX" تبدیل میکند. پیشفرض -mno-longcalls است. این گزینه باید در برنامههایی استفاده شود که مقصد فراخوانی میتواند احتمالاً خارج از محدوده باشد. این گزینه در اسمبلر پیادهسازی شده است، نه کامپایلر، بنابراین کد اسمبلی تولیدشده توسط GCC همچنان دستورالعملهای فراخوانی مستقیم را نشان میدهد---برای دیدن دستورالعملهای واقعی به کد شیء دیساسمبلشده نگاه کنید. توجه داشته باشید که اسمبلر برای هر فراخوانی بین فایلی، نه فقط مواردی که واقعاً خارج از محدوده هستند، از فراخوانی غیرمستقیم استفاده میکند.
- -mabi=name
- تولید کد برای ABI مشخصشده. مقادیر مجاز عبارتند از: call0، windowed. مقدار پیشفرض ABI توسط پیکربندی هسته Xtensa انتخاب میشود.
- -mabi=call0
- هنگامی که این گزینه فعال باشد، پارامترهای تابع در ثباتهای "a2" تا "a7" ارسال میشوند، ثباتهای "a12" تا "a15" از نوع ذخیرهشده توسط فراخوان (caller-saved) هستند، و ثبات "a15" ممکن است به عنوان اشارهگر فریم (frame pointer) استفاده شود. هنگامی که این نسخه از ABI فعال باشد، نماد پیشپردازنده C "__XTENSA_CALL0_ABI__" تعریف میشود.
- -mabi=windowed
- هنگامی که این گزینه فعال باشد، پارامترهای تابع در ثباتهای "a10" تا "a15" ارسال میشوند، و تابع فراخواندهشده در بدو ورود پنجره ثبات را به اندازه ۸ ثبات میچرخاند به طوری که آرگومانهای آن در ثباتهای "a2" تا "a7" یافت شوند. ثبات "a7" ممکن است به عنوان اشارهگر فریم استفاده شود. پنجره ثبات هنگام بازگشت، ۸ ثبات به عقب چرخانده میشود. هنگامی که این نسخه از ABI فعال باشد، نماد پیشپردازنده C "__XTENSA_WINDOWED_ABI__" تعریف میشود.
- -mextra-l32r-costs=n
- هزینه اضافی دسترسی به RAM/ROM دستورالعمل را برای دستورالعملهای "L32R"، بر حسب چرخههای ساعت مشخص میکند. این گزینه هنگام بهینهسازی برای سرعت، بر این امر تأثیر میگذارد که آیا یک مقدار ثابت با استفاده از "L32R" از مخزن لیترال (literal pool) بارگیری شود یا اینکه ثابت با استفاده از چند دستورالعمل حسابی از یک مقدار کوچک سنتز شود. مقدار پیشفرض 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
از اطلاعات
محلیسازی
(localization) را کنترل
میکنند که
به 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-dependent)
است و در
زمان ساخت GCC
تعیین
میشود.
برای
مقصدهای
مبتنی بر Microsoft
Windows، یک
نقطه-ویرگول
و برای
تقریباً
تمامی
مقصدهای
دیگر، یک
دونقطه است.
متغیر CPATH فهرستی از دایرکتوریها را برای جستجو مشخص میکند، گویی با -I مشخص شدهاند، اما پس از هر مسیری که با گزینههای -I در خط فرمان داده شده است جستجو میشوند. این متغیر محیطی بدون توجه به اینکه کدام زبان در حال پیشپردازش است استفاده میشود.
سایر متغیرهای محیطی تنها هنگام پیشپردازش زبان خاص مشخصشده اعمال میشوند. هر یک فهرستی از دایرکتوریها را برای جستجو تعیین میکند، گویی با -isystem مشخص شدهاند، اما پس از هر مسیری که با گزینههای -isystem در خط فرمان مشخص شده است بررسی میشوند.
در تمام این متغیرها، یک عنصر خالی به کامپایلر دستور میدهد تا دایرکتوری کاری فعلی خود را جستجو کند. عناصر خالی میتوانند در ابتدا یا انتهای یک مسیر ظاهر شوند. برای نمونه، اگر مقدار CPATH برابر با ":/special/include" باشد، اثری مشابه -I. -I/special/include خواهد داشت.
- DEPENDENCIES_OUTPUT
- اگر این
متغیر
تنظیم شود،
مقدار آن
چگونگی
خروجی دادن
وابستگیها
را برای Make بر
اساس
فایلهای
سرایند
غیرسیستمی
پردازششده
توسط
کامپایلر
مشخص
میکند.
فایلهای
سرایند
سیستمی در
خروجی
وابستگی
نادیده
گرفته
میشوند.
مقدار DEPENDENCIES_OUTPUT میتواند صرفاً یک نام فایل باشد؛ در این حالت قواعد Make در آن فایل نوشته میشوند و نام هدف (target) بر اساس نام فایل مبدأ حدس زده میشود. یا اینکه مقدار میتواند به صورت file target باشد که در این حالت قواعد با استفاده از target بهعنوان نام هدف، در فایل file نوشته میشوند.
به بیان دیگر، این متغیر محیطی معادل ترکیب گزینههای -MM و -MF، همراه با یک سوییچ اختیاری -MT است.
- SUNPRO_DEPENDENCIES
- این متغیر مشابه DEPENDENCIES_OUTPUT است (به بالا مراجعه کنید)، با این تفاوت که فایلهای سرایند سیستمی نادیده گرفته نمیشوند، بنابراین بیانگر -M است تا -MM. با این حال، وابستگی به فایل ورودی اصلی حذف میشود.
- SOURCE_DATE_EPOCH
- اگر این
متغیر
تنظیم شود،
مقدار آن
برچسب
زمانی
یونیکس (UNIX timestamp)
را برای
جایگزینی
با تاریخ و
زمان فعلی
در
ماکروهای
"__DATE__" و
"__TIME__"
مشخص
میکند، به
طوری که
برچسبهای
زمانی
تعبیهشده
بازتولیدپذیر
(reproducible) شوند.
مقدار SOURCE_DATE_EPOCH باید یک برچسب زمانی یونیکس باشد که به عنوان تعداد ثانیههای سپریشده (به جز ثانیههای کبیسه) از 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)
کپیرایت (c) 1988-2026 Free Software Foundation, Inc.
اجازه کپی، توزیع و/یا تغییر این سند تحت شرایط «مجوز مستندات آزاد گنو» (GNU Free Documentation License)، نسخه 1.3 یا هر نسخه بالاتر منتشر شده توسط بنیاد نرمافزار آزاد اعطا میشود؛ با بخشهای تغییرناپذیر "GNU General Public License" و "Funding Free Software"، متنهای روی جلد (a) (پایین را ببینید)، و با متنهای پشت جلد (b) (پایین را ببینید). رونوشتی از این مجوز در صفحه راهنمای gfdl(7) گنجانده شده است.
(a) متن روی جلد FSF عبارت است از:
A GNU Manual
(b) متن پشت جلد FSF عبارت است از:
You have freedom to copy and modify this GNU Manual, like GNU software. Copies published by the Free Software Foundation raise funds for GNU development.
| 2026-08-10 | gcc-16.2.1 |