| 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 را فراخوانی میکنید، معمولاً پیشپردازش، کامپایل، اسمبلی و پیونددهی (linking) را انجام میدهد. «گزینههای کلی» به شما امکان میدهند این فرآیند را در یک مرحله میانی متوقف کنید. برای نمونه، گزینهی -c مشخص میکند که پیونددهنده اجرا نشود. در این صورت، خروجی شامل فایلهای شیء (object files) تولیدشده توسط اسمبلر خواهد بود.
گزینههای دیگر به یک یا چند مرحله از پردازش منتقل میشوند. برخی گزینهها پیشپردازنده و برخی دیگر خود کامپایلر را کنترل میکنند. گزینههای دیگری نیز اسمبلر و پیونددهنده را کنترل میکنند؛ بیشتر این گزینهها در اینجا مستند نشدهاند، چرا که بهندرت به استفاده از آنها نیاز خواهید داشت.
بیشتر گزینههای خط فرمانی که میتوانید با 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 است. این راهنما تنها یکی از این دو حالت را، هرکدام که پیشفرض نباشد، مستند میکند.
برخی گزینهها یک یا چند آرگومان میگیرند که معمولاً یا با یک فاصله یا با علامت مساوی (=) از نام گزینه جدا میشوند. مگر در مواردی که خلاف آن مستند شده باشد، یک آرگومان میتواند عددی یا یک رشته باشد. آرگومانهای عددی معمولاً باید اعداد صحیح کوچک بدون علامت در مبنای ده یا شانزده (hexadecimal) باشند. آرگومانهای مبنای شانزده باید با پیشوند 0x آغاز شوند. آرگومانهای گزینههایی که نوعی آستانهی اندازه را مشخص میکنند، ممکن است اعداد صحیح دلخواه بزرگ در مبنای ده یا شانزده باشند که در ادامه آنها یک پسوند اندازهی بایت برای تعیین مضربی از بایتها قرار میگیرد؛ مانند "kB" و "KiB" به ترتیب برای کیلوبایت و کیبیبایت، "MB" و "MiB" برای مگابایت و مبیبایت، "GB" و "GiB" برای گیگابایت و گیبیبایت، و غیره. این آرگومانها در متن پیشرو با byte-size مشخص شدهاند. برای فهرست کامل و توضیحات پیشوندهای اندازهی بایت دودویی و دهدهی، به استانداردهای NIST، IEC و سایر استانداردهای ملی و بینالمللی مرتبط مراجعه کنید..SH "گزینهها (OPTIONS)"
خلاصه گزینهها (Option Summary)
در اینجا خلاصهای از تمام گزینهها، گروهبندیشده بر پایه نوع، آورده شده است. توضیحات در بخشهای بعدی آمده است.
- گزینههای کلی (Overall Options)
- -c -S -E -o file -dumpbase dumpbase -dumpbase-ext auxdropsuf -dumpdir dumppfx -x language -v -### --help[=class[,...]] --target-help --version -pass-exit-codes -pipe -specs=file -wrapper @file -ffile-prefix-map=old=new -fcanon-prefix-map -fplugin=file -fplugin-arg-name=arg -fdump-ada-spec[-slim] -fada-spec-parent=unit -fdump-go-spec=file
- گزینههای زبان C (C Language Options)
- -ansi -std=standard -aux-info filename -fno-asm -fno-builtin -fno-builtin-function -fcond-mismatch -ffreestanding -fgimple -fgnu-tm -fgnu89-inline -fhosted -flax-vector-conversions -fms-extensions -fpermitted-flt-eval-methods=standard -fplan9-extensions -fsigned-bitfields -funsigned-bitfields -fsigned-char -funsigned-char -fstrict-flex-arrays[=n] -fsso-struct=endianness
- گزینههای زبان C++ (C++ Language Options)
- -fabi-version=n -fno-access-control -faligned-new=n -fno-assume-sane-operators-new-delete -fchar8_t -fcheck-new -fconcepts -fconstexpr-depth=n -fconstexpr-cache-depth=n -fconstexpr-loop-limit=n -fconstexpr-ops-limit=n -fno-elide-constructors -fno-enforce-eh-specs -fno-gnu-keywords -fno-immediate-escalation -fno-implicit-templates -fno-implicit-inline-templates -fno-implement-inlines -fmodule-header[=kind] -fmodule-only -fmodules -fmodule-implicit-inline -fno-module-lazy -fmodule-mapper=specification -fmodule-version-ignore -fms-extensions -fnew-inheriting-ctors -fnew-ttp-matching -fno-nonansi-builtins -fnothrow-opt -fno-operator-names -fno-optional-diags -fno-pretty-templates -frange-for-ext-temps -fno-rtti -fsized-deallocation -fstrong-eval-order[=kind] -ftemplate-backtrace-limit=n -ftemplate-depth=n -fno-threadsafe-statics -fuse-cxa-atexit -fno-weak -nostdinc++ -fvisibility-inlines-hidden -fvisibility-ms-compat -fext-numeric-literals -flang-info-include-translate[=header] -flang-info-include-translate-not -flang-info-module-cmi[=module] -stdlib=libstdc++,libc++ -Wabi-tag -Wcatch-value -Wcatch-value=n -Wno-class-conversion -Wclass-memaccess -Wcomma-subscript -Wconditionally-supported -Wno-conversion-null -Wctad-maybe-unsupported -Wctor-dtor-privacy -Wdangling-reference -Wno-defaulted-function-deleted -Wno-delete-incomplete -Wdelete-non-virtual-dtor -Wno-deprecated-array-compare -Wdeprecated-copy -Wdeprecated-copy-dtor -Wno-deprecated-enum-enum-conversion -Wno-deprecated-enum-float-conversion -Weffc++ -Wno-elaborated-enum-base -Wno-exceptions -Wextra-semi -Wno-global-module -Wno-inaccessible-base -Wno-inherited-variadic-ctor -Wno-init-list-lifetime -Winvalid-constexpr -Winvalid-imported-macros -Wno-invalid-offsetof -Wno-literal-suffix -Wmismatched-new-delete -Wmismatched-tags -Wmultiple-inheritance -Wnamespaces -Wnarrowing -Wnoexcept -Wnoexcept-type -Wnon-virtual-dtor -Wpessimizing-move -Wno-placement-new -Wplacement-new=n -Wrange-loop-construct -Wredundant-move -Wredundant-tags -Wreorder -Wregister -Wstrict-null-sentinel -Wno-subobject-linkage -Wtemplates -Wno-non-template-friend -Wold-style-cast -Woverloaded-virtual -Wno-pmf-conversions -Wself-move -Wsign-promo -Wsized-deallocation -Wsuggest-final-methods -Wsuggest-final-types -Wsuggest-override -Wno-template-body -Wno-template-id-cdtor -Wtemplate-names-tu-local -Wno-terminate -Wno-vexing-parse -Wvirtual-inheritance -Wno-virtual-move-assign -Wvolatile
- گزینههای زبانهای Objective-C و Objective-C++ (Objective-C and Objective-C++ Language Options)
- -fconstant-string-class=class-name -fgnu-runtime -fnext-runtime -fno-nil-receivers -fobjc-abi-version=n -fobjc-call-cxx-cdtors -fobjc-direct-dispatch -fobjc-exceptions -fobjc-gc -fobjc-nilcheck -fobjc-std=objc1 -fno-local-ivars -fivar-visibility=[public|protected|private|package] -freplace-objc-classes -fzero-link -gen-decls -Wassign-intercept -Wno-property-assign-default -Wno-protocol -Wobjc-root-class -Wselector -Wstrict-selector-match -Wundeclared-selector
- گزینههای OpenMP و OpenACC (OpenMP and OpenACC Options)
- -foffload=arg -foffload-options=arg -fopenacc -fopenacc-dim=geom -fopenmp -fopenmp-simd -fopenmp-target-simd-clone[=device-type]
- گزینههای قالببندی پیامهای تشخیصی (Diagnostic Message Formatting Options)
- -fmessage-length=n -fdiagnostics-plain-output -fdiagnostics-show-location=[once|every-line] -fdiagnostics-color=[auto|never|always] -fdiagnostics-urls=[auto|never|always] -fdiagnostics-format=[text|sarif-stderr|sarif-file|json|json-stderr|json-file] -fdiagnostics-add-output=DIAGNOSTICS-OUTPUT-SPEC -fdiagnostics-set-output=DIAGNOSTICS-OUTPUT-SPEC -fno-diagnostics-json-formatting -fno-diagnostics-show-option -fno-diagnostics-show-caret -fno-diagnostics-show-event-links -fno-diagnostics-show-labels -fno-diagnostics-show-line-numbers -fno-diagnostics-show-cwe -fno-diagnostics-show-rules -fno-diagnostics-show-highlight-colors -fdiagnostics-minimum-margin-width=width -fdiagnostics-parseable-fixits -fdiagnostics-generate-patch -fdiagnostics-show-template-tree -fno-elide-type -fdiagnostics-path-format=[none|separate-events|inline-events] -fdiagnostics-show-path-depths -fno-show-column -fdiagnostics-column-unit=[display|byte] -fdiagnostics-column-origin=origin -fdiagnostics-escape-format=[unicode|bytes] -fdiagnostics-text-art-charset=[none|ascii|unicode|emoji]
- گزینههای هشدار (Warning Options)
- -fsyntax-only -fmax-errors=n -Wpedantic -pedantic-errors -fpermissive -w -Wextra -Wall -Wabi=n -Waddress -Wno-address-of-packed-member -Waggregate-return -Walloc-size -Walloc-size-larger-than=byte-size -Walloc-zero -Walloca -Walloca-larger-than=byte-size -Wno-aggressive-loop-optimizations -Warith-conversion -Warray-bounds -Warray-bounds=n -Warray-compare -Warray-parameter -Warray-parameter=n -Wno-attributes -Wattribute-alias=n -Wno-attribute-alias -Wno-attribute-warning -Wbidi-chars=[none|unpaired|any|ucn] -Wbool-compare -Wbool-operation -Wno-builtin-declaration-mismatch -Wno-builtin-macro-redefined -Wc90-c99-compat -Wc99-c11-compat -Wc11-c23-compat -Wc23-c2y-compat -Wc++-compat -Wc++11-compat -Wc++14-compat -Wc++17-compat -Wc++20-compat -Wno-c++11-extensions -Wno-c++14-extensions -Wno-c++17-extensions -Wno-c++20-extensions -Wno-c++23-extensions -Wcalloc-transposed-args -Wcast-align -Wcast-align=strict -Wcast-function-type -Wcast-qual -Wchar-subscripts -Wclobbered -Wcomment -Wcompare-distinct-pointer-types -Wno-complain-wrong-lang -Wconversion -Wno-coverage-mismatch -Wno-cpp -Wdangling-else -Wdangling-pointer -Wdangling-pointer=n -Wdate-time -Wno-deprecated -Wno-deprecated-declarations -Wno-designated-init -Wdisabled-optimization -Wno-discarded-array-qualifiers -Wno-discarded-qualifiers -Wno-div-by-zero -Wdouble-promotion -Wduplicated-branches -Wduplicated-cond -Wempty-body -Wno-endif-labels -Wenum-compare -Wenum-conversion -Wenum-int-mismatch -Werror -Werror=* -Wexpansion-to-defined -Wfatal-errors -Wflex-array-member-not-at-end -Wfloat-conversion -Wfloat-equal -Wformat -Wformat=2 -Wno-format-contains-nul -Wno-format-extra-args -Wformat-nonliteral -Wformat-overflow=n -Wformat-security -Wformat-signedness -Wformat-truncation=n -Wformat-y2k -Wframe-address -Wframe-larger-than=byte-size -Wno-free-nonheap-object -Wheader-guard -Wno-if-not-aligned -Wno-ignored-attributes -Wignored-qualifiers -Wno-incompatible-pointer-types -Whardened -Wimplicit -Wimplicit-fallthrough -Wimplicit-fallthrough=n -Wno-implicit-function-declaration -Wno-implicit-int -Winfinite-recursion -Winit-self -Winline -Wno-int-conversion -Wint-in-bool-context -Wno-int-to-pointer-cast -Wno-invalid-memory-model -Winvalid-pch -Winvalid-utf8 -Wno-unicode -Wjump-misses-init -Wlarger-than=byte-size -Wleading-whitespace=kind -Wlogical-not-parentheses -Wlogical-op -Wlong-long -Wno-lto-type-mismatch -Wmain -Wmaybe-uninitialized -Wmemset-elt-size -Wmemset-transposed-args -Wmisleading-indentation -Wmissing-attributes -Wmissing-braces -Wmissing-field-initializers -Wmissing-format-attribute -Wmissing-include-dirs -Wmissing-noreturn -Wmusttail-local-addr -Wmaybe-musttail-local-addr -Wno-missing-profile -Wno-multichar -Wmultistatement-macros -Wnonnull -Wnonnull-compare -Wnormalized=[none|id|nfc|nfkc] -Wnull-dereference -Wno-odr -Wopenacc-parallelism -Wopenmp -Wopenmp-simd -Wno-overflow -Woverlength-strings -Wno-override-init-side-effects -Wpacked -Wno-packed-bitfield-compat -Wpacked-not-aligned -Wpadded -Wparentheses -Wno-pedantic-ms-format -Wpointer-arith -Wno-pointer-compare -Wno-pointer-to-int-cast -Wno-pragmas -Wno-pragma-once-outside-header -Wno-prio-ctor-dtor -Wno-psabi -Wredundant-decls -Wrestrict -Wno-return-local-addr -Wreturn-type -Wno-scalar-storage-order -Wsequence-point -Wshadow -Wshadow=global -Wshadow=local -Wshadow=compatible-local -Wno-shadow-ivar -Wno-shift-count-negative -Wno-shift-count-overflow -Wshift-negative-value -Wno-shift-overflow -Wshift-overflow=n -Wsign-compare -Wsign-conversion -Wno-sizeof-array-argument -Wsizeof-array-div -Wsizeof-pointer-div -Wsizeof-pointer-memaccess -Wstack-protector -Wstack-usage=byte-size -Wstrict-aliasing -Wstrict-aliasing=n -Wstrict-overflow -Wstrict-overflow=n -Wstring-compare -Wno-stringop-overflow -Wno-stringop-overread -Wno-stringop-truncation -Wstrict-flex-arrays -Wsuggest-attribute=attribute-name -Wswitch -Wno-switch-bool -Wswitch-default -Wswitch-enum -Wno-switch-outside-range -Wno-switch-unreachable -Wsync-nand -Wsystem-headers -Wtautological-compare -Wtrailing-whitespace -Wtrailing-whitespace=kind -Wtrampolines -Wtrigraphs -Wtrivial-auto-var-init -Wno-tsan -Wtype-limits -Wundef -Wuninitialized -Wunknown-pragmas -Wunsuffixed-float-constants -Wunterminated-string-initialization -Wunused -Wunused-but-set-parameter -Wunused-but-set-variable -Wunused-const-variable -Wunused-const-variable=n -Wunused-function -Wunused-label -Wunused-local-typedefs -Wunused-macros -Wunused-parameter -Wno-unused-result -Wunused-value -Wunused-variable -Wuse-after-free -Wuse-after-free=n -Wuseless-cast -Wno-varargs -Wvariadic-macros -Wvector-operation-performance -Wvla -Wvla-larger-than=byte-size -Wno-vla-larger-than -Wvolatile-register-var -Wwrite-strings -Wno-xor-used-as-pow -Wzero-as-null-pointer-constant -Wzero-length-bounds.IP "گزینههای تحلیلگر ایستا (Static Analyzer Options)" 4 -fanalyzer -fanalyzer-call-summaries -fanalyzer-checker=name -fno-analyzer-feasibility -fanalyzer-fine-grained -fanalyzer-show-events-in-system-headers -fno-analyzer-state-merge -fno-analyzer-state-purge -fno-analyzer-suppress-followups -fanalyzer-transitivity -fno-analyzer-undo-inlining -fanalyzer-verbose-edges -fanalyzer-verbose-state-changes -fanalyzer-verbosity=level -fdump-analyzer -fdump-analyzer-callgraph -fdump-analyzer-exploded-graph -fdump-analyzer-exploded-nodes -fdump-analyzer-exploded-nodes-2 -fdump-analyzer-exploded-nodes-3 -fdump-analyzer-exploded-paths -fdump-analyzer-feasibility -fdump-analyzer-infinite-loop -fdump-analyzer-json -fdump-analyzer-state-purge -fdump-analyzer-stderr -fdump-analyzer-supergraph -fdump-analyzer-untracked -Wno-analyzer-double-fclose -Wno-analyzer-double-free -Wno-analyzer-exposure-through-output-file -Wno-analyzer-exposure-through-uninit-copy -Wno-analyzer-fd-access-mode-mismatch -Wno-analyzer-fd-double-close -Wno-analyzer-fd-leak -Wno-analyzer-fd-phase-mismatch -Wno-analyzer-fd-type-mismatch -Wno-analyzer-fd-use-after-close -Wno-analyzer-fd-use-without-check -Wno-analyzer-file-leak -Wno-analyzer-free-of-non-heap -Wno-analyzer-imprecise-fp-arithmetic -Wno-analyzer-infinite-loop -Wno-analyzer-infinite-recursion -Wno-analyzer-jump-through-null -Wno-analyzer-malloc-leak -Wno-analyzer-mismatching-deallocation -Wno-analyzer-null-argument -Wno-analyzer-null-dereference -Wno-analyzer-out-of-bounds -Wno-analyzer-overlapping-buffers -Wno-analyzer-possible-null-argument -Wno-analyzer-possible-null-dereference -Wno-analyzer-putenv-of-auto-var -Wno-analyzer-shift-count-negative -Wno-analyzer-shift-count-overflow -Wno-analyzer-stale-setjmp-buffer -Wno-analyzer-tainted-allocation-size -Wno-analyzer-tainted-assertion -Wno-analyzer-tainted-array-index -Wno-analyzer-tainted-divisor -Wno-analyzer-tainted-offset -Wno-analyzer-tainted-size -Wanalyzer-symbol-too-complex -Wanalyzer-too-complex -Wno-analyzer-undefined-behavior-ptrdiff -Wno-analyzer-undefined-behavior-strtok -Wno-analyzer-unsafe-call-within-signal-handler -Wno-analyzer-use-after-free -Wno-analyzer-use-of-pointer-in-stale-stack-frame -Wno-analyzer-use-of-uninitialized-value -Wno-analyzer-va-arg-type-mismatch -Wno-analyzer-va-list-exhausted -Wno-analyzer-va-list-leak -Wno-analyzer-va-list-use-after-va-end -Wno-analyzer-write-to-const -Wno-analyzer-write-to-string-literal
- گزینههای هشدار مختص C و Objective-C (C and Objective-C-only Warning Options)
- -Wbad-function-cast -Wdeprecated-non-prototype -Wfree-labels -Wmissing-declarations -Wmissing-parameter-name -Wmissing-parameter-type -Wdeclaration-missing-parameter-type -Wmissing-prototypes -Wmissing-variable-declarations -Wnested-externs -Wold-style-declaration -Wold-style-definition -Wstrict-prototypes -Wtraditional -Wtraditional-conversion -Wdeclaration-after-statement -Wpointer-sign
- گزینههای اشکالزدایی (Debugging Options)
- -g -glevel -gdwarf -gdwarf-version -gbtf -gctf -gctflevel -gprune-btf -gno-prune-btf -ggdb -grecord-gcc-switches -gno-record-gcc-switches -gstrict-dwarf -gno-strict-dwarf -gas-loc-support -gno-as-loc-support -gas-locview-support -gno-as-locview-support -gcodeview -gcolumn-info -gno-column-info -gdwarf32 -gdwarf64 -gstatement-frontiers -gno-statement-frontiers -gvariable-location-views -gno-variable-location-views -ginternal-reset-location-views -gno-internal-reset-location-views -ginline-points -gno-inline-points -gvms -gz[=type] -gsplit-dwarf -gdescribe-dies -gno-describe-dies -fdebug-prefix-map=old=new -fdebug-types-section -fno-eliminate-unused-debug-types -femit-struct-debug-baseonly -femit-struct-debug-reduced -femit-struct-debug-detailed[=spec-list] -fno-eliminate-unused-debug-symbols -femit-class-debug-always -fno-merge-debug-strings -fno-dwarf2-cfi-asm -fvar-tracking -fvar-tracking-assignments
- گزینههای بهینهسازی (Optimization Options)
- -faggressive-loop-optimizations -falign-functions[=n[:m:[n2[:m2]]]] -falign-jumps[=n[:m:[n2[:m2]]]] -falign-labels[=n[:m:[n2[:m2]]]] -falign-loops[=n[:m:[n2[:m2]]]] -fmin-function-alignment=[n] -fno-allocation-dce -fallow-store-data-races -fassociative-math -fauto-profile -fauto-profile[=path] -fauto-inc-dec -fbranch-probabilities -fcaller-saves -fcombine-stack-adjustments -fconserve-stack -ffold-mem-offsets -fcompare-elim -fcprop-registers -fcrossjumping -fcse-follow-jumps -fcse-skip-blocks -fcx-fortran-rules -fcx-limited-range -fdata-sections -fdce -fdelayed-branch -fdelete-null-pointer-checks -fdevirtualize -fdevirtualize-speculatively -fdevirtualize-at-ltrans -fdse -fearly-inlining -fipa-sra -fexpensive-optimizations -ffat-lto-objects -ffast-math -ffinite-math-only -ffloat-store -fexcess-precision=style -ffinite-loops -fforward-propagate -ffp-contract=style -ffunction-sections -fgcse -fgcse-after-reload -fgcse-las -fgcse-lm -fgraphite-identity -fgcse-sm -fhoist-adjacent-loads -fif-conversion -fif-conversion2 -findirect-inlining -finline-stringops[=fn] -finline-functions -finline-functions-called-once -finline-limit=n -finline-small-functions -fipa-modref -fipa-cp -fipa-cp-clone -fipa-bit-cp -fipa-vrp -fipa-pta -fipa-profile -fipa-pure-const -fipa-reference -fipa-reference-addressable -fipa-reorder-for-locality -fipa-stack-alignment -fipa-icf -fira-algorithm=algorithm -flate-combine-instructions -flifetime-dse -flive-patching=level -fira-region=region -fira-hoist-pressure -fira-loop-pressure -fno-ira-share-save-slots -fno-ira-share-spill-slots -fisolate-erroneous-paths-dereference -fisolate-erroneous-paths-attribute -fivopts -fkeep-inline-functions -fkeep-static-functions -fkeep-static-consts -flimit-function-alignment -flive-range-shrinkage -floop-block -floop-interchange -floop-strip-mine -floop-unroll-and-jam -floop-nest-optimize -floop-parallelize-all -flra-remat -flto -flto-compression-level -flto-partition=alg -flto-incremental=path -flto-incremental-cache-size=n -fmalloc-dce -fmerge-all-constants -fmerge-constants -fmodulo-sched -fmodulo-sched-allow-regmoves -fmove-loop-invariants -fmove-loop-stores -fno-branch-count-reg -fno-defer-pop -fno-fp-int-builtin-inexact -fno-function-cse -fno-guess-branch-probability -fno-inline -fno-math-errno -fno-peephole -fno-peephole2 -fno-printf-return-value -fno-sched-interblock -fno-sched-spec -fno-signed-zeros -fno-toplevel-reorder -fno-trapping-math -fno-zero-initialized-in-bss -fomit-frame-pointer -foptimize-crc -foptimize-sibling-calls -fpartial-inlining -fpeel-loops -fpredictive-commoning -fprefetch-loop-arrays -fprofile-correction -fprofile-use -fprofile-use=path -fprofile-partial-training -fprofile-values -fprofile-reorder-functions -freciprocal-math -free -frename-registers -freorder-blocks -freorder-blocks-algorithm=algorithm -freorder-blocks-and-partition -freorder-functions -frerun-cse-after-loop -freschedule-modulo-scheduled-loops -frounding-math -fsave-optimization-record -fsched2-use-superblocks -fsched-pressure -fsched-spec-load -fsched-spec-load-dangerous -fsched-stalled-insns-dep[=n] -fsched-stalled-insns[=n] -fsched-group-heuristic -fsched-critical-path-heuristic -fsched-spec-insn-heuristic -fsched-rank-heuristic -fsched-last-insn-heuristic -fsched-dep-count-heuristic -fschedule-fusion -fschedule-insns -fschedule-insns2 -fsection-anchors -fselective-scheduling -fselective-scheduling2 -fsel-sched-pipelining -fsel-sched-pipelining-outer-loops -fsemantic-interposition -fshrink-wrap -fshrink-wrap-separate -fsignaling-nans -fsingle-precision-constant -fsplit-ivs-in-unroller -fsplit-loops -fsplit-paths -fsplit-wide-types -fsplit-wide-types-early -fssa-backprop -fssa-phiopt -fstdarg-opt -fstore-merging -fstrict-aliasing -fipa-strict-aliasing -fthread-jumps -ftracer -ftree-bit-ccp -ftree-builtin-call-dce -ftree-ccp -ftree-ch -ftree-coalesce-vars -ftree-copy-prop -ftree-cselim -ftree-dce -ftree-dominator-opts -ftree-dse -ftree-forwprop -ftree-fre -fcode-hoisting -ftree-loop-if-convert -ftree-loop-im -ftree-phiprop -ftree-loop-distribution -ftree-loop-distribute-patterns -ftree-loop-ivcanon -ftree-loop-linear -ftree-loop-optimize -ftree-loop-vectorize -ftree-parallelize-loops=n -ftree-pre -ftree-partial-pre -ftree-pta -ftree-reassoc -ftree-scev-cprop -ftree-sink -ftree-slsr -ftree-sra -ftree-switch-conversion -ftree-tail-merge -ftree-ter -ftree-vectorize -ftree-vrp -ftrivial-auto-var-init -funconstrained-commons -funit-at-a-time -funroll-all-loops -funroll-loops -funsafe-math-optimizations -funswitch-loops -fipa-ra -fvariable-expansion-in-unroller -fvect-cost-model -fvpt -fweb -fwhole-program -fwpa -fuse-linker-plugin -fzero-call-used-regs --param name=value -O -O0 -O1 -O2 -O3 -Os -Ofast -Og -Oz.IP "گزینههای ابزارگذاری برنامه (Program Instrumentation Options)" 4 -p -pg -fprofile-arcs --coverage -ftest-coverage -fcondition-coverage -fpath-coverage -fprofile-abs-path -fprofile-dir=path -fprofile-generate -fprofile-generate=path -fprofile-info-section -fprofile-info-section=name -fprofile-note=path -fprofile-prefix-path=path -fprofile-update=method -fprofile-filter-files=regex -fprofile-exclude-files=regex -fprofile-reproducible=[multithreaded|parallel-runs|serial] -fsanitize=style -fsanitize-recover -fsanitize-recover=style -fsanitize-trap -fsanitize-trap=style -fasan-shadow-offset=number -fsanitize-sections=s1,s2,... -fsanitize-undefined-trap-on-error -fbounds-check -fcf-protection -fcf-protection=[full|branch|return|none|check] -fharden-compares -fharden-conditional-branches -fhardened -fharden-control-flow-redundancy -fhardcfr-skip-leaf -fhardcfr-check-exceptions -fhardcfr-check-returning-calls -fhardcfr-check-noreturn-calls=[always|no-xthrow|nothrow|never] -fstack-protector -fstack-protector-all -fstack-protector-strong -fstack-protector-explicit -fstack-check -fstack-limit-register=reg -fstack-limit-symbol=sym -fno-stack-limit -fsplit-stack -fstrub=disable -fstrub=strict -fstrub=relaxed -fstrub=all -fstrub=at-calls -fstrub=internal -fvtable-verify=[std|preinit|none] -fvtv-counts -fvtv-debug -finstrument-functions -finstrument-functions-once -finstrument-functions-exclude-function-list=sym,sym,... -finstrument-functions-exclude-file-list=file,file,... -fprofile-prefix-map=old=new -fpatchable-function-entry=N[,M]
- گزینههای پیشپردازنده (Preprocessor Options)
- -Aquestion=answer -A-question[=answer] -C -CC -Dmacro[=defn] -dD -dI -dM -dN -dU -fdebug-cpp -fdirectives-only -fdollars-in-identifiers -fexec-charset=charset -fextended-identifiers -finput-charset=charset -fmacro-prefix-map=old=new -fmax-include-depth=depth -fno-canonical-system-headers -fpch-deps -fpch-preprocess -fpreprocessed -ftabstop=width -ftrack-macro-expansion -fwide-exec-charset=charset -fworking-directory -H -imacros file -include file -M -MD -MF -MG -MM -MMD -MP -MQ -MT -Mno-modules -no-integrated-cpp -P -pthread -remap -traditional -traditional-cpp -trigraphs -Umacro -undef -Wp,option -Xpreprocessor option
- گزینههای اسمبلر (Assembler Options)
- -Wa,option -Xassembler option
- گزینههای پیونددهنده (Linker Options)
- object-file-name -fuse-ld=linker -llibrary -nostartfiles -nodefaultlibs -nolibc -nostdlib -nostdlib++ -e entry --entry=entry -pie -pthread -r -rdynamic -s -static -static-pie -static-libgcc -static-libstdc++ -static-libasan -static-libtsan -static-liblsan -static-libubsan -shared -shared-libgcc -symbolic -T script -Wl,option -Xlinker option -u symbol -z keyword
- گزینههای دایرکتوری (Directory Options)
- -Bprefix -Idir -I- -idirafter dir -imacros file -imultilib dir -iplugindir=dir -iprefix file -iquote dir -isysroot dir -isystem dir -iwithprefix dir -iwithprefixbefore dir --embed-dir=dir -Ldir -no-canonical-prefixes --no-sysroot-suffix -nostdinc -nostdinc++ --sysroot=dir
- گزینههای تولید کد (Code Generation Options)
- -fcall-saved-reg -fcall-used-reg -ffixed-reg -fexceptions -fnon-call-exceptions -fdelete-dead-exceptions -funwind-tables -fasynchronous-unwind-tables -fno-gnu-unique -finhibit-size-directive -fcommon -fno-ident -fpcc-struct-return -fpic -fPIC -fpie -fPIE -fno-plt -fno-jump-tables -fno-bit-tests -frecord-gcc-switches -freg-struct-return -fshort-enums -fshort-wchar -fverbose-asm -fpack-struct[=n] -fleading-underscore -ftls-model=model -fstack-reuse=reuse_level -ftrampolines -ftrampoline-impl=[stack|heap] -ftrapv -fwrapv -fvisibility=[default|internal|hidden|protected] -fstrict-volatile-bitfields -fsync-libcalls -fzero-init-padding-bits=value
- گزینههای توسعهدهنده (Developer Options)
- -dletters -dumpspecs -dumpmachine -dumpversion -dumpfullversion -fcallgraph-info[=su,da] -fchecking -fchecking=n -fdbg-cnt-list -fdbg-cnt=counter-value-list -fdisable-ipa-pass_name -fdisable-rtl-pass_name -fdisable-rtl-pass-name=range-list -fdisable-tree-pass_name -fdisable-tree-pass-name=range-list -fdump-debug -fdump-earlydebug -fdump-noaddr -fdump-unnumbered -fdump-unnumbered-links -fdump-final-insns[=file] -fdump-ipa-all -fdump-ipa-cgraph -fdump-ipa-inline -fdump-lang-all -fdump-lang-switch -fdump-lang-switch-options -fdump-lang-switch-options=filename -fdump-passes -fdump-rtl-pass -fdump-rtl-pass=filename -fdump-statistics -fdump-tree-all -fdump-tree-switch -fdump-tree-switch-options -fdump-tree-switch-options=filename -fcompare-debug[=opts] -fcompare-debug-second -fenable-kind-pass -fenable-kind-pass=range-list -fira-verbose=n -flto-report -flto-report-wpa -fmem-report-wpa -fmem-report -fpre-ipa-mem-report -fpost-ipa-mem-report -fopt-info -fopt-info-options[=file] -fmultiflags -fprofile-report -frandom-seed=string -fsched-verbose=n -fsel-sched-verbose -fsel-sched-dump-cfg -fsel-sched-pipelining-verbose -fstats -fstack-usage -ftime-report -ftime-report-details -fvar-tracking-assignments-toggle -gtoggle -print-file-name=library -print-libgcc-file-name -print-multi-directory -print-multi-lib -print-multi-os-directory -print-prog-name=program -print-search-dirs -Q -print-sysroot -print-sysroot-headers-suffix -save-temps -save-temps=cwd -save-temps=obj -time[=file]
- گزینههای وابسته به ماشین (Machine-Dependent Options)
- گزینههای
AArch64 (AArch64 Options) -mabi=name
-mbig-endian -mlittle-endian -mgeneral-regs-only
-mcmodel=tiny -mcmodel=small -mcmodel=large -mstrict-align
-mno-strict-align -momit-leaf-frame-pointer
-mtls-dialect=desc -mtls-dialect=traditional
-mtls-size=size -mfix-cortex-a53-835769
-mfix-cortex-a53-843419 -mlow-precision-recip-sqrt
-mlow-precision-sqrt -mlow-precision-div
-mpc-relative-literal-loads
-msign-return-address=scope
-mbranch-protection=none|standard|pac-ret[+leaf
+b-key]|bti|gcs
-mharden-sls=opts -march=name
-mcpu=name -mtune=name
-moverride=string -mverbose-cost-dump
-mstack-protector-guard=guard
-mstack-protector-guard-reg=sysreg
-mstack-protector-guard-offset=offset
-mtrack-speculation -moutline-atomics -mearly-ldp-fusion
-mlate-ldp-fusion -Wexperimental-fmv-target
گزینههای Adapteva Epiphany (Adapteva Epiphany Options) -mhalf-reg-file -mprefer-short-insn-regs -mbranch-cost=num -mcmove -mnops=num -msoft-cmpsf -msplit-lohi -mpost-inc -mpost-modify -mstack-offset=num -mround-nearest -mlong-calls -mshort-calls -msmall16 -mfp-mode=mode -mvect-double -max-vect-align=num -msplit-vecmove-early -m1reg-reg
گزینههای AMD GCN (AMD GCN Options) -march=gpu -mtune=gpu -mstack-size=bytes
گزینههای ARC (ARC Options) -mbarrel-shifter -mjli-always -mcpu=cpu -mA6 -mARC600 -mA7 -mARC700 -mdpfp -mdpfp-compact -mdpfp-fast -mno-dpfp-lrsr -mea -mno-mpy -mmul32x16 -mmul64 -matomic -mnorm -mspfp -mspfp-compact -mspfp-fast -msimd -msoft-float -mswap -mcrc -mdsp-packa -mdvbf -mlock -mmac-d16 -mmac-24 -mrtsc -mswape -mtelephony -mxy -misize -mannotate-align -marclinux -marclinux_prof -mlong-calls -mmedium-calls -msdata -mirq-ctrl-saved -mrgf-banked-regs -mlpc-width=width -G num -mvolatile-cache -mtp-regno=regno -malign-call -mauto-modify-reg -mbbit-peephole -mno-brcc -mcase-vector-pcrel -mcompact-casesi -mno-cond-exec -mearly-cbranchsi -mexpand-adddi -mindexed-loads -mlra -mlra-priority-none -mlra-priority-compact -mlra-priority-noncompact -mmillicode -mmixed-code -mq-class -mRcq -mRcw -msize-level=level -mtune=cpu -mmultcost=num -mcode-density-frame -munalign-prob-threshold=probability -mmpy-option=multo -mdiv-rem -mcode-density -mll64 -mfpu=fpu -mrf16 -mbranch-index
گزینههای ARM (ARM Options) -mapcs-frame -mno-apcs-frame -mabi=name -mapcs-stack-check -mno-apcs-stack-check -mapcs-reentrant -mno-apcs-reentrant -mgeneral-regs-only -msched-prolog -mno-sched-prolog -mlittle-endian -mbig-endian -mbe8 -mbe32 -mfloat-abi=name -mfp16-format=name -mthumb-interwork -mno-thumb-interwork -mcpu=name -march=name -mfpu=name -mtune=name -mprint-tune-info -mstructure-size-boundary=n -mabort-on-noreturn -mlong-calls -mno-long-calls -msingle-pic-base -mno-single-pic-base -mpic-register=reg -mnop-fun-dllimport -mpoke-function-name -mthumb -marm -mflip-thumb -mtpcs-frame -mtpcs-leaf-frame -mcaller-super-interworking -mcallee-super-interworking -mtp=name -mtls-dialect=dialect -mword-relocations -mfix-cortex-m3-ldrd -mfix-cortex-a57-aes-1742098 -mfix-cortex-a72-aes-1655431 -munaligned-access -mneon-for-64bits -mslow-flash-data -masm-syntax-unified -mrestrict-it -mverbose-cost-dump -mpure-code -mcmse -mfix-cmse-cve-2021-35465 -mstack-protector-guard=guard -mstack-protector-guard-offset=offset -mfdpic -mbranch-protection=none|standard|pac-ret[+leaf] [+bti]|bti[+pac-ret[+leaf]]
گزینههای AVR (AVR Options) -mmcu=mcu -mabsdata -maccumulate-args -mcvt -mbranch-cost=cost -mfuse-add=level -mfuse-move=level -mfuse-move2 -mcall-prologues -mgas-isr-prologues -mint8 -mflmap -mdouble=bits -mlong-double=bits -mno-call-main -mn_flash=size -mfract-convert-truncate -mno-interrupts -mmain-is-OS_task -mrelax -mrmw -mstrict-X -mtiny-stack -mrodata-in-ram -msplit-bit-shift -msplit-ldst -mshort-calls -mskip-bug -muse-nonzero-bits -nodevicelib -nodevicespecs -Waddr-space-convert -Wmisspelled-isr
گزینههای Blackfin (Blackfin Options) -mcpu=cpu[-sirevision] -msim -momit-leaf-frame-pointer -mno-omit-leaf-frame-pointer -mspecld-anomaly -mno-specld-anomaly -mcsync-anomaly -mno-csync-anomaly -mlow-64k -mno-low64k -mstack-check-l1 -mid-shared-library -mno-id-shared-library -mshared-library-id=n -mleaf-id-shared-library -mno-leaf-id-shared-library -msep-data -mno-sep-data -mlong-calls -mno-long-calls -mfast-fp -minline-plt -mmulticore -mcorea -mcoreb -msdram -micplb
گزینههای C6X (C6X Options) -mbig-endian -mlittle-endian -march=cpu -msim -msdata=sdata-type
گزینههای CRIS (CRIS Options) -mcpu=cpu -march=cpu -mtune=cpu -mmax-stack-frame=n -metrax4 -metrax100 -mpdebug -mcc-init -mno-side-effects -mstack-align -mdata-align -mconst-align -m32-bit -m16-bit -m8-bit -mno-prologue-epilogue -melf -maout -sim -sim2 -mmul-bug-workaround -mno-mul-bug-workaround
گزینههای C-SKY (C-SKY Options) -march=arch -mcpu=cpu -mbig-endian -EB -mlittle-endian -EL -mhard-float -msoft-float -mfpu=fpu -mdouble-float -mfdivdu -mfloat-abi=name -melrw -mistack -mmp -mcp -mcache -msecurity -mtrust -mdsp -medsp -mvdsp -mdiv -msmart -mhigh-registers -manchor -mpushpop -mmultiple-stld -mconstpool -mstack-size -mccrt -mbranch-cost=n -mcse-cc -msched-prolog -msim
گزینههای Cygwin و MinGW (Cygwin and MinGW Options) -mconsole -mcrtdll=library -mdll -mnop-fun-dllimport -mthread -municode -mwin32 -mwindows -fno-set-stack-executable
گزینههای Darwin (Darwin Options) -all_load -allowable_client -arch -arch_errors_fatal -arch_only -bind_at_load -bundle -bundle_loader -client_name -compatibility_version -current_version -dead_strip -dependency-file -dylib_file -dylinker_install_name -dynamic -dynamiclib -exported_symbols_list -filelist -flat_namespace -force_cpusubtype_ALL -force_flat_namespace -headerpad_max_install_names -iframework -image_base -init -install_name -keep_private_externs -multi_module -multiply_defined -multiply_defined_unused -noall_load -no_dead_strip_inits_and_terms -nodefaultrpaths -nofixprebinding -nomultidefs -noprebind -noseglinkedit -pagezero_size -prebind -prebind_all_twolevel_modules -private_bundle -read_only_relocs -sectalign -sectobjectsymbols -whyload -seg1addr -sectcreate -sectobjectsymbols -sectorder -segaddr -segs_read_only_addr -segs_read_write_addr -seg_addr_table -seg_addr_table_filename -seglinkedit -segprot -segs_read_only_addr -segs_read_write_addr -single_module -static -sub_library -sub_umbrella -twolevel_namespace -umbrella -undefined -unexported_symbols_list -weak_reference_mismatches -whatsloaded -F -gused -gfull -mmacosx-version-min=version -mkernel -mone-byte-bool
گزینههای DEC Alpha (DEC Alpha Options) -mno-fp-regs -msoft-float -mieee -mieee-with-inexact -mieee-conformant -mfp-trap-mode=mode -mfp-rounding-mode=mode -mtrap-precision=mode -mbuild-constants -mcpu=cpu-type -mtune=cpu-type -mbwx -mmax -mfix -mcix -msafe-bwa -msafe-partial -mfloat-vax -mfloat-ieee -mexplicit-relocs -msmall-data -mlarge-data -msmall-text -mlarge-text -mmemory-latency=time
گزینههای eBPF (eBPF Options) -mbig-endian -mlittle-endian -mframe-limit=bytes -mxbpf -mco-re -mno-co-re -mjmpext -mjmp32 -malu32 -mv3-atomics -mbswap -msdiv -msmov -mcpu=version -masm=dialect -minline-memops-threshold=bytes
گزینههای FR30 (FR30 Options) -msmall-model -mno-lsim
گزینههای FT32 (FT32 Options) -msim -mlra -mnodiv -mft32b -mcompress -mnopm
گزینههای FRV (FRV Options) -mgpr-32 -mgpr-64 -mfpr-32 -mfpr-64 -mhard-float -msoft-float -malloc-cc -mfixed-cc -mdword -mno-dword -mdouble -mno-double -mmedia -mno-media -mmuladd -mno-muladd -mfdpic -minline-plt -mgprel-ro -multilib-library-pic -mlinked-fp -mlong-calls -malign-labels -mlibrary-pic -macc-4 -macc-8 -mpack -mno-pack -mno-eflags -mcond-move -mno-cond-move -moptimize-membar -mno-optimize-membar -mscc -mno-scc -mcond-exec -mno-cond-exec -mvliw-branch -mno-vliw-branch -mmulti-cond-exec -mno-multi-cond-exec -mnested-cond-exec -mno-nested-cond-exec -mtomcat-stats -mTLS -mtls -mcpu=cpu
گزینههای GNU/Linux (GNU/Linux Options) -mglibc -muclibc -mmusl -mbionic -mandroid -tno-android-cc -tno-android-ld
گزینههای H8/300 (H8/300 Options) -mrelax -mh -ms -mn -mexr -mno-exr -mint32 -malign-300
گزینههای HPPA (HPPA Options) -march=architecture-type -matomic-libcalls -mbig-switch -mcaller-copies -mdisable-fpregs -mdisable-indexing -mordered -mfast-indirect-calls -mgas -mgnu-ld -mhp-ld -mfixed-range=register-range -mcoherent-ldcw -mjump-in-delay -mlinker-opt -mlong-calls -mlong-load-store -mno-atomic-libcalls -mno-disable-fpregs -mno-disable-indexing -mno-fast-indirect-calls -mno-gas -mno-jump-in-delay -mno-long-load-store -mno-portable-runtime -mno-soft-float -mno-space-regs -msoft-float -mpa-risc-1-0 -mpa-risc-1-1 -mpa-risc-2-0 -mportable-runtime -mschedule=cpu-type -mspace-regs -msoft-mult -msio -mwsio -munix=unix-std -nolibdld -static -threads
گزینههای IA-64 (IA-64 Options) -mbig-endian -mlittle-endian -mgnu-as -mgnu-ld -mno-pic -mvolatile-asm-stop -mregister-names -msdata -mno-sdata -mconstant-gp -mauto-pic -mfused-madd -minline-float-divide-min-latency -minline-float-divide-max-throughput -mno-inline-float-divide -minline-int-divide-min-latency -minline-int-divide-max-throughput -mno-inline-int-divide -minline-sqrt-min-latency -minline-sqrt-max-throughput -mno-inline-sqrt -mdwarf2-asm -mearly-stop-bits -mfixed-range=register-range -mtls-size=tls-size -mtune=cpu-type -milp32 -mlp64 -msched-br-data-spec -msched-ar-data-spec -msched-control-spec -msched-br-in-data-spec -msched-ar-in-data-spec -msched-in-control-spec -msched-spec-ldc -msched-spec-control-ldc -msched-prefer-non-data-spec-insns -msched-prefer-non-control-spec-insns -msched-stop-bits-after-every-cycle -msched-count-spec-in-critical-path -msel-sched-dont-check-control-spec -msched-fp-mem-deps-zero-cost -msched-max-memory-insns-hard-limit -msched-max-memory-insns=max-insns
گزینههای LM32 (LM32 Options) -mbarrel-shift-enabled -mdivide-enabled -mmultiply-enabled -msign-extend-enabled -muser-enabled
گزینههای LoongArch (LoongArch Options) -march=arch-type -mtune=tune-type -mabi=base-abi-type -mfpu=fpu-type -msimd=simd-type -msoft-float -msingle-float -mdouble-float -mlsx -mno-lsx -mlasx -mno-lasx -mbranch-cost=n -maddr-reg-reg-cost=n -mcheck-zero-division -mno-check-zero-division -mcond-move-int -mno-cond-move-int -mcond-move-float -mno-cond-move-float -memcpy -mno-memcpy -mstrict-align -mno-strict-align -G num -mmax-inline-memcpy-size=n -mexplicit-relocs=style -mexplicit-relocs -mno-explicit-relocs -mdirect-extern-access -mno-direct-extern-access -mcmodel=code-model -mrelax -mpass-mrelax-to-as -mrecip -mrecip=opt -mfrecipe -mno-frecipe -mdiv32 -mno-div32 -mlam-bh -mno-lam-bh -mlamcas -mno-lamcas -mld-seq-sa -mno-ld-seq-sa -mtls-dialect=opt -mannotate-tablejump -mno-annotate-tablejump
گزینههای M32C (M32C Options) -mcpu=cpu -msim -memregs=number
گزینههای M32R/D (M32R/D Options) -m32r2 -m32rx -m32r -mdebug -malign-loops -mno-align-loops -missue-rate=number -mbranch-cost=number -mmodel=code-size-model-type -msdata=sdata-type -mno-flush-func -mflush-func=name -mno-flush-trap -mflush-trap=number -G num
گزینههای M680x0 (M680x0 Options) -march=arch -mcpu=cpu -mtune=tune -m68000 -m68020 -m68020-40 -m68020-60 -m68030 -m68040 -m68060 -mcpu32 -m5200 -m5206e -m528x -m5307 -m5407 -mcfv4e -mbitfield -mno-bitfield -mc68000 -mc68020 -mnobitfield -mrtd -mno-rtd -mdiv -mno-div -mshort -mno-short -mhard-float -m68881 -msoft-float -mpcrel -malign-int -mstrict-align -msep-data -mno-sep-data -mshared-library-id=n -mid-shared-library -mno-id-shared-library -mxgot -mno-xgot -mlong-jump-table-offsets
گزینههای MCore (MCore Options) -mhardlit -mno-hardlit -mdiv -mno-div -mrelax-immediates -mno-relax-immediates -mwide-bitfields -mno-wide-bitfields -m4byte-functions -mno-4byte-functions -mcallgraph-data -mno-callgraph-data -mslow-bytes -mno-slow-bytes -mno-lsim -mlittle-endian -mbig-endian -m210 -m340 -mstack-increment
گزینههای MicroBlaze (MicroBlaze Options) -msoft-float -mhard-float -msmall-divides -mcpu=cpu -mmemcpy -mxl-soft-mul -mxl-soft-div -mxl-barrel-shift -mxl-pattern-compare -mxl-stack-check -mxl-gp-opt -mno-clearbss -mxl-multiply-high -mxl-float-convert -mxl-float-sqrt -mbig-endian -mlittle-endian -mxl-reorder -mxl-mode-app-model -mpic-data-is-text-relative
گزینههای MIPS (MIPS Options) -EL -EB -march=arch -mtune=arch -mips1 -mips2 -mips3 -mips4 -mips32 -mips32r2 -mips32r3 -mips32r5 -mips32r6 -mips64 -mips64r2 -mips64r3 -mips64r5 -mips64r6 -mips16 -mno-mips16 -mflip-mips16 -minterlink-compressed -mno-interlink-compressed -minterlink-mips16 -mno-interlink-mips16 -mabi=abi -mabicalls -mno-abicalls -mshared -mno-shared -mplt -mno-plt -mxgot -mno-xgot -mgp32 -mgp64 -mfp32 -mfpxx -mfp64 -mhard-float -msoft-float -mno-float -msingle-float -mdouble-float -modd-spreg -mno-odd-spreg -mabs=mode -mnan=encoding -mdsp -mno-dsp -mdspr2 -mno-dspr2 -mmcu -mmno-mcu -meva -mno-eva -mvirt -mno-virt -mxpa -mno-xpa -mcrc -mno-crc -mginv -mno-ginv -mmicromips -mno-micromips -mmsa -mno-msa -mloongson-mmi -mno-loongson-mmi -mloongson-ext -mno-loongson-ext -mloongson-ext2 -mno-loongson-ext2 -mfpu=fpu-type -msmartmips -mno-smartmips -mpaired-single -mno-paired-single -mdmx -mno-mdmx -mips3d -mno-mips3d -mmt -mno-mt -mllsc -mno-llsc -mlong64 -mlong32 -msym32 -mno-sym32 -Gnum -mlocal-sdata -mno-local-sdata -mextern-sdata -mno-extern-sdata -mgpopt -mno-gopt -membedded-data -mno-embedded-data -muninit-const-in-rodata -mno-uninit-const-in-rodata -mcode-readable=setting -msplit-addresses -mno-split-addresses -mexplicit-relocs -mno-explicit-relocs -mexplicit-relocs=release -mcheck-zero-division -mno-check-zero-division -mdivide-traps -mdivide-breaks -mload-store-pairs -mno-load-store-pairs -mstrict-align -mno-strict-align -mno-unaligned-access -munaligned-access -mmemcpy -mno-memcpy -mlong-calls -mno-long-calls -mmad -mno-mad -mimadd -mno-imadd -mfused-madd -mno-fused-madd -nocpp -mfix-24k -mno-fix-24k -mfix-r4000 -mno-fix-r4000 -mfix-r4400 -mno-fix-r4400 -mfix-r5900 -mno-fix-r5900 -mfix-r10000 -mno-fix-r10000 -mfix-rm7000 -mno-fix-rm7000 -mfix-vr4120 -mno-fix-vr4120 -mfix-vr4130 -mno-fix-vr4130 -mfix-sb1 -mno-fix-sb1 -mflush-func=func -mno-flush-func -mbranch-cost=num -mbranch-likely -mno-branch-likely -mcompact-branches=policy -mfp-exceptions -mno-fp-exceptions -mvr4130-align -mno-vr4130-align -msynci -mno-synci -mlxc1-sxc1 -mno-lxc1-sxc1 -mmadd4 -mno-madd4 -mrelax-pic-calls -mno-relax-pic-calls -mmcount-ra-address -mframe-header-opt -mno-frame-header-opt
گزینههای MMIX (MMIX Options) -mlibfuncs -mno-libfuncs -mepsilon -mno-epsilon -mabi=gnu -mabi=mmixware -mzero-extend -mknuthdiv -mtoplevel-symbols -melf -mbranch-predict -mno-branch-predict -mbase-addresses -mno-base-addresses -msingle-exit -mno-single-exit
گزینههای MN10300 (MN10300 Options) -mmult-bug -mno-mult-bug -mno-am33 -mam33 -mam33-2 -mam34 -mtune=cpu-type -mreturn-pointer-on-d0 -mno-crt0 -mrelax -mliw -msetlb
گزینههای Moxie (Moxie Options) -meb -mel -mmul.x -mno-crt0
گزینههای MSP430 (MSP430 Options) -msim -masm-hex -mmcu= -mcpu= -mlarge -msmall -mrelax -mwarn-mcu -mcode-region= -mdata-region= -msilicon-errata= -msilicon-errata-warn= -mhwmult= -minrt -mtiny-printf -mmax-inline-shift=
گزینههای NDS32 (NDS32 Options) -mbig-endian -mlittle-endian -mreduced-regs -mfull-regs -mcmov -mno-cmov -mext-perf -mno-ext-perf -mext-perf2 -mno-ext-perf2 -mext-string -mno-ext-string -mv3push -mno-v3push -m16bit -mno-16bit -misr-vector-size=num -mcache-block-size=num -march=arch -mcmodel=code-model -mctor-dtor -mrelax
گزینههای Nvidia PTX (Nvidia PTX Options) -m64 -mmainkernel -moptimize
گزینههای OpenRISC (OpenRISC Options) -mboard=name -mnewlib -mhard-mul -mhard-div -msoft-mul -msoft-div -msoft-float -mhard-float -mdouble-float -munordered-float -mcmov -mror -mrori -msext -msfimm -mshftimm -mcmodel=code-model
گزینههای PDP-11 (PDP-11 Options) -mfpu -msoft-float -mac0 -mno-ac0 -m40 -m45 -m10 -mint32 -mno-int16 -mint16 -mno-int32 -msplit -munix-asm -mdec-asm -mgnu-asm -mlra
گزینههای PowerPC گزینههای RS/6000 و PowerPC را ببینید.
گزینههای PRU (PRU Options) -mmcu=mcu -minrt -mno-relax -mloop -mabi=variant
گزینههای RISC-V (RISC-V Options) -mbranch-cost=N-instruction -mplt -mno-plt -mabi=ABI-string -mfdiv -mno-fdiv -mfence-tso -mno-fence-tso -mdiv -mno-div -misa-spec=ISA-spec-string -march=ISA-string -mtune=processor-string -mpreferred-stack-boundary=num -msmall-data-limit=N-bytes -msave-restore -mno-save-restore -mshorten-memrefs -mno-shorten-memrefs -mstrict-align -mno-strict-align -mcmodel=medlow -mcmodel=medany -mcmodel=large -mexplicit-relocs -mno-explicit-relocs -mrelax -mno-relax -mriscv-attribute -mno-riscv-attribute -malign-data=type -mbig-endian -mlittle-endian -mstack-protector-guard=guard -mstack-protector-guard-reg=reg -mstack-protector-guard-offset=offset -mcsr-check -mno-csr-check -mmovcc -mno-movcc -minline-atomics -mno-inline-atomics -minline-strlen -mno-inline-strlen -minline-strcmp -mno-inline-strcmp -minline-strncmp -mno-inline-strncmp -mtls-dialect=desc -mtls-dialect=trad
گزینههای RL78 (RL78 Options) -msim -mmul=none -mmul=g13 -mmul=g14 -mallregs -mcpu=g10 -mcpu=g13 -mcpu=g14 -mg10 -mg13 -mg14 -m64bit-doubles -m32bit-doubles -msave-mduc-in-interrupts
گزینههای RS/6000 و PowerPC (RS/6000 and PowerPC Options) -mcpu=cpu-type -mtune=cpu-type -mcmodel=code-model -mpowerpc64 -maltivec -mno-altivec -mpowerpc-gpopt -mno-powerpc-gpopt -mpowerpc-gfxopt -mno-powerpc-gfxopt -mmfcrf -mno-mfcrf -mpopcntb -mno-popcntb -mpopcntd -mno-popcntd -mfprnd -mno-fprnd -mcmpb -mno-cmpb -mhard-dfp -mno-hard-dfp -mfull-toc -mminimal-toc -mno-fp-in-toc -mno-sum-in-toc -m64 -m32 -mxl-compat -mno-xl-compat -mpe -malign-power -malign-natural -msoft-float -mhard-float -mmultiple -mno-multiple -mupdate -mno-update -mavoid-indexed-addresses -mno-avoid-indexed-addresses -mfused-madd -mno-fused-madd -mbit-align -mno-bit-align -mstrict-align -mno-strict-align -mrelocatable -mno-relocatable -mrelocatable-lib -mno-relocatable-lib -mtoc -mno-toc -mlittle -mlittle-endian -mbig -mbig-endian -mdynamic-no-pic -mswdiv -msingle-pic-base -mprioritize-restricted-insns=priority -msched-costly-dep=dependence_type -minsert-sched-nops=scheme -mcall-aixdesc -mcall-eabi -mcall-freebsd -mcall-linux -mcall-netbsd -mcall-openbsd -mcall-sysv -mcall-sysv-eabi -mcall-sysv-noeabi -mtraceback=traceback_type -maix-struct-return -msvr4-struct-return -mabi=abi-type -msecure-plt -mbss-plt -msplit-patch-nops -mlongcall -mno-longcall -mpltseq -mno-pltseq -mblock-move-inline-limit=num -mblock-compare-inline-limit=num -mblock-compare-inline-loop-limit=num -mno-block-ops-unaligned-vsx -mstring-compare-inline-limit=num -misel -mno-isel -mvrsave -mno-vrsave -mmulhw -mno-mulhw -mdlmzb -mno-dlmzb -mprototype -mno-prototype -msim -mmvme -mads -myellowknife -memb -msdata -msdata=opt -mreadonly-in-sdata -mvxworks -G num -mrecip -mrecip=opt -mno-recip -mrecip-precision -mno-recip-precision -mveclibabi=type -mfriz -mno-friz -mpointers-to-nested-functions -mno-pointers-to-nested-functions -msave-toc-indirect -mno-save-toc-indirect -mpower8-fusion -mno-mpower8-fusion -mcrypto -mno-crypto -mhtm -mno-htm -mquad-memory -mno-quad-memory -mquad-memory-atomic -mno-quad-memory-atomic -mcompat-align-parm -mno-compat-align-parm -mfloat128 -mno-float128 -mfloat128-hardware -mno-float128-hardware -mgnu-attribute -mno-gnu-attribute -mstack-protector-guard=guard -mstack-protector-guard-reg=reg -mstack-protector-guard-offset=offset -mprefixed -mno-prefixed -mpcrel -mno-pcrel -mmma -mno-mmma -mrop-protect -mno-rop-protect -mprivileged -mno-privileged
گزینههای RX (RX Options) -m64bit-doubles -m32bit-doubles -fpu -nofpu -mcpu= -mbig-endian-data -mlittle-endian-data -msmall-data -msim -mno-sim -mas100-syntax -mno-as100-syntax -mrelax -mmax-constant-size= -mint-register= -mpid -mallow-string-insns -mno-allow-string-insns -mjsr -mno-warn-multiple-fast-interrupts -msave-acc-in-interrupts
گزینههای S/390 و zSeries (S/390 and zSeries Options) -mtune=cpu-type -march=cpu-type -mhard-float -msoft-float -mhard-dfp -mno-hard-dfp -mlong-double-64 -mlong-double-128 -mbackchain -mno-backchain -mpacked-stack -mno-packed-stack -msmall-exec -mno-small-exec -mmvcle -mno-mvcle -m64 -m31 -mdebug -mno-debug -mesa -mzarch -mhtm -mvx -mzvector -mtpf-trace -mno-tpf-trace -mtpf-trace-skip -mno-tpf-trace-skip -mfused-madd -mno-fused-madd -mwarn-framesize -mwarn-dynamicstack -mstack-size -mstack-guard -mhotpatch=halfwords,halfwords
گزینههای SH (SH Options) -m1 -m2 -m2e -m2a-nofpu -m2a-single-only -m2a-single -m2a -m3 -m3e -m4-nofpu -m4-single-only -m4-single -m4 -m4a-nofpu -m4a-single-only -m4a-single -m4a -m4al -mb -ml -mdalign -mrelax -mbigtable -mfmovd -mrenesas -mno-renesas -mnomacsave -mieee -mno-ieee -mbitops -misize -minline-ic_invalidate -mpadstruct -mprefergot -musermode -multcost=number -mdiv=strategy -mdivsi3_libfunc=name -mfixed-range=register-range -maccumulate-outgoing-args -matomic-model=atomic-model -mbranch-cost=num -mzdcbranch -mno-zdcbranch -mcbranch-force-delay-slot -mfused-madd -mno-fused-madd -mfsca -mno-fsca -mfsrra -mno-fsrra -mpretend-cmove -mtas
گزینههای Solaris 2 (Solaris 2 Options) -mclear-hwcap -mno-clear-hwcap -mimpure-text -mno-impure-text -pthreads
گزینههای SPARC (SPARC Options) -mcpu=cpu-type -mtune=cpu-type -mcmodel=code-model -mmemory-model=mem-model -m32 -m64 -mapp-regs -mno-app-regs -mfaster-structs -mno-faster-structs -mflat -mno-flat -mfpu -mno-fpu -mhard-float -msoft-float -mhard-quad-float -msoft-quad-float -mstack-bias -mno-stack-bias -mstd-struct-return -mno-std-struct-return -munaligned-doubles -mno-unaligned-doubles -muser-mode -mno-user-mode -mv8plus -mno-v8plus -mvis -mno-vis -mvis2 -mno-vis2 -mvis3 -mno-vis3 -mvis3b -mno-vis3b -mvis4 -mno-vis4 -mvis4b -mno-vis4b -mcbcond -mno-cbcond -mfmaf -mno-fmaf -mfsmuld -mno-fsmuld -mpopc -mno-popc -msubxc -mno-subxc -mfix-at697f -mfix-ut699 -mfix-ut700 -mfix-gr712rc
گزینههای System V (System V Options) -Qy -Qn -YP,paths -Ym,dir
گزینههای V850 (V850 Options) -mlong-calls -mno-long-calls -mep -mno-ep -mprolog-function -mno-prolog-function -mspace -mtda=n -msda=n -mzda=n -mapp-regs -mno-app-regs -mdisable-callt -mno-disable-callt -mv850e2v3 -mv850e2 -mv850e1 -mv850es -mv850e -mv850 -mv850e3v5 -mloop -mrelax -mlong-jumps -msoft-float -mhard-float -mgcc-abi -mrh850-abi -mbig-switch
گزینههای VAX (VAX Options) -munix -mgnu -md -md-float -mg -mg-float -mlra
گزینههای Visium (Visium Options) -mdebug -msim -mfpu -mno-fpu -mhard-float -msoft-float -mcpu=cpu-type -mtune=cpu-type -msv-mode -muser-mode
گزینههای VMS (VMS Options) -mvms-return-codes -mdebug-main=prefix -mmalloc64 -mpointer-size=size
گزینههای VxWorks (VxWorks Options) -mrtp -msmp -non-static -Bstatic -Bdynamic -Xbind-lazy -Xbind-now
گزینههای x86 (x86 Options) -mtune=cpu-type -march=cpu-type -mtune-ctrl=feature-list -mdump-tune-features -mno-default -mfpmath=unit -masm=dialect -mno-fancy-math-387 -mno-fp-ret-in-387 -m80387 -mhard-float -msoft-float -mno-wide-multiply -mrtd -malign-double -mpreferred-stack-boundary=num -mincoming-stack-boundary=num -mcld -mcx16 -msahf -mmovbe -mcrc32 -mmwait -mrecip -mrecip=opt -mvzeroupper -mprefer-avx128 -mprefer-vector-width=opt -mpartial-vector-fp-math -mmove-max=bits -mstore-max=bits -mnoreturn-no-callee-saved-registers -mmmx -msse -msse2 -msse3 -mssse3 -msse4.1 -msse4.2 -msse4 -mavx -mavx2 -mavx512f -mavx512cd -mavx512vl -mavx512bw -mavx512dq -mavx512ifma -mavx512vbmi -msha -maes -mpclmul -mfsgsbase -mrdrnd -mf16c -mfma -mpconfig -mwbnoinvd -mptwrite -mclflushopt -mclwb -mxsavec -mxsaves -msse4a -m3dnow -m3dnowa -mpopcnt -mabm -mbmi -mtbm -mfma4 -mxop -madx -mlzcnt -mbmi2 -mfxsr -mxsave -mxsaveopt -mrtm -mhle -mlwp -mmwaitx -mclzero -mpku -mthreads -mgfni -mvaes -mwaitpkg -mshstk -mmanual-endbr -mcet-switch -mforce-indirect-call -mavx512vbmi2 -mavx512bf16 -menqcmd -mvpclmulqdq -mavx512bitalg -mmovdiri -mmovdir64b -mavx512vpopcntdq -mavx512vnni -mprfchw -mrdpid -mrdseed -msgx -mavx512vp2intersect -mserialize -mtsxldtrk -mamx-tile -mamx-int8 -mamx-bf16 -muintr -mhreset -mavxvnni -mamx-fp8 -mavx512fp16 -mavxifma -mavxvnniint8 -mavxneconvert -mcmpccxadd -mamx-fp16 -mprefetchi -mraoint -mamx-complex -mavxvnniint16 -msm3 -msha512 -msm4 -mapxf -musermsr -mavx10.1 -mavx10.1-256 -mavx10.1-512 -mevex512 -mavx10.2 -mamx-avx512 -mamx-tf32 -mamx-transpose -mmovrs -mamx-movrs -mcldemote -mms-bitfields -mno-align-stringops -minline-all-stringops -minline-stringops-dynamically -mstringop-strategy=alg -mkl -mwidekl -mmemcpy-strategy=strategy -mmemset-strategy=strategy -mpush-args -maccumulate-outgoing-args -m128bit-long-double -m96bit-long-double -mlong-double-64 -mlong-double-80 -mlong-double-128 -mregparm=num -msseregparm -mveclibabi=type -mvect8-ret-in-mem -mpc32 -mpc64 -mpc80 -mdaz-ftz -mstackrealign -momit-leaf-frame-pointer -mno-red-zone -mno-tls-direct-seg-refs -mcmodel=code-model -mabi=name -maddress-mode=mode -m32 -m64 -mx32 -m16 -miamcu -mlarge-data-threshold=num -msse2avx -mfentry -mrecord-mcount -mnop-mcount -m8bit-idiv -minstrument-return=type -mfentry-name=name -mfentry-section=name -mavx256-split-unaligned-load -mavx256-split-unaligned-store -malign-data=type -mstack-protector-guard=guard -mstack-protector-guard-reg=reg -mstack-protector-guard-offset=offset -mstack-protector-guard-symbol=symbol -mgeneral-regs-only -mcall-ms2sysv-xlogues -mrelax-cmpxchg-loop -mindirect-branch=choice -mfunction-return=choice -mindirect-branch-register -mharden-sls=choice -mindirect-branch-cs-prefix -mneeded -mno-direct-extern-access -munroll-only-small-loops -mlam=choice
گزینههای x86 Windows گزینههای Cygwin و MinGW را ببینید.
گزینههای Xstormy16 (Xstormy16 Options) -msim
گزینههای Xtensa (Xtensa Options) -mconst16 -mno-const16 -mfused-madd -mno-fused-madd -mforce-no-pic -mserialize-volatile -mno-serialize-volatile -mtext-section-literals -mno-text-section-literals -mauto-litpools -mno-auto-litpools -mtarget-align -mno-target-align -mlongcalls -mno-longcalls -mabi=abi-type -mextra-l32r-costs=cycles -mstrict-align -mno-strict-align
گزینههای zSeries گزینههای S/390 و zSeries را ببینید..SS "گزینههای کنترل نوع خروجی (Options Controlling the Kind of Output)" فرآیند کامپایل میتواند شامل حداکثر چهار مرحله باشد: پیشپردازش، کامپایل اصلی، اسمبلی و پیوند، که همواره به همین ترتیب اجرا میشوند. GCC قادر است چندین فایل را پیشپردازش و کامپایل کرده و به چندین فایل ورودی اسمبلی، یا به یک فایل ورودی اسمبلی تبدیل کند؛ سپس هر فایل ورودی اسمبلی یک فایل شیء (object file) تولید میکند، و مرحله پیوند همه فایلهای شیء را (آنهایی که به تازگی کامپایل شدهاند، و آنهایی که به عنوان ورودی مشخص شدهاند) در یک فایل اجرایی ترکیب میکند.
برای هر فایل ورودی دادهشده، پسوند نام فایل تعیین میکند که چه نوع کامپایلی انجام شود:
- file.c
- کد منبع C که باید پیشپردازش شود.
- file.i
- کد منبع C که نباید پیشپردازش شود.
- file.ii
- کد منبع C++ که نباید پیشپردازش شود.
- file.m
- کد منبع Objective-C. توجه داشته باشید که برای کارکرد یک برنامه Objective-C باید پیوند با کتابخانه libobjc انجام شود.
- file.mi
- کد منبع Objective-C که نباید پیشپردازش شود.
- file.mm
- file.M
- کد منبع Objective-C++. توجه داشته باشید که برای کارکرد یک برنامه Objective-C++ باید پیوند با کتابخانه libobjc انجام شود. توجه داشته باشید که .M دقیقاً به حرف بزرگ M اشاره دارد.
- file.mii
- کد منبع Objective-C++ که نباید پیشپردازش شود.
- file.h
- فایل سرایند C، C++، Objective-C یا Objective-C++ جهت تبدیل به یک سرایند پیشکامپایلشده (پیشفرض)، یا فایل سرایند C، C++ جهت تبدیل به یک مشخصه Ada (از طریق سوییچ -fdump-ada-spec).
- file.cc
- file.cp
- file.cxx
- file.cpp
- file.CPP
- file.c++
- file.C
- کد منبع C++ که باید پیشپردازش شود. توجه داشته باشید که در .cxx، دو حرف پایانی باید دقیقاً x باشند. به همین ترتیب، .C به یک حرف بزرگ C اشاره دارد.
- file.mm
- file.M
- کد منبع Objective-C++ که باید پیشپردازش شود.
- file.mii
- کد منبع Objective-C++ که نباید پیشپردازش شود.
- file.hh
- file.H
- file.hp
- file.hxx
- file.hpp
- file.HPP
- file.h++
- file.tcc
- فایل سرایند C++ جهت تبدیل به یک سرایند پیشکامپایلشده یا مشخصه Ada.
- file.f
- file.for
- file.ftn
- file.fi
- کد منبع فرترن با قالب ثابت (fixed form) که نباید پیشپردازش شود.
- file.F
- file.FOR
- file.fpp
- file.FPP
- file.FTN
- کد منبع فرترن با قالب ثابت (fixed form) که باید پیشپردازش شود (با پیشپردازنده سنتی).
- file.f90
- file.f95
- file.f03
- file.f08
- file.fii
- کد منبع فرترن با قالب آزاد (free form) که نباید پیشپردازش شود.
- file.F90
- file.F95
- file.F03
- file.F08
- کد منبع فرترن با قالب آزاد (free form) که باید پیشپردازش شود (با پیشپردازنده سنتی).
- file.cob
- file.COB
- file.cbl
- file.CBL
- کد منبع COBOL.
- file.go
- کد منبع Go.
- file.d
- کد منبع D.
- file.di
- فایل واسط D.
- file.dd
- کد مستندات D (Ddoc).
- file.ads
- فایل کد منبع Ada که حاوی اعلان واحد کتابخانه (اعلان یک بسته، زیربرنامه، یا جنریک، یا یک نمونهسازی جنریک)، یا اعلان تغییر نام واحد کتابخانه (اعلان تغییر نام یک بسته، جنریک، یا زیربرنامه) است. به چنین فایلهایی specs نیز گفته میشود.
- file.adb
- فایل کد منبع Ada شامل بدنه واحد کتابخانه (بدنه یک زیربرنامه یا بسته). به این فایلها bodies نیز گفته میشود.
- file.s
- کد اسمبلی.
- file.S
- file.sx
- کد اسمبلی که باید پیشپردازش شود.
- other
- یک فایل شیء که مستقیماً به مرحله پیوند هدایت میشود. با هر نام فایلی که پسوند شناختهشدهای نداشته باشد به این شکل رفتار میشود.
میتوانید با گزینه -x زبان ورودی را صریحاً مشخص کنید:
- -x language
- زبان (language) را
برای
فایلهای
ورودی پس از
آن به طور
صریح مشخص
میکند (به
جای اینکه
به
کامپایلر
اجازه داده
شود
پیشفرضی
را بر اساس
پسوند نام
فایل
انتخاب
کند). این
گزینه بر
روی تمامی
فایلهای
ورودی بعدی
تا گزینه -x
بعدی اعمال
میشود.
مقادیر
ممکن برای
language عبارتند
از:
c c-header cpp-output c++ c++-header c++-system-header c++-user-header c++-cpp-output objective-c objective-c-header objective-c-cpp-output objective-c++ objective-c++-header objective-c++-cpp-output assembler assembler-with-cpp ada cobol d f77 f77-cpp-input f95 f95-cpp-input go
توجه داشته باشید که -x بیانگر یک استاندارد زبانی خاص نیست. برای مثال -x f77 ممکن است برای برخی از کدهای منبع قدیمیتر به -std=legacy نیز نیاز داشته باشد..IP "-x none" 4 هرگونه مشخصسازی زبان را غیرفعال میکند، بهگونهای که فایلهای بعدی بر اساس پسوند نام فایل خود پردازش میشوند (گویی اصلاً از -x استفاده نشده است).
اگر تنها بخش مشخصی از مراحل کامپایل را میخواهید، میتوانید از -x (یا پسوندهای نام فایل) استفاده کنید تا به gcc بگویید از کجا شروع کند، و از یکی از گزینههای -c، -S یا -E استفاده کنید تا مشخص شود gcc در کجا باید متوقف شود. توجه داشته باشید که برخی ترکیبها (برای مثال، -x cpp-output -E) به gcc دستور میدهند که اصلاً هیچ کاری انجام ندهد.
- -c
- فایلهای
منبع را
کامپایل یا
اسمبلی
میکند،
اما پیوند (link)
نمیزند.
مرحله
پیوند
اساساً
انجام
نمیشود.
خروجی
نهایی به
شکل یک فایل
شیء (object file) برای
هر فایل
منبع خواهد
بود.
بهطور پیشفرض، نام فایل شیء برای یک فایل منبع از جایگزینی پسوند .c، .i، .s و غیره با .o ساخته میشود.
فایلهای ورودی ناشناخته که نیازی به کامپایل یا اسمبلی ندارند، نادیده گرفته میشوند.
- -S
- پس از مرحله
کامپایل
واقعی
متوقف
میشود؛
اسمبلی
نمیکند.
خروجی به
شکل یک فایل
کد اسمبلی
برای هر
فایل
ورودیِ غیر
اسمبلیِ
مشخصشده
است.
بهطور پیشفرض، نام فایل اسمبلی برای یک فایل منبع از جایگزینی پسوند .c، .i و غیره با .s ساخته میشود.
فایلهای ورودی که نیازی به کامپایل ندارند، نادیده گرفته میشوند.
- -E
- پس از مرحله
پیشپردازش
متوقف
میشود؛
کامپایلر
واقعی را
اجرا
نمیکند.
خروجی به
شکل کد منبع
پیشپردازششده
است که به
خروجی
استاندارد
ارسال
میشود.
فایلهای ورودی که نیازی به پیشپردازش ندارند، نادیده گرفته میشوند.
- -o file
- خروجی اصلی
را در فایل
file قرار
میدهد. این
امر برای هر
نوع خروجی
تولیدشده،
اعم از یک
فایل
اجرایی، یک
فایل شیء،
یک فایل
اسمبلی یا
کد سیِ
پیشپردازششده،
اعمال
میشود.
اگر -o مشخص نشده باشد، حالت پیشفرض قرار دادن فایل اجرایی در a.out، فایل شیء برای source.suffix در source.o، فایل اسمبلی آن در source.s، فایل سرایند پیشکامپایلشده در source.suffix.gch، و تمام کدهای منبع سی پیشپردازششده در خروجی استاندارد است.
اگرچه -o تنها نام خروجی اصلی را مشخص میکند، اما بر نامگذاری خروجیهای کمکی (auxiliary) و دامپ (dump) نیز تأثیر میگذارد. مثالهای زیر را ببینید. مگر در صورتی که لغو (override) شوند، هر دو خروجی کمکی و دامپ در همان دایرکتوری خروجی اصلی قرار میگیرند. در خروجیهای کمکی، پسوند فایل ورودی با پسوند نوع فایل خروجی کمکی جایگزین میشود؛ در خروجیهای دامپ، پسوند فایل دامپ به پسوند فایل ورودی پیوست میگردد. در دستورهای کامپایل، نام پایه (base name) خروجیهای کمکی و دامپ همان نام پایه خروجی اصلی است؛ در دستورهای کامپایل و پیوند، نام خروجی اصلی منهای پسوند فایل اجرایی با نام فایل ورودی ترکیب میشود. اگر هر دو نام پایه یکسانی داشته باشند (صرفنظر از پسوند)، نتیجه ترکیب همان نام پایه خواهد بود، در غیر این صورت، با یک خط تیره (-) به هم متصل میشوند.
gcc -c foo.c ...
از foo.o به عنوان خروجی اصلی استفاده میکند، و خروجیهای کمکی و دامپ را در کنار آن قرار میدهد؛ مثلاً فایل کمکی foo.dwo برای -gsplit-dwarf، و فایل دامپ foo.c.???r.final برای -fdump-rtl-final.
اگر یک فایل خروجیِ غیرپیونددهنده صراحتاً مشخص شده باشد، فایلهای کمکی و دامپ بهطور پیشفرض همان نام پایه را میگیرند:
gcc -c foo.c -o dir/foobar.o ...
خروجیهای کمکی را به نام dir/foobar.* و خروجیهای دامپ را به نام dir/foobar.c.* نامگذاری خواهد کرد.
در مقابل، خروجی پیونددهنده به خروجیهای کمکی و دامپ پیشوند اضافه خواهد کرد:
gcc foo.c bar.c -o dir/foobar ...
بهطور کلی خروجیهای کمکی را به نام dir/foobar-foo.* و dir/foobar-bar.*، و خروجیهای دامپ را به نام dir/foobar-foo.c.* و dir/foobar-bar.c.* نامگذاری میکند.
تنها استثنا برای حالت بالا زمانی است که فایل اجرایی، نام پایه یکسانی با تکورودی داشته باشد:
gcc foo.c -o dir/foo ...
در این حالت، خروجیهای کمکی به نام dir/foo.* و خروجیهای دامپ به نام dir/foo.c.* نامگذاری میشوند.
مکان و نامهای خروجیهای کمکی و دامپ را میتوان با گزینههای -dumpbase، -dumpbase-ext، -dumpdir، -save-temps=cwd و -save-temps=obj تنظیم کرد.
- -dumpbase dumpbase
- این گزینه
نام پایه را
برای
فایلهای
خروجی کمکی
و دامپ
تنظیم
میکند. این
گزینه بر
نام فایل
خروجی اصلی
تأثیری
ندارد.
خروجیهای
واسط، در
صورت حفظ
شدن، خروجی
اصلی تلقی
نمیشوند
بلکه خروجی
کمکی به
حساب
میآیند:
gcc -save-temps -S foo.c
فایل پیشپردازششده را که (دیگر) موقت نیست در foo.i ذخیره میکند، و سپس به فایل خروجی (ضمنی) foo.s کامپایل مینماید، در حالی که:
gcc -save-temps -dumpbase save-foo -c foo.c
پیشپردازش را در save-foo.i انجام میدهد، به save-foo.s کامپایل میکند (که اکنون یک خروجی واسط و در نتیجه کمکی است)، و سپس به فایل خروجی (ضمنی) foo.o اسمبلی میکند.
در صورت نبود این گزینه، فایلهای دامپ و کمکی نام خود را از فایل ورودی یا در صورت تعیین صریح، از فایل خروجی (غیرپیونددهنده) میگیرند: فایلهای خروجی دامپ (مانند فایلهای درخواستشده توسط گزینههای -fdump-*) همراه با پسوند نام ورودی، و فایلهای خروجی کمکی (فایلهای درخواستشده با سایر گزینههای غیردامپ مانند "-save-temps"، "-gsplit-dwarf"، "-fcallgraph-info") بدون آن.
تمایز مشابهی در پسوند خروجیهای دامپ و کمکی را میتوان برای -dumpbase basename.suf مشخصشده بهطور صریح، با تعیین -dumpbase-ext .suf نیز به دست آورد.
اگر dumpbase بهطور صریح همراه با هرگونه مؤلفه دایرکتوری مشخص شود، هرگونه مشخصسازی dumppfx (مانند -dumpdir یا -save-temps=*) نادیده گرفته میشود و به جای پیوست شدن به آن، dumpbase کاملاً آن را لغو (override) میکند:
gcc foo.c -c -o dir/foo.o -dumpbase alt/foo \ -dumpdir pfx- -save-temps=cwd ...
خروجیهای کمکی و دامپ با نام 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 به عنوان پیشوند، از رونویسی خروجیهای کمکی و دامپ جلوگیری میکند و خروجیهای کمکی و دامپی با نامهای main-foo.* و main-bar.* ایجاد مینماید.
مشخص کردن یک رشته خالی به عنوان dumpbase از تأثیر نام پایه خروجی در نامگذاری خروجیهای کمکی و دامپ در حین کامپایل جلوگیری میکند و مقادیر پیشفرض را محاسبه مینماید:
gcc -c foo.c -o dir/foobar.o -dumpbase " ...
خروجیهای کمکی را به نام dir/foo.* و خروجیهای دامپ را به نام dir/foo.c.* نامگذاری خواهد کرد. توجه کنید که چگونه نامهای پایه آنها از نام ورودی گرفته شده است، اما دایرکتوری همچنان بهطور پیشفرض همان دایرکتوری خروجی است.
رشته خالی dumpbase مانع از استفاده از نام پایه خروجی برای خروجیها در هنگام پیوندزدن نمیشود:
gcc foo.c bar.c -o dir/foobar -dumpbase " -flto ...
کامپایل فایلهای منبع، خروجیهای کمکی را به نام dir/foo.* و dir/bar.*، و خروجیهای دامپ را به نام dir/foo.c.* و dir/bar.c.* نامگذاری میکند. کامپایل مجدد LTO در طول پیوند از dir/foobar. به عنوان پیشوند برای فایلهای دامپ و کمکی استفاده خواهد کرد.
- -dumpbase-ext auxdropsuf
- هنگام
تشکیل نام
یک فایل
خروجی کمکی
(و نه دامپ)،
پیش از
الصاق
هرگونه
پسوند، 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 حذف میکند. خروجیهای دامپ پسوند را حفظ میکنند: dir/x-foo.c.*.
این گزینه اگر با پسوند dumpbase مشخصشده مطابقت نداشته باشد نادیده گرفته میشود، مگر به عنوان جایگزینی برای پسوند فایل اجرایی هنگام الحاق نام پایه خروجی پیونددهنده به dumppfx، همانطور که در زیر مشخص شده است:
gcc foo.c bar.c -o main.out -dumpbase-ext .out ...
فایل main.out را به عنوان خروجی اصلی ایجاد میکند و با استفاده از نام فایل اجرایی منهای auxdropsuf به عنوان پیشوند، از رونویسی خروجیهای کمکی و دامپ جلوگیری میکند و خروجیهای کمکی به نامهای main-foo.* و main-bar.* و خروجیهای دامپ به نامهای main-foo.c.* و main-bar.c.* میسازد..IP "-dumpdir dumppfx" 4 هنگام تشکیل نام یک فایل خروجی کمکی یا dump، از dumppfx به عنوان پیشوند استفاده میکند:
gcc -dumpdir pfx- -c foo.c ...
foo.o را به عنوان خروجی اصلی، و خروجیهای کمکی با نام pfx-foo.* ایجاد میکند که dumppfx دادهشده را با dumpbase پیشفرض مشتقشده از خروجی اصلی پیشفرض (که آن هم به نوبه خود از نام ورودی مشتق شده است) ترکیب مینماید. خروجیهای dump پسوند نام ورودی را نیز دریافت میکنند: pfx-foo.c.*.
اگر قرار باشد dumppfx به عنوان نام دایرکتوری استفاده شود، باید با یک جداکننده دایرکتوری پایان یابد:
gcc -dumpdir dir/ -c foo.c -o obj/bar.o ...
obj/bar.o را به عنوان خروجی اصلی، و خروجیهای کمکی با نام dir/bar.* ایجاد میکند که dumppfx دادهشده را با dumpbase پیشفرض مشتقشده از نام خروجی اصلی ترکیب مینماید. خروجیهای dump پسوند نام ورودی را نیز دریافت میکنند: dir/bar.c.*.
مکان پیشفرض آن، محل فایل خروجی است، مگر اینکه فایل خروجی یک فایل ویژه مانند "/dev/null" باشد. گزینههای -save-temps=cwd و -save-temps=obj مانند یک گزینه صریح -dumpdir این پیشفرض را باطل میکنند. در صورتی که چندین گزینه از این دست داده شود، آخرین گزینه اولویت خواهد داشت:
gcc -dumpdir pfx- -c foo.c -save-temps=obj ...
foo.o را خروجی میدهد، با خروجیهای کمکی به نام foo.*، زیرا -save-temps=* بر dumppfx ارائهشده توسط گزینه قبلی -dumpdir اولویت مییابد. این که =obj مقدار پیشفرض برای -save-temps است، یا اینکه دایرکتوری خروجی به صورت ضمنی دایرکتوری جاری است، تفاوتی ایجاد نمیکند. خروجیهای dump با نام foo.c.* نامگذاری میشوند.
هنگام کامپایل از چندین فایل ورودی، اگر -dumpbase مشخص شده باشد، مقدار dumpbase، منهای پسوند auxdropsuf، و یک خط تیره به یک dumppfx صریح یا پیشفرض الحاق میشوند (یا در صورت داشتن مؤلفههای دایرکتوری، جایگزین آن میشوند)، تا هر یک از کامپایلهای چندگانه، خروجیهای aux و dump با نامهای متفاوتی دریافت کنند.
gcc foo.c bar.c -c -dumpdir dir/pfx- -dumpbase main ...
خروجیهای dump کمکی را در dir/pfx-main-foo.* و dir/pfx-main-bar.* تولید میکند و dumpbase- را به dumppfx الحاق مینماید. خروجیهای dump پسوند فایل ورودی را حفظ میکنند: به ترتیب dir/pfx-main-foo.c.* و dir/pfx-main-bar.c.*. این را با کامپایل تکورودی مقایسه کنید:
gcc foo.c -c -dumpdir dir/pfx- -dumpbase main ...
که با اعمال -dumpbase بر یک فایل منبع واحد، یک dumpbase جداگانه به ازای هر فایل ورودی محاسبه و الحاق نمیکند. خروجیهای کمکی و dump آن در dir/pfx-main.* قرار میگیرند.
هنگام کامپایل و سپس پیوند دادن از چندین فایل ورودی، یک dumppfx پیشفرض یا صریحاً مشخصشده نیز تحت تبدیل dumpbase- فوق قرار میگیرد (مانند کامپایل foo.c و bar.c در بالا، اما بدون -c). اگر نه -dumpdir و نه -dumpbase مشخص نشده باشند، نام پایه خروجی پیونددهنده، منهای auxdropsuf در صورت مشخص بودن، یا پسوند فایل اجرایی در غیر این صورت، به اضافه یک خط تیره به dumppfx پیشفرض اضافه میشود. با این حال توجه داشته باشید که برخلاف حالتهای پیشین پیوند دادن:
gcc foo.c bar.c -dumpdir dir/pfx- -o main ...
نام خروجی main را به dumppfx الحاق نمیکند، زیرا -dumpdir صریحاً مشخص شده است. هدف این است که dumppfx مشخصشده به صورت صریح بتواند در صورت تمایل نام خروجی مشخصشده را به عنوان بخشی از پیشوند در بر داشته باشد؛ تنها یک -dumpbase صریحاً مشخصشده با آن ترکیب میشود، تا از دور انداختن ساده یک گزینه معنادار جلوگیری شود.
هنگام کامپایل و سپس پیوند دادن از یک فایل ورودی واحد، نام پایه خروجی پیونددهنده تنها در صورتی همانند بالا به dumppfx پیشفرض الحاق میشود که نام پایه مشترکی با نام فایل ورودی واحد نداشته باشد. این مورد در موارد پیوند تکورودی در بالا پوشش داده شد، اما نه با یک -dumpdir صریح که از ترکیب جلوگیری میکند، حتی اگر توسط -save-temps=* باطل شود:
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
- دستورات اجراشده برای پیشبرد مراحل کامپایل را (در خروجی خطای استاندارد) چاپ میکند. همچنین شماره نسخه برنامه راهانداز کامپایلر، پیشپردازنده و خود کامپایلر اصلی را چاپ میکند.
- -###
- مانند -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نمایش شماره نگارش و حقنشر (کپیرایت) مربوط به GCC فراخوانیشده.
- -pass-exit-codes
- بهطور معمول اگر هر مرحله از کامپایلر کد بازگشتی ناموفقی بازگرداند، برنامه gcc با کد خروج ۱ پایان مییابد. اگر -pass-exit-codes را مشخص کنید، برنامه gcc در عوض با بزرگترین کد خطای عددی تولیدشده توسط هر مرحلهای که نشاندهنده خطا بوده خارج میشود. بخشهای جلویی (front ends) برای C، C++ و Fortran در صورت مواجهه با خطای داخلی کامپایلر، کد ۴ را بازمیگردانند.
- -pipe
- استفاده از پایپها بهجای فایلهای موقت برای برقراری ارتباط بین مراحل مختلف کامپایل. این گزینه در برخی از سیستمهایی که اسمبلر در آنها قادر به خواندن از یک پایپ نیست کار نمیکند؛ اما اسمبلر GNU هیچ مشکلی با آن ندارد.
- -specs=file
- پردازش file پس از اینکه کامپایلر فایل استاندارد specs را خواند، بهمنظور لغو مقادیر پیشفرضی که برنامه گرداننده (driver) gcc هنگام تعیین سوئیچهای ارسالی به cc1، cc1plus، as، ld و غیره استفاده میکند. بیش از یک -specs=file میتواند در خط فرمان مشخص شود، و آنها به ترتیب، از چپ به راست پردازش میشوند.
- -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
- بارگذاری کد افزونه (plugin) موجود در فایل name.so، با این فرض که یک شیء مشترک (shared object) است که باید توسط کامپایلر با dlopen باز شود. نام پایه (base name) فایل شیء مشترک برای شناسایی افزونه بهمنظور تجزیه آرگومانها استفاده میشود (گزینه -fplugin-arg-name-key=value را در زیر ببینید). هر افزونه باید توابع بازخوانی (callback functions) مشخصشده در Plugins API را تعریف کند.
- -fplugin-arg-name-key=value
- تعریف یک آرگومان به نام key با مقدار value برای افزونهای به نام name.
- -fdump-ada-spec[-slim]
- برای فایلهای منبع و گنجاندنی (include) زبانهای C و C++، مشخصات (specs) متناظر Ada را تولید میکند.
- -fada-spec-parent=unit
- در ترکیب با -fdump-ada-spec[-slim] در بالا، مشخصات Ada را بهعنوان واحدهای فرزند از واحد والد unit تولید میکند.
- -fdump-go-spec=file
- برای فایلهای ورودی در هر زبانی، اعلانهای (declarations) متناظر Go را در file تولید میکند. این گزینه اعلانهای "const"، "type"، "var" و "func" زبان Go را ایجاد میکند که میتواند روشی مفید برای شروع نوشتن یک واسط Go برای کدهای نوشتهشده به زبانهای دیگر باشد.
- @file
- خواندن
گزینههای
خط فرمان از
file.
گزینههای
خواندهشده
بهجای
گزینه اصلی
@file درج
میشوند.
اگر file وجود
نداشته
باشد یا
خوانده
نشود، با
گزینه
بهصورت
لفظی رفتار
شده و حذف
نمیشود.
گزینهها در file با نویسههای فاصله خالی (whitespace) از یکدیگر جدا میشوند. یک نویسه فاصله خالی میتواند با قرار دادن کل گزینه درون گیومه تکی یا دوتایی در گزینه گنجانده شود. هر نویسهای (از جمله بکاسلش) میتواند با پیشوند کردن یک بکاسلش به نویسه مورد نظر درج شود. خود file نیز میتواند شامل گزینههای @file بیشتری باشد؛ هرکدام از این گزینهها بهصورت بازگشتی پردازش خواهند شد.
کامپایل برنامههای C++ (Compiling C++ Programs)
فایلهای منبع C++ بهطور معمول از یکی از پسوندهای .C، .cc، .cpp، .CPP، .c++، .cp یا .cxx استفاده میکنند؛ فایلهای سرآیند (header) مربوط به C++ اغلب از .hh، .hpp، .H یا (برای کدهای قالب مشترک) .tcc استفاده میکنند؛ فایلهای پیشپردازششده C++ از پسوند .ii استفاده میکنند؛ و واحدهای واسط ماژول C++20 گاهی از .ixx، .cppm، .cxxm، .c++m یا .ccm بهره میبرند.
کامپایلر GCC فایلهای با این نامها را شناسایی کرده و آنها را بهعنوان برنامههای C++ کامپایل میکند، حتی اگر کامپایلر را دقیقاً همانند روش کامپایل برنامههای C (معمولاً با نام gcc) فراخوانی کنید.
با این حال، استفاده از gcc کتابخانه C++ را اضافه نمیکند. g++ برنامهای است که GCC را فراخوانی کرده و بهطور خودکار پیوند دادن با کتابخانه C++ را تعیین میکند. این برنامه با فایلهای .c، .h و .i بهجای فایلهای منبع C، مانند فایلهای منبع C++ رفتار میکند مگر اینکه از -x استفاده شود. این برنامه همچنین هنگام پیشکامپایل کردن یک فایل سرآیند C با پسوند .h برای استفاده در کامپایلهای C++ مفید است. در بسیاری از سیستمها، g++ همچنین با نام c++ نصب میشود.
هنگام کامپایل برنامههای C++، میتوانید بسیاری از همان گزینههای خط فرمانی را که برای کامپایل برنامهها در هر زبانی استفاده میکنید، یا گزینههای خط فرمانی که برای C و زبانهای مرتبط معنا دارند، یا گزینههایی که فقط برای برنامههای C++ معنادار هستند را مشخص کنید..SS "گزینههای مهار گویش C (Options Controlling C Dialect)" گزینههای زیر گویش زبان C (یا زبانهای مشتقشده از C، مانند C++، Objective-C و Objective-C++) را که کامپایلر میپذیرد، کنترل میکنند:
- -ansi
- در حالت C، این گزینه معادل -std=c90 است. در حالت C++، معادل -std=c++98 است.
- -std=
- استاندارد
زبان را
تعیین
میکند. این
گزینه در
حال حاضر
تنها هنگام
کامپایل C
یا C++
پشتیبانی
میشود.
کامپایلر میتواند چندین استاندارد پایه، مانند c90 یا c++98، و گویشهای GNU آن استانداردها، مانند gnu90 یا gnu++98 را بپذیرد. هنگامی که یک استاندارد پایه مشخص میشود، کامپایلر تمام برنامههای منطبق بر آن استاندارد به علاوه برنامههایی را که از افزونههای GNU ناسازگار با آن استفاده نمیکنند، میپذیرد. برای نمونه، -std=c90 ویژگیهای معینی از GCC را که با ISO C90 ناسازگار هستند (مانند کلیدواژههای "asm" و "typeof") غیرفعال میکند، اما سایر افزونههای GNU را که معنایی در ISO C90 ندارند (مانند حذف عبارت میانی در یک عبارت "?:") غیرفعال نمیسازد. از سوی دیگر، هنگامی که یک گویش GNU از یک استاندارد مشخص میشود، تمام ویژگیهای پشتیبانیشده توسط کامپایلر فعال میشوند، حتی زمانی که آن ویژگیها معنای استاندارد پایه را تغییر دهند. در نتیجه، ممکن است برخی از برنامههای کاملاً منطبق بر استاندارد رد شوند. استاندارد مشخصشده توسط -Wpedantic برای شناسایی اینکه کدام ویژگیها با توجه به آن نسخه از استاندارد افزونههای GNU هستند استفاده میشود. برای نمونه -std=gnu90 -Wpedantic درباره کامنتهای سبک C++ با // هشدار میدهد، در حالی که -std=gnu99 -Wpedantic چنین هشداری نمیدهد.
باید مقداری برای این گزینه فراهم شود؛ مقادیر ممکن عبارتند از:
- c90
- c89
- iso9899:1990
- پشتیبانی از تمام برنامههای ISO C90 (افزونههای خاصی از GNU که با ISO C90 در تضاد هستند غیرفعال میشوند). همانند -ansi برای کد C.
- iso9899:199409
- استاندارد ISO C90 به گونهای که در الحاقیهٔ ۱ (amendment 1) اصلاح شده است.
- c99
- c9x
- iso9899:1999
- iso9899:199x
- استاندارد ISO C99. این استاندارد اساساً بهطور کامل پشتیبانی میشود، به استثنای باگها و مشکلات محاسبات ممیز شناور (عمدتاً اما نه کاملاً مربوط به ویژگیهای اختیاری C99 از پیوستهای F و G). برای اطلاعات بیشتر به https://gcc.gnu.org/c99status.html مراجعه کنید. نامهای c9x و iso9899:199x منسوخ شدهاند.
- c11
- c1x
- iso9899:2011
- استاندارد ISO C11، بازنگری سال ۲۰۱۱ استاندارد ISO C. این استاندارد اساساً بهطور کامل پشتیبانی میشود، به استثنای باگها، اشکالات ممیز شناور (عمدتاً اما نه کاملاً مربوط به ویژگیهای اختیاری C11 از پیوستهای F و G) و پیوستهای اختیاری K (رابطهای بررسی محدوده - Bounds-checking interfaces) و L (تحلیلپذیری - Analyzability). نام c1x منسوخ شده است.
- c17
- c18
- iso9899:2017
- iso9899:2018
- استاندارد ISO C17، بازنگری سال ۲۰۱۷ استاندارد ISO C (منتشر شده در ۲۰۱۸). این استاندارد با C11 یکسان است به جز اصلاح ایرادات (که تمام آنها با -std=c11 نیز اعمال میشوند) و مقدار جدیدی برای "__STDC_VERSION__"، و بدین ترتیب در همان حد C11 پشتیبانی میشود.
- c23
- c2x
- iso9899:2024
- استاندارد ISO C23، بازنگری سال ۲۰۲۳ استاندارد ISO C (منتشر شده در ۲۰۲۴). نام c2x منسوخ شده است.
- c2y
- نسخه بعدی استاندارد ISO C، که همچنان در حال توسعه است. پشتیبانی از این نسخه آزمایشی و ناکامل است.
- gnu90
- gnu89
- گویش GNU از ISO C90 (شامل برخی از ویژگیهای C99).
- gnu99
- gnu9x
- گویش GNU از ISO C99. نام gnu9x منسوخ شده است.
- gnu11
- gnu1x
- گویش GNU از ISO C11. نام gnu1x منسوخ شده است.
- gnu17
- gnu18
- گویش GNU از ISO C17.
- gnu23
- gnu2x
- گویش GNU از ISO C23. این مقدار پیشفرض برای کد C است. نام gnu2x منسوخ شده است.
- gnu2y
- نسخه بعدی استاندارد ISO C، که همچنان در حال توسعه است، به علاوه افزونههای GNU. پشتیبانی از این نسخه آزمایشی و ناکامل است. نام gnu2x منسوخ شده است.
- c++98
- c++03
- استاندارد ISO C++ سال ۱۹۹۸ به همراه اصلاحیه فنی سال ۲۰۰۳ و برخی گزارشهای رفع نقص اضافی. همانند -ansi برای کد C++.
- gnu++98
- gnu++03
- گویش GNU از -std=c++98.
- c++11
- c++0x
- استاندارد ISO C++ سال ۲۰۱۱ به همراه اصلاحیهها. نام c++0x منسوخ شده است.
- gnu++11
- gnu++0x
- گویش GNU از -std=c++11. نام gnu++0x منسوخ شده است.
- c++14
- c++1y
- استاندارد ISO C++ سال ۲۰۱۴ به همراه اصلاحیهها. نام c++1y منسوخ شده است.
- gnu++14
- gnu++1y
- گویش GNU از -std=c++14. نام gnu++1y منسوخ شده است.
- c++17
- c++1z
- استاندارد ISO C++ سال ۲۰۱۷ به همراه اصلاحیهها. نام c++1z منسوخ شده است..IP gnu++17 4
- gnu++1z
- لهجهٔ GNU از -std=c++17. این مقدار پیشفرض برای کدهای C++ است. نام gnu++1z منسوخ شده است.
- c++20
- c++2a
- استاندارد ISO C++ سال ۲۰۲۰ به همراه اصلاحیهها. پشتیبانی از آن آزمایشی است و ممکن است در نسخههای بعدی به شیوههایی ناسازگار تغییر کند. نام c++2a منسوخ شده است.
- gnu++20
- gnu++2a
- لهجهٔ GNU از -std=c++20. پشتیبانی از آن آزمایشی است و ممکن است در نسخههای بعدی به شیوههایی ناسازگار تغییر کند. نام gnu++2a منسوخ شده است.
- c++23
- c++2b
- استاندارد ISO C++ سال ۲۰۲۳ به همراه اصلاحیهها (منتشر شده در ۲۰۲۴). پشتیبانی از آن آزمایشی است و ممکن است در نسخههای بعدی به شیوههایی ناسازگار تغییر کند. نام c++2b منسوخ شده است.
- gnu++23
- gnu++2b
- لهجهٔ GNU از -std=c++23. پشتیبانی از آن آزمایشی است و ممکن است در نسخههای بعدی به شیوههایی ناسازگار تغییر کند. نام gnu++2b منسوخ شده است.
- c++2c
- c++26
- بازنگری بعدی استاندارد ISO C++، برنامهریزیشده برای سال ۲۰۲۶. پشتیبانی از آن کاملاً آزمایشی است و تقریباً به طور قطع در نسخههای بعدی به شیوههایی ناسازگار تغییر خواهد کرد.
- gnu++2c
- gnu++26
- لهجهٔ GNU از -std=c++2c. پشتیبانی از آن کاملاً آزمایشی است و تقریباً به طور قطع در نسخههای بعدی به شیوههایی ناسازگار تغییر خواهد کرد.
- -aux-info filename
- اعلانهای
الگووار (prototyped)
تمام
توابعی که
در یک واحد
ترجمه
اعلان و/یا
تعریف
شدهاند،
از جمله
موارد
موجود در
فایلهای
سرایند را
در filename
مشخصشده
مینویسد.
این گزینه
در هر زبانی
به جز C در
سکوت
نادیده
گرفته
میشود.
علاوه بر اعلانها، این فایل در قالب توضیح (کامنت)، مبدأ هر اعلان (فایل مبدأ و خط)، اینکه آیا اعلان ضمنی بوده، دارای الگو یا فاقد الگو بوده است (I، N برای جدید یا O برای قدیمی، به عنوان اولین نویسه پس از شماره خط و دونقطه)، و اینکه آیا از یک اعلان ناشی شده است یا از یک تعریف (C یا F، به ترتیب، در نویسه بعدی) را مشخص میکند. در مورد تعاریف تابع، فهرستی از آرگومانها به سبک K&R که به دنبال آن اعلانهایشان آمده نیز، داخل توضیحات، پس از اعلان ارائه میشود.
- -fno-asm
- کلمات
"asm"،
"inline" یا
"typeof" را
به عنوان
کلیدواژه
شناسایی
نمیکند،
تا کد
بتواند از
این
واژهها به
عنوان
شناسه (identifier)
استفاده
کند.
میتوانید
در عوض از
کلیدواژههای
"__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" حافظه عمومی را تغییر نمیدهد.
با گزینهٔ -fno-builtin-function تنها تابع توکار function غیرفعال میشود. نام function نباید با __builtin_ آغاز شود. اگر تابعی نام برده شود که در این نسخه از GCC به صورت توکار وجود ندارد، این گزینه نادیده گرفته میشود. هیچ گزینهٔ متناظری به صورت -fbuiltin-function وجود ندارد؛ اگر مایلید توابع توکار را هنگام استفاده از -fno-builtin یا -ffreestanding به صورت انتخابی فعال کنید، میتوانید ماکروهایی از این قبیل تعریف کنید:
#define abs(n) __builtin_abs ((n)) #define strcpy(d, s) __builtin_strcpy ((d), (s))
- -fcond-mismatch
- عبارتهای شرطی با انواع ناهماهنگ در آرگومانهای دوم و سوم را مجاز میداند. مقدار چنین عبارتی void است. این گزینه برای C++ پشتیبانی نمیشود.
- -ffreestanding
- مشخص میکند که کامپایل یک محیط مستقل (freestanding) را هدف قرار داده است. این گزینه متضمن -fno-builtin است. محیط مستقل محیطی است که ممکن است کتابخانهٔ استاندارد در آن وجود نداشته باشد، و آغاز برنامه لزوماً از "main" نباشد. بارزترین نمونهٔ آن هستهٔ سیستمعامل است. این گزینه معادل -fno-hosted است.
- -fgimple
- تجزیهٔ تعاریف توابع نشانهگذاریشده با "__GIMPLE" را فعال میکند. این یک قابلیت آزمایشی است که امکان آزمون واحد (unit testing) گذرگاههای GIMPLE را فراهم میآورد.
- -fgnu-tm
- هنگامی که
گزینهٔ -fgnu-tm
مشخص
میشود،
کامپایلر
کدی مطابق
با گونهٔ
لینوکسی
سند مشخصات
جاری ABI
حافظه
تبادلی (Transactional Memory)
اینتل
(نگارش ۱.۱،
۶ مه ۲۰۰۹)
تولید
میکند. این
یک ویژگی
آزمایشی
است که رابط
آن ممکن است
در
نسخههای
بعدی GCC با
تغییر
مشخصات
رسمی تغییر
کند. لطفاً
توجه داشته
باشید که
این قابلیت
برای همهٔ
معماریها
پشتیبانی
نمیشود.
برای اطلاعات بیشتر درباره پشتیبانی GCC از حافظه تبادلی،
توجه داشته باشید که ویژگی حافظه تبادلی با استثناهای غیر فراخوانی (-fnon-call-exceptions) پشتیبانی نمیشود.
- -fgnu89-inline
- گزینهٔ -fgnu89-inline
به GCC اعلام
میکند که
در حالت C99 از
معناشناسی
سنتی GNU برای
توابع
"inline"
استفاده
کند.
استفاده از این گزینه تقریباً معادل اضافه کردن صفت تابعی "gnu_inline" به تمامی توابع درونخطی است.
گزینهٔ -fno-gnu89-inline صریحاً به GCC اعلام میکند که هنگام قرار داشتن در حالت C99 یا gnu99 از معناشناسی C99 برای "inline" استفاده کند (یعنی رفتار پیشفرض را مشخص میکند). این گزینه در حالت -std=c90 یا -std=gnu90 پشتیبانی نمیشود.
ماکروهای پیشپردازندهٔ "__GNUC_GNU_INLINE__" و "__GNUC_STDC_INLINE__" میتوانند برای بررسی اینکه کدام معناشناسی برای توابع "inline" فعال است، به کار روند.
- -fhosted
- مشخص میکند که کامپایل یک محیط میزبانیشده (hosted) را هدف قرار داده است. این گزینه متضمن -fbuiltin است. محیط میزبانیشده محیطی است که تمام کتابخانهٔ استاندارد در آن در دسترس است، و در آن نوع بازگشتی "main" برابر با "int" است. نمونههای آن تقریباً همه چیز به جز هستهٔ سیستمعامل است. این گزینه معادل -fno-freestanding است.
- -flax-vector-conversions
- تبدیلهای ضمنی میان بردارهایی با تعداد عناصر متفاوت و/یا انواع عناصر ناسازگار را مجاز میشمارد. این گزینه نباید برای کدهای جدید استفاده شود.
- -fms-extensions
- برخی از
ساختارهای
غیراستاندارد
بهکاررفته
در
فایلهای
سرایند
مایکروسافت
را
میپذیرد.
در کدهای C++، این گزینه اجازه میدهد نام اعضای ساختارها مشابه اعلانهای انواع پیشین باشد.
typedef int UOW; struct ABC { UOW UOW; };برخی موارد فیلدهای بدون نام در ساختارها (structures) و اجتماعها (unions) تنها با این گزینه پذیرفته میشوند.
توجه داشته باشید که این گزینه برای همهٔ اهداف غیرفعال است، به جز اهداف x86 که از ms-abi استفاده میکنند..IP -fpermitted-flt-eval-methods=style 4 استاندارد ISO/IEC TS 18661-3 مقادیر مجاز جدیدی برای "FLT_EVAL_METHOD" تعریف میکند که مشخص میسازند عملیات و مقادیر ثابتی با نوع معنایی که یک قالب مبادلهای یا گسترشیافته است، باید با دقت و بازهٔ همان نوع ارزیابی شوند. این مقادیر جدید، ابرمجموعهای از مقادیر مجاز در C99/C11 هستند؛ استانداردهایی که معنای سایر مقادیر مثبت "FLT_EVAL_METHOD" را تعیین نکردهاند. از این رو، کدهایی که مطابق با C11 نوشته شدهاند ممکن است با در نظر گرفتن احتمال وجود این مقادیر جدید پیادهسازی نشده باشند.
گزینهٔ -fpermitted-flt-eval-methods مشخص میکند که کامپایلر تنها باید مقادیر تعیینشده برای "FLT_EVAL_METHOD" در C99/C11 را مجاز بداند، یا مجموعهٔ گسترشیافتهٔ مقادیر مشخصشده در ISO/IEC TS 18661-3 را نیز بپذیرد.
مقدار style بسته به نیاز، برابر با "c11" یا "ts-18661-3" خواهد بود.
پیشفرض در حالت سازگار با استانداردها (-std=c11 یا مشابه آن)، -fpermitted-flt-eval-methods=c11 است. پیشفرض در حالت گویش گنو (-std=gnu11 یا مشابه آن)، -fpermitted-flt-eval-methods=ts-18661-3 است.
گزینههای -fdeps-* برای استخراج اطلاعات وابستگی ساختاریافته برای یک مبدأ به کار میروند. این امر شامل تعیین این است که کدام منابع ارائهشده توسط سایر فایلهای مبدأ برای کامپایل این مبدأ لازم خواهند بود و همچنین چه منابعی توسط خود این مبدأ ارائه میشوند. از این اطلاعات میتوان برای افزودن وابستگیهای لازم میان قوانین کامپایل منابع وابسته بر اساس محتوای آنها استفاده کرد، بدون آنکه نیازی باشد چنین اطلاعاتی در ابزارهای ساخت نیز منعکس شود.
- -fdeps-file=file
- محل نوشتن اطلاعات وابستگی ساختاریافته.
- -fdeps-format=format
- قالبی که برای اطلاعات وابستگی ساختاریافته استفاده میشود. در حال حاضر p1689r5 تنها قالب پشتیبانیشده است. توجه داشته باشید که در صورت تعیین این آرگومان، برخی از اطلاعات (بهویژه ماژولهای ++C) از خروجی -MF حذف میشوند تا از ساختار نحوی گسترشیافتهٔ makefile که توسط بیشتر ابزارها قابل فهم نیست، استفاده نشود.
- -fdeps-target=file
- مشابه -MT است اما برای اطلاعات وابستگی ساختاریافته کاربرد دارد. این گزینه هدفی را مشخص میکند که در نهایت به هر یک از منابع مورد نیاز احتیاج داشته و منابع استخراجشده از این مبدأ را که ممکن است سایر منابع به آن نیاز داشته باشند، تأمین میکند.
- -fplan9-extensions
- پذیرش برخی
از
ساختارهای
غیراستاندارد
بهکاررفته
در کدهای Plan 9.
این گزینه -fms-extensions را فعال میکند، اجازه میدهد اشارهگرهای ساختارهای دارای فیلدهای بینام به توابعی ارسال شوند که انتظار اشارهگر به عنصری از نوع آن فیلد را دارند، و ارجاع به فیلدهای بینامِ اعلانشده با استفاده از typedef را ممکن میسازد. این قابلیت تنها برای C پشتیبانی میشود، نه ++C.
- -fsigned-bitfields
- -funsigned-bitfields
- -fno-signed-bitfields
- -fno-unsigned-bitfields
- این گزینهها کنترل میکنند که وقتی در اعلان یک میدان بیتی (bit-field) صریحاً از "signed" یا "unsigned" استفاده نشده باشد، آن میدان بیتی علامتدار باشد یا بدون علامت. بهطور پیشفرض، چنین میدان بیتی علامتدار است، زیرا با رفتار کلی سازگاری دارد: انواع صحیح پایهای نظیر "int" انواعی علامتدار هستند.
- -fsigned-char
- نوع "char"
را مانند
"signed char"
علامتدار
در نظر
میگیرد.
توجه داشته باشید که این گزینه معادل -fno-unsigned-char است که حالت نقیض -funsigned-char میباشد. بهطور مشابه، گزینهٔ -fno-signed-char معادل -funsigned-char است.
- -funsigned-char
- نوع "char"
را مانند
"unsigned char"
بدون علامت
در نظر
میگیرد.
هر نوع ماشینی پیشفرضی دارد که "char" باید چگونه باشد؛ بهطور پیشفرض یا مانند "unsigned char" رفتار میکند یا مانند "signed char".
در حالت ایدهآل، یک برنامهٔ قابل حمل (portable) هرگاه به علامتدار بودن یک شیء وابسته باشد باید همواره صریحاً از "signed char" یا "unsigned char" استفاده کند. اما بسیاری از برنامهها با استفاده از "char" ساده نوشته شدهاند و بسته به ماشینی که برای آن توسعه یافتهاند، انتظار دارند علامتدار یا بدون علامت باشد. این گزینه و حالت معکوس آن به شما اجازه میدهند چنین برنامهای را با رفتار پیشفرض مخالف اجرا کنید.
نوع "char" همواره نوعی متمایز از هر یک از "signed char" یا "unsigned char" است، هرچند که رفتار آن همیشه دقیقاً شبیه به یکی از آن دو خواهد بود.
- -fstrict-flex-arrays (تنها C و ++C)
- -fstrict-flex-arrays=level (تنها C و ++C)
- کنترل
میکند که
چه زمانی
آرایهٔ
انتهایی یک
ساختار به
منظور
دسترسی به
عناصر آن،
به عنوان
عضو آرایهٔ
انعطافپذیر
(flexible array member) در نظر
گرفته شود.
مقدار level
سطح
سختگیری
را کنترل
میکند.
گزینهٔ -fstrict-flex-arrays معادل -fstrict-flex-arrays=3 است که سختگیرانهترین حالت میباشد؛ آرایهٔ انتهایی تنها زمانی به عنوان عضو آرایهٔ انعطافپذیر تلقی میشود که طبق استاندارد C99 به بعد، به عنوان عضو آرایهٔ انعطافپذیر اعلان شده باشد.
شکل منفی -fno-strict-flex-arrays معادل -fstrict-flex-arrays=0 است که کمترین سختگیری را دارد. در این حالت تمام آرایههای انتهایی ساختارها به عنوان عضو آرایهٔ انعطافپذیر تلقی میشوند.
دو سطح دیگر بین 0 و 3 وجود دارد که برای پشتیبانی از کدهای قدیمیتر ارائهشدهاند که از افزونهٔ آرایه با طول صفر در GCC ([0]) یا آرایه تکعنصری به عنوان اعضای آرایهٔ انعطافپذیر ([1]) استفاده میکنند. زمانی که level برابر با 1 باشد، آرایهٔ انتهایی در صورتی به عنوان عضو آرایهٔ انعطافپذیر تلقی میشود که به صورت []، [0] یا [1] اعلان شده باشد. زمانی که level برابر با 2 باشد، آرایهٔ انتهایی در صورتی به عنوان عضو آرایهٔ انعطافپذیر در نظر گرفته میشود که به صورت [] یا [0] اعلان شده باشد.
میتوانید این رفتار را برای یک فیلد آرایهٔ انتهایی مشخص در یک ساختار با استفاده از صفت متغیر "strict_flex_array" کنترل کنید.
گزینهٔ -fstrict_flex_arrays با گزینهٔ -Wstrict-flex-arrays تعامل دارد.
- -fsso-struct=endianness
- ترتیب
پیشفرض
ذخیرهسازی
اسکالر
ساختارها و
یونیونها
را بر اساس
ترتیب بایت
(endianness)
مشخصشده
تنظیم
میکند.
مقادیر
پذیرفتهشده
عبارتند از
big-endian، little-endian و native
برای ترتیب
بایت بومیِ
مقصد
(پیشفرض).
این گزینه
برای ++C
پشتیبانی
نمیشود.
هشدار: اگر ترتیب بایت مشخصشده با ترتیب بایت بومیِ مقصد یکسان نباشد، سوییچ -fsso-struct باعث میشود GCC کدهایی تولید کند که با کدهای تولیدشده بدون این گزینه از نظر دودویی سازگار نباشند..SS "گزینههای کنترل گویش 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++ هستند:
- -fabi-version=n
- استفاده از
نسخهٔ n از C++
ABI. مقدار
پیشفرض
نسخهٔ 0 است.
نسخهٔ 0 به نسخهای اشاره دارد که بیشترین سازگاری را با مشخصات C++ ABI دارد. از این رو، ABI بهدستآمده با استفاده از نسخهٔ 0 با رفع باگهای ABI، در نگارشهای مختلف G++ تغییر خواهد کرد.
نسخهٔ 1 نسخهای از C++ ABI است که نخستین بار در G++ 3.2 ظاهر شد.
نسخهٔ 2 نسخهای از C++ ABI است که نخستین بار در G++ 3.4 ارائه شد و تا G++ 4.9 مقدار پیشفرض بود.
نسخهٔ 3 خطایی را در درهمسازی (mangling) یک آدرس ثابت بهعنوان آرگومان قالب اصلاح میکند.
نسخهٔ 4 که نخستین بار در G++ 4.5 ارائه شد، درهمسازی استانداردی را برای انواع برداری پیادهسازی میکند.
نسخهٔ 5 که نخستین بار در G++ 4.6 ارائه شد، درهمسازی مشخصهٔ const/volatile روی انواع اشارهگر تابع، decltype یک اعلان ساده و استفاده از پارامتر تابع در اعلان پارامتری دیگر را اصلاح میکند.
نسخهٔ 6 که نخستین بار در G++ 4.7 ارائه شد، رفتار ارتقای شمارشهای دامنهدار C++11 و درهمسازی بستههای آرگومان قالب، const/static_cast، پیشوندهای ++ و -- و تابعی در دامنهٔ کلاس که بهعنوان آرگومان قالب استفاده شده را اصلاح میکند.
نسخهٔ 7 که نخستین بار در G++ 4.8 ظاهر شد، با nullptr_t بهعنوان یک نوع درونی رفتار کرده و درهمسازی لامبداها را در دامنهٔ آرگومان پیشفرض اصلاح میکند.
نسخهٔ 8 که نخستین بار در G++ 4.9 ارائه شد، رفتار جایگزینی انواع تابع با function-cv-qualifiers را اصلاح میکند.
نسخهٔ 9 که نخستین بار در G++ 5.2 ارائه شد، همترازی "nullptr_t" را اصلاح میکند.
نسخهٔ 10 که نخستین بار در G++ 6.1 ارائه شد، درهمسازی مشخصههایی را که بر هویت نوع تأثیر میگذارند، مانند مشخصههای قرارداد فراخوانی ia32 (برای نمونه stdcall)، اضافه میکند.
نسخهٔ 11 که نخستین بار در G++ 7 ارائه شد، درهمسازی عبارتهای ...sizeof و نامهای عملگر را اصلاح میکند. برای موجودیتهای چندگانه با نام یکسان درون یک تابع که در حوزههای متفاوتی اعلان شدهاند، درهمسازی اکنون از دوازدهمین رخداد به بعد تغییر میکند. این گزینه همچنین مستلزم -fnew-inheriting-ctors است.
نسخهٔ 12 که نخستین بار در G++ 8 ارائه شد، قراردادهای فراخوانی را برای کلاسهای خالی روی هدف x86_64 و برای کلاسهایی که تنها سازندههای کپی/انتقال حذفشده دارند، تصحیح میکند. این نسخه به طور تصادفی قرارداد فراخوانی کلاسهایی با سازندهٔ کپی حذفشده و سازندهٔ انتقال بدیهی را تغییر میدهد.
نسخهٔ 13 که نخستین بار در G++ 8.2 ارائه شد، تغییر تصادفی در نسخهٔ 12 را رفع میکند.
نسخهٔ 14 که نخستین بار در G++ 10 ارائه شد، درهمسازی عبارت nullptr را اصلاح میکند.
نسخهٔ 15 که نخستین بار در G++ 10.3 ارائه شد، پسرفت برچسب ABI در G++ 10 را اصلاح میکند.
نسخهٔ 16 که نخستین بار در G++ 11 ارائه شد، درهمسازی "__alignof__" را تغییر میدهد تا از "alignof" و نامهای عملگر وابسته متمایز باشد.
نسخهٔ 17 که نخستین بار در G++ 12 ارائه شد، چیدمان کلاسهایی را که از کلاسهای تجمیعی (aggregate) با مقداردهندههای پیشفرض اعضا در C++14 به بالا ارثبری میکنند، اصلاح مینماید.
نسخهٔ 18 که نخستین بار در G++ 13 ارائه شد، درهمسازی لامبداهایی را که زمینهٔ اضافی دارند اصلاح میکند.
نسخهٔ 19 که نخستین بار در G++ 14 ارائه شد، درهمسازی مقیدسازیهای ساختاریافته را تصحیح میکند تا شامل برچسبهای ABI باشند.
نسخهٔ 20 که نخستین بار در G++ 15 ارائه شد، درهمسازی لامبداها در مقداردهندههای اعضای دادهای ایستا را اصلاح میکند.
همچنین ببینید: -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، امضاهای
جدید برای
لیترالهای
تعریفشده
توسط
کاربر،
بهروزرسانیهای
مرتبط در
کتابخانهٔ
استاندارد،
و ماکروهای
جدید بررسی
ویژگی
"__cpp_char8_t" و
"__cpp_lib_char8_t"
است.
این گزینه به توابع امکان میدهد برای رشتههای معمولی و UTF-8 سربارگذاری (overload) شوند:
int f(const char *); // #1 int f(const char8_t *); // #2 int v1 = f("text"); // Calls #1 int v2 = f(u8"text"); // Calls #2و امضاهای جدیدی برای لیترالهای تعریفشده توسط کاربر معرفی میکند:
int operator""_udl1(char8_t); int v3 = u8'x'_udl1; int operator""_udl2(const char8_t*, std::size_t); int v4 = u8"text"_udl2; template<typename T, T...> int operator""_udl3(); int v5 = u8"text"_udl3;
تغییر نوع لیترالهای رشتهای و نویسهای UTF-8 باعث ایجاد ناسازگاریهایی با استاندارد ISO C++11 و استانداردهای پس از آن میشود. برای نمونه، کد زیر بر اساس ISO C++11 خوشساخت (well-formed) است، اما با مشخص کردن -fchar8_t بدساخت (ill-formed) محسوب میشود.
const char *cp = u8"xx";// error: invalid conversion from // `const char8_t*' to `const char*' int f(const char*); auto v = f(u8"xx"); // error: invalid conversion from // `const char8_t*' to `const char*' std::string s{u8"xx"}; // error: no matching function for call to // `std::basic_string<char>::basic_string()' using namespace std::literals; s = u8"xx"s; // error: conversion from // `basic_string<char8_t>' to non-scalar // type `basic_string<char>' requested بررسی میکند که اشارهگر بازگرداندهشده توسط "operator new" پیش از تلاش برای اصلاح حافظهٔ تخصیصیافته، غیرتهی (non-null) باشد. این بررسی معمولاً غیرضروری است زیرا استاندارد C++ مشخص میکند که "operator new" تنها در صورتی 0 برمیگرداند که بهصورت throw() اعلان شده باشد، که در این صورت کامپایلر همواره حتی بدون این گزینه نیز مقدار بازگشتی را بررسی میکند. در تمام موارد دیگر، هنگامی که "operator new" دارای مشخصهٔ استثنای غیرخالی باشد، اتمام حافظه با پرتاب "std::bad_alloc" گزارش میشود. همچنین new (nothrow) را ببینید. - -fconcepts
-
پشتیبانی از ویژگی مفاهیم (Concepts) در C++ را برای محدود کردن آرگومانهای الگو فعال میکند. با -std=c++20 و بالاتر، مفاهیم بخشی از استاندارد زبان هستند، بنابراین -fconcepts بهطور پیشفرض فعال است. برخی از ساختارهایی که توسط مشخصات فنی الحاقات C++ برای مفاهیم اولیه، ISO 19217 (2015)، مجاز بودند اما به استاندارد راه نیافتند، پیشتر با -fconcepts-ts قابل فعالسازی بودند. گزینهٔ -fconcepts-ts در GCC 14 منسوخ و در GCC 15 حذف شد؛ از کاربران انتظار میرود کدهای خود را به مفاهیم C++20 تبدیل کنند.
- -fconstexpr-depth=n
-
حداکثر عمق ارزیابی تودرتو را برای توابع constexpr در C++11 روی n تنظیم میکند. این محدودیت برای تشخیص بازگشتهای بیپایان در طول ارزیابی عبارت ثابت لازم است. حداقل مقدار مشخصشده توسط استاندارد ۵۱۲ است.
- -fconstexpr-cache-depth=n
-
حداکثر سطح عمق ارزیابی تودرتوی توابع constexpr در C++11 را که در حافظهٔ موقت (cache) نگهداری میشود، روی n تنظیم میکند. این یک روش مکاشفهای (heuristic) است که تعادلی میان سرعت کامپایل (زمانی که حافظهٔ موقت از محاسبات تکراری جلوگیری میکند) و مصرف حافظه (زمانی که حافظهٔ موقت بر اثر ارزیابیهای بسیار بازگشتی بیش از حد بزرگ میشود) برقرار میکند. مقدار پیشفرض ۸ است. احتمال بسیار کمی دارد که کاربران نیاز به تغییر آن داشته باشند، اما اگر کد شما محاسبات سنگین constexpr انجام میدهد، میتوانید آن را بیازمایید تا ببینید کدام مقدار برای شما مناسبتر است.
- -fconstexpr-fp-except
-
پیوست F از استاندارد C مشخص میکند که استثناهای ممیز شناور IEC559 در زمان کامپایل نباید فرایند کامپایل را متوقف کنند. کامپایلرهای C++ از نظر تاریخی این راهنما را دنبال نکردهاند و در عوض تقسیم ممیز شناور بر صفر را با وجود داشتن مقداری کاملاً معین، غیرثابت در نظر میگیرند. این پرچم به کامپایلر میگوید که به پیوست F نسبت به سایر قوانینی که میگویند عملیاتی خاص تعریفنشده (undefined) است، اولویت دهد. constexpr float inf = 1./0.; // OK with -fconstexpr-fp-except - -fconstexpr-loop-limit=n
- حداکثر تعداد تکرارهای یک حلقه را در توابع constexpr مربوط به C++14 روی n تنظیم میکند. این محدودیت برای تشخیص حلقههای بیپایان در طول ارزیابی عبارت ثابت لازم است. مقدار پیشفرض ۲۶۲۱۴۴ (1<<18) است.
- -fconstexpr-ops-limit=n
- حداکثر تعداد عملیاتها را در طول یک ارزیابی constexpr تعیین میکند. حتی زمانی که تعداد تکرارهای یک حلقه با محدودیت بالا مهار شده باشد، اگر چند حلقهٔ تودرتو وجود داشته باشد و هر کدام تکرارهای زیادی کمتر از حد بالا داشته باشند، یا اگر در بدنهٔ یک حلقه یا حتی خارج از آن عبارتهای بسیار زیادی نیاز به ارزیابی داشته باشند، ممکن است ارزیابی constexpr زمان زیادی ببرد. مقدار پیشفرض ۳۳۵۵۴۴۳۲ (1<<25) است.
- -fcontracts
- پشتیبانی
آزمایشی از
ویژگی
قراردادهای
C++ (Contracts) را فعال
میکند،
قابلیتی که
به صورت
موقت به
پیشنویس
کاری C++20 (سند N4820)
اضافه و سپس
حذف شد. این
پیادهسازی
همچنین
شامل
بهبودهای
پیشنهادی
از اسناد P1290،
P1332 و P1429 است. این
قابلیت
عمدتاً
برای کسانی
در نظر
گرفته شده
است که مایل
به آزمایش و
اصلاح این
ویژگی برای
گنجاندن آن
در
استانداردهای
آیندهٔ C++
هستند.
در صورت نقض یک قرارداد بررسیشده، گردانندهٔ نقض (violation handler) فراخوانی میشود. کاربران میتوانند با تعریف تابع زیر، گردانندهٔ نقض را جایگزین کنند:
void handle_contract_violation (const std::experimental::contract_violation&);
مجموعههای متفاوتی از پرچمهای اضافی وجود دارند که میتوانند برای مشخص کردن اینکه کدام قراردادها و چگونه بررسی شوند، برای قراردادهای N4820، P1332، یا P1429 با هم به کار روند؛ این مجموعهها را نمیتوان بهطور همزمان استفاده کرد.
- -fcontract-mode=[on|off]
- کنترل میکند که آیا قراردادها اصلاً هیچ معناشناسیای (semantics) داشته باشند یا خیر. پیشفرض on است.
- -fcontract-assumption-mode=[on|off]
- [N4820] کنترل میکند که آیا قراردادهای با سطح axiom باید معناشناسی فرض (assume) داشته باشند یا خیر. پیشفرض on است.
- -fcontract-build-level=[off|default|audit]
- [N4820] مشخص میکند که برای کدام سطح از قراردادها بررسی تولید شود. پیشفرض default است.
- -fcontract-continuation-mode=[on|off]
- [N4820] کنترل میکند که آیا به برنامه اجازه داده شود پس از نقض قرارداد به اجرا ادامه دهد یا خیر. به این معنی که آیا قراردادهای بررسیشده دارای معناشناسی maybe شرح داده شده در زیر هستند یا معناشناسی never. پیشفرض off است.
- -fcontract-role=<name>:<default>,<audit>,<axiom>
- [P1332] معناشناسی مشخص را برای هر سطح از قرارداد در یک نقش خاص قرارداد تعیین میکند.
- -fcontract-semantic=[default|audit|axiom]:<semantic>
- [P1429] معناشناسی مشخص را برای یک سطح خاص از قرارداد تعیین میکند.
- -fcontract-strict-declarations=[on|off]
- کنترل میکند که آیا افزودن قرارداد به یک تابع پس از نخستین اعلان آن رد شود یا خیر. پیشفرض off است.
معناشناسیهای مشخص ممکنی که میتوان با -fcontract-role یا -fcontract-semantic تعیین کرد عبارتاند از:
- "ignore"
- این قرارداد هیچ تأثیری ندارد.
- "assume"
- با این قرارداد مانند "[[assume]]" در C++23 رفتار میشود.
- "check_never_continue"
- "never"
- "abort"
- این قرارداد بررسی میشود. در صورت شکست، گردانندهٔ نقض فراخوانی میشود. اگر گرداننده بازگردد، "std::terminate" فراخوانی میشود.
- "check_maybe_continue"
- "maybe"
- این قرارداد بررسی میشود. در صورت شکست، گردانندهٔ نقض فراخوانی میشود. اگر گرداننده بازگردد، اجرا به صورت عادی ادامه مییابد.
- -fcoroutines
- پشتیبانی از افزونهٔ همروندها (coroutines) در C++ را فعال میکند (آزمایشی).
- -fdiagnostics-all-candidates
- به بخش جلویی (front end) کامپایلر C++ اجازه میدهد هنگام شکست در تفکیک چندریختی (overload resolution)، تمام نامزدها را ثبت کند، حتی زمانی که یک تابع حذفشده (deleted) انتخاب شده باشد.
- -fno-elide-constructors
- استاندارد
C++ به
پیادهسازی
اجازه
میدهد از
ایجاد شیء
موقتی که
تنها برای
مقداردهی
اولیهٔ شیء
دیگری از
همان نوع
استفاده
میشود،
صرفنظر
کند. تعیین
این گزینه
این
بهینهسازی
را غیرفعال
کرده و G++ را
وادار
میکند تا
در همهٔ
موارد
سازندهٔ
کپی (copy constructor) را
فراخوانی
کند. این
گزینه
همچنین
باعث
میشود G++
توابع عضو
بدیهی (trivial) را
فراخوانی
کند، در
حالی که در
غیر این
صورت
بهصورت
درونخطی (inline)
گسترش
مییافتند.
در C++17، کامپایلر موظف است این اشیاء موقت را نادیده بگیرد، اما این گزینه همچنان روی توابع عضو بدیهی تأثیر میگذارد.
- -fno-enforce-eh-specs
- کدی برای بررسی نقض مشخصات استثناها در زمان اجرا تولید نمیکند. این گزینه استاندارد 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 است..IP -ffold-simple-inlines 4
- -fno-fold-simple-inlines
- به فرانتاند C++ اجازه میدهد فراخوانیهای "std::move"، "std::forward"، "std::addressof" و "std::as_const" را فولد (fold) کند. برخلاف درونخطیسازی (inlining)، این بدان معناست که هیچ اطلاعات اشکالزدایی برای چنین فراخوانیهایی تولید نخواهد شد. از آنجا که اشکالزدایی این توابع بهندرت مورد توجه است، این پرچم بهطور پیشفرض فعال است مگر آنکه -fno-inline فعال باشد.
- -fno-gnu-keywords
- شناسایی "typeof" را به عنوان کلمهٔ کلیدی متوقف کن، تا کد بتواند از این واژه به عنوان یک شناسه استفاده کند. میتوانید بهجای آن از کلمهٔ کلیدی "__typeof__" استفاده کنید. این گزینه توسط گویشهای صریح ISO C++ مانند -ansi، -std=c++98، -std=c++11 و غیره بهطور ضمنی فعال میشود.
- -fno-immediate-escalation
- ارتقای
توابع فوری
(immediate function escalation) را که
به موجب آن
توابع خاصی
میتوانند
طبق مشخصات
P2564R3 به consteval
ارتقا
یابند،
فعال نکن.
برای مثال:
consteval int id(int i) { return i; } constexpr int f(auto t) { return t + id(t); // id causes f<int> to be promoted to consteval } void g(int i) { f (3); }در C++20 کامپایل میشود: تابع "f" یک تابع ارتقاءدهندهٔ فوری است (به دلیل وجود "auto" یک قالب تابع بوده و به صورت "constexpr" اعلان شده است) و id(t) یک عبارت ارتقاءدهندهٔ فوری است، بنابراین "f" به "consteval" ارتقا مییابد. در نتیجه، فراخوانی id(t) در یک بافتار فوری (immediate context) قرار دارد، بنابراین نیازی به تولید یک ثابت ندارد (این سازوکاری است که امکان ترکیب توابع consteval را فراهم میسازد). با این حال، با -fno-immediate-escalation، تابع "f" به "consteval" ارتقا پیدا نمیکند و از آنجا که فراخوانی تابع consteval یعنی id(t) یک عبارت ثابت نیست، کامپایلر کد را رد میکند.
این گزینه بهطور پیشفرض فعال است؛ و تنها در حالت C++20 یا بالاتر مؤثر خواهد بود.
- -fimplicit-constexpr
- توابع درونخطی (inline) را در صورتی که شرایط یک تابع constexpr را داشته باشند، بهطور ضمنی constexpr کن. این گزینه در حالت C++14 یا بالاتر قابل استفاده است. این امر میتواند به تغییر مقداردهی اولیه از پویا به ایستا و دیگر بهینهسازیها منجر شود.
- -fno-implicit-templates
- هرگز برای قالبهای غیردرونخطی (non-inline) که بهطور ضمنی نمونهسازی شدهاند (یعنی هنگام استفاده) کدی تولید نکن؛ تنها برای نمونهسازیهای صریح کد تولید کن. اگر از این گزینه استفاده میکنید، باید دقت کنید که ساختار کد خود را طوری سامان دهید که شامل تمام نمونهسازیهای صریح لازم باشد تا در زمان پیوند با نمادهای تعریفنشده مواجه نشوید.
- -fno-implicit-inline-templates
- برای نمونهسازیهای ضمنی قالبهای درونخطی نیز کدی تولید نکن. پیشفرض این است که با توابع درونخطی متفاوت رفتار شود تا کامپایل با و بدون بهینهسازی به مجموعهٔ یکسانی از نمونهسازیهای صریح نیاز داشته باشد.
- -fno-implement-inlines
- برای صرفهجویی در فضا، نسخههای خارج از خط (out-of-line) توابع درونخطی تحت کنترل "#pragma implementation" را تولید نکن. اگر این توابع در تمام جاهایی که فراخوانی میشوند درونخطی نشده باشند، این کار باعث خطاهای پیونددهنده (linker) خواهد شد.
- -fmodules
- -fno-modules
- پشتیبانی از ماژولهای C++20 را فعال کن. گزینهٔ -fno-modules معمولاً نیاز نیست، چرا که این رفتار پیشفرض است. با وجود اینکه این قابلیت مربوط به C++20 است، در حال حاضر با انتخاب نگارش استاندارد بهطور ضمنی فعال نمیشود.
- -fmodule-header
- -fmodule-header=user
- -fmodule-header=system
- کامپایل یک فایل سرآیند برای ایجاد یک واحد سرآیند قابل وارد کردن (importable header unit).
- -fmodule-implicit-inline
- توابع عضوی که در تعریف کلاس خود تعریف شدهاند، برای کدهای ماژولار بهطور ضمنی درونخطی نیستند. این رفتار به دلایل موجهی با رفتار سنتی C++ متفاوت است. با این حال، ممکن است هنگام انتقال کد (porting) باعث ایجاد دشواری شود. این گزینه اینگونه تعاریف توابع را بهطور ضمنی درونخطی میکند. اما این کار ناسازگاری در ABI ایجاد میکند، بنابراین باید در همهجا یا هیچجا استفاده شود. (چنین تعاریفی در خارج از یک ماژولِ دارای نام، در هر صورت بهطور ضمنی درونخطی باقی میمانند.)
- -fno-module-lazy
- وارد کردن تنبل ماژول (lazy module importing) و ایجاد نقشهبردار ماژول را غیرفعال کن.
- -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 در رفع مسئلهٔ اصلی شمارهٔ ۱۵۰، پارامترهای قالبِ قالب و آرگومانهای پیشفرض را فعال کن: این به یک قالب با آرگومانهای قالب پیشفرض اجازه میدهد به عنوان آرگومانی برای یک پارامتر قالبِ قالب با پارامترهای قالب کمتر استفاده شود. این پرچم بهطور پیشفرض برای -std=c++17 فعال است.
- -fno-nonansi-builtins
- اعلانهای توابع توکار (built-in) را که توسط استاندارد ANSI/ISO C الزامی نشدهاند غیرفعال کن. این توابع شامل "ffs"، "alloca"، "_exit"، "index"، "bzero"، "conjf"، و سایر توابع مرتبط هستند.
- -fnothrow-opt
- با مشخصهٔ استثنای throw() طوری رفتار کن که گویی یک مشخصهٔ "noexcept" است تا بار اضافی اندازهٔ بخش کد نسبت به تابعی بدون مشخصهٔ استثنا کاهش یابد یا حذف شود. اگر تابع دارای متغیرهای محلی با انواع دارای تخریبکنندههای غیربدیهی باشد، مشخصهٔ استثنا در واقع اندازهٔ تابع را کوچکتر میکند زیرا پاکسازیهای مدیریت استثنا (EH) برای آن متغیرها با بهینهسازی حذف میشوند. اثر معنایی این است که پرتاب یک استثنا به خارج از تابعی با چنین مشخصهای، به جای "unexpected" به فراخوانی "terminate" منجر میشود.
- -fno-operator-names
- کلمات کلیدی نام عملگرها یعنی "and"، "bitand"، "bitor"، "compl"، "not"، "or" و "xor" را به عنوان کلمات کلیدی هممعنی در نظر نگیر.
- -fno-optional-diags
- پیامهای تشخیصی که استاندارد میگوید کامپایلر نیازی به صدور آنها ندارد را غیرفعال کن. در حال حاضر، تنها پیام تشخیصی از این نوع که توسط G++ صادر میشود، مربوط به نامی است که چندین معنا در یک کلاس دارد.
- -fno-pretty-templates
- هنگامی که یک پیام خطا به تخصیصِ (specialization) یک قالب تابع ارجاع میدهد، کامپایلر بهطور معمول امضای قالب را به همراه آرگومانهای قالب و هرگونه typedef یا typename در امضا چاپ میکند (مثلاً "void f(T) [with T = int]" بهجای "void f(int)") تا مشخص شود کدام قالب درگیر است. هنگامی که یک پیام خطا به تخصیص یک قالب کلاس اشاره میکند، کامپایلر آرگومانهای قالبی را که با آرگومانهای پیشفرض آن قالب مطابقت دارند حذف میکند. اگر هر یک از این رفتارها درک پیام خطا را دشوارتر کند، میتوانید با -fno-pretty-templates آنها را غیرفعال کنید.
- -frange-for-ext-temps
- تمدید طول عمر اشیاء موقت در حلقههای range-based for زبان C++ را فعال کن. در -std=c++23 و بالاتر این رفتار بخشی از استاندارد زبان است، بنابراین طول عمر اشیاء موقت بهطور پیشفرض تا پایان حلقه تمدید میشود. این گزینه امکان فعالسازی این رفتار را در نگارشهای قدیمیتر استاندارد نیز فراهم میسازد.
- -fno-rtti
- تولید
اطلاعات
دربارهٔ هر
کلاس دارای
توابع
مجازی را
برای
استفاده
توسط
قابلیتهای
شناسایی
نوع در زمان
اجرای C++
("dynamic_cast" و
"typeid")
غیرفعال کن.
اگر از این
بخشهای
زبان
استفاده
نمیکنید،
میتوانید
با استفاده
از این پرچم
در فضای
خروجی
صرفهجویی
کنید. توجه
داشته
باشید که
مدیریت
استثناها
نیز از همین
اطلاعات
استفاده
میکند،
اما G++ آن را
در صورت
نیاز تولید
مینماید.
عملگر
"dynamic_cast"
همچنان
میتواند
برای
تبدیلهایی
که به
اطلاعات
نوع زمان
اجرا نیازی
ندارند،
مانند
تبدیل به
"void *" یا
به
کلاسهای
پایهٔ بدون
ابهام،
استفاده
شود.
ترکیب کدهای کامپایلشده با -frtti و کدهای کامپایلشده با -fno-rtti ممکن است درست کار نکند. برای مثال، اگر کلاسی که با -fno-rtti کامپایل شده به عنوان پایه برای کلاسی استفاده شود که با -frtti کامپایل شده است، برنامهها ممکن است در پیوند با شکست مواجه شوند.
- -fsized-deallocation
- اعلانهای
سراسری و
توکار
void operator delete (void *, std::size_t) noexcept; void operator delete[] (void *, std::size_t) noexcept;
را همانطور که در C++14 معرفی شده فعال کن. این برای توابع آزادسازی حافظهٔ جایگزین که توسط کاربر تعریف شدهاند و برای مثال از اندازهٔ شیء برای آزادسازی سریعتر استفاده میکنند، مفید است. این گزینه بهطور پیشفرض در -std=c++14 و بالاتر فعال است. پرچم -Wsized-deallocation در مورد جاهایی که ممکن است نیاز به افزودن یک تعریف داشته باشند، هشدار میدهد..IP -fstrict-enums 4 به کامپایلر اجازه میدهد با این فرض بهینهسازی کند که مقدار یک نوع شمارشی (enumerated type) تنها میتواند یکی از مقادیر همان شمارش باشد (همانگونه که در استاندارد C++ تعریف شده است؛ اساساً، مقداری که بتوان آن را با حداقل تعداد بیتهای لازم برای نمایش تمام شمارندهها نشان داد). اگر برنامه از تبدیل صریح (cast) برای تبدیل یک مقدار صحیح دلخواه به نوع شمارشی استفاده کند، این فرض ممکن است نامعتبر باشد. این گزینه هیچ تأثیری بر نوع شمارشی با نوع زیربنایی ثابت ندارد.
- -fstrong-eval-order
- -fstrong-eval-order=kind
- عبارتهای
دسترسی به
عضو،
اندیسگذاری
آرایه و
شیفت را به
ترتیب
چپ-به-راست
و
عبارتهای
انتساب را
به ترتیب
راست-به-چپ
ارزیابی
میکند،
همانطور
که برای C++17
تصویب شد.
-fstrong-eval-order معادل
-fstrong-eval-order=all است و
بهطور
پیشفرض در
-std=c++17 یا
بالاتر
فعال
میشود.
گزینهٔ -fstrong-eval-order=some تنها ترتیب دسترسی به اعضا و عبارتهای شیفت را فعال میکند، و حالت پیشفرض برای گویشهای C++ پیش از C++17 است.
گزینهٔ -fstrong-eval-order=none معادل با -fno-strong-eval-order است.
- -ftemplate-backtrace-limit=n
- حداکثر تعداد یادداشتهای نمونهسازی الگو (template instantiation notes) را برای یک هشدار یا خطای منفرد روی n تنظیم میکند. مقدار پیشفرض ۱۰ است.
- -ftemplate-depth=n
- حداکثر عمق نمونهسازی برای کلاسهای الگو را روی n تنظیم میکند. تعیین محدودیت برای عمق نمونهسازی الگو جهت شناسایی بازگشتهای بیپایان در حین نمونهسازی کلاسهای الگو ضروری است. برنامههای منطبق با استاندارد ANSI/ISO C++ نباید به حداکثر عمقی بیش از ۱۷ متکی باشند (که در C++11 به ۱۰۲۴ تغییر یافت). مقدار پیشفرض ۹۰۰ است، زیرا در برخی شرایط ممکن است کامپایلر پیش از رسیدن به ۱۰۲۴ با کمبود فضای پشته (stack) مواجه شود.
- -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 در
حالتی که
آدرسهای
دو تابع از
شیءهای
مشترک (shared objects)
متفاوتی
گرفته
شدهاند،
انجام
نمیدهد.
اثر این گزینه این است که GCC میتواند عملاً متدهای inline را با "__attribute__ ((visibility ("hidden")))" نشانهگذاری کند تا در جدول صدور یک DSO ظاهر نشوند و هنگام استفاده در درون همان DSO نیازی به ارجاع غیرمستقیم PLT نداشته باشند. فعال کردن این گزینه میتواند تأثیر چشمگیری بر زمان بارگذاری و پیوند (link) یک DSO بگذارد، چرا که در صورت استفادهٔ فراوان کتابخانه از الگوها، حجم جدول صدور پویا را به میزان زیادی کاهش میدهد.
رفتار این سوییچ دقیقاً مشابه نشانهگذاری مستقیم متدها بهعنوان hidden نیست، چرا که بر متغیرهای ایستای محلی تابع تأثیری نمیگذارد و سبب نمیشود کامپایلر نتیجه بگیرد که تابع تنها در یک شیء مشترک تعریف شده است.
میتوانید برای خنثی کردن اثر این سوییچ، دید (visibility) یک متد را بهطور صریح مشخص کنید. برای مثال، اگر میخواهید اشارهگرها به یک متد inline خاص را مقایسه کنید، میتوانید دید آن را بهطور صریح روی default قرار دهید. مشخص کردن دید صریح برای کلاس دربرگیرنده هیچ اثری نخواهد داشت.
متدهای درونخطی که بهطور صریح نمونهسازی شدهاند (explicitly instantiated) تحت تأثیر این گزینه قرار نمیگیرند، زیرا پیوند (linkage) آنها ممکن است از مرزهای کتابخانهٔ مشترک عبور کند.
- -fvisibility-ms-compat
- این پرچم
تلاش
میکند با
استفاده از
تنظیمات
دید، مدل
پیوند C++
کامپایلر GCC
را با مدل
پیوند Microsoft Visual Studio
سازگار کند.
این پرچم تغییرات زیر را در مدل پیوند GCC اعمال میکند:
- 1.
- دید پیشفرض را مانند -fvisibility=hidden روی "hidden" تنظیم میکند.
- 2.
- انواع (و نه اعضای آنها) بهطور پیشفرض پنهان نیستند.
- 3.
- قاعدهٔ تعریف واحد (ODR) برای انواعی که فاقد تعیین صریح دید هستند و در بیش از یک شیء مشترک تعریف شدهاند، تسهیل میشود: این اعلانها در صورتی که بدون استفاده از این گزینه مجاز باشند، مجاز شمرده میشوند.
در کدهای جدید، بهتر است از -fvisibility=hidden استفاده شود و کلاسهایی که قرار است بهطور بیرونی قابل مشاهده باشند، صادر شوند. متأسفانه این امکان وجود دارد که کدهایی، شاید بهطور تصادفی، به رفتار Visual Studio وابسته باشند.
از پیامدهای این تغییرات این است که اعضای دادهای ایستای یک نوع همنام که در اشیاء مشترک مختلفی تعریف شدهاند مستقل هستند، بنابراین تغییر یکی، دیگری را تغییر نمیدهد؛ و همچنین اشارهگرها به اعضای تابعی تعریفشده در اشیاء مشترک مختلف ممکن است در مقایسه برابر نباشند. با اعمال این پرچم، تعریف متفاوت انواعی با نام یکسان، نقض ODR محسوب میشود.
- -fno-weak
- از نمادهای ضعیف (weak symbols) استفاده نمیکند، حتی اگر پیونددهنده از آنها پشتیبانی کند. بهطور پیشفرض، G++ در صورت موجود بودن نمادهای ضعیف، از آنها استفاده میکند. این گزینه فقط برای مقاصد آزمایشی است و نباید توسط کاربران نهایی استفاده شود؛ چرا که منجر به تولید کدی ضعیفتر شده و هیچ مزیتی ندارد. این گزینه ممکن است در نگارشهای آیندهٔ G++ حذف شود.
- -fext-numeric-literals (فقط C++ و Objective-C++)
- پسوندهای لیترال عددی موهومی، ممیز ثابت یا تعریفشده توسط ماشین را به عنوان افزونههای GNU میپذیرد. هنگامی که این گزینه غیرفعال است، با این پسوندها مانند پسوندهای لیترال عددی تعریفشده توسط کاربر در C++11 رفتار میشود. این گزینه بهطور پیشفرض برای تمام گویشهای پیش از C++11 و تمام گویشهای GNU فعال است: -std=c++98، -std=gnu++98، -std=gnu++11، -std=gnu++14. این گزینه بهطور پیشفرض برای استانداردهای ISO C++11 به بعد (-std=c++11، ...) غیرفعال است.
- -nostdinc++
- در دایرکتوریهای استاندارد مختص C++ به دنبال فایلهای سرآیند نمیگردد، اما سایر دایرکتوریهای استاندارد را همچنان جستجو میکند. (این گزینه هنگام ساخت کتابخانهٔ C++ به کار میرود.)
- -flang-info-include-translate
- -flang-info-include-translate-not
- -flang-info-include-translate=header
- دربارهٔ رویدادهای ترجمهٔ include اطلاعرسانی میکند. حالت اول ترجمههای پذیرفتهشدهٔ include را ثبت میکند و حالت دوم ترجمههای ردشدهٔ include را گزارش میدهد. حالت header دربارهٔ ترجمههای include مربوط به آن سرآیند خاص اطلاعرسانی میکند. اگر header به شکل "user" یا "<system>" باشد، با استفاده از مسیر include به یک سرآیند کاربری یا سیستمی خاص تبدیل (resolve) میشود.
- -flang-info-module-cmi
- -flang-info-module-cmi=module
- ناممسیرهای رابط ماژول کامپایلشده (CMI) را گزارش میدهد. حالت اول تمام ناممسیرهای CMI خواندهشده را ثبت میکند. فرم module خوانده شدن CMI یک ماژول خاص را گزارش میدهد. module میتواند یک ماژول نامگذاریشده یا یک واحد سرآیند (header-unit) باشد (مورد دوم با داشتن جداکنندهٔ دایرکتوری در ناممسیر یا قرار گرفتن در "<>" یا "" مشخص میشود).
- -stdlib=libstdc++,libc++
- هنگامی که G++ برای پشتیبانی از این گزینه پیکربندی شده باشد، اجازهٔ تعیین کتابخانههای زماناجرای جایگزین C++ را میدهد. دو گزینه در دسترس است: libstdc++ (زماناجرای بومی و پیشفرض C++ برای G++) و libc++ که کتابخانهٔ زماناجرای C++ نصبشده روی برخی سیستمعاملها است (مانند نگارشهای Darwin از Darwin11 به بعد). این گزینه G++ را هدایت میکند تا از سرآیندهای کتابخانهٔ مشخصشده استفاده کند و هنگام نیاز به زماناجرای C++ برای پیوند، به ترتیب "-lstdc++" یا "-lc++" را صادر کند.
علاوه بر این، گزینههای هشدار زیر تنها برای برنامههای C++ معنی دارند:
- -Wabi-tag (فقط C++ و Objective-C++)
- هنگامی که نوعی با یک برچسب ABI در زمینهای استفاده شود که فاقد آن برچسب ABI است، هشدار میدهد. برای اطلاعات بیشتر در مورد برچسبهای ABI به C++ Attributes مراجعه کنید.
- -Wcomma-subscript (فقط C++ و Objective-C++)
- در مورد
استفاده از
عبارت
ویرگول در
یک عبارت
اندیسگذاری
هشدار
میدهد. این
کاربرد در C++20
منسوخ (deprecated)
شده و در C++23
حذف خواهد
شد. با این
حال، عبارت
ویرگولی که
درون "( )"
قرار گرفته
باشد منسوخ
نیست. مثال:
void f(int *a, int b, int c) { a[b,c]; // deprecated in C++20, invalid in C++23 a[(b,c)]; // OK }در C++23، وجود عبارتهای جداشده با کاما در داخل اندیس زمانی معتبر است که یک عملگر اندیس سربارگذاریشده یافت شود و از تعداد و انواع درست آرگومانها پشتیبانی کند. G++ این نحو پیشتر معتبر را برای کدهایی که در C++23 معتبر نیستند اما در C++20 معتبر ولی منسوخ بودند، همراه با یک هشدار سختگیرانه (pedantic) میپذیرد که میتوان آن را با -Wno-comma-subscript غیرفعال کرد.
این گزینه بهطور پیشفرض در -std=c++20 فعال است مگر با -Wno-deprecated، و پس از -std=c++23 بدون در نظر گرفتن -Wno-deprecated فعال میشود. پیش از -std=c++20، با استفاده از گزینهٔ صریح -Wdeprecated فعال میگردد.
این هشدار در حالت C++23 یا بالاتر توسط -pedantic-errors به یک خطا ارتقا مییابد..IP "-Wctad-maybe-unsupported (فقط C++ و Objective-C++)" 4 هنگام استنتاج آرگومان الگوی کلاس (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) به
یک شیء موقت
که طول عمر
آن به پایان
رسیده متصل
شود، هشدار
میدهد.
برای مثال:
int n = 1; const int& r = std::max(n - 1, n + 1); // r is dangling
در مثال بالا، دو شیء موقت ایجاد میشوند، یکی برای هر آرگومان، و مرجعی به یکی از این اشیاء موقت بازگردانده میشود. با این حال، هر دو شیء موقت در پایان عبارت کامل (full-expression) از بین میروند، بنابراین مرجع "r" معلق (dangling) میشود. این هشدار همچنین مراجع معلق را در فهرستهای مقداردهی اولیه اعضا تشخیص میدهد:
const int& f(const int& i) { return i; } struct S { const int &r; // r is dangling S() : r(f(10)) { } };توابع عضو نیز بررسی میشوند، اما فقط آرگومان شیء آنها:
struct S { const S& self () { return *this; } }; const S& s = S().self(); // s is danglingتوابع خاصی از این حیث ایمن هستند، به عنوان مثال "std::use_facet": آنها یک مرجع میگیرند و برمیگردانند، اما یکی از آرگومانهای خود را برنمیگردانند، که میتواند این هشدار را فریب دهد. چنین توابعی را میتوان با قرار دادن آنها در یک "#pragma" از هشدار مستثنی کرد:
#pragma GCC diagnostic push #pragma GCC diagnostic ignored "-Wdangling-reference" const T& foo (const T&) { ... } #pragma GCC diagnostic popدستور "#pragma" همچنین میتواند کلاس را در بر بگیرد؛ در این صورت، هشدار برای تمام توابع عضو غیرفعال خواهد شد.
-Wdangling-reference همچنین در مورد کدهایی مانند
auto p = std::minmax(1, 2);
هشدار میدهد، جایی که "std::minmax" مقدار "std::pair<const int&, const int&>" را برمیگرداند و هر دو مرجع پس از پایان عبارت کاملی که شامل فراخوانی "std::minmax" است، معلق میشوند.
این هشدار برای کلاسهای شبیه به "std::span" هشداری صادر نمیکند. کلاسهایی به فرم:
template<typename T> struct Span { T* data_; std::size len_; };به عنوان کلاسهای شبیه به "std::span" در نظر گرفته میشوند؛ به این معنی که کلاس یک نوع غیر-union است که دارای یک عضو دادهای اشارهگر و یک ویرانگر بدیهی (trivial) است.
این هشدار را میتوان با استفاده از ویژگی "gnu::no_dangling" غیرفعال کرد.
این هشدار توسط -Wextra فعال میشود.
- -Wdelete-non-virtual-dtor (فقط C++ و Objective-C++)
- زمانی که از "delete" برای تخریب نمونهای از کلاسی استفاده شود که دارای توابع مجازی و ویرانگر غیرمجازی است، هشدار میدهد. حذف نمونهای از یک کلاس مشتقشده از طریق اشارهگری به کلاس پایه در صورتی که کلاس پایه فاقد ویرانگر مجازی باشد ناامن است. این هشدار توسط -Wall فعال میشود.
- -Wdeprecated-copy (فقط C++ و Objective-C++)
- در C++11 به بعد، هشدار میدهد که اعلان ضمنی یک سازنده رونوشت (copy constructor) یا عملگر انتساب رونوشت (copy assignment operator) در صورتی که کلاس دارای یک سازنده رونوشت یا عملگر انتساب رونوشت ارائهشده توسط کاربر باشد، منسوخ شده است. این هشدار توسط -Wextra فعال میشود. با گزینهٔ -Wdeprecated-copy-dtor، در صورتی که کلاس دارای ویرانگر ارائهشده توسط کاربر باشد نیز منسوخ در نظر گرفته میشود.
- -Wno-deprecated-enum-enum-conversion (فقط C++ و Objective-C++)
- هشدار
مربوط به
حالتی را که
در آن
تبدیلات
محاسباتی
معمول (usual arithmetic conversions)
بر
عملوندهایی
اعمال
میشوند که
یکی از نوع
شمارشی و
دیگری از
نوع شمارشی
متفاوتی
است،
غیرفعال
میکند. این
تبدیل در 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++)
- هشدار
میدهد که
اعلان
عملگر لفظی
تعریفشده
توسط کاربر
(user-defined literal operator) با
وجود فاصله
پیش از
پسوند،
منسوخ شده
است. این
هشدار
بهطور
پیشفرض در
C++23، یا با
تعریف صریح
-Wdeprecated فعال
میشود.
string operator "" _i18n(const char*, std::size_t); // deprecated string operator ""_i18n(const char*, std::size_t); // preferred
- -Wdeprecated-variadic-comma-omission (فقط C++ و Objective-C++)
- هشدار
میدهد که
حذف ویرگول
قبل از
علامت
متغیر
"..." (varargs) در
پایان
فهرست
پارامترهای
تابع منسوخ
شده است.
این هشدار
بهطور
پیشفرض در
C++26 یا با
تعریف صریح
-Wdeprecated فعال
میشود.
void f1(int...); // deprecated void f1(int, ...); // preferred template <typename ...T> void f2(T...); // ok template <typename ...T> void f3(T......); // deprecated
- -Wno-elaborated-enum-base
- برای C++11 و بالاتر، در صورتی که یک enum-base اضافی (نامعتبر) در یک elaborated-type-specifier استفاده شود هشدار میدهد. یعنی اگر یک enum با نوع زیربنایی مشخص و بدون فهرست شمارندهها، در اعلانی غیر از صرفاً یک اعلان مستقل از همان enum استفاده شود. این گزینه بهطور پیشفرض فعال است. این هشدار با -pedantic-errors به یک خطا ارتقا مییابد.
- -Wno-init-list-lifetime (فقط C++ و Objective-C++)
- درباره مواردی از استفاده از "std::initializer_list" که احتمالاً منجر به اشارهگرهای معلق (dangling pointers) میشوند، هشدار نمیدهد. از آنجا که آرایه زیربنایی برای یک "initializer_list" مانند یک شیء موقت معمولی در C++ مدیریت میشود، بسیار محتمل است که اشارهگری به آن آرایه ناخواسته پس از پایان طول عمرش حفظ شود. برای مثال:
- اگر تابعی یک "initializer_list" موقت یا یک متغیر "initializer_list" محلی را برگرداند، طول عمر آرایه در پایان دستور return تمام میشود، بنابراین مقدار بازگرداندهشده دارای یک اشارهگر معلق است.
- اگر یک عبارت new یک "initializer_list" ایجاد کند، آرایه فقط تا پایان عبارت کامل دربرگیرنده زنده میماند، بنابراین "initializer_list" موجود در حافظه heap دارای یک اشارهگر معلق است.
- هنگامی که
به یک متغیر
"initializer_list"
مقداری از
یک فهرست
مقداردهی
محصور در
آکولاد
انتساب
داده شود،
آرایه موقت
ایجادشده
برای سمت
راست
انتساب فقط
تا پایان
عبارت کامل
زنده
میماند،
بنابراین
در دستور
بعدی متغیر
"initializer_list"
دارای یک
اشارهگر
معلق خواهد
بود.
// li's initial underlying array lives as long as li std::initializer_list<int> li = { 1,2,3 }; // assignment changes li to point to a temporary array li = { 4, 5 }; // now the temporary is gone and li has a dangling pointer int i = li.begin()[0] // undefined behavior هنگامی که یک سازنده فهرست (list constructor)، اشارهگر "begin" را از آرگومان "initializer_list" ذخیره میکند، این کار طول عمر آرایه را افزایش نمیدهد؛ بنابراین اگر یک متغیر کلاس از یک "initializer_list" موقت ساخته شود، اشارهگر در انتهای عبارت اعلان متغیر معلق (dangling) باقی میماند.
- -Winvalid-constexpr
-
زمانی که یک تابع هرگز عبارت ثابتی (constant expression) تولید نمیکند، هشدار میدهد. در C++20 و نسخههای پیشین، برای هر تابع و الگوی تابع "constexpr"، باید حداقل یک مجموعه از آرگومانهای تابع در حداقل یک نمونهسازی (instantiation) وجود داشته باشد به طوری که فراخوانی تابع یا سازنده بتواند یک زیرعبارت ارزیابیشده از یک عبارت ثابت اصلی (core constant expression) باشد. C++23 این محدودیت را حذف کرد، بنابراین امکان دارد تابع یا الگوی تابعی با علامت "constexpr" وجود داشته باشد که هیچ فراخوانیای از آن شرایط یک عبارت ثابت اصلی را برآورده نکند. این هشدار به طور پیشفرض در C++20 و نسخههای پیشین به عنوان یک هشدار pedantic فعال است. در C++23، میتوان -Winvalid-constexpr را روشن کرد که در این صورت یک هشدار معمولی خواهد بود. برای مثال: void f (int& i); constexpr void g (int& i) { // Warns by default in C++20, in C++23 only with -Winvalid-constexpr. f(i); }
- -Winvalid-imported-macros
- معتبر بودن تمام تعریفهای ماکروهای واردشده (imported) را در پایان کامپایل بررسی میکند. این گزینه به طور پیشفرض فعال نیست، زیرا تعیین آن نیازمند پردازش اضافی است. این گزینه ممکن است هنگام آمادهسازی مجموعههایی از header-unitها برای اطمینان از سازگاری ماکروها مفید باشد.
- -Wno-literal-suffix (فقط C++ و Objective-C++)
- هنگامی که
پس از یک
لیترال
رشتهای یا
نویسهای،
یک ud-suffix
میآید که
با زیرخط (underscore)
شروع
نمیشود،
هشدار
نمیدهد. به
عنوان یک
افزونه
منطبق بر
استاندارد،
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) یا
حذفشده یا
انتساب
رونوشت (copy assignment)
کلاس را دور
بزند،
درستیِ const (یا
const-correctness) یا
کپسولهسازی
را نقض کند،
یا
اشارهگرهای
جدول مجازی
(vtable) را مخدوش
سازد. تغییر
نمایش (representation)
چنین
اشیایی
ممکن است
نامتغیرهایی
(invariants) را که
توسط توابع
عضو کلاس
حفظ
میشوند
نقض کند.
برای مثال،
فراخوانی
زیر برای
"memset"
تعریفنشده
(undefined) است زیرا
یک شیء
غیربدیهی
از کلاس را
تغییر
میدهد و
بنابراین
تشخیص داده
میشود. روش
ایمن برای
مقداردهی
اولیه یا
پاکسازی
حافظهٔ
اشیایی از
این انواع،
استفاده از
سازنده یا
عملگر
انتساب
مناسب در
صورت وجود
است.
std::string str = "abc"; memset (&str, 0, sizeof str);
گزینهٔ -Wclass-memaccess توسط -Wall فعال میشود. تبدیل نوع صریح (cast) اشارهگر شیء کلاس به "void *" یا به نوعی که بتواند به صورت ایمن توسط تابع حافظه خام دسترسی یابد، این هشدار را سرکوب میکند.
- -Wnon-virtual-dtor (فقط C++ و Objective-C++)
- هشدار میدهد زمانی که یک کلاس دارای توابع مجازی و یک مخرب غیرمجازی در دسترس درون خود یا در یک کلاس پایه چندریختی (polymorphic) در دسترس باشد؛ که در این صورت حذف یک نمونه از کلاس مشتقشده از طریق اشارهگری به خود کلاس یا کلاس پایه امکانپذیر ولی ناامن است. این هشدار در صورت تعیین -Weffc++ به طور خودکار فعال میشود. گزینهٔ -Wdelete-non-virtual-dtor (فعالشده توسط -Wall) باید ترجیح داده شود زیرا بدون هشدارهای کاذب (false positives) درباره موارد ناامن هشدار میدهد.
- -Wregister (فقط C++ و Objective-C++)
- در مورد استفاده از مشخصکننده رده حافظه "register" هشدار میدهد، مگر زمانی که بخشی از افزونهٔ GNU با عنوان Explicit Register Variables باشد. استفاده از کلیدواژهٔ "register" به عنوان مشخصکننده رده حافظه در C++11 منسوخ شده و در C++17 حذف شده است. به طور پیشفرض با -std=c++17 فعال است.
- -Wreorder (فقط C++ و Objective-C++)
- هشدار
میدهد
زمانی که
ترتیب
مقداردهندههای
اعضا (member initializers)
مشخصشده
در کد با
ترتیبی که
باید اجرا
شوند
مطابقت
ندارد. برای
مثال:
struct A { int i; int j; A(): j (0), i (1) { } };کامپایلر مقداردهندههای اعضا را برای "i" و "j" بازآرایی میکند تا با ترتیب اعلان اعضا مطابقت داشته باشد و هشداری در این خصوص صادر میکند. این هشدار توسط -Wall فعال میشود.
- -Wno-pessimizing-move (فقط C++ و Objective-C++)
- این هشدار
زمانی
اعلان
میشود که
فراخوانی
"std::move"
مانع از حذف
رونوشت (copy elision)
شود. یک
سناریوی
متداول که
در آن copy elision
میتواند
رخ دهد،
هنگام
بازگشت از
تابعی با
نوع
بازگشتی
کلاس است؛
زمانی که
عبارت در
حال
بازگشت،
نام یک شیء
خودکار (automatic)
غیر volatile بوده،
پارامتر
تابع نباشد
و نوعی
یکسان با
نوع
بازگشتی
تابع داشته
باشد.
struct T { ... }; T fn() { T t; ... return std::move (t); }اما در این مثال، فراخوانی "std::move" مانع از copy elision میشود.
این هشدار توسط -Wall فعال میشود.
- -Wno-redundant-move (فقط C++ و Objective-C++)
- این هشدار
درباره
فراخوانیهای
زائد
"std::move"
هشدار
میدهد؛
یعنی زمانی
که عملیات
انتقال حتی
بدون
فراخوانی
"std::move" نیز
انجام
میشد. این
اتفاق به
این دلیل رخ
میدهد که
کامپایلر
در
موقعیتهای
خاصی مانند
بازگرداندن
یک متغیر
محلی، در
جایی که copy elision
امکانپذیر
نیست،
مجبور است
با شیء طوری
رفتار کند
که گویی یک 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); }در این مثال، copy elision قابل اعمال نیست زیرا نوع عبارت در حال بازگشت و نوع بازگشتی تابع با یکدیگر تفاوت دارند، با این حال G++ با مقدار بازگشتی طوری رفتار میکند که گویی توسط یک rvalue مشخص شده است.
این هشدار توسط -Wextra فعال میشود..IP "-Wrange-loop-construct (فقط C++ و Objective-C++)" 4 این هشدار زمانی اعلام میشود که یک حلقهٔ for مبتنی بر دامنه (range-based for-loop) در ++C یک رونوشت غیرضروری ایجاد کند. این امر میتواند زمانی رخ دهد که اعلان دامنه یک ارجاع نباشد، در حالی که احتمالاً باید ارجاع باشد. برای مثال:
struct S { char arr[128]; }; void fn () { S arr[5]; for (const auto x : arr) { ... } }هنگامی که نوع کپیشده یک نوع سادهرونوشتپذیر (trivially-copyable) با اندازه کمتر از ۶۴ بایت باشد، هشداری داده نمیشود.
این هشدار همچنین زمانی اعلام میشود که یک متغیر حلقه در یک حلقهٔ for مبتنی بر دامنه با مقداری از یک نوع متفاوت مقداردهی اولیه شده و منجر به ایجاد یک رونوشت گردد. برای مثال:
void fn() { int arr[10]; for (const double &x : arr) { ... } }در مثال بالا، در هر تکرار حلقه یک مقدار موقت از نوع "double" ایجاد و نابود میشود که ارجاع "const double &" به آن مقید شده است.
این هشدار توسط -Wall فعال میشود.
- -Wredundant-tags (فقط C++ و Objective-C++)
- دربارهٔ
class-key و
enum-key اضافی
در ارجاع به
انواع
کلاسی و
انواع
شمارشی در
زمینههایی
که این کلید
میتواند
بدون ایجاد
ابهام حذف
شود، هشدار
میدهد.
برای مثال:
struct foo; struct foo *p; // warn that keyword struct can be eliminated
از سوی دیگر، در این مثال هیچ هشداری وجود ندارد:
struct foo; void foo (); // "hides" struct foo void bar (struct foo&); // no warning, keyword struct is necessary
- -Wno-subobject-linkage (فقط C++ و Objective-C++)
- هشدار ندهد اگر یک نوع کلاسی دارای یک پایه یا فیلدی باشد که نوع آن از فضای نام ناشناس (anonymous namespace) استفاده میکند یا به نوعی بدون پیوند (linkage) وابسته است. اگر یک نوع A به نوع B فاقد پیوند یا با پیوند داخلی (internal linkage) وابسته باشد، تعریف آن در چندین واحد ترجمه نقض قاعدهٔ ODR خواهد بود، زیرا معنای B در هر واحد ترجمه متفاوت است. اگر A فقط در یک واحد ترجمه ظاهر شود، بهترین روش برای فرونشاندن هشدار این است که با قرار دادن آن در یک فضای نام ناشناس، به آن نیز پیوند داخلی داده شود. کامپایلر این هشدار را برای انواع تعریفشده در فایل اصلی .C صادر نمیکند، چرا که بعید است تعاریف متعددی داشته باشند. -Wsubobject-linkage به طور پیشفرض فعال است.
- -Weffc++ (فقط C++ و Objective-C++)
- دربارهٔ نقض رهنمودهای شیوهنامهای زیر از مجموعه کتابهای Effective C++ اثر Scott Meyers هشدار میدهد:
- برای کلاسهای دارای حافظه با تخصیص پویا، یک سازندهٔ رونوشت (copy constructor) و یک عملگر انتساب (assignment operator) تعریف کنید.
- در سازندهها، مقداردهی اولیه (initialization) را به انتساب (assignment) ترجیح دهید.
- کاری کنید که "operator=" ارجاعی به *this بازگرداند.
- هنگامی که باید یک شیء بازگردانید، سعی نکنید یک ارجاع بازگردانید.
- میان فرمهای پیشوندی و پسوندی عملگرهای افزایش و کاهش تمایز قائل شوید.
- هرگز "&&"، "||" یا "," را سربارگذاری (overload) نکنید.
این گزینه همچنین -Wnon-virtual-dtor را فعال میکند که آن هم یکی از توصیههای Effective C++ است. با این حال، این بررسی گسترش یافته تا دربارهٔ عدم وجود مخرب مجازی در کلاسهای پایهٔ غیرچندریختی (non-polymorphic) قابلدسترس نیز هشدار دهد.
هنگام انتخاب این گزینه آگاه باشید که سرایندهای کتابخانهٔ استاندارد از همهٔ این رهنمودها پیروی نمیکنند؛ برای پالایش و حذف این هشدارها از grep -v استفاده کنید.
- -Wno-exceptions (فقط C++ و Objective-C++)
- هشدار مربوط به حالتی را که در آن یک گردانندهٔ استثنا (exception handler) توسط گردانندهٔ دیگری پوشانده (shadow) میشود، غیرفعال میکند؛ وضعیتی که میتواند نشاندهندهٔ ترتیب نادرست گردانندههای استثنا باشد.
- -Wstrict-null-sentinel (فقط C++ و Objective-C++)
- دربارهٔ استفاده از "NULL" تبدیلنوعنیافته به عنوان نگهبان (sentinel) هشدار میدهد. هنگام کامپایل صرفاً با GCC، این یک نگهبان معتبر است، زیرا "NULL" به صورت "__null" تعریف شده است. هرچند که این مقدار به جای یک اشارهگر تهی، یک ثابت اشارهگر تهی است، اما تضمین میشود که هماندازه با یک اشارهگر باشد. با این وجود، این کاربرد در میان کامپایلرهای مختلف سازگار و قابلحمل (portable) نیست.
- -Wno-non-template-friend (فقط C++ و Objective-C++)
- هنگام اعلان توابع دوست غیرقالب درون یک قالب، هشدارها را غیرفعال میکند. در نسخههای بسیار قدیمی GCC که پیش از پیادهسازی استاندارد ISO بودند، اعلانهایی مانند friend int foo(int) که در آنها نام دوست یک unqualified-id است، میتوانست به عنوان یک تخصیص (specialization) خاص از یک تابع قالب تفسیر شود؛ این هشدار برای تشخیص مشکلات سازگاری وجود دارد و به طور پیشفرض فعال است.
- -Wold-style-cast (فقط C++ و Objective-C++)
- اگر یک تبدیل نوع سبک قدیم (سبک C) به یک نوع غیر void در یک برنامهٔ ++C استفاده شود، هشدار میدهد. تبدیل نوعهای سبک جدید ("dynamic_cast"، "static_cast"، "reinterpret_cast" و "const_cast") کمتر در معرض اثرهای ناخواسته هستند و جستجوی آنها بسیار آسانتر است.
- -Woverloaded-virtual (فقط C++ و Objective-C++)
- -Woverloaded-virtual=n
- زمانی که یک
اعلان
تابع،
توابع
مجازی یک
کلاس پایه
را پنهان
میکند،
هشدار
میدهد.
برای مثال
در:
struct A { virtual void f(); }; struct B: public A { void f(int); // does not override };نسخهٔ کلاس "A" از تابع "f" در "B" پنهان میشود و کدی مانند:
B* b; b->f();
در کامپایل با شکست مواجه میشود.
در مواردی که امضاهای متفاوت تصادفی نیستند، سادهترین راهحل افزودن یک اعلان using به کلاس مشتقشده است تا تابع پایه را از حالت پنهان خارج کند؛ مثلاً افزودن "using A::f;" به "B".
پسوند اختیاری سطح، رفتار را زمانی کنترل میکند که تمام اعلانهای کلاس مشتقشده توابع مجازی کلاس پایه را بازنویسی (override) کنند، حتی اگر همهٔ توابع پایه بازنویسی نشده باشند:
struct C { virtual void f(); virtual void f(int); }; struct D: public C { void f(int); // does override }احتمال اینکه این الگو یک اشتباه باشد کمتر است؛ اگر از D فقط به صورت مجازی استفاده شود، ممکن است کاربر تشخیص داده باشد که معناشناسی کلاس پایه برای برخی از سربارگذاریها مناسب است.
در سطح ۱، این حالت هشداری تولید نمیکند؛ در سطح ۲ هشدار میدهد. گزینهٔ -Woverloaded-virtual به تنهایی سطح ۲ را انتخاب میکند. سطح ۱ در -Wall گنجانده شده است.
- -Wno-pmf-conversions (فقط C++ و Objective-C++)
- پیام تشخیصی برای تبدیل یک اشارهگر مقید به تابع عضو به یک اشارهگر معمولی را غیرفعال میکند.
- -Wsign-promo (فقط C++ و Objective-C++)
- زمانی هشدار میدهد که در تفکیک بارگذاری بیش از حد (overload resolution)، ارتقا از یک نوع بدون علامت یا شمارشی به یک نوع علامتدار بر تبدیل به نوع بدون علامت با همان اندازه ترجیح داده شود. نسخههای قبلی G++ تلاش میکردند بدون علامت بودن را حفظ کنند، اما استاندارد رفتار فعلی را الزام میکند.
- -Wtemplates (فقط C++ و Objective-C++)
- هنگامی که با اعلان یک قالب اولیه (primary template) مواجه میشود، هشدار میدهد. برخی از قواعد کدنویسی استفاده از قالبها را منع میکنند و این گزینه میتواند برای اعمال آن قاعده استفاده شود. این هشدار در داخل فایلهای سرایند سیستم، مانند STL، غیرفعال است، بنابراین همچنان میتوان از STL استفاده کرد. همچنین میتوان قالبها را نمونهسازی (instantiate) یا تخصیص (specialize) داد.
- -Wmismatched-new-delete (فقط C++ و Objective-C++)
- دربارهٔ
عدم تطابق
میان
فراخوانیهای
"operator new" یا
"operator delete" و
فراخوانی
متناظر با
تابع تخصیص
یا
آزادسازی
حافظه
هشدار
میدهد. این
شامل
فراخوانیهای
"operator delete" در ++C
با
اشارهگرهای
بازگرداندهشده
از فرمهای
ناسازگار
"operator new"، یا
از توابع
دیگری است
که اشیایی
را تخصیص
میدهند که
"operator delete"
برای آنها
آزادساز
مناسبی
نیست، و
همچنین
فراخوانی
سایر توابع
آزادسازی
با
اشارهگرهای
بازگرداندهشده
از "operator new"
که تابع
آزادسازی
برای آنها
مناسب نیست.
برای مثال، عبارت "delete" در تابع زیر تشخیص داده میشود زیرا با شکل آرایهای عبارت "new" که آرگومان اشارهگر از آن بازگردانده شده بود، تطابق ندارد. به همین ترتیب، فراخوانی "free" نیز تشخیص داده میشود.
void f () { int *a = new int[n]; delete a; // warning: mismatch in array forms of expressions char *p = new char[n]; free (p); // warning: mismatch between new and free }گزینهٔ مرتبط -Wmismatched-dealloc عدم تطابقهای شامل توابع تخصیص و آزادسازی غیر از "operator new" و "operator delete" را تشخیص میدهد.
-Wmismatched-new-delete در -Wall گنجانده شده است..IP "-Wmismatched-tags (فقط C++ و Objective-C++)" 4 در مورد اعلانهای structها، classها و الگوهای کلاس (class templates) و تخصیصهای اختصاصی (specializations) آنها که دارای یک class-key هستند که با تعریف یا با اولین اعلان (در صورتی که تعریفی ارائه نشده باشد) مطابقت ندارد، هشدار میدهد.
به عنوان مثال، اعلان "struct Object" در فهرست آرگومانهای "draw" این هشدار را فعال میکند. برای جلوگیری از آن، یا class-key زائد "struct" را حذف کنید یا آن را با "class" جایگزین نمایید تا با تعریف آن مطابقت داشته باشد.
class Object { public: virtual ~Object () = 0; }; void draw (struct Object*);اعلان یک کلاس با class-key "struct" همانطور که مثال بالا نشان میدهد اشتباه نیست. گزینه -Wmismatched-tags با هدف کمک به دستیابی به شیوهای یکدست در اعلانهای کلاس در نظر گرفته شده است. در کدهایی که قرار است برای کامپایلرهای مبتنی بر Windows قابل حمل باشند، این هشدار به جلوگیری از ارجاعهای حلنشده (unresolved references) ناشی از تفاوت در درهمسازی نمادهای (symbol mangling) اعلانشده با class-keyهای متفاوت کمک میکند. این گزینه میتواند به تنهایی یا همراه با -Wredundant-tags استفاده شود.
- -Wmultiple-inheritance (فقط C++ و Objective-C++)
- هنگامی که کلاسی با چندین کلاس پایه مستقیم تعریف شود هشدار میدهد. برخی از قواعد کدنویسی وراثت چندگانه را مجاز نمیدانند، و از این گزینه میتوان برای اعمال آن قاعده استفاده کرد. این هشدار در داخل فایلهای سرایند سیستم، مانند STL، غیرفعال است، بنابراین همچنان میتوان از STL استفاده کرد. همچنین میتوان کلاسهایی تعریف کرد که بهطور غیرمستقیم از وراثت چندگانه استفاده میکنند.
- -Wvirtual-inheritance
- هنگامی که کلاسی با یک کلاس پایه مستقیم مجازی تعریف شود هشدار میدهد. برخی از قواعد کدنویسی وراثت چندگانه را مجاز نمیدانند، و از این گزینه میتوان برای اعمال آن قاعده استفاده کرد. این هشدار در داخل فایلهای سرایند سیستم، مانند STL، غیرفعال است، بنابراین همچنان میتوان از STL استفاده نمود. همچنین میتوان کلاسهایی تعریف کرد که بهطور غیرمستقیم از وراثت مجازی استفاده میکنند.
- -Wno-virtual-move-assign
- هشدارهای مربوط به ارثبری از یک پایه مجازی با عملگر انتساب انتقال (move assignment) غیرساده (non-trivial) در C++11 را سرکوب میکند. این حالت خطرناک است زیرا اگر کلاس پایه مجازی از بیش از یک مسیر قابل دسترسی باشد، چندین بار منتقل (move) میشود، که میتواند بدین معنا باشد که هر دو شیء در وضعیت انتقالیافته (moved-from) قرار میگیرند. اگر عملگر انتساب انتقال طوری نوشته شده باشد که از انتقال یک شیءِ از قبل منتقلشده جلوگیری کند، میتوان این هشدار را غیرفعال کرد.
- -Wnamespaces
- هنگامی که تعریف یک فضای نام باز میشود هشدار میدهد. برخی از قواعد کدنویسی فضاهای نام را مجاز نمیدانند، و از این گزینه میتوان برای اعمال آن قاعده استفاده کرد. این هشدار در داخل فایلهای سرایند سیستم، مانند 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
- هنگامی که
بدنه یک
الگو،
افشای یک
موجودیت
محلی برای
واحد ترجمه
(translation-unit-local) را
پنهان
میکند
هشدار
میدهد. در
بیشتر
موارد،
ارجاع به یک
موجودیت
محلی برای
واحد ترجمه
(مانند یک
اعلان با
پیوند
درونی / internal linkage)
در داخل
موجودیتی
که در CMI یک
ماژول
منتشر
میشود یک
خطا است. با
این حال،
درون
مقداردهنده
اولیه یک
متغیر یا در
بدنه یک
تابع غیر
درونخطی
(non-inline)، این یک
افشا محسوب
نمیشود و
خطایی صادر
نخواهد شد.
اگر الگوهای متغیر یا تابع به چنین موجودیتی ارجاع دهند، این امر میتواند باعث شود که به طور تصادفی غیرقابل استفاده شوند، زیرا سایر واحدهای ترجمه که الگو را وارد (import) میکنند هرگز قادر به نمونهسازی آن نخواهند بود. این هشدار تلاش میکند مواردی را که ممکن است این اتفاق بیفتد تشخیص دهد. وجود یک نمونهسازی صریح (explicit instantiation) این هشدار را بیاثر میکند.
این پرچم توسط -Wextra فعال میشود.
- -Wno-terminate (فقط C++ و Objective-C++)
- هشدار در مورد عبارت throw که بلافاصله منجر به فراخوانی "terminate" میشود را غیرفعال میکند.
- -Wno-vexing-parse (فقط C++ و Objective-C++)
- درباره
ابهام نحوی
«آزاردهندهترین
تجزیه» (most vexing parse)
هشدار
میدهد. این
هشدار در
مواردی
داده
میشود که
یک اعلان
شبیه به
تعریف یک
متغیر به
نظر
میرسد،
اما زبان C++
ایجاب
میکند که
به عنوان
اعلان تابع
تفسیر شود.
به عنوان
مثال:
void f(double a) { int i(); // extern int i (void); int n(int(a)); // extern int n (int); }مثالی دیگر:
struct S { S(int); }; void f(double a) { S x(int(a)); // extern struct S x (int); S y(int()); // extern struct S y (int (*) (void)); S z(); // extern struct S z (void); }این هشدار گزینههایی را برای نحوه برخورد با چنین ابهامی پیشنهاد میدهد؛ برای نمونه، میتواند حذف پرانتزها یا استفاده از آکولادها بهجای آن را پیشنهاد کند.
این هشدار به طور پیشفرض فعال است.
- -Wno-class-conversion (فقط C++ و Objective-C++)
- زمانی که یک تابع تبدیل (conversion function) یک شیء را به همان نوع، به یک کلاس پایه از آن نوع، یا به void تبدیل میکند، هشدار نمیدهد؛ چنین تابع تبدیلی هرگز فراخوانی نخواهد شد.
- -Wvolatile (فقط C++ و Objective-C++)
- درباره
استفادههای
منسوخشده
از
توصیفگر
"volatile"
هشدار
میدهد. این
شامل
عبارتهای
پسوندی و
پیشوندی
"++" و
"--" برای
نوعهای
دارای
توصیفگر
"volatile"،
استفاده از
انتسابهای
ساده در
جایی که
عملوند چپ
یک نوع
غیرکلاسی
مقید به
"volatile"
برای مقدار
آنها است،
انتسابهای
ترکیبی که
عملوند چپ
آنها یک
نوع
غیرکلاسی
مقید به
"volatile"
است، نوع
بازگشتی
تابع مقید
به "volatile"،
نوع
پارامتر
مقید به
"volatile"، و
پیوندهای
ساختاریافته
(structured bindings) از یک
نوع مقید به
"volatile"
میشود. این
کاربرد در C++20
منسوخ شده
است.
به طور پیشفرض با -std=c++20 فعال است. پیش از -std=c++20، با استفاده صریح از -Wdeprecated فعال میشود.
- -Waligned-new
- درباره
عبارت new از
نوعی که
نیاز به
ترازی (alignment)
بیشتر از
alignof(std::max_align_t)
دارد اما از
یک تابع
تخصیص بدون
پارامتر
همترازی
صریح
استفاده
میکند،
هشدار
میدهد. این
گزینه توسط
-Wall فعال
میشود.
به طور معمول این گزینه فقط درباره توابع تخصیص سراسری هشدار میدهد، اما -Waligned-new=all درباره توابع تخصیص عضو کلاس نیز هشدار میدهد.
- -Wno-placement-new
- -Wplacement-new=n
- درباره
عبارتهای
placement new با رفتار
تعریفنشده
(undefined behavior)، مانند
ساخت یک شیء
در بافری که
از اندازه
نوع شیء
کوچکتر
است، هشدار
میدهد. به
عنوان
مثال،
عبارت placement new
زیر اخطار
دریافت
میکند
زیرا تلاش
میکند
آرایهای
از ۶۴ عدد
صحیح را در
بافری با
اندازه فقط
۶۴ بایت
بسازد.
char buf [64]; new (buf) int[64];
این هشدار به طور پیشفرض فعال است.
- -Wplacement-new=1
- این سطح
هشدار
پیشفرض
برای -Wplacement-new
است. در این
سطح، هشدار
برای برخی
ساختارهای
اکیداً
تعریفنشده
که GCC آنها
را به عنوان
افزونه جهت
سازگاری با
کدهای
قدیمی مجاز
میداند
صادر
نمیشود. به
عنوان
مثال،
عبارت
"new" زیر
در این سطح
تشخیص داده
نمیشود
حتی اگر بر
اساس
استاندارد
C++ دارای
رفتار
تعریفنشده
باشد زیرا
فراتر از
انتهای
آرایه
تکعنصری
مینویسد.
struct S { int n, a[1]; }; S *s = (S *)malloc (sizeof *s + 31 * sizeof s->a[0]); new (s->a)int [32](); - -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=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) توسط کامپایلر حذف (delete) میشود، هشدار میدهد. این وضعیت زمانی رخ میدهد که نوع اعلانشده تابع با نوع تابعی که بهطور ضمنی اعلان میشد مطابقت نداشته باشد. این هشدار بهطور پیشفرض فعال است.
- -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 را در مواردی که کلاس پایه به ارثرسیده دارای سازنده چندآرگومانی (variadic) به سبک C باشد، فرو مینشاند؛ این هشدار بهطور پیشفرض فعال است زیرا علامت سهنقطه (ellipsis) به ارث برده نمیشود.
- -Wno-invalid-offsetof (فقط C++ و Objective-C++)
- هشدارهای
ناشی از
اعمال
ماکروی
"offsetof" روی
یک نوع غیر-POD
را
فرومینشاند.
بر اساس
استاندارد
ISO C++ سال ۲۰۱۴،
اعمال
"offsetof" روی
یک نوع
دارای
چیدمان
غیراستاندارد
(non-standard-layout)
تعریفنشده
است. با این
حال، در
پیادهسازیهای
موجود C++،
معمولاً
"offsetof"
نتایج
معناداری
ارائه
میدهد. این
پرچم برای
کاربرانی
است که
آگاهند در
حال نوشتن
کدی
غیرقابلحمل
هستند و
عمداً
تصمیم
گرفتهاند
هشدار
مربوط به آن
را نادیده
بگیرند.
محدودیتهای مربوط به "offsetof" ممکن است در نسخههای آینده استاندارد C++ تسهیل شوند.
- -Wsized-deallocation (فقط C++ و Objective-C++)
- درباره
تعریف تابع
آزادسازی
حافظه بدون
اندازه (unsized deallocation)
void operator delete (void *) noexcept; void operator delete[] (void *) noexcept;
بدون تعریفی برای تابع متناظر آزادسازی با اندازه (sized deallocation)
void operator delete (void *, std::size_t) noexcept; void operator delete[] (void *, std::size_t) noexcept;
یا برعکس، هشدار میدهد. توسط -Wextra به همراه -fsized-deallocation فعال میشود.
- -Wsuggest-final-types
- درباره نوعهایی با متدهای مجازی هشدار میدهد که در صورت اعلان نوع با مشخصکننده "final" در C++11، یا در صورت امکان، اعلان آن در یک فضای نام ناشناس (anonymous namespace)، کیفیت کد بهبود مییابد. این قابلیت به GCC امکان میدهد تا با شدت بیشتری فراخوانیهای چندریختی را مجازیزدایی (devirtualize) کند. این هشدار در هنگام بهینهسازی زمان پیوند (link-time optimization)، که اطلاعات مربوط به گراف سلسلهمراتب کلاسها کاملتر است، اثربخشی بیشتری دارد.
- -Wsuggest-final-methods
- درباره متدهای مجازی هشدار میدهد که در صورت اعلان متد با مشخصکننده "final" در C++11، یا در صورت امکان، اعلان نوع آن در یک فضای نام ناشناس یا با مشخصکننده "final"، کیفیت کد بهبود مییابد. این هشدار در هنگام بهینهسازی زمان پیوند، که اطلاعات مربوط به گراف سلسلهمراتب کلاسها در آن کاملتر است، اثربخشی بیشتری دارد. توصیه میشود ابتدا پیشنهادهای -Wsuggest-final-types را بررسی کرده و سپس با نشانهگذاریهای جدید مجدداً پروژه را بسازید.
- -Wsuggest-override
- درباره توابع مجازی بازنویسیکنندهای (overriding) که با کلیدواژه "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 سنتی (۳۲ بیتی) بدون پشتیبانی از خصوصیات و دیگر افزونههای Objective-C 2.0 است. نسخه 1 ABI سنتی (۳۲ بیتی) همراه با پشتیبانی از خصوصیات و دیگر افزونههای Objective-C 2.0 است. نسخه 2 ABI مدرن (۶۴ بیتی) است. اگر چیزی مشخص نشود، پیشفرض روی ماشینهای هدف ۳۲ بیتی نسخه 0، و روی ماشینهای هدف ۶۴ بیتی نسخه 2 خواهد بود.
- -fobjc-call-cxx-cdtors
- برای هر
کلاس Objective-C،
بررسی
میکند که
آیا متغیری
از
متغیرهای
نمونه آن یک
شیء C++ با
سازنده
پیشفرض
غیربدیهی
هست یا خیر.
در این
صورت، یک
متد نمونه
ویژه به نام
"- (id) .cxx_construct" را
سنتز
میکند که
سازندههای
پیشفرض
غیربدیهی
را روی هر
یک از این
متغیرهای
نمونه به
ترتیب اجرا
کرده و سپس
"self" را
بازمیگرداند.
به طور
مشابه،
بررسی
میکند که
آیا متغیر
نمونهای
شیء C++ با
ویرانکننده
غیربدیهی
است یا خیر،
و در این
صورت، یک
متد ویژه به
نام "- (void)
.cxx_destruct" را
سنتز
میکند که
تمام این
ویرانکنندههای
پیشفرض را
به ترتیب
معکوس اجرا
مینماید.
متدهای "- (id) .cxx_construct" و "- (void) .cxx_destruct" که بدین ترتیب تولید میشوند، تنها روی متغیرهای نمونه اعلانشده در کلاس فعلی Objective-C عمل میکنند، نه مواردی که از ابرکلاسها به ارث رسیدهاند. فراخوانی تمام این متدها در سلسلهمراتب توارث یک شیء بر عهده زمان اجرای Objective-C است. متدهای "- (id) .cxx_construct" بلافاصله پس از تخصیص یک نمونه شیء جدید توسط زمان اجرا فراخوانی میشوند؛ متدهای "- (void) .cxx_destruct" نیز بلافاصله پیش از آنکه زمان اجرا نمونه شیء را آزادسازی کند، فراخوانی میگردند.
تا زمان نگارش این مستند، تنها زمان اجرای NeXT در Mac OS X 10.4 و جدیدتر از فراخوانی متدهای "- (id) .cxx_construct" و "- (void) .cxx_destruct" پشتیبانی میکند.
- -fobjc-direct-dispatch
- امکان پرشهای سریع به ارسالکننده پیام را فراهم میسازد. در Darwin این امر از طریق comm page محقق میشود.
- -fobjc-exceptions
- پشتیبانی نحوی را برای مدیریت ساختاریافته استثناها در Objective-C فعال میکند، مشابه آنچه توسط C++ ارائه میشود. این گزینه برای استفاده از کلمات کلیدی @try، @throw، @catch، @finally و @synchronized در Objective-C مورد نیاز است. این گزینه هم با زمان اجرای GNU و هم با زمان اجرای NeXT در دسترس است (اما در ترکیب با زمان اجرای NeXT روی Mac OS X 10.2 و قدیمیتر از آن در دسترس نیست).
- -fobjc-gc
- فعالسازی جمعآوری زباله (GC) در برنامههای Objective-C و Objective-C++. این گزینه تنها با زمان اجرای NeXT در دسترس است؛ زمان اجرای GNU پیادهسازی متفاوتی از جمعآوری زباله دارد که نیازی به پرچمهای خاص کامپایلر ندارد.
- -fobjc-nilcheck
- برای زمان اجرای NeXT با نسخه 2 از ABI، پیش از انجام فراخوانی واقعی متد، nil بودن گیرنده در فراخوانی متدها را بررسی میکند. این رفتار پیشفرض است و میتوان آن را با استفاده از -fno-objc-nilcheck غیرفعال کرد. متدهای کلاس و فراخوانیهای super صرفنظر از اینکه این پرچم روی چه مقداری تنظیم شده باشد، هرگز بدین شکل برای nil بررسی نمیشوند. در حال حاضر این پرچم هنگام استفاده از زمان اجرای GNU یا نسخه قدیمیتر ABI زمان اجرای NeXT، هیچ کاری انجام نمیدهد.
- -fobjc-std=objc1
- مطابقت با نحو زبان Objective-C 1.0، زبانی که توسط GCC 4.0 شناخته میشود. این مورد تنها بر افزونههای Objective-C به زبان C/C++ اثر میگذارد؛ و تأثیری بر انطباق با استانداردهای C/C++ که با پرچمهای مجزای گزینه گویش C/C++ کنترل میشوند، ندارد. هنگامی که این گزینه با کامپایلر Objective-C یا Objective-C++ استفاده میشود، هرگونه نحو Objective-C که توسط GCC 4.0 شناخته نشده باشد رد میگردد. این گزینه زمانی مفید است که بخواهید اطمینان حاصل کنید کد Objective-C شما میتواند با نسخههای قدیمیتر GCC کامپایل شود.
- -freplace-objc-classes
- یک نشانگر ویژه صادر میکند که به ld(1) دستور میدهد فایل شیء حاصل را به طور ایستا پیوند نزند، و در عوض به dyld(1) اجازه دهد تا آن را در زمان اجرا بارگیری کند. این مورد در ارتباط با حالت اشکالزدایی Fix-and-Continue به کار میرود؛ حالتی که در آن ممکن است فایل شیء مورد نظر در طول اجرای برنامه، بدون نیاز به راهاندازی مجدد خود برنامه، مجدداً کامپایل و به طور پویا دوباره بارگیری شود. در حال حاضر، قابلیت Fix-and-Continue تنها در ارتباط با زمان اجرای NeXT روی Mac OS X 10.3 و جدیدتر در دسترس است.
- -fzero-link
- هنگام کامپایل برای زمان اجرای NeXT، کامپایلر به طور معمول فراخوانیهای objc_getClass("...") را (هنگامی که نام کلاس در زمان کامپایل شناخته شده است) با ارجاعات ایستای کلاس که در زمان بارگیری مقداردهی اولیه میشوند جایگزین میکند، که کارایی زمان اجرا را بهبود میبخشد. مشخص کردن پرچم -fzero-link این رفتار را فرونشانده و باعث میشود فراخوانیهای objc_getClass("...") حفظ شوند. این قابلیت در حالت اشکالزدایی Zero-Link مفید است، زیرا امکان تغییر پیادهسازی کلاسهای منفرد را در حین اجرای برنامه فراهم میسازد. زمان اجرای GNU در حال حاضر صرفنظر از گزینههای خط فرمان، همواره فراخوانیهای objc_get_class("...") را حفظ میکند.
- -fno-local-ivars
- به طور پیشفرض به متغیرهای نمونه در Objective-C میتوان به گونهای دسترسی داشت که گویی متغیرهای محلی از درون متدهای کلاسی هستند که در آن اعلان شدهاند. این امر میتواند منجر به سایهاندازی (shadowing) بین متغیرهای نمونه و متغیرهای دیگری شود که به صورت محلی داخل یک متد کلاس یا به طور سراسری با همان نام اعلان شدهاند. مشخص کردن پرچم -fno-local-ivars این رفتار را غیرفعال کرده و بدین ترتیب از مشکلات سایهاندازی متغیرها جلوگیری میکند.
- -fivar-visibility=[public|protected|private|package]
- میزان دید پیشفرض متغیرهای نمونه را روی گزینه مشخصشده تنظیم میکند تا متغیرهای نمونهای که خارج از محدوده هرگونه دستورات اصلاحکننده دسترسی اعلان شدهاند، به طور پیشفرض روی سطح دید مشخصشده قرار گیرند.
- -gen-decls
- اعلانهای رابط (interface) را برای تمامی کلاسهای دیدهشده در فایل مبدأ درون فایلی با نام sourcename.decl تخلیه میکند.
- -Wassign-intercept (فقط Objective-C و Objective-C++)
- هر زمان که یک انتساب Objective-C توسط زبالهروب رهگیری شود، هشدار میدهد.
- -Wno-property-assign-default (فقط Objective-C و Objective-C++)
- در صورتی که برای یک خصوصیت از شیء Objective-C هیچ معناشناسی انتسابی مشخص نشده باشد، هشدار نمیدهد.
- -Wno-protocol (فقط Objective-C و Objective-C++)
- اگر کلاسی برای پیادهسازی یک پروتکل اعلان شده باشد، برای هر متدی در آن پروتکل که توسط کلاس پیادهسازی نشده باشد، هشداری صادر میشود. رفتار پیشفرض این است که برای هر متدی که صریحاً در کلاس پیادهسازی نشده باشد هشدار داده شود، حتی اگر پیادهسازی یک متد از ابرکلاس به ارث رسیده باشد. اگر از گزینه -Wno-protocol استفاده کنید، متدهای به ارث رسیده از ابرکلاس به عنوان متدهای پیادهسازیشده تلقی شده و هیچ هشداری برای آنها صادر نمیشود.
- -Wobjc-root-class (فقط Objective-C و Objective-C++)
- در صورتی که رابط یک کلاس فاقد ابرکلاس باشد هشدار میدهد. برای نمونه بیشتر کلاسها از "NSObject" (یا "Object") ارثبری دارند. هنگام اعلان کلاسهایی که قرار است کلاسهای ریشه باشند، میتوان با علامتگذاری رابطهای آنها توسط "__attribute__((objc_root_class))" این هشدار را فرونشاند.
- -Wselector (فقط Objective-C و Objective-C++)
- در صورتی که چندین متد با نوعهای گوناگون برای یک انتخابگر یکسان در طول کامپایل یافت شوند، هشدار میدهد. این بررسی روی فهرست متدها در مرحله نهایی کامپایل انجام میشود. علاوه بر این، برای هر انتخابگری که در عبارت @selector(...) ظاهر شده باشد، و متد متناظری برای آن انتخابگر در طول کامپایل یافت شده باشد، بررسی انجام میگیرد. از آنجا که این بررسیها جدول متد را تنها در انتهای کامپایل پیمایش میکنند، در صورتی که مرحله نهایی کامپایل حاصل نشود—برای مثال به این دلیل که خطایی حین کامپایل رخ داده، یا از گزینه -fsyntax-only استفاده شده باشد—این هشدارها تولید نمیشوند.
- -Wstrict-selector-match (فقط Objective-C و Objective-C++)
- هنگامی که تلاش میشود پیامی با استفاده از یک انتخابگر به گیرندهای از نوع "id" یا "Class" فرستاده شود، در صورتی که چندین متد با نوعهای آرگومان و/یا بازگشتی متفاوتی برای آن انتخابگر مشخص یافت شوند، هشدار میدهد. هنگامی که این پرچم خاموش است (که رفتار پیشفرض است)، اگر هرگونه تفاوت یافتشده محدود به نوعهایی باشد که اندازه و تراز یکسانی دارند، کامپایلر چنین هشدارهایی را نادیده میگیرد..IP "-Wundeclared-selector (فقط Objective-C و Objective-C++)" 4 هشدار میدهد اگر عبارت @selector(...) ارجاعدهنده به یک سلکتور اعلاننشده یافت شود. یک سلکتور زمانی اعلاننشده در نظر گرفته میشود که هیچ متدی با آن نام پیش از عبارت @selector(...)، چه بهطور صریح در اعلان یک @interface یا @protocol، و چه بهطور ضمنی در یک بخش @implementation اعلان نشده باشد. این گزینه بررسیهای خود را همواره بهمحض یافتن یک عبارت @selector(...) انجام میدهد، در حالی که -Wselector بررسیهای خود را تنها در مرحله نهایی کامپایل انجام میدهد. این گزینه همچنین قرارداد سبک کدنویسی مبنی بر اینکه متدها و سلکتورها باید پیش از استفاده اعلان شوند را اعمال میکند.
- -print-objc-runtime-info
- یک هدر C تولید میکند که بزرگترین ساختار پاسدادهشده با مقدار (by value) را، در صورت وجود، توصیف مینماید.
گزینههای کنترل OpenMP و OpenACC
GCC از افزونههای OpenMP برای زبانهای C، C++ و Fortran با استفاده از گزینه -fopenmp پشتیبانی میکند. به طور مشابه، افزونههای OpenACC در هر سه زبان با -fopenacc پشتیبانی میشوند.
- -foffload=disable
- -foffload=default
- -foffload=target-list
- مشخص
میکند که
برای کدام
مقصدهای
برونسپاری
(offload) در OpenMP و OpenACC
باید کد
تولید شود.
رفتار
پیشفرض،
معادل با
-foffload=default، تولید
کد برای
تمامی
مقصدهای
برونسپاری
پشتیبانیشده
است. حالت
-foffload=disable کد را
تنها برای
حالت
جایگزین
میزبان (host fallback)
تولید
میکند، در
حالی که
-foffload=target-list کد را
تنها برای
فهرست
مشخصشدهای
از مقصدهای
برونسپاری
که با کاما
از هم جدا
شدهاند،
تولید
مینماید.
مقصدهای برونسپاری در قالب درونی target-triplet در GCC مشخص میشوند. میتوانید کامپایلر را با گزینه -v اجرا کنید تا فهرست مقصدهای برونسپاری پیکربندیشده در زیر "OFFLOAD_TARGET_NAMES" نمایش داده شود.
- -foffload-options=options
- -foffload-options=target-triplet-list=options
- با گزینه
-foffload-options=options،
کامپایلر GCC
گزینههای
مشخصشده
در options را به
کامپایلرها
برای تمامی
مقصدهای
برونسپاری
فعال ارسال
میکند.
میتوانید
با استفاده
از ساختار
-foffload-options=target-list=options
گزینههایی
را مشخص
کنید که
تنها روی یک
یا چند مقصد
خاص اعمال
شوند.
آرگومان
target-list فهرستی
جداشده با
کاما در
همان قالب
گزینه -foffload=
است.
خطهای فرمان نمونه عبارتند از:
-foffload-options='-fno-math-errno -ffinite-math-only' \ -foffload-options=nvptx-none=-latomic -foffload-options=amdgcn-amdhsa=-march=gfx906 - -fopenacc
- مدیریت راهنماهای OpenACC شامل #pragma acc در C/C++ و !$acc در فرترن با فرم آزاد (free-form) و !$acc، c$acc و *$acc در فرترن با فرم ثابت (fixed-form) را فعال میکند. این گزینه مستلزم -pthread است، و بنابراین تنها در مقصدهایی پشتیبانی میشود که از -pthread پشتیبانی میکنند.
- -fopenacc-dim=geom
- ابعاد محاسباتی پیشفرض را برای نواحی موازی برونسپاری که آنها را به صراحت مشخص نکردهاند، تعیین میکند. مقدار geom سهگانهای از اندازههای جداشده با : است، به ترتیب gang، worker و vector. میتوان یک اندازه را حذف کرد تا از مقدار پیشفرض مختص مقصد استفاده شود.
- -fopenmp
- مدیریت
راهنماهای
OpenMP شامل #pragma omp،
[[omp::directive(...)]]، [[omp::decl(...)]] و
[[omp::sequence(...)]] را در C/C++
فعال
میکند. در
فرترن، !$omp و
نگهبان
کامپایل
شرطی !$ را
فعال
میسازد. در
فرترن با
فرم مبدأ
ثابت،
نشانگرهای
نگهبان
میتوانند
با 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" در فرترن را فعال میکند. همچنین نگهبان کامپایل شرطی !$ را در فرترن فعال میسازد. در فرترن با فرم مبدأ ثابت، نگهبانها میتوانند با c یا * نیز آغاز شوند. سایر راهنماهای OpenMP نادیده گرفته میشوند. مگر اینکه -fopenmp نیز علاوه بر این مشخص شده باشد، ناحیه "loop"، مستقل از عبارت "bind" مشخصشده، به ناحیه وظیفه (task) فعلی پیوند میخورد.
- -fopenmp-target-simd-clone
- -fopenmp-target-simd-clone=device-type
- علاوه بر
تولید
نسخههای
مشابه (clones) SIMD
برای
توابعی که
با راهنمای
"declare simd"
نشانهگذاری
شدهاند،
هنگام فعال
بودن این
گزینه، GCC
برای توابع
نشانهگذاریشده
با راهنمای
"declare target" در OpenMP
که برای
برداریسازی
مناسب
هستند نیز
همتاسازی
انجام
میدهد.
مقدار device-type
میتواند
یکی از
"none"،
"host"،
"nohost" و
"any"
باشد، که
متناظر با
کلیدواژههای
عبارت
"device_type" در
راهنمای
"declare target"
هستند؛
همتاها
برای
اشتراک
دستگاههای
مشخصشده
تولید
میشوند.
-fopenmp-target-simd-clone معادل
با -fopenmp-target-simd-clone=any و
-fno-openmp-target-simd-clone
معادل با
-fopenmp-target-simd-clone=none است.
در سطح بهینهسازی -O2 و بالاتر (به جز -Os یا -Og) پیشفرض این بهینهسازی -fopenmp-target-simd-clone=nohost است؛ در غیر این صورت به طور پیشفرض غیرفعال است.
گزینههای کنترل قالببندی پیامهای تشخیصی
به طور سنتی، پیامهای تشخیصی بدون توجه به خصوصیات دستگاه خروجی (مانند عرض آن و غیره) قالببندی میشدند. میتوانید از گزینههای شرحدادهشده در زیر برای کنترل الگوریتم قالببندی پیامهای تشخیصی استفاده کنید؛ مانند اینکه چه تعداد نویسه در هر سطر قرار گیرد، و اطلاعات مکان در کد مبدأ هر چند وقت یکبار گزارش شود. توجه داشته باشید که ممکن است برخی پیشخوانهای (front ends) زبان از این گزینهها تبعیت نکنند.
- -fmessage-length=n
- تلاش
میکند
پیامهای
خطا را به
گونهای
قالببندی
کند که در
سطرهایی با
حدود n
نویسه جای
گیرند. اگر
n صفر باشد،
هیچ شکست
سطری (line-wrapping)
انجام
نمیشود؛
هر پیام خطا
در یک سطر
تکی نمایش
مییابد.
این مقدار
پیشفرض
برای تمامی
پیشخوانها
است.
نکته - این گزینه بر نمایش دستورات پیشپردازنده #error و #warning، و مشخصه (attribute) منسوخشده (deprecated) برای تابع/نوع/متغیر نیز تأثیر میگذارد. با این حال، بر پراگماهای pragma GCC warning و pragma GCC error تأثیری ندارد.
- -fdiagnostics-plain-output
- این گزینه درخواست میکند که خروجی تشخیصی تا حد ممکن ساده باشد، که ممکن است هنگام اجرای dejagnu یا سایر ابزارهایی که نیاز به تجزیه خروجی تشخیصی دارند و ترجیح میدهند این خروجی در گذر زمان پایدارتر بماند مفید باشد. -fdiagnostics-plain-output در حال حاضر معادل گزینههای زیر است: -fno-diagnostics-show-caret -fno-diagnostics-show-line-numbers -fdiagnostics-color=never -fdiagnostics-urls=never -fdiagnostics-path-format=separate-events -fdiagnostics-text-art-charset=none -fno-diagnostics-show-event-links در آینده، اگر GCC ظاهر پیشفرض پیامهای تشخیصی خود را تغییر دهد، گزینه متناظر برای غیرفعالسازی رفتار جدید به این فهرست افزوده خواهد شد.
- -fdiagnostics-show-location=once
- تنها در حالت شکست سطر معنی دارد. به گزارشگر پیامهای تشخیصی دستور میدهد اطلاعات مکان منبع را یکبار نمایش دهد؛ بدین معنی که در صورتی که پیام برای قرارگیری در یک سطر فیزیکی بیش از حد طولانی باشد و نیاز به شکستن داشته باشد، مکان مبدأ دوباره و پشت سر هم (به عنوان پیشوند) در سطرهای ادامهدار بعدی منتشر نخواهد شد. این رفتار پیشفرض است.
- -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 توسط ترمینال یا شبیهساز ترمینال تفسیر میشوند. (برای مقادیر مجاز و معانی آنها به عنوان مشخصههای نویسه، به بخش مربوطه در مستندات ترمینال متنی خود مراجعه کنید.) این مقادیر زیررشته، اعدادی صحیح در مبنای ده هستند و میتوانند با نقطهویرگول (semicolon) به یکدیگر متصل شوند. مقادیر رایج برای اتصال عبارتند از: 1 برای پررنگ (bold)، 4 برای خط زیرین (underline)، 5 برای چشمکزن (blink)، 7 برای معکوس (inverse)، 39 برای رنگ پیشزمینه پیشفرض، 30 تا 37 برای رنگهای پیشزمینه، 90 تا 97 برای رنگهای پیشزمینه در حالت ۱۶ رنگ، 38;5;0 تا 38;5;255 برای رنگهای پیشزمینه در حالتهای ۸۸ رنگ و ۲۵۶ رنگ، 49 برای رنگ پسزمینه پیشفرض، 40 تا 47 برای رنگهای پسزمینه، 100 تا 107 برای رنگهای پسزمینه در حالت ۱۶ رنگ، و 48;5;0 تا 48;5;255 برای رنگهای پسزمینه در حالتهای ۸۸ رنگ و ۲۵۶ رنگ.
مقدار پیشفرض GCC_COLORS برابر است با:
error=01;31:warning=01;35:note=01;36:range1=32:range2=34:locus=01:\ quote=01:path=01;36:fixit-insert=32:fixit-delete=31:\ diff-filename=01:diff-hunk=32:diff-delete=31:diff-insert=32:\ type-diff=01;32:fnname=01;32:targs=35:valid=01;31:invalid=01;32\ highlight-a=01;32:highlight-b=01;34
که در آن 01;31 قرمز پررنگ، 01;35 سرخابی پررنگ، 01;36 فیروزهای پررنگ، 32 سبز، 34 آبی، 01 پررنگ و 31 قرمز است. تنظیم GCC_COLORS روی یک رشته خالی، رنگها را غیرفعال میکند. قابلیتهای پشتیبانیشده به شرح زیر هستند:
- "error="
- زیررشته SGR برای نشانگرهای :error.
- "warning="
- زیررشته SGR برای نشانگرهای :warning.
- "note="
- زیررشته SGR برای نشانگرهای :note.
- "path="
- زیررشته SGR برای رنگآمیزی مسیرهای رویدادهای جریان کنترل (control-flow) که از طریق -fdiagnostics-path-format= چاپ میشوند، مانند شناسههای رویدادهای منفرد و خطوط نشاندهنده فراخوانیها و بازگشتهای میانرویهای.
- "range1="
- زیررشته SGR برای اولین محدوده اضافی.
- "range2="
- زیررشته SGR برای دومین محدوده اضافی.
- "locus="
- زیررشته SGR برای اطلاعات مکان، file:line یا file:line:column و غیره.
- "quote="
- زیررشته SGR برای اطلاعات چاپشده در میان علامتهای نقلقول.
- "fnname="
- زیررشته SGR برای نام توابع C++.
- "targs="
- زیررشته SGR برای مقیدسازی پارامترهای الگوی تابع C++.
- "fixit-insert="
- زیررشته SGR برای نکات راهنمای اصلاحی (fix-it hints) که درج یا جایگزینی متنی را پیشنهاد میدهند.
- "fixit-delete="
- زیررشته SGR برای نکات راهنمای اصلاحی که حذف متنی را پیشنهاد میدهند.
- "diff-filename="
- زیررشته SGR برای هدرهای نام فایل در وصلههای (patches) تولیدشده.
- "diff-hunk="
- زیررشته SGR برای آغاز قطعهها (hunks) در وصلههای تولیدشده.
- "diff-delete="
- زیررشته SGR برای خطوط حذفشده در وصلههای تولیدشده.
- "diff-insert="
- زیررشته SGR برای خطوط درجشده در وصلههای تولیدشده.
- "type-diff="
- زیررشته SGR برای برجستهسازی انواع ناهمخوان درون آرگومانهای الگو در پیشخوان C++.
- "valid="
- زیررشته SGR برای برجستهسازی عناصر معتبر درون نمودارهای هنر متنی (text art).
- "invalid="
- زیررشته SGR برای برجستهسازی عناصر نامعتبر درون نمودارهای هنر متنی.
- "highlight-a="
- "highlight-b="
- زیررشتههای SGR برای متمایز ساختن دو چیز متفاوت در پیامهای تشخیصی، مانند یک جفت نوع ناهمخوان. ببینید: -fdiagnostics-show-highlight-colors.
مقدار WHEN برابر با never، always یا auto است. مقدار auto باعث میشود GCC فقط زمانی از دنبالههای فرار URL استفاده کند که خطای استاندارد (standard error) یک پایانه باشد، و برنامه درون یک پوستهٔ emacs یا پایانههای گرافیکی که ناسازگاری آنها با این ویژگی شناختهشده است اجرا نشود؛ در ادامه را ببینید.
مقدار پیشفرض بستگی به نحوهٔ پیکربندی کامپایلر دارد. این مقدار میتواند هر یک از گزینههای WHEN فوق باشد.
همچنین GCC میتواند طوری پیکربندی شود (از طریق گزینهٔ زمان پیکربندیِ --with-diagnostics-urls=auto-if-env) تا مقدار پیشفرض تحت تأثیر متغیرهای محیطی قرار گیرد. تحت چنین پیکربندیای، چنانچه هر یک از متغیرهای محیطی GCC_URLS یا TERM_URLS در محیط کامپایلر موجود و غیرخالی باشند، پیشفرض GCC استفاده از auto خواهد بود، و اگر هیچکدام نباشند پیشفرض never است.
با این حال، حتی با -fdiagnostics-urls=always نیز این رفتار به آن متغیرهای محیطی وابسته است: اگر GCC_URLS روی خالی یا no تنظیم شده باشد، URLها را در پیامهای تشخیصی جاسازی نمیکند. اگر روی st تنظیم شده باشد، URLها از دنبالههای فرار ST استفاده میکنند. اگر روی bel تنظیم شده باشد (پیشفرض)، URLها از دنبالههای فرار BEL استفاده میکنند. هر مقدار غیرخالی دیگر این ویژگی را فعال میکند. اگر GCC_URLS تنظیم نشده باشد، از TERM_URLS به عنوان جایگزین استفاده میشود. نکته: ST یک دنبالهٔ فرار ANSI است؛ یعنی پایاندهندهٔ رشته ESC \، و BEL یک نویسهٔ ASCII است؛ CTRL-G که معمولاً صدایی مانند بوق دارد.
در حال حاضر GCC همچنین تلاش میکند برخی پایانههایی را که ویژگی URL را پیادهسازی نکردهاند و دارای باگ هستند (یا دستکم در نسخههایی که هنوز استفاده میشوند باگ داشتهاند و دنبالههای فرار URL احتمالاً در آنها عملکرد نادرستی دارد؛ یعنی نویسههای نامفهوم روی صفحه چاپ میکنند) شناسایی کند. این فهرست در حال حاضر شامل xfce4-terminal، برخی نسخههای اشکالدار شناختهشدهٔ gnome-terminal، کنسول لینوکس (linux 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
- پیامهای تشخیصی میتوانند به صورت اختیاری قواعدی مرتبط با خود داشته باشند، مانند قواعد برگرفته از یک استاندارد کدنویسی یا یک مشخصه (specification). خود GCC این کار را برای هیچیک از پیامهای تشخیصیاش انجام نمیدهد، اما ممکن است پلاگینها چنین کنند. بهطور پیشفرض، در صورت وجود این اطلاعات، همراه با پیام تشخیصی چاپ میشود. این گزینه از چاپ این فراداده جلوگیری میکند.
- -fno-diagnostics-show-highlight-colors
- GCC میتواند
هنگام چاپ
پیامهای
تشخیصی و
نقل کد مبدأ
کاربر، از
رنگ برای
تأکید و
ایجاد
تمایز
استفاده
کند.
برای مثال، در:
demo.c: In function `test_bad_format_string_args': ../../src/demo.c:25:18: warning: format `%i' expects argument of type `int', but argument 2 has type `const char *' [-Wformat=] 25 | printf("hello %i", msg); | ~^ ~~~ | | | | int const char * | %s
- موارد %i و "int" در پیام و "int" در کد مبدأ نقلشده با استفاده از "highlight-a" (بهطور پیشفرض سبز پررنگ) رنگآمیزی میشوند، و
- عبارت "const char *" در پیام و در کد مبدأ نقلشده هر دو با استفاده از "highlight-b" (بهطور پیشفرض آبی پررنگ) رنگآمیزی میشوند.
هدف جلب توجه خواننده به ارتباط میان جنبههای گوناگون پیام تشخیصی و کد مبدأ است، با استفاده از رنگ برای گروهبندی عناصر مرتبط و متمایز ساختن عناصر ناهمخوان.
این رنگآمیزی اضافی در صورت فعال بودن چاپ رنگی (مطابق با -fdiagnostics-color=) بهطور پیشفرض فعال است، اما میتوان آن را به صورت جداگانه از طریق -fno-diagnostics-show-highlight-colors غیرفعال کرد.
- -fno-diagnostics-show-line-numbers
- بهطور پیشفرض، هنگام چاپ کد منبع (از طریق -fdiagnostics-show-caret)، یک حاشیهٔ چپ برای نمایش شمارههای خطوط چاپ میشود. این گزینه از چاپ این حاشیهٔ چپ جلوگیری میکند.
- -fdiagnostics-minimum-margin-width=width
- این گزینه حداقل عرض حاشیهٔ چپ چاپشده توسط -fdiagnostics-show-line-numbers را کنترل میکند. مقدار پیشفرض آن 6 است.
- -fdiagnostics-parseable-fixits
- راهنماییهای
اصلاحی (fix-it hints)
را در قالبی
قابل تجزیه
توسط
ماشین،
مناسب برای
استفاده در
IDEها، صادر
میکند.
برای هر
اصلاح، خطی
پس از پیام
تشخیصی
مربوطه با
رشتهٔ "fix-it:"
چاپ خواهد
شد. برای
مثال:
fix-it:"test.c":{45:3-45:21}:"gtk_widget_show_all"موقعیت به صورت یک بازهٔ نیمهباز، بر حسب تعداد بایتها، با شروع از بایت ۱ برای ستون نخست بیان میشود. در مثال بالا، بایتهای ۳ تا ۲۰ از خط ۴۵ فایل "test.c" باید با رشتهٔ ارائهشده جایگزین شوند:
00000000011111111112222222222 12345678901234567890123456789 gtk_widget_showall (dlg); ^^^^^^^^^^^^^^^^^^ gtk_widget_show_all
در نام فایل و رشتهٔ جایگزین، ممیز وارونه به عنوان "\\"، نویسهٔ تب به عنوان "\t"، خط جدید به عنوان "\n"، نقلقول دوگانه به عنوان "\"" و نویسههای غیرقابلچاپ به صورت هشتهشتی (مانند تب عمودی به صورت "\013") فرار داده میشوند.
یک رشتهٔ جایگزین خالی نشان میدهد که بازهٔ مشخصشده باید حذف شود. یک بازهٔ خالی (مانند "45:3-45:3") نشان میدهد که رشته باید در موقعیت دادهشده درج گردد.
- -fdiagnostics-generate-patch
- راهنماییهای
اصلاحی را
پس از چاپ
هرگونه
پیام
تشخیصی، در
قالب unified diff در stderr
چاپ میکند.
برای مثال:
--- test.c +++ test.c @ -42,5 +42,5 @ void show_cb(GtkDialog *dlg) { - gtk_widget_showall(dlg); + gtk_widget_show_all(dlg); }خروجی diff ممکن است با پیروی از همان قواعد پیامهای تشخیصی رنگی باشد یا نباشد (گزینهٔ -fdiagnostics-color را ببینید)..IP -fdiagnostics-show-template-tree 4 در فرانتاند C++، هنگام چاپ پیامهای عیبیابی نمایشدهندهٔ عدم تطابق نوعهای قالب (template types)، مانند:
could not convert 'std::map<int, std::vector<double> >()' from 'map<[...],vector<double>>' to 'map<[...],vector<float>>
پرچم -fdiagnostics-show-template-tree چاپ یک ساختار درختمانند را فعال میکند که بخشهای مشترک و متفاوت نوعها را نشان میدهد، مانند:
map< [...], vector< [double != float]>>بخشهایی که تفاوت دارند با رنگ برجسته میشوند (در این مورد «double» و «float»).
- -fno-elide-type
- بهطور
پیشفرض
زمانی که
فرانتاند
C++ پیامهای
عیبیابی
نشاندهندهٔ
عدم تطابق
انواع قالب
را چاپ
میکند،
بخشهای
مشترک
نوعها
بهصورت
«[...]» چاپ
میشوند تا
پیام خطا
سادهتر
شود. برای
مثال:
could not convert 'std::map<int, std::vector<double> >()' from 'map<[...],vector<double>>' to 'map<[...],vector<float>>
مشخص کردن پرچم -fno-elide-type این رفتار را لغو میکند. این پرچم همچنین بر خروجی پرچم -fdiagnostics-show-template-tree نیز تأثیر میگذارد.
- -fdiagnostics-path-format=KIND
- نحوهٔ چاپ
مسیرهای
رویدادهای
جریان
کنترل (control-flow) را
برای
پیامهای
عیبیابی
که چنین
مسیری به
آنها
پیوست شده
است، مشخص
میکند.
مقدار KIND میتواند none، separate-events یا inline-events (پیشفرض) باشد.
مقدار none بهمعنای عدم چاپ مسیرهای عیبیابی است.
مقدار separate-events بهمعنای چاپ یک پیام عیبیابی «note» جداگانه برای هر رویداد در جریان عیبیابی است. برای مثال:
test.c:29:5: error: passing NULL as argument 1 to 'PyList_Append' which requires a non-NULL parameter test.c:25:10: note: (1) when 'PyList_New' fails, returning NULL test.c:27:3: note: (2) when 'i < count' test.c:29:5: note: (3) when calling 'PyList_Append', passing NULL from (1) as argument 1
مقدار inline-events بهمعنای چاپ رویدادها بهصورت «درونخطی» (inline) در داخل کد منبع است. این نما تلاش میکند تا رویدادها را در قالب توالیهایی از رویدادهای بهاندازهٔ کافی نزدیک به هم تجمیع کند، و آنها را بهعنوان محدودههای برچسبدار درون کد منبع نمایش دهد.
برای مثال، همان رویدادهای بالا ممکن است بهصورت زیر چاپ شوند:
'test': events 1-3 25 | list = PyList_New(0); | ^~~~~~~~~~~~~ | | | (1) when 'PyList_New' fails, returning NULL 26 | 27 | for (i = 0; i < count; i++) { | ~~~ | | | (2) when 'i < count' 28 | item = PyLong_FromLong(random()); 29 | PyList_Append(list, item); | ~~~~~~~~~~~~~~~~~~~~~~~~~ | | | (3) when calling 'PyList_Append', passing NULL from (1) as argument 1جریان کنترل بینروالی (Interprocedural) با گروهبندی رویدادها بر اساس فریم پشته (stack frame) و استفاده از تورفتگی برای نمایش نحوهٔ تو در تو شدن، وارد شدن (push) و خارج شدن (pop) فریمهای پشته نمایش داده میشود.
برای مثال:
'test': events 1-2 | | 133 | { | | ^ | | | | | (1) entering 'test' | 134 | boxed_int *obj = make_boxed_int (i); | | ~~~~~~~~~~~~~~~~~~ | | | | | (2) calling 'make_boxed_int' | +--> 'make_boxed_int': events 3-4 | | 120 | { | | ^ | | | | | (3) entering 'make_boxed_int' | 121 | boxed_int *result = (boxed_int *)wrapped_malloc (sizeof (boxed_int)); | | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ | | | | | (4) calling 'wrapped_malloc' | +--> 'wrapped_malloc': events 5-6 | | 7 | { | | ^ | | | | | (5) entering 'wrapped_malloc' | 8 | return malloc (size); | | ~~~~~~~~~~~~~ | | | | | (6) calling 'malloc' | <-------------+ | 'test': event 7 | | 138 | free_boxed_int (obj); | | ^~~~~~~~~~~~~~~~~~~~ | | | | | (7) calling 'free_boxed_int' | (etc) - -fdiagnostics-show-path-depths
- این گزینه
اطلاعات
بیشتری را
هنگام چاپ
مسیرهای
جریان
کنترل
مربوط به یک
عیبیابی
ارائه
میدهد.
اگر این گزینه مشخص شود، عمق پشته برای هر توالی از رویدادها در حالت -fdiagnostics-path-format=inline-events چاپ خواهد شد. اگر همراه با -fdiagnostics-path-format=separate-events استفاده شود، عمق پشته و اعلان تابع (function declaration) در هنگام چاپ هر رویداد ضمیمه خواهد شد.
این گزینه برای استفادهٔ توسعهدهندگان GCC و توسعهدهندگان افزونهها هنگام اشکالزدایی عیبیابیهایی که جریان کنترل بینروالی را گزارش میدهند در نظر گرفته شده است.
- -fno-show-column
- شمارهٔ ستونها در پیامهای عیبیابی چاپ نشود. این ممکن است در صورتی لازم باشد که پیامهای عیبیابی توسط برنامهای بررسی (اسکن) میشوند که شماره ستونها را درک نمیکند، مانند dejagnu.
- -fdiagnostics-column-unit=UNIT
- واحد
شمارهٔ
ستون را
انتخاب
میکند. این
گزینه بر
پیامهای
عیبیابی
سنتی (در
صورت عدم
وجود -fno-show-column) و
همچنین
عیبیابیهای
قالب JSON در
صورت
درخواست،
تأثیر
میگذارد.
مقدار پیشفرض UNIT، یعنی display، تعداد ستونهای نمایشی اشغالشده توسط هر نویسه را در نظر میگیرد. این مقدار ممکن است در مورد نویسههای tab بزرگتر از تعداد بایتهای مورد نیاز برای کدگذاری نویسه باشد، یا در مورد نویسههای چندبایتی کوچکتر باشد. برای مثال، نویسهٔ «GREEK SMALL LETTER PI (U+03C0)» یک ستون نمایش را اشغال میکند و کدگذاری UTF-8 آن به دو بایت نیاز دارد؛ نویسهٔ «SLIGHTLY SMILING FACE (U+1F642)» دو ستون نمایش را اشغال میکند و کدگذاری UTF-8 آن به چهار بایت نیاز دارد.
تنظیم UNIT روی byte، شمارهٔ ستون را در تمام موارد به شمارش بایتهای خام تغییر میدهد، همانطور که در GCC پیش از نسخهٔ 11.1.0 بهصورت سنتی خروجی داده میشد.
- -fdiagnostics-column-origin=ORIGIN
- مبدأ شمارههای ستون را انتخاب میکند، یعنی شماره ستونی که به نخستین ستون اختصاص داده میشود. مقدار پیشفرض 1 با رفتار سنتی GCC و راهنمای نگارش GNU مطابقت دارد. برخی ابزارها ممکن است با مبدأ 0 عملکرد بهتری داشته باشند؛ هر مقدار غیرمنفی را میتوان مشخص کرد.
- -fdiagnostics-escape-format=FORMAT
- هنگامی که GCC
خطوط مرتبط
کد منبع را
برای یک
پیام
عیبیابی
چاپ
میکند،
معمولاً
سعی میکند
بایتهای
منبع را
مستقیماً
چاپ کند. با
این حال،
برخی از
عیبیابیها
به مشکلات
کدگذاری در
فایل منبع،
مانند UTF-8
ناصحیح، یا
مشکلات
نرمالسازی
یونیکد (Unicode normalization)
مربوط
میشوند.
این
عیبیابیها
نشانهگذاری
شدهاند تا
GCC هنگام چاپ
خطوط
مربوطه از
کد منبع،
بایتهایی
را که اسکی (ASCII)
قابل چاپ
نیستند
نویسهگردانی
(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 برخی از پیامهای عیبیابی میتوانند شامل نمودارهای «هنر متنی» (text art) باشند: مصورسازیهایی ایجادشده از متن که برای نمایش با یک قلم تکفاصله (monospaced) در نظر گرفته شدهاند. این گزینه نویسههایی را مشخص میکند که در صورت وجود، برای چاپ چنین نمودارهایی باید استفاده شوند. مقدار CHARSET یکی از مقادیر none، ascii، unicode یا emoji است. مقدار none از چاپ چنین نمودارهایی جلوگیری میکند. مقدار ascii تضمین میکند که این نمودارها صرفاً اسکی («هنر اسکی») باشند. مقدار unicode امکان استفادهٔ محتاطانه از نویسههای ترسیمی یونیکد (مانند نویسههای رسم کادر) را فراهم میسازد. مقدار emoji علاوه بر این، امکان وجود ایموجی در خروجی را اضافه میکند (مانند تولید U+26A0 WARNING SIGN به همراه U+FE0F VARIATION SELECTOR-16 برای انتخاب گونهٔ ایموجی نویسه). پیشفرض emoji است، مگر زمانی که متغیر محیطی LANG روی C تنظیم شده باشد که در آن صورت پیشفرض ascii خواهد بود.
- -fdiagnostics-format=FORMAT
-
قالب متفاوتی را برای چاپ پیامهای عیبیابی انتخاب میکند. FORMAT یکی از مقادیر text، sarif-stderr، sarif-file، json، json-stderr یا json-file است. استفاده از این گزینه، جایگزین هرگونه «مقصد خروجی» اضافیِ افزودهشده توسط -fdiagnostics-add-output= یا مقدار تعیینشده توسط -fdiagnostics-set-output= میشود. پیشفرض text است. هر دو قالب sarif-stderr و sarif-file پیامهای عیبیابی را با قالب SARIF نسخه 2.1.0، به ترتیب در stderr یا فایلی به نام source.sarif صادر میکنند. مقادیر گوناگون json، json-stderr و json-file منسوخ شدهاند و به یک قالب خروجی قدیمی مبتنی بر JSON اشاره دارند. قالب json مترادفی برای json-stderr است. قالبهای json-stderr و json-file یکسان هستند، بهجز محل صدور JSON. در json-stderr، دادههای JSON به stderr ارسال میشوند، در حالی که در json-file درون source.gcc.json نوشته میشوند.
- -fdiagnostics-add-output=DIAGNOSTICS-OUTPUT-SPEC
-
یک «مقصد خروجی» اضافی برای صدور پیامهای عیبیابی میافزاید. DIAGNOSTICS-OUTPUT-SPEC باید یک طرحواره را مشخص کند که بهصورت اختیاری با ":" و یک یا چند جفت KEY=VALUE به این شکل دنبال میشود: <SCHEME> <SCHEME>:<KEY>=<VALUE> <SCHEME>:<KEY>=<VALUE>,<KEY2>=<VALUE2>و غیره.
طرحوارهها، کلیدها یا مقادیری که نام آنها دارای پیشوند «experimental» است ممکن است بدون اطلاع قبلی تغییر کنند یا حذف شوند.
SCHEME میتواند مقادیر زیر باشد:
- text
- ارسال
پیامهای
عیبیابی
به stderr با
استفاده از
قالب خروجی
متنی
کلاسیک GCC.
کلیدهای پشتیبانیشده عبارتاند از:
- color=[yes|no]
- تنظیمات رنگبندی برگرفته از -fdiagnostics-color را برای این خروجی متنی بازنویسی میکند.
- experimental-nesting=[yes|no]
- یک حالت آزمایشی را فعال میکند که بر روابط سلسلهمراتبی درون پیامهای عیبیابی تأکید کرده و اطلاعات مکان را در خطوط جداگانه نمایش میدهد.
- experimental-nesting-show-locations=[yes|no]
- اگر "experimental-nesting=yes" باشد، مکانها بهطور پیشفرض نمایش داده میشوند؛ این کلید را روی "no" تنظیم کنید تا چاپ این مکانها غیرفعال شود. این ویژگی برای توسعهدهندگان GCC و نوشتن آزمونهای DejaGnu تعبیه شده است.
- experimental-nesting-show-levels=[yes|no]
- این یک گزینهٔ اشکالزدایی برای استفاده همراه با "experimental-nesting=yes" است. این کلید را روی "yes" تنظیم کنید تا سطوح تودرتویی بهصورت صریح در خروجی چاپ شوند. این قابلیت برای توسعهدهندگان GCC در نظر گرفته شده است.
- sarif
- صدور
پیامهای
عیبیابی
به یک فایل
در قالب SARIF.
کلیدهای پشتیبانیشده عبارتاند از:
- file=FILENAME
- نام فایلی را مشخص میکند که خروجی SARIF باید در آن نوشته شود، که میتواند با یک مسیر مطلق یا نسبی در ابتدا همراه باشد. در صورت مشخص نشدن، مقدار پیشفرض source.sarif خواهد بود.
- version=[2.1|2.2-prerelease]
- نسخهٔ SARIF مورد استفاده برای خروجی را مشخص میکند. در صورت عدم تعیین، مقدار پیشفرض 2.1 است. "2.2-prerelease" از یک پیشنویس غیررسمی مشخصات آیندهٔ SARIF 2.2 استفاده میکند و در این انتشار فقط باید برای اهداف آزمایشی استفاده شود.
برای مثال،
-fdiagnostics-add-output=sarif:version=2.1,file=foo.2.1.sarif -fdiagnostics-add-output=sarif:version=2.2-prerelease,file=foo.2.2.sarif
یک جفت خروجی اضافه میکند که هر یک به ترتیب با استفاده از نسخههای 2.1 و 2.2 استاندارد SARIF در فایلی متفاوت مینویسند.
در EBNF:
<diagnostics-output-specifier> = <diagnostics-output-name>
| <diagnostics-output-name>, ":", <key-value-pairs>;
<diagnostics-output-name> = "text" | "sarif";
<key-value-pairs> = <key-value-pair>
| <key-value-pair> "," <key-value-pairs>;
<key-value-pair> = <key> "=" <value>;
<key> = ? string without a '=' ? ;
<value> = ? string without a ',' ? ;
- -fdiagnostics-set-output=DIAGNOSTICS-OUTPUT-SPEC
- این گزینه به روشی مشابه با -fdiagnostics-add-output= کار میکند، با این تفاوت که بهجای افزودن یک «مقصد خروجی» اضافی برای پیامهای عیبیابی، تمامی مقصدهای خروجی موجود مانند موارد ناشی از -fdiagnostics-format=، -fdiagnostics-add-output= یا فراخوانی پیشین -fdiagnostics-set-output= را جایگزین میکند.
- -fno-diagnostics-json-formatting
- بهطور
پیشفرض،
هنگامی که
خروجی JSON
برای
پیامهای
عیبیابی
صادر
میشود (از
طریق
-fdiagnostics-format=sarif-stderr،
-fdiagnostics-format=sarif-file،
-fdiagnostics-format=json،
-fdiagnostics-format=json-stderr،
-fdiagnostics-format=json-file)، GCC
خطوط جدید و
تورفتگیهایی
را اضافه
میکند تا
ساختار
سلسلهمراتبی
JSON از نظر
بصری
برجستهتر
شود.
از -fno-diagnostics-json-formatting برای حذف این فاصلههای خالی استفاده کنید. این گزینه باید پیش از گزینهای که قرار است بر آن تأثیر بگذارد داده شود.
این گزینه به منظور سازگاری با ابزارهایی در نظر گرفته شده است که انتظار ندارند خروجی حاوی سطر جدید باشد، مانند خروجی تولیدشده توسط نسخههای قدیمیتر GCC..SS "گزینههای درخواست یا فرونشانی هشدارها (Options to Request or Suppress Warnings)" هشدارها پیامهای عیبیابی هستند که ساختارهایی را گزارش میکنند که ذاتاً اشتباه نیستند اما مخاطرهآمیز بوده یا نشان میدهند که ممکن است خطایی رخ داده باشد.
گزینههای مستقل از زبانِ زیر هشدارهای خاصی را فعال نمیکنند، بلکه انواع پیامهای عیبیابی ارائهشده توسط GCC را کنترل میکنند.
- -fsyntax-only
- کد را برای خطاهای نحوی بررسی میکند، اما کاری فراتر از آن انجام نمیدهد.
- -fmax-errors=n
- حداکثر تعداد پیامهای خطا را به n محدود میکند؛ در این نقطه GCC به جای تلاش برای ادامهٔ پردازش کد منبع، کار را متوقف میکند. اگر n برابر 0 باشد (پیشفرض)، هیچ محدودیتی در تعداد پیامهای خطای ارائهشده وجود ندارد. اگر -Wfatal-errors نیز مشخص شده باشد، -Wfatal-errors نسبت به این گزینه تقدم دارد.
- -w
- تمام پیامهای هشدار را فرونشانی میکند.
- -Werror
- تمام هشدارها را به خطا تبدیل میکند.
- -Werror=
- هشدار
مشخصشده
را به خطا
تبدیل
میکند.
مشخصکنندهٔ
هشدار به
انتهای
گزینه
افزوده
میشود؛
برای مثال
-Werror=switch
هشدارهای
کنترلشده
توسط -Wswitch را
به خطا
تبدیل
میکند. این
گزینه
دارای یک
حالت منفی
است که برای
لغو -Werror برای
هشدارهای
مشخص به کار
میرود؛
برای مثال
-Wno-error=switch باعث
میشود
هشدارهای
-Wswitch خطا
محسوب
نشوند، حتی
اگر -Werror فعال
باشد.
پیام هشدار برای هر هشدار قابل کنترل شامل گزینهای است که آن هشدار را کنترل میکند. سپس میتوان آن گزینه را به شکلی که در بالا توضیح داده شد با -Werror= و -Wno-error= به کار برد. (چاپ گزینه در پیام هشدار را میتوان با پرچم -fno-diagnostics-show-option غیرفعال کرد.)
توجه داشته باشید که مشخص کردن -Werror=foo به طور خودکار مستلزم -Wfoo است. با این حال، -Wno-error=foo مستلزم هیچ گزینهای نیست.
- -Wfatal-errors
- این گزینه باعث میشود کامپایلر با وقوع اولین خطا کامپایل را متوقف کند، به جای اینکه تلاش کند به کار ادامه دهد و پیامهای خطای بیشتری را چاپ نماید.
شما میتوانید هشدارهای خاص متعددی را با گزینههایی که با -W شروع میشوند درخواست کنید، برای مثال -Wunused-variable برای درخواست هشدار در مورد اعلان متغیرهایی که هرگز استفاده نمیشوند. هر یک از این گزینههای هشدار خاص همچنین دارای یک فرم منفی است که با -Wno- شروع میشود تا هشدارها را خاموش کند؛ برای مثال، -Wno-unused-variable. این راهنما تنها یکی از این دو فرم را (هر کدام که پیشفرض نباشد) فهرست میکند. برای گزینههای خاص زبانهای دیگر همچنین به C++ Dialect Options و Objective-C and Objective-C++ Dialect Options مراجعه کنید. هشدارهای بیشتر را میتوان با فعالسازی تحلیلگر ایستا ایجاد کرد؛
برخی گزینهها، مانند -Wall و -Wextra، گزینههای دیگر مانند -Wunused را روشن میکنند، که آن هم ممکن است گزینههای بیشتری مانند -Wunused-variable را فعال کند. اثر ترکیبی فرمهای مثبت و منفی به این صورت است که گزینههای خاصتر، مستقل از موقعیتشان در خط فرمان، نسبت به گزینههای عامتر اولویت دارند. برای گزینههایی با درجهٔ اختصاصی بودن یکسان، آخرین گزینه اعمال میشود. گزینههایی که از طریق pragmaها فعال یا غیرفعال میشوند، طوری عمل میکنند که انگار در انتهای خط فرمان ظاهر شدهاند.
هنگامی که یک گزینهٔ هشدار ناشناخته درخواست شود (برای مثال -Wunknown-warning)، GCC خطایی صادر کرده و اعلام میکند که این گزینه ناشناخته است. با این حال، اگر فرم -Wno- استفاده شود، رفتار کمی متفاوت است: هیچ عیبیابیای برای -Wno-unknown-warning تولید نمیشود مگر اینکه عیبیابیهای دیگری تولید شده باشند. این ویژگی اجازه میدهد تا گزینههای جدید -Wno- با کامپایلرهای قدیمیتر استفاده شوند، اما اگر خطایی رخ دهد، کامپایلر هشدار میدهد که یک گزینهٔ ناشناخته وجود دارد.
اثربخشی برخی از هشدارها به فعال بودن بهینهسازیها بستگی دارد. برای مثال، -Wsuggest-final-types با بهینهسازی زمان پیوند (link-time optimization) مؤثرتر است. برخی هشدارهای دیگر ممکن است اصلاً صادر نشوند مگر اینکه بهینهسازی فعال باشد. در حالی که بهینهسازی به طور کلی کارایی هشدارها دربارهٔ مشکلات کنترل و جریان داده را بهبود میبخشد، در برخی موارد ممکن است باعث ایجاد هشدارهای نادرست (false positives) نیز بشود.
- -Wpedantic
- -pedantic
- تمام
هشدارهای
خواستهشده
توسط
استانداردهای
سختگیرانهٔ
ISO C و ISO C++ را صادر
میکند؛
تمام
برنامههایی
را که از
افزونههای
ممنوعه
استفاده
میکنند و
برخی
برنامههای
دیگر را که
از ISO C و ISO C++
پیروی
نمیکنند
عیبیابی
میکند. این
گزینه از
نسخهٔ
استاندارد
ISO C یا C++
مشخصشده
توسط
گزینهٔ -std
استفادهشده
پیروی
میکند.
برنامههای معتبر ISO C و ISO C++ باید با یا بدون این گزینه به درستی کامپایل شوند (اگرچه موارد نادری نیاز به -ansi یا گزینهٔ -std دارند که نسخهٔ استاندارد را مشخص میکند). با این حال، بدون این گزینه، برخی افزونههای گنو و ویژگیهای سنتی C و C++ نیز پشتیبانی میشوند. با این گزینه، آنها عیبیابی میشوند (یا با -pedantic-errors رد میشوند).
گزینهٔ -Wpedantic باعث ایجاد پیامهای هشدار برای استفاده از کلمات کلیدی جایگزین که نام آنها با __ شروع شده و پایان مییابد نمیشود. این فرمت جایگزین همچنین میتواند برای غیرفعال کردن هشدارها برای انواع غیرِ ISO مانند __intN (یعنی __intN__) استفاده شود. هشدارهای وسواسگونه همچنین در عبارتی که پس از "__extension__" میآید غیرفعال میشوند. با این حال، تنها فایلهای هدر سیستمی باید از این مسیرهای گریز استفاده کنند؛ برنامههای کاربردی باید از آنها اجتناب نمایند.
برخی از هشدارها دربارهٔ برنامههای ناسازگار با استاندارد، توسط گزینههایی به جز -Wpedantic کنترل میشوند؛ در بسیاری از موارد آنها مستلزم -Wpedantic هستند اما میتوانند به طور جداگانه با گزینهٔ خاص خود غیرفعال شوند، مانند -Wpedantic -Wno-pointer-sign.
در مواردی که استاندارد مشخصشده با -std بیانگر یک گویش گسترشیافتهٔ گنو از C باشد (مانند gnu90 یا gnu99)، یک استاندارد پایه (base standard) متناظر وجود دارد، یعنی همان نسخه از ISO C که گویش گسترشیافتهٔ گنو بر پایهٔ آن است. هشدارهای -Wpedantic در مواردی صادر میشوند که استاندارد پایه آنها را الزامی کرده باشد. (منطقی نیست که چنین هشدارهایی تنها برای ویژگیهایی داده شوند که در گویش گنو C مشخصشده وجود ندارند، زیرا بر اساس تعریف، گویشهای گنو C شامل تمام ویژگیهایی هستند که کامپایلر با گزینهٔ دادهشده پشتیبانی میکند، و در نتیجه موردی برای هشدار دادن وجود نخواهد داشت.)
- -pedantic-errors
- هر زمان که
استاندارد
پایه (نگاه
کنید به -Wpedantic)
به یک پیام
عیبیابی
نیاز داشته
باشد، در
برخی موارد
که رفتار
تعریفنشده
در زمان
کامپایل
وجود دارد و
در برخی
موارد دیگر
که مانع از
کامپایل
برنامههای
معتبر
مطابق با
استاندارد
نمیشوند،
یک خطا صادر
میکند. این
معادل با
-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++ را که
پرچم
اختصاصی
خود را
دارند نیز
تقلیل
میدهد:
-Wdeclaration-missing-parameter-type (فقط C و Objective-C) -Wimplicit-function-declaration (فقط C و Objective-C) -Wimplicit-int (فقط C و Objective-C) -Wincompatible-pointer-types (فقط C و Objective-C) -Wint-conversion (فقط C و Objective-C) -Wnarrowing (فقط C++ و Objective-C++) -Wreturn-mismatch (فقط C و Objective-C) -Wtemplate-body (فقط C++ و Objective-C++)
گزینهٔ -fpermissive برای حالتهای تاریخی زبان C پیشفرض است (-std=c89، -std=gnu89، -std=c90، -std=gnu90).
- -Wall
- این گزینه
تمام
هشدارهایی
را دربارهٔ
ساختارهایی
که برخی
کاربران
مشکوک تلقی
میکنند و
اجتناب از
آنها (یا
اصلاح برای
جلوگیری از
هشدار) آسان
است، حتی
همراه با
ماکروها،
فعال
میکند.
همچنین
برخی از
هشدارهای
خاصِ زبان
را که در C++ Dialect
Options و Objective-C and Objective-C++ Dialect Options
شرح داده
شدهاند
فعال
میسازد.
گزینهٔ -Wall پرچمهای هشدار زیر را روشن میکند:
-Waddress -Waligned-new (فقط C++ و Objective-C++) -Warray-bounds=1 (تنها با -O2) -Warray-compare -Warray-parameter=2 -Wbool-compare -Wbool-operation -Wc++11-compat -Wc++14-compat -Wc++17compat -Wc++20compat -Wcatch-value (فقط C++ و Objective-C++) -Wchar-subscripts -Wclass-memaccess (فقط C++ و Objective-C++) -Wcomment -Wdangling-else -Wdangling-pointer=2 -Wdelete-non-virtual-dtor (فقط C++ و Objective-C++) -Wduplicate-decl-specifier (فقط C و Objective-C) -Wenum-compare (در C/ObjC؛ این گزینه در C++ به طور پیشفرض روشن است) -Wenum-int-mismatch (فقط C و Objective-C) -Wformat=1 -Wformat-contains-nul -Wformat-diag -Wformat-extra-args -Wformat-overflow=1 -Wformat-truncation=1 -Wformat-zero-length -Wframe-address -Wimplicit (فقط C و Objective-C) -Wimplicit-function-declaration (فقط C و Objective-C) -Wimplicit-int (فقط C و Objective-C) -Winfinite-recursion -Winit-self (فقط C++ و Objective-C++) -Wint-in-bool-context -Wlogical-not-parentheses -Wmain (تنها برای C/ObjC و مگر با -ffreestanding) -Wmaybe-uninitialized -Wmemset-elt-size -Wmemset-transposed-args -Wmisleading-indentation (تنها برای C/C++) -Wmismatched-dealloc -Wmismatched-new-delete (فقط C++ و Objective-C++) -Wmissing-attributes -Wmissing-braces (تنها برای C/ObjC) -Wmultistatement-macros -Wnarrowing (فقط C++ و Objective-C++) -Wnonnull -Wnonnull-compare -Wopenmp-simd (فقط C و C++) -Woverloaded-virtual=1 (فقط C++ و Objective-C++) -Wpacked-not-aligned -Wparentheses -Wpessimizing-move (فقط C++ و Objective-C++) -Wpointer-sign (تنها برای C/ObjC) -Wrange-loop-construct (فقط C++ و Objective-C++) -Wreorder (فقط C++ و Objective-C++) -Wrestrict -Wreturn-type -Wself-move (فقط C++ و Objective-C++) -Wsequence-point -Wsign-compare (فقط C++ و Objective-C++) -Wsizeof-array-div -Wsizeof-pointer-div -Wsizeof-pointer-memaccess -Wstrict-aliasing -Wstrict-overflow=1 -Wswitch -Wtautological-compare -Wtrigraphs -Wuninitialized -Wunknown-pragmas -Wunused -Wunused-but-set-variable -Wunused-const-variable=1 (تنها برای C/ObjC) -Wunused-function -Wunused-label -Wunused-local-typedefs -Wunused-value -Wunused-variable -Wuse-after-free=2 -Wvla-parameter -Wvolatile-register-var -Wzero-length-bounds
توجه داشته باشید که برخی از پرچمهای هشدار توسط -Wall فعال نمیشوند. برخی از آنها در مورد ساختارهایی هشدار میدهند که کاربران عموماً آنها را مشکوک نمیدانند، اما ممکن است گهگاه بخواهید آنها را بررسی کنید؛ برخی دیگر در مورد ساختارهایی هشدار میدهند که در مواردی ضروری هستند یا اجتناب از آنها دشوار است، و هیچ راه سادهای برای اصلاح کد جهت فرونشانی هشدار وجود ندارد. برخی از آنها توسط -Wextra فعال میشوند اما بسیاری از آنها باید به صورت جداگانه فعال گردند..IP -Wextra 4 این گزینه پرچمهای هشدار اضافی دیگری را فعال میکند که توسط -Wall فعال نشدهاند. (این گزینه قبلاً -W نامیده میشد. نام قدیمیتر همچنان پشتیبانی میشود، اما نام جدیدتر گویاتر است.)
-Wabsolute-value (تنها برای C/ObjC) -Walloc-size -Wcalloc-transposed-args -Wcast-function-type -Wclobbered -Wdangling-reference (تنها در C++) -Wdeprecated-copy (تنها در C++ و Objective-C++) -Wempty-body -Wenum-conversion (تنها برای C/ObjC) -Wexpansion-to-defined -Wignored-qualifiers (تنها برای C/C++) -Wimplicit-fallthrough=3 -Wmaybe-uninitialized -Wmissing-field-initializers -Wmissing-parameter-name (تنها در C/ObjC) -Wmissing-parameter-type (تنها در C/ObjC) -Wold-style-declaration (تنها در C/ObjC) -Woverride-init (تنها در C/ObjC) -Wredundant-move (تنها در C++ و Objective-C++) -Wshift-negative-value (در C++11 تا C++17 و در C99 و جدیدتر) -Wsign-compare (تنها در C++ و Objective-C++) -Wsized-deallocation (تنها در C++ و Objective-C++) -Wstring-compare -Wtype-limits -Wuninitialized -Wunterminated-string-initialization -Wunused-parameter (تنها به همراه -Wunused یا -Wall) -Wunused-but-set-parameter (تنها به همراه -Wunused یا -Wall)
گزینهٔ -Wextra همچنین برای موارد زیر پیامهای هشدار چاپ میکند:
- یک اشارهگر با "<"، "<="، ">"، یا ">=" با عدد صحیح صفر مقایسه شود.
- (تنها در C++) یک شمارنده (enumerator) و یک غیرشمارنده هر دو در یک عبارت شرطی ظاهر شوند.
- (تنها در C++) کلاسهای پایهٔ مجازی مبهم (Ambiguous virtual bases).
- (تنها در C++) اندیسگذاری آرایهای که بهصورت "register" اعلان شده است.
- (تنها در C++) گرفتن آدرس متغیری که بهصورت "register" اعلان شده است.
- (تنها در C++) یک کلاس پایه در سازندهٔ رونوشت (copy constructor) کلاس مشتقشده مقداردهی اولیه نشده باشد.
- -Wabi (تنها در C، Objective-C، C++ و Objective-C++)
- دربارهٔ
کدهایی که
تحت تأثیر
تغییرات ABI
قرار
گرفتهاند
هشدار
میدهد. این
شامل
کدهایی است
که ممکن است
با ABI مستقل
از سازندهٔ
C++ و همچنین psABI
برای مقصد
خاص سازگار
نباشد.
هشدارهای
مورد دوم
بهطور
جداگانه
توسط -Wpsabi که
توسط -Wabi نیز
اعمال
میشود،
کنترل
میشوند.
از آنجا که G++ اکنون بهطور پیشفرض در هر انتشار عمده ABI را بهروزرسانی میکند، معمولاً -Wabi تنها در صورتی دربارهٔ مشکلات سازگاری C++ ABI هشدار میدهد که در یک سری از انتشارات، بررسی جدیدی برای یک مشکل ABI که از زمان انتشار اولیه کشف شده، اضافه شده باشد. اگر یک نسخهٔ قدیمیتر ABI (با -fabi-version=n) انتخاب شده باشد، -Wabi دربارهٔ موارد بیشتری هشدار میدهد.
همچنین میتوان از -Wabi به همراه یک شماره نسخهٔ صریح استفاده کرد تا دربارهٔ سازگاری C++ ABI با یک سطح مشخص از -fabi-version هشدار دهد؛ به عنوان مثال -Wabi=2 برای هشدار دربارهٔ تغییرات نسبت به -fabi-version=2.
اگر یک شماره نسخهٔ صریح ارائه شود و -fabi-compat-version مشخص نشده باشد، شماره نسخهٔ برگرفته از این گزینه برای نامهای مستعار سازگاری استفاده میشود. اگر هیچ شماره نسخهٔ صریحی با این گزینه ارائه نشود، اما -fabi-compat-version مشخص شده باشد، آن شماره نسخه برای هشدارهای C++ ABI استفاده میشود.
اگرچه تلاش شده است تا دربارهٔ تمام این موارد هشدار داده شود، اما احتمالاً مواردی وجود دارد که با وجود تولید کد ناسازگار توسط G++، هشداری برای آنها صادر نمیشود. همچنین ممکن است مواردی وجود داشته باشد که با وجود سازگار بودن کد تولیدشده، هشدار صادر شود.
اگر نگران این موضوع هستید که کدهای تولیدشده توسط G++ ممکن است از نظر باینری با کدهای تولیدشده توسط سایر کامپایلرها سازگار نباشد، باید کد خود را بازنویسی کنید تا از این هشدارها جلوگیری شود.
ناسازگاریهای شناختهشده در -fabi-version=2 (که از GCC 3.4 تا 4.9 پیشفرض بود) شامل موارد زیر است:
- یک قالب (template)
با پارامتر
غیرنوعی
قالب از نوع
مرجع (reference type)
بهصورت
نادرست mangling
میشد:
extern int N; template <int &> struct S {}; void n (S<N>) {2}این مورد در -fabi-version=3 برطرف شد.
- انواع
برداری SIMD
اعلانشده
با استفاده
از "__attribute
((vector_size))" به
روشی غیر
استاندارد
mangling میشدند
که اجازهٔ
سربارگذاری
(overload) توابعی
با
اندازههای
مختلف
بردار را
نمیداد.
شیوهٔ mangling در -fabi-version=4 تغییر یافت.
- صفات "__attribute
((const))" و
"noreturn" به
عنوان
توصیفکنندههای
نوع mangling
میشدند، و
"decltype"
مربوط به یک
اعلان ساده
حذف (fold away)
میشد.
این مشکلات mangling در -fabi-version=5 برطرف شدند.
- شمارندههای
با دامنه (Scoped
enumerators) که به
عنوان
آرگومان به
یک تابع با
تعداد
متغیر
آرگومان
ارسال
میشوند،
مانند
شمارندههای
بدون دامنه
ارتقا
مییابند و
باعث اعلام
خطا توسط
"va_arg"
میشوند. در
بیشتر
مقاصد، این
مورد عملاً
بر ABI ارسال
پارامترها
تأثیری
ندارد،
زیرا هیچ
راهی برای
ارسال
آرگومان
کوچکتر از
"int" وجود
ندارد.
همچنین، ABI شیوهٔ mangling بستههای آرگومان قالب، "const_cast"، "static_cast"، افزایش/کاهش پیشوندی، و یک تابع با دامنهٔ کلاس که به عنوان آرگومان قالب استفاده شده را تغییر داد.
این مسائل در -fabi-version=6 اصلاح شدند.
- توابع
لامبدا در
دامنهٔ
آرگومانهای
پیشفرض
بهصورت
نادرست mangling
میشدند، و
ABI شیوهٔ mangling
مربوط به
"nullptr_t" را
تغییر داد.
این مسائل در -fabi-version=7 اصلاح شدند.
- هنگام mangling نوع
یک تابع
همراه با
توصیفکنندههای
cv تابع،
نوعِ بدون
توصیفکنندهٔ
تابع به
اشتباه به
عنوان یک
نامزد
جایگزینی
(substitution candidate) در نظر
گرفته
میشد.
این مورد در -fabi-version=8، مقدار پیشفرض در GCC 5.1، برطرف شد.
- مقدار
decltype(nullptr) به
نادرستی
دارای تراز
۱ بود که
منجر به
دسترسیهای
ناتراز (unaligned accesses)
میشد. توجه
داشته
باشید که
این موضوع
بر ABI تابعی
با پارامتر
"nullptr_t"
تأثیری
نداشت، چرا
که
پارامترها
دارای یک
حداقل تراز
هستند.
این مشکل در -fabi-version=9، مقدار پیشفرض در GCC 5.2، برطرف شد.
- صفات مختص
به معماری
مقصد که بر
ماهیت یک
نوع تأثیر
میگذارند،
مانند
قراردادهای
فراخوانی ia32
روی نوع
تابع (مانند
stdcall، regparm و غیره)،
بر نام mangled اثر
نمیگذاشتند
که در هنگام
استفاده از
اشارهگرهای
تابع به
عنوان
آرگومانهای
قالب منجر
به تداخل
نام میشد.
این مورد در -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) است. این هشدار توسط -Wall فعال میشود.
- -Wno-coverage-mismatch
- هنگام استفاده از گزینهٔ -fprofile-use، در صورتی که پروفایلهای بازخورد تطابق نداشته باشند، هشدار میدهد. اگر یک فایل مبدأ میان زمان کامپایل با -fprofile-generate و کامپایل با -fprofile-use تغییر کند، ممکن است فایلهای حاوی بازخورد پروفایل نتوانند با فایل مبدأ تطابق یابند و GCC نتواند از اطلاعات بازخورد پروفایل استفاده کند. بهطور پیشفرض، این هشدار فعال بوده و به عنوان یک خطا در نظر گرفته میشود. از -Wno-coverage-mismatch میتوان برای غیرفعال کردن هشدار، یا از -Wno-error=coverage-mismatch برای غیرفعال کردن خطا استفاده کرد. غیرفعال کردن حالت خطا برای این هشدار میتواند منجر به تولید کدی با بهینهسازی ضعیف شود و تنها در صورت اعمال تغییرات بسیار جزئی مانند رفع باگ در یک پایهکد موجود مفید است. غیرفعالسازی کامل این هشدار توصیه نمیشود..IP -Wno-coverage-too-many-conditions 4 هشدار در صورتی که -fcondition-coverage استفاده شود و یک عبارت دارای جملات (terms) بیش از حدی باشد و GCC از پوششدهی صرفنظر کند. پوششدهی زمانی رها میشود که تعداد جملات موجود در عبارت شرطی از تعداد بیتها در یک "gcov_type_unsigned" بیشتر باشد. این هشدار بهطور پیشفرض فعال است.
- -Wno-coverage-too-many-paths
- هشدار در صورتی که -fpath-coverage استفاده شود و یک تابع دارای مسیرهای بیش از حدی باشد و GCC از پوششدهی صرفنظر کند. رها کردن پوشش توسط -fpath-coverage-limit کنترل میشود. این هشدار بهطور پیشفرض فعال است.
- -Wno-coverage-invalid-line-number
- هشدار در
صورتی که یک
تابع به
دلیل
ماکروهای
نامعتبر
شماره خط (linenum)
زودتر از
نقطه شروع
خود پایان
یابد. این
هشدار تنها
هنگامی
صادر
میشود که
--coverage فعال
باشد.
بهطور پیشفرض، این هشدار فعال است و به عنوان یک خطا تلقی میشود. از -Wno-coverage-invalid-line-number میتوان برای غیرفعال کردن این هشدار، یا از -Wno-error=coverage-invalid-line-number برای جلوگیری از تلقی آن به عنوان خطا استفاده کرد.
- -Wno-cpp (فقط C، Objective-C، C++، Objective-C++ و Fortran)
- فرونشاندن و نادیده گرفتن پیامهای هشدار صادر شده توسط دستورات "#warning".
- -Wdouble-promotion (فقط C، C++، Objective-C و Objective-C++)
- هشداری در
زمان
ارتقای
ضمنی (implicit promotion) یک
مقدار از
نوع "float"
به "double"
میدهد.
پردازندههای
دارای واحد
ممیز شناور
۳۲-بیتی
«دقت
منفرد»
(single-precision)، نوع
"float" را
بهصورت
سختافزاری
پیادهسازی
میکنند،
اما "double"
را بهصورت
نرمافزاری
شبیهسازی
مینمایند.
در چنین
ماشینهایی،
انجام
محاسبات با
استفاده از
مقادیر
"double" به
دلیل سربار
ناشی از
شبیهسازی
نرمافزاری
بسیار
هزینهبرتر
است.
انجام تصادفی محاسبات با "double" بسیار آسان رخ میدهد زیرا لیترالهای ممیز شناور بهطور ضمنی از نوع "double" هستند. برای مثال، در:
float area(float radius) { return 3.14159 * radius * radius; }کامپایلر کل محاسبات را با نوع "double" انجام میدهد زیرا لیترال ممیز شناور از نوع "double" است.
- -Wduplicate-decl-specifier (فقط C و Objective-C)
- هشدار در صورتی که یک اعلان دارای مشخصکنندههای (specifier) تکراری "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 نسخه 2.2 بررسی میشوند. این موارد شامل تمامی ویژگیهای ISO C90 و C99 و همچنین ویژگیهایی از Single Unix Specification و برخی افزونههای BSD و GNU است. ممکن است پیادهسازیهای دیگر کتابخانهها از همهی این ویژگیها پشتیبانی نکنند؛ GCC از هشدار دادن درباره ویژگیهایی که فراتر از محدودیتهای یک کتابخانه خاص میروند، پشتیبانی نمیکند. با این حال، اگر -Wpedantic همراه با -Wformat استفاده شود، هشدارهایی درباره ویژگیهای قالبی که در نسخه استاندارد انتخابشده وجود ندارند داده میشود (اما نه برای قالبهای "strfmon"، زیرا آنها در هیچ نسخهای از استاندارد C نیستند).
- -Wformat=1
- -Wformat
- گزینه -Wformat معادل -Wformat=1 است و -Wno-format معادل -Wformat=0 میباشد. از آنجا که -Wformat همچنین آرگومانهای قالب تهی (null) را برای چندین تابع بررسی میکند، -Wformat متضمن -Wnonnull نیز هست. برخی از جنبههای این سطح از بررسی قالب را میتوان با گزینههای روبرو غیرفعال کرد: -Wno-format-contains-nul، -Wno-format-extra-args و -Wno-format-zero-length. گزینه -Wformat توسط -Wall فعال میشود.
- -Wformat=2
- فعالسازی -Wformat به همراه بررسیهای قالب اضافی. در حال حاضر معادل -Wformat -Wformat-nonliteral -Wformat-security -Wformat-y2k است.
- -Wno-format-contains-nul
- اگر -Wformat مشخص شده باشد، درباره رشتههای قالبی که حاوی بایتهای NUL هستند هشدار داده نشود.
- -Wno-format-extra-args
- اگر -Wformat مشخص
شده باشد،
درباره
آرگومانهای
اضافی برای
یک تابع
قالب
"printf" یا
"scanf"
هشدار داده
نشود.
استاندارد C
مشخص
میکند که
چنین
آرگومانهایی
نادیده
گرفته
میشوند.
در جایی که آرگومانهای استفادهنشده بین آرگومانهای استفادهشدهای قرار گیرند که با مشخصکنندههای شماره عملوند $ تعیین شدهاند، معمولاً هنوز هشدار داده میشود، زیرا پیادهسازی نمیتواند بداند چه نوعی را به "va_arg" ارسال کند تا از آرگومانهای استفادهنشده عبور کند. با این حال، در مورد قالبهای "scanf"، این گزینه در صورتی که تمام آرگومانهای استفادهنشده اشارهگر باشند هشدار را فرومینشاند، زیرا Single Unix Specification بیان میکند که چنین آرگومانهای استفادهنشدهای مجاز هستند.
- -Wformat-overflow
- -Wformat-overflow=level
- درباره فراخوانیهای توابع ورودی/خروجی قالببندیشده مانند "sprintf" و "vsprintf" که ممکن است باعث سرریز بافر مقصد شوند، هشدار میدهد. هنگامی که تعداد دقیق بایتهای نوشتهشده توسط یک دستور قالب در زمان کامپایل قابل تعیین نباشد، بر اساس روشهای اکتشافی (heuristics) که به آرگومان level و بهینهسازی بستگی دارند، تخمین زده میشود. در حالی که فعالسازی بهینهسازی در بیشتر موارد دقت هشدار را بهبود میبخشد، ممکن است منجر به موارد مثبت کاذب (false positives) نیز بشود.
- -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 حداقل اندازه بافر را در یک یادداشت اطلاعاتی پس از هشدار ذکر میکند.
یک جایگزین برای افزایش اندازه بافر مقصد، محدود کردن دامنه مقادیر قالببندیشده است. بیشترین طول آرگومانهای رشتهای را میتوان با مشخص کردن دقت در دستور قالب محدود کرد. هنگامی که بتوان فرض کرد آرگومانهای عددی دستورات قالب به مقداری کمتر از دقت نوع خود محدود شدهاند، انتخاب یک تعدیلکننده طول (length modifier) مناسب برای مشخصکننده قالب، اندازه بافر مورد نیاز را کاهش میدهد. برای مثال، اگر در نمونه بالا بتوان فرض کرد a و b در محدوده دقت نوع "short int" هستند، استفاده از دستور قالب %hi یا تبدیل نوع (cast) آرگومان به "short"، حداکثر اندازه بافر مورد نیاز را به ۲۴ بایت کاهش میدهد.
void f (int a, int b) { char buf [23]; sprintf (buf, "a = %hi, b = %i\n", a, (short)b); }
- -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 همچنین دربارهٔ فراخوانی توابع دارای کرانی هشدار میدهد که مقدار بازگشتی آنها استفاده شده است و در صورت دریافت آرگومانی با طول یا بزرگی کافی ممکن است منجر به کوتاهشدگی شوند.
- -Wformat-y2k
- اگر -Wformat مشخص شده باشد، همچنین دربارهٔ قالبهای "strftime" که ممکن است تنها یک سال دو رقمی تولید کنند هشدار میدهد.
- -Wnonnull
- دربارهٔ
ارسال
اشارهگر
تهی (null pointer) برای
آرگومانهایی
که با
مشخصهٔ
تابعی
"nonnull"
بهعنوان
نیازمند
مقدار
غیرتهی
علامتگذاری
شدهاند،
هشدار
میدهد.
-Wnonnull در -Wall و -Wformat گنجانده شده است. این گزینه را میتوان با گزینهٔ -Wno-nonnull غیرفعال کرد.
- -Wnonnull-compare
- هنگامی که
درون تابع،
آرگومان
علامتگذاریشده
با مشخصهٔ
تابعی
"nonnull" با null
مقایسه
شود، هشدار
میدهد.
-Wnonnull-compare در -Wall گنجانده شده است. این گزینه را میتوان با گزینهٔ -Wno-nonnull-compare غیرفعال کرد.
- -Wnull-dereference
- اگر کامپایلر مسیرهایی را تشخیص دهد که به دلیل ارجاعزدایی از یک اشارهگر تهی رفتار نادرست یا تعریفنشده ایجاد میکنند، هشدار میدهد. این گزینه تنها زمانی فعال است که -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 فعال باشد..IP -Wimplicit-fallthrough 4 گزینهٔ -Wimplicit-fallthrough همانند -Wimplicit-fallthrough=3 و -Wno-implicit-fallthrough همانند -Wimplicit-fallthrough=0 است.
- -Wimplicit-fallthrough=n
- هنگامی که
یک مورد (case) در
دستور switch به
مورد بعدی
سرریز
میکند (fall through
میشود)،
هشدار
میدهد.
برای نمونه:
switch (cond) { case 1: a = 1; break; case 2: a = 2; case 3: a = 3; break; }این هشدار زمانی که آخرین دستور یک case نتواند سرریز کند، هشداری صادر نمیکند؛ مثلاً زمانی که یک دستور return یا فراخوانی تابعی اعلانشده با مشخصهٔ noreturn وجود داشته باشد. -Wimplicit-fallthrough= همچنین دستورهای کنترل جریان مانند ifها را نیز در نظر میگیرد و تنها در موارد مناسب هشدار میدهد. به عنوان مثال:
switch (cond) { case 1: if (i > 3) { bar (5); break; } else if (i < 1) { bar (0); } else return; default: ... }از آنجا که مواردی وجود دارد که در آنها سرریز کردن مورد switch مطلوب است، GCC مشخصهای بهصورت "__attribute__ ((fallthrough))" ارائه میدهد که همراه با یک عبارت پوچ (null statement) برای فرونشاندن این هشدار که در حالت عادی رخ میداد، استفاده میشود:
switch (cond) { case 1: bar (0); __attribute__ ((fallthrough)); default: ... }استاندارد C++17 روشی استاندارد برای فرونشاندن هشدار -Wimplicit-fallthrough با استفاده از "[[fallthrough]];" بهجای مشخصهٔ GNU ارائه میدهد. در C++11 یا C++14 کاربران میتوانند از "[[gnu::fallthrough]];" استفاده کنند که یک افزونهٔ GNU است. بهجای این مشخصهها، میتوان یک کامنت سرریز (fallthrough) نیز قرار داد تا هشدار بیصدا شود. کل بدنهٔ کامنت به سبک C یا C++ باید با یکی از عبارتهای باقاعدهٔ فهرستشده در زیر مطابقت داشته باشد. آرگومان گزینهٔ n مشخص میکند چه نوع کامنتهایی پذیرفته میشوند:
- *<-Wimplicit-fallthrough=0 هشدار را بهطور کامل غیرفعال میکند.>
- *<-Wimplicit-fallthrough=1 با عبارت باقاعدهٔ ".*" مطابقت دارد،>
- هر کامنتی بهعنوان کامنت سرریز (fallthrough) در نظر گرفته میشود.
- *<-Wimplicit-fallthrough=2 بدون حساسیت به بزرگی و کوچکی حروف با>
- عبارت باقاعدهٔ ".*falls?[ \t-]*thr(ough|u).*" مطابقت پیدا میکند.
- *<-Wimplicit-fallthrough=3 با حساسیت به بزرگی و کوچکی حروف با یکی از>
- عبارتهای باقاعدهٔ زیر مطابقت دارد:
- *<"-fallthrough">
- *<"@fallthrough@">
- *<"lint -fallthrough[ \t]*">
- *<"[ \t.!]*(ELSE,? |INTENTIONAL(LY)? )?FALL(S | |-)?THR(OUGH|U)[ \t.!]*(-[^\n\r]*)?">
- *<"[ \t.!]*(Else,? |Intentional(ly)? )?Fall((s | |-)[Tt]|t)hr(ough|u)[ \t.!]*(-[^\n\r]*)?">
- *<"[ \t.!]*([Ee]lse,? |[Ii]ntentional(ly)? )?fall(s | |-)?thr(ough|u)[ \t.!]*(-[^\n\r]*)?">
- *<-Wimplicit-fallthrough=4 با حساسیت به بزرگی و کوچکی حروف با یکی از>
- عبارتهای باقاعدهٔ زیر مطابقت دارد:
- *<"-fallthrough">
- *<"@fallthrough@">
- *<"lint -fallthrough[ \t]*">
- *<"[ \t]*FALLTHR(OUGH|U)[ \t]*">
- *<-Wimplicit-fallthrough=5 هیچ کامنتی را بهعنوان کامنت سرریز>
- تشخیص نمیدهد؛ تنها مشخصهها (attributes) این هشدار را غیرفعال میکنند.
کامنت باید پس از فاصلههای خالی اختیاری و کامنتهای دیگر، با کلمات کلیدی "case" یا "default"، یا با یک برچسب کاربری که پیش از یک برچسب "case" یا "default" قرار دارد دنبال شود.
switch (cond)
{
case 1:
bar (0);
/* FALLTHRU */
default:
...
}
هشدار -Wimplicit-fallthrough=3 توسط -Wextra فعال میشود.
- -Wno-if-not-aligned (تنها C، C++، Objective-C و Objective-C++)
- کنترل میکند که آیا هشدارهای صادرشده توسط مشخصهٔ "warn_if_not_aligned" باید اعلام شوند یا خیر. این هشدارها بهطور پیشفرض فعال هستند.
- -Wignored-qualifiers (تنها C و C++)
- اگر نوع
بازگشتی یک
تابع دارای
توصیفکنندهٔ
نوع (type qualifier)
مانند
"const"
باشد،
هشدار
میدهد. در ISO C
چنین
توصیفکنندهای
هیچ اثری
ندارد،
زیرا مقدار
بازگرداندهشده
توسط یک
تابع lvalue نیست.
در C++، این
هشدار تنها
برای
نوعهای
اسکالر یا
"void" صادر
میشود.
استاندارد
ISO C انواع
بازگشتی
"void"
توصیفشده
را در
تعاریف
تابع ممنوع
میداند،
بنابراین
چنین انواع
بازگشتی
حتی بدون
این گزینه
نیز همواره
هشدار
دریافت
میکنند.
این هشدار همچنین توسط -Wextra فعال میشود.
- -Wno-ignored-attributes (تنها C و C++)
- این گزینه هشدارهای مربوط به نادیده گرفتن یک مشخصه را کنترل میکند. این گزینه با گزینهٔ -Wattributes متفاوت است؛ زیرا این گزینه هر زمان که کامپایلر تصمیم به نادیده گرفتن یک مشخصه بگیرد هشدار میدهد، نه زمانی که مشخصه ناشناخته باشد یا در مکان نادرستی استفاده شده باشد و غیره. این هشدار بهطور پیشفرض فعال است.
- -Wmain
- اگر نوع
تابع "main"
مشکوک
باشد،
هشدار
میدهد.
"main" باید
تابعی با
پیوند
خارجی (external linkage)
باشد که int
برمیگرداند
و بدون
آرگومان،
با دو، یا
با سه
آرگومان از
نوعهای
مناسب است.
این هشدار
بهطور
پیشفرض در
C++ فعال است و
توسط -Wall یا
-Wpedantic فعال
میشود.
این هشدار توسط -pedantic-errors به یک خطا تبدیل میشود.
- -Wmisleading-indentation (تنها C و C++)
- زمانی که
تورفتگی (indentation)
کد
بازتابدهندهٔ
ساختار
بلوکی آن
نباشد،
هشدار
میدهد.
بهویژه،
برای
بندهای
"if"،
"else"،
"while" و
"for" با یک
دستور تحت
حفاظت که از
آکوالاد
استفاده
نمیکند و
به دنبال آن
یک دستور
محافظتنشده
با همان
مقدار
تورفتگی
قرار دارد،
هشدار صادر
میشود.
در مثال زیر، فراخوانی «bar» بهگونهای گمراهکننده دارای تورفتگی است که گویی تحت حفاظت شرط «if» قرار دارد.
if (some_condition ()) foo (); bar (); /* Gotcha: this is not guarded by the "if". */
در صورت ترکیب کلیدهای Tab و فاصله (space)، این هشدار از گزینهٔ -ftabstop= برای تعیین همتراز بودن دستورها استفاده میکند (پیشفرض برابر با ۸ است).
این هشدار برای کدهایی که شامل منطق چندخطی پیشپردازنده هستند، مانند مثال زیر، صادر نمیشود.
if (flagA) foo (0); #if SOME_CONDITION_THAT_DOES_NOT_HOLD if (flagB) #endif foo (1);این هشدار پس از یک دستورالعمل "#line" صادر نمیشود، زیرا این معمولاً نشاندهندهٔ کدهای تولیدشده بهصورت خودکار است و هیچ فرضی نمیتوان دربارهٔ چیدمان فایلی که دستورالعمل به آن ارجاع میدهد، در نظر گرفت.
این هشدار توسط -Wall در C و C++ فعال میشود..IP -Wmissing-attributes 4 هنگامی هشدار میدهد که در اعلان یک تابع، یک یا چند صفت که یک تابع مرتبط با آنها اعلان شده و نبودشان ممکن است بر درستی یا کارایی کد تولیدشده تأثیر منفی بگذارد، وجود نداشته باشد. برای مثال، این هشدار برای اعلان نامهای مستعاری (aliases) صادر میشود که از صفتها برای تعیین نیازمندیهای محدودکنندهٔ کمتری نسبت به اهداف خود استفاده میکنند. این امر معمولاً نشاندهندهٔ یک فرصت بهینهسازی بالقوه است. در مقابل، گزینهٔ -Wattribute-alias=2 هشدارهایی را کنترل میکند که هنگام محدودکنندهتر بودن نام مستعار نسبت به هدف صادر میشوند، که میتواند به تولید کد نادرست منجر شود. صفتهای در نظر گرفته شده شامل "alloc_align"، "alloc_size"، "cold"، "const"، "hot"، "leaf"، "malloc"، "nonnull"، "noreturn"، "nothrow"، "pure"، "returns_nonnull" و "returns_twice" هستند.
در ++C، این هشدار هنگامی صادر میشود که یک تخصیص صریح (explicit specialization) از یک الگوی اصلی که با صفت "alloc_align"، "alloc_size"، "assume_aligned"، "format"، "format_arg"، "malloc" یا "nonnull" اعلان شده، بدون آن اعلان شود. صفتهای "deprecated"، "error" و "warning" این هشدار را سرکوب میکنند.
میتوانید از صفت "copy" برای اعمال همان مجموعه صفتها بر روی یک اعلان بدون نیاز به برشمردن صریح آنها مانند اعلان دیگر استفاده کنید. این صفت را میتوان روی اعلانهای توابع، متغیرها یا نوعها اعمال کرد.
گزینهٔ -Wmissing-attributes توسط -Wall فعال میشود.
برای مثال، از آنجا که اعلان الگوی تابع اصلی زیر از هر دو صفت "malloc" و "alloc_size" استفاده میکند، اعلان تخصیص صریح این الگو به دلیل غیبت یکی از صفتها اخطار دریافت میکند.
template <class T> T* __attribute__ ((malloc, alloc_size (1))) allocate (size_t); template <> void* __attribute__ ((malloc)) // missing alloc_size allocate<void> (size_t);
- -Wmissing-braces
- هشدار
میدهد اگر
یک مقدارده
اولیه برای
دادهٔ
تجمیعی (aggregate)
یا اجتماع (union)
به طور کامل
در آکولاد
قرار
نگرفته
باشد. در
مثال زیر،
مقدارده
اولیه برای
"a" به
طور کامل در
آکولاد
قرار
ندارد، اما
برای "b"
کاملاً
محصور در
آکولاد است.
int a[2][2] = { 0, 1, 2, 3 }; int b[2][2] = { { 0, 1 }, { 2, 3 } };این هشدار توسط -Wall فعال میشود.
- -Wmissing-include-dirs (تنها در C، C++، Objective-C، Objective-C++ و Fortran)
- هشدار میدهد اگر دایرکتوری include ارائهشده توسط کاربر وجود نداشته باشد. این گزینه بهطور پیشفرض برای C، C++، Objective-C و Objective-C++ غیرفعال است. برای Fortran، بهطور پیشفرض با هشدار دادن تنها برای -I و -J بهطور جزئی فعال است.
- -Wno-missing-profile
- این گزینه هشدارهایی را کنترل میکند که در صورت عدم وجود پروفایلهای بازخورد هنگام استفاده از گزینهٔ -fprofile-use صادر میشوند. این گزینه مواردی را شناسایی میکند که در آنها یک تابع یا فایل جدید بین کامپایل با -fprofile-generate و -fprofile-use بدون تولید مجدد پروفایلها اضافه شده باشد. در این موارد، فایلهای دادهٔ بازخورد پروفایل به ترتیب حاوی هیچ اطلاعات بازخورد پروفایلی برای تابع یا فایل جدیداً اضافهشده نیستند. همچنین در صورتی که فایلهای دادههای شمارش پروفایل (.gcda) حذف شده باشند، GCC نمیتواند از هیچ اطلاعات بازخورد پروفایلی استفاده کند. در تمامی این موارد، هشدارهایی صادر میشود تا به شما اطلاع دهد که مرحلهٔ تولید پروفایل باید انجام شود. نادیده گرفتن این هشدار میتواند منجر به تولید کدی با بهینهسازی ضعیف شود. گزینهٔ -Wno-missing-profile میتواند برای غیرفعال کردن هشدار استفاده شود، اما این کار توصیه نمیشود و تنها باید زمانی انجام شود که عدم وجود دادههای پروفایل توجیهپذیر باشد.
- -Wmismatched-dealloc
- برای
فراخوانی
توابع
آزادسازی
با
آرگومانهای
اشارهگر
بازگردانده
شده از
توابع
تخصیصی که
تابع اولی
آزادساز
مناسبی
برای آنها
نیست،
هشدار
میدهد. یک
جفت تابع را
میتوان با
استفاده از
صفت "malloc"
به عنوان
تخصیصدهنده
و آزادساز
متناظر با
یکدیگر
مرتبط کرد.
توابع
استاندارد
"calloc"،
"malloc"،
"realloc" و
"free"، و
همچنین
فرمهای
متناظر
"operator new" و
"operator delete" در
++C، مگر
اینکه با
گزینهٔ -fno-builtin
غیرفعال
شده باشند،
به طور ضمنی
به عنوان
تخصیصدهنده
و آزادساز
متناظر
شناخته
میشوند. در
مثال زیر
"mydealloc"
آزادساز
اشارهگرهای
بازگردانده
شده از
"myalloc" است.
void mydealloc (void*); __attribute__ ((malloc (mydealloc, 1))) void* myalloc (size_t); void f (void) { void *p = myalloc (32); // ...use p... free (p); // warning: not a matching deallocator for myalloc mydealloc (p); // ok }در ++C، گزینهٔ مرتبط -Wmismatched-new-delete عدم تطابقهای مربوط به "operator new" یا "operator delete" را شناسایی میکند.
گزینهٔ -Wmismatched-dealloc در -Wall گنجانده شده است.
- -Wmultistatement-macros
- دربارهٔ
ماکروهای
چنددستوری
ناامن که به
نظر میرسد
توسط بندی
مانند
"if"،
"else"،
"for"،
"switch" یا
"while"
محافظت
شدهاند،
اما پس از
بسط ماکرو
تنها دستور
اول واقعاً
محافظت
میشود،
هشدار
میدهد.
برای مثال:
#define DOIT x++; y++ if (c) DOIT;
مقدار "y" را بدون قید و شرط افزایش خواهد داد، نه فقط زمانی که شرط "c" برقرار باشد. این مشکل معمولاً با قرار دادن ماکرو در یک حلقهٔ do-while برطرف میشود:
#define DOIT do { x++; y++; } while (0) if (c) DOIT;این هشدار توسط -Wall در C و ++C فعال میشود.
- -Wparentheses
- هشدار
میدهد اگر
در
زمینههای
خاصی
پرانتزها
حذف شده
باشند،
مانند
زمانی که در
موقعیتی که
یک مقدار
درستی
انتظار
میرود یک
انتساب
وجود داشته
باشد، یا
زمانی که
عملگرهایی
تو در تو
شدهاند که
حق تقدم
آنها اغلب
باعث
سردرگمی
افراد
میشود.
همچنین اگر مقایسهای مانند "x<=y<=z" وجود داشته باشد هشدار میدهد؛ این عبارت معادل "(x<=y ? 1 : 0) <= z" است که با نمادگذاری معمول ریاضی تفسیر متفاوتی دارد.
همچنین برای کاربردهای خطرناک گسترش گنو عملگر "?:" با عملوند میانی حذفشده هشدار میدهد. هنگامی که شرط در عملگر "?": یک عبارت بولی باشد، مقدار حذفشده همواره ۱ است. اغلب برنامهنویسان انتظار دارند که در عوض، مقداری محاسبهشده درون عبارت شرطی باشد.
برای ++C این گزینه همچنین برای برخی موارد استفاده از پرانتزهای غیرضروری در اعلانها هشدار میدهد، که میتواند نشاندهندهٔ تلاشی برای فراخوانی تابع به جای یک اعلان باشد:
{ // Declares a local variable called mymutex. std::unique_lock<std::mutex> (mymutex); // User meant std::unique_lock<std::mutex> lock (mymutex); }این هشدار توسط -Wall فعال میشود.
- -Wno-self-move (تنها در C++ و Objective-C++)
- این هشدار
زمانی
اعلام
میشود که
مقداری با
"std::move" به
خودش منتقل
(move) شود. چنین
استفادهای
از "std::move"
معمولاً
هیچ اثری
ندارد.
struct T { ... }; void fn() { T t; ... t = std::move (t); }این هشدار توسط -Wall فعال میشود.
- -Wsequence-point
- دربارهٔ
کدهایی که
ممکن است به
دلیل نقض
قواعد نقاط
توالی (sequence point) در
استانداردهای
C و ++C دارای
معانی
تعریفنشده
باشند،
هشدار
میدهد.
استانداردهای C و ++C ترتیب ارزیابی عبارتها در یک برنامهٔ C/++C را بر اساس نقاط توالی تعریف میکنند؛ نقاطی که نمایانگر یک ترتیب جزئی بین اجرای بخشهایی از برنامه هستند: بخشهایی که قبل از نقطه توالی اجرا میشوند، و بخشهایی که بعد از آن اجرا میشوند. این نقاط پس از ارزیابی یک عبارت کامل (عبارتی که بخشی از یک عبارت بزرگتر نیست)، پس از ارزیابی نخستین عملوند عملگرهای "&&"، "||"، "? :" یا "," (کاما)، پیش از فراخوانی یک تابع (اما پس از ارزیابی آرگومانهای آن و عبارتی که تابع فراخوانیشده را مشخص میکند)، و در نقاط مشخص دیگری رخ میدهند. غیر از مواردی که توسط قواعد نقاط توالی بیان شده، ترتیب ارزیابی زیرعبارتهای یک عبارت مشخص نشده است. تمام این قواعد تنها یک ترتیب جزئی را بیان میکنند نه یک ترتیب کلی، زیرا برای مثال اگر دو تابع در یک عبارت فراخوانی شوند بدون اینکه بین آنها نقطه توالی وجود داشته باشد، ترتیب فراخوانی توابع نامشخص است. با این حال، کمیتهٔ استاندارد مقرر کرده است که فراخوانیهای توابع همپوشانی ندارند.
مشخص نشده است که در فاصله بین نقاط توالی، اعمال تغییرات روی مقادیر شیءها چه زمانی اثرگذار میشوند. برنامههایی که رفتار آنها به این موضوع وابسته است رفتاری تعریفنشده دارند؛ استانداردهای C و ++C تصریح میکنند که «بین نقطه توالی پیشین و پسین، مقدار ذخیرهشدهٔ یک شیء در اثر ارزیابی یک عبارت، حداکثر یک بار باید تغییر یابد. علاوه بر این، مقدار پیشین تنها باید برای تعیین مقداری که قرار است ذخیره شود خوانده شود.». اگر برنامهای این قواعد را نقض کند، نتایج آن روی هر پیادهسازی خاص کاملاً غیرقابلپیشبینی است.
نمونههایی از کدهایی با رفتار تعریفنشده عبارتند از "a = a++;"، "a[n] = b[n++]" و "a[i++] = i;". برخی موارد پیچیدهتر توسط این گزینه شناسایی نمیشوند و ممکن است گهگاه نتیجه مثبت کاذب بدهد، اما به طور کلی در تشخیص این نوع مشکلات در برنامهها بسیار کارآمد واقع شده است.
استاندارد C++17 ترتیب ارزیابی عملوندها را در موارد بیشتری تعریف خواهد کرد: بهویژه الزام میکند که سمت راست یک انتساب باید پیش از سمت چپ آن ارزیابی شود، بنابراین مثالهای بالا دیگر رفتار تعریفنشده ندارند. اما این گزینه همچنان دربارهٔ آنها هشدار میدهد تا به برنامهنویسان کمک کند از نوشتن کدهایی که در C و نگارشهای پیشین ++C رفتار تعریفنشده دارند خودداری کنند.
متن استاندارد به شکلی گیجکننده نگاشته شده است؛ از این رو در موارد ظریف و پیچیده، بحثهایی درباره مفهوم دقیق قواعد نقاط توالی وجود دارد. پیوندهایی به مباحث مربوط به این موضوع، از جمله تعاریف رسمی پیشنهادی، را میتوان در صفحهٔ خواندنیهای GCC به نشانی https://gcc.gnu.org/readings.html یافت.
این هشدار توسط -Wall برای C و ++C فعال میشود..IP -Wno-return-local-addr 4 در صورت برگرداندن یک اشارهگر (یا در ++C، یک ارجاع) به متغیری که پس از بازگشت تابع از دامنه (scope) خارج میشود، هشدار نمیدهد.
- -Wreturn-mismatch
- درباره
دستورهای return
بدون عبارت
در توابعی
که "void"
برنمیگردانند
هشدار
میدهد.
همچنین
درباره
دستور
"return"
همراه با یک
عبارت در
تابعی که
نوع
بازگشتی آن
"void" است
هشدار
میدهد،
مگر اینکه
نوع آن
عبارت نیز
"void" باشد.
به عنوان یک
افزونه گنو
(GNU extension)، مورد
اخیر بدون
هشدار
پذیرفته
میشود مگر
اینکه از
-Wpedantic استفاده
شود.
تلاش برای استفاده از مقدار بازگشتی یک تابع غیر-"void" (به جز "main") که اجرای آن با رسیدن به آکولاد بسته خاتمهدهنده تابع از انتهای آن خارج میشود، رفتاری تعریفنشده (undefined) است.
این هشدار مخصوص C است و به طور پیشفرض فعال است. در گویشهای C99 و بعد از آن، این مورد به عنوان خطا در نظر گرفته میشود. میتوان با استفاده از -fpermissive (همراه با هشدارهای دیگر) یا تنها برای این هشدار، با -Wno-error=return-mismatch آن را به یک هشدار تنزل داد.
- -Wreturn-type
- هرگاه
تابعی با
نوع
بازگشتی که
بهطور
پیشفرض
"int" است
تعریف شود
هشدار
میدهد (مگر
اینکه -Wimplicit-int
فعال باشد
که اولویت
دارد).
همچنین اگر
اجرای
برنامه
ممکن است به
انتهای
بدنه تابع
برسد، یا
اگر تابع
اصلاً شامل
هیچ دستور
بازگشتی
نباشد،
هشدار
میدهد.
تلاش برای استفاده از مقدار بازگشتی یک تابع غیر-"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 (و جدیدتر) فعال است. این سطح هشدار، درباره شیفت دادن ۱ به چپ به داخل بیت علامت هشدار نمیدهد. (با این حال، در C، چنین سرریزی همچنان در زمینههایی که عبارت ثابت عدد صحیح مورد نیاز است، رد میشود.) در حالت C++20 (و جدیدتر) هیچ هشداری صادر نمیشود، زیرا شیفتهای به چپ علامتدار همیشه سرریز چرخشی دارند (wrap میشوند).
- -Wshift-overflow=2
- این سطح هشدار علاوه بر این، درباره شیفت دادن ۱ به چپ به داخل بیت علامت هشدار میدهد، مگر اینکه حالت C++14 (یا جدیدتر) فعال باشد.
- -Wswitch
- هرگاه یک دستور "switch" شاخصی از نوع شمارشی داشته باشد و فاقد "case" برای یک یا چند مورد از مقادیر نامگذاریشده آن شمارش باشد، هشدار میدهد. (حضور برچسب "default" از این هشدار جلوگیری میکند.) همچنین در صورت استفاده از این گزینه، برچسبهای "case" که متناظر با اعضای شمارشی نباشند نیز موجب بروز هشدار میشوند، مگر اینکه شمارش با صفت "flag_enum" مشخص شده باشد. این هشدار توسط -Wall فعال میشود.
- -Wswitch-default
- هرگاه یک دستور "switch" فاقد مورد "default" باشد هشدار میدهد.
- -Wswitch-enum
- هرگاه یک دستور "switch" شاخصی از نوع شمارشی داشته باشد و فاقد "case" برای یک یا چند مورد از مقادیر نامگذاریشده آن شمارش باشد، هشدار میدهد. برچسبهای "case" که متناظر با اعضای شمارشی نباشند نیز در صورت استفاده از این گزینه موجب بروز هشدار میشوند، مگر اینکه شمارش با صفت "flag_enum" مشخص شده باشد. تنها تفاوت بین -Wswitch و این گزینه آن است که این گزینه حتی در صورت وجود برچسب "default" نیز برای مقادیر شمارشی جاافتاده هشدار میدهد.
- -Wno-switch-bool
- زمانی که یک
دستور
"switch"
شاخصی از
نوع بولی (boolean)
داشته باشد
و مقادیر case
خارج از
محدوده نوع
بولی
باشند،
هشدار
نمیدهد.
فرونشاندن
این هشدار
با تبدیل
صریح (cast)
عبارت
کنترلی به
نوعی غیر از
"bool"
امکانپذیر
است. برای
مثال:
switch ((int) (a == 4)) { ... }این هشدار بهطور پیشفرض برای برنامههای C و ++C فعال است.
- -Wno-switch-outside-range
- این گزینه هشدارهایی را کنترل میکند که در آنها مقدار یک "case" در "switch" خارج از محدوده نوع متناظر با خود باشد. این هشدار بهطور پیشفرض برای برنامههای C و ++C فعال است.
- -Wno-switch-unreachable
- زمانی که یک
دستور
"switch"
شامل
دستوراتی
میان عبارت
کنترلی و
نخستین
برچسب case
باشد که
هرگز اجرا
نخواهند
شد، هشدار
نمیدهد.
برای نمونه:
switch (cond) { i = 15; ... case 5: ... }اگر دستور میان عبارت کنترلی و نخستین برچسب case صرفاً یک اعلان (declaration) باشد، -Wswitch-unreachable هشدار نمیدهد:
switch (cond) { int i; ... case 5: i = 5; ... }این هشدار بهطور پیشفرض برای برنامههای C و ++C فعال است.
- -Wsync-nand (فقط C و ++C)
- هنگام استفاده از توابع درونی (built-in) "__sync_fetch_and_nand" و "__sync_nand_and_fetch" هشدار میدهد. معناشناسی این توابع در GCC 4.4 تغییر کرده است.
- -Wtrivial-auto-var-init
- زمانی که "-ftrivial-auto-var-init" نتواند متغیر خودکار را مقداردهی اولیه کند، هشدار میدهد. یک وضعیت متداول، متغیر خودکاری است که میان عبارت کنترلی و نخستین برچسب case یک دستور "switch" اعلان شده باشد.
- -Wunused-but-set-parameter
- هرگاه به یک
پارامتر
تابع
مقداری
انتساب
داده شود،
اما به غیر
از اعلان
آن،
استفاده
دیگری از آن
نشود،
هشدار
میدهد.
برای فرونشاندن این هشدار از صفت "unused" استفاده کنید.
این هشدار همچنین توسط -Wunused همراه با -Wextra فعال میشود.
- -Wunused-but-set-variable
- هرگاه به یک
متغیر محلی
مقداری
انتساب
داده شود،
اما به غیر
از اعلان
آن،
استفاده
دیگری از آن
نشود،
هشدار
میدهد. این
هشدار توسط
-Wall فعال
میشود.
برای فرونشاندن این هشدار از صفت "unused" استفاده کنید.
این هشدار همچنین توسط -Wunused که خود توسط -Wall فعال میشود، فعال میگردد.
- -Wunused-function
- هرگاه یک تابع static اعلان شده ولی تعریف نشده باشد، یا یک تابع static غیر inline بیاستفاده بماند، هشدار میدهد. این هشدار توسط -Wall فعال میشود.
- -Wunused-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 است..IP
-Wunused-variable 4 هرگاه
یک متغیر
محلی یا
ایستا (static) به
جز در اعلان
خود
استفاده
نشده باشد،
هشدار
میدهد. این
گزینه برای
C متضمن
-Wunused-const-variable=1 است،
اما برای ++C
نه. این
هشدار توسط
-Wall فعال
میشود.
برای فرونشاندن این هشدار، از صفت "unused" استفاده کنید.
- -Wunused-const-variable
- -Wunused-const-variable=n
- هرگاه یک
متغیر ثابت
ایستا (constant static)
به جز در
اعلان خود
استفاده
نشده باشد،
هشدار
میدهد.
برای فرونشاندن این هشدار، از صفت "unused" استفاده کنید.
- -Wunused-const-variable=1
- دربارهٔ
متغیرهای static
const
استفادهنشده
که در واحد
ترجمه اصلی
تعریف
شدهاند
هشدار
میدهد،
اما
دربارهٔ
متغیرهای static
const
اعلانشده
در هدرهای
گنجاندهشده
هشدار
نمیدهد.
-Wunused-const-variable=1 برای C توسط یکی از گزینههای -Wunused-variable یا -Wunused فعال میشود، اما برای ++C نه. در C این کار فضای ذخیرهسازی متغیر را اعلان میکند، اما در ++C این یک خطا نیست چرا که متغیرهای const جایگزین "#define"ها میشوند.
- -Wunused-const-variable=2
- این سطح هشدار همچنین برای متغیرهای ثابت ایستای استفادهنشده در هدرها (بهجز هدرهای سیستمی) هشدار میدهد. این با فرم کوتاه -Wunused-const-variable معادل است. این سطح باید صراحتاً هم در C و هم در ++C درخواست شود، زیرا ممکن است پاکسازی تمامی هدرهای گنجاندهشده دشوار باشد.
- -Wunused-value
- هرگاه یک
دستور
نتیجهای
را محاسبه
کند که
صراحتاً
استفاده
نمیشود،
هشدار
میدهد.
برای
فرونشاندن
این هشدار،
عبارت
استفادهنشده
را به "void"
کست کنید.
این شامل یک
عبارت-دستور
یا سمت چپ
عبارت کاما
که فاقد
عوارض
جانبی است
میشود.
برای
نمونه،
عبارتی
مانند
"x[i,j]"
باعث ایجاد
هشدار
میشود، در
حالی که
"x[(void)i,j]"
هشداری
تولید
نمیکند.
این هشدار توسط -Wall فعال میشود.
- -Wunused
- ترکیب تمام
گزینههای
-Wunused بالا،
بهجز
مواردی که
مستند شده
است باید
صراحتاً
مشخص شوند.
به منظور دریافت هشدار دربارهٔ پارامتر تابع استفادهنشده، باید یا -Wextra -Wunused را مشخص کنید (توجه داشته باشید که -Wall متضمن -Wunused است)، یا بهطور جداگانه -Wunused-parameter و/یا -Wunused-but-set-parameter را تعیین نمایید.
گزینهٔ -Wunused تنها -Wunused-const-variable=1 را بهجای -Wunused-const-variable فعال میکند، و آن هم فقط برای C، نه ++C.
- -Wuse-after-free (تنها در C، Objective-C، ++C و Objective-C++)
- -Wuse-after-free=n
- دربارهٔ استفاده از اشارهگرها به اشیای پویای تخصیصیافته که در اثر فراخوانی یک تابع آزادسازی نامعین شدهاند، هشدار میدهد. این هشدار در همهٔ سطوح بهینهسازی فعال است اما ممکن است با بهینهسازی، نتایجی متفاوت از بدون بهینهسازی تولید کند.
- -Wuse-after-free=1
- در سطح ۱، این هشدار تلاش میکند فقط استفادههای نامشروط از اشارهگرهایی را تشخیص دهد که با یک فراخوانی آزادسازی یا یک فراخوانی موفق به "realloc" نامعین شدهاند، صرفنظر از اینکه آیا آن فراخوانی منجر به بازتخصیص واقعی حافظه شده است یا خیر. این شامل فراخوانیهای مضاعف "free" و همچنین استفاده در عبارتهای حسابی و رابطهای است. اگرچه رفتار تعریفنشده است، استفاده از اشارهگرهای نامعین در عبارتهای برابری (یا نابرابری) در این سطح تشخیص داده نمیشود.
- -Wuse-after-free=2
- در سطح ۲،
علاوه بر
استفادههای
نامشروط،
این هشدار
همچنین
استفادههای
مشروط از
اشارهگرهایی
را که با یک
فراخوانی
آزادسازی
نامعین
شدهاند
تشخیص
میدهد.
همانند سطح
۲، استفاده
در
عبارتهای
برابری (یا
نابرابری)
تشخیص داده
نمیشود.
برای
نمونه،
دومین
فراخوانی
"free" در
تابع زیر در
این سطح
تشخیص داده
میشود:
struct A { int refcount; void *data; }; void release (struct A *p) { int refcount = --p->refcount; free (p); if (refcount == 0) free (p->data); // warning: p may be used after free } - -Wuse-after-free=3
- در سطح ۳،
این هشدار
همچنین
استفاده از
اشارهگرهای
نامعین را
در
عبارتهای
برابری
تشخیص
میدهد.
تمام
استفادهها
از
اشارهگرهای
نامعین
تعریفنشده
هستند، اما
آزمونهای
برابری
گاهی اوقات
پس از
فراخوانیهای
"realloc" به
عنوان
تلاشی برای
تعیین
اینکه آیا
فراخوانی
منجر به
جابجایی
شیء به
نشانی
دیگری شده
است ظاهر
میشوند.
آنها در
سطحی
جداگانه
تشخیص داده
میشوند تا
به گذار
تدریجی
کدهای
قدیمی به
جایگزینهای
امن کمک
کنند. برای
نمونه،
آزمون
برابری در
تابع زیر در
این سطح
تشخیص داده
میشود:
void adjust_pointers (int**, int); void grow (int **p, int n) { int **q = (int**)realloc (p, n *= 2); if (q == p) return; adjust_pointers ((int**)q, n); }برای جلوگیری از هشدار در این سطح، به جای اشارهگرها، آفستها را در حافظهٔ تخصیصیافته ذخیره کنید. این رویکرد نیاز به تنظیم اشارهگرهای ذخیرهشده را پس از تخصیص مجدد حافظه برطرف میکند.
گزینهٔ -Wuse-after-free=2 در -Wall گنجانده شده است.
- -Wuseless-cast (تنها در C، Objective-C، ++C و Objective-C++)
- هنگامی که
یک عبارت به
نوع خودش
کست شود،
هشدار
میدهد. این
هشدار
زمانی رخ
نمیدهد که
یک شیءِ
کلاس به یک
نوع
غیرمرجع
تبدیل شود،
زیرا این
روشی برای
ایجاد یک
شیء موقت
است:
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" از یک تابع توکار (built-in) که خواندن شیء توسط آن شناخته شده است نیز توسط این هشدار تشخیص داده میشود. (-Wmaybe-uninitialized برای توابع عادی صادر میشود.)
اگر میخواهید درباره کدی که از مقدار مقداردهینشدهٔ متغیر در مقداردهندهٔ اولیه خودش استفاده میکند هشدار دریافت کنید، از گزینهٔ -Winit-self استفاده نمایید.
این هشدارها هم برای عناصر منفردِ مقداردهینشدهٔ متغیرهای ساختار، اجتماع (union) یا آرایه و هم برای متغیرهایی که در کل مقداردهی نشدهاند رخ میدهند. آنها برای متغیرها یا عناصری که بهصورت "volatile" اعلان شدهاند رخ نمیدهند. از آنجا که این هشدارها به بهینهسازی وابستهاند، متغیرها یا عناصر دقیقی که برای آنها هشدار صادر میشود به گزینههای دقیق بهینهسازی و نسخهٔ GCC مورد استفاده بستگی دارند.
توجه داشته باشید که ممکن است دربارهٔ متغیری که فقط برای محاسبه مقداری استفاده میشود که خود آن مقدار هرگز استفاده نمیشود هشداری داده نشود، زیرا چنین محاسباتی ممکن است پیش از چاپ هشدارها توسط تحلیل جریان داده حذف شوند.
در ++C، این هشدار همچنین دربارهٔ استفاده از اشیای مقداردهینشده در فهرستهای مقداردهی اولیهٔ اعضا (member-initializer-lists) هشدار میدهد. برای نمونه، GCC دربارهٔ مقداردهینشده بودن "b" در قطعهکد زیر هشدار میدهد:
struct A { int a; int b; A() : a(b) { } }; - -Wno-invalid-memory-model
- این گزینه
هشدارهای
مربوط به
فراخوانیهای
__atomic Builtins، __sync Builtins و
توابع
عمومی
اتمیک C11 را
با آرگومان
سازگاری
حافظهای
که یا برای
عملیات
نامعتبر
است یا خارج
از محدودهٔ
مقادیر
شمارشِ
"memory_order"
قرار دارد،
کنترل
میکند.
برای
نمونه، از
آنجا که
توابع
توکار
"__atomic_store" و
"__atomic_store_n"
تنها برای
ترتیبهای
حافظهٔ relaxed، release
و sequentially consistent تعریف
شدهاند،
کد زیر
تشخیص داده
میشود:
void store (int *i) { __atomic_store_n (i, 0, memory_order_consume); }گزینهٔ -Winvalid-memory-model بهطور پیشفرض فعال است..IP -Wmaybe-uninitialized 4 برای شیئی با طول عمر ذخیرهسازی خودکار یا تخصیصیافته، اگر مسیری از ورود به تابع تا محل استفاده از شیء وجود داشته باشد که در آن مقداردهی اولیه شده است، اما مسیرهای دیگری وجود داشته باشند که در آنها شیء مقداردهی اولیه نشده باشد، کامپایلر چنانچه نتواند اثبات کند که مسیرهای مقداردهینشده در زمان اجرا اجرا نمیشوند، هشداری صادر میکند.
علاوه بر این، ارسال یک اشارهگر (یا در C++ یک مرجع) به یک شیء مقداردهینشده به آرگومانی از تابع با واجد شرایطِ "const" نیز با این هشدار شناسایی میشود. (-Wuninitialized برای توابع توکار که خواندن شیء توسط آنها مشخص است صادر میشود.) نشانهگذاری تابع با صفت "access (none)" نشان میدهد که از این آرگومان برای دسترسی به شیء استفاده نمیشود و از بروز هشدار جلوگیری میکند.
این هشدارها تنها در زمان کامپایل بهینهساز ممکن هستند، زیرا در غیر این صورت GCC وضعیت متغیرها را دنبال نمیکند.
این هشدارها اختیاری در نظر گرفته شدهاند زیرا ممکن است GCC نتواند تشخیص دهد چه زمانی کد با وجود ظاهر خطادار، در واقع صحیح است. در اینجا نمونهای از چگونگی رخ دادن این وضعیت آورده شده است:
{ int x; switch (y) { case 1: x = 1; break; case 2: x = 4; break; case 3: x = 5; } foo (x); }اگر مقدار "y" همیشه 1، 2 یا 3 باشد، آنگاه "x" همیشه مقداردهی اولیه میشود، اما GCC این موضوع را نمیداند. برای فرونشاندن این هشدار، باید یک حالت پیشفرض (default) همراه با assert(0) یا کدی مشابه قرار دهید.
این گزینه همچنین زمانی که یک متغیر خودکارِ غیر فرّار (non-volatile) ممکن است با فراخوانی "longjmp" تغییر کند هشدار میدهد. کامپایلر تنها فراخوانیهای "setjmp" را میبیند و نمیتواند بداند "longjmp" در کجا فراخوانی خواهد شد؛ در واقع، یک گردانندهٔ سیگنال میتواند آن را در هر نقطهای از کد فراخوانی کند. در نتیجه، ممکن است حتی زمانی که در واقع مشکلی وجود ندارد هشدار دریافت کنید، چرا که در عمل نمیتوان "longjmp" را در نقطهای که باعث بروز مشکل شود فراخوانی کرد.
میتوان از برخی هشدارهای کاذب با اعلان کردن توابعی که هرگز بازنمیگردند به صورت "noreturn" جلوگیری کرد.
این هشدار با -Wall یا -Wextra فعال میشود.
- -Wunknown-pragmas
- هنگامی که یک دستورالعمل "#pragma" مشاهده شود که توسط GCC شناختهشده نیست، هشدار میدهد. اگر این گزینهٔ خط فرمان استفاده شود، هشدارها حتی برای پراگماهای ناشناخته در فایلهای سرآیند سیستمی نیز صادر میشوند. در صورتی که هشدارها فقط از طریق گزینهٔ خط فرمان -Wall فعال شده باشند، چنین نخواهد بود.
- -Wno-pragmas
- در مورد استفادههای نادرست از پراگماها، مانند پارامترهای نادرست، نحو نامعتبر یا تداخل میان پراگماها هشدار نمیدهد. همچنین ببینید: -Wunknown-pragmas.
- -Wno-pragma-once-outside-header
- هنگامی که "#pragma once" در فایلی غیر از فایل سرآیند، مانند یک فایل منبع اصلی استفاده شود، هشدار نمیدهد.
- -Wno-prio-ctor-dtor
- اگر اولویتی بین 0 تا 100 برای سازنده یا نابودکننده استفاده شود، هشدار نمیدهد. استفاده از صفتهای سازنده (constructor) و نابودکننده (destructor) به شما امکان میدهد تا اولویتی را تعیین کنید تا ترتیب اجرای آنها قبل از فراخوانی "main" یا پس از بازگشت از آن کنترل شود. مقادیر اولویت باید بزرگتر از 100 باشند زیرا کامپایلر مقادیر اولویت بین 0 تا 100 را برای پیادهسازی رزرو کرده است.
- -Wstrict-aliasing
- این گزینه تنها زمانی فعال است که -fstrict-aliasing فعال باشد. این گزینه در مورد کدی که ممکن است قواعد نام مستعار صریح (strict aliasing) را که کامپایلر برای بهینهسازی استفاده میکند نقض کند، هشدار میدهد. این هشدار همه موارد را پوشش نمیدهد، اما تلاش میکند تا تلههای رایجتر را شناسایی کند. این گزینه در -Wall گنجانده شده است. این گزینه معادل -Wstrict-aliasing=3 است.
- -Wstrict-aliasing=n
- این گزینه
تنها زمانی
فعال است که
-fstrict-aliasing فعال
باشد. این
گزینه در
مورد کدی که
ممکن است
قواعد نام
مستعار
صریح را که
کامپایلر
برای
بهینهسازی
استفاده
میکند نقض
کند، هشدار
میدهد.
سطوح
بالاتر
نشاندهنده
دقت بالاتر
(موارد مثبت
کاذب کمتر)
هستند. سطوح
بالاتر
همچنین
مستلزم
پردازش
بیشتری
هستند،
مشابه روشی
که -O کار
میکند. -Wstrict-aliasing
معادل -Wstrict-aliasing=3
است.
سطح 1: تهاجمیترین، سریع، دارای کمترین دقت. احتمالاً زمانی مفید است که سطوح بالاتر هشدار نمیدهند اما -fstrict-aliasing همچنان کد را دچار اختلال میکند، زیرا موارد منفی کاذب بسیار کمی دارد. با این حال، موارد مثبت کاذب زیادی تولید میکند. برای تمام تبدیلهای اشارهگر بین انواع احتمالاً ناسازگار، حتی اگر هرگز ارجاعزدایی نشوند، هشدار میدهد. تنها در فرانتاند (front end) اجرا میشود.
سطح 2: تهاجمی، سریع، نه چندان دقیق. ممکن است همچنان موارد مثبت کاذب زیادی داشته باشد (البته نه به اندازه سطح 1)، و موارد منفی کاذب کمی دارد (اما احتمالاً بیشتر از سطح 1). برخلاف سطح 1، تنها زمانی هشدار میدهد که آدرس گرفته شده باشد. در مورد انواع ناقص (incomplete types) هشدار میدهد. تنها در فرانتاند اجرا میشود.
سطح 3 (پیشفرض برای -Wstrict-aliasing): باید دارای موارد مثبت کاذب بسیار اندک و موارد منفی کاذب کمی باشد. در صورت فعال بودن بهینهسازی، اندکی کندتر از سطوح 1 یا 2 است. به الگوی رایج تغییر نوع اشارهگر و ارجاعزدایی در فرانتاند رسیدگی میکند: "*(int*)&some_float". اگر بهینهسازی فعال باشد، در بکاند (back end) نیز اجرا میشود؛ جایی که با استفاده از اطلاعات حساس به جریان اشارهبه (points-to)، موارد دارای چندین عبارت را پردازش میکند. تنها زمانی هشدار میدهد که اشارهگر تبدیلشده ارجاعزدایی شود. در مورد انواع ناقص هشدار نمیدهد.
- -Wstrict-overflow
- -Wstrict-overflow=n
- این گزینه
تنها زمانی
فعال است که
سرریز
علامتدار
تعریفنشده
باشد. این
گزینه در
مواردی
هشدار
میدهد که
کامپایلر
بر اساس این
فرض که
سرریز
علامتدار
رخ نمیدهد
بهینهسازی
انجام
میدهد.
توجه داشته
باشید که
این گزینه
در مورد
تمام
مواردی که
ممکن است کد
سرریز کند
هشدار
نمیدهد:
فقط در
مواردی
هشدار
میدهد که
کامپایلر
نوعی
بهینهسازی
را
پیادهسازی
کرده باشد.
بنابراین
این هشدار
به سطح
بهینهسازی
بستگی دارد.
بهینهسازیای که فرض میکند سرریز علامتدار رخ نمیدهد، در صورتی که مقادیر متغیرهای درگیر بهگونهای باشند که سرریز در عمل هرگز اتفاق نیفتد، کاملاً ایمن است. بنابراین این هشدار بهراحتی میتواند یک مورد مثبت کاذب ایجاد کند: هشداری دربارهٔ کدی که در واقعیت مشکلی ندارد. برای کمک به تمرکز بر روی مسائل مهم، چندین سطح هشدار تعریف شده است. هیچ هشداری برای استفاده از سرریز علامتدار تعریفنشده هنگام تخمین تعداد تکرارهای یک حلقه، بهویژه در تعیین اینکه آیا اصلاً یک حلقه اجرا خواهد شد یا خیر، صادر نمیشود.
- -Wstrict-overflow=1
- در مورد مواردی هشدار میدهد که هم جای تردید دارند و هم اجتناب از آنها آسان است. به عنوان مثال، کامپایلر "x + 1 > x" را به 1 ساده میکند. این سطح از -Wstrict-overflow توسط -Wall فعال میشود؛ سطوح بالاتر فعال نمیشوند و باید صراحتاً درخواست شوند.
- -Wstrict-overflow=2
- همچنین در مورد موارد دیگری که یک مقایسه به یک مقدار ثابت ساده میشود هشدار میدهد. به عنوان مثال: "abs (x) >= 0". این مورد تنها زمانی میتواند ساده شود که سرریز عدد صحیح علامتدار تعریفنشده باشد، زیرا "abs (INT_MIN)" با سرریز به "INT_MIN" تبدیل میشود که کمتر از صفر است. -Wstrict-overflow (بدون سطح) معادل -Wstrict-overflow=2 است.
- -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
- برای
کدهایی که
میتوان به
صورت ایستا
تشخیص داد
باعث سرریز
بافر یا
دسترسی
فراتر از
حافظه مجاز
(memory overrun)
میشوند،
مانند
فراخوانیهای
"memcpy" و
"strcpy" که
از بافر
مقصد سرریز
میکنند،
هشدار
میدهد.
آرگومان
اختیاری،
یک واحد
بیشتر از
نوع بررسی
اندازه شیء
(Object Size Checking) است که
برای تعیین
اندازه
مقصد انجام
میشود. این
آرگومان
تنها برای
توابع
رشتهای که
روی
آرایههای
نویسهای
عمل
میکنند
معنیدار
است؛ توابع
حافظه خام
مانند
"memcpy"
همیشه از Object Size
Checking نوع صفر
استفاده
میکنند.
این گزینه همچنین برای فراخوانیهایی که اندازهای فراتر از بزرگترین شیء ممکن یا حداکثر "SIZE_MAX / 2" بایت را مشخص میکنند، هشدار میدهد.
این گزینه در صورت فعال بودن بهینهسازی بهترین نتایج را ارائه میدهد، اما حتی بدون بهینهسازی نیز میتواند زیرمجموعه کوچکی از سرریزهای بافر ساده را در فراخوانی توابع داخلی (built-in) کامپایلر GCC مانند "__builtin_memcpy" که متناظر با توابع استاندارد هستند تشخیص دهد. در هر صورت، این گزینه تنها در مورد زیرمجموعهای از سرریزهای بافر هشدار میدهد که توسط توابع داخلی متناظرِ بررسی سرریز مانند "__builtin___memcpy_chk" تشخیص داده میشوند؛ توابعی که میتوانند در صورتی که ایمن بودن دسترسی در زمان کامپایل قابل تشخیص نباشد، بررسی زمان اجرا را انجام دهند.
برای نمونه، این گزینه برای فراخوانی "strcpy" در زیر یک هشدار صادر میکند زیرا دستکم ۵ نویسه (رشته "blue" شامل "NUL" انتهایی) را در بافری به اندازه ۴ کپی میکند.
enum Color { blue, purple, yellow }; const char* f (enum Color clr) { static char buf [4]; const char *str; switch (clr) { case blue: str = "blue"; break; case purple: str = "purple"; break; case yellow: str = "yellow"; break; } return strcpy (buf, str); // warning here }اثر این گزینه به توابع دستکاری رشته یا حافظه محدود نمیشود. در این مثال، هشداری صادر میشود زیرا یک آرایه ۱-عنصری به تابعی ارسال شده که نیازمند آرگومانی از نوع آرایه حداقل ۴-عنصری است:
void f (int[static 4]); void g (void) { int *p = (int *) malloc (1 * sizeof(int)); f (p); // warning here }گزینه -Wstringop-overflow=2 به طور پیشفرض فعال است.
- -Wstringop-overflow
- -Wstringop-overflow=1
- گزینه -Wstringop-overflow=1 از Object Size Checking نوع صفر برای تعیین اندازه اشیاء مقصد استفاده میکند. در این تنظیم، این گزینه برای نوشتن فراتر از انتهای زیرشیءهای اشیاء بزرگتر که از طریق اشارهگرها قابل دسترسی هستند هشداری نمیدهد، مگر اینکه اندازه بزرگترین شیء احاطهکننده مشخص باشد. هنگامی که مقصد ممکن است یکی از چند شیء باشد، بزرگترین آنها در نظر گرفته میشود. در سیستمهای لینوکس، زمانی که بهینهسازی در این تنظیم فعال باشد، این گزینه برای همان کدهایی هشدار میدهد که ماکروی "_FORTIFY_SOURCE" روی یک مقدار غیر صفر تعریف شده باشد.
- -Wstringop-overflow=2
- گزینه -Wstringop-overflow=2 از Object Size Checking نوع یک برای تعیین اندازه اشیاء مقصد استفاده میکند. در این تنظیم، گزینه درباره سرریزها هنگام نوشتن در اعضای بزرگترین اشیاء کاملی که اندازه دقیق آنها مشخص است هشدار میدهد. با این حال، برای نوشتن بیش از حد در اعضای مشابه از اشیاء ناشناخته که توسط اشارهگرها ارجاع داده شدهاند هشدار نمیدهد، چرا که ممکن است به آرایههایی با تعداد عناصر نامشخص اشاره کنند. این تنظیم پیشفرض گزینه است.
- -Wstringop-overflow=3
- گزینه -Wstringop-overflow=3 از Object Size Checking نوع دو برای تعیین اندازه اشیاء مقصد استفاده میکند. در این تنظیم، گزینه در مورد سرریز از کوچکترین شیء یا عضو داده هشدار میدهد. این سختگیرانهترین تنظیم گزینه است که ممکن است منجر به صدور هشدار برای کدهای ایمن شود.
- -Wstringop-overflow=4
- گزینه -Wstringop-overflow=4 از Object Size Checking نوع سه برای تعیین اندازه اشیاء مقصد استفاده میکند. در این تنظیم، گزینه در مورد سرریز از هر عضو داده هشدار میدهد، و هنگامی که مقصد یکی از چند شیء باشد، از اندازه بزرگترین آنها برای تصمیمگیری درباره صدور هشدار استفاده میکند. مشابه با -Wstringop-overflow=3، این تنظیم گزینه نیز ممکن است هشدارهایی برای کدهای بیخطر صادر کند.
- -Wno-stringop-overread
- برای
فراخوانی
توابع
دستکاری
رشته مانند
"memchr" یا
"strcpy" که
مشخص شده
است فراتر
از انتهای
دنباله
مبدأ
میخوانند،
هشدار
میدهد.
گزینه -Wstringop-overread به طور پیشفرض فعال است.
- -Wno-stringop-truncation
- برای
فراخوانی
توابع مقید
دستکاری
رشته مانند
"strncat"،
"strncpy" و
"stpncpy" که
ممکن است
رشته
کپیشده را
کوتاه (truncate)
کنند یا
مقصد را
بدون تغییر
باقی
بگذارند،
هشدار
نمیدهد.
در مثال زیر، فراخوانی "strncat" حدی را مشخص میکند که کمتر از طول رشته مبدأ است. در نتیجه، نسخه کپیشده از مبدأ کوتاه خواهد شد و بنابراین برای این فراخوانی هشدار داده میشود. برای جلوگیری از این هشدار، از "bufsize - strlen (buf) - 1)" به عنوان حد استفاده کنید.
void append (char *buf, size_t bufsize) { strncat (buf, ".txt", 3); }به عنوان مثالی دیگر، فراخوانی زیر برای "strncpy" منجر به کپی شدن تنها نویسههای پیش از "NUL" انتهایی به "d" میشود، بدون آنکه "NUL" به انتها افزوده گردد. این فرض که نتیجه "strncpy" لزوماً یک رشته ختمشده به "NUL" است یک اشتباه رایج به شمار میرود، و بنابراین برای این فراخوانی هشدار داده میشود. برای اجتناب از این هشدار هنگامی که انتظار نمیرود نتیجه به "NUL" ختم شود، به جای آن "memcpy" را فراخوانی کنید.
void copy (char *d, const char *s) { strncpy (d, s, strlen (s)); }در مثال زیر، فراخوانی "strncpy" اندازه بافر مقصد را به عنوان حد مشخص میکند. اگر طول رشته مبدأ برابر یا بیشتر از این اندازه باشد، نتیجه کپی به "NUL" ختم نخواهد شد. از این رو، این فراخوانی نیز مشمول هشدار میشود. برای جلوگیری از این هشدار، "sizeof buf - 1" را به عنوان حد تعیین کرده و آخرین عنصر بافر را روی "NUL" تنظیم کنید.
void copy (const char *s) { char buf[80]; strncpy (buf, s, sizeof buf); ... }در مواردی که یک آرایه نویسهای به منظور ذخیره دنبالهای از بایتها بدون "NUL" انتهایی در نظر گرفته شده باشد، میتوان چنین آرایهای را با صفت "nonstring" نشانهگذاری کرد تا از این هشدار جلوگیری شود. با این حال، چنین آرایههایی آرگومانهای مناسبی برای توابعی که انتظار رشتههای ختمشده به "NUL" را دارند نیستند. برای کمک به شناسایی سوءاستفادههای تصادفی از این آرایهها، GCC هشدار صادر میکند مگر اینکه بتواند اثبات کند که استفاده ایمن است.
- -Wstrict-flex-arrays (تنها C و C++)
- درباره
استفادههای
نادرست از
اعضای
آرایه
انعطافپذیر
(flexible array members) بر اساس
مقدار level
صفت "strict_flex_array
(level)"
ضمیمهشده
به فیلد
آرایه
پایانی
ساختار در
صورت وجود،
و در غیر
این صورت بر
اساس مقدار
level گزینه
-fstrict-flex-arrays=level
هشدار
میدهد.
گزینه
"-Wstrict-flex-arrays"
تنها زمانی
مؤثر است که
مقدار level
بزرگتر از
0 باشد.
هنگامی که level=1 باشد، در صورتی که به آرایه پایانی ساختاری با ۲ یا چند عنصر به عنوان یک عضو آرایه انعطافپذیر ارجاع داده شود، هشدار صادر میشود.
هنگامی که level=2 باشد، افزون بر موارد level=1، در صورتی که به آرایه پایانی تکعنصری یک ساختار به عنوان یک عضو آرایه انعطافپذیر ارجاع داده شود، هشدارهای بیشتری صادر خواهد شد.
هنگامی که level=3 باشد، افزون بر موارد level=2، در صورتی که به آرایه پایانی با طول صفر یک ساختار به عنوان یک عضو آرایه انعطافپذیر ارجاع داده شود، هشدارهای بیشتری صادر خواهد شد.
این گزینه هنگامی که -ftree-vrp فعال باشد مؤثرتر است (که حالت پیشفرض برای -O2 و بالاتر است)، اما برخی هشدارها ممکن است حتی بدون بهینهسازی نیز تشخیص داده شوند.
- -Wsuggest-attribute=attribute-name
- برای مواردی که افزودن یک صفت (attribute) ممکن است سودمند باشد هشدار میدهد. مقادیر attribute-name که در حال حاضر پشتیبانی میشوند در زیر فهرست شدهاند.
- -Wsuggest-attribute=pure
- -Wsuggest-attribute=const
- -Wmissing-noreturn
- -Wsuggest-attribute=malloc
- -Wsuggest-attribute=returns_nonnull
- درباره توابعی که ممکن است کاندیدای صفتهای "pure"، "const"، "noreturn"، "malloc" یا "returns_nonnull" باشند، هشدار میدهد. کامپایلر تنها برای توابعی که در سایر واحدهای ترجمه (compilation units) قابل مشاهده هستند یا (در مورد "pure" و "const") اگر نتواند اثبات کند که تابع بهطور عادی بازمیگردد، هشدار میدهد. یک تابع در صورتی بهطور عادی بازمیگردد که شامل حلقهٔ بینهایت نبوده یا با پرتاب استثنا، فراخوانی "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-size
- درباره فراخوانیهای توابع تخصیص حافظه دارای صفت "alloc_size" که اندازهٔ ناکافی برای نوع هدفِ اشارهگری که نتیجه به آن منتسب میشود مشخص میکنند، هشدار میدهد؛ از جمله شکلهای درونساخت (built-in) توابع "aligned_alloc"، "alloca"، "calloc"، "malloc" و "realloc".
- -Walloc-zero
- درباره فراخوانیهای توابع تخصیص حافظه دارای صفت "alloc_size" که اندازهٔ صفر بایت مشخص میکنند، هشدار میدهد؛ از جمله شکلهای درونساخت توابع "aligned_alloc"، "alloca"، "calloc"، "malloc" و "realloc". از آنجا که رفتار این توابع هنگام فراخوانی با اندازهٔ صفر در میان پیادهسازیهای مختلف متفاوت است (و در مورد "realloc" منسوخ شده است)، اتکا به آن ممکن است منجر به باگهای نامحسوس در قابلیت حمل شود و باید از آن اجتناب گردد.
- -Wcalloc-transposed-args
- درباره فراخوانیهای توابع تخصیص حافظه دارای صفت "alloc_size" با دو آرگومان هشدار میدهد، که از عملگر "sizeof" به عنوان آرگومان اندازهٔ اول استفاده کرده و در آرگومان اندازهٔ دوم از آن استفاده نکردهاند. این یک هشدار مربوط به سبک کدنویسی است. آرگومان اول "calloc" بر اساس مستندات، تعداد عناصر آرایه است، در حالی که آرگومان دوم اندازهٔ هر عنصر است؛ بنابراین "calloc (n, sizeof (int))" بر "calloc (sizeof (int), n)" ارجحیت دارد. اگر قرار دادن "sizeof" در آرگومان اول و عدم استفاده در آرگومان دوم عمدی باشد، میتوان هشدار را با استفاده از "calloc (sizeof (struct S) + 0, n)" یا "calloc (1 * sizeof (struct S), 4)" یا با استفاده از "sizeof" در آرگومان دوم نیز فرو نشاند.
- -Walloc-size-larger-than=byte-size
- درباره فراخوانیهای توابع دارای صفت "alloc_size" که تلاش میکنند اشیایی بزرگتر از تعداد بایتهای مشخصشده تخصیص دهند، یا جایی که نتیجهٔ محاسبهٔ اندازه در یک نوع عدد صحیح با دقت نامحدود از مقدار PTRDIFF_MAX در معماری مقصد فراتر میرود، هشدار میدهد. گزینهٔ -Walloc-size-larger-than=PTRDIFF_MAX بهطور پیشفرض فعال است. هشدارهای کنترلشده توسط این گزینه را میتوان با تعیین byte-size برابر با SIZE_MAX یا بیشتر، یا از طریق -Wno-alloc-size-larger-than غیرفعال کرد.
- -Wno-alloc-size-larger-than
- هشدارهای -Walloc-size-larger-than= را غیرفعال میکند. این گزینه معادل -Walloc-size-larger-than=SIZE_MAX یا بزرگتر از آن است.
- -Walloca
- این گزینه درباره تمام موارد استفاده از "alloca" در سورسکد هشدار میدهد.
- -Walloca-larger-than=byte-size
- این گزینه
درباره
فراخوانیهای
"alloca" با
آرگومان
عدد صحیحی
هشدار
میدهد که
مقدار آن یا
صفر است، یا
توسط یک
گزارهٔ
کنترلی (controlling predicate)
که مقدار آن
را حداکثر
به 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 به عنوان عضو آرایه انعطافپذیر (flexible array member) در نظر گرفته میشود اگر مطابق با استاندارد C99 به بعد به عنوان عضو آرایه انعطافپذیر ([])، پسوند آرایه با طول صفر GCC ([0])، یا یک آرایهٔ تکعنصری ([1]) اعلان شده باشد. در نتیجه، درباره اندیسها یا آفستهای خارج از محدوده در آرایههای با طول صفر یا تکعنصری بهطور پیشفرض هشداری صادر نمیشود.
میتوانید گزینهٔ -fstrict-flex-arrays یا -fstrict-flex-arrays=level را اضافه کنید تا نحوهٔ برخورد این گزینه با آرایهٔ پایانی یک ساختار به عنوان عضو آرایه انعطافپذیر را کنترل کنید:
زمانی که level<=1 باشد، تغییری در رفتار پیشفرض ایجاد نمیشود.
زمانی که level=2 باشد، هشدارهای بیشتری برای اندیسها یا آفستهای خارج از محدوده در آرایههای تکعنصری صادر خواهد شد؛
زمانی که level=3 باشد، علاوه بر level=2، هشدارهای بیشتری برای اندیسها یا آفستهای خارج از محدوده در آرایههای با طول صفر صادر میشود.
- -Warray-bounds=2
- این سطح هشدار همچنین درباره نتایج میانی محاسبات اشارهگر که ممکن است مقادیر خارج از محدوده تولید کنند، هشدار میدهد. این سطح هشدار ممکن است تعداد بیشتری از موارد مثبت کاذب را گزارش کند و بهطور پیشفرض غیرفعال است.
- -Wunterminated-string-initialization (تنها در C و Objective-C)
- درباره
آرایههای
نویسهای
که با یک
رشته
لیترال به
عنوان
دنباله
نویسهای
فاقد
پایانهساز
مقداردهی
اولیه
میشوند
هشدار
میدهد،
مگر اینکه
اعلانی که
مقداردهی
اولیه
میشود
دارای صفت
"nonstring"
باشد. برای
مثال:
char arr[3] = "foo"; /* Warning. */ char arr2[3] __attribute__((nonstring)) = "bar"; /* No warning. */
این هشدار توسط -Wextra فعال میشود. اگر -Wc++-compat فعال باشد، متن هشدار کمی متفاوت خواهد بود و حتی در صورتی که اعلان در حال مقداردهی اولیه دارای صفت "nonstring" باشد نیز هشدار میدهد، زیرا در C++ اینگونه مقداردهیهای اولیه یک خطا محسوب میشوند.
- -Warray-compare
- درباره
مقایسههای
برابری و
رابطهای
میان دو
عملوند از
نوع آرایه
هشدار
میدهد. این
مقایسه در C++20
منسوخ شده
است. برای
مثال:
int arr1[5]; int arr2[5]; bool same = arr1 == arr2;
-Warray-compare توسط -Wall فعال میشود.
- -Warray-parameter
- -Warray-parameter=n
- درباره
اعلانهای
مجدد
توابعی که
شامل
پارامترهایی
از نوع
آرایه یا
اشارهگر
با نوعها
یا شکلهای
ناسازگار
هستند
هشدار
میدهد، و
امکان
تشخیص
دسترسیهای
خارج از
محدوده به
چنین
پارامترهایی
را توسط
هشدارهایی
مانند -Warray-bounds
فعال
میکند.
اگر اولین اعلان تابع از شکل آرایه برای اعلان یک پارامتر استفاده کند، کران مشخصشده در آرایه به عنوان حداقل تعداد عناصر مورد انتظار برای ارائه در فراخوانیهای تابع و حداکثر تعداد عناصرِ دسترسییافته توسط آن در نظر گرفته میشود. ناتوانی در ارائه آرگومانهایی با اندازه کافی یا دسترسی به بیش از حداکثر تعداد عناصر ممکن است توسط هشدارهایی مانند -Warray-bounds یا -Wstringop-overflow تشخیص داده شود. در سطح ۱، این هشدار ناسازگاریهای مربوط به پارامترهای آرایهای اعلانشده با استفاده از شکل "T[static N]" را تشخیص میدهد.
برای نمونه، این هشدار برای اعلان دوم "f" فعال میشود زیرا اعلان نخست با کلمه کلیدی "static" مشخص میکند که آرگومان آرایه باید دستکم چهار عنصر داشته باشد، در حالی که اعلان دوم اجازه میدهد آرایهای با هر اندازهای به "f" ارسال شود.
void f (int[static 4]); void f (int[]); // warning (inconsistent array form) void g (void) { int *p = (int *)malloc (1 * sizeof (int)); f (p); // warning (array too small) ... }در سطح ۲، این هشدار همچنین برای اعلانهای مجددی فعال میشود که شامل هرگونه ناسازگاری دیگر در شکل آرگومانهای آرایه یا اشارهگر نشاندهنده اندازه آرایه باشند. اشارهگرها و آرایههای فاقد کران مشخص معادل یکدیگر در نظر گرفته شده و هشداری ایجاد نمیکنند.
void g (int*); void g (int[]); // no warning void g (int[8]); // warning (inconsistent array bound)
گزینه -Warray-parameter=2 در -Wall گنجانده شده است. گزینه -Wvla-parameter هشدارهایی را برای ناسازگاریهای مشابه شامل آرگومانهای آرایه با طول متغیر (Variable Length Array) فعال میکند.
شکل کوتاه گزینه -Warray-parameter معادل با -Warray-parameter=2 است. شکل منفی -Wno-array-parameter معادل با -Warray-parameter=0 میباشد.
- -Wattribute-alias=n
- -Wno-attribute-alias
- درباره اعلانهایی که از صفت "alias" و صفتهای مشابه استفاده میکنند و هدف آنها با نوع نام مستعار ناسازگار است هشدار میدهد.
- -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 است که درباره بافتهای دوجهته که بهدرستی پایان نیافتهاند هشدار میدهد. -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) { ... } هنگامی که __builtin_frame_address یا __builtin_return_address با آرگومانی بزرگتر از 0 فراخوانی شوند، هشدار میدهد. چنین فراخوانیهایی ممکن است مقادیر نامعینی بازگردانند یا باعث از کار افتادن (crash) برنامه شوند. این هشدار در -Wall گنجانده شده است. - -Wno-discarded-qualifiers (فقط C و Objective-C)
-
اگر توصیفکنندههای نوع (qualifiers) روی اشارهگرها نادیده گرفته شوند، هشدار نمیدهد. بهطور معمول، اگر یک متغیر "const char *" به تابعی ارسال شود که پارامتر "char *" میپذیرد، کامپایلر هشدار میدهد. این گزینه میتواند برای فرونشاندن چنین هشداری استفاده شود.
- -Wno-discarded-array-qualifiers (فقط C و Objective-C)
-
اگر توصیفکنندههای نوع روی آرایههایی که مقصد اشارهگر هستند نادیده گرفته شوند، هشدار نمیدهد. بهطور معمول، اگر یک متغیر "const int (*)[]" به تابعی ارسال شود که پارامتر "int (*)[]" میپذیرد، کامپایلر هشدار میدهد. این گزینه میتواند برای فرونشاندن چنین هشداری استفاده شود.
- -Wno-incompatible-pointer-types (فقط C و Objective-C)
-
هنگامی که تبدیلی میان اشارهگرهایی با انواع ناسازگار صورت میگیرد، هشدار نمیدهد. این هشدار برای مواردی است که توسط -Wno-pointer-sign پوشش داده نمیشوند؛ گزینهای که برای ارسال آرگومان اشارهگر یا انتساب با علامتداری (signedness) متفاوت هشدار میدهد. بهطور پیشفرض، در C99 و گویشهای پس از آن در C، کامپایلر GCC این موضوع را یک خطا در نظر میگیرد. این خطا میتواند با استفاده از -fpermissive (به همراه برخی خطاهای دیگر)، یا فقط برای این خطا با -Wno-error=incompatible-pointer-types به یک هشدار تنزل داده شود. این هشدار توسط -pedantic-errors به یک خطا ارتقا مییابد.
- -Wno-int-conversion (فقط C و Objective-C)
-
در مورد تبدیلات ناسازگار عدد صحیح به اشارهگر و اشارهگر به عدد صحیح هشدار نمیدهد. این هشدار دربارهٔ تبدیلات ضمنی (implicit) است؛ برای تبدیلات صریح (explicit) میتوان از هشدارهای -Wno-int-to-pointer-cast و -Wno-pointer-to-int-cast استفاده کرد. بهطور پیشفرض، در C99 و گویشهای پس از آن در C، کامپایلر GCC این موضوع را یک خطا در نظر میگیرد. این خطا میتواند با استفاده از -fpermissive (به همراه برخی خطاهای دیگر)، یا فقط برای همین خطا با -Wno-error=int-conversion به یک هشدار تنزل داده شود. این هشدار توسط -pedantic-errors به یک خطا ارتقا مییابد.
- -Wzero-as-null-pointer-constant
-
هنگامی که لیترال 0 به عنوان ثابت اشارهگر تهی (null pointer constant) استفاده شود، هشدار میدهد.
- -Wzero-length-bounds
-
در مورد دسترسی به عناصر اعضای آرایه با طول صفر که ممکن است با سایر اعضای همان شیء همپوشانی داشته باشند، هشدار میدهد. اعلان آرایههای با طول صفر درونی منع شده است، زیرا دسترسی به آنها تعریفنشده (undefined) است. برای مثال، دو ذخیرهسازی اول در تابع "bad" گزارش میشوند زیرا عناصر آرایه با اعضای بعدی "b" و "c" همپوشانی دارند. سومین ذخیرهسازی توسط -Warray-bounds گزارش میشود زیرا فراتر از مرزهای شیء دربرگیرنده است. struct X { int a[0]; int b, c; }; struct X x; void bad (void) { x.a[0] = 0; // -Wzero-length-bounds x.a[1] = 1; // -Wzero-length-bounds x.a[2] = 2; // -Warray-bounds }
گزینهٔ -Wzero-length-bounds توسط -Warray-bounds فعال میشود.
- -Wno-div-by-zero
- در مورد تقسیم عدد صحیح بر صفر در زمان کامپایل هشدار نمیدهد. دربارهٔ تقسیم ممیز شناور بر صفر هشداری داده نمیشود، چرا که میتواند روشی معتبر برای بهدست آوردن بینهایتها (infinities) و NaNها باشد.
- -Wsystem-headers
- پیامهای هشدار را برای ساختارهایی که در فایلهای سرایند سیستم (system headers) یافت میشوند چاپ میکند. هشدارهای سرایندهای سیستم معمولاً با این فرض که اغلب نشاندهندهٔ مشکلات واقعی نیستند و تنها خروجی کامپایلر را ناخواناتر میکنند، نادیده گرفته میشوند. استفاده از این گزینهٔ خط فرمان به GCC میگوید که هشدارهای سرایندهای سیستم را طوری صادر کند که گویی در کد کاربر رخ دادهاند. با این حال، توجه داشته باشید که استفاده از -Wall همراه با این گزینه در مورد پراگماهای ناشناخته در سرایندهای سیستم هشدار نمیدهد---برای آن، باید از -Wunknown-pragmas نیز استفاده شود.
- -Wtautological-compare
- اگر یک
مقایسه با
خود همواره
به درست (true) یا
نادرست (false)
ارزیابی
شود، هشدار
میدهد. این
هشدار
اشتباهات
گوناگونی
را تشخیص
میدهد،
مانند:
int i = 1; ... if (i > i) { ... }این هشدار همچنین درباره مقایسههای بیتی که همواره به درست یا نادرست ارزیابی میشوند هشدار میدهد، به عنوان مثال:
if ((a & 16) == 10) { ... }همواره نادرست (false) خواهد بود.
این هشدار توسط -Wall فعال میشود.
- -Wtrailing-whitespace
- -Wtrailing-whitespace=kind
- در مورد نویسههای فاصلهٔ خالی پایانی (trailing whitespace) در انتهای خطوط، از جمله در داخل توضیحات، اما به استثنای فاصلههای پایانی در لیترالهای رشتهای خام (raw string literals)، هشدار میدهد. "-Wtrailing-whitespace" معادل "-Wtrailing-whitespace=blanks" است و فقط در مورد نویسههای فاصله (space) و تب افقی پایانی هشدار میدهد. "-Wtrailing-whitespace=any" علاوه بر آنها، در مورد نویسههای form feed یا تب عمودی پایانی نیز هشدار میدهد. "-Wno-trailing-whitespace" یا "-Wtrailing-whitespace=none" هشدار را غیرفعال میکند که حالت پیشفرض است. این یک هشدار مربوط به سبک کدنویسی است.
- -Wleading-whitespace=kind
- در مورد مسائل سبک کدنویسی در فاصلههای خالی ابتدایی (leading whitespace) هشدار میدهد، اما نه دربارهٔ مقدار تورفتگی (indentation). برخی پروژهها از سبکهای کدنویسی استفاده میکنند که در آنها فقط از فاصلهها برای تورفتگی استفاده میشود، برخی دیگر فقط از تبها، و برخی دیگر از صفر یا چند تب (برای مضارب "-ftabstop=n") و به دنبال آن صفر یا کمتر از n فاصله استفاده میکنند. هیچ هشداری روی خطوطی که صرفاً حاوی فاصله خالی هستند صادر نمیشود (اگرچه ممکن است هشدار "-Wtrailing-whitespace=" صادر شود)، و هیچ هشداری درون لیترالهای رشتهای خام صادر نمیگردد. همچنین برای فاصلههای خالی ابتدایی درون توضیحات چندخطی نیز هشدار صادر میشود. "-Wleading-whitespace=spaces" در مورد فاصلههای خالی ابتدایی غیر از فاصله (space) برای پروژههایی که میخواهند تورفتگی را فقط با فاصله انجام دهند، هشدار میدهد. "-Wleading-whitespace=tabs" در مورد فاصلههای خالی ابتدایی غیر از تب افقی برای پروژههایی که میخواهند تورفتگی را فقط با تب افقی انجام دهند، هشدار میدهد. "-Wleading-whitespace=blanks" در مورد فاصلههای خالی ابتدایی غیر از فاصله و تب افقی، یا در مورد تب افقی بعد از یک فاصله در ابتدای خط، یا دربارهٔ n یا بیشتر فاصلهٔ متوالی در فاصلههای خالی ابتدایی هشدار میدهد (که در آن n آرگومان "-ftabstop=n" است و بهطور پیشفرض برابر ۸ میباشد). "-Wleading-whitespace=none" هشدار را غیرفعال میکند که حالت پیشفرض است. این یک هشدار مربوط به سبک کدنویسی است.
- -Wtrampolines
- دربارهٔ ترامپولینهای (trampolines) تولیدشده برای اشارهگرها به توابع تو در تو (nested functions) هشدار میدهد. ترامپولین قطعهٔ کوچکی از داده یا کد است که در زمان اجرا هنگام دریافت آدرس یک تابع تو در تو، روی پشته ایجاد میشود و برای فراخوانی غیرمستقیم تابع تو در تو به کار میرود. برای برخی معماریهای مقصد، ترامپولین تنها از داده تشکیل شده و بنابراین نیاز به اقدام خاصی ندارد. اما برای بیشتر مقاصد، از کد تشکیل شده و از این رو برای کارکرد صحیح برنامه نیاز است که پشته قابل اجرا (executable) شود.
- -Wfloat-equal
- اگر مقادیر
ممیز شناور
در
مقایسههای
برابری
استفاده
شوند،
هشدار
میدهد.
ایدهٔ پشت این هشدار آن است که گاهی اوقات (برای برنامهنویس) راحتتر است که مقادیر ممیز شناور را به عنوان تقریبهایی از اعداد حقیقی با دقت نامحدود در نظر بگیرد. اگر چنین میکنید، لازم است (با تحلیل کد، یا به روشی دیگر) حداکثر یا حداکثر خطای احتمالی را که محاسبه ایجاد میکند محاسبه کرده و هنگام انجام مقایسهها آن را لحاظ کنید (و همچنین هنگام تولید خروجی، اما آن مسئلهٔ متفاوتی است). بهویژه، به جای بررسی برابری دقیق، باید بررسی کنید که آیا بازهٔ دو مقدار همپوشانی دارد یا خیر؛ و این کار با عملگرهای رابطهای انجام میشود، بنابراین مقایسههای برابری احتمالاً اشتباه هستند.
- -Wtraditional (فقط C و Objective-C)
- در مورد ساختارهای خاصی که در C سنتی (traditional C) و استاندارد ISO C رفتار متفاوتی دارند، هشدار میدهد. همچنین در مورد ساختارهای ISO C که در C سنتی معادلی ندارند و/یا ساختارهای مسئلهسازی که باید از آنها اجتناب شود، هشدار میدهد.
- پارامترهای ماکرو که درون لیترالهای رشتهای در بدنهٔ ماکرو ظاهر میشوند. در C سنتی جایگزینی ماکرو درون لیترالهای رشتهای صورت میگیرد، اما در ISO C چنین نیست.
- در C سنتی، برخی دستورات پیشپردازنده وجود نداشتند. پیشپردازندههای سنتی تنها خطی را یک دستور (directive) در نظر میگرفتند که # در ستون ۱ خط ظاهر میشد. بنابراین -Wtraditional در مورد دستوراتی هشدار میدهد که C سنتی آنها را درک میکند اما چون # به عنوان اولین نویسه در خط ظاهر نشده است نادیدهشان میگیرد. همچنین پیشنهاد میکند که دستوراتی مانند "#pragma" را که برای C سنتی قابل درک نیستند با اعمال تورفتگی پنهان کنید. برخی پیادهسازیهای سنتی "#elif" را نمیشناسند، بنابراین این گزینه پیشنهاد میکند که بهطور کامل از آن دوری شود.
- یک ماکروی تابعگونه (function-like) که بدون آرگومان ظاهر شود.
- عملگر یکانی جمع (+).
- پسوند ثابت عدد صحیح U، یا پسوندهای ثابت ممیز شناور F یا L. (C سنتی از پسوند L در ثابتهای عدد صحیح پشتیبانی میکند.) توجه داشته باشید که این پسوندها در ماکروهای تعریفشده در سرایندهای سیستم اغلب سیستمهای مدرن ظاهر میشوند، مانند ماکروهای _MIN/_MAX در "<limits.h>". استفاده از این ماکروها در کد کاربر معمولاً ممکن است به هشدارهای کاذب منجر شود، اما پیشپردازندهٔ یکپارچهٔ GCC زمینهٔ کافی را برای جلوگیری از هشدار در این موارد در اختیار دارد.
- تابعی که در یک بلوک به صورت external اعلان شده و سپس پس از پایان آن بلوک استفاده شود..IP * 4 یک عبارت "switch" عملوندی از نوع "long" دارد.
- یک اعلان تابع غیر-"static" پس از یک اعلان "static" قرار گرفته است. این ساختار توسط برخی از کامپایلرهای C سنتی پذیرفته نمیشود.
- نوع ISO یک مقدار ثابت عدد صحیح، پهنا یا علامتداری متفاوتی نسبت به نوع سنتی آن دارد. این هشدار تنها در صورتی صادر میشود که مبنای مقدار ثابت، ۱۰ باشد؛ یعنی درباره مقادیر هگزادسیمال یا اکتال که معمولاً الگوهای بیتی را نشان میدهند، هشداری داده نمیشود.
- استفاده از الحاق رشتهای در ISO تشخیص داده شود.
- مقداردهی اولیه دادههای ترکیبی خودکار (automatic aggregates).
- شناسه با برچسبها (labels) تداخل دارد. C سنتی فاقد یک فضای نام مجزا برای برچسبها است.
- مقداردهی اولیه اجتماعها (unions). اگر مقداردهنده اولیه صفر باشد، از هشدار صرفنظر میشود. این کار با این فرض انجام میشود که مقداردهنده اولیه صفر در کد کاربر به مواردی مانند "__STDC__" مشروط شده است تا از هشدارهای مقداردهنده اولیه مفقود جلوگیری شود و در حالت C سنتی، به مقداردهی پیشفرض به صفر متکی است.
- تبدیلها توسط پیشنمونهها (prototypes) میان مقادیر ممیز ثابت/ممیز شناور و برعکس. عدم وجود این پروتوتایپها هنگام کامپایل با C سنتی مشکلات جدی ایجاد میکند. این زیرمجموعهای از هشدارهای تبدیل ممکن است؛ برای مجموعه کامل از -Wtraditional-conversion استفاده کنید.
- استفاده از تعاریف توابع به سبک ISO C. این هشدار عمداً برای اعلانهای پروتوتایپ یا توابع با تعداد آرگومان متغیر (variadic) صادر نمیشود، چرا که این ویژگیهای ISO C هنگام استفاده از ماکروهای سازگاری C سنتی libiberty یعنی "PARAMS" و "VPARAMS" در کد شما ظاهر میشوند. همچنین این هشدار برای توابع تو در تو (nested functions) نادیده گرفته میشود، زیرا این ویژگی خود یک افزونه GCC است و بنابراین ربطی به سازگاری با C سنتی ندارد.
- -Wtraditional-conversion (تنها C و Objective-C)
- هشدار میدهد اگر یک پروتوتایپ باعث تبدیل نوعی شود که با آنچه در نبود پروتوتایپ برای همان آرگومان رخ میداد متفاوت باشد. این شامل تبدیل ممیز ثابت به شناور و برعکس، و تبدیلهایی است که پهنا یا علامتداری یک آرگومان ممیز ثابت را تغییر میدهند، مگر زمانی که با ارتقای پیشفرض (default promotion) یکسان باشد.
- -Wdeclaration-after-statement (تنها C و Objective-C)
- هنگامی که
اعلانی پس
از یک دستور
در یک بلوک
یافت شود،
هشدار
میدهد. این
ساختار که
از C++ شناخته
شده است، با
ISO C99 معرفی شد و
بهطور
پیشفرض در
GCC مجاز است.
این ساختار
توسط ISO C90
پشتیبانی
نمیشود.
این هشدار توسط -pedantic-errors به یک خطا ارتقا مییابد.
- -Wshadow
- هرگاه یک متغیر محلی یا اعلان نوع، متغیر، پارامتر، نوع، عضو کلاس (در C++) یا متغیر نمونه (در Objective-C) دیگری را بپوشاند (shadow کند)، یا هرگاه یک تابع توکار (built-in) سایهاندازی شود، هشدار میدهد. توجه داشته باشید که در C++، اگر یک متغیر محلی یک typedef صریح را بپوشاند، کامپایلر هشدار میدهد، اما اگر یک struct/class/enum را بپوشاند هشداری نمیدهد. اگر این هشدار فعال باشد، شامل تمام موارد سایهاندازی محلی نیز میشود. این بدان معناست که در صورت استفاده از -Wshadow، گزینههای -Wno-shadow=local و -Wno-shadow=compatible-local نادیده گرفته میشوند. مشابه -Wshadow=global.
- -Wno-shadow-ivar (تنها Objective-C)
- هرگاه یک متغیر محلی، متغیر نمونهای را در یک متد Objective-C بپوشاند، هشدار ندهد.
- -Wshadow=global
- برای هرگونه سایهاندازی (shadowing) هشدار میدهد. مشابه -Wshadow.
- -Wshadow=local
- هنگامی که یک متغیر محلی، متغیر محلی دیگری یا یک پارامتر را میپوشاند، هشدار میدهد.
- -Wshadow=compatible-local
- هنگامی که
یک متغیر
محلی،
متغیر محلی
دیگری یا
پارامتری
را
میپوشاند
که نوع آن
با نوع
متغیر
پوشاننده
سازگار
است، هشدار
میدهد. در
C++، سازگاری
نوع در
اینجا به
این معناست
که نوع
متغیر
پوشاننده
میتواند
به نوع
متغیر
پوشاندهشده
تبدیل شود.
ایجاد این
گزینه
(علاوه بر
-Wshadow=local) بر این
ایده
استوار است
که وقتی یک
متغیر محلی
متغیر
دیگری با
نوع
ناسازگار
را
میپوشاند،
به احتمال
زیاد عمدی
بوده و یک
باگ یا
اشتباه
نگارشی
نیست،
همانطور
که در مثال
زیر نشان
داده شده
است:
for (SomeIterator i = SomeObj.begin(); i != SomeObj.end(); ++i) { for (int i = 0; i < N; ++i) { ... } ... }از آنجا که دو متغیر "i" در مثال بالا دارای انواع ناسازگار هستند، فعال کردن صرفاً -Wshadow=compatible-local هشداری صادر نمیکند. به این دلیل که انواع آنها ناسازگار است، اگر برنامهنویس تصادفاً یکی را به جای دیگری استفاده کند، انتظار میرود که بررسی نوع (type checking) آن را گرفته و خطا یا هشداری صادر کند. استفاده از این پرچم به جای -Wshadow=local میتواند احتمالاً شمار هشدارهای ناشی از سایهاندازی عمدی را کاهش دهد. توجه داشته باشید که این همچنین بدان معناست که سایهاندازی بر "const char *i" توسط "char *i" هشداری صادر نمیکند.
این هشدار توسط -Wshadow=local نیز فعال میشود.
- -Wlarger-than=byte-size
- هرگاه شیئی
تعریف شود
که اندازه
آن از byte-size
تجاوز کند،
هشدار
میدهد.
-Wlarger-than=PTRDIFF_MAX
بهطور
پیشفرض
فعال است.
هشدارهای
کنترلشده
توسط این
گزینه را
میتوان با
مشخص کردن
byte-size به میزان
SIZE_MAX یا
بیشتر، یا
با استفاده
از -Wno-larger-than
غیرفعال
کرد.
همچنین برای فراخوانی توابع محدودشدهای (bounded functions) مانند "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"، آرایههای با طول متغیر (variable-length arrays)، یا ساختارهای مرتبط، در زمان تصمیمگیری کامپایلر برای صدور یا عدم صدور هشدار محاسبه نمیشود. -Wframe-larger-than=PTRDIFF_MAX بهطور پیشفرض فعال است. هشدارهای کنترلشده توسط این گزینه را میتوان با مشخص کردن byte-size برابر با SIZE_MAX یا بیشتر، یا توسط -Wno-frame-larger-than غیرفعال کرد.
- -Wno-frame-larger-than
- هشدارهای -Wframe-larger-than= را غیرفعال میکند. این گزینه معادل -Wframe-larger-than=SIZE_MAX یا بزرگتر است.
- -Wfree-nonheap-object
- هنگام
اقدام به
آزادسازی
شیئی که در
هیپ (heap) تخصیص
نیافته
است، یا با
استفاده از
اشارهگری
که از یک
فراخوانی
قبلی به
تابع تخصیص
متناظر
بازگردانده
نشده است،
هشدار
میدهد. به
عنوان
مثال، از
آنجا که
فراخوانی
"stpcpy"
اشارهگری
به نویسه
نال پایانی
بازمیگرداند
و نه به
ابتدای
شیء،
فراخوانی
"free" در
ادامه
گزارش
میشود.
void f (char *p) { p = stpcpy (p, "abc"); // ... free (p); // warning }گزینه -Wfree-nonheap-object در -Wall گنجانده شده است.
- -Wstack-usage=byte-size
- اگر مصرف
پشته (stack usage) یک
تابع ممکن
است از 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، اگر کامپایلر چنین فرضیاتی را لحاظ کند، هشدار میدهد..IP "-Wno-pedantic-ms-format (تنها در مقصدهای MinGW)" 4 هنگامی که در ترکیب با -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
- در صورت
مقایسه یک
اشارهگر
با یک ثابت
نویسهای
صفر هشدار
ندهد. این
حالت
معمولاً به
این معنی
است که هدف،
ارجاعزدایی
(dereference) از
اشارهگر
بوده است.
برای مثال:
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" است. این گزینه همچنین زمانی که آرگومان در فراخوانی چنین تابعی دارای یک نوع بدونعلامت باشد، هشدار میدهد. این هشدار را میتوان با تبدیل نوع صریح (explicit cast) فرونشاند و همچنین با -Wextra فعال میشود.
- -Wcomment
- -Wcomments
- هرگاه توالی آغاز توضیح /* درون یک توضیح /* ظاهر شود، یا هرگاه یک بکاسلش-خطجدید در یک توضیح // ظاهر شود، هشدار میدهد. این هشدار با -Wall فعال میشود.
- -Wtrigraphs
- اگر
سهنگارههایی
(trigraphs) دیده
شوند که
ممکن است
معنای
برنامه را
تغییر
دهند،
هشدار
میدهد.
برای
سهنگارههای
درون
توضیحات
هشداری
داده
نمیشود،
به جز
آنهایی که
یک خطجدید
گریز
دادهشده
تشکیل
میدهند.
این گزینه به صورت ضمنی توسط -Wall در نظر گرفته میشود. اگر -Wall داده نشود، این گزینه همچنان فعال است مگر اینکه سهنگارهها فعال شده باشند. برای بهدست آوردن تبدیل سهنگارهها بدون هشدار، اما با فعال بودن سایر هشدارهای -Wall، از -trigraphs -Wall -Wno-trigraphs استفاده کنید.
- -Wundef
- اگر یک شناسه تعریفنشده در یک دستور پیشپردازنده "#if" ارزیابی شود، هشدار میدهد. چنین شناسههایی با صفر جایگزین میشوند.
- -Wexpansion-to-defined
- هرگاه defined در بسط یک ماکرو دیده شود (از جمله در حالتی که ماکرو توسط دستور #if بسط داده میشود)، هشدار میدهد. چنین کاربردی قابلحمل نیست. این هشدار با -Wpedantic و -Wextra نیز فعال میشود.
- -Wunused-macros
- درباره
ماکروهای
تعریفشده
در فایل
اصلی که
استفاده
نشدهاند،
هشدار
میدهد. یک
ماکرو در
صورتی
استفادهشده
تلقی
میشود که
حداقل یک
بار بسط
داده شود یا
وجود آن
بررسی شود.
همچنین
پیشپردازنده
در صورتی که
ماکرو در
زمان
بازتعریف
یا لغو
تعریف
استفاده
نشده باشد،
هشدار
میدهد.
درباره ماکروهای توکار، ماکروهای تعریفشده در خط فرمان، و ماکروهای تعریفشده در فایلهای ضمیمهشده (include) هشداری داده نمیشود.
نکته: اگر یک ماکرو در عمل استفاده شده باشد، اما صرفاً درون بلوکهای شرطی نادیدهگرفتهشده به کار رفته باشد، پیشپردازنده آن را به عنوان استفادهنشده گزارش میکند. برای جلوگیری از هشدار در چنین حالتی، میتوانید حوزه تعریف ماکرو را مثلاً با انتقال آن به اولین بلوک نادیدهگرفتهشده بهبود ببخشید. در غیر این صورت، میتوانید با کدی شبیه به زیر، یک استفاده صوری ایجاد کنید:
#if defined the_macro_causing_the_warning #endif
- -Wno-endif-labels
- هرگاه متنی
پس از یک
"#else" یا
یک "#endif"
بیاید،
هشدار ندهد.
این وضعیت
گاهی در
برنامههای
قدیمیتر
با کدهایی
به این شکل
رخ میدهد:
#if FOO ... #else FOO ... #endif FOO
دومین و سومین "FOO" باید درون توضیح باشند. این هشدار بهطور پیشفرض روشن است.
- -Wbad-function-cast (تنها در C و Objective-C)
- هنگامی که فراخوانی یک تابع به نوعی ناسازگار تبدیل نوع (cast) شود، هشدار میدهد. برای نمونه، اگر فراخوانی تابعی که یک نوع عدد صحیح بازمیگرداند به یک نوع اشارهگر تبدیل شود، هشدار میدهد.
- -Wc90-c99-compat (تنها در C و Objective-C)
- درباره ویژگیهایی که در ISO C90 موجود نیستند، اما در ISO C99 وجود دارند هشدار میدهد. برای مثال، درباره استفاده از آرایههای با طول متغیر، نوع "long long"، نوع "bool"، لیترالهای مرکب (compound literals)، مقداردهندههای اولیه تعیینشده (designated initializers) و غیره هشدار میدهد. این گزینه مستقل از حالت استانداردها است. هشدارها در عبارتی که پس از "__extension__" میآید غیرفعال میشوند.
- -Wc99-c11-compat (تنها در C و Objective-C)
- درباره ویژگیهایی که در ISO C99 موجود نیستند، اما در ISO C11 وجود دارند هشدار میدهد. برای مثال، درباره استفاده از ساختارها و اجتماعهای بینام، توصیفکننده نوع "_Atomic"، مشخصکننده ردهحافظه "_Thread_local"، مشخصکننده "_Alignas"، عملگر "Alignof"، کلمه کلیدی "_Generic" و غیره هشدار میدهد. این گزینه مستقل از حالت استانداردها است. هشدارها در عبارتی که پس از "__extension__" میآید غیرفعال میشوند.
- -Wc11-c23-compat (تنها در C و Objective-C)
- -Wc11-c2x-compat (تنها در C و Objective-C)
- درباره
ویژگیهایی
که در ISO C11
موجود
نیستند،
اما در ISO C23
وجود دارند
هشدار
میدهد.
برای مثال،
درباره حذف
رشته در
"_Static_assert"،
استفاده از
نحو [[]] برای
مشخصهها
(attributes)،
استفاده از
نوعهای
ممیز شناور
دهدهی، و
غیره هشدار
میدهد. این
گزینه
مستقل از
حالت
استانداردها
است.
هشدارها در
عبارتی که
پس از
"__extension__"
میآید
غیرفعال
میشوند.
نام -Wc11-c2x-compat
منسوخ شده
است.
هنگامی که کامپایل در حالت C23 نباشد، این هشدارها توسط -pedantic-errors به خطا ارتقا مییابند.
- -Wc23-c2y-compat (تنها در C و Objective-C)
- -Wc23-c2y-compat (تنها در C و Objective-C)
- درباره
ویژگیهایی
که در ISO C23
موجود
نیستند،
اما در ISO C2Y
وجود دارند
هشدار
میدهد.
برای
نمونه،
درباره
انتخاب با
یک نام نوع
به جای یک
عبارت در
"_Generic"
هشدار
میدهد. این
گزینه
مستقل از
حالت
استانداردها
است.
هشدارها در
عبارتی که
پس از
"__extension__"
میآید
غیرفعال
میشوند.
هنگامی که کامپایل در حالت C2Y نباشد، این هشدارها توسط -pedantic-errors به خطا ارتقا مییابند.
- -Wc++-compat (تنها در C و Objective-C)
- درباره ساختارهای ISO C که خارج از زیرمجموعه مشترک ISO C و ISO C++ هستند هشدار میدهد، به عنوان مثال درخواست تبدیل ضمنی از "void *" به یک اشارهگر به نوع غیر-"void".
- -Wc++11-compat (تنها در C++ و Objective-C++)
- درباره ساختارهای C++ که معنای آنها میان ISO C++ 1998 و ISO C++ 2011 متفاوت است هشدار میدهد؛ برای نمونه شناسههایی در ISO C++ 1998 که در ISO C++ 2011 کلمه کلیدی هستند. این هشدار گزینه -Wnarrowing را روشن میکند و توسط -Wall فعال میشود.
- -Wc++14-compat (تنها در C++ و Objective-C++)
- درباره ساختارهای C++ که معنای آنها میان ISO C++ 2011 و ISO C++ 2014 متفاوت است هشدار میدهد. این هشدار توسط -Wall فعال میشود.
- -Wc++17-compat (تنها در C++ و Objective-C++)
- درباره ساختارهای C++ که معنای آنها میان ISO C++ 2014 و ISO C++ 2017 متفاوت است هشدار میدهد. این هشدار توسط -Wall فعال میشود.
- -Wc++20-compat (تنها در C++ و Objective-C++)
- درباره ساختارهای C++ که معنای آنها میان ISO C++ 2017 و ISO C++ 2020 متفاوت است هشدار میدهد. این هشدار توسط -Wall فعال میشود.
- -Wno-c++11-extensions (تنها در C++ و Objective-C++)
- درباره ساختارهای C++11 در کدی که با استفاده از یک استاندارد قدیمیتر C++ کامپایل میشود، هشدار ندهد. حتی بدون این گزینه، برخی ساختارهای C++11 تنها در صورتی تشخیص داده میشوند که از -Wpedantic استفاده شود.
- -Wno-c++14-extensions (تنها در C++ و Objective-C++)
- درباره ساختارهای C++14 در کدی که با استفاده از یک استاندارد قدیمیتر C++ کامپایل میشود، هشدار ندهد. حتی بدون این گزینه، برخی ساختارهای C++14 تنها در صورتی تشخیص داده میشوند که از -Wpedantic استفاده شود..IP "-Wno-c++17-extensions (فقط C++ و Objective-C++)" 4 دربارهٔ ساختارهای C++17 در کدی که با یک استاندارد قدیمیتر C++ کامپایل میشود، هشدار ندهد. حتی بدون این گزینه، برخی از ساختارهای C++17 تنها در صورتی تشخیص داده میشوند که از -Wpedantic استفاده شود.
- -Wno-c++20-extensions (فقط C++ و Objective-C++)
- دربارهٔ ساختارهای C++20 در کدی که با یک استاندارد قدیمیتر C++ کامپایل میشود، هشدار ندهد. حتی بدون این گزینه، برخی از ساختارهای C++20 تنها در صورتی تشخیص داده میشوند که از -Wpedantic استفاده شود.
- -Wno-c++23-extensions (فقط C++ و Objective-C++)
- دربارهٔ ساختارهای C++23 در کدی که با یک استاندارد قدیمیتر C++ کامپایل میشود، هشدار ندهد. حتی بدون این گزینه، برخی از ساختارهای C++23 تنها در صورتی تشخیص داده میشوند که از -Wpedantic استفاده شود.
- -Wno-c++26-extensions (فقط C++ و Objective-C++)
- دربارهٔ ساختارهای C++26 در کدی که با یک استاندارد قدیمیتر C++ کامپایل میشود، هشدار ندهد. حتی بدون این گزینه، برخی از ساختارهای C++26 تنها در صورتی تشخیص داده میشوند که از -Wpedantic استفاده شود.
- -Wcast-qual
- هر زمان که
یک
اشارهگر
به گونهای
تبدیل نوع (cast)
شود که یک
توصیفگر
نوع (type qualifier) از
نوع مقصد
حذف گردد،
هشدار
میدهد.
برای
نمونه، اگر
یک "const char *"
به یک "char
*" معمولی
تبدیل شود،
هشدار
میدهد.
همچنین هنگام انجام تبدیلی که یک توصیفگر نوع را به شیوهای ناامن معرفی کند، هشدار میدهد. برای نمونه، تبدیل "char **" به "const char **" ناامن است، مانند این مثال:
/* p is char ** value. */ const char **q = (const char **) p; /* Assignment of readonly string to const char * is OK. */ *q = "string"; /* Now char** pointer points to read-only memory. */ **p = 'b';
- -Wcast-align
- هر زمان که یک اشارهگر به گونهای تبدیل نوع شود که تراز (alignment) مورد نیاز مقصد افزایش یابد، هشدار میدهد. برای نمونه، اگر یک "char *" به یک "int *" در ماشینهایی که اعداد صحیح تنها در مرزهای دو یا چهار بایتی قابل دسترس هستند تبدیل شود، هشدار میدهد.
- -Wcast-align=strict
- هر زمان که یک اشارهگر به گونهای تبدیل نوع شود که تراز مورد نیاز مقصد افزایش یابد، هشدار میدهد. برای نمونه، اگر یک "char *" صرفنظر از ماشین مقصد به یک "int *" تبدیل شود، هشدار میدهد.
- -Wcast-function-type
- هنگامی که یک اشارهگر تابع به یک اشارهگر تابع ناسازگار تبدیل شود، هشدار میدهد. در تبدیلی شامل انواع توابع با فهرست آرگومان متغیر، تنها انواع آرگومانهای اولیهای که ارائه شدهاند در نظر گرفته میشوند. هر پارامتری از نوع اشارهگر با هر نوع اشارهگر دیگری مطابقت دارد. هرگونه تفاوت بیخطر در انواع عدد صحیح نادیده گرفته میشود، مانند "int" در مقایسه با "long" در مقصدهای ILP32. به همین ترتیب توصیفگرهای نوع نادیده گرفته میشوند. نوع تابع "void (*) (void)" خاص است و با همه چیز مطابقت دارد، که میتوان از آن برای فرونشاندن این هشدار استفاده کرد. در تبدیلی شامل اشارهگر به انواع عضو، این گزینه هر زمان که تبدیل نوع باعث تغییر نوعِ اشارهگر به عضو شود، هشدار میدهد. این هشدار توسط -Wextra فعال میشود.
- -Wcast-user-defined
- هنگامی که
یک تبدیل به
نوع مرجع (reference type)
شامل تبدیل
تعریفشده
توسط کاربر
که
برنامهنویس
ممکن است
انتظار
فراخوانی
آن را داشته
باشد
نباشد،
هشدار
میدهد.
struct A { operator const int&(); } a; auto r = (int&)a; // warningاین هشدار بهطور پیشفرض فعال است.
- -Wwrite-strings
- هنگام
کامپایل C،
به ثوابت
رشتهای
نوع "const
char[length]"
را اختصاص
میدهد تا
کپی کردن
نشانی یکی
از آنها در
یک
اشارهگر
غیر-"const"
"char *"
هشداری
تولید کند.
این
هشدارها به
شما کمک
میکنند در
زمان
کامپایل،
کدی را پیدا
کنید که
میتواند
برای نوشتن
در یک ثابت
رشتهای
تلاش کند،
اما تنها در
صورتی که در
استفاده از
"const" در
اعلانها و
پیشنمونهها
بسیار دقیق
بوده باشید.
در غیر این
صورت، این
هشدارها
صرفاً یک
مزاحمت
هستند. به
همین دلیل
ما کاری
نکردهایم
که -Wall این
هشدارها را
درخواست
کند.
هنگام کامپایل C++، درباره تبدیل منسوخشده از لیترالهای رشتهای به "char *" هشدار میدهد. این هشدار بهطور پیشفرض برای برنامههای C++ فعال است.
این هشدار با -pedantic-errors در حالت C++11 یا جدیدتر به یک خطا ارتقا مییابد.
- -Wclobbered
- درباره متغیرهایی که ممکن است توسط "longjmp" یا "vfork" تغییر یابند، هشدار میدهد. این هشدار همچنین توسط -Wextra فعال میشود.
- -Wno-complain-wrong-lang
- بهطور
پیشفرض،
فرانتاندهای
زبان زمانی
که یک
گزینهٔ خط
فرمان
معتبر است
اما برای آن
فرانتاند
کاربرد
ندارد،
هشدار
میدهند.
این رفتار
را میتوان
با -Wno-complain-wrong-lang
غیرفعال
کرد، که بیش
از همه
هنگام
فراخوانی
یک درایور
کامپایلر
منفرد برای
چندین فایل
مبدأ
نوشتهشده
به
زبانهای
مختلف
سودمند
است، برای
نمونه:
$ g++ -fno-rtti a.cc b.f90
درایور g++ فرانتاند C++ را برای کامپایل a.cc و فرانتاند Fortran را برای کامپایل b.f90 فراخوانی میکند. فرانتاند دوم چنین پیامی صادر میکند: f951: Warning: command-line option '-fno-rtti' is valid for C++/D/ObjC++ but not for Fortran، که میتوان آن را با -Wno-complain-wrong-lang غیرفعال کرد.
- -Wcompare-distinct-pointer-types (فقط C و Objective-C)
- اگر اشارهگرهایی از انواع متمایز بدون تبدیل نوع با یکدیگر مقایسه شوند، هشدار میدهد. این هشدار بهطور پیشفرض فعال است.
- -Wconversion
- درباره
تبدیلهای
ضمنی که
ممکن است
مقداری را
تغییر
دهند،
هشدار
میدهد. این
شامل
تبدیلهای
میان اعداد
حقیقی و
صحیح،
مانند "abs
(x)" هنگامی
که "x" از
نوع "double"
است؛
تبدیلهای
میان
علامتدار
و بدون
علامت،
مانند "unsigned
ui = -1"؛ و
تبدیلها
به انواع
کوچکتر،
مانند "sqrtf
(M_PI)" میشود.
برای
تبدیلهای
صریح مانند
"abs ((int) x)"
و "ui = (unsigned) -1"،
یا اگر
مقدار توسط
تبدیل
تغییر نکند
مانند "abs
(2.0)" هشداری
داده
نمیشود.
هشدارهای
مربوط به
تبدیل میان
اعداد صحیح
علامتدار
و بدون
علامت را
میتوان با
استفاده از
-Wno-sign-conversion
غیرفعال
کرد.
برای C++، همچنین درباره رفع ابهام اضافه بار (overload resolution) گیجکننده برای تبدیلهای تعریفشده توسط کاربر؛ و تبدیلهایی که هرگز از یک عملگر تبدیل نوع استفاده نمیکنند هشدار میدهد: تبدیلها به "void"، به همان نوع، به یک کلاس پایه یا مرجعی به آنها. هشدارهای مربوط به تبدیل میان اعداد صحیح علامتدار و بدون علامت بهطور پیشفرض در C++ غیرفعال هستند، مگر اینکه -Wsign-conversion بهطور صریح فعال شده باشد.
هشدارهای مربوط به تبدیل ناشی از محاسبات روی یک نوع کوچک بازگشتی به همان نوع، تنها با -Warith-conversion ارائه میشوند.
- -Wdangling-else
- درباره
ساختارهایی
که ممکن است
در آنها
ابهام وجود
داشته باشد
که یک شاخهٔ
"else" به
کدام دستور
"if" تعلق
دارد،
هشدار
میدهد. در
اینجا
مثالی از
چنین موردی
آمده است:
{ if (a) if (b) foo (); else bar (); }در C/C++، هر شاخهٔ "else" به درونیترین دستور ممکن "if" تعلق دارد، که در این مثال "if (b)" است. این اغلب آن چیزی نیست که برنامهنویس انتظار داشته است، همانطور که در مثال بالا با تورفتگیِ انتخابی برنامهنویس نشان داده شده است. هنگامی که احتمال چنین ابهامی وجود داشته باشد و این پرچم مشخص شده باشد، GCC هشداری صادر میکند. برای رفع این هشدار، آکولادهای صریح در اطراف درونیترین دستور "if" اضافه کنید تا امکان نداشته باشد "else" به "if" دربرگیرنده تعلق بگیرد. کد حاصل شبیه به این خواهد بود:
{ if (a) { if (b) foo (); else bar (); } }این هشدار توسط -Wparentheses فعال میشود.
- -Wdangling-pointer
- -Wdangling-pointer=n
- درباره استفاده از اشارهگرها (یا مراجع C++) به اشیایی با طول مدت ماندگاری خودکار (automatic storage duration) پس از پایان یافتن طول عمر آنها، هشدار میدهد. این شامل متغیرهای محلی اعلانشده در بلوکهای تو در تو، لیترالهای مرکب (compound literals) و سایر اشیاء موقتِ بدوننام میشود. علاوه بر این، درباره ذخیره نشانی چنین اشیایی در اشارهگرهای گریخته (escaped pointers) هشدار میدهد. این هشدار در همه سطوح بهینهسازی فعال است، اما نتایج آن همراه با بهینهسازی ممکن است با نتایج بدون بهینهسازی متفاوت باشد.
- -Wdangling-pointer=1
- در سطح ۱، این هشدار تنها استفادههای بدون شرط از اشارهگرهای معلق (dangling pointers) را تشخیص میدهد.
- -Wdangling-pointer=2
- در سطح ۲، علاوه بر استفادههای بدون شرط، این هشدار استفادههای شرطی از اشارهگرهای معلق را نیز تشخیص میدهد.
فرم کوتاه -Wdangling-pointer معادل -Wdangling-pointer=2 است، در حالی که گزینههای -Wno-dangling-pointer و -Wdangling-pointer=0 اثری یکسان در غیرفعال کردن هشدارها دارند. -Wdangling-pointer=2 در -Wall گنجانده شده است.
این مثال هشدار را در سطح ۱ فعال میکند؛ به نشانی شیء موقت بدوننام بدون قید و شرط خارج از حوزهٔ (scope) آن ارجاع داده میشود.
char f (char c1, char c2, char c3)
{
char *p;
{
p = (char[]) { c1, c2, c3 };
}
// warning: using dangling pointer 'p' to an unnamed temporary
return *p;
}
در تابع زیر، ذخیره نشانی متغیر محلی "x" در اشارهگر گریختهٔ *p، هشدار را در سطح ۱ فعال میکند.
void g (int **p)
{
int x = 7;
// warning: storing the address of local variable 'x' in '*p'
*p = &x;
}
در این مثال، هنگام استفاده از اشارهگر s، آرایهٔ a خارج از حوزه (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);
}
هنگامی که
با
ماکروهای
"__TIME__"،
"__DATE__" یا
"__TIMESTAMP__"
مواجه شود
هشدار
میدهد،
چرا که ممکن
است از
کامپایلهای
بازتولیدپذیر
با تطابق
دقیق بیتی
(bit-wise-identical reproducible compilations)
جلوگیری
کنند.
- -Wempty-body
- اگر بدنه خالی در یک دستور "if"، "else" یا "do while" رخ دهد هشدار میدهد. این هشدار توسط -Wextra نیز فعال میشود.
- -Wno-endif-labels
- درباره نشانههای سرگردان (stray tokens) پس از "#else" و "#endif" هشدار ندهد.
- -Wenum-compare
- درباره مقایسه بین مقادیر با انواع شمارشی (enumerated) مختلف هشدار میدهد. در ++C، عدم تطابق نوع شمارشی در عبارتهای شرطی نیز تشخیص داده میشود و هشدار به صورت پیشفرض فعال است. در C این هشدار توسط -Wall فعال میشود.
- -Wenum-conversion
- هنگامی که مقداری از نوع شمارشی بهطور ضمنی به نوع شمارشی متفاوتی تبدیل شود، هشدار میدهد. این هشدار در C با -Wextra فعال میشود.
- -Wenum-int-mismatch (فقط C و Objective-C)
- درباره عدم
تطابق بین
یک نوع
شمارشی و یک
نوع عدد
صحیح در
اعلانها
هشدار
میدهد.
برای مثال:
enum E { l = -1, z = 0, g = 1 }; int foo(void); enum E foo(void);در C، یک نوع شمارشی با "char"، یک نوع عدد صحیح علامتدار، یا یک نوع عدد صحیح بدون علامت سازگار است. با این حال، از آنجا که انتخاب نوع زیربنایی (underlying type) یک نوع شمارشی وابسته به پیادهسازی (implementation-defined) است، چنین عدم تطابقهایی ممکن است موجب مشکلات قابلیت انتقال (portability) شود. در ++C، چنین عدم تطابقهایی یک خطا محسوب میشود. در C، این هشدار توسط -Wall و -Wc++-compat فعال میشود.
- -Wjump-misses-init (فقط C و Objective-C)
- اگر یک
دستور
"goto" یا
دستور
"switch" به
جلو از روی
مقداردهی
اولیه یک
متغیر
بپرد، یا به
عقب به
برچسبی پس
از
مقداردهی
شدن متغیر
جهش کند،
هشدار
میدهد. این
مورد تنها
درباره
متغیرهایی
هشدار
میدهد که
هنگام
اعلان
مقداردهی
اولیه
شدهاند.
این هشدار
تنها برای C
و Objective-C
پشتیبانی
میشود؛ در
++C این نوع
پرش در هر
صورت یک خطا
است.
-Wjump-misses-init در -Wc++-compat گنجانده شده است. میتوان آن را با گزینه -Wno-jump-misses-init غیرفعال کرد.
- -Wsign-compare
- هنگامی که مقایسه میان مقادیر علامتدار و بدون علامت بتواند با تبدیل مقدار علامتدار به بدون علامت نتیجه نادرستی تولید کند، هشدار میدهد. در ++C، این هشدار توسط -Wall نیز فعال میشود. در C، توسط -Wextra نیز فعال است.
- -Wsign-conversion
- برای تبدیلهای ضمنی که ممکن است علامت مقدار یک عدد صحیح را تغییر دهند هشدار میدهد، مانند انتساب یک عبارت عدد صحیح علامتدار به یک متغیر عدد صحیح بدون علامت. تبدیل صریح (explicit cast) این هشدار را بیاثر میکند. در C، این گزینه توسط -Wconversion نیز فعال میشود.
- -Wflex-array-member-not-at-end (فقط C و ++C)
- هنگامی که
ساختاری
حاوی یک عضو
آرایه
انعطافپذیر
C99 به عنوان
آخرین
فیلد، در
انتهای
ساختار
دیگری قرار
نگرفته
باشد هشدار
میدهد. این
هشدار به
عنوان مثال
در چنین
مواردی
اعلان
میشود:
struct flex { int length; char data[]; }; struct mid_flex { int m; struct flex flex_data; int n; }; - -Wfloat-conversion
- برای تبدیلهای ضمنی که دقت یک مقدار حقیقی (ممیز شناور) را کاهش میدهند هشدار میدهد. این شامل تبدیل از عدد حقیقی به عدد صحیح و از مقادیر حقیقی با دقت بالاتر به مقادیر با دقت پایینتر است. این گزینه توسط -Wconversion نیز فعال میشود.
- -Wno-scalar-storage-order
- درباره ساختارهای مشکوک مربوط به ترتیب معکوس ذخیرهسازی اسکالر (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" که
به عنوان حد
مجاز (bound) یک
عبارت
"sizeof" از
آرایه مبدأ
را مشخص
میکنند
هشدار
میدهد.
برای
نمونه، در
تابع زیر
فراخوانی
"strncat"
اندازه
رشته مبدأ
را به عنوان
کران تعیین
میکند. این
کار
تقریباً
قطعاً یک
اشتباه است
و بنابراین
برای این
فراخوانی
اخطار صادر
میشود.
void make_file (const char *name) { char path[PATH_MAX]; strncpy (path, name, sizeof path - 1); strncat (path, ".text", sizeof ".text"); ... }گزینه -Wsizeof-pointer-memaccess توسط -Wall فعال میشود.
- -Wno-sizeof-array-argument
- هنگامی که عملگر "sizeof" روی پارامتری اعمال میشود که در تعریف تابع به عنوان یک آرایه اعلان شده است، هشدار ندهد. این هشدار به صورت پیشفرض برای برنامههای C و ++C فعال است.
- -Wmemset-elt-size
- برای فراخوانیهای مشکوک تابع توکار "memset" هشدار میدهد، در صورتی که آرگومان اول به یک آرایه ارجاع داشته باشد و آرگومان سوم عددی برابر با تعداد عناصر باشد، اما با اندازه آرایه در حافظه برابر نباشد. این نشان میدهد که کاربر ضرب در اندازه عنصر را از قلم انداخته است. این هشدار توسط -Wall فعال میشود.
- -Wmemset-transposed-args
- برای فراخوانیهای مشکوک به تابع توکار "memset" که در آنها آرگومان دوم غیر صفر و آرگومان سوم صفر است، هشدار میدهد. برای مثال، فراخوانی "memset (buf, sizeof buf, 0)" شناسایی و اخطار داده میشود زیرا به جای آن "memset (buf, 0, sizeof buf)" مد نظر بوده است. این اخطار تنها در صورتی صادر میشود که آرگومان سوم یک صفر صریح (literal zero) باشد. در غیر این صورت، اگر عبارتی باشد که به صفر تقلیل یابد، یا حاصل تبدیل نوع صفر به نوعی دیگر باشد، احتمال بسیار کمتری وجود دارد که آرگومانها به اشتباه جابهجا شده باشند و هشداری صادر نمیشود. این هشدار توسط -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) ارزیابی میشود (به استثنای نمادهای ضعیف یا weak symbols)، بنابراین استفاده از آنها در یک عبارت شرطی ممکن است نشاندهنده جا افتادن پرانتزها در فراخوانی یک تابع یا عدم ارجاعزدایی (dereference) در عبارت یک آرایه باشد. زیرمجموعه این هشدار برای اشارهگرهای شیء را میتوان با تبدیل صریح عملوندِ اشارهگر به یک نوع عدد صحیح مانند "intptr_t" یا "uintptr_t" غیرفعال کرد. مقایسهها در برابر رشتههای لیترال منجر به رفتار نامشخص (unspecified behavior) شده و غیرقابلانتقال (non-portable) هستند، و القا میکنند که هدف، فراخوانی "strcmp" بوده است. اگر عبارت مشکوک حاصل بسط یک ماکرو (macro expansion) باشد، هشدار غیرفعال میشود. هشدار -Waddress توسط -Wall فعال میشود.
- -Wno-address-of-packed-member
- هنگامی که
آدرس یک عضو
متراکمشده
(packed member) از
ساختار (struct) یا
اجتماع (union)
گرفته
میشود، که
معمولاً
منجر به یک
مقدار
اشارهگر
ترازنشده
(unaligned pointer)
میگردد،
هشدار ندهد.
این گزینه
به صورت
پیشفرض
فعال است..IP
-Wlogical-op 4
دربارهٔ
استفادههای
مشکوک از
عملگرهای
منطقی در
عبارتها
هشدار
میدهد. این
شامل
استفاده از
عملگرهای
منطقی در
بافتهایی
است که
احتمالاً
انتظار یک
عملگر بیتی
میرود.
همچنین
زمانی که
عملوندهای
یک عملگر
منطقی
یکسان
باشند،
هشدار
میدهد:
extern int a; if (a < 0 && a < 0) { ... } - -Wlogical-not-parentheses
- دربارهٔ
استفاده از
نقیض منطقی
(logical not) روی
عملوند سمت
چپ یک
مقایسه
هشدار
میدهد. این
گزینه در
صورتی که
عملوند سمت
راست یک
عبارت بولی
در نظر
گرفته شود،
هشدار
نمیدهد.
هدف آن
تشخیص
کدهای
مشکوکی
مانند
نمونهٔ زیر
است:
int a; ... if (!a > 1) { ... }میتوان با قرار دادن عملوند سمت چپ در پرانتز، این هشدار را سرکوب کرد:
if ((!a) > 1) { ... }این هشدار توسط -Wall فعال میشود.
- -Waggregate-return
- اگر توابعی که ساختارها (structures) یا اجتماعها (unions) را بازمیگردانند تعریف یا فراخوانی شوند، هشدار میدهد. (در زبانهایی که در آنها بازگرداندن آرایه ممکن است، این مورد نیز باعث ایجاد هشدار میشود.)
- -Wno-aggressive-loop-optimizations
- اگر کامپایلر رفتار تعریفنشدهای را در یک حلقه با تعداد تکرار ثابت تشخیص دهد، هشدار نمیدهد. گزینهٔ -Waggressive-loop-optimizations بهطور پیشفرض فعال است.
- -Wno-attributes
- اگر یک
"__attribute__"
غیرمنتظره
استفاده
شود، مانند
صفتهای (attributes)
ناشناخته،
صفتهای
تابع که روی
متغیرها
اعمال
شدهاند و
غیره،
هشدار
نمیدهد.
این گزینه
مانع از
خطاهای
ناشی از
کاربرد
نادرست
صفتهای
پشتیبانیشده
نمیشود.
هشدارهای مربوط به کاربردهای نادرست صفتهای استاندارد، با -pedantic-errors به خطا ارتقا مییابند.
علاوه بر این، با استفاده از -Wno-attributes= میتوان هشدارهای مربوط به صفتهای ناشناخته با حوزهٔ مشخص (scoped) را (در C++11 و C23) سرکوب کرد. برای نمونه، -Wno-attributes=vendor::attr هشدار دربارهٔ اعلان زیر را غیرفعال میکند:
[[vendor::attr]] void f();
همچنین میتوان با استفاده از -Wno-attributes=vendor:: هشدار دربارهٔ تمام صفتهای موجود در یک فضای نام (namespace) را غیرفعال کرد که مانع از هشدار دربارهٔ هر دوی این اعلانها میشود:
[[vendor::safe]] void f(); [[vendor::unsafe]] void f2();
توجه داشته باشید که -Wno-attributes= به معنای فعال شدن -Wno-attributes نیست.
- -Wno-builtin-declaration-mismatch
- اگر یک تابع
توکار (built-in) با
یک امضای
ناسازگار
یا به صورت
یک غیرتابع
اعلان شود،
یا زمانی که
یک تابع
توکارِ
اعلانشده
با نوعی که
فاقد
پیشنمونه
(prototype) است، با
آرگومانهایی
فراخوانی
شود که
نوعهای
ارتقایافتهٔ
آنها با
نوعهای
مورد
انتظار
تابع
همخوانی
ندارد،
هشدار
میدهد. در
صورت مشخص
شدن -Wextra، اگر
یک تابع
توکار
آرگومانپذیر
بدون
پیشنمونه
اعلان شود
نیز هشدار
میدهد.
هشدار
-Wbuiltin-declaration-mismatch
بهطور
پیشفرض
فعال است.
برای
جلوگیری از
این هشدار،
فایل سربرگ
مناسب را
اضافه کنید
تا
پیشنمونههای
توابع
توکار وارد
دامنه (scope)
شوند.
برای نمونه، فراخوانی "memset" در زیر با این هشدار شناسایی میشود زیرا این تابع انتظار مقداری از نوع "size_t" را به عنوان آرگومان خود دارد، اما نوع 32 برابر "int" است. با -Wextra، اعلان تابع نیز شناسایی میشود.
extern void* memset (); void f (void *d) { memset (d, '\0', 32); } - -Wno-builtin-macro-redefined
- در صورت بازتعریف برخی ماکروهای توکار خاص، هشدار نمیدهد. این گزینه هشدارهای مربوط به بازتعریف "__TIMESTAMP__"، "__TIME__"، "__DATE__"، "__FILE__" و "__BASE_FILE__" را سرکوب میکند.
- -Wfree-labels (فقط C و Objective-C)
- اگر یک
برچسب (label) به
چیزی غیر از
دستور
اعمال شود،
یا در
انتهای یک
دستور مرکب
(compound statement) قرار
گیرد،
هشدار
میدهد.
چنین
برچسبهایی
در C23 و
گویشهای
پس از آن در C
مجاز هستند
و در سایر
گویشها به
عنوان یک
افزونهٔ GCC
در دسترس
میباشند.
این هشدار همچنین توسط -Wc11-c23-compat فعال میشود. در صورت ساخت برای نسخهای از C قبل از C23، با -pedantic-errors به یک خطا تبدیل میشود.
- -Wheader-guard
- اگر یک محافظ گنجاندن چندباره (multiple inclusion guard) معتبر برای سربرگ پیشپردازنده، دارای دستورالعمل "#define" بلافاصله پس از دستورالعمل "#ifndef" یا "#if !defined" محافظ باشد که ماکرویی متفاوت از ماکروی محافظ اما با نامی مشابه تعریف کند، و ماکروی واقعی محافظ در دستورالعمل متناظر در انتهای سربرگ تعریف نشده باشد، و دستورالعمل "#define" یک ماکروی شبیه شیء (object-like) با تعریف خالی بسازد، هشدار میدهد. در چنین مواردی، معمولاً نام محافظ چه در دستورالعمل "#ifndef" یا "#if !defined" و چه در دستورالعمل "#define" بعدی، صرفاً دارای غلط املایی است. این هشدار توسط -Wall فعال میشود.
- -Wstrict-prototypes (فقط C و Objective-C)
- اگر تابعی بدون مشخص کردن نوع آرگومانها اعلان یا تعریف شود، هشدار میدهد. (تعریف تابع به سبک قدیمی در صورتی که پیش از آن اعلانی حاوی تعیین نوع آرگومانها آمده باشد، بدون هشدار مجاز است.)
- -Wold-style-declaration (فقط C و Objective-C)
- دربارهٔ کاربردهای منسوخشده در یک اعلان، مطابق با استاندارد C، هشدار میدهد. برای نمونه، اگر مشخصکنندههای ردهٔ ذخیرهسازی (storage-class specifiers) مانند "static" نخستین بخش یک اعلان نباشند، هشدار میدهد. این هشدار همچنین توسط -Wextra فعال میشود.
- -Wold-style-definition (فقط C و Objective-C)
- در صورت استفاده از تعریف تابع به سبک قدیمی، هشدار میدهد. حتی اگر پیشنمونهٔ قبلی وجود داشته باشد نیز هشدار داده میشود. تعریفی که از () استفاده میکند، در حالت C23 یک تعریف سبک قدیمی تلقی نمیشود، زیرا در آن حالت معادل (void) است، اما در استانداردهای قدیمیتر، تعریفی به سبک قدیمی به شمار میرود.
- -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
functions) یا توابع
موجود در
فضاهای نام
ناشناس
هشداری
صادر
نمیشود..IP
-Wmissing-field-initializers 4
هشدار
میدهد اگر
مقداردهنده
اولیهی یک
ساختار (structure)
برخی
فیلدها را
جا انداخته
باشد. برای
مثال، کد
زیر موجب
چنین
هشداری
میشود،
زیرا "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. }در موارد نادر ممکن است هشدارهای مثبت کاذب رخ دهد. برای خاموش کردن آن، عبارت را در پرانتز قرار دهید. برای مثال، مورد زیر حتی زمانی که 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 استفاده کنید، GCC در صورتی که کد شما در قالب NFKC نباشد هشدار میدهد. این هشدار با هشدار دادن درباره هر شناسهای که حاوی حرف O است چون ممکن است با رقم 0 اشتباه گرفته شود قابل مقایسه است، و بنابراین پیشفرض نیست، اما اگر محیط برنامهنویسی نتواند برای نمایش متمایز این نویسهها اصلاح شود، ممکن است به عنوان یک شیوهنامه کدنویسی محلی مفید باشد.
- -Wno-attribute-warning
- درباره استفاده از توابعی که با صفت "warning" اعلان شدهاند هشدار نده. بهطور پیشفرض، این هشدار فعال است. -Wno-attribute-warning را میتوان برای غیرفعال کردن هشدار، یا -Wno-error=attribute-warning را میتوان برای غیرفعال کردن خطا هنگام کامپایل با پرچم -Werror استفاده کرد.
- -Wno-deprecated
- درباره
استفاده از
ویژگیهای
منسوخشده
هشدار نده.
در ++C، مشخص کردن صریح -Wdeprecated همچنین هشدارهایی را درباره برخی ویژگیها که در استانداردهای بعدی زبان منسوخ شدهاند فعال میکند، بهویژه -Wcomma-subscript، -Wvolatile، -Wdeprecated-enum-float-conversion، -Wdeprecated-enum-enum-conversion، -Wdeprecated-literal-operator، و -Wdeprecated-variadic-comma-omission.
- -Wno-deprecated-declarations
- درباره استفاده از توابع، متغیرها و انواعی که با استفاده از صفت "deprecated" به عنوان منسوخشده علامتگذاری شدهاند، هشدار نده.
- -Wno-overflow
- درباره سرریز زمان کامپایل در عبارتهای ثابت هشدار نده.
- -Wno-odr
- درباره نقضهای قاعده یک تعریف (One Definition Rule) در طول بهینهسازی هنگام پیوند هشدار میدهد. بهطور پیشفرض فعال است.
- -Wopenacc-parallelism
- درباره انتخابهای بالقوه غیربهینه مرتبط با موازیسازی OpenACC هشدار میدهد.
- -Wno-openmp
- درباره کدهای مشکوک OpenMP هشدار میدهد.
- -Wopenmp-simd
- هشدار میدهد اگر مدل هزینه بردارساز (vectorizer cost model) دستورالعمل simd مربوط به OpenMP تعیینشده توسط کاربر را نادیده بگیرد. گزینه -fsimd-cost-model=unlimited را میتوان برای آسانگیرتر کردن مدل هزینه استفاده کرد.
- -Woverride-init (فقط C و Objective-C)
- هشدار
میدهد اگر
هنگام
استفاده از
مقداردهندههای
مشخصشده
(designated initializers)، یک
فیلد
مقداردهیشده
بدون اثر
جانبی
بازنویسی
شود.
این هشدار در -Wextra گنجانده شده است. برای دریافت سایر هشدارهای -Wextra بدون این هشدار، از -Wextra -Wno-override-init استفاده کنید.
- -Wno-override-init-side-effects (فقط C و Objective-C)
- اگر هنگام استفاده از مقداردهندههای مشخصشده، یک فیلد مقداردهیشده با اثر جانبی بازنویسی شود، هشدار نده. این هشدار بهطور پیشفرض فعال است.
- -Wpacked
- هشدار
میدهد اگر
به یک
ساختار صفت
packed داده شود،
اما صفت packed
اثری روی
چیدمان یا
اندازه
ساختار
نداشته
باشد. چنین
ساختارهایی
ممکن است در
ازای سود
اندک، دچار
ناترازی (misalignment)
شوند. برای
نمونه، در
این کد،
متغیر
"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; }; نسخههای سری 4.1، 4.2 و 4.3 از GCC صفت "packed" را در فیلدهای بیتی از نوع "char" نادیده میگیرند. این مورد در GCC 4.4 برطرف شد، اما این تغییر میتواند منجر به تفاوتهایی در چیدمان ساختار شود. زمانی که آفست چنین فیلدی در GCC 4.4 تغییر کرده باشد، GCC به شما اطلاع میدهد. برای نمونه، در این ساختار دیگر یک پدینگ ۴ بیتی بین فیلد "a" و "b" وجود ندارد: struct foo { char a:4; char b:8; } __attribute__ ((packed));این هشدار به طور پیشفرض فعال است. برای غیرفعال کردن این هشدار از -Wno-packed-bitfield-compat استفاده کنید.
- -Wpacked-not-aligned (فقط C، C++، Objective-C و Objective-C++)
- اگر فیلدی
از یک
ساختار با
همترازی
مشخصشده
به صورت
صریح در یک struct
یا union
فشردهشده
(packed)
ناهمتراز
باشد،
هشدار
میدهد.
برای
نمونه، در
این کد
هشداری
برای "struct
S" صادر
خواهد شد،
مانند "warning:
alignment 1 of 'struct S' is less than
8":
struct __attribute__ ((aligned (8))) S8 { char a[8]; }; struct __attribute__ ((packed)) S { struct S8 s8; };این هشدار با -Wall فعال میشود.
- -Wpadded
- اگر پدینگ در یک ساختار گنجانده شود، چه برای همتراز کردن یک عنصر از ساختار و چه برای همتراز کردن کل ساختار، هشدار میدهد. گاهی اوقات در چنین شرایطی ممکن است بتوان فیلدهای ساختار را بازآرایی کرد تا پدینگ کاهش یابد و در نتیجه اندازه ساختار کوچکتر شود.
- -Wredundant-decls
- اگر چیزی بیش از یک بار در همان حوزه (scope) اعلان شود، حتی در مواردی که اعلان چندگانه معتبر است و چیزی را تغییر نمیدهد، هشدار میدهد.
- -Wrestrict
- هنگامی
هشدار
میدهد که
شیئی
ارجاعشده
توسط یک
پارامتر با
توصیفکننده
"restrict" (یا
در C++، یک
پارامتر با
توصیفکننده
"__restrict")
توسط
آرگومان
دیگری دچار
نامپوشانی
(alias) شود، یا
زمانی که
رونوشتها
میان چنین
اشیایی
همپوشانی
داشته
باشند. برای
نمونه،
فراخوانی
تابع
"strcpy" در
زیر با
جایگزین
کردن
نویسههای
ابتدایی آن
با چهار
نویسه آخر،
سعی در
کوتاهسازی
رشته دارد.
با این حال،
از آنجا که
این
فراخوانی
نویسه
پایانی NUL را
درون "a[4]"
مینویسد،
رونوشتها
همپوشانی
پیدا کرده و
این
فراخوانی
شناسایی و
گزارش
میشود.
void foo (void) { char a[] = "abcd1234"; strcpy (a, a + 4); ... }گزینه -Wrestrict برخی از موارد همپوشانی ساده را حتی بدون بهینهسازی شناسایی میکند، اما بهترین کارایی آن در سطح -O2 و بالاتر است. این گزینه در -Wall گنجانده شده است.
- -Wnested-externs (فقط C و Objective-C)
- اگر یک اعلان "extern" در داخل یک تابع دیده شود، هشدار میدهد.
- -Winline
- اگر تابعی
که به صورت inline
اعلان شده
است نتواند
درونخطی
شود، هشدار
میدهد. حتی
با وجود این
گزینه،
کامپایلر
درباره
شکست در
درونخطیسازی
توابعی که
در هدرهای
سیستمی
اعلان
شدهاند
هشداری
صادر
نمیکند.
کامپایلر از روشهای ابتکاری گوناگونی برای تعیین اینکه یک تابع درونخطی شود یا خیر استفاده میکند. برای نمونه، کامپایلر اندازه تابعی که قرار است درونخطی شود و مقدار درونخطیسازیای که تا کنون در تابع فعلی انجام شده است را در نظر میگیرد. بنابراین، تغییرات به ظاهر ناچیز در برنامه مبدأ میتوانند باعث ظاهر شدن یا ناپدید شدن هشدارهای تولید شده توسط -Winline شوند.
- -Winterference-size
- درباره
استفاده از
"std::hardware_destructive_interference_size"
در C++17 بدون
مشخص کردن
مقدار آن با
--param destructive-interference-size
هشدار
میدهد.
همچنین
درباره
مقادیر
نامتعارف
برای آن
گزینه
هشدار
میدهد.
این متغیر برای استفاده در کنترل چیدمان کلاس، به منظور اجتناب از اشتراک کاذب (false sharing) در کدهای همروند در نظر گرفته شده است:
struct independent_fields { alignas(std::hardware_destructive_interference_size) std::atomic<int> one; alignas(std::hardware_destructive_interference_size) std::atomic<int> two; };در اینجا one و two به گونهای در نظر گرفته شدهاند که به اندازه کافی دور از یکدیگر باشند تا عمل ذخیرهسازی در یکی، نیازمند دسترسی به دیگری برای بارگذاری مجدد خط حافظه نهان (cache line) نباشد.
به طور پیشفرض، --param destructive-interference-size و --param constructive-interference-size بر اساس گزینه فعلی -mtune تنظیم میشوند؛ معمولاً برابر با اندازه خط حافظه نهان L1 برای پردازنده مقصد مشخص، و گاهی به یک بازه در صورت بهینهسازی برای یک مقصد عمومی (generic). بنابراین تمام واحدهای ترجمهای که برای استفاده از این متغیرها به سازگاری ABI وابسته هستند، باید با همان -mtune (یا -mcpu) کامپایل شوند.
اگر پایداری ABI اهمیت دارد، برای نمونه اگر کاربرد آن در فایل هدر یک کتابخانه است، احتمالاً اصلاً نباید از متغیرهای hardware interference size استفاده کنید. در غیر این صورت، میتوانید با --param یک مقدار مشخص را تحمیل کنید.
اگر اطمینان دارید که استفاده شما از این متغیر بر 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
- هشدارهای حاصل از تبدیل نوع (cast) یک عدد صحیح به نوع اشارهگر با اندازه متفاوت را نادیده میگیرد. در C++، تبدیل نوع به یک نوع اشارهگر با اندازه کوچکتر یک خطا محسوب میشود. گزینه Wint-to-pointer-cast به طور پیشفرض فعال است.
- -Wno-pointer-to-int-cast (فقط C و Objective-C)
- هشدارهای حاصل از تبدیل نوع (cast) از یک اشارهگر به نوع عدد صحیح با اندازه متفاوت را نادیده میگیرد.
- -Winvalid-pch
- اگر یک هدر از پیش کامپایلشده (precompiled header) در مسیر جستجو یافت شود اما نتوان از آن استفاده کرد، هشدار میدهد.
- -Winvalid-utf8
- اگر یک نویسه نامعتبر UTF-8 یافت شود، هشدار میدهد. این هشدار برای C++23 در صورت استفاده از -finput-charset=UTF-8 به طور پیشفرض فعال است و با -pedantic-errors به خطا تبدیل میشود.
- -Wno-unicode
- شکلهای نامعتبر توالیهای فرار محدودشده یا نامدار را که به عنوان نشانههای مجزا در نظر گرفته میشوند، گزارش نمیکند. Wunicode به طور پیشفرض فعال است.
- -Wlong-long
- اگر از نوع
"long long"
استفاده
شود، هشدار
میدهد. این
گزینه در
حالتهای ISO C90
و C++98 توسط -Wpedantic
یا -Wtraditional فعال
میشود.
برای متوقف
کردن
پیامهای
هشدار، از
-Wno-long-long
استفاده
کنید.
این هشدار با -pedantic-errors به یک خطا ارتقا مییابد.
- -Wvariadic-macros
- اگر ماکروهای با تعداد آرگومان متغیر (variadic) در حالت ISO C90 استفاده شوند، یا ساختار نحوی جایگزین GNU در حالت ISO C99 به کار رود، هشدار میدهد. این گزینه توسط -Wpedantic یا -Wtraditional فعال میشود. برای غیرفعال کردن پیامهای هشدار، از -Wno-variadic-macros استفاده کنید.
- -Wno-varargs
- درباره استفاده مشکوک از ماکروهای به کار رفته برای مدیریت آرگومانهای متغیر مانند "va_start" هشدار نمیدهد. این هشدارها به طور پیشفرض فعال هستند.
- -Wvector-operation-performance
- اگر یک عملیات برداری از طریق قابلیتهای SIMD معماری پیادهسازی نشود، هشدار میدهد. عمدتاً برای بهبود کارایی مفید است. عملیات برداری میتواند به صورت "piecewise" پیادهسازی شود، به این معنی که عملیات اسکالر بر روی تکتک عناصر بردار انجام میشود؛ "in parallel"، به این معنی که عملیات برداری با استفاده از اسکالرهای با نوع عریضتر پیادهسازی میشود که معمولاً از نظر کارایی بهینهتر است؛ و "as a single scalar"، به این معنی که بردار در یک نوع داده اسکالر جای میگیرد.
- -Wvla
- اگر یک
آرایه با
طول متغیر
در کد
استفاده
شود، هشدار
میدهد. -Wno-vla
از هشدار
-Wpedantic درباره
آرایههای
با طول
متغیر
جلوگیری
میکند.
این هشدار با -pedantic-errors به یک خطا ارتقا مییابد.
- -Wvla-larger-than=byte-size
- در صورت
استفاده از
این گزینه،
کامپایلر
برای
اعلانهای
آرایههای
با طول
متغیر که
اندازه
آنها یا
نامحدود
است، یا
توسط
آرگومانی
محدود شده
که اجازه
میدهد
اندازه
آرایه از byte-size
بایت فراتر
رود، هشدار
میدهد. این
سازوکار
مشابه نحوه
کارکرد
-Walloca-larger-than=byte-size
است، اما بر
روی
آرایههای
با طول
متغیر
اعمال
میشود.
توجه داشته باشید که GCC ممکن است آرایههای کوچک با طول متغیر با مقدار معلوم را به آرایههای معمولی بهینهسازی کند، بنابراین ممکن است این هشدار برای چنین آرایههایی صادر نشود.
گزینه -Wvla-larger-than=PTRDIFF_MAX به طور پیشفرض فعال است اما معمولاً تنها زمانی اثرگذار است که -ftree-vrp فعال باشد (که پیشفرض در -O2 و بالاتر است).
همچنین -Walloca-larger-than=byte-size را ببینید..IP -Wno-vla-larger-than 4 هشدارهای -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) به صورت volatile اعلان شده باشد، هشدار میدهد. تغییردهنده volatile از تمامی بهینهسازیهایی که ممکن است خواندنها و/یا نوشتنها در متغیرهای ثبات را حذف کنند جلوگیری نمیکند. این هشدار توسط -Wall فعال میشود.
- -Wno-xor-used-as-pow (فقط C، C++، Objective-C و Objective-C++)
- هشدارهای
مربوط به
استفاده از
"^"،
عملگر XOR، در
مواردی که
به نظر
میرسد
منظور کد
توانرسانی
بوده است را
غیرفعال
میکند.
بهطور
خاص، این
هشدار
زمانی رخ
میدهد که
سمت چپ ثابت
دهدهی ۲ یا
۱۰ باشد و
سمت راست
نیز یک ثابت
دهدهی
باشد.
در C و C++، عملگر "^" به معنای XOR است، در حالی که در برخی زبانهای دیگر (مانند TeX و برخی نگارشهای BASIC) به معنای توانرسانی است.
این هشدار را میتوان با تبدیل یکی از عملوندها به هگزادسیمال و همچنین با کامپایل کردن به همراه -Wno-xor-used-as-pow غیرفعال کرد.
- -Wdisabled-optimization
- اگر یک گذر بهینهسازی (optimization pass) درخواستشده غیرفعال شود، هشدار میدهد. این هشدار عموماً نشاندهنده وجود اشکال در کد شما نیست؛ بلکه صرفاً نشان میدهد که بهینهسازهای GCC قادر به پردازش کارآمد کد نیستند. اغلب مشکل از بزرگی یا پیچیدگی بیش از حد کد شماست؛ زمانی که احتمال برود خود بهینهسازی زمان بسیار نامتعارفی میگیرد، GCC از بهینهسازی برنامهها خودداری میکند.
- -Wpointer-sign (فقط C و Objective-C)
- برای ارسال
یا انتساب
آرگومانهای
اشارهگر
با
علامتداری
(signedness) متفاوت
هشدار
میدهد. این
گزینه فقط
برای C و Objective-C
پشتیبانی
میشود. این
هشدار به
طور ضمنی
توسط -Wall و
توسط -Wpedantic
فعال
میشود، و
میتوان آن
را با -Wno-pointer-sign
غیرفعال
کرد.
این هشدار با استفاده از -pedantic-errors به یک خطا تبدیل میشود.
- -Wstack-protector
- این گزینه تنها زمانی فعال است که -fstack-protector فعال باشد. درباره توابعی که در برابر تخریب پشته (stack smashing) محافظت نشدهاند هشدار میدهد.
- -Woverlength-strings
- درباره
ثابتهای
رشتهای که
از طول
«حداقل
حداکثر»
مشخصشده
در
استاندارد C
طولانیتر
هستند
هشدار
میدهد.
کامپایلرهای
امروزی
عموماً
ثابتهای
رشتهای
بسیار
طولانیتر
از حداقل حد
مجاز
استاندارد
را مجاز
میدانند،
اما
برنامههایی
که باید
حملپذیری
بالایی
داشته
باشند باید
از
رشتههای
طولانیتر
اجتناب
کنند.
این محدودیت پس از الحاق ثابتهای رشتهای اعمال میشود و نویسه NUL پایانی را محاسبه نمیکند. در C90، این محدودیت ۵۰۹ نویسه بود؛ در C99، به ۴۰۹۵ افزایش یافت. استاندارد C++98 حداقل حداکثر تجویزی مشخص نمیکند، بنابراین ما رشتههای با طول بیش از حد را در C++ تشخیص نمیدهیم.
این گزینه به صورت ضمنی توسط -Wpedantic اعمال میشود، و میتوان آن را با -Wno-overlength-strings غیرفعال کرد.
- -Wunsuffixed-float-constants (فقط C و Objective-C)
- برای هر ثابت ممیز شناور که پسوند ندارد یک هشدار صادر میکند. هنگامی که همراه با -Wsystem-headers استفاده شود، درباره چنین ثابتهایی در فایلهای سرآیند سیستمی هشدار میدهد. این قابلیت هنگام آمادهسازی کد برای استفاده با رهنمود "FLOAT_CONST_DECIMAL64" از افزونه ممیز شناور دهدهی C99 میتواند سودمند باشد.
- -Wno-lto-type-mismatch
- در طول بهینهسازی زمان پیوند (LTO)، درباره عدم تطابق نوع در اعلانهای سراسری از واحدهای کامپایل متفاوت هشدار نمیدهد. نیازمند فعال بودن -flto است. به صورت پیشفرض فعال است.
- -Wno-designated-init (فقط C و Objective-C)
- هنگامی که از یک مقداردهنده اولیه موضعی (positional) برای مقداردهی اولیه ساختاری که با مشخصه "designated_init" علامتگذاری شده استفاده میشود، از صدور هشدار جلوگیری میکند.
گزینههای کنترل تحلیل ایستا (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-undefined-behavior-ptrdiff -Wanalyzer-undefined-behavior-strtok -Wanalyzer-unsafe-call-within-signal-handler -Wanalyzer-use-after-free -Wanalyzer-use-of-pointer-in-stale-stack-frame -Wanalyzer-use-of-uninitialized-value -Wanalyzer-va-arg-type-mismatch -Wanalyzer-va-list-exhausted -Wanalyzer-va-list-leak -Wanalyzer-va-list-use-after-va-end -Wanalyzer-write-to-const -Wanalyzer-write-to-string-literal
این گزینه تنها زمانی در دسترس است که GCC با پشتیبانی از تحلیلگر پیکربندی شده باشد.
- -Wanalyzer-symbol-too-complex
- اگر -fanalyzer
فعال باشد،
تحلیلگر
از قواعد
اکتشافی
گوناگونی
برای تلاش
در جهت
ردیابی
وضعیت
حافظه
استفاده
میکند،
اما این
تلاشها
ممکن است
توسط کدهای
بسیار
پیچیده
بیاثر
شوند.
به طور پیشفرض، اگر مقادیر عبارات از آستانه تعریفشده توسط --param analyzer-max-svalue-depth=value فراتر رود، تحلیل بدون اخطار ردیابی مقادیر عبارات را متوقف کرده و برای چنین عباراتی به یک نمایش نادقیق بازمیگردد. گزینه -Wanalyzer-symbol-too-complex در صورت وقوع این حالت هشدار میدهد.
- -Wanalyzer-too-complex
- اگر -fanalyzer
فعال باشد،
تحلیلگر
از روشهای
اکتشافی
گوناگونی
برای تلاش
در کاوش
جریان
کنترل و
جریان داده
در برنامه
استفاده
میکند،
اما این
روشها
ممکن است
توسط کدهای
بسیار
پیچیده به
بنبست
بخورند.
به طور پیشفرض، اگر کد برای کاوش کامل تحلیلگر بیش از حد پیچیده باشد و به یک محدودیت داخلی برسد، تحلیل بدون ایجاد سر و صدا متوقف میشود. گزینه -Wanalyzer-too-complex در صورت وقوع چنین حالتی هشدار میدهد..IP -Wno-analyzer-allocation-size 4 این هشدار نیازمند -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 برای
غیرفعال
کردن آن
استفاده
کنید.
این پیام تشخیصی درباره مسیرهایی از کد هشدار میدهد که در آنها ممکن است یک تابع آزادساز روی یک اشارهگر بیش از یک بار فراخوانی شود، خواه "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 و
استفاده از
یک افزونه (plugin)
برای مشخص
کردن تابعی
که از میان
یک «مرز
اعتماد»
کپی
میکند،
نیاز دارد.
از -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").
- -Wno-analyzer-fd-leak
- این هشدار
نیازمند -fanalyzer
است که آن
را فعال
میکند؛ از
-Wno-analyzer-fd-leak برای
غیرفعال
کردن آن
استفاده
کنید.
این پیام تشخیصی درباره مسیرهایی از کد هشدار میدهد که در آنها یک توصیفگر فایلِ باز، نشت میکند (آزاد نمیشود).
ببینید CWE-775: Missing Release of File Descriptor or Handle after Effective Lifetime ("https://cwe.mitre.org/data/definitions/775.html").
- -Wno-analyzer-fd-phase-mismatch
- این هشدار
نیازمند -fanalyzer
است که آن
را فعال
میکند؛ از
-Wno-analyzer-fd-phase-mismatch برای
غیرفعال
کردن آن
استفاده
کنید.
این پیام تشخیصی درباره مسیرهایی از کد هشدار میدهد که در آنها یک عملیات در فاز نادرستی از چرخه عمر توصیفگر فایل انجام میشود. برای مثال، هنگام تلاش برای فراخوانی "accept" روی یک سوکت جریانی (stream socket) که هنوز "listen" با موفقیت روی آن فراخوانی نشده، هشدار خواهد داد.
ببینید CWE-666: Operation on Resource in Wrong Phase of Lifetime ("https://cwe.mitre.org/data/definitions/666.html").
- -Wno-analyzer-fd-type-mismatch
- این هشدار
نیازمند -fanalyzer
است که آن
را فعال
میکند؛ از
-Wno-analyzer-fd-type-mismatch برای
غیرفعال
کردن آن
استفاده
کنید.
این پیام تشخیصی درباره مسیرهایی از کد هشدار میدهد که در آنها یک عملیات بر روی نوع نادرستی از توصیفگر فایل انجام میشود. برای مثال، هنگام تلاش برای استفاده از عملیاتهای سوکت روی یک توصیفگر فایل که از طریق "open" به دست آمده، یا هنگام تلاش برای استفاده از یک عملیات سوکت جریانی روی یک سوکت دیتاگرام هشدار میدهد.
- -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
برای
غیرفعال
کردن آن
استفاده
کنید.
این پیام تشخیصی درباره مسیرهایی از کد هشدار میدهد که در آنها از محاسبات ممیز شناور (floating-point) در مکانهایی استفاده شده که محاسبات دقیق نیاز است. این پیام تشخیصی در حال حاضر فقط درباره استفاده از عملوندهای ممیز شناور درون محاسبه اندازه تخصیص حافظه هشدار میدهد.
- -Wno-analyzer-infinite-loop
- این هشدار
نیازمند -fanalyzer
است که آن
را فعال
میکند؛ از
-Wno-analyzer-infinite-loop برای
غیرفعال
کردن آن
استفاده
کنید.
این پیام تشخیصی درباره مسیرهایی از کد هشدار میدهد که به نظر میرسد به یک حلقه بینهایت منجر میشوند.
به طور خاص، تحلیلگر زمانی این هشدار را صادر میکند که حلقهای را «مشاهده کند» که در آن:
- هیچ کار قابل مشاهدهای از بیرون در داخل حلقه انجام نشود.IP * 4 راهی برای خروج از حلقه وجود ندارد
- تحلیلگر با اطمینان کافی از وضعیت برنامه در سرتاسر حلقه مطلع است تا بداند موارد بالا درست هستند
یکی از راههای صدور این هشدار زمانی است که مسیر اجرایی درون یک حلقه وجود دارد که طی کردن آن در یک تکرار، مستلزم طی شدن همان مسیر در تمام تکرارهای بعدی است.
به عنوان مثال، در نظر بگیرید:
while (1)
{
char opcode = *cpu_state.pc;
switch (opcode)
{
case OPCODE_FOO:
handle_opcode_foo (&cpu_state);
break;
case OPCODE_BAR:
handle_opcode_bar (&cpu_state);
break;
}
}
تحلیلگر برای حالت بالا ایراد خواهد گرفت چرا که اگر "opcode" با هیچیک از حالات تطابق نداشته باشد، "switch" از حالت ضمنی "default" پیروی میکند، که باعث میشود بدنهٔ حلقه یک «no-op» باشد و "cpu_state.pc" بدون تغییر بماند، و در نتیجه از همان مقدار "opcode" در تمام تکرارهای بعدی استفاده شود، که به یک حلقهٔ بینهایت میانجامد.
ببینید CWE-835: Loop with Unreachable Exit Condition ('Infinite Loop') ("https://cwe.mitre.org/data/definitions/835.html").
- -Wno-analyzer-infinite-recursion
- این هشدار
نیازمند -fanalyzer
است که آن
را فعال
میکند؛ از
-Wno-analyzer-infinite-recursion برای
غیرفعال
کردن آن
استفاده
کنید.
این پیام تشخیصی در مورد مسیرهایی در کد که به نظر میرسد به بازگشت بینهایت منجر میشوند هشدار میدهد.
بهطور مشخص، هنگامی که تحلیلگر یک فراخوانی بازگشتی را «میبیند»، وضعیت حافظه در بدو ورود به چارچوب جدید را با وضعیت حافظه در بدو ورود به چارچوب قبلی آن تابع در پشته مقایسه میکند. اگر به نظر برسد هیچ چیزی در حافظه تغییر نمیکند، هشدار صادر میشود؛ هرگونه تغییر مشاهدهشده در پارامترها یا متغیرهای سراسری فرض میشود که به پایان بازگشت ختم خواهد شد و بدین ترتیب جلوی هشدار گرفته میشود.
احتمال دارد این پیام تشخیصی مواردی از بازگشت بینهایت را که پیش از «دیدن» توسط تحلیلگر، بهوسیلهٔ بهینهساز به تکرار (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").
- -Wno-analyzer-mismatching-deallocation
- این هشدار
نیازمند -fanalyzer
است که آن
را فعال
میکند؛ از
-Wno-analyzer-mismatching-deallocation
برای
غیرفعال
کردن آن
استفاده
کنید.
این پیام تشخیصی در مورد مسیرهایی در کد هشدار میدهد که در آنها بر اساس تابعی که برای تخصیص مقدار اشارهگر استفاده شده است، تابع آزادسازی نادرستی بر روی مقدار آن اشارهگر فراخوانی میشود. این پیام تشخیصی در مورد ناهماهنگی بین "free"، عملگر اسکالر "delete" و برداری "delete[]"، و مواردی که با صفت "malloc" به عنوان جفتهای تخصیصدهنده/آزادکننده مشخص شدهاند هشدار خواهد داد.
ببینید CWE-762: Mismatched Memory Management Routines ("https://cwe.mitre.org/data/definitions/762.html").
- -Wno-analyzer-out-of-bounds
- این هشدار
نیازمند -fanalyzer
است که آن
را فعال
میکند؛ از
-Wno-analyzer-out-of-bounds برای
غیرفعال
کردن آن
استفاده
کنید.
این پیام تشخیصی در مورد مسیرهایی در کد هشدار میدهد که در آنها یک بافر قطعاً خارج از محدوده خوانده یا نوشته میشود. این ابزار تشخیصی در مواردی اعمال میشود که تحلیلگر قادر به تعیین آفست ثابت باشد و برای دسترسیهای فراتر از انتهای یک بافر، ظرفیت نیز ثابت باشد. علاوه بر این، تحلیلگر بررسیهای محدودی را برای دسترسیهای فراتر از انتها در حالتی که آفست و همچنین ظرفیت نمادین (symbolic) هستند انجام میدهد.
ببینید CWE-119: Improper Restriction of Operations within the Bounds of a Memory Buffer ("https://cwe.mitre.org/data/definitions/119.html").
در مواردی که تحلیلگر قادر باشد، یک نمودار متنی (text art) تولید میکند که رابطهٔ مکانی بین ناحیهٔ حافظهای که تحلیلگر دسترسی به آن را پیشبینی میکند در برابر محدودهٔ مجاز حافظه برای دسترسی را به تصویر میکشد: اینکه آیا با یکدیگر همپوشانی دارند، مماس هستند، نزدیک یا دور از هم هستند؛ کدامیک در حافظه قبل یا بعد از دیگری است، اندازههای نسبی مربوطه، جهت دسترسی (خواندن در برابر نوشتن)، و در برخی موارد، مقادیر دادههای درگیر. این نمودار را میتوان با استفاده از -fdiagnostics-text-art-charset=none غیرفعال کرد.
- -Wno-analyzer-overlapping-buffers
- این هشدار
نیازمند -fanalyzer
است که آن
را فعال
میکند؛ از
-Wno-analyzer-overlapping-buffers برای
غیرفعال
کردن آن
استفاده
کنید.
این پیام تشخیصی در مورد مسیرهایی در کد هشدار میدهد که در آنها بافرهای دارای همپوشانی به یک API ارسال میشوند که رفتار آن روی چنین بافرهایی تعریفنشده (undefined) است.
بهطور مشخص، این پیام تشخیصی در فراخوانیهای توابع زیر رخ میدهد
- *<"memcpy">
- *<"strcat">
- *<"strcpy">
برای مواردی که مشخص است بافرها همپوشانی دارند.
- -Wno-analyzer-possible-null-argument
- این هشدار
نیازمند -fanalyzer
است که آن
را فعال
میکند؛ از
-Wno-analyzer-possible-null-argument
برای
غیرفعال
کردن آن
استفاده
کنید.
این پیام تشخیصی در مورد مسیرهایی در کد هشدار میدهد که در آنها یک مقدار احتمالاً "NULL" به آرگومان تابعی ارسال میشود که با "__attribute__((nonnull))" به عنوان نیازمند یک مقدار غیر "NULL" مشخص شده است.
ببینید CWE-690: Unchecked Return Value to NULL Pointer Dereference ("https://cwe.mitre.org/data/definitions/690.html").
- -Wno-analyzer-possible-null-dereference
- این هشدار
نیازمند -fanalyzer
است که آن
را فعال
میکند؛ از
-Wno-analyzer-possible-null-dereference
برای
غیرفعال
کردن آن
استفاده
کنید.
این پیام تشخیصی در مورد مسیرهایی در کد هشدار میدهد که در آنها یک مقدار احتمالاً "NULL" ارجاعزدایی میشود.
ببینید CWE-690: Unchecked Return Value to NULL Pointer Dereference ("https://cwe.mitre.org/data/definitions/690.html").
- -Wno-analyzer-null-argument
- این هشدار
نیازمند -fanalyzer
است که آن
را فعال
میکند؛ از
-Wno-analyzer-null-argument برای
غیرفعال
کردن آن
استفاده
کنید.
این پیام تشخیصی در مورد مسیرهایی در کد هشدار میدهد که در آنها یک مقدار که مشخصاً NULL است، به آرگومان تابعی ارسال میشود که با "__attribute__((nonnull))" به عنوان نیازمند یک مقدار غیر "NULL" مشخص شده است.
ببینید CWE-476: NULL Pointer Dereference ("https://cwe.mitre.org/data/definitions/476.html").
- -Wno-analyzer-null-dereference
- این هشدار
نیازمند -fanalyzer
است که آن
را فعال
میکند؛ از
-Wno-analyzer-null-dereference برای
غیرفعال
کردن آن
استفاده
کنید.
این پیام تشخیصی در مورد مسیرهایی در کد هشدار میدهد که در آنها از مقداری که مشخصاً NULL است ارجاعزدایی میشود.
ببینید CWE-476: NULL Pointer Dereference ("https://cwe.mitre.org/data/definitions/476.html").
- -Wno-analyzer-putenv-of-auto-var
- این هشدار
نیازمند -fanalyzer
است که آن
را فعال
میکند؛ از
-Wno-analyzer-putenv-of-auto-var برای
غیرفعال
کردن آن
استفاده
کنید.
این پیام تشخیصی در مورد مسیرهایی در کد هشدار میدهد که در آنها در یک فراخوانی "putenv"، اشارهگری به یک متغیر خودکار (automatic) یا یک بافر روی پشته پاس داده میشود.
ببینید POS34-C. Do not call putenv() with a pointer to an automatic variable as the argument ("https://wiki.sei.cmu.edu/confluence/x/6NYxBQ").
- -Wno-analyzer-shift-count-negative
- این هشدار
نیازمند -fanalyzer
است که آن
را فعال
میکند؛ از
-Wno-analyzer-shift-count-negative برای
غیرفعال
کردن آن
استفاده
کنید.
این پیام تشخیصی در مورد مسیرهایی در کد هشدار میدهد که در آنها برای یک عمل شیفت (shift)، از مقداری منفی استفاده شده است. این مورد مشابه پیام تشخیصی -Wshift-count-negative پیادهسازیشده در فرانتاندهای C/C++ است، اما به جای تجزیهٔ صرف درخت نحو، بر اساس تحلیل مسیرهای میانرویهای پیادهسازی شده است. با این وجود، تحلیلگر تشخیص چنین مسیرهایی را در اولویت قرار نمیدهد، بنابراین احتمال خطاهای منفی کاذب (false negatives) در مقایسه با سایر هشدارها بیشتر است..IP -Wno-analyzer-shift-count-overflow 4 این هشدار به -fanalyzer نیاز دارد که آن را فعال میکند؛ برای غیرفعالکردن آن از -Wno-analyzer-shift-count-overflow استفاده کنید.
این اعلان تشخیصی در مورد مسیرهایی از کد هشدار میدهد که در آنها تلاش شده یک شیفت (shift) با مقداری بزرگتر یا مساوی با دقت نوع عملوند انجام شود. این هشدار مشابه اعلان تشخیصی -Wshift-count-overflow پیادهسازیشده در فرانتاندهای C/C++ است، با این تفاوت که بر پایه تحلیل مسیرهای بینروالی پیادهسازی شده است، نه صرفاً تجزیه درخت نحو. با این حال، تحلیلگر اولویتی برای شناسایی چنین مسیرهایی قائل نمیشود، بنابراین احتمال موارد منفی کاذب نسبت به سایر هشدارها بیشتر است.
- -Wno-analyzer-stale-setjmp-buffer
- این هشدار
به -fanalyzer نیاز
دارد که آن
را فعال
میکند؛
برای
غیرفعالکردن
آن از -Wno-analyzer-stale-setjmp-buffer
استفاده
کنید.
این اعلان تشخیصی در مورد مسیرهایی از کد هشدار میدهد که در آنها "longjmp" برای بازگشت به یک "jmp_buf" مرتبط با فراخوانی "setjmp" در تابعی که بازگشته است، فراخوانی میشود.
هنگامی که "setjmp" روی یک "jmp_buf" برای ثبت موقعیت بازگشت فراخوانی میشود، فریم پشته را ثبت میکند. فریم پشته هنگامی که تابع دربردارنده فراخوانی "setjmp" بازمیگردد، نامعتبر میشود. تلاش برای بازگشت به آن از طریق "longjmp" به فریم پشتهای ارجاع میدهد که دیگر وجود ندارد و احتمالاً منجر به فروپاشی برنامه (یا بدتر از آن) خواهد شد.
- -Wno-analyzer-tainted-allocation-size
- این هشدار
به -fanalyzer نیاز
دارد که آن
را فعال
میکند؛
برای
غیرفعالکردن
آن از
-Wno-analyzer-tainted-allocation-size
استفاده
کنید.
این اعلان تشخیصی در مورد مسیرهایی از کد هشدار میدهد که در آنها مقداری که میتواند تحت واپایش یک مهاجم باشد، بدون پاکسازی به عنوان اندازه یک تخصیص حافظه به کار رفته است؛ به گونهای که مهاجم میتواند تخصیصی بیش از حد بزرگ را تزریق کرده و به طور بالقوه موجب حمله محرومسازی از سرویس شود.
رجوع کنید به 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). برای مثال:
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
استفاده
کنید.
این اعلان تشخیصی در مورد مسیرهایی از کد هشدار میدهد که در آنها مقداری که میتواند تحت واپایش یک مهاجم باشد، بدون پاکسازی به عنوان اندیس دسترسی به یک آرایه به کار رفته است؛ به گونهای که مهاجم میتواند یک دسترسی خارج از محدوده (out-of-bounds) تزریق کند.
رجوع کنید به CWE-129: Improper Validation of Array Index ("https://cwe.mitre.org/data/definitions/129.html").
- -Wno-analyzer-tainted-divisor
- این هشدار
به -fanalyzer نیاز
دارد که آن
را فعال
میکند؛
برای
غیرفعالکردن
آن از -Wno-analyzer-tainted-divisor
استفاده
کنید.
این اعلان تشخیصی در مورد مسیرهایی از کد هشدار میدهد که در آنها مقداری که میتواند تحت واپایش یک مهاجم باشد، بدون پاکسازی به عنوان مقسومعلیه در یک عمل تقسیم یا محاسبه باقیمانده (modulus) به کار رفته است؛ به گونهای که مهاجم میتواند یک تقسیم بر صفر را تزریق کند.
رجوع کنید به CWE-369: Divide By Zero ("https://cwe.mitre.org/data/definitions/369.html").
- -Wno-analyzer-tainted-offset
- این هشدار
به -fanalyzer نیاز
دارد که آن
را فعال
میکند؛
برای
غیرفعالکردن
آن از -Wno-analyzer-tainted-offset
استفاده
کنید.
این اعلان تشخیصی در مورد مسیرهایی از کد هشدار میدهد که در آنها مقداری که میتواند تحت واپایش یک مهاجم باشد، بدون پاکسازی به عنوان آفست اشارهگر به کار رفته است؛ به طوری که مهاجم میتواند یک دسترسی خارج از محدوده را تزریق کند.
رجوع کنید به CWE-823: Use of Out-of-range Pointer Offset ("https://cwe.mitre.org/data/definitions/823.html").
- -Wno-analyzer-tainted-size
- این هشدار
به -fanalyzer نیاز
دارد که آن
را فعال
میکند؛
برای
غیرفعالکردن
آن از -Wno-analyzer-tainted-size
استفاده
کنید.
این اعلان تشخیصی در مورد مسیرهایی از کد هشدار میدهد که در آنها مقداری که میتواند تحت واپایش یک مهاجم باشد، بدون پاکسازی به عنوان اندازه عملیاتی مانند "memset" به کار رفته است؛ به گونهای که مهاجم میتواند یک دسترسی خارج از محدوده را تزریق کند.
رجوع کنید به CWE-129: Improper Validation of Array Index ("https://cwe.mitre.org/data/definitions/129.html").
- -Wno-analyzer-undefined-behavior-ptrdiff
- این هشدار
به -fanalyzer نیاز
دارد که آن
را فعال
میکند؛
برای
غیرفعالکردن
آن از
-Wno-analyzer-undefined-behavior-ptrdiff
استفاده
کنید.
این اعلان تشخیصی در مورد مسیرهایی از کد هشدار میدهد که در آنها تفریق اشارهگرها در حالی رخ میدهد که اشارهگرها به قطعههای متفاوتی از حافظه اشاره دارند. چنین کدی به رفتار تعریفنشده (undefined behavior) متکی است، زیرا تفریق اشارهگر فقط برای مواردی تعریف شده است که هر دو اشارهگر به داخل (یا بلافاصله بعد از) یک آرایه یکسان اشاره داشته باشند.
رجوع کنید به CWE-469: Use of Pointer Subtraction to Determine Size ("https://cwe.mitre.org/data/definitions/469.html").
- -Wno-analyzer-undefined-behavior-strtok
- این هشدار
به -fanalyzer نیاز
دارد که آن
را فعال
میکند؛
برای
غیرفعالکردن
آن از
-Wno-analyzer-undefined-behavior-strtok
استفاده
کنید.
این اعلان تشخیصی در مورد مسیرهایی از کد هشدار میدهد که در آنها فراخوانیای به "strtok" همراه با رفتار تعریفنشده صورت گرفته است.
به طور مشخص، ارسال NULL به عنوان پارامتر اول برای نخستین فراخوانی "strtok" درون یک فرایند، رفتاری تعریفنشده دارد.
- -Wno-analyzer-unsafe-call-within-signal-handler
- این هشدار
به -fanalyzer نیاز
دارد که آن
را فعال
میکند؛
برای
غیرفعالکردن
آن از
-Wno-analyzer-unsafe-call-within-signal-handler
استفاده
کنید.
این اعلان تشخیصی در مورد مسیرهایی از کد هشدار میدهد که در آنها تابعی که به عنوان ناامن در برابر سیگنال ناهمگام (async-signal-unsafe) شناخته میشود (مانند "fprintf") از درون یک گرداننده سیگنال فراخوانی شده است.
رجوع کنید به CWE-479: Signal Handler Use of a Non-reentrant Function ("https://cwe.mitre.org/data/definitions/479.html").
- -Wno-analyzer-use-after-free
- این هشدار
به -fanalyzer نیاز
دارد که آن
را فعال
میکند؛
برای
غیرفعالکردن
آن از -Wno-analyzer-use-after-free
استفاده
کنید.
این اعلان تشخیصی در مورد مسیرهایی از کد هشدار میدهد که در آنها یک اشارهگر پس از فراخوانی یک آزادساز حافظه بر روی آن استفاده شده است: چه "free"، و چه یک آزادساز حافظه که با مشخصه "malloc" ارجاع داده شده باشد.
رجوع کنید به CWE-416: Use After Free ("https://cwe.mitre.org/data/definitions/416.html").
- -Wno-analyzer-use-of-pointer-in-stale-stack-frame
- این هشدار
به -fanalyzer نیاز
دارد که آن
را فعال
میکند؛
برای
غیرفعالکردن
آن از
-Wno-analyzer-use-of-pointer-in-stale-stack-frame
استفاده
کنید.
این اعلان تشخیصی در مورد مسیرهایی از کد هشدار میدهد که در آنها اشارهگری که به متغیری در یک فریم پشته بیاتشده (stale stack frame) اشاره دارد، ارجاعزدایی میشود.
- -Wno-analyzer-va-arg-type-mismatch
- این هشدار
به -fanalyzer نیاز
دارد که آن
را فعال
میکند؛
برای
غیرفعالکردن
آن از
-Wno-analyzer-va-arg-type-mismatch
استفاده
کنید.
این اعلان تشخیصی در مورد مسیرهای بینروالی از کد هشدار میدهد که تحلیلگر در آنها تلاش برای استفاده از "va_arg" جهت استخراج مقداری ارسالشده به یک فراخوانی با آرگومانهای متغیر (variadic) را شناسایی میکند، اما از نوعی استفاده شده که با نوع عبارت ارسالشده به فراخوانی مطابقت ندارد.
رجوع کنید به CWE-686: Function Call With Incorrect Argument Type ("https://cwe.mitre.org/data/definitions/686.html")..IP -Wno-analyzer-va-list-exhausted 4 این هشدار نیازمند -fanalyzer است که آن را فعال میکند؛ از -Wno-analyzer-va-list-exhausted برای غیرفعالسازی آن استفاده کنید.
این پیام تشخیصی برای مسیرهای بینروالی درون کُد هشدار میدهد که در آنها تحلیلگر تلاشی را برای استفاده از "va_arg" جهت دسترسی به مقدار بعدیِ ارسالشده به یک فراخوانی با تعداد متغیر آرگومان (variadic call) شناسایی کند، اما تمام مقادیر موجود در "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".
- -Wno-analyzer-write-to-const
- این هشدار
نیازمند -fanalyzer
است که آن
را فعال
میکند؛ از
-Wno-analyzer-write-to-const برای
غیرفعالسازی
آن استفاده
کنید.
این پیام تشخیصی برای مسیرهایی درون کُد هشدار میدهد که در آنها تحلیلگر تلاشی برای نوشتن از طریق یک اشارهگر روی شیء "const" را شناسایی کند. با این حال، تحلیلگر شناسایی چنین مسیرهایی را در اولویت قرار نمیدهد، بنابراین احتمال موارد منفی کاذب (false negatives) در مقایسه با سایر هشدارها بیشتر است.
- -Wno-analyzer-write-to-string-literal
- این هشدار
نیازمند -fanalyzer
است که آن
را فعال
میکند؛ از
-Wno-analyzer-write-to-string-literal
برای
غیرفعالسازی
آن استفاده
کنید.
این پیام تشخیصی برای مسیرهایی درون کُد هشدار میدهد که در آنها تحلیلگر تلاشی برای نوشتن از طریق یک اشارهگر روی یک رشته لفظی (string literal) را شناسایی کند. با این حال، تحلیلگر شناسایی چنین مسیرهایی را در اولویت قرار نمیدهد، بنابراین احتمال موارد منفی کاذب (false negatives) در مقایسه با سایر هشدارها بیشتر است.
- -Wno-analyzer-use-of-uninitialized-value
- این هشدار
نیازمند -fanalyzer
است که آن
را فعال
میکند؛ از
-Wno-analyzer-use-of-uninitialized-value
برای
غیرفعالسازی
آن استفاده
کنید.
این پیام تشخیصی برای مسیرهایی درون کُد هشدار میدهد که در آنها از یک مقدار مقداردهینشده استفاده شده است.
ببینید: CWE-457: Use of Uninitialized Variable ("https://cwe.mitre.org/data/definitions/457.html").
تحلیلگر شناخت تعبیهشدهای (hardcoded) دربارهٔ رفتار توابع مدیریت حافظهٔ زیر دارد:
- *<"alloca">
- *<توابع توکار "__builtin_alloc",>
- "__builtin_alloc_with_align", @item "__builtin_calloc", "__builtin_free", "__builtin_malloc", "__builtin_memcpy", "__builtin_memcpy_chk", "__builtin_memset", "__builtin_memset_chk", "__builtin_realloc", "__builtin_stack_restore" و "__builtin_stack_save"
- *<"calloc">
- *<"free">
- *<"malloc">
- *<"memset">
- *<"operator delete">
- *<"operator delete []">
- *<"operator new">
- *<"operator new []">
- *<"realloc">
- *<"strdup">
- *<"strndup">
دربارهٔ توابع زیر برای کار با توصیفکنندههای فایل:
- *<"open">
- *<"close">
- *<"creat">
- *<"dup"، "dup2" و "dup3">
- *<"isatty">
- *<"pipe" و "pipe2">
- *<"read">
- *<"write">
- *<"socket"، "bind"، "listen"، "accept" و "connect">
دربارهٔ توابع زیر برای کار با جریانهای "<stdio.h>":
- *<توابع توکار "__builtin_fprintf",>
- "__builtin_fprintf_unlocked", "__builtin_fputc", "__builtin_fputc_unlocked", "__builtin_fputs", "__builtin_fputs_unlocked", "__builtin_fwrite", "__builtin_fwrite_unlocked", "__builtin_printf", "__builtin_printf_unlocked", "__builtin_putc", "__builtin_putchar", "__builtin_putchar_unlocked", "__builtin_putc_unlocked", "__builtin_puts", "__builtin_puts_unlocked", "__builtin_vfprintf" و "__builtin_vprintf"
- *<"fopen">
- *<"fclose">
- *<"ferror">
- *<"fgets">
- *<"fgets_unlocked">
- *<"fileno">
- *<"fread">
- *<"getc">
- *<"getchar">
- *<"fprintf">
- *<"printf">
- *<"fwrite">
و دربارهٔ توابع زیر:
- *<توابع توکار "__builtin_expect",>
- "__builtin_expect_with_probability", "__builtin_strchr", "__builtin_strcpy", "__builtin_strcpy_chk", "__builtin_strlen", "__builtin_va_copy" و "__builtin_va_start"
- *<افزونههای GNU "error" و "error_at_line">
- *<"getpass">
- *<"longjmp">
- *<"putenv">
- *<"setjmp">
- *<"siglongjmp">
- *<"signal">
- *<"sigsetjmp">
- *<"strcat">
- *<"strchr">
- *<"strlen">
- علاوه بر این، توابع گوناگونی با پیشوند "__analyzer_" معنای ویژهای برای تحلیلگر دارند که در دفترچه راهنمای بخشهای داخلی GCC (یا GCC Internals) شرح داده شدهاند.
پارامترهای مرتبط برای کنترل کاوش عبارتند از:
- *<--param analyzer-bb-explosion-factor=value>
- *<--param analyzer-max-enodes-per-program-point=value>
- *<--param analyzer-max-recursion-depth=value>
- *<--param analyzer-min-snodes-for-call-summary=value>
گزینههای زیر تحلیلگر را کنترل میکنند:
- -fanalyzer-call-summaries
- سادهسازی
تحلیل
میانرویهای
(interprocedural analysis) با
محاسبهٔ
اثر
فراخوانیهای
خاص، به جای
کاوش تمام
مسیرهای
درون تابع
از محل
فراخوانی
تا هر
بازگشت
ممکن.
در صورت فعال بودن، خلاصههای فراخوانی فقط برای توابعی استفاده میشوند که بیش از یک محل فراخوانی داشته باشند و به اندازهٔ کافی پیچیده باشند (مطابق با --param analyzer-min-snodes-for-call-summary=value).
- -fanalyzer-checker=name
- تحلیلگر را تنها به اجرای بررسیکنندهٔ (checker) نامبردهشده محدود کرده و آن را فعال میکند.
- -fanalyzer-debug-text-art-headings
- این گزینه برای توسعهدهندگان تحلیلگر در نظر گرفته شده است. در صورت فعال بودن، تحلیلگر یادداشتها و حاشیهنویسیهای اضافی را به نمودارهایی که تولید میکند میافزاید.
- -fno-analyzer-feasibility
- این گزینه
برای
توسعهدهندگان
تحلیلگر
در نظر
گرفته شده
است.
به طور پیشفرض، تحلیلگر بررسی میکند که برای هر گزارش تشخیصی که صادر میکند، یک مسیر کنترل جریان امکانپذیر (feasible) وجود داشته باشد: به این معنی که شرایط برقرارشده با یکدیگر ناسازگار نباشند. گزارشهای تشخیصی که هیچ مسیر امکانپذیری برای آنها یافت نشود، رد میشوند. این پالایش را میتوان با -fno-analyzer-feasibility، به منظور اشکالزدایی مشکلات این بخش از کد غیرفعال کرد.
- -fanalyzer-fine-grained
- این گزینه
برای
توسعهدهندگان
تحلیلگر
در نظر
گرفته شده
است.
تحلیلگر در داخل خود یک «گراف گسترده» (exploded graph) میسازد که گرافهای کنترل جریان را با اطلاعات جریان داده ترکیب میکند.
به طور پیشفرض، یک یال در این گراف میتواند حاوی اثرات اجرای چندین دستور در یک بلوک پایه (basic block) باشد. با -fanalyzer-fine-grained، هر دستور یک یال اختصاصی برای خود دریافت میکند.
- -fanalyzer-show-duplicate-count
- این گزینه برای توسعهدهندگان تحلیلگر در نظر گرفته شده است: در صورتی که چندین گزارش تشخیصی تکراری شناسایی شوند، هنگام گزارش بهترین مورد، یادداشتی نمایش داده میشود که تعداد گزارشهای تشخیصی اضافی حذفشده توسط منطق رفع موارد تکراری را نشان میدهد.
- -fanalyzer-show-events-in-system-headers
- به طور پیشفرض، تحلیلگر با پنهان کردن رویدادهایی که کاملاً در یک سرآیند سیستمی قرار دارند، مسیرهای تشخیصی سادهشدهای را ارائه میدهد. با -fanalyzer-show-events-in-system-headers این رویدادها دیگر پنهان و فرونشانده نمیشوند.
- -fno-analyzer-state-merge
- این گزینه
برای
توسعهدهندگان
تحلیلگر
در نظر
گرفته شده
است.
به طور پیشفرض، تحلیلگر در حین ساخت «گراف گسترده» تلاش میکند با ادغام وضعیتهای به اندازهٔ کافی مشابه در هر نقطه از برنامه، تحلیل را سادهسازی کند. با -fno-analyzer-state-merge میتوان این ادغام را برای اشکالزدایی مسائل مربوط به مدیریت وضعیت غیرفعال کرد.
- -fno-analyzer-state-purge
- این گزینه
برای
توسعهدهندگان
تحلیلگر
در نظر
گرفته شده
است.
به طور پیشفرض، تحلیلگر سعی میکند با پاکسازی بخشهایی از وضعیت در یک نقطه از برنامه که دیگر مرتبط به نظر نمیرسند، فرایند تحلیل را ساده کند؛ مانند مقادیر متغیرهای محلی که در ادامهٔ تابع دیگر مورد دسترسی قرار نمیگیرند و ارتباطی با تحلیل نشت حافظه ندارند.
با -fno-analyzer-state-purge میتوان این پاکسازی وضعیت را به منظور اشکالزدایی مسائل مدیریت وضعیت غیرفعال کرد.
- -fno-analyzer-suppress-followups
- این گزینه
برای
توسعهدهندگان
تحلیلگر
در نظر
گرفته شده
است.
به طور پیشفرض، تحلیلگر پس از مواجهه با برخی خطاهای تشخیصی خاص، کاوش یک مسیر اجرا را متوقف میکند تا از صدور احتمالی زنجیرهای از هشدارهای تشخیصی بعدی جلوگیری شود.
پیامهای تشخیصی که به تحلیل در امتداد یک مسیر پایان میدهند عبارتند از:
- *<-Wanalyzer-null-argument>
- *<-Wanalyzer-null-dereference>
- *<-Wanalyzer-use-after-free>
- *<-Wanalyzer-use-of-pointer-in-stale-stack-frame>
- *<-Wanalyzer-use-of-uninitialized-value>
با -fno-analyzer-suppress-followups، تحلیلگر حتی پس از این گزارشهای تشخیصی نیز به کاوش در چنین مسیرهایی ادامه میدهد؛ امری که ممکن است برای اشکالزدایی مشکلات درون تحلیلگر یا برای معیارسنجیهای خرد جهت تشخیص رفتار تعریفنشده مفید باشد.
- -fanalyzer-transitivity
- این گزینه قابلیت ترایایی (transitivity) قیدها را در تحلیلگر فعال میکند.
- -fno-analyzer-undo-inlining
- این گزینه
برای
توسعهدهندگان
تحلیلگر
در نظر
گرفته شده
است.
گزینهٔ -fanalyzer در مقایسه با سایر ابزارهای تحلیل کد، نسبتاً دیر اجرا میشود و برخی بهینهسازیها از قبل روی کد اعمال شدهاند. به ویژه، دروننشانی توابع (function inlining) ممکن است رخ داده باشد که باعث میشود مسیرهای اجرای میانرویهای صادرشده توسط تحلیلگر، حاوی قابهای تابعی باشند که با قابهای موجود در کد مبدأ اصلی مطابقت ندارند.
به طور پیشفرض، تحلیلگر تلاش میکند قابهای اصلی تابع را بازسازی کند و رویدادهایی را صادر نماید که فراخوانیهای دروننشانیشده را نشان دهند.
با -fno-analyzer-undo-inlining میتوان این تلاش برای بازسازی اطلاعات قاب اصلی را غیرفعال کرد، که این موضوع میتواند هنگام اشکالزدایی مسائل درون تحلیلگر مفید باشد.
- -fanalyzer-verbose-edges
- این گزینه برای توسعهدهندگان تحلیلگر در نظر گرفته شده است. این گزینه جزئیات دقیقتر و سطح پایینتری را در توصیف جریان کنترل درون مسیرهای تشخیصی فعال میکند.
- -fanalyzer-verbose-state-changes
- این گزینه برای توسعهدهندگان تحلیلگر در نظر گرفته شده است. این گزینه جزئیات دقیقتر و سطح پایینتری را در توصیف رویدادهای مربوط به ماشینهای وضعیت در مسیرهای تشخیصی فعال میکند.
- -fanalyzer-verbosity=level
- این گزینه
میزان
پیچیدگی
مسیرهای
جریان
کنترلی را
که برای
پیامهای
تشخیصی
تحلیلگر
صادر
میشوند
کنترل
میکند.
مقدار level میتواند یکی از موارد زیر باشد:
- 0
- در این سطح، رویدادهای فراخوانی و بازگشت میانرویهای، همراه با مرتبطترین رویدادهای تغییر وضعیت مربوط به یک گزارش تشخیصی نمایش داده میشوند. برای مثال، برای خطای آزادسازی مضاعف ("free" دوگانه)، هر دو فراخوانی به "free" نشان داده خواهند شد.
- 1
- مانند سطح قبلی، اما رویدادهای مربوط به ورود به هر تابع را نیز نشان میدهد.
- 2
- مانند سطح
قبلی، اما
همچنین
رویدادهای
مربوط به
جریان
کنترل را که
در بروز
مشکل نقش
مهمی
داشتهاند
نشان
میدهد
(مانند «طی
شدن مسیر
درست/true» در
یک شرط).
این سطح، مقدار پیشفرض است.
- 3
- مانند سطح قبلی، اما همهٔ رویدادهای جریان کنترل را نشان میدهد، نه فقط موارد مهم را.
- 4
- این سطح برای توسعهدهندگان تحلیلگر در نظر گرفته شده است؛ رویدادهای گوناگون دیگری را اضافه میکند که هدف آنها اشکالزدایی خود تحلیلگر است.
- -fdump-analyzer
- تخلیهٔ جزئیات داخلی دربارهٔ عملیات تحلیلگر در فایل file.analyzer.txt. گزینهٔ -fdump-analyzer-stderr بر این گزینه اولویت دارد.
- -fdump-analyzer-stderr
- تخلیهٔ جزئیات داخلی دربارهٔ عملیات تحلیلگر در stderr. این گزینه بر -fdump-analyzer اولویت دارد و آن را بازنویسی میکند.
- -fdump-analyzer-callgraph
- تخلیهٔ نمایشی از گراف فراخوانی (call graph) مناسب برای مشاهده با GraphViz در فایل file.callgraph.dot.
- -fdump-analyzer-exploded-graph
- تخلیهٔ نمایشی از «گراف گسترده» مناسب برای مشاهده با GraphViz در فایل file.eg.dot. گرهها بر اساس وضعیتهای ماشین وضعیت با رنگهای مشخص کدگذاری شدهاند تا تغییرات وضعیت برجسته شوند.
- -fdump-analyzer-exploded-nodes
- صدور گزارشهای تشخیصی که نشان میدهند گرههای موجود در «گراف گسترده» در چه موقعیتی نسبت به کد مبدأ برنامه قرار دارند..IP -fdump-analyzer-exploded-nodes-2 4 تخلیه یک نمایش متنی از «گراف بسطیافته» (exploded graph) در file.eg.txt.
- -fdump-analyzer-exploded-nodes-3
- تخلیه یک نمایش متنی از «گراف بسطیافته» به ازای هر گره در یک فایل تخلیه، در file.eg-id.txt. این کار معمولاً منجر به تعداد بسیار زیادی فایل تخلیه میشود.
- -fdump-analyzer-exploded-paths
- تخلیه یک نمایش متنی از «مسیر بسطیافته» (exploded path) برای هر گزارش عیبیابی در file.idx.kind.epath.txt.
- -fdump-analyzer-feasibility
- تخلیه جزئیات داخلی درباره جستجوی تحلیلگر برای مسیرهای شدنی (feasible paths). این جزئیات در قالبی مناسب برای مشاهده با GraphViz در نامفایلهایی با ساختار file.*.fg.dot، file.*.tg.dot و file.*.fpath.txt نوشته میشوند.
- -fdump-analyzer-infinite-loop
- تخلیه جزئیات داخلی درباره جستجوی تحلیلگر برای حلقههای بیپایان. این جزئیات در قالبی مناسب برای مشاهده با GraphViz در نامفایلهایی به شکل file.*.infinite-loop.dot نوشته میشوند.
- -fdump-analyzer-json
- تخلیه یک نمایش فشردهشده JSON از ساختار درونی تحلیلگر در file.analyzer.json.gz. قالب دقیق این فایل ممکن است دستخوش تغییر شود.
- -fdump-analyzer-state-purge
- همانند -fdump-analyzer-supergraph، یک نمایش از «ابَرگراف» (supergraph) مناسب برای مشاهده با GraphViz را تخلیه میکند، اما گراف را با اطلاعاتی درباره اینکه چه وضعیتی در هر گره پاکسازی خواهد شد حاشیهنویسی میکند. این گراف در file.state-purge.dot نوشته میشود.
- -fdump-analyzer-supergraph
- تخلیه نمایشهایی از «ابَرگراف» (supergraph) مناسب برای مشاهده با GraphViz در file.supergraph.dot و file.supergraph-eg.dot. این فایلها تمام گرافهای جریان کنترل در برنامه را، به همراه یالهای بینروالی برای فراخوانیها و بازگشتها نشان میدهند. تخلیه دوم شامل حاشیهنویسیهایی است که گرهها را در «گراف بسطیافته» و گزارشهای عیبیابی مرتبط با آنها نشان میدهد.
- -fdump-analyzer-untracked
- صدور هشدارهای سفارشی حاوی جزئیات داخلی که برای توسعهدهندگان تحلیلگر در نظر گرفته شده است.
گزینههایی برای اشکالزدایی برنامه شما (Options for Debugging Your Program)
برای اعلام به GCC جهت تولید اطلاعات اضافی برای استفاده توسط یک اشکالزدا (debugger)، تقریباً در تمام موارد تنها کافی است -g را به دیگر گزینههای خود اضافه کنید. برخی قالبهای اشکالزدایی میتوانند همزمان وجود داشته باشند (مانند DWARF همراه با CTF) در صورتی که هر یک از آنها به صورت صریح با افزودن گزینه خط فرمان مربوطه به دیگر گزینههایتان فعال شده باشد.
GCC به شما اجازه میدهد از -g همراه با -O استفاده کنید. میانبرهایی که توسط کد بهینهسازیشده ایجاد میشوند ممکن است گاهی غافلگیرکننده باشند: ممکن است برخی متغیرهایی که تعریف کردهاید اصلاً وجود نداشته باشند؛ جریان کنترل ممکن است لحظهای به جایی برود که انتظارش را نداشتید؛ ممکن است برخی دستورات اجرا نشوند چون نتایج ثابتی را محاسبه میکنند یا مقادیر آنها از قبل در دسترس است؛ برخی دستورات ممکن است در مکانهای متفاوتی اجرا شوند زیرا به خارج از حلقهها منتقل شدهاند. با این وجود، اشکالزدایی خروجی بهینهسازیشده امکانپذیر است. این امر استفاده از بهینهساز را برای برنامههایی که ممکن است باگ داشته باشند منطقی میسازد.
اگر از گزینه بهینهسازی دیگری استفاده نمیکنید، استفاده از -Og به همراه -g را مد نظر قرار دهید. بدون هیچ گزینه -O، برخی گذرهای کامپایلر که اطلاعات مفید برای اشکالزدایی را جمعآوری میکنند اصلاً اجرا نمیشوند، به طوری که -Og ممکن است به تجربه اشکالزدایی بهتری بیانجامد.
- -g
- تولید
اطلاعات
اشکالزدایی
در قالب
بومی
سیستمعامل
(stabs، COFF، XCOFF یا DWARF).
ابزار GDB
میتواند
با این
اطلاعات
اشکالزدایی
کار کند.
در بیشتر سیستمهایی که از قالب stabs استفاده میکنند، -g استفاده از اطلاعات اشکالزدایی اضافی را که فقط GDB قادر به استفاده از آن است فعال میکند؛ این اطلاعات اضافی باعث عملکرد بهتر اشکالزدایی در GDB میشود اما احتمالاً باعث فروپاشی (crash) یا امتناع سایر اشکالزداها از خواندن برنامه میشود. اگر میخواهید با اطمینان تولید اطلاعات اضافی را کنترل کنید، از -gvms استفاده نمایید (پایین را ببینید).
- -ggdb
- تولید اطلاعات اشکالزدایی برای استفاده توسط GDB. این به معنای استفاده از رساترین قالب موجود (DWARF، stabs یا در صورت عدم پشتیبانی از هیچیک از این دو، قالب بومی)، شامل پسوندهای اختصاصی GDB در صورت امکان است.
- -gdwarf
- -gdwarf-version
- تولید
اطلاعات
اشکالزدایی
در قالب DWARF (در
صورت
پشتیبانی).
مقدار version
میتواند 2،
3، 4 یا 5 باشد؛
نسخه
پیشفرض
برای بیشتر
مقصدها 5
است (به
استثنای VxWorks،
TPF و Darwin / macOS که به
طور
پیشفرض از
نسخه 2
استفاده
میکنند، و
AIX که نسخه
پیشفرض آن
4 است).
توجه داشته باشید که در DWARF نسخه 2، برخی پورتها به افزونههای بدون تداخل DWARF 3 در جدولهای بازکردن پشته (unwind tables) نیاز دارند و همواره از آنها استفاده میکنند.
نسخه 4 ممکن است برای بهرهمندی حداکثری به GDB 7.0 و -fvar-tracking-assignments نیاز داشته باشد. نسخه 5 به GDB 8.0 یا بالاتر نیاز دارد.
GCC دیگر از DWARF نسخه 1 که تفاوتهای بنیادینی با نسخه 2 و بالاتر دارد پشتیبانی نمیکند. به دلایل تاریخی، برخی گزینههای مرتبط با DWARF (مانند -fno-dwarf2-cfi-asm) ارجاع به DWARF نسخه 2 را در نام خود حفظ کردهاند، اما بر تمام نسخههای DWARF که در حال حاضر پشتیبانی میشوند اعمال میشوند.
- -gbtf
- درخواست اطلاعات اشکالزدایی BTF. قالب BTF قالب پیشفرض اشکالزدایی برای مقصد eBPF است. در سایر مقاصد مانند x86، اطلاعات اشکالزدایی BTF میتواند همراه با اطلاعات اشکالزدایی DWARF تولید شود، به شرطی که هر دو قالب اشکالزدایی به صورت صریح از طریق گزینههای خط فرمان مربوطهشان فعال شده باشند.
- -gprune-btf
- -gno-prune-btf
- هرس کردن
اطلاعات BTF
پیش از
انتشار.
هنگام هرس،
فقط
اطلاعات
نوع برای
انواع
استفادهشده
توسط
متغیرهای
سراسری و
توابع در
حوزه فایل
(file-scope) منتشر
خواهد شد.
در صورت
کامپایل
برای مقصد BPF
با فعال
بودن BPF CO-RE،
اطلاعات
نوع برای
انواع
استفادهشده
در
جابهجاییهای
BPF CO-RE نیز
منتشر
میشود.
علاوه بر
این، انواع
struct و union که فقط
از طریق
اشارهگرها
از اعضای
سایر انواع
struct یا union به
آنها
ارجاع داده
شده است هرس
شده و با BTF_KIND_FWD
جایگزین
میشوند،
گویی آن
انواع
صرفاً به
عنوان
اعلانهای
پیشرو (forward declarations)
در ورودی
حضور
داشتهاند.
این گزینه اندازه اطلاعات BTF تولیدشده را به طور چشمگیری کاهش میدهد، اما با از دست رفتن بخش قابل توجهی از جزئیات نوع دادهها همراه است. این گزینه در درجه اول هنگام کامپایل برای مقصد BPF، جهت به حداقل رساندن اندازه شیء خروجی و حذف اطلاعات BTF که ارتباط مستقیمی با فرایند بارگذاری برنامه BPF ندارند مفید است.
این گزینه هنگام تولید اطلاعات BTF برای مقصد BPF به طور پیشفرض فعال است.
- -gctf
- -gctflevel
- درخواست
اطلاعات
اشکالزدایی
CTF و استفاده
از level برای
مشخص کردن
میزان
تولید
اطلاعات
اشکالزدایی
CTF. اگر -gctf
بدون مشخص
کردن
مقداری
برای level
تعیین شود،
سطح
پیشفرض
اطلاعات
اشکالزدایی
CTF برابر 2
خواهد بود.
اطلاعات اشکالزدایی CTF میتواند همزمان با اطلاعات اشکالزدایی DWARF تولید شود، به شرط آنکه هر دو قالب اشکالزدایی به صورت صریح از طریق گزینههای خط فرمان مربوطه فعال شده باشند.
سطح 0 هیچ اطلاعات اشکالزدایی CTF تولید نمیکند. بنابراین، -gctf0 گزینه -gctf را نفی و خنثی میکند.
سطح 1 اطلاعات CTF را فقط برای ردگیریها (tracebacks) تولید میکند. این سطح شامل اطلاعات محل فراخوانی (callsite) است، اما اطلاعات نوع را در بر نمیگیرد.
سطح 2 اطلاعات نوع را فقط برای موجودیتها (توابع، اشیای داده و غیره) در حوزه فایل یا حوزه سراسری تولید میکند.
- -gvms
- تولید اطلاعات اشکالزدایی در قالب اشکالزدایی Alpha/VMS (در صورت پشتیبانی). این قالبی است که توسط DEBUG در سیستمهای Alpha/VMS استفاده میشود.
- -gcodeview
- تولید اطلاعات اشکالزدایی در قالب اشکالزدایی CodeView (در صورت پشتیبانی). این قالبی است که توسط Microsoft Visual C++ در Windows استفاده میشود.
- -glevel
- -ggdblevel
- -gvmslevel
- درخواست
اطلاعات
اشکالزدایی
و همچنین
استفاده از
level برای
تعیین
میزان
اطلاعات.
سطح
پیشفرض 2
است.
سطح 0 هیچ اطلاعات اشکالزدایی تولید نمیکند. بنابراین، -g0 گزینه -g را نفی و بیاثر میکند.
سطح 1 حداقل اطلاعات را تولید میکند، به اندازهای که برای ایجاد ردگیری پشته (backtrace) در بخشهایی از برنامه که قصد اشکالزدایی آنها را ندارید کافی باشد. این اطلاعات شامل توصیف توابع و متغیرهای خارجی و جداول شماره خطوط است، اما اطلاعاتی درباره متغیرهای محلی ارائه نمیدهد.
سطح 3 شامل اطلاعات اضافی است، از جمله تمام تعاریف ماکرو موجود در برنامه. برخی اشکالزداها هنگام استفاده از -g3 از بسط ماکرو پشتیبانی میکنند.
اگر از چندین گزینه -g، همراه با یا بدون شماره سطح استفاده کنید، آخرین گزینه اعمالشده همان گزینهای است که مؤثر خواهد بود.
گزینه -gdwarf سطح اشکالزدایی متصل را نمیپذیرد تا از سردرگمی با -gdwarf-level جلوگیری شود. در عوض، از یک گزینه اضافی -glevel برای تغییر سطح اشکالزدایی برای DWARF استفاده کنید.
- -fno-eliminate-unused-debug-symbols
- به طور پیشفرض، هیچ اطلاعات اشکالزدایی برای نمادهایی که در عمل استفاده نشدهاند تولید نمیشود. اگر میخواهید اطلاعات اشکالزدایی برای تمام نمادها تولید شود از این گزینه استفاده کنید..IP -femit-class-debug-always 4 به جای تولید اطلاعات اشکالزدایی برای یک کلاس ++C تنها در یک فایل شیء (object file)، آن را در تمام فایلهای شیءِ استفادهکننده از آن کلاس تولید میکند. این گزینه باید تنها با دیباگرهایی استفاده شود که قادر به مدیریت روش معمول GCC در تولید اطلاعات اشکالزدایی برای کلاسها نیستند، چرا که استفاده از این گزینه حجم اطلاعات اشکالزدایی را تا دو برابر افزایش میدهد.
- -fno-merge-debug-strings
- به پیونددهنده (linker) دستور میدهد رشتههای یکسان در اطلاعات اشکالزدایی مربوط به فایلهای شیء مختلف را با یکدیگر ادغام نکند. ادغام توسط همهٔ اسمبلرها یا پیونددهندهها پشتیبانی نمیشود. ادغام، حجم اطلاعات اشکالزدایی را در فایل خروجی کاهش میدهد، اما به بهای افزایش زمان پردازش پیوند. ادغام به طور پیشفرض فعال است.
- -fdebug-prefix-map=old=new
- هنگام کامپایل فایلهای واقع در پوشهٔ old، اطلاعات اشکالزدایی مربوط به آنها را طوری ثبت میکند که گویی فایلها در پوشهٔ new قرار دارند. این گزینه میتواند برای جایگزین کردن یک مسیر زمان ساخت (build-time) با یک مسیر زمان نصب (install-time) در اطلاعات اشکالزدایی به کار رود. همچنین میتوان از آن برای تبدیل یک مسیر مطلق به یک مسیر نسبی با استفاده از . برای new استفاده کرد. این کار میتواند منجر به ساختهای بازتولیدپذیرتری (reproducible builds) شود که مستقل از مکان هستند، اما ممکن است برای تعیین محل فایلهای منبع به یک دستور اضافی در GDB نیاز داشته باشد. همچنین گزینههای -ffile-prefix-map و -fcanon-prefix-map را ببینید.
- -fvar-tracking
- گذر ردیابی
متغیر (variable tracking pass)
را اجرا
میکند. این
گذر مشخص
میکند که
در هر نقطه
از کد،
متغیرها در
کجا ذخیره
شدهاند.
سپس
اطلاعات
اشکالزدایی
بهتری
تولید
میشود (در
صورتی که
قالب
اطلاعات
اشکالزدایی
از این
اطلاعات
پشتیبانی
کند).
این گزینه به طور پیشفرض هنگام کامپایل با بهینهسازی (-Os، -O، -O2، ...)، اطلاعات اشکالزدایی (-g) و در صورتی که قالب اطلاعات اشکالزدایی از آن پشتیبانی کند، فعال است.
- -fvar-tracking-assignments
- انتسابها
به
متغیرهای
کاربر را در
مراحل
اولیهٔ
کامپایل
یادداشتگذاری
(annotate) میکند و
تلاش
میکند این
یادداشتها
را در سراسر
فرایند
کامپایل تا
انتها حفظ
کند، تا
اطلاعات
اشکالزدایی
در حین
بهینهسازی
بهبود یابد.
استفاده از
-gdwarf-4 همراه با
آن توصیه
میشود.
این گزینه حتی در صورت غیرفعال بودن var-tracking نیز میتواند فعال شود، که در این حالت یادداشتها ایجاد و نگهداری میشوند اما در پایان دور ریخته میشوند. به طور پیشفرض، این پرچم به همراه -fvar-tracking فعال است، مگر اینکه زمانبندی انتخابی (selective scheduling) فعال شده باشد.
- -gsplit-dwarf
- اگر اطلاعات اشکالزدایی DWARF فعال باشد، تا حد امکان اطلاعات اشکالزدایی را در یک فایل خروجی مجزا با پسوند .dwo جدا میکند. این گزینه به سیستم ساخت اجازه میدهد از پیوند دادن فایلها با اطلاعات اشکالزدایی اجتناب کند. برای مفید بودن، این گزینه نیازمند دیباگری است که توانایی خواندن فایلهای .dwo را داشته باشد.
- -gdwarf32
- -gdwarf64
- اگر اطلاعات اشکالزدایی DWARF فعال باشد، گزینهٔ -gdwarf32 قالب ۳۲ بیتی DWARF و گزینهٔ -gdwarf64 قالب ۶۴ بیتی DWARF را انتخاب میکند. پیشفرض وابسته به معماری مقصد است، با این حال در بیشتر مقصدها -gdwarf32 است. قالب ۳۲ بیتی DWARF کوچکتر است، اما نمیتواند بیش از ۲ گیبیبایت اطلاعات اشکالزدایی را در هیچیک از بخشهای اطلاعات اشکالزدایی DWARF پشتیبانی کند. قالب ۶۴ بیتی DWARF اجازهٔ اطلاعات اشکالزدایی حجیمتری را میدهد اما ممکن است هنوز توسط همهٔ مصرفکنندگان به خوبی پشتیبانی نشود.
- -gdescribe-dies
- صفتهای توصیفی را به برخی از DIEهای DWARF که فاقد صفت نام هستند، مانند متغیرهای ساختگی (artificial variables)، ارجاعات خارجی و DIEهای پارامتر نقطهٔ فراخوانی (call site parameter DIEs) اضافه میکند.
- -gpubnames
- بخشهای ".debug_pubnames" و ".debug_pubtypes" مربوط به DWARF را تولید میکند.
- -ggnu-pubnames
- بخشهای ".debug_pubnames" و ".debug_pubtypes" را در قالبی مناسب برای تبدیل به نمایهٔ GDB (GDB index) تولید میکند. این گزینه تنها با پیونددهندهای مفید است که بتواند نمایهٔ GDB نسخهٔ ۷ را تولید کند.
- -fdebug-types-section
- هنگام استفاده از DWARF نسخهٔ ۴ یا بالاتر، DIEهای نوع (type DIEs) میتوانند به جای اینکه بخشی از بخش ".debug_info" باشند، در بخش اختصاصی خود یعنی ".debug_types" قرار گیرند. قرار دادن آنها در یک بخش مجزای comdat کارآمدتر است، زیرا پیونددهنده میتواند موارد تکراری را حذف کند. با این حال، هنوز همهٔ مصرفکنندگان DWARF از بخشهای ".debug_types" پشتیبانی نمیکنند و در برخی فایلهای شیء، ".debug_types" به جای کوچکتر کردن اطلاعات اشکالزدایی، آن را بزرگتر میکند.
- -grecord-gcc-switches
- -gno-record-gcc-switches
- این سوییچ باعث میشود گزینههای خط فرمانی که برای فراخوانی کامپایلر استفاده شده و ممکن است بر تولید کد تأثیر بگذارند، به صفت DW_AT_producer در اطلاعات اشکالزدایی DWARF ضمیمه شوند. این گزینهها با فاصله از یکدیگر و از نسخهٔ کامپایلر جدا و به هم متصل میشوند. این گزینه به طور پیشفرض فعال است. همچنین برای روشی دیگر جهت ذخیرهٔ گزینههای کامپایلر در فایل شیء، -frecord-gcc-switches را ببینید.
- -gstrict-dwarf
- استفاده از افزونههای نسخههای استاندارد DWARF جدیدتر از نسخهٔ انتخابشده با -gdwarf-version را غیرمجاز میکند. در بیشتر مقصدها، استفاده از افزونههای DWARF بدون تداخل از نسخههای استاندارد بعدی مجاز است.
- -gno-strict-dwarf
- استفاده از افزونههای نسخههای استاندارد DWARF جدیدتر از نسخهٔ انتخابشده با -gdwarf-version را مجاز میکند.
- -gas-loc-support
- به
کامپایلر
اطلاع
میدهد که
اسمبلر از
رهنمودهای
".loc"
پشتیبانی
میکند. در
این صورت
کامپایلر
میتواند
از آنها
استفاده
کند تا
اسمبلر
جدولهای
شماره خط DWARF2+
را تولید
نماید.
این حالت عموماً مطلوب است، زیرا جدولهای شماره خط تولیدشده توسط اسمبلر بسیار فشردهتر از جدولهایی هستند که خود کامپایلر میتواند تولید کند.
اگر در زمان پیکربندی GCC، مشخص شود که اسمبلر از چنین رهنمودهایی پشتیبانی میکند، این گزینه به طور پیشفرض فعال خواهد شد.
- -gno-as-loc-support
- در صورتی که قرار باشد جدولهای شماره خط DWARF2+ تولید شوند، GCC را مجبور میکند این جدولها را به صورت داخلی تولید کند.
- -gas-locview-support
- به
کامپایلر
اطلاع
میدهد که
اسمبلر از
تخصیص
"view" و
بررسی
ادعای
بازنشانی (reset
assertion checking) در
رهنمودهای
".loc"
پشتیبانی
میکند.
اگر در زمان پیکربندی GCC، مشخص شود که اسمبلر از آنها پشتیبانی میکند، این گزینه به طور پیشفرض فعال خواهد شد.
- -gno-as-locview-support
- در صورتی که -gvariable-location-views به صراحت درخواست شده باشد، GCC را مجبور میکند شمارههای نما (view numbers) را به صورت داخلی تخصیص دهد.
- -gcolumn-info
- -gno-column-info
- اطلاعات ستون موقعیت را به جای فقط فایل و خط، در اطلاعات اشکالزدایی DWARF درج میکند. این گزینه به طور پیشفرض فعال است.
- -gstatement-frontiers
- -gno-statement-frontiers
- این گزینه باعث میشود که GCC در نمایش داخلی (internal representation) در ابتدای دستورها نشانگرهایی ایجاد کرده و آنها را تقریباً در سراسر فرایند کامپایل در جای خود حفظ کند، و از آنها برای هدایت خروجی نشانگرهای "is_stmt" در جدول شماره خط استفاده نماید. این گزینه به طور پیشفرض هنگام کامپایل با بهینهسازی (-Os، -O1، -O2، ...) و تولید اطلاعات اشکالزدایی DWARF 2 در سطح عادی فعال است.
- -gvariable-location-views
- -gvariable-location-views=incompat5
- -gno-variable-location-views
- فهرستهای
موقعیت
متغیرها را
با
شمارههای
نمای
پیشرونده
(progressive view numbers) که از
جدول شماره
خط استنباط
میشوند،
تکمیل
میکند. این
امر به
مصرفکنندگان
اطلاعات
اشکالزدایی
امکان
میدهد تا
وضعیت
برنامه را
در نقاط
خاصی بررسی
کنند، حتی
اگر در آن
نقطه هیچ
دستورالعمل
مرتبط با
موقعیتهای
مبدأ
متناظر
وجود
نداشته
باشد. اگر
اسمبلر از
شمارههای
نما در
جدولهای
شماره خط
پشتیبانی
نکند، این
امر باعث
میشود که
کامپایلر
جدول شماره
خط را تولید
کند که
معمولاً
فشردگی آن
را تا حدی
کاهش
میدهد.
جدولهای
شماره خط و
فهرستهای
موقعیت
تکمیلشده
کاملاً با
نسخههای
پیشین
سازگارند،
بنابراین
میتوانند
توسط
مصرفکنندگانی
از اطلاعات
اشکالزدایی
که از این
ارتقاها
آگاه
نیستند نیز
مصرف شوند،
هرچند که از
مزایای
آنها نیز
بهرهمند
نخواهند شد.
این ویژگی هنگام تولید اطلاعات اشکالزدایی DWARF 2 در سطح عادی، تا زمانی که اسمبلر از آن پشتیبانی کند، -fvar-tracking-assignments فعال باشد و -gstrict-dwarf فعال نباشد، به طور پیشفرض فعال است. هنگامی که پشتیبانی اسمبلر در دسترس نباشد، این گزینه ممکن است همچنان فعال شود، اما GCC را مجبور به تولید جدولهای شماره خط داخلی میکند و اگر -ginternal-reset-location-views فعال نباشد، مطمئناً منجر به عدم تطابق خاموش نماهای موقعیت خواهد شد.
یک نمایش پیشنهادی برای شمارههای نما وجود دارد که با ساختار فهرست موقعیت معرفیشده در DWARF 5 سازگار با گذشته نیست، که میتواند با -gvariable-location-views=incompat5 فعال شود. این گزینه ممکن است در آینده حذف شود و تنها به عنوان یک پیادهسازی مرجع از نمایش پیشنهادی ارائه شده است. انتظار نمیرود مصرفکنندگان اطلاعات اشکالزدایی از این قالب گسترشیافته پشتیبانی کنند، و در صورت استفاده از آن قادر به رمزگشایی فهرستهای موقعیت نخواهند بود.
- -ginternal-reset-location-views
- -gno-internal-reset-location-views
- تلاش میکند نماهای موقعیتی را که میتوان از فهرستهای نمای موقعیت حذف کرد، مشخص کند. این کار مستلزم آن است که کامپایلر تخمینهای بسیار دقیقی از طول دستورالعملها (insn length) داشته باشد که همیشه اینطور نیست، و ممکن است در صورت استفاده از اسمبلری که از فهرستهای نمای موقعیت پشتیبانی نمیکند، باعث تولید خاموش فهرستهای نمای نادرست شود. اسمبلر گنو (GNU assembler) هرگونه خطای اینچنینی را به عنوان یک "view number mismatch" پرچمگذاری میکند. این گزینه تنها بر روی پورتهایی فعال است که یک تابع برآورد قابلاعتماد تعریف کرده باشند..IP -ginline-points 4
- -gno-inline-points
- تولید اطلاعات اشکالزدایی گسترشیافته برای توابع درونخطیشده (inlined). نشانگرهای ردیابی نمای مکان در نقاط ورود درونخطی درج میشوند تا شمارههای آدرس و نما قابل محاسبه بوده و در اطلاعات اشکالزدایی در خروجی قرار گیرند. این قابلیت میتواند مستقل از نماهای مکان فعال شود که در این صورت، شمارههای نما در خروجی درج نمیشوند؛ اما این گزینه تنها همراه با مرزهای عبارت (statement frontiers) قابل فعالسازی است و بهطور پیشفرض تنها زمانی فعال میشود که نماهای مکان فعال باشند.
- -gz[=type]
- تولید بخشهای اشکالزدایی فشردهشده در قالب DWARF، در صورتی که پشتیبانی شود. اگر type مشخص نشود، نوع پیشفرض به تواناییهای اسمبلر و پیونددهندهٔ مورد استفاده بستگی دارد. type میتواند یکی از مقادیر none (بخشهای اشکالزدایی فشرده نشوند) یا zlib (استفاده از فشردهسازی zlib در قالب ELF gABI) باشد. اگر پیونددهنده از نوشتن بخشهای اشکالزدایی فشرده پشتیبانی نکند، این گزینه رد میشود. در غیر این صورت، اگر اسمبلر از آنها پشتیبانی نکند، هنگام تولید فایلهای شیء، -gz بدون هشدار نادیده گرفته میشود.
- -femit-struct-debug-baseonly
- تولید
اطلاعات
اشکالزدایی
برای انواع
شبیه به
ساختار (struct-like)
تنها
هنگامی که
نام پایهٔ
فایل منبع
کامپایل با
نام پایهٔ
فایلی که
ساختار در
آن تعریف
شده است
مطابقت
داشته باشد.
این گزینه اندازهٔ اطلاعات اشکالزدایی را به میزان قابل توجهی کاهش میدهد، اما با احتمال از دست رفتن چشمگیر اطلاعات نوع برای اشکالزدا (debugger). برای گزینهای با شدت کمتر، -femit-struct-debug-reduced را ببینید. برای کنترل دقیقتر، به -femit-struct-debug-detailed مراجعه کنید.
این گزینه فقط با خروجی اشکالزدایی DWARF کار میکند.
- -femit-struct-debug-reduced
- تولید
اطلاعات
اشکالزدایی
برای انواع
شبیه به
ساختار
تنها
هنگامی که
نام پایهٔ
فایل منبع
کامپایل با
نام پایهٔ
فایلی که
نوع در آن
تعریف شده
مطابقت
داشته
باشد، مگر
اینکه
ساختار یک
الگو (template)
بوده یا در
یک سرآیند
سیستمی
تعریف شده
باشد.
این گزینه حجم اطلاعات اشکالزدایی را بهطور چشمگیری کاهش میدهد، با مقداری احتمال از دست رفتن اطلاعات نوع برای اشکالزدا. برای گزینهای سختگیرانهتر، -femit-struct-debug-baseonly را ببینید. برای کنترل دقیقتر، به -femit-struct-debug-detailed مراجعه کنید.
این گزینه فقط با خروجی اشکالزدایی DWARF کار میکند.
- -femit-struct-debug-detailed[=spec-list]
- مشخص کردن
انواع شبیه
به ساختار
که
کامپایلر
برای آنها
اطلاعات
اشکالزدایی
تولید
میکند.
هدف، کاهش
اطلاعات
اشکالزدایی
تکراری
ساختارها
میان
فایلهای
شیء مختلف
در یک
برنامه است.
این گزینه نسخهٔ مفصلتری از -femit-struct-debug-reduced و -femit-struct-debug-baseonly است که بیشتر نیازها را برطرف میکنند.
ساختار دستوری مشخصهها بهصورت [dir:|ind:][ord:|gen:](any|sys|base|none) است.
کلمهٔ اختیاری اول، مشخصه را به ساختارهایی که بهطور مستقیم (dir:) یا غیرمستقیم (ind:) استفاده شدهاند محدود میکند. یک نوع ساختار هنگامی مستقیماً استفاده میشود که نوع یک متغیر یا عضو باشد. استفادههای غیرمستقیم از طریق اشارهگرها به ساختارها حاصل میشوند؛ یعنی هنگامی که استفاده از یک ساختار ناکامل (incomplete struct) معتبر باشد، استفاده غیرمستقیم است. برای مثال: struct one direct; struct two * indirect;.
کلمهٔ اختیاری دوم، مشخصه را به ساختارهای معمولی (ord:) یا ساختارهای عمومی/جنریک (gen:) محدود میکند. توضیح ساختارهای جنریک کمی پیچیده است. در ++C، اینها تخصیصهای غیرصریح از کلاسهای الگو (non-explicit specializations of template classes)، یا کلاسهای غیرالگو درون موارد فوق هستند. زبانهای برنامهنویسی دیگر دارای generics هستند، اما -femit-struct-debug-detailed هنوز آنها را پیادهسازی نکرده است.
کلمهٔ سوم، فایلهای منبع ساختارهایی را مشخص میکند که کامپایلر باید برای آنها اطلاعات اشکالزدایی تولید کند. مقادیر none و any معانی معمول خود را دارند. مقدار base بدان معناست که نام پایهٔ فایلی که اعلان نوع در آن قرار دارد باید با نام پایهٔ فایل اصلی کامپایل مطابقت داشته باشد. در عمل، این یعنی هنگام کامپایل foo.c، اطلاعات اشکالزدایی برای انواع اعلانشده در آن فایل و foo.h تولید میشود، اما برای سایر فایلهای سرآیند تولید نمیشود. مقدار sys به معنای انواعی است که شرایط base را برآورده میکنند یا در سرآیندهای سیستم یا کامپایلر اعلان شدهاند.
ممکن است برای یافتن بهترین تنظیمات برای برنامهٔ خود، نیاز به آزمایش داشته باشید.
مقدار پیشفرض -femit-struct-debug-detailed=all است.
این گزینه فقط با خروجی اشکالزدایی DWARF کار میکند.
- -fno-dwarf2-cfi-asm
- تولید اطلاعات بازکردن پشته (unwind) در DWARF بهصورت بخش ".eh_frame" تولیدشده توسط کامپایلر به جای استفاده از دستورهای ".cfi_*" در GAS.
- -fno-eliminate-unused-debug-types
- بهطور معمول هنگام تولید خروجی DWARF، کامپایلر GCC از تولید نمادهای اشکالزدایی برای انواعی که در هیچ کجای فایل منبعِ در حال کامپایل استفاده نشدهاند، صرفنظر میکند. گاهی اوقات مفید است که GCC اطلاعات اشکالزدایی را برای تمامی انواع اعلانشده در یک واحد ترجمه (compilation unit) تولید کند، بدون در نظر گرفتن اینکه واقعاً در آن واحد استفاده شدهاند یا خیر؛ برای مثال، زمانی که در اشکالزدا میخواهید مقداری را به نوعی تبدیل نوع (cast) کنید که در عمل در برنامه استفاده نشده (اما اعلان شده) است. با این حال، در بیشتر مواقع این کار منجر به هدر رفتن مقدار زیادی فضا میشود.
گزینههای کنترلکننده بهینهسازی (Options That Control Optimization)
این گزینهها انواع مختلفی از بهینهسازیها را کنترل میکنند.
بدون تعیین هیچ گزینهٔ بهینهسازی، هدف کامپایلر کاهش هزینه و زمان کامپایل و تضمین تولید نتایج مورد انتظار در حین اشکالزدایی است. عبارات از یکدیگر مستقل هستند: اگر برنامه را با یک نقطهٔ توقف (breakpoint) بین عبارات متوقف کنید، میتوانید مقداری جدید به هر متغیر اختصاص دهید یا شمارندهٔ برنامه (program counter) را به هر عبارت دیگری در تابع تغییر داده و دقیقاً نتایجی را که از کد منبع انتظار دارید دریافت کنید.
فعال کردن پرچمهای بهینهسازی باعث میشود کامپایلر برای بهبود کارایی و/یا کاهش حجم کد به قیمت افزایش زمان کامپایل و احتمالاً کاهش توانایی اشکالزدایی برنامه تلاش کند.
کامپایلر بهینهسازی را بر اساس شناختی که از برنامه دارد انجام میدهد. کامپایل همزمان چندین فایل در قالب یک فایل خروجی واحد، به کامپایلر اجازه میدهد تا هنگام کامپایل هر یک از آنها، از اطلاعات بهدستآمده از تمامی فایلها استفاده کند.
همهٔ بهینهسازیها مستقیماً با یک پرچم کنترل نمیشوند. تنها بهینهسازیهایی که دارای پرچم هستند در این بخش فهرست شدهاند.
بیشتر بهینهسازیها در سطح -O0 یا در صورتی که سطح -O در خط فرمان مشخص نشده باشد، کاملاً غیرفعال هستند؛ حتی اگر پرچمهای بهینهسازی به صورت جداگانه تعیین شده باشند. به همین ترتیب، -Og بسیاری از گذرهای (passes) بهینهسازی را غیرفعال میکند.
بسته به معماری مقصد و نحوهٔ پیکربندی GCC، ممکن است در هر سطح -O مجموعهٔ کمی متفاوتی از بهینهسازیها نسبت به موارد ذکرشده در اینجا فعال شوند. میتوانید GCC را با -Q --help=optimizers اجرا کنید تا از مجموعهٔ دقیق بهینهسازیهای فعالشده در هر سطح مطلع شوید.
- -O
- -O1
- بهینهسازی.
کامپایل
بهینهساز
به زمان
بیشتری
نیاز دارد و
برای یک
تابع بزرگ،
حافظه
بسیار
بیشتری
مصرف
میکند.
با -O، کامپایلر تلاش میکند اندازهٔ کد و زمان اجرا را کاهش دهد، بدون اینکه بهینهسازیهایی را اعمال کند که زمان کامپایل بسیار زیادی صرف میکنند.
سطح -O گزینهٔ توصیهشده برای کدهای بزرگِ تولیدشده توسط ماشین است، چرا که تعادلی منطقی بین زمان صرفشده برای کامپایل و مصرف حافظه ایجاد میکند؛ سطوح بهینهسازی بالاتر، بهینهسازیهایی با پیچیدگی الگوریتمی بیشتری نسبت به -O انجام میدهند.
گزینهٔ -O پرچمهای بهینهسازی زیر را فعال میکند:
-fauto-inc-dec -fbranch-count-reg -fcombine-stack-adjustments -fcompare-elim -fcprop-registers -fdce -fdefer-pop -fdelayed-branch -fdse -fforward-propagate -fguess-branch-probability -fif-conversion -fif-conversion2 -finline-functions-called-once -fipa-modref -fipa-profile -fipa-pure-const -fipa-reference -fipa-reference-addressable -fivopts -fmerge-constants -fmove-loop-invariants -fmove-loop-stores -fomit-frame-pointer -freorder-blocks -fshrink-wrap -fshrink-wrap-separate -fsplit-wide-types -fssa-backprop -fssa-phiopt -ftree-bit-ccp -ftree-ccp -ftree-ch -ftree-coalesce-vars -ftree-copy-prop -ftree-dce -ftree-dominator-opts -ftree-dse -ftree-forwprop -ftree-fre -ftree-phiprop -ftree-pta -ftree-scev-cprop -ftree-sink -ftree-slsr -ftree-sra -ftree-ter -funit-at-a-time.IP -O2 4 بهینهسازی حتی بیشتر. کامپایلر GCC تقریباً تمامی بهینهسازیهای پشتیبانیشدهای را که مستلزم مصالحه میان فضا و سرعت نیستند، انجام میدهد. در مقایسه با -O، این گزینه هم زمان کامپایل و هم کارایی کد تولیدشده را افزایش میدهد.
-O2 تمام پرچمهای بهینهسازی مشخصشده توسط -O1 را فعال میکند. این گزینه همچنین پرچمهای بهینهسازی زیر را فعال مینماید:
-falign-functions -falign-jumps -falign-labels -falign-loops -fcaller-saves -fcode-hoisting -fcrossjumping -fcse-follow-jumps -fcse-skip-blocks -fdelete-null-pointer-checks -fdevirtualize -fdevirtualize-speculatively -fexpensive-optimizations -ffinite-loops -fgcse -fgcse-lm -fhoist-adjacent-loads -finline-functions -finline-small-functions -findirect-inlining -fipa-bit-cp -fipa-cp -fipa-icf -fipa-ra -fipa-sra -fipa-vrp -fisolate-erroneous-paths-dereference -flra-remat -foptimize-crc -foptimize-sibling-calls -foptimize-strlen -fpartial-inlining -fpeephole2 -freorder-blocks-algorithm=stc -freorder-blocks-and-partition -freorder-functions -frerun-cse-after-loop -fschedule-insns -fschedule-insns2 -fsched-interblock -fsched-spec -fstore-merging -fstrict-aliasing -fthread-jumps -ftree-builtin-call-dce -ftree-loop-vectorize -ftree-pre -ftree-slp-vectorize -ftree-switch-conversion -ftree-tail-merge -ftree-vrp -fvect-cost-model=very-cheap
لطفاً به هشدار ذیل -fgcse درباره بهکارگیری -O2 در برنامههایی که از gotoهای محاسبهشده (computed gotos) استفاده میکنند توجه داشته باشید.
- -O3
- بهینهسازی
باز هم
بیشتر. -O3
تمام
بهینهسازیهای
مشخصشده
توسط -O2 را
فعال کرده و
همچنین
پرچمهای
بهینهسازی
زیر را روشن
میکند:
-fgcse-after-reload -fipa-cp-clone -floop-interchange -floop-unroll-and-jam -fpeel-loops -fpredictive-commoning -fsplit-loops -fsplit-paths -ftree-loop-distribution -ftree-partial-pre -funswitch-loops -fvect-cost-model=dynamic -fversion-loops-for-strides
- -O0
- کاهش زمان
کامپایل و
حصول
اطمینان از
اینکه
دیباگ کردن
نتایج مورد
انتظار را
حاصل
میکند. این
حالت
پیشفرض
است.
در سطح -O0، کامپایلر GCC اکثر مراحل بهینهسازی را کاملاً غیرفعال میکند؛ این مراحل حتی اگر صراحتاً در خط فرمان فعال شوند یا توسط -Q --help=optimizers به عنوان فعال به طور پیشفرض فهرست شده باشند نیز اجرا نخواهند شد. بسیاری از بهینهسازیهای انجامشده توسط GCC به تحلیل کد یا مراحل استانداردسازی (canonicalization) که توسط -O فعال میشوند وابستهاند و اجرای مراحل بهینهسازی به صورت منفرد و ایزوله سودمند نخواهد بود.
- -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 و پرچم مختص فرترن -fstack-arrays (مگر اینکه -fmax-stack-var-size مشخص شده باشد) و -fno-protect-parens را فعال میکند. این گزینه -fsemantic-interposition را غیرفعال میسازد.
- -Og
- بهینهسازی
تجربه
دیباگ. -Og
باید سطح
بهینهسازی
انتخابی
برای چرخه
استاندارد
ویرایش-کامپایل-دیباگ
باشد که سطح
معقولی از
بهینهسازی
را در حین
حفظ سرعت
بالای
کامپایل و
یک تجربه
دیباگ
مناسب
فراهم
میکند. این
گزینه برای
تولید کد
قابل دیباگ
انتخاب
بهتری نسبت
به -O0 است،
چرا که برخی
از مراحل
کامپایلر
که اطلاعات
دیباگ را
جمعآوری
میکنند در
-O0 غیرفعال
هستند.
همانند -O0، گزینه -Og نیز تعدادی از مراحل بهینهسازی را به طور کامل غیرفعال میکند تا گزینههای منفرد کنترلکننده آنها هیچ اثری نداشته باشند. در غیر این صورت، -Og تمام پرچمهای بهینهسازی -O1 را به جز مواردی که ممکن است با فرایند دیباگ تداخل داشته باشند، فعال میکند:
-fbranch-count-reg -fdelayed-branch -fdse -fif-conversion -fif-conversion2 -finline-functions-called-once -fmove-loop-invariants -fmove-loop-stores -fssa-phiopt -ftree-bit-ccp -ftree-dse -ftree-pta -ftree-sra
- -Oz
- بهینهسازی تهاجمی برای اندازه به جای سرعت. این ممکن است تعداد دستورالعملهای اجراشده را افزایش دهد اگر آن دستورالعملها به بایتهای کمتری برای کدگذاری نیاز داشته باشند. عملکرد -Oz مشابه -Os است، از جمله فعالسازی اکثر بهینهسازیهای -O2.
اگر از چندین گزینه -O با یا بدون شماره سطح استفاده کنید، آخرین گزینه از این دست همان گزینهای است که مؤثر خواهد بود.
گزینههایی به فرم -fflag پرچمهای مستقل از ماشین را مشخص میکنند. بیشتر پرچمها هم فرم مثبت و هم منفی دارند؛ فرم منفی -ffoo برابر با -fno-foo است. در جدول زیر، تنها یکی از فرمها فهرست شده است---همانی که معمولاً استفاده میکنید. میتوانید با حذف یا افزودن no-، فرم دیگر را بیابید.
گزینههای زیر بهینهسازیهای خاصی را کنترل میکنند. این موارد یا توسط گزینههای -O فعال میشوند یا با مواردی که فعال هستند در ارتباطاند. شما میتوانید در موارد نادری که «تنظیم دقیق» (fine-tuning) بهینهسازیهای اعمالشونده مورد نظر باشد، از پرچمهای زیر استفاده کنید.
- -fno-defer-pop
- برای ماشینهایی که باید آرگومانها را پس از فراخوانی تابع از پشته بردارند (pop کنند)، همیشه به محض بازگشت هر تابع آرگومانها را بردارید. در سطوح -O1 و بالاتر، -fdefer-pop حالت پیشفرض است؛ این به کامپایلر اجازه میدهد تا آرگومانها برای چندین فراخوانی تابع روی پشته جمع شوند و سپس همه آنها را به یکباره خارج کند.
- -fforward-propagate
- اجرای یک
مرحله
انتشار به
جلو (forward propagation) روی
RTL. این مرحله
سعی میکند
دو
دستورالعمل
را ترکیب
کرده و
بررسی کند
که آیا
نتیجه قابل
سادهسازی
است یا خیر.
اگر باز
کردن حلقه (loop
unrolling) فعال
باشد، دو
مرحله اجرا
میشود و
مرحله دوم
پس از باز
کردن حلقه
زمانبندی
میگردد.
این گزینه به طور پیشفرض در سطوح بهینهسازی -O1، -O2، -O3 و -Os فعال است.
- -favoid-store-forwarding
- -fno-avoid-store-forwarding
- بسیاری از
CPUها هنگامی
که یک
بارگذاری (load)
تا حدی به
ذخیرههای
(stores) کوچکتر
پیشین
وابسته
باشد، برای
چندین چرخه
متوقف
میشوند (stall
میکنند).
این مرحله
تلاش
میکند
چنین
مواردی را
شناسایی
کرده و با
تغییر
ترتیب
بارگذاری و
ذخیره و سپس
تصحیح
مقدار
بارگذاریشده،
از جریمه
کارایی
جلوگیری
کند.
به طور پیشفرض غیرفعال است.
- -ffp-contract=style
- -ffp-contract=off انقباض
عبارت ممیز
شناور (floating-point expression
contraction) را
غیرفعال
میکند.
-ffp-contract=fast انقباض
عبارت ممیز
شناور را
فعال
میسازد،
مانند
تشکیل
عملیات ضرب
و جمع
ادغامشده
(fused multiply-add) در
صورتی که
معماری
مقصد از
آنها
پشتیبانی
بومی داشته
باشد. -ffp-contract=on در
صورتی که
استاندارد
زبان اجازه
دهد،
انقباض
عبارت ممیز
شناور را
فعال
میکند. این
قابلیت
برای C و C++
پیادهسازی
شده است،
جایی که
انقباض را
در یک عبارت
منفرد فعال
میکند،
اما نه در
سراسر
گزارههای
مختلف.
پیشفرض برای C در حالت منطبق بر استاندارد (-std=c11 یا مشابه آن) مقدار -ffp-contract=off و در غیر این صورت -ffp-contract=fast است.
- -fomit-frame-pointer
- حذف
اشارهگر
فریم (frame pointer) در
توابعی که
به آن نیازی
ندارند. این
کار از
دستورالعملهای
ذخیره،
راهاندازی
و بازیابی
اشارهگر
فریم
جلوگیری
میکند؛ در
بسیاری از
معماریهای
مقصد، این
گزینه
همچنین یک
ثبات (register)
اضافی را در
دسترس قرار
میدهد.
در برخی معماریهای مقصد این پرچم بیاثر است زیرا توالی فراخوانی استاندارد همیشه از اشارهگر فریم استفاده میکند، بنابراین نمیتوان آن را حذف کرد.
توجه داشته باشید که -fno-omit-frame-pointer تضمین نمیکند اشارهگر فریم در همه توابع استفاده شود. چندین معماری مقصد همیشه اشارهگر فریم را در توابع برگ (leaf functions) حذف میکنند.
به طور پیشفرض در -O1 و بالاتر فعال است.
- -foptimize-crc
- تشخیص
حلقههای
محاسبهکننده
CRC (که تقسیم
طولانی
چندجملهای
انجام
میدهند) و
جایگزینی
آنها با یک
پیادهسازی
سریعتر.
تشخیص CRCهای
۸، ۱۶، ۳۲ و
۶۴ بیتی، با
چندجملهای
ثابت بدون
بیت پیشرو
۱، برای هر
دو حالت بیت
رو به جلو و
بیت معکوس.
اگر معماری
مقصد از
دستورالعمل
CRC پشتیبانی
کند و
چندجملهای
استفادهشده
در کد منبع
با
چندجملهای
بهکاررفته
در
دستورالعمل
CRC همخوانی
داشته
باشد، آن
دستورالعمل
CRC تولید
میشود. در
غیر این
صورت، اگر
معماری
مقصد از
دستورالعمل
ضرب بدون
رقم نقلی
(carry-less-multiplication)
پشتیبانی
کند، CRC با
استفاده از
آن تولید
میشود؛ در
غیر این
صورت CRC
مبتنی بر
جدول تولید
خواهد شد.
به طور پیشفرض در -O2 و بالاتر فعال است..IP -foptimize-sibling-calls 4 بهینهسازی فراخوانیهای همسطح (sibling) و بازگشتی انتهایی (tail recursive).
در سطوح -O2، -O3 و -Os فعال میشود.
- -foptimize-strlen
- بهینهسازی
انواع
توابع
استاندارد
رشته در C
(مانند
"strlen"،
"strchr" یا
"strcpy") و
معادلهای
"_FORTIFY_SOURCE"
آنها با
تبدیل به
جایگزینهای
سریعتر.
در سطوح -O2 و -O3 فعال میشود.
- -finline-stringops[=fn]
- بسط
درونخطی (inline)
عملیات
حافظه و
رشته (در
حال حاضر،
تنها
"memset")،
حتی در
زمانی که
طول متغیر
باشد یا
آنقدر
بزرگ باشد
که به ایجاد
حلقه نیاز
داشته باشد.
این گزینه
در کنار -ffreestanding
و -fno-builtin
بیشترین
کاربرد را
دارد.
در برخی شرایط، این گزینه کامپایلر را قادر میسازد تا کدی تولید کند که از ترازشدگی (alignment) مشخص و مضارب طول بهره میبرد، اما حتی در این حالت نیز ممکن است کارایی کمتری نسبت به پیادهسازیهای بهینهشدهٔ زمان اجرا داشته باشد، و اندازهٔ کد را چنان افزایش دهد که حتی یک پیادهسازی اشتراکی با کارایی کمتر، بهدلیل استفادهٔ بهتر از حافظههای نهانِ کد (code caches)، سریعتر اجرا شود. این گزینه بهطور پیشفرض غیرفعال است.
- -fno-inline
- هیچ تابعی
را بهصورت
درونخطی
بسط
نمیدهد،
مگر توابعی
که با
مشخصهٔ
"always_inline"
نشانهگذاری
شده باشند.
این رفتار،
پیشفرض در
زمان عدم
بهینهسازی
است.
میتوان توابع منفرد را با نشانهگذاری آنها با مشخصهٔ "noinline" از درونخطیسازی معاف کرد.
- -finline-small-functions
- ادغام
توابع در
فراخوانندههای
آنها
زمانی که
بدنهٔ
آنها از کد
مورد
انتظار
برای
فراخوانی
تابع
کوچکتر
باشد
(بهطوری که
اندازهٔ
کلی برنامه
کوچکتر
شود).
کامپایلر
بهصورت
اکتشافی
تصمیم
میگیرد
کدام توابع
به اندازهٔ
کافی ساده
هستند که
ارزش ادغام
به این روش
را داشته
باشند. این
درونخطیسازی
برای همهٔ
توابع
اعمال
میشود،
حتی توابعی
که
بهعنوان inline
اعلان
نشدهاند.
در سطوح -O2، -O3 و -Os فعال میشود.
- -findirect-inlining
- درونخطیسازی
فراخوانیهای
غیرمستقیمی
که به لطف
درونخطیسازیهای
پیشین،
مشخص شده که
در زمان
کامپایل
معلوم
هستند. این
گزینه تنها
زمانی
اثرگذار
است که خودِ
درونخطیسازی
توسط
گزینههای
-finline-functions یا -finline-small-functions
فعال شده
باشد.
در سطوح -O2، -O3 و -Os فعال میشود.
- -finline-functions
- در نظر
گرفتن تمام
توابع برای
درونخطیسازی،
حتی اگر
بهصورت inline
اعلان نشده
باشند.
کامپایلر
بهصورت
اکتشافی
تصمیم
میگیرد
کدام توابع
ارزش ادغام
به این شیوه
را دارند.
اگر تمام فراخوانیها به یک تابع مشخص ادغام شوند، و تابع بهصورت "static" اعلان شده باشد، معمولاً خودِ تابع دیگر بهصورت مستقل در کد اسمبلی در خروجی درج نمیشود.
در سطوح -O2، -O3 و -Os فعال میشود. همچنین توسط -fprofile-use و -fauto-profile نیز فعال میگردد.
- -finline-functions-called-once
- در نظر
گرفتن تمام
توابع
"static" که
تنها
یکبار
فراخوانی
شدهاند
برای
درونخطیسازی
در
فراخوانندهشان،
حتی اگر با
"inline"
مشخص نشده
باشند. اگر
فراخوانی
به تابع
مربوطه
ادغام شود،
آنگاه تابع
بهصورت کد
اسمبلی
مستقل در
خروجی درج
نمیشود.
در سطوح -O1، -O2، -O3 و -Os فعال میشود، اما در -Og فعال نیست.
- -fearly-inlining
- درونخطیسازی
زودهنگام
توابع
نشانهگذاریشده
با "always_inline"
و توابعی که
بدنهٔ
آنها
کوچکتر از
سربار
فراخوانی
تابع به نظر
میرسد،
پیش از
انجام
ابزارگذاری
-fprofile-generate و گذر
واقعی
درونخطیسازی.
این کار
پروفایلگیری
را
بهمیزان
چشمگیری
کمهزینهتر
کرده و
معمولاً
درونخطیسازی
را در
برنامههایی
با
زنجیرههای
بزرگی از
توابع
پوششی
تودرتو
سریعتر
میسازد.
بهطور پیشفرض فعال است.
- -fipa-sra
- انجام
جایگزینی
اسکالر
تجمیعها
بهصورت
بینرویهای
(interprocedural scalar replacement of aggregates)،
حذف
پارامترهای
بدون
استفاده و
جایگزینی
پارامترهای
ارجاعی (by reference)
با
پارامترهای
مقداری (by value).
در سطوح -O2، -O3 و -Os فعال میشود.
- -finline-limit=n
- بهطور
پیشفرض، GCC
اندازهٔ
توابعی را
که
میتوانند
درونخطی
شوند محدود
میکند. این
پرچم امکان
کنترل کلی
این حد را
فراهم
میسازد. n
اندازهٔ
توابعی است
که
میتوانند
بر حسب
تعداد
دستورالعملهای
شبه (pseudo instructions)
درونخطی
شوند.
درونخطیسازی در عمل توسط تعدادی از پارامترها کنترل میشود که میتوان آنها را بهصورت تکی با استفاده از --param name=value مشخص کرد. گزینهٔ -finline-limit=n برخی از این پارامترها را به شرح زیر تنظیم میکند:
- max-inline-insns-single
- روی n/2 تنظیم میشود.
- max-inline-insns-auto
- روی n/2 تنظیم میشود.
برای مستندات مربوط به پارامترهای منفرد کنترلکنندهٔ درونخطیسازی و مقادیر پیشفرض این پارامترها، به ادامه مراجعه کنید.
نکته: ممکن است هیچ مقداری برای -finline-limit وجود نداشته باشد که منجر به رفتار پیشفرض شود.
نکته: دستورالعمل شبه در این بافتار مشخص، نمایانگر یک معیار انتزاعی از اندازهٔ تابع است. این معیار بههیچوجه نشاندهندهٔ تعداد دستورالعملهای اسمبلی نیست و از این رو ممکن است معنای دقیق آن از نسخهای به نسخهٔ دیگر تغییر کند.
- -fno-keep-inline-dllexport
- این گزینه نسخهای دقیقتر از -fkeep-inline-functions است، که تنها برای توابعی که با استفاده از مشخصهٔ "dllexport" یا declspec اعلان شدهاند اعمال میشود.
- -fkeep-inline-functions
- در C، توابع "static" را که بهصورت "inline" اعلان شدهاند، حتی اگر تابع در تمام فراخوانندههای خود درونخطی شده باشد، در فایل شیء (object file) درج میکند. این گزینه بر توابعی که از افزونهٔ "extern inline" در GNU C90 استفاده میکنند تأثیری ندارد. در C++، همه و تکتک توابع درونخطی را در فایل شیء درج میکند.
- -fkeep-static-functions
- درج توابع "static" در فایل شیء، حتی اگر تابع هرگز استفاده نشده باشد.
- -fkeep-static-consts
- درج
متغیرهای
اعلانشده
بهصورت
"static const" در
فایل شیء در
زمانی که
بهینهسازی
فعال نیست،
حتی اگر به
متغیرها
ارجاع داده
نشده باشد.
کامپایلر GCC این گزینه را بهطور پیشفرض فعال میکند. اگر میخواهید کامپایلر را، بدون توجه به روشن یا خاموش بودن بهینهسازی، وادار کنید بررسی کند که آیا به یک متغیر ارجاع داده شده است یا خیر، از گزینهٔ -fno-keep-static-consts استفاده کنید.
- -fmerge-constants
- تلاش برای
ادغام
ثوابت
یکسان
(ثوابت
رشتهای و
ثوابت ممیز
شناور) در
میان
واحدهای
کامپایل (compilation
units).
این گزینه در صورت پشتیبانی اسمبلر و پیونددهنده (linker)، در کامپایل بهینهشده پیشفرض است. برای جلوگیری از این رفتار از -fno-merge-constants استفاده کنید.
در سطوح -O1، -O2، -O3 و -Os فعال میشود.
- -fmerge-all-constants
- تلاش برای
ادغام
ثوابت
یکسان و
متغیرهای
یکسان.
این گزینه متضمن -fmerge-constants است. علاوه بر -fmerge-constants، این گزینه مواردی چون آرایههای مقداردهیشده با ثوابت یا متغیرهای ثابت مقداردهیشده با انواع عددی صحیح یا ممیز شناور را نیز در نظر میگیرد. زبانهایی مانند C یا C++ الزام میکنند که هر متغیر، از جمله نمونههای متعددی از یک متغیر یکسان در فراخوانیهای بازگشتی، آدرسهای متمایزی در حافظه داشته باشند؛ بنابراین استفاده از این گزینه منجر به رفتاری ناسازگار با استاندارد (non-conforming) میشود.
- -fmodulo-sched
- انجام زمانبندی پیمانهای چرخشی (swing modulo scheduling) بلافاصله پیش از اولین گذر زمانبندی. این گذر، درونیترین حلقهها را بررسی کرده و با همپوشانی تکرارهای مختلف، دستورالعملهای آنها را بازآرایی میکند.
- -fmodulo-sched-allow-regmoves
- انجام زمانبندی پیمانهای تهاجمیترِ مبتنی بر SMS با مجاز دانستن جابهجایی ثباتها (register moves). با تنظیم این پرچم، برخی یالهای پادوابستگی (anti-dependences) حذف میشوند که این امر آغازگر تولید reg-moveها بر پایهٔ تحلیل طولعمر (life-range analysis) خواهد بود. این گزینه تنها با فعال بودن -fmodulo-sched مؤثر است.
- -fno-branch-count-reg
- غیرفعالسازی
گذر
بهینهسازی
که به دنبال
فرصتهایی
برای
استفاده از
دستورالعملهای
«کاهش و
انشعاب» (decrement and
branch) روی یک
ثبات شمارش
بهجای
توالی
دستورالعملهایی
که یک ثبات
را کاهش
داده، با
صفر مقایسه
کرده و سپس
بر اساس
نتیجه
انشعاب
میدهند
میگردد.
این گزینه
تنها روی
معماریهایی
معنادار
است که از
چنین
دستورالعملهایی
پشتیبانی
میکنند،
از جمله x86،
PowerPC، IA-64 و S/390. توجه
داشته
باشید که
گزینهٔ
-fno-branch-count-reg
دستورالعملهای
کاهش و
انشعابِ
حاصل از
گذرهای
بهینهسازی
دیگر را از
جریان
دستورالعملهای
تولیدشده
حذف
نمیکند.
پیشفرض در سطوح -O1 و بالاتر، بهجز -Og، برابر -fbranch-count-reg است.
- -fno-function-cse
- آدرسهای
توابع را در
ثباتها
قرار
نمیدهد؛
کاری
میکند که
هر
دستورالعمل
که یک تابع
ثابت را
فراخوانی
میکند،
صراحتاً
شامل آدرس
تابع باشد.
این گزینه منجر به کدی با کارایی کمتر میشود، اما برخی ترفندهای نامتعارف که خروجی اسمبلر را دستکاری میکنند ممکن است با بهینهسازیهایی که در زمان عدم استفاده از این گزینه انجام میشود دچار اختلال شوند.
پیشفرض -ffunction-cse است.
- -fno-zero-initialized-in-bss
- اگر معماری
مقصد از بخش
BSS پشتیبانی
کند، GCC
بهطور
پیشفرض
متغیرهایی
را که با
صفر
مقداردهی
اولیه
شدهاند
درون BSS قرار
میدهد. این
کار
میتواند
موجب
صرفهجویی
در فضای کد
نهایی شود.
این گزینه این رفتار را خاموش میکند، زیرا برخی برنامهها صراحتاً به قرار گرفتن متغیرها در بخش داده (data section) وابسته هستند --- برای مثال برای اینکه فایل اجرایی حاصل بتواند ابتدای آن بخش را پیدا کرده و/یا فرضیاتی را بر پایهٔ آن در نظر بگیرد.
پیشفرض -fzero-initialized-in-bss است، بهجز در Ada..IP -fthread-jumps 4 بهینهسازیهایی را انجام میدهد که بررسی میکنند آیا یک پرش به مکانی شاخهبندی میشود که در آن مقایسه دیگری تحت پوشش مقایسه اول یافت شود یا خیر. در این صورت، بسته به اینکه مشخص شود شرط درست است یا نادرست، شاخه اول یا به مقصد شاخه دوم یا به نقطهای بلافاصله پس از آن هدایت میشود.
در سطوح -O1، -O2، -O3 و -Os فعال میشود.
- -fsplit-wide-types
- هنگام
استفاده از
نوع
دادهای که
چندین ثبات
را اشغال
میکند،
مانند
"long long"
در یک سیستم
۳۲-بیتی،
ثباتها را
تفکیک کرده
و آنها را
بهطور
مستقل
تخصیص
میدهد. این
کار
معمولاً کد
بهتری برای
این نوع
دادهها
تولید
میکند،
اما ممکن
است
عیبیابی
را دشوارتر
سازد.
در سطوح -O1، -O2، -O3 و -Os فعال میشود.
- -fsplit-wide-types-early
- انواع
دادههای
عریض را در
مراحل
اولیه
بهطور
کامل تفکیک
میکند، به
جای آنکه
بسیار دیر
انجام شود.
این گزینه
هیچ اثری
ندارد مگر
اینکه -fsplit-wide-types
فعال باشد.
این گزینه در برخی معماریهای مقصد، پیشفرض است.
- -fcse-follow-jumps
- در حذف
زیرعبارتهای
مشترک (CSE)،
دستورالعملهای
پرش را
زمانی که
هیچ مسیر
دیگری به
مقصد پرش
نمیرسد
پویش
میکند.
برای
نمونه،
هنگامی که CSE
با یک عبارت
"if"
دارای بند
"else"
مواجه
میشود، در
صورتی که
شرط مورد
آزمایش
نادرست
باشد، CSE پرش
را دنبال
میکند.
در سطوح -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 فعال
باشد، حذف
سراسری
زیرعبارتهای
مشترک تلاش
میکند
بارگذاریهایی
را که تنها
توسط
ذخیرهسازیها
در خودشان
باطل
میشوند،
جابهجا
کند. این
کار امکان
میدهد
حلقهای
شامل توالی
بارگذاری/ذخیرهسازی
به یک
بارگذاری
خارج از
حلقه و یک
رونوشت/ذخیرهسازی
درون حلقه
تبدیل شود.
هنگامی که -fgcse فعال باشد، بهطور پیشفرض فعال است.
- -fgcse-sm
- هنگامی که
-fgcse-sm فعال
باشد، یک
گذر انتقال
ذخیرهسازی
(store motion) پس از حذف
سراسری
زیرعبارتهای
مشترک اجرا
میشود. این
گذر تلاش
میکند
ذخیرهسازیها
را از
حلقهها به
بیرون
منتقل کند.
هنگامی که
همراه با -fgcse-lm
استفاده
شود،
حلقههای
شامل توالی
بارگذاری/ذخیرهسازی
میتوانند
به یک
بارگذاری
قبل از حلقه
و یک
ذخیرهسازی
بعد از حلقه
تغییر
یابند.
در هیچ سطح بهینهسازی فعال نمیشود.
- -fgcse-las
- هنگامی که
-fgcse-las فعال
باشد، گذر
حذف سراسری
زیرعبارتهای
مشترک،
بارگذاریهای
زایدی را که
پس از
ذخیرهسازی
در همان
مکان حافظه
رخ میدهند
(چه زواید
جزئی و چه
کلی) حذف
میکند.
در هیچ سطح بهینهسازی فعال نمیشود.
- -fgcse-after-reload
- هنگامی که
-fgcse-after-reload فعال
باشد، یک
گذر حذف
بارگذاریهای
زاید پس از reload
اجرا
میشود. هدف
این گذر
پاکسازی
سرریزهای
ثبات (spilling)
زاید است.
توسط -O3، -fprofile-use و -fauto-profile فعال میشود.
- -faggressive-loop-optimizations
- این گزینه به بهینهساز حلقه اعلام میکند که از محدودیتهای زبان برای استخراج کرانهای تعداد تکرارهای یک حلقه استفاده کند. این فرآیند فرض میکند که کد حلقه رفتار تعریفنشده (undefined behavior) ایجاد نمیکند، برای مثال باعث سرریز عدد صحیح علامتدار یا دسترسی به آرایه خارج از محدوده نمیشود. کرانهای تعداد تکرار یک حلقه برای هدایت باز کردن حلقه (loop unrolling)، پوستهکنی حلقه (loop peeling) و بهینهسازیهای آزمون خروج از حلقه استفاده میشوند. این گزینه بهطور پیشفرض فعال است.
- -funconstrained-commons
- این گزینه به کامپایلر اعلام میکند که متغیرهای تعریفشده در بلوکهای مشترک (مانند زبان Fortran) ممکن است بعداً با آرایههای دنبالهدار طولانیتر جایگزین شوند. این امر از بهینهسازیهای خاصی که وابسته به دانستن کرانهای آرایه هستند جلوگیری میکند.
- -fcrossjumping
- تبدیل پرش
متقاطع (cross-jumping)
را انجام
میدهد. این
تبدیل
کدهای
معادل را
یکی کرده و
حجم کد را
کاهش
میدهد. کد
حاصل ممکن
است عملکرد
بهتری نسبت
به حالت
بدون پرش
متقاطع
داشته باشد
یا نداشته
باشد.
در سطوح -O2، -O3 و -Os فعال میشود.
- -fauto-inc-dec
- افزایش یا کاهش آدرسها را با دسترسیهای حافظه ترکیب میکند. این گذر در معماریهایی که دستورالعملهایی برای پشتیبانی از این ویژگی ندارند همواره نادیده گرفته میشود. در معماریهایی که از این ویژگی پشتیبانی میکنند، بهطور پیشفرض در -O1 و بالاتر فعال است.
- -fdce
- حذف کدهای مرده (DCE) را روی RTL انجام میدهد. بهطور پیشفرض در -O1 و بالاتر فعال است.
- -fdse
- حذف ذخیرهسازیهای مرده (DSE) را روی RTL انجام میدهد. بهطور پیشفرض در -O1 و بالاتر فعال است.
- -fif-conversion
- تلاش
میکند
پرشهای
شرطی را به
معادلهای
بدون
انشعاب (branch-less)
تبدیل کند.
این شامل
استفاده از
انتقالهای
شرطی (conditional moves)،
دستورالعملهای
min ،max، تنظیم
پرچمها و
abs، و
ترفندهایی
است که با
محاسبات
حسابی
استاندارد
قابل انجام
هستند.
استفاده از
اجرای شرطی
روی
تراشههایی
که این
قابلیت را
دارند توسط
-fif-conversion2 کنترل
میشود.
در سطوح -O1، -O2، -O3 و -Os فعال میشود، اما نه همراه با -Og.
- -fif-conversion2
- از اجرای
شرطی (در
صورت در
دسترس بودن)
برای تبدیل
پرشهای
شرطی به
معادلهای
بدون
انشعاب
استفاده
میکند.
در سطوح -O1، -O2، -O3 و -Os فعال میشود، اما نه همراه با -Og.
- -fdeclone-ctor-dtor
- استاندارد
C++ ABI به چندین
نقطه ورود
برای
سازندهها
و
ویرانکنندهها
نیاز دارد:
یکی برای یک
زیرشیء
پایه، یکی
برای یک شیء
کامل، و یکی
برای
ویرانکننده
مجازی که پس
از آن operator delete را
فراخوانی
میکند.
برای
سلسلهمراتبی
با
پایههای
مجازی،
حالتهای
پایه و کامل
همزاد (clone)
یکدیگر
هستند، که
به معنای دو
رونوشت از
تابع است.
با این
گزینه،
حالتهای
پایه و کامل
به thunkهایی
تبدیل
میشوند که
یک
پیادهسازی
مشترک را
فراخوانی
میکنند.
توسط -Os فعال میشود.
- -fdelete-null-pointer-checks
- فرض میکند
که
برنامهها
نمیتوانند
بهطور
ایمن
اشارهگرهای
تهی (null pointers) را
مرجعزدایی
(dereference) کنند و
هیچ عنصر کد
یا دادهای
در آدرس صفر
مستقر نیست.
این گزینه
بهینهسازیهای
ساده ادغام
ثوابت (constant folding)
را در تمام
سطوح
بهینهسازی
فعال
میکند.
علاوه بر
این، سایر
گذرهای
بهینهسازی
در GCC از این
پرچم برای
کنترل
تحلیلهای
سراسری
جریان داده
که
بررسیهای
بیهوده
برای
اشارهگرهای
تهی را حذف
میکنند
استفاده
مینمایند؛
این
تحلیلها
فرض
میکنند که
دسترسی به
حافظه در
آدرس صفر
همواره
منجر به تله
(trap) میشود،
در نتیجه
اگر
اشارهگری
پس از
مرجعزدایی
بررسی شود،
نمیتواند
تهی باشد.
با این حال توجه داشته باشید که در برخی محیطها این فرض درست نیست. برای برنامههایی که به آن رفتار وابسته هستند، از -fno-delete-null-pointer-checks برای غیرفعال کردن این بهینهسازی استفاده کنید.
این گزینه بهطور پیشفرض در بیشتر معماریهای مقصد فعال است. در AVR و MSP430، این گزینه کاملاً غیرفعال است.
گذرهایی که از اطلاعات جریان داده استفاده میکنند، بهطور مستقل در سطوح مختلف بهینهسازی فعال میشوند.
- -fdevirtualize
- تلاش میکند فراخوانیهای توابع مجازی را به فراخوانیهای مستقیم تبدیل کند. این کار هم در درون یک رویه و هم بهصورت بینرویهای به عنوان بخشی از درونخطیسازی غیرمستقیم (-findirect-inlining) و انتشار سراسری ثوابت بینرویهای (-fipa-cp) انجام میشود. در سطوح -O2، -O3 و -Os فعال میشود.
- -fdevirtualize-speculatively
- تلاش میکند فراخوانیهای توابع مجازی را به فراخوانیهای مستقیم گمانهزنانه (speculative) تبدیل کند. بر اساس تحلیل گراف وراثت نوع، برای یک فراخوانی مشخص مجموعهای از مقصدهای محتمل را تعیین میکند. اگر این مجموعه کوچک باشد، ترجیحاً به اندازه ۱، فراخوانی را به یک شرط تبدیل میکند که بین فراخوانیهای مستقیم و غیرمستقیم تصمیمگیری میکند. فراخوانیهای گمانهزنانه بهینهسازیهای بیشتری مانند درونخطیسازی (inlining) را ممکن میسازند. هنگامی که پس از بهینهسازیهای بیشتر بیهوده به نظر برسند، دوباره به شکل اولیه خود بازگردانده میشوند.
- -fdevirtualize-at-ltrans
- هنگام اجرای بهینهساز زمان پیوند در حالت تبدیل محلی، اطلاعات اضافی مورد نیاز برای غیرمجازیسازی (devirtualization) تهاجمی را به جریان داده (stream) میفرستد. این گزینه غیرمجازیسازی بیشتری را ممکن میسازد اما اندازه دادههای ارسالی را بهطور چشمگیری افزایش میدهد. به همین دلیل بهطور پیشفرض غیرفعال است.
- -fexpensive-optimizations
- تعدادی
بهینهسازی
جزئی را که
نسبتاً
پرهزینه
هستند
انجام
میدهد.
در سطوح -O2، -O3 و -Os فعال میشود..IP -free 4 تلاش برای حذف دستورالعملهای گسترش (extension) زائد. این قابلیت بهویژه برای معماری x86-64 مفید است، که بهطور ضمنی پس از نوشتن در نیمه پایینی ۳۲-بیتی ثباتهای ۶۴-بیتی، گسترش با صفر را انجام میدهد.
برای معماریهای Alpha، AArch64، LoongArch، PowerPC، RISC-V، SPARC، h83000 و x86 در سطوح -O2، -O3 و -Os فعال است.
- -fno-lifetime-dse
- در ++C مقدار یک شیء تنها تحت تأثیر تغییراتی است که در طول دوره حیات (lifetime) آن رخ میدهد: هنگامی که سازنده (constructor) آغاز میشود، شیء مقداری نامعین دارد، و هرگونه تغییری در طول دوره حیات شیء، با نابودی آن بیاثر (dead) تلقی میشود. بهطور معمول حذف ذخیرهسازیهای مرده (dead store elimination) از این امر بهره میبرد؛ اگر کد شما متکی بر پایداری مقدار ذخیرهسازی شیء فراتر از طول عمر شیء است، میتوانید از این پرچم برای غیرفعال کردن این بهینهسازی استفاده کنید. برای حفظ ذخیرهسازیها پیش از شروع سازنده (برای مثال اگر operator new شما حافظه شیء را پاکسازی میکند) در حالی که همچنان با شیء پس از مخرب (destructor) به عنوان مرده رفتار شود، میتوانید از -flifetime-dse=1 استفاده کنید. رفتار پیشفرض را میتوان بهطور صریح با -flifetime-dse=2 انتخاب کرد. -flifetime-dse=0 معادل با -fno-lifetime-dse است.
- -flive-range-shrinkage
- تلاش برای کاهش فشار ثباتها (register pressure) از طریق کوچکسازی دامنه حیات ثباتها (register live range shrinkage). این گزینه برای پردازندههای سریعی با مجموعه ثباتهای کوچک یا متوسط مفید است.
- -fira-algorithm=algorithm
- استفاده از الگوریتم رنگآمیزی مشخصشده برای تخصیصدهنده یکپارچه ثبات (IRA). آرگومان algorithm میتواند priority باشد که رنگآمیزی اولویت Chow را مشخص میکند، یا CB که رنگآمیزی Chaitin-Briggs را مشخص میکند. رنگآمیزی Chaitin-Briggs برای همه معماریها پیادهسازی نشده است، اما برای مقصدهایی که از آن پشتیبانی میکنند پیشفرض است، زیرا کد بهتری تولید میکند.
- -fira-region=region
- استفاده از نواحی مشخصشده برای تخصیصدهنده یکپارچه ثبات. آرگومان region باید یکی از موارد زیر باشد:
- all
- استفاده از همه حلقهها بهعنوان نواحی تخصیص ثبات. این مقدار میتواند بهترین نتایج را برای ماشینهایی با مجموعههای ثبات کوچک و/یا نامنظم فراهم کند.
- mixed
- استفاده از همه حلقهها بهجز حلقههایی با فشار ثبات کم بهعنوان ناحیه. این مقدار معمولاً در بیشتر موارد و برای اکثر معماریها بهترین نتایج را ارائه میدهد، و هنگام کامپایل با بهینهسازی برای سرعت (-O، -O2، ...) بهطور پیشفرض فعال است.
- one
- استفاده از همه توابع بهعنوان یک ناحیه واحد. این مقدار معمولاً منجر به کوچکترین اندازه کد میشود و بهطور پیشفرض برای -Os یا -O0 فعال است.
- -fira-hoist-pressure
- استفاده از
IRA برای
ارزیابی
فشار ثبات
در مرحله
بالا کشیدن
کد (code hoisting pass) جهت
تصمیمگیری
برای بالا
کشیدن
عبارات. این
گزینه
معمولاً به
کد
کوچکتری
منجر
میشود،
اما
میتواند
سرعت
کامپایلر
را کاهش
دهد.
این گزینه در سطح -Os برای تمام مقصدها فعال است.
- -fira-loop-pressure
- استفاده از
IRA برای
ارزیابی
فشار ثبات
در حلقهها
جهت
تصمیمگیری
در خصوص
انتقال
عبارات
تغییرناپذیر
حلقه (loop invariants).
این گزینه
معمولاً
منجر به
تولید کد
سریعتر و
کوچکتر در
ماشینهایی
با
فایلهای
ثبات بزرگ (>=
۳۲ ثبات)
میشود،
اما
میتواند
سرعت
کامپایلر
را کاهش
دهد.
این گزینه در سطح -O3 برای برخی مقصدها فعال است.
- -fno-ira-share-save-slots
- غیرفعال کردن اشتراکگذاری شکافهای پشته (stack slots) که برای ذخیره ثباتهای سختافزاریِ دستخوش فراخوانی (call-used) که در حین فراخوانی زنده میمانند به کار میروند. هر ثبات سختافزاری یک شکاف پشته جداگانه دریافت میکند و در نتیجه فریمهای پشته تابع بزرگتر میشوند.
- -fno-ira-share-spill-slots
- غیرفعال کردن اشتراکگذاری شکافهای پشته تخصیصیافته برای شبهثباتها. هر شبهثباتی که ثبات سختافزاری دریافت نکند، یک شکاف پشته جداگانه دریافت میکند و در نتیجه فریمهای پشته تابع بزرگتر میشوند.
- -flra-remat
- فعال کردن
بازتولید
(rematerialization) حساس به
گراف کنترل
جریان (CFG) در LRA.
بهجای
بارگذاری
مقادیر
شبهثباتهای
سرریز شده
(spilled)، در
صورتی که
مقرونبهصرفه
باشد 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)
استفاده
میکند. این
امر اجازه
انتقال از
مرزهای
بلوک پایه
را میدهد و
منجر به
زمانبندیهای
سریعتر
میشود. این
گزینه
آزمایشی
است، زیرا
همه
توصیفهای
ماشینی
مورد
استفاده در
GCC پردازنده
را به
اندازه
کافی دقیق
مدلسازی
نمیکنند
تا نتایج
الگوریتم
کاملاً
قابل
اطمینان
باشد.
این گزینه تنها هنگام زمانبندی پس از تخصیص ثبات کاربرد دارد، یعنی همراه با -fschedule-insns2 یا در -O2 یا بالاتر.
- -fsched-group-heuristic
- فعال کردن روش مکاشفهای گروهی در زمانبند. این مکاشفه، دستورالعملی را که به یک گروه زمانبندی تعلق دارد ترجیح میدهد. این گزینه بهطور پیشفرض زمانی که زمانبندی فعال باشد، یعنی با -fschedule-insns یا -fschedule-insns2 یا در -O2 یا بالاتر، فعال است.
- -fsched-critical-path-heuristic
- فعال کردن روش مکاشفهای مسیر بحرانی در زمانبند. این مکاشفه، دستورالعملهای واقع در مسیر بحرانی را ترجیح میدهد. این گزینه بهطور پیشفرض هنگامی که زمانبندی فعال باشد، یعنی با -fschedule-insns یا -fschedule-insns2 یا در -O2 یا بالاتر، فعال است.
- -fsched-spec-insn-heuristic
- فعال کردن روش مکاشفهای دستورالعملهای گمانهزنانه در زمانبند. این مکاشفه، دستورالعملهای گمانهزنانه با ضعف وابستگی بیشتر را ترجیح میدهد. این گزینه بهطور پیشفرض هنگامی که زمانبندی فعال باشد، یعنی با -fschedule-insns یا -fschedule-insns2 یا در -O2 یا بالاتر، فعال است..IP -fsched-rank-heuristic 4 فعالسازی روش مکاشفهای رتبه (rank heuristic) در زمانبند. این روش مکاشفهای دستورالعملی را ترجیح میدهد که متعلق به بلوک پایهای با اندازه یا بسامد بزرگتر باشد. این گزینه بهطور پیشفرض در صورت فعال بودن زمانبندی، یعنی با -fschedule-insns یا -fschedule-insns2 یا در -O2 یا بالاتر فعال است.
- -fsched-last-insn-heuristic
- فعالسازی روش مکاشفهای آخرین دستورالعمل (last-instruction heuristic) در زمانبند. این روش مکاشفهای دستورالعملی را ترجیح میدهد که وابستگی کمتری به آخرین دستورالعمل زمانبندیشده داشته باشد. این گزینه بهطور پیشفرض در صورت فعال بودن زمانبندی، یعنی با -fschedule-insns یا -fschedule-insns2 یا در -O2 یا بالاتر فعال است.
- -fsched-dep-count-heuristic
- فعالسازی روش مکاشفهای شمارش وابستگی (dependent-count heuristic) در زمانبند. این روش مکاشفهای دستورالعملی را ترجیح میدهد که دستورالعملهای بیشتری به آن وابسته باشند. این گزینه بهطور پیشفرض در صورت فعال بودن زمانبندی، یعنی با -fschedule-insns یا -fschedule-insns2 یا در -O2 یا بالاتر فعال است.
- -freschedule-modulo-scheduled-loops
- زمانبندی پیمانهای (Modulo scheduling) پیش از زمانبندی سنتی انجام میشود. اگر حلقهای بهصورت پیمانهای زمانبندی شود، گذرهای زمانبندی بعدی ممکن است زمانبندی آن را تغییر دهند. از این گزینه برای کنترل این رفتار استفاده کنید.
- -fselective-scheduling
- زمانبندی دستورالعملها با استفاده از الگوریتم زمانبندی گزینشی (selective scheduling). زمانبندی گزینشی به جای نخستین گذر زمانبند اجرا میشود.
- -fselective-scheduling2
- زمانبندی دستورالعملها با استفاده از الگوریتم زمانبندی گزینشی. زمانبندی گزینشی به جای دومین گذر زمانبند اجرا میشود.
- -fsel-sched-pipelining
- فعالسازی خطلولهسازی نرمافزاری (software pipelining) در درونیترین حلقهها هنگام زمانبندی گزینشی. این گزینه هیچ اثری ندارد مگر اینکه یکی از گزینههای -fselective-scheduling یا -fselective-scheduling2 فعال باشد.
- -fsel-sched-pipelining-outer-loops
- هنگام خطلولهسازی حلقهها در طول زمانبندی گزینشی، حلقههای بیرونی نیز خطلولهسازی میشوند. این گزینه هیچ اثری ندارد مگر اینکه -fsel-sched-pipelining فعال باشد.
- -fsemantic-interposition
- برخی از قالبهای شیء، مانند ELF، اجازه حائلشدن (interposition) نمادها توسط پیونددهنده پویا را میدهند. این بدان معناست که برای نمادهای صادرشده از DSO، کامپایلر با پیشبینی اینکه ممکن است تابع یا متغیر مربوطه تغییر کند، نمیتواند انتشار بینرویهای، درونخطیسازی و سایر بهینهسازیها را انجام دهد. اگرچه این ویژگی برای نمونه جهت بازنویسی توابع تخصیص حافظه توسط یک پیادهسازی اشکالزدایی مفید است، اما از نظر کیفیت کد پرهزینه تمام میشود. با -fno-semantic-interposition کامپایلر فرض میکند در صورت وقوع حائلشدن برای توابع، تابع جایگزینشده دقیقاً همان معناشناسی (و اثرات جانبی) را خواهد داشت. به همین ترتیب، اگر حائلشدن برای متغیرها رخ دهد، سازنده متغیر یکسان خواهد بود. این پرچم روی توابعی که صراحتاً inline اعلان شدهاند (که در آنها هرگز اجازه داده نمیشود حائلشدن معناشناسی را تغییر دهد) و نمادهایی که صراحتاً weak اعلان شدهاند، اثری ندارد.
- -fshrink-wrap
- تولید پیشدرآمد توابع (function prologues) تنها پیش از بخشهایی از تابع که به آن نیاز دارند، به جای ابتدای تابع. این پرچم بهطور پیشفرض در -O و بالاتر فعال است.
- -fshrink-wrap-separate
- جمعوجورسازی (Shrink-wrap) بخشهای مختلف پیشدرآمد و پسدرآمد بهصورت جداگانه، بهگونهای که آن بخشها تنها در صورت نیاز اجرا شوند. این گزینه بهطور پیشفرض فعال است، اما هیچ اثری ندارد مگر اینکه -fshrink-wrap نیز فعال باشد و معماری مقصد از آن پشتیبانی کند.
- -fcaller-saves
- فعالسازی
تخصیص
مقادیر به
ثباتهایی
که با
فراخوانی
توابع
بازنویسی و
تخریب
میشوند،
با تولید
دستورالعملهای
اضافی جهت
ذخیره و
بازیابی
ثباتها در
اطراف این
فراخوانیها.
چنین
تخصیصی
تنها زمانی
انجام
میشود که
به نظر برسد
به تولید کد
بهتری
میانجامد.
این گزینه در برخی ماشینها، معمولاً ماشینهایی که ثباتهای حفظشده در فراخوانی (call-preserved) برای استفاده جایگزین ندارند، همیشه بهطور پیشفرض فعال است.
در سطوح -O2، -O3 و -Os فعال است.
- -fcombine-stack-adjustments
- تنظیمات
پشته (pushها و
popها) و
ارجاعات
حافظه پشته
را ردیابی
کرده و سپس
برای ترکیب
آنها تلاش
میکند.
بهطور پیشفرض در -O1 و بالاتر فعال است.
- -fipa-ra
- استفاده از
ثباتهای
caller-save برای
تخصیص، در
صورتی که
این
ثباتها
توسط
هیچیک از
توابع
فراخوانیشده
استفاده
نشوند. در
این حالت
نیازی به
ذخیره و
بازیابی
آنها در
اطراف
فراخوانیها
نیست. این
کار تنها
زمانی ممکن
است که
توابع
فراخوانیشده
بخشی از
همان واحد
ترجمه تابع
جاری باشند
و پیش از آن
کامپایل
شده باشند.
در سطوح -O2، -O3 و -Os فعال است؛ اما اگر کد تولیدشده برای پروفایلسازی ابزارگذاری شود (-p یا -pg)، یا اگر نحوه استفاده تابع فراخوانیشده از ثباتها دقیقاً مشخص نباشد (این اتفاق در مقصدهایی رخ میدهد که پیشدرآمدها و پسدرآمدها را در RTL مشخص نمیکنند)، این گزینه غیرفعال میشود.
- -fconserve-stack
- تلاش برای کمینهسازی استفاده از پشته. کامپایلر تلاش میکند فضای پشته کمتری مصرف کند، حتی اگر این کار باعث کندتر شدن برنامه شود. این گزینه به معنای تنظیم پارامتر large-stack-frame روی 100 و پارامتر large-stack-frame-growth روی 400 است.
- -ftree-reassoc
- انجام بازانجمنی (reassociation) روی درختها. این پرچم بهطور پیشفرض در -O1 و بالاتر فعال است.
- -fcode-hoisting
- انجام بالاکشیدن کد (code hoisting). بالاکشیدن کد تلاش میکند ارزیابی عبارتهایی را که در تمام مسیرهای منتهی به خروج تابع اجرا میشوند، تا حد امکان به مراحل اولیه منتقل کند. این قابلیت بهویژه به عنوان بهینهسازی اندازه کد مفید است، اما اغلب به سرعت کد نیز کمک میکند. این پرچم بهطور پیشفرض در -O2 و بالاتر فعال است.
- -ftree-pre
- انجام حذف افزونگی جزئی (PRE) روی درختها. این پرچم بهطور پیشفرض در -O2 و -O3 فعال است.
- -ftree-partial-pre
- تهاجمیتر کردن حذف افزونگی جزئی (PRE). این پرچم بهطور پیشفرض در -O3 فعال است.
- -ftree-forwprop
- انجام انتشار رو به جلو (forward propagation) روی درختها. این پرچم بهطور پیشفرض در -O1 و بالاتر فعال است.
- -ftree-fre
- انجام حذف افزونگی کامل (FRE) روی درختها. تفاوت بین FRE و PRE در این است که FRE تنها عبارتهایی را در نظر میگیرد که در تمام مسیرهای منتهی به محاسبات افزوده محاسبه شده باشند. این تحلیل سریعتر از PRE است، اگرچه افزونگیهای کمتری را شناسایی میکند. این پرچم بهطور پیشفرض در -O1 و بالاتر فعال است.
- -ftree-phiprop
- انجام بالاکشیدن بارگذاریها از اشارهگرهای شرطی روی درختها. این گذر بهطور پیشفرض در -O1 و بالاتر فعال است.
- -fhoist-adjacent-loads
- بالاکشیدن گمانهزنانه بارگذاریها از هر دو شاخه یک if-then-else در صورتی که بارگذاریها از مکانهای مجاور در یک ساختار یکسان باشند و معماری مقصد دستور انتقال شرطی (conditional move) داشته باشد. این پرچم بهطور پیشفرض در -O2 و بالاتر فعال است.
- -ftree-copy-prop
- انجام انتشار کپی (copy propagation) روی درختها. این گذر عملیات کپی غیرضروری را حذف میکند. این پرچم بهطور پیشفرض در -O1 و بالاتر فعال است.
- -fipa-pure-const
- کشف توابعی که محض (pure) یا ثابت (constant) هستند. بهطور پیشفرض در -O1 و بالاتر فعال است.
- -fipa-reference
- کشف متغیرهای ایستا که از واحد ترجمه فراتر نمیروند. بهطور پیشفرض در -O1 و بالاتر فعال است.
- -fipa-reference-addressable
- کشف متغیرهای ایستای فقطخواندنی، فقطنوشتنی و غیرقابلآدرسدهی. بهطور پیشفرض در -O1 و بالاتر فعال است.
- -fipa-reorder-for-locality
- گروهبندی زنجیرههای فراخوانی نزدیک به یکدیگر در چیدمان باینری جهت بهبود محلی بودن کد و کمینهسازی فواصل پرش بین توابعی که مکرراً فراخوانی میشوند. برخلاف -freorder-functions، این گذر زنجیرههای فراخوانی بین توابع را در نظر میگیرد و آنها را با هم گروهبندی میکند، به جای اینکه تمام توابع داغ/عادی/سرد/هرگز اجرا نشده را در بخشهای جداگانه دستهبندی کند. برخلاف -fprofile-reorder-functions، هدف آن بهبود محلی بودن کد در طول زمان اجرای برنامه است، نه تمرکز بر زمان راهاندازی برنامه. این گزینه با گزینه صریح -flto-partition= ناسازگار است زیرا یک طرح افرازبندی سفارشی را اعمال میکند. در صورت استفاده از این گزینه، توصیه میشود از بازخورد پروفایل نیز استفاده شود، اما در غیر این صورت این گزینه بهطور پیشفرض فعال نیست.
- -fipa-stack-alignment
- کاهش همترازی پشته در محلهای فراخوانی در صورت امکان. بهطور پیشفرض فعال است.
- -fipa-pta
- انجام تحلیل بینرویهای اشارهگرها و تحلیل بینرویهای تغییر و ارجاع. این گزینه میتواند در واحدهای ترجمه بزرگ باعث مصرف بیش از حد حافظه و زمان کامپایل شود. این گزینه در هیچ سطح بهینهسازی بهطور پیشفرض فعال نیست.
- -fipa-profile
- انجام انتشار بینرویهای پروفایل. توابعی که تنها از توابع سرد فراخوانی میشوند به عنوان سرد نشانهگذاری میشوند. همچنین توابعی که تنها یکبار اجرا میشوند (مانند "cold"، "noreturn"، سازندهها یا نابودکنندههای ایستا) شناسایی میشوند. سپس توابع سرد و بخشهای بدون حلقه از توابعی که یکبار اجرا میشوند، برای اندازه بهینهسازی میشوند. بهطور پیشفرض در -O1 و بالاتر فعال است.
- -fipa-modref
- انجام تحلیل بینرویهای mod/ref. این بهینهسازی اثرات جانبی توابع (مکانهای حافظهای که تغییر یافته یا به آنها ارجاع داده شده است) را تحلیل کرده و بهینهسازی بهتری را در مرز فراخوانی توابع ممکن میسازد. این پرچم بهطور پیشفرض در -O1 و بالاتر فعال است..IP -fipa-cp 4 انتشار مقادیر ثابت بینروالی (interprocedural constant propagation) را انجام میدهد. این بهینهسازی برنامه را تحلیل میکند تا مشخص شود چه زمانی مقادیر ارسالشده به توابع ثابت هستند و سپس بر اساس آن بهینهسازی را اعمال میکند. این بهینهسازی چنانچه مقادیر ثابتی به توابع ارسال شده باشند، میتواند کارایی را به طور چشمگیری افزایش دهد. این پرچم به طور پیشفرض در -O2، -Os و -O3 فعال است. همچنین توسط -fprofile-use و -fauto-profile نیز فعال میشود.
- -fipa-cp-clone
- برای تقویت انتشار مقادیر ثابت بینروالی، همانندسازی تابع (function cloning) را انجام میدهد. در صورت فعال بودن، انتشار مقادیر ثابت بینروالی هنگامی که یک تابع قابلمشاهده از بیرون بتواند با آرگومانهای ثابت فراخوانی شود، همانندسازی تابع را انجام میدهد. از آنجا که این بهینهسازی میتواند چندین نسخه از توابع ایجاد کند، ممکن است اندازه کد را به میزان قابلتوجهی افزایش دهد (ببینید: --param ipa-cp-unit-growth=value). این پرچم به طور پیشفرض در -O3 فعال است. همچنین توسط -fprofile-use و -fauto-profile نیز فعال میشود.
- -fipa-bit-cp
- در صورت فعال بودن، انتشار بیتی مقادیر ثابت بینروالی را انجام میدهد. این پرچم به طور پیشفرض در -O2 و توسط -fprofile-use و -fauto-profile فعال است. این گزینه نیازمند فعال بودن -fipa-cp است.
- -fipa-vrp
- در صورت فعال بودن، انتشار بینروالی بازههای مقادیر (value ranges) را انجام میدهد. این پرچم به طور پیشفرض در -O2 فعال است. این گزینه نیازمند فعال بودن -fipa-cp است.
- -fipa-icf
- تا کردن
کدهای
همسان (Identical Code Folding)
را برای
توابع و
متغیرهای
فقطخواندنی
انجام
میدهد. این
بهینهسازی
اندازه کد
را کاهش
داده و ممکن
است با
جایگزین
کردن یک
تابع با
تابع معادل
دیگری با
نام
متفاوت،
پشتههای
بازگشایی (unwind
stacks) را دچار
اختلال کند.
این
بهینهسازی
در صورت
فعال بودن
بهینهسازی
زمان
پیوند،
مؤثرتر عمل
میکند.
اگرچه رفتار آن مشابه بهینهسازی ICF در پیونددهنده Gold است، اما ICF در GCC در سطوح متفاوتی کار میکند و بنابراین این بهینهسازیها یکسان نیستند - معادلهایی وجود دارند که تنها توسط GCC شناسایی میشوند و معادلهایی که تنها توسط Gold یافت میشوند.
این پرچم به طور پیشفرض در -O2 و -Os فعال است.
- -flate-combine-instructions
- دو مرحله
ترکیب
دستورالعملها
را که
نسبتاً در
اواخر
فرایند
کامپایل
اجرا
میشوند،
فعال
میکند. یکی
از این
مراحل قبل
از تخصیص
ثباتها و
دیگری بعد
از تخصیص
ثباتها
اجرا
میشود. هدف
اصلی این
مراحل،
جایگزینی
تعاریف در
تمام موارد
استفاده
است.
بیشتر هدفها (targets) این پرچم را به طور پیشفرض در -O2 و -Os فعال میکنند.
- -flive-patching=level
- بهینهسازیهای
GCC را برای
تولید
خروجی
مناسب
وصلهگذاری
زنده (live-patching)
کنترل
میکند.
اگر بهینهسازی کامپایلر از بدنه یک تابع یا اطلاعات استخراجشده از بدنه آن برای بهینهسازی/تغییر تابع دیگری استفاده کند، به تابع دوم «تابع متأثر» تابع اول گفته میشود. اگر تابعی وصله شود، توابع متأثر از آن نیز باید وصله شوند.
توابع متأثر توسط بهینهسازیهای بینروالی کامپایلر مشخص میشوند. برای مثال، هنگام درونخطیسازی (inlining) یک تابع در فراخوانندهاش، همانندسازی یک تابع و تغییر فراخواننده آن برای فراخوانی این نسخه همانندسازیشده جدید، یا استخراج اطلاعات خلوص/ثابت بودن (pureness/constness) یک تابع برای بهینهسازی فراخوانندههای مستقیم یا غیرمستقیم آن و غیره، فراخواننده متأثر میشود.
معمولاً هر چه بهینهسازیهای IPA بیشتری فعال باشند، تعداد توابع متأثر برای هر تابع بیشتر خواهد بود. به منظور کنترل تعداد توابع متأثر و محاسبه آسانتر فهرست توابع متأثر، بهینهسازیهای IPA میتوانند به صورت جزئی در دو سطح مختلف فعال شوند.
آرگومان level باید یکی از موارد زیر باشد:
- inline-clone
- تنها
بهینهسازیهای
درونخطیسازی
و
همانندسازی
را فعال
میکند که
شامل
درونخطیسازی،
همانندسازی،
جایگزینی
اسکالر
بینروالی
تجمیعها و
درونخطیسازی
جزئی است.
در نتیجه،
هنگام
وصلهگذاری
یک تابع،
تمام
فراخوانندههای
آن و
فراخوانندههای
نسخههای
همانندسازیشده
آن متأثر
میشوند،
بنابراین
آنها نیز
باید وصله
شوند.
گزینه -flive-patching=inline-clone پرچمهای بهینهسازی زیر را غیرفعال میکند: -fwhole-program -fipa-pta -fipa-reference -fipa-ra -fipa-icf -fipa-icf-functions -fipa-icf-variables -fipa-bit-cp -fipa-vrp -fipa-pure-const -fipa-reference-addressable -fipa-stack-alignment -fipa-modref
- inline-only-static
- تنها
درونخطیسازی
توابع
ایستا (static) را
فعال
میکند. در
نتیجه،
هنگام
وصلهگذاری
یک تابع
ایستا،
تمام
فراخوانندههای
آن متأثر
شده و
بنابراین
باید وصله
شوند.
علاوه بر تمامی پرچمهایی که توسط -flive-patching=inline-clone غیرفعال میشوند، -flive-patching=inline-only-static پرچمهای بهینهسازی زیر را نیز غیرفعال میکند: -fipa-cp-clone -fipa-sra -fpartial-inlining -fipa-cp
هنگامی که -flive-patching بدون مقدار مشخص شود، مقدار پیشفرض آن inline-clone است.
این پرچم به طور پیشفرض غیرفعال است.
توجه داشته باشید که -flive-patching همراه با بهینهسازی زمان پیوند (-flto) پشتیبانی نمیشود.
- -fisolate-erroneous-paths-dereference
- مسیرهایی را شناسایی میکند که به دلیل ارجاعزدایی از اشارهگر تهی (null pointer)، باعث ایجاد رفتار ناصحیح یا تعریفنشده میشوند. این مسیرها را از جریان کنترل اصلی جدا کرده و دستور دارای رفتار ناصحیح یا تعریفنشده را به یک تله (trap) تبدیل میکند. این پرچم به طور پیشفرض در -O2 و بالاتر فعال است و وابسته به فعال بودن -fdelete-null-pointer-checks نیز میباشد.
- -fisolate-erroneous-paths-attribute
- مسیرهایی را شناسایی میکند که به دلیل استفاده از یک مقدار تهی به شیوهای که توسط مشخصه "returns_nonnull" یا "nonnull" ممنوع شده است، باعث ایجاد رفتار ناصحیح یا تعریفنشده میشوند. این مسیرها را از جریان کنترل اصلی جدا کرده و دستور دارای رفتار ناصحیح یا تعریفنشده را به یک تله (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 و بالاتر روی هدفهایی که دارای دستورالعملهای انتقال شرطی (conditional move) هستند فعال است.
- -ftree-dce
- حذف کدهای مرده (DCE) را روی درختها انجام میدهد. این پرچم به طور پیشفرض در -O1 و بالاتر فعال است.
- -ftree-builtin-call-dce
- حذف شرطی کدهای مرده (DCE) را برای فراخوانی توابع توکار (built-in) انجام میدهد که ممکن است "errno" را مقداردهی کنند ولی در غیر این صورت فاقد اثر جانبی هستند. این پرچم در صورت عدم تعیین -Os، به طور پیشفرض در -O2 و بالاتر فعال است.
- -ffinite-loops
- فرض میکند
حلقهای که
نقطه خروج
دارد، در
نهایت از آن
خارج شده و
تا ابد
ادامه
نخواهد
یافت. این
به
کامپایلر
اجازه
میدهد
حلقههایی
را که در
غیر این
صورت فاقد
اثر جانبی
هستند حذف
کند، بدون
آنکه
تکرار
بیپایان
احتمالی را
اثر جانبی
تلقی نماید.
این گزینه به طور پیشفرض در -O2 برای ++C با -std=c++11 یا بالاتر فعال است.
- -ftree-dominator-opts
- مجموعهای از پاکسازیهای ساده اسکالر (انتشار مقادیر ثابت/رونوشت، حذف افزونگی، انتشار بازه و سادهسازی عبارات) را بر پایه پیمایش درخت غالب (dominator tree) انجام میدهد. این گزینه همچنین ریسهبندی پرشها (jump threading برای کاهش پرشها به پرشهای دیگر) را انجام میدهد. این پرچم به طور پیشفرض در -O1 و بالاتر فعال است.
- -ftree-dse
- حذف ذخیرهسازیهای مرده (DSE) را روی درختها انجام میدهد. ذخیرهسازی مرده به ذخیرهای در یک مکان حافظه گفته میشود که بعداً توسط ذخیرهسازی دیگری بدون هیچگونه بارگذاری مداخلهگر، رونویسی میشود. در این حالت، ذخیرهسازی اولیه میتواند حذف شود. این پرچم به طور پیشفرض در -O1 و بالاتر فعال است.
- -ftree-ch
- رونوشتبرداری از سرایند حلقه (loop header copying) را روی درختها انجام میدهد. این امر سودمند است چرا که کارایی بهینهسازیهای جابهجایی کد را افزایش میدهد. همچنین باعث صرفهجویی در یک پرش میشود. این پرچم به طور پیشفرض در -O1 و بالاتر فعال است. این گزینه برای -Os فعال نیست، زیرا معمولاً اندازه کد را افزایش میدهد..IP -ftree-loop-optimize 4 بهینهسازیهای حلقه را روی درختها انجام میدهد. این پرچم بهطور پیشفرض در -O1 و بالاتر فعال است.
- -ftree-loop-linear
- -floop-strip-mine
- -floop-block
- بهینهسازیهای حلقههای تودرتو را انجام میدهد. همانند -floop-nest-optimize است. برای استفاده از این تبدیل کد، GCC باید با --with-isl پیکربندی شده باشد تا زیرساخت تبدیل حلقهٔ Graphite فعال گردد.
- -fgraphite-identity
- تبدیل همانی را برای graphite فعال میکند. برای هر SCoP نمایش چندوجهی (polyhedral representation) را تولید کرده و آن را دوباره به gimple تبدیل مینماید. با استفاده از -fgraphite-identity میتوان هزینهها یا مزایای تبدیل GIMPLE -> GRAPHITE -> GIMPLE را بررسی کرد. همچنین برخی بهینهسازیهای جزئی توسط تولیدکنندهٔ کد isl انجام میشود، مانند تفکیک نمایه و حذف کدهای مرده در حلقهها.
- -floop-nest-optimize
- بهینهساز حلقههای تودرتو مبتنی بر isl را فعال میکند. این یک بهینهساز عمومی حلقههای تودرتو بر پایهٔ الگوریتمهای بهینهسازی Pluto است. این گزینه ساختار حلقهای را محاسبه میکند که برای محلی بودن دادهها (data-locality) و موازیسازی بهینهسازی شده است. این گزینه آزمایشی است.
- -floop-parallelize-all
- از تحلیل وابستگی دادهٔ Graphite برای شناسایی حلقههایی که قابلیت موازیسازی دارند استفاده میکند. تمام حلقههایی را که پس از تحلیل مشخص شود فاقد وابستگیهای وابسته به دور حلقه (loop carried dependences) هستند موازی میکند، بدون آنکه سودمند بودن موازیسازی حلقهها را بررسی نماید.
- -ftree-coalesce-vars
- هنگام خارج کردن برنامه از نمایش SSA، با ادغام نسخههای متغیرهای گوناگونِ تعریفشده توسط کاربر بهجای متغیرهای موقت کامپایلر، برای کاهش کپیبرداری تلاش میکند. این کار ممکن است توانایی اشکالزدایی برنامهای بهینهشده را که با -fno-var-tracking-assignments کامپایل شده است بهشدت محدود کند. در فرم منفی، این پرچم از ادغام متغیرهای کاربر در SSA جلوگیری میکند. این گزینه بهطور پیشفرض در صورت فعال بودن بهینهسازی فعال است، و در غیر این صورت کار چندانی انجام نمیدهد.
- -ftree-loop-if-convert
- برای تبدیل پرشهای شرطی در درونیترین حلقهها به معادلهای بدون انشعاب تلاش میکند. هدف حذف جریان کنترل از درونیترین حلقهها است تا توانایی مرحلهٔ برداریسازی (vectorization pass) در مدیریت این حلقهها بهبود یابد. در صورت فعال بودن برداریسازی، این گزینه بهطور پیشفرض فعال است.
- -ftree-loop-distribution
- توزیع حلقه
را انجام
میدهد. این
پرچم
میتواند
کارایی
حافظهٔ
نهان (cache) را در
بدنهٔ
حلقههای
بزرگ بهبود
بخشیده و
امکان
اعمال
بهینهسازیهای
بیشتر روی
حلقهها
مانند
موازیسازی
یا
برداریسازی
را فراهم
سازد. برای
نمونه،
حلقهٔ
DO I = 1, N A(I) = B(I) + C D(I) = E(I) * F ENDDO
تبدیل میشود به
DO I = 1, N A(I) = B(I) + C ENDDO DO I = 1, N D(I) = E(I) * F ENDDO
این پرچم بهطور پیشفرض در -O3 فعال است. همچنین توسط -fprofile-use و -fauto-profile نیز فعال میشود.
- -ftree-loop-distribute-patterns
- توزیع حلقه
را برای
الگوهایی
انجام
میدهد که
میتوان کد
آنها را با
فراخوانیهایی
به یک
کتابخانه
تولید کرد.
این پرچم
بهطور
پیشفرض در
-O2 و
بالاتر، و
همچنین با
-fprofile-use و -fauto-profile
فعال است.
این مرحله حلقههای مقداردهی اولیه را توزیع کرده و فراخوانی برای memset به صفر تولید میکند. برای نمونه، حلقهٔ
DO I = 1, N A(I) = 0 B(I) = A(I) + I ENDDO
تبدیل میشود به
DO I = 1, N A(I) = 0 ENDDO DO I = 1, N B(I) = A(I) + I ENDDO
و حلقهٔ مقداردهی اولیه به فراخوانی به memset صفر تبدیل میشود.
- -floop-interchange
- جابهجایی
حلقه را
بیرون از graphite
انجام
میدهد. این
پرچم
میتواند
کارایی
حافظهٔ
نهان را روی
حلقههای
تودرتو
بهبود
بخشیده و
امکان
اعمال
بهینهسازیهای
بیشتر روی
حلقهها،
مانند
برداریسازی
را فراهم
کند. برای
نمونه،
حلقهٔ
for (int i = 0; i < N; i++) for (int j = 0; j < N; j++) for (int k = 0; k < N; k++) c[i][j] = c[i][j] + a[i][k]*b[k][j];تبدیل میشود به
for (int i = 0; i < N; i++) for (int k = 0; k < N; k++) for (int j = 0; j < N; j++) c[i][j] = c[i][j] + a[i][k]*b[k][j];این پرچم بهطور پیشفرض در -O3 فعال است. همچنین توسط -fprofile-use و -fauto-profile نیز فعال میشود.
- -floop-unroll-and-jam
- تبدیلهای باز کردن و ادغام (unroll and jam) را روی حلقههای مناسب اعمال میکند. در یک حلقهٔ تودرتو، این کار حلقهٔ بیرونی را با ضریبی مشخص باز کرده و چندین حلقهٔ درونیِ حاصل را ادغام میکند. این پرچم بهطور پیشفرض در -O3 فعال است. همچنین با -fprofile-use و -fauto-profile نیز فعال میشود.
- -ftree-loop-im
- انتقال ناورداهای حلقه (loop invariant motion) را روی درختها انجام میدهد. این مرحله تنها ناورداهایی را منتقل میکند که رسیدگی به آنها در سطح RTL دشوار است (فراخوانیهای تابع، عملیاتی که به دنبالههای غیربدیهی از دستورالعملها بسط مییابند). همراه با -funswitch-loops عملوندهای شرایطی را که ناوردا هستند نیز به بیرون از حلقه انتقال میدهد، تا بتوان در انشعابزدایی از حلقه فقط از تحلیل سادهٔ ناوردایی استفاده کرد. این مرحله همچنین شامل انتقال ذخیرهسازی (store motion) است.
- -ftree-loop-ivcanon
- یک شمارندهٔ متعارف برای تعداد تکرارها در حلقههایی که تعیین تعداد تکرارهای آنها نیازمند تحلیل پیچیده است، ایجاد میکند. بهینهسازیهای بعدی میتوانند این تعداد را بهسادگی تعیین نمایند. بهویژه در ارتباط با باز کردن حلقه مفید است.
- -ftree-scev-cprop
- جایگزینی مقدار نهایی را انجام میدهد. اگر متغیری در حلقه بهگونهای تغییر کند که مقدار آن هنگام خروج از حلقه تنها با استفاده از مقدار اولیهاش و تعداد تکرارهای حلقه قابل تعیین باشد، در صورتی که هزینهٔ آن بهاندازهٔ کافی کم باشد، کاربردهای مقدار نهایی را با چنین محاسباتی جایگزین میکند. این کار وابستگیهای داده را کاهش میدهد و ممکن است امکان سادهسازیهای بیشتری را فراهم آورد. بهطور پیشفرض در -O1 و بالاتر فعال است.
- -fivopts
- بهینهسازیهای متغیر القایی (کاهش توان محاسباتی، ادغام متغیر القایی و حذف متغیر القایی) را روی درختها انجام میدهد. بهطور پیشفرض در -O1 و بالاتر فعال است.
- -ftree-parallelize-loops=n
- حلقهها را موازیسازی میکند، یعنی فضای تکرار آنها را برای اجرا در n ریسه تقسیم مینماید. این کار تنها برای حلقههایی امکانپذیر است که تکرارهای آنها مستقل از یکدیگر بوده و بتوان ترتیب آنها را بهدلخواه تغییر داد. این بهینهسازی تنها روی ماشینهای چندپردازندهای و برای حلقههایی که پردازندهمحور (CPU-intensive) هستند سودمند است، نه حلقههایی که برای مثال توسط پهنای باند حافظه محدود شدهاند. این گزینه متضمن -pthread است و بنابراین تنها روی مقصدهایی پشتیبانی میشود که از -pthread پشتیبانی میکنند.
- -ftree-pta
- تحلیل اشارهگریِ محلی به تابع (points-to analysis) را روی درختها انجام میدهد. این پرچم بهطور پیشفرض در -O1 و بالاتر فعال است، بهجز در -Og.
- -ftree-sra
- جایگزینی اسکالر نوعهای مرکب (scalar replacement of aggregates) را انجام میدهد. این مرحله ارجاعات به ساختارها را با مقادیر اسکالر جایگزین میکند تا از ثبت زودهنگام ساختارها در حافظه جلوگیری کند. این پرچم بهطور پیشفرض در -O1 و بالاتر، بهجز در -Og فعال است.
- -fstore-merging
- ادغام ذخیرهسازیهای باریک در آدرسهای حافظهٔ متوالی را انجام میدهد. این مرحله، ذخیرهسازیهای پیوسته از مقادیر فوری (immediate values) را که باریکتر از یک کلمه (word) هستند در قالب ذخیرهسازیهای عریضتر و کمتعدادتر ادغام میکند تا تعداد دستورالعملها کاهش یابد. این گزینه بهطور پیشفرض در -O2 و بالاتر و همچنین در -Os فعال است.
- -ftree-ter
- جایگزینی عبارت موقت را در طول فاز SSA->normal انجام میدهد. متغیرهای موقت تکاستفاده/تکتعریف در محل استفادهشان با عبارت تعریفکنندهشان جایگزین میشوند. این کار به کدی غیر-GIMPLE میانجامد، اما به بسطدهندهها درختهای بسیار پیچیدهتری برای کار میدهد که منجر به تولید RTL بهتری میشود. این گزینه بهطور پیشفرض در -O1 و بالاتر فعال است.
- -ftree-slsr
- کاهش توان محاسباتی خط مستقیم (straight-line strength reduction) را روی درختها انجام میدهد. این گزینه عبارتهای مرتبطِ شامل ضرب را شناسایی کرده و در صورت امکان آنها را با محاسباتی کمهزینهتر جایگزین میکند. این گزینه بهطور پیشفرض در -O1 و بالاتر فعال است..IP -ftree-vectorize 4 بردارسازی را روی درختها انجام میدهد. این پرچم در صورتی که بهطور صریح مشخص نشده باشد، -ftree-loop-vectorize و -ftree-slp-vectorize را فعال میکند.
- -ftree-loop-vectorize
- بردارسازی حلقهها را روی درختها انجام میدهد. این پرچم بهطور پیشفرض در -O2 و توسط -ftree-vectorize، -fprofile-use و -fauto-profile فعال میشود.
- -ftree-slp-vectorize
- بردارسازی بلوکهای پایه را روی درختها انجام میدهد. این پرچم بهطور پیشفرض در -O2 و توسط -ftree-vectorize، -fprofile-use و -fauto-profile فعال میشود.
- -ftrivial-auto-var-init=choice
- متغیرهای
خودکار را
با یک الگو
یا با صفرها
مقداردهی
اولیه
میکند تا
امنیت و
پیشبینیپذیری
برنامه را
با جلوگیری
از افشا و
استفاده از
حافظهٔ
مقداردهینشده
افزایش دهد.
کامپایلر GCC
همچنان
متغیر
خودکاری را
که فاقد
مقداردهاولیهٔ
صریح باشد،
مقداردهینشده
در نظر
میگیرد؛
گزینههای
-Wuninitialized و
-Wanalyzer-use-of-uninitialized-value
همچنان
پیامهای
هشدار را
دربارهٔ
چنین
متغیرهای
خودکاری
گزارش
میکنند و
کامپایلر
بهینهسازی
را طوری
انجام
میدهد که
گویی متغیر
مقداردهینشده
است. با این
گزینه، GCC
همچنین
هرگونه
فاصلهٔ
پرکننده (padding)
متغیرهای
خودکاری را
که دارای
نوع ساختار
یا اجتماع
هستند با
صفر
مقداردهی
اولیه
میکند. با
این حال،
پیادهسازی
فعلی
نمیتواند
متغیرهای
خودکاری را
که بین
عبارت
کنترلی و
نخستین case در
یک دستور
"switch"
اعلان
شدهاند،
مقداردهی
اولیه کند.
برای گزارش
همهٔ این
موارد از
-Wtrivial-auto-var-init
استفاده
کنید.
سه مقدار ممکن برای choice عبارتند از:
- uninitialized هیچ متغیر خودکاری را مقداردهی اولیه نمیکند. این حالت پیشفرض C و ++C است.
- pattern متغیرهای خودکار را با مقادیری مقداردهی اولیه میکند که به احتمال زیاد اشکالات منطقی را در ادامهٔ مسیر به فروپاشی (crash) تبدیل میکنند، در گزارشهای فروپاشی (crash dump) بهآسانی قابل تشخیص هستند و مقادیری نیستند که برنامهنویسان بتوانند برای معناشناسی مفید برنامه به آنها تکیه کنند. مقدار فعلی، یک الگوی تکرارشوندهٔ بایتی با بایت "0xFE" است. مقادیر مورد استفاده برای مقداردهی اولیه با الگو ممکن است در آینده تغییر کنند.
- zero متغیرهای خودکار را با صفرها مقداردهی اولیه میکند.
پیشفرض uninitialized است.
توجه داشته باشید که مقادیر مقداردهی اولیه، چه zero و چه pattern، به نمایش دادهها (در حافظه یا ثباتهای ماشین) اشاره دارند تا تفسیر آنها بهعنوان مقادیر عددی. این تمایز ممکن است در زبانهایی که از انواع با بایاس یا ضریبهای ضمنی پشتیبانی میکنند و با افزونههایی نظیر hardbool اهمیت داشته باشد. برای نمونه، متغیری که از ۸ بیت برای نمایش مقادیر (بایاسدار) در "range 160..400" استفاده میکند، بسته به choice، با الگوهای بیتی 0x00 یا 0xFE مقداردهی اولیه خواهد شد؛ صرفنظر از اینکه این نمایشها بیانگر مقادیری در آن بازه باشند یا نه، و حتی اگر باشند، تفسیر مقدار نگهداریشده در متغیر به بایاس وابسته خواهد بود. یک متغیر hardbool که برای نمونه از "0X5A" و 0xA5 بهترتیب برای "false" و "true" استفاده میکند، با هر کدام از مقادیر choice برای مقداردهی اولیهٔ ساده به تله (trap) خواهد افتاد؛ یعنی مقداردهی اولیهٔ zero به نمایش مربوط به "false" تبدیل نخواهد شد، حتی اگر برای یک متغیر "static" از همان نوع چنین میشد. این بدان معناست که الگوی مقداردهی اولیه عموماً به نوع متغیرِ مقداردهیشده وابسته نیست. یک استثنای چشمگیر این است که متغیرهای بولی (مقاومسازینشده) که درون ثباتها جای میگیرند، حتی زمانی که pattern درخواست شده باشد، با "false" (صفر) مقداردهی اولیه میشوند.
میتوانید این رفتار را برای یک متغیر خاص با استفاده از صفت متغیر "uninitialized" کنترل کنید.
- -fvect-cost-model=model
- مدل هزینهٔ
مورد
استفاده
برای
بردارسازی
را تغییر
میدهد.
آرگومان model
باید یکی از
مقادیر unlimited،
dynamic، cheap یا very-cheap
باشد. در
مدل unlimited،
مسیر کدِ
بردارسازیشده
سودبخش فرض
میشود؛ در
حالی که در
مدل dynamic، یک
بررسی زمان
اجرا از
مسیر کد
بردارسازیشده
محافظت
میکند تا
آن را تنها
برای تعداد
تکرارهایی
فعال کند که
احتمالاً
سریعتر از
اجرای
حلقهٔ
اسکالر
اصلی اجرا
خواهند شد.
مدل cheap
بردارسازی
حلقههایی
را که انجام
آن هزینهٔ
بسیار
زیادی دارد
(برای نمونه
بهدلیل
بررسیهای
لازم در
زمان اجرا
برای
وابستگی
داده یا
تراز بودن)
غیرفعال
میکند،
اما در غیر
این صورت
معادل مدل
dynamic است. مدل
very-cheap در
صورتی که
هرگونه
بررسی زمان
اجرا برای
وابستگی
داده یا
تراز بودن
لازم باشد،
بردارسازی
حلقهها را
غیرفعال
میکند؛
همچنین
بردارسازی
حلقههای
پایانی (epilogue loops)
را غیرفعال
میسازد،
اما در غیر
این صورت
معادل مدل
cheap است.
مدل هزینهٔ پیشفرض به دیگر پرچمهای بهینهسازی بستگی دارد و یا dynamic است یا cheap.
- -fsimd-cost-model=model
- مدل هزینهٔ مورد استفاده برای بردارسازی حلقههای نشانهگذاریشده با دستورالعمل simd مربوط به OpenMP را تغییر میدهد. آرگومان model باید یکی از مقادیر unlimited، dynamic، cheap باشد. تمام مقادیر model همان معنای شرح دادهشده در -fvect-cost-model را دارند و بهطور پیشفرض از مدل هزینهٔ تعریفشده با -fvect-cost-model استفاده میشود.
- -ftree-vrp
- انتشار بازهٔ مقادیر (Value Range Propagation) را روی درختها انجام میدهد. این شبیه به گذر انتشار مقادیر ثابت است، اما بهجای مقادیر، بازهای از مقادیر منتشر میشوند. این امر به بهینهسازها اجازه میدهد بررسیهای غیرضروری بازه مانند بررسی مرزهای آرایه و بررسیهای اشارهگر تهی (null pointer) را حذف کنند. این گزینه بهطور پیشفرض در -O2 و بالاتر فعال است. حذف بررسی اشارهگر تهی تنها در صورتی انجام میشود که -fdelete-null-pointer-checks فعال باشد.
- -fsplit-paths
- مسیرهای منتهی به یالهای بازگشتی حلقه (loop backedges) را تفکیک میکند. این کار میتواند حذف کدهای مرده و حذف عبارات فرعی مشترک را بهبود بخشد. این گزینه بهطور پیشفرض در -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
- بهینهسازی
predictive commoning را
انجام
میدهد؛
یعنی
استفادهٔ
مجدد از
محاسباتی
(بهویژه
بارگذاریها
و
ذخیرهسازیهای
حافظه) که
در
تکرارهای
قبلی
حلقهها
انجام
شدهاند.
این گزینه در سطح -O3 فعال است. همچنین توسط -fprofile-use و -fauto-profile فعال میشود.
- -fprefetch-loop-arrays
- در صورت
پشتیبانی
توسط ماشین
مقصد،
دستورالعملهایی
را برای
پیشواکشی
(prefetch) حافظه
تولید
میکند تا
عملکرد
حلقههایی
که به
آرایههای
بزرگ
دسترسی
دارند،
بهبود یابد.
این گزینه ممکن است کد بهتر یا بدتری تولید کند؛ نتایج بهشدت به ساختار حلقهها در کد منبع بستگی دارد.
در سطح -Os غیرفعال است.
- -fno-printf-return-value
- ثابتها را
با مقادیر
بازگشتی
شناختهشدهٔ
توابع
خروجی
قالببندیشده
مانند
"sprintf"،
"snprintf"،
"vsprintf" و
"vsnprintf" (اما
نه "printf"
یا "fprintf")
جایگزین
نمیکند.
این
دگرگونی به
GCC اجازه
میدهد بر
اساس مقدار
بازگشتی
معلومِ این
توابع که با
آرگومانهای
ثابت یا
آرگومانهایی
با مقادیر
در بازهای
مشخص
فراخوانی
شدهاند
(بهطوری که
تعیین دقیق
مقدار
بازگشتی را
ممکن
میسازد)،
شاخهها را
بهینهسازی
یا حتی حذف
کند. برای
نمونه،
هنگامی که
-fprintf-return-value فعال
باشد،
چنانچه
"i" یک
عدد صحیح ۳۲
بیتی یا
کوچکتر
باشد، هم
شاخه و هم
بدنهٔ
دستور
"if"
(بهجز
فراخوانی
"snprint")
قابل
بهینهسازی
و حذف
هستند،
زیرا تضمین
میشود که
مقدار
بازگشتی
حداکثر ۸
باشد.
char buf[9]; if (snprintf (buf, "%08x", i) >= sizeof buf) ...
گزینهٔ -fprintf-return-value به بهینهسازیهای دیگر متکی است و بهترین نتایج را با -O2 و بالاتر ارائه میدهد. این گزینه در تعامل با گزینههای -Wformat-overflow و -Wformat-truncation کار میکند. گزینهٔ -fprintf-return-value بهطور پیشفرض فعال است.
- -fno-peephole
- -fno-peephole2
- هرگونه
بهینهسازی
peephole مختص به
ماشین را
غیرفعال
میکند.
تفاوت بین
-fno-peephole و -fno-peephole2 در
نحوهٔ
پیادهسازی
آنها در
کامپایلر
است؛ برخی
از مقصدها
از یکی،
برخی از
دیگری و
اندکی از هر
دو استفاده
میکنند.
-fpeephole بهطور پیشفرض فعال است. -fpeephole2 در سطوح -O2، -O3 و -Os فعال است.
- -fno-guess-branch-probability
- احتمالات
انشعاب را
با استفاده
از روشهای
ابتکاری
حدس
نمیزند.
چنانچه احتمالات انشعاب از طریق بازخورد پروفایلسازی (-fprofile-arcs) ارائه نشده باشند، GCC از روشهای ابتکاری برای حدس زدن آنها استفاده میکند. این روشهای ابتکاری بر پایهٔ گراف جریان کنترل هستند. اگر برخی احتمالات انشعاب توسط "__builtin_expect" مشخص شده باشند، در این صورت روشهای ابتکاری با در نظر گرفتن اطلاعات "__builtin_expect"، برای حدس زدن احتمالات انشعاب در باقی گراف جریان کنترل به کار میروند. تعامل میان روشهای ابتکاری و "__builtin_expect" میتواند پیچیده باشد، و در برخی موارد ممکن است غیرفعال کردن روشهای ابتکاری مفید باشد تا درک تأثیرات "__builtin_expect" آسانتر شود.
همچنین میتوان احتمال مورد انتظار عبارت را با تابع درونی "__builtin_expect_with_probability" مشخص کرد.
پیشفرض در سطوح -O، -O2، -O3 و -Os گزینهٔ -fguess-branch-probability است..IP -freorder-blocks 4 بازآرایی بلوکهای پایه در تابع کامپایلشده بهمنظور کاهش تعداد انشعابهای طیشده و بهبود محلیبودن کد.
در سطوح -O1، -O2، -O3 و -Os فعال است.
- -freorder-blocks-algorithm=algorithm
- استفاده از
الگوریتم
مشخصشده
برای
بازآرایی
بلوکهای
پایه.
آرگومان algorithm
میتواند
simple باشد که
اندازهٔ کد
را افزایش
نمیدهد
(بهجز گاهی
بهدلیل
اثرات
ثانویه
مانند
ترازبندی)،
یا stc،
الگوریتم
«software trace cache»، که
سعی میکند
تمام
کدهایی را
که مکرراً
اجرا
میشوند در
کنار هم
قرار دهد، و
با ایجاد
نسخههای
اضافی از
کد، تعداد
انشعابهای
اجراشده را
به حداقل
برساند.
مقدار پیشفرض در سطوح -O1 و -Os برابر با simple است، و در سطوح -O2 و -O3 برابر با stc.
- -freorder-blocks-and-partition
- علاوه بر
بازآرایی
بلوکهای
پایه در
تابع
کامپایلشده
بهمنظور
کاهش تعداد
انشعابهای
طیشده،
بلوکهای
پایهٔ داغ (hot)
و سرد (cold) را به
بخشهای
مجزایی در
فایلهای
اسمبلی و .o
افراز
میکند تا
کارایی
صفحهبندی
(paging) و
محلیبودن
حافظهٔ
نهان (cache locality)
بهبود یابد.
این بهینهسازی بهطور خودکار در صورت وجود مدیریت استثنا یا جدولهای unwind (در مقصدهایی که از setjump/longjump یا طرح اختصاصی مقصد استفاده میکنند)، برای بخشهای linkonce، برای توابعی با مشخصهٔ بخش تعریفشده توسط کاربر و در هر معماری که از بخشهای نامگذاریشده پشتیبانی نمیکند، غیرفعال میشود. هنگامی که -fsplit-stack استفاده میشود این گزینه بهطور پیشفرض فعال نیست (برای جلوگیری از خطاهای پیونددهنده)، اما ممکن است بهطور صریح فعال شود (در صورت استفاده از یک پیونددهندهٔ کارآمد).
برای x86 در سطوح -O2، -O3 و -Os فعال است.
- -freorder-functions
- بازآرایی
توابع در
فایل شیء
بهمنظور
بهبود
محلیبودن
کد. برخلاف
-fipa-reorder-for-locality، این
گزینه
گروهبندی
تمام توابع
درون یک
دستهبندی
(hot/normal/cold/never-executed) در
کنار
یکدیگر را
در اولویت
قرار
میدهد. این
کار با
استفاده از
زیربخشهای
ویژهٔ
".text.hot"
برای
پرتکرارترین
توابع
اجراشده و
".text.unlikely"
برای
توابعی که
اجرای
آنها
نامحتمل
است
پیادهسازی
شده است.
بازآرایی
توسط
پیونددهنده
انجام
میشود،
بنابراین
قالب فایل
شیء باید از
بخشهای
نامگذاریشده
پشتیبانی
کند و
پیونددهنده
باید آنها
را به روشی
معقول در
کنار هم
قرار دهد.
این گزینه مؤثر نخواهد بود مگر اینکه یا بازخورد پروفایل (profile feedback) ارائه دهید (برای جزئیات -fprofile-arcs را ببینید) یا بهطور دستی توابع را با مشخصههای "hot" یا "cold" نشانهگذاری کنید.
در سطوح -O2، -O3 و -Os فعال است.
- -fstrict-aliasing
- به
کامپایلر
اجازه
میدهد
سختگیرانهترین
قواعد نام
مستعار (aliasing)
قابلاعمال
بر زبان در
حال
کامپایل را
فرض کند.
برای C (و ++C)،
این کار
بهینهسازیها
را بر اساس
نوع
عبارتها
فعال
میکند.
بهویژه،
فرض میشود
که شیئی از
یک نوع هرگز
در آدرسی
یکسان با
شیئی از یک
نوع متفاوت
قرار
نمیگیرد،
مگر اینکه
آن نوعها
تقریباً
یکسان
باشند. برای
مثال، یک
"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 تا زمانی که دسترسی به حافظه از طریق نوع union انجام شود مجاز است. بنابراین، کد بالا همانطور که انتظار میرود کار میکند. با این حال، کد زیر ممکن است چنین نباشد:
int f() { union a_union t; int* ip; t.d = 3.0; ip = &t.i; return *ip; }مشابهاً، دسترسی با گرفتن آدرس، تبدیل نوع اشارهگر حاصل و ارجاعزدایی از نتیجه رفتار تعریفنشده دارد، حتی اگر تبدیل نوع از یک نوع union استفاده کند، مانند:
int f() { double d = 3.0; return ((union a_union *) &d)->i; }گزینهٔ -fstrict-aliasing در سطوح -O2، -O3 و -Os فعال است.
- -fipa-strict-aliasing
- کنترل
میکند که
آیا قواعد
-fstrict-aliasing در
سراسر
مرزهای
تابع اعمال
شوند یا
خیر. توجه
داشته
باشید که
اگر چندین
تابع درون
یک تابع
منفرد
خطیسازی (inline)
شوند،
دسترسیهای
حافظه دیگر
عبور از مرز
تابع در نظر
گرفته
نمیشوند.
گزینهٔ -fipa-strict-aliasing بهطور پیشفرض فعال است و تنها در ترکیب با -fstrict-aliasing مؤثر واقع میشود.
- -falign-functions
- -falign-functions=n
- -falign-functions=n:m
- -falign-functions=n:m:n2
- -falign-functions=n:m:n2:m2
- ترازبندی
ابتدای
توابع با
توان بعدی
از عدد دو
که بزرگتر
یا مساوی با
n باشد، با
نادیده
گرفتن
حداکثر m-1
بایت. این
تضمین
میکند که
حداقل m
بایت اول
تابع
بتواند
توسط
پردازنده
بدون عبور
از مرز
ترازبندی
n-بایتی
واکشی شود.
این یک
بهینهسازی
کارایی کد
است و
ترازبندی
برای
توابعی که
سرد در نظر
گرفته
میشوند
نادیده
گرفته
میشود. اگر
ترازبندی
برای تمام
توابع لازم
است، از
-fmin-function-alignment
استفاده
کنید.
اگر m مشخص نشود، مقدار پیشفرض آن n خواهد بود.
مثالها: -falign-functions=32 توابع را با مرز بعدی ۳۲ بایتی تراز میکند، -falign-functions=24 تنها در صورتی با مرز بعدی ۳۲ بایتی تراز میکند که این کار با رد کردن ۲۳ بایت یا کمتر امکانپذیر باشد، و -falign-functions=32:7 تنها در صورتی با مرز بعدی ۳۲ بایتی تراز میکند که این کار با رد کردن ۶ بایت یا کمتر انجامپذیر باشد.
جفت دوم مقادیر n2:m2 به شما امکان میدهد یک ترازبندی ثانویه را تعیین کنید: -falign-functions=64:7:32:3 در صورتی که رد کردن ۶ بایت یا کمتر ممکن باشد با مرز بعدی ۶۴ بایتی تراز میکند، در غیر این صورت اگر رد کردن ۲ بایت یا کمتر امکانپذیر باشد با مرز بعدی ۳۲ بایتی تراز میکند. اگر m2 مشخص نشده باشد، مقدار پیشفرض آن n2 است.
برخی اسمبلرها تنها زمانی از این پرچم پشتیبانی میکنند که n توانی از دو باشد؛ در آن حالت، مقدار به بالا گرد میشود.
گزینههای -fno-align-functions و -falign-functions=1 معادل هستند و به این معنایند که توابع تراز نمیشوند.
اگر n مشخص نشده باشد یا صفر باشد، از یک مقدار پیشفرض وابسته به ماشین استفاده میشود. حداکثر مقدار مجاز گزینهٔ n برابر با ۶۵۵۳۶ است.
در سطوح -O2 و -O3 فعال است.
- -flimit-function-alignment
- اگر این گزینه فعال باشد، کامپایلر تلاش میکند از ترازبندی بیشازحد و غیرضروری توابع خودداری کند. کامپایلر سعی میکند به اسمبلر دستور دهد تا به میزان مشخصشده توسط -falign-functions تراز کند، اما بایتهای بیشتری نسبت به اندازهٔ خود تابع را رد نکند.
- -falign-labels
- -falign-labels=n
- -falign-labels=n:m
- -falign-labels=n:m:n2
- -falign-labels=n:m:n2:m2
- ترازبندی
تمام
مقصدهای
انشعاب با
مرزی از
توان دو.
پارامترهای این گزینه مشابه با گزینهٔ -falign-functions هستند. گزینههای -fno-align-labels و -falign-labels=1 معادل هستند و به معنای عدم ترازبندی برچسبها میباشند.
اگر -falign-loops یا -falign-jumps قابل اعمال باشند و بزرگتر از این مقدار باشند، به جای آن از مقادیر آنها استفاده میشود.
اگر n مشخص نشده باشد یا صفر باشد، از یک پیشفرض وابسته به ماشین استفاده میشود که به احتمال زیاد 1 است، به معنای عدم ترازبندی. حداکثر مقدار مجاز گزینهٔ n برابر با ۶۵۵۳۶ است.
در سطوح -O2 و -O3 فعال است.
- -falign-loops
- -falign-loops=n
- -falign-loops=n:m
- -falign-loops=n:m:n2
- -falign-loops=n:m:n2:m2
- ترازبندی
حلقهها با
مرزی از
توان دو.
اگر
حلقهها
بارها اجرا
شوند، این
کار زمان
صرفشده
برای اجرای
دستورالعملهای
لایی صوری (dummy
padding) را جبران
میکند. این
یک
بهینهسازی
کارایی کد
است و
ترازبندی
برای
حلقههایی
که سرد در
نظر گرفته
میشوند
نادیده
گرفته
میشود.
اگر مقدار -falign-labels بزرگتر از این مقدار باشد، به جای آن از مقدار آن استفاده میشود.
پارامترهای این گزینه مشابه با گزینهٔ -falign-functions هستند. گزینههای -fno-align-loops و -falign-loops=1 معادل هستند و به معنای عدم ترازبندی حلقهها میباشند. حداکثر مقدار مجاز گزینهٔ n برابر با ۶۵۵۳۶ است.
اگر n مشخص نشده باشد یا صفر باشد، از یک مقدار پیشفرض وابسته به ماشین استفاده میشود.
در سطوح -O2 و -O3 فعال است..IP -falign-jumps 4
- -falign-jumps=n
- -falign-jumps=n:m
- -falign-jumps=n:m:n2
- -falign-jumps=n:m:n2:m2
- همترازسازی
مقصدهای
انشعاب به
مرزهای
توانی از
دو، برای
مقصدهایی
که فقط از
طریق پرش
قابل
دسترسی
هستند. در
این حالت،
نیازی به
اجرای
دستورالعملهای
ساختگی (dummy)
نیست. این
یک
بهینهسازی
برای
کارایی کد
است و
همترازسازی
برای
پرشهایی
که سرد (cold) در
نظر گرفته
میشوند
نادیده
گرفته
میشود.
اگر -falign-labels از این مقدار بزرگتر باشد، به جای آن مقدار استفاده میشود.
پارامترهای این گزینه مشابه با گزینهٔ -falign-functions هستند. گزینههای -fno-align-jumps و -falign-jumps=1 معادل هستند و به معنای عدم همترازسازی حلقهها میباشند.
اگر n مشخص نشود یا صفر باشد، از پیشفرض وابسته به ماشین استفاده میشود. بیشترین مقدار مجاز برای گزینهٔ n عدد 65536 است.
در سطوح -O2 و -O3 فعال میشود.
- -fmin-function-alignment
- حداقل همترازسازی توابع را روی نزدیکترین توان دو بزرگتر یا مساوی n تعیین میکند. بر خلاف -falign-functions، این همترازسازی برای همهٔ توابع (حتی توابعی که سرد در نظر گرفته شدهاند) نیز اعمال میشود. همچنین این همترازسازی تحت تأثیر -flimit-function-alignment قرار نمیگیرد.
- -fno-allocation-dce
- تخصیصهای
بلااستفادهٔ
++C (با
استفاده از
عملگر
"new" و
عملگر
"delete") را
در حذف
کدهای مرده
(dead code elimination) حذف
نمیکند.
همچنین ببینید -fmalloc-dce.
- -fallow-store-data-races
- به
کامپایلر
اجازه
میدهد
بهینهسازیهایی
را انجام
دهد که ممکن
است باعث
ایجاد
رقابت
دادهای (data race)
جدید روی
عملیات
ذخیرهسازی
شوند، بدون
اثبات
اینکه
متغیر
نمیتواند
همزمان
توسط
ریسههای
دیگر در
دسترس قرار
گیرد. روی
بهینهسازی
دادههای
محلی
تأثیری
ندارد.
استفاده از
این گزینه
در صورتی
بیخطر است
که مشخص
باشد
دادههای
سراسری
توسط چند
ریسه
دسترسی
نخواهند شد.
نمونههایی از بهینهسازیهای فعالشده توسط -fallow-store-data-races شامل hoisting یا if-conversionهایی است که ممکن است باعث بازنویسی مقداری که قبلاً در حافظه بوده با همان مقدار شوند. چنین بازنویسیهایی در یک بستر تکریسهای بیخطر هستند، اما در بستر چندریسهای ممکن است ناامن باشند. توجه داشته باشید که در برخی پردازندهها، ممکن است برای فعالسازی برداریسازی (vectorization) به if-conversion نیاز باشد.
در سطح -Ofast فعال میشود.
- -funit-at-a-time
- این گزینه
صرفاً به
دلایل
سازگاری
باقی مانده
است. گزینهٔ
-funit-at-a-time هیچ
تأثیری
ندارد، در
حالی که
-fno-unit-at-a-time
مستلزم
-fno-toplevel-reorder و -fno-section-anchors
است.
بهطور پیشفرض فعال است.
- -fno-toplevel-reorder
- توابع سطح
بالا (top-level)،
متغیرها و
عبارات
"asm" را
بازآرایی
نمیکند.
آنها را با
همان
ترتیبی که
در فایل
ورودی
آمدهاند
در خروجی
قرار
میدهد.
هنگام
استفاده از
این گزینه،
متغیرهای
ایستا (static)
بدون ارجاع
حذف
نمیشوند.
این گزینه
برای
پشتیبانی
از کدهای
موجود که به
ترتیب خاصی
وابسته
هستند در
نظر گرفته
شده است.
برای کدهای
جدید، بهتر
است در صورت
امکان از
ویژگیها
(attributes) استفاده
شود.
گزینهٔ -ftoplevel-reorder در سطح -O1 و بالاتر، و همچنین در سطح -O0 در صورتی که -fsection-anchors صراحتاً درخواست شده باشد، پیشفرض است. علاوه بر این، -fno-toplevel-reorder مستلزم -fno-section-anchors است.
- -funreachable-traps
- با این
گزینه،
کامپایلر
فراخوانیهای
"__builtin_unreachable" را
به جای
استفاده
برای
بهینهسازی،
به تلهها (traps)
تبدیل
میکند. این
موضوع بر
تمام
اینگونه
فراخوانیها
که بهطور
ضمنی توسط
کامپایلر
تولید
میشوند
نیز تأثیر
میگذارد.
این گزینه اثری مشابه -fsanitize=unreachable -fsanitize-trap=unreachable دارد، اما روی مقادیر آن گزینهها تأثیری نمیگذارد. اگر -fsanitize=unreachable فعال باشد، آن گزینه نسبت به این گزینه اولویت دارد.
این گزینه بهطور پیشفرض در سطوح -O0 و -Og فعال است.
- -fweb
- شبکههای
تاری (webs) را
آنطور که
معمولاً
برای مقاصد
تخصیص ثبات
به کار
میروند
ساخته و به
هر وب یک
ثبات مجازی
(شبهثبات)
اختصاصی
تخصیص
میدهد. این
کار به
مرحلهٔ
تخصیص ثبات
اجازه
میدهد تا
مستقیماً
روی
شبهثباتها
عمل کند،
اما همچنین
چندین
مرحلهٔ
بهینهسازی
دیگر مانند
CSE،
بهینهساز
حلقه و حذف
کدهای
مردهٔ
بدیهی را
تقویت
میکند. با
این حال،
میتواند
اشکالزدایی
را غیرممکن
کند، چرا که
متغیرها
دیگر در یک
«ثبات
خانگی» (home register)
باقی
نمیمانند.
بهطور پیشفرض همراه با -funroll-loops فعال میشود.
- -fwhole-program
- فرض را بر
این
میگذارد
که واحد
ترجمهٔ
فعلی، کل
برنامهٔ در
حال
کامپایل را
نشان
میدهد.
تمامی
توابع و
متغیرهای
عمومی به
استثنای
"main" و
مواردی که
با ویژگی
"externally_visible"
مشخص
شدهاند،
به توابع
ایستا (static)
تبدیل
میشوند و
در عمل با
تهاجم
بیشتری
توسط
بهینهسازهای
بینروالی
بهینهسازی
میشوند.
همراه با -flto این گزینه کاربرد محدودی دارد. در بیشتر موارد، فهرست دقیق نمادهای استفادهشده یا صادرشده از فایل باینری از طریق اطلاعات تحلیل ارائهشده توسط افزونهٔ پیونددهنده به بهینهساز زمان پیوند مشخص است. با این حال، اگر از هیچ افزونهٔ پیونددهندهای استفاده نشود، یا در طول مرحلهٔ پیوند افزایشی هنگامی که کد نهایی تولید میشود (با -flto -flinker-output=nolto-rel)، همچنان کاربردی است.
- -flto[=n]
- این گزینه
بهینهساز
استاندارد
زمان پیوند
را اجرا
میکند.
هنگامی که
با کد منبع
فراخوانی
شود، GIMPLE (یکی
از
نمایشهای
داخلی GCC) را
تولید کرده
و آن را در
بخشهای
ویژهٔ ELF در
فایل شیء (object file)
مینویسد.
هنگامی که
فایلهای
شیء به
یکدیگر
پیوند داده
میشوند،
بدنهٔ تمام
توابع از
این
بخشهای ELF
خوانده شده
و به
گونهای
نمونهسازی
میشوند که
گویی بخشی
از یک واحد
ترجمه
بودهاند.
برای استفاده از بهینهساز زمان پیوند، -flto و گزینههای بهینهسازی باید در زمان کامپایل و همچنین در طول پیوند نهایی مشخص شوند. توصیه میشود تمام فایلهای دخیل در پیوند مشترک را با گزینههای یکسان کامپایل کنید و این گزینهها را در زمان پیوند نیز مشخص نمایید. برای مثال:
gcc -c -O2 -flto foo.c gcc -c -O2 -flto bar.c gcc -o myprog -flto -O2 foo.o bar.o
دو فراخوانی نخست GCC یک نمایش بایتکد از GIMPLE را در بخشهای ویژهٔ ELF درون foo.o و bar.o ذخیره میکنند. فراخوانی نهایی بایتکد GIMPLE را از foo.o و bar.o خوانده، دو فایل را در یک تصویر داخلی واحد ادغام کرده و نتیجه را طبق روال معمول کامپایل میکند. از آنجا که هر دو فایل foo.o و bar.o در یک تصویر واحد ادغام شدهاند، این کار باعث میشود تمام تحلیلها و بهینهسازیهای بینروالی در GCC در هر دو فایل به گونهای عمل کنند که گویی یک فایل واحد هستند. این بدین معناست که به عنوان مثال، بخش درونریز (inliner) قادر است توابع موجود در bar.o را درون توابع foo.o و بالعکس درونریزی کند.
روشی دیگر (و سادهتر) برای فعال کردن بهینهسازی زمان پیوند عبارت است از:
gcc -o myprog -flto -O2 foo.c bar.c
دستور بالا بایتکد را برای foo.c و bar.c تولید کرده، آنها را با هم در یک نمایش GIMPLE واحد ادغام میکند و آنها را طبق معمول برای تولید myprog بهینهسازی مینماید.
نکتهٔ مهمی که باید به خاطر داشت این است که برای فعالسازی بهینهسازیهای زمان پیوند، باید از درایور GCC برای انجام مرحلهٔ پیوند استفاده کنید. اگر هر یک از شیءهای مربوطه با گزینهٔ خط فرمان -flto کامپایل شده باشند، GCC بهطور خودکار بهینهسازی زمان پیوند را انجام میدهد. شما همیشه میتوانید این تصمیم خودکار برای انجام بهینهسازی زمان پیوند را با ارسال -fno-lto به دستور پیوند لغو کنید.
برای کارآمد کردن بهینهسازی کل برنامه، لازم است فرضیات معینی دربارهٔ کل برنامه در نظر گرفته شود. کامپایلر باید بداند چه توابع و متغیرهایی ممکن است توسط کتابخانهها و زماناجرا (runtime) خارج از واحد بهینهسازیشده در زمان پیوند دسترسیپذیر باشند. هنگامی که پیونددهنده پشتیبانی کند، افزونهٔ پیونددهنده (ببینید -fuse-linker-plugin) اطلاعات نمادهای استفادهشده و نمادهای از بیرون قابلمشاهده را به کامپایلر منتقل میکند. هنگامی که افزونهٔ پیونددهنده در دسترس نیست، باید از -fwhole-program استفاده شود تا به کامپایلر اجازه داده شود این فرضیات را اعمال کند، که منجر به تصمیمگیریهای تهاجمیتر برای بهینهسازی میشود.
هنگامی که یک فایل با -flto و بدون -fuse-linker-plugin کامپایل میشود، فایل شیء تولیدشده بزرگتر از یک فایل شیء معمولی است زیرا حاوی بایتکدهای GIMPLE و کد نهایی معمول است (ببینید -ffat-lto-objects). این بدان معناست که فایلهای شیء با اطلاعات LTO میتوانند مانند فایلهای شیء عادی پیوند داده شوند؛ اگر -fno-lto به پیونددهنده ارسال شود، هیچ بهینهسازی بینروالی اعمال نمیشود. توجه داشته باشید هنگامی که -fno-fat-lto-objects فعال باشد، مرحلهٔ کامپایل سریعتر است اما نمیتوانید یک پیوند معمولی و غیر LTO روی آنها انجام دهید.
هنگام تولید باینری نهایی، GCC بهینهسازیهای زمان پیوند را فقط برای فایلهایی اعمال میکند که حاوی بایتکد هستند. بنابراین، میتوانید فایلهای شیء و کتابخانهها را با بایتکدهای GIMPLE و کد شیء نهایی ترکیب کنید. GCC بهطور خودکار انتخاب میکند که کدام فایلها در حالت LTO بهینهسازی شوند و کدام فایلها بدون پردازش بیشتر پیوند داده شوند.
بهطور کلی، گزینههای مشخصشده در زمان پیوند بر گزینههای مشخصشده در زمان کامپایل اولویت دارند، اگرچه در برخی موارد GCC تلاش میکند گزینههای زمان پیوند را از تنظیمات استفادهشده برای کامپایل فایلهای ورودی استنتاج کند.
اگر گزینهٔ سطح بهینهسازی -O را در زمان پیوند مشخص نکنید، GCC از بالاترین سطح بهینهسازی استفادهشده هنگام کامپایل فایلهای شیء استفاده میکند. توجه داشته باشید که تعیین گزینهٔ سطح بهینهسازی فقط در زمان پیوند و نه در زمان کامپایل، عموماً به دو دلیل بیاثر است. نخست، کامپایل کردن بدون بهینهسازی، مراحلی از کامپایلر را که اطلاعات لازم را برای بهینهسازی مؤثر در زمان پیوند جمعآوری میکنند، متوقف میسازد. دوم، برخی از مراحل اولیهٔ بهینهسازی فقط در زمان کامپایل قابل انجام هستند و نه در زمان پیوند.
برخی پرچمهای تولید کد وجود دارند که هنگام تولید بایتکد توسط 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 به مرحلهٔ پیوند منتقل میشوند و تنظیمات آنها با مرحلهٔ کامپایل در سطح دانهبندی تابع تطابق دارد. توجه داشته باشید که این موضوع تنها برای پیامهای تشخیصی صادرشده در طول بهینهسازی اهمیت دارد. همچنین توجه داشته باشید که تبدیلهای کد مانند درونریزی میتوانند منجر به فعال یا غیرفعال شدن هشدارها برای بخشهایی از کد شوند که با تنظیمات زمان کامپایل مطابقت ندارند.
هنگامی که نیاز دارید گزینههایی را از طریق -Wa یا -Xassembler به اسمبلر ارسال کنید، مطمئن شوید که یا چنین واحدهای ترجمهای را با -fno-lto کامپایل کردهاید یا بهطور هماهنگ از گزینههای اسمبلر یکسان در تمام واحدهای ترجمه استفاده میکنید. همچنین میتوانید گزینههای اسمبلر را در زمان پیوند LTO تعیین کنید.
برای فعالسازی تولید اطلاعات اشکالزدایی، باید -g را در زمان کامپایل ارائه دهید. اگر هر یک از فایلهای ورودی در زمان پیوند با فعال بودن تولید اطلاعات اشکالزدایی ساخته شده باشند، پیوند نیز تولید اطلاعات اشکالزدایی را فعال خواهد کرد. هرگونه تنظیمات پیچیدهتر اطلاعات اشکالزدایی مانند سطح dwarf در -gdwarf-5 باید صراحتاً در خط فرمان پیونددهنده تکرار شود و ترکیب تنظیمات مختلف در واحدهای ترجمهٔ متفاوت توصیه نمیشود.
اگر LTO با اشیایی با پیوند C مواجه شود که با انواع ناسازگار در واحدهای ترجمهٔ مجزا برای پیوند با یکدیگر اعلان شدهاند (رفتار تعریفنشده مطابق با ISO C99 6.2.7)، ممکن است یک پیام تشخیصی غیرمهلک صادر شود. با این وجود، این رفتار در زمان اجرا همچنان تعریفنشده خواهد بود. پیامهای تشخیصی مشابهی ممکن است برای زبانهای دیگر نیز ایجاد شود.
یکی دیگر از قابلیتهای LTO این است که میتوان بهینهسازیهای بینروالی را روی فایلهای نوشتهشده به زبانهای مختلف اعمال کرد:
gcc -c -flto foo.c g++ -c -flto bar.cc gfortran -c -flto baz.f90 g++ -o myprog -flto -O3 foo.o bar.o baz.o -lgfortran
دقت کنید که پیوند نهایی با g++ انجام شده تا کتابخانههای زماناجرای ++C دریافت شوند و -lgfortran برای دریافت کتابخانههای زماناجرای Fortran اضافه شده است. بهطور کلی، هنگام ترکیب زبانها در حالت LTO، باید از همان گزینههای دستور پیوند استفاده کنید که در ترکیب زبانها در یک کامپایل معمولی (غیر LTO) استفاده میکردید.
اگر فایلهای شیء حاوی بایتکد GIMPLE در یک آرشیو کتابخانه، مثلاً libfoo.a، ذخیره شده باشند، در صورتی که از پیونددهندهای با پشتیبانی از افزونه استفاده کنید، استخراج و استفاده از آنها در پیوند LTO ممکن است. برای ایجاد کتابخانههای ایستا مناسب برای LTO، از gcc-ar و gcc-ranlib به جای ar و ranlib استفاده کنید؛ برای نمایش نمادهای فایلهای شیء حاوی بایتکد GIMPLE، از gcc-nm استفاده نمایید. این دستورها نیازمند آن هستند که ar، ranlib و nm با پشتیبانی از افزونه کامپایل شده باشند. در زمان پیوند، از پرچم -fuse-linker-plugin استفاده کنید تا مطمئن شوید کتابخانه در فرایند بهینهسازی LTO شرکت میکند:
gcc -o myprog -O2 -flto -fuse-linker-plugin a.o b.o -lfoo
با فعال بودن افزونهٔ پیونددهنده، پیونددهنده فایلهای GIMPLE مورد نیاز را از libfoo.a استخراج کرده و آنها را به GCC در حال اجرا تحویل میدهد تا بخشی از تصویر تجمیعشدهٔ GIMPLE برای بهینهسازی شوند.
اگر از پیونددهندهای با پشتیبانی از افزونه استفاده نمیکنید و/یا افزونهٔ پیونددهنده را فعال نکردهاید، شیءهای درون libfoo.a طبق معمول استخراج و پیوند داده میشوند، اما در فرایند بهینهسازی LTO شرکت نمیکنند. برای اینکه یک کتابخانهٔ ایستا هم برای بهینهسازی LTO و هم برای پیوند معمول مناسب باشد، فایلهای شیء آن را با -flto -ffat-lto-objects کامپایل کنید.
بهینهسازیهای زمان پیوند برای عمل کردن نیازی به حضور کل برنامه ندارند. اگر برنامه نیازی به صدور هیچ نمادی نداشته باشد، ترکیب -flto و -fwhole-program امکانپذیر است تا به بهینهسازهای بینروالی اجازه دهد فرضیات تهاجمیتری را به کار گیرند که ممکن است منجر به فرصتهای بهینهسازی بهتری شود. هنگامی که افزونهٔ پیونددهنده فعال است (ببینید -fuse-linker-plugin)، نیازی به استفاده از -fwhole-program نیست.
پیادهسازی فعلی LTO هیچ تلاشی برای تولید بایتکدی که بین انواع مختلف میزبانها قابلحمل (portable) باشد نمیکند. فایلهای بایتکد دارای نسخه هستند و بررسی دقیق نسخه وجود دارد، بنابراین فایلهای بایتکد تولیدشده در یک نسخه از GCC با نسخهٔ قدیمیتر یا جدیدتر GCC کار نمیکنند.
بهینهسازی زمان پیوند با تولید اطلاعات اشکالزدایی در سیستمهایی غیر از آنهایی که از ترکیب ELF و DWARF استفاده میکنند، به خوبی کار نمیکند.
اگر n اختیاری را مشخص کنید، بهینهسازی و تولید کد انجامشده در زمان پیوند بهطور موازی با استفاده از n وظیفهٔ موازی با بهکارگیری برنامهٔ make نصبشده اجرا میشود. از متغیر محیطی MAKE میتوان برای تغییر برنامهٔ مورد استفاده استفاده کرد.
همچنین میتوانید -flto=jobserver را برای استفاده از حالت کارساز وظیفهٔ (job server) برنامهٔ GNU make جهت تعیین تعداد وظایف موازی مشخص کنید. این مورد زمانی مفید است که Makefile فراخوانندهٔ GCC از قبل به صورت موازی در حال اجرا باشد. برای اینکه این قابلیت کار کند، باید یک علامت + به دستورالعمل در Makefile والد اضافه کنید. این گزینه احتمالاً تنها در صورتی کار میکند که MAKE همان GNU make باشد. حتی بدون مقدار گزینه، GCC تلاش میکند تا سرور وظیفهٔ یک GNU make در حال اجرا را بهطور خودکار تشخیص دهد.
از -flto=auto برای استفاده از کارساز وظیفهٔ GNU make (در صورت در دسترس بودن)، یا در غیر این صورت بازگشت به تشخیص خودکار تعداد ریسههای پردازندهٔ موجود در سیستم خود استفاده کنید..IP -flto-partition=alg 4 الگوریتم افرازبندی (partitioning) مورد استفاده توسط بهینهساز زمان پیوند (link-time optimizer) را مشخص میکند. مقدار میتواند 1to1 برای تعیین افرازبندی منطبق بر فایلهای منبع اصلی باشد، یا balanced برای تعیین افرازبندی به قطعات با اندازه برابر (در صورت امکان)، یا max برای ایجاد یک افراز جدید به ازای هر نماد در صورت امکان، یا cache برای متوازنسازی اندازه قطعات همزمان با نگه داشتن نمادهای مرتبط در کنار یکدیگر جهت حافظهپنهانسازی بهتر در LTO افزایشی. مشخص کردن none به عنوان الگوریتم، افرازبندی و جاریسازی (streaming) را به طور کامل غیرفعال میکند. مقدار پیشفرض balanced است. در حالی که میتوان از 1to1 به عنوان یک راهکار موقت برای مشکلات مختلف ترتیب کد استفاده کرد، افرازبندی max فقط برای آزمایشهای داخلی در نظر گرفته شده است. مقدار one مشخص میکند که دقیقاً یک افراز باید استفاده شود، در حالی که مقدار none افرازبندی را دور زده و مرحلهٔ بهینهسازی زمان پیوند را مستقیماً از فاز WPA اجرا میکند.
- -flto-incremental=path
- فعالسازی
LTO افزایشی،
با قرار
دادن حافظه
پنهان (cache) آن
در
دایرکتوری
موجود
مشخصشده.
میتواند
چرخههای
ویرایش-کامپایل
را با LTO
بهطور
چشمگیری
کوتاهتر
کند.
هنگامی که همراه با LTO (-flto) استفاده شود، خروجی واحدهای ترجمه در داخل LTO در حافظه پنهان ذخیره میشود. واحدهای ترجمه ذخیرهشده احتمالاً هنگام کامپایل مجدد با تغییرات کوچک در کد دوباره با آنها برخورد خواهد شد، که منجر به کاهش زمان کامپایل مجدد میشود.
نمونههای متعدد GCC میتوانند بهطور همروند از یک حافظه پنهان استفاده کنند.
- -flto-incremental-cache-size=n
- تعداد مدخلهای حافظه پنهان در LTO افزایشی را مشخص میکند که پس از آن مدخلهای قدیمی هرس میشوند. این یک محدودیت نرم است و ممکن است به طور موقت مدخلهای بیشتری وجود داشته باشد.
- -flto-compression-level=n
- این گزینه سطح فشردهسازی مورد استفاده برای زبان میانی نوشتهشده در فایلهای شیء LTO را مشخص میکند و تنها همراه با حالت LTO (-flto) معنادار است. GCC در حال حاضر از دو الگوریتم فشردهسازی LTO پشتیبانی میکند. برای zstd، مقادیر معتبر از 0 (بدون فشردهسازی) تا 19 (حداکثر فشردهسازی) هستند، در حالی که zlib از مقادیر 0 تا 9 پشتیبانی میکند. مقادیر خارج از این محدوده به حداقل یا حداکثر مقادیر پشتیبانیشده محدود میشوند. اگر این گزینه داده نشود، یک تنظیم فشردهسازی متوازن پیشفرض استفاده میشود.
- -fuse-linker-plugin
- استفاده از
افزایهٔ
پیونددهنده
(linker plugin) را در طول
بهینهسازی
زمان پیوند
فعال
میکند. این
گزینه به
پشتیبانی
پیونددهنده
از افزایه
وابسته
است، که در gold
یا در GNU ld نسخه
2.21 یا جدیدتر
موجود است.
این گزینه استخراج فایلهای شیء حاوی بایتکد GIMPLE را از آرشیوهای کتابخانه فعال میسازد. این امر با قرار دادن کد بیشتر در معرض بهینهساز زمان پیوند، کیفیت بهینهسازی را بهبود میبخشد. این اطلاعات مشخص میکند چه نمادهایی میتوانند از بیرون (توسط شیء غیر-LTO یا در طول پیوند پویا) قابل دسترسی باشند. بهبود حاصل در کیفیت کد روی باینریها (و کتابخانههای مشترکی که از قابلیت دید پنهان استفاده میکنند) شبیه به -fwhole-program است. برای توضیحات اثر این پرچم و نحوهٔ استفاده از آن، -flto را ببینید.
این گزینه به طور پیشفرض فعال است اگر پشتیبانی از LTO در GCC فعال شده باشد و GCC برای استفاده با پیونددهندهای با پشتیبانی از افزایهها (GNU ld نسخه 2.21 یا جدیدتر یا gold) پیکربندی شده باشد.
- -ffat-lto-objects
- اشیای Fat LTO
فایلهای
شیئی هستند
که هم شامل
زبان میانی
و هم کد شیء
میباشند.
این باعث
میشود هم
برای پیوند
LTO و هم برای
پیوند
معمولی
قابل
استفاده
باشند. این
گزینه تنها
هنگام
کامپایل با
-flto مؤثر است
و در زمان
پیوند
نادیده
گرفته
میشود.
گزینهٔ -fno-fat-lto-objects نسبت به LTO ساده زمان کامپایل را بهبود میبخشد، اما مستلزم آن است که کل زنجیره ابزار از LTO آگاه باشد. این گزینه برای عملکرد پایهای به یک پیونددهنده با پشتیبانی از افزایهٔ پیونددهنده نیاز دارد. علاوه بر این، nm، ar و ranlib نیز باید از افزایههای پیونددهنده پشتیبانی کنند تا یک محیط ساخت با امکانات کامل (با قابلیت ساخت کتابخانههای ایستا و غیره) فراهم شود. GCC پوشانندههای gcc-ar، gcc-nm و gcc-ranlib را برای ارسال گزینههای صحیح به این ابزارها ارائه میدهد. در LTO غیر fat، فایلهای makefile باید برای استفاده از آنها تغییر داده شوند.
توجه داشته باشید که binutils مدرن سازوکار بارگذاری خودکار افزایه را ارائه میدهد. نصب افزایهٔ پیونددهنده در $libdir/bfd-plugins اثری مشابه استفاده از پوشانندههای دستور (gcc-ar، gcc-nm و gcc-ranlib) دارد.
پیشفرض روی هدفهایی که از افزایهٔ پیونددهنده پشتیبانی میکنند -fno-fat-lto-objects است.
- -fcompare-elim
- پس از تخصیص
ثبات (register allocation) و
تفکیک
دستورالعمل
پس از تخصیص
ثبات،
دستورالعملهای
حسابی که
پرچمهای
پردازنده
را مشابه یک
عملیات
مقایسه بر
اساس آن
محاسبات
محاسبه
میکنند،
شناسایی
میکند. در
صورت
امکان،
عملیات
مقایسه
صریح را حذف
میکند.
این گذر تنها برای اهداف خاصی اعمال میشود که نمیتوانند عملیات مقایسه را پیش از تکمیل تخصیص ثبات به صورت صریح نشان دهند.
در سطوح -O1، -O2، -O3 و -Os فعال است.
- -ffold-mem-offsets
- -fno-fold-mem-offsets
- تلاش برای
حذف
دستورهای
جمع (add) با
ادغام
آنها در
بارگذاریها/ذخیرهسازیهای
حافظه.
در سطوح -O2 و -O3 فعال است.
- -fcprop-registers
- پس از تخصیص
ثبات و
تفکیک
دستورالعمل
پس از تخصیص
ثبات، یک
گذر انتشار
کپی (copy-propagation) را
اجرا
میکند تا
وابستگیهای
زمانبندی
را کاهش
داده و گاهی
اوقات کپی
را حذف کند.
در سطوح -O1، -O2، -O3 و -Os فعال است.
- -fprofile-correction
- پروفایلهای
جمعآوریشده
با استفاده
از یک
باینری
مجهزشده
برای
برنامههای
چندنخی
ممکن است به
دلیل
بهروزرسانیهای
از دست
رفتهٔ
شمارندهها
ناسازگار
باشند.
هنگامی که
این گزینه
مشخص شود، GCC
از روشهای
مکاشفهای
برای تصحیح
یا
هموارسازی
چنین
ناسازگاریهایی
استفاده
میکند. به
طور
پیشفرض،
زمانی که یک
پروفایل
ناسازگار
شناسایی
شود، GCC یک
پیام خطا
صادر
میکند.
این گزینه توسط -fauto-profile فعال میشود.
- -fprofile-partial-training
- با "-fprofile-use" تمام بخشهایی از برنامهها که در طول اجرای آزمایشی اجرا نشدهاند، به جای سرعت به شدت برای اندازه بهینهسازی میشوند. در برخی موارد امکان آموزش دادن تمام مسیرهای داغ ممکن در برنامه وجود ندارد. (برای مثال، برنامه ممکن است شامل توابعی مخصوص یک سختافزار مشخص باشد و آموزش ممکن است تمام پیکربندیهای سختافزاری که برنامه روی آنها اجرا میشود را پوشش ندهد.) با "-fprofile-partial-training" بازخورد پروفایل برای تمام توابعی که در طول اجرای آزمایشی اجرا نشدهاند نادیده گرفته میشود، که باعث میشود آنها بهگونهای بهینهسازی شوند که گویی بدون بازخورد پروفایل کامپایل شدهاند. این امر منجر به کارایی بهتر در زمانی میشود که اجرای آزمایشی نمایندهٔ همه حالات نباشد، اما همچنین منجر به کد به مراتب بزرگتر میشود.
- -fprofile-use
- -fprofile-use=path
- بهینهسازیهای
هدایتشده
با بازخورد
پروفایل و
بهینهسازیهای
زیر را فعال
میکند، که
بسیاری از
آنها
معمولاً
تنها در
صورت در
دسترس بودن
بازخورد
پروفایل
سودمند
هستند:
-fbranch-probabilities -fprofile-values -funroll-loops -fpeel-loops -ftracer -fvpt -finline-functions -fipa-cp -fipa-cp-clone -fipa-bit-cp -fpredictive-commoning -fsplit-loops -funswitch-loops -fgcse-after-reload -ftree-loop-vectorize -ftree-slp-vectorize -fvect-cost-model=dynamic -ftree-loop-distribute-patterns -fprofile-reorder-functions
پیش از آنکه بتوانید از این گزینه استفاده کنید، ابتدا باید اطلاعات پروفایلگیری را ایجاد نمایید.
به طور پیشفرض، اگر پروفایلهای بازخورد با کد منبع همخوانی نداشته باشند، GCC یک پیام خطا صادر میکند. این خطا میتواند با استفاده از -Wno-error=coverage-mismatch به یک هشدار تبدیل شود. توجه داشته باشید که این ممکن است به کدی با بهینهسازی ضعیف منجر شود. علاوه بر این، به طور پیشفرض، در صورتی که پروفایلهای بازخورد وجود نداشته باشند نیز GCC یک پیام هشدار صادر میکند (-Wmissing-profile را ببینید).
اگر path مشخص شود، GCC برای یافتن فایلهای دادهٔ بازخورد پروفایل، به path نگاه میکند. -fprofile-dir را ببینید.
- -fauto-profile
- -fauto-profile=path
- بهینهسازیهای
هدایتشده
با بازخورد
مبتنی بر
نمونهبرداری
و
بهینهسازیهای
زیر را فعال
میکند، که
بسیاری از
آنها
معمولاً
تنها در
صورت در
دسترس بودن
بازخورد
پروفایل
سودمند
هستند:
-fbranch-probabilities -fprofile-values -funroll-loops -fpeel-loops -ftracer -fvpt -finline-functions -fipa-cp -fipa-cp-clone -fipa-bit-cp -fpredictive-commoning -fsplit-loops -funswitch-loops -fgcse-after-reload -ftree-loop-vectorize -ftree-slp-vectorize -fvect-cost-model=dynamic -ftree-loop-distribute-patterns -fprofile-correction
path نام فایلی شامل اطلاعات پروفایل AutoFDO است. اگر ذکر نشود، به طور پیشفرض fbdata.afdo در دایرکتوری فعلی است.
تولید یک فایل داده پروفایل AutoFDO نیازمند اجرای برنامه با ابزار perf بر روی یک سیستم مقصد GNU/Linux پشتیبانیشده است. برای اطلاعات بیشتر، https://perf.wiki.kernel.org را ببینید.
برای مثال:
perf record -e br_inst_retired:near_taken -b -o perf.data \ -- your_programسپس از ابزار create_gcov برای تبدیل دادههای خام پروفایل به قالبی که بتواند توسط GCC استفاده شود استفاده کنید. همچنین باید باینری unstripped برنامهٔ خود را به این ابزار ارائه دهید. https://github.com/google/autofdo را ببینید.
برای مثال:
create_gcov --binary=your_program.unstripped --profile=perf.data \ --gcov=profile.afdo گزینههای زیر رفتار کامپایلر را در رابطه با محاسبات ممیز شناور کنترل میکنند. این گزینهها تعادلی میان سرعت و درستی برقرار میسازند. همهٔ آنها باید بهطور خاص فعال شوند. - -fexcess-precision=style
-
این گزینه امکان کنترل دقت مازاد (excess precision) را در ماشینهایی فراهم میکند که در آنها عملیات ممیز شناور در قالبی با دقت یا دامنهٔ بیشتر از استاندارد IEEE و انواع تبادل ممیز شناور انجام میشود. نمونهای از چنین اهدافی، ممیز شناور x87 در پردازندههای x86 است که در داخل به جای قالب ۶۴ بیتی IEEE از یک نمایش ۸۰ بیتی استفاده میکند. برای بیشتر برنامهها، دقت مازاد بیضرر است، اما برخی برنامهها ممکن است به الزامات استانداردهای زبان C یا C++ برای مدیریت مقادیر IEEE وابسته باشند. بهطور پیشفرض، -fexcess-precision=fast فعال است؛ این بدان معناست که در صورت منجر شدن به کدی سریعتر، ممکن است عملیات با دقتی بالاتر از انواع مشخصشده در منبع انجام شوند، و زمان انجام گرد کردن به انواع مشخصشده در کد منبع غیرقابلپیشبینی است. هنگام کامپایل C یا C++، در صورت تعیین -fexcess-precision=standard، دقت مازاد از قوانین مشخصشده در ISO C99 یا C++ پیروی میکند؛ بهویژه، هم تبدیلهای نوع (casts) و هم انتسابها موجب گرد شدن مقادیر به انواع معناییشان میشوند (در حالی که -ffloat-store فقط بر انتسابها اثر میگذارد). این گزینه بهطور پیشفرض برای C یا C++ در صورتی فعال میشود که یک گزینهٔ انطباق دقیق مانند -std=c99 یا -std=c++17 استفاده شده باشد. -ffast-math صرفنظر از اینکه از گزینهٔ انطباق دقیق استفاده شده باشد یا خیر، -fexcess-precision=fast را بهطور پیشفرض فعال میکند. اگر -fexcess-precision=16 تعیین شود، مقادیر ثابت و نتایج عبارات دارای انواع "_Float16" و "__bf16" بدون دقت مازاد محاسبه میشوند. گزینهٔ -fexcess-precision=standard برای زبانهایی غیر از C یا C++ پیادهسازی نشده است. در x86، اگر -mfpmath=sse یا -mfpmath=sse+387 مشخص شده باشد، هیچ اثری ندارد؛ در حالت اول، معناشناسی IEEE بدون دقت مازاد اعمال میشود، و در حالت دوم، گرد کردن غیرقابلپیشبینی است.
- -ffloat-store
-
متغیرهای ممیز شناور را در ثباتها ذخیره نمیکند و از گزینههای دیگری که ممکن است تعیین کنند مقدار ممیز شناور از یک ثبات خوانده شود یا حافظه، جلوگیری میکند. این گزینه بهطور کلی تحتالشعاع -fexcess-precision=standard قرار گرفته که حالت جامعتری است. اگر از -ffloat-store استفاده میکنید، ممکن است نیاز باشد برنامهٔ خود را تغییر دهید تا محاسبات میانی را صریحاً در متغیرهای موقت ذخیره کند، زیرا -ffloat-store بر خلاف -fexcess-precision=standard، گرد کردن به قالب IEEE را تنها در انتسابها اعمال میکند و نه در تبدیلهای نوع.
- -ffast-math
-
گزینههای -fno-math-errno، -funsafe-math-optimizations، -ffinite-math-only، -fno-rounding-math، -fno-signaling-nans، -fcx-limited-range و -fexcess-precision=fast را فعال میکند. این گزینه موجب تعریف ماکروی پیشپردازندهٔ "__FAST_MATH__" میشود. این گزینه توسط هیچکدام از گزینههای -O بهجز -Ofast فعال نمیشود، زیرا میتواند به خروجی نادرست برای برنامههایی منجر شود که به پیادهسازی دقیق قواعد/مشخصات IEEE یا ISO برای توابع ریاضی وابسته هستند. با این حال، ممکن است برای برنامههایی که نیازی به ضمانتهای این مشخصات ندارند، کد سریعتری تولید کند. - -fno-math-errno
-
پس از فراخوانی توابع ریاضی که با یک تکدستورالعمل اجرا میشوند (مانند "sqrt")، متغیر "errno" را مقداردهی نمیکند. برنامهای که برای مدیریت خطاهای ریاضی به استثناهای IEEE وابسته است، ممکن است بخواهد از این پرچم برای سرعت بیشتر ضمن حفظ سازگاری با محاسبات IEEE استفاده کند. این گزینه توسط هیچکدام از گزینههای -O بهجز -Ofast فعال نمیشود، چرا که میتواند به خروجی نادرست برای برنامههایی منجر شود که به پیادهسازی دقیق قواعد/مشخصات IEEE یا ISO برای توابع ریاضی وابسته هستند. با این حال، ممکن است برای برنامههایی که نیازی به ضمانتهای این مشخصات ندارند، کد سریعتری ایجاد کند. پیشفرض -fmath-errno است. در سیستمهای Darwin، کتابخانهٔ ریاضی هرگز "errno" را مقداردهی نمیکند. بنابراین دلیلی ندارد که کامپایلر چنین احتمالی را در نظر بگیرد، و -fno-math-errno حالت پیشفرض است.
- -funsafe-math-optimizations
-
بهینهسازیهایی را برای محاسبات ممیز شناور مجاز میداند که (الف) فرض میکنند آرگومانها و نتایج معتبر هستند و (ب) ممکن است استانداردهای IEEE یا ANSI را نقض کنند. هنگام استفاده در زمان پیوند، ممکن است کتابخانهها یا فایلهای راهاندازی را در بر بگیرد که کلمهٔ کنترلی پیشفرض FPU یا سایر بهینهسازیهای مشابه را تغییر میدهند. این گزینه توسط هیچکدام از گزینههای -O بهجز -Ofast فعال نمیشود، زیرا میتواند به خروجی نادرست برای برنامههایی بینجامد که به پیادهسازی دقیق قواعد/مشخصات IEEE یا ISO برای توابع ریاضی وابسته هستند. با این حال، ممکن است برای برنامههایی که به ضمانتهای این مشخصات نیاز ندارند، کد سریعتری تولید کند. گزینههای -fno-signed-zeros، -fno-trapping-math، -fassociative-math و -freciprocal-math را فعال میکند. پیشفرض -fno-unsafe-math-optimizations است.
- -fassociative-math
-
شرکتپذیری مجدد (re-association) عملوندها را در رشتهای از عملیات ممیز شناور مجاز میداند. این کار با احتمال تغییر نتیجهٔ محاسبات، استانداردهای زبان ISO C و C++ را نقض میکند. توجه: تغییر ترتیب ممکن است علامت صفر را تغییر دهد، مقادیر NaN را نادیده بگیرد، و سرریز منفی یا مثبت را مهار کرده یا ایجاد کند (و بنابراین نمیتوان آن را در کدهایی استفاده کرد که به رفتار گرد کردن متکی هستند، مانند "(x + 2**52) - 2**52"). همچنین ممکن است مقایسههای ممیز شناور را بازآرایی کند و بنابراین در مواردی که مقایسههای ترتیبی مورد نیاز است نباید استفاده شود. این گزینه نیازمند فعال بودن هر دو گزینهٔ -fno-signed-zeros و -fno-trapping-math است. علاوه بر این، همراه با -frounding-math چندان منطقی نخواهد بود. برای زبان Fortran، این گزینه زمانی که هر دو گزینهٔ -fno-signed-zeros و -fno-trapping-math برقرار باشند، بهطور خودکار فعال میشود. پیشفرض -fno-associative-math است. - -freciprocal-math
-
اجازه میدهد تا در صورت امکانپذیر شدن بهینهسازیها، به جای تقسیم بر یک مقدار از معکوس آن مقدار استفاده شود. برای نمونه، "x / y" میتواند با "x * (1/y)" جایگزین شود؛ این امر در صورتی که "(1/y)" مشمول حذف زیرعبارتهای مشترک شود مفید است. توجه داشته باشید که این کار دقت را کاهش داده و تعداد عملیاتهای ممیز شناور (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) ایجاد کنند. این تلهها شامل تقسیم بر صفر، سرریز مثبت، سرریز منفی، نتیجهٔ نادقیق و عملیات نامعتبر هستند. این گزینه مستلزم فعال بودن -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
-
کد را با این فرض کامپایل میکند که مقادیر signaling NaN در IEEE ممکن است در طول عملیات ممیز شناور، تلههای قابل مشاهده برای کاربر ایجاد کنند. فعال کردن این گزینه، بهینهسازیهایی را که ممکن است تعداد استثناهای قابل مشاهده با signaling NaN را تغییر دهند، غیرفعال میکند. این گزینه مستلزم -ftrapping-math است. این گزینه موجب تعریف ماکروی پیشپردازندهٔ "__SUPPORT_SNAN__" میشود. پیشفرض -fno-signaling-nans است. این گزینه آزمایشی است و در حال حاضر غیرفعال شدن تمام بهینهسازیهای GCC که بر رفتار signaling NaN اثر میگذارند را تضمین نمیکند. - -fno-fp-int-builtin-inexact
-
به توابع توکار (built-in) "ceil"، "floor"، "round" و "trunc"، و گونههای "float" و "long double" آنها اجازه نمیدهد کدی تولید کنند که برای آرگومانهای غیرصحیح، استثنای ممیز شناور «inexact» (نادقیق) را ایجاد نماید. استانداردهای ISO C99 و C11 به این توابع اجازه میدهند که استثنای «inexact» را فعال کنند، اما ISO/IEC TS 18661-1:2014 (انقیادهای C برای IEEE 754-2008) همانطور که در ISO C23 ادغام شده است، به این توابع چنین اجازهای نمیدهد. پیشفرض -ffp-int-builtin-inexact است که اجازهٔ ایجاد این استثنا را میدهد، مگر اینکه استاندارد C23 یا استاندارد C متأخرتری انتخاب شده باشد. این گزینه هیچ اثری ندارد مگر اینکه -ftrapping-math فعال باشد. حتی در صورت استفاده از -fno-fp-int-builtin-inexact، چنانچه توابع فراخوانی به یک تابع کتابخانهای تولید کنند، در صورتی که پیادهسازی کتابخانه از TS 18661 پیروی نکند، ممکن است استثنای «inexact» برانگیخته شود..IP -fsingle-precision-constant 4 در نظر گرفتن ثابتهای ممیز شناور با دقت یگانه (single precision) بهجای تبدیل ضمنی آنها به ثابتهای با دقت مضاعف (double precision).
- -fcx-limited-range
-
در صورت فعال بودن، این گزینه مشخص میکند که هنگام انجام تقسیم مختلط نیازی به مرحلهٔ کاهش بازه نیست. همچنین هیچ بررسیای مبنی بر اینکه آیا نتیجهٔ یک ضرب یا تقسیم مختلط "NaN + I*NaN" است یا خیر صورت نمیگیرد تا در این وضعیت تلاشی برای رفع آن انجام شود. پیشفرض -fno-cx-limited-range است، اما با -ffast-math فعال میشود. این گزینه تنظیم پیشفرض پراگمای "CX_LIMITED_RANGE" در استاندارد ISO C99 را کنترل میکند. با این حال، این گزینه برای همهٔ زبانها اعمال میشود.
- -fcx-fortran-rules
-
ضرب و تقسیم مختلط از قوانین Fortran پیروی میکنند. کاهش بازه بهعنوان بخشی از تقسیم مختلط انجام میشود، اما هیچ بررسیای صورت نمیگیرد که آیا نتیجهٔ ضرب یا تقسیم مختلط "NaN + I*NaN" است یا خیر تا در آن صورت تلاشی برای اصلاح وضعیت انجام پذیرد. پیشفرض -fno-cx-fortran-rules است.
گزینههای زیر بهینهسازیهایی را کنترل میکنند که ممکن است عملکرد را بهبود بخشند، اما توسط هیچیک از گزینههای -O فعال نمیشوند. این بخش شامل گزینههای آزمایشی است که ممکن است کدهای ناقص یا خراب تولید کنند.
- -fbranch-probabilities
-
پس از اجرای برنامهای که با -fprofile-arcs کامپایل شده است، میتوانید آن را بار دوم با استفاده از -fbranch-probabilities کامپایل کنید تا بهینهسازیها بر اساس تعداد دفعاتی که هر شاخه طی شده است، بهبود یابد. هنگامی که برنامهای که با -fprofile-arcs کامپایل شده خارج میشود، تعداد دفعات اجرای قوسها را در فایلی به نام sourcename.gcda برای هر فایل منبع ذخیره میکند. اطلاعات موجود در این فایل داده بسیار وابسته به ساختار کد تولید شده است، بنابراین باید برای هر دو کامپایل از کد منبع و گزینههای بهینهسازی یکسان استفاده کنید. برای جزئیات مربوط به نامگذاری فایل، -fprofile-arcs را ببینید. با -fbranch-probabilities، کامپایلر GCC یک یادداشت REG_BR_PROB روی هر JUMP_INSN و CALL_INSN قرار میدهد. اینها میتوانند برای بهبود بهینهسازی استفاده شوند. در حال حاضر، آنها فقط در یک نقطه استفاده میشوند: در reorg.cc، بهجای حدس زدن اینکه یک شاخه احتمالاً کدام مسیر را طی میکند، از مقادیر REG_BR_PROB برای تعیین دقیق مسیری که بیشتر طی میشود استفاده میشود. توسط -fprofile-use و -fauto-profile فعال میشود.
- -fprofile-values
-
در صورت ترکیب با -fprofile-arcs، کدهایی اضافه میکند تا دادههایی دربارهٔ مقادیر عبارتها در برنامه گردآوری شود. همراه با -fbranch-probabilities، دادههای گردآوریشده از پروفایلبندی مقادیر عبارتها را برای استفاده در بهینهسازیها بازخوانی میکند. توسط -fprofile-generate، -fprofile-use و -fauto-profile فعال میشود.
- -fprofile-reorder-functions
-
بازآرایی توابع بر اساس ابزار دقیق پروفایل (profile instrumentation)، اولین زمان اجرای یک تابع را ثبت کرده و این توابع را به ترتیب صعودی مرتب میکند، با این هدف که راهاندازی برنامه از طریق بارگذاری کارآمدتر بخشهای متن (text segments) بهینهسازی شود. با -fprofile-use فعال میشود.
- -fvpt
-
در صورت ترکیب با -fprofile-arcs، این گزینه به کامپایلر دستور میدهد کدی برای گردآوری اطلاعات دربارهٔ مقادیر عبارتها اضافه کند. همراه با -fbranch-probabilities، دادههای گردآوریشده را بازخوانی کرده و عملاً بهینهسازیها را بر اساس آنها انجام میدهد. در حال حاضر بهینهسازیها شامل تخصیصیافتگی عملیات تقسیم با استفاده از آگاهی از مقدار مخرج است. با -fprofile-use و -fauto-profile فعال میشود.
- -frename-registers
-
تلاش برای جلوگیری از وابستگیهای کاذب (false dependencies) در کدهای زمانبندیشده با استفاده از ثباتهای باقیمانده پس از تخصیص ثبات. این بهینهسازی بیشترین سود را برای پردازندههای دارای تعداد ثبات بالا دارد. با این حال، بسته به قالب اطلاعات اشکالزداییِ مورد استفاده توسط مقصد، ممکن است اشکالزدایی را غیرممکن کند، زیرا متغیرها دیگر در یک «ثبات مبنا» (home register) باقی نمیمانند. بهطور پیشفرض با -funroll-loops فعال میشود.
- -fschedule-fusion
-
یک گذر وابسته به معماری مقصد را روی جریان دستورالعملها انجام میدهد تا دستورالعملهای همنوع را در کنار یکدیگر زمانبندی کند؛ چرا که ماشین مقصد در صورت مجاورت این دستورالعملها در جریان اجرای دستور، میتواند آنها را با کارایی بیشتری اجرا کند. در سطوح -O2، -O3 و -Os فعال است.
- -ftracer
-
تکثیر دنباله (tail duplication) را برای افزایش اندازهٔ ابربلوک (superblock) انجام میدهد. این تبدیل، جریان کنترل تابع را ساده کرده و به دیگر بهینهسازیها اجازه میدهد کار خود را بهتر انجام دهند. توسط -fprofile-use و -fauto-profile فعال میشود.
- -funroll-loops
-
باز کردن (unroll) حلقههایی که تعداد تکرارهای آنها در زمان کامپایل یا هنگام ورود به حلقه قابل تعیین است. گزینهٔ -funroll-loops به معنای فعالسازی ضمنی -frerun-cse-after-loop، -fweb و -frename-registers است. همچنین لایهبرداری کامل حلقه (یعنی حذف کامل حلقههایی با تعداد تکرار ثابت و اندک) را روشن میکند. این گزینه حجم کد را بزرگتر میکند و ممکن است باعث اجرای سریعتر آن بشود یا نشود. توسط -fprofile-use و -fauto-profile فعال میشود.
- -funroll-all-loops
-
باز کردن تمام حلقهها، حتی اگر تعداد تکرارهای آنها هنگام ورود به حلقه نامشخص باشد. این کار معمولاً اجرای برنامهها را کندتر میکند. -funroll-all-loops مستلزم همان گزینههای همراه -funroll-loops است.
- -fpeel-loops
-
لایهبرداری (peel) از حلقههایی که طبق اطلاعات کافی (از بازخورد پروفایل یا تحلیل ایستا) مشخص شده است که زیاد تکرار نمیشوند. همچنین لایهبرداری کامل حلقه (یعنی حذف کامل حلقههایی با تعداد تکرار ثابت و کم) را فعال میکند. توسط -O3، -fprofile-use و -fauto-profile فعال میشود.
- -fmalloc-dce
-
کنترل میکند که آیا فراخوانی "malloc" (و گونههای آن مانند "calloc" یا "strdup") در صورت عدم نیاز قابل حذف شدن با بهینهسازی هستند یا خیر، مشروط بر اینکه مقدار بازگشتی آنها فقط بهعنوان آرگومان فراخوانی "free" استفاده شود یا با "NULL" مقایسه گردد. اگر از -fmalloc-dce=1 استفاده شود، فقط فراخوانیهای "free" مجاز هستند، در حالی که با -fmalloc-dce=2 مقایسهها با اشارهگر "NULL" نیز برای حذف ایمن در نظر گرفته میشوند. پیشفرض -fmalloc-dce=2 است. همچنین -fallocation-dce را ببینید.
- -fmove-loop-invariants
-
گذر انتقال نامتغیرهای حلقه را در بهینهساز حلقهٔ RTL فعال میکند. در سطح -O1 و بالاتر، بهجز -Og فعال است.
- -fmove-loop-stores
-
گذر انتقال ذخیرههای حلقه را در بهینهساز حلقهٔ GIMPLE فعال میکند. این کار ذخیرهسازیهای نامتغیر را به بعد از پایان حلقه منتقل میکند و در ازای آن، مقدار ذخیرهشده را در طول تکرارها در یک ثبات حمل میکند. توجه داشته باشید که برای اعمال این گزینه، -ftree-loop-im نیز باید فعال باشد. در سطح -O1 و بالاتر، بهجز -Og فعال است.
- -fsplit-loops
-
تقسیم یک حلقه به دو بخش، در صورتی که حاوی شرطی باشد که همواره برای یک سمت از فضای تکرار درست ('true') و برای سمت دیگر نادرست است. توسط -fprofile-use و -fauto-profile فعال میشود. - -funswitch-loops
-
انتقال شاخههای دارای شروط نامتغیر حلقه به خارج از حلقه، به همراه ایجاد نسخههای المثنی از حلقه در هر دو شاخه (که بر اساس نتیجهٔ شرط دستکاری شدهاند). توسط -fprofile-use و -fauto-profile فعال میشود.
- -fversion-loops-for-strides
-
اگر یک حلقه روی آرایهای با گام (stride) متغیر تکرار شود، نسخهٔ دیگری از حلقه ایجاد میکند که فرض میکند گام همیشه یک است. برای مثال: for (int i = 0; i < n; ++i) x[i * stride] = ...;تبدیل میشود به:
if (stride == 1) for (int i = 0; i < n; ++i) x[i] = ...; else for (int i = 0; i < n; ++i) x[i * stride] = ...;این گزینه بهویژه برای آرایههای assumed-shape در Fortran کاربرد دارد، جایی که (برای مثال) برداریسازی (vectorization) بهتری را با فرض دسترسیهای متوالی ممکن میسازد. این پرچم بهطور پیشفرض در -O3 فعال است. همچنین توسط -fprofile-use و -fauto-profile فعال میشود.
- -ffunction-sections
- -fdata-sections
- قرار دادن
هر تابع یا
داده در بخش
(section) اختصاصی
خود در فایل
خروجی، در
صورتی که
مقصد از
بخشهای
دلخواه
پشتیبانی
کند. نام
تابع یا نام
داده،
تعیینکنندهٔ
نام بخش در
فایل خروجی
خواهد بود.
از این گزینهها روی سیستمهایی استفاده کنید که پیونددهنده (linker) در آنها میتواند بهینهسازیهایی را برای بهبود محلیسازی مراجعات در فضای دستورالعمل انجام دهد. اکثر سیستمهایی که از قالب شیء ELF استفاده میکنند پیونددهندههایی با چنین بهینهسازیهایی دارند. در AIX، پیونددهنده بخشها (CSECTها) را بر اساس گراف فراخوانی بازآرایی میکند. تأثیر آن بر کارایی متغیر است.
این گزینهها همراه با جمعآوری زبالهٔ پیونددهنده (گزینهٔ --gc-sections پیونددهنده) ممکن است به فایلهای اجرایی پیوندایستای کوچکتر (پس از strip کردن) منجر شوند.
در سیستمهای ELF/DWARF، این گزینهها کیفیت اطلاعات اشکالزدایی را کاهش نمیدهند. البته ممکن است با سایر قالبهای فایل شیء یا اطلاعات اشکالزدایی مشکلاتی به وجود آید.
فقط زمانی از این گزینهها استفاده کنید که مزایای قابل توجهی به همراه داشته باشند. وقتی این گزینهها را مشخص میکنید، اسمبلر و پیونددهنده فایلهای شیء و اجرایی بزرگتری ایجاد کرده و کندتر نیز عمل میکنند. این گزینهها بر تولید کد تأثیر میگذارند. آنها از بهینهسازیهای کامپایلر و اسمبلر با استفاده از موقعیتهای نسبی داخل یک واحد ترجمه جلوگیری میکنند، زیرا موقعیتها تا زمان پیوند ناشناخته باقی میمانند. نمونهای از این بهینهسازیها، تبدیل فراخوانیها (relaxation) به دستورالعملهای فراخوانی کوتاه است..IP -fstdarg-opt 4 پیشدرآمد (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
در هنگام
بازگشت از
تابع به
منظور
افزایش
امنیت
برنامه، از
طریق کاهش
حملات
برنامهنویسی
مبتنی بر
بازگشت (ROP) یا
جلوگیری از
نشت
اطلاعات از
طریق
ثباتها.
مقادیر ممکن برای choice همانند مقادیر مشخصهٔ "zero_call_used_regs" است. پیشفرض skip است.
میتوانید با استفاده از مشخصهٔ تابع "zero_call_used_regs"، این رفتار را برای یک تابع خاص کنترل کنید.
- --param name=value
- در برخی
بخشها، GCC
از
ثابتهای
گوناگونی
برای کنترل
میزان
بهینهسازی
انجامشده
استفاده
میکند.
برای
نمونه، GCC
توابعی را
که بیش از
تعداد
مشخصی
دستورالعمل
دارند
درونیسازی
(inline) نمیکند.
میتوانید
برخی از این
ثابتها را
در خط فرمان
با استفاده
از گزینهٔ
--param کنترل
کنید.
نامهای پارامترهای مشخص و مفهوم مقادیر آنها وابسته به ساختار درونی کامپایلر است و ممکن است بدون اطلاع قبلی در نسخههای آینده تغییر کنند.
برای دریافت مقادیر کمینه، بیشینه و پیشفرض یک پارامتر، از گزینههای --help=param -Q استفاده کنید.
در هر مورد، value یک عدد صحیح است. مقادیر زیر برای name در تمام معماریهای مقصد شناختهشده هستند:
- phiopt-factor-max-stmts-live
- هنگام فاکتورگیری دستورها از ساختار if/then/else، این پارامتر بیشینهٔ تعداد دستورهای پس از دستور تعریفکننده است که مجازند طول عمر یک نام را افزایش دهند.
- predictable-branch-outcome
- هنگامی که پیشبینی میشود یک انشعاب با احتمالی کمتر از این آستانه (به درصد) پیموده شود، آنگاه به عنوان انشعابی با پیشبینیپذیری بالا در نظر گرفته میشود.
- max-rtl-if-conversion-insns
- تبدیل شرطی در RTL سعی میکند انشعابهای شرطی اطراف یک بلوک را حذف کرده و آنها را با دستورهای مشروط جایگزین کند. این پارامتر بیشینهٔ تعداد دستورهای درون یک بلوک را که باید برای تبدیل شرطی (if-conversion) در نظر گرفته شوند تعیین میکند. کامپایلر همچنین از قواعد اکتشافی (heuristics) دیگری برای تصمیمگیری دربارهٔ سودمند بودن تبدیل شرطی استفاده خواهد کرد.
- file-cache-files
- بیشینهٔ تعداد فایلها در حافظهٔ موقت فایل (file cache). حافظهٔ موقت فایل برای چاپ خطوط کد منبع در پیامهای تشخیصی و انجام برخی بررسیهای منبع مانند -Wmisleading-indentation استفاده میشود.
- file-cache-lines
- بیشینهٔ تعداد خطوط برای نمایهسازی در حافظهٔ موقت فایل. هنگامی که مقدار 0 باشد، اندازه به صورت خودکار تعیین میشود. حافظهٔ موقت فایل برای چاپ خطوط منبع در پیامهای تشخیصی و انجام برخی بررسیهای منبع مانند -Wmisleading-indentation استفاده میشود.
- max-rtl-if-conversion-predictable-cost
- تبدیل شرطی در RTL تلاش خواهد کرد انشعابهای شرطی اطراف یک بلوک را حذف کرده و آنها را با دستورهای مشروط جایگزین نماید. این پارامترها بیشینهٔ هزینهٔ مجاز برای توالی تولیدشده توسط if-conversion را بسته به اینکه آیا انشعاب به صورت ایستا قابل پیشبینی تشخیص داده شده است یا خیر، تعیین میکنند. واحد این پارامتر همانند مقیاس داخلی seq_cost در GCC است. کامپایلر تلاش خواهد کرد با استفاده از ماکروی مقصد BRANCH_COST یک مقدار پیشفرض معقول برای این پارامتر ارائه دهد.
- max-crossjump-edges
- بیشینهٔ تعداد یالهای ورودی برای بررسی جهت cross-jumping. الگوریتم مورداستفاده توسط -fcrossjumping بر حسب تعداد یالهای ورودی به هر بلوک از مرتبهٔ O(N^2) است. افزایش مقادیر به معنای بهینهسازی تهاجمیتر است که زمان کامپایل را با بهبود احتمالاً اندکی در اندازهٔ فایل اجرایی افزایش میدهد.
- min-crossjump-insns
- کمینهٔ تعداد دستورهایی که باید در انتهای دو بلوک یکسان باشند تا cross-jumping روی آنها انجام شود. در صورتی که تمام دستورهای موجود در بلوکی که پرش متقاطع از آن انجام میشود یکسان باشند، این مقدار نادیده گرفته میشود.
- max-grow-copy-bb-insns
- بیشینهٔ ضریب افزایش اندازهٔ کد هنگام رونوشتبرداری از بلوکهای پایهای (basic blocks) به جای پرش. این افزایش نسبت به یک دستور پرش سنجیده میشود.
- max-goto-duplication-insns
- بیشینهٔ تعداد دستورالعملها برای تکثیر در بلوکی که به یک goto محاسبهشده پرش میکند. برای جلوگیری از رفتار O(N^2) در چندین گذر کامپایل، GCC دستورهای پرش محاسبهشده را در مراحل اولیهٔ فرایند کامپایل فاکتورگیری کرده و در دیرترین زمان ممکن آنها را از حالت فاکتور خارج میکند (unfactor). تنها پرشهای محاسبهشده در انتهای بلوکهای پایهای که بیش از max-goto-duplication-insns دستور نداشته باشند از حالت فاکتور خارج میشوند.
- max-delay-slot-insn-search
- بیشینهٔ تعداد دستوراتی که هنگام جستوجو برای یافتن یک دستور جهت پر کردن شکاف تأخیر (delay slot) بررسی میشوند. اگر بیش از این مقدار اختیاری از دستورها جستوجو شود، صرفهجویی زمانی حاصل از پر کردن شکاف تأخیر بسیار ناچیز خواهد بود، بنابراین جستوجو متوقف میشود. افزایش مقادیر به معنای بهینهسازی تهاجمیتر است که زمان کامپایل را با بهبود احتمالاً اندک در زمان اجرا افزایش میدهد.
- max-delay-slot-live-search
- هنگام تلاش برای پر کردن delay slot، بیشینهٔ تعداد دستورهایی که هنگام جستوجو برای یک بلوک با اطلاعات معتبر ثباتهای فعال (live register) بررسی میشوند. افزایش این مقدار اختیاری به معنای بهینهسازی تهاجمیتر و در نتیجه افزایش زمان کامپایل است. این پارامتر زمانی که کد delay slot برای حفظ گراف جریان کنترل (control-flow graph) بازنویسی شود باید حذف گردد.
- max-gcse-memory
- بیشینهٔ تقریبی حافظه به "kB" که میتواند برای انجام بهینهسازی حذف زیرعبارتهای مشترک سراسری (GCSE) تخصیص یابد. اگر حافظهای بیشتر از مقدار مشخصشده مورد نیاز باشد، بهینهسازی انجام نمیشود.
- max-gcse-insertion-ratio
- اگر نسبت عبارات درجشده به حذفشده برای هر عبارتی بزرگتر از این مقدار باشد، آنگاه RTL PRE عبارت را درج یا حذف میکند و در نتیجه محاسبات تا حدی تکراری را در جریان دستورالعملها باقی میگذارد.
- max-pending-list-length
- بیشینهٔ تعداد وابستگیهای معوق که زمانبندی قبل از تخلیهٔ وضعیت جاری و شروع دوباره مجاز میداند. توابع بزرگ با انشعابها یا فراخوانیهای اندک میتوانند فهرستهای بسیار بزرگی ایجاد کنند که منابع و حافظه را بیدلیل مصرف مینمایند.
- max-modulo-backtrack-attempts
- بیشینهٔ تعداد دفعات پسگرد (backtrack) که زمانبند هنگام زمانبندی پیمانهای (modulo scheduling) یک حلقه باید انجام دهد. مقادیر بزرگتر میتوانند زمان کامپایل را به صورت نمایی افزایش دهند.
- max-inline-functions-called-once-loop-depth
- بیشینهٔ عمق حلقه برای یک فراخوانی که توسط قواعد اکتشافی درونیسازی (که تلاش میکند تمام توابعِ تنها یکبار فراخوانیشده را درونخطی کند) بررسی میشود.
- max-inline-functions-called-once-insns
- بیشینهٔ اندازهٔ تخمینی توابع تولیدشده هنگام درونیسازی توابعی که تنها یکبار فراخوانی شدهاند.
- max-inline-insns-single
- چندین پارامتر، درونیساز درختی (tree inliner) مورداستفاده در GCC را کنترل میکنند. این عدد، بیشینهٔ تعداد دستورات (شمارششده در نمایش درونی GCC) در یک تکتابع را که درونیساز درخت برای درونخطی کردن در نظر میگیرد، تعیین میکند. این پارامتر تنها بر توابعی که با inline اعلان شدهاند و متدهایی که در اعلان کلاس پیادهسازی شدهاند (C++) اثر میگذارد.
- max-inline-insns-auto
- هنگامی که از -finline-functions (گنجاندهشده در -O3) استفاده میکنید، توابع فراوانی که در غیر این صورت توسط کامپایلر برای درونیسازی در نظر گرفته نمیشدند، بررسی میشوند. برای آن توابع، میتوان حد متفاوتی (محدودکنندهتر) در مقایسه با توابع اعلانشده با inline اعمال کرد (--param max-inline-insns-auto).
- max-inline-insns-small
- این حدِ اعمالشده برای فراخوانیهایی است که با -finline-small-functions مرتبط در نظر گرفته میشوند.
- max-inline-insns-size
- این حدِ اعمالشده برای فراخوانیهایی است که برای اندازه بهینهسازی شدهاند. ممکن است افزایش اندک در اندازه به منظور بهرهگیری از فرصتهای بهینهسازی ناشی از درونیسازی مطلوب باشد.
- uninlined-function-insns
- تعداد دستورهایی که درونیساز برای سربار تابع مانند پیشدرآمد (prologue) و پسدرآمد (epilogue) تابع در نظر میگیرد.
- uninlined-function-time
- زمان اضافی در نظر گرفتهشده توسط درونیساز برای سربار تابع، مانند زمان مورد نیاز برای اجرای پیشدرآمد و پسدرآمد تابع.
- inline-heuristics-hint-percent
- مقیاس (به درصد) اعمالشده به inline-insns-single، inline-insns-single-O2 و inline-insns-auto هنگامی که قواعد اکتشافی درونیسازی نشان میدهند که درونیسازی بسیار سودمند است (بهینهسازیهای بعدی را ممکن میسازد)..IP uninlined-thunk-insns 4
- uninlined-thunk-time
- مشابه --param uninlined-function-insns و --param uninlined-function-time، اما برای thunkهای تابع اعمال میشود.
- inline-min-speedup
- هنگامی که بهبود تخمینی کارایی زمان اجرای فراخواننده (caller) + فراخواندهشده (callee) از این آستانه (به درصد) فراتر رود، تابع میتواند بدون در نظر گرفتن محدودیت روی --param max-inline-insns-single و --param max-inline-insns-auto درونخطی شود.
- large-function-insns
- حد تعیینکنندهٔ توابع بسیار بزرگ. برای توابعی که پس از درونخطیسازی بزرگتر از این حد باشند، درونخطیسازی توسط --param large-function-growth محدود میشود. این پارامتر عمدتاً برای جلوگیری از زمان کامپایل بیش از حد ناشی از الگوریتمهای غیرخطی استفادهشده در بخش پشتی (back end) مفید است.
- large-function-growth
- حداکثر رشد توابع بزرگ ناشی از درونخطیسازی را به درصد مشخص میکند. برای مثال، مقدار پارامتر 100 رشد تابع بزرگ را به 2.0 برابر اندازهٔ اصلی محدود میکند.
- large-unit-insns
- حد تعیینکنندهٔ واحد ترجمهٔ بزرگ. رشد ناشی از درونخطیسازی واحدهای بزرگتر از این حد توسط --param inline-unit-growth محدود میشود. برای واحدهای کوچک ممکن است این محدودیت بیش از حد سختگیرانه باشد. برای مثال، واحدی متشکل از تابع A که inline است و B که فقط A را سه بار فراخوانی میکند در نظر بگیرید. اگر B نسبت به A کوچک باشد، رشد واحد 300\% خواهد بود و با این حال چنین درونخطیسازی کاملاً منطقی است. با این حال، برای واحدهای بسیار بزرگِ متشکل از توابع کوچک قابل درونخطی، محدودیت کلی رشد واحد برای جلوگیری از انفجار نمایی اندازهٔ کد لازم است. بنابراین برای واحدهای کوچکتر، پیش از اعمال --param inline-unit-growth، اندازه به --param large-unit-insns افزایش داده میشود.
- lazy-modules
- حداکثر تعداد فایلهای ماژول C++ که هنگام بارگذاری تنبلانه میتوانند بهطور همزمان باز باشند.
- inline-unit-growth
- حداکثر رشد کلی واحد کامپایل ناشی از درونخطیسازی را مشخص میکند. برای مثال، مقدار پارامتر 20 رشد واحد را به 1.2 برابر اندازهٔ اصلی محدود میکند. توابع سرد (چه با یک صفت مشخص شده باشند و چه با بازخورد پروفایل) در اندازهٔ واحد به حساب نمیآیند.
- ipa-cp-unit-growth
- حداکثر رشد کلی واحد کامپایل ناشی از انتشار سراسری ثوابت بین رویهها (interprocedural constant propagation) را مشخص میکند. برای مثال، مقدار پارامتر 10 رشد واحد را به 1.1 برابر اندازهٔ اصلی محدود میکند.
- ipa-cp-large-unit-insns
- اندازهای از واحد ترجمه که گذر IPA-CP آن را بزرگ در نظر میگیرد.
- large-stack-frame
- حد تعیینکنندهٔ فریمهای پشتهٔ بزرگ. هنگام درونخطیسازی، الگوریتم تلاش میکند فراتر از این حد رشد چندانی نداشته باشد.
- large-stack-frame-growth
- حداکثر رشد فریمهای پشتهٔ بزرگ ناشی از درونخطیسازی را به درصد مشخص میکند. برای مثال، مقدار پارامتر 1000 رشد فریم پشتهٔ بزرگ را به 11 برابر اندازهٔ اصلی محدود میکند.
- max-inline-insns-recursive
- max-inline-insns-recursive-auto
- حداکثر
تعداد
دستورالعملهایی
را مشخص
میکند که
یک نسخهٔ
خارج از خط
(out-of-line) از یک
تابع
درونخطی
خود-بازگشتی
با انجام
درونخطیسازی
بازگشتی
میتواند
به آن رشد
کند.
--param max-inline-insns-recursive برای توابعی که با عنوان inline تعریف شدهاند اعمال میشود. برای توابعی که با عنوان inline تعریف نشدهاند، درونخطیسازی بازگشتی تنها در صورتی اتفاق میافتد که -finline-functions (گنجاندهشده در -O3) فعال باشد؛ در این صورت بهجای آن --param max-inline-insns-recursive-auto اعمال میشود.
- max-inline-recursive-depth
- max-inline-recursive-depth-auto
- حداکثر عمق
بازگشت
مورد
استفاده
برای
درونخطیسازی
بازگشتی را
مشخص
میکند.
--param max-inline-recursive-depth برای توابعی که با عنوان inline تعریف شدهاند اعمال میشود. برای توابعی که با عنوان inline تعریف نشدهاند، درونخطیسازی بازگشتی تنها زمانی اتفاق میافتد که -finline-functions (گنجاندهشده در -O3) فعال باشد؛ در این صورت بهجای آن --param max-inline-recursive-depth-auto اعمال میشود.
- min-inline-recursive-probability
- درونخطیسازی
بازگشتی
تنها برای
توابعی
سودمند است
که بهطور
میانگین
دارای
بازگشت
عمیق
هستند، و با
افزایش
اندازهٔ
مقدمه (prologue) یا
پیچیدگی
بدنهٔ تابع
برای سایر
بهینهسازها،
میتواند
به توابعی
که عمق
بازگشت کمی
دارند آسیب
برساند.
هنگامی که بازخورد پروفایل در دسترس است (به -fprofile-generate مراجعه کنید)، عمق واقعی بازگشت را میتوان از روی احتمال بازگشت تابع از طریق یک عبارت فراخوانیِ مشخص تخمین زد. این پارامتر، درونخطیسازی را فقط به عبارات فراخوانی که احتمال آنها از آستانهٔ مشخصشده (به درصد) فراتر رود محدود میکند.
- early-inlining-insns
- رشدی را مشخص میکند که درونخطساز اولیه (early inliner) میتواند ایجاد کند. در عمل، این پارامتر میزان درونخطیسازی را برای کدهایی با جریمهٔ تجرید (abstraction penalty) بالا افزایش میدهد.
- max-early-inliner-iterations
- محدودیت تعداد تکرارهای درونخطساز اولیه. این پارامتر اساساً تعداد فراخوانیهای غیرمستقیم تو در تویی را که درونخطساز اولیه میتواند حلوفصل کند محدود میسازد. زنجیرههای عمیقتر همچنان توسط درونخطیسازی متأخر (late inlining) پردازش میشوند.
- comdat-sharing-probability
- احتمال (به درصد) اینکه توابع درونخطی C++ با سطح دید comdat بین چندین واحد کامپایل به اشتراک گذاشته شوند.
- modref-max-bases
- modref-max-refs
- modref-max-accesses
- حداکثر تعداد اشارهگرهای پایه، ارجاعها و دسترسیهای ذخیرهشده برای یک تابع منفرد را توسط تحلیل mod/ref مشخص میکند.
- modref-max-tests
- حداکثر تعداد آزمونهایی را مشخص میکند که alias oracle میتواند برای رفع ابهام مکانهای حافظه با استفاده از اطلاعات mod/ref انجام دهد. این پارامتر باید از --param modref-max-bases و --param modref-max-refs بزرگتر باشد.
- modref-max-depth
- حداکثر عمق پیمایش DFS مورد استفاده توسط تحلیل فرار modref را مشخص میکند. تنظیم آن روی 0 این تحلیل را بهطور کامل غیرفعال میکند.
- modref-max-escape-points
- حداکثر تعداد نقاط فرار ردیابیشده توسط modref را به ازای هر SSA-name مشخص میکند.
- modref-max-adjustments
- حداکثر دفعاتی را مشخص میکند که بازهٔ دسترسی در طول تحلیل جریان دادهٔ modref گسترش مییابد.
- profile-func-internal-id
- پارامتری برای کنترل اینکه آیا از شناسهٔ داخلی تابع در جستجوی پایگاه دادهٔ پروفایل استفاده شود یا خیر. اگر این مقدار 0 باشد، کامپایلر از شناسهای استفاده میکند که بر اساس نام اسمبلی تابع و نام فایل است، که باعث میشود دادههای پروفایل قدیمی در برابر تغییرات کد منبع نظیر تغییر ترتیب توابع و غیره تحملپذیرتر باشند.
- min-vect-loop-bound
- حداقل تعداد تکرارهایی که در صورت کمتر بودن از آن، حلقهها هنگام استفاده از -ftree-vectorize برداریسازی نمیشوند. برای مجاز بودن برداریسازی، تعداد تکرارها پس از برداریسازی باید بزرگتر از مقدار مشخصشده توسط این گزینه باشد.
- gcse-cost-distance-ratio
- ضریب مقیاس در محاسبهٔ حداکثر فاصلهای که یک عبارت میتواند توسط بهینهسازیهای GCSE جابهجا شود. این پارامتر در حال حاضر فقط در گذر بالا کشیدن کد (code hoisting) پشتیبانی میشود. هرچه نسبت بزرگتر باشد، بالا کشیدن کد برای عبارات ساده (یعنی عباراتی که هزینهٔ آنها کمتر از gcse-unrestricted-cost است) تهاجمیتر خواهد بود. مشخص کردن 0، بالا کشیدن عبارات ساده را غیرفعال میکند.
- gcse-unrestricted-cost
- هزینهای (تقریباً معادل با هزینهٔ یک دستورالعمل ماشین معمول)، که در آن بهینهسازیهای GCSE فاصلهای را که یک عبارت میتواند طی کند محدود نمیکنند. این پارامتر در حال حاضر فقط در گذر بالا کشیدن کد پشتیبانی میشود. هرچه هزینه کمتر باشد، بالا کشیدن کد تهاجمیتر است. مشخص کردن 0 به تمام عبارات اجازه میدهد تا فواصل نامحدود را طی کنند.
- max-hoist-depth
- عمق جستجو در درخت تسلط (dominator tree) برای یافتن عبارات جهت بالا کشیدن. این پارامتر برای جلوگیری از رفتار درجه دوم در الگوریتم بالا کشیدن استفاده میشود. مقدار 0 جستجو را محدود نمیکند، اما ممکن است کامپایل توابع بسیار بزرگ را کُند کند.
- max-tail-merge-comparisons
- حداکثر تعداد بلوکهای پایهای (bb) مشابه جهت مقایسهٔ یک bb با آنها. این پارامتر برای جلوگیری از رفتار درجه دوم در ادغام دنبالهٔ درخت (tree tail merging) استفاده میشود.
- max-tail-merge-iterations
- حداکثر تعداد تکرارهای گذر روی تابع. این پارامتر برای محدود کردن زمان کامپایل در ادغام دنبالهٔ درخت استفاده میشود.
- store-merging-allow-unaligned
- در صورت مجاز بودن، به گذر ادغام ذخیرهسازی اجازه میدهد تا ذخیرهسازیهای غیرهمتراز (unaligned) ایجاد کند.
- max-stores-to-merge
- حداکثر تعداد ذخیرهسازیهایی که گذر ادغام ذخیرهسازی تلاش میکند آنها را در ذخیرهسازیهای عریضتر ادغام کند.
- max-store-chains-to-track
- حداکثر تعداد زنجیرههای ذخیرهسازی که بهطور همزمان هنگام تلاش برای ادغام آنها در ذخیرهسازیهای عریضتر در گذر ادغام ذخیرهسازی ردیابی میشوند.
- max-stores-to-track
- حداکثر تعداد ذخیرهسازیهایی که بهطور همزمان هنگام تلاش برای ادغام آنها در ذخیرهسازیهای عریضتر در گذر ادغام ذخیرهسازی ردیابی میشوند..IP max-unrolled-insns 4 حداکثر تعداد دستورالعملهایی که یک حلقه میتواند داشته باشد تا باز (unroll) شود. اگر حلقهای باز شود، این پارامتر همچنین تعیین میکند که کد حلقه چند بار باز شود.
- max-average-unrolled-insns
- حداکثر تعداد دستورالعملها، وزندهیشده بر اساس احتمال اجرای آنها، که یک حلقه میتواند داشته باشد تا باز شود. اگر حلقهای باز شود، این پارامتر همچنین تعیین میکند که کد حلقه چند بار باز شود.
- max-unroll-times
- حداکثر تعداد دفعات باز کردن (unrolling) یک حلقه منفرد.
- max-peeled-insns
- حداکثر تعداد دستورالعملهایی که یک حلقه میتواند داشته باشد تا پوستهکنی (peel) شود. اگر حلقهای پوستهکنی شود، این پارامتر همچنین تعیین میکند که کد حلقه چند بار پوستهکنی شود.
- max-peel-times
- حداکثر دفعات پوستهکنی (peeling) یک حلقه منفرد.
- max-peel-branches
- حداکثر تعداد شاخهها در مسیر داغ (hot path) در سرتاسر توالی پوستهکنیشده.
- max-completely-peeled-insns
- حداکثر تعداد دستورالعملهای (insns) یک حلقه که بهطور کامل پوستهکنی میشود.
- max-completely-peel-times
- حداکثر تعداد تکرارهای یک حلقه برای اینکه جهت پوستهکنی کامل مناسب باشد.
- max-completely-peel-loop-nest-depth
- حداکثر عمق یک آشیانه حلقه (loop nest) مناسب برای پوستهکنی کامل.
- max-unswitch-insns
- حداکثر تعداد دستورالعملهای یک حلقه در بهینهسازی unswitch.
- max-unswitch-depth
- حداکثر عمق یک آشیانه حلقه برای اعمال unswitch.
- lim-expensive
- حداقل هزینه یک عبارت پرهزینه در انتقال عبارات نامتغیر حلقه (loop invariant motion یا LIM).
- min-loop-cond-split-prob
- هنگامی که اطلاعات پروفایل FDO در دسترس است، min-loop-cond-split-prob حداقل آستانه احتمال دستور شرطی نیمهنامتغیر را جهت آغاز تفکیک حلقه (loop split) مشخص میکند.
- iv-consider-all-candidates-bound
- حد آستانه تعداد نامزدها برای متغیرهای القایی (induction variables یا IV) که پایینتر از آن، همه نامزدها برای هر مورد استفاده در بهینهسازیهای متغیر القایی در نظر گرفته میشوند. اگر تعداد نامزدها بیشتر از این مقدار باشد، تنها مرتبطترین آنها بررسی میشوند تا از پیچیدگی زمانی درجهدوم جلوگیری شود.
- iv-max-considered-uses
- بهینهسازیهای متغیر القایی از پردازش حلقههایی که تعداد استفاده از متغیر القایی بیشتری در آنها وجود دارد صرفنظر میکنند.
- iv-always-prune-cand-set-bound
- اگر تعداد نامزدها در مجموعه کمتر از این مقدار باشد، هنگام افزودن یک مورد جدید، همیشه تلاش میشود تا ivهای غیرضروری از مجموعه حذف (هرس) شوند.
- avg-loop-niter
- میانگین تعداد تکرارهای یک حلقه.
- dse-max-object-size
- حداکثر اندازه (به بایت) اشیائی که بایتبهبایت توسط حذف ذخیرهسازیهای مرده (dead store elimination) ردیابی میشوند. مقادیر بزرگتر ممکن است زمان کامپایل را افزایش دهند.
- dse-max-alias-queries-per-store
- حداکثر تعداد پرسوجوها از اوراکل نام مستعار (alias oracle) به ازای هر ذخیرهسازی. مقادیر بزرگتر منجر به طولانیتر شدن زمان کامپایل شده و ممکن است باعث حذف بیشتر ذخیرهسازیهای مرده شود.
- scev-max-expr-size
- حد اندازه عبارات مورداستفاده در تحلیلگر تکاملهای اسکالر (scalar evolutions analyzer). عبارات بزرگ سرعت تحلیلگر را کاهش میدهند.
- scev-max-expr-complexity
- حد پیچیدگی عبارات در تحلیلگر تکاملهای اسکالر. عبارات پیچیده سرعت تحلیلگر را کاهش میدهند.
- max-tree-if-conversion-phi-args
- حداکثر تعداد آرگومانها در یک PHI که توسط تبدیل شرطی درخت (TREE if conversion) پشتیبانی میشود، مگر اینکه حلقه با عملیافت simd نشانهگذاری شده باشد.
- vect-max-layout-candidates
- حداکثر تعداد چیدمانهای برداری ممکن (مانند جایگشتها) که هنگام بهینهسازی کدی که باید برداریسازی شود در نظر گرفته میشوند.
- vect-max-version-for-alignment-checks
- حداکثر تعداد بررسیهای زمان اجرا که هنگام نسخهبندی حلقه برای ترازسازی در برداریساز میتوان انجام داد.
- vect-max-version-for-alias-checks
- حداکثر تعداد بررسیهای زمان اجرا که هنگام نسخهبندی حلقه برای نامهای مستعار در برداریساز میتوان انجام داد.
- vect-max-peeling-for-alignment
- حداکثر تعداد پوستهکنیهای حلقه برای ارتقای ترازسازی دسترسی در برداریساز. مقدار -1 به معنای نبود محدودیت است.
- max-iterations-to-track
- حداکثر تعداد تکرارهای یک حلقه که الگوریتم جامع (brute-force) برای تحلیل تعداد تکرارهای حلقه سعی در ارزیابی آن دارد.
- hot-bb-count-fraction
- مخرج n از کسر 1/n حداکثر تعداد دفعات اجرای یک بلوک پایهای در کل برنامه که یک بلوک پایهای باید حداقل آن را داشته باشد تا داغ (hot) در نظر گرفته شود. مقدار پیشفرض 10000 است، به این معنی که یک بلوک پایهای در صورتی داغ در نظر گرفته میشود که تعداد دفعات اجرای آن بیشتر از 1/10000 حداکثر تعداد دفعات اجرا باشد. مقدار 0 بدان معناست که هیچگاه داغ در نظر گرفته نمیشود. در حالت غیر LTO استفاده میشود.
- hot-bb-count-ws-permille
- تعداد در هزار (پرمیل) بیشترین اجرا شده، بین 0 تا 1000، از اجرای پروفایلشده کل برنامه که تعداد دفعات اجرای یک بلوک پایهای باید بخشی از آن باشد تا داغ محسوب شود. مقدار پیشفرض 990 است، به این معنی که یک بلوک پایهای در صورتی داغ در نظر گرفته میشود که تعداد اجرای آن در 990 در هزار بالایی، یا 99.0٪ از اجرای پروفایلشده کل برنامه سهیم باشد. مقدار 0 یعنی هرگز داغ محسوب نمیشود. در حالت LTO استفاده میشود.
- hot-bb-frequency-fraction
- مخرج n از کسر 1/n بسامد اجرای بلوک ورودی یک تابع که یک بلوک پایهای از این تابع باید حداقل آن را داشته باشد تا داغ در نظر گرفته شود. مقدار پیشفرض 1000 است، به این معنی که یک بلوک پایهای در یک تابع در صورتی داغ محسوب میشود که بسامد اجرای آن بیشتر از 1/1000 بسامد بلوک ورودی تابع باشد. مقدار 0 به معنای آن است که هرگز داغ محسوب نمیشود.
- unlikely-bb-count-fraction
- مخرج n از کسر 1/n تعداد دفعات اجرای پروفایلشده کل برنامه که تعداد دفعات اجرای یک بلوک پایهای باید کمتر از آن باشد تا اجرای آن بلوک بعید (unlikely executed) در نظر گرفته شود. مقدار پیشفرض 20 است، یعنی یک بلوک پایهای در صورتی کماحتمال برای اجرا تلقی میشود که در کمتر از 1/20، یا 5٪ از اجراهای برنامه، اجرا شده باشد. مقدار 0 به این معناست که اجرای آن همیشه بعید در نظر گرفته میشود.
- max-predicted-iterations
- حداکثر تعداد تکرارهای حلقه که بهصورت ایستا پیشبینی میکنیم. این پارامتر در مواردی مفید است که یک تابع شامل یک حلقه با کران مشخص و حلقه دیگری با کران نامشخص باشد. تعداد تکرارهای مشخص بهدرستی پیشبینی میشود، در حالی که میانگین تعداد تکرارهای نامشخص تقریباً 10 تخمین زده میشود. این امر باعث میشود حلقهای که کران نامشخص دارد در مقایسه با دیگری بهطور کاذب سرد به نظر برسد.
- builtin-expect-probability
- احتمال اینکه عبارت مقدار مشخصشده را داشته باشد کنترل میکند. این پارامتر یک مقدار درصدی (یعنی بین 0 تا 100) را به عنوان ورودی دریافت میکند.
- builtin-string-cmp-inline-length
- حداکثر طول یک رشته ثابت برای یک فراخوانی مقایسه رشته درونی (builtin string cmp) که واجد شرایط درونخطیسازی (inlining) است.
- align-threshold
- کسری از حداکثر بسامد اجراهای یک بلوک پایهای در یک تابع را جهت تراز کردن (align) بلوک پایهای انتخاب میکند.
- align-loop-iterations
- حلقهای که انتظار میرود حداقل به تعداد مشخصشده تکرار شود، تراز میشود.
- tracer-dynamic-coverage
- tracer-dynamic-coverage-feedback
- این مقدار
برای محدود
کردن تشکیل
سوپربلوک
(superblock) پس از
پوشش درصد
مشخصی از
دستورالعملهای
اجراشده
استفاده
میشود. این
کار از
افزایش
غیرضروری
اندازه کد
جلوگیری
میکند.
پارامتر tracer-dynamic-coverage-feedback فقط زمانی استفاده میشود که بازخورد پروفایل در دسترس باشد. پروفایلهای واقعی (برخلاف موارد تخمینزدهشده بهصورت ایستا) تعادل بسیار کمتری دارند و اجازه میدهند که آستانه مقدار بزرگتری داشته باشد.
- tracer-max-code-growth
- به محض اینکه رشد کد به درصد مشخصشده رسید، تکثیر دنباله (tail duplication) را متوقف میکند. این یک محدودیت نسبتاً قراردادی است، زیرا بیشتر بخشهای تکراری بعداً در جهش متقاطع (cross jumping) حذف میشوند؛ بنابراین میتوان آن را روی مقادیری بسیار بیشتر از رشد کد مطلوب تنظیم کرد.
- tracer-min-branch-ratio
- هنگامی که احتمال معکوس بهترین یال کمتر از این آستانه (به درصد) باشد، رشد معکوس را متوقف میکند.
- tracer-min-branch-probability
- tracer-min-branch-probability-feedback
- اگر بهترین
یال
احتمالی
کمتر از این
آستانه
داشته
باشد، رشد
رو به جلو
را متوقف
میکند.
مشابه tracer-dynamic-coverage، دو پارامتر ارائه شده است. tracer-min-branch-probability-feedback برای کامپایل با بازخورد پروفایل و tracer-min-branch-probability برای کامپایل بدون آن استفاده میشود. مقدار مناسب برای کامپایل با بازخورد پروفایل باید محافظهکارانهتر (بزرگتر) باشد تا tracer مؤثر واقع شود..IP stack-clash-protection-guard-size 4 اندازهٔ محافظ پشتهٔ ارائهشده توسط سیستمعامل را بهصورت ۲ به توان num بایت مشخص میکند. مقادیر بالاتر ممکن است تعداد کاوشهای (probes) صریح را کاهش دهند، اما مقداری بزرگتر از محافظ ارائهشده توسط سیستمعامل، کد را در برابر حملات نوع stack clash آسیبپذیر خواهد کرد.
- stack-clash-protection-probe-interval
- حفاظت در برابر تداخل پشته (stack clash) شامل کاوش فضای پشته به هنگام تخصیص آن است. این پارامتر حداکثر فاصلهٔ بین کاوشها درون پشته را بهصورت ۲ به توان num بایت کنترل میکند. مقادیر بالاتر ممکن است تعداد کاوشهای صریح را کاهش دهند، اما مقداری بزرگتر از محافظ ارائهشده توسط سیستمعامل کد را در برابر حملات نوع stack clash آسیبپذیر خواهد گذاشت.
- max-cse-path-length
- حداکثر تعداد بلوکهای پایهای (basic blocks) روی مسیری که CSE در نظر میگیرد.
- max-cse-insns
- حداکثر تعداد دستورالعملهایی که CSE قبل از تخلیه (flushing) پردازش میکند.
- ggc-min-expand
- کامپایلر GCC
برای
مدیریت
تخصیص
حافظهٔ
داخلی خود
از یک
زبالهروب
(garbage collector)
استفاده
میکند. این
پارامتر
حداقل
درصدی را
مشخص
میکند که
هیپ (heap)
زبالهروب
مجاز است
بین هر دو
عمل
گردآوری
گسترش یابد.
تنظیم این
مقدار ممکن
است سرعت
کامپایل را
بهبود
ببخشد؛ این
پارامتر
هیچ تأثیری
بر تولید کد
نهایی
ندارد.
مقدار پیشفرض 30% + 70% * (RAM/1GB) با حد بالای ۱۰۰٪ در زمانی است که RAM >= 1GB باشد. اگر "getrlimit" در دسترس باشد، مفهوم «RAM» کوچکترین مقدار بین RAM واقعی و "RLIMIT_DATA" یا "RLIMIT_AS" در نظر گرفته میشود. اگر GCC در یک پلتفرم خاص قادر به محاسبهٔ RAM نباشد، حد پایین ۳۰٪ استفاده میشود. تنظیم این پارامتر و ggc-min-heapsize روی صفر باعث میشود در هر فرصتی یک گردآوری کامل رخ دهد. این کار بسیار کند است، اما میتواند برای اشکالزدایی مفید باشد.
- ggc-min-heapsize
- حداقل
اندازهٔ
هیپ
زبالهروب
پیش از آنکه
اقدام به
گردآوری
زباله کند.
اولین
گردآوری پس
از آن رخ
میدهد که
هیپ به
اندازهٔ
ggc-min-expand% فراتر
از ggc-min-heapsize
گسترش یابد.
مجدداً،
تنظیم این
مقدار ممکن
است سرعت
کامپایل را
بهبود دهد و
تأثیری بر
تولید کد
ندارد.
مقدار پیشفرض کوچکترین مقدار از میان RAM/8، RLIMIT_RSS یا حدی است که تلاش میکند از عدم تجاوز از RLIMIT_DATA یا RLIMIT_AS اطمینان حاصل کند، اما با کران پایین ۴۰۹۶ (چهار مگابایت) و کران بالای ۱۳۱۰۷۲ (۱۲۸ مگابایت). اگر GCC در پلتفرمی خاص نتواند RAM را محاسبه کند، حد پایین استفاده میشود. تنظیم این پارامتر روی مقداری بسیار بزرگ عملاً زبالهروبی را غیرفعال میکند. تنظیم این پارامتر و ggc-min-expand روی صفر باعث میشود در هر فرصتی یک گردآوری کامل صورت پذیرد.
- max-reload-search-insns
- حداکثر تعداد دستورالعملهایی که بازبارگذاری (reload) باید به عقب بازگردد تا ثبات معادل را پیدا کند. افزایش این مقدار به معنای بهینهسازی تهاجمیتر است که زمان کامپایل را افزایش داده و احتمالاً عملکرد اندکی بهتر به همراه خواهد داشت.
- max-cselib-memory-locations
- حداکثر تعداد مکانهای حافظه که cselib باید در نظر بگیرد. افزایش این مقدار به معنای بهینهسازی تهاجمیتر است که زمان کامپایل را با احتمال عملکرد اندکی بهتر افزایش میدهد.
- max-sched-ready-insns
- حداکثر تعداد دستورالعملهای آماده برای صدور (issue) که زمانبند باید در هر زمان مشخص در طول اولین گذر زمانبندی در نظر بگیرد. مقادیر بالاتر به معنای جستجوهای دقیقتر و کاملتر است که زمان کامپایل را با منفعتی احتمالاً ناچیز افزایش میدهد.
- max-sched-region-blocks
- حداکثر تعداد بلوکها در یک ناحیه (region) که برای زمانبندی بینبلوکی در نظر گرفته میشوند.
- max-pipeline-region-blocks
- حداکثر تعداد بلوکها در یک ناحیه که برای خطلولهای کردن (pipelining) در زمانبند انتخابی (selective scheduler) در نظر گرفته میشوند.
- max-sched-region-insns
- حداکثر تعداد دستورالعملها (insns) در یک ناحیه که برای زمانبندی بینبلوکی در نظر گرفته میشوند.
- max-pipeline-region-insns
- حداکثر تعداد دستورالعملها در یک ناحیه که برای خطلولهای کردن در زمانبند انتخابی در نظر گرفته میشوند.
- min-spec-prob
- حداقل احتمال (به درصد) برای رسیدن به یک بلوک مبدأ جهت زمانبندی حدسی (speculative) بینبلوکی.
- max-sched-extend-regions-iters
- حداکثر تعداد تکرارها در پیمایش CFG برای گسترش نواحی. مقدار 0 گسترش نواحی را غیرفعال میکند.
- max-sched-insn-conflict-delay
- حداکثر تأخیر تداخل برای یک دستورالعمل جهت در نظر گرفتن آن برای جابجایی حدسی (speculative motion).
- sched-spec-prob-cutoff
- حداقل احتمال موفقیت حدس (به درصد)، بهطوریکه دستورالعملهای حدسی زمانبندی شوند.
- sched-state-edge-prob-cutoff
- حداقل احتمالی که یک یال (edge) باید داشته باشد تا زمانبند وضعیت خود را در سراسر آن ذخیره کند.
- sched-mem-true-dep-cost
- حداقل فاصله (به چرخههای CPU) بین ذخیرهسازی (store) و بارگذاری (load) که مکانهای حافظهٔ یکسانی را هدف قرار میدهند.
- selsched-max-lookahead
- حداکثر اندازهٔ پنجرهٔ پیشنگری (lookahead window) در زمانبندی انتخابی. این مقدار، عمق جستجو برای دستورالعملهای در دسترس است.
- selsched-max-sched-times
- حداکثر دفعاتی که یک دستورالعمل در طول زمانبندی انتخابی زمانبندی میشود. این حد بر تعداد تکرارهایی اعمال میشود که دستورالعمل ممکن است در طول آنها خطلولهای شود.
- selsched-insns-to-rename
- حداکثر تعداد بهترین دستورالعملها در فهرست آماده (ready list) که برای تغییر نام در زمانبند انتخابی در نظر گرفته میشوند.
- sms-min-sc
- حداقل مقدار شمارش مرحله (stage count) که زمانبند swing modulo تولید میکند.
- max-last-value-rtl
- حداکثر اندازه بر حسب تعداد RTLهایی که میتوانند در یک عبارت در combiner برای یک شبهثبات (pseudo register) بهعنوان آخرین مقدار شناختهشدهٔ آن ثبات ثبت شوند.
- max-combine-insns
- حداکثر تعداد دستورالعملهایی که ترکیبکنندهٔ RTL تلاش میکند با یکدیگر ادغام کند.
- max-combine-search-insns
- حداکثر
تعداد
دستورالعملهایی
که
ترکیبکنندهٔ
RTL برای
یافتن
استفادهٔ
بعدی از
تعریف یک
ثبات مشخص
جستجو
میکند. اگر
این حد بدون
یافتن چنین
استفادهای
به پایان
برسد،
ترکیبکننده
تلاش برای
بهینهسازی
آن تعریف را
متوقف
خواهد کرد.
در حال حاضر این حد تنها پس از تلاشهای موفق خاصی برای ترکیب اعمال میشود، اما در آینده میتواند به موارد دیگر نیز گسترش یابد.
- integer-share-limit
- ثابتهای صحیح کوچک میتوانند از یک ساختار دادهٔ مشترک استفاده کنند که مصرف حافظهٔ کامپایلر را کاهش داده و سرعت آن را افزایش میدهد. این مقدار، حداکثر مقدار یک ثابت عدد صحیح مشترک را تعیین میکند.
- ssp-buffer-size
- حداقل اندازهٔ بافرها (یعنی آرایهها) که هنگام استفاده از -fstack-protector، حفاظت در برابر خرد شدن پشته (stack smashing) را دریافت میکنند.
- min-size-for-stack-sharing
- حداقل اندازهٔ متغیرهایی که هنگام عدم بهینهسازی، در اشتراکگذاری اسلاتهای پشته (stack slot sharing) مشارکت دارند.
- max-jump-thread-duplication-stmts
- حداکثر تعداد دستورهای (statements) مجاز در یک بلوک که هنگام ریسهبندی پرشها (jump threading) نیاز به تکثیر دارد.
- max-jump-thread-paths
- حداکثر تعداد مسیرهایی که هنگام جستجوی فرصتهای ریسهبندی پرش در نظر گرفته میشوند. هنگام رسیدن به یک بلوک، یالهای ورودی تنها در صورتی در نظر گرفته میشوند که تعداد مسیرهای جستجوشده تاکنون ضرب در تعداد یالهای ورودی، از حداکثر تعداد مشخصشده برای مسیرهای مورد بررسی تجاوز نکند.
- max-fields-for-field-sensitive
- حداکثر تعداد فیلدها در یک ساختار که در طول تحلیل اشارهگر (pointer analysis) بهصورت حساس به فیلد با آنها رفتار میشود.
- prefetch-latency
- تخمینی از میانگین تعداد دستورالعملهایی که پیش از پایان پیشواکشی (prefetch) اجرا میشوند. فاصلهٔ پیشواکشیشده به سمت جلو متناسب با این مقدار ثابت است. افزایش این عدد همچنین ممکن است به پیشواکشی جریانهای کمتری منجر شود (نگاه کنید به simultaneous-prefetches).
- simultaneous-prefetches
- حداکثر تعداد پیشواکشیهایی که میتوانند بهطور همزمان اجرا شوند.
- l1-cache-line-size
- اندازهٔ خط حافظهٔ پنهان در کَش دادهٔ L1، به بایت.
- l1-cache-size
- اندازهٔ کَش دادهٔ L1، به کیلوبایت.
- l2-cache-size
- اندازهٔ کَش دادهٔ L2، به کیلوبایت.
- prefetch-dynamic-strides
- مشخص
میکند که
آیا گذرِ
پیشواکشی
آرایه در
حلقه باید
اعلانهای
(hints)
پیشواکشی
نرمافزاری
را برای
گامهای (strides)
غیرثابت
صادر کند یا
خیر. در
برخی موارد
ممکن است
این کار
مفید باشد،
اگرچه
غیرثابت
بودن گام
ممکن است
پیشبینی
زمان وجود
فایدهٔ
مشخص برای
صدور این
اعلانها
را دشوار
سازد.
اگر اعلانهای پیشواکشی باید برای گامهای غیرثابت صادر شوند، مقدار آن را روی 1 تنظیم کنید. اگر اعلانهای پیشواکشی باید تنها برای گامهایی که ثابت بودنشان مشخص است و کمتر از prefetch-minimum-stride هستند صادر شوند، مقدار را روی 0 بگذارید.
- prefetch-minimum-stride
- حداقل گام
ثابت، به
بایت، برای
آغاز
استفاده از
اعلانهای
پیشواکشی.
اگر گام
کمتر از این
آستانه
باشد،
اعلانهای
پیشواکشی
صادر
نخواهند شد.
این تنظیم برای پردازندههایی که پیشواکشیکنندههای سختافزاری دارند مفید است؛ چرا که ممکن است میان پیشواکشیکنندههای سختافزاری و نرمافزاری تداخل ایجاد شود. اگر پیشواکشیکنندههای سختافزاری دارای حداکثر گامی باشند که میتوانند مدیریت کنند، باید در اینجا استفاده شود تا بازدهی پیشواکشیکنندههای نرمافزاری بهبود یابد.
مقدار -1 به این معناست که هیچ آستانهای وجود ندارد و بنابراین اعلانهای پیشواکشی میتوانند برای هر گام ثابتی صادر شوند.
این تنظیم تنها برای گامهایی کاربرد دارد که شناختهشده و ثابت باشند..IP destructive-interference-size 4
- constructive-interference-size
- مقادیر
مربوط به
متغیرهای C++17
"std::hardware_destructive_interference_size"
و
"std::hardware_constructive_interference_size".
اندازه
تداخل مخرب
حداقل
فاصله (offset)
توصیهشده
بین دو شیء
مستقل است
که بهطور
همروند
مورد
دسترسی
قرار
میگیرند؛
اندازه
تداخل
سازنده
حداکثر
اندازه
توصیهشده
از حافظه
پیوسته است
که با هم
مورد
دسترسی
واقع
میشوند.
معمولاً هر
دوی این
مقادیر،
اندازه یک
خط حافظه
نهان L1 برای
معماری
مقصد بر حسب
بایت
خواهند بود.
برای یک
مقصد عمومی
که
دامنهای
از
اندازههای
خط حافظه
نهان L1 را
پوشش
میدهد،
معمولاً
اندازه
تداخل
سازنده
کران پایین
دامنه و
اندازه
تداخل مخرب
کران بالای
آن خواهد
بود.
اندازه تداخل مخرب برای چیدمان حافظه در نظر گرفته شده و بنابراین بر ABI تأثیر میگذارد. انتظار نمیرود مقدار پیشفرض پایدار باشد و در برخی مقاصد بر اساس -mtune تغییر میکند؛ بنابراین استفاده از این متغیر در زمینههایی که پایداری ABI در آنها اهمیت دارد، مانند رابط عمومی یک کتابخانه، اکیداً منع میشود؛ اگر در چنین زمینهای استفاده شود، کاربران میتوانند با استفاده از این گزینه مقدار را تثبیت کنند.
اندازه تداخل سازنده حساسیت کمتری دارد، زیرا معمولاً تنها در یک static_assert برای اطمینان از اینکه یک نوع داده درون یک خط حافظه نهان جا میگیرد استفاده میشود.
همچنین -Winterference-size را ببینید.
- loop-interchange-max-num-stmts
- حداکثر تعداد عبارتها (stmts) در حلقهای که قرار است جابهجا (interchange) شود.
- loop-interchange-stride-ratio
- حداقل نسبت میان گام (stride) دو حلقه تا جابهجایی آنها سودبخش باشد.
- min-insn-to-prefetch-ratio
- حداقل نسبت میان تعداد دستورالعملها و تعداد پیشواکشیها برای فعالسازی پیشواکشی در یک حلقه.
- prefetch-min-insn-to-mem-ratio
- حداقل نسبت میان تعداد دستورالعملها و تعداد مراجعات به حافظه برای فعالسازی پیشواکشی در یک حلقه.
- use-canonical-types
- مشخص میکند که آیا کامپایلر باید از سیستم انواع «کانونی» (canonical) استفاده کند یا خیر. همیشه باید 1 باشد، که سازوکار داخلی بهینهتری را برای مقایسه انواع در C++ و Objective-C++ به کار میگیرد. با این حال، اگر باگهای موجود در سیستم انواع کانونی موجب شکست کامپایل میشوند، این مقدار را روی 0 قرار دهید تا انواع کانونی غیرفعال شوند.
- switch-conversion-max-branch-ratio
- تبدیل مقداردهی اولیه switch از ایجاد آرایههایی که بزرگتر از switch-conversion-max-branch-ratio برابر تعداد شاخهها در switch باشند، خودداری میکند.
- switch-lower-slow-alg-max-cases
- حداکثر تعداد caseها برای استفاده از الگوریتمهای آهسته تنزل سطح (lowering) ساختار switch.
- max-partial-antic-length
- حداکثر طول مجموعه partial antic محاسبهشده در طول بهینهسازی حذف افزونگی جزئی درختی (-ftree-pre) هنگام بهینهسازی در -O3 و بالاتر. برای برخی انواع کدهای منبع، بهینهسازی پیشرفته حذف افزونگی جزئی ممکن است از کنترل خارج شده و تمام حافظه موجود در ماشین میزبان را مصرف کند. این پارامتر محدودیتی روی طول مجموعههای محاسبهشده قرار میدهد که از این رفتار مهارناپذیر جلوگیری میکند. تنظیم مقدار 0 برای این پارامتر، طول نامحدود برای مجموعه را مجاز میسازد.
- rpo-vn-max-loop-depth
- حداکثر عمق حلقهای که شمارهگذاری مقداری (value-numbered) آن بهصورت خوشبینانه انجام میشود. هنگامی که به این محدودیت برسد، درونیترین حلقهها به تعداد rpo-vn-max-loop-depth و بیرونیترین حلقه در ساختار آشیانهای حلقهها بهصورت خوشبینانه شمارهگذاری مقداری میشوند و حلقههای باقیمانده شمارهگذاری نمیشوند.
- sccvn-max-alias-queries-per-access
- حداکثر تعداد پرسوجوهای alias-oracle که هنگام جستجوی افزونگیها برای بارگذاریها (loads) و ذخیرهسازیها (stores) انجام میدهیم. اگر به این حد برسد، جستجو لغو میشود و بارگذاری یا ذخیرهسازی مذکور افزوده در نظر گرفته نمیشود. تعداد پرسوجوها از نظر الگوریتمی به تعداد ذخیرهسازیها در تمامی مسیرها از نقطه بارگذاری تا ورودی تابع محدود است.
- ira-max-loops-num
- سازوکار IRA بهطور پیشفرض از تخصیص ناحیهای ثباتها (regional register allocation) استفاده میکند. اگر تابعی شامل حلقههای بیشتری نسبت به عدد مشخصشده توسط این پارامتر باشد، حداکثر تنها به تعداد حلقههای مشخصشده از میان پرکاربردترین حلقهها، ناحیههایی را برای تخصیص ناحیهای ثباتها تشکیل میدهند.
- ira-max-conflict-table-size
- اگرچه IRA از الگوریتمی پیشرفته برای فشردهسازی جدول تداخل استفاده میکند، این جدول همچنان میتواند برای توابع بسیار بزرگ به مقادیر بیش از حدی از حافظه نیاز داشته باشد. اگر جدول تداخل یک تابع بتواند بزرگتر از مقدار دادهشده بر حسب مگابایت (MB) توسط این پارامتر باشد، تخصیصدهنده ثبات در عوض از الگوریتمی سریعتر، سادهتر و با کیفیت پایینتر استفاده میکند که نیازی به ساخت جدول تداخل شبهثباتها ندارد.
- ira-loop-reserved-regs
- میتوان از IRA برای ارزیابی دقیقتر فشار ثبات در حلقهها جهت تصمیمگیری درباره انتقال نامتغیرهای حلقه استفاده کرد (نگاه کنید به -O3). تعداد ثباتهای در دسترسی که برای برخی اهداف دیگر رزرو شدهاند با این پارامتر مشخص میشود. مقدار پیشفرض این پارامتر بهترین مقدار بهدستآمده از آزمایشهای متعدد است.
- ira-consider-dup-in-all-alts
- باعث میشود IRA محدودیت تطابق (شماره عملوند تکراری) را بهشدت در تمام گزینههای جایگزین دردسترس برای رده ثبات ترجیحی در نظر بگیرد. اگر روی صفر تنظیم شود، به این معنی است که IRA فقط زمانی محدودیت تطابق را لحاظ میکند که در تنها جایگزین دردسترس با یک رده ثبات مناسب قرار داشته باشد. در غیر این صورت، به این معنی است که IRA تمام گزینههای جایگزین دردسترس را برای رده ثبات ترجیحی بررسی میکند حتی اگر گزینهای با یک رده ثبات مناسب پیدا کرده باشد، و محدودیت تطابق واجد شرایطِ یافتشده را رعایت خواهد کرد.
- ira-simple-lra-insn-threshold
- تعداد تقریبی دستورالعملهای تابع در واحدهای 1K که باعث فعالسازی RA محلی ساده میشود.
- lra-inheritance-ebb-probability-cutoff
- سازوکار LRA تلاش میکند مقادیر بازخوانیشده (reloaded) در ثباتها را در دستورالعملهای بعدی دوباره استفاده کند. این بهینهسازی وراثت نامیده میشود. از EBB بهعنوان ناحیهای برای انجام این بهینهسازی استفاده میشود. این پارامتر حداقل احتمال یال گذر مستقیم (fall-through edge) را بر حسب درصد تعریف میکند که برای افزودن BB به EBB وراثت در LRA استفاده میشود. مقدار پیشفرض از روی چندین اجرای SPEC2000 روی x86-64 انتخاب شده است.
- loop-invariant-max-bbs-in-loop
- انتقال نامتغیرهای حلقه (loop invariant motion) در حلقههای بسیار بزرگ میتواند هم از نظر زمان کامپایل و هم از نظر مقدار حافظه مورد نیاز هنگام کامپایل، بسیار هزینهبر باشد. در حلقههایی با بلوکهای پایهای بیشتر از این پارامتر، بهینهسازی انتقال نامتغیر حلقه انجام نخواهد شد.
- loop-max-datarefs-for-datadeps
- ساخت وابستگیهای داده برای حلقههای بسیار بزرگ هزینهبر است. این پارامتر تعداد مراجع داده در حلقهها را که برای تحلیل وابستگی داده در نظر گرفته میشوند محدود میکند. این حلقههای بزرگ توسط بهینهسازیهایی که از وابستگی دادههای حلقه استفاده میکنند مدیریت نمیشوند.
- max-vartrack-size
- حداکثر تعداد خانههای جدول درهمسازی را برای استفاده در طول تحلیل جریان داده ردیابی متغیر در هر تابع تعیین میکند. اگر با فعال بودن ردیابی متغیر در انتسابها از این حد فراتر رود، تحلیل برای آن تابع بدون آن و پس از حذف همه دستورالعملهای اشکالزدایی از تابع دوباره امتحان میشود. اگر حتی بدون دستورالعملهای اشکالزدایی نیز از حد مجاز فراتر رود، تحلیل ردیابی متغیر برای آن تابع کاملاً غیرفعال میشود. تنظیم این پارامتر روی صفر، آن را نامحدود میکند.
- max-vartrack-expr-depth
- حداکثر تعداد سطوح بازگشت را هنگام تلاش برای نگاشت نامهای متغیر یا متغیرهای موقت اشکالزدایی به عبارتهای مقداری تعیین میکند. این کار زمان کامپایل را با اطلاعات اشکالزدایی کاملتر معاوضه میکند. اگر این مقدار بیش از حد کم تنظیم شود، ممکن است عبارتهای مقداری که در دسترس هستند و میتوانستند در اطلاعات اشکالزدایی نمایش داده شوند استفاده نشوند؛ تنظیم این مقدار روی عددی بالاتر ممکن است به کامپایلر امکان دهد عبارتهای اشکالزدایی پیچیدهتری را پیدا کند، اما زمان کامپایل و مصرف حافظه ممکن است افزایش یابد.
- max-debug-marker-count
- آستانهای برای تعداد نشانگرهای اشکالزدایی (مانند نشانگرهای شروع عبارت begin stmt) تعیین میکند تا از انفجار پیچیدگی در زمان جایگذاری درونخطی یا بسط به RTL جلوگیری شود. اگر تابعی تعداد بیشتری از چنین عبارتهای gimple نسبت به حد تعیینشده داشته باشد، چنین عبارتهایی از نسخه درونخطیشده تابع و از بسط RTL آن حذف خواهند شد.
- min-nondebug-insn-uid
- از uidهایی که از مقدار این پارامتر شروع میشوند برای دستورالعملهای غیر اشکالزدایی استفاده میکند. محدوده زیر این پارامتر منحصراً برای دستورالعملهای اشکالزدایی ایجادشده توسط -fvar-tracking-assignments رزرو شده است، اما اگر محدوده رزرو شده تمام شود، دستورالعملهای اشکالزدایی ممکن است uidهای (غیر همپوشان) بالاتری دریافت کنند.
- ipa-sra-deref-prob-threshold
- سازوکار IPA-SRA اشارهگری را که مشخص است NULL نیست، تنها زمانی با یک یا چند پارامتر جدید جایگزین میکند که احتمال (بر حسب درصد، نسبت به ورودی تابع) ارجاعزدایی شدن آن بیشتر از این پارامتر باشد.
- ipa-sra-ptr-growth-factor
- سازوکار IPA-SRA اشارهگر به یک داده تجمعی (aggregate) را تنها زمانی با یک یا چند پارامتر جدید جایگزین میکند که اندازه تجمعی آنها کمتر یا مساوی با ipa-sra-ptr-growth-factor برابر اندازه پارامتر اشارهگر اصلی باشد.
- ipa-sra-ptrwrap-growth-factor
- حداکثر رشد مجاز اضافی اندازه کل پارامترهای جدیدی که ipa-sra یک اشارهگر به یک داده تجمعی را با آن جایگزین میکند، در صورتی که به یک متغیر محلی اشاره کند که فراخواننده فقط در آن مینویسد و آن را بهعنوان آرگومان به سایر توابع ارسال میکند.
- ipa-sra-max-replacements
- حداکثر تکههایی از یک داده تجمعی که IPA-SRA ردیابی میکند. در نتیجه، این مقدار همچنین حداکثر تعداد جایگزینیهای یک پارامتر صوری (formal parameter) است.
- sra-max-scalarization-size-Ospeed
- sra-max-scalarization-size-Osize
- دو گذر کاهش اسکالر تجمعیها (SRA و IPA-SRA) با هدف جایگزینی بخشهای اسکالر دادههای تجمعی با استفاده از متغیرهای اسکالر مستقل عمل میکنند. این پارامترها حداکثر اندازه (بر حسب واحدهای ذخیرهسازی) از داده تجمعی را که هنگام کامپایل برای سرعت (sra-max-scalarization-size-Ospeed) یا اندازه (sra-max-scalarization-size-Osize) برای جایگزینی در نظر گرفته میشود، کنترل میکنند..IP sra-max-propagations 4 حداکثر تعداد دسترسیهای ساختگی که «جایگزینی اسکالر تجمیعها» (SRA) برای هر متغیر محلی به منظور تسهیل انتشار رونوشت (copy propagation) ردیابی میکند.
- tm-max-aggregate-size
- هنگام ایجاد رونوشت از متغیرهای محلی نخ (thread-local) در یک تراکنش، این پارامتر اندازه را بر حسب بایت مشخص میکند که پس از آن، متغیرها برخلاف جفتتوالیهای کد ذخیره/بازیابی (save/restore)، با استفاده از توابع گزارشگیری (logging) ذخیره میشوند. این گزینه فقط هنگام استفاده از -fgnu-tm اعمال میشود.
- graphite-max-nb-scop-params
- برای جلوگیری از اثرات تصاعدی در تبدیلات حلقهٔ Graphite، تعداد پارامترها در یک «بخش کنترل ایستا» (SCoP) محدود شده است. از مقدار صفر میتوان برای برداشتن این محدودیت استفاده کرد. متغیری که مقدار آن در زمان کامپایل نامشخص بوده و در خارج از یک SCoP تعریف شده باشد، پارامتری از آن SCoP محسوب میشود.
- hardcfr-max-blocks
- غیرفعالسازی -fharden-control-flow-redundancy برای توابعی با تعداد بلوکهای بیشتر از مقدار مشخصشده. مقدار صفر هرگونه محدودیتی را برمیدارد.
- hardcfr-max-inline-blocks
- وادار کردن -fharden-control-flow-redundancy به استفاده از بررسیهای خارج از خط (out-of-line) برای توابعی با تعداد بلوکهای پایهای بیشتر از مقدار مشخصشده.
- loop-block-tile-size
- تبدیلات انسداد حلقه (loop blocking) یا استخراج نواری (strip mining) که با -floop-block یا -floop-strip-mine فعال میشوند، هر حلقه را در آشیانهٔ حلقه به تعداد تکرار مشخصی بخشبندی نواری میکنند. طول نوار را میتوان با استفاده از پارامتر loop-block-tile-size تغییر داد.
- ipa-jump-function-lookups
- تعداد دستورهای بررسیشده در طول کشف آفست تابع پرش (jump function) را مشخص میکند.
- ipa-cp-value-list-size
- سازوکار IPA-CP تلاش میکند تمام مقادیر و انواع ممکن را که به پارامتر یک تابع ارسال میشوند به منظور انتشار آنها و انجام مجازیزدایی (devirtualization) ردیابی کند. ipa-cp-value-list-size حداکثر تعداد مقادیر و انواعی است که به ازای هر پارامتر صوری یک تابع ذخیره میکند.
- ipa-cp-eval-threshold
- سازوکار IPA-CP امتیاز خود را از روشهای اکتشافی سودآوری همتاسازی (cloning) محاسبه میکند و آن دسته از فرصتهای همتاسازی را که امتیازشان از ipa-cp-eval-threshold فراتر رود اجرا میکند.
- ipa-cp-max-recursive-depth
- حداکثر عمق همتاسازی بازگشتی برای تابع خودبازگشتی.
- ipa-cp-min-recursive-probability
- همتاسازی بازگشتی تنها زمانی انجام شود که احتمال اجرای فراخوانی از مقدار این پارامتر فراتر رود.
- ipa-cp-profile-count-base
- هنگام استفاده از گزینهٔ -fprofile-use، سازوکار IPA-CP تعداد اجرای اندازهگیریشدهٔ یک یال در گراف فراخوانی را در این موقعیت درصدی از هیستوگرام آنها به عنوان مبنایی برای محاسبات اکتشافی خود در نظر میگیرد.
- ipa-cp-recursive-freq-factor
- تعداد دفعاتی که انتشار رونوشت بینرویهای (interprocedural copy propagation) انتظار دارد توابع بازگشتی خود را فراخوانی کنند.
- ipa-cp-recursion-penalty
- جریمهٔ درصدی که توابع بازگشتی هنگام ارزیابی برای همتاسازی دریافت خواهند کرد.
- ipa-cp-single-call-penalty
- جریمهٔ درصدی که توابع شامل یک فراخوانی منفرد به تابعی دیگر، هنگام ارزیابی برای همتاسازی دریافت خواهند کرد.
- ipa-max-agg-items
- سازوکار IPA-CP همچنین قادر است تعدادی از مقادیر اسکالر ارسالشده در یک دادهٔ تجمیعی (aggregate) را منتشر کند. ipa-max-agg-items حداکثر تعداد چنین مقادیری را به ازای هر پارامتر کنترل میکند.
- ipa-cp-loop-hint-bonus
- هنگامی که IPA-CP تشخیص دهد یک کاندید همتاسازی باعث میشود تعداد تکرارهای یک حلقه معلوم شود، پاداشی معادل ipa-cp-loop-hint-bonus به امتیاز سودآوری آن کاندید میافزاید.
- ipa-max-loop-predicates
- حداکثر تعداد گزارههای متفاوتی که IPA برای توصیف زمانی که حلقهها در یک تابع دارای ویژگیهای شناختهشده هستند استفاده خواهد کرد.
- ipa-max-aa-steps
- در طول تحلیل بدنهٔ توابع، IPA-CP از تحلیل نام مستعار (alias analysis) به منظور ردیابی مقادیر اشارهشده توسط پارامترهای تابع بهره میبرد. برای جلوگیری از صرف زمان بیش از حد روی تحلیل توابع بسیار بزرگ، پس از بررسی ipa-max-aa-steps دستور اصلاحکنندهٔ حافظه، متوقف شده و تمام حافظه را مخدوششده (clobbered) در نظر میگیرد.
- ipa-max-switch-predicate-bounds
- حداکثر تعداد نقاط پایانی مرزی دامنههای case در یک دستور switch. برای دستورهای switch که از این حد فراتر روند، IPA-CP گزارهٔ هزینهٔ همتاسازی را که برای تخمین سود همتاسازی به کار میرود، برای حالت default دستور switch ایجاد نخواهد کرد.
- ipa-max-param-expr-ops
- سازوکار IPA-CP عبارت شرطی ارجاعدهنده به پارامتر تابع را بررسی میکند تا سود همتاسازی بر اساس یک مقدار ثابت خاص را برآورد کند. اما اگر تعداد عملیاتها در عبارت پارامتر از ipa-max-param-expr-ops فراتر رود، عبارت به عنوان عبارتی پیچیده در نظر گرفته شده و توسط تحلیل IPA پردازش نمیشود.
- lto-partitions
- تعداد پارتیشنهای مورد نظر تولیدشده در طول کامپایل WHOPR را مشخص میکند. تعداد پارتیشنها باید از تعداد CPUهای مورد استفاده برای کامپایل بیشتر باشد.
- lto-min-partition
- اندازهٔ کوچکترین پارتیشن برای WHOPR (بر حسب دستورالعملهای تخمینی). این کار از هزینههای تقسیم برنامههای بسیار کوچک به تعداد زیادی پارتیشن جلوگیری میکند.
- lto-max-partition
- اندازهٔ بزرگترین پارتیشن برای WHOPR (بر حسب دستورالعملهای تخمینی) جهت تعیین کران بالا برای اندازهٔ هر پارتیشن. تنها برای استفاده با پارتیشنبندی متوازن (balanced partitioning) در نظر گرفته شده است.
- lto-partition-locality-frequency-cutoff
- مخرج n از کسر 1/n برای بسامد اجرای فراخوانیشوندهای که باید برای یک فراخوانندهٔ خاص همتاسازی شود. مقدار ویژهٔ 0 تعیین میکند که همواره بدون حد آستانه همتاسازی شود.
- lto-partition-locality-size-cutoff
- حد آستانهٔ اندازه برای فراخوانیشونده، شامل فراخوانیهای درونخطیشده (inlined)، که باید برای یک فراخوانندهٔ خاص همتاسازی شود.
- lto-max-locality-partition
- حداکثر اندازهٔ یک پارتیشن محلی برای LTO (بر حسب دستورالعملهای تخمینی). مقدار 0 منجر به استفاده از مقدار پیشفرض میشود.
- lto-max-streaming-parallelism
- حداکثر تعداد فرایندهای موازی مورد استفاده برای جریانسازی (streaming) در LTO.
- cxx-max-namespaces-for-diagnostic-help
- حداکثر تعداد فضاهای نام برای مراجعه به منظور ارائهٔ پیشنهادات، هنگامی که جستجوی نام C++ برای یک شناسه با شکست مواجه میشود.
- sink-frequency-threshold
- حداکثر بسامد اجرای نسبی (به درصد) بلوک مقصد نسبت به بلوک اصلی دستور، برای اجازه دادن به فرونشانی دستور (statement sinking). مقادیر بزرگتر به فرونشانی تهاجمیتر دستورها میانجامد. یک تعدیل مثبت کوچک برای دستورهای دارای عملوند حافظه اعمال میشود، چرا که فرونشانی آنها حتی سودآورتر است.
- max-stores-to-sink
- حداکثر تعداد جفتهای ذخیرهٔ شرطی که میتوانند فرونشانده شوند. اگر برداریسازی (-ftree-vectorize) یا تبدیل شرطی (-ftree-loop-if-convert) غیرفعال باشد، روی 0 تنظیم شود.
- case-values-threshold
- کمترین تعداد مقادیر متمایز که برای آنها استفاده از یک جدول پرش (jump-table) به جای درختی از شاخههای شرطی بهینهتر است. اگر این مقدار 0 باشد، از مقدار پیشفرض ماشین استفاده میشود.
- jump-table-max-growth-ratio-for-size
- حداکثر نسبت رشد اندازهٔ کد هنگام بسط یافتن به یک جدول پرش (به درصد). این پارامتر هنگام بهینهسازی برای اندازه استفاده میشود.
- jump-table-max-growth-ratio-for-speed
- حداکثر نسبت رشد اندازهٔ کد هنگام بسط یافتن به یک جدول پرش (به درصد). این پارامتر هنگام بهینهسازی برای سرعت استفاده میشود.
- tree-reassoc-width
- حداکثر تعداد دستورالعملهای اجراشده به صورت موازی در درخت بازپیوندیافته (reassociated tree) را تعیین میکند. این پارامتر در صورت داشتن مقدار غیرصفر، قواعد اکتشافی وابسته به هدف را که به صورت پیشفرض استفاده میشوند بازنویسی میکند.
- sched-pressure-algorithm
- انتخاب
میان دو
پیادهسازی
موجود از
-fsched-pressure.
الگوریتم 1
پیادهسازی
اصلی است و
بیشتر
احتمال
دارد که از
بازآرایی
دستورالعملها
جلوگیری
کند.
الگوریتم 2
به عنوان
مصالحهای
میان
رویکرد
نسبتاً
محافظهکارانهٔ
الگوریتم 1
و رویکرد
نسبتاً
تهاجمی
زمانبند
پیشفرض
طراحی شده
است. این
الگوریتم
اتکای
بیشتری بر
داشتن یک
بانک ثبات
منظم و
ردههای
دقیق فشار
ثبات دارد.
برای
جزئیات
بیشتر به
haifa-sched.cc در
سورسهای GCC
مراجعه
کنید.
انتخاب پیشفرض به هدف بستگی دارد.
- max-slsr-cand-scan
- تنظیم حداکثر تعداد کاندیداهای موجود که هنگام جستجوی مبنایی برای یک کاندید جدید کاهش توان خط مستقیم (straight-line strength reduction) بررسی میشوند.
- asan-globals
- فعالسازی تشخیص سرریز بافر برای اشیاء سراسری. این نوع حفاظت در صورت استفاده از گزینهٔ -fsanitize=address به صورت پیشفرض فعال است. برای غیرفعال کردن حفاظت از اشیاء سراسری از --param asan-globals=0 استفاده کنید.
- asan-stack
- فعالسازی تشخیص سرریز بافر برای اشیاء پشته. این نوع حفاظت هنگام استفاده از -fsanitize=address به طور پیشفرض فعال است. برای غیرفعال کردن حفاظت پشته از گزینهٔ --param asan-stack=0 استفاده کنید..IP asan-instrument-reads 4 تشخیص سرریز بافر را برای خواندنهای حافظه فعال میکند. این نوع محافظت هنگام استفاده از -fsanitize=address بهطور پیشفرض فعال است. برای غیرفعال کردن محافظت از خواندنهای حافظه از --param asan-instrument-reads=0 استفاده کنید.
- asan-instrument-writes
- تشخیص سرریز بافر را برای نوشتنهای حافظه فعال میکند. این نوع محافظت هنگام استفاده از -fsanitize=address بهطور پیشفرض فعال است. برای غیرفعال کردن محافظت از نوشتنهای حافظه از گزینهٔ --param asan-instrument-writes=0 استفاده کنید.
- asan-memintrin
- تشخیص را برای توابع درونی (built-in) فعال میکند. این نوع محافظت هنگام استفاده از -fsanitize=address بهطور پیشفرض فعال است. برای غیرفعال کردن محافظت از توابع درونی از --param asan-memintrin=0 استفاده کنید.
- asan-use-after-return
- تشخیص
استفاده پس
از بازگشت
(use-after-return) را فعال
میکند. این
نوع محافظت
هنگام
استفاده از
گزینهٔ -fsanitize=address
بهطور
پیشفرض
فعال است.
برای
غیرفعال
کردن آن از
--param asan-use-after-return=0
استفاده
کنید.
نکته: این بررسی در زمان اجرا بهطور پیشفرض غیرفعال است. برای فعال کردن آن، مقدار "detect_stack_use_after_return=1" را به متغیر محیطی ASAN_OPTIONS اضافه کنید.
- asan-instrumentation-with-call-threshold
- اگر تعداد دسترسیها به حافظه در تابعی که سنجشگذاری (instrumentation) میشود بزرگتر یا مساوی این عدد باشد، به جای بررسیهای درونخطی از فراخوانیهای بازگشتی (callbacks) استفاده میکند. برای نمونه جهت غیرفعال کردن کد درونخطی از --param asan-instrumentation-with-call-threshold=0 استفاده کنید.
- asan-kernel-mem-intrinsic-prefix
- در صورت غیرصفر بودن، فراخوانیهای "memcpy"، "memset" و "memmove" را به ترتیب برای -fsanitize=kernel-address یا -fsanitize=kernel-hwaddress با پیشوند __asan_ یا __hwasan_ قرار میدهد.
- hwasan-instrument-stack
- سنجشگذاری hwasan را برای متغیرهای تخصیصیافته روی پشته با اندازهٔ ایستا فعال میکند. این نوع سنجشگذاری هنگام استفاده از -fsanitize=hwaddress بهطور پیشفرض فعال و هنگام استفاده از -fsanitize=kernel-hwaddress بهطور پیشفرض غیرفعال است. برای غیرفعال کردن سنجشگذاری پشته از --param hwasan-instrument-stack=0 و برای فعال کردن آن از --param hwasan-instrument-stack=1 استفاده کنید.
- hwasan-random-frame-tag
- هنگام استفاده از سنجشگذاری پشته، برچسبهای متغیرهای پشته را با استفاده از یک دنبالهٔ معین که برای هر فریم از یک برچسب تصادفی آغاز میشود، تعیین میکند. در صورت تنظیم نبودن این پارامتر، برچسبها با همان دنباله ولی با شروع از ۱ انتخاب میشوند. این ویژگی بهطور پیشفرض برای -fsanitize=hwaddress فعال بوده و برای -fsanitize=kernel-hwaddress در دسترس نیست. برای غیرفعال کردن آن از --param hwasan-random-frame-tag=0 استفاده کنید.
- hwasan-instrument-allocas
- سنجشگذاری hwasan را برای متغیرهای پشته با اندازهٔ پویا فعال میکند. این نوع سنجشگذاری هنگام استفاده از -fsanitize=hwaddress بهطور پیشفرض فعال و هنگام استفاده از -fsanitize=kernel-hwaddress بهطور پیشفرض غیرفعال است. برای غیرفعال کردن سنجشگذاری چنین متغیرهایی از --param hwasan-instrument-allocas=0 و برای فعال کردن آن از --param hwasan-instrument-allocas=1 استفاده کنید.
- hwasan-instrument-reads
- بررسیهای hwasan را روی خواندنهای حافظه فعال میکند. سنجشگذاری خواندنها بهطور پیشفرض هم برای -fsanitize=hwaddress و هم برای -fsanitize=kernel-hwaddress فعال است. برای غیرفعال کردن بررسی خواندنهای حافظه از --param hwasan-instrument-reads=0 استفاده کنید.
- hwasan-instrument-writes
- بررسیهای hwasan را روی نوشتنهای حافظه فعال میکند. سنجشگذاری نوشتنها بهطور پیشفرض هم برای -fsanitize=hwaddress و هم برای -fsanitize=kernel-hwaddress فعال است. برای غیرفعال کردن بررسی نوشتنهای حافظه از --param hwasan-instrument-writes=0 استفاده کنید.
- hwasan-instrument-mem-intrinsics
- سنجشگذاری hwasan را برای توابع درونی (builtin) فعال میکند. سنجشگذاری این توابع درونی بهطور پیشفرض هم برای -fsanitize=hwaddress و هم برای -fsanitize=kernel-hwaddress فعال است. برای غیرفعال کردن سنجشگذاری توابع درونی از --param hwasan-instrument-mem-intrinsics=0 استفاده کنید.
- use-after-scope-direct-emission-threshold
- اگر اندازهٔ یک متغیر محلی بر حسب بایت، کوچکتر یا مساوی این عدد باشد، به جای استفاده از فراخوانیهای بازگشتی زمان اجرا، حافظهٔ سایه (shadow memory) را مستقیماً مسموم (یا رفع مسمومیت) میکند.
- tsan-distinguish-volatile
- سنجشگذاری ویژهای را برای دسترسیها به متغیرهای فرار (volatile) صادر میکند.
- tsan-instrument-func-entry-exit
- فراخوانیهای سنجشگذاری را برای __tsan_func_entry() و __tsan_func_exit() صادر میکند.
- max-fsm-thread-path-insns
- حداکثر تعداد دستورالعملها برای کپی هنگام تکثیر بلوکها روی مسیر جهش رشتهایِ ماشین حالت متناهی (FSM).
- threader-debug
- دستور threader-debug=[none|all] خروجی تشخیصی با جزئیات کامل را برای حلکنندهٔ threader فعال میکند.
- parloops-chunk-size
- اندازهٔ تکه (chunk size) در زمانبندی omp برای حلقههایی که توسط parloops موازیسازی شدهاند.
- parloops-schedule
- نوع زمانبندی omp برای حلقههای موازیسازیشده توسط parloops (شامل static، dynamic، guided، auto و runtime).
- parloops-min-per-thread
- حداقل تعداد تکرارهای درونیترین حلقهٔ موازیسازیشده بهازای هر رشته که در آن حالت موازیسازیشده بر حالت تکرشتهای ترجیح داده میشود. توجه داشته باشید که برای یک آشیانهٔ حلقهٔ موازیسازیشده، حداقل تعداد تکرارهای بیرونیترین حلقه بهازای هر رشته ۲ است.
- max-ssa-name-query-depth
- حداکثر عمق بازگشت (recursion) هنگام پرسوجوی ویژگیهای نامهای SSA در مواردی مانند روالهای جمعکردن ثوابت (fold). یک سطح بازگشت معادل پیمودن یک زنجیرهٔ use-def است.
- max-speculative-devirt-maydefs
- حداکثر تعداد may-defهایی که هنگام جستجو برای یک must-def بررسی میشوند؛ تعیینکنندهٔ نوع پویای شیئی که یک فراخوانی مجازی را صدا میزند و ممکن است بتوانیم آن را بهصورت حدسی (speculative) غیرمجازی (devirtualize) کنیم.
- ranger-debug
- نوع خروجی اشکالزدایی صادرشونده را برای محدودهها (ranges) مشخص میکند.
- unroll-jam-min-percent
- حداقل درصد ارجاعات حافظه که باید با بهینهسازی حذف شوند تا تبدیل باز کردن و ادغام حلقه (unroll-and-jam) سودمند در نظر گرفته شود.
- unroll-jam-max-unroll
- حداکثر تعداد دفعاتی که حلقهٔ بیرونی باید توسط تبدیل unroll-and-jam باز شود.
- max-rtl-if-conversion-unpredictable-cost
- حداکثر هزینهٔ مجاز برای دنبالهای که توسط مرحلهٔ RTL if-conversion برای یک شاخهٔ غیرقابل پیشبینی تولید خواهد شد.
- max-variable-expansions-in-unroller
- در صورت استفاده از -fvariable-expansion-in-unroller، حداکثر تعداد دفعاتی است که یک متغیر مشخص در حین باز کردن حلقه بسط داده میشود.
- partial-inlining-entry-probability
- حداکثر احتمال بلوک پایهٔ ورودی (entry BB) ناحیهٔ تفکیکشده (به درصد نسبت به بلوک پایهٔ ورودی تابع) برای اینکه درونخطیسازی جزئی (partial inlining) رخ دهد.
- max-tracked-strlens
- حداکثر تعداد رشتههایی که مرحلهٔ بهینهسازی strlen طول آنها را ردگیری خواهد کرد.
- gcse-after-reload-partial-fraction
- نسبت آستانه برای انجام حذف افزونگی جزئی (partial redundancy elimination) پس از مرحلهٔ reload.
- gcse-after-reload-critical-fraction
- نسبت آستانهٔ تعداد اجرای یالهای بحرانی (critical edges) که اجازهٔ انجام حذف افزونگی را پس از reload میدهد.
- max-loop-header-insns
- حداکثر تعداد دستورالعملها (insns) در سرآیند حلقه که توسط مرحلهٔ کپی سرآیندهای حلقه تکثیر میشوند.
- vect-epilogues-nomask
- برداریسازی پایانبخش حلقه (epilogue) را با استفاده از اندازهٔ بردار کوچکتر فعال میکند.
- vect-partial-vector-usage
- کنترل میکند که برداریساز حلقه چه زمانی استفاده از بارگذاریها و ذخیرهسازیهای برداری جزئی را به عنوان جایگزینی برای بازگشت به کد اسکالر در نظر بگیرد. مقدار 0 مانع از استفادهٔ برداریساز از بارگذاریها و ذخیرهسازیهای برداری جزئی میشود. مقدار 1 در صورتی اجازهٔ بارگذاری و ذخیرهسازی برداری جزئی را میدهد که برداریسازی نیاز به تکرار کد را برطرف کند. مقدار 2 استفاده از بارگذاریها و ذخیرهسازیهای برداری جزئی را در تمام حلقهها مجاز میکند. این پارامتر فقط روی مقصدهایی تأثیر دارد که از بارگذاریها و ذخیرهسازیهای برداری جزئی پشتیبانی میکنند.
- vect-inner-loop-cost-factor
- حداکثر ضریبی که برداریساز حلقه روی هزینهٔ دستورها در یک حلقهٔ داخلی نسبت به حلقهٔ در حال برداریسازی اعمال میکند. ضریب اعمالشده بیشینهٔ تعداد تکرارهای تخمینی حلقهٔ داخلی و مقدار این پارامتر است. مقدار پیشفرض این پارامتر ۵۰ است.
- vect-induction-float
- برداریسازی حلقه را برای متغیرهای القایی ممیز شناور فعال میکند.
- vect-force-slp
- استفاده از SLP را هنگام برداریسازی اجباری میکند و در صورت عدم امکان، با شکست متوقف میشود.
- vrp-block-limit
- حداکثر تعداد بلوکهای پایه قبل از اینکه VRP به الگوریتمی با مصرف حافظهٔ کمتر تغییر جهت دهد.
- vrp-sparse-threshold
- حداکثر تعداد بلوکهای پایه قبل از اینکه VRP از یک حافظهٔ نهان بیتمپ پراکنده استفاده کند.
- vrp-switch-limit
- حداکثر تعداد یالهای خروجی در یک ساختار switch پیش از آنکه VRP از پردازش آن صرفنظر کند..IP vrp-vector-threshold 4 حداکثر تعداد بلوکهای پایه برای VRP جهت استفاده از یک بردار کِش پایه.
- avoid-fma-max-bits
- حداکثر تعداد بیتهایی که برای آنها از ایجاد FMAها اجتناب میشود.
- fully-pipelined-fma
- مشخص میکند که آیا مقصد، دستورالعملهای FMA را کاملاً خطلولهای (پایپلاین) میکند یا خیر. در صورت غیرصفر بودن، بازپیوند (reassociation) با این فرض که FMUL و FMA از واحدهای یکسانی استفاده میکنند که توانایی اجرای FADD را نیز دارند، مزیت موازیسازی بخش ضرب و بخش جمع FMA را در نظر میگیرد.
- sms-loop-average-count-threshold
- آستانهای برای میانگین تعداد تکرار حلقه که توسط swing modulo scheduler در نظر گرفته میشود.
- sms-dfa-history
- تعداد چرخههایی که swing modulo scheduler هنگام بررسی تداخلها با استفاده از DFA در نظر میگیرد.
- graphite-allow-codegen-errors
- مشخص میکند که آیا خطاهای تولید کد (codegen) هنگام فعال بودن -fchecking باید خطای داخلی کامپایلر (ICE) در نظر گرفته شوند یا خیر.
- sms-max-ii-factor
- ضریبی برای تنظیم کران بالایی که swing modulo scheduler برای زمانبندی یک حلقه استفاده میکند.
- lra-max-considered-reload-pseudos
- حداکثر تعداد شبهرجیسترهای reload که هنگام بیرونریزی (spilling) یک شبهرجیستر غیر reload در نظر گرفته میشوند.
- max-pow-sqrt-depth
- حداکثر عمق زنجیرههای sqrt جهت استفاده هنگام ترکیب توانرسانی با یک ثابت حقیقی.
- max-dse-active-local-stores
- حداکثر تعداد ذخیرهسازیهای محلی فعال در حذف ذخیرهسازیهای مردهی RTL (موسوم به RTL DSE).
- asan-instrument-allocas
- فعالسازی حفاظت asan برای allocaها و VLAها.
- max-iterations-computation-cost
- کران بالای هزینه یک عبارت برای محاسبه تعداد تکرارهای حلقه.
- max-isl-operations
- حداکثر تعداد عملیات isl؛ مقدار 0 به معنای نامحدود است.
- graphite-max-arrays-per-scop
- حداکثر تعداد آرایهها در هر scop.
- max-vartrack-reverse-op-size
- حداکثر اندازه loc list که باید عملیات معکوس برای آن اضافه شود.
- fsm-scale-path-stmts
- ضریب مقیاس اعمالی بر تعداد گزارهها در یک مسیر ریسهکشی (threading path) که هنگام مقایسه با --param=max-jump-thread-duplication-stmts از یک لبه برگشتی حلقه عبور میکند.
- uninit-control-dep-attempts
- حداکثر تعداد فراخوانیهای تودرتو برای جستجوی وابستگیهای کنترلی در طول تحلیل متغیرهای مقداردهینشده.
- uninit-max-chain-len
- حداکثر تعداد گزارههای AND شده به ازای هر گزاره OR شده در زنجیره گزارههای نرمالشده.
- uninit-max-num-chains
- حداکثر تعداد گزارههای OR شده در زنجیره گزارههای نرمالشده.
- uninit-max-prune-work
- حداکثر میزان کار انجامشده برای هرس کردن مسیرهایی که در آنها متغیر همواره مقداردهی اولیه شده است.
- sched-autopref-queue-depth
- پرچم کنترلی مدل زمانبند واکشی پیشدستانه خودکار (autoprefetcher) سختافزاری. تعداد چرخههای پیشنگری که مدل بررسی میکند؛ در '0' ' تنها روش اکتشافی مرتبسازی دستورالعملها فعال میشود.
- loop-versioning-max-inner-insns
- حداکثر تعداد دستورالعملهایی که یک حلقه درونی میتواند داشته باشد پیش از آنکه گذر نسخهبندی حلقه آن را برای رونویسی بیش از حد بزرگ در نظر بگیرد.
- loop-versioning-max-outer-insns
- حداکثر تعداد دستورالعملهایی که یک حلقه بیرونی میتواند داشته باشد پیش از آنکه گذر نسخهبندی حلقه آن را برای رونویسی بیش از حد بزرگ تشخیص دهد، بدون احتساب هرگونه دستورالعمل در حلقههای درونی که مستقیماً از نسخهبندی سود میبرند.
- ssa-name-def-chain-limit
- حداکثر تعداد انتسابهای SSA_NAME جهت دنبالکردن هنگام تعیین یک ویژگی متغیر نظیر مقدار آن. این گزینه تعداد تکرارها یا فراخوانیهای بازگشتی را که GCC هنگام بهینهسازی برخی گزارهها یا تعیین اعتبار آنها پیش از صدور پیامهای تشخیصی انجام میدهد، محدود میکند.
- store-merging-max-size
- حداکثر اندازه یک ناحیه ادغام ذخیرهسازی (store merging) به بایت.
- store-forwarding-max-distance
- حداکثر فاصله برحسب تعداد دستورالعملها که طی آن یک ذخیره کوچک ارسالشده به یک بارگذاری بزرگتر ممکن است متوقف (stall) شود. مقدار '0' بررسیهای هزینه را برای گذر avoid-store-forwarding غیرفعال میکند.
- hash-table-verification-limit
- تعداد عناصری که به ازای هر عنصر جستجوشده، اعتبارسنجی جدول هش برای آنها انجام میشود.
- max-find-base-term-values
- حداکثر تعداد مقادیر (VALUEs) مدیریتشده در طول یک فراخوانی find_base_term.
- analyzer-max-enodes-per-program-point
- حداکثر تعداد گرههای گسترشیافته (exploded nodes) به ازای هر نقطه از برنامه در تحلیلگر، پیش از پایان دادن به تحلیل آن نقطه.
- analyzer-max-constraints
- حداکثر تعداد محدودیتها در هر حالت.
- analyzer-min-snodes-for-call-summary
- حداقل تعداد ابرگرهها (supernodes) درون یک تابع تا تحلیلگر خلاصهسازی اثرات آن را در محلهای فراخوانی در نظر بگیرد.
- analyzer-max-enodes-for-full-dump
- حداکثر عمق گرههای گسترشیافتهای که باید پیش از تغییر به قالبی با تفصیل کمتر، در یک خروجی dot ظاهر شوند.
- analyzer-max-recursion-depth
- حداکثر دفعاتی که یک محل فراخوانی میتواند در پشته فراخوانی درون تحلیلگر ظاهر شود، پیش از پایان دادن به تحلیل فراخوانیای که بازگشت عمیقتری خواهد داشت.
- analyzer-max-svalue-depth
- حداکثر عمق یک مقدار نمادین، پیش از تقریب زدن آن به عنوان مقدار ناشناخته.
- analyzer-max-infeasible-edges
- حداکثر تعداد یالهای غیرعملیاتی برای رد کردن پیش از اعلان یک مورد تشخیصی به عنوان غیرعملی.
- gimple-fe-computed-hot-bb-threshold
- تعداد دفعات اجرای یک بلوک پایه که داغ (hot) تلقی میشود. این پارامتر فقط در GIMPLE FE استفاده میشود.
- analyzer-bb-explosion-factor
- حداکثر تعداد گرههای گسترشیافتهی 'after supernode' درون تحلیلگر به ازای هر ابرگره، پیش از پایان دادن به تحلیل.
- analyzer-text-art-string-ellipsis-threshold
- تعداد بایتهایی که فراتر از آن، لیترالهای رشتهای در نمودارهای متنی (text art) تحلیلگر با سهنقطه خلاصهسازی میشوند.
- analyzer-text-art-ideal-canvas-width
- عرض ایدهآل برحسب نویسه برای نمودارهای هنر متنی تولیدشده توسط تحلیلگر.
- analyzer-text-art-string-ellipsis-head-len
- تعداد بایتهای لیترال جهت نمایش در ابتدای یک لیترال رشتهای در هنر متنی هنگام خلاصهسازی آن.
- analyzer-text-art-string-ellipsis-tail-len
- تعداد بایتهای لیترال جهت نمایش در انتهای یک لیترال رشتهای در هنر متنی هنگام خلاصهسازی آن.
- ranger-logical-depth
- حداکثر عمق ارزیابی عبارات منطقی که ranger هنگام ارزیابی بازههای یال خروجی بررسی خواهد کرد.
- ranger-recompute-depth
- حداکثر عمق زنجیرههای دستورالعمل برای در نظر گرفتن جهت محاسبه مجدد در محاسبهگر بازه خروجی.
- relation-block-limit
- حداکثر تعداد روابطی که اوراکل در یک بلوک پایه ثبت خواهد کرد.
- transitive-relations-work-bound
- حد کاری هنگام کشف روابط تعدی از روابط موجود.
- min-pagesize
- حداقل اندازه صفحه برای اهداف هشدار و بردارسازی خروج زودهنگام (early break).
- openacc-kernels
- تعیین حالت مدیریت ساختارهای `kernels' در OpenACC. با --param=openacc-kernels=decompose، ساختارهای `kernels' در OpenACC به بخشهایی تجزیه میشوند؛ توالیای از ساختارهای محاسباتی که هر یک سپس به صورت جداگانه مدیریت میشوند. این ویژگی در حال توسعه است. با --param=openacc-kernels=parloops، ساختارهای `kernels' در OpenACC توسط گذر parloops به صورت یکپارچه مدیریت میشوند. این مقدار، پیشفرض فعلی است.
- openacc-privatization
- کنترل میکند که آیا -fopt-info-omp-note و گزینههای قابل اعمال -fdump-tree-*-details پیامهای تشخیصی خصوصیسازی OpenACC را منتشر کنند یا خیر. با --param=openacc-privatization=quiet، تشخیصی داده نمیشود. این مقدار، پیشفرض فعلی است. با --param=openacc-privatization=noisy، تشخیص انجام میشود.
- cycle-accurate-model
- مشخص میکند که آیا GCC باید در صورت عدم وجود خطای کِش (cache miss)، توصیف زمانبندی را عمدتاً یک مدل با دقت چرخه (cycle-accurate) از پردازنده مقصدی که کد قرار است روی آن اجرا شود فرض کند یا خیر. مقدار غیرصفر به این معناست که مدل زمانبندی انتخابشده دقیق بوده و احتمالاً یک پردازنده ترتیبی (in-order) را توصیف میکند، و اینکه زمانبندی باید برای تلاش جهت پر کردن حبابهای خط لوله بهطور تهاجمی عمل بیرونریزی (spill) را انجام دهد. این مقدار، پیشفرض فعلی است. مقدار صفر به این معناست که توصیف زمانبندی ممکن است در دسترس/دقیق نباشد یا شاید اصلاً قابل اعمال نباشد، مانند پردازندههای مدرن خارج از نوبت (out-of-order).
انتخابهای زیر برای name روی مقصدهای AArch64 در دسترس هستند:.IP aarch64-vect-compare-costs 4 هنگام بردارسازی (vectorizing)، استفاده از چندین رویکرد مختلف را مد نظر قرار داده و از مدل هزینه (cost model) برای انتخاب کمهزینهترین آنها استفاده میکند. این شامل موارد زیر است:
- آزمودن هر دوی SVE و Advanced SIMD، هنگامی که SVE در دسترس باشد.
- آزمودن استفاده از بردارهای ۶۴ بیتی Advanced SIMD برای کوچکترین عناصر داده، بهجای استفاده از بردارهای ۱۲۸ بیتی برای همهچیز.
- آزمودن استفاده از بردارهای SVE «بازنشده» (unpacked) برای عناصر کوچکتر. این شامل ذخیره عناصر کوچکتر در ظرفهای بزرگتر و دسترسی به عناصر با بارگذاریهای گسترشیافته (extending loads) و ذخیرهسازیهای کوتاه شده (truncating stores) است.
- aarch64-float-recp-precision
- تعداد تکرارهای نیوتن برای محاسبه معکوس در نوع float. وقتی تقریب تقسیم فعال باشد، دقت تقسیم متناسب با این پارامتر است. مقدار پیشفرض ۱ است.
- aarch64-double-recp-precision
- تعداد تکرارهای نیوتن برای محاسبه معکوس در نوع double. وقتی تقریب تقسیم فعال باشد، دقت تقسیم متناسب با این پارامتر است. مقدار پیشفرض ۲ است.
- aarch64-autovec-preference
- تحمیل یک راهبرد گزینش ISA برای بردارسازی خودکار (auto-vectorization).
- default
- استفاده از روشهای اکتشافی (heuristics) پیشفرض.
- asimd-only
- تنها استفاده از Advanced SIMD برای بردارسازی خودکار.
- sve-only
- تنها استفاده از SVE برای بردارسازی خودکار.
- prefer-asimd
- استفاده از هر دوی Advanced SIMD و SVE. ترجیح دادن Advanced SIMD هنگامی که هزینهها برابر برآورد شوند.
- prefer-sve
- استفاده از هر دوی Advanced SIMD و SVE. ترجیح دادن SVE هنگامی که هزینهها برابر برآورد شوند.
- aarch64-ldp-policy
- سیاست دقیق و جزئینگر برای جفتهای بارگذاری (ldp). با --param=aarch64-ldp-policy=default، از سیاست ساختار تنظیم (tuning structure) استفاده میشود. این پیشفرض فعلی است. با --param=aarch64-ldp-policy=always، دستور ldp صرفنظر از تراز بودن صادر میشود. با --param=aarch64-ldp-policy=never، دستور ldp صادر نمیشود. با --param=aarch64-ldp-policy=aligned، دستور ldp فقط در صورتی صادر میشود که اشارهگر مبدأ حداقل به میزان دو برابر تراز نوع مربوطه، تراز شده باشد.
- aarch64-stp-policy
- سیاست دقیق و جزئینگر برای جفتهای ذخیرهسازی (stp). با --param=aarch64-stp-policy=default، از سیاست ساختار تنظیم استفاده میشود. این پیشفرض فعلی است. با --param=aarch64-stp-policy=always، دستور stp صرفنظر از تراز بودن صادر میشود. با --param=aarch64-stp-policy=never، دستور stp صادر نمیشود. با --param=aarch64-stp-policy=aligned، دستور stp فقط در صورتی صادر میشود که اشارهگر مبدأ حداقل به میزان دو برابر تراز نوع مربوطه، تراز شده باشد.
- aarch64-ldp-alias-check-limit
- محدودیت روی تعداد بررسیهای نام مستعار (alias checks) که توسط گذر ادغام جفتهای بارگذاری/ذخیرهسازی در AArch64 هنگام تلاش برای تشکیل ldp/stp انجام میشود. مقادیر بالاتر، گذر را در بازترتیبدهی بارگذاریها روی ذخیرهسازیها تهاجمیتر میکند، به بهای افزایش زمان کامپایل.
- aarch64-ldp-writeback
- پارامتری برای کنترل اینکه در گذر ادغام جفتهای بارگذاری/ذخیرهسازی در AArch64 کدام فرصتهای بازنویسی (writeback) مورد بررسی قرار گیرند. مقدار صفر مدیریت writeback را غیرفعال میکند. مقدار یک به این معنی است که در صورت امکان برای تشکیل جفتهایی شامل یک یا چند دسترسی بازنویسی مجزای موجود تلاش شود. مقدار دو به این معنی است که همچنین تلاش شود تا با ادغام بهروزرسانیهای مخرب دنبالهدار در ثبات پایهٔ مورد استفاده یک جفت، فرصتهای بازنویسی بهصورت فرصتطلبانه ایجاد گردند.
- aarch64-loop-vect-issue-rate-niters
- تنظیمات بهینهسازی برای برخی از پردازندههای AArch64 تلاش میکند تا هنگام تصمیمگیری درباره اینکه یک حلقه باید با استفاده از SVE بردارسازی شود، با استفاده از Advanced SIMD بردارسازی شود، یا اصلاً بردارسازی نشود، هم تأخیرها (latencies) و هم نرخهای صدور (issue rates) را در نظر بگیرد. اگر این پارامتر روی n تنظیم شود، GCC از این روش اکتشافی برای حلقههایی که مشخص است در کمتر از n تکرارِ Advanced SIMD اجرا میشوند، استفاده نخواهد کرد.
- aarch64-vect-unroll-limit
- بردارساز با استفاده از اطلاعات تنظیمات در دسترس تعیین میکند که آیا باز کردن حلقهٔ اصلی بردارسازیشده سودمند است یا خیر و اینکه چقدر باید باز شود. این پارامتر حد بالایی را برای میزان باز کردن حلقه اصلی توسط بردارساز مشخص میکند. مقدار پیشفرض چهار است.
انتخابهای زیر برای name روی مقصدهای GCN در دسترس هستند:
- gcn-preferred-vectorization-factor
- ضریب بردارسازی ترجیحی: default، 32، 64.
انتخابهای زیر برای name روی مقصدهای i386 و x86_64 در دسترس هستند:
- x86-stlf-window-ninsns
- تعداد دستورالعملهایی که بالاتر از آن، جریمهٔ توقف STLF میتواند جبران شود.
- x86-stv-max-visits
- حداکثر تعداد پیمایشهای use و def هنگام کشف یک زنجیرهٔ STV پیش از آنکه عملیات کشف متوقف شود.
گزینههای ابزار دقیقسازی برنامه (Program Instrumentation Options)
کامپایلر GCC از تعدادی گزینهٔ خط فرمان پشتیبانی میکند که افزودن ابزار دقیقسازی زمان اجرا (run-time instrumentation) را به کدی که معمولاً تولید میکند، کنترل مینمایند. برای نمونه، یکی از اهداف ابزار دقیقسازی، جمعآوری آمار پروفایلسازی برای استفاده در یافتن نقاط داغ برنامه (hot spots)، تحلیل پوشش کد، یا بهینهسازیهای هدایتشده با پروفایل است. ردهٔ دیگری از ابزار دقیقسازی برنامه، افزودن بررسیهای زمان اجرا برای تشخیص خطاهای برنامهنویسی نظیر ارجاع به اشارهگرهای نامعتبر یا دسترسی خارج از محدوده به آرایهها، و همچنین حملات عمدی و خصمانه مانند درهمشکستن پشته (stack smashing) یا ربودن vtable در C++ است. همچنین یک قلاب (hook) عمومی وجود دارد که میتواند برای پیادهسازی سایر اشکال ردیابی (tracing) یا ابزار دقیقسازی در سطح تابع، برای اهداف اشکالزدایی یا تحلیل برنامه استفاده شود.
- -p
- -pg
- تولید کد
اضافی برای
نوشتن
اطلاعات
پروفایلسازی
مناسب برای
برنامهٔ
تحلیل prof
(برای -p) یا gprof
(برای -pg). شما
باید هنگام
کامپایل
کردن
فایلهای
مبدئی که
خواهان
دادههای
آنها
هستید از
این گزینه
استفاده
کنید، و
همچنین
باید هنگام
پیوند دادن
(linking) نیز آن را
بهکار
ببرید.
میتوانید از ویژگی تابع "no_instrument_function" برای جلوگیری از پروفایلسازی تکتک توابع در زمان کامپایل با این گزینهها استفاده کنید.
- -fprofile-arcs
- افزودن کد
تا مسیرهای
جریان
برنامه (arcs)
ابزار
دقیقسازی
شوند. در
طول اجرا،
برنامه ثبت
میکند که
هر انشعاب و
فراخوانی
چند بار
اجرا شده و
چند بار
منشعب شده
یا
بازگردانده
شده است. در
مقصدهایی
که از
اولویت
برای
سازندهها
پشتیبانی
میکنند،
پروفایلسازی
سازندهها،
مخربها، و
سازندهها
(و
مخربهای) C++
کلاسهایی
را که
بهعنوان
نوع یک
متغیر
سراسری
استفاده
میشوند،
بهدرستی
مدیریت
میکند.
هنگامی که برنامهٔ کامپایلشده خاتمه مییابد، این دادهها را در فایلی به نام auxname.gcda برای هر فایل مبدأ ذخیره میکند. این دادهها میتوانند برای بهینهسازیهای مبتنی بر پروفایل (-fbranch-probabilities) یا برای تحلیل پوشش آزمون (-ftest-coverage) استفاده شوند. نام auxname هر فایل شیء در صورتی که بهطور صریح مشخص شده باشد و فایل اجرایی نهایی نباشد، از نام فایل خروجی مشتق میشود؛ در غیر این صورت، نام پایهٔ (basename) فایل مبدأ خواهد بود. در هر دو حالت، هرگونه پسوند حذف میشود (بهعنوان مثال، foo.gcda برای فایل ورودی dir/foo.c، یا dir/foo.gcda برای فایل خروجی تعیینشده بهصورت -o dir/foo.o).
توجه داشته باشید که اگر یک خط فرمان مستقیماً فایلهای مبدأ را پیوند دهد، فایلهای .gcda مربوطه با نام بدون پسوند فایل خروجی پیشوندگذاری خواهند شد. بهعنوان مثال، دستور "gcc a.c b.c -o binary" فایلهای binary-a.gcda و binary-b.gcda را تولید خواهد کرد.
- -fcondition-coverage
- افزودن کد تا شرایط برنامه ابزار دقیقسازی شوند. در طول اجرا، برنامه ثبت میکند که کدام عبارات در یک گزارهٔ شرطی در تصمیمگیری سهم دارند، که این امر میتواند برای راستیآزمایی این مورد استفاده شود که آیا تمام عبارات در یک تابع بولی آزمایش شدهاند و تأثیر مستقلی بر نتیجهٔ تصمیم دارند یا خیر. نتیجه را میتوان با دستور "gcov --conditions" مشاهده کرد.
- -fpath-coverage
- افزودن کد تا مسیرهای پیمودهشده ردگیری شوند. در طول اجرا، برنامه مسیرهای اول (prime paths) پیمودهشده را ثبت میکند. تعداد مسیرها با افزایش پیچیدگی بسیار سریع رشد میکند، و GCC برای جلوگیری از انفجار زمان کامپایل، در صورتی که تعداد تقریبی مسیرها از حد کنترلشده توسط -fpath-coverage-limit فراتر رود، ابزار دقیقسازی را متوقف خواهد کرد. نتیجه را میتوان با "gcov --prime-paths --prime-paths-lines --prime-paths-source" خواند.
- -fpath-coverage-limit=limit
- آستانهای که در آن -fpath-coverage از ابزار دقیقسازی یک تابع صرفنظر میکند. این محدودیت تقریبی و محافظهکارانه است، زیرا GCC از یک روش اکتشافی بدبینانه استفاده میکند که تعداد مسیرهای در حال پردازش را کمی بیش از حد واقعی میشمارد، و اگر قبل از یافتن تمام مسیرها به این آستانه برسد، کار را متوقف میکند. این گزینه برای کنترل دقیق و جزئی روی اینکه کدام توابع ابزار دقیقسازی شوند نیست - بلکه هدف آن محدود کردن اثر انفجار مسیرها و نگهداشتن زمانهای کامپایل در حد معقول است. مقدار پیشفرض 250000 است.
- --coverage
- این گزینه برای کامپایل و پیوند دادن کدهای مجهز به ابزار دقیقسازی جهت تحلیل پوشش آزمون استفاده میشود. این گزینه معادل -fprofile-arcs -ftest-coverage (هنگام کامپایل) و -lgcov (هنگام پیوند دادن) است. برای اطلاعات بیشتر، به مستندات آن گزینهها مراجعه کنید.
- فایلهای منبع را علاوه بر این با -fprofile-abs-path کامپایل کنید تا نام مسیرهای مطلق در فایلهای .gcno ایجاد شوند. این کار به gcov اجازه میدهد در پروژههایی که کامپایلها با دایرکتوریهای کاری متفاوتی رخ میدهند، منابع صحیح را پیدا کند.
- فایلهای هدف (object files) خود را با -lgcov یا -fprofile-arcs لینک کنید (دومی شامل اولی نیز میشود).
- برنامه را
بر روی یک
بار کاری
نمونه اجرا
کنید تا
اطلاعات
پروفایل
کمانها
تولید شود.
این کار
میتواند
به هر تعداد
دفعات
تکرار شود.
شما
میتوانید
نمونههای
همروند از
برنامهتان
را اجرا
کنید، و به
شرطی که
سیستم فایل
از
قفلگذاری
پشتیبانی
کند،
فایلهای
داده به
درستی
بهروزرسانی
خواهند شد.
مگر در
حالتی که
گزینهای
سختگیرانه
برای گویش
استاندارد
ISO C فعال
باشد،
فراخوانیهای
"fork"
تشخیص داده
شده و بدون
شمارش
مضاعف به
درستی
مدیریت
میشوند.
علاوه بر این، یک فایل هدف میتواند چندین بار دوباره کامپایل شود و فایل .gcda متناظر ادغام میگردد، مادامی که فایل منبع و گزینههای کامپایلر بدون تغییر باقی بمانند.
- برای بهینهسازیهای هدایتشده با پروفایل، فایلهای منبع را دوباره با همان گزینههای بهینهسازی و تولید کد به اضافه -fbranch-probabilities کامپایل کنید.
- برای تحلیل پوشش آزمون، از gcov استفاده کنید تا اطلاعات خوانا برای انسان را از فایلهای .gcno و .gcda تولید کند. برای اطلاعات بیشتر به مستندات gcov مراجعه کنید.
با -fprofile-arcs، برای هر تابع از برنامه شما، کامپایلر GCC یک گراف جریان برنامه ایجاد میکند، سپس یک درخت پوشا برای گراف پیدا مینماید. تنها کمانهایی که روی درخت پوشا قرار ندارند باید ابزارگذاری شوند: کامپایلر کدی اضافه میکند تا تعداد دفعات اجرای این کمانها را بشمارد. هنگامی که یک کمان تنها خروجی یا تنها ورودی به یک بلوک باشد، کد ابزارگذاری میتواند به همان بلوک اضافه شود؛ در غیر این صورت، برای نگهداری کد ابزارگذاری باید یک بلوک پایه جدید ایجاد گردد.
با -fcondition-coverage، برای هر شرط در برنامه شما، GCC یک مجموعه بیتی ایجاد کرده و مقادیر بولی پیمودهشدهای را که تاثیری مستقل بر نتیجه آن عبارت دارند، ثبت میکند.
با -fpath-coverage، کامپایلر GCC مسیرهای اول (prime paths) پیمودهشده هر تابع را یافته، شمارهگذاری و ثبت میکند، مگر اینکه تعداد مسیرها از حد مجاز کنترلشده توسط -fpath-coverage-limit فراتر رود. اگر از حد مجاز فراتر رود، تابع ابزارگذاری نمیشود؛ درست مانند حالتی که -fpath-coverage استفاده نشده باشد. یک مسیر اول، طولانیترین توالی از بلوکهای یکتا (به جز احتمالاً بلوک اول و آخر) است که زیرمسیر هیچ مسیر دیگری نباشد.
- -ftest-coverage
- یک فایل یادداشتها تولید میکند که ابزار پوشش کد gcov میتواند برای نمایش پوشش برنامه از آن استفاده کند. فایل یادداشت هر فایل منبع auxname.gcno نامیده میشود. برای توصیف auxname و دستورالعملهای نحوه تولید دادههای پوشش آزمون به گزینه -fprofile-arcs در بالا مراجعه کنید. اگر بهینهسازی را انجام ندهید، دادههای پوشش با دقت بیشتری با فایلهای منبع مطابقت خواهند داشت.
- -fprofile-abs-path
- نام فایلهای منبع نسبی را به طور خودکار به نام مسیرهای مطلق در فایلهای .gcno تبدیل میکند. این به gcov امکان میدهد در پروژههایی که کامپایلها با دایرکتوریهای کاری متفاوتی انجام میشوند، فایلهای منبع صحیح را بیابد.
- -fprofile-dir=path
- دایرکتوری
جستجو برای
فایلهای
داده
پروفایل را
روی path
تنظیم
میکند. این
گزینه فقط
بر روی
دادههای
پروفایل
تولید شده
توسط -fprofile-generate،
-ftest-coverage، -fprofile-arcs و
دادههای
استفاده
شده توسط
-fprofile-use و -fbranch-probabilities و
گزینههای
مرتبط با آن
تأثیر
میگذارد.
میتوان از
هر دو مسیر
مطلق و نسبی
استفاده
کرد. به طور
پیشفرض، GCC
از
دایرکتوری
جاری به
عنوان path
استفاده
میکند،
بنابراین
فایل
دادههای
پروفایل در
همان
دایرکتوری
فایل هدف
ظاهر
میشود. به
منظور
جلوگیری از
تداخل نام
فایلها،
اگر نام
فایل هدف یک
مسیر مطلق
نباشد،
مسیر مطلق
فایل sourcename.gcda
درهمریزی
(mangle) شده و به
عنوان نام
فایل .gcda
استفاده
میشود.
جزئیات
مربوط به
نامگذاری
فایل را در
-fprofile-arcs ببینید.
گزینه
مشابه -fprofile-note
را نیز
بررسی کنید.
هنگامی که یک فایل اجرایی در یک محیط به شدت موازی اجرا میشود، توصیه میشود که پروفایل در پوشههای متفاوتی ذخیره گردد. این کار میتواند با متغیرهایی در path که در زمان اجرا export میشوند، انجام شود:
- %p
- شناسه فرایند (process ID).
- %q{VAR}
- مقدار متغیر محیطی VAR
- -fprofile-generate
- -fprofile-generate=path
- گزینههایی
را فعال
میکند که
معمولاً
برای
ابزارگذاری
برنامه به
منظور
تولید
پروفایل
کاربردی
برای
کامپایل
مجدد بعدی
همراه با
بهینهسازی
مبتنی بر
بازخورد
پروفایل
استفاده
میشوند.
باید -fprofile-generate
را هم در
زمان
کامپایل و
هم در زمان
پیوند دادن
برنامه خود
استفاده
کنید.
گزینههای زیر فعال میشوند: -fprofile-arcs، -fprofile-values، -finline-functions و -fipa-bit-cp.
اگر path مشخص شده باشد، GCC برای یافتن فایلهای داده بازخورد پروفایل به path نگاه میکند. به -fprofile-dir مراجعه کنید.
برای بهینهسازی برنامه بر اساس اطلاعات پروفایل جمعآوری شده، از -fprofile-use استفاده کنید.
- -fprofile-info-section
- -fprofile-info-section=name
- اطلاعات
پروفایل را
به جای
استفاده از
سازنده/ویرانگر
(constructor/destructor) در بخش
(section) مشخصشده
ثبت میکند.
در صورت
تعیین، نام
بخش name
خواهد بود؛
در غیر این
صورت نام
بخش به طور
پیشفرض
".gcov_info"
تعیین
میشود. یک
اشارهگر
به اطلاعات
پروفایل
تولید شده
توسط -fprofile-arcs
برای هر
واحد ترجمه
در بخش
مشخصشده
قرار
میگیرد.
این گزینه
ثبت
اطلاعات
پروفایل از
طریق
سازنده را
غیرفعال
کرده و
پردازش
اطلاعات
پروفایل از
طریق
ویرانگر را
نیز
غیرفعال
میسازد.
این گزینه
برای
استفاده در
محیطهای
میزبانیشده
(hosted) مانند GNU/Linux
در نظر
گرفته نشده
است. این
گزینه
محیطهای
مستقل (freestanding،
به عنوان
مثال
سیستمهای
تعبیهشده)
با منابع
محدود را
هدف قرار
میدهد که
از
سازندهها/ویرانگرها
یا I/O فایل
کتابخانه C
پشتیبانی
نمیکنند.
پیونددهنده میتواند بخشهای ورودی را در یک بلوک حافظه پیوسته جمعآوری کرده و نمادهای آغاز و پایان را تعریف کند. یک نمونه اسکریپت پیونددهنده 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 میتواند برای تبدیل دادههای سریالیشده جریان تولید شده توسط توابع "__gcov_filename_to_gcfn" و "__gcov_info_to_gcda" و ادغام اطلاعات پروفایل در فایلهای .gcda روی سیستم فایل میزبان استفاده شود..IP -fprofile-note=path 4 اگر path مشخص شده باشد، GCC فایل .gcno را در مکان path ذخیره میکند. اگر این گزینه را با چندین فایل مبدأ ترکیب کنید، فایل .gcno بازنویسی خواهد شد.
- -fprofile-prefix-path=path
- این گزینه میتواند در ترکیب با profile-generate=profile_dir و profile-use=profile_dir استفاده شود تا به GCC اطلاع دهد دایرکتوری پایهٔ درخت مبدأ ساختهشده کجاست. بهطور پیشفرض، profile_dir حاوی فایلهایی با مسیرهای مطلق درهمآمیخته (mangled) از تمامی فایلهای شیء پروژهٔ ساختهشده خواهد بود. این حالت زمانی که دایرکتوری مورد استفاده برای ساخت باینری ابزارگذاریشده با دایرکتوری ساخت باینری بهینهسازیشده با بازخورد پروفایل تفاوت داشته باشد مطلوب نیست، زیرا دادههای پروفایل در طول ساخت بهینهسازیشده پیدا نخواهند شد. در چنین شرایطی، میتوان از -fprofile-prefix-path=path درحالیکه path به دایرکتوری پایهٔ ساخت اشاره میکند، برای حذف بخش نامربوط مسیر و نسبی نگه داشتن تمام نامهای فایل نسبت به دایرکتوری اصلی ساخت استفاده کرد.
- -fprofile-prefix-map=old=new
- هنگام کامپایل فایلهای مستقر در دایرکتوری old، اطلاعات پروفایلگیری (با --coverage) را طوری ثبت میکند که گویی فایلها در دایرکتوری new قرار دارند. همچنین -ffile-prefix-map و -fcanon-prefix-map را ببینید.
- -fprofile-update=method
- روش
بهروزرسانی
را برای
برنامهای
که جهت
بهینهسازی
مبتنی بر
بازخورد
پروفایل
ابزارگذاری
شده است
تغییر
میدهد.
آرگومان method
باید یکی از
مقادیر single،
atomic یا prefer-atomic
باشد. مقدار
اول برای
برنامههای
تکنخی (single-threaded)
مفید است،
درحالیکه
مقدار دوم
با تولید کد
امن از نظر
نخ (thread-safe)، از
خراب شدن
دادههای
پروفایل
جلوگیری
میکند.
هشدار: اگر برنامه تمام نخها را بهدرستی الحاق (join) نکند (یا یک نخ جداشده/detached ایجاد کند)، فایل پروفایل همچنان ممکن است خراب شود.
استفاده از prefer-atomic، در صورت پشتیبانی توسط معماری هدف، به atomic و در غیر این صورت به single تبدیل میشود. گردانندهٔ GCC هنگامی که -pthread در خط فرمان وجود داشته باشد بهطور خودکار prefer-atomic را انتخاب میکند، در غیر این صورت روش پیشفرض single است.
اگر atomic انتخاب شود، اطلاعات پروفایل با استفاده از عملیات اتمیک بر پایهٔ حداکثر تلاش (best-effort) بهروزرسانی میشوند. در حالت ایدهآل، اطلاعات پروفایل از طریق عملیات اتمیک در سختافزار بهروزرسانی میشوند. با این حال، اگر بستر هدف از عملیات اتمیک سختافزاری مورد نیاز پشتیبانی نکند ولی libatomic در دسترس باشد، اطلاعات پروفایل از طریق فراخوانیهای libatomic بهروزرسانی میشوند. اگر بستر هدف نه از عملیات اتمیک سختافزاری لازم و نه از libatomic پشتیبانی کند، اطلاعات پروفایل بهطور اتمیک بهروزرسانی نمیشوند و هشداری صادر خواهد شد. در این حالت، اطلاعات پروفایلگیری بهدستآمده ممکن است برای برنامههای چندنخی خراب باشد.
به دلایل کارایی، اگر از شمارندههای ۶۴ بیتی برای اطلاعات پروفایلگیری استفاده شود و بستر هدف تنها از عملیات اتمیک ۳۲ بیتی در سختافزار پشتیبانی کند، بهروزرسانیهای حساس به کارایی پروفایل با استفاده از دو عملیات اتمیک ۳۲ بیتی برای هر بهروزرسانی شمارنده انجام میشوند. اگر یک سیگنال این دو عملیات بهروزرسانی شمارنده را قطع کند، اطلاعات پروفایلگیری ممکن است در وضعیتی ناسازگار قرار گیرند.
- -fprofile-filter-files=regex
- تنها
توابعی از
فایلها را
ابزارگذاری
میکند که
نام آنها
با هر یک از
عبارات
منظم
(جداشده با
نقطهویرگول)
مطابقت
داشته باشد.
برای مثال، -fprofile-filter-files=main\.c;module.*\.c تنها main.c و تمامی فایلهای C که نامشان با 'module' شروع میشود را ابزارگذاری خواهد کرد.
- -fprofile-exclude-files=regex
- تنها
توابعی از
فایلها را
ابزارگذاری
میکند که
نام آنها
با هیچیک
از عبارات
منظم
(جداشده با
نقطهویرگول)
مطابقت
نداشته
باشد.
برای مثال، -fprofile-exclude-files=/usr/.* از ابزارگذاری تمامی فایلهایی که در پوشهٔ /usr/ قرار دارند جلوگیری خواهد کرد.
- -fprofile-reproducible=[multithreaded|parallel-runs|serial]
- سطح
بازتولیدپذیری
پروفایل
گردآوریشده
توسط
"-fprofile-generate" را
کنترل
میکند. این
امکان ساخت
مجدد
برنامه با
همان
نتیجهٔ
یکسان را
فراهم
میآورد که
بهعنوان
مثال برای
بستههای
توزیع مفید
است.
با -fprofile-reproducible=serial، پروفایل گردآوریشده توسط -fprofile-generate بازتولیدپذیر است، مشروط بر اینکه برنامهٔ آموزشدادهشده در هر فراخوانی از اجرای آموزشی رفتار یکسانی داشته باشد، چندنخی نباشد و ارسال جریانی دادههای پروفایل همواره به همان ترتیب انجام شود. توجه داشته باشید که ارسال جریانی پروفایل در پایان اجرای برنامه و همچنین پیش از فراخوانی تابع "fork" رخ میدهد.
توجه داشته باشید که بسیار متداول است تعداد دفعات اجرای برخی از بخشهای برنامهها برای مثال به طول نامهای فایلهای موقت یا تصادفیسازی فضای حافظه (که ممکن است بر نرخ برخورد در جدول هش اثر بگذارد) بستگی داشته باشد. چنین بخشهای بازتولیدناپذیری از برنامه را میتوان با ویژگی تابع "no_instrument_function" نشانهگذاری کرد. gcov-dump همراه با -l میتواند برای تخلیهٔ دادههای گردآوریشده و بررسی بازتولیدپذیر بودن واقعی آنها استفاده شود.
با -fprofile-reproducible=parallel-runs، پروفایل گردآوریشده صرفنظر از ترتیب جریان دادهها به فایلهای gcda بازتولیدپذیر باقی میماند. این تنظیم اجرای همزمان چندین نمونه از برنامهٔ ابزارگذاریشده را بهصورت موازی (مانند استفاده از "make -j") ممکن میسازد. این کار کیفیت دادههای گردآوریشده، بهویژه پروفایلگیری فراخوانیهای غیرمستقیم را کاهش میدهد.
- -fsanitize=address
- ابزار AddressSanitizer،
یک
آشکارساز
سریع
خطاهای
حافظه را
فعال
میکند.
دستورالعملهای
دسترسی به
حافظه برای
تشخیص
خطاهای
دسترسی به
خارج از
محدوده (out-of-bounds) و
استفاده پس
از
آزادسازی
(use-after-free)
ابزارگذاری
میشوند.
این گزینه
-fsanitize-address-use-after-scope را
نیز فعال
میکند.
برای
جزئیات
بیشتر به
https://github.com/google/sanitizers/wiki/AddressSanitizer
مراجعه
کنید. رفتار
زمان اجرا
را میتوان
با استفاده
از متغیر
محیطی ASAN_OPTIONS
تحت تأثیر
قرار داد.
هنگامی که
روی "help=1"
تنظیم شود،
گزینههای
موجود در
هنگام
راهاندازی
برنامهٔ
ابزارگذاریشده
نمایش داده
میشوند.
برای دیدن
فهرست
گزینههای
پشتیبانیشده
به
https://github.com/google/sanitizers/wiki/AddressSanitizerFlags#run-time-flags
مراجعه
کنید. این
گزینه
نمیتواند
با -fsanitize=thread یا
-fsanitize=hwaddress ترکیب
شود. توجه
داشته
باشید که
تنها
بسترهای
هدفی که
-fsanitize=hwaddress در حال
حاضر روی
آنها
پشتیبانی
میشود
عبارتند از
x86-64 (تنها با
گزینههای
"-mlam=u48" یا
"-mlam=u57") و AArch64،
که در هر دو
حالت تنها
در ABIهای
دارای
اشارهگرهای
۶۴ بیتی
است.
هنگام کامپایل با -fsanitize=address، باید از -g نیز برای تولید خروجی معنادارتر استفاده کنید. برای بهدست آوردن ردگیریهای پشتهٔ دقیقتر، استفاده از گزینههایی چون -O0، -O1 یا -Og (که بهعنوان مثال از بیشتر درونریزیهای تابع جلوگیری میکنند)، -fno-optimize-sibling-calls (که از بهینهسازی فراخوانیهای همسطح و بازگشتی انتهایی جلوگیری میکند؛ این گزینه برای -O0، -O1 یا -Og ضمنی است)، یا -fno-ipa-icf (که یکسانسازی کدهای مشابه برای توابع را غیرفعال میکند) ممکن است. استفاده از -fno-omit-frame-pointer نیز ردیابی پشته را بهبود میبخشد. از آنجا که اجراهای متوالی برنامه ممکن است بهدلیل ASLR (تصادفیسازی چیدمان فضای آدرس) ردگیریهایی با آدرسهای متفاوت تولید کنند، ممکن است خاموش کردن ASLR مطلوب باشد. در لینوکس، این کار را میتوان با setarch `uname -m` -R ./prog انجام داد.
- -fsanitize=kernel-address
- ابزار AddressSanitizer را برای هسته لینوکس فعال میکند. برای جزئیات بیشتر به https://github.com/google/kernel-sanitizers مراجعه کنید.
- -fsanitize=hwaddress
- ابزار Hardware-assisted AddressSanitizer را فعال میکند که از قابلیت سختافزاری نادیده گرفتن بایت بالایی اشارهگر برای شناسایی خطاهای حافظه با سربار حافظهٔ پایین بهره میبرد. دستورالعملهای دسترسی به حافظه برای تشخیص خطاهای دسترسی به خارج از محدوده و استفاده پس از آزادسازی ابزارگذاری میشوند. این گزینه -fsanitize-address-use-after-scope را فعال میکند. برای جزئیات بیشتر به https://clang.llvm.org/docs/HardwareAssistedAddressSanitizerDesign.html مراجعه کنید. رفتار زمان اجرا را میتوان با استفاده از متغیر محیطی HWASAN_OPTIONS تحت تأثیر قرار داد. هنگامی که روی "help=1" تنظیم شود، گزینههای موجود در هنگام راهاندازی برنامهٔ ابزارگذاریشده نشان داده میشوند. این گزینه نمیتواند با -fsanitize=thread یا -fsanitize=address ترکیب شود، و در حال حاضر فقط در AArch64 در دسترس است.
- -fsanitize=kernel-hwaddress
- ابزار Hardware-assisted
AddressSanitizer را برای
کامپایل
هسته
لینوکس
فعال
میکند.
مشابه -fsanitize=kernel-address
است اما از
روش
ابزارگذاری
جایگزین
استفاده
میکند، و
مشابه -fsanitize=hwaddress
است اما با
تفاوتهای
ابزارگذاری
لازم برای
کامپایل
هسته
لینوکس. این
تفاوتها
برای
جلوگیری از
فراخوانیهای
راهاندازی
اولیهٔ
کتابخانه hwasan
و در نظر
گرفتن
تفاوت
مقدار بایت
بالایی
اشارهگر
پشته اعمال
شدهاند.
نکته: این گزینه پیشفرضهای متفاوتی نسبت به -fsanitize=hwaddress دارد. ابزارگذاری پشته و فراخوانیهای alloca بهطور پیشفرض فعال نیستند، اما همچنان با مشخص کردن گزینههای خط فرمان --param hwasan-instrument-stack=1 و --param hwasan-instrument-allocas=1 به ترتیب امکانپذیر است. استفاده از برچسب فریم تصادفی برای ابزارگذاری هسته پیادهسازی نشده است.
- -fsanitize=pointer-compare
- عملیات مقایسه (<، <=، >، >=) با عملوندهای اشارهگر را ابزارگذاری میکند. این گزینه باید یا با -fsanitize=kernel-address یا با -fsanitize=address ترکیب شود. این گزینه نمیتواند با -fsanitize=thread ترکیب شود. نکته: بهطور پیشفرض این بررسی در زمان اجرا غیرفعال است. برای فعال کردن آن، "detect_invalid_pointer_pairs=2" را به متغیر محیطی ASAN_OPTIONS اضافه کنید. استفاده از "detect_invalid_pointer_pairs=1" عملیات نامعتبر را تنها زمانی تشخیص میدهد که هر دو اشارهگر غیرتهی (non-null) باشند.
- -fsanitize=pointer-subtract
- عملیات تفریق با عملوندهای اشارهگر را ابزارگذاری میکند. این گزینه باید یا با -fsanitize=kernel-address یا با -fsanitize=address ترکیب شود. این گزینه نمیتواند با -fsanitize=thread ترکیب شود. نکته: بهطور پیشفرض این بررسی در زمان اجرا غیرفعال است. برای فعال کردن آن، "detect_invalid_pointer_pairs=2" را به متغیر محیطی ASAN_OPTIONS اضافه کنید. استفاده از "detect_invalid_pointer_pairs=1" عملیات نامعتبر را تنها زمانی تشخیص میدهد که هر دو اشارهگر غیرتهی (non-null) باشند.
- -fsanitize=shadow-call-stack
- مکانیزم ShadowCallStack
را فعال
میکند، که
یک سازوکار
بهبود
امنیتی
برای
محافظت از
برنامهها
در برابر
بازنویسی
آدرس
بازگشت
(مانند
سرریز بافر
پشته) است.
این
سازوکار با
ذخیرهٔ
آدرس
بازگشت
تابع در یک
پشتهٔ
فراخوانی
سایهٔ
تخصیصیافته
بهطور
جداگانه در
مقدمهٔ
تابع (prologue) و
بازیابی
آدرس
بازگشت از
پشتهٔ
فراخوانی
سایه در
مؤخرهٔ
تابع (epilogue) کار
میکند.
ابزارگذاری
تنها در
توابعی رخ
میدهد که
نیاز به
ذخیرهٔ
آدرس
بازگشت در
پشته دارند.
در حال حاضر این مکانیزم تنها از بستر aarch64 پشتیبانی میکند. این ویژگی بهطور ویژه برای هستههای لینوکسی که گزینهٔ CONFIG_SHADOW_CALL_STACK را فعال کردهاند طراحی شده است. برای برنامههای فضای کاربر، در حال حاضر پشتیبانی زمان اجرا در libc و libgcc ارائه نمیشود. کاربرانی که میخواهند از این ویژگی در فضای کاربر استفاده کنند باید خودشان پشتیبانی زمان اجرا را فراهم کنند. باید توجه داشت که این کار ممکن است موجب نقض قوانین ABI شود.
در aarch64، ابزارگذاری از ثبات بستری "x18" استفاده میکند. این امر عموماً به این معناست که هر کدی که ممکن است در همان نخی اجرا شود که کد کامپایلشده با ShadowCallStack اجرا میشود، باید با پرچم -ffixed-x18 کامپایل شود، در غیر این صورت توابعی که بدون -ffixed-x18 کامپایل شدهاند ممکن است "x18" را بازنویسی (clobber) کرده و در نتیجه اشارهگر پشتهٔ سایه را خراب کنند.
همچنین، از آنجا که هیچ پشتیبانی زمان اجرایی در فضای کاربر وجود ندارد، کد کامپایلشده با ShadowCallStack نمیتواند از مدیریت استثنا (exception handling) استفاده کند. از -fno-exceptions برای خاموش کردن استثناها استفاده کنید.
برای جزئیات بیشتر به https://clang.llvm.org/docs/ShadowCallStack.html مراجعه کنید..IP -fsanitize=thread 4 فعالسازی ThreadSanitizer، یک آشکارساز سریع رقابت دادهای (data race). دستورالعملهای دسترسی به حافظه برای شناسایی اشکالات رقابت دادهای ابزارگذاری (instrument) میشوند. برای جزئیات بیشتر به 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، یک آشکارساز نشت حافظه (memory leak). این گزینه تنها هنگام پیوند دادن (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
- این گزینه بررسی تعریفنشده نبودن نتیجهٔ عملیات شیفت را فعال میکند. توجه داشته باشید آنچه دقیقاً تعریفنشده محسوب میشود، بین 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" را به یک فراخوانی پیام خطایابی (diagnostic) تبدیل میکند. هنگام رسیدن به فراخوانی "__builtin_unreachable"، رفتار تعریفنشده خواهد بود.
- -fsanitize=vla-bound
- این گزینه به کامپایلر دستور میدهد تا مثبت بودن اندازهٔ آرایههای با طول متغیر (VLA) را بررسی کند.
- -fsanitize=null
- این گزینه بررسی اشارهگرها را فعال میکند. بهویژه، برنامهای که با این گزینه کامپایل شود زمانی که بخواهد یک اشارهگر NULL را ارجاعزدایی (dereference) کند، یا اگر ارجاعی (احتمالاً یک ارجاع rvalue) به یک اشارهگر NULL مقید شود، یا متدی روی شیئی فراخوانی شود که توسط یک اشارهگر NULL نشان داده شده است، یک پیام خطا صادر میکند.
- -fsanitize=return
- این گزینه بررسی دستورات return را فعال میکند. برنامههایی که با فعال بودن این گزینه ساخته شوند، اگر انتهای یک تابع غیر-void بدون برگرداندن واقعی یک مقدار فرا برسد، پیام خطایی صادر میکنند. این گزینه فقط در ++C کار میکند.
- -fsanitize=signed-integer-overflow
- این گزینه
بررسی
سرریز
اعداد صحیح
علامتدار
را فعال
میکند.
بررسی
میشود که
نتیجهٔ
"+"،
"*" و هر
دو عملگر
یکانی و
دوتایی
"-" در
محاسبات
علامتدار
سرریز نکند.
این گزینه
همچنین
تقسیم
علامتدار
"INT_MIN / -1" را
نیز
شناسایی
میکند.
توجه داشته
باشید
قواعد
ارتقای
اعداد صحیح
باید در نظر
گرفته
شوند؛
بنابراین
مورد زیر یک
سرریز
محسوب
نمیشود:
signed char a = SCHAR_MAX; a++;
- -fsanitize=bounds
- این گزینه ابزارگذاری کرانهای آرایه را فعال میکند. دسترسیهای خارج از کران گوناگونی تشخیص داده میشوند. اعضای آرایه منعطف (flexible array members)، آرایههای شبهعضو-آرایهمنعطف، و مقداردهندههای متغیرهای با حافظه استاتیک ابزارگذاری نمیشوند؛ مگر آرایههای شبهعضو-آرایهمنعطفی که گزینههای "-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
- این گزینه ابزارگذاری فراخوانیها را فعال کرده و بررسی میکند مقادیر null به آرگومانهایی که با صفت تابعی "nonnull" بهعنوان نیازمند مقدار غیر null علامتگذاری شدهاند ارسال نشوند.
- -fsanitize=returns-nonnull-attribute
- این گزینه ابزارگذاری دستورات return را در توابعی که با صفت تابعی "returns_nonnull" مشخص شدهاند فعال میکند تا بازگرداندن مقادیر null از چنین توابعی را شناسایی کند.
- -fsanitize=bool
- این گزینه ابزارگذاری بارگذاریها از نوع bool را فعال میکند. اگر مقداری غیر از 0/1 بارگذاری شود، خطای زمان اجرا صادر میشود.
- -fsanitize=enum
- این گزینه ابزارگذاری بارگذاریها از یک نوع enum را فعال میکند. اگر مقداری خارج از محدودهٔ مقادیر نوع enum بارگذاری شود، خطای زمان اجرا صادر خواهد شد.
- -fsanitize=vptr
- این گزینه ابزارگذاری فراخوانیهای توابع عضو، دسترسیهای اعضا و برخی تبدیلها میان اشارهگرهای کلاسهای پایه و مشتقشده در ++C را برای اطمینان از صحت نوع پویای (dynamic type) شیء ارجاعشده فعال میکند.
- -fsanitize=pointer-overflow
- این گزینه ابزارگذاری محاسبات اشارهگر را فعال میکند. اگر محاسبات اشارهگر دچار سرریز شود، یک خطای زمان اجرا صادر میشود.
- -fsanitize=builtin
- این گزینه ابزارگذاری آرگومانهای توابع توکار (builtin) منتخب را فعال میکند. اگر مقدار نامعتبری به چنین آرگومانهایی داده شود، خطای زمان اجرا صادر میشود؛ برای نمونه، ارسال 0 بهعنوان آرگومان به "__builtin_ctz" یا "__builtin_clz" موجب رفتار تعریفنشده میشود و توسط این گزینه تشخیص داده خواهد شد.
توجه داشته باشید که ضدعفونیکنندهها معمولاً نرخ هشدارهای مثبت کاذب (false positive) را افزایش میدهند، بهویژه هشدارهای مربوط به -Wmaybe-uninitialized. ما ترکیب -Werror و استفاده از ضدعفونیکنندهها را توصیه نمیکنیم.
در حالی که -ftrapv باعث ایجاد تله (trap) برای سرریزهای علامتدار میشود، -fsanitize=undefined یک پیام خطایابی ارائه میدهد. این ویژگی در حال حاضر تنها برای خانواده زبانهای C کار میکند.
- -fno-sanitize=all
- این گزینه تمام ضدعفونیکنندههایی را که پیشتر فعال شده بودند غیرفعال میکند. گزینهٔ -fsanitize=all مجاز نیست، زیرا برخی از ضدعفونیکنندهها نمیتوانند همزمان استفاده شوند.
- -fasan-shadow-offset=number
- این گزینه GCC را مجبور میکند تا از یک آفست سایه (shadow offset) سفارشی در بررسیهای AddressSanitizer استفاده کند. این گزینه برای آزمایش طرحبندیهای مختلف حافظه سایه (shadow memory) در Kernel AddressSanitizer مفید است.
- -fsanitize-sections=s1,s2,...
- ضدعفونی کردن متغیرهای سراسری در بخشهای (sections) سفارشی تعیینشده توسط کاربر. si میتواند شامل نویسههای عام (wildcards) باشد.
- -fsanitize-recover[=opts]
- گزینهٔ
-fsanitize-recover= حالت
بازیابی از
خطا را برای
ضدعفونیکنندههای
ذکرشده در
فهرستِ با
کاما
جداشدهٔ opts
کنترل
میکند.
فعال کردن
این گزینه
برای یک
مؤلفهٔ
ضدعفونیکننده
سبب میشود
تا برنامه
تلاش کند
بهگونهای
به اجرا
ادامه دهد
که گویی
خطایی رخ
نداده است.
این بدان
معناست که
در یک بار
اجرای
برنامه
ممکن است
چندین خطای
زمان اجرا
گزارش شود،
و حتی در
صورت گزارش
خطاها، کد
خروج
برنامه
میتواند
موفقیتآمیز
بودن را
نشان دهد.
گزینهٔ
-fno-sanitize-recover=
میتواند
برای تغییر
این رفتار
استفاده
شود: تنها
اولین خطای
شناساییشده
گزارش
میشود و
سپس برنامه
با یک کد
خروج غیر
صفر پایان
مییابد.
در حال حاضر این ویژگی تنها برای -fsanitize=undefined (و زیرگزینههای آن به جز -fsanitize=unreachable و -fsanitize=return)، -fsanitize=float-cast-overflow، -fsanitize=float-divide-by-zero، -fsanitize=bounds-strict، -fsanitize=kernel-address و -fsanitize=address کار میکند. برای این ضدعفونیکنندهها، بازیابی از خطا بهطور پیشفرض فعال است، به جز -fsanitize=address که این ویژگی در آن آزمایشی است. -fsanitize-recover=all و -fno-sanitize-recover=all نیز پذیرفته میشوند؛ اولی بازیابی را برای تمام ضدعفونیکنندههای پشتیبانیکننده فعال میکند و دومی آن را برای تمام این ضدعفونیکنندهها غیرفعال میسازد.
حتی اگر حالت بازیابی در سمت کامپایلر روشن باشد، باید در سمت کتابخانه زمان اجرا (runtime) نیز فعال گردد؛ در غیر این صورت، خرابیها همچنان مهلک خواهند بود. مقدار پیشفرض کتابخانه زمان اجرا برای 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 فعالسازی پاکسازی متغیرهای محلی برای تشخیص باگهای 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" روی خط فرمان فعال شده باشد، ابزارگذاری (instrumentation) نادیده گرفته میشود چرا که ابزارگذاری همواره به پشتیبانی "libubsan" نیاز دارد؛ گزینهٔ -fsanitize-trap=vptr مجاز نیست.
- -fsanitize-undefined-trap-on-error
-
گزینهٔ -fsanitize-undefined-trap-on-error معادل منسوخشدهٔ -fsanitize-trap=all است.
- -fsanitize-coverage=trace-pc
-
فعالسازی ابزارگذاری کد برای فازینگ مبتنی بر پوشش (coverage-guided fuzzing). یک فراخوانی به "__sanitizer_cov_trace_pc" در هر بلوک پایه درج میکند. - -fsanitize-coverage=trace-cmp
-
فعالسازی ابزارگذاری کد برای فازینگ هدایتشده با جریان داده (dataflow guided fuzzing). یک فراخوانی به "__sanitizer_cov_trace_cmp1"، "__sanitizer_cov_trace_cmp2"، "__sanitizer_cov_trace_cmp4" یا "__sanitizer_cov_trace_cmp8" برای مقایسههای عدد صحیح با هر دو عملوند متغیر؛ یا "__sanitizer_cov_trace_const_cmp1"، "__sanitizer_cov_trace_const_cmp2"، "__sanitizer_cov_trace_const_cmp4" یا "__sanitizer_cov_trace_const_cmp8" برای مقایسههای عدد صحیح با یک عملوند ثابت؛ و "__sanitizer_cov_trace_cmpf" یا "__sanitizer_cov_trace_cmpd" برای مقایسههای float یا double و "__sanitizer_cov_trace_switch" برای دستورهای switch درج میکند.
- -fcf-protection=[full|branch|return|none|check]
- -fcf-protection
-
فعالسازی ابزارگذاری کد برای افزایش امنیت برنامه از طریق بررسی معتبر بودن آدرسهای مقصد دستورهای انتقال جریان کنترل (مانند فراخوانی غیرمستقیم تابع، بازگشت از تابع، پرش غیرمستقیم). این کار از منحرف کردن جریان کنترل به یک مقصد غیرمنتظره جلوگیری میکند. هدف آن محافظت در برابر تهدیدهایی مانند Return-oriented Programming (ROP) و به طور مشابه call/jmp-oriented programming (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" برابر با ۱، و دومین بیتِ "__CET__" برای "return" برابر با ۱ تنظیم میشود. همچنین میتوانید از صفت "nocf_check" برای مشخص ساختن اینکه کدام توابع و فراخوانیها باید از ابزارگذاری مستثنی شوند، استفاده کنید. در حال حاضر، مقصد x86 GNU/Linux پیادهسازی مبتنی بر Intel Control-flow Enforcement Technology (CET) را ارائه میدهد که برای پردازندههای i686 یا جدیدتر کار میکند.
- -fharden-compares
-
برای هر آزمایش منطقی که از بهینهسازیهای gimple باقی میماند و شرط یک شاخهٔ شرطی نیست (برای مثال، شرایط بررسیشده برای جابهجاییهای شرطی، یا برای ذخیره در متغیرهای دودویی/بولی)، کد اضافهای صادر میشود تا شرط معکوس محاسبه و راستیآزمایی گردد، و در صورت عدم تطابق نتایج، "__builtin_trap" فراخوانی شود. برای پوشش تمام ساختارهای شرطی، به همراه -fharden-conditional-branches استفاده شود. - -fharden-conditional-branches
-
برای هر انشعاب شرطی غیربرداری که از بهینهسازیهای gimple باقی میماند، کد اضافهای صادر میشود تا شرط معکوس را محاسبه و راستیآزمایی کند، و در صورت غیرمنتظره بودن نتیجه، "__builtin_trap" را فراخوانی کند. برای پوشش تمام ساختارهای شرطی، به همراه -fharden-compares استفاده شود. - -fharden-control-flow-redundancy
-
کد اضافهای صادر میکند تا هنگام ورود به بلوکهای پایه متغیرهای بولی تنظیم شوند، و در خروجیهای تابع، در صورتی که این متغیرهای بولی مسیر اجرایی سازگار با گراف جریان کنترل تشکیل ندهند، بازبینی انجام شده و trap صادر شود. راستیآزمایی پیش از بازگشتها، پیش از فراخوانیهای نهایی اجباری (mandatory tail calls - زیر را ببینید) و به صورت اختیاری، پیش از خروج استثناها با -fhardcfr-check-exceptions، پیش از فراخوانیهای دارای بازگشت با -fhardcfr-check-returning-calls، و پیش از فراخوانیهای noreturn با -fhardcfr-check-noreturn-calls صورت میگیرد. گزینههای تنظیم دقیق --param hardcfr-max-blocks و --param hardcfr-max-inline-blocks در دسترس هستند. بهینهسازی فراخوانی نهایی (Tail call) در مراحل بسیار متأخر رخ میدهد و نمیتواند بر افزونگی جریان کنترل تأثیر بگذارد، اما فراخوانیهایی که توسط فرانتاندهای زبان به عنوان فراخوانی نهایی اجباری نشانهگذاری شدهاند، و هر فراخوانی که به اندازهٔ کافی زود به عنوان فراخوانی نهایی بالقوه علامتگذاری شده باشد نیز راستیآزمایی را پیش از فراخوانی صادر خواهند کرد؛ هرچند این احتمالات صرفاً نظری هستند، چرا که این شرایط تنها با استفاده از پلاگینهای سفارشی کامپایلر محقق میشوند.
- -fhardcfr-skip-leaf
-
غیرفعالسازی -fharden-control-flow-redundancy در توابع برگی (leaf functions).
- -fhardcfr-check-exceptions
-
هنگامی که -fharden-control-flow-redundancy فعال باشد، مسیر اجرای ثبتشده را در نقاط فرار استثنا با گراف جریان کنترل تطبیق میدهد؛ گویی بدنهٔ تابع در یک گردانندهٔ پاکسازی (cleanup) پیچیده شده که بررسی را انجام داده و استثنا را مجدداً پرتاب میکند (reraise). این گزینه به صورت پیشفرض فعال است؛ برای غیرفعال کردن آن از -fno-hardcfr-check-exceptions استفاده کنید.
- -fhardcfr-check-returning-calls
-
هنگامی که -fharden-control-flow-redundancy فعال است، مسیر اجرای ثبتشده را پیش از هر فراخوانی تابعی که بلافاصله با بازگشت نتیجهاش (در صورت وجود) دنبال میشود، در برابر گراف جریان کنترل بررسی میکند، تا مانع از بهینهسازی فراخوانی نهایی (tail-call) نشود، صرفنظر از اینکه در نهایت به یک فراخوانی نهایی بهینهسازی شود یا خیر. این گزینه به صورت پیشفرض هر زمان که بهینهسازیهای فراخوانی همزاد (sibling call) فعال باشند، فعال است (ببینید -foptimize-sibling-calls)، اما میتواند به صراحت و صرفنظر از بهینهسازیها فعال (یا با استفاده از شکل منفی آن، غیرفعال) شود.
- -fhardcfr-check-noreturn-calls=[always|no-xthrow|nothrow|never]
-
هنگامی که -fharden-control-flow-redundancy فعال باشد، مسیر اجرای ثبتشده را پیش از فراخوانیهای "noreturn" با گراف جریان کنترل بررسی میکند؛ یا در تمام آنها (always)، یا آنهایی که انتظار نمیرود کنترل را از طریق یک استثنا به فراخواننده بازگردانند (no-xthrow، حالت پیشفرض)، یا آنهایی که ممکن نیست کنترل را از طریق استثنا به فراخواننده بازگردانند (nothrow)، یا هیچکدام از آنها (never). بررسی پیش از یک تابع "noreturn" که ممکن است کنترل را از طریق استثنا به فراخواننده بازگرداند، میتواند در صورتی که استثنا در فراخواننده مدیریت شود (چه توسط یک گرداننده و چه توسط یک cleanup)، موجب شود بررسی بیش از یک بار انجام گیرد. هنگامی که -fhardcfr-check-exceptions نیز فعال باشد، کامپایلر از مرتبط ساختن فراخوانی "noreturn" با گردانندهٔ cleanup اضافه شده به طور ضمنی خودداری میکند، زیرا با بررسی انجامشده پیش از فراخوانی تکراری و افزونه خواهد بود؛ با این حال سایر گردانندهها یا cleanupها در تابع در صورت فعال شدن، مسیر اجرای ثبتشده را تغییر داده و با رسیدن به یک نقطهٔ بررسی دیگر، مجدداً آن را بررسی میکنند. این نقطهٔ بازرسی حتی میتواند فراخوانی "noreturn" دیگری باشد، بنابراین ممکن است بازبینی چندین بار انجام شود. بهینهسازهای مختلف ممکن است حتی در غیاب صفتهای متناظر باعث شوند فراخوانیها به عنوان "noreturn" و/یا "nothrow" علامتگذاری شوند، که این امر میتواند بر محل قرارگیری بررسیها پیش از فراخوانیها، و همچنین افزودن گردانندههای cleanup ضمنی برای آنها تأثیر بگذارد. این غیرقابلپیشبینی بودن، و این واقعیت که پرتاب و پرتاب مجدد مکرر استثناها عملاً به منزلهٔ فراخوانی ضمنی توابع "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 سیستم قدیمیتر از نسخه ۲٫۳۵ باشد، -D_FORTIFY_SOURCE=2 به جای آن استفاده میشود. این گزینه برای استفاده در ساختهای محیط عملیاتی (production) در نظر گرفته شده است، و نه صرفاً در ساختهای خطایابی (debug). در حال حاضر، -fhardened تنها در مقصدهای GNU/Linux پشتیبانی میشود. -fhardened تنها در صورتی یک گزینهٔ مشخص را فعال میکند که قبلاً در هیچ کجای خط فرمان مشخص نشده باشد. به عنوان مثال، -fhardened -fstack-protector تنها -fstack-protector را فعال خواهد کرد، اما -fstack-protector-strong را فعال نخواهد کرد..IP -fstack-protector 4 تولید کد اضافی برای بررسی سرریزهای بافر، مانند حملات تخریب پشته (stack smashing). این کار با افزودن یک متغیر محافظ به توابعی با اشیاء آسیبپذیر انجام میشود. این شامل توابعی است که "alloca" را فراخوانی میکنند، و توابعی با بافرهای بزرگتر یا مساوی ۸ بایت. متغیرهای محافظ هنگام ورود به تابع مقداردهی اولیه میشوند و هنگام خروج تابع بررسی میگردند. اگر بررسی محافظ شکست بخورد، یک پیام خطا چاپ شده و برنامه پایان مییابد. تنها متغیرهایی در نظر گرفته میشوند که واقعاً روی پشته تخصیص یافتهاند؛ متغیرهایی که با بهینهسازی حذف شدهاند یا متغیرهایی که در ثباتها تخصیص یافتهاند به حساب نمیآیند. - -fstack-protector-all
-
مانند -fstack-protector با این تفاوت که تمام توابع محافظت میشوند.
- -fstack-protector-strong
-
مانند -fstack-protector اما شامل توابع بیشتری برای محافظت میشود --- توابعی که تعریف آرایههای محلی دارند، یا ارجاعاتی به آدرسهای فریم محلی دارند. تنها متغیرهایی که واقعاً روی پشته تخصیص یافتهاند در نظر گرفته میشوند؛ متغیرهایی که با بهینهسازی حذف شدهاند یا متغیرهایی که در ثباتها تخصیص یافتهاند به حساب نمیآیند.
- -fstack-protector-explicit
-
مانند -fstack-protector اما تنها توابعی را محافظت میکند که دارای ویژگی "stack_protect" هستند. - -fstack-check
-
تولید کد برای وارسی اینکه از مرز پشته فراتر نروید. اگر در محیطی با چندین رشته (چندنخی) برنامه را اجرا میکنید باید این پرچم را مشخص کنید، اما در یک محیط تکنخی بهندرت نیاز به تعیین آن پیدا میکنید، زیرا در صورتی که فقط یک پشته وجود داشته باشد، سرریز پشته تقریباً روی تمام سیستمها بهطور خودکار تشخیص داده میشود. توجه داشته باشید که این سوییچ در عمل باعث انجام بررسی نمیشود؛ سیستمعامل یا زماناجرای زبان باید این کار را انجام دهند. این سوییچ باعث تولید کدی میشود تا اطمینان حاصل گردد که آنها گسترش پشته را میبینند. علاوه بر این میتوانید یک پارامتر رشتهای مشخص کنید: no به معنی عدم بررسی، generic به معنای اجبار در استفاده از بررسی سنتی (قدیمی)، و specific به معنی استفاده از بهترین روش بررسی و معادل با حالت سادهٔ -fstack-check است. بررسی سنتی یک سازوکار عمومی است که به هیچ پشتیبانی مقصد خاصی در کامپایلر نیاز ندارد، اما دارای معایب زیر است:
- 1.
-
استراتژی تخصیص اصلاحشده برای اشیاء بزرگ: در صورتی که اندازهٔ آنها از یک آستانهٔ ثابت فراتر رود، همواره بهصورت پویا تخصیص مییابند. توجه داشته باشید که این ممکن است معناشناسی برخی کدها را تغییر دهد.
- 2.
-
محدودیت ثابت روی اندازهٔ فریم ایستای توابع: هنگامی که یک تابع خاص از این حد فراتر رود، بررسی پشته قابل اعتماد نخواهد بود و هشداری توسط کامپایلر صادر میشود.
- 3.
-
ناکارآمدی: هم بهدلیل استراتژی تخصیص اصلاحشده و هم بهدلیل پیادهسازی عمومی، کارایی کد تضعیف میشود.
توجه داشته باشید که اگر پشتیبانی مقصد در کامپایلر اضافه نشده باشد، بررسی سنتی پشته روش جایگزین (fallback) برای specific نیز خواهد بود. گزینهٔ -fstack-check= برای نیازهای زبان Ada بهمنظور تشخیص بازگشت بینهایت و سرریزهای پشته طراحی شده است. مقدار specific هنگام کامپایل کدهای Ada انتخابی عالی است. این گزینه بهطور کلی برای محافظت در برابر حملات تلاقی پشته (stack-clash) کافی نیست. برای محافظت در برابر آنها باید از -fstack-clash-protection استفاده کنید.
- -fstack-clash-protection
-
تولید کد برای جلوگیری از حملات سبک تلاقی پشته (stack clash). هنگامی که این گزینه فعال است، کامپایلر در هر بار فقط یک صفحه از فضای پشته را تخصیص میدهد و بلافاصله پس از تخصیص به هر صفحه دسترسی پیدا میکند. بدین ترتیب، از پرش تخصیصها روی هر صفحهٔ محافظ پشته که توسط سیستمعامل فراهم شده جلوگیری میکند. بیشتر مقاصد بهطور کامل از محافظت تلاقی پشته پشتیبانی نمیکنند. با این حال، در این مقاصد، گزینهٔ -fstack-clash-protection از تخصیصهای پویای پشته محافظت خواهد کرد. همچنین اگر مقصد از -fstack-check=specific پشتیبانی کند، -fstack-clash-protection ممکن است محافظت محدودی برای تخصیصهای ایستای پشته نیز فراهم سازد.
- -fstack-limit-register=reg
- -fstack-limit-symbol=sym
- -fno-stack-limit
-
تولید کد برای اطمینان از اینکه پشته از یک مقدار معین فراتر رشد نکند؛ چه مقدار یک ثبات باشد یا نشانی یک نماد. اگر پشتهٔ بزرگتری نیاز باشد، یک سیگنال در زمان اجرا ارسال میشود. برای اکثر مقاصد، این سیگنال قبل از اینکه پشته از مرز فراتر رود ارسال میگردد، بنابراین دریافت سیگنال بدون نیاز به تمهیدات ویژه امکانپذیر است. برای نمونه، اگر پشته از نشانی مطلق 0x80000000 شروع شده و رو به پایین رشد کند، میتوانید از پرچمهای -fstack-limit-symbol=__stack_limit و -Wl,--defsym,__stack_limit=0x7ffe0000 برای اعمال محدودیت پشتهٔ 128KB استفاده کنید. توجه داشته باشید که این ممکن است تنها با پیونددهندهٔ GNU کار کند. میتوانید بررسی محدودیت پشته را بهطور محلی با استفاده از ویژگی تابع "no_stack_limit" لغو کنید. - -fsplit-stack
-
تولید کد برای تقسیم خودکار پشته پیش از سرریز شدن آن. برنامهٔ حاصل دارای پشتهای ناپیوسته است که تنها در صورتی میتواند سرریز شود که برنامه قادر به تخصیص حافظهٔ بیشتر نباشد. این قابلیت هنگام اجرای برنامههای چندنخی بیشترین فایده را دارد، زیرا دیگر نیازی به محاسبهٔ اندازهٔ مناسب پشته برای هر نخ نیست. این ویژگی در حال حاضر تنها برای مقاصد x86 که GNU/Linux را اجرا میکنند پیادهسازی شده است. هنگامی که کد کامپایلشده با -fsplit-stack کدی را فراخوانی میکند که بدون -fsplit-stack کامپایل شده است، ممکن است فضای پشتهٔ زیادی برای اجرای کد دوم در دسترس نباشد. اگر کامپایل تمام کدها، از جمله کدهای کتابخانه، با -fsplit-stack میسر نباشد، پیونددهنده میتواند این فراخوانیها را اصلاح کند تا کدی که بدون -fsplit-stack کامپایل شده است همیشه پشتهای بزرگ داشته باشد. پشتیبانی از این ویژگی در پیونددهندهٔ gold در نگارش 2.21 بستهٔ GNU binutils و بعد از آن پیادهسازی شده است.
- -fstrub=disable
-
غیرفعالسازی کامل پاکسازی پشته (stack scrubbing) و نادیدهگرفتن تمام ویژگیهای "strub". ببینید - -fstrub=strict
-
حالت پیشفرض توابع به وضعیت "disabled" در "strub" تنظیم میشود و این محدودیت بهصورت سختگیرانه (strict) اعمال میگردد که تنها توابع مرتبط با حالتهای "strub"-"callable" (شامل "at-calls"، "callable" و "always_inline" "internal") توسط توابعی با حالتهای فعالشدهٔ "strub" (شامل "at-calls" و "internal") قابل فراخوانی ("callable") هستند.
- -fstrub=relaxed
-
بازگردانی تنظیمات پیشفرض پاکسازی پشته ("strub")، بدین صورت که "strub" تنها بنا بر نیاز مشخصشده توسط ویژگیهای "strub" مرتبط با تابع و انواع داده فعال میشود. مقدار "Relaxed" بدین معنی است که زمینههای strub تنها از فراخوانی توابعی بازداشته میشوند که صراحتاً به حالت "disabled" در "strub" مرتبط شدهاند. این گزینه تنها برای باطل کردن سایر گزینههای -fstrub=* که پیش از آن در خط فرمان آمدهاند مفید است.
- -fstrub=at-calls
-
فعالسازی حالت "at-calls" در "strub" در صورت امکانپذیر بودن. کاربرد اصلی این گزینه برای آزمایش است. این گزینه سازوکار "strub" را در سناریوهایی که کاملاً محلی برای یک واحد ترجمه هستند به کار میگیرد. این حالت "strub" رابطهای توابع را تغییر میدهد، بنابراین هر تابعی که برای سایر واحدهای ترجمه قابل مشاهده باشد، یا آدرس آن گرفته شده باشد، تحت تأثیر این گزینه قرار نخواهد گرفت. گزینههای بهینهسازی نیز ممکن است بر امکانپذیر بودن تأثیر بگذارند. برای جزئیات دربارهٔ نیازمندیهای امکانپذیری و واجد شرایط بودن، به مستندات ویژگی "strub" مراجعه کنید.
- -fstrub=internal
-
فعالسازی حالت "internal" در "strub" در صورت امکانپذیر بودن. کاربرد اصلی این گزینه برای آزمایش است. هدف این گزینه آزمودن دقیق بخشهایی از سازوکار "strub" است که حالت کمبازدهتر اما نگهدارندهٔ رابط "strub" را پیادهسازی میکنند. توابعی که تحت تأثیر این گزینه قرار نگیرند بسیار نادر هستند.
- -fstrub=all
-
فعالسازی یکی از حالتهای "strub" در صورت امکانپذیر بودن. هنگامی که هر دو حالت strub امکانپذیر باشند، حالت "at-calls" ترجیح داده میشود. گزینهٔ -fdump-ipa-strubm ویژگیهایی به تابع اضافه میکند که نشان میدهد چه حالتی برای هر تابع انتخاب شده است. کاربرد اصلی این گزینه برای آزمایش و سنجش دقیق سازوکار "strub" است.
- -fvtable-verify=[std|preinit|none]
-
این گزینه تنها هنگام کامپایل کدهای ++C در دسترس است. این گزینه قابلیت امنیتیای را فعال (یا در صورت استفاده از -fvtable-verify=none غیرفعال) میکند که در زمان اجرا، برای هر فراخوانی مجازی، معتبر بودن اشارهگر vtable که فراخوانی از طریق آن انجام میشود را برای نوع شیء بررسی کرده و اطمینان حاصل میکند که تخریب نشده یا بازنویسی نشده باشد. اگر در زمان اجرا اشارهگر vtable نامعتبری شناسایی شود، خطایی گزارش شده و اجرای برنامه بلافاصله متوقف میشود. این گزینه باعث میشود که ساختارهای دادهٔ زمان اجرا در هنگام آغاز برنامه ساخته شوند، ساختارهایی که برای وارسی اشارهگرهای vtable استفاده میشوند. گزینههای std و preinit زمان ساخته شدن این ساختارهای داده را کنترل میکنند. در هر دو حالت، ساختارهای داده پیش از رسیدن اجرا به "main" ساخته میشوند. استفاده از -fvtable-verify=std باعث میشود ساختارهای داده پس از بارگذاری و مقداردهی اولیهٔ کتابخانههای مشترک ساخته شوند. گزینهٔ -fvtable-verify=preinit باعث میشود آنها پیش از بارگذاری و مقداردهی اولیهٔ کتابخانههای مشترک ساخته شوند. اگر این گزینه چندین بار با مقادیر متفاوتی در خط فرمان مشخص شود، none بالاترین اولویت را نسبت به هر دوی std و preinit دارد؛ و preinit نسبت به std اولویت دارد. - -fvtv-debug
-
هنگامی که در ترکیب با -fvtable-verify=std یا -fvtable-verify=preinit استفاده شود، باعث فراخوانی نسخههای اشکالزدایی توابع زمان اجرا برای قابلیت اعتبارسنجی vtable میشود. این پرچم همچنین باعث میشود کامپایلر اطلاعات مربوط به اشارهگرهای vtable یافتشده برای هر کلاس را ثبت کند. این اطلاعات در فایلی به نام vtv_set_ptr_data.log در پوشهای که توسط متغیر محیطی VTV_LOGS_DIR مشخص شده (در صورت تعریف شدن) یا در غیر این صورت در دایرکتوری کاری فعلی نوشته میشود. نکته: این قابلیت دادهها را به انتهای فایل گزارش اضافه (appends) میکند. اگر یک فایل گزارش تازه میخواهید، حتماً هر فایل موجود را حذف کنید..IP -fvtv-counts 4 این یک پرچم اشکالزدایی است. هنگامی که همراه با -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" را اختصاص داد، که در این صورت این ابزارگذاری انجام نمیشود. از این قابلیت میتوان برای نمونه برای توابع تحلیل عملکرد فهرستشده در بالا، روتینهای وقفه با اولویت بالا و هر تابعی که نمیتوان توابع تحلیل عملکرد را با ایمنی از درون آن فراخواند (شاید گردانندههای سیگنال، در صورتی که روالهای تحلیل عملکرد خروجی تولید کرده یا حافظه تخصیص دهند) استفاده کرد.
- -finstrument-functions-once
- این گزینه
مشابه -finstrument-functions
است، اما
توابع
تحلیل
عملکرد
تنها یک بار
به ازای هر
تابع
ابزارگذاریشده
فراخوانی
میشوند؛
بدین معنا
که نخستین
تابع تحلیل
عملکرد پس
از نخستین
ورود به
تابع
ابزارگذاریشده،
و دومین
تابع تحلیل
عملکرد پیش
از خروج
متناظر با
این ورود
نخست
فراخوانده
میشود.
تعریف "once" برای اهداف این گزینه تا حدودی مبهم است زیرا پیادهسازی در برابر رقابت دادهای (data races) محافظت نشده است. در نتیجه، پیادهسازی تنها تضمین میکند که توابع تحلیل عملکرد حداقل یک بار در هر فرایند و حداکثر یک بار در هر ریسه فراخوانی شوند، اما فراخوانیها همواره جفت هستند؛ یعنی اگر یک ریسه تابع نخست را فراخوانی کند، سپس تابع دوم را نیز فراخواهد خواند، مگر اینکه هرگز به نقطهٔ خروج تابع ابزارگذاریشده نرسد.
- -finstrument-functions-exclude-file-list=file,file,...
- تعیین
فهرست
فایلهایی
که توابع
آنها از
ابزارگذاری
مستثنی
میشوند
(توضیحات
-finstrument-functions را
ببینید).
اگر فایلی
که حاوی
تعریف تابع
است با یکی
از مقادیر
file مطابقت
داشته
باشد، آن
تابع
ابزارگذاری
نمیشود.
تطابق بر
پایهٔ
زیررشته
انجام
میگیرد:
اگر
پارامتر file
زیررشتهای
از نام فایل
باشد، یک
تطابق به
شمار
میآید.
برای نمونه:
-finstrument-functions-exclude-file-list=/bits/stl,include/sys
هر تابع درونخطی تعریفشده در فایلهایی را که مسیرشان شامل /bits/stl یا include/sys باشد مستثنی میکند.
اگر به هر دلیلی میخواهید نویسهٔ , را در یکی از sym بگنجانید، , را بنویسید. برای نمونه، -finstrument-functions-exclude-file-list=',,tmp' (به علامت نقلقول تکی در اطراف گزینه دقت کنید).
- -finstrument-functions-exclude-function-list=sym,sym,...
- این گزینه مشابه -finstrument-functions-exclude-file-list است، اما فهرستی از نامهای توابع را جهت مستثنی شدن از ابزارگذاری تعیین میکند. نام تابعی که تطبیق داده میشود، نام قابل مشاهده برای کاربر است، مانند "vector<int> blah(const vector<int> &)"، نه نام درهمپیچیدهٔ داخلی (مانند "_Z4blahRSt6vectorIiSaIiEE"). این تطابق روی زیررشتهها انجام میشود: اگر پارامتر sym زیررشتهای از نام تابع باشد، منطبق به شمار میآید. برای شناسههای گسترشیافتهٔ C99 و C++، نام تابع باید در قالب UTF-8 مشخص شود و نباید از نامهای نویسهٔ فراگیر (universal character names) استفاده کرد.
- -fpatchable-function-entry=N[,M]
- تولید N
دستور NOP
درست در
آغاز هر
تابع،
بهطوری که
نقطهٔ ورود
تابع پیش از
Mاُمین NOP
قرار
میگیرد.
اگر M حذف
شود، مقدار
پیشفرض آن
0 خواهد
بود تا
نقطهٔ ورود
تابع
دقیقاً به
نشانی
نخستین NOP
اشاره کند.
دستورهای NOP
فضای اضافی
را رزرو
میکنند که
در صورت
قابل نوشتن
بودن قطعه
کد (code segment)،
میتوان از
آن برای
وصلهزدن
هرگونه
ابزارگذاری
دلخواه در
زمان اجرا
استفاده
کرد. مقدار
این فضا
بهطور
غیرمستقیم
از طریق
تعداد NOPها
قابل کنترل
است؛ دستور
NOP
بهکاررفته
متناظر با
دستوری است
که توسط
رابط پشتی
داخلی GCC
یعنی
"gen_nop"
صادر
میشود. این
رفتار
وابسته به
معماری
مقصد است و
ممکن است به
گونهٔ
معماری و/یا
سایر
گزینههای
کامپایل
نیز وابسته
باشد.
برای شناسایی در زمان اجرا، نشانیهای آغازین این نواحی که متناظر با ورودیهای توابع مربوطه منهای M هستند، علاوه بر این در بخش "__patchable_function_entries" از فایل اجرایی حاصل جمعآوری میشوند.
توجه داشته باشید که مقدار "__attribute__ ((patchable_function_entry (N,M)))" بر گزینهٔ خط فرمان -fpatchable-function-entry=N,M اولویت دارد. این ویژگی میتواند برای افزایش اندازهٔ این ناحیه یا حذف کامل آن در یک تابع به کار رود. اگر "N=0" باشد، هیچ مکانی برای لایهگذاری ثبت نمیشود.
دستورهای NOP در نشانی ورود تابع --- و بسته به M، شاید پیش از آن --- حتی قبل از مقدمه (prologue) درج میشوند. در PowerPC با ساختار ELFv2 ABI، برای تابعی با نقاط ورود دوگانه، نقطهٔ ورود محلی بهطور پیشفرض همان نشانی ورود تابع است. برای تغییر این حالت، گزینهٔ -msplit-patch-nops را ببینید.
بیشینهٔ مقدار N و M برابر ۶۵۵۳۵ است. در 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
- نام name را از پیش به عنوان یک ماکرو، با مقدار تعریفشدهٔ 1 تعریف میکند.
- -D name=definition
- محتویات definition
نشانهگذاری
(tokenized) شده و
طوری
پردازش
میشوند که
گویی در فاز
سوم ترجمه
در یک
دستورالعمل
#define ظاهر
شدهاند.
بهویژه،
تعریف با
نویسههای
خطجدیدِ
درونمتنی
بریده
میشود.
اگر پیشپردازنده را از یک شل (shell) یا برنامهای شبیه شل فراخوانی میکنید، ممکن است لازم باشد از نحو نقلقول (quoting) شل برای محافظت از نویسههایی مانند فاصلهها که در نحو شل معنای خاصی دارند، استفاده نمایید.
اگر مایلید یک ماکروی تابعمانند را در خط فرمان تعریف کنید، فهرست آرگومانهای آن را به همراه پرانتزهای دور آن پیش از علامت مساوی (در صورت وجود) بنویسید. پرانتزها برای بیشتر شلها معنادار هستند، بنابراین باید گزینه را درون نقلقول قرار دهید. با sh و csh، عبارت -D'name(args...)=definition' کار میکند.
گزینههای -D و -U به ترتیبی که در خط فرمان داده شدهاند پردازش میشوند. تمام گزینههای -imacros file و -include file پس از همهٔ گزینههای -D و -U پردازش میگردند.
- -U name
- هرگونه تعریف قبلی از name را، چه توکار باشد و چه با گزینهٔ -D ارائه شده باشد، لغو میکند.
- -include file
- فایل file را
طوری
پردازش
میکند که
گویی "#include
"file"" در خط
اول فایل
منبع اصلی
قرار داشته
است. با این
حال،
نخستین
دایرکتوری
که برای
جستجوی file
بررسی
میشود،
دایرکتوری
کاری
پیشپردازنده
است به جای
دایرکتوری
حاوی فایل
منبع اصلی.
اگر آنجا
پیدا نشود،
همانند
حالت عادی
در باقی
زنجیرهٔ
جستجوی
"#include "...""
جستجو
میشود.
اگر چندین گزینهٔ -include داده شود، فایلها به همان ترتیبی که در خط فرمان آمدهاند اضافه (include) میشوند.
- -imacros file
- دقیقاً
مانند -include
است، به جز
اینکه هر
خروجی
تولیدشده
از پویش file
دور ریخته
میشود.
ماکروهایی
که تعریف
میکند،
تعریفشده
باقی
میمانند.
این امر به
شما امکان
میدهد
تمام
ماکروهای
یک سرآیند (header)
را بدون
پردازش
اعلانهای
آن به دست
آورید.
تمامی فایلهای مشخصشده با -imacros پیش از تمامی فایلهای مشخصشده با -include پردازش میشوند.
- -undef
- هیچ ماکروی ویژهٔ سیستم یا ویژهٔ GCC را از پیش تعریف نمیکند. ماکروهای استانداردِ از پیش تعریفشده همچنان تعریفشده باقی میمانند.
- -pthread
- ماکروهای اضافی مورد نیاز برای استفاده از کتابخانهٔ ریسههای پازیکس (POSIX threads) را تعریف میکند. شما باید از این گزینه بهطور پیوسته هم برای کامپایل و هم برای پیونددهی استفاده کنید. این گزینه در مقصدهای GNU/Linux، بیشتر مشتقات دیگر Unix و همچنین مقصدهای x86 Cygwin و MinGW پشتیبانی میشود.
- -M
- به جای
خروجی دادن
نتیجهٔ
پیشپردازش،
قاعدهای
مناسب برای
make خروجی
میدهد که
وابستگیهای
فایل منبع
اصلی را
توصیف
میکند.
پیشپردازنده
یک قاعدهٔ
make خروجی
میدهد که
شامل نام
فایل شیء (object file)
برای آن
فایل منبع،
یک دونقطه،
و نام تمام
فایلهای include
شده، از
جمله
مواردی که
از
گزینههای
خط فرمان -include
یا -imacros
میآیند
است.
مگر اینکه بهطور صریح مشخص شده باشد (با -MT یا -MQ)، نام فایل شیء شامل نام فایل منبع است که پسوند آن با پسوند فایل شیء جایگزین شده و هرگونه بخش دایرکتوری ابتدایی آن حذف شده است. اگر فایلهای include شده زیاد باشند، قاعده با استفاده از \-خطجدید به چندین سطر تقسیم میشود. این قاعده هیچ فرمانی ندارد.
این گزینه خروجی اشکالزدایی پیشپردازنده مانند -dM را متوقف نمیکند. برای جلوگیری از تداخل چنین خروجی اشکالزدایی با قواعد وابستگی، باید صریحاً فایل خروجی وابستگی را با -MF مشخص کنید، یا از یک متغیر محیطی مانند DEPENDENCIES_OUTPUT استفاده نمایید. خروجی اشکالزدایی همچنان طبق معمول به جریان خروجی عادی فرستاده میشود.
ارسال -M به درایور مستلزم اعمال ضمنی -E است و هشدارها را با یک -w ضمنی متوقف میکند.
- -MM
- شبیه به -M
است، اما از
فایلهای
سرآیندی که
در
دایرکتوریهای
سرآیند
سیستم یافت
میشوند،
یا
فایلهای
سرآیندی که
بهطور
مستقیم یا
غیرمستقیم
از چنین
سرآیندی include
شدهاند،
نامی
نمیبرد.
این بدان معناست که انتخاب براکتهای زاویهدار یا نقلقول جفت در یک دستورالعمل #include بهخودیخود تعیین نمیکند که آیا آن سرآیند در خروجی وابستگی -MM ظاهر میشود یا خیر.
- -MF file
- هنگامی که
همراه با -M
یا -MM
استفاده
شود، فایلی
را برای
نوشتن
وابستگیها
در آن مشخص
میکند. اگر
سوئیچ -MF
داده نشود،
پیشپردازنده
قواعد را به
همان جایی
میفرستد
که خروجی
پیشپردازششده
را ارسال
میکرد.
زمانی که همراه با گزینههای درایور -MD یا -MMD استفاده شود، -MF فایل خروجی وابستگی پیشفرض را بازنویسی میکند.
اگر file برابر با - باشد، وابستگیها در stdout نوشته میشوند.
- -MG
- همراه با
گزینهای
مانند -M که
درخواست
تولید
وابستگی را
دارد، -MG
فرض میکند
که
فایلهای
سرآیند
ناموجود،
فایلهای
تولیدشونده
هستند و
آنها را
بدون ایجاد
خطا به
فهرست
وابستگیها
اضافه
میکند. نام
فایل
وابستگی
مستقیماً
از
دستورالعمل
"#include"
بدون اضافه
کردن هیچ
مسیری
برداشته
میشود. -MG
همچنین
خروجی
پیشپردازششده
را متوقف
میکند،
زیرا یک
سرآیند
ناموجود آن
را
بیفایده
میسازد.
این ویژگی در بهروزرسانی خودکار makefileها استفاده میشود.
- -Mno-modules
- تولید وابستگی برای رابطهای ماژول کامپایلشده را غیرفعال میکند.
- -MP
- این گزینه
به CPP دستور
میدهد تا
یک هدف
ساختگی (phony target)
برای هر
وابستگی به
جز فایل
اصلی اضافه
کند، که
باعث
میشود هر
کدام به هیچ
چیز وابسته
نباشند. این
قواعد
ساختگی
خطاهایی را
که make هنگام
حذف
فایلهای
سرآیند
بدون
بهروزرسانی
متناظر Makefile
صادر
میکند،
دور
میزنند.
این یک خروجی معمول است:
test.o: test.c test.h test.h:
- -MT target
- هدفِ
قاعدهای
که با تولید
وابستگی
صادر
میشود را
تغییر
میدهد.
بهطور
پیشفرض، CPP
نام فایل
ورودی اصلی
را
برمیدارد،
هرگونه
مؤلفهٔ
دایرکتوری
و پسوند
فایلی
مانند .c را
حذف میکند
و پسوند
معمول فایل
شیء برای آن
پلتفرم را
الحاق
مینماید.
نتیجه، هدف
(target) خواهد
بود.
یک گزینهٔ -MT هدف را دقیقاً همان رشتهای تنظیم میکند که مشخص کردهاید. اگر اهداف متعددی میخواهید، میتوانید آنها را به عنوان یک آرگومان واحد به -MT بدهید، یا از چندین گزینهٔ -MT استفاده نمایید.
برای مثال، -MT '$(objpfx)foo.o' ممکن است چنین خروجی دهد:
$(objpfx)foo.o: foo.c
- -MQ target
- همانند -MT
است، اما هر
نویسهای
را که برای Make
خاص است
درون
نقلقول
قرار
میدهد.
دستور
-MQ '$(objpfx)foo.o' این
خروجی را
میدهد:
$$(objpfx)foo.o: foo.c
هدف پیشفرض بهطور خودکار درون نقلقول قرار میگیرد، درست مانند اینکه با -MQ مشخص شده باشد.
- -MD
- گزینهٔ -MD
معادل -M -MF file
است، با این
تفاوت که -E
بهصورت
ضمنی اعمال
نمیشود.
درایور file
را بر این
اساس که آیا
گزینهٔ -o
داده شده
است یا خیر
تعیین
میکند. اگر
داده شده
باشد،
درایور از
آرگومان آن
اما با
پسوند .d
استفاده
میکند، در
غیر این
صورت نام
فایل ورودی
را
برمیدارد،
هرگونه
مؤلفهٔ
دایرکتوری
و پسوند آن
را حذف
میکند و
پسوند .d را
روی آن
اعمال
مینماید.
اگر -MD همراه با -E استفاده شود، هر سوئیچ -o به عنوان مشخصکنندهٔ فایل خروجی وابستگی تفسیر میشود، اما اگر بدون -E استفاده شود، هر -o به عنوان مشخصکنندهٔ فایل شیء هدف شناخته میشود.
از آنجا که -E بهطور ضمنی اعمال نمیشود، میتوان از -MD برای ایجاد یک فایل خروجی وابستگی به عنوان اثر جانبی فرایند کامپایل استفاده کرد.
- -MMD
- مانند -MD است، با این تفاوت که تنها فایلهای سرآیند کاربر را ذکر میکند، نه فایلهای سرآیند سیستم را.
- -fpreprocessed
- به
پیشپردازنده
نشان
میدهد که
فایل ورودی
قبلاً
پیشپردازش
شده است.
این گزینه
مواردی
مانند بسط
ماکرو،
تبدیل trigraph،
اتصال خطوط
ادامهدار
با خطجدید
فراریافته،
و پردازش
بیشتر
دستورالعملها
را لغو
میکند.
پیشپردازنده
همچنان
توضیحها
را شناسایی
و حذف
میکند، به
طوری که
میتوانید
فایلی را که
با -C
پیشپردازش
شده است
بدون مشکل
به
کامپایلر
بفرستید. در
این حالت،
پیشپردازندهٔ
یکپارچهشده
عملاً چیزی
بیش از یک
نشانهگذار
(tokenizer) برای
فرانتاندها
نیست.
گزینهٔ -fpreprocessed در صورتی که فایل ورودی دارای یکی از پسوندهای .i، .ii یا .mi باشد، بهطور ضمنی فعال است. اینها پسوندهایی هستند که GCC برای فایلهای پیشپردازششدهٔ ایجادشده توسط -save-temps به کار میبرد..IP -fdirectives-only 4 هنگام پیشپردازش، دستورات پیشپردازنده را مدیریت کن، اما ماکروها را بسط نده.
رفتار این گزینه به گزینههای -E و -fpreprocessed بستگی دارد.
با -E، پیشپردازش به مدیریت دستوراتی مانند "#define"، "#ifdef" و "#error" محدود میشود. سایر عملیات پیشپردازنده، مانند بسط ماکرو و تبدیل سهنگارهها (trigraphs) انجام نمیشوند. علاوه بر این، گزینهٔ -dD بهطور ضمنی فعال میشود.
با -fpreprocessed، پیشتعریف ماکروهای خط فرمان و بیشتر ماکروهای توکار غیرفعال میشود. ماکروهایی مانند "__LINE__" که به زمینه وابسته هستند، به شکل عادی پردازش میشوند. این امر امکان کامپایل فایلهایی را فراهم میکند که پیشتر با "-E -fdirectives-only" پیشپردازش شدهاند.
با استفادهٔ همزمان از -E و -fpreprocessed، قوانین مربوط به -fpreprocessed اولویت دارند. این امر پیشپردازش کامل فایلهایی را ممکن میسازد که پیشتر با "-E -fdirectives-only" پیشپردازش شدهاند.
- -fdollars-in-identifiers
- پذیرفتن $ در شناسهها.
- -fextended-identifiers
- پذیرفتن نامهای نویسهٔ سراسری (universal character names) و نویسههای گسترشیافته در شناسهها. این گزینه بهطور پیشفرض برای C99 (و نسخههای بعدی استاندارد C) و ++C فعال است.
- -fno-canonical-system-headers
- هنگام پیشپردازش، مسیر هدرهای سیستم را با متعارفسازی (canonicalization) کوتاه نکن.
- -fmax-include-depth=depth
- تعیین بیشینهٔ عمق تو در تو بودن #include. پیشفرض ۲۰۰ است.
- -fsearch-include-path[=kind]
- جستجوی
فایلهای
ورودی در
مسیر #include، نه
فقط در
دایرکتوری
جاری. این
بهویژه
برای
ماژولهای
C++20 مفید است
که در آن هر
دوی
واحدهای
سرآیند و
واحدهای
رابط ماژول
باید
مستقیماً
کامپایل
شوند:
g++ -c -std=c++20 -fmodules -fsearch-include-path bits/stdc++.h bits/std.cc
مقدار kind بهطور پیشفرض برابر با user است، که مسیر جستجوی #include "..." را بررسی میکند؛ همچنین میتوانید بهصراحت system را برای مسیر جستجوی "#include <...>" مشخص کنید.
- -ftabstop=width
- تعیین فاصلهٔ بین ایستگاههای تب (tab stops). این به پیشپردازنده کمک میکند تا شمارهٔ ستونهای صحیح را در هشدارها یا خطاها گزارش دهد، حتی اگر تبها روی خط وجود داشته باشند. اگر مقدار کمتر از ۱ یا بیشتر از ۱۰۰ باشد، از این گزینه صرفنظر میشود. مقدار پیشفرض ۸ است.
- -ftrack-macro-expansion[=level]
- ردیابی
مکان
توکنها در
طول بسط
ماکروها.
این به
کامپایلر
اجازه
میدهد تا
هنگام وقوع
خطای
کامپایل در
بسط یک
ماکرو،
پیامهای
عیبیابی
را دربارهٔ
پشتهٔ بسط
ماکروی
جاری صادر
کند.
استفاده از
این گزینه
باعث مصرف
حافظهٔ
بیشتر توسط
پیشپردازنده
و کامپایلر
میشود. از
پارامتر level
میتوان
برای
انتخاب سطح
دقت ردیابی
مکان
توکنها
استفاده
کرد تا در
صورت لزوم
مصرف حافظه
کاهش یابد.
مقدار 0
برای level این
گزینه را
غیرفعال
میکند.
مقدار 1
مکان
توکنها را
در حالتی
تنزلیافته
به منظور
حداقل
سربار
حافظه
ردیابی
میکند. در
این حالت
تمام
توکنهای
حاصل از بسط
یک آرگومان
ماکروی
تابعگونه
(function-like) مکان
یکسانی
دارند.
مقدار 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. اگر locale مشخص نکرده باشد، یا GCC نتواند این اطلاعات را از locale دریافت کند، مقدار پیشفرض UTF-8 است. این مقدار میتواند توسط locale یا این گزینهٔ خط فرمان بازنویسی شود. در حال حاضر در صورت وجود تعارض، گزینهٔ خط فرمان اولویت دارد. charset میتواند هر کدگذاری پشتیبانیشده توسط روال کتابخانهای "iconv" سیستم باشد.
- -fpch-deps
- هنگام استفاده از سرآیندهای از پیش کامپایلشده، این پرچم باعث میشود که پرچمهای خروجی وابستگی، فایلهای موجود در وابستگیهای سرآیند از پیش کامپایلشده را نیز فهرست کنند. در صورت عدم تعیین، تنها سرآیند از پیش کامپایلشده فهرست میشود و نه فایلهایی که برای ایجاد آن استفاده شدهاند، زیرا در زمان استفاده از یک سرآیند از پیش کامپایلشده، به آن فایلها مراجعه نمیشود.
- -fpch-preprocess
- این گزینه
امکان
استفاده از
سرآیند از
پیش
کامپایلشده
را همراه با
-E فراهم
میکند. این
گزینه یک
"#pragma"
ویژه به
صورت "#pragma GCC
pch_preprocess
"filename""
در خروجی
درج میکند
تا مکانی را
که سرآیند
از پیش
کامپایلشده
پیدا شده و
نام فایل filename
آن را
علامتگذاری
کند. زمانی
که -fpreprocessed در
حال
استفاده
است، GCC این
"#pragma" را
تشخیص داده
و PCH را
بارگذاری
میکند.
این گزینه بهطور پیشفرض غیرفعال است، زیرا خروجی پیشپردازششدهٔ حاصل، واقعاً فقط به عنوان ورودی برای GCC مناسب است. این گزینه توسط -save-temps روشن میشود.
شما نباید این "#pragma" را در کد خود بنویسید، اما در صورتی که فایل PCH در مکان دیگری در دسترس باشد، ویرایش نام فایل ایمن است. نام فایل میتواند مطلق باشد یا نسبت به دایرکتوری جاری GCC نسبی باشد.
- -fworking-directory
- فعالسازی تولید نشانگرهای خط (linemarkers) در خروجی پیشپردازنده که به کامپایلر اجازه میدهد دایرکتوری کاری جاری را در زمان پیشپردازش بداند. هنگامی که این گزینه فعال باشد، پیشپردازنده پس از نشانگر خط اولیه، دومین نشانگر خط را شامل دایرکتوری کاری جاری به همراه دو اسلش صادر میکند. GCC در صورت وجود این دایرکتوری در ورودی پیشپردازششده، از آن به عنوان دایرکتوری صادرشده برای دایرکتوری کاری جاری در برخی قالبهای اطلاعات اشکالزدایی استفاده میکند. این گزینه در صورت فعال بودن اطلاعات اشکالزدایی بهطور ضمنی فعال میشود، اما میتوان با شکل نقیض -fno-working-directory از آن جلوگیری کرد. اگر پرچم -P در خط فرمان وجود داشته باشد، این گزینه هیچ تاثیری ندارد، زیرا اصلاً هیچ دستور "#line" صادر نمیشود.
- -A predicate=answer
- ایجاد یک ادعا (assertion) با گزارهٔ predicate و پاسخ answer. این شکل به شکل قدیمیتر -A predicate(answer)، که هنوز پشتیبانی میشود، ترجیح داده میشود زیرا از نویسههای خاص پوسته استفاده نمیکند.
- -A -predicate=answer
- لغو یک ادعا (assertion) با گزارهٔ predicate و پاسخ answer.
- -C
- توضیحات (comments)
را دور
نریز. تمام
توضیحات به
فایل خروجی
منتقل
میشوند،
به جز
توضیحات
موجود در
دستورات
پردازششده
که همراه با
خود دستور
حذف
میشوند.
هنگام استفاده از -C باید برای عوارض جانبی آماده باشید؛ این گزینه باعث میشود پیشپردازنده توضیحات را به عنوان توکنهای مستقل در نظر بگیرد. برای مثال، توضیحاتی که در ابتدای یک خط دستور ظاهر میشوند این اثر را دارند که آن خط را به یک خط مبدأ معمولی تبدیل میکنند، زیرا اولین توکن روی خط دیگر یک # نیست.
- -CC
- توضیحات را
دور نریز،
از جمله در
حین بسط
ماکرو. این
مانند -C
است، با این
تفاوت که
توضیحات
داخل
ماکروها
نیز در جایی
که ماکرو
بسط
مییابد به
فایل خروجی
منتقل
میشوند.
علاوه بر عوارض جانبی گزینهٔ -C، گزینهٔ -CC باعث میشود تمام توضیحات به سبک ++C درون یک ماکرو به توضیحات به سبک C تبدیل شوند. این کار برای جلوگیری از این است که استفادهٔ بعدی از آن ماکرو سهواً بقیهٔ خط مبدأ را تبدیل به توضیح نکند.
گزینهٔ -CC بهطور کلی برای پشتیبانی از توضیحات lint استفاده میشود.
- -P
- جلوگیری از تولید نشانگرهای خط در خروجی پیشپردازنده. این ممکن است هنگام اجرای پیشپردازنده روی چیزی که کد C نیست و قرار است به برنامهای ارسال شود که ممکن است با نشانگرهای خط دچار سردرگمی شود، مفید باشد.
- -traditional
- -traditional-cpp
- تلاش برای
تقلید از
رفتار
پیشپردازندههای
C پیش از
استاندارد،
در مقایسه
با
پیشپردازندههای
ISO C. برای
جزئیات به
راهنمای GNU CPP
مراجعه
کنید.
توجه داشته باشید که GCC در غیر این صورت تلاشی برای شبیهسازی کامپایلر C پیش از استاندارد نمیکند، و این گزینهها فقط با سوییچ -E یا هنگام فراخوانی صریح CPP پشتیبانی میشوند.
- -trigraphs
- پشتیبانی
از
سهنگارههای
ISO C (trigraphs). اینها
دنبالههای
سه
نویسهای
هستند که
همگی با ??
شروع
میشوند و
توسط ISO C برای
نشان دادن
نویسههای
منفرد
تعریف
شدهاند.
برای مثال،
??/
نمایانگر \
است،
بنابراین
'??/n' یک ثابت
نویسهای
برای خط
جدید (newline) است.
نه سهنگاره و جایگزینهای آنها عبارتند از:
Trigraph: ??( ??) ??< ??> ??= ??/ ??' ??! ??- Replacement: [ ] { } # \ ^ | ~بهطور پیشفرض، GCC سهنگارهها را نادیده میگیرد، اما در حالتهای منطبق با استاندارد آنها را تبدیل میکند. گزینههای -std و -ansi را ببینید..IP -remap 4 فعالسازی کدهای ویژه برای دور زدن محدودیتهای سیستمفایلهایی که فقط نامهای فایل بسیار کوتاه را میپذیرند، مانند MS-DOS.
- -H
- علاوه بر سایر فعالیتهای عادی، نام هر فایل سرایند (header) استفادهشده را چاپ میکند. هر نام دندانهدار میشود تا عمق آن در پشتهٔ #include نشان داده شود. فایلهای سرایند پیشکامپایلشده نیز چاپ میشوند، حتی اگر نامعتبر تشخیص داده شوند؛ یک فایل سرایند پیشکامپایلشدهٔ نامعتبر با ...x و یک فایل معتبر با ...! چاپ میشود.
- -dletters
- دستور میدهد که در حین کامپایل، نسخههای تخلیهٔ اشکالزدایی (debugging dumps) همانطور که با letters مشخص شده ایجاد شوند. پرچمهای مستندشده در اینجا مواردی هستند که به پیشپردازنده مربوط میشوند. سایر letters توسط خود کامپایلر تفسیر میشوند یا برای نسخههای آیندهٔ GCC رزرو شدهاند، و بنابراین بدون هیچ هشداری نادیده گرفته میشوند. اگر letters مشخصشده با یکدیگر تعارض رفتاری داشته باشند، نتیجه تعریفنشده خواهد بود.
- -dM
- به جای
خروجی
عادی،
فهرستی از
دستورالعملهای
#define برای
تمام
ماکروهای
تعریفشده
در طول
اجرای
پیشپردازنده،
از جمله
ماکروهای
پیشتعریفشده
را تولید
میکند. این
کار راهی
برای آگاهی
از
ماکروهای
پیشتعریفشده
در نسخهٔ
پیشپردازندهٔ
شما فراهم
میکند. با
فرض اینکه
هیچ فایلی
با نام foo.h
ندارید،
دستور
touch foo.h; cpp -dM foo.h
تمام ماکروهای پیشتعریفشده را نشان میدهد.
اگر از -dM بدون گزینهٔ -E استفاده کنید، -dM به عنوان مترادفی برای -fdump-rtl-mach تفسیر میشود.
- -dD
- مانند -dM، به جز اینکه هم دستورالعملهای #define و هم نتیجهٔ پیشپردازش را در خروجی قرار میدهد. هر دو نوع خروجی به فایل خروجی استاندارد فرستاده میشوند.
- -dN
- مانند -dD، اما فقط نام ماکروها را در خروجی قرار میدهد، نه بسط آنها را.
- -dI
- علاوه بر نتیجهٔ پیشپردازش، دستورالعملهای #include را نیز در خروجی قرار میدهد.
- -dU
- مانند -dD، به جز اینکه فقط ماکروهایی در خروجی قرار میگیرند که بسط داده شده باشند یا تعریفشدن آنها در دستورالعملهای پیشپردازنده آزموده شده باشد؛ خروجی تا زمان استفاده یا آزمودن ماکرو به تأخیر میافتد؛ و دستورالعملهای #undef نیز برای ماکروهایی که آزموده شدهاند ولی در آن هنگام تعریفنشده بودند در خروجی قرار میگیرند.
- -fdebug-cpp
- این گزینه
فقط برای
اشکالزدایی
GCC مفید است.
هنگامی که
از طریق CPP یا
همراه با -E
استفاده
شود،
اطلاعات
اشکالزدایی
مربوط به
نگاشت
مکانها (location maps)
را تخلیه
میکند. پیش
از هر توکن
در خروجی،
تخلیهٔ
نگاشتی که
مکان آن
توکن به آن
تعلق دارد
درج میشود.
هنگامی که از طریق GCC بدون -E استفاده شود، این گزینه هیچ اثری ندارد.
- -Wp,option
- میتوانید از -Wp,option برای دور زدن گردانندهٔ کامپایلر (compiler driver) و ارسال مستقیم option به پیشپردازنده استفاده کنید. اگر option دارای کاما باشد، در محل کاماها به چندین گزینه تفکیک میشود. با این حال، بسیاری از گزینهها پیش از ارسال به پیشپردازنده توسط گردانندهٔ کامپایلر تغییر یافته، ترجمه یا تفسیر میشوند، و -Wp این مرحله را اجباراً دور میزند. رابط کاربری مستقیم پیشپردازنده نامستند و در معرض تغییر است، بنابراین در صورت امکان باید از بهکارگیری -Wp خودداری کرده و در عوض اجازه دهید گرداننده گزینهها را مدیریت کند.
- -Xpreprocessor option
- گزینهٔ option
را به
پیشپردازنده
ارسال
میکند.
میتوانید
از این
گزینه برای
فراهم کردن
گزینههای
پیشپردازندهٔ
مختص
سیستمی
استفاده
کنید که GCC
آنها را
نمیشناسد.
اگر میخواهید گزینهای را ارسال کنید که آرگومان میگیرد، باید دوبار از -Xpreprocessor استفاده کنید، یکبار برای گزینه و یکبار برای آرگومان.
- -no-integrated-cpp
- پیشپردازش را به عنوان یک مرحلهٔ مجزا پیش از کامپایل انجام میدهد. به طور پیشفرض، GCC پیشپردازش را به عنوان بخشی یکپارچه از توکنسازی ورودی و تجزیه انجام میدهد. اگر این گزینه ارائه شود، پیشانهٔ زبان مناسب (cc1، cc1plus یا cc1obj به ترتیب برای C، C++ و Objective-C) در عوض دوبار فراخوانی میشود، یکبار فقط برای پیشپردازش و بار دیگر برای کامپایل واقعی ورودیِ پیشپردازششده. این گزینه ممکن است در ترکیب با گزینههای -B یا -wrapper مفید باشد تا یک پیشپردازندهٔ جایگزین را مشخص کرده یا پردازش اضافی روی کد منبع برنامه بین پیشپردازش عادی و کامپایل انجام شود.
ارسال گزینهها به اسمبلر (Passing Options to the Assembler)
میتوانید گزینهها را به اسمبلر ارسال کنید.
- -Wa,option
- گزینهٔ option را به عنوان یک گزینه به اسمبلر ارسال میکند. اگر option حاوی کاما باشد، در محل کاماها به چندین گزینه تفکیک میشود.
- -Xassembler option
- گزینهٔ option
را به عنوان
یک گزینه به
اسمبلر
ارسال
میکند.
میتوانید
از این
گزینه برای
فراهم کردن
گزینههای
اسمبلر
مختص
سیستمی
استفاده
کنید که GCC
آنها را
نمیشناسد.
اگر میخواهید گزینهای را ارسال کنید که یک آرگومان میگیرد، باید دوبار از -Xassembler استفاده کنید، یکبار برای گزینه و یکبار برای آرگومان.
گزینههای پیوند دادن (Options for Linking)
این گزینهها زمانی به کار میآیند که کامپایلر فایلهای شیء (object files) را در یک فایل خروجی اجرایی پیوند میدهد. اگر کامپایلر مرحلهٔ پیوند را انجام ندهد، این گزینهها بیمعنی هستند.
- object-file-name
- نام فایلی که به پسوند شناختهشدهٔ خاصی ختم نمیشود، به عنوان نام یک فایل شیء یا کتابخانه در نظر گرفته میشود. (پیونددهنده فایلهای شیء را بر اساس محتویات فایل از کتابخانهها متمایز میکند.) در صورت انجام پیوند، این فایلهای شیء به عنوان ورودی پیونددهنده استفاده میشوند.
- -c
- -S
- -E
- اگر هر یک از این گزینهها استفاده شود، پیونددهنده اجرا نمیشود و نباید از نام فایلهای شیء به عنوان آرگومان استفاده کرد.
- -flinker-output=type
- این گزینه
تولید کد
بهینهساز
زمان پیوند
(LTO) را کنترل
میکند. به
طور
پیشفرض،
خروجی
پیونددهنده
به صورت
خودکار
توسط
افزونهٔ
پیونددهنده
تعیین
میشود.
برای
اشکالزدایی
کامپایلر و
در صورتی که
پیونددهی
افزایشی با
یک فایل شیء
غیر LTO مد نظر
باشد،
کنترل دستی
این نوع
میتواند
مفید باشد.
اگر type برابر exec باشد، تولید کد یک باینری ایستا ایجاد میکند. در این حالت، -fpic و -fpie هر دو غیرفعال میشوند.
اگر type برابر dyn باشد، تولید کد یک کتابخانهٔ اشتراکی تولید میکند. در این حالت -fpic یا -fPIC حفظ میشود، اما به طور خودکار فعال نمیشود. این کار امکان ساخت کتابخانههای اشتراکی بدون کد مستقل از موقعیت (PIC) را در معماریهایی که این امر امکانپذیر است (یعنی روی x86) فراهم میسازد.
اگر type برابر pie باشد، تولید کد یک فایل اجرایی با -fpie تولید میکند. این حالت منجر به بهینهسازیهایی مشابه exec میشود، با این تفاوت که اگر -fpie در زمان کامپایل مشخص شده باشد، غیرفعال نمیگردد.
اگر type برابر rel باشد، کامپایلر فرض میکند که پیونددهی افزایشی انجام میشود. بخشهای حاوی کد میانی برای بهینهسازی زمان پیوند ادغام، پیشبهینهسازی و در فایل شیء حاصل خروجی داده میشوند. علاوه بر این، اگر -ffat-lto-objects مشخص شده باشد، کد باینری برای پیونددهی غیر LTO در آینده تولید میشود. فایل شیء حاصل از پیونددهی افزایشی کوچکتر از یک کتابخانهٔ ایستای تولیدشده از همان فایلهای شیء است. در زمان پیوند، با فرض اینکه اکثر اشیاء کتابخانه استفاده شوند، نتیجهٔ پیونددهی افزایشی سریعتر از یک کتابخانهٔ ایستا بارگذاری میشود.
در نهایت، nolto-rel کامپایلر را برای پیونددهی افزایشی پیکربندی میکند که در آن تولید کد اجباری است، یک باینری نهایی تولید میشود، و کد میانی برای بهینهسازی بعدی در زمان پیوند پاکسازی میشود. هنگامی که چندین فایل شیء با هم پیوند داده میشوند، کد حاصل بهینهتر از حالتی است که بهینهسازیهای زمان پیوند غیرفعال باشند (برای مثال، درونریزی میانمدولی رخ میدهد)، اما بیشتر مزایای بهینهسازی کل برنامه از دست میرود.
در طول پیونددهی افزایشی (توسط -r)، پیشفرض افزونهٔ پیونددهنده rel است. با این حال، با رابطهای فعلی GNU Binutils امکان پیونددهی افزایشی اشیاء LTO و غیر LTO در یک فایل شیء ترکیبی واحد وجود ندارد. اگر هر یک از فایلهای شیء در پیونددهی افزایشی نتواند برای بهینهسازی زمان پیوند استفاده شود، افزونهٔ پیونددهنده هشداری صادر کرده و از nolto-rel استفاده میکند. برای حفظ بهینهسازی کل برنامه، توصیه میشود چنین اشیایی در عوض درون یک کتابخانهٔ ایستا پیوند داده شوند. روش جایگزین، استفاده از binutils توسعهیافته توسط H.J. Lu با پشتیبانی از اشیاء ترکیبی است.
- -fuse-ld=bfd
- استفاده از پیونددهندهٔ bfd به جای پیونددهندهٔ پیشفرض.
- -fuse-ld=gold
- استفاده از پیونددهندهٔ gold به جای پیونددهندهٔ پیشفرض.
- -fuse-ld=lld
- استفاده از پیونددهندهٔ lld متعلق به LLVM به جای پیونددهندهٔ پیشفرض.
- -fuse-ld=mold
- استفاده از پیونددهندهٔ مدرن (mold) به جای پیونددهندهٔ پیشفرض.
- -llibrary
- -l library
- هنگام
پیوند
دادن،
کتابخانهای
با نام library را
جستجو
میکند.
(حالت دوم
که در آن
کتابخانه
به عنوان یک
آرگومان
جداگانه
میآید فقط
برای
سازگاری با
POSIX است و
توصیه
نمیشود.)
گزینهٔ -l توسط GCC مستقیماً به پیونددهنده ارسال میشود. برای جزئیات دقیق به مستندات پیونددهندهٔ خود مراجعه کنید. توضیحات کلی زیر در مورد پیونددهندهٔ GNU صدق میکند.
پیونددهنده فهرستی استاندارد از دایرکتوریها را برای یافتن کتابخانه جستجو میکند. دایرکتوریهای جستجوشده شامل چندین دایرکتوری استاندارد سیستم به اضافهٔ مواردی است که با -L مشخص میکنید.
کتابخانههای ایستا آرشیوهایی از فایلهای شیء هستند و نامهایی مانند liblibrary.a دارند. برخی از مقاصد نیز از کتابخانههای اشتراکی پشتیبانی میکنند که معمولاً نامهایی مانند liblibrary.so دارند. اگر هر دو نوع کتابخانهٔ ایستا و اشتراکی یافت شوند، پیونددهنده پیوند دادن با کتابخانهٔ اشتراکی را ترجیح میدهد مگر اینکه از گزینهٔ -static استفاده شده باشد.
محل درج این گزینه در دستور تفاوت ایجاد میکند؛ پیونددهنده کتابخانهها و فایلهای شیء را به همان ترتیبی که مشخص شدهاند جستجو و پردازش میکند. بنابراین، foo.o -lz bar.o کتابخانهٔ z را پس از فایل foo.o اما پیش از bar.o جستجو میکند. اگر bar.o به توابعی در z ارجاع دهد، ممکن است آن توابع بارگذاری نشوند..IP -lobjc 4 برای پیوند دادن یک برنامه Objective-C یا Objective-C++، به این حالت ویژه از گزینه -l نیاز دارید.
- -nostartfiles
- هنگام پیوند دادن، از فایلهای راهاندازی استاندارد سیستم استفاده نمیکند. کتابخانههای استاندارد سیستم به طور عادی استفاده میشوند، مگر اینکه از -nostdlib، -nolibc، یا -nodefaultlibs استفاده شده باشد.
- -nodefaultlibs
- هنگام
پیوند
دادن، از
کتابخانههای
استاندارد
سیستم
استفاده
نمیکند.
تنها
کتابخانههایی
که مشخص
میکنید به
پیونددهنده
ارسال
میشوند، و
گزینههایی
که نحوه
پیوند
کتابخانههای
سیستم را
تعیین
میکنند،
مانند -static-libgcc
یا -shared-libgcc،
نادیده
گرفته
میشوند.
فایلهای
راهاندازی
استاندارد
به طور عادی
استفاده
میشوند،
مگر اینکه
از -nostartfiles
استفاده
شده باشد.
کامپایلر ممکن است فراخوانیهایی به "memcmp"، "memset"، "memcpy" و "memmove" تولید کند. این مدخلها معمولاً توسط مدخلهای موجود در libc برطرف میشوند. در صورت مشخص شدن این گزینه، این نقاط ورود باید از طریق سازوکار دیگری تأمین شوند.
- -nolibc
- هنگام پیوند دادن، از کتابخانه C یا کتابخانههای سیستمی که پیوند نزدیکی با آن دارند استفاده نمیکند. همچنان با فایلهای راهاندازی، libgcc یا کتابخانههای پشتیبانی از زبانِ ارائهشده توسط زنجیره ابزار مانند libgnat، libgfortran یا libstdc++ پیوند میخورد، مگر اینکه گزینههایی که مانع از درج آنها میشوند نیز استفاده شده باشند. این امر معمولاً -lc را از خط فرمان پیوند حذف میکند، و همچنین کتابخانههای سیستمی که معمولاً همراه آن هستند و در صورت فرض عدم وجود کتابخانه C بیمعنی میشوند، مانند -lpthread یا -lm در برخی پیکربندیها. این گزینه برای اهداف bare-board در زمانی که واقعاً هیچ کتابخانه C در دسترسی وجود ندارد طراحی شده است.
- -nostdlib
- هنگام
پیوند
دادن، از
فایلهای
راهاندازی
استاندارد
سیستم یا
کتابخانهها
استفاده
نمیکند.
هیچ فایل
راهاندازی
ارسال
نمیشود و
فقط
کتابخانههای
مشخصشده
توسط شما به
پیونددهنده
منتقل
میشوند، و
گزینههای
مشخصکننده
پیوند
کتابخانههای
سیستم،
مانند -static-libgcc
یا -shared-libgcc
نادیده
گرفته
میشوند.
کامپایلر ممکن است فراخوانیهایی به "memcmp"، "memset"، "memcpy" و "memmove" تولید کند. این مدخلها معمولاً توسط مدخلهای موجود در libc رفع وابستگی میشوند. هنگام مشخص شدن این گزینه، این نقاط ورود باید از طریق سازوکار دیگری فراهم شوند.
یکی از کتابخانههای استانداردی که توسط -nostdlib و -nodefaultlibs کنار گذاشته میشود libgcc.a است، کتابخانهای از زیربرنامههای داخلی که GCC برای غلبه بر کاستیهای ماشینهای خاص یا نیازهای ویژه برخی زبانها از آن استفاده میکند.
در بیشتر موارد، شما حتی زمانی که میخواهید از سایر کتابخانههای استاندارد اجتناب کنید، به libgcc.a نیاز دارید. به عبارت دیگر، هنگامی که -nostdlib یا -nodefaultlibs را مشخص میکنید، معمولاً باید -lgcc را نیز قید کنید. این کار اطمینان میدهد که هیچ ارجاع حلنشدهای به زیربرنامههای کتابخانه داخلی GCC باقی نخواهد ماند. (نمونهای از چنین زیربرنامه داخلی "__main" است که برای اطمینان از فراخوانی سازندههای C++ استفاده میشود.)
- -nostdlib++
- بهطور ضمنی با کتابخانههای استاندارد C++ پیوند داده نمیشود.
- -e entry
- --entry=entry
- مشخص میکند که نقطه ورود برنامه entry است. این آرگومان توسط پیونددهنده تفسیر میشود؛ پیونددهنده GNU نام نماد یا یک آدرس را میپذیرد.
- -pie
- در اهدافی که پشتیبانی میکنند، یک فایل اجرایی مستقل از موقعیت با پیوند پویا تولید میکند. برای دستیابی به نتایج قابل پیشبینی، هنگام مشخص کردن این گزینه پیونددهنده، باید همان مجموعه گزینههای استفادهشده در زمان کامپایل (-fpie، -fPIE، یا زیرگزینههای مدل) را نیز مشخص کنید.
- -no-pie
- فایل اجرایی مستقل از موقعیت با پیوند پویا تولید نمیکند.
- -static-pie
- در اهدافی که پشتیبانی میکنند، یک فایل اجرایی مستقل از موقعیت ایستا تولید میکند. یک فایل اجرایی مستقل از موقعیت ایستا شبیه به یک فایل اجرایی ایستا است، اما میتواند بدون یک پیونددهنده پویا در هر آدرسی بارگذاری شود. برای نتایج قابل پیشبینی، هنگام مشخص کردن این گزینه پیونددهنده، باید همان مجموعه گزینههای استفادهشده برای کامپایل (-fpie، -fPIE، یا زیرگزینههای مدل) را نیز مشخص کنید.
- -pthread
- با کتابخانه ریسههای POSIX پیوند برقرار میکند. این گزینه در اهداف GNU/Linux، بیشتر مشتقات دیگر یونیکس، و همچنین در اهداف x86 Cygwin و MinGW پشتیبانی میشود. در برخی اهداف، این گزینه پرچمهایی را نیز برای پیشپردازنده تنظیم میکند، بنابراین باید به طور هماهنگ هم برای کامپایل و هم پیوند استفاده شود.
- -r
- یک شیء بازجایابیپذیر را به عنوان خروجی تولید میکند. این فرایند به عنوان پیوند جزئی نیز شناخته میشود.
- -rdynamic
- پرچم -export-dynamic را به پیونددهنده ELF در اهدافی که از آن پشتیبانی میکنند، ارسال میکند. این دستور به پیونددهنده اعلام میکند تا همه نمادها، نه فقط نمادهای استفادهشده را به جدول نمادهای پویا اضافه کند. این گزینه برای برخی کاربردهای "dlopen" یا امکان بهدست آوردن ردگیری پشته (backtrace) از درون برنامه مورد نیاز است.
- -s
- تمام جدول نمادها و اطلاعات بازجایابی را از فایل اجرایی حذف میکند.
- -static
- در سیستمهایی که از پیوند پویا پشتیبانی میکنند، این گزینه بر -pie تقدم دارد و از پیوند با کتابخانههای اشتراکی جلوگیری میکند. در سایر سیستمها، این گزینه هیچ اثری ندارد.
- یک شیء اشتراکی تولید میکند که سپس میتواند با اشیاء دیگر پیوند داده شده تا یک فایل اجرایی را تشکیل دهد. همه سیستمها از این گزینه پشتیبانی نمیکنند. برای نتایج قابل پیشبینی، هنگام مشخص کردن این گزینه پیونددهنده، باید همان مجموعه گزینههای استفادهشده برای کامپایل (-fpic، -fPIC، یا زیرگزینههای مدل) را نیز مشخص کنید.[1]
- -static-libgcc
- در
سیستمهایی
که libgcc را به
عنوان یک
کتابخانه
اشتراکی
فراهم
میکنند،
این
گزینهها
به ترتیب
استفاده از
نسخه
اشتراکی یا
ایستا را
اجباری
میسازند.
اگر در زمان
پیکربندی
کامپایلر
هیچ نسخه
اشتراکی از
libgcc ساخته
نشده باشد،
این
گزینهها
تاثیری
نخواهند
داشت.
موقعیتهای متعددی وجود دارد که در آنها یک برنامه باید به جای نسخه ایستا از libgcc اشتراکی استفاده کند. رایجترین مورد زمانی است که برنامه بخواهد استثناها را در میان کتابخانههای اشتراکی مختلف پرتاب و دریافت (throw and catch) کند. در این صورت، هر یک از کتابخانهها و همچنین خود برنامه کاربردی باید از libgcc اشتراکی استفاده کنند.
بنابراین، راهانداز G++ هر زمان که یک کتابخانه اشتراکی یا فایل اجرایی اصلی را ایجاد میکنید، به طور خودکار -shared-libgcc را اضافه میکند؛ زیرا برنامههای C++ معمولاً از استثناها استفاده میکنند، بنابراین این اقدام درستی است.
اگر به جای آن، از راهانداز GCC برای ایجاد کتابخانههای اشتراکی استفاده کنید، ممکن است متوجه شوید که آنها همیشه با libgcc اشتراکی پیوند داده نمیشوند. اگر GCC در هنگام پیکربندی خود تشخیص دهد که شما یک پیونددهنده غیر GNU یا یک پیونددهنده GNU دارید که از گزینه --eh-frame-hdr پشتیبانی نمیکند، به طور پیشفرض نسخه اشتراکی libgcc را درون کتابخانههای اشتراکی پیوند میدهد. در غیر این صورت، از پیونددهنده بهره برده و پیوند با نسخه اشتراکی libgcc را بهینهسازی و حذف میکند، و به طور پیشفرض با نسخه ایستای libgcc پیوند برقرار میسازد. این کار اجازه میدهد تا استثناها در میان چنین کتابخانههای اشتراکی منتشر شوند، بدون آنکه هزینههای بازجایابی در زمان بارگذاری کتابخانه به سیستم تحمیل شود.
با این حال، اگر قرار باشد یک کتابخانه یا فایل اجرایی اصلی استثناها را پرتاب یا دریافت کند، باید آن را با استفاده از راهانداز G++ یا با استفاده از گزینه -shared-libgcc پیوند دهید، تا با libgcc اشتراکی پیوند داده شود.
- -static-libasan
- هنگامی که گزینه -fsanitize=address برای پیوند یک برنامه استفاده میشود، راهانداز GCC به طور خودکار با libasan پیوند برقرار میکند. اگر libasan به عنوان یک کتابخانه اشتراکی در دسترس باشد، و گزینه -static استفاده نشده باشد، پیوند با نسخه اشتراکی libasan انجام میشود. گزینه -static-libasan به راهانداز GCC دستور میدهد تا libasan را به صورت ایستا پیوند دهد، بدون آنکه لزوماً سایر کتابخانهها به صورت ایستا پیوند داده شوند.
- -static-libtsan
- هنگامی که گزینه -fsanitize=thread برای پیوند دادن یک برنامه استفاده میشود، راهانداز GCC به طور خودکار پیوند با libtsan را برقرار میکند. اگر libtsan به عنوان یک کتابخانه اشتراکی در دسترس باشد، و گزینه -static استفاده نشده باشد، پیوند با نسخه اشتراکی libtsan برقرار میگردد. گزینه -static-libtsan به راهانداز GCC هدایت میدهد تا libtsan را به طور ایستا پیوند دهد، بدون آنکه نیازی به پیوند ایستای سایر کتابخانهها باشد.
- -static-liblsan
- هنگامی که گزینه -fsanitize=leak برای پیوند یک برنامه استفاده میشود، راهانداز GCC به طور خودکار با liblsan پیوند میخورد. اگر liblsan به عنوان یک کتابخانه اشتراکی موجود باشد، و گزینه -static استفاده نشده باشد، پیوند با نسخه اشتراکی liblsan صورت میگیرد. گزینه -static-liblsan به راهانداز GCC دستور میدهد تا liblsan را به صورت ایستا پیوند دهد، بدون آنکه الزامی برای پیوند ایستای سایر کتابخانهها وجود داشته باشد.
- -static-libubsan
- هنگامی که گزینه -fsanitize=undefined برای پیوند یک برنامه استفاده میشود، راهانداز GCC به طور خودکار با libubsan پیوند برقرار میکند. اگر libubsan به عنوان یک کتابخانه اشتراکی در دسترس باشد، و گزینه -static استفاده نشده باشد، در این حالت پیوند با نسخه اشتراکی libubsan برقرار میشود. گزینه -static-libubsan راهانداز GCC را ملزم میکند تا libubsan را به صورت ایستا پیوند دهد، بدون آنکه لزوماً پیوند سایر کتابخانهها به صورت ایستا باشد.
- -static-libstdc++
- هنگامی که برنامه g++ برای پیوند دادن یک برنامه C++ استفاده میشود، به طور عادی به طور خودکار با libstdc++ پیوند برقرار میکند. اگر libstdc++ به عنوان یک کتابخانه اشتراکی در دسترس باشد، و گزینه -static استفاده نشده باشد، پیوند با نسخه اشتراکی libstdc++ انجام میشود. این روال معمولاً مناسب است. با این حال، گاهی اوقات ثابت نگهداشتن نسخه libstdc++ استفادهشده توسط برنامه بدون رفتن به سمت پیوند کاملاً ایستا مفید خواهد بود. گزینه -static-libstdc++ به راهانداز g++ دستور میدهد تا libstdc++ را به صورت ایستا پیوند دهد، بدون آنکه لزوماً پیوند سایر کتابخانهها به صورت ایستا انجام شود..IP -symbolic 4 هنگام ساخت یک شیء مشترک (shared object)، ارجاعات به نمادهای عمومی را مقید میکند. درباره هرگونه ارجاع حلنشده هشدار میدهد (مگر اینکه توسط گزینه ویرایشگر پیوند -Xlinker -z -Xlinker defs لغو شده باشد). تنها تعداد کمی از سیستمها از این گزینه پشتیبانی میکنند.
- -T script
- از script به عنوان اسکریپت پیونددهنده استفاده میکند. این گزینه در اغلب سیستمهایی که از پیونددهنده GNU استفاده میکنند، پشتیبانی میشود. در برخی مقاصد، مانند مقاصد bare-board بدون سیستمعامل، ممکن است برای جلوگیری از ارجاع به نمادهای تعریفنشده، گزینه -T هنگام پیوند الزامی باشد.
- -Xlinker option
- گزینه option را
به عنوان یک
گزینه به
پیونددهنده
ارسال
میکند.
میتوانید
از این
گزینه برای
تعیین
گزینههای
پیونددهنده
مختص
سیستمی که GCC
آنها را
نمیشناسد،
استفاده
کنید.
اگر میخواهید گزینهای را ارسال کنید که آرگومان جداگانهای میگیرد، باید از -Xlinker دو بار استفاده کنید؛ یک بار برای گزینه و یک بار برای آرگومان آن. برای نمونه، جهت ارسال -assert definitions، باید بنویسید -Xlinker -assert -Xlinker definitions. نوشتن -Xlinker "-assert definitions" کار نمیکند، چرا که این کار تمام رشته را به صورت یک آرگومان واحد ارسال میکند که با انتظار پیونددهنده همخوانی ندارد.
هنگام استفاده از پیونددهنده GNU، معمولاً ارسال آرگومانها به گزینههای پیونددهنده با استفاده از نحو option=value راحتتر از ارسال آنها به شکل آرگومانهای جداگانه است. برای مثال، میتوانید به جای -Xlinker -Map -Xlinker output.map از -Xlinker -Map=output.map استفاده کنید. ممکن است پیونددهندههای دیگر از این نحو برای گزینههای خط فرمان پشتیبانی نکنند.
- -Wl,option
- گزینه option را به عنوان یک گزینه به پیونددهنده ارسال میکند. اگر option دارای کاما (ویرگول انگلیسی) باشد، در محل کاماها به چندین گزینه تفکیک میشود. میتوانید از این نحو برای ارسال آرگومان به یک گزینه استفاده کنید. برای نمونه، -Wl,-Map,output.map مقدار -Map output.map را به پیونددهنده ارسال میکند. هنگام استفاده از پیونددهنده GNU، میتوانید با -Wl,-Map=output.map نیز به همین نتیجه دست یابید.
- -u symbol
- وانمود میکند که نماد symbol تعریفنشده است، تا پیوند پودمانهای کتابخانهای برای تعریف آن اجباری شود. میتوانید از -u چندین بار با نمادهای مختلف برای تحمیل بارگذاری پودمانهای کتابخانهای اضافی استفاده کنید.
- -z keyword
- گزینه -z مستقیماً به همراه کلیدواژه keyword به پیونددهنده ارسال میشود. برای آگاهی از مقادیر مجاز و معانی آنها، بخش مربوطه را در مستندات پیونددهنده خود بررسی کنید.
گزینههای جستجوی دایرکتوری (Options for Directory Search)
این گزینهها دایرکتوریها را برای جستجوی فایلهای سرآیند (header files)، کتابخانهها و بخشهایی از خودِ کامپایلر مشخص میکنند:
- -I dir
- -iquote dir
- -isystem dir
- -idirafter dir
- دایرکتوری
dir را به
فهرست
دایرکتوریهایی
که باید
هنگام
پیشپردازش
برای
فایلهای
سرآیند
جستجو
شوند،
اضافه
میکند. اگر
dir با = یا
$SYSROOT شروع
شود، آنگاه
= یا $SYSROOT
با پیشوند sysroot
جایگزین
میشود؛
گزینههای
--sysroot و -isysroot را
ببینید.
دایرکتوریهای مشخصشده با -iquote تنها برای شکل نقلقولیِ دستورالعمل، یعنی "#include "file"" اعمال میشوند. دایرکتوریهای مشخصشده با -I، -isystem یا -idirafter برای جستجوی هر دو نوع دستورالعملهای "#include "file"" و "#include <file>" اعمال میشوند.
میتوانید هر تعداد یا ترکیبی از این گزینهها را در خط فرمان برای جستجوی فایلهای سرآیند در چندین دایرکتوری تعیین کنید. ترتیب جستجو به شرح زیر است:
- 1.
- برای شکل نقلقولی دستورالعمل include، ابتدا دایرکتوریِ فایل جاری جستجو میشود.
- 2.
- برای شکل نقلقولی دستورالعمل include، دایرکتوریهای مشخصشده توسط گزینههای -iquote به ترتیب از چپ به راست، همانگونه که در خط فرمان آمدهاند، جستجو میشوند.
- 3.
- دایرکتوریهای مشخصشده با گزینههای -I به ترتیب از چپ به راست پیمایش میشوند.
- 4.
- دایرکتوریهای مشخصشده با گزینههای -isystem به ترتیب از چپ به راست پیمایش میشوند.
- 5.
- دایرکتوریهای استاندارد سیستم پیمایش میشوند.
- 6.
- دایرکتوریهای مشخصشده با گزینههای -idirafter به ترتیب از چپ به راست پیمایش میشوند.
از آنجا که این دایرکتوریها پیش از دایرکتوریهای فایلهای سرآیند استاندارد سیستم جستجو میشوند، میتوانید از -I برای بازنویسی و جایگزین کردن نسخه سفارشی خود به جای فایل سرآیند سیستم استفاده کنید. با این وجود، نباید از این گزینه برای افزودن دایرکتوریهای حاوی سرآیندهای سیستمی ارائهشده توسط سازنده (vendor) استفاده نمایید؛ برای این مقصود از -isystem استفاده کنید.
گزینههای -isystem و -idirafter همچنین دایرکتوری را به عنوان یک دایرکتوری سیستمی علامتگذاری میکنند، تا رفتار ویژه اعمالشده بر روی دایرکتوریهای استاندارد سیستم شامل حال آن نیز بشود.
اگر یک دایرکتوری استاندارد include سیستم، یا دایرکتوری مشخصشده با -isystem، همزمان با -I نیز مشخص شده باشد، گزینه -I نادیده گرفته میشود. دایرکتوری کماکان، اما به عنوان یک دایرکتوری سیستمی در جایگاه معمول خود در زنجیره include سیستم جستجو میگردد. این رفتار به منظور اطمینان از این است که فرایند GCC برای اصلاح سرآیندهای معیوب سیستم و ترتیب دستورالعمل "#include_next" به طور ناخواسته تغییر نکند. اگر واقعاً نیاز به تغییر ترتیب جستجوی دایرکتوریهای سیستمی دارید، از گزینههای -nostdinc و/یا -isystem استفاده کنید.
- -I-
- مسیر include را
تقسیم
میکند. این
گزینه
منسوخ شده
است. لطفاً
به جای آن
برای
دایرکتوریهای
-I قبل از -I-
از -iquote
استفاده
نموده و
گزینه -I- را
حذف کنید.
هر دایرکتوری مشخصشده با گزینههای -I پیش از -I- تنها برای سرآیندهای فراخوانیشده با "#include "file"" جستجو میشوند؛ آنها برای "#include <file>" جستجو نخواهند شد. اگر دایرکتوریهای دیگری با گزینههای -I پس از -I- مشخص شوند، آن دایرکتوریها برای همه دستورالعملهای #include جستجو میگردند.
علاوه بر این، -I- مانع استفاده از دایرکتوری فایل فعلی به عنوان نخستین دایرکتوری جستجو برای "#include "file"" میشود. هیچ روشی برای لغو این اثر -I- وجود ندارد.
- -iprefix prefix
- مقدار prefix را به عنوان پیشوند برای گزینههای بعدی -iwithprefix مشخص میکند. اگر پیشوند نمایانگر یک دایرکتوری است، باید اسلش انتهایی / را نیز قید کنید.
- -iwithprefix dir
- -iwithprefixbefore dir
- مقدار dir را به پیشوندی که پیشتر با -iprefix تعیین شده پیوست میکند و دایرکتوری حاصل را به مسیر جستجوی include میافزاید. گزینه -iwithprefixbefore آن را در همان جایگاهی میگذارد که -I میگذاشت؛ گزینه -iwithprefix آن را در جایگاهی میگذارد که -idirafter قرار میداد.
- -isysroot dir
- این گزینه مانند گزینه --sysroot است، اما فقط بر روی فایلهای سرآیند اعمال میشود (به جز در اهداف Darwin که در آنها هم بر روی فایلهای سرآیند و هم بر روی کتابخانهها اعمال میگردد). برای اطلاعات بیشتر، گزینه --sysroot را ببینید.
- -imultilib dir
- از dir به عنوان یک زیردایرکتوری از دایرکتوری حاوی سرآیندهای C++ ویژه مقصد مورد نظر استفاده میکند.
- -nostdinc
- دایرکتوریهای استاندارد سیستم را برای فایلهای سرآیند جستجو نمیکند. تنها دایرکتوریهایی جستجو میشوند که به صراحت با گزینههای -I، -iquote، -isystem و/یا -idirafter تعیین شده باشند (و در صورت مناسب بودن، دایرکتوریِ فایل جاری).
- -nostdinc++
- در دایرکتوریهای استاندارد مختص C++ به دنبال فایلهای سرآیند نمیگردد، اما سایر دایرکتوریهای استاندارد را همچنان جستجو میکند. (این گزینه هنگام ساخت کتابخانه C++ به کار میرود.)
- --embed-dir=dir
- دایرکتوری
dir را به
فهرست
دایرکتوریهای
مورد جستجو
برای
دستورالعمل
پیشپردازش
"#embed" یا
ماکروی
"__has_embed"
الحاق
میکند. هیچ
دایرکتوری
پیشفرضی
برای
"#embed"
وجود ندارد.
اگر dir با = یا $SYSROOT آغاز شود، مقدار = یا $SYSROOT با پیشوند sysroot جایگزین میگردد؛ گزینههای --sysroot و -isysroot را ببینید.
- -iplugindir=dir
- دایرکتوری مورد نظر را برای جستجوی افزایههایی که به جای -fplugin=path/name.so از طریق -fplugin=name ارسال شدهاند، تنظیم میکند. این گزینه برای استفاده کاربر در نظر گرفته نشده، بلکه تنها توسط گرداننده (driver) ارسال میشود.
- -Ldir
- دایرکتوری dir را به فهرست دایرکتوریهایی که برای گزینه -l جستجو میشوند اضافه میکند.
- -Bprefix
- این گزینه
مشخص
میکند
فایلهای
اجرایی،
کتابخانهها،
فایلهای include
و فایلهای
داده خودِ
کامپایلر
در کجا یافت
شوند.
برنامه گرداننده کامپایلر (compiler driver) یک یا چند مورد از زیربرنامههای 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 است.
به عنوان یک راهکار موقت و خاص (kludge)، اگر مسیر ارائهشده توسط -B به شکل [dir/]stageN/ باشد (که در آن N عددی بین 0 تا 9 است)، آنگاه با [dir/]include جایگزین میشود. هدف از این کار کمک به فرآیند خودراهاندازی (boot-strapping) کامپایلر است..IP -no-canonical-prefixes 4 پیوندهای نمادین را بسط نده، ارجاعات به /../ یا /./ را حلوفصل نکن، و هنگام تولید یک پیشوند نسبی، مسیر را مطلق نساز.
- --sysroot=dir
- از dir
بهعنوان
دایرکتوری
ریشهٔ
منطقی برای
سرآیندها و
کتابخانهها
استفاده کن.
برای مثال،
اگر
کامپایلر
در حالت
عادی برای
سرآیندها
در /usr/include و
کتابخانهها
در /usr/lib جستجو
میکند، در
عوض dir/usr/include و
dir/usr/lib را
جستجو
خواهد کرد.
اگر هم از این گزینه و هم از گزینهٔ -isysroot استفاده کنید، آنگاه گزینهٔ --sysroot بر کتابخانهها اعمال میشود، اما گزینهٔ -isysroot بر فایلهای سرآیند اعمال خواهد شد.
پیونددهندهٔ گنو (GNU linker) (از نسخهٔ 2.16 به بعد) پشتیبانی لازم از این گزینه را دارد. اگر پیونددهندهٔ شما از این گزینه پشتیبانی نکند، جنبهٔ فایل سرآیند در --sysroot همچنان کار میکند، اما جنبهٔ کتابخانهای آن کار نخواهد کرد.
- --no-sysroot-suffix
- برای برخی مقصدها (targets)، بسته به سایر گزینههای استفادهشده، پسوندی به دایرکتوری ریشهٔ مشخصشده با --sysroot اضافه میشود تا مثلاً سرآیندها به جای dir/usr/include در dir/suffix/usr/include یافت شوند. این گزینه اضافه شدن چنین پسوندی را غیرفعال میکند.
گزینههای مربوط به قراردادهای تولید کد (Options for Code Generation Conventions)
این گزینههای مستقل از ماشین، قراردادهای رابط (interface conventions) استفادهشده در تولید کد را کنترل میکنند.
بیشتر آنها هر دو شکل مثبت و منفی را دارند؛ شکل منفی -ffoo بهصورت -fno-foo است. در جدول زیر، تنها یکی از شکلها فهرست شده است---شکلی که پیشفرض نیست. شکل دیگر را میتوانید با حذف no- یا اضافه کردن آن به دست آورید.
- -fstack-reuse=reuse-level
- این گزینه
استفادهٔ
مجدد از
فضای پشته
را برای
متغیرهای
محلی/خودکار
تعریفشده
توسط کاربر
و متغیرهای
موقت
تولیدشده
توسط
کامپایلر
کنترل
میکند. reuse_level
میتواند
all، named_vars یا none
باشد. مقدار
all
استفادهٔ
مجدد از
پشته را
برای تمام
متغیرهای
محلی و موقت
فعال
میکند، named_vars
استفادهٔ
مجدد را
تنها برای
متغیرهای
محلی
نامدارِ
تعریفشده
توسط کاربر
فعال
میسازد، و
none
استفادهٔ
مجدد از
پشته را
بهطور
کامل
غیرفعال
میکند.
مقدار
پیشفرض all
است. این
گزینه
زمانی مورد
نیاز است که
برنامه طول
عمر یک
متغیر محلی
در حوزه (scoped)
یا یک متغیر
موقت
تولیدشده
توسط
کامپایلر
را فراتر از
نقطهٔ
پایانِ
تعیینشده
توسط زبان
گسترش دهد.
هنگامی که
طول عمر یک
متغیر به
پایان
میرسد، و
در صورتی که
آن متغیر در
حافظه
باشد،
کامپایلر
بهینهساز
این آزادی
عمل را دارد
که فضای
پشتهٔ آن را
با
متغیرهای
موقت دیگر
یا
متغیرهای
محلی
محدودهای
که دامنهٔ
حیات آنها
با آن
همپوشانی
ندارد،
مجدداً
استفاده
کند. کدهای
قدیمی (legacy) که
طول عمر
محلی را
گسترش
میدهند،
احتمالاً
با
بهینهسازی
استفادهٔ
مجدد از
پشته دچار
شکست
میشوند.
برای مثال،
int *p; { int local1; p = &local1; local1 = 10; .... } { int local2; local2 = 20; ... } if (*p == 10) // out of scope use of local1 { }مثالی دیگر:
struct A { A(int k) : i(k), j(k) { } int i; int j; }; A *ap; void foo(const A& ar) { ap = &ar; } void bar() { foo(A(10)); // temp object's lifetime ends when foo returns { A a(20); .... } ap->i+= 10; // ap references out of scope temp whose space // is reused with a. What is the value of ap->i? }طول عمر یک متغیر موقت تولیدشده توسط کامپایلر بهخوبی در استاندارد ++C تعریف شده است. هنگامی که طول عمر یک متغیر موقت پایان مییابد، و اگر آن متغیر در حافظه باشد، کامپایلر بهینهساز این آزادی عمل را دارد که فضای پشتهٔ آن را با متغیرهای موقت دیگر یا متغیرهای محلی محدودهای که دامنهٔ حیات آنها با آن همپوشانی ندارد، مجدداً استفاده کند. با این حال، از آنجا که برخی کدهای قدیمی به رفتار کامپایلرهای قدیمیتر متکی هستند که در آنها فضای پشتهٔ متغیرهای موقت مجدداً استفاده نمیشد، استفادهٔ تهاجمی از پشته میتواند به خطاهای زمان اجرا بیانجامد. از این گزینه برای کنترل بهینهسازی استفادهٔ مجدد از فضای پشتهٔ متغیرهای موقت استفاده میشود.
- -ftrapv
- این گزینه برای سرریز علامتدار در عملیاتهای جمع، تفریق و ضرب، تله (trap) تولید میکند. گزینههای -ftrapv و -fwrapv اثر یکدیگر را لغو میکنند، بنابراین استفاده از -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
- مدیریت استثناها را فعال میکند. کد اضافی مورد نیاز برای انتشار (propagate) استثناها را تولید میکند. برای برخی مقصدها، این بدان معناست که GCC اطلاعات بازپیچی فریم (frame unwind information) را برای تمام توابع تولید میکند که میتواند سربار اندازهٔ دادهٔ چشمگیری ایجاد کند، اگرچه بر اجرای برنامه تأثیری نمیگذارد. اگر این گزینه را مشخص نکنید، GCC بهطور پیشفرض آن را برای زبانهایی مانند ++C که معمولاً به مدیریت استثنا نیاز دارند فعال کرده و برای زبانهایی مانند C که بهطور معمول به آن نیازی ندارند غیرفعال میکند. با این حال، ممکن است هنگام کامپایل کد C که باید بهدرستی با مدیریتکنندههای استثنای نوشتهشده در ++C تعامل داشته باشد، نیاز به فعال کردن این گزینه داشته باشید. همچنین اگر برنامههای قدیمیتر ++C را کامپایل میکنید که از مدیریت استثنا استفاده نمیکنند، ممکن است مایل به غیرفعال کردن این گزینه باشید.
- -fnon-call-exceptions
- کدی تولید میکند که به دستورالعملهای تلهانداز (trapping instructions) اجازه میدهد استثنا پرتاب کنند. توجه داشته باشید که این به پشتیبانی زمان اجرای مختص سکو نیاز دارد که در همه جا وجود ندارد. علاوه بر این، این گزینه تنها به دستورالعملهای تلهانداز، یعنی ارجاعات حافظه یا دستورالعملهای ممیز شناور، اجازهٔ پرتاب استثنا میدهد. این گزینه اجازه نمیدهد استثناها از مدیریتکنندههای سیگنال دلخواه مانند "SIGALRM" پرتاب شوند. این گزینه -fexceptions را فعال میکند.
- -fdelete-dead-exceptions
- در نظر میگیرد که دستورالعملهایی که ممکن است استثنا پرتاب کنند اما در غیر این صورت نقشی در اجرای برنامه ندارند، میتوانند در حین بهینهسازی حذف شوند. این امر بر فراخوانی توابع تأثیری نمیگذارد، بهجز توابعی که دارای ویژگیهای "pure" یا "const" هستند. این گزینه بهطور پیشفرض برای کامپایلرهای Ada و ++C، همانطور که مشخصات زبان اجازه میدهد، فعال است. گذرگاههای بهینهسازی که باعث حذف استثناهای مرده میشوند، بهطور مستقل در سطوح بهینهسازی مختلف فعال میگردند.
- -funwind-tables
- مشابه -fexceptions است، بهجز اینکه تنها دادههای ایستای مورد نیاز را تولید میکند، اما به هیچ شیوهٔ دیگری بر کد تولیدشده تأثیر نمیگذارد. شما معمولاً نیازی به فعالسازی این گزینه ندارید؛ در عوض، پردازشگر زبانی که به این مدیریت نیاز دارد، آن را از طرف شما فعال میکند.
- -fasynchronous-unwind-tables
- در صورت پشتیبانی ماشین مقصد، جدول بازپیچی را در قالب DWARF تولید میکند. این جدول در مرز هر دستورالعمل دقیق است، بنابراین میتواند برای بازپیچی پشته از رویدادهای ناهمگام (مانند دیباگر یا زبالهروب) استفاده شود.
- -fno-gnu-unique
- در سیستمهایی با اسمبلر گنو و کتابخانهٔ C جدید، کامپایلر ++C از پیوند "STB_GNU_UNIQUE" استفاده میکند تا اطمینان یابد که تعاریف اعضای دادهای ایستای الگو و متغیرهای محلی ایستا در توابع درونخطی (inline functions) حتی در حضور "RTLD_LOCAL" یکتا هستند؛ این امر برای جلوگیری از بروز مشکل در کتابخانهای است که توسط دو افزونهٔ مختلف "RTLD_LOCAL" استفاده میشود و وابسته به تعریفی در یکی از آنها است و در نتیجه با دیگری دربارهٔ پیوند نماد اختلاف نظر دارد. اما این موجب میشود که "dlclose" برای DSOهای متأثر نادیده گرفته شود؛ اگر برنامهٔ شما به مقداردهی مجدد یک DSO از طریق "dlclose" و "dlopen" متکی است، میتوانید از -fno-gnu-unique استفاده کنید.
- -fpcc-struct-return
- مقادیر
کوتاه «short»
برای
"struct" و
"union" را
مانند
مقادیر
طولانیتر،
به جای
ثباتها در
حافظه
بازمیگرداند.
این
قرارداد
کارایی
کمتری
دارد، اما
این مزیت را
دارد که
امکان
فراخوانی
متقابل
میان
فایلهای
کامپایلشده
با 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 متغیرهای سراسری مقداردهینشده را در یک بلوک مشترک قرار میدهد. این کار به پیونددهنده اجازه میدهد تمام تعریفهای موقت از متغیری یکسان در واحدهای ترجمه مختلف را به یک شیء واحد، یا به یک تعریف غیرموقت پیوند دهد. این رفتار با ++C سازگار نیست و در بسیاری از مقاصد باعث کاهش سرعت و افزایش اندازه کد هنگام ارجاع به متغیرهای سراسری میشود. این گزینه عمدتاً برای پیوند دادن کدهای قدیمی بدون خطا مفید است.
- -fno-ident
- دستورالعمل "#ident" را نادیده میگیرد.
- -finhibit-size-directive
- از تولید دستورالعمل اسمبلی ".size"، یا هر چیز دیگری که اگر تابع از وسط تقسیم شود و دو نیمه در مکانهایی دور از هم در حافظه قرار گیرند باعث مشکل شود، خودداری میکند. این گزینه هنگام کامپایل crtstuff.c استفاده میشود؛ نباید برای هیچ مورد دیگری به استفاده از آن نیاز داشته باشید.
- -fverbose-asm
- اطلاعات
توضیحی
اضافه را در
کد اسمبلی
تولیدشده
قرار
میدهد تا
خوانایی آن
بیشتر شود.
این گزینه
معمولاً
فقط برای
کسانی مفید
است که
واقعاً
نیاز به
خواندن کد
اسمبلی
تولیدشده
دارند (شاید
هنگام
اشکالزدایی
خود
کامپایلر).
گزینه -fno-verbose-asm، که پیشفرض است، باعث حذف این اطلاعات اضافه میشود و هنگام مقایسه دو فایل اسمبلی مفید است.
توضیحات اضافهشده شامل موارد زیر است:
- اطلاعات مربوط به نسخه کامپایلر و گزینههای خط فرمان،
- خطوط کد منبع مرتبط با دستورالعملهای اسمبلی، به شکل FILENAME:LINENUMBER:CONTENT OF LINE،
- اشاراتی در این مورد که کدام عبارتهای سطح بالا با عملوندهای مختلف دستورالعمل اسمبلی مطابقت دارند.
برای مثال، با در نظر گرفتن این فایل منبع C:
int test (int n)
{
int i;
int total = 0;
for (i = 0; i < n; i++)
total += i * i;
return total;
}
کامپایل به اسمبلی (x86_64) از طریق -S و ارسال مستقیم نتیجه به stdout از طریق -o -
gcc -S test.c -fverbose-asm -Os -o -
خروجی مشابه این را تولید میکند:
.file "test.c"
# GNU C11 (GCC) version 7.0.0 20160809 (experimental) (x86_64-pc-linux-gnu)
[...snip...]
# options passed:
[...snip...]
.text
.globl test
.type test, @function
test:
.LFB0:
.cfi_startproc
# test.c:4: int total = 0;
xorl %eax, %eax # <retval>
# test.c:6: for (i = 0; i < n; i++)
xorl %edx, %edx # i
.L2:
# test.c:6: for (i = 0; i < n; i++)
cmpl %edi, %edx # n, i
jge .L5 #,
# test.c:7: total += i * i;
movl %edx, %ecx # i, tmp92
imull %edx, %ecx # i, tmp92
# test.c:6: for (i = 0; i < n; i++)
incl %edx # i
# test.c:7: total += i * i;
addl %ecx, %eax # tmp92, <retval>
jmp .L2 #
.L5:
# test.c:10: }
ret
.cfi_endproc
.LFE0:
.size test, .-test
.ident "GCC: (GNU) 7.0.0 20160809 (experimental)"
.section .note.GNU-stack,"",@progbits
این توضیحات برای انسانها در نظر گرفته شدهاند نه ماشینها، و بنابراین قالب دقیق توضیحات ممکن است تغییر کند.
- -frecord-gcc-switches
- این سوییچ باعث میشود خط فرمانی که برای فراخوانی کامپایلر استفاده شده است در فایل شیء در حال ساخت ضبط شود. این سوییچ فقط در برخی از مقاصد پیادهسازی شده است و قالب دقیق ضبط به مقصد و قالب فایل دودویی بستگی دارد، اما معمولاً به شکل بخشی حاوی متن ASCII است. این سوییچ با سوییچ -fverbose-asm مرتبط است، اما آن سوییچ اطلاعات را تنها به عنوان توضیح در فایل خروجی اسمبلی ثبت میکند و هرگز به فایل شیء نمیرسد. همچنین برای روش دیگری جهت ذخیره گزینههای کامپایلر در فایل شیء، -grecord-gcc-switches را ببینید.
- -fpic
- در صورت
پشتیبانی
در ماشین
مقصد، کد
مستقل از
موقعیت (PIC)
مناسب برای
استفاده در
یک
کتابخانه
اشتراکی
تولید
میکند.
چنین کدی به
تمام
آدرسهای
ثابت از
طریق جدول
آفست
سراسری (GOT)
دسترسی
پیدا
میکند.
بارگذار
پویا
مدخلهای GOT
را هنگام
شروع
برنامه
برطرف
میکند
(بارگذار
پویا بخشی
از GCC نیست؛
بلکه بخشی
از
سیستمعامل
است). اگر
اندازه GOT
برای فایل
اجرایی
پیوند داده
شده از
حداکثر
اندازه
خاصِ آن
ماشین
فراتر رود،
پیامی خطا
از
پیونددهنده
دریافت
میکنید
مبنی بر
اینکه -fpic
کار
نمیکند؛
در این
صورت، به
جای آن با -fPIC
مجدداً
کامپایل
کنید. (این
مقادیر
بیشینه در SPARC
برابر با 8k،
در AArch64 برابر
با 28k و در m68k و RS/6000
برابر با 32k
است. معماری
x86 چنین
محدودیتی
ندارد.)
کد مستقل از موقعیت نیازمند پشتیبانی ویژه است و بنابراین فقط در ماشینهای خاصی کار میکند. برای x86، کامپایلر GCC از PIC برای System V پشتیبانی میکند اما برای Sun 386i خیر. کد تولید شده برای IBM RS/6000 همیشه مستقل از موقعیت است.
هنگامی که این پرچم تنظیم شود، ماکروهای "__pic__" و "__PIC__" به مقدار 1 تعریف میشوند.
- -fPIC
- در صورت
پشتیبانی
برای ماشین
مقصد، کد
مستقل از
موقعیت
تولید
میکند که
برای پیوند
پویا مناسب
است و از
هرگونه
محدودیت
روی اندازه
جدول آفست
سراسری
جلوگیری
میکند. این
گزینه در AArch64،
m68k، PowerPC و SPARC
تفاوت
ایجاد
میکند.
کد مستقل از موقعیت نیازمند پشتیبانی ویژه است و بنابراین فقط در ماشینهای خاصی کار میکند.
هنگامی که این پرچم تنظیم شود، ماکروهای "__pic__" و "__PIC__" به مقدار 2 تعریف میشوند..IP -fpie 4
- -fPIE
- این
گزینهها
مشابه -fpic و
-fPIC هستند،
اما کد
مستقل از
موقعیت
تولیدشده
تنها
میتواند
درون
فایلهای
اجرایی
پیوند داده
شود.
معمولاً از
این
گزینهها
برای
کامپایل
کدی
استفاده
میشود که
قرار است با
استفاده از
گزینهٔ -pie
در GCC پیوند
داده شود.
هر دو گزینهٔ -fpie و -fPIE ماکروهای "__pie__" و "__PIE__" را تعریف میکنند. مقدار این ماکروها برای -fpie برابر با ۱ و برای -fPIE برابر با ۲ است.
- -fno-plt
- از PLT برای
فراخوانی
توابع
خارجی در کد
مستقل از
موقعیت
استفاده
نکن. در
عوض، آدرس
تابع
فراخوانیشده
را در
محلهای
فراخوانی
از GOT
بارگذاری
کرده و به
آن انشعاب
بده. این
کار با حذف
رابطهای (stubs)
PLT و در دسترس
قرار دادن
بارگذاریهای
GOT برای
بهینهسازی،
منجر به کدی
کارآمدتر
میشود. در
معماریهایی
مانند x86
۳۲-بیتی که
در آنها
رابطهای PLT
انتظار
اشارهگر GOT
را در یک
ثبات خاص
دارند، این
کار آزادی
عمل بیشتری
در تخصیص
ثبات به
کامپایلر
میدهد.
اتصال
دیرهنگام (Lazy
binding) نیازمند
استفاده از
PLT است؛ با -fno-plt
تمام
نمادهای
خارجی در
زمان
بارگذاری
حلوفصل
میشوند.
همچنین، میتوان از صفت تابع "noplt" برای جلوگیری از فراخوانی توابع خارجی خاص از طریق PLT استفاده کرد.
در کدهای وابسته به موقعیت، برخی از معماریهای مقصد نیز فراخوانی توابعی را که برای عدم استفاده از PLT نشانهگذاری شدهاند، به استفاده از GOT تبدیل میکنند.
- -fno-jump-tables
- از جدولهای پرش برای دستورهای switch استفاده نکن، حتی در مواردی که نسبت به سایر راهبردهای تولید کد کارآمدتر باشد. این گزینه در ترکیب با -fpic یا -fPIC برای ساخت کدی که بخشی از پیونددهندهٔ پویا را تشکیل میدهد و نمیتواند به آدرس یک جدول پرش ارجاع دهد مفید است. در برخی مقصدها، جدولهای پرش نیازی به GOT ندارند و این گزینه لازم نیست.
- -fno-bit-tests
- از آزمونهای بیتی برای دستورهای switch استفاده نکن، حتی در مواردی که نسبت به سایر راهبردهای تولید کد کارآمدتر باشد.
- -ffixed-reg
- با ثبات با
نام reg
مانند یک
ثبات ثابت
رفتار کن؛
کد
تولیدشده
هرگز نباید
به آن ارجاع
دهد (مگر
احتمالاً
به عنوان
اشارهگر
پشته،
اشارهگر
فریم یا در
نقشی ثابت
دیگر).
reg باید نام یک ثبات باشد. نامهای مجاز ثبات وابسته به ماشین بوده و در ماکروی "REGISTER_NAMES" در فایل ماکروی توصیف ماشین تعریف شدهاند.
این پرچم حالت منفی ندارد، زیرا یک انتخاب سهگانه را مشخص میکند.
- -fcall-used-reg
- با ثبات با
نام reg
مانند یک
ثبات قابل
تخصیص
رفتار کن که
در طول
فراخوانی
توابع
بازنویسی و
تخریب (clobber)
میشود.
ممکن است
برای
متغیرهای
موقت یا
متغیرهایی
که پس از یک
فراخوانی
زنده
نمیمانند،
تخصیص یابد.
توابعی که
به این روش
کامپایل
میشوند
ثبات reg را
ذخیره و
بازیابی
نمیکنند.
استفاده از این پرچم به همراه اشارهگر فریم یا اشارهگر پشته یک خطا است. استفاده از این پرچم برای ثباتهای دیگری که نقشهای ثابت و فراگیری در مدل اجرای ماشین دارند، نتایج فاجعهباری به بار میآورد.
این پرچم حالت منفی ندارد، زیرا یک انتخاب سهگانه را مشخص میکند.
- -fcall-saved-reg
- با ثبات با
نام reg
مانند یک
ثبات قابل
تخصیص
رفتار کن که
توسط توابع
حفظ و
بازیابی
میشود.
ممکن است
حتی برای
متغیرهای
موقت یا
متغیرهایی
که در طول
فراخوانی
زنده
میمانند
نیز تخصیص
یابد.
توابعی که
به این روش
کامپایل
میشوند،
در صورت
استفاده از
ثبات reg، آن
را ذخیره و
بازیابی
میکنند.
استفاده از این پرچم به همراه اشارهگر فریم یا اشارهگر پشته یک خطا است. استفاده از این پرچم برای ثباتهای دیگری که نقشهای ثابت و فراگیری در مدل اجرای ماشین دارند، نتایج فاجعهباری به بار میآورد.
نوع متفاوتی از فاجعه از استفاده از این پرچم برای ثباتی که مقادیر بازگشتی تابع در آن قرار میگیرد، ناشی میشود.
این پرچم حالت منفی ندارد، زیرا یک انتخاب سهگانه را مشخص میکند.
- -fpack-struct[=n]
- بدون تعیین
یک مقدار،
تمام اعضای
ساختار را
بدون هیچ
فضای خالی
در کنار هم
بستهبندی
(pack) میکند. در
صورت تعیین
یک مقدار
(که باید
توان کوچکی
از دو
باشد)،
اعضای
ساختار بر
اساس این
مقدار
بستهبندی
میشوند که
نشاندهندهٔ
حداکثر
تراز است
(بدین معنا
که اشیایی
با
نیازمندیهای
تراز
پیشفرض
بزرگتر از
این، ممکن
است در محل
مناسب بعدی
بدون تراز
خروجی داده
شوند).
هشدار: سوئیچ -fpack-struct باعث میشود GCC کدی تولید کند که با کد تولیدشده بدون این سوئیچ سازگاری دودویی ندارد. افزون بر این، کارایی کد را کاهش میدهد. تنها برای انطباق با یک واسط دودویی برنامهٔ کاربردی (ABI) غیرپیشفرض از آن استفاده کنید.
- -fleading-underscore
- این گزینه و
نقطهٔ
مقابل آن،
-fno-leading-underscore،
نحوهٔ
نمایش
نمادهای
زبان C را در
فایل شیء (object file)
بهصورت
اجباری
تغییر
میدهند. یک
کاربرد آن،
کمک به
پیوند با
کدهای
اسمبلی
قدیمی است.
هشدار: سوئیچ -fleading-underscore باعث میشود GCC کدی تولید کند که با کد تولیدشده بدون این سوئیچ سازگاری دودویی ندارد. از آن برای انطباق با یک واسط دودویی برنامهٔ کاربردی غیرپیشفرض استفاده کنید. همهٔ مقصدهای معماری پشتیبانی کاملی از این سوئیچ ارائه نمیدهند.
- -ftls-model=model
- مدل
ذخیرهسازی
محلی رشته (TLS)
مورد
استفاده را
تغییر
میدهد.
آرگومان model
باید یکی از
مقادیر
global-dynamic، local-dynamic، initial-exec
یا local-exec باشد.
توجه داشته
باشید که
این انتخاب
مشمول
بهینهسازی
است:
کامپایلر
ممکن است
برای
نمادهایی
که در خارج
از واحد
ترجمه قابل
دیدن
نیستند، یا
در صورتی که
-fpic در خط
فرمان مشخص
نشده باشد،
از مدل
کارآمدتری
استفاده
کند.
پیشفرض بدون -fpic برابر با initial-exec است؛ همراه با -fpic پیشفرض global-dynamic خواهد بود.
- -ftrampolines
- برای
مقصدهایی
که معمولاً
برای توابع
تودرتو به
ترامپولین
نیاز
دارند،
همواره
آنها را
تولید کن و
از
توصیفگرها
(descriptors) استفاده
نکن. در غیر
این صورت،
برای
مقصدهایی
که به آنها
نیازی
ندارند،
مانند HP-PA یا
IA-64، هیچ کاری
انجام نده.
ترامپولین قطعه کد کوچکی است که در زمان اجرا، هنگامی که آدرس یک تابع تودرتو گرفته میشود، روی پشته ایجاد میگردد و برای فراخوانی غیرمستقیم تابع تودرتو به کار میرود. بنابراین، برای عملکرد صحیح برنامه، نیازمند آن است که پشته قابل اجرا باشد.
گزینهٔ -fno-trampolines بهصورت پیشفرض بر اساس هر زبان فعال میشود تا در صورتی که کامپایلر تشخیص دهد این کار بیخطر است، از تولید آنها خودداری کرده و آنها را با توصیفگرها جایگزین کند. توصیفگرها تنها از داده تشکیل شدهاند، اما کد تولیدشده باید برای تعامل با آنها آماده باشد. تا زمان نگارش این متن، -fno-trampolines بهصورت پیشفرض تنها برای Ada فعال است.
علاوه بر این، در صورت وجود توابع تودرتو، کد کامپایلشده با -ftrampolines و کد کامپایلشده با -fno-trampolines سازگاری دودویی ندارند. بنابراین این گزینه باید در سطح کل برنامه استفاده شود و با احتیاط کامل مورد استفاده قرار گیرد.
برای زبانهایی به جز Ada، گزینههای "-ftrampolines" و "-fno-trampolines" در حال حاضر اثری ندارند و ترامپولینها همیشه روی بسترهایی که برای توابع تودرتو به آنها نیاز دارند، تولید میشوند.
- -ftrampoline-impl=[stack|heap]
- بهطور پیشفرض، ترامپولینها روی پشته ایجاد میشوند. با این حال، برخی از بسترها (مانند Apple M1) اجازهٔ پشتهٔ قابل اجرا را نمیدهند. کامپایل با -ftrampoline-impl=heap فراخوانیهایی را به "__gcc_nested_func_ptr_created" و "__gcc_nested_func_ptr_deleted" تولید میکند تا فضای ترامپولین را روی هیپ قابل اجرا تخصیص داده و آزاد کند. این توابع در libgcc پیادهسازی شدهاند و تنها روی مقصدهای خاصی ارائه میشوند: x86_64 Darwin، و x86_64 و aarch64 Linux. لطفاً توجه داشته باشید: اگر از "setjmp" استفاده کنید، توابع تودرتو را نمونهسازی نمایید و سپس با "longjmp" به وضعیتی قبل از تخصیص آن توابع تودرتو بازگردید، تضمینی وجود ندارد که ترامپولینهای هیپ بهدرستی آزاد شوند.
- -fvisibility=[default|internal|hidden|protected]
- دیداریپذیری
پیشفرض
نمادهای
تصویر ELF را
روی گزینهٔ
مشخصشده
تنظیم
میکند---تمام
نمادها با
این مشخصه
نشانهگذاری
میشوند
مگر اینکه
درون کد به
شکل دیگری
لغو شده
باشند.
استفاده از
این ویژگی
میتواند
زمان پیوند
و بارگذاری
کتابخانههای
شیء مشترک
را به طور
چشمگیری
بهبود
بخشد، کد
بهینهتری
تولید کند،
خروجی واسط
برنامهنویسی
(API) تقریباً
بینقصی
فراهم سازد
و از تداخل
نمادها
جلوگیری
کند.
اکیداً
توصیه
میشود که
از این
گزینه در
تمامی
اشیاء
مشترکی که
توزیع
میکنید
استفاده
نمایید.
با وجود نامگذاری، default همیشه به معنی عمومی (public) است؛ یعنی میتوان از خارج از شیء مشترک به آن پیوند داد. گزینههای protected و internal در عمل تقریباً بیاستفاده هستند، بنابراین تنها گزینهٔ متداول دیگر hidden است. پیشفرض در صورت مشخص نشدن -fvisibility برابر با default است، یعنی عمومی قرار دادن تمامی نمادها.
توضیح خوبی دربارهٔ مزایای اطمینان از داشتن دیداریپذیری صحیح در نمادهای ELF در مقالهٔ «How To Write Shared Libraries» نوشتهٔ Ulrich Drepper (قابل دسترسی در https://www.akkadia.org/drepper) آمده است---با این حال، راهکار برتری که به کمک این گزینه در برابر حالت پنهانسازی دستی در وضعیت پیشفرض عمومی فراهم شده، این است که پیشفرض را hidden قرار داده و موارد لازم را به عنوان public نشانهگذاری کنید. این روش، قاعدهٔ استاندارد DLLها در Windows است و با -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 باشند.
آگاه باشید که هدرهای خارج از پروژهٔ شما، بهویژه هدرهای سیستمی و هدرهای سایر کتابخانههایی که استفاده میکنید، ممکن است انتظار کامپایل با دیداریپذیری دیگری به جز default را نداشته باشند. ممکن است نیاز باشد پیش از درج هر یک از این هدرها، صریحاً عبارت "#pragma GCC visibility push(default)" را قرار دهید.
اعلانهای "extern" تحت تأثیر -fvisibility قرار نمیگیرند، بنابراین کدهای زیادی میتوانند بدون هیچ تغییری مجدداً با -fvisibility=hidden کامپایل شوند. با این حال، این بدان معناست که فراخوانی توابع "extern" فاقد دیداریپذیری صریح، از PLT استفاده میکنند، بنابراین موثرتر است که از "__attribute ((visibility))" و/یا "#pragma GCC visibility" استفاده کنید تا به کامپایلر اعلام کنید کدام اعلانهای "extern" باید به عنوان hidden در نظر گرفته شوند.
توجه داشته باشید که -fvisibility بر موجودیتهای پیوند مبهم (vague linkage) در ++C تأثیر میگذارد. این بدان معناست که به عنوان مثال، یک کلاس استثنا (exception) که قرار است بین DSOها پرتاب شود، باید صریحاً با دیداریپذیری default علامتگذاری گردد تا گرههای type_info بین DSOها یکپارچه شوند.
نمای کلی این روشها، مزایا و نحوهٔ استفاده از آنها در نشانی https://gcc.gnu.org/wiki/Visibility موجود است..IP -fstrict-volatile-bitfields 4 این گزینه باید زمانی استفاده شود که دسترسی به میدانهای بیتی (bit-fields) از نوع volatile (یا دیگر فیلدهای ساختار، اگرچه کامپایلر معمولاً در هر حال به آن نوعها احترام میگذارد) نیازمند یک دسترسی منفرد با پهنای نوع فیلد باشد، که در صورت امکان با تراز طبیعی (natural alignment) تراز شده است. برای مثال، پردازندههای مقصد با ثباتهای جانبی نگاشتشده در حافظه (memory-mapped peripheral registers) ممکن است به دسترسیهای دقیقاً ۱۶ بیتی نیاز داشته باشند؛ با این پرچم میتوانید تمام فیلدهای بیتی جانبی را بهصورت "unsigned short" تعریف کنید (با فرض اینکه short در این مقاصد ۱۶ بیتی است) تا GCC مجبور شود بهجای یک دسترسی احتمالاً کارآمدتر ۳۲ بیتی، از دسترسیهای ۱۶ بیتی استفاده کند.
اگر این گزینه غیرفعال باشد، کامپایلر از کارآمدترین دستورالعمل استفاده میکند. در مثال پیشین، این ممکن است یک دستور بارگذاری (load) ۳۲ بیتی باشد، حتی اگر به بایتهایی دسترسی یابد که شامل هیچ بخشی از فیلد بیتی نیستند، یا به ثباتهای نگاشتشده در حافظهای دسترسی پیدا کند که ارتباطی با ثبات در حال بهروزرسانی ندارند.
در برخی موارد، مانند زمانی که مشخصهٔ "packed" به یک فیلد ساختار اعمال شده است، ممکن است دسترسی به فیلد با یک خواندن یا نوشتن منفرد که بهدرستی برای ماشین مقصد تراز شده باشد امکانپذیر نباشد. در این حالت، GCC بهجای تولید کدی که در زمان اجرا دچار خطا (fault) شود یا نتیجه را ناقص (truncate) کند، به تولید چندین دسترسی متوسل میشود.
نکته: با توجه به محدودیتهای مدل حافظهٔ C/C++11، دسترسیهای نوشتن مجاز به دستکاری اعضای غیر فیلد بیتی نیستند. بنابراین توصیه میشود تمام بیتهای نوعِ فیلد را بهصورت اعضای فیلد بیتی تعریف کنید.
مقدار پیشفرض این گزینه توسط واسط دودویی برنامه (ABI) پردازندهٔ مقصد تعیین میشود.
- -fsync-libcalls
- این گزینه
مشخص
میکند که
آیا
نمونههای
برونخط (out-of-line)
خانواده
توابع
"__sync"
مجاز به
استفاده
برای
پیادهسازی
خانواده
توابع
"__atomic" در C++11
هستند یا
خیر.
مقدار پیشفرض این گزینه فعال است، از این رو تنها شکل کاربردی آن -fno-sync-libcalls است. این گزینه در پیادهسازی کتابخانهٔ زمان اجرای libatomic به کار میرود.
- -fzero-init-padding-bits=value
- صفر شدن
بیتهای
فاصلهساز
(padding bits) را در
مقداردهندههای
اولیهٔ
متغیرهای
خودکار
تضمین
میکند.
برخی
زبانها در
موارد خاصی
صفر شدن
بیتهای
فاصلهساز
را تضمین
میکنند؛
برای نمونه
C23 هنگام
استفاده از
مقداردهندههای
خالی
("{}")، یا C++
هنگام
استفاده از
مقداردهی
اولیه با
صفر، یا
زبان C
تضمین
میکند
فیلدهایی
که در یک
مقداردهنده
مشخص
نشدهاند،
بیتهای
فاصلهساز
آنها با
صفر
مقداردهی
اولیه شوند.
این گزینه
امکان
تغییر زمان
تضمین صفر
شدن
بیتهای
فاصلهساز
در
مقداردهندهها
را فراهم
میآورد.
مقدار
پیشفرض
"-fzero-init-padding-bits=standard"
است که هیچ
تضمین
اضافه
دیگری
فراتر از
استاندارد
مربوطه
ارائه
نمیدهد.
برای مثال:
struct A { char a; unsigned long long b; char c; }; union B { char a; unsigned long long b; }; struct A a = {}; // C23 guarantees padding bits are zero. struct A b = { 1, 2, 3 }; // No guarantees. union B c = {}; // C23 guarantees padding bits are zero. union B d = { 1 }; // No guarantees."-fzero-init-padding-bits=unions" علاوهبر تضمینهای استاندارد، صفر شدن بیتهای فاصلهساز را در اجتماعها (unions) تضمین میکند، در صورتی که مقداردهندهٔ اولیهٔ یک اجتماع خالی باشد (در این صورت تمام بیتهای اجتماع با صفر مقداردهی میشوند) یا اگر عضو مقداردهیشدهٔ اجتماع کوچکتر از اندازهٔ اجتماع باشد (در این حالت تضمین میکند بیتهای فاصلهساز خارج از عضو مقداردهیشده با صفر مقداردهی شوند). این رفتار پیشفرض GCC پیش از نگارش GCC 15 بود و در مثال بالا، صفر شدن آخرین بایتهای "sizeof (unsigned long long) - 1" را در اجتماع تضمین میکند.
"-fzero-init-padding-bits=all" افزون بر این، صفر شدن بیتهای فاصلهساز سایر دادههای تجمیعی (aggregates) را تضمین میکند؛ بنابراین فاصلهگذاری بین "b.a" و "b.b" (در صورت وجود) و فاصلهگذاری پایانی در ساختار (در صورت وجود) با صفر مقداردهی خواهند شد.
گزینههای توسعهدهندگان GCC
این بخش گزینههای خط فرمانی را شرح میدهد که عمدتاً برای توسعهدهندگان GCC کاربرد دارد؛ از جمله گزینههایی برای پشتیبانی از آزمایش کامپایلر، بررسی اشکالات کامپایلر و مشکلات عملکرد در زمان کامپایل. این موارد شامل گزینههایی است که فایلهای تخلیهٔ اشکالزدایی (debug dumps) را در مراحل مختلف کامپایل تولید میکنند؛ آمارهایی مانند میزان مصرف حافظه و زمان اجرا را چاپ میکنند؛ و اطلاعاتی دربارهٔ پیکربندی GCC، مانند مسیرهای جستجوی کتابخانهها، ارائه میدهند. برای کامپایل و پیوند معمولی بهندرت به استفاده از این گزینهها نیاز خواهید داشت.
بسیاری از گزینههای توسعهدهنده که باعث میشوند GCC خروجی را در یک فایل تخلیه کند، یک پسوند اختیاری =filename میپذیرند. میتوانید stdout یا - را برای تخلیه در خروجی استاندارد، و stderr را برای خطای استاندارد مشخص کنید.
اگر =filename حذف شود، نام فایل تخلیهٔ پیشفرض با پیوند زدن نام پایهٔ فایل تخلیه، شمارهٔ گذر (pass number)، حرف فاز و نام گذر ساخته میشود. نام پایهٔ فایل تخلیه در صورتی که بهطور صریح مشخص شده باشد و فایل اجرایی نباشد، نام فایل خروجی تولیدشده توسط کامپایلر است؛ در غیر این صورت نام فایل مبدأ خواهد بود. شمارهٔ گذر بر اساس ترتیبی که گذرها در مدیر گذرهای کامپایلر ثبت میشوند تعیین میگردد. این ترتیب عموماً با ترتیب اجرا یکسان است، اما گذرهای ثبتشده توسط افزونهها، گذرهای خاص معماری مقصد، یا گذرهایی که دیرتر ثبت شدهاند، شمارهای بالاتر از گذر موسوم به final دریافت میکنند، حتی اگر زودتر اجرا شوند. حرف فاز یکی از موارد i (تحلیل بینرویهای یا inter-procedural)، l (خاص زبان)، r (RTL) یا t (درخت یا tree) است. این فایلها در دایرکتوری فایل خروجی ایجاد میشوند.
- -fcallgraph-info
- -fcallgraph-info=MARKERS
- کامپایلر
را وادار
میکند
اطلاعات
گراف
فراخوانی
(callgraph) برنامه
را به ازای
هر فایل شیء
(object file) تولید
کند. این
اطلاعات در
قالب
استاندارد
VCG ایجاد
میشود. اگر
فهرستی از
نشانگرها
که با کاما
از هم جدا
شدهاند
نیز مشخص
شود،
میتواند
با اطلاعات
اضافی به
ازای هر گره
یا یال
آراسته شود.
هنگامی که
نشانگر
"su" مشخص
شود، گراف
فراخوانی
با اطلاعات
مصرف پشته
همراه
میشود؛
این معادل
-fstack-usage است.
هنگامی که
نشانگر
"da" مشخص
شود، گراف
فراخوانی
با اطلاعات
مربوط به
شیءهای
تخصیصیافته
بهصورت
پویا
آراسته
میشود.
هنگام کامپایل با -flto، هیچ اطلاعات گراف فراخوانی در کنار فایل شیء خروجی داده نمیشود. در زمان پیوند LTO، گزینهٔ -fcallgraph-info ممکن است چندین فایل حاوی اطلاعات گراف فراخوانی را در کنار فایلهای خروجی میانی LTO ایجاد کند.
- -dletters
- -fdump-rtl-pass
- -fdump-rtl-pass=filename
- دستور
میدهد که
در
زمانهای
مشخصشده
توسط letters در
حین
کامپایل،
تخلیههای
اشکالزدایی
انجام شوند.
این گزینه
برای
اشکالزدایی
گذرهای
مبتنی بر RTL
کامپایلر
استفاده
میشود.
برخی از سوئیچهای -dletters هنگام استفاده از -E برای پیشپردازش، معنای متفاوتی دارند.
تخلیههای اشکالزدایی را میتوان با یک سوئیچ -fdump-rtl یا برخی حروف گزینهٔ -d فعال کرد. حروف ممکن برای استفاده در pass و letters و معانی آنها به شرح زیر است:
- -fdump-rtl-alignments
- تخلیه پس از محاسبهٔ ترازهای انشعاب (branch alignments).
- -fdump-rtl-asmcons
- تخلیه پس از اصلاح دستورات RTL که محدودیتهای ورودی/خروجی برآوردهنشده دارند.
- -fdump-rtl-auto_inc_dec
- تخلیه پس از شناسایی افزایش/کاهش خودکار (auto-inc-dec). این گذر تنها روی معماریهایی اجرا میشود که دستورالعملهای افزایش یا کاهش خودکار دارند.
- -fdump-rtl-barriers
- تخلیه پس از پاکسازی دستورالعملهای سد (barrier instructions).
- -fdump-rtl-bbpart
- تخلیه پس از بخشبندی بلوکهای پایه به بخشهای پرکاربرد (hot) و کمکاربرد (cold).
- -fdump-rtl-bbro
- تخلیه پس از بازترتیبدهی بلوکها (block reordering).
- -fdump-rtl-btl1
- -fdump-rtl-btl2
- گزینههای -fdump-rtl-btl1 و -fdump-rtl-btl2 تخلیه را پس از دو گذر بهینهسازی بارگذاری مقصد انشعاب (branch target load) فعال میکنند.
- -fdump-rtl-bypass
- تخلیه پس از میانبُر زدن پرشها و بهینهسازیهای جریان کنترل.
- -fdump-rtl-combine
- تخلیه پس از گذر ترکیب دستورالعملهای RTL.
- -fdump-rtl-compgotos
- تخلیه پس از تکثیر gotoهای محاسباتی (computed gotos).
- -fdump-rtl-ce1
- -fdump-rtl-ce2
- -fdump-rtl-ce3
- گزینههای -fdump-rtl-ce1، -fdump-rtl-ce2 و -fdump-rtl-ce3 تخلیه را پس از سه گذر تبدیل if (if-conversion) فعال میکنند.
- -fdump-rtl-cprop_hardreg
- تخلیه پس از انتشار رونوشت ثباتهای سختافزاری (hard register copy propagation).
- -fdump-rtl-csa
- تخلیه پس از ادغام تنظیمات پشته (combining stack adjustments).
- -fdump-rtl-cse1
- -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
- برونریزی پس از تخصیص مکرر ثباتها (IRA).
- -fdump-rtl-jump
- برونریزی پس از دومین بهینهسازی پرش.
- -fdump-rtl-loop2
- -fdump-rtl-loop2 برونریزی پس از گذرهای بهینهسازی حلقهٔ rtl را فعال میکند.
- -fdump-rtl-mach
- برونریزی پس از اجرای گذر سازماندهی مجدد وابسته به ماشین، در صورت وجود آن گذر.
- -fdump-rtl-mode_sw
- برونریزی پس از حذف تعویضهای زائد حالت.
- -fdump-rtl-rnreg
- برونریزی پس از شمارهگذاری مجدد ثباتها.
- -fdump-rtl-outof_cfglayout
- برونریزی پس از تبدیل از حالت cfglayout.
- -fdump-rtl-peephole2
- برونریزی پس از گذر روزنهای (peephole).
- -fdump-rtl-postreload
- برونریزی پس از بهینهسازیهای پس از بارگذاری مجدد (post-reload).
- -fdump-rtl-pro_and_epilogue
- برونریزی پس از تولید مقدمه و مؤخرههای تابع.
- -fdump-rtl-sched1
- -fdump-rtl-sched2
- -fdump-rtl-sched1 و -fdump-rtl-sched2 برونریزی پس از گذرهای زمانبندی بلوکهای پایه را فعال میکنند.
- -fdump-rtl-ree
- برونریزی پس از حذف گسترش علامت/صفر.
- -fdump-rtl-seqabstr
- برونریزی پس از کشف توالیهای مشترک.
- -fdump-rtl-shorten
- برونریزی پس از کوتاهسازی پرشها.
- -fdump-rtl-split1
- -fdump-rtl-split2
- -fdump-rtl-split3
- -fdump-rtl-split4
- -fdump-rtl-split5
- این گزینهها برونریزی پس از پنج دور تفکیک دستورالعملها را فعال میکنند.
- -fdump-rtl-sms
- برونریزی پس از زمانبندی پیمانهای (modulo scheduling). این گذر فقط روی برخی از معماریها اجرا میشود.
- -fdump-rtl-stack
- برونریزی پس از تبدیل از ثباتهای «پروندهٔ ثبات مسطح» GCC به ثباتهای پشتهمانند x87. این گذر تنها روی گونههای x86 اجرا میشود.
- -fdump-rtl-subreg1
- -fdump-rtl-subreg2
- -fdump-rtl-subreg1 و -fdump-rtl-subreg2 برونریزی پس از دو گذر گسترش subreg را فعال میکنند.
- -fdump-rtl-vartrack
- برونریزی پس از ردگیری متغیرها.
- -fdump-rtl-vregs
- برونریزی پس از تبدیل ثباتهای مجازی به ثباتهای سختافزاری.
- -fdump-rtl-web
- برونریزی پس از تفکیک بازهٔ حیات.
- -fdump-rtl-regclass
- -fdump-rtl-subregs_of_mode_init
- -fdump-rtl-subregs_of_mode_finish
- -fdump-rtl-dfinit
- -fdump-rtl-dfinish
- این برونریزیها تعریف شدهاند اما همیشه فایلهای خالی تولید میکنند.
- -da
- -fdump-rtl-all
- تولید تمامی برونریزیهای فهرستشده در بالا.
- -dA
- حاشیهنویسی خروجی اسمبلر با اطلاعات گوناگون اشکالزدایی.
- -dD
- برونریزی تمامی تعاریف ماکرو در پایان پیشپردازش، علاوه بر خروجی عادی.
- -dH
- تولید یک core dump هر زمان که خطایی رخ دهد.
- -dp
- حاشیهنویسی خروجی اسمبلر با یادداشتی که نشان میدهد کدام الگو و جایگزین استفاده شده است. طول و هزینهٔ هر دستورالعمل نیز چاپ میشود.
- -dP
- برونریزی RTL در خروجی اسمبلر بهصورت یادداشت پیش از هر دستورالعمل. همچنین حاشیهنویسی -dp را فعال میکند.
- -dx
- صرفاً تولید RTL برای یک تابع به جای کامپایل کردن آن. معمولاً همراه با -fdump-rtl-expand استفاده میشود.
- -fdump-debug
- برونریزی اطلاعات اشکالزدایی تولیدشده در طول فاز تولید اشکالزدایی.
- -fdump-earlydebug
- برونریزی اطلاعات اشکالزدایی تولیدشده در طول فاز اولیهٔ تولید اشکالزدایی.
- -fdump-noaddr
- هنگام انجام برونریزیهای اشکالزدایی، خروجی نشانیها را حذف میکند. این کار استفاده از diff را روی برونریزیهای اشکالزدایی برای فراخوانیهای کامپایلر با باینریهای کامپایلر متفاوت و/یا مکانهای شروع دگرگون text / bss / data / heap / stack / dso میسرتر میسازد..IP -freport-bug 4 جمعآوری و تخلیه اطلاعات اشکالزدایی در یک فایل موقت در صورت وقوع یک خطای داخلی کامپایلر (ICE).
- -fdump-unnumbered
- هنگام انجام تخلیههای اشکالزدایی، از نمایش شماره دستورالعملها و خروجی آدرسها جلوگیری میکند. این کار استفاده از diff را برای مقایسه تخلیههای اشکالزدایی در فراخوانیهای کامپایلر با گزینههای متفاوت، بهویژه با و بدون -g، عملیتر میسازد.
- -fdump-unnumbered-links
- هنگام انجام تخلیههای اشکالزدایی (گزینه -d در بالا را ببینید)، شماره دستورالعملها را برای پیوندهای مربوط به دستورالعملهای قبلی و بعدی در یک دنباله حذف میکند.
- -fdump-ipa-switch
- -fdump-ipa-switch-options
- کنترل تخلیه درخت زبان تحلیل میانروالی (inter-procedural analysis) در مراحل مختلف به یک فایل. نام فایل با افزودن یک پسوند مشخص برای هر switch به انتهای نام فایل منبع ایجاد میشود و فایل در همان دایرکتوریِ فایل خروجی ساخته میشود. تخلیههای زیر امکانپذیر هستند:
- all
- تمام تخلیههای تحلیل میانروالی را فعال میکند.
- cgraph
- اطلاعات مربوط به بهینهسازی گراف فراخوانی (call-graph)، حذف توابع استفادهنشده و تصمیمات مربوط به درونخطسازی (inlining) را تخلیه میکند.
- inline
- تخلیه پس از درونخطسازی توابع.
- strubm
- تخلیه پس از انتخاب حالتهای "strub" و ثبت این انتخابها به عنوان ویژگیهای تابع.
- strub
- تخلیه تبدیلات "strub": تغییرات واسط (interface)، پوشش تابع (function wrapping)، و درج فراخوانیهای داخلی (builtin) برای پاکسازی پشته و واترمارکگذاری.
علاوه بر این، گزینههای -optimized، -missed، -note و -all را میتوان با همان مفهوم موجود در -fopt-info مشخص کرد که مقدار پیشفرض آن -optimized است.
به عنوان مثال، -fdump-ipa-inline-optimized-missed اطلاعات مربوط به نقاط فراخوانیِ درونخطشده را همراه با نقاط فراخوانی که درونخطسازی نشدهاند تولید میکند.
بهطور پیشفرض، فایل تخلیهشده شامل پیامهایی درباره بهینهسازیهای موفقیتآمیز (معادل -optimized) به همراه جزئیات سطح پایین درباره تحلیل خواهد بود.
- -fdump-ipa-clones
- ایجاد یک
فایل تخلیه
شامل
اطلاعاتی
درباره
ایجاد
کلونهای
گره گراف
فراخوانی و
حذف
گرههای
گراف
فراخوانی
در طول
بهینهسازیها
و تبدیلات
میانروالی.
کاربرد
اصلی آن این
است که
ابزارهای
ایجاد وصله
زنده (live-patch)
بتوانند
مجموعهای
از توابع را
که برای
جایگزینی
کامل یک
تابع مشخص
نیاز به
اعمال وصله
زنده
دارند،
تعیین کنند
(گزینه -flive-patching
را ببینید).
نام فایل با
افزودن
پسوند
"ipa-clones" به
انتهای نام
فایل منبع
ایجاد
میشود و
فایل در
همان
دایرکتوریِ
فایل خروجی
ساخته
میشود. هر
مدخل در
فایل در یک
خط جداگانه
قرار دارد
که فیلدهای
آن با
نقطه-ویرگول
(semicolon) جدا
شدهاند.
در صورت ایجاد کلون گراف فراخوانی، فیلدهای مجزا عبارتند از:
- 1.
- رشته "Callgraph clone".
- 2.
- نام تابعی که در حال کلونشدن است، همانطور که به اسمبلر ارائه میشود.
- 3.
- عددی که تابع در حال کلونشدن را بهصورت یکتا در گراف فراخوانی مشخص میکند. توجه داشته باشید که این عدد فقط در یک واحد کامپایل یا در تحلیل کل برنامه (whole-program analysis) یکتا است، اما احتمالاً در این دو مرحله متفاوت خواهد بود.
- 4.
- نام فایلِ منبعی که تابع در آن تعریف شده است.
- 5.
- شماره خطی که تعریف تابع در آن قرار دارد.
- 6.
- شماره ستونی که تعریف تابع در آن قرار دارد.
- 7.
- نام کلونِ تابع جدید، همانطور که به اسمبلر ارائه میشود.
- 8.
- عددی که کلون تابع جدید را بهصورت یکتا در گراف فراخوانی مشخص میکند. توجه داشته باشید که این عدد فقط در یک واحد کامپایل یا در تحلیل کل برنامه یکتا است، اما احتمالاً در این دو مرحله متفاوت خواهد بود.
- 9.
- نام فایلِ منبعی که مکان کد منبع کلون جدید به آن اشاره دارد.
- 10.
- خطی که مکان کد منبع کلون جدید به آن اشاره دارد.
- 11.
- ستونی که مکان کد منبع کلون جدید به آن اشاره دارد.
- 12.
- رشتهای که دلیل کلونسازی را مشخص میکند.
در صورت حذف کلون گراف فراخوانی، فیلدهای مجزا عبارتند از:
- 1.
- رشته "Callgraph removal".
- 2.
- نام تابعی که در حال حذف است، همانطور که به اسمبلر ارائه میشد.
- 3.
- عددی که تابع در حال کلونشدن را بهصورت یکتا در گراف فراخوانی مشخص میکند. توجه داشته باشید که این عدد فقط در یک واحد کامپایل یا در تحلیل کل برنامه یکتا است، اما احتمالاً در این دو مرحله متفاوت خواهد بود.
- 4.
- نام فایلِ منبعی که تابع در آن تعریف شده است.
- 5.
- شماره خطی که تعریف تابع در آن قرار دارد.
- 6.
- شماره ستونی که تعریف تابع در آن قرار دارد.
- -fdump-lang
- تخلیه اطلاعات خاص زبان. نام فایل با افزودن .lang به انتهای نام فایل منبع ساخته میشود.
- -fdump-lang-all
- -fdump-lang-switch
- -fdump-lang-switch-options
- -fdump-lang-switch-options=filename
- کنترل تخلیه اطلاعات خاص زبان. بخشهای options و filename همانطور که در گزینه -fdump-tree شرح داده شده عمل میکنند. مقادیر switch زیر پذیرفته میشوند:
- all
- تمام تخلیههای خاص زبان را فعال میکند.
- class
- تخلیه اطلاعات سلسلهمراتب کلاسها. اطلاعات جدول مجازی منتشر میشود مگر اینکه 'slim' مشخص شده باشد. این گزینه فقط برای C++ کاربرد دارد.
- module
- تخلیه اطلاعات ماژول. گزینههای lineno (مکانها)، graph (دسترسپذیری)، blocks (خوشهها)، uid (سریالسازی)، alias (قابل ادغام)، asmname (Elrond)، eh (نگاشتکننده) و vops (ماکروها) ممکن است اطلاعات بیشتری ارائه دهند. این گزینه فقط برای C++ کاربرد دارد.
- raw
- تخلیه دادههای خام درخت داخلی. این گزینه فقط برای C++ کاربرد دارد.
- -fdump-passes
- چاپ فهرست گذرهای بهینهسازی (optimization passes) فعال و غیرفعالشده توسط گزینههای خط فرمان فعلی در stderr.
- -fdump-statistics-option
- فعالسازی و کنترل تخلیه آمارهای مربوط به گذرها در یک فایل جداگانه. نام فایل با افزودن پسوندی که به .statistics ختم میشود به انتهای نام فایل منبع ایجاد میگردد و فایل در همان دایرکتوریِ فایل خروجی ساخته میشود. اگر از ساختار -option استفاده شود، -stats باعث جمعبندی شمارندهها در کل واحد کامپایل میشود، در حالی که -details هر رویداد را به محض تولید توسط گذرها تخلیه میکند. حالت پیشفرض بدون هیچ گزینهای، جمعبندی شمارندهها برای هر تابع کامپایلشده است.
- -fdump-tree-all
- -fdump-tree-switch-options
- -fdump-tree-switch-options=filename
- کنترل تخلیه (dumping) درخت زبان میانی به یک فایل در مراحل گوناگون پردازش. اگر از قالب -options استفاده شود، options فهرستی از گزینههای جدا شده با - است که جزئیات تخلیه را کنترل میکنند. همهٔ گزینهها برای همهٔ تخلیهها قابل اعمال نیستند؛ مواردی که معنی نداشته باشند نادیده گرفته میشوند. گزینههای زیر در دسترس هستند:
- address
- چاپ نشانی هر گره. معمولاً این مورد معنی خاصی ندارد چرا که با توجه به محیط و فایل منبع تغییر میکند. کاربرد اصلی آن برای تطبیق یک فایل تخلیه با محیط اشکالزدایی است.
- asmname
- اگر "DECL_ASSEMBLER_NAME" برای یک اعلان مشخص تعیین شده باشد، در تخلیه به جای "DECL_NAME" از آن استفاده میشود. کاربرد اصلی آن سهولت در کار و ردیابی معکوس از نامهای درهمپیچیده (mangled) در فایل اسمبلی است.
- slim
- هنگام
تخلیه
بازنماییهای
میانی
فرانتاند،
از تخلیه
اعضای یک
حوزه (scope) یا
بدنه یک
تابع،
صرفاً به
این دلیل که
به آن حوزه
رسیده است،
جلوگیری
میکند.
چنین
مواردی را
تنها زمانی
تخلیه
میکند که
مستقیماً
از طریق
مسیر دیگری
قابل
دسترسی
باشند.
هنگام تخلیه درختهای فرمتبندیشده (pretty-printed)، این گزینه از تخلیه بدنه ساختارهای کنترلی جلوگیری میکند.
هنگام تخلیه RTL، بازنمایی RTL را به فرم فشرده (slim) به جای بازنمایی پیشفرض شبه-LISP چاپ میکند.
- raw
- چاپ یک بازنمایی خام (raw) از درخت. به طور پیشفرض، درختها با فرمت خوانا (pretty-printed) به صورت بازنمایی شبه-C چاپ میشوند.
- details
- فعالسازی تخلیههای با جزئیات بیشتر (توسط همه گزینههای تخلیه پشتیبانی نمیشود). همچنین اطلاعات حاصل از گذرهای بهینهسازی را شامل میشود.
- stats
- فعالسازی تخلیه آمارهای مختلف درباره گذر (توسط همه گزینههای تخلیه رعایت نمیشود).
- blocks
- فعالسازی نمایش مرزهای بلوک پایهای (در تخلیههای raw غیرفعال است).
- graph
- برای هر یک
از
فایلهای
تخلیه مشخص
شده دیگر
(-fdump-rtl-pass)، یک
بازنمایی
از نمودار
جریان
کنترل (CFG)
مناسب برای
مشاهده با GraphViz
را در file.passid.pass.dot
تخلیه
میکند. هر
تابع در
فایل به
صورت یک
زیرنمودار
قالببندی
میشود تا GraphViz
بتواند همه
آنها را در
یک طرح واحد
رسم کند.
این گزینه در حال حاضر فقط برای تخلیههای RTL کار میکند، و RTL همواره به فرم فشرده (slim) تخلیه میشود.
- vops
- فعالسازی نمایش عملوندهای مجازی (virtual operands) برای هر عبارت.
- lineno
- فعالسازی نمایش شماره خطوط برای عبارتها.
- uid
- فعالسازی نمایش شناسه یکتا ("DECL_UID") برای هر متغیر.
- verbose
- فعالسازی نمایش تخلیه درخت برای هر عبارت.
- eh
- فعالسازی نمایش شماره ناحیه EH (مدیریت استثنا) حاوی هر عبارت.
- scev
- فعالسازی نمایش جزئیات تحلیل تکامل نردهای (scalar evolution).
- optimized
- فعالسازی نمایش اطلاعات بهینهسازی (فقط در گذرهای معینی در دسترس است).
- missed
- فعالسازی نمایش اطلاعات بهینهسازیهای انجامنشده و ازدسترفته (فقط در گذرهای معینی در دسترس است).
- note
- فعالسازی سایر اطلاعات با جزئیات بهینهسازی (فقط در گذرهای معینی در دسترس است).
- all
- روشن کردن همه گزینهها، به جز raw، slim، verbose و lineno.
- optall
- روشن کردن همه گزینههای بهینهسازی، یعنی optimized، missed، و note.
برای تعیین این که چه تخلیههای درختی موجود هستند یا یافتن تخلیه برای یک گذر مورد نظر، مراحل زیر را دنبال کنید:
- 1.
- دستور GCC را با -fdump-passes اجرا کرده و در خروجی stderr به دنبال کدی بگردید که متناظر با گذر مورد نظر شما است. برای نمونه، کدهای "tree-evrp"، "tree-vrp1"، و "tree-vrp2" متناظر با سه گذر انتشار محدوده مقدار (Value Range Propagation) هستند. عدد انتهای نام، فراخوانیهای متمایز از همان گذر را مشخص میکند.
- 2.
- برای فعالسازی ایجاد فایل تخلیه، کد گذر را به پیشوند گزینه -fdump- ضمیمه کرده و GCC را با آن اجرا کنید. برای نمونه، برای فعالسازی تخلیه از گذر Early Value Range Propagation، برنامه GCC را با گزینه -fdump-tree-evrp اجرا کنید. به صورت اختیاری، میتوانید نام فایل تخلیه را مشخص کنید. اگر نامی مشخص نکنید، GCC آن را همانطور که در زیر شرح داده شده ایجاد میکند.
- 3.
- تخلیه گذر را در فایلی بیابید که نام آن از سه بخش جدا شده با نقطه تشکیل شده است: نام فایل منبعی که GCC برای کامپایل آن فراخوانی شده بود، یک پسوند عددی نشاندهنده شماره گذر که پس از آن حرف t برای گذرهای درختی (و حرف r برای گذرهای RTL) میآید، و در نهایت کد گذر. برای نمونه، تخلیه گذر Early VRP ممکن است در فایلی به نام myfile.c.038t.evrp در دایرکتوری کاری فعلی قرار گیرد. توجه داشته باشید که کدهای عددی پایدار نیستند و ممکن است از یک نگارش GCC به نگارش دیگر تغییر کنند.
- -fopt-info
- -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)..IP loop 4 فعالسازی خروجیهای تخلیه (dump) از تمامی بهینهسازیهای حلقه.
- inline
- فعالسازی خروجیهای تخلیه از تمامی بهینهسازیهای درونخطیسازی (inlining).
- omp
- فعالسازی خروجیهای تخلیه از تمامی بهینهسازیهای OMP (تخلیه بار پردازشی و چندپردازشی).
- vec
- فعالسازی خروجیهای تخلیه از تمامی بهینهسازیهای برداریسازی (vectorization).
- optall
- فعالسازی خروجیهای تخلیه از تمامی بهینهسازیها. این گزینه یک ابرمجموعه از گروههای بهینهسازی فهرستشده در بالا است.
اگر options حذف شود، مقدار پیشفرض آن optimized-optall خواهد بود، که به معنای تخلیهٔ پیامهای مربوط به بهینهسازیهای موفق از تمامی گذرها، با صرفنظر از پیامهایی است که به عنوان «مسائل داخلی» (internals) در نظر گرفته میشوند.
اگر filename مشخص شده باشد، خروجیهای تخلیه از تمامی بهینهسازیهای اعمالپذیر در یکدیگر ادغام شده و در filename نوشته میشوند. در غیر این صورت، تخلیه در stderr خروجی داده میشود. اگرچه گزینههای متعدد -fopt-info پذیرفته میشوند، تنها یکی از آنها میتواند شامل یک filename باشد. اگر نامهای فایل دیگری ارائه شوند، تمام گزینههای پس از نخستین مورد نادیده گرفته میشوند.
توجه داشته باشید که در صورت وجود چندین واحد ترجمه (translation units)، فایل خروجی filename بازنویسی میشود. اگر یک خروجی ترکیبی از چندین واحد ترجمه مد نظر است، باید به جای آن از stderr استفاده شود.
در مثال زیر، اطلاعات بهینهسازی در stderr خروجی داده میشود:
gcc -O3 -fopt-info
این مثال:
gcc -O3 -fopt-info-missed=missed.all
گزارش بهینهسازیهای از دسترفته از تمام گذرها را در missed.all خروجی میدهد، و این مثال:
gcc -O2 -ftree-vectorize -fopt-info-vec-missed
اطلاعات مربوط به فرصتهای از دسترفتهٔ بهینهسازی را از گذرهای برداریسازی روی stderr چاپ میکند. توجه داشته باشید که -fopt-info-vec-missed معادل -fopt-info-missed-vec است. ترتیب نامهای گروههای بهینهسازی و انواع پیامهای ذکرشده پس از -fopt-info اهمیتی ندارد.
به عنوان مثالی دیگر،
gcc -O3 -fopt-info-inline-optimized-missed=inline.txt
اطلاعات مربوط به بهینهسازیهای از دسترفته و همچنین مکانهای بهینهسازیشده از تمام گذرهای درونخطیسازی را در inline.txt خروجی میدهد.
در نهایت، این مورد را در نظر بگیرید:
gcc -fopt-info-vec-missed=vec.miss -fopt-info-loop-optimized=loop.opt
در اینجا دو نام فایل خروجی vec.miss و loop.opt دچار تداخل هستند چرا که تنها یک فایل خروجی مجاز است. در این حالت، تنها گزینهٔ اول اعمال میشود و گزینههای بعدی نادیده گرفته میشوند. بنابراین تنها vec.miss تولید میشود که شامل تخلیهٔ اطلاعات از برداریساز دربارهٔ فرصتهای از دسترفته است.
- -fsave-optimization-record
- فایلی با
نام SRCFILE.opt-record.json.gz
مینویسد
که جزئیات
بهینهسازیهای
انجامشده
را برای
بهینهسازیهایی
که از -fopt-info
پشتیبانی
میکنند،
شرح میدهد.
این گزینه آزمایشی است و ساختار دادههای درون فایل فشردهٔ JSON ممکن است تغییر کند.
این گزینه تقریباً معادل یک نسخهٔ ماشینخوان از -fopt-info-all به عنوان مجموعهای از پیامها به همراه فایل منبع، شمارهٔ خط و شمارهٔ ستون است، با دادههای اضافی زیر برای هر پیام:
- تعداد دفعات اجرای کدی که در حال بهینهسازی است، به همراه متادادهای دربارهٔ اینکه آیا این مقدار از دادههای واقعی پروفایلسازی حاصل شده یا صرفاً یک تخمین است، که به مصرفکنندگان اجازه میدهد پیامها را بر اساس داغ بودن کد (code hotness) اولویتبندی کنند،
- نام تابع کدی که در حال بهینهسازی است، در صورت کاربرد،
- «زنجیرهٔ درونخطیسازی» (inlining chain) برای کدی که در حال بهینهسازی است، بهگونهای که وقتی یک تابع در چندین مکان مختلف درونخطی میشود (که ممکن است خود آنها نیز درونخطی شده باشند)، خواننده بتواند میان رونوشتها تمایز قائل شود،
- اشیایی که بخشهایی از پیام را که به عبارتها (expressions)، دستورها (statements) یا گرههای جدول نماد (symbol-table nodes) ارجاع دارند، مشخص میکنند که به کدامیک از این دستهها تعلق دارند، و در صورت دردسترس بودن، مکان آنها در کد منبع را ارائه میدهند،
- گذر GCC که پیام را صادر کرده است، و
- مکانی در کد خود GCC که پیام از آنجا صادر شده است
علاوه بر این، برخی پیامها به طور منطقی درون پیامهای دیگر تودرتو (nested) شدهاند، که بازتابدهندهٔ جزئیات پیادهسازی گذرهای بهینهسازی است.
- -fsched-verbose=n
- در
معماریهای
مقصدی که از
زمانبندی
دستورالعملها
استفاده
میکنند،
این گزینه
میزان
خروجی
اشکالزدایی
را که
زمانبند
در
فایلهای
تخلیه چاپ
میکند،
کنترل
مینماید.
برای n بزرگتر از صفر، -fsched-verbose همان اطلاعات -fdump-rtl-sched1 و -fdump-rtl-sched2 را خروجی میدهد. برای n بزرگتر از یک، احتمالات بلوک پایه (basic block)، اطلاعات تفصیلی فهرست آماده (ready list) و اطلاعات واحد/دستورالعمل (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 گرهٔ گراف فراخوانی تابع درون یکی از محدودههای مشخصشده قرار گیرد، گذر pass برای آن تابع غیرفعال میشود. مقدار uid در سرآیند تابع در فایل تخلیه نشان داده میشود، و نامهای گذر را میتوان با استفاده از گزینهٔ -fdump-passes تخلیه کرد.
- -fdisable-tree-pass
- -fdisable-tree-pass=range-list
- غیرفعال کردن گذر درخت (tree pass) با نام pass. برای شرح آرگومانهای گزینه، -fdisable-rtl را ببینید.
- -fenable-ipa-pass
- فعال کردن گذر IPA با نام pass. آرگومان pass نام گذر است. اگر همان گذر به طور ایستا چندین بار در کامپایلر فراخوانی شود، باید یک شمارهٔ ترتیبی با شروع از ۱ به انتهای نام گذر افزوده شود.
- -fenable-rtl-pass
- -fenable-rtl-pass=range-list
- فعال کردن گذر RTL با نام pass. برای شرح آرگومانهای گزینه و مثالها، -fdisable-rtl را ببینید.
- -fenable-tree-pass
- -fenable-tree-pass=range-list
- فعال کردن گذر درخت (tree pass) با نام pass. برای شرح آرگومانهای گزینه، -fdisable-rtl را ببینید.
در اینجا چند مثال آورده شده است که نحوهٔ استفاده از این گزینهها را نشان میدهند.
# disable ccp1 for all functions -fdisable-tree-ccp1 # disable complete unroll for function whose cgraph node uid is 1 -fenable-tree-cunroll=1 # disable gcse2 for functions at the following ranges [1,1], # [300,400], and [400,1000] # disable gcse2 for functions foo and foo2 -fdisable-rtl-gcse2=foo,foo2 # disable early inlining -fdisable-tree-einline # disable ipa inlining -fdisable-ipa-inline # enable tree full unroll -fenable-tree-unroll
- -fchecking=n
- فعالسازی بررسی سازگاری داخلی. مقدار پیشفرض به پیکربندی کامپایلر بستگی دارد. -fchecking=2 بررسیهای سازگاری داخلی بیشتری را فعال میکند که ممکن است بر تولید کد تأثیر بگذارد.
- -frandom-seed=string
- این گزینه
یک بذر (seed)
فراهم
میکند که GCC
به جای
اعداد
تصادفی در
تولید نام
نمادهای
خاصی که
باید در هر
فایل
کامپایلشده
متفاوت
باشند،
استفاده
میکند.
همچنین
برای قرار
دادن
مُهرهای
یکتا در
فایلهای
داده پوشش
(coverage) و
فایلهای
شیئی که
آنها را
تولید
میکنند،
به کار
میرود.
میتوانید
از گزینه
-frandom-seed برای
تولید
فایلهای
شیء
بازتولیدپذیر
و یکسان
استفاده
کنید.
مقدار string میتواند یک عدد (دهدهی، هشتهشتی یا شانزدهشانزدهی) یا یک رشته دلخواه باشد (که در این حالت با محاسبه CRC32 به یک عدد تبدیل میشود).
مقدار string باید برای هر فایلی که کامپایل میکنید متفاوت باشد.
- -save-temps
- فایلهای
میانی
معمولاً
«موقت» را
به صورت
دائمی
ذخیره
میکند؛
آنها را
طبق
توضیحات
ارائهشده
ذیل -dumpbase و -dumpdir
به عنوان
فایلهای
خروجی کمکی
نامگذاری
میکند.
هنگامی که در ترکیب با گزینه خط فرمان -x استفاده شود، -save-temps به اندازه کافی هوشمند است تا از رونویسی یک فایل منبع ورودی با پسوندی مشابه یک فایل میانی جلوگیری کند. فایل میانی متناظر را میتوان با تغییر نام فایل منبع قبل از استفاده از -save-temps به دست آورد.
- -save-temps=cwd
- معادل -save-temps -dumpdir ./ است.
- -save-temps=obj
- معادل -save-temps -dumpdir outdir/ است، که در آن outdir/ دایرکتوری فایل خروجی مشخصشده پس از گزینه -o، از جمله هرگونه جداکننده دایرکتوری است. اگر گزینه -o استفاده نشود، سوئیچ -save-temps=obj مانند -save-temps=cwd رفتار میکند.
- -time[=file]
- گزارش زمان
CPU صرفشده
توسط هر
زیرپردازش
در توالی
کامپایل.
برای
فایلهای
منبع C، این
شامل خود
کامپایلر
اصلی و
اسمبلر
(بهعلاوه
پیونددهنده
در صورت
انجام
پیوند) است.
بدون مشخص کردن یک فایل خروجی، خروجی به شکل زیر خواهد بود:
# cc1 0.12 0.01 # as 0.00 0.01
اولین عدد در هر سطر «زمان کاربر» (user time) است، یعنی زمان صرفشده برای اجرای خود برنامه. عدد دوم «زمان سیستم» (system time) است، زمان صرفشده برای اجرای روتینهای سیستمعامل از طرف برنامه. هر دو عدد بر حسب ثانیه هستند.
با مشخص کردن یک فایل خروجی، خروجی به انتهای فایل نامبرده الحاق میشود و به شکل زیر خواهد بود:
0.12 0.01 cc1 <options> 0.00 0.01 as <options>
«زمان کاربر» و «زمان سیستم» به قبل از نام برنامه منتقل میشوند، و گزینههای ارسالشده به برنامه نمایش داده میشوند تا بتوان بعداً متوجه شد چه فایلی و با چه گزینههایی کامپایل شده است.
- -fdump-final-insns[=file]
- تخلیه (dump) بازنمایی داخلی نهایی (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
- باعث
میشود
کامپایلر
پس از پایان
هر گذر (pass)،
آماری
درباره
زمان
مصرفشده
توسط آن در stderr
چاپ کند.
اگر خروجی SARIF برای خطایابیها از طریق -fdiagnostics-format=sarif-file یا -fdiagnostics-format=sarif-stderr درخواست شده باشد، آنگاه اطلاعات -ftime-report در عوض در قالب JSON و به عنوان بخشی از خروجی SARIF صادر میشود. فرمت دقیق این دادههای JSON ممکن است تغییر کند و ممکن است مقادیر به دلیل نوشتهشدن در مکانی کمی متفاوت درون کامپایلر، دقیقاً با مقادیر صادرشده به stderr مطابقت نداشته باشند.
- -ftime-report-details
- ثبت جداگانه زمان مصرفشده توسط بخشهای زیرساختی برای هر گذر (pass).
- -fira-verbose=n
- کنترل میزان جزئیات فایل تخلیه برای تخصیصدهنده یکپارچه ثباتها (integrated register allocator). مقدار پیشفرض ۵ است. اگر مقدار n بزرگتر یا مساوی ۱۰ باشد، خروجی تخلیه با همان قالبِ n منهای ۱۰ به stderr ارسال میشود.
- -flto-report
- چاپ گزارشی
حاوی
جزئیات
داخلی
درباره
نحوه
عملکرد
بهینهساز
زمان پیوند
(link-time optimizer).
محتویات
این گزارش
از نسخهای
به نسخه
دیگر متغیر
است. هدف آن
مفید بودن
برای
توسعهدهندگان
GCC هنگام
پردازش
فایلهای
شیء در حالت
LTO (از طریق -flto)
است.
بهطور پیشفرض غیرفعال است.
- -flto-report-wpa
- مانند -flto-report، اما گزارش را تنها برای مرحله WPA بهینهسازی زمان پیوند چاپ میکند.
- -fmem-report
- باعث میشود کامپایلر پس از اتمام کار، آماری درباره تخصیص حافظه دائمی چاپ کند.
- -fmem-report-wpa
- باعث میشود کامپایلر آماری درباره تخصیص حافظه دائمی تنها برای مرحله WPA چاپ کند.
- -fpre-ipa-mem-report
- -fpost-ipa-mem-report
- باعث میشود کامپایلر آماری درباره تخصیص حافظه دائمی قبل یا بعد از بهینهسازی بینرویهای (interprocedural optimization) چاپ کند.
- -fmultiflags
- این گزینه
امکان
استفاده از
"TFLAGS"
آگاه از multilib
را برای
ساخت
کتابخانههای
مقصد با
گزینههایی
متفاوت از
مواردی که
کامپایلر
بهطور
پیشفرض
برای
استفاده
پیکربندی
شده است، از
طریق
مشخصات (specs)
تنظیمشده
توسط
بخشهای
داخلی
کامپایلر،
توسط مقصد،
یا توسط
سازندگان
در زمان
پیکربندی
فراهم
میکند.
مشابه "TFLAGS"، این به کتابخانههای مقصد امکان میدهد برای محیطهای پایه و سازگار ساخته شوند، در حالی که کامپایلر بهطور پیشفرض محیطهای پرتقاضاتری را در نظر میگیرد. این امر مفید است زیرا کاربران در صورتی که پیشفرضها برای محیط مقصدشان ایدهآل نباشد، میتوانند بهراحتی تنظیمات پیشفرض پیکربندی کامپایلر را برای ساخت برنامههای خود لغو کنند، در حالی که بازسازی کتابخانههای زمان اجرا معمولاً به این آسانی یا خوشایندی نیست.
برخلاف "TFLAGS"، استفاده از مشخصات (specs) امکان انتخاب پرچمهای مختلف را برای multilibهای گوناگون فراهم میکند. روش دستیابی به این امر، ساخت با دستور make TFLAGS=-fmultiflags پس از پیکربندی --with-specs=%{fmultiflags:...} است.
این گزینه پس از پایان پردازش driver self spec توسط راهانداز، کنار گذاشته میشود.
همچنین برای بررسی اینکه آیا "TFLAGS" برای ساخت تمام کتابخانههای مقصد استفاده میشود یا خیر، با پیکربندی یک کامپایلر غیر-bootstrap بهصورت --with-specs='%{!fmultiflags:%emissing TFLAGS}' و ساخت کامپایلر و کتابخانههای مقصد مفید است..IP -fprofile-report 4 باعث میشود کامپایلر آمارههایی دربارهٔ سازگاری نمایهٔ (تخمینزدهشده) و اثر هر گذر بهطور جداگانه در خروجی چاپ کند.
- -fstack-usage
- باعث میشود کامپایلر اطلاعات میزان مصرف پشته (stack) را به ازای هر تابع برای برنامه تولید کند. نام فایل برای رونوشت با الحاق .su به auxname ساخته میشود. اگر نام فایل خروجی صریحاً مشخص شده باشد و یک فایل اجرایی نباشد، auxname از روی آن تولید میشود؛ در غیر این صورت، نام پایه (basename) فایل منبع خواهد بود. هر مدخل از سه فیلد تشکیل شده است:
- نام تابع.
- تعداد بایتها.
- یک یا چند توصیفکننده: "static"، "dynamic"، "bounded".
توصیفکنندهٔ "static" بدین معناست که تابع پشته را بهطور ایستا دستکاری میکند: در هنگام ورود به تابع، تعداد بایتهای مشخص و ثابتی برای فریم پشته تخصیص یافته و هنگام خروج از تابع آزاد میشود؛ هیچ تنظیم پشتهای دیگری در بدنهٔ تابع انجام نمیپذیرد. فیلد دوم همین تعداد بایت ثابت است.
توصیفکنندهٔ "dynamic" بدین معناست که تابع پشته را بهطور پویا دستکاری میکند: علاوه بر تخصیص ایستای شرحدادهشده در بالا، تنظیمات پشته درون بدنهٔ تابع نیز انجام میگیرد، برای نمونه جهت push/pop کردن آرگومانها پیرامون فراخوانی توابع. اگر توصیفکنندهٔ "bounded" نیز حضور داشته باشد، میزان این تنظیمات در زمان کامپایل کراندار (محدود) است و فیلد دوم، کران بالای کل پشتهٔ مصرفی تابع خواهد بود. اگر این توصیفکننده نباشد، میزان این تنظیمات در زمان کامپایل کراندار نیست و فیلد دوم تنها بخش کراندار را نشان میدهد.
- -fstats
- در پایان فرایند کامپایل، آمارههایی دربارهٔ پردازش فرانتاند صادر میکند. این گزینه تنها توسط فرانتاند ++C پشتیبانی میشود و اطلاعات آن عموماً تنها برای تیم توسعهٔ ++G مفید است.
- -fdbg-cnt-list
- نام و کران بالای شمارنده را برای همهٔ شمارندههای دیباگ چاپ میکند.
- -fdbg-cnt=counter-value-list
- کران پایین و بالای شمارندهٔ داخلی دیباگ را تنظیم میکند. counter-value-list فهرستی جداشده با کاما از چندتاییهای name:lower_bound1-upper_bound1 [:lower_bound2-upper_bound2...] است که نام شمارنده و فهرستی از بازههای بسته را تعیین میکند. مقدار lower_bound اختیاری است و اگر تعیین نشود، با مقدار صفر مقداردهی اولیه میشود. برای مثال با -fdbg-cnt=dce:2-4:10-11,tail_call:10، عبارت dbg_cnt(dce) تنها برای فراخوانیهای دوم، سوم، چهارم، دهم و یازدهم مقدار true برمیگرداند. برای dbg_cnt(tail_call)، برای ۱۰ فراخوانی نخست مقدار true برگردانده میشود.
- -print-file-name=library
- نام کامل و مطلق فایل کتابخانهٔ library را که هنگام پیوند استفاده میشود چاپ میکند---و کار دیگری انجام نمیدهد. با این گزینه، GCC هیچ کدی را کامپایل یا پیوند نمیکند؛ تنها نام فایل را چاپ میکند.
- -print-multi-directory
- نام دایرکتوری متناظر با multilib انتخابشده توسط سایر سوئیچهای موجود در خط فرمان را چاپ میکند. فرض بر این است که این دایرکتوری در GCC_EXEC_PREFIX وجود دارد.
- -print-multi-lib
- نگاشت نام دایرکتوریهای multilib به سوئیچهای کامپایلری که آنها را فعال میکنند چاپ میکند. نام دایرکتوری با ; از سوئیچها جدا میشود و هر سوئیچ به جای - با یک @ آغاز میشود، بدون اینکه فاصلهای میان چند سوئیچ باشد. هدف از این قالب، تسهیل پردازش در شل است.
- -print-multi-os-directory
- مسیر کتابخانههای سیستمعامل را برای multilib انتخابشده، به صورت نسبی به یکی از زیردایرکتوریهای lib چاپ میکند. اگر کتابخانههای سیستمعامل در زیردایرکتوری lib باشند و هیچ multilibای به کار نرفته باشد، معمولاً خروجی تنها . خواهد بود؛ اگر کتابخانههای سیستمعامل در دایرکتوریهای همسطحِ libsuffix باشند، به عنوان نمونه خروجی ../lib64، ../lib یا ../lib32 خواهد بود؛ و اگر کتابخانههای سیستمعامل در زیردایرکتوریهای lib/subdir قرار داشته باشند، برای مثال amd64، sparcv9 یا ev6 چاپ میشود.
- -print-multiarch
- مسیر کتابخانههای سیستمعامل را برای multiarch انتخابشده، به صورت نسبی به یکی از زیردایرکتوریهای lib چاپ میکند.
- -print-prog-name=program
- مانند -print-file-name عمل میکند، اما به دنبال برنامهای مانند cpp میگردد.
- -print-libgcc-file-name
- مشابه -print-file-name=libgcc.a
است.
این گزینه زمانی مفید است که از -nostdlib یا -nodefaultlibs استفاده میکنید اما تمایل دارید پیوند با libgcc.a برقرار شود. میتوانید این دستور را اجرا کنید:
gcc -nostdlib <files>... `gcc -print-libgcc-file-name`
- -print-search-dirs
- نام
دایرکتوری
نصب
پیکربندیشده
و فهرستی از
دایرکتوریهای
برنامه و
کتابخانه
را که gcc
جستجو
میکند چاپ
میکند---و
کار دیگری
انجام
نمیدهد.
این گزینه زمانی کاربرد دارد که gcc پیام خطای installation problem, cannot exec cpp0: No such file or directory را چاپ میکند. برای حل این مشکل، یا باید cpp0 و سایر اجزای کامپایلر را در جایی که gcc انتظار دارد قرار دهید، یا متغیر محیطی GCC_EXEC_PREFIX را روی دایرکتوری محل نصب آنها تنظیم کنید. اسلش پایانی (/) را فراموش نکنید.
- -print-sysroot
- دایرکتوری sysroot مقصد را که حین کامپایل استفاده میشود، چاپ میکند. این همان sysroot مقصدی است که یا در زمان پیکربندی و یا با گزینهٔ --sysroot تعیین شده است، و ممکن است پسوند اضافهای وابسته به گزینههای کامپایل داشته باشد. اگر هیچ sysroot مقصدی تعیین نشده باشد، این گزینه چیزی چاپ نمیکند.
- -print-sysroot-headers-suffix
- پسوندی را که هنگام جستجوی هدرها به sysroot مقصد اضافه میشود چاپ میکند، یا در صورتی که کامپایلر با چنین پسوندی پیکربندی نشده باشد یک خطا صادر میکند---و کار دیگری انجام نمیدهد.
- -dumpmachine
- ماشین مقصد کامپایلر را چاپ میکند (برای مثال، i686-pc-linux-gnu)---و کار دیگری انجام نمیدهد.
- -dumpversion
- نسخهٔ کامپایلر را چاپ میکند (برای مثال، 3.0، 6.3.0 یا 7)---و کار دیگری انجام نمیدهد. این همان نسخهٔ کامپایلری است که در مسیرهای فایلسیستم و فایلهای specs استفاده میشود. بسته به نحوهٔ پیکربندی کامپایلر، خروجی میتواند یک عدد تنها (نسخهٔ اصلی یا major)، دو عدد جداشده با نقطه (نسخهٔ اصلی و فرعی یا major و minor) یا سه عدد جداشده با نقطه (نسخهٔ اصلی، فرعی و پچلول یا patchlevel) باشد.
- -dumpfullversion
- نسخهٔ کامل کامپایلر را چاپ میکند---و کار دیگری انجام نمیدهد. خروجی همواره شامل سه عدد جداشده با نقطه است: نسخهٔ اصلی، فرعی و سطح وصله (major، minor و patchlevel).
- -dumpspecs
- تنظیمات specs توکار کامپایلر را چاپ میکند---و کار دیگری انجام نمیدهد. (این گزینه هنگام ساخت خود GCC به کار میرود.).SS "گزینههای وابسته به ماشین (Machine-Dependent Options)" هر ماشین مقصدی که توسط GCC پشتیبانی میشود میتواند گزینههای مختص به خود را داشته باشد؛ برای مثال، برای اینکه امکان کامپایل برای یک گونه خاص پردازنده یا ABI خاص را فراهم کند، یا بهینهسازیهای ویژه آن ماشین را کنترل نماید. طبق قرارداد، نام گزینههای مختص ماشین با -m آغاز میشود.
برخی از پیکربندیهای کامپایلر همچنین از گزینههای اضافی مختص مقصد پشتیبانی میکنند که معمولاً برای سازگاری با سایر کامپایلرها در همان پلتفرم است.
گزینههای AArch64
این گزینهها برای پیادهسازیهای AArch64 تعریف شدهاند:
- -mabi=name
- تولید کد
برای مدل
داده
مشخصشده.
مقادیر
مجاز
عبارتند از
ilp32 برای مدل
داده شبه SysV
که در آن int، long int
و
اشارهگرها
۳۲ بیتی
هستند، و lp64
برای مدل
داده شبه SysV
که در آن int
مقدار ۳۲
بیتی دارد،
اما long int و
اشارهگرها
۶۴ بیتی
هستند.
مقدار پیشفرض به پیکربندی مقصد مشخص بستگی دارد. توجه داشته باشید که ABIهای LP64 و ILP32 از نظر پیوند سازگار نیستند؛ شما باید کل برنامه خود را با همان ABI کامپایل کرده و با مجموعهای از کتابخانههای سازگار پیوند دهید.
مدل ilp32 منسوخ شده است.
- -mbig-endian
- تولید کد بزرگپایان (big-endian). این گزینه، حالت پیشفرض در زمانی است که GCC برای یک مقصد aarch64_be-*-* پیکربندی شده باشد.
- -mgeneral-regs-only
- تولید کدی که فقط از ثباتهای همهمنظوره استفاده میکند. این کار مانع از استفاده کامپایلر از ثباتهای ممیز شناور و Advanced SIMD میشود، اما هیچ محدودیتی بر اسمبلر اعمال نخواهد کرد.
- -mlittle-endian
- تولید کد کوچکپایان (little-endian). این گزینه، حالت پیشفرض در زمانی است که GCC برای یک مقصد aarch64-*-* (و نه یک مقصد aarch64_be-*-*) پیکربندی شده باشد.
- -mcmodel=tiny
- تولید کد برای مدل کد tiny. برنامه و نمادهای تعریفشده بهصورت ایستا در آن باید در فاصله 1MB از یکدیگر قرار گیرند. برنامهها میتوانند بهصورت ایستا یا پویا پیوند داده شوند.
- -mcmodel=small
- تولید کد برای مدل کد small. برنامه و نمادهای تعریفشده بهصورت ایستا در آن باید در فاصله 4GB از یکدیگر قرار گیرند. برنامهها میتوانند بهصورت ایستا یا پویا پیوند داده شوند. این مدل کد پیشفرض است.
- -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 است. توصیه میشود تمام کدهایی که قرار است با یکدیگر تعامل داشته باشند با مقدار یکسانی از این گزینه کامپایل شوند تا از دسترسی به یک اشارهگر رشته متفاوت از سطح استثنای نادرست جلوگیری شود.
- -mstrict-align
- -mno-strict-align
- جلوگیری یا مجاز دانستن تولید دسترسیهای به حافظه که ممکن است همانطور که در مشخصات معماری شرح داده شده است، روی مرز طبیعی شیء همتراز نشده باشند.
- -momit-leaf-frame-pointer
- -mno-omit-leaf-frame-pointer
- حذف یا نگهداشتن اشارهگر فریم در توابع برگ (leaf functions). رفتار اولی پیشفرض است.
- -mstack-protector-guard=guard
- -mstack-protector-guard-reg=reg
- -mstack-protector-guard-offset=offset
- تولید کد
محافظت از
پشته با
استفاده از
canary در guard.
مکانهای
پشتیبانیشده
عبارتند از
global برای یک canary
سراسری یا
sysreg برای یک canary
در یک ثبات
سیستمی
مناسب.
با انتخاب گزینه دوم، گزینههای -mstack-protector-guard-reg=reg و -mstack-protector-guard-offset=offset علاوه بر این مشخص میکنند که از کدام ثبات سیستمی به عنوان ثبات پایه برای خواندن canary و از چه آفستی نسبت به آن ثبات پایه استفاده شود. هیچ ثبات یا آفست پیشفرضی وجود ندارد زیرا این مورد کاملاً برای استفاده در هسته لینوکس است.
- -mtls-dialect=desc
- استفاده از توصیفکنندههای TLS به عنوان سازوکار حافظه محلی رشته برای دسترسیهای پویا به متغیرهای 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
- فعال یا غیرفعال کردن راهحل ترمیمی برای ایراد سختافزاری شماره 835769 پردازنده ARM Cortex-A53. این کار شامل قرار دادن یک دستورالعمل NOP بین دستورالعملهای حافظه و دستورالعملهای ضرب-تجمع صحیح ۶۴ بیتی است. اگر یک معماری یا پردازنده در خط فرمان مشخص شده باشد که به این ترمیم نیازی ندارد، این پرچم نادیده گرفته خواهد شد.
- -mfix-cortex-a53-843419
- -mno-fix-cortex-a53-843419
- فعال یا غیرفعال کردن راهحل ترمیمی برای ایراد سختافزاری شماره 843419 پردازنده ARM Cortex-A53. این ترمیم ایراد سختافزاری در زمان پیوند انجام میشود و این گزینه صرفاً پرچم مربوطه را به پیونددهنده ارسال خواهد کرد. اگر یک معماری یا پردازنده در خط فرمان مشخص شده باشد که به این ترمیم نیازی ندارد، این پرچم نادیده گرفته خواهد شد.
- -mlow-precision-recip-sqrt
- -mno-low-precision-recip-sqrt
- فعال یا غیرفعال کردن تقریب جذر معکوس. این گزینه تنها در صورتی تأثیر دارد که -ffast-math یا -funsafe-math-optimizations نیز استفاده شده باشد. فعال کردن این گزینه، دقت نتایج جذر معکوس را برای دقت یگانه به حدود ۱۶ بیت و برای دقت دوگانه به ۳۲ بیت کاهش میدهد.
- -mlow-precision-sqrt
- -mno-low-precision-sqrt
- فعال یا غیرفعال کردن تقریب جذر. این گزینه تنها در صورتی تأثیر دارد که -ffast-math یا -funsafe-math-optimizations نیز استفاده شده باشد. فعال کردن این گزینه، دقت نتایج جذر را برای دقت یگانه به حدود ۱۶ بیت و برای دقت دوگانه به ۳۲ بیت کاهش میدهد. در صورت فعال بودن، بهطور ضمنی -mlow-precision-recip-sqrt را نیز اعمال میکند.
- -mlow-precision-div
- -mno-low-precision-div
- فعال یا غیرفعال کردن تقریب تقسیم. این گزینه تنها در صورتی تأثیر دارد که -ffast-math یا -funsafe-math-optimizations نیز استفاده شده باشد. فعال کردن این گزینه، دقت نتایج تقسیم را برای دقت یگانه به حدود ۱۶ بیت و برای دقت دوگانه به ۳۲ بیت کاهش میدهد.
- -mtrack-speculation
- -mno-track-speculation
- فعال یا غیرفعال کردن تولید کد اضافی برای ردیابی اجرای حدسی (speculative execution) از طریق شاخههای شرطی. سپس وضعیت ردیابیشده میتواند توسط کامپایلر در هنگام بسط فراخوانیها به "__builtin_speculation_safe_copy" به کار گرفته شود تا امکان تولید دنباله کدی کارآمدتر فراهم شود.
- -moutline-atomics
- -mno-outline-atomics
- فعال یا
غیرفعال
کردن
فراخوانیها
به توابع
کمکی
برونخطی
(out-of-line helpers) برای
پیادهسازی
عملیات
اتمیک. این
توابع
کمکی، در
زمان اجرا
تعیین
میکنند که
آیا
میتوان از
دستورالعملهای
LSE از ARMv8.1-A
استفاده
کرد یا خیر؛
در غیر این
صورت، از
دستورالعملهای
load/store-exclusive که در ISA
پایه ARMv8.0 وجود
دارند
استفاده
خواهند کرد.
این گزینه تنها در هنگام کامپایل برای مجموعه دستورالعمل پایه ARMv8.0 کاربرد دارد. اگر از نگارش جدیدتری استفاده شود، مانند -march=armv8.1-a یا -march=armv8-a+lse، دستورالعملهای ARMv8.1-Atomics مستقیماً استفاده خواهند شد. همین موضوع در هنگام استفاده از -mcpu= نیز در حالتی که پردازنده انتخابشده از ویژگی lse پشتیبانی کند، صدق میکند. این گزینه بهطور پیشفرض فعال است.
- -march=name
- مشخص کردن
نام معماری
مقصد و
بهصورت
اختیاری،
یک یا چند
اصلاحکننده
ویژگی. این
گزینه فرم
-march=arch{+[no]feature}*
را دارد.
جدول زیر مقادیر مجاز برای arch و ویژگیهایی که بهطور پیشفرض فعال میکنند را خلاصه میکند:
- armv8-a : Armv8-A : +fp, +simd
- armv8.1-a : Armv8.1-A : armv8-a, +crc, +lse, +rdma
- armv8.2-a : Armv8.2-A : armv8.1-a
- armv8.3-a : Armv8.3-A : armv8.2-a, +pauth, +fcma, +jscvt
- armv8.4-a : Armv8.4-A : armv8.3-a, +flagm, +fp16fml, +dotprod, +rcpc2
- armv8.5-a : Armv8.5-A : armv8.4-a, +sb, +ssbs, +predres, +frintts, +flagm2
- armv8.6-a : Armv8.6-A : armv8.5-a, +bf16, +i8mm
- armv8.7-a : Armv8.7-A : armv8.6-a, +wfxt, +xs
- armv8.8-a : Armv8.8-a : armv8.7-a, +mops
- armv8.9-a : Armv8.9-a : armv8.8-a
- armv9-a : Armv9-A : armv8.5-a, +sve, +sve2
- armv9.1-a : Armv9.1-A : armv9-a, +bf16, +i8mm
- armv9.2-a : Armv9.2-A : armv9.1-a, +wfxt, +xs
- armv9.3-a : Armv9.3-A : armv9.2-a, +mops
- armv9.4-a : Armv9.4-A : armv9.3-a, +sve2p1
- armv9.5-a : Armv9.4-A : armv9.4-a, cpa, +faminmax, +lut
- armv8-r : Armv8-R : armv8-r
مقدار native روی گنو/لینوکس محلی AArch64 در دسترس است و باعث میشود کامپایلر معماری سیستم میزبان را انتخاب کند. این گزینه در صورتی که کامپایلر قادر به شناسایی معماری سیستم میزبان نباشد، هیچ اثری نخواهد داشت. هنگامی که -march=native داده شده و هیچ گزینهٔ -mcpu یا -mtune دیگری مشخص نشده باشد، آنگاه GCC پردازندهٔ میزبان را بهعنوان پردازنده هدف برای بهینهسازی و همچنین استخراج ویژگیهای معماری انتخاب خواهد کرد. به عبارت دیگر، با -march=native همانند -mcpu=native رفتار میشود.
مقادیر مجاز برای feature در زیربخش مربوط به aarch64-feature-modifiers,,-march and -mcpu Feature Modifiers فهرست شدهاند. هر جا که تغییردهندههای ویژگیِ ناسازگار مشخص شده باشند، راستترین ویژگی اعمال میشود.
کامپایلر GCC از name برای تعیین نوع دستورالعملهایی که میتواند هنگام تولید کد اسمبلی صادر کند، استفاده مینماید. اگر -march بدون تعیین هیچیک از گزینههای -mtune یا -mcpu مشخص شود، کد طوری بهینهسازی (tune) میشود که در طیفی از پردازندههای هدفی که معماری مقصد را پیادهسازی کردهاند عملکرد خوبی داشته باشد.
- -mtune=name
- نام
پردازندهٔ
هدف را مشخص
میکند که GCC
باید
عملکرد کد
را برای آن
تنظیم و
بهینهسازی
کند. مقادیر
مجاز برای
این گزینه
عبارتند از:
generic، cortex-a35، cortex-a53،
cortex-a55، cortex-a57،
cortex-a72، cortex-a73،
cortex-a75، cortex-a76،
cortex-a76ae، cortex-a77،
cortex-a65، cortex-a65ae،
cortex-a34، cortex-a78،
cortex-a78ae، cortex-a78c، ares،
exynos-m1، emag، falkor،
oryon-1، neoverse-512tvb،
neoverse-e1، neoverse-n1،
neoverse-n2، neoverse-v1،
neoverse-v2، grace، neoverse-v3،
neoverse-v3ae، neoverse-n3،
olympus، cortex-a725،
cortex-x925، qdf24xx، saphira،
phecda، xgene1، vulcan،
octeontx، octeontx81،
octeontx83، octeontx2،
octeontx2t98، octeontx2t96
octeontx2t93، octeontx2f95،
octeontx2f95n، octeontx2f95mm،
a64fx، fujitsu-monaka، thunderx،
thunderxt88، thunderxt88p1،
thunderxt81، tsv110،
thunderxt83، thunderx2t99،
thunderx3t110، zeus،
cortex-a57.cortex-a53، cortex-a72.cortex-a53،
cortex-a73.cortex-a35، cortex-a73.cortex-a53،
cortex-a75.cortex-a55، cortex-a76.cortex-a55،
cortex-r82، cortex-r82ae،
cortex-x1، cortex-x1c،
cortex-x2، cortex-x3، cortex-x4،
cortex-a510، cortex-a520،
cortex-a520ae، cortex-a710،
cortex-a715، cortex-a720،
cortex-a720ae، ampere1،
ampere1a، ampere1b، cobalt-100،
apple-m1، apple-m2، apple-m3 و
native.
مقادیر cortex-a57.cortex-a53، cortex-a72.cortex-a53، cortex-a73.cortex-a35، cortex-a73.cortex-a53، cortex-a75.cortex-a55، cortex-a76.cortex-a55، apple-m1، apple-m2، apple-m3 و gb10 مشخص میکنند که GCC باید برای یک سامانهٔ big.LITTLE بهینهسازی کند.
مقدار neoverse-512tvb مشخص میکند که GCC باید برای هستههای Neoverse که (الف) SVE را پیادهسازی کردهاند و (ب) دارای پهنای باند برداری کل ۵۱۲ بیت در هر چرخه هستند بهینهسازی انجام دهد. به عبارت دیگر، این گزینه به GCC اعلام میکند برای هستههای Neoverse تنظیم شود که میتوانند ۴ دستورالعمل محاسباتی ۱۲۸ بیتی Advanced SIMD در یک چرخه و تعداد معادلی از دستورالعملهای محاسباتی SVE در هر چرخه را اجرا نمایند (۲ عدد برای SVE با طول ۲۵۶ بیت، ۴ عدد برای SVE با طول ۱۲۸ بیت). این تنظیم عمومیتر از بهینهسازی برای یک هستهٔ خاص مانند Neoverse V1 است، اما خاصتر از بهینهسازی پیشفرضی است که در زیر شرح داده شده است.
علاوه بر این، در سامانههای محلی گنو/لینوکس AArch64، مقدار native عملکرد را متناسب با سامانهٔ میزبان تنظیم میکند. این گزینه اگر کامپایلر قادر به شناسایی پردازندهٔ سامانهٔ میزبان نباشد، هیچ اثری نخواهد داشت.
در صورتی که هیچیک از گزینههای -mtune=، -mcpu= یا -march= مشخص نشده باشند، کد طوری بهینهسازی میشود که در طیفی از پردازندههای هدف عملکرد مناسبی داشته باشد.
این گزینه نمیتواند پسوندی از اصلاحکنندههای ویژگی داشته باشد.
- -mcpu=name
- نام
پردازندهٔ
هدف را مشخص
میکند که
میتواند
بهطور
اختیاری با
یک یا چند
اصلاحکنندهٔ
ویژگی
همراه شود.
این گزینه
ساختار
-mcpu=cpu{+[no]feature}*
را دارد، که
در آن
مقادیر
مجاز برای
cpu همان
مقادیر
موجود برای
-mtune هستند.
مقادیر
مجاز برای
feature در
زیربخش
مربوط به
aarch64-feature-modifiers,,-march and -mcpu
Feature Modifiers مستند
شدهاند. در
جاهایی که
اصلاحکنندههای
ویژگیِ
ناسازگار
مشخص شده
باشند،
راستترین
ویژگی
اعمال
میشود.
کامپایلر GCC از name برای تعیین نوع دستورالعملهایی که میتواند هنگام تولید کد اسمبلی صادر کند (همانند -march) و تعیین پردازندهٔ هدف برای بهینهسازی عملکرد (همانند -mtune) استفاده میکند. در جاهایی که این گزینه همگام با -march یا -mtune استفاده شود، آن گزینهها بر بخش مربوطه از این گزینه اولویت دارند.
گزینهٔ -mcpu=neoverse-512tvb از این نظر خاص است که به یک هستهٔ معین اشاره ندارد، بلکه به تمام هستههای Neoverse اشاره دارد که (الف) SVE را پیادهسازی کردهاند و (ب) مجموع پهنای باند برداری ۵۱۲ بیت در چرخه دارند. مگر در حالتی که با -march بازنویسی شود، -mcpu=neoverse-512tvb کدی تولید میکند که میتواند روی یک هستهٔ Neoverse V1 اجرا شود، چرا که Neoverse V1 نخستین هستهٔ Neoverse با این خصوصیات است. مگر در حالتی که با -mtune بازنویسی شود، -mcpu=neoverse-512tvb کد را همانند -mtune=neoverse-512tvb بهینهسازی میکند.
- -moverride=string
- تصمیمات
بهینهسازی
گرفتهشده
توسط بخش
پشتی (back-end) را
در پاسخ به
گزینهٔ -mtune=
بازنویسی
میکند. نحو
(syntax)، مفاهیم و
مقادیر
پذیرفتهشده
برای string در
این گزینه،
برای
یکسانی در
نگارشهای
مختلف
تضمین
نمیشوند.
این گزینه تنها برای استفاده در هنگام توسعهٔ GCC در نظر گرفته شده است.
- -mverbose-cost-dump
- تخلیهٔ (dump) مفصل مدل هزینه را در فایلهای اشکالزدایی فعال میکند. این گزینه جهت استفاده در اشکالزدایی کامپایلر ارائه شده است.
- -mpc-relative-literal-loads
- -mno-pc-relative-literal-loads
- بارگذاری مقادیر ثابت وابسته به PC (شمارندهٔ برنامه) را فعال یا غیرفعال میکند. با این گزینه، به مخازن مقادیر ثابت (literal pools) با یک تکدستورالعمل دسترسی پیدا میشود و پس از هر تابع صادر میگردند. این کار حداکثر اندازهٔ توابع را به 1MB محدود میکند. این گزینه بهطور پیشفرض برای -mcmodel=tiny فعال است.
- -msign-return-address=scope
- دامنهٔ توابعی را که امضای آدرس بازگشت بر آنها اعمال خواهد شد، تعیین میکند. مقادیر مجاز عبارتند از: none که امضای نشانی بازگشت را غیرفعال میکند، non-leaf که امضای اشارهگر را برای توابعی که تابع برگ (leaf) نیستند فعال مینماید، و all که امضای اشارهگر را برای تمامی توابع فعال میسازد. مقدار پیشفرض none است. این گزینه به نفع -mbranch-protection منسوخ شده است.
- -mbranch-protection=none|standard|pac-ret[+leaf+b-key]|bti|gcs
- ویژگیهای محافظت از انشعاب مورد استفاده را انتخاب میکند. none پیشفرض است و تمام انواع محافظت از انشعاب را خاموش میکند. standard تمام انواع ویژگیهای محافظت از انشعاب را فعال میکند. اگر یک ویژگی دارای گزینههای بهینهسازی بیشتری باشد، standard آن را روی سطح استانداردش قرار میدهد. pac-ret[+leaf] امضای آدرس بازگشت را در سطح استاندارد فعال میکند: امضای توابعی که آدرس بازگشت را در حافظه ذخیره میکنند (توابع غیربرگ در عمل همواره این کار را انجام میدهند) با استفاده از a-key. آرگومان اختیاری leaf میتواند برای گسترش امضا جهت شامل شدن توابع برگ استفاده شود. آرگومان اختیاری b-key میتواند برای امضای توابع با کلید B بهجای کلید A به کار رود. bti سازوکار شناسایی هدف انشعاب (Branch Target Identification) را فعال میکند. gcs تولید کد سازگار با پشتهٔ کنترل محافظتشده (Guarded Control Stack) را فعال مینماید.
- -mharden-sls=opts
- مقاومسازی کامپایلر را در برابر گمانهزنی مستقیم (SLS - straight line speculation) فعال میکند. opts فهرستی از گزینههای زیر است که با کاما از هم جدا شدهاند:
علاوه بر این، -mharden-sls=all تمامی مقاومسازیهای SLS را فعال میکند در حالی که -mharden-sls=none تمام مقاومسازیهای SLS را غیرفعال میسازد. تعیین میکند چه زمانی یک گذر زودهنگام تخصیص ثبات فعال شود. این گذر قبل از زمانبندی دستورالعملها اجرا میشود و تلاش میکند یک تخصیص بدون سرریز (spill-free) برای کدهای ممیز شناور و برداری بیابد. همچنین تلاش میکند از دستورالعملهای چندثباتی گامدار (strided multi-register)، مانند LD1 و ST1 گامدار در SME2 استفاده کند.
مقادیر ممکن برای scope عبارتند از: all، که گذر را روی تمام توابع اجرا میکند؛ strided، که گذر را روی توابعی اجرا میکند که به دستورالعملهای چندثباتی گامدار دسترسی دارند؛ و none، که گذر را غیرفعال میکند.
گزینهٔ -mearly-ra=all پیشفرض برای -O2 و بالاتر، و برای -Os است. در غیر این صورت، -mearly-ra=none پیشفرض خواهد بود.
- -mearly-ldp-fusion
- نسخهای از گذر ادغام جفت load/store در AArch64 را که قبل از تخصیص ثبات اجرا میشود فعال میکند. بهطور پیشفرض در -O و بالاتر فعال است.
- -mlate-ldp-fusion
- نسخهای از گذر ادغام جفت load/store در AArch64 را که پس از تخصیص ثبات اجرا میشود فعال میکند. بهطور پیشفرض در -O و بالاتر فعال است.
- -msve-vector-bits=bits
- تعداد
بیتها را
در یک ثبات
برداری SVE
مشخص
میکند. این
گزینه تنها
زمانی
تأثیر دارد
که SVE فعال
باشد.
کامپایلر GCC از دو شیوهٔ تولید کد SVE پشتیبانی میکند: خروجی «مستقل از طول بردار» (vector-length agnostic) که با هر اندازهای از ثبات برداری کار میکند و خروجی «وابسته به طول بردار» (vector-length specific) که به GCC اجازه میدهد در مواردی که برای بهینهسازی سودمند است، فرضهایی را دربارهٔ طول بردار در نظر بگیرد. مقادیر ممکن برای bits عبارتند از: scalable، 128، 256، 512، 1024 و 2048. مشخص کردن scalable خروجی مستقل از طول بردار را انتخاب میکند. در حال حاضر -msve-vector-bits=128 نیز برای مقصدهای big-endian خروجی مستقل از طول بردار تولید میکند. تمامی مقادیر دیگر کدهای وابسته به طول بردار تولید میکنند. رفتار این مقادیر ممکن است در نسخههای آینده تغییر کند و برای تولید کدی که بین سختافزارهای مختلف با طولهای بردار متفاوت SVE سازگار و قابلحمل باشد، نباید به هیچ مقداری جز scalable اتکا کرد.
پیشفرض -msve-vector-bits=scalable است که کد مستقل از طول بردار تولید میکند.
- -Wexperimental-fmv-target
- دربارهٔ استفاده از ویژگی آزمایشی چندنسخهایسازی توابع (Function Multi Versioning) هشدار میدهد. مشخصات افزونه زبان سی آرم (Arm C Language Extension) برای Function Multi Versioning در مرحلهٔ بتا قرار دارد و دستخوش تغییر است. هرگونه استفاده از FMV با این هشدار همراه است که احتمال تغییر رفتار و ناسازگاری در آینده وجود دارد.
اصلاحکنندههای ویژگی -march و -mcpu
اصلاحکنندههای ویژگی مورد استفاده با -march و -mcpu میتوانند هر یک از موارد زیر و معکوس آنها یعنی nofeature باشند:
- crc
- افزونهٔ CRC را فعال میکند. این گزینه بهطور پیشفرض برای -march=armv8.1-a فعال است.
- crypto
- افزونهٔ Crypto را فعال میکند. این گزینه همچنین دستورالعملهای Advanced SIMD و ممیز شناور را فعال میکند.
- fp
- دستورالعملهای ممیز شناور را فعال میکند. این گزینه بهطور پیشفرض برای تمام مقادیر ممکنِ گزینههای -march و -mcpu فعال است.
- simd
- دستورالعملهای Advanced SIMD را فعال میکند. این گزینه همچنین دستورالعملهای ممیز شناور را فعال میکند. این گزینه بهطور پیشفرض برای تمام مقادیر ممکنِ گزینههای -march و -mcpu فعال است.
- sve
- دستورالعملهای Scalable Vector Extension را فعال میکند. این گزینه همچنین دستورالعملهای Advanced SIMD و ممیز شناور را فعال میکند.
- lse
- دستورالعملهای Large System Extension را فعال میکند. این گزینه بهطور پیشفرض برای -march=armv8.1-a فعال است.
- rdma
- دستورالعملهای Round Double Multiply Accumulate را فعال میکند. این گزینه بهطور پیشفرض برای -march=armv8.1-a فعال است.
- fp16
- افزونهٔ FP16 را فعال میکند. این گزینه همچنین دستورالعملهای ممیز شناور را فعال میکند.
- fp16fml
- افزونهٔ FP16 fmla را فعال میکند. این گزینه همچنین افزونههای FP16 و دستورالعملهای ممیز شناور را فعال میکند. این گزینه بهطور پیشفرض برای -march=armv8.4-a فعال است. استفاده از این گزینه در معماریهای پیش از Armv8.2-A پشتیبانی نمیشود.
- rcpc
- افزونهٔ RCpc را فعال میکند. این گزینه استفاده از دستورالعملهای LDAPR را برای معناشناسی اتمیک load-acquire فعال کرده و آن را به اسمبلر منتقل میکند، که باعث میشود عبارات اسمبلی درونبرنامهای (inline asm) بتوانند از دستورالعملهای افزونهٔ RCpc استفاده کنند.
- dotprod
- افزونهٔ Dot Product را فعال میکند. این گزینه همچنین دستورالعملهای Advanced SIMD را فعال میکند.
- aes
- افزونهٔ رمزنگاری aes و pmull در Armv8-a را فعال میکند. این گزینه همچنین دستورالعملهای Advanced SIMD را فعال میکند.
- sha2
- افزونهٔ رمزنگاری sha2 در Armv8-a را فعال میکند. این گزینه همچنین دستورالعملهای Advanced SIMD را فعال میکند.
- sha3
- افزونهٔ رمزنگاری sha512 و sha3 را فعال میکند. این گزینه همچنین دستورالعملهای Advanced SIMD را فعال میکند. استفاده از این گزینه در معماریهای پیش از Armv8.2-A پشتیبانی نمیشود.
- sm4
- افزونهٔ رمزنگاری sm3 و sm4 را فعال میکند. این گزینه همچنین دستورالعملهای Advanced SIMD را فعال میکند. استفاده از این گزینه در معماریهای پیش از Armv8.2-A پشتیبانی نمیشود.
- profile
- افزونهٔ Statistical Profiling را فعال میکند. این گزینه صرفاً برای فعالسازی افزونه در سطح اسمبلر است و بر تولید کد تأثیری ندارد.
- rng
- دستورالعملهای تولید عدد تصادفی Armv8.5-a را فعال میکند. این گزینه صرفاً برای فعالسازی افزونه در سطح اسمبلر است و بر تولید کد تأثیری ندارد.
- memtag
- افزونههای برچسبگذاری حافظه (Memory Tagging Extensions) در Armv8.5-a را فعال میکند. استفاده از این گزینه در معماریهای پیش از Armv8.5-A پشتیبانی نمیشود.
- sb
- دستورالعمل Speculation Barrier در Armv8-a را فعال میکند. این گزینه صرفاً برای فعالسازی افزونه در سطح اسمبلر است و بر تولید کد تأثیری ندارد. این گزینه بهطور پیشفرض برای -march=armv8.5-a فعال است.
- ssbs
- دستورالعمل Speculative Store Bypass Safe در Armv8-a را فعال میکند. این گزینه صرفاً برای فعالسازی افزونه در سطح اسمبلر است و بر تولید کد تأثیری ندارد. این گزینه بهطور پیشفرض برای -march=armv8.5-a فعال است.
- predres
- دستورالعملهای Execution and Data Prediction Restriction در Armv8-a را فعال میکند. این گزینه صرفاً برای فعالسازی افزونه در سطح اسمبلر است و بر تولید کد تأثیری ندارد. این گزینه بهطور پیشفرض برای -march=armv8.5-a فعال است.
- sve2
- قابلیت Scalable Vector Extension 2 در Armv8-a را فعال میکند. این گزینه همچنین دستورالعملهای SVE را فعال میکند.
- sve2-bitperm
- دستورالعملهای SVE2 bitperm را فعال میکند. این گزینه همچنین دستورالعملهای SVE2 را فعال میکند.
- sve2-sm4
- دستورالعملهای SVE2 sm4 را فعال میکند. این گزینه همچنین دستورالعملهای SVE2 را فعال میکند.
- sve2-aes
- دستورالعملهای SVE2 aes را فعال میکند. این گزینه همچنین دستورالعملهای SVE2 را فعال میکند.
- sve2-sha3
- دستورالعملهای SVE2 sha3 را فعال میکند. این گزینه همچنین دستورالعملهای SVE2 را فعال میکند.
- sve2p1
- دستورالعملهای SVE2.1 را فعال میکند. این گزینه همچنین دستورالعملهای SVE2 را فعال میکند.
- tme
- افزونهٔ Transactional Memory 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
- دستورالعملهای اتمیک load و store شصت و چهار بایتی را برای شتابدهندهها فعال میکند.
- mops
- دستورالعملهای تسریع عملیات حافظه مانند "memcpy"، "memmove" و "memset" را فعال میکند. این گزینه بهطور پیشفرض برای -march=armv8.8-a فعال است.
- flagm
- افزونهٔ دستورالعملهای دستکاری پرچم (Flag Manipulation instructions Extension) را فعال میکند.
- flagm2
- دستورالعملهای تبدیل پرچم FlagM2 را فعال میکند..IP pauth 4 فعالسازی افزونهٔ Pointer Authentication.
- cssc
- فعالسازی دستورالعملهای Common Short Sequence Compression.
- sme
- فعالسازی افزونهٔ Scalable Matrix Extension. این مورد تنها زمانی پشتیبانی میشود که SVE2 نیز فعال باشد.
- sme-i16i64
- فعالسازی افزونهٔ FEAT_SME_I16I64 برای SME. این گزینه همچنین دستورالعملهای SME را فعال میکند.
- sme-f64f64
- فعالسازی افزونهٔ FEAT_SME_F64F64 برای SME. این گزینه همچنین دستورالعملهای SME را فعال میکند.
- sme2
- فعالسازی افزونهٔ Scalable Matrix Extension 2. این گزینه همچنین دستورالعملهای SME را فعال میکند.
- sme-b16b16
- فعالسازی افزونهٔ FEAT_SME_B16B16 برای SME. این گزینه همچنین دستورالعملهای SME2 و SVE_B16B16 را فعال میکند.
- sme-f16f16
- فعالسازی افزونهٔ FEAT_SME_F16F16 برای SME. این گزینه همچنین دستورالعملهای SME2 را فعال میکند.
- sme2p1
- فعالسازی نسخهٔ ۲.۱ افزونهٔ Scalable Matrix Extension. این گزینه همچنین دستورالعملهای SME2 را فعال میکند.
- fcma
- فعالسازی افزونههای SIMD اعداد مختلط (complex number).
- jscvt
- فعالسازی دستورالعمل تبدیل جاوااسکریپت "fjcvtzs".
- frintts
- فعالسازی دستورالعملهای گرد کردن ممیز شناور به مقادیر صحیح.
- wfxt
- فعالسازی دستورالعملهای "wfet" و "wfit".
- xs
- فعالسازی افزونهٔ ویژگی حافظهٔ XS.
- lse128
- فعالسازی افزونهٔ دستورالعملهای اتمیک ۱۲۸ بیتی LSE128. این گزینه همچنین دستورالعملهای LSE را فعال میکند.
- d128
- فعالسازی پشتیبانی از دستورالعملهای خواندن/نوشتن ثباتهای سیستمی ۱۲۸ بیتی. این گزینه همچنین افزونهٔ LSE128 را فعال میکند.
- gcs
- فعالسازی پشتیبانی از افزونهٔ Guarded Control Stack در Armv9.4-a.
- the
- فعالسازی پشتیبانی از افزونهٔ مقاومسازی ترجمه (translation hardening) در Armv8.9-a/9.4-a.
- rcpc2
- فعالسازی افزونهٔ RCpc2.
- rcpc3
- فعالسازی افزونهٔ RCpc3 (سازگاری آزادسازی - Release Consistency).
- fp8
- فعالسازی افزونهٔ fp8 (ممیز شناور ۸ بیتی).
- fp8fma
- فعالسازی افزونهٔ ضرب و جمع انباشته (multiply accumulate) ممیز شناور ۸ بیتی (fp8).
- ssve-fp8fma
- فعالسازی افزونهٔ ضرب و جمع انباشته ممیز شناور ۸ بیتی (fp8) در حالت جاری (streaming mode).
- fp8dot4
- فعالسازی افزونهٔ حاصلضرب نقطهای ۴ جهتهٔ fp8 (ممیز شناور ۸ بیتی) به دقت یگانه (single-precision).
- ssve-fp8dot4
- فعالسازی افزونهٔ حاصلضرب نقطهای ۴ جهتهٔ fp8 (ممیز شناور ۸ بیتی) به دقت یگانه در حالت جاری (streaming mode).
- fp8dot2
- فعالسازی افزونهٔ حاصلضرب نقطهای ۲ جهتهٔ fp8 (ممیز شناور ۸ بیتی) به نیمهدقت (half-precision).
- ssve-fp8dot2
- فعالسازی افزونهٔ حاصلضرب نقطهای ۲ جهتهٔ fp8 (ممیز شناور ۸ بیتی) به نیمهدقت در حالت جاری (streaming mode).
- faminmax
- فعالسازی افزونهٔ بیشینه/کمینهٔ قدرمطلق ممیز شناور (Floating Point Absolute Maximum/Minimum).
- lut
- فعالسازی افزونهٔ جدول جستجو (Lookup Table).
- cpa
- فعالسازی دستورالعملهای محاسبات بررسیشدهٔ اشارهگر (Checked Pointer Arithmetic).
- sve-b16b16
- فعالسازی افزونهٔ ممیز شناور مغزی غیرتعمیمیافتهٔ SVE ("bf16"). این مورد تنها زمانی اثر دارد که "sve2" یا "sme2" نیز فعال باشند.
ویژگی crypto مستلزم فعال بودن aes، sha2 و simd است که آن هم مستلزم fp میباشد. به همین ترتیب، nofp مستلزم nosimd است که آن هم مستلزم nocrypto، noaes و nosha2 خواهد بود.
گزینههای Adapteva Epiphany
این گزینههای -m برای Adapteva Epiphany تعریف شدهاند:
- -mhalf-reg-file
- هیچ ثباتی در محدودهٔ "r32"..."r63" تخصیص داده نشود. این گزینه اجازه میدهد کد روی گونههای سختافزاری که فاقد این ثباتها هستند اجرا شود.
- -mprefer-short-insn-regs
- ترجیحاً ثباتهایی تخصیص یابند که امکان تولید دستورالعملهای کوتاه را فراهم میکنند. این کار میتواند منجر به افزایش تعداد دستورالعملها شود، بنابراین ممکن است اندازهٔ کلی کد را کاهش یا افزایش دهد.
- -mbranch-cost=num
- هزینهٔ انشعابها را تقریباً برابر با num دستورالعمل «ساده» تنظیم میکند. این هزینه صرفاً یک روش تقریبی (اکتشافی) است و تضمینی برای تولید نتایج یکسان در نسخههای مختلف وجود ندارد.
- -mcmove
- فعالسازی تولید انتقالهای شرطی (conditional moves).
- -mnops=num
- تولید num دستور NOP قبل از هر دستورالعمل تولید شدهٔ دیگر.
- -mno-soft-cmpsf
- برای مقایسههای ممیز شناور با دقت یگانه، یک دستورالعمل "fsub" صادر کرده و پرچمها را بررسی میکند. این روش سریعتر از مقایسهٔ نرمافزاری است، اما ممکن است در حضور NaNها، یا زمانی که دو عدد کوچکِ متفاوت به گونهای مقایسه میشوند که تفاضل آنها صفر محاسبه شود، نتایج نادرستی به بار آورد. پیشفرض -msoft-cmpsf است که از مقایسههای نرمافزاری کندتر اما سازگار با IEEE استفاده میکند.
- -mstack-offset=num
- انحراف (offset) بین بالای پشته و اشارهگر پشته را تنظیم میکند. برای مثال، مقدار ۸ به این معنی است که هشت بایت در محدودهٔ "sp+0...sp+7" میتوانند توسط توابع برگ (leaf functions) بدون تخصیص پشته استفاده شوند. مقادیری غیر از 8 یا 16 آزمایشنشده هستند و بعید است کار کنند. همچنین توجه داشته باشید که این گزینه ABI را تغییر میدهد؛ کامپایل برنامهای با انحراف پشتهٔ متفاوت از کتابخانههایی که با آنها کامپایل شده است، عموماً کار نمیکند. این گزینه زمانی مفید است که بخواهید ارزیابی کنید آیا انحراف پشتهٔ متفاوت کد بهتری ارائه میدهد یا خیر، اما برای استفادهٔ عملی از انحراف پشتهٔ متفاوت جهت ساخت برنامههای کاربردی، توصیه میشود زنجیرهٔ ابزار (toolchain) را با گزینهٔ مناسب --with-stack-offset=num پیکربندی کنید.
- -mno-round-nearest
- زمانبند را وادار میکند فرض کند که حالت گرد کردن روی کوتاه کردن (truncating) تنظیم شده است. پیشفرض -mround-nearest است.
- -mlong-calls
- چنانچه توسط مشخصهای تعیین نشده باشد، فرض میشود تمام فراخوانیها ممکن است خارج از محدودهٔ آفست دستورالعملهای "b" / "bl" باشند؛ بنابراین پیش از اجرای فراخوانی (که در غیر این صورت مستقیم بود)، آدرس تابع را درون یک ثبات بارگذاری میکند. این گزینه پیشفرض است.
- -mshort-calls
- چنانچه توسط مشخصهای تعیین نشده باشد، فرض میشود تمام فراخوانیهای مستقیم در محدودهٔ دستورالعملهای "b" / "bl" هستند، بنابراین از این دستورالعملها برای فراخوانیهای مستقیم استفاده میکند. پیشفرض -mlong-calls است.
- -msmall16
- فرض میکند آدرسها را میتوان به صورت مقادیر ۱۶ بیتی بدون علامت بارگذاری کرد. این مورد برای آدرسهای توابعی که معناشناسی -mlong-calls روی آنها مؤثر است اعمال نمیشود.
- -mfp-mode=mode
- حالت غالب
واحد ممیز
شناور را
تنظیم
میکند. این
گزینه حالت
ممیز
شناوری را
که در زمان
فراخوانی و
بازگشت
تابع ارائه
و انتظار
میرود
تعیین
میکند.
تطبیق این
حالت با
حالتی که
عمدتاً در
ابتدای
تابع به آن
نیاز
دارید، با
جلوگیری از
تغییر
حالتهای
غیرضروری
میتواند
برنامههای
شما را
کوچکتر و
سریعتر
کند.
mode میتواند روی یکی از مقادیر زیر تنظیم شود:
- caller
- هر حالتی در هنگام ورود به تابع معتبر است، و هنگام بازگشت تابع و هنگام فراخوانی توابع دیگر حفظ یا بازیابی میشود. این حالت برای کامپایل کتابخانهها یا سایر واحدهای کامپایلی مفید است که ممکن است بخواهید آنها را در برنامههای مختلف با حالتهای غالب FPU متفاوت ادغام کنید، و راحتی استفاده از یک فایل شیء (object file) منفرد بر بار سربار اندازه و سرعت ناشی از هرگونه تغییر حالت اضافی که ممکن است نیاز باشد، میچربد.
- truncate
- این حالتی است که برای محاسبات ممیز شناور با حالت گرد کردن بریدهشده (یعنی گرد کردن به سمت صفر) استفاده میشود. این شامل تبدیل از ممیز شناور به عدد صحیح نیز میگردد..IP round-nearest 4 این حالتی است که برای محاسبات ممیز شناور با حالت گرد کردن به نزدیکترین یا زوج (round-to-nearest-or-even) استفاده میشود.
- int
- این حالتی است که برای انجام محاسبات اعداد صحیح در FPU استفاده میشود، مانند ضرب اعداد صحیح، یا ضرب و انباشت (multiply-and-accumulate) اعداد صحیح.
پیشفرض -mfp-mode=caller است.
- -mno-split-lohi
- -mno-postinc
- -mno-postmodify
- تنظیمات تولید کدی که بهترتیب تقسیم بارگذاریهای ۳۲ بیتی، تولید آدرسهای پسافزایش (post-increment)، و تولید آدرسهای پساصلاح (post-modify) را غیرفعال میکنند. پیشفرضها عبارتند از msplit-lohi، -mpost-inc، و -mpost-modify.
- -mnovect-double
- حالت SIMD ترجیحی را به SImode تغییر میدهد. پیشفرض -mvect-double است که از DImode به عنوان حالت SIMD ترجیحی استفاده میکند.
- -max-vect-align=num
- حداکثر تراز (alignment) برای انواع حالت برداری SIMD. مقدار num میتواند ۴ یا ۸ باشد. پیشفرض ۸ است. توجه داشته باشید که این یک تغییر در ABI است، حتی اگر واسطهای توابع کتابخانهای بسیاری در صورتی که از حالتهای برداری SIMD در جاهایی که بر اندازه و/یا تراز انواع مربوطه تأثیر میگذارند استفاده نکنند، دستنخورده باقی بمانند.
- -msplit-vecmove-early
- انتقالهای برداری را قبل از reload به انتقالهای تککلمهای تقسیم میکند. در تئوری این کار میتواند تخصیص ثبات بهتری ارائه دهد، اما تاکنون به طور کلی به نظر میرسد برعکس این موضوع صادق است.
- -m1reg-reg
- ثباتی را برای نگهداری مقدار ثابت -1 مشخص میکند، که بارگذاری مقادیر ثابت منفی کوچک و برخی ماسکهای بیتی خاص را سریعتر میسازد. مقادیر مجاز برای reg عبارتند از r43 و r63، که استفاده از آن ثبات را به عنوان یک ثبات ثابت مشخص میکنند، و none، که به این معنی است که هیچ ثباتی برای این منظور استفاده نمیشود. پیشفرض -m1reg-none است.
گزینههای AMD GCN
این گزینهها به طور خاص برای پورت AMD GCN تعریف شدهاند.
- -march=gpu
- -mtune=gpu
- نوع معماری یا تنظیم بهینهسازی (tuning) را برای gpu تعیین میکند. مقادیر پشتیبانیشده برای gpu عبارتند از:
- gfx900
- کامپایل برای دستگاههای GCN5 Vega 10 (gfx900).
- gfx902
- کامپایل برای دستگاههای GCN5 Vega gfx902. (آزمایشی)
- gfx904
- کامپایل برای دستگاههای GCN5 Vega gfx904. (آزمایشی)
- gfx906
- کامپایل برای دستگاههای GCN5 Vega 20 (gfx906).
- gfx908
- کامپایل برای دستگاههای سری CDNA1 Instinct MI100 (gfx908).
- gfx909
- کامپایل برای دستگاههای GCN5 Vega gfx909. (آزمایشی)
- gfx90a
- کامپایل برای دستگاههای سری CDNA2 Instinct MI200 (gfx90a).
- gfx90c
- کامپایل برای دستگاههای GCN5 Vega 7 (gfx90c).
- gfx9-generic
- کامپایل کد عمومی برای دستگاههای Vega، قابل اجرا روی زیرمجموعه زیر از دستگاههای GFX9: gfx900، gfx902، gfx904، gfx906، gfx909 و gfx90c. (آزمایشی)
- gfx1030
- کامپایل برای دستگاههای RDNA2 gfx1030 (سری GFX10).
- gfx1031
- کامپایل برای دستگاههای RDNA2 gfx1031 (سری GFX10). (آزمایشی)
- gfx1032
- کامپایل برای دستگاههای RDNA2 gfx1032 (سری GFX10). (آزمایشی)
- gfx1033
- کامپایل برای دستگاههای RDNA2 gfx1033 (سری GFX10). (آزمایشی)
- gfx1034
- کامپایل برای دستگاههای RDNA2 gfx1034 (سری GFX10). (آزمایشی)
- gfx1035
- کامپایل برای دستگاههای RDNA2 gfx1035 (سری GFX10). (آزمایشی)
- gfx1036
- کامپایل برای دستگاههای RDNA2 gfx1036 (سری GFX10).
- gfx10-3-generic
- کامپایل کد عمومی برای دستگاههای GFX10-3، قابل اجرا روی gfx1030، gfx1031، gfx1032، gfx1033، gfx1034، gfx1035 و gfx1036. (آزمایشی)
- gfx1100
- کامپایل برای دستگاههای RDNA3 gfx1100 (سری GFX11).
- gfx1101
- کامپایل برای دستگاههای RDNA3 gfx1101 (سری GFX11). (آزمایشی)
- gfx1102
- کامپایل برای دستگاههای RDNA3 gfx1102 (سری GFX11). (آزمایشی)
- gfx1103
- کامپایل برای دستگاههای RDNA3 gfx1103 (سری GFX11).
- gfx1150
- کامپایل برای دستگاههای RDNA3 gfx1150 (سری GFX11). (آزمایشی)
- gfx1151
- کامپایل برای دستگاههای RDNA3 gfx1151 (سری GFX11). (آزمایشی)
- gfx1152
- کامپایل برای دستگاههای RDNA3 gfx1152 (سری GFX11). (آزمایشی)
- gfx1153
- کامپایل برای دستگاههای RDNA3 gfx1153 (سری GFX11). (آزمایشی)
- gfx11-generic
- کامپایل کد عمومی برای دستگاههای GFX11، قابل اجرا روی gfx1100، gfx1101، gfx1102، gfx1103، gfx1150، gfx1151، gfx1152 و gfx1153. (آزمایشی)
- -msram-ecc=on
- -msram-ecc=off
- -msram-ecc=any
- کامپایل باینریهای مناسب برای دستگاههایی که قابلیت SRAM-ECC در آنها فعال، غیرفعال یا در هر یک از دو حالت باشد. این ویژگی میتواند در برخی دستگاهها به ازای هر پردازه فعال شود. کد کامپایلشده باید با حالت دستگاه مطابقت داشته باشد. پیشفرض برای دستگاههایی که از آن پشتیبانی میکنند، any است.
- -mstack-size=bytes
- تعیین میکند چه مقدار فضا بر حسب بایت (bytes) برای هر ریسه GPU (wave-front) از پشته درخواست شود. توجه داشته باشید که ممکن است ریسههای متعددی وجود داشته باشند و حافظه در دسترس محدود باشد. اندازه تخصیص پشته همچنین ممکن است بر عملکرد زمان اجرا تأثیر بگذارد. پیشفرض در صورت استفاده از OpenACC یا OpenMP برابر 32KB، و در غیر این صورت 1MB است.
- -mxnack=on
- -mxnack=off
- -mxnack=any
- کامپایل باینریهای مناسب برای دستگاههایی که قابلیت XNACK در آنها فعال، غیرفعال یا در هر یک از دو حالت باشد. برخی دستگاهها همیشه نیازمند XNACK هستند و برخی به کاربر اجازه میدهند XNACK را پیکربندی کند. کد کامپایلشده باید با حالت دستگاه مطابقت داشته باشد. پیشفرض در دستگاههایی که از Unified Shared Memory پشتیبانی میکنند -mxnack=any و در غیر این صورت -mxnack=no است.
گزینههای ARC
گزینههای زیر نگارش معماریای را که کد برای آن کامپایل میشود، کنترل میکنند:
- -mbarrel-shifter
- دستورالعملهای پشتیبانیشده توسط barrel shifter را تولید میکند. این پیشفرض است مگر اینکه -mcpu=ARC601 یا -mcpu=ARCEM حاکم باشد.
- -mjli-always
- فراخوانی یک تابع را با استفاده از دستورالعمل jli_s اجباری میکند. این گزینه تنها برای معماری ARCv2 معتبر است.
- -mcpu=cpu
- نوع معماری، استفاده از ثباتها، و پارامترهای زمانبندی دستورالعمل را برای cpu تعیین میکند. همچنین گزینههای نام مستعار میانبر برای سازگاری با گذشته و سهولت استفاده در دسترس هستند. مقادیر پشتیبانیشده برای cpu عبارتند از:
- arc601
- کامپایل برای ARC601. نام مستعار: -mARC601.
- arc700
- کامپایل برای ARC700. نامهای مستعار: -mA7، -mARC700. این حالت پیشفرض در هنگام پیکربندی با --with-cpu=arc700 است.
- arcem
- کامپایل برای ARC EM.
- archs
- کامپایل برای ARC HS.
- em
- کامپایل برای پردازندهٔ ARC EM بدون هیچ افزونهٔ سختافزاری.
- em4
- کامپایل برای پردازندهٔ ARC EM4.
- em4_dmips
- کامپایل برای پردازندهٔ ARC EM4 DMIPS.
- em4_fpus
- کامپایل برای پردازندهٔ ARC EM4 DMIPS همراه با افزونهٔ ممیز شناور با دقت یگانه (single-precision).
- em4_fpuda
- کامپایل برای پردازندهٔ ARC EM4 DMIPS همراه با دستورالعملهای ممیز شناور با دقت یگانه و کمکی دقت دوگانه (double assist).
- hs
- کامپایل برای پردازندهٔ ARC HS بدون هیچ افزونهٔ سختافزاری به جز دستورالعملهای اتمیک (atomic).
- hs34
- کامپایل برای پردازندهٔ ARC HS34.
- hs38
- کامپایل برای پردازندهٔ ARC HS38.
- hs38_linux
- کامپایل برای پردازندهٔ ARC HS38 با فعال بودن تمامی افزونههای سختافزاری.
- hs4x
- کامپایل برای پردازندهٔ ARC HS4x.
- hs4xd
- کامپایل برای پردازندهٔ ARC HS4xD.
- hs4x_rel31
- کامپایل برای پردازندهٔ ARC HS4x نگارش 3.10a.
- arc600_norm
- کامپایل برای پردازندهٔ ARC 600 با فعال بودن دستورالعملهای "norm".
- arc600_mul32x16
- کامپایل برای پردازندهٔ ARC 600 با فعال بودن دستورالعملهای "norm" و ضرب ۳۲ در ۱۶ بیتی.
- arc600_mul64
- کامپایل برای پردازندهٔ ARC 600 با فعال بودن دستورالعملهای "norm" و خانوادهٔ "mul64".
- arc601_norm
- کامپایل برای پردازندهٔ ARC 601 با فعال بودن دستورالعملهای "norm".
- arc601_mul32x16
- کامپایل برای پردازندهٔ ARC 601 با فعال بودن دستورالعملهای "norm" و ضرب ۳۲ در ۱۶ بیتی.
- arc601_mul64
- کامپایل برای پردازندهٔ ARC 601 با فعال بودن دستورالعملهای "norm" و خانوادهٔ "mul64".
- nps400
- کامپایل برای ARC 700 روی تراشهٔ NPS400.
- em_mini
- کامپایل برای پیکربندی کمینهگرای ARC EM با مجموعه ثباتهای کاهشیافته.
- -mdpfp
- -mdpfp-compact
- تولید دستورالعملهای FPX با دقت دوگانه (double-precision)، بهینهشده برای پیادهسازی فشرده (compact).
- -mdpfp-fast
- تولید دستورالعملهای FPX با دقت دوگانه، بهینهشده برای پیادهسازی سریع (fast).
- -mno-dpfp-lrsr
- غیرفعال کردن استفادهٔ دستورالعملهای "lr" و "sr" از ثباتهای کمکی (aux) افزونهٔ FPX.
- -mea
- تولید دستورالعملهای محاسباتی گسترشیافته. در حال حاضر فقط "divaw"، "adds"، "subs" و "sat16" پشتیبانی میشوند. تنها برای -mcpu=ARC700 معتبر است.
- -mno-mpy
- دستورالعملهای خانوادهٔ "mpy" را برای ARC700 تولید نمیکند. این گزینه منسوخ شده است.
- -mmul32x16
- تولید دستورالعملهای ضرب و ضرب-انباشت (multiply-accumulate) ۳۲ در ۱۶ بیتی.
- -mmul64
- تولید دستورالعملهای "mul64" و "mulu64". تنها برای -mcpu=ARC600 معتبر است.
- -mnorm
- تولید دستورالعملهای "norm". در صورت فعال بودن -mcpu=ARC700، این حالت پیشفرض است.
- -mspfp
- -mspfp-compact
- تولید دستورالعملهای FPX با دقت یگانه (single-precision)، بهینهشده برای پیادهسازی فشرده (compact).
- -mspfp-fast
- تولید دستورالعملهای FPX با دقت یگانه، بهینهشده برای پیادهسازی سریع (fast).
- -msimd
- فعالسازی تولید دستورالعملهای ARC SIMD از طریق توابع درونی (builtins) ویژهٔ هدف. تنها برای -mcpu=ARC700 معتبر است.
- -msoft-float
- این گزینه نادیده گرفته میشود؛ صرفاً برای سازگاری ارائه شده است. کد ممیز شناور نرمافزاری بهطور پیشفرض صادر میشود و این پیشفرض میتواند با گزینههای FPX جایگزین شود؛ -mspfp، -mspfp-compact، یا -mspfp-fast برای دقت یگانه، و -mdpfp، -mdpfp-compact، یا -mdpfp-fast برای دقت دوگانه.
- -mswap
- تولید دستورالعملهای "swap".
- -matomic
- استفاده از افزونهٔ شرطی بارگذاری/ذخیره قفلشده (locked load/store conditional) را برای پیادهسازی توابع درونی حافظهٔ اتمیک فعال میکند. برای هستههای ARC 6xx یا ARC EM در دسترس نیست.
- -mdiv-rem
- فعالسازی دستورالعملهای "div" و "rem" برای هستههای ARCv2.
- -mcode-density
- فعالسازی دستورالعملهای تراکم کد (code density) برای ARC EM. این گزینه بهطور پیشفرض برای ARC HS فعال است.
- -mll64
- فعالسازی عملیات بارگذاری/ذخیره دوگانه برای هستههای ARC HS.
- -mtp-regno=regno
- تعیین شماره ثبات اشارهگر ریسه (thread pointer).
- -mmpy-option=multo
- کامپایل کد ARCv2 با یک گزینهٔ طراحی ضربکننده. میتوانید گزینه را با استفاده از یک مقدار رشتهای یا عددی برای multo تعیین کنید. wlh1 مقدار پیشفرض است. مقادیر شناختهشده عبارتند از:
- 0
- none
- هیچ ضربکنندهای در دسترس نیست.
- 1
- w
- ضربکنندهٔ ۱۶ در ۱۶، کاملاً خطلولهای (pipelined). دستورالعملهای زیر فعال میشوند: "mpyw" و "mpyuw".
- 2
- wlh1
- ضربکنندهٔ ۳۲ در ۳۲، کاملاً خطلولهای (۱ مرحله). دستورالعملهای زیر نیز علاوه بر آن فعال میشوند: "mpy"، "mpyu"، "mpym"، "mpymu" و "mpy_s".
- 3
- ضربکنندهٔ 32x32، کاملاً خطلولهای (۲ مرحلهای). دستورالعملهای زیر نیز افزون بر این فعال میشوند: "mpy"، "mpyu"، "mpym"، "mpymu" و "mpy_s".
- 4
- wlh3
- دو ضربکنندهٔ 16x16، مسدودکننده و ترتیبی. دستورالعملهای زیر نیز افزون بر این فعال میشوند: "mpy"، "mpyu"، "mpym"، "mpymu" و "mpy_s".
- 5
- wlh4
- یک ضربکنندهٔ 16x16، مسدودکننده و ترتیبی. دستورالعملهای زیر نیز افزون بر این فعال میشوند: "mpy"، "mpyu"، "mpym"، "mpymu" و "mpy_s".
- 6
- wlh5
- یک ضربکنندهٔ 32x4، مسدودکننده و ترتیبی. دستورالعملهای زیر نیز افزون بر این فعال میشوند: "mpy"، "mpyu"، "mpym"، "mpymu" و "mpy_s".
- 7
- plus_dmpy
- پشتیبانی از ARC HS SIMD.
- 8
- plus_macd
- پشتیبانی از ARC HS SIMD.
- 9
- plus_qmacw
- پشتیبانی از ARC HS SIMD.
این گزینه تنها برای هستههای 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
- این گزینه به کامپایلر دستور میدهد تا برای یک فایل ثبات ۱۶ مدخلی کد تولید کند. این گزینه ماکروی پیشپردازندهٔ "__ARC_RF16__" را تعریف میکند.
- -mbranch-index
- استفاده از دستورالعملهای "bi" یا "bih" را برای پیادهسازی جدولهای پرش فعال میکند.
گزینههای زیر به اسمبلر منتقل میشوند و همچنین نمادهای ماکروی پیشپردازنده را تعریف میکنند.
- -mdsp-packa
- برای فعالسازی افزونههای DSP Pack A به اسمبلر منتقل میشود. همچنین نماد پیشپردازندهٔ "__Xdsp_packa" را مقداردهی میکند. این گزینه منسوخ شده است.
- -mdvbf
- برای فعالسازی افزونهٔ dual Viterbi butterfly به اسمبلر منتقل میشود. همچنین نماد پیشپردازندهٔ "__Xdvbf" را مقداردهی میکند. این گزینه منسوخ شده است.
- -mlock
- برای فعالسازی افزونهٔ بارگذاری/ذخیرهٔ شرطی قفلشده (locked load/store conditional) به اسمبلر منتقل میشود. همچنین نماد پیشپردازندهٔ "__Xlock" را مقداردهی میکند.
- -mmac-d16
- به اسمبلر منتقل میشود. همچنین نماد پیشپردازندهٔ "__Xxmac_d16" را مقداردهی میکند. این گزینه منسوخ شده است.
- -mmac-24
- به اسمبلر منتقل میشود. همچنین نماد پیشپردازندهٔ "__Xxmac_24" را مقداردهی میکند. این گزینه منسوخ شده است.
- -mrtsc
- برای فعالسازی دستورالعمل افزونهٔ شمارندهٔ برچسب زمان ۶۴ بیتی به اسمبلر منتقل میشود. همچنین نماد پیشپردازندهٔ "__Xrtsc" را مقداردهی میکند. این گزینه منسوخ شده است.
- -mswape
- برای فعالسازی دستورالعمل افزونهٔ تغییر ترتیب بایتها (swap byte ordering) به اسمبلر منتقل میشود. همچنین نماد پیشپردازندهٔ "__Xswape" را مقداردهی میکند..IP -mtelephony 4 به اسمبلر ارسال میشود تا دستورالعملهای یکعملوندی و دوعملوندی را برای تلفنی (telephony) فعال کند. همچنین نماد پیشپردازندهٔ "__Xtelephony" را تنظیم میکند. این گزینه منسوخ شده است.
- -mxy
- به اسمبلر ارسال میشود تا افزونهٔ حافظهٔ XY را فعال کند. همچنین نماد پیشپردازندهٔ "__Xxy" را تنظیم میکند.
گزینههای زیر نحوهٔ حاشیهنویسی کد اسمبلی را کنترل میکنند:
- -misize
- دستورالعملهای اسمبلی را با نشانیهای تخمینی حاشیهنویسی میکند.
- -mannotate-align
- هیچ کاری انجام نمیدهد. برای سازگاری رو به عقب حفظ شده است.
گزینههای زیر به پیونددهنده ارسال میشوند:
- -marclinux
- به پیونددهنده فرستاده میشود تا استفاده از شبیهسازی "arclinux" را مشخص کند. این گزینه بهطور پیشفرض در زنجیرههای ابزار ساختهشده برای اهداف "arc-linux-uclibc" و "arceb-linux-uclibc" در صورتی که پروفایلسازی درخواست نشده باشد فعال است.
- -marclinux_prof
- به پیونددهنده فرستاده میشود تا استفاده از شبیهسازی "arclinux_prof" را مشخص کند. این گزینه بهطور پیشفرض در زنجیرههای ابزار ساختهشده برای اهداف "arc-linux-uclibc" و "arceb-linux-uclibc" در صورتی که پروفایلسازی درخواست شده باشد فعال است.
گزینههای زیر معناشناسی کد تولیدشده را کنترل میکنند:
- -mlong-calls
- فراخوانیها را بهصورت فراخوانیهای غیرمستقیم با ثبات تولید میکند، و بدین ترتیب دسترسی به تمام محدودهٔ نشانی ۳۲ بیتی را فراهم میسازد.
- -mmedium-calls
- برای فراخوانیها از محدودهٔ نشانیدهی کمتر از ۲۵ بیت استفاده نکن، که آفست دردسترس برای یک دستورالعمل انشعاب و پیوند (branch-and-link) غیرشرطی است. اجرای شرطی فراخوانی توابع سرکوب میشود تا امکان استفاده از محدودهٔ ۲۵ بیتی، بهجای محدودهٔ ۲۱ بیتی با انشعاب و پیوند شرطی، فراهم گردد. این حالت پیشفرض برای زنجیرههای ابزار ساختهشده برای اهداف "arc-linux-uclibc" و "arceb-linux-uclibc" است.
- -G num
- تعاریف دادههای با دید بیرونی را در یک بخش دادههای کوچک قرار میدهد اگر اندازهٔ آن داده بیشتر از num بایت نباشد. مقدار پیشفرض num برای هر پیکربندی ARC برابر ۴، یا در صورت وجود عملیات بارگذاری/ذخیرهٔ دوگانه برابر ۸ است.
- -mno-sdata
- مراجع sdata را تولید نکن. این مقدار پیشفرض برای زنجیرههای ابزار ساختهشده برای اهداف "arc-linux-uclibc" و "arceb-linux-uclibc" است.
- -mvolatile-cache
- از دسترسیهای حافظهٔ معمولاً کَششده برای ارجاعات volatile استفاده کن. این حالت پیشفرض است.
- -mno-volatile-cache
- دور زدن کَش (cache bypass) را برای ارجاعات volatile فعال کن.
گزینههای زیر تولید کد را دقیقتر تنظیم میکنند:
- -malign-call
- هیچ کاری انجام نمیدهد. برای سازگاری رو به عقب حفظ شده است.
- -mauto-modify-reg
- استفاده از تغییر قبل/بعد با جابهجایی ثبات را فعال کن.
- -mbbit-peephole
- هیچ کاری انجام نمیدهد. برای سازگاری رو به عقب حفظ شده است.
- -mno-brcc
- این گزینه یک گذر ویژهٔ هدف را در arc_reorg برای تولید دستورالعملهای مقایسه و انشعاب ("brcc") غیرفعال میکند. این گزینه بر تولید این دستورالعملها که توسط گذر combiner هدایت میشوند تأثیری ندارد.
- -mcase-vector-pcrel
- از جدولهای مورد سوئیچ نسبی به PC برای فعال کردن کوتاهسازی جدول استفاده کن. این حالت پیشفرض برای -Os است.
- -mcompact-casesi
- الگوی فشردهٔ "casesi" را فعال کن. این مقدار پیشفرض برای -Os، و فقط برای هستههای ARCv1 دردسترس است. این گزینه منسوخ شده است.
- -mno-cond-exec
- گذر مختص ARCompact
برای تولید
دستورالعملهای
اجرای شرطی
را غیرفعال
کن.
به دلیل زمانبندی شکاف تأخیر (delay slot) و تعاملات میان تعداد عملوندها، اندازههای لفظی، طول دستورالعملها، و پشتیبانی از اجرای شرطی، گذر مستقل از هدف برای تولید اجرای شرطی معمولاً ناکافی است؛ بنابراین پورت ARC یک گذر ویژه را نگه داشته است که تلاش میکند فرصتهای بیشتری برای تولید اجرای شرطی پس از تخصیص ثبات، کوتاهسازی انشعاب، و انجام زمانبندی شکاف تأخیر بیابد. این گذر بهطور کلی، اما نه همیشه، کارایی و اندازهٔ کد را بهبود میبخشد، هرچند به بهای زمان کامپایل بیشتر تمام میشود؛ به همین دلیل گزینهای برای خاموش کردن آن وجود دارد. اگر مشکلی با خارج شدن دستورالعملهای فراخوانی از محدودهٔ آفست مجاز به دلیل شرطی شدن آنها دارید، باید بهجای آن استفاده از -mmedium-calls را مد نظر قرار دهید.
- -mearly-cbranchsi
- استفاده از الگوی "cbranchsi" پیش از reload را فعال کن.
- -mexpand-adddi
- گسترش دادن "adddi3" و "subdi3" در زمان تولید RTL به "add.f"، "adc" و غیره. این گزینه منسوخ شده است.
- -mindexed-loads
- استفاده از بارگذاریهای نمایهشده را فعال کن. این میتواند مشکلساز باشد زیرا برخی از بهینهسازها فرض میکنند که ذخیرهسازیهای نمایهشده نیز وجود دارند، در حالی که چنین نیست.
- -mlra
- هیچ کاری انجام نمیدهد. برای سازگاری رو به عقب حفظ شده است.
- -mlra-priority-none
- هیچ اولویتی برای ثباتهای هدف تعیین نکن.
- -mlra-priority-compact
- اولویت ثبات هدف را برای r0..r3 / r12..r15 مشخص کن.
- -mlra-priority-noncompact
- کاهش اولویت ثبات هدف برای r0..r3 / r12..r15.
- -mmillicode
- هنگام بهینهسازی برای اندازه (با استفاده از -Os)، مقدمهها و مؤخرههایی که باید تعداد زیادی ثبات را ذخیره یا بازیابی کنند اغلب با استفاده از فراخوانی یک تابع ویژه در libgcc کوتاه میشوند؛ این به عنوان فراخوانی millicode شناخته میشود. از آنجا که این فراخوانیها میتوانند مشکلات کارایی به وجود آورند، یا هنگام پیوند زدن به شیوهای غیر استاندارد موجب ایجاد خطاهای پیوند شوند، این گزینه برای فعال یا غیرفعال کردن تولید فراخوانیهای millicode فراهم شده است.
- -mcode-density-frame
- این گزینه کامپایلر را قادر میسازد تا دستورالعملهای "enter" و "leave" را تولید کند. این دستورالعملها فقط برای پردازندههای دارای قابلیت code-density معتبر هستند.
- -mmixed-code
- هیچ کاری انجام نمیدهد. برای سازگاری رو به عقب حفظ شده است.
- -mq-class
- این گزینه منسوخ شده است. جایگزینهای دستورالعمل q را فعال کن. این مقدار پیشفرض برای -Os است.
- -mRcq
- هیچ کاری انجام نمیدهد. برای سازگاری رو به عقب حفظ شده است.
- -mRcw
- هیچ کاری انجام نمیدهد. برای سازگاری رو به عقب حفظ شده است.
- -msize-level=level
- تنظیم دقیق بهینهسازی اندازه با توجه به طول دستورالعملها و ترازسازی. مقادیر شناختهشده برای level عبارتند از:
- 0
- بدون بهینهسازی اندازه. این سطح منسوخ شده و مانند 1 رفتار میشود.
- 1
- دستورالعملهای کوتاه بهصورت فرصتطلبانه استفاده میشوند.
- 2
- علاوه بر این، ترازسازی حلقهها و کدِ پس از موانع نادیده گرفته میشود.
- 3
- علاوه بر این، ترازسازی دادههای اختیاری نادیده گرفته میشود، و گزینهٔ Os فعال میگردد.
هنگامی که -Os در حال اجرا باشد، این مقدار بهطور پیشفرض 3 است. در غیر این صورت، رفتار سیستم زمانی که این گزینه تنظیم نشده باشد معادل سطح 1 است.
- -mtune=cpu
- پارامترهای
زمانبندی
دستورالعمل
را برای cpu
تنظیم
میکند، و
هر موردی را
که توسط -mcpu=
اعمال شده
بازنویسی
مینماید.
مقادیر پشتیبانیشده برای cpu عبارتند از:
- ARC600
- تنظیم دقیق برای پردازندهٔ ARC600.
- ARC601
- تنظیم دقیق برای پردازندهٔ ARC601.
- ARC700
- تنظیم دقیق برای پردازندهٔ ARC700 با بلوک ضربکنندهٔ استاندارد.
- ARC700-xmac
- تنظیم دقیق برای پردازندهٔ ARC700 با بلوک XMAC.
- ARC725D
- تنظیم دقیق برای پردازندهٔ ARC725D..IP ARC750D 4 بهینهسازی برای پردازندهٔ ARC750D.
- core3
- بهینهسازی برای پردازنده از نوع core3 در ARCv2. این گزینه استفاده از دستور "dbnz" را فعال میکند.
- release31a
- بهینهسازی برای نگارش 3.10a از ARC4x.
- -mmultcost=num
- هزینهای که باید برای یک دستور ضرب در نظر گرفته شود؛ با فرض این که مقدار 4 معادل یک دستورالعمل معمولی است.
- -munalign-prob-threshold=probability
- کاری انجام نمیدهد. برای سازگاری با نسخههای پیشین نگهداشته شده است.
گزینههای زیر برای سازگاری با نسخههای پیشین نگهداشته شدهاند، اما اکنون منسوخ شدهاند و در انتشار آتی حذف خواهند شد:
- -margonaut
- پشتیبانی FPX منسوخشده.
- -mbig-endian
- -EB
- کامپایل کد برای مقصدهای big-endian. استفاده از این گزینهها اکنون منسوخ شده است. کد big-endian با پیکربندی GCC برای ساخت مقصدهای "arceb-elf32" و "arceb-linux-uclibc" پشتیبانی میشود که در آنها big endian پیشفرض است.
- -mlittle-endian
- -EL
- کامپایل کد برای مقصدهای little-endian. استفاده از این گزینهها اکنون منسوخ شده است. کد little-endian با پیکربندی GCC برای ساخت مقصدهای "arc-elf32" و "arc-linux-uclibc" پشتیبانی میشود که در آنها little endian پیشفرض است.
- -mbarrel_shifter
- با -mbarrel-shifter جایگزین شده است.
- -mdpfp_compact
- با -mdpfp-compact جایگزین شده است.
- -mdpfp_fast
- با -mdpfp-fast جایگزین شده است.
- -mdsp_packa
- با -mdsp-packa جایگزین شده است.
- -mEA
- با -mea جایگزین شده است.
- -mmac_24
- با -mmac-24 جایگزین شده است.
- -mmac_d16
- با -mmac-d16 جایگزین شده است.
- -mspfp_compact
- با -mspfp-compact جایگزین شده است.
- -mspfp_fast
- با -mspfp-fast جایگزین شده است.
- -mtune=cpu
- مقادیر arc600، arc601، arc700 و arc700-xmac برای cpu به ترتیب با ARC600، ARC601، ARC700 و ARC700-xmac جایگزین شدهاند.
- -multcost=num
- با -mmultcost جایگزین شده است.
گزینههای ARM (ARM Options)
این گزینههای -m برای پورت ARM تعریف شدهاند:
- -mabi=name
- تولید کد برای ABI مشخصشده. مقادیر مجاز عبارتند از: apcs-gnu، atpcs، aapcs، aapcs-linux و iwmmxt.
- -mapcs-frame
- تولید یک فریم پشته (stack frame) منطبق با استاندارد فراخوانی رویهٔ آرم (ARM Procedure Call Standard) برای همه توابع، حتی اگر این کار برای اجرای صحیح کد اکیداً لازم نباشد. مشخص کردن -fomit-frame-pointer با این گزینه باعث میشود فریمهای پشته برای توابع برگ (leaf functions) تولید نشوند. مقدار پیشفرض -mno-apcs-frame است. این گزینه منسوخ شده است.
- -mapcs
- این گزینه مترادفی برای -mapcs-frame بوده و منسوخ شده است.
- -mthumb-interwork
- تولید کدی که از فراخوانی میان مجموعهدستورهای ARM و Thumb پشتیبانی کند. بدون این گزینه، در معماریهای پیش از نسخه ۵ (pre-v5)، این دو مجموعهدستور را نمیتوان به شکل قابل اعتمادی درون یک برنامه به کار برد. مقدار پیشفرض -mno-thumb-interwork است، چرا که با مشخص شدن -mthumb-interwork کدی با حجم کمی بیشتر تولید میشود. در پیکربندیهای AAPCS این گزینه بیمعنی است.
- -mno-sched-prolog
- جلوگیری از تغییر ترتیب دستورالعملها در پیشدرآمد تابع (prologue)، یا ادغام آن دستورالعملها با دستورالعملهای موجود در بدنهٔ تابع. این بدان معناست که همه توابع با مجموعهای شناختهشده از دستورالعملها آغاز میشوند (یا در واقع انتخابی از میان مجموعه کوچکی از پیشدرآمدهای مختلف توابع)، و این اطلاعات میتواند برای یافتن نقطه شروع توابع درون یک قطعه کد اجرایی به کار رود. مقدار پیشفرض -msched-prolog است.
- -mfloat-abi=name
- مشخص
میکند که
از کدام ABI
ممیز شناور
استفاده
شود. مقادیر
مجاز
عبارتند از:
soft، softfp و hard.
مشخص کردن soft باعث میشود GCC خروجی حاوی فراخوانیهای کتابخانهای برای عملیات ممیز شناور تولید کند. softfp امکان تولید کدی با استفاده از دستورالعملهای ممیز شناور سختافزاری را فراهم میکند، اما همچنان از قراردادهای فراخوانی soft-float استفاده مینماید. hard امکان تولید دستورالعملهای ممیز شناور سختافزاری را فراهم ساخته و از قراردادهای فراخوانی ویژهٔ FPU استفاده میکند.
مقدار پیشفرض به پیکربندی مقصد خاص بستگی دارد. توجه داشته باشید که ABIهای hard-float و soft-float از نظر پیوند (link) سازگار نیستند؛ باید کل برنامه خود را با همان ABI کامپایل کرده و با مجموعهای سازگار از کتابخانهها پیوند دهید.
- -mgeneral-regs-only
- تولید کدی که تنها از ثباتهای همهمنظوره استفاده میکند. این کار مانع از استفاده کامپایلر از ثباتهای ممیز شناور و Advanced SIMD میشود، اما هیچ محدودیتی بر اسمبلر اعمال نخواهد کرد.
- -mlittle-endian
- تولید کد برای پردازندهای که در حالت little-endian کار میکند. این مقدار پیشفرض برای تمام پیکربندیهای استاندارد است.
- -mbig-endian
- تولید کد برای پردازندهای که در حالت big-endian کار میکند؛ مقدار پیشفرض، کامپایل کد برای یک پردازنده little-endian است.
- -mbe8
- -mbe32
- هنگام پیوند دادن یک ایمیج big-endian، قالب را بین BE8 و BE32 انتخاب میکند. این گزینه برای ایمیجهای little-endian هیچ تاثیری ندارد و نادیده گرفته میشود. مقدار پیشفرض به معماری مقصد انتخابشده بستگی دارد. برای معماری ARMv6 و بالاتر، پیشفرض BE8 است؛ برای معماریهای قدیمیتر، پیشفرض BE32 است. قالب BE32 توسط ARM منسوخ شده است.
- -march=name[+extension...]
- این گزینه
نام معماری
مقصد ARM را
مشخص
میکند. GCC از
این نام
برای تعیین
اینکه چه
نوع
دستورالعملهایی
را
میتواند
هنگام
تولید کد
اسمبلی
ساطع کند
استفاده
مینماید.
این گزینه
میتواند
در کنار یا
به جای
گزینهٔ -mcpu=
استفاده
شود.
نامهای مجاز عبارتند از: armv4t، armv5t، armv5te، armv6، armv6j، armv6k، armv6kz، armv6t2، armv6z، armv6zk، armv7، armv7-a، armv7ve، armv8-a، armv8.1-a، armv8.2-a، armv8.3-a، armv8.4-a، armv8.5-a، armv8.6-a، armv9-a، armv7-r، armv8-r، armv6-m، armv6s-m، armv7-m، armv7e-m، armv8-m.base، armv8-m.main، armv8.1-m.main، iwmmxt و iwmmxt2.
علاوه بر این، معماریهای زیر که فاقد پشتیبانی از حالت اجرای Thumb هستند، شناخته میشوند اما پشتیبانی از آنها منسوخ شده است: armv4.
بسیاری از این معماریها از افزونهها پشتیبانی میکنند. این افزونهها را میتوان با افزودن +extension به انتهای نام معماری فعال کرد. گزینههای افزونه به ترتیب پردازش میشوند و قابلیتها روی هم انباشته میگردند. یک افزونه همچنین هر افزونهٔ پایهای را که به آن وابسته است فعال میکند. برای مثال، افزونهٔ +crypto همواره افزونهٔ +simd را فعال خواهد کرد. استثنای این ساختار انباشتی برای افزونههایی است که با +no... شروع میشوند: این افزونهها گزینهٔ مشخصشده و هر افزونهٔ دیگری را که ممکن است به وجود آن افزونه وابسته باشد غیرفعال میسازند.
برای مثال، عبارت -march=armv7-a+simd+nofp+vfpv4 معادل نوشتن -march=armv7-a+vfpv4 است، چرا که گزینهٔ +simd کاملاً توسط گزینهٔ +nofp پس از آن غیرفعال میشود.
بیشتر نامهای افزونهها به صورت عمومی نامگذاری شدهاند، اما تاثیری وابسته به معماری مورد استفاده دارند. به عنوان مثال، گزینهٔ +simd میتواند برای هر دو معماری armv7-a و armv8-a به کار رود، اما افزونههای اصلی Advanced SIMD (Neon) مربوط به ARMv7-A را برای armv7-a، و گونهٔ ARMv8-A را برای armv8-a فعال خواهد کرد.
جدول زیر افزونههای پشتیبانیشده را برای هر معماری فهرست میکند. معماریهایی که نام برده نشدهاند از هیچ افزونهای پشتیبانی نمیکنند.
- +fp
- دستورالعملهای ممیز شناور VFPv2. افزونه +vfpv2 میتواند به عنوان یک نام مستعار برای این افزونه به کار رود.
- +nofp
- غیرفعال کردن دستورالعملهای ممیز شناور.
- armv7
- زیرمجموعه مشترک معماریهای ARMv7-A، ARMv7-R و ARMv7-M.
- +fp
- دستورالعملهای ممیز شناور VFPv3 با ۱۶ ثبات دقت مضاعف (double-precision). افزونه +vfpv3-d16 میتواند به عنوان یک نام مستعار برای این افزونه به کار رود. توجه داشته باشید که ممیز شناور توسط معماری پایه ARMv7-M پشتیبانی نمیشود، اما با هر دو معماری ARMv7-A و ARMv7-R سازگار است.
- +nofp
- غیرفعال کردن دستورالعملهای ممیز شناور.
- +mp
- افزونه چندپردازشی (multiprocessing).
- +sec
- افزونه امنیتی.
- +fp
- دستورالعملهای ممیز شناور VFPv3 با ۱۶ ثبات دقت مضاعف. افزونه +vfpv3-d16 میتواند به عنوان یک نام مستعار برای این افزونه به کار رود.
- +simd
- دستورالعملهای Advanced SIMD (Neon) v1 و ممیز شناور VFPv3. افزونههای +neon و +neon-vfpv3 میتوانند به عنوان نام مستعار برای این افزونه به کار روند.
- +vfpv3
- دستورالعملهای ممیز شناور VFPv3 با ۳۲ ثبات دقت مضاعف.
- +vfpv3-d16-fp16
- دستورالعملهای ممیز شناور VFPv3 با ۱۶ ثبات دقت مضاعف و عملیات تبدیل ممیز شناور با دقت نیمه (half-precision).
- +vfpv3-fp16
- دستورالعملهای ممیز شناور VFPv3 با ۳۲ ثبات دقت مضاعف و عملیات تبدیل ممیز شناور با دقت نیمه (half-precision).
- +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
- دستورالعملهای محدودیت پیشبینی اجرا و داده (Execution and Data Prediction Restriction).
- +simd
- دستورالعملهای Advanced SIMD و ممیز شناور ARMv8.1-A.
- +crypto
- دستورالعملهای رمزنگاری. این افزونه همچنین دستورالعملهای Advanced SIMD و ممیز شناور را فعال میکند.
- +nocrypto
- غیرفعال کردن دستورالعملهای رمزنگاری..IP +nofp 4 غیرفعالسازی دستورالعملهای ممیز شناور، Advanced SIMD و رمزنگاری.
- +sb
- دستورالعمل سد گمانهزنی (Speculation Barrier).
- +predres
- دستورالعملهای محدودسازی پیشبینی داده و اجرا.
- +fp16
- دستورالعملهای پردازش دادهٔ ممیز شناور با دقت نیمه (half-precision). این گزینه همچنین دستورالعملهای Advanced SIMD و ممیز شناور را فعال میکند.
- +fp16fml
- افزونهٔ fmla ممیز شناور با دقت نیمه. این گزینه همچنین افزونهٔ ممیز شناور با دقت نیمه و دستورالعملهای Advanced SIMD و ممیز شناور را فعال میکند.
- +simd
- دستورالعملهای Advanced SIMD و ممیز شناور در ARMv8.1-A.
- +crypto
- دستورالعملهای رمزنگاری. این گزینه همچنین دستورالعملهای Advanced SIMD و ممیز شناور را فعال میکند.
- +dotprod
- فعالسازی افزونهٔ Dot Product. این گزینه همچنین دستورالعملهای Advanced SIMD را فعال میکند.
- +nocrypto
- غیرفعالسازی افزونهٔ رمزنگاری.
- +nofp
- غیرفعالسازی دستورالعملهای ممیز شناور، Advanced SIMD و رمزنگاری.
- +sb
- دستورالعمل سد گمانهزنی (Speculation Barrier).
- +predres
- دستورالعملهای محدودسازی پیشبینی داده و اجرا.
- +i8mm
- دستورالعملهای ضرب ماتریسی اعداد صحیح ۸-بیتی. این گزینه همچنین دستورالعملهای Advanced SIMD و ممیز شناور را فعال میکند.
- +bf16
- دستورالعملهای ممیز شناور با دقت نیمه Brain. این گزینه همچنین دستورالعملهای Advanced SIMD و ممیز شناور را فعال میکند.
- +fp16
- دستورالعملهای پردازش دادهٔ ممیز شناور با دقت نیمه. این گزینه همچنین دستورالعملهای Advanced SIMD و ممیز شناور و نیز افزونهٔ Dot Product و افزونهٔ fmla ممیز شناور با دقت نیمه را فعال میکند.
- +simd
- دستورالعملهای Advanced SIMD و ممیز شناور در ARMv8.3-A و همچنین افزونهٔ Dot Product.
- +crypto
- دستورالعملهای رمزنگاری. این گزینه همچنین دستورالعملهای Advanced SIMD و ممیز شناور و نیز افزونهٔ Dot Product را فعال میکند.
- +nocrypto
- غیرفعالسازی افزونهٔ رمزنگاری.
- +nofp
- غیرفعالسازی دستورالعملهای ممیز شناور، Advanced SIMD و رمزنگاری.
- +sb
- دستورالعمل سد گمانهزنی (Speculation Barrier).
- +predres
- دستورالعملهای محدودسازی پیشبینی داده و اجرا.
- +i8mm
- دستورالعملهای ضرب ماتریسی اعداد صحیح ۸-بیتی. این گزینه همچنین دستورالعملهای Advanced SIMD و ممیز شناور را فعال میکند.
- +bf16
- دستورالعملهای ممیز شناور با دقت نیمه Brain. این گزینه همچنین دستورالعملهای Advanced SIMD و ممیز شناور را فعال میکند.
- +fp16
- دستورالعملهای پردازش دادهٔ ممیز شناور با دقت نیمه. این گزینه همچنین دستورالعملهای Advanced SIMD و ممیز شناور و نیز افزونهٔ Dot Product و افزونهٔ fmla ممیز شناور با دقت نیمه را فعال میکند.
- +simd
- دستورالعملهای Advanced SIMD و ممیز شناور در ARMv8.3-A و همچنین افزونهٔ Dot Product.
- +crypto
- دستورالعملهای رمزنگاری. این گزینه همچنین دستورالعملهای Advanced SIMD و ممیز شناور و نیز افزونهٔ Dot Product را فعال میکند.
- +nocrypto
- غیرفعالسازی افزونهٔ رمزنگاری.
- +nofp
- غیرفعالسازی دستورالعملهای ممیز شناور، Advanced SIMD و رمزنگاری.
- +i8mm
- دستورالعملهای ضرب ماتریسی اعداد صحیح ۸-بیتی. این گزینه همچنین دستورالعملهای Advanced SIMD و ممیز شناور را فعال میکند.
- +bf16
- دستورالعملهای ممیز شناور با دقت نیمه Brain. این گزینه همچنین دستورالعملهای Advanced SIMD و ممیز شناور را فعال میکند.
- +fp16
- دستورالعملهای پردازش دادهٔ ممیز شناور با دقت نیمه. این گزینه همچنین دستورالعملهای Advanced SIMD و ممیز شناور و نیز افزونهٔ Dot Product و افزونهٔ fmla ممیز شناور با دقت نیمه را فعال میکند.
- +simd
- دستورالعملهای Advanced SIMD و ممیز شناور در ARMv8.3-A و همچنین افزونهٔ Dot Product.
- +crypto
- دستورالعملهای رمزنگاری. این گزینه همچنین دستورالعملهای Advanced SIMD و ممیز شناور و نیز افزونهٔ Dot Product را فعال میکند.
- +nocrypto
- غیرفعالسازی افزونهٔ رمزنگاری.
- +nofp
- غیرفعالسازی دستورالعملهای ممیز شناور، Advanced SIMD و رمزنگاری.
- +i8mm
- دستورالعملهای ضرب ماتریسی اعداد صحیح ۸-بیتی. این گزینه همچنین دستورالعملهای Advanced SIMD و ممیز شناور را فعال میکند.
- +bf16
- دستورالعملهای ممیز شناور با دقت نیمه Brain. این گزینه همچنین دستورالعملهای Advanced SIMD و ممیز شناور را فعال میکند.
- +fp.sp
- دستورالعملهای ممیز شناور VFPv3 با دقت تکی (single-precision). افزونهٔ +vfpv3xd میتواند به عنوان نام مستعاری برای این افزونه به کار رود.
- +fp
- دستورالعملهای ممیز شناور VFPv3 با ۱۶ ثبات دقت دوگانه (double-precision). افزونهٔ +vfpv3-d16 میتواند به عنوان نام مستعاری برای این افزونه به کار رود.
- +vfpv3xd-d16-fp16
- دستورالعملهای ممیز شناور VFPv3 با دقت تکی و ۱۶ ثبات دقت دوگانه و عملیات تبدیل ممیز شناور با دقت نیمه.
- +vfpv3-d16-fp16
- دستورالعملهای ممیز شناور VFPv3 با ۱۶ ثبات دقت دوگانه و عملیات تبدیل ممیز شناور با دقت نیمه.
- +nofp
- غیرفعالسازی افزونهٔ ممیز شناور.
- +idiv
- دستورالعملهای تقسیم عدد صحیح در حالت ARM-state..IP +noidiv 4 افزونه تقسیم اعداد صحیح در وضعیت ARM را غیرفعال میکند.
- +fp
- دستورالعملهای ممیز شناور VFPv4 با دقت یگانه (single-precision).
- +fpv5
- دستورالعملهای ممیز شناور FPv5 با دقت یگانه.
- +fp.dp
- دستورالعملهای ممیز شناور FPv5 با دقت یگانه و دوگانه (double-precision).
- +nofp
- افزونههای ممیز شناور را غیرفعال میکند.
- +dsp
- دستورالعملهای DSP.
- +mve
- دستورالعملهای اعداد صحیح M-Profile Vector Extension (MVE).
- +mve.fp
- دستورالعملهای اعداد صحیح و ممیز شناور با دقت یگانه M-Profile Vector Extension (MVE).
- +fp
- دستورالعملهای ممیز شناور با دقت یگانه.
- +fp.dp
- دستورالعملهای ممیز شناور با دقت یگانه و دوگانه.
- +nofp
- افزونه ممیز شناور را غیرفعال میکند.
- +cdecp0, +cdecp1, ... , +cdecp7
- افزونه مسیر داده سفارشی (CDE) را روی پردازندههای کمکی (coprocessors) انتخابشده بر اساس اعداد دادهشده در گزینهها در بازهٔ ۰ تا ۷ فعال میکند.
- +pacbti
- افزونه احراز هویت اشارهگر و شناسایی مقصد انشعاب (PACBTI) را فعال میکند.
- +dsp
- دستورالعملهای DSP.
- +nodsp
- افزونه DSP را غیرفعال میکند.
- +fp
- دستورالعملهای ممیز شناور با دقت یگانه.
- +fp.dp
- دستورالعملهای ممیز شناور با دقت یگانه و دوگانه.
- +nofp
- افزونه ممیز شناور را غیرفعال میکند.
- +cdecp0, +cdecp1, ... , +cdecp7
- افزونه مسیر داده سفارشی (CDE) را روی پردازندههای کمکی انتخابشده بر اساس اعداد دادهشده در گزینهها در بازهٔ ۰ تا ۷ فعال میکند.
- +crc
- دستورالعملهای بررسی افزونگی چرخشی (CRC).
- +fp.sp
- دستورالعملهای ممیز شناور FPv5 با دقت یگانه.
- +simd
- دستورالعملهای Advanced SIMD و ممیز شناور ARMv8-A.
- +crypto
- دستورالعملهای رمزنگاری.
- +nocrypto
- دستورالعملهای رمزنگاری را غیرفعال میکند.
- +nofp
- دستورالعملهای ممیز شناور، Advanced SIMD و رمزنگاری را غیرفعال میکند.
گزینهٔ -march=native باعث میشود کامپایلر معماری رایانهٔ میزبان ساخت را بهطور خودکار شناسایی کند. در حال حاضر، این قابلیت تنها در GNU/Linux پشتیبانی میشود و همهٔ معماریها شناخته نمیشوند. اگر تشخیص خودکار ناموفق باشد، این گزینه هیچ اثری نخواهد داشت.
گزینهٔ -march=unset باعث میشود کامپایلر هرگونه گزینهٔ -march=... را که پیشتر در خط فرمان آمده نادیده بگیرد و به گونهای رفتار کند که گویی این گزینه اصلاً ارسال نشده است. این ویژگی برای جلوگیری از هشدارهای مربوط به تداخل گزینههای پردازنده (CPU) و معماری در شرایطی که هر دو مشخصات معماری متفاوتی تولید میکنند، مفید است.
- -mtune=name
- این گزینه
نام
پردازندهٔ
ARM مقصد را
مشخص
میکند که GCC
باید
کارایی کد
را برای آن
تنظیم (tune) کند.
برای برخی
از
پیادهسازیهای
ARM، میتوان
با استفاده
از این
گزینه به
کارایی
بهتری دست
یافت.
نامهای
مجاز
عبارتند از:
arm7tdmi، arm7tdmi-s، arm710t،
arm720t، arm740t، strongarm،
strongarm110، strongarm1100،
strongarm1110، arm8، arm810،
arm9، arm9e، arm920،
arm920t، arm922t، arm946e-s،
arm966e-s، arm968e-s،
arm926ej-s، arm940t، arm9tdmi،
arm10tdmi، arm1020t،
arm1026ej-s، arm10e، arm1020e،
arm1022e، arm1136j-s،
arm1136jf-s، mpcore،
mpcorenovfp، arm1156t2-s،
arm1156t2f-s، arm1176jz-s،
arm1176jzf-s، generic-armv7-a،
cortex-a5، cortex-a7، cortex-a8،
cortex-a9، cortex-a12،
cortex-a15، cortex-a17،
cortex-a32، cortex-a35،
cortex-a53، cortex-a55،
cortex-a57، cortex-a72،
cortex-a73، cortex-a75،
cortex-a76، cortex-a76ae،
cortex-a77، cortex-a78،
cortex-a78ae، cortex-a78c،
cortex-a710، ares، cortex-r4،
cortex-r4f، cortex-r5،
cortex-r7، cortex-r8،
cortex-r52، cortex-r52plus،
cortex-m0، cortex-m0plus،
cortex-m1، cortex-m3، cortex-m4،
cortex-m7، cortex-m23،
cortex-m33، cortex-m35p،
cortex-m52، cortex-m55،
cortex-m85، cortex-x1،
cortex-x1c، cortex-m1.small-multiply،
cortex-m0.small-multiply،
cortex-m0plus.small-multiply، exynos-m1،
marvell-pj4، neoverse-n1،
neoverse-n2، neoverse-v1،
xscale، iwmmxt، iwmmxt2،
ep9312، fa526، fa626،
fa606te، fa626te، fmp626،
fa726te، star-mc1، xgene1.
علاوه بر این، این گزینه میتواند مشخص کند که GCC کارایی کد را برای یک سامانهٔ big.LITTLE تنظیم کند. نامهای مجاز عبارتند از: cortex-a15.cortex-a7، cortex-a17.cortex-a7، cortex-a57.cortex-a53، cortex-a72.cortex-a53، cortex-a72.cortex-a35، cortex-a73.cortex-a53، cortex-a75.cortex-a55، cortex-a76.cortex-a55.
گزینهٔ -mtune=generic-arch مشخص میکند که GCC باید کارایی را برای ترکیبی از پردازندههای درون معماری arch تنظیم کند. هدف، تولید کدی است که روی رایجترین پردازندههای کنونی بهخوبی اجرا شود، و تعادلی بین بهینهسازیهایی که به نفع برخی از پردازندهها در آن محدوده هستند و اجتناب از افت کارایی در سایر پردازندهها ایجاد کند. اثرات این گزینه ممکن است در نسخههای آیندهٔ GCC با تغییر و جایگزینی مدلهای پردازنده تغییر یابد.
گزینهٔ -mtune همان گزینههای افزونهٔ مربوط به -mcpu را میپذیرد، اما این گزینههای افزونه بر تنظیم کارایی کد تولیدشده تأثیری ندارند.
گزینهٔ -mtune=native باعث میشود کامپایلر پردازندهٔ رایانهٔ میزبان ساخت را بهطور خودکار شناسایی کند. در حال حاضر، این قابلیت تنها در GNU/Linux پشتیبانی میشود و همهٔ معماریها شناخته نمیشوند. اگر تشخیص خودکار ناموفق باشد، این گزینه هیچ اثری نخواهد داشت.
- -mcpu=name[+extension...]
- این گزینه
نام
پردازندهٔ
ARM مقصد را
مشخص
میکند. GCC از
این نام
برای
استخراج
نام معماری
ARM مقصد (گویی
توسط -march
مشخص شده
باشد) و نوع
پردازندهٔ
ARM جهت تنظیم
کارایی
(گویی توسط
-mtune مشخص شده
باشد)
استفاده
میکند. در
صورتی که
این گزینه
همزمان با
-march یا -mtune به
کار رود، آن
گزینهها
بر بخش
مربوطه از
این گزینه
اولویت
خواهند
داشت.
بسیاری از پردازندههای پشتیبانیشده، افزونههای معماری اختیاری را پیادهسازی میکنند. در چنین مواردی، افزونههای معماری معمولاً بهطور پیشفرض فعال هستند. در صورتی که پیادهسازیهایی فاقد افزونه وجود داشته باشند، میتوان از نحو افزونه برای غیرفعال کردن آن دسته از افزونههایی که حذف شدهاند استفاده کرد. برای دستورالعملهای ممیز شناور و Advanced SIMD (Neon)، تنظیمات گزینههای -mfloat-abi و -mfpu نیز باید در نظر گرفته شوند: دستورالعملهای ممیز شناور و Advanced SIMD تنها در صورتی استفاده خواهند شد که -mfloat-abi روی soft تنظیم نشده باشد؛ و هر تنظیمی برای -mfpu به جز auto، دستورالعملهای افزونهٔ ممیز شناور و SIMD موجود را بازنویسی (override) خواهد کرد.
به عنوان مثال، cortex-a9 را میتوان در سه پیکربندی اصلی یافت: فقط اعداد صحیح، تنها همراه با یک واحد ممیز شناور، یا همراه با ممیز شناور و Advanced SIMD. حالت پیشفرض، فعال بودن تمام دستورالعملها است، اما از افزونههای +nosimd و +nofp میتوان به ترتیب برای غیرفعال کردن تنها SIMD یا هر دو گروه دستورالعملهای SIMD و ممیز شناور استفاده کرد.
نامهای مجاز برای این گزینه مشابه نامهای مجاز برای -mtune هستند.
گزینههای افزونهٔ زیر بین پردازندههای فهرستشده مشترک هستند:
- +nopacbti
- افزونه احراز اصالت اشارهگر و شناسایی مقصد پرش (Pointer Authentication and Branch Target Identification Extension) را در cortex-m52 و cortex-m85 غیرفعال میکند.
- +nomve
- دستورالعملهای عدد صحیح و ممیز شناور با دقت یگانه مربوط به افزونه برداری نمایه M (MVE) را در cortex-m52، cortex-m55 و cortex-m85 غیرفعال میکند.
- +nomve.fp
- دستورالعملهای ممیز شناور با دقت یگانه مربوط به افزونه برداری نمایه M (MVE) را در cortex-m52، cortex-m55 و cortex-m85 غیرفعال میکند.
- +cdecp0, +cdecp1, ... , +cdecp7
- افزونه سفارشی مسیر داده (CDE) را روی همپردازندههای انتخابشده بر اساس اعداد ارائهشده در گزینهها در محدوده ۰ تا ۷ در cortex-m52، cortex-m55 و star-mc1 فعال میکند.
- +nofp
- دستورالعملهای ممیز شناور را در arm9e، arm946e-s، arm966e-s، arm968e-s، arm10e، arm1020e، arm1022e، arm926ej-s، arm1026ej-s، cortex-r5، cortex-r7، cortex-r8، cortex-m4، cortex-m7، cortex-m33، cortex-m35p، cortex-m52، cortex-m55 و cortex-m85 غیرفعال میکند. دستورالعملهای ممیز شناور و SIMD را در generic-armv7-a، cortex-a5، cortex-a7، cortex-a8، cortex-a9، cortex-a12، cortex-a15، cortex-a17، cortex-a15.cortex-a7، cortex-a17.cortex-a7، cortex-a32، cortex-a35، cortex-a53 و cortex-a55 غیرفعال میکند.
- +nofp.dp
- بخش دقت مضاعف دستورالعملهای ممیز شناور را در cortex-r5، cortex-r7، cortex-r8، cortex-r52، cortex-r52plus و cortex-m7 غیرفعال میکند.
- +nosimd
- دستورالعملهای SIMD (اما نه ممیز شناور) را در generic-armv7-a، cortex-a5، cortex-a7 و cortex-a9 غیرفعال میکند.
- +crypto
- دستورالعملهای رمزنگاری را در cortex-a32، cortex-a35، cortex-a53، cortex-a55، cortex-a57، cortex-a72، cortex-a73، cortex-a75، exynos-m1، xgene1، cortex-a57.cortex-a53، cortex-a72.cortex-a53، cortex-a73.cortex-a35، cortex-a73.cortex-a53 و cortex-a75.cortex-a55 فعال میکند.
علاوه بر این، شبههدف generic-armv7-a بهطور پیشفرض از VFPv3 با ۱۶ ثبات دقت مضاعف استفاده میکند. این هدف از گزینههای افزونه زیر پشتیبانی میکند: mp، sec، vfpv3-d16، vfpv3، vfpv3-d16-fp16، vfpv3-fp16، vfpv4-d16، vfpv4، neon، neon-vfpv3، neon-fp16، neon-vfpv4. معانی آنها مشابه با افزونههای -march=armv7-a است.
گزینه -mcpu=generic-arch نیز مجاز است و معادل -march=arch -mtune=generic-arch میباشد. برای اطلاعات بیشتر -mtune را ببینید.
گزینه -mcpu=native باعث میشود کامپایلر پردازنده رایانه ساخت را بهطور خودکار شناسایی کند. در حال حاضر، این قابلیت تنها در GNU/Linux پشتیبانی میشود و همه معماریها نیز شناسایی نمیشوند. اگر تشخیص خودکار ناموفق باشد، این گزینه هیچ اثری نخواهد داشت.
گزینه -mcpu=unset باعث میشود کامپایلر هر گزینه -mcpu=... که پیشتر در خط فرمان آمده است را نادیده بگیرد و طوری رفتار کند که گویی این گزینه هرگز ارسال نشده است. این ویژگی برای جلوگیری از هشدارهای مربوط به تداخل گزینههای CPU و معماری، زمانی که هر دو مشخصات معماری متفاوتی ایجاد میکنند، مفید است.
- -mfpu=name
- سختافزار
ممیز شناور
(یا
شبیهساز
سختافزاری)
موجود در
هدف را مشخص
میکند.
نامهای
مجاز
عبارتند از:
auto، vfpv2، vfpv3،
vfpv3-fp16، vfpv3-d16،
vfpv3-d16-fp16، vfpv3xd،
vfpv3xd-fp16، neon-vfpv3،
neon-fp16، vfpv4، vfpv4-d16،
fpv4-sp-d16، neon-vfpv4،
fpv5-d16، fpv5-sp-d16، fp-armv8،
neon-fp-armv8 و crypto-neon-fp-armv8.
توجه داشته
باشید که neon
یک نام
مستعار
برای neon-vfpv3 و vfp
یک نام
مستعار
برای vfpv2 است.
تنظیم auto پیشفرض و خاص است. این تنظیم باعث میشود کامپایلر دستورالعملهای ممیز شناور و Advanced SIMD را بر اساس تنظیمات -mcpu و -march انتخاب کند.
اگر سختافزار ممیز شناور انتخابشده شامل افزونه NEON باشد (مثلاً -mfpu=neon)، توجه داشته باشید که عملیات ممیز شناور توسط گذر بردارسازی خودکار GCC تولید نمیشوند مگر اینکه -funsafe-math-optimizations نیز مشخص شده باشد. دلیل آن این است که سختافزار NEON استاندارد IEEE 754 را برای محاسبات ممیز شناور بهطور کامل پیادهسازی نمیکند (بهویژه با مقادیر غیرعادی/denormal مانند صفر رفتار میشود)، بنابراین استفاده از دستورالعملهای NEON ممکن است منجر به کاهش دقت شود.
همچنین میتوانید نام fpu را در سطح تابع با استفاده از صفتهای تابع target("fpu=") یا عملگرهای عملگر pragma تنظیم کنید.
- -mfp16-format=name
- قالب نوع ممیز شناور با دقت نیمه "__fp16" را تعیین میکند. نامهای مجاز عبارتند از none، ieee و alternative؛ پیشفرض none است که در این حالت نوع "__fp16" تعریف نمیشود.
- -mstructure-size-boundary=n
- اندازه
تمام
ساختارها
(structures) و
اجتماعها
(unions) به مضربی
از تعداد
بیتهای
تعیینشده
توسط این
گزینه به
بالا گرد
میشود.
مقادیر
مجاز ۸، ۳۲
و ۶۴ هستند.
مقدار
پیشفرض
برای
زنجیرهابزارهای
مختلف
متفاوت است.
برای
زنجیرهابزار
هدفگیرنده
COFF مقدار
پیشفرض ۸
است. مقدار
۶۴ تنها در
صورتی مجاز
است که ABI
زیربنایی
از آن
پشتیبانی
کند.
تعیین عدد بزرگتر میتواند کدی سریعتر و کارآمدتر تولید کند، اما ممکن است اندازه برنامه را نیز افزایش دهد. مقادیر مختلف بالقوه با یکدیگر ناسازگارند. کدی که با یک مقدار کامپایل شده است، در صورت تبادل اطلاعات با استفاده از ساختارها یا اجتماعها، لزوماً نمیتواند انتظار داشته باشد با کد یا کتابخانههای کامپایلشده با مقدار دیگر کار کند.
این گزینه منسوخ شده است.
- -mabort-on-noreturn
- یک فراخوانی به تابع "abort" در انتهای یک تابع "noreturn" تولید میکند. در صورتی که تابع تلاش کند بازگردد، این فراخوانی اجرا میشود.
- -mlong-calls
- -mno-long-calls
- به
کامپایلر
اعلام
میکند که
فراخوانی
توابع را
ابتدا با
بارگذاری
آدرس تابع
در یک ثبات
و سپس اجرای
یک
فراخوانی
زیرروال
روی این
ثبات انجام
دهد. این
سوییچ
زمانی لازم
است که تابع
هدف خارج از
محدوده
آدرسدهی
۶۴
مگابایتی
نسخه مبتنی
بر آفست
دستور
فراخوانی
زیرروال
قرار داشته
باشد.
حتی در صورت فعال بودن این سوییچ، همه فراخوانیهای تابع به فراخوانیهای طولانی (long calls) تبدیل نمیشوند. قاعده تجربی این است که توابع ایستا (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 بهطور پیشفرض فعال خواهد شد.
- -mpoke-function-name
- نام هر تابع
را
مستقیماً
پیش از
مقدمه
تابع، درون
بخش متن
مینویسد.
کد
تولیدشده
مشابه زیر
است:
t0 .ascii "arm_poke_function_name", 0 .align t1 .word 0xff000000 + (t1 - t0) arm_poke_function_name mov ip, sp stmfd sp!, {fp, ip, lr, pc} sub fp, ip, #4هنگام انجام ردگیری معکوس پشته (stack backtrace)، کد میتواند مقدار "pc" ذخیرهشده در "fp + 0" را بازرسی کند. اگر تابع ردیابی سپس مکان "pc - 12" را بررسی کند و ۸ بیت بالایی آن تنظیم شده باشند، متوجه میشویم که نام تابعی بلافاصله پیش از این مکان تعبیه شده و دارای طول "((pc[-3]) & 0xff000000)" است..IP -mthumb 4
- -marm
- انتخاب
میان تولید
کدی که در
وضعیتهای
ARM یا Thumb اجرا
میشود.
پیشفرض در
بیشتر
پیکربندیها
تولید کدی
است که در
وضعیت ARM
اجرا شود،
اما این
پیشفرض را
میتوان با
پیکربندی GCC
با گزینهٔ
پیکربندی
--with-mode=state تغییر
داد.
همچنین میتوانید حالت ARM و Thumb را برای هر تابع بهطور جداگانه با استفاده از مشخصههای تابعی یا عملیافتهای (pragmas) target("thumb") و target("arm") بازنویسی کنید.
- -mflip-thumb
- تعویض متناوب حالتهای ARM/Thumb در توابع پیدرپی. این گزینه برای آزمون رگرسیونِ تولید کد ترکیبی Thumb/ARM فراهم شده است و برای استفادهٔ عادی در کامپایل کد در نظر گرفته نشده است.
- -mtpcs-frame
- تولید یک فریم پشته (stack frame) سازگار با استاندارد فراخوانی رویهٔ Thumb (Thumb Procedure Call Standard) برای تمام توابع غیربرگ (non-leaf). (تابع برگ، تابعی است که هیچ تابع دیگری را فراخوانی نمیکند.) پیشفرض -mno-tpcs-frame است.
- -mtpcs-leaf-frame
- تولید یک فریم پشته سازگار با استاندارد فراخوانی رویهٔ Thumb برای تمام توابع برگ. (تابع برگ، تابعی است که هیچ تابع دیگری را فراخوانی نمیکند.) پیشفرض -mno-apcs-leaf-frame است.
- -mcallee-super-interworking
- به تمام توابع با دید بیرونی (externally visible) در فایل در حال کامپایل، یک سرآیند مجموعه دستورالعمل ARM اختصاص میدهد که پیش از اجرای باقی تابع، به حالت Thumb تغییر وضعیت میدهد. این امر امکان فراخوانی این توابع را از کدهای غیر-interworking فراهم میکند. این گزینه در پیکربندیهای AAPCS معتبر نیست زیرا interworking بهطور پیشفرض فعال است.
- -mcaller-super-interworking
- امکان میدهد که فراخوانیها از طریق اشارهگرهای تابع (از جمله توابع مجازی) بهدرستی اجرا شوند، صرفنظر از اینکه کد هدف برای interworking کامپایل شده باشد یا خیر. در صورت فعال بودن این گزینه، هزینهٔ اجرای اشارهگر تابع شامل سربار اندکی خواهد بود. این گزینه در پیکربندیهای AAPCS معتبر نیست زیرا interworking بهطور پیشفرض فعال است.
- -mtp=name
- تعیین مدل دسترسی به اشارهگر حافظهٔ محلی نخ (TLS). مدل soft فراخوانیهایی به "__aeabi_read_tp" تولید میکند. سایر مدلهای پذیرفتهشده عبارتند از tpidrurw، tpidruro و tpidrprw که اشارهگر نخ را مستقیماً از ثبات سامانه مربوطه واکشی میکنند (از معماری arm6k به بعد پشتیبانی میشود). دسترسی به این ثباتهای سامانه از طریق رابط پردازندهٔ کمکی CP15 صورت میگیرد و آرگومان cp15 نیز بهعنوان نام مستعار مناسبی برای tpidruro پذیرفته میشود. آرگومان auto از بهترین روش موجود برای پردازندهٔ انتخابشده استفاده میکند. مقدار پیشفرض auto است.
- -mtls-dialect=dialect
- تعیین گویش (dialect) مورد استفاده برای دسترسی به حافظهٔ محلی نخ. دو dialect پشتیبانی میشوند: gnu و gnu2. گویش gnu طرح اصلی GNU را برای پشتیبانی از مدلهای پویای محلی و سراسری TLS انتخاب میکند. گویش gnu2 طرح توصیفگر GNU را انتخاب میکند که کارایی بهتری را برای کتابخانههای اشتراکی ارائه میدهد. طرح توصیفگر GNU با طرح اصلی سازگار است، اما به پشتیبانی جدید اسمبلر، پیونددهنده و کتابخانه نیاز دارد. مدلهای TLS اولیه (initial exec) و محلی (local exec) تحت تأثیر این گزینه قرار نمیگیرند و همیشه از طرح اصلی استفاده میکنند.
- -mword-relocations
- فقط برای مقادیر به اندازهٔ کلمه (word-sized) بازنشانیهای مطلق (مانند R_ARM_ABS32) تولید میکند. این گزینه بهطور پیشفرض در مقاصدی (uClinux، SymbianOS) که بارگذار زمان اجرا این محدودیت را تحمیل میکند، و همچنین هنگامی که -fpic یا -fPIC مشخص شده باشد فعال است. این گزینه با -mslow-flash-data تداخل دارد.
- -mfix-cortex-m3-ldrd
- برخی از هستههای Cortex-M3 میتوانند هنگام استفاده از دستورالعملهای "ldrd" با ثباتهای مقصد و پایهٔ همپوشان، موجب آسیبدیدگی دادهها شوند. این گزینه از تولید این دستورالعملها جلوگیری میکند. این گزینه بهطور پیشفرض هنگامی که -mcpu=cortex-m3 مشخص شده باشد فعال است.
- -mfix-cortex-a57-aes-1742098
- -mno-fix-cortex-a57-aes-1742098
- -mfix-cortex-a72-aes-1655431
- -mno-fix-cortex-a72-aes-1655431
- فعالسازی (یا غیرفعالسازی) کاهش اثر یک خطای سختافزاری (erratum) در Cortex-A57 و Cortex-A72 که بر دستورالعملهای رمزنگاری AES تأثیر میگذارد. این گزینه بهطور پیشفرض هنگامی که هر یک از گزینههای -mcpu=cortex-a57 یا -mcpu=cortex-a72 مشخص شده باشند فعال است.
- -munaligned-access
- -mno-unaligned-access
- خواندن و
نوشتن
مقادیر ۱۶ و
۳۲ بیتی از
نشانیهایی
را که تراز
۱۶ یا ۳۲
بیتی
ندارند
فعال (یا
غیرفعال)
میکند.
دسترسی
ناتراز
بهطور
پیشفرض
برای تمام
معماریهای
پیش از ARMv6،
تمام
معماریهای
ARMv6-M و برای
معماریهای
ARMv8-M Baseline غیرفعال
بوده، و
برای تمام
معماریهای
دیگر فعال
است. اگر
دسترسی
ناتراز
فعال
نباشد،
دسترسی به
کلمات در
ساختارهای
دادهٔ
بستهبندیشده
(packed) بهصورت
تکبایتی
انجام
میشود.
مشخصهٔ ARM با نام "Tag_CPU_unaligned_access" در فایل شیء تولیدشده بسته به تنظیم این گزینه، روی true یا false تنظیم میشود. در صورت فعال بودن دسترسی ناتراز، نماد پیشپردازندهٔ "__ARM_FEATURE_UNALIGNED" نیز تعریف میشود.
- -mneon-for-64bits
- این گزینه منسوخ شده است و هیچ اثری ندارد.
- -mslow-flash-data
- فرض میکند که بارگذاری داده از حافظهٔ فلش کندتر از واکشی دستورالعمل است؛ بنابراین برای بهبود کارایی، بارگذاری مقادیر لفظی (literal) به حداقل میرسد. این گزینه تنها هنگام کامپایل برای ARMv7 M-profile پشتیبانی میشود و بهطور پیشفرض خاموش است. این گزینه با -mword-relocations تداخل دارد.
- -masm-syntax-unified
- فرض میکند که اسمبلر درونخطی از نحو یکپارچهٔ اسمبلی (unified asm syntax) استفاده میکند. پیشفرض در حال حاضر خاموش است که بهمعنای نحو تفکیکشده (divided syntax) است. این گزینه هیچ اثری بر Thumb2 ندارد؛ با این حال، ممکن است این موضوع در نسخههای آیندهٔ GCC تغییر کند. نحو تفکیکشده باید منسوخ تلقی شود.
- -mrestrict-it
- تولید بلوکهای IT را محدود میکند تا با قواعد ARMv8-A مطابقت داشته باشد. بلوکهای IT تنها میتوانند شامل یک تکدستورالعمل ۱۶ بیتی از یک مجموعه دستورالعمل منتخب باشند. این گزینه بهطور پیشفرض برای حالت ARMv8-A Thumb روشن است.
- -mprint-tune-info
- چاپ اطلاعات بهینهسازی پردازنده بهصورت توضیح در فایل اسمبلی. این گزینه صرفاً برای آزمون رگرسیونِ کامپایلر استفاده میشود و برای استفادهٔ عادی در کامپایل کد در نظر گرفته نشده است. این گزینه بهطور پیشفرض غیرفعال است.
- -mverbose-cost-dump
- تخلیهٔ پرحجم مدل هزینه را در فایلهای اشکالزدایی فعال میکند. این گزینه برای استفاده در اشکالزدایی کامپایلر ارائه شده است.
- -mpure-code
- اجازه نمیدهد دادههای ثابت در بخشهای کد قرار گیرند. علاوه بر این، هنگام کامپایل برای قالب شیء ELF، به تمامی بخشهای text مشخصهٔ بخش ویژهٔ پردازندهٔ ELF با نام "SHF_ARM_PURECODE" را اختصاص میدهد. این گزینه تنها هنگام تولید کد غیر-pic برای مقاصد M-profile در دسترس است.
- -mcmse
- تولید کد امن بر اساس «ARMv8-M Security Extensions: Requirements on Development Tools Engineering Specification» که در نشانی https://developer.arm.com/documentation/ecm0359818/latest در دسترس است.
- -mfix-cmse-cve-2021-35465
- کاهش اثر یک مشکل امنیتی بالقوه در دستورالعمل "VLLDM" در برخی از دستگاههای M-profile هنگام استفاده از CMSE (CVE-2021-365465). این گزینه بهطور پیشفرض در صورت استفاده از گزینهٔ -mcpu= همراه با "cortex-m33"، "cortex-m35p"، "cortex-m52"، "cortex-m55"، "cortex-m85" یا "star-mc1" فعال است. از گزینهٔ -mno-fix-cmse-cve-2021-35465 میتوان برای غیرفعال کردن این کاهش اثر استفاده کرد.
- -mstack-protector-guard=guard
- -mstack-protector-guard-offset=offset
- تولید کد محافظت از پشته با استفاده از قناری در 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") که برای ساخت برنامههای فضای کاربری به کار میرود، مفید (و ضروری) است.
- -mbranch-protection=none|standard|pac-ret[+leaf][+bti]|bti[+pac-ret[+leaf]]
- فعالسازی
ویژگیهای
محافظت از
انشعاب
(تنها در armv8.1-m.main).
none کدی بدون
محافظت از
انشعاب یا
امضای
نشانی
بازگشت
تولید
میکند.
standard[+leaf] کدی
با تمامی
ویژگیهای
محافظت از
انشعاب
فعال در سطح
استانداردشان
تولید
میکند.
pac-ret[+leaf] کدی
با امضای
نشانی
بازگشت
تنظیمشده
در سطح
استاندارد
تولید
میکند، که
عبارت است
از امضای
تمام
توابعی که
نشانی
بازگشت را
در حافظه
ذخیره
میکنند. leaf
هنگامی که
امضای
نشانی
بازگشت
فعال است،
توابع برگ
را حتی اگر
نشانی
بازگشت را
در حافظه
ننویسند
امضا
میکند. +bti
دستورالعملهای
landing-pad را در
مقاصد مجاز
دستورالعملهای
انشعاب
غیرمستقیم
اضافه
میکند.
اگر افزونهٔ معماری +pacbti فعال نباشد، تمامی عملیاتهای محافظت از انشعاب و امضای نشانی بازگشت مقید به استفاده از دستورالعملهای تعریفشده در فضای architectural-NOP خواهند بود. کد تولیدشده همچنان با نسخههای پیشین معماری سازگار رو به عقب خواهد ماند، اما امنیت اضافی را میتوان در زمان اجرا روی پردازندههایی که از افزونهٔ PACBTI پشتیبانی میکنند فعال کرد.
اجرای اجباری هدف انشعاب با استفاده از BTI تنها در زمان اجرا قابل فعالسازی است، مشروط بر اینکه تمام کدهای موجود در برنامه حداقل با -mbranch-protection=bti کامپایل شده باشند.
هر تنظیمی غیر از none تنها در armv8-m.main یا جدیدتر پشتیبانی میشود.
پیشفرض، تولید کد بدون محافظت از انشعاب یا امضای نشانی بازگشت است..PP گزینههای AVR
این گزینهها برای پیادهسازیهای AVR تعریف شدهاند:
- -mmcu=mcu
- معماری
مجموعه
دستورالعمل
(ISA) یا نوع
قطعه AVR را
مشخص
میکند.
مقدار
پیشفرض
این گزینه
"avr2" است.
قطعات و ISAهای زیر برای AVR پشتیبانی میشوند. نکته: پشتیبانی کامل از یک قطعه شامل کد راهاندازی "crtmcu.o"، سرایند قطعه "avr/io*.h"، یک کتابخانه قطعه "libmcu.a" و یک فایل device-specs ("https://gcc.gnu.org/wiki/avr-gcc#spec-files") به نام "specs-mcu" است. کامپایلر مطابق با "mcu"های پشتیبانیشده در زیر، تنها مورد آخر را ارائه میدهد. باقی موارد توسط AVR-LibC ("https://github.com/avrdudes/avr-libc") یا از طریق فایلهای "atpack" ("https://gcc.gnu.org/wiki/avr-gcc#atpack") از جانب سازنده سختافزار پشتیبانی میشوند.
- "avr2"
- قطعات «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 سه بایتی (3-byte PC)، یعنی با بیش از 128 KiB حافظه برنامه. mcu = "atmega256rfr2", "atmega2560", "atmega2561", "atmega2564rfr2".
- "avrxmega2"
- قطعات «XMEGA» با بیش از 8 KiB و حداکثر 64 KiB حافظه برنامه. mcu = "atxmega8e5", "atxmega16a4", "atxmega16a4u", "atxmega16c4", "atxmega16d4", "atxmega16e5", "atxmega32a4", "atxmega32a4u", "atxmega32c3", "atxmega32c4", "atxmega32d3", "atxmega32d4", "atxmega32e5", "avr64da28", "avr64da28s", "avr64da32", "avr64da32s", "avr64da48", "avr64da48s", "avr64da64", "avr64da64s", "avr64db28", "avr64db32", "avr64db48", "avr64db64", "avr64dd14", "avr64dd20", "avr64dd28", "avr64dd32", "avr64du28", "avr64du32", "avr64ea28", "avr64ea32", "avr64ea48", "avr64sd28", "avr64sd32", "avr64sd48".
- "avrxmega3"
- قطعات «XMEGA» با حداکثر 64 KiB ترکیب حافظه برنامه و RAM، و با حافظه برنامه قابل مشاهده در فضای آدرس RAM. mcu = "attiny202", "attiny204", "attiny212", "attiny214", "attiny402", "attiny404", "attiny406", "attiny412", "attiny414", "attiny416", "attiny416auto", "attiny417", "attiny424", "attiny426", "attiny427", "attiny804", "attiny806", "attiny807", "attiny814", "attiny816", "attiny817", "attiny824", "attiny826", "attiny827", "attiny1604", "attiny1606", "attiny1607", "attiny1614", "attiny1616", "attiny1617", "attiny1624", "attiny1626", "attiny1627", "attiny3214", "attiny3216", "attiny3217", "attiny3224", "attiny3226", "attiny3227", "atmega808", "atmega809", "atmega1608", "atmega1609", "atmega3208", "atmega3209", "atmega4808", "atmega4809", "avr16dd14", "avr16dd20", "avr16dd28", "avr16dd32", "avr16du14", "avr16du20", "avr16du28", "avr16du32", "avr16ea28", "avr16ea32", "avr16ea48", "avr16eb14", "avr16eb20", "avr16eb28", "avr16eb32", "avr32da28", "avr32da28s", "avr32da32", "avr32da32s", "avr32da48", "avr32da48s", "avr32db28", "avr32db32", "avr32db48", "avr32dd14", "avr32dd20", "avr32dd28", "avr32dd32", "avr32du14", "avr32du20", "avr32du28", "avr32du32", "avr32ea28", "avr32ea32", "avr32ea48", "avr32sd20", "avr32sd28", "avr32sd32".
- "avrxmega4"
- قطعات «XMEGA» با بیش از 64 KiB و حداکثر 128 KiB حافظه برنامه. mcu = "atxmega64a3", "atxmega64a3u", "atxmega64a4u", "atxmega64b1", "atxmega64b3", "atxmega64c3", "atxmega64d3", "atxmega64d4", "avr128da28", "avr128da28s", "avr128da32", "avr128da32s", "avr128da48", "avr128da48s", "avr128da64", "avr128da64s", "avr128db28", "avr128db32", "avr128db48", "avr128db64".
- "avrxmega5"
- قطعات «XMEGA» با بیش از 64 KiB و حداکثر 128 KiB حافظه برنامه و بیش از 64 KiB حافظه RAM. mcu = "atxmega64a1", "atxmega64a1u".
- "avrxmega6"
- قطعات «XMEGA» با بیش از 128 KiB حافظه برنامه. mcu = "atxmega128a3", "atxmega128a3u", "atxmega128b1", "atxmega128b3", "atxmega128c3", "atxmega128d3", "atxmega128d4", "atxmega192a3", "atxmega192a3u", "atxmega192c3", "atxmega192d3", "atxmega256a3", "atxmega256a3b", "atxmega256a3bu", "atxmega256a3u", "atxmega256c3", "atxmega256d3", "atxmega384c3", "atxmega384d3".
- "avrxmega7"
- قطعات «XMEGA» با بیش از 128 KiB حافظه برنامه و بیش از 64 KiB حافظه RAM. mcu = "atxmega128a1", "atxmega128a1u", "atxmega128a4u".
- "avrtiny"
- قطعات هسته Tiny از نوع «Reduced Tiny» تنها با ۱۶ ثبات همهمنظوره و 512 B تا 4 KiB حافظه برنامه. mcu = "attiny4", "attiny5", "attiny9", "attiny10", "attiny102", "attiny104", "attiny20", "attiny40".
- "avr1"
- این ISA توسط هسته حداقلی AVR پیادهسازی شده و فقط برای اسمبلی پشتیبانی میشود. mcu = "attiny11", "attiny12", "attiny15", "attiny28", "at90s1200".
- -mabsdata
- فرض میکند که تمام دادهها در حافظه ایستا (static storage) با دستورالعملهای LDS / STS قابل دسترسی هستند. این گزینه تنها روی قطعات Reduced Tiny مانند ATtiny40 اثر دارد. همچنین صفت متغیر "absdata" را در AVR Variable 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 شامل 32 و 64 است. مجاز بودن یا نبودن یک مقدار مشخص برای bits به گزینههای پیکربندی "--with-double=" و "--with-long-double=" در configure ("https://gcc.gnu.org/install/configure.html#avr") بستگی دارد و همین مورد برای مقادیر پیشفرض گزینهها نیز صدق میکند.
- -mgas-isr-prologues
- روالهای سرویس وقفه (ISRها) میتوانند از شبهدستورالعمل "__gcc_isr" که توسط GNU Binutils پشتیبانی میشود استفاده کنند. اگر این گزینه روشن باشد، این قابلیت همچنان میتواند برای تکتک ISRها از طریق صفت تابع AVR Function Attributes,,"no_gccisr" غیرفعال شود. این قابلیت در صورت فعال بودن بهینهسازی (اما نه با -Og، @pxref{Optimize Options}) و در صورتی که GNU Binutils از PR21683 ("https://sourceware.org/PR21683") پشتیبانی کند، بهطور پیشفرض فعال است.
- -mint8
- نوع "int" را یک عدد صحیح ۸ بیتی فرض میکند. این امر بر اندازه همه انواع داده تأثیر میگذارد: "char" یک بایت، "int" یک بایت، "long" دو بایت و "long long" چهار بایت خواهد بود. لطفاً توجه داشته باشید که این گزینه با استانداردهای C سازگار نیست، اما اندازه کد کمتری به همراه دارد.
- -mmain-is-OS_task
- ثباتها را در "main" ذخیره نمیکند. اثر آن مشابه اعمال صفت AVR Function Attributes,,"OS_task" به "main" است. در صورت روشن بودن بهینهسازی، بهطور پیشفرض فعال میشود.
- -mno-call-main
- تابع "main"
را با
استفاده از
دستورات
زیر اجرا
نمیکند:
XCALL main XJMP exit
در عوض، "main" را در بخش ".init9" ("https://avrdudes.github.io/avr-libc/avr-libc-user-manual/mem_sections.html#sec_dot_init") قرار میدهد تا نیازی به فراخوانی نباشد. با تنظیم این گزینه، کاربر تضمین میکند که "main" بازگشتی نخواهد داشت.
این گزینه میتواند برای قطعات با منابع بسیار محدود به منظور صرفهجویی چند بایت در کد و فضای پشته استفاده شود. این قابلیت از نسخه AVR-LibC v2.3 ("https://github.com/avrdudes/avr-libc/issues/1012") طبق انتظار کار خواهد کرد. در نسخههای قدیمیتر، هیچ بهبودی در عملکرد حاصل نخواهد شد.
- -mno-interrupts
- کد تولیدشده با وقفههای سختافزاری سازگار نیست. اندازه کد کوچکتر خواهد بود.
- -mrelax
- تلاش
میکند در
صورت
امکان،
دستورالعملهای
"CALL" و
"JMP" را به
ترتیب با
دستورالعملهای
کوتاهتر
"RCALL" و
"RJMP"
جایگزین
کند. تنظیم
-mrelax صرفاً
گزینه --mlink-relax
را به خط
فرمان
اسمبلر و
گزینه --relax را
به خط فرمان
پیونددهنده
اضافه
میکند.
کاهش پرش (Jump relaxing) توسط پیونددهنده انجام میشود، زیرا آفستهای پرش پیش از جایگیری کد مشخص نیستند. بنابراین، کد اسمبلی تولیدشده توسط کامپایلر یکسان است، اما دستورالعملهای موجود در فایل اجرایی ممکن است با دستورالعملهای کد اسمبلی تفاوت داشته باشند.
در صورتی که به تکهکدهای واسط پیونددهنده (linker stubs) نیاز باشد، relaxing باید فعال باشد؛ بخش مربوط به "EIND" و linker stubها را در ادامه ببینید..IP -mrodata-in-ram 4
- -mno-rodata-in-ram
- بخشهای
".rodata" را
برای
دادههای
فقطخواندنی،
بهترتیب
در RAM یا در
حافظهٔ
برنامه
مستقر
میکند.
برای بیشتر
دستگاهها
انتخابی
وجود ندارد
و این گزینه
بیشتر شبیه
به یک بررسی
صریح (assertion) عمل
میکند.
از نسخهٔ ۱۴ و برای دستگاههای AVR64* و AVR128*، در صورتی که پشتیبانی مورد نیاز در GNU Binutils (PR31124 ("https://sourceware.org/PR31124")) در دسترس باشد، ".rodata" بهطور پیشفرض در حافظهٔ فلش (flash) قرار میگیرد. در این حالت، میتوان از -mrodata-in-ram برای بازگشت به چیدمان قدیمی با قرارگیری ".rodata" در RAM استفاده کرد.
- -mtiny-stack
- تنها ۸ بیت پایینی اشارهگر پشته (stack pointer) را تغییر میدهد.
- -mfract-convert-truncate
- اجازه میدهد برای انواع ممیز ثابت کسری، بهجای گرد کردن به سمت صفر از بُرش (truncation) استفاده شود.
- -nodevicelib
- با
کتابخانهٔ
اختصاصی
دستگاه در
AVR-LibC، یعنی
"libmcu.a"،
پیوند
برقرار
نمیکند.
توجه داشته باشید که از نسخهٔ ۲.۳ در AVR-LibC، این کتابخانه حاوی کدهایی است که برای عملکرد درست یک برنامه حیاتی هستند. بهویژه، بخشهایی از کد راهاندازی (startup) را شامل میشود، مانند: "__init_sp" ("https://github.com/avrdudes/avr-libc/issues/1011") برای مقداردهی اولیهٔ اشارهگر پشته با نماد "__stack"، "__init_cvt" ("https://github.com/avrdudes/avr-libc/issues/1010") برای پیکربندی سختافزار جهت استفاده از جدول بردار فشرده با -mcvt، "__call_main" ("https://github.com/avrdudes/avr-libc/issues/1012") برای فراخوانی "main" و "exit"، و "__do_flmap_init" ("https://github.com/avrdudes/avr-libc/issues/931") برای برپاسازی FLMAP مطابق با نماد "__flmap".
- -nodevicespecs
- عبارت
-specs=device-specs/specs-mcu را
به خط فرمان
گردانندهٔ
کامپایلر
اضافه
نمیکند.
مسئولیت
تأمین
گزینههای
خط فرمان
مناسب برای
زیرپردازشها
مانند
کامپایلر
اصلی،
اسمبلر و
پیونددهنده
بر عهدهٔ
کاربر است.
این بدان
معناست که
کاربر باید
فایل
مشخصات (specs)
دستگاه
اختصاصی
خود را با
استفاده از
-specs=path-to-specs-file
ارائه دهد.
دیگر نیازی
به گزینهٔ
-mmcu=mcu نخواهد
بود.
این گزینه همچنین میتواند بهعنوان جایگزینی برای شیوهٔ قدیمیتر تعیین فایلهای سفارشیِ device-specs باشد که نیاز داشت -B some-path به دایرکتوریای اشاره کند که شامل پوشهای به نام "device-specs" بود و آن پوشه نیز فایلی به نام "specs-mcu" داشت؛ جایی که mcu با -mmcu=mcu مشخص میشد.
- -Waddr-space-convert
- در مواردی که فضای آدرس حاصل در فضای آدرس مبدأ گنجانده نشده است، دربارهٔ تبدیلهای بین فضاهای آدرس هشدار میدهد.
- -Wmisspelled-isr
- اگر ISR اشتباه نوشته شده باشد (یعنی بدون پیشوند __vector باشد)، هشدار میدهد. بهطور پیشفرض فعال است.
گزینههای بهینهسازی AVR
گزینههای زیر، گزینههای بهینهسازی محض هستند. گزینههای -mgas-isr-prologues، -mmain-is-OS_task، -mno-call-main و -mrelax که در بالا آمدند فقط تقریباً گزینههای بهینهسازی هستند، زیرا در موارد نادری تولید کد متفاوت آنها اهمیت پیدا میکند.
- -maccumulate-args
- آرگومانهای
ارسالی به
توابع را
انباشته
کرده و فضای
پشتهٔ مورد
نیاز برای
آرگومانهای
ارسالی به
تابع را
یکبار در
مقدمه/مؤخره
(prologue/epilogue) تابع
تخصیص داده
و آزاد
میکند.
بدون این
گزینه،
آرگومانهای
ارسالی پیش
از
فراخوانی
تابع در
پشته push شده و
پس از آن pop
میشوند.
همچنین
گزینهٔ
بهینهسازی
-fdefer-pop را در Optimize
Options,,optimization option
ببینید.
برداشتن (pop کردن) آرگومانها پس از فراخوانی تابع میتواند در AVR هزینهبر باشد، بنابراین انباشتهسازی فضای پشته ممکن است منجر به کوچکتر شدن فایلهای اجرایی شود، زیرا پس از فراخوانی نیازی به حذف آرگومانها از پشته نیست.
این گزینه میتواند برای توابعی که چندین فراخوانی به توابعی انجام میدهند که آرگومانهای خود را در پشته دریافت میکنند (مانند توابع شبیه printf)، منجر به کاهش حجم کد شود.
- -mbranch-cost=cost
- هزینهٔ انشعاب (branch cost) را برای دستورالعملهای انشعاب شرطی روی cost تنظیم میکند. مقادیر معقول برای cost اعداد صحیح کوچک و غیرمنفی هستند. هزینهٔ انشعاب پیشفرض 0 است.
- -mcall-prologues
- مقدمهها/مؤخرههای توابع بهصورت فراخوانی زیربرنامههای مناسب بسط داده میشوند. اندازهٔ کد کوچکتر میشود.
- -mfuse-add
- -mno-fuse-add
- -mfuse-add=level
- دسترسیهای غیرمستقیم به حافظه را در دستگاههای تقلیلیافتهٔ Tiny بهینهسازی میکند. حالت پیشفرض برای بهینهسازیهای -Og و -O1 از "level=1" و برای بهینهسازیهای بالاتر از "level=2" استفاده میکند. مقادیر مجاز برای level عبارتند از 0، 1 و 2.
- -mfuse-move
- -mno-fuse-move
- -mfuse-move=level
- یک گام بهینهسازی پس از بارگذاری مجدد (post-reload) را اجرا میکند که تلاش دارد دستورالعملهای انتقال (move) را ادغام کرده و دستورالعملهای چندبایتی را به عملیاتهای ۸ بیتی تقسیم کند. حالت پیشفرض برای بهینهسازی -O1 از "level=3" و برای بهینهسازیهای بالاتر از "level=23" استفاده میکند. مقادیر مجاز برای level در محدودهٔ 0 ... 23 هستند که یک مقدار مبنای مخلوط (mixed radix) با الگوی 3:2:2:2 است. هر رقم جنبهای از بهینهسازی را کنترل میکند.
- -mfuse-move2
- یک گام بهینهسازی پس از ترکیب (post-combine) را اجرا میکند که تلاش دارد دستورالعملهای انتقال (move) را ادغام کند.
- -mstrict-X
- از ثبات
آدرس "X"
به روشی که
توسط
سختافزار
پیشنهاد
شده
استفاده
میکند. این
بدان
معناست که
"X" تنها
در
آدرسدهیهای
غیرمستقیم،
پسافزایشی
(post-increment) یا
پیشکاهشی
(pre-decrement) به کار
میرود.
بدون این گزینه، ممکن است از ثبات "X" همانند ثباتهای "Y" یا "Z" استفاده شود که در این صورت با دستورالعملهای اضافی شبیهسازی میگردد. برای نمونه، بارگذاری یک مقدار با آدرسدهی "X+const" با مقدار کوچک و غیرمنفیِ "const < 64" درون ثبات Rn بهصورت زیر انجام میشود:
adiw r26, const ; X += const ld <Rn>, X ; <Rn> = *X sbiw r26, const ; X -= const
- -msplit-bit-shift
- شیفتهای چندبایتی با آفست ثابت را به یک شیفت با آفست بایتی و یک شیفت باقیمانده با آفست غیربایتی تقسیم میکند. این بهینهسازی بهطور پیشفرض برای -O2 و بالاتر، شامل -Os اما بهجز -Oz، فعال است. تقسیم شیفتهایی با آفست ثابت که مضربی از ۸ است توسط -mfuse-move کنترل میشود.
- -msplit-ldst
- بارگذاریها و ذخیرهسازیهای چندبایتی را به چند بارگذاری و ذخیرهسازی بایتی تقسیم میکند. این بهینهسازی بهطور پیشفرض برای -O2 و بالاتر فعال است.
- -muse-nonzero-bits
- بهینهسازیهایی را فعال میکند که تنها زمانی ممکن هستند که برخی از بیتها درون یک ثبات همیشه صفر باشند. این بهینهسازی بهطور پیشفرض برای -O2 و بالاتر فعال است.
"EIND" و دستگاههایی با بیش از ۱۲۸ کیبیبایت Flash
اشارهگرها در پیادهسازی، ۱۶ بیتی هستند. آدرس یک تابع یا برچسب بهصورت آدرس کلمهای (word address) بیان میشود، به طوری که پرشها و فراخوانیهای غیرمستقیم میتوانند هر آدرس کدی را در محدودهٔ ۶۴ کیلوکلمه (64 Ki words) هدف قرار دهند.
به منظور تسهیل پرش غیرمستقیم در دستگاههایی با بیش از ۱۲۸ کیبیبایت فضای حافظهٔ برنامه، یک ثبات کارکرد خاص به نام "EIND" وجود دارد که هنگام استفاده از دستورالعملهای "EICALL" یا "EIJMP"، بهعنوان پرارزشترین بخش آدرس مقصد عمل میکند.
پرشها و فراخوانیهای غیرمستقیم در این دستگاهها به شرح زیر توسط کامپایلر مدیریت میشوند و مشمول محدودیتهایی هستند:
- کامپایلر هرگز "EIND" را مقداردهی نمیکند.
- کامپایلر از "EIND" بهطور ضمنی در دستورالعملهای "EICALL"/"EIJMP" استفاده میکند یا ممکن است "EIND" را بهطور مستقیم بخواند تا یک فراخوانی/پرش غیرمستقیم را با استفاده از دستورالعمل "RET" شبیهسازی کند.
- کامپایلر فرض میکند که "EIND" هرگز در طول کد راهاندازی یا در طول اجرای برنامه تغییر نمیکند. بهویژه، "EIND" در مقدمه/مؤخرهٔ توابع یا روتینهای سرویس وقفه (ISR) ذخیره/بازیابی نمیشود.
- برای فراخوانیهای غیرمستقیم به توابع و goto محاسباتی (computed goto)، پیونددهنده تکهکدهای رابط (stubs) ایجاد میکند. این تکهکدها پدهای پرش هستند که گاهی trampolines (ترامپولین) نیز نامیده میشوند. بدین ترتیب، فراخوانی/پرش غیرمستقیم به چنین تکهکدی میپرد. تکهکد حاوی یک پرش مستقیم به نشانی مورد نظر است.
- تسهیل پیونددهنده (Linker relaxation) باید فعال باشد تا پیونددهنده بتواند تکهکدها (stubs) را در تمامی وضعیتها بهدرستی ایجاد کند. به گزینهٔ کامپایلر -mrelax و گزینهٔ پیونددهندهٔ --relax مراجعه کنید. حالتهای خاصی (corner cases) وجود دارند که انتظار میرود پیونددهنده تکهکدها را بسازد، اما بدون فعال بودن relaxation و بدون پیام خطای مفیدی، متوقف میشود.
- اسکریپت پیونددهندهٔ پیشفرض برای کدهایی با "EIND = 0" تنظیم شده است. اگر قرار باشد کد برای پیکربندیای با "EIND != 0" کار کند، باید از یک اسکریپت پیونددهندهٔ سفارشی استفاده شود تا بخشهایی که نام آنها با ".trampolines" آغاز میشود در قطعهای (segment) قرار گیرند که "EIND" به آن اشاره میکند..IP * 4 کد راهاندازی متعلق به libgcc هرگز "EIND" را مقداردهی نمیکند. توجه داشته باشید که کد راهاندازی ترکیبی از کدهای libgcc و AVR-LibC است. برای بررسی تأثیر AVR-LibC بر "EIND"، به راهنمای کاربر AVR-LibC ("https://avrdudes.github.io/avr-libc/avr-libc-user-manual") مراجعه کنید.
- تنظیم
زودهنگام
"EIND" توسط
کد
راهاندازی
اختصاصی
کاربر،
برای مثال
از طریق کد
مقداردهی
اولیه واقع
در بخش
".init3"،
مجاز است.
چنین کدی
پیش از کد
راهاندازی
عمومی که RAM
را
مقداردهی
اولیه کرده
و
سازندهها
را
فراخوانی
میکند
اجرا
میشود،
اما پس از
آن بخش از
کد
راهاندازی
AVR-LibC اجرا
خواهد شد که
"EIND" را
روی سگمنتی
که جدول
بردارها در
آن قرار
دارد تنظیم
میکند.
#include <avr/io.h> static void __attribute__((section(".init3"),naked,used,no_instrument_function)) init3_set_eind (void) { __asm volatile ("ldi r24,pm_hh8(__trampolines_start)\n\t" "out %i0,r24" :: "n" (&EIND) : "r24","memory"); }نماد "__trampolines_start" در اسکریپت پیونددهنده تعریف شده است.
- در صورت برقراری دو شرط زیر، خردکدها (stubs) بهطور خودکار توسط پیونددهنده ایجاد میشوند:
- -<آدرس یک برچسب با استفاده از اصلاحگر "gs" گرفته شود>
- (کوتاهشدهٔ
generate stubs) به صورت
زیر:
LDI r24, lo8(gs(<func>)) LDI r25, hi8(gs(<func>))
- -<مکان نهایی آن برچسب در یک سگمنت کد باشد>
- خارج از سگمنتی که خردکدها در آن قرار دارند.
- *
- کامپایلر چنین اصلاحگرهای "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" در اسکریپت پیونددهنده تعریف شود.
مدیریت ثباتهای عملکرد خاص "RAMPD"، "RAMPX"، "RAMPY" و "RAMPZ"
برخی از قطعات AVR از حافظههایی بزرگتر از محدوده ۶۴ KiB که با اشارهگرهای ۱۶ بیتی قابل دسترسی هستند، پشتیبانی میکنند. برای دسترسی به مکانهای حافظه خارج از این محدوده ۶۴ KiB، محتوای یک ثبات "RAMP" به عنوان بخش بالایی آدرس استفاده میشود: ثبات آدرس "X"، "Y" یا "Z" به ترتیب با ثبات عملکرد خاص "RAMPX"، "RAMPY" یا "RAMPZ" ترکیب میشود تا یک آدرس عریض به دست آید. به طور مشابه، "RAMPD" همراه با آدرسدهی مستقیم به کار میرود.
- کد راهاندازی، ثباتهای عملکرد خاص "RAMP" را با صفر مقداردهی اولیه میکند.
- اگر از یک AVR Named Address Spaces,فضای آدرس نامگذاریشده به جز عمومی یا "__flash" استفاده شود، آنگاه "RAMPZ" در صورت نیاز پیش از عملیات تنظیم میشود.
- اگر قطعه از RAM بزرگتر از ۶۴ KiB پشتیبانی کند و کامپایلر برای به انجام رساندن یک عملیات نیاز به تغییر "RAMPZ" داشته باشد، "RAMPZ" پس از عملیات مجدداً به صفر بازنشانی میشود.
- اگر قطعه دارای یک ثبات "RAMP" خاص باشد، پیشدرآمد/پسدرآمد ISR آن SFR را ذخیره/بازیابی کرده و در صورتی که کد ISR ممکن باشد (بهطور ضمنی) از آن استفاده کند، آن را با صفر مقداردهی اولیه میکند.
- حافظه RAM بزرگتر از ۶۴ KiB توسط GCC برای اهداف AVR پشتیبانی نمیشود. اگر از اسمبلر درونخطی برای خواندن از مکانهای خارج از محدوده آدرسدهی ۱۶ بیتی استفاده میکنید و یکی از ثباتهای "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" کامپایل میشود تا از یک جدول بردار فشرده استفاده کند.
- "__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" است. این مورد برای قطعاتی با بیش از ۸ KiB حافظه برنامه صدق میکند.
- "__AVR_HAVE_EIJMP_EICALL__"
- "__AVR_3_BYTE_PC__"
- قطعه دارای دستورالعملهای "EIJMP" و "EICALL" است. این مورد برای قطعاتی با بیش از ۱۲۸ KiB حافظه برنامه صدق میکند. همچنین به این معنی است که شمارنده برنامه (PC) به پهنای ۳ بایت است.
- "__AVR_2_BYTE_PC__"
- شمارنده برنامه (PC) ۲ بایت پهنا دارد. این مورد برای قطعاتی با حداکثر ۱۲۸ 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) به دلیل نقص سختافزاری نباید از روی دستورالعملهای ۳۲ بیتی پرش کنند. دستورالعملهای پرش عبارتند از "SBRS"، "SBRC"، "SBIS"، "SBIC" و "CPSE". ماکروی دوم تنها زمانی تعریف میشود که "__AVR_HAVE_JMP_CALL__" نیز تنظیم شده باشد.
- "__AVR_ISA_RMW__"
- قطعه دارای دستورالعملهای Read-Modify-Write (خواندن-اصلاح-نوشتن: XCH، LAC، LAS و LAT) است.
- "__AVR_SFR_OFFSET__=offset"
- دستورالعملهایی که میتوانند ثباتهای عملکرد خاص I/O را مستقیماً آدرسدهی کنند مانند "IN"، "OUT"، "SBI" و غیره، ممکن است از آدرسی متفاوت نسبت به حالتی که با دستورالعمل دسترسی به RAM مانند "LD" یا "STS" آدرسدهی شوند، استفاده کنند. این آفست به معماری قطعه بستگی دارد و باید از آدرس RAM کسر شود تا آدرس I/O مربوطه به دست آید.
- "__AVR_SHORT_CALLS__"
- گزینه خط فرمان -mshort-calls تنظیم شده است.
- "__AVR_PM_BASE_ADDRESS__=addr"
- برخی قطعات از خواندن حافظه فلش با استفاده از دستورالعملهای "LD*" پشتیبانی میکنند. حافظه فلش در فضای آدرس داده با آفست "__AVR_PM_BASE_ADDRESS__" دیده میشود. اگر این ماکرو تعریف نشده باشد، این قابلیت در دسترس نیست. در صورت تعریف شدن، فضای آدرس خطی است و نیازی به قرار دادن ".rodata" در RAM نیست. این امر توسط فایل توصیف پیشفرض پیونددهنده مدیریت میشود و در حال حاضر برای "avrtiny" و "avrxmega3" موجود است. حتی راحتتر، نیازی به استفاده از فضاهای آدرس مانند "__flash" یا قابلیتهایی چون مشخصه "progmem" و "pgm_read_*" وجود ندارد.
- "__AVR_HAVE_FLMAP__"
- این ماکرو مشروط بر برقراری شرایط زیر تعریف میشود:
- *<قطعه دارای میدان بیتی "NVMCTRL_CTRLB.FLMAP" باشد.>
- این موضوع در مورد قطعات AVR64* و AVR128* صدق میکند..IP "*<It's not known at assembler-time which emulation will be used.>" 4
این نشان میدهد که کامپایلر با GNU Binutils پیکربندی شده است که PR31124 ("https://sourceware.org/PR31124") را پیادهسازی میکند.
- "__AVR_RODATA_IN_RAM__"
- این ماکرو
هنگامی که
کد برای یک
معماری
پایه
کامپایل
میشود،
تعریفنشده
است.
هنگامی که کد برای یک افزاره کامپایل میشود، چنانچه بخشهای ".rodata" برای دادههای فقطخواندنی در RAM قرار گیرند، این ماکرو برابر ۱ تعریف میشود؛ و در غیر این صورت، برابر ۰ تعریف میشود.
- "__WITH_AVRLIBC__"
- کامپایلر برای استفاده به همراه AVR-LibC پیکربندی شده است. گزینهٔ پیکربندی --with-avrlibc را ببینید.
- "__HAVE_SIGNAL_N__"
- کامپایلر از مشخصههای تابع signal(num) و interrupt(num) در AVR Function Attributes,,function attributes با آرگومان num که شمارهٔ روال سرویس وقفه را مشخص میکند، پشتیبانی میکند.
- "__HAVE_DOUBLE_MULTILIB__"
- در صورتی که -mdouble= به عنوان یک گزینهٔ multilib عمل کند، تعریف میشود.
- "__HAVE_DOUBLE32__"
- "__HAVE_DOUBLE64__"
- در صورتی که کامپایلر به ترتیب از double ۳۲-بیتی یا 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
گزینههای زیر به صورت داخلی توسط کامپایلر و برای برقراری ارتباط بین فایلهای مشخصات افزاره (device 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" و فاقد آن هستند.
گزینههای Blackfin
- -mcpu=cpu[-sirevision]
- نام
پردازندهٔ
Blackfin مقصد را
مشخص
میکند. در
حال حاضر،
cpu
میتواند
یکی از
مقادیر bf512،
bf514، bf516، bf518،
bf522، bf523، bf524،
bf525، bf526، bf527،
bf531، bf532، bf533،
bf534، bf536، bf537،
bf538، bf539، bf542،
bf544، bf547، bf548،
bf549، bf542m، bf544m،
bf547m، bf548m، bf549m،
bf561 یا bf592
باشد.
مقدار اختیاری sirevision ویرایش سیلیکونی پردازندهٔ Blackfin مقصد را مشخص میکند. هرگونه راهکار دورزدن مشکل موجود برای ویرایش سیلیکونی هدف فعال میشود. اگر sirevision برابر با none باشد، هیچ راهکاری فعال نمیشود. اگر sirevision برابر با any باشد، تمام راهکارها برای پردازندهٔ هدف فعال میشوند. ماکروی "__SILICON_REVISION__" به صورت دو رقم هگزادسیمال که نشاندهندهٔ شمارههای اصلی و فرعی در ویرایش سیلیکونی هستند تعریف میشود. اگر sirevision برابر با none باشد، ماکروی "__SILICON_REVISION__" تعریف نمیشود. اگر sirevision برابر با any باشد، "__SILICON_REVISION__" برابر با 0xffff تعریف خواهد شد. اگر این sirevision اختیاری استفاده نشود، GCC جدیدترین ویرایش سیلیکونی شناختهشدهٔ پردازندهٔ Blackfin هدف را در نظر میگیرد.
کامپایلر GCC یک ماکروی پیشپردازنده برای cpu مشخصشده تعریف میکند. برای زنجیره ابزار bfin-elf، این گزینه باعث میشود در صورت عدم تعیین -msim، بستهٔ پشتیبانی سختافزار (BSP) ارائهشده توسط libgloss پیوند زده شود.
بدون این گزینه، به طور پیشفرض bf532 به عنوان پردازنده استفاده میشود.
توجه داشته باشید که پشتیبانی از bf561 ناقص است. برای bf561، فقط ماکروی پیشپردازنده تعریف میشود.
- -msim
- مشخص میکند که برنامه روی شبیهساز اجرا خواهد شد. این موضوع موجب پیوند خوردن BSP شبیهساز ارائهشده توسط libgloss میشود. این گزینه فقط برای زنجیره ابزار bfin-elf کاربرد دارد. برخی گزینههای دیگر نظیر -mid-shared-library و -mfdpic، گزینهٔ -msim را نیز در بر دارند.
- -momit-leaf-frame-pointer
- برای توابع برگ، اشارهگر فریم را در ثبات نگه نمیدارد. این کار از دستورالعملهای ذخیره، راهاندازی و بازیابی اشارهگر فریم جلوگیری کرده و یک ثبات اضافی در توابع برگ آزاد میکند.
- -mspecld-anomaly
- هنگام فعال بودن، کامپایلر تضمین میکند که کد تولیدشده شامل بارگذاریهای حدسی (speculative loads) پس از دستورالعملهای پرش نباشد. در صورت استفاده از این گزینه، "__WORKAROUND_SPECULATIVE_LOADS" تعریف میشود.
- -mno-specld-anomaly
- کد اضافهای برای جلوگیری از رخ دادن بارگذاریهای حدسی تولید نمیکند.
- -mcsync-anomaly
- هنگام فعال بودن، کامپایلر اطمینان حاصل میکند که کد تولیدشده شامل دستورالعملهای CSYNC یا SSYNC با فاصلهٔ بسیار کم پس از شاخههای شرطی نباشد. در صورت استفاده از این گزینه، "__WORKAROUND_SPECULATIVE_SYNCS" تعریف میشود.
- -mno-csync-anomaly
- کد اضافهای برای جلوگیری از وقوع دستورالعملهای CSYNC یا SSYNC در فواصل کوتاه پس از یک شاخهٔ شرطی تولید نمیکند.
- -mlow64k
- هنگام فعال بودن، کامپایلر مجاز است بر اساس این موضوع که کل برنامه در ۶۴ کیلوبایت پایینی حافظه جای میگیرد، کد را بهینهسازی کند.
- -mno-low64k
- فرض میکند که برنامه میتواند به هر اندازه بزرگ باشد. این حالت پیشفرض است.
- -mstack-check-l1
- بررسی پشته را با استفاده از اطلاعات قرار دادهشده در حافظهٔ یادداشت L1 توسط هستهٔ uClinux انجام میدهد.
- -mid-shared-library
- کدی تولید میکند که از کتابخانههای اشتراکی از طریق روش شناسهٔ کتابخانه پشتیبانی میکند. این امر اجرای درجا و استفاده از کتابخانههای اشتراکی را در محیطهای فاقد مدیریت حافظهٔ مجازی ممکن میسازد. این گزینه مستلزم -fPIC است. برای مقاصد bfin-elf، این گزینه مستلزم -msim نیز هست..IP -mno-id-shared-library 4 کدی تولید میکند که فرض نمیکند کتابخانههای اشتراکی مبتنی بر شناسه (ID-based) در حال استفاده هستند. این حالت پیشفرض است.
- -mleaf-id-shared-library
- کدی تولید میکند که از طریق روش شناسهٔ کتابخانه از کتابخانههای اشتراکی پشتیبانی میکند، اما فرض را بر این میگذارد که این کتابخانه یا فایل اجرایی با هیچ کتابخانهٔ اشتراکی شناسه دیگری پیوند داده نخواهد شد. این کار به کامپایلر اجازه میدهد از کد سریعتری برای پرشها و فراخوانیها استفاده کند.
- -mno-leaf-id-shared-library
- فرض نکنید که کد در حال کامپایل با هیچ کتابخانهٔ اشتراکی شناسهای پیوند داده نخواهد شد. برای دستورالعملهای پرش و فراخوانی کدهای کندتری تولید میشود.
- شمارهٔ شناسایی کتابخانهٔ اشتراکی مبتنی بر شناسه را که در حال کامپایل است مشخص میکند. تعیین مقدار 0 کد فشردهتری تولید میکند؛ تعیین مقادیر دیگر، تخصیص آن شماره را به کتابخانهٔ فعلی اجباری میکند اما از نظر فضا یا زمان کارآمدتر از نادیده گرفتن این گزینه نیست.
- -msep-data
- کدی تولید میکند که اجازه میدهد بخش داده در ناحیهای متفاوت از حافظه نسبت به بخش متن قرار گیرد. این کار با حذف بازنشانیها نسبت به بخش متن، امکان اجرای درجا (execute in place) را در محیطهای فاقد مدیریت حافظهٔ مجازی فراهم میسازد.
- -mno-sep-data
- کدی تولید میکند که فرض میکند بخش داده به دنبال بخش متن میآید. این حالت پیشفرض است.
- -mlong-calls
- -mno-long-calls
- به
کامپایلر
میگوید که
فراخوانیهای
تابع را
ابتدا با
بارگذاری
آدرس تابع
درون یک
ثبات و سپس
انجام
فراخوانی
زیرروال
روی این
ثبات انجام
دهد. این
سوییچ در
صورتی مورد
نیاز است که
تابع مقصد
خارج از
محدودهٔ
آدرسدهی
۲۴ بیتی
نسخهٔ
مبتنی بر
آفست
دستورالعمل
فراخوانی
زیرروال
قرار داشته
باشد.
این ویژگی بهطور پیشفرض فعال نیست. تعیین -mno-long-calls رفتار پیشفرض را بازمیگرداند. توجه داشته باشید که این سوییچها هیچ اثری بر نحوهٔ تولید کد توسط کامپایلر برای مدیریت فراخوانی توابع از طریق اشارهگرهای تابع ندارند.
- -mfast-fp
- پیوند دادن با کتابخانهٔ ممیز شناور سریع. این کتابخانه به منظور بهبود کارایی، برخی از قوانین استاندارد ممیز شناور IEEE را برای بررسی ورودیها در برابر «عدد نیست» (NAN) نادیده میگیرد یا تسهیل میکند.
- -minline-plt
- درونخطیسازی (inlining) مدخلهای PLT را در فراخوانی توابعی که مشخص نیست بهصورت محلی مقید میشوند فعال میکند. این گزینه بدون -mfdpic هیچ اثری ندارد.
- -mmulticore
- ساخت یک
برنامهٔ
مستقل (standalone)
برای
پردازندههای
چندهستهای
Blackfin. این
گزینه باعث
استفاده از
فایلهای
راهاندازی
و
اسکریپتهای
پیوند
مناسبِ
پشتیبانیکننده
از
چندهستهای
شده و
ماکروی
"__BFIN_MULTICORE" را
تعریف
میکند. این
گزینه تنها
همراه با
-mcpu=bf561[-sirevision]
قابل
استفاده
است.
این گزینه میتواند همراه با -mcorea یا -mcoreb استفاده شود، که مدل برنامهنویسی «یک برنامه به ازای هر هسته» را انتخاب میکند. بدون -mcorea یا -mcoreb، مدل برنامهنویسی «تکبرنامه/دوهستهای» استفاده میشود. در این مدل، تابع اصلی هستهٔ B باید بهصورت "coreb_main" نامگذاری شود.
اگر از این گزینه استفاده نشود، مدل برنامهنویسی برنامهٔ تکهستهای استفاده میشود.
- -mcorea
- ساخت یک برنامهٔ مستقل برای هستهٔ A از پردازندهٔ BF561 هنگام استفاده از مدل برنامهنویسی «یک برنامه به ازای هر هسته». فایلهای راهاندازی و اسکریپتهای پیوند مناسب برای پشتیبانی از هستهٔ A استفاده شده و ماکروی "__BFIN_COREA" تعریف میشود. این گزینه تنها در ترکیب با -mmulticore قابل استفاده است.
- -mcoreb
- ساخت یک برنامهٔ مستقل برای هستهٔ B از پردازندهٔ BF561 هنگام استفاده از مدل برنامهنویسی «یک برنامه به ازای هر هسته». فایلهای راهاندازی و اسکریپتهای پیوند مناسب برای پشتیبانی از هستهٔ B استفاده شده و ماکروی "__BFIN_COREB" تعریف میشود. هنگام استفاده از این گزینه، باید به جای "main" از "coreb_main" استفاده شود. این گزینه تنها در ترکیب با -mmulticore قابل استفاده است.
- -msdram
- ساخت یک برنامهٔ مستقل برای SDRAM. فایلهای راهاندازی و اسکریپتهای پیوند مناسب برای قرار دادن برنامه در SDRAM استفاده شده و ماکروی "__BFIN_SDRAM" تعریف میشود. بارگذار (loader) باید پیش از بارگذاری برنامه، SDRAM را مقداردهی اولیه کند.
- -micplb
- فرض میکند که ICPLBها در زمان اجرا فعال هستند. این امر بر رفع برخی ناهنجاریها (anomaly workarounds) تأثیر میگذارد. برای مقصدهای Linux، پیشفرض بر این است که ICPLBها فعال هستند؛ برای برنامههای مستقل، پیشفرض غیرفعال بودن است.
گزینههای C6X
- -march=name
- نام معماری مقصد را مشخص میکند. GCC از این نام برای تعیین اینکه هنگام تولید کد اسمبلی چه نوع دستورالعملهایی را میتواند صادر کند استفاده میکند. نامهای مجاز عبارتند از: c62x، c64x، c64x+، c67x، c67x+، c674x.
- -mbig-endian
- تولید کد برای یک مقصد بزرگانتها (big-endian).
- -mlittle-endian
- تولید کد برای یک مقصد کوچکانتها (little-endian). این حالت پیشفرض است.
- -msim
- انتخاب فایلهای راهاندازی و اسکریپت پیونددهندهٔ مناسب برای شبیهساز.
- -msdata=default
- قرار دادن دادههای سراسری و ایستا (static) کوچک در بخش ".neardata" که ثبات "B14" به آن اشاره میکند. قرار دادن دادههای سراسری و ایستای کوچک مقداردهینشده در بخش ".bss" که مجاور بخش ".neardata" است. قرار دادن دادههای فقطخواندنی کوچک در بخش ".rodata". بخشهای متناظر مورد استفاده برای قطعات بزرگ داده شامل ".fardata"، ".far" و ".const" هستند.
- -msdata=all
- قرار دادن تمام دادهها، و نه فقط اشیاء کوچک، در بخشهای رزرو شده برای دادههای کوچک، و استفاده از آدرسدهی نسبی به ثبات "B14" برای دسترسی به آنها.
- -msdata=none
- هیچ استفادهای از بخشهای رزرو شده برای دادههای کوچک نمیکند و از آدرسهای مطلق برای دسترسی به تمام دادهها استفاده میکند. قرار دادن تمام دادههای سراسری و ایستای مقداردهیشده در بخش ".fardata"، و تمام دادههای مقداردهینشده در بخش ".far". قرار دادن تمام دادههای ثابت در بخش ".const".
گزینههای CRIS
این گزینهها بهطور ویژه برای پورتهای CRIS تعریف شدهاند.
- -march=architecture-type
- -mcpu=architecture-type
- تولید کد برای معماری مشخصشده. گزینههای انتخابی برای architecture-type به ترتیب عبارتند از v3، v8 و v10 برای ETRAX 4، ETRAX 100 و ETRAX 100 LX. پیشفرض v0 است.
- -mtune=architecture-type
- بهینهسازی تمام جنبههای کاربردی کد تولیدشده برای architecture-type، به جز ABI و مجموعهٔ دستورالعملهای در دسترس. گزینههای انتخابی برای architecture-type همانند گزینههای -march=architecture-type هستند.
- -mmax-stack-frame=n
- هنگامی که فریم پشتهٔ یک تابع از n بایت فراتر رود هشدار میدهد.
- -metrax4
- -metrax100
- گزینههای -metrax4 و -metrax100 به ترتیب مترادفهای -march=v3 و -march=v8 هستند.
- -mmul-bug-workaround
- -mno-mul-bug-workaround
- دور زدن یک ایراد در دستورالعملهای "muls" و "mulu" برای مدلهای پردازندهای که این مشکل در آنها صدق میکند. این گزینه بهطور پیشفرض غیرفعال است.
- -mpdebug
- فعال کردن اطلاعات مفصل مرتبط با اشکالزدایی مختص به CRIS در کد اسمبلی. این گزینه همچنین اثر غیرفعال کردن نشانگر کد قالببندیشدهٔ #NO_APP به اسمبلر در ابتدای فایل اسمبلی را به همراه دارد.
- -mcc-init
- از نتایج کدهای وضعیت (condition-code) حاصل از دستورالعمل پیشین استفاده نکنید؛ همیشه قبل از استفاده از کدهای وضعیت، دستورالعملهای مقایسه و آزمون را صادر میکند.
- -mno-side-effects
- دستورالعملهای دارای اثرات جانبی را در حالتهای آدرسدهی به جز پسافزایش (post-increment) صادر نمیکند.
- -mstack-align
- -mno-stack-align
- -mdata-align
- -mno-data-align
- -mconst-align
- -mno-const-align
- این گزینهها (گزینههای حاوی no-) ترازسازی (یا حذف ترتیبات ترازسازی) فریم پشته، دادههای منفرد و مقادیر ثابت را بر اساس حداکثر اندازهٔ دسترسی منفرد به داده برای مدل CPU انتخابشده تنظیم میکنند. حالت پیشفرض، تنظیم ترازسازی ۳۲ بیتی است. جزئیات ABI مانند چینش ساختار (structure layout) تحت تأثیر این گزینهها قرار نمیگیرند..IP -m32-bit 4
- -m16-bit
- -m8-bit
- مشابه گزینههای تراز stack-، data- و const-align در بالا، این گزینهها ترتیبی میدهند که چارچوب پشته (stack frame)، دادههای قابل نوشتن و مقادیر ثابت، همگی با تراز ۳۲ بیتی، ۱۶ بیتی یا ۸ بیتی قرار گیرند. پیشفرض، تراز ۳۲ بیتی است.
- -mno-prologue-epilogue
- -mprologue-epilogue
- با -mno-prologue-epilogue، مقدمه (prologue) و مؤخره (epilogue) عادی تابع که چارچوب پشته را برپا میکنند حذف میشوند و هیچ دستور بازگشت یا توالیهای بازگشتی در کد تولید نمیگردد. از این گزینه تنها همراه با بازبینی چشمی کد کامپایلشده استفاده کنید: هنگامی که ثباتهای ذخیرهشده توسط فراخوانده (call-saved registers) باید ذخیره شوند یا نیاز به تخصیص فضا برای متغیرهای محلی باشد، هیچ هشدار یا خطایی صادر نمیشود.
- -melf
- گزینه قدیمی و بیاثر (no-op).
- -sim
- این گزینه ترتیبی میدهد تا پیوند با توابع ورودی-خروجی از یک کتابخانه شبیهساز انجام شود. کد، دادههای مقداردهیشده و دادههای با مقدار اولیه صفر، بهصورت پیدرپی تخصیص مییابند.
- -sim2
- مشابه -sim، اما گزینههایی را به پیونددهنده ارسال میکند تا دادههای مقداردهیشده در 0x40000000 و دادههای با مقدار اولیه صفر در 0x80000000 مستقر شوند.
گزینههای C-SKY (C-SKY Options)
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
- -EB
- -mlittle-endian
- -EL
- کد بزرگپایان (big-endian) یا کوچکپایان (little-endian) را انتخاب میکند. مقدار پیشفرض، کوچکپایان است.
- -mfloat-abi=name
- مشخص
میکند که
از کدام ABI
ممیز شناور
استفاده
شود. مقادیر
مجاز
عبارتند از:
soft، softfp و hard.
مشخص کردن soft باعث میشود که GCC خروجی حاوی فراخوانیهای کتابخانهای برای عملیات ممیز شناور تولید کند. softfp اجازه تولید کد با استفاده از دستورهای ممیز شناور سختافزاری را میدهد، اما همچنان از قراردادهای فراخوانی soft-float استفاده میکند. hard امکان تولید دستورهای ممیز شناور را فراهم کرده و از قراردادهای فراخوانی مختص FPU استفاده میکند.
پیشفرض به پیکربندی خاص مقصد بستگی دارد. توجه داشته باشید که ABIهای hard-float و soft-float از نظر پیوند با یکدیگر سازگار نیستند؛ باید کل برنامه خود را با همان ABI کامپایل کرده و با مجموعهای سازگار از کتابخانهها پیوند دهید.
- -mhard-float
- -msoft-float
- پیادهسازیهای سختافزاری یا نرمافزاری ممیز شناور را انتخاب میکند. پیشفرض، ممیز شناور نرمافزاری (soft float) است.
- -mdouble-float
- -mno-double-float
- هنگامی که -mhard-float فعال باشد، تولید دستورهای ممیز شناور با دقت مضاعف (double-precision) را فعال میکند. این حالت پیشفرض است مگر هنگام کامپایل برای CK803.
- -mfdivdu
- -mno-fdivdu
- هنگامی که -mhard-float فعال باشد، تولید دستورهای "frecipd"، "fsqrtd"، و "fdivd" را فعال میکند. این حالت پیشفرض است مگر در هنگام کامپایل برای CK803.
- -mfpu=fpu
- پردازنده ممیز شناور را انتخاب میکند. این گزینه تنها همراه با -mhard-float قابل استفاده است. مقادیر مجاز برای fpu عبارتند از: fpv2_sf (معادل با -mno-double-float -mno-fdivdu)، fpv2 (-mdouble-float -mno-divdu)، و fpv2_divd (-mdouble-float -mdivdu).
- -melrw
- -mno-elrw
- دستور توسعهیافتهی "lrw" را فعال میکند. این گزینه بهطور پیشفرض برای CK801 روشن (on) و در غیر این صورت خاموش (off) است.
- -mistack
- -mno-istack
- دستورهای
پشته وقفه
(interrupt stack) را فعال
میکند؛
پیشفرض
خاموش (off) است.
گزینه -mistack برای رسیدگی به ویژگیهای (attributes) تابعی "interrupt" و "isr" لازم است.
- -mmp
- دستورهای چندپردازندهای را فعال میکند؛ پیشفرض خاموش (off) است.
- -mcp
- دستورهای کمکپردارنده (coprocessor) را فعال میکند؛ پیشفرض خاموش (off) است.
- -mcache
- دستورهای کمکپردارنده را فعال میکند؛ پیشفرض خاموش (off) است.
- -msecurity
- دستورهای امنیتی C-SKY را فعال میکند؛ پیشفرض خاموش (off) است.
- -mtrust
- دستورهای مورد اعتماد (trust) C-SKY را فعال میکند؛ پیشفرض خاموش (off) است.
- -mdsp
- -medsp
- -mvdsp
- به ترتیب دستورهای C-SKY DSP، پردازش سیگنال دیجیتال پیشرفته (Enhanced DSP)، یا برداری (Vector DSP) را فعال میکند. تمامی این گزینهها بهطور پیشفرض خاموش (off) هستند.
- -mdiv
- -mno-div
- دستورهای تقسیم را تولید میکند. پیشفرض خاموش (off) است.
- -msmart
- -mno-smart
- تولید کد برای حالت هوشمند (Smart Mode)، با استفاده از تنها ثباتهای شمارههای 0 تا 7 جهت فراهم ساختن امکان استفاده از دستورهای ۱۶ بیتی. این گزینه برای CK801 که این رفتار در آن الزامی است نادیده گرفته میشود، و بهطور پیشفرض برای CK802 روشن (on) است. برای سایر مقاصد، پیشفرض خاموش (off) است.
- -mhigh-registers
- -mno-high-registers
- تولید کد با استفاده از ثباتهای بالایی شمارههای 16 تا 31. این گزینه در CK801، CK802 یا CK803 پشتیبانی نمیشود، و بهطور پیشفرض برای سایر پردازندهها فعال است.
- -manchor
- -mno-anchor
- تولید کد با استفاده از نشانیهای نماد لنگر سراسری (global anchor symbol addresses)..IP -mpushpop 4
- -mno-pushpop
- تولید کد با استفاده از دستورالعملهای "push" و "pop". این گزینه بهصورت پیشفرض فعال است.
- -mmultiple-stld
- -mstm
- -mno-multiple-stld
- -mno-stm
- تولید کد با استفاده از دستورالعملهای "stm" و "ldm". این گزینه روی CK801 پشتیبانی نمیشود، اما روی سایر پردازندهها بهطور پیشفرض فعال است.
- -mconstpool
- -mno-constpool
- ایجاد مخازن ثوابت (constant pools) در کامپایلر بهجای واگذاری آن به اسمبلر. این گزینه حالت پیشفرض بوده و برای تولید صحیح کد روی CK801 و CK802 الزامی است، و روی سایر پردازندهها اختیاری میباشد.
- -mstack-size
- -mno-stack-size
- درج دایرکتیوهای ".stack_size" به ازای هر تابع در خروجی اسمبلی. این گزینه بهطور پیشفرض غیرفعال است.
- -mccrt
- -mno-ccrt
- تولید کد برای زمان اجرای (runtime) کامپایلر C-SKY بهجای libgcc. این گزینه بهطور پیشفرض غیرفعال است.
- -mbranch-cost=n
- تنظیم هزینهٔ انشعابها (branch costs) تقریباً به اندازهٔ "n" دستورالعمل. مقدار پیشفرض 1 است.
- -msched-prolog
- -mno-sched-prolog
- اجازه دادن به زمانبندی توالیهای پرولوگ و اپیلوگ توابع. استفاده از این گزینه میتواند منجر به تولید کدی شود که با الزامات پرولوگ در C-SKY V2 ABI سازگار نبوده و امکان اشکالزدایی یا بازگردانی پشته (backtrace) آن وجود نداشته باشد. این گزینه بهطور پیشفرض غیرفعال است.
- -msim
- کتابخانهٔ libsemi.a را که با شبیهساز سازگار است پیوند میدهد. تنها برای کامپایلر ELF قابل اعمال است.
گزینههای Cygwin و MinGW
این گزینههای اضافی برای مقصدهای Microsoft Windows در دسترس هستند:
- -mconsole
- این گزینه مشخص میکند که یک برنامهٔ کنسولی تولید شود؛ این کار با دستور دادن به پیونددهنده (linker) برای تنظیم نوع زیرسیستم در سرآیند PE به مقدار مورد نیاز برای برنامههای کنسولی انجام میپذیرد. این گزینه برای مقصدهای Cygwin و MinGW در دسترس بوده و روی این مقصدها بهطور پیشفرض فعال است.
- -mcrtdll=library
- پیشپردازش، کامپایل یا پیوند با library مشخصشده از C RunTime DLL. این گزینه ماکروهای پیشتعریفشدهٔ "__CRTDLL__"، "__MSVCRT__"، "_UCRT" و "__MSVCRT_VERSION__" را برای library مربوط به CRT مشخصشده تنظیم کرده، فایل آغازین را برای کتابخانهٔ CRT برمیگزیند و با آن پیوند میزند. نامهای شناختهشدهٔ کتابخانهٔ CRT برای پیشپردازنده عبارتند از: "crtdll*"، "msvcrt10*"، "msvcrt20*"، "msvcrt40*"، "msvcr40*"، "msvcrtd*"، "msvcrt-os*"، "msvcr70*"، "msvcr71*"، "msvcr80*"، "msvcr90*"، "msvcr100*"، "msvcr110*"، "msvcr120*" و "ucrt*". اگر این گزینه مشخص نشود، کتابخانهٔ پیشفرض واردسازی MinGW یعنی "msvcrt" برای پیوند بهکار میرود و هیچ تنظیم دیگری برای پیشپردازنده انجام نخواهد شد. کتابخانهٔ واردسازی "msvcrt" در MinGW صرفاً یک پیوند نمادین به (یا کپیای از) کتابخانهٔ واردسازی CRT دیگری در MinGW است که در هنگام کامپایل MinGW انتخاب شده است. کتابخانهٔ واردسازی "msvcrt-os" در MinGW برای کتابخانهٔ سیستمی "msvcrt.dll" ویندوز بوده و در اغلب موارد کتابخانهٔ پیشفرض واردسازی MinGW است. بهطور کلی، تغییر CRT DLL مستلزم کامپایل مجدد کل MinGW CRT است. این گزینه صرفاً برای اهداف آزمایشی و ارزیابی کاربرد دارد. این گزینه برای مقصدهای MinGW در دسترس است.
- -mdll
- این گزینه برای مقصدهای Cygwin و MinGW در دسترس است. این گزینه مشخص میکند که یک DLL---کتابخانهٔ پیوند پویا---باید تولید شود، و بدینصورت امکان انتخاب شیء آغازین زمان اجرای لازم و نقطهٔ ورود را فراهم میسازد.
- -mnop-fun-dllimport
- این گزینه برای مقصدهای Cygwin و MinGW در دسترس است. این گزینه مشخص میکند که ویژگی "dllimport" باید نادیده گرفته شود.
- -mthreads
- این گزینه برای مقصدهای MinGW در دسترس است. مشخص میکند که پشتیبانی از ریسمانهای مختص به MinGW باید استفاده شود.
- -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" برای شبهبازآدرسدهی پشتیبانی نمیکنند، ضروری است.
- -mpe-aligned-commons
- این گزینه برای مقصدهای Cygwin و MinGW در دسترس است. این گزینه مشخص میکند پسوند GNU برای ساختار فایل PE که امکان همترازی صحیح متغیرهای COMMON را فراهم میکند، در هنگام تولید کد باید استفاده شود. در صورتی که GCC تشخیص دهد اسمبلر مقصد یافتشده در حین پیکربندی از این قابلیت پشتیبانی میکند، بهطور پیشفرض فعال خواهد بود.
همچنین برای گزینههای استاندارد، گزینههای x86 را ببینید.
گزینههای Darwin
این گزینهها برای تمامی معماریهایی که سیستمعامل Darwin را اجرا میکنند تعریف شدهاند.
کامپایلر FSF GCC در Darwin فایلهای شیء چندمعماری («fat») ایجاد نمیکند؛ بلکه یک فایل شیء صرفاً برای همان تک معماریای ایجاد میکند که GCC برای هدف قرار دادن آن ساخته شده است. نسخهٔ GCC شرکت Apple در Darwin در صورتی که چندین گزینهٔ -arch استفاده شوند، فایلهای «fat» میسازد؛ این کار با چندین بار اجرای کامپایلر یا پیونددهنده و متصل کردن نتایج به یکدیگر با lipo صورت میپذیرد.
زیرنوع (subtype) فایل ایجادشده (مانند ppc7400 یا ppc970 یا i686) توسط پرچمهایی تعیین میشود که ISA مورد نظر GCC را مشخص میکنند، مانند -mcpu یا -march. از گزینهٔ -force_cpusubtype_ALL میتوان برای بازنویسی و لغو این رفتار استفاده کرد.
ابزارهای Darwin در مواجهه با عدم تطابق در ISA رفتارهای متفاوتی دارند. اسمبلر، as، تنها اجازهٔ استفاده از دستورالعملهایی را میدهد که برای زیرنوع فایل در حال تولید معتبر باشند؛ بنابراین نمیتوان دستورالعملهای ۶۴ بیتی را در یک فایل شیء ppc750 قرار داد. پیونددهندهٔ کتابخانههای اشتراکی، /usr/bin/libtool، در صورتی که درخواست ساخت یک کتابخانهٔ اشتراکی با زیرنوعی با محدودیت کمتر نسبت به فایلهای ورودیاش را دریافت کند (برای مثال، تلاش برای قرار دادن یک فایل شیء ppc970 در یک کتابخانهٔ ppc7400)، شکست خورده و خطا چاپ میکند. پیونددهندهٔ فایلهای اجرایی، ld، بدون اخطار، محدودکنندهترین زیرنوع در میان فایلهای ورودیاش را به فایل اجرایی اختصاص میدهد.
- -Fdir
- افزودن
دایرکتوری
چارچوب (framework) dir
به ابتدای
فهرست
دایرکتوریهایی
که باید
برای
فایلهای
سرآیند
جستجو شوند.
این
دایرکتوریها
با موارد
مشخصشده
توسط
گزینههای
-I در هم
آمیخته شده
و به ترتیب
از چپ به
راست پویش
میشوند.
دایرکتوری چارچوب، پوشهای است که چارچوبها در آن قرار دارند. یک چارچوب، پوشهای است که مستقیماً شامل یک دایرکتوری Headers و/یا PrivateHeaders بوده و نام آن به .framework ختم میشود. نام چارچوب، همان نام این دایرکتوری بدون پسوند .framework است. سرآیندهای مربوط به چارچوب در یکی از آن دو پوشه یافت میشوند، به طوری که ابتدا Headers جستجو میگردد. یک زیرچارچوب (subframework)، پوشهٔ چارچوبی است که در پوشهٔ Frameworks یک چارچوب قرار دارد. شاملسازی (include) سرآیندهای زیرچارچوب تنها میتواند در سرآیندی از همان چارچوبِ دربردارندهٔ زیرچارچوب، یا در سرآیند یک زیرچارچوب همتا رخ دهد. دو زیرچارچوب در صورتی همتا هستند که در یک چارچوب یکسان واقع شده باشند. یک زیرچارچوب نباید نامی مشابه با یک چارچوب داشته باشد؛ در صورت نقض این قاعده هشداری صادر میشود. در حال حاضر یک زیرچارچوب نمیتواند زیرچارچوبهای دیگری داشته باشد؛ در آینده ممکن است این سازوکار برای پشتیبانی از آن گسترش یابد. چارچوبهای استاندارد را میتوان در /System/Library/Frameworks و /Library/Frameworks یافت. یک نمونه include به شکل "#include <Framework/header.h>" است، که در آن Framework نشاندهندهٔ نام چارچوب بوده و header.h در دایرکتوری PrivateHeaders یا Headers قرار دارد..IP -iframeworkdir 4 مشابه -F است، با این تفاوت که با دایرکتوری به عنوان یک دایرکتوری سیستمی رفتار میشود. تفاوت اصلی بین این -iframework و -F در این است که با -iframework کامپایلر هشداری دربارهٔ ساختارهای موجود در فایلهای سرایند یافتشده از طریق dir صادر نمیکند. این گزینه تنها برای خانوادهٔ زبانهای C معتبر است.
- -gused
- اطلاعات اشکالزدایی را برای نمادهایی که استفاده شدهاند تولید میکند. برای قالب اشکالزدایی stabs، این گزینه -feliminate-unused-debug-symbols را فعال میکند. این گزینه بهطور پیشفرض روشن (ON) است.
- -gfull
- اطلاعات اشکالزدایی را برای تمام نمادها و نوعها تولید میکند.
- -fconstant-cfstrings
- گزینهٔ -fconstant-cfstrings یک نام مستعار برای -mconstant-cfstrings است.
- -mconstant-cfstrings
- هنگامی که زماناجرای NeXT استفاده میشود (پیشفرض در این سیستمها)، هرگونه تنظیمات -fconstant-string-class را لغو کرده و باعث میشود لیترالهای "@"..."" به عنوان رشتههای ثابت CoreFoundation چیدمان شوند.
- -mmacosx-version-min=version
- قدیمیترین
نسخهٔ MacOS X که
این فایل
اجرایی بر
روی آن اجرا
خواهد شد version
است. مقادیر
معمول
پشتیبانیشده
برای version
شامل 12،
10.12 و 10.5.8
است.
اگر کامپایلر طوری ساخته شده باشد که بهطور پیشفرض از سرایندهای سیستم استفاده کند، پیشفرض این گزینه نسخهٔ سیستمی خواهد بود که کامپایلر روی آن در حال اجراست؛ در غیر این صورت پیشفرض انجام انتخابهایی است که تا حد امکان با بیشترین تعداد سیستمها و پایگاههای کد سازگار باشند.
- -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 را تنظیم مینماید.
- -mone-byte-bool
- پیشفرضهای
مربوط به
"bool" را
لغو میکند
بهگونهای
که "sizeof(bool)==1"
برقرار شود.
بهطور
پیشفرض
هنگام
کامپایل
برای Darwin/PowerPC
مقدار
sizeof(bool)
برابر با
4 و
هنگام
کامپایل
برای Darwin/x86
برابر با
1 است،
بنابراین
این گزینه
تأثیری بر
روی x86 ندارد.
هشدار: سوئیچ -mone-byte-bool باعث میشود GCC کدی تولید کند که با کد تولیدشده بدون این سوئیچ از نظر باینری سازگار نیست. استفاده از این سوئیچ ممکن است نیازمند کامپایل مجدد تمام پودمانهای دیگر در برنامه، از جمله کتابخانههای سیستم باشد. از این سوئیچ برای تطابق با یک مدل دادهٔ غیرپیشفرض استفاده کنید.
- -mfix-and-continue
- -ffix-and-continue
- -findirect-data
- کدی مناسب برای توسعه با چرخهٔ بازگشت سریع تولید میکند، به عنوان مثال تا به GDB اجازه دهد فایلهای .o را بهطور پویا درون برنامههای از قبل در حال اجرا بارگذاری کند. گزینههای -findirect-data و -ffix-and-continue برای سازگاری با نسخههای پیشین ارائه شدهاند.
- -all_load
- تمام اعضای کتابخانههای آرشیو ایستا را بارگذاری میکند. برای اطلاعات بیشتر صفحهٔ راهنمای ld(1) را ببینید.
- -arch_errors_fatal
- باعث میشود خطاهای مربوط به فایلهایی با معماری نادرست مهلک در نظر گرفته شوند.
- -bind_at_load
- باعث میشود فایل خروجی بهگونهای نشانهگذاری شود که پیونددهندهٔ پویا هنگام بارگذاری یا اجرای فایل، تمام ارجاعات تعریفنشده را مقید کند.
- -bundle
- فایلی با قالب Mach-o bundle تولید میکند. برای اطلاعات بیشتر صفحهٔ راهنمای ld(1) را ببینید.
- -bundle_loader executable
- این گزینه فایل اجرایی (executable) را مشخص میکند که فایل خروجی ساختِ در حال پیوند را بارگذاری خواهد کرد. برای اطلاعات بیشتر صفحهٔ راهنمای ld(1) را ببینید.
- -dynamiclib
- هنگامی که این گزینه مشخص شود، GCC در زمان پیوند با استفاده از دستور libtool در Darwin، به جای یک فایل اجرایی یک کتابخانهٔ پویا تولید میکند.
- -force_cpusubtype_ALL
- این گزینه باعث میشود فایل خروجی GCC بهجای زیرنوعی که توسط گزینهٔ -mcpu یا -march تعیین میشود، دارای زیرنوع ALL باشد.
- -nodefaultrpaths
- مسیرهای اجرای (run paths) پیشفرض دایرکتوریهای کتابخانهٔ کامپایلر را به فایلهای اجرایی، پودمانها یا کتابخانههای پویا اضافه نمیکند. در macOS 10.5 و جدیدتر، مسیر اجرای تعبیهشده بهطور پیشفرض اضافه میشود مگر آنکه کاربر -nodefaultrpaths را به خط پیوند بیفزاید. مسیرهای اجرا برای ساخت در macOS نسخهٔ 10.11 یا جدیدتر مورد نیاز هستند (و بنابراین اجباری میشوند).
- -allowable_client client_name
- -client_name
- -compatibility_version
- -current_version
- -dead_strip
- -dependency-file
- -dylib_file
- -dylinker_install_name
- -dynamic
- -exported_symbols_list
- -filelist
- -flat_namespace
- -force_flat_namespace
- -headerpad_max_install_names
- -image_base
- -init
- -install_name
- -keep_private_externs
- -multi_module
- -multiply_defined
- -multiply_defined_unused
- -noall_load
- -no_dead_strip_inits_and_terms
- -nofixprebinding
- -nomultidefs
- -noprebind
- -noseglinkedit
- -pagezero_size
- -prebind
- -prebind_all_twolevel_modules
- -private_bundle
- -read_only_relocs
- -sectalign
- -sectobjectsymbols
- -whyload
- -seg1addr
- -sectcreate
- -sectobjectsymbols
- -sectorder
- -segaddr
- -segs_read_only_addr
- -segs_read_write_addr
- -seg_addr_table
- -seg_addr_table_filename
- -seglinkedit
- -segprot
- -segs_read_only_addr
- -segs_read_write_addr
- -single_module
- -sub_library
- -sub_umbrella
- -twolevel_namespace
- -umbrella
- -undefined
- -unexported_symbols_list
- -weak_reference_mismatches
- -whatsloaded
- این گزینهها به پیونددهندهٔ Darwin ارسال میشوند. صفحهٔ راهنمای پیونددهندهٔ Darwin آنها را با جزئیات شرح میدهد.
گزینههای DEC Alpha
این گزینههای -m برای پیادهسازیهای DEC Alpha تعریف شدهاند:
- -mno-soft-float
- -msoft-float
- استفاده
(عدم
استفاده) از
دستورالعملهای
سختافزاری
ممیز شناور
برای
عملیات
ممیز شناور.
هنگامی که
-msoft-float مشخص
شود، توابع
موجود در libgcc.a
برای انجام
عملیات
ممیز شناور
استفاده
میشوند.
مگر اینکه
با
روالهایی
جایگزین
شوند که
عملیات
ممیز شناور
را
شبیهسازی
میکنند،
یا به نحوی
کامپایل
شده باشند
که چنین
روالهای
شبیهسازی
را
فراخوانی
کنند، این
روالها
دستورات
ممیز شناور
صادر
میکنند.
اگر برای یک
Alpha بدون
عملیات
ممیز شناور
کامپایل
میکنید،
باید
اطمینان
حاصل کنید
که
کتابخانه
به گونهای
ساخته شده
است که
آنها را
فراخوانی
نکند.
توجه داشته باشید که پیادهسازیهای Alpha بدون عملیات ممیز شناور نیز ملزم به داشتن ثباتهای ممیز شناور هستند.
- -mfp-reg
- -mno-fp-regs
- تولید کدی
که از
مجموعه
ثباتهای
ممیز شناور
استفاده
میکند
(استفاده
نمیکند).
-mno-fp-regs به
معنای
اعمال -msoft-float
است. اگر از
مجموعه
ثباتهای
ممیز شناور
استفاده
نشود،
عملوندهای
ممیز شناور
در
ثباتهای
عدد صحیح
ارسال
میشوند،
گویی که عدد
صحیح
هستند، و
نتایج ممیز
شناور به
جای $f0 در
$0
بازگردانده
میشوند.
این یک
توالی
فراخوانی
غیراستاندارد
است،
بنابراین
هر تابعی با
یک آرگومان
یا مقدار
بازگشتی
ممیز شناور
که توسط کدی
کامپایلشده
با -mno-fp-regs
فراخوانی
شود، باید
با همان
گزینه
کامپایل
شده باشد.
یک کاربرد متداول این گزینه، ساخت کرنلی است که از هیچ ثبات ممیز شناوری استفاده نمیکند و بنابراین نیازی به ذخیره و بازیابی آنها ندارد.
- -mieee
- معماری Alpha سختافزار ممیز شناور بهینهشده برای حداکثر کارایی را پیادهسازی میکند. این معماری تا حد زیادی با استاندارد ممیز شناور IEEE سازگار است. با این حال، برای انطباق کامل، به کمک نرمافزاری نیاز است. این گزینه کدی کاملاً منطبق بر IEEE تولید میکند بهجز اینکه inexact-flag نگهداری نمیشود (زیر را ببینید). اگر این گزینه روشن باشد، ماکروی پیشپردازندهٔ "_IEEE_FP" در حین کامپایل تعریف میشود. کد حاصل کارایی کمتری دارد اما قادر است به درستی از اعداد غیرعادی (denormalized) و مقادیر استثنایی IEEE مانند عددناپذیر (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
- این تنظیم پیشفرض (عادی) است. تنها تلههایی فعال میشوند که در نرمافزار نمیتوان آنها را غیرفعال کرد (مانند تلهٔ تقسیم بر صفر).
- u
- علاوه بر تلههای فعالشده توسط n، تلههای سرریز منفی (underflow) نیز فعال میشوند.
- su
- مانند u، اما دستورالعملها به عنوان ایمن برای تکمیل نرمافزاری نشانهگذاری میشوند (برای جزئیات به راهنمای معماری Alpha مراجعه کنید).
- sui
- مانند su، اما تلههای غیردقیق (inexact) نیز فعال میشوند.
- -mfp-rounding-mode=rounding-mode
- حالت گرد کردن IEEE را انتخاب میکند. سایر کامپایلرهای Alpha این گزینه را -fprm rounding-mode مینامند. مقدار rounding-mode میتواند یکی از موارد زیر باشد:
- n
- حالت گرد کردن عادی IEEE. اعداد ممیز شناور به سمت نزدیکترین عدد ماشین یا در صورت تساوی، به سمت عدد زوج ماشین گرد میشوند.
- m
- گرد کردن به سمت منفی بینهایت.
- c
- حالت گرد کردن بریدهشده (Chopped). اعداد ممیز شناور به سمت صفر گرد میشوند.
- d
- حالت گرد کردن پویا. فیلدی در ثبات کنترل ممیز شناور (fpcr، به راهنمای مرجع معماری Alpha مراجعه کنید) حالت گرد کردن فعال را کنترل میکند. کتابخانهٔ C این ثبات را برای گرد کردن به سمت مثبت بینهایت مقداردهی اولیه میکند. بنابراین، مگر اینکه برنامهٔ شما fpcr را تغییر دهد، d متناظر با گرد کردن به سمت مثبت بینهایت است.
- -mtrap-precision=trap-precision
- در معماری Alpha، تلههای ممیز شناور نادقیق (imprecise) هستند. این بدان معناست که بدون کمک نرمافزاری، بازیابی پس از یک تلهٔ ممیز شناور غیرممکن است و اجرای برنامه معمولاً باید پایان یابد. GCC میتواند کدی تولید کند که بتواند به گردانندههای تله در سیستمعامل در تعیین محل دقیقی که باعث ایجاد تلهٔ ممیز شناور شده است کمک کند. بسته به نیازمندیهای یک برنامه، سطوح مختلفی از دقت را میتوان انتخاب کرد:
- p
- دقت در سطح برنامه. این گزینه پیشفرض است و بدین معنی است که گردانندهٔ تله فقط میتواند تشخیص دهد کدام برنامه باعث بروز استثنای ممیز شناور شده است.
- f
- دقت در سطح تابع. گردانندهٔ تله میتواند تابعی را که باعث بروز استثنای ممیز شناور شده است مشخص کند.
- i
- دقت در سطح دستورالعمل. گردانندهٔ تله میتواند دستورالعمل دقیقی را که باعث بروز استثنای ممیز شناور شده است تعیین کند.
سایر کامپایلرهای Alpha گزینههای معادلی به نامهای -scope_safe و -resumption_safe ارائه میدهند.
- -mieee-conformant
- این گزینه کد تولید شده را به عنوان منطبق بر IEEE علامتگذاری میکند. نباید از این گزینه استفاده کنید مگر اینکه -mtrap-precision=i و یکی از گزینههای -mfp-trap-mode=su یا -mfp-trap-mode=sui را نیز تعیین کرده باشید. تنها اثر آن، درج خط .eflag 48 در پیشدرآمد تابع (prologue) در فایل اسمبلی تولید شده است.
- -mbuild-constants
- به طور
معمول GCC یک
مقدار ثابت
صحیح ۳۲ یا
۶۴ بیتی را
بررسی
میکند تا
ببیند آیا
میتواند
آن را در دو
یا سه
دستورالعمل
از مقادیر
ثابت
کوچکتر
بسازد یا
خیر. اگر
نتواند،
ثابت را به
عنوان یک
لیترال درج
میکند و
کدی تولید
میکند تا
آن را در
زمان اجرا
از بخش داده
(data segment)
بارگذاری
کند.
از این گزینه برای الزام GCC به ساخت تمام مقادیر ثابت صحیح با استفاده از کد دستورالعملها استفاده کنید، حتی اگر به دستورالعملهای بیشتری نیاز داشته باشد (حداکثر شش دستورالعمل است).
به طور معمول از این گزینه برای ساخت بارگذار پویای یک کتابخانهٔ مشترک (dynamic loader) استفاده میشود. این بارگذار که خود یک کتابخانهٔ مشترک است، باید پیش از اینکه بتواند متغیرها و مقادیر ثابت را در بخش دادهٔ خود پیدا کند، خودش را در حافظه بازنشانی (relocate) کند.
- -mbwx
- -mno-bwx
- -mcix
- -mno-cix
- -mfix
- -mno-fix
- -mmax
- -mno-max
- مشخص میکند که آیا GCC باید کدی برای استفاده از مجموعهدستورالعملهای اختیاری BWX، CIX، FIX و MAX تولید کند یا خیر. حالت پیشفرض، استفاده از مجموعهدستورالعملهایی است که توسط نوع پردازندهٔ تعیینشده با گزینهٔ -mcpu= پشتیبانی میشوند، یا در صورت عدم تعیین، مجموعهدستورالعملهای پردازندهای که GCC روی آن ساخته شده است به کار گرفته میشوند..IP -msafe-bwa 4
- -mno-safe-bwa
- مشخص میکند که در نبود مجموعه دستورالعمل اختیاری BWX، آیا GCC باید برای دسترسیهای حافظه بایتی و کلمه همتراز (aligned word)، کد ایمن در برابر چندریسمانی (multi-thread) و سیگنالهای ناهمگام (async-signal) تولید کند یا خیر.
- -msafe-partial
- -mno-safe-partial
- مشخص میکند که آیا GCC باید برای دسترسیهای جزئی به حافظه، کد ایمن در برابر چندریسمانی و سیگنالهای ناهمگام تولید کند یا خیر؛ این دسترسیها شامل دسترسیهای تکهتکه به دادههای ناهمتراز و همچنین دسترسیهای بلوکی به بخشهای ابتدایی و انتهایی انواع تجمعی یا سایر اشیای موجود در حافظه است که به ترتیب در مرز دادهای ۶۴-بیتی همتراز شروع و پایان نمییابند.
- -mfloat-vax
- -mfloat-ieee
- تولید کدی که به جای ممیز شناور با دقت تکی و دوگانه IEEE، از محاسبات ممیز شناور VAX F و G استفاده کند (یا استفاده نکند).
- -mexplicit-relocs
- -mno-explicit-relocs
- اسمبلرهای قدیمیتر Alpha روشی برای تولید بازنشانیهای نماد (symbol relocations) به جز از طریق ماکروهای اسمبلر ارائه نمیکردند. استفاده از این ماکروها مانع زمانبندی بهینه دستورالعملها میشود. بسته GNU binutils از نسخه 2.12 به بعد از ساختار نحوی جدیدی پشتیبانی میکند که به کامپایلر اجازه میدهد به طور صریح مشخص کند کدام بازنشانیها باید بر کدام دستورالعملها اعمال شوند. این گزینه بیشتر برای اشکالزدایی مفید است، زیرا GCC هنگام ساخت، قابلیتهای اسمبلر را تشخیص داده و مقدار پیشفرض را بر همان اساس تنظیم میکند.
- -msmall-data
- -mlarge-data
- هنگامی که
-mexplicit-relocs فعال
باشد، به
دادههای
ایستا از
طریق
بازنشانیهای
gp-relative دسترسی
پیدا
میشود.
وقتی -msmall-data
استفاده
میشود،
اشیایی به
طول ۸ بایت
یا کوچکتر
در یک
ناحیه
دادههای
کوچک
(بخشهای
".sdata" و
".sbss")
قرار
میگیرند و
از طریق
بازنشانیهای
۱۶-بیتی
نسبت به
ثبات $gp
مورد
دسترسی
قرار
میگیرند.
این امر
اندازه
ناحیه داده
کوچک را به 64KB
محدود
میکند،
اما به
متغیرها
اجازه
میدهد
مستقیماً
از طریق یک
دستورالعمل
واحد قابل
دسترسی
باشند.
پیشفرض -mlarge-data است. با این گزینه ناحیه داده به مقداری دقیقاً کمتر از 2GB محدود میشود. برنامههایی که به بیش از 2GB داده نیاز دارند باید برای تخصیص دادهها در heap به جای بخش داده برنامه، از "malloc" یا "mmap" استفاده کنند.
هنگام تولید کد برای کتابخانههای اشتراکی، -fpic متضمن -msmall-data و -fPIC متضمن -mlarge-data است.
- -msmall-text
- -mlarge-text
- هنگامی که
-msmall-text
استفاده
میشود،
کامپایلر
فرض میکند
که کد کل
برنامه (یا
کتابخانه
اشتراکی) در
4MB جای
میگیرد و
در نتیجه با
یک
دستورالعمل
انشعاب (branch)
قابل
دسترسی است.
هنگامی که
-msmall-data
استفاده
میشود،
کامپایلر
میتواند
فرض کند که
همه
نمادهای
محلی مقدار
$gp
یکسانی
دارند و
بدین ترتیب
تعداد
دستورالعملهای
لازم برای
یک
فراخوانی
تابع را از
۴ به ۱ کاهش
دهد.
پیشفرض -mlarge-text است.
- -mcpu=cpu_type
- مجموعه
دستورالعمل
و
پارامترهای
زمانبندی
دستورالعمل
را برای نوع
ماشین cpu_type
تنظیم
میکند.
میتوانید
نام به سبک
EV یا شماره
تراشه
متناظر را
مشخص کنید. GCC
از
پارامترهای
زمانبندی
برای
خانواده
پردازندههای
EV4، EV5 و EV6
پشتیبانی
میکند و
مقادیر
پیشفرض
مجموعه
دستورالعمل
را بر اساس
پردازندهای
که مشخص
کردهاید
انتخاب
مینماید.
اگر نوع
پردازنده
را مشخص
نکنید،
پیشفرض GCC
پردازندهای
خواهد بود
که
کامپایلر
روی آن
ساخته شده
است.
مقادیر پشتیبانیشده برای cpu_type عبارتند از:
- ev4
- ev45
- 21064
- زمانبندی را مطابق EV4 انجام میدهد و هیچ افزونه مجموعه دستورالعملی ندارد.
- ev5
- 21164
- زمانبندی را مطابق EV5 انجام میدهد و هیچ افزونه مجموعه دستورالعملی ندارد.
- ev56
- 21164a
- زمانبندی را مطابق EV5 انجام میدهد و از افزونه BWX پشتیبانی میکند.
- pca56
- 21164pc
- 21164PC
- زمانبندی را مطابق EV5 انجام میدهد و از افزونههای BWX و MAX پشتیبانی میکند.
- ev6
- 21264
- زمانبندی را مطابق EV6 انجام میدهد و از افزونههای BWX، FIX و MAX پشتیبانی میکند.
- ev67
- 21264a
- زمانبندی را مطابق EV6 انجام میدهد و از افزونههای BWX، CIX، FIX و MAX پشتیبانی میکند.
زنجیره ابزارهای بومی (Native toolchains) همچنین از مقدار native پشتیبانی میکنند که بهترین گزینه معماری را برای پردازنده میزبان انتخاب میکند. اگر GCC پردازنده را شناسایی نکند، -mcpu=native هیچ تاثیری ندارد.
- -mtune=cpu_type
- فقط
پارامترهای
زمانبندی
دستورالعمل
را برای نوع
ماشین cpu_type
تنظیم
میکند.
مجموعه
دستورالعمل
تغییری
نمیکند.
زنجیره ابزارهای بومی همچنین از مقدار native پشتیبانی میکنند که بهترین گزینه معماری را برای پردازنده میزبان انتخاب میکند. اگر GCC پردازنده را شناسایی نکند، -mtune=native هیچ تاثیری ندارد.
- -mmemory-latency=time
- میزان
تاخیری (latency)
را تنظیم
میکند که
زمانبند
باید برای
ارجاعات
معمول به
حافظه، از
دید برنامه
در نظر
بگیرد. این
عدد به شدت
به الگوهای
دسترسی به
حافظه مورد
استفاده
برنامه و
اندازه کَش
خارجی روی
ماشین
وابسته است.
گزینههای معتبر برای time عبارتند از:
گزینههای eBPF
- -mframe-limit=bytes
- حد سخت (hard limit) اندازه فریم را بر حسب بایت مشخص میکند. در حال حاضر، مقداری که میتوان مشخص کرد باید کمتر یا مساوی 32767 باشد. مقدار پیشفرض، هر محدودیتی است که توسط نسخه هدف هسته لینوکس اعمال میشود.
- -mbig-endian
- تولید کد برای یک مقصد big-endian.
- -mlittle-endian
- تولید کد برای یک مقصد little-endian. این پیشفرض است.
- -mjmpext
- -mno-jmpext
- تولید دستورالعملهای اضافی انشعاب شرطی را فعال یا غیرفعال میکند. برای پردازندههای v2 و بالاتر فعال است..IP -mjmp32 4
- -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
- فعالسازی یا غیرفعالسازی دستورالعملهای تقسیم علامتدار و باقیمانده. برای CPU نسخهٔ v4 و بالاتر فعال است.
- -msmov
- -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
- پشتیبانی از BPF Compile Once - Run Everywhere (CO-RE) را فعال میکند. به -gbtf نیاز دارد و توسط آن نیز بهطورضمنی فعال میشود.
- -mno-co-re
- پشتیبانی از BPF Compile Once - Run Everywhere (CO-RE) را غیرفعال میکند. پشتیبانی از BPF CO-RE هنگام تولید اطلاعات اشکالزدایی BTF برای هدف BPF، بهطور پیشفرض فعال است.
- -mxbpf
- کد را برای نسخهای گسترشیافته از BPF تولید میکند که برخی از محدودیتهای تحمیلشده توسط معماری BPF را کاهش میدهد:
- -<ذخیره و بازیابی ثباتهای callee-saved در ورود و>
- خروج تابع، بهترتیب.
- -masm=dialect
- دستورالعملهای
اسمبلی را
با استفاده
از dialect
انتخابشده
برای eBPF
خروجی
میدهد.
مقدار
پیشفرض pseudoc
است.
مقدارهای پشتیبانیشده برای dialect عبارتند از:
- -minline-memops-threshold=bytes
- آستانهٔ اندازهای را برحسب بایت مشخص میکند که در آن یا کمتر از آن، memmove، memcpy و memset همواره باید بهصورت درونخطی بسط داده شوند. عملیاتی که با اندازههای بزرگتر از این آستانه سروکار دارند باید بهجای بسط درونخطی با استفاده از یک فراخوانی کتابخانهای پیادهسازی شوند، اما از آنجا که BPF اجازهٔ فراخوانیهای کتابخانهای (libcalls) را نمیدهد، فراتر رفتن از این آستانه منجر به یک خطای زمان کامپایل خواهد شد. مقدار پیشفرض 1024 بایت است.
گزینههای FR30
این گزینهها بهطور خاص برای پورت FR30 تعریف شدهاند.
- -msmall-model
- استفاده از مدل فضای آدرس کوچک (small). این گزینه میتواند کد کوچکتری تولید کند، اما فرض را بر این میگذارد که تمام مقادیر نمادین و آدرسها در یک محدودهٔ ۲۰ بیتی جای میگیرند.
- -mno-lsim
- فرض را بر این میگذارد که پشتیبانی زمان اجرا فراهم شده است و بنابراین نیازی به گنجاندن کتابخانهٔ شبیهساز (libsim.a) در خط فرمان پیونددهنده نیست.
گزینههای FT32
این گزینهها بهطور خاص برای پورت FT32 تعریف شدهاند.
- -msim
- مشخص میکند که برنامه روی شبیهساز اجرا خواهد شد. این گزینه باعث پیوند داده شدن یک کتابخانه و راهانداز زمان اجرای جایگزین میشود. هنگام تولید برنامههایی که روی سختافزار واقعی اجرا خواهند شد، نباید از این گزینه استفاده کنید؛ باید کتابخانهٔ زمان اجرای خود را برای هر تابع ورودی/خروجی که مورد نیاز است فراهم کنید.
- -mlra
- کاری انجام نمیدهد. برای سازگاری رو به عقب حفظ شده است.
- -mnodiv
- از دستورالعملهای div و mod استفاده نکن.
- -mft32b
- استفاده از دستورالعملهای گسترشیافتهٔ پردازندهٔ FT32B را فعال میکند.
- -mcompress
- تمام کد را با استفاده از طرح فشردهسازی کد Ft32B فشرده میکند.
- -mnopm
- کدی تولید نکن که حافظهٔ برنامه را بخواند.
گزینههای FRV
- -mgpr-32
- تنها از ۳۲ ثبات همهمنظورهٔ نخست استفاده کن.
- -mgpr-64
- از تمام ۶۴ ثبات همهمنظوره استفاده کن.
- -mfpr-32
- تنها از ۳۲ ثبات ممیز شناور نخست استفاده کن.
- -mfpr-64
- از تمام ۶۴ ثبات ممیز شناور استفاده کن.
- -mhard-float
- برای عملیات ممیز شناور از دستورالعملهای سختافزاری استفاده کن.
- -msoft-float
- برای عملیات ممیز شناور از روتینهای کتابخانهای استفاده کن..IP -malloc-cc 4 تخصیص پویای ثباتهای کد وضعیت (condition code).
- -mfixed-cc
- تلاش نکردن برای تخصیص پویای ثباتهای کد وضعیت؛ فقط از "icc0" و "fcc0" استفاده شود.
- -mdword
- تغییر ABI برای استفاده از دستورالعملهای کلمه مضاعف (double word).
- -mno-dword
- عدم استفاده از دستورالعملهای کلمه مضاعف.
- -mdouble
- استفاده از دستورالعملهای ممیز شناور با دقت مضاعف (double).
- -mno-double
- عدم استفاده از دستورالعملهای ممیز شناور با دقت مضاعف.
- -mmedia
- استفاده از دستورالعملهای چندرسانهای (media).
- -mno-media
- عدم استفاده از دستورالعملهای چندرسانهای.
- -mmuladd
- استفاده از دستورالعملهای ضرب و جمع/تفریق.
- -mno-muladd
- عدم استفاده از دستورالعملهای ضرب و جمع/تفریق.
- -mfdpic
- انتخاب FDPIC ABI، که از توصیفکنندههای تابع (function descriptors) برای نمایش اشارهگرها به توابع استفاده میکند. بدون هیچیک از گزینههای مرتبط با PIC/PIE، این گزینه متضمن -fPIE است. با -fpic یا -fpie، فرض میکند ورودیهای GOT و دادههای کوچک درون محدوده ۱۲ بیتی از آدرس پایه GOT قرار دارند؛ با -fPIC یا -fPIE، آفستهای GOT بهصورت ۳۲ بیتی محاسبه میشوند. با هدف bfin-elf، این گزینه متضمن -msim است.
- -minline-plt
- فعالسازی درونخطیسازی (inlining) مدخلهای PLT در فراخوانی توابعی که مشخص نیست اتصال محلی (bind locally) دارند یا خیر. این گزینه بدون -mfdpic هیچ تأثیری ندارد. در صورت بهینهسازی برای سرعت و کامپایل برای کتابخانههای اشتراکی (یعنی -fPIC یا -fpic)، یا هنگامی که گزینه بهینهسازی مانند -O3 یا بالاتر در خط فرمان مشخص شده باشد، بهطور پیشفرض فعال است.
- -mTLS
- فرض کردن یک قطعه بزرگ TLS هنگام تولید کد محلی رشته (thread-local).
- -mtls
- فرض نکردن یک قطعه بزرگ TLS هنگام تولید کد محلی رشته.
- -mgprel-ro
- فعالسازی استفاده از بازنشانیهای "GPREL" در FDPIC ABI برای دادههایی که مشخص است در بخشهای فقطخواندنی قرار دارند. این گزینه بهطور پیشفرض فعال است، بهجز برای -fpic یا -fpie: هرچند ممکن است به کوچکتر شدن جدول آفست سراسری کمک کند، اما ۱ دستورالعمل را با ۴ دستورالعمل معاوضه میکند. با -fPIC یا -fPIE، ۳ دستورالعمل با ۴ دستورالعمل معاوضه میشود که یکی از آنها میتواند میان چندین نماد به اشتراک گذاشته شود، و همچنین از نیاز به یک مدخل GOT برای نماد ارجاعشده جلوگیری میکند؛ بنابراین احتمال سودمند بودن آن بیشتر است. در غیر این صورت، میتوان از -mno-gprel-ro برای غیرفعال کردن آن استفاده کرد.
- -multilib-library-pic
- پیوند دادن با کتابخانههای pic (کتابخانه، و نه FD). این گزینه توسط -mlibrary-pic، و همچنین توسط -fPIC و -fpic بدون -mfdpic بهطور ضمنی فعال میشود. هرگز نباید نیازی به استفاده صریح از آن داشته باشید.
- -mlinked-fp
- پیروی از الزام EABI مبنی بر ایجاد همیشگی یک اشارهگر فریم هر زمان که یک فریم پشته تخصیص مییابد. این گزینه بهطور پیشفرض فعال است و میتواند با -mno-linked-fp غیرفعال شود.
- -mlong-calls
- استفاده از آدرسدهی غیرمستقیم برای فراخوانی توابع خارج از واحد کامپایل فعلی. این کار اجازه میدهد توابع در هر کجای فضای آدرس ۳۲ بیتی قرار گیرند.
- -malign-labels
- تلاش برای تراز کردن برچسبها روی یک مرز ۸ بایتی با درج NOPها در بسته قبلی. این گزینه تنها زمانی تأثیر دارد که بستهبندی VLIW فعال باشد. این گزینه بسته جدیدی ایجاد نمیکند؛ صرفاً NOPها را به بستههای موجود اضافه میکند.
- -mlibrary-pic
- تولید کد مستقل از موقعیت (position-independent) برای EABI.
- -macc-4
- استفاده تنها از چهار ثبات اول انباره چندرسانهای (media accumulator).
- -macc-8
- استفاده از تمام هشت ثبات انباره چندرسانهای.
- -mpack
- بستهبندی دستورالعملهای VLIW.
- -mno-pack
- عدم بستهبندی دستورالعملهای VLIW.
- -mno-eflags
- علامتگذاری نکردن سوئیچهای ABI در e_flags.
- -mcond-move
- فعالسازی
استفاده از
دستورالعملهای
انتقال
شرطی
(پیشفرض).
این سوئیچ عمدتاً برای اشکالزدایی کامپایلر است و احتمالاً در نسخههای آینده حذف خواهد شد.
- -mno-cond-move
- غیرفعالسازی
استفاده از
دستورالعملهای
انتقال
شرطی.
این سوئیچ عمدتاً برای اشکالزدایی کامپایلر است و احتمالاً در نسخههای آینده حذف خواهد شد.
- -mscc
- فعالسازی
استفاده از
دستورالعملهای
مقداردهی
شرطی
(پیشفرض).
این سوئیچ عمدتاً برای اشکالزدایی کامپایلر است و احتمالاً در نسخههای آینده حذف خواهد شد.
- -mno-scc
- غیرفعالسازی
استفاده از
دستورالعملهای
مقداردهی
شرطی.
این سوئیچ عمدتاً برای اشکالزدایی کامپایلر است و احتمالاً در نسخههای آینده حذف خواهد شد.
- -mcond-exec
- فعالسازی
استفاده از
اجرای شرطی
(پیشفرض).
این سوئیچ عمدتاً برای اشکالزدایی کامپایلر است و احتمالاً در نسخههای آینده حذف خواهد شد.
- -mno-cond-exec
- غیرفعالسازی
استفاده از
اجرای شرطی.
این سوئیچ عمدتاً برای اشکالزدایی کامپایلر است و احتمالاً در نسخههای آینده حذف خواهد شد.
- -mvliw-branch
- اجرای یک
مرحله برای
بستهبندی
پرشها
درون
دستورالعملهای
VLIW (پیشفرض).
این سوئیچ عمدتاً برای اشکالزدایی کامپایلر است و احتمالاً در نسخههای آینده حذف خواهد شد.
- -mno-vliw-branch
- عدم اجرای
مرحله برای
بستهبندی
پرشها
درون
دستورالعملهای
VLIW.
این سوئیچ عمدتاً برای اشکالزدایی کامپایلر است و احتمالاً در نسخههای آینده حذف خواهد شد.
- -mmulti-cond-exec
- فعالسازی
بهینهسازی
"&&" و
"||" در
اجرای شرطی
(پیشفرض).
این سوئیچ عمدتاً برای اشکالزدایی کامپایلر است و احتمالاً در نسخههای آینده حذف خواهد شد.
- -mno-multi-cond-exec
- غیرفعالسازی
بهینهسازی
"&&" و
"||" در
اجرای شرطی.
این سوئیچ عمدتاً برای اشکالزدایی کامپایلر است و احتمالاً در نسخههای آینده حذف خواهد شد.
- -mnested-cond-exec
- فعالسازی
بهینهسازیهای
اجرای شرطی
تودرتو
(پیشفرض).
این سوئیچ عمدتاً برای اشکالزدایی کامپایلر است و احتمالاً در نسخههای آینده حذف خواهد شد.
- -mno-nested-cond-exec
- غیرفعالسازی
بهینهسازیهای
اجرای شرطی
تودرتو.
این سوئیچ عمدتاً برای اشکالزدایی کامپایلر است و احتمالاً در نسخههای آینده حذف خواهد شد.
- -moptimize-membar
- این سوئیچ دستورالعملهای زائد "membar" را از کد تولیدشده توسط کامپایلر حذف میکند. این گزینه بهطور پیشفرض فعال است.
- -mno-optimize-membar
- این سوئیچ حذف خودکار دستورالعملهای زائد "membar" را از کد تولیدشده غیرفعال میکند.
- -mtomcat-stats
- باعث میشود gas آمار مربوط به tomcat را چاپ کند.
- -mcpu=cpu
- انتخاب نوع پردازندهای که کد برای آن تولید میشود. مقادیر ممکن عبارتند از: frv، fr550، tomcat، fr500، fr450، fr405، fr400، fr300 و simple.
گزینههای GNU/Linux
این گزینههای -m برای اهداف GNU/Linux تعریف شدهاند:
- -mglibc
- استفاده از کتابخانه GNU C. این گزینه پیشفرض است، مگر در اهداف *-*-linux-*uclibc*، *-*-linux-*musl* و *-*-linux-*android*..IP -muclibc 4 استفاده از کتابخانهٔ سی uClibc. این گزینه در هدفهای *-*-linux-*uclibc* پیشفرض است.
- -mmusl
- استفاده از کتابخانهٔ سی musl. این گزینه در هدفهای *-*-linux-*musl* پیشفرض است.
- -mbionic
- استفاده از کتابخانهٔ سی Bionic. این گزینه در هدفهای *-*-linux-*android* پیشفرض است.
- -mandroid
- کامپایل کد
سازگار با
پلتفرم Android.
این گزینه
در هدفهای
*-*-linux-*android*
پیشفرض
است.
هنگام کامپایل، این گزینه بهطور پیشفرض گزینههای -mbionic، -fPIC، -fno-exceptions و -fno-rtti را فعال میکند. هنگام پیوند زدن، این گزینه باعث میشود راهانداز GCC گزینههای مخصوص به Android را به پیونددهنده ارسال کند. در نهایت، این گزینه باعث تعریف شدن ماکروی پیشپردازندهٔ "__ANDROID__" میشود.
- -tno-android-cc
- غیرفعال کردن اثرات کامپایلیِ -mandroid، یعنی عدم فعالسازی -mbionic، -fPIC، -fno-exceptions و -fno-rtti بهصورت پیشفرض.
- -tno-android-ld
- غیرفعال کردن اثرات پیوند زدنِ -mandroid، یعنی ارسال گزینههای استاندارد پیوند زدن لینوکس به پیونددهنده.
گزینههای H8/300
این گزینههای -m برای پیادهسازیهای H8/300 تعریف شدهاند:
- -mrelax
- کوتاه کردن برخی از ارجاعات آدرس در زمان پیوند، در صورت امکان؛ از گزینهٔ پیونددهندهٔ -relax استفاده میکند.
- -mh
- تولید کد برای H8/300H.
- -ms
- تولید کد برای H8S.
- -mn
- تولید کد برای H8S و H8/300H در حالت عادی (normal mode). این سوییچ باید همراه با -mh یا -ms استفاده شود.
- -ms2600
- تولید کد برای H8S/2600. این سوییچ باید با -ms استفاده شود.
- -mexr
- ثباتهای گسترشیافته (extended registers) قبل از اجرای تابعی با صفت monitor روی پشته ذخیره میشوند. گزینهٔ پیشفرض -mexr است. این گزینه فقط برای هدفهای H8S معتبر است.
- -mno-exr
- ثباتهای گسترشیافته قبل از اجرای تابعی با صفت monitor روی پشته ذخیره نمیشوند. گزینهٔ پیشفرض -mno-exr است. این گزینه فقط برای هدفهای H8S معتبر است.
- -mint32
- تبدیل دادههای "int" به ۳۲ بیتی بهطور پیشفرض.
- -malign-300
- در H8/300H و H8S، استفاده از همان قواعد ترازسازی H8/300. حالت پیشفرض برای H8/300H و H8S تراز کردن مقادیر long و float روی مرزهای ۴ بایتی است. -malign-300 باعث تراز شدن آنها روی مرزهای ۲ بایتی میشود. این گزینه هیچ اثری بر H8/300 ندارد.
گزینههای HPPA
این گزینههای -m برای خانوادهٔ رایانههای HPPA تعریف شدهاند:
- -march=architecture-type
- تولید کد برای معماری مشخصشده. گزینههای انتخابی برای architecture-type عبارتند از 1.0 برای PA 1.0، مقدار 1.1 برای PA 1.1، و 2.0 برای پردازندههای PA 2.0. برای تعیین گزینهٔ معماری مناسب سامانهٔ خود، به /usr/lib/sched.models در سامانهٔ HP-UX مراجعه کنید. کدهای کامپایلشده برای معماریهای با شمارهٔ پایینتر، بر روی معماریهای با شمارهٔ بالاتر اجرا میشوند، اما برعکس آن امکانپذیر نیست.
- -mpa-risc-1-0
- -mpa-risc-1-1
- -mpa-risc-2-0
- بهترتیب مترادفهایی برای -march=1.0، -march=1.1 و -march=2.0 هستند.
- -matomic-libcalls
- تولید libcallها
برای
بارگذاریها
و
ذخیرهسازیهای
اتمیک در
زمانی که sync libcalls
غیرفعال
باشند. این
گزینه
بهطور
پیشفرض
فعال است.
این گزینه
فقط بر
تولید libcallهای
اتمیک توسط
بکاند HPPA
اثر
میگذارد.
هر دو پیادهسازیِ libcall مربوط به sync و libatomic از قفلگذاری استفاده میکنند. در نتیجه، ذخیرهسازیهای پردازنده نسبت به سایر عملیات اتمیک، اتمیک نیستند. بارگذاریهای پردازنده تا حالت DImode نسبت به سایر عملیات اتمیک، اتمیک هستند به شرط آنکه بهصورت یک دسترسی یکتا پیادهسازی شده باشند.
معماری PA-RISC به جز دستورالعمل "ldcw" از هیچ عملیات اتمیکی در سختافزار پشتیبانی نمیکند. بنابراین، تمام پشتیبانی اتمیک با استفاده از libcallهای sync و اتمیک پیادهسازی میشود. پشتیبانی از libcallهای sync در libgcc.a و پشتیبانی از libcallهای اتمیک در libatomic قرار دارد.
این گزینه فراخوانیهای "__atomic_exchange" را برای ذخیرهسازیهای اتمیک تولید میکند. همچنین مدیریت ویژهای برای دسترسیهای اتمیک DImode در هدفهای ۳۲ بیتی فراهم میسازد.
- -mbig-switch
- کاری انجام نمیدهد. برای سازگاری با گذشته حفظ شده است.
- -mcaller-copies
- فراخواننده (caller) آرگومانهای تابعی را که با ارجاع پنهان ارسال شدهاند، کپی میکند. این گزینه باید با احتیاط استفاده شود چرا که با زماناجرای پیشفرض ۳۲ بیتی سازگار نیست. با این حال، فقط دادههای تجمیعی (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
- تولید کدی که با محدودهٔ ثبات دادهشده به عنوان ثباتهای ثابت برخورد میکند. ثبات ثابت، ثباتی است که تخصیصدهندهٔ ثبات (register allocator) نمیتواند از آن استفاده کند. این گزینه هنگام کامپایل کد هسته کاربرد دارد. محدودهٔ ثبات بهصورت دو ثبات که با یک خط تیره جدا شدهاند مشخص میشود. میتوان چندین محدودهٔ ثبات را با استفاده از ویرگول جدا کرد.
- -mgas
- فعالسازی استفاده از دستورالعملهای اسمبلری که فقط GAS آنها را درک میکند.
- -mgnu-ld
- استفاده از گزینههای مخصوص به GNU ld. این گزینه هنگام ساخت یک کتابخانهٔ اشتراکی، -shared را به ld ارسال میکند. زمانی که GCC بهطور صریح یا ضمنی با پیونددهندهٔ GNU پیکربندی شده باشد، این رفتار پیشفرض است. این گزینه بر اینکه کدام ld فراخوانی شود تأثیری ندارد؛ بلکه فقط پارامترهایی را که به آن ld ارسال میشود تغییر میدهد. پیونددهندهای که فراخوانی میشود توسط گزینهٔ پیکربندی --with-ld، مسیر جستجوی برنامههای GCC، و در نهایت با PATH کاربر مشخص میشود. پیونددهندهٔ مورداستفاده توسط GCC را میتوان با استفاده از which `gcc -print-prog-name=ld` نمایش داد. این گزینه تنها در GCC نسخهٔ ۶۴ بیتی HP-UX در دسترس است، یعنی زمانی که با hppa*64*-*-hpux* پیکربندی شده باشد.
- -mhp-ld
- استفاده از گزینههای مخصوص به HP ld. این گزینه هنگام ساخت یک کتابخانهٔ اشتراکی -b را به ld ارسال میکند و در تمامی پیوندها +Accept TypeMismatch را به ld میفرستد. زمانی که GCC بهطور صریح یا ضمنی با پیونددهندهٔ HP پیکربندی شده باشد، این رفتار پیشفرض است. این گزینه بر اینکه کدام ld فراخوانی شود تأثیری ندارد؛ فقط پارامترهای ارسالی به آن ld را تغییر میدهد. پیونددهندهای که فراخوانی میشود توسط گزینهٔ پیکربندی --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 sequences)
استفاده
میکند. این
تضمین
میکند که
یک
فراخوانی
همیشه
بتواند به
stubهای
تولیدشده
توسط
پیونددهنده
دسترسی
یابد. حالت
پیشفرض
تولید
فراخوانیهای
دور تنها
زمانی است
که فاصلهٔ
محل
فراخوانی
تا آغاز
تابع یا
واحد ترجمه
(بسته به
مورد)، از
حد از
پیشتعیینشده
توسط نوع
انشعاب
مورداستفاده
فراتر رود.
محدودیتها
برای
فراخوانیهای
عادی به
ترتیب
۷،۶۰۰،۰۰۰
و ۲۴۰،۰۰۰
بایت برای
معماریهای
PA 2.0 و PA 1.X هستند.
فراخوانیهای
دمبَر (sibcalls)
همواره به
۲۴۰،۰۰۰
بایت
محدودند.
هنگام استفاده از گزینهٔ -ffunction-sections، یا هنگام استفاده از گزینههای -mgas و -mno-portable-runtime همراه با یکدیگر تحت HP-UX با پیونددهندهٔ SOM، فواصل از آغاز توابع اندازهگیری میشوند.
معمولاً استفاده از این گزینه مطلوب نیست زیرا کارایی را کاهش میدهد. با این حال، ممکن است در برنامههای بزرگ، بهویژه زمانی که از پیوند جزئی (partial linking) برای ساخت برنامه استفاده میشود، مفید باشد.
انواع فراخوانیهای دورِ مورداستفاده به توانمندیهای اسمبلر و پیونددهنده، و نوع کدی که تولید میشود بستگی دارد. تأثیر این گزینه در سامانههایی که از فراخوانیهای مطلق دور و تفاضل نمادین دور در کد pic یا فراخوانیهای وابسته به pc (بهصورت pc-relative) پشتیبانی میکنند باید نسبتاً اندک باشد. با این حال، در سامانههای ELF ۳۲ بیتی در کدهای pic از فراخوانی غیرمستقیم استفاده میشود که بسیار طولانی است..IP -mlong-load-store 4 تولید توالیهای بارگذاری و ذخیرهسازی ۳-دستورالعملی، همانطور که گاهی توسط پیونددهنده HP-UX 10 مورد نیاز است. این معادل گزینه +k در کامپایلرهای HP است.
- -mjump-in-delay
- این گزینه نادیده گرفته میشود و صرفاً برای اهداف سازگاری ارائه شده است.
- -mno-space-regs
- تولید کدی
که فرض
میکند هدف
فاقد
ثباتهای
فضایی (space registers)
است. این به GCC
اجازه
میدهد تا
فراخوانیهای
غیرمستقیم
سریعتری
تولید کرده
و از
حالتهای
آدرسدهی
نمایهای
بدون مقیاس
استفاده
کند.
چنین کدی برای کرنلها و سیستمهای PA سطح ۰ مناسب است.
- -mordered
- فرض میکند که مراجعات به حافظه مرتب (ordered) هستند و نیازی به موانع (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
- تولید پیشتعریف "_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
- تولید
پیشتعریفهای
کامپایلر و
انتخاب یک
startfile برای
استاندارد
مشخصشده 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"، و startfile با نام unix95.o را فراهم میکند. گزینه -munix=98 پیشتعریفهای اضافهای برای "_XOPEN_UNIX"، "_XOPEN_SOURCE_EXTENDED"، "_INCLUDE__STDC_A1_SOURCE" و "_INCLUDE_XOPEN_SOURCE_500"، و startfile با نام unix98.o را فراهم میکند.
توجه به این نکته مهم است که این گزینه رابطهای روتینهای مختلف کتابخانهای را تغییر میدهد. همچنین بر رفتار عملیاتی کتابخانه C تأثیر میگذارد. بنابراین در استفاده از این گزینه، مراقبت بسیار زیادی لازم است.
کد کتابخانهای که قصد کار با بیش از یک استاندارد UNIX را دارد، باید متغیر "__xpg4_extended_mask" را بر حسب مورد آزمایش، مقداردهی و بازیابی کند. اغلب نرمافزارهای GNU این قابلیت را ارائه نمیدهند.
- -nolibdld
- جلوگیری از تولید گزینههای پیوند برای جستجوی libdld.sl هنگامی که گزینه -static در HP-UX 10 و بالاتر مشخص شده باشد.
- -static
- پیادهسازی
setlocale در libc سیستم
HP-UX به libdld.sl
وابستگی
دارد. نسخه
آرشیوی از
libdld.sl وجود
ندارد.
بنابراین،
هنگامی که
گزینه -static
مشخص
میشود، به
گزینههای
پیوند
ویژهای
برای حل این
وابستگی
نیاز است.
در HP-UX 10 و بالاتر، درایور GCC در صورت مشخص شدن گزینه -static، گزینههای لازم را برای پیوند با libdld.sl اضافه میکند. این باعث میشود که باینری حاصل پویا باشد. در پورت ۶۴-بیتی، پیونددهندهها در هر حال بهطور پیشفرض باینریهای پویا تولید میکنند. میتوان از گزینه -nolibdld برای جلوگیری از اضافه کردن این گزینههای پیوند توسط درایور GCC استفاده کرد.
- -threads
- افزودن پشتیبانی از چندریسمانی با کتابخانه dce thread تحت HP-UX. این گزینه پرچمهایی را برای هر دو بخش پیشپردازنده و پیونددهنده تنظیم میکند.
گزینههای IA-64
اینها گزینههای -m هستند که برای معماری Intel IA-64 تعریف شدهاند.
- -mbig-endian
- تولید کد برای یک هدف big-endian (بزرگپایان). این حالت پیشفرض برای HP-UX است.
- -mlittle-endian
- تولید کد برای یک هدف little-endian (کوچکپایان). این حالت پیشفرض برای AIX5 و GNU/Linux است.
- -mgnu-as
- -mno-gnu-as
- تولید (یا عدم تولید) کد برای اسمبلر GNU. این حالت پیشفرض است.
- -mgnu-ld
- -mno-gnu-ld
- تولید (یا عدم تولید) کد برای پیونددهنده GNU. این حالت پیشفرض است.
- -mno-pic
- تولید کدی که از ثبات اشارهگر سراسری استفاده نمیکند. نتیجه، یک کد مستقل از موقعیت نیست و ABI مربوط به IA-64 را نقض میکند.
- -mvolatile-asm-stop
- -mno-volatile-asm-stop
- تولید (یا عدم تولید) یک بیت توقف (stop bit) بلافاصله پیش و پس از عبارات asm فرّار (volatile).
- -mregister-names
- -mno-register-names
- تولید (یا عدم تولید) نامهای ثبات in، loc و out برای ثباتهای پشتهای (stacked registers). این کار ممکن است خوانایی خروجی اسمبلر را افزایش دهد.
- -mno-sdata
- -msdata
- غیرفعالسازی (یا فعالسازی) بهینهسازیهایی که از بخش دادههای کوچک (small data section) استفاده میکنند. این ممکن است برای دور زدن اشکالات بهینهساز مفید باشد.
- -mconstant-gp
- تولید کدی که از یک مقدار ثابت تکی برای اشارهگر سراسری استفاده میکند. این گزینه هنگام کامپایل کردن کد هسته (kernel) مفید است.
- -mauto-pic
- تولید کدی که خودجابهجاپذیر (self-relocatable) باشد. این گزینه مستلزم -mconstant-gp است. این مورد هنگام کامپایل کد سفتافزار (firmware) مفید است.
- -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
- برای "sqrt" کد درونخطی تولید نشود.
- -mfused-madd
- -mno-fused-madd
- تولید (یا عدم تولید) کدی که از دستورالعملهای ادغامشده ضرب/جمع یا ضرب/تفریق استفاده میکند. حالت پیشفرض استفاده از این دستورالعملها است..IP -mno-dwarf2-asm 4
- -mdwarf2-asm
- کد اسمبلی برای اطلاعات اشکالزدایی شماره خط DWARF تولید نمیکند (یا میکند). این گزینه ممکن است هنگام عدم استفاده از اسمبلر GNU سودمند باشد.
- -mearly-stop-bits
- -mno-early-stop-bits
- اجازه میدهد بیتهای توقف (stop bits) زودتر از موقعیت بلافاصله پیش از دستورالعملی که بیت توقف را ایجاد کرده است قرار گیرند. این کار میتواند زمانبندی دستورالعملها را بهبود بخشد، اما همیشه اینگونه نیست.
- -mfixed-range=register-range
- کدی تولید میکند که با محدوده ثباتهای ارائهشده مانند ثباتهای ثابت (fixed registers) رفتار میکند. ثبات ثابت ثباتی است که تخصیصدهنده ثبات نمیتواند از آن استفاده کند. این گزینه هنگام کامپایل کد هسته کاربرد دارد. محدوده ثبات با دو ثبات که با یک خط تیره از هم جدا شدهاند مشخص میشود. میتوان چندین محدوده ثبات را با ویرگول جدا کرده و تعیین نمود.
- -mtls-size=tls-size
- اندازه بیتی آفستهای بیدرنگ (immediate) مربوط به TLS را مشخص میکند. مقادیر معتبر 14، 22 و 64 هستند.
- -mtune=cpu-type
- زمانبندی دستورالعملها را برای یک پردازنده خاص تنظیم میکند. مقادیر معتبر عبارتند از: itanium، itanium1، merced، itanium2 و mckinley.
- -milp32
- -mlp64
- تولید کد برای یک محیط 32 بیتی یا 64 بیتی. محیط 32 بیتی مقادیر int، long و اشارهگرها را روی 32 بیت تنظیم میکند. محیط 64 بیتی مقدار int را روی 32 بیت و long و اشارهگرها را روی 64 بیت تنظیم میکند. این پرچمها مخصوص HP-UX هستند.
- -mno-sched-br-data-spec
- -msched-br-data-spec
- (غیرفعال/فعال) کردن زمانبندی حدسی دادهها پیش از reload. این امر منجر به تولید دستورالعملهای "ld.a" و دستورالعملهای بررسی متناظر ("ld.c" / "chk.a") میشود. تنظیم پیشفرض غیرفعال است.
- -msched-ar-data-spec
- -mno-sched-ar-data-spec
- (فعال/غیرفعال) کردن زمانبندی حدسی دادهها پس از reload. این امر منجر به تولید دستورالعملهای "ld.a" و دستورالعملهای بررسی متناظر ("ld.c" / "chk.a") میشود. تنظیم پیشفرض فعال است.
- -mno-sched-control-spec
- -msched-control-spec
- (غیرفعال/فعال) کردن زمانبندی حدسی کنترلی. این ویژگی تنها در طول زمانبندی ناحیه (یعنی پیش از reload) در دسترس است. این امر منجر به تولید دستورالعملهای "ld.s" و دستورالعملهای بررسی متناظر "chk.s" میشود. تنظیم پیشفرض غیرفعال است.
- -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-prefer-non-data-spec-insns
- -msched-prefer-non-data-spec-insns
- در صورت فعال بودن، دستورالعملهای حدسی داده تنها زمانی برای زمانبندی انتخاب میشوند که در آن لحظه گزینه دیگری وجود نداشته باشد. این کار استفاده از حدس داده را بسیار محتاطانهتر میکند. تنظیم پیشفرض غیرفعال است.
- -mno-sched-prefer-non-control-spec-insns
- -msched-prefer-non-control-spec-insns
- در صورت فعال بودن، دستورالعملهای حدسی کنترلی تنها زمانی برای زمانبندی انتخاب میشوند که در آن لحظه گزینه دیگری وجود نداشته باشد. این کار استفاده از حدس کنترلی را بسیار محتاطانهتر میکند. تنظیم پیشفرض غیرفعال است.
- -mno-sched-count-spec-in-critical-path
- -msched-count-spec-in-critical-path
- در صورت فعال بودن، وابستگیهای حدسی هنگام محاسبه اولویتهای دستورالعملها در نظر گرفته میشوند. این کار استفاده از حدس را کمی محتاطانهتر میکند. تنظیم پیشفرض غیرفعال است.
- -msched-spec-ldc
- استفاده از یک بررسی ساده برای حدس داده. این گزینه بهطور پیشفرض فعال است.
- -msched-control-spec-ldc
- استفاده از یک بررسی ساده برای حدس کنترلی. این گزینه بهطور پیشفرض فعال است.
- -msched-stop-bits-after-every-cycle
- قرار دادن یک بیت توقف پس از هر چرخه در زمانبندی. این گزینه بهطور پیشفرض فعال است.
- -msched-fp-mem-deps-zero-cost
- فرض میکند که بارگذاریها و ذخیرهسازیهای ممیز شناور در صورت قرارگیری در یک گروه دستورالعمل، احتمالاً باعث ایجاد تداخل نمیشوند. این گزینه بهطور پیشفرض غیرفعال است.
- -msel-sched-dont-check-control-spec
- تولید بررسیها برای حدس کنترلی در زمانبندی انتخابی. این پرچم بهطور پیشفرض غیرفعال است.
- -msched-max-memory-insns=max-insns
- ایجاد محدودیت بر تعداد دستورهای حافظه در هر گروه دستورالعمل، با تخصیص اولویت کمتر به دستورهای حافظه بعدی که سعی در زمانبندی در همان گروه دستورالعمل را دارند. اغلب برای جلوگیری از تداخلهای بانک کش سودمند است. مقدار پیشفرض 1 است.
- -msched-max-memory-insns-hard-limit
- محدودیت مشخصشده توسط msched-max-memory-insns را به یک محدودیت سخت (hard limit) تبدیل میکند و اجازه وجود بیش از آن تعداد را در یک گروه دستورالعمل نمیدهد. در غیر این صورت، محدودیت «نرم» خواهد بود؛ بدین معنا که با رسیدن به حد نصاب، عملیاتهای غیرحافظهای ترجیح داده میشوند اما عملیاتهای حافظه نیز همچنان ممکن است زمانبندی شوند.
گزینههای LM32
این گزینههای -m برای معماری LatticeMico32 تعریف شدهاند:
- -mbarrel-shift-enabled
- فعالسازی دستورالعملهای جابجایی بشکهای (barrel-shift).
- -mdivide-enabled
- فعالسازی دستورالعملهای تقسیم و باقیمانده.
- -mmultiply-enabled
- فعالسازی دستورالعملهای ضرب.
- -msign-extend-enabled
- فعالسازی دستورالعملهای گسترش علامت (sign extend).
- -muser-enabled
- فعالسازی دستورالعملهای تعریفشده توسط کاربر.
گزینههای LoongArch
این گزینههای خط فرمان برای مقصدهای LoongArch تعریف شدهاند:
- -march=arch-type
- تولید
دستورالعملها
برای نوع
ماشین arch-type.
-march=arch-type به GCC
اجازه
میدهد کدی
تولید کند
که ممکن است
روی
پردازندههایی
غیر از
پردازنده
مشخصشده
اصلاً اجرا
نشود.
گزینههای موجود برای arch-type عبارتند از:
- native
- نوع پردازنده محلی تشخیص دادهشده توسط کامپایلر محلی..IP loongarch64 4 پردازنده عمومی ۶۴ بیتی LoongArch.
- la464
- پردازنده مبتنی بر LA464 در LoongArch به همراه LSX و LASX.
- la664
- پردازنده مبتنی بر LA664 در LoongArch به همراه LSX، LASX و تمامی دستورالعملهای LoongArch v1.1.
- la64v1.0
- نسخه ۱.۰ معماری مجموعه دستورالعمل (ISA) LoongArch64.
- la64v1.1
- نسخه ۱.۱ معماری مجموعه دستورالعمل (ISA) LoongArch64.
اطلاعات بیشتر درباره نسخههای ISA معماری LoongArch را میتوانید در https://github.com/loongson/la-toolchain-conventions بیابید.
- -mtune=tune-type
- بهینهسازی
کد
تولیدشده
برای
پردازنده
هدف
مشخصشده.
گزینهها برای tune-type عبارتند از:
- native
- نوع پردازنده محلی شناساییشده توسط کامپایلر محلی (native).
- generic
- پردازنده عمومی LoongArch.
- loongarch64
- پردازنده عمومی ۶۴ بیتی LoongArch.
- la464
- هسته LA464 در LoongArch.
- la664
- هسته LA664 در 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 است.
- -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 برابر 1024 است..IP -mcmodel=code-model 4 تنظیم مدل کد روی یکی از موارد زیر:
- tiny-static (هنوز پیادهسازی نشده است)
- tiny (هنوز پیادهسازی نشده است)
- normal
- بخش کد (text segment) باید در فضای آدرسدهی ۱۲۸ مگابایتی باشد. بخش داده (data segment) باید در فضای آدرسدهی ۲ گیگابایتی باشد.
- medium
- بخش کد و بخش داده هر دو باید در فضای آدرسدهی ۲ گیگابایتی باشند.
- large (هنوز پیادهسازی نشده است)
- extreme
- این حالت اندازهٔ بخش کد و بخش داده را محدود نمیکند. گزینهٔ -mcmodel=extreme با -fplt و/یا -mexplicit-relocs=none ناسازگار است.
مدل کد پیشفرض "normal" است.
- -mexplicit-relocs=style
- تعیین زمان استفاده از عملگرهای بازنشانی (relocation) اسمبلی هنگام مواجهه با آدرسهای نمادین. روش جایگزین، استفاده از ماکروهای اسمبلی به جای آن است که ممکن است زمانبندی دستورالعملها را محدود کند اما امکان آسانسازی پیونددهنده (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 جهت سازگاری با نسخههای پیشین.
- -mdirect-extern-access
- -mno-direct-extern-access
- عدم
استفاده یا
استفاده از
GOT برای
دسترسی به
نمادهای
خارجی (external symbols).
حالت
پیشفرض
-mno-direct-extern-access است: GOT
برای
نمادهای
خارجی با
نمایانی (visibility)
پیشفرض
استفاده
میشود،
اما برای
سایر
نمادهای
خارجی
استفاده
نمیشود.
با -mdirect-extern-access، از GOT استفاده نمیشود و تمام نمادهای خارجی بهصورت نسبی نسبت به PC (بهصورت PC-relative) آدرسدهی میشوند. این گزینه تنها برای محیطهایی مناسب است که در آنها هیچ پیوند پویایی انجام نمیگیرد، مانند میانافزارها (firmware)، هستههای سیستمعامل، و فایلهای اجرایی پیوند دادهشده با -static یا -static-pie. گزینهٔ -mdirect-extern-access با -fPIC یا -fpic ناسازگار است.
- -mrelax
- -mno-relax
- بهرهگیری از (عدم بهرهگیری از) آسانسازیهای پیونددهنده (linker relaxations). اگر -mpass-mrelax-to-as فعال باشد، این گزینه به اسمبلر نیز ارسال میشود. حالت پیشفرض در هنگام ساخت GCC با تشخیص پشتیبانی متناظر در اسمبلر تعیین میشود: -mrelax اگر اسمبلر هم از گزینهٔ -mrelax و هم از آسانسازی انشعاب شرطی (conditional branch relaxation) پشتیبانی کند (این قابلیت الزامی است، در غیر این صورت ممکن است دستورالعملهای ".align" و دستورات انشعاب شرطی در کد اسمبلی تولیدشده توسط GCC به دلیل سرریز بازنشانی توسط اسمبلر رد شوند)، و در غیر این صورت -mno-relax.
- -mpass-mrelax-to-as
- -mno-pass-mrelax-to-as
- ارسال کردن (ارسال نکردن) گزینهٔ -mrelax یا -mno-relax به اسمبلر. حالت پیشفرض در هنگام ساخت GCC با بررسی پشتیبانی متناظر در اسمبلر مشخص میشود: -mpass-mrelax-to-as اگر اسمبلر از گزینهٔ -mrelax پشتیبانی کند، و در غیر این صورت -mno-pass-mrelax-to-as. این گزینه بیشتر برای اشکالزدایی یا سازگاری با اسمبلرهایی غیر از اسمبلر زمان ساخت مفید است.
- -mrecip
- این گزینه استفاده از دستورالعملهای برآورد معکوس (reciprocal estimate) و برآورد ریشهٔ دوم معکوس را همراه با گامهای تکمیلی نیوتن-رافسون برای افزایش دقت، به جای انجام تقسیم یا ریشهٔ دوم و تقسیم برای آرگومانهای ممیز شناور فعال میکند. این دستورالعملها تنها زمانی تولید میشوند که -funsafe-math-optimizations همراه با -ffinite-math-only و -fno-trapping-math فعال شده باشد. این گزینه بهطور پیشفرض غیرفعال است. پیش از استفاده از این گزینه، باید اطمینان حاصل کنید که پردازندهٔ مقصد از دستورالعملهای frecipe و frsqrte پشتیبانی میکند. توجه داشته باشید که اگرچه توان عملیاتی (throughput) این توالی بالاتر از توان عملیاتی دستورالعملهای غیرمعکوس است، اما دقت توالی میتواند تا ۲ ulp کاهش یابد (بهعنوان مثال، معکوس 1.0 برابر با 0.99999994 میشود).
- -mrecip=opt
- این گزینه مشخص میکند کدام دستورالعملهای برآورد معکوس مجاز به استفاده هستند. opt فهرستی از گزینههاست که با کاما از هم جدا شدهاند، و میتواند با یک ! برای نقیض کردن هر گزینه همراه شود:
- all
- فعالسازی تمام دستورالعملهای برآورد.
- default
- فعالسازی دستورالعملهای پیشفرض، معادل -mrecip.
- none
- غیرفعالسازی تمام دستورالعملهای برآورد، معادل -mno-recip.
- div
- فعالسازی تقریب برای تقسیم اسکالر (scalar).
- vec-div
- فعالسازی تقریب برای تقسیم برداری (vectorized).
- sqrt
- فعالسازی تقریب برای ریشهٔ دوم اسکالر.
- vec-sqrt
- فعالسازی تقریب برای ریشهٔ دوم برداری.
- rsqrt
- فعالسازی تقریب برای ریشهٔ دوم معکوس اسکالر.
- vec-rsqrt
- فعالسازی تقریب برای ریشهٔ دوم معکوس برداری.
بنابراین برای مثال، گزینهٔ -mrecip=all,!sqrt تمام تقریبهای معکوس را به جز ریشهٔ دوم اسکالر فعال میکند.
- -mfrecipe
- -mno-frecipe
- استفاده از (عدم استفاده از) دستورالعملهای "frecipe.{s/d}" و "frsqrte.{s/d}". هنگام ساخت با -march=la664، این گزینه بهطور پیشفرض فعال است. حالت پیشفرض -mno-frecipe است.
- -mdiv32
- -mno-div32
- استفاده از (عدم استفاده از) دستورالعملهای "div.w[u]" و "mod.w[u]" در حالی که ورودی بسطیافته با علامت (sign-extended) نباشد. هنگام ساخت با -march=la664، این گزینه بهطور پیشفرض فعال است. حالت پیشفرض -mno-div32 است.
- -mlam-bh
- -mno-lam-bh
- استفاده از (عدم استفاده از) دستورالعملهای "am{swap/add}[_db].{b/h}". هنگام ساخت با -march=la664، این گزینه بهطور پیشفرض فعال است. حالت پیشفرض -mno-lam-bh است.
- -mlamcas
- -mno-lamcas
- استفاده از (عدم استفاده از) دستورالعملهای "amcas[_db].{b/h/w/d}". هنگام ساخت با -march=la664، این گزینه بهطور پیشفرض فعال است. حالت پیشفرض -mno-lamcas است.
- -mld-seq-sa
- -mno-ld-seq-sa
- تعیین نیاز به سد بارگذاری-بارگذاری همنشانی ("dbar 0x700"). هنگام ساخت با -march=la664، این گزینه بهطور پیشفرض فعال است. حالت پیشفرض -mno-ld-seq-sa است که به معنی نیاز به سد بارگذاری-بارگذاری است.
- -mtls-dialect=opt
- این گزینه تعیین میکند کدام گویش TLS (tls dialect) ممکن است برای مدلهای TLS پویای عمومی (general dynamic) و پویای محلی (local dynamic) استفاده شود.
- desc
- استفاده از توصیفکنندههای TLS.
- -mannotate-tablejump
- -mno-annotate-tablejump
- ایجاد یک بخش حاشیهنویسی با نام ".discard.tablejump_annotate" برای مرتبط کردن دستورالعمل "jirl" و جدول پرش، زمانی که از یک جدول پرش برای بهینهسازی عبارت "switch" استفاده میشود. برخی از ابزارهای خارجی، برای نمونه objtool در سامانه ساخت هسته لینوکس، برای تحلیل جریان کنترل به این حاشیهنویسی نیاز دارند. مقدار پیشفرض -mno-annotate-tablejump است.
- --param loongarch-vect-unroll-limit=n
- بردارساز (vectorizer) از اطلاعات بهینهسازی دردسترس استفاده میکند تا تعیین کند که آیا باز کردن حلقه اصلی برداریشده سودمند است یا خیر و تا چه اندازه. این پارامتر کران بالایی را برای میزان باز کردن حلقه اصلی توسط بردارساز تعیین میکند. مقدار پیشفرض شش است.
گزینههای M32C
- -mcpu=name
- پردازندهای را انتخاب میکند که کد برای آن تولید میشود. مقدار name میتواند یکی از گزینههای r8c برای سری R8C/Tiny، m16c برای سری M16C (تا 60/)، m32cm برای سری M16C/80، یا m32c برای سری M32C/80 باشد.
- -msim
- مشخص میکند که برنامه روی شبیهساز اجرا خواهد شد. این امر سبب پیوند خوردن یک کتابخانه زمان اجرای جایگزین میشود که برای نمونه از ورودی/خروجی فایل پشتیبانی میکند. هنگام تولید برنامههایی که قرار است روی سختافزار واقعی اجرا شوند نباید از این گزینه استفاده کنید؛ باید کتابخانه زمان اجرای خودتان را برای هر تابع ورودی/خروجی که مورد نیاز است فراهم کنید.
- -memregs=number
- تعداد شبهثباتهای مبتنی بر حافظه را که GCC در طول تولید کد استفاده میکند مشخص مینماید. این شبهثباتها مانند ثباتهای واقعی به کار میروند؛ بنابراین موازنهای بین توانایی GCC در گنجاندن کد در ثباتهای موجود و افت کارایی ناشی از استفاده از حافظه به جای ثباتها وجود دارد. توجه داشته باشید که تمام ماژولها در یک برنامه باید با مقدار یکسانی از این گزینه کامپایل شوند. به همین دلیل، نباید از این گزینه همراه با کتابخانههای زمان اجرای پیشفرض GCC استفاده کنید.
گزینههای M32R/D
این گزینههای -m برای معماریهای Renesas M32R/D تعریف شدهاند:
- -m32r2
- تولید کد برای M32R/2.
- -m32rx
- تولید کد برای M32R/X.
- -m32r
- تولید کد برای M32R. این مقدار پیشفرض است.
- -mmodel=small
- فرض میکند
که تمام
اشیاء در ۱۶
مگابایت
پایینی
حافظه قرار
دارند (به
طوری که
آدرسهای
آنها را
میتوان با
دستورالعمل
"ld24"
بارگذاری
کرد)، و فرض
میکند
تمام
زیرروالها
با
دستورالعمل
"bl" قابل
دسترسی
هستند. این
حالت
پیشفرض
است.
قابلیت آدرسدهی یک شیء خاص را میتوان با مشخصهٔ "model" تعیین کرد.
- -mmodel=medium
- فرض میکند اشیاء ممکن است در هر کجای فضای آدرس ۳۲ بیتی باشند (کامپایلر برای بارگذاری آدرسهای آنها دستورالعملهای "seth/add3" را تولید میکند)، و فرض میکند تمام زیرروالها با دستورالعمل "bl" قابل دسترسی هستند.
- -mmodel=large
- فرض میکند اشیاء ممکن است در هر کجای فضای آدرس ۳۲ بیتی باشند (کامپایلر برای بارگذاری آدرسهای آنها دستورالعملهای "seth/add3" را تولید میکند)، و فرض میکند زیرروالها ممکن است با دستورالعمل "bl" قابل دسترسی نباشند (کامپایلر دنباله دستورالعملهای بسیار کُندتر "seth/add3/jl" را تولید میکند).
- -msdata=none
- استفاده از
ناحیه
دادههای
کوچک را
غیرفعال
میکند.
متغیرها در
یکی از
بخشهای
".data"،
".bss"، یا
".rodata"
قرار
میگیرند
(مگر اینکه
مشخصهٔ
"section"
تعیین شده
باشد). این
حالت
پیشفرض
است.
ناحیه دادههای کوچک از بخشهای ".sdata" و ".sbss" تشکیل شده است. اشیاء را میتوان با استفاده از مشخصهٔ "section" و با بهکارگیری یکی از این بخشها صریحاً در ناحیه دادههای کوچک قرار داد.
- -msdata=sdata
- دادههای سراسری و ایستای کوچک را در ناحیه دادههای کوچک قرار میدهد، اما کد ویژهای برای ارجاع به آنها تولید نمیکند.
- -msdata=use
- دادههای سراسری و ایستای کوچک را در ناحیه دادههای کوچک قرار میدهد، و دستورالعملهای ویژهای برای ارجاع به آنها تولید میکند.
- -G num
- اشیاء
سراسری و
ایستا با
اندازه
کمتر یا
مساوی با num
بایت را به
جای
بخشهای
عادی داده
یا BSS، در
بخشهای
داده یا BSS
کوچک قرار
میدهد.
مقدار
پیشفرض num
برابر با 8
است. برای
اینکه این
گزینه
تأثیری
داشته
باشد،
گزینهٔ -msdata
باید روی
یکی از
مقادیر sdata
یا use تنظیم
شده باشد.
تمام ماژولها باید با مقدار یکسان -G num کامپایل شوند. کامپایل کردن با مقادیر متفاوت num ممکن است کار کند یا نکند؛ اگر کار نکند، پیونددهنده یک پیام خطا صادر میکند---کد نادرست تولید نمیشود.
- -mdebug
- باعث میشود کد ویژهی M32R در کامپایلر، برخی آمارهها را نمایش دهد که ممکن است در اشکالزدایی برنامهها مفید باشد.
- -malign-loops
- همهی حلقهها را در یک مرز ۳۲ بایتی همتراز میکند.
- -mno-align-loops
- همترازی ۳۲ بایتی را برای حلقهها اجبار نمیکند. این حالت پیشفرض است.
- -missue-rate=number
- صدور number دستورالعمل در هر چرخه. مقدار number تنها میتواند 1 یا 2 باشد.
- -mbranch-cost=number
- مقدار number تنها میتواند 1 یا 2 باشد. اگر 1 باشد، انشعابها به کدهای شرطی ترجیح داده میشوند؛ اگر 2 باشد، عکس آن اعمال میگردد.
- -mflush-trap=number
- شماره تلهای (trap) را که برای تخلیه کَش استفاده میشود مشخص میکند. مقدار پیشفرض 12 است. شمارههای معتبر بین 0 تا 15 (شامل خود آنها) هستند.
- -mno-flush-trap
- مشخص میکند که کَش را نمیتوان با استفاده از یک تله تخلیه کرد.
- -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. پردازندههای M680x0 (cpu) عبارتند از: 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
- 5208 : 5207 5208
- 5211a : 5210a 5211a
- 5213 : 5211 5212 5213
- 5216 : 5214 5216
- 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 رد میشوند.
کامپایلر GCC ماکروی "__mcf_cpu_cpu" را هنگام انتخاب مقصد ColdFire از نوع cpu تعریف میکند. همچنین ماکروی "__mcf_family_family" را نیز تعریف میکند، که در آن مقدار family توسط جدول بالا ارائه شده است.
- -mtune=tune
- کد را برای
یک
ریزمعماری
خاص در
چارچوب
محدودیتهای
تعیینشده
توسط -march و -mcpu
بهینهسازی
(tune) میکند.
ریزمعماریهای
M680x0 عبارتند
از: 68000، 68010،
68020، 68030، 68040،
68060 و cpu32.
ریزمعماریهای
ColdFire عبارتند
از: cfv1، cfv2،
cfv3، cfv4 و cfv4e.
شما همچنین میتوانید از -mtune=68020-40 برای کدی استفاده کنید که باید نسبتاً مناسب روی مقصدهای 68020، 68030 و 68040 اجرا شود. -mtune=68020-60 مشابه است اما مقصدهای 68060 را نیز در بر میگیرد. این دو گزینه به ترتیب همان تصمیمهای بهینهسازی را مشابه -m68020-40 و -m68020-60 انتخاب میکنند.
کامپایلر GCC ماکروهای "__mcarch" و "__mcarch__" را هنگام بهینهسازی برای معماری 680x0 از نوع arch تعریف میکند. همچنین "mcarch" را تعریف میکند مگر اینکه گزینهٔ -ansi یا یک گزینهٔ غیر گنو -std به کار رفته باشد. اگر GCC در حال بهینهسازی برای محدودهای از معماریها باشد، همانطور که توسط -mtune=68020-40 یا -mtune=68020-60 انتخاب میشود، ماکروها را برای هر معماری موجود در آن محدوده تعریف میکند.
کامپایلر GCC همچنین ماکروی "__muarch__" را هنگام بهینهسازی برای ریزمعماری ColdFire از نوع uarch تعریف میکند، که در آن uarch یکی از آرگومانهای ارائهشده در بالا است.
- -m68000
- -mc68000
- تولید
خروجی برای
پردازندهٔ
68000. این حالت
پیشفرض
است هنگامی
که
کامپایلر
برای
سیستمهای
مبتنی بر 68000
پیکربندی
شده باشد.
این گزینه
معادل -march=68000
است.
از این گزینه برای میکروکنترلرهای دارای هستهٔ 68000 یا EC000 استفاده کنید، شامل 68008، 68302، 68306، 68307، 68322، 68328 و 68356.
- -m68010
- تولید خروجی برای 68010. این حالت پیشفرض است هنگامی که کامپایلر برای سیستمهای مبتنی بر 68010 پیکربندی شده باشد. این گزینه معادل -march=68010 است.
- -m68020
- -mc68020
- تولید خروجی برای 68020. این حالت پیشفرض است هنگامی که کامپایلر برای سیستمهای مبتنی بر 68020 پیکربندی شده باشد. این گزینه معادل -march=68020 است.
- -m68030
- تولید خروجی برای 68030. این حالت پیشفرض است هنگامی که کامپایلر برای سیستمهای مبتنی بر 68030 پیکربندی شده باشد. این گزینه معادل -march=68030 است.
- -m68040
- تولید
خروجی برای
68040. این حالت
پیشفرض
است هنگامی
که
کامپایلر
برای
سیستمهای
مبتنی بر 68040
پیکربندی
شده باشد.
این گزینه
معادل -march=68040
است.
این گزینه مانع از استفاده از دستورالعملهای 68881/68882 میشود که باید در 68040 بهصورت نرمافزاری شبیهسازی شوند. اگر 68040 شما کدی برای شبیهسازی آن دستورالعملها ندارد از این گزینه استفاده کنید.
- -m68060
- تولید
خروجی برای
68060. این حالت
پیشفرض
است هنگامی
که
کامپایلر
برای
سیستمهای
مبتنی بر 68060
پیکربندی
شده باشد.
این گزینه
معادل -march=68060
است.
این گزینه مانع از استفاده از دستورالعملهای 68020 و 68881/68882 میشود که باید در 68060 بهصورت نرمافزاری شبیهسازی شوند. اگر 68060 شما کدی برای شبیهسازی آن دستورالعملها ندارد از این گزینه استفاده کنید.
- -mcpu32
- تولید
خروجی برای
یک
پردازندهٔ
CPU32. این حالت
پیشفرض
است هنگامی
که
کامپایلر
برای
سیستمهای
مبتنی بر CPU32
پیکربندی
شده باشد.
این گزینه
معادل -march=cpu32
است.
از این گزینه برای میکروکنترلرهای دارای هستهٔ CPU32 یا CPU32+ استفاده کنید، شامل 68330، 68331، 68332، 68333، 68334، 68336، 68340، 68341، 68349 و 68360.
- -m5200
- تولید
خروجی برای
پردازندهٔ
ColdFire از نوع 520X.
این حالت
پیشفرض
است هنگامی
که
کامپایلر
برای
سیستمهای
مبتنی بر 520X
پیکربندی
شده باشد.
این گزینه
معادل -mcpu=5206
است و اکنون
به نفع آن
گزینه
منسوخ شده
است.
از این گزینه برای میکروکنترلرهای دارای هستهٔ 5200 استفاده کنید، شامل MCF5202، MCF5203، MCF5204 و MCF5206.
- -m5206e
- تولید خروجی برای پردازندهٔ ColdFire از نوع 5206e. این گزینه اکنون به نفع گزینهٔ معادل -mcpu=5206e منسوخ شده است.
- -m528x
- تولید خروجی برای عضوی از خانوادهٔ ColdFire 528X. این گزینه اکنون به نفع گزینهٔ معادل -mcpu=528x منسوخ شده است.
- -m5307
- تولید خروجی برای یک پردازندهٔ ColdFire 5307. این گزینه اکنون به نفع گزینهٔ معادل -mcpu=5307 منسوخ شده است.
- -m5407
- تولید خروجی برای یک پردازندهٔ ColdFire 5407. این گزینه اکنون به نفع گزینهٔ معادل -mcpu=5407 منسوخ شده است.
- -mcfv4e
- تولید خروجی برای پردازندهای از خانوادهٔ ColdFire V4e (مانند 547x/548x). این شامل استفاده از دستورالعملهای سختافزاری ممیز شناور است. این گزینه معادل -mcpu=547x است و اکنون به نفع آن گزینه منسوخ شده است.
- -m68020-40
- تولید
خروجی برای
یک 68040، بدون
استفاده از
هیچیک از
دستورالعملهای
جدید. این
کار منجر به
کدی میشود
که
میتواند
با کارایی
نسبتاً خوب
بر روی هر
یک از 68020/68881 یا 68030
یا 68040 اجرا
شود. کد
تولیدشده
از
دستورالعملهای
68881 که روی 68040
شبیهسازی
میشوند
استفاده
میکند.
این گزینه معادل -march=68020 -mtune=68020-40 است.
- -m68020-60
- تولید
خروجی برای
یک 68060، بدون
استفاده از
هیچیک از
دستورالعملهای
جدید. این
کار منجر به
کدی میشود
که
میتواند
با کارایی
نسبتاً خوب
بر روی هر
یک از 68020/68881 یا 68030
یا 68040 اجرا
شود. کد
تولیدشده
از
دستورالعملهای
68881 که روی 68060
شبیهسازی
میشوند
استفاده
میکند.
این گزینه معادل -march=68020 -mtune=68020-60 است.
- -mhard-float
- -m68881
- تولید دستورالعملهای ممیز شناور. این حالت پیشفرض برای 68020 و بالاتر، و برای دستگاههای ColdFire دارای FPU است. این گزینه ماکروی "__HAVE_68881__" را روی مقصدهای M680x0 و "__mcffpu__" را روی مقصدهای ColdFire تعریف میکند.
- -msoft-float
- دستورالعملهای ممیز شناور تولید نشوند؛ در عوض از فراخوانیهای کتابخانهای استفاده شود. این حالت پیشفرض برای مقصدهای 68000، 68010 و 68832 است. همچنین برای دستگاههای ColdFire فاقد FPU نیز پیشفرض است.
- -mdiv
- -mno-div
- تولید (عدم
تولید)
دستورالعملهای
سختافزاری
تقسیم و
باقیماندهٔ
ColdFire. اگر -march
بدون -mcpu
استفاده
شود،
پیشفرض
برای
معماریهای
ColdFire برابر «on»
(فعال) و
برای
معماریهای
M680x0 برابر «off»
(غیرفعال)
است. در غیر
این صورت،
پیشفرض از
پردازندهٔ
مقصد گرفته
میشود (چه
پردازندهٔ
پیشفرض،
چه
پردازندهٔ
مشخصشده
با -mcpu). برای
مثال،
پیشفرض
برای -mcpu=5206
برابر «off» و
برای -mcpu=5206e
برابر «on»
است.
هنگامی که این گزینه فعال باشد، GCC ماکروی "__mcfhwdiv__" را تعریف میکند..IP -mshort 4 نوع "int" را مانند "short int"، ۱۶ بیتی در نظر میگیرد. علاوه بر این، پارامترهای ارسالی روی پشته نیز حتی در مقصدهایی که API آنها ارتقا به ۳۲ بیتی را الزامی میکند، روی یک مرز ۱۶ بیتی تراز میشوند.
- -mno-short
- نوع "int" را ۱۶ بیتی در نظر نمیگیرد. این مقدار پیشفرض است.
- -mnobitfield
- -mno-bitfield
- از دستورالعملهای بیتی (bit-field) استفاده نمیکند. گزینههای -m68000، -mcpu32 و -m5200 بهطور ضمنی -mnobitfield را فعال میکنند.
- -mbitfield
- از دستورالعملهای بیتی استفاده میکند. گزینهٔ -m68020 بهطور ضمنی -mbitfield را فعال میکند. اگر از پیکربندی طراحیشده برای 68020 استفاده کنید، این حالت پیشفرض است.
- -mrtd
- از یک
قرارداد
فراخوانی
تابع
متفاوت
استفاده
میکند، که
در آن
توابعی که
تعداد
ثابتی از
آرگومانها
را
میپذیرند،
با
دستورالعمل
"rtd"
برمیگردند؛
این
دستورالعمل
هنگام
بازگشت،
آرگومانهای
آنها را از
پشته بیرون
میکشد (pop
میکند).
این کار یک
دستورالعمل
در
فراخواننده
صرفهجویی
میکند چرا
که در آنجا
نیازی به
بیرون
کشیدن
آرگومانها
نیست.
این قرارداد فراخوانی با قراردادی که بهطور معمول در Unix استفاده میشود ناسازگار است، بنابراین اگر نیاز به فراخوانی کتابخانههای کامپایلشده با کامپایلر Unix دارید، نمیتوانید از آن استفاده کنید.
همچنین، باید پیشنمونهٔ توابع (prototype) را برای تمام توابعی که تعداد متغیری از آرگومانها را میپذیرند (شامل "printf") فراهم کنید؛ در غیر این صورت، برای فراخوانی این توابع کدهای نادرستی تولید میشود.
علاوه بر این، اگر تابعی را با آرگومانهای بیش از حد فراخوانی کنید، کد به شدت نادرستی تولید خواهد شد. (بهطور معمول، آرگومانهای اضافی بدون آسیب نادیده گرفته میشوند.)
دستورالعمل "rtd" توسط پردازندههای 68010، 68020، 68030، 68040، 68060 و CPU32 پشتیبانی میشود، اما در 68000 یا 5200 پشتیبانی نمیشود.
پیشفرض -mno-rtd است.
- -malign-int
- -mno-align-int
- کنترل
میکند که
آیا GCC
متغیرهای
"int"،
"long"،
"long long"،
"float"،
"double" و
"long double" را
روی یک مرز
۳۲ بیتی
تراز کند
(-malign-int) یا یک
مرز ۱۶ بیتی
(-mno-align-int). تراز
کردن
متغیرها
روی مرزهای
۳۲ بیتی، به
قیمت مصرف
حافظهٔ
بیشتر، کدی
تولید
میکند که
روی
پردازندههای
دارای
گذرگاههای
۳۲ بیتی تا
حدی
سریعتر
اجرا
میشود.
هشدار: اگر از گزینهٔ -malign-int استفاده کنید، GCC ساختارهای حاوی انواع بالا را متفاوت از اکثر مشخصات رابط باینری کاربردی (ABI) منتشرشده برای m68k تراز میکند.
مستقیماً از حالت آدرسدهی وابسته به pc در 68000 استفاده میکند، بهجای اینکه از یک جدول آفست سراسری استفاده کند. در حال حاضر، این گزینه بهطور ضمنی -fpic را فعال میکند که حداکثر یک آفست ۱۶ بیتی را برای آدرسدهی وابسته به pc مجاز میداند. در حال حاضر -fPIC به همراه -mpcrel پشتیبانی نمیشود، هرچند ممکن است برای پردازندههای 68020 و بالاتر پشتیبانی شود.
- -mno-strict-align
- -mstrict-align
- فرض نمیکند (میکند) که ارجاعات حافظهٔ ترازنشده توسط سیستم مدیریت میشوند.
- -msep-data
- کدی تولید میکند که اجازه میدهد بخش داده در ناحیهای از حافظه متفاوت از بخش کد قرار گیرد. این امر امکان اجرای درجا (execute-in-place) را در محیطی بدون مدیریت حافظهٔ مجازی فراهم میسازد. این گزینه بهطور ضمنی -fPIC را فعال میکند.
- -mno-sep-data
- کدی تولید میکند که فرض میکند بخش داده به دنبال بخش کد میآید. این مقدار پیشفرض است.
- -mid-shared-library
- کدی تولید میکند که از کتابخانههای مشترک از طریق روش شناسهٔ کتابخانه پشتیبانی میکند. این امر امکان اجرای درجا و کتابخانههای مشترک را در محیطی بدون مدیریت حافظهٔ مجازی فراهم میسازد. این گزینه بهطور ضمنی -fPIC را فعال میکند.
- -mno-id-shared-library
- کدی تولید میکند که فرض نمیکند کتابخانههای مشترک مبتنی بر شناسه استفاده میشوند. این مقدار پیشفرض است.
- شمارهٔ شناسایی کتابخانهٔ مشترک مبتنی بر شناسه را که در حال کامپایل است مشخص میکند. تعیین مقدار 0 کد فشردهتری تولید میکند؛ تعیین مقادیر دیگر تخصیص آن شماره به کتابخانهٔ فعلی را اجباری میکند، اما از نظر فضا یا زمان کارآمدتر از حذف این گزینه نیست.
- -mxgot
- -mno-xgot
- هنگام
تولید کد
مستقل از
موقعیت
برای ColdFire، کدی
تولید
میکند که
در صورت
داشتن بیش
از ۸۱۹۲
مدخل در GOT
نیز کار
کند. این کد
بزرگتر و
کندتر از کد
تولیدشده
بدون این
گزینه است.
در
پردازندههای
M680x0، به این
گزینه
نیازی
نیست؛ -fPIC
کفایت
میکند.
GCC معمولاً از یک دستورالعمل منفرد برای بارگذاری مقادیر از GOT استفاده میکند. اگرچه این کار نسبتاً کارآمد است، اما تنها در صورتی کار میکند که GOT کوچکتر از حدود 64k باشد. هر مقدار بزرگتری باعث میشود پیونددهنده خطایی مانند زیر گزارش کند:
relocation truncated to fit: R_68K_GOT16O foobar
اگر این اتفاق افتاد، باید کد خود را با -mxgot بازکامپایل کنید. پس از آن باید با GOTهای بسیار بزرگ کار کند. با این حال، کد تولیدشده با -mxgot کارایی کمتری دارد، زیرا برای واکشی مقدار یک نماد سراسری ۴ دستورالعمل زمان میبرد.
توجه داشته باشید که برخی پیونددهندهها، از جمله نسخههای جدیدتر پیونددهندهٔ GNU، میتوانند چندین GOT ایجاد کرده و مدخلهای GOT را مرتب کنند. اگر چنین پیونددهندهای دارید، تنها زمانی باید از -mxgot استفاده کنید که یک فایل شیء منفرد را کامپایل میکنید که به بیش از ۸۱۹۲ مدخل GOT دسترسی دارد. تعداد بسیار کمی از آنها چنین هستند.
این گزینهها هیچ تأثیری ندارند مگر اینکه GCC در حال تولید کد مستقل از موقعیت باشد.
- -mlong-jump-table-offsets
- از آفستهای ۳۲ بیتی در جدولهای "switch" استفاده میکند. پیشفرض استفاده از آفستهای ۱۶ بیتی است.
گزینههای MCore
اینها گزینههای -m تعریفشده برای پردازندههای Motorola M*Core هستند.
- -mhardlit
- -mno-hardlit
- ثابتها را در صورتی که بتوان در دو دستورالعمل یا کمتر انجام داد، در جریان کد بهصورت درونخطی (inline) قرار میدهد.
- -mdiv
- -mno-div
- از دستورالعمل تقسیم استفاده میکند. (بهطور پیشفرض فعال است).
- -mrelax-immediate
- -mno-relax-immediate
- مقادیر بیواسطه (immediate) با اندازهٔ دلخواه را در عملیات بیتی مجاز میداند.
- -mwide-bitfields
- -mno-wide-bitfields
- همیشه با فیلدهای بیتی بهاندازهٔ "int" رفتار میکند.
- -m4byte-functions
- -mno-4byte-functions
- تمام توابع را مجبور میکند تا روی یک مرز ۴ بایتی تراز شوند.
- -mcallgraph-data
- -mno-callgraph-data
- اطلاعات گراف فراخوانی (callgraph) را تولید میکند.
- -mslow-bytes
- -mno-slow-bytes
- هنگام خواندن مقادیر بایتی، دسترسی کلمهای (word access) را ترجیح میدهد.
- -mlittle-endian
- -mbig-endian
- برای یک مقصد با پایانپذیری کوچک (little-endian) کد تولید میکند.
- -m210
- تولید کد برای پردازندهٔ 210.
- -mno-lsim
- فرض میکند که پشتیبانی زمان اجرا فراهم شده است و بنابراین کتابخانهٔ شبیهساز (libsim.a) را از خط فرمان پیونددهنده حذف میکند.
- -mstack-increment=size
- تنظیم حداکثر مقدار برای یک عملیات افزایش پشته. مقادیر بزرگ میتوانند سرعت برنامههایی را که شامل توابعی با نیاز به فضای پشتهٔ زیاد هستند افزایش دهند، اما در صورتی که پشته بیش از حد گسترش یابد، میتوانند خطای دسترسی به حافظه (segmentation fault) نیز ایجاد کنند. مقدار پیشفرض 0x1000 است.
گزینههای MicroBlaze
- -msoft-float
- استفاده از شبیهسازی نرمافزاری برای ممیز شناور (پیشفرض).
- -mhard-float
- استفاده از دستورالعملهای سختافزاری ممیز شناور.
- -mmemcpy
- انتقالهای بلوکی بهینهسازی نشوند، از "memcpy" استفاده شود.
- -mno-clearbss
- این گزینه منسوخ شده است. به جای آن از -fno-zero-initialized-in-bss استفاده کنید.
- -mcpu=cpu-type
- استفاده از قابلیتها و زمانبندی کد برای CPU مشخصشده. مقادیر پشتیبانیشده در قالب vX.YY.Z هستند، که در آن X نسخهٔ اصلی، YY نسخهٔ فرعی و Z کد سازگاری است. مقادیر نمونه عبارتند از v3.00.a، v4.00.b، v5.00.a، v5.00.b، v6.00.a.
- -mxl-soft-mul
- استفاده از شبیهسازی نرمافزاری ضرب (پیشفرض).
- -mxl-soft-div
- استفاده از شبیهسازی نرمافزاری تقسیم (پیشفرض).
- -mxl-barrel-shift
- استفاده از شیفتدهندهٔ بشکهای (barrel shifter) سختافزاری.
- -mxl-pattern-compare
- استفاده از دستورالعملهای مقایسهٔ الگو.
- -msmall-divides
- استفاده از بهینهسازی جدول جستجو برای تقسیم اعداد صحیح علامتدار کوچک.
- -mxl-stack-check
- این گزینه منسوخ شده است. به جای آن از -fstack-check استفاده کنید.
- -mxl-gp-opt
- استفاده از بخشهای ".sdata"/".sbss" با ارجاع نسبی به GP.
- -mxl-multiply-high
- استفاده از دستورالعملهای ضرب بالا برای بخش بالاییِ ضرب ۳۲×۳۲.
- -mxl-float-convert
- استفاده از دستورالعملهای سختافزاری تبدیل ممیز شناور.
- -mxl-float-sqrt
- استفاده از دستورالعمل سختافزاری ریشهٔ دوم (جذر) ممیز شناور.
- -mbig-endian
- تولید کد برای یک هدف با ترتیب بایت بزرگتر (big-endian).
- -mlittle-endian
- تولید کد برای یک هدف با ترتیب بایت کوچکتر (little-endian).
- -mxl-reorder
- استفاده از دستورالعملهای بازآرایی (swap و بارگذاری/ذخیره با ترتیب معکوس بایتها).
- -mxl-mode-app-model
- انتخاب مدل برنامهٔ app-model. مدلهای معتبر عبارتند از:
- executable
- اجرایی عادی (پیشفرض)، از کد راهاندازی crt0.o استفاده میکند.
- xmdstub
- برای استفاده با عامل اشکالزدایی نفوذی نرمافزاری مبتنی بر اشکالزدای ریزپردازندهٔ زایلینکس (XMD) موسوم به xmdstub. این مدل از فایل راهاندازی crt1.o استفاده کرده و نشانی شروع برنامه را روی 0x800 تنظیم میکند.
- bootstrap
- برای برنامههایی که با استفاده از یک بارگذار بوت (bootloader) بارگذاری میشوند. این مدل از فایل راهاندازی crt2.o استفاده میکند که فاقد گردانندهٔ بردار بازنشانی پردازنده است. این حالت برای واگذاری کنترل هنگام بازنشانی پردازنده به بارگذار بوت به جای برنامه مناسب است.
- novectors
- برای برنامههایی که به هیچیک از بردارهای MicroBlaze نیازی ندارند. این گزینه ممکن است برای برنامههایی که درون یک برنامهٔ پایشگر اجرا میشوند مفید باشد. این مدل از crt3.o به عنوان فایل راهاندازی استفاده میکند.
گزینهٔ -xl-mode-app-model یک نام مستعار منسوخشده برای -mxl-mode-app-model است.
- -mpic-data-is-text-relative
- فرض میکند که جابهجایی میان بخشهای text و data در زمان پیوند ایستا ثابت است. این امر به دلیل عدم پشتیبانی از آدرسدهی نسبی به PC، اجازه میدهد دادهها به جای GOT با آفست از نشانی آغاز text ارجاع داده شوند.
گزینههای MIPS
- -EB
- تولید کد با ترتیب بایت بزرگتر (big-endian).
- -EL
- تولید کد با ترتیب بایت کوچکتر (little-endian). این مقدار پیشفرض برای پیکربندیهای mips*el-*-* است.
- -march=arch
- تولید کدی
که بر روی arch
اجرا
میشود، که
میتواند
نام یک ISA
عمومی MIPS یا
نام یک
پردازندهٔ
خاص باشد.
نامهای ISA
عبارتند از:
mips1، mips2، mips3،
mips4، mips32، mips32r2،
mips32r3، mips32r5، mips32r6،
mips64، mips64r2، mips64r3،
mips64r5 و mips64r6.
نامهای
پردازندهها
عبارتند از:
4kc، 4km، 4kp،
4ksc، 4kec، 4kem،
4kep، 4ksd، 5kc،
5kf، 20kc، 24kc،
24kf2_1، 24kf1_1، 24kec،
24kef2_1، 24kef1_1، 34kc،
34kf2_1، 34kf1_1، 34kn،
74kc، 74kf2_1، 74kf1_1،
74kf3_2، 1004kc، 1004kf2_1،
1004kf1_1، i6400، i6500،
interaptiv، loongson2e،
loongson2f، loongson3a، gs464،
gs464e، gs264e، m4k،
m14k، m14kc، m14ke،
m14kec، m5100، m5101،
octeon، octeon+، octeon2،
octeon3، orion، p5600،
p6600، r2000، r3000،
r3900، r4000، r4400،
r4600، r4650، r4700،
r5900، r6000، r8000،
rm7000، rm9000، r10000،
r12000، r14000، r16000،
sb1، sr71000، vr4100،
vr4111، vr4120، vr4130،
vr4300، vr5000، vr5400،
vr5500، xlr و xlp.
مقدار
ویژهٔ from-abi
سازگارترین
معماری را
برای ABI
انتخابشده
برمیگزیند
(یعنی mips1
برای ABIهای
۳۲ بیتی و mips3
برای ABIهای
۶۴ بیتی).
زنجیره ابزار بومی Linux/GNU از مقدار native نیز پشتیبانی میکند که بهترین گزینهٔ معماری را برای پردازندهٔ میزبان انتخاب میکند. اگر 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 شرحدادهشده در بالا دارند..IP -mips1 4 معادل -march=mips1 است.
- -mips2
- معادل -march=mips2 است.
- -mips3
- معادل -march=mips3 است.
- -mips4
- معادل -march=mips4 است.
- -mips32
- معادل -march=mips32 است.
- -mips32r3
- معادل -march=mips32r3 است.
- -mips32r5
- معادل -march=mips32r5 است.
- -mips32r6
- معادل -march=mips32r6 است.
- -mips64
- معادل -march=mips64 است.
- -mips64r2
- معادل -march=mips64r2 است.
- -mips64r3
- معادل -march=mips64r3 است.
- -mips64r5
- معادل -march=mips64r5 است.
- -mips64r6
- معادل -march=mips64r6 است.
- -mips16
- -mno-mips16
- تولید (عدم
تولید) کد MIPS16.
اگر GCC یک
معماری MIPS32 یا
MIPS64 را هدف
قرار دهد،
از MIPS16e ASE
استفاده
میکند.
تولید کد MIPS16 همچنین میتواند بر مبنای هر تابع با استفاده از صفتهای "mips16" و "nomips16" کنترل شود.
- -mmips16e2
- -mno-mips16e2
- استفاده از (عدم استفاده از) MIPS16e2 ASE. این گزینه رفتار گزینهٔ -mips16 را طوری تغییر میدهد که MIPS16e2 ASE را هدف قرار دهد.
- -mflip-mips16
- تولید کد MIPS16 بهصورت متناوب و یکدرمیان روی توابع. این گزینه برای آزمون پسرفت (regression testing) تولید کد ترکیبی MIPS16/غیر-MIPS16 ارائه شده است و برای استفادهٔ عادی هنگام کامپایل کدهای کاربر در نظر گرفته نشده است.
- -minterlink-compressed
- -mno-interlink-compressed
- الزام (عدم
الزام) به
اینکه
کدهای
استفادهکننده
از MIPS ISA
استاندارد
(غیرفشرده)،
سازگار با
پیوند با
کدهای MIPS16 و microMIPS
باشند، و
برعکس.
برای نمونه، کدی که از کدگذاری استاندارد ISA استفاده میکند نمیتواند مستقیماً به کد MIPS16 یا microMIPS بپرد؛ بلکه باید از یک فراخوانی یا یک پرش غیرمستقیم استفاده کند. بنابراین -minterlink-compressed پرشهای مستقیم را غیرفعال میکند مگر اینکه GCC بداند که هدف پرش، فشرده نیست.
- -minterlink-mips16
- -mno-interlink-mips16
- نامهای مستعار برای -minterlink-compressed و -mno-interlink-compressed. این گزینهها پیش از معرفی microMIPS ASE وجود داشتهاند و برای سازگاری با نسخههای پیشین حفظ شدهاند.
- -mabi=32
- -mabi=o64
- -mabi=n32
- -mabi=64
- -mabi=eabi
- تولید کد
برای ABI
مشخصشده.
توجه داشته باشید که EABI دارای گونههای ۳۲ بیتی و ۶۴ بیتی است. معمولاً زمانی که یک معماری ۶۴ بیتی را انتخاب میکنید، GCC کد ۶۴ بیتی تولید میکند، اما میتوانید با استفاده از -mgp32 بهجای آن کد ۳۲ بیتی دریافت کنید.
برای اطلاعات بیشتر دربارهٔ O64 ABI، ببینید: https://gcc.gnu.org/projects/mipso64-abi.html.
کامپایلر GCC از گونهای از o32 ABI پشتیبانی میکند که در آن پهنای ثباتهای ممیز شناور بهجای ۳۲ بیت، ۶۴ بیت است. میتوانید این ترکیب را با -mabi=32 -mfp64 انتخاب کنید. این ABI به دستورالعملهای "mthc1" و "mfhc1" وابسته است و به همین دلیل تنها برای پردازندههای MIPS32R2، MIPS32R3 و MIPS32R5 پشتیبانی میشود.
تخصیص ثباتها برای آرگومانها و مقادیر بازگشتی یکسان باقی میماند، اما هر مقدار اسکالر بهجای یک جفت ثبات ۳۲ بیتی، درون یک ثبات منفرد ۶۴ بیتی ارسال میشود. برای مثال، مقادیر ممیز شناور اسکالر فقط در $f0 بازگردانده میشوند، نه در یک جفت $f0/$f1. مجموعهٔ ثباتهای نگهداریشده هنگام فراخوانی (call-saved) نیز از این حیث که ثباتهای با دقت مضاعفِ شمارهزوج ذخیره میشوند، بدون تغییر باقی میماند.
دو گونهٔ دیگر از o32 ABI نیز برای گذار آسانتر از ثباتهای ۳۲ بیتی به ۶۴ بیتی پشتیبانی میشوند. اینها FPXX (-mfpxx) و FP64A (-mfp64 -mno-odd-spreg) هستند. افزونهٔ FPXX الزام میکند که تمام کدها هنگام اجرا با ثباتهای ۳۲ بیتی یا ۶۴ بیتی، بهدرستی کار کنند. این کد میتواند با FP32 یا با FP64 پیوند بخورد، اما نه با هر دو. افزونهٔ FP64A مشابه افزونهٔ FP64 است اما استفاده از ثباتهای با دقت یگانه و شمارهفرد را منع میکند. این ویژگی را میتوان در کنار حالت "FRE" متعلق به FPU در پردازندههای MIPS32R5 به کار برد؛ در نتیجه کدهای FP32 و FP64A میتوانند بدون نیاز به تغییر حالت FPU در یک پردازش مشترک پیوند خورده و اجرا شوند.
- -mabicalls
- -mno-abicalls
- تولید (عدم تولید) کدی که برای اشیاء پویای سبک SVR4 مناسب باشد. گزینهٔ -mabicalls حالت پیشفرض برای سیستمهای مبتنی بر SVR4 است.
- -mno-shared
- تولید (عدم
تولید) کدی
که کاملاً
مستقل از
موقعیت (position-independent)
است، و در
نتیجه
میتواند
درون
کتابخانههای
اشتراکی
پیوند داده
شود. این
گزینه فقط
بر -mabicalls
تأثیر
میگذارد.
تمامی کدهای -mabicalls بهصورت سنتی، بدون در نظر گرفتن گزینههایی مانند -fPIC و -fpic، همیشه مستقل از موقعیت بودهاند. با این حال، زنجیره ابزار GNU بهعنوان یک افزونه به فایلهای اجرایی اجازه میدهد برای نمادهایی با پیوند محلی از دسترسیهای مطلق استفاده کنند. همچنین میتواند از دنبالههای مقداردهی اولیهٔ کوتاهتر برای GP استفاده کرده و فراخوانیهای مستقیم به توابع تعریفشده بهصورت محلی ایجاد کند. این حالت توسط -mno-shared انتخاب میشود.
گزینهٔ -mno-shared به binutils نسخهٔ 2.16 یا بالاتر وابسته است و اشیایی تولید میکند که فقط توسط پیونددهندهٔ GNU میتوانند پیوند داده شوند. با این حال، این گزینه بر ABI فایل اجرایی نهایی تأثیری ندارد؛ بلکه تنها بر ABI اشیاء جابهجاییپذیر (relocatable) مؤثر است. استفاده از -mno-shared بهطور کلی باعث میشود فایلهای اجرایی هم کوچکتر و هم سریعتر شوند.
گزینهٔ -mshared حالت پیشفرض است.
- -mplt
- -mno-plt
- فرض کردن
(فرض نکردن)
اینکه
پیونددهندههای
ایستا و
پویا از PLTها
و
بازآراییهای
رونوشت (copy relocations)
پشتیبانی
میکنند.
این گزینه
فقط بر -mno-shared -mabicalls
اثر
میگذارد.
برای n64 ABI، این
گزینه بدون
-msym32 هیچ
تأثیری
ندارد.
میتوانید با پیکربندی اولیهٔ GCC با آرگومان --with-mips-plt، گزینهٔ -mplt را پیشفرض کنید. در غیر این صورت، حالت پیشفرض -mno-plt خواهد بود.
- -mxgot
- -mno-xgot
- برداشتن
(برنداشتن)
محدودیتهای
معمول روی
اندازهٔ
جدول آفست
سراسری (GOT).
کامپایلر GCC معمولاً از یک دستورالعمل برای بارگذاری مقادیر از GOT استفاده میکند. هرچند این کار نسبتاً بهینهتر است، اما فقط در صورتی جواب میدهد که اندازهٔ GOT از حدود 64k کمتر باشد. هر مقداری بزرگتر از آن باعث میشود پیونددهنده خطایی مانند زیر گزارش دهد:
relocation truncated to fit: R_MIPS_GOT16 foobar
اگر این حالت رخ داد، باید کد خود را با -mxgot بازکامپایل کنید. این گزینه با GOTهای بسیار بزرگ کار میکند، اگرچه خروجی کد کارایی کمتری خواهد داشت چرا که فراخوانی مقدار یک نماد سراسری مستلزم سه دستورالعمل خواهد بود.
توجه داشته باشید که برخی پیونددهندهها میتوانند چندین GOT ایجاد کنند. اگر از چنین پیونددهندهای استفاده میکنید، تنها زمانی نیاز به استفاده از -mxgot خواهید داشت که یک فایل شیء منفرد به بیش از مقادیر 64k ورودی GOT دسترسی پیدا کند، که این مورد بسیار نادر است.
این گزینهها هیچ اثری ندارند مگر اینکه GCC در حال تولید کد مستقل از موقعیت باشد..IP -mgp32 4 فرض میکند که پهنای ثباتهای همهمنظوره ۳۲ بیت است.
- -mgp64
- فرض میکند که پهنای ثباتهای همهمنظوره ۶۴ بیت است.
- -mfp32
- فرض میکند که پهنای ثباتهای ممیز شناور ۳۲ بیت است.
- -mfp64
- فرض میکند که پهنای ثباتهای ممیز شناور ۶۴ بیت است.
- -mfpxx
- هیچ فرضی دربارهٔ پهنای ثباتهای ممیز شناور در نظر نمیگیرد.
- -mhard-float
- از دستورالعملهای کمکپردازندهٔ ممیز شناور استفاده میکند.
- -msoft-float
- از دستورالعملهای کمکپردازندهٔ ممیز شناور استفاده نمیکند. در عوض محاسبات ممیز شناور را با استفاده از فراخوانیهای کتابخانهای پیادهسازی میکند.
- -mno-float
- معادل با -msoft-float است، اما علاوهبر آن تأیید میکند که برنامهٔ در حال کامپایل هیچ عملیات ممیز شناوری را انجام نمیدهد. این گزینه در حال حاضر تنها توسط برخی از پیکربندیهای MIPS سختافزارِ خام (bare-metal) پشتیبانی میشود، جایی که ممکن است مجموعهٔ خاصی از کتابخانهها را انتخاب کند که فاقد هرگونه پشتیبانی از ممیز شناور هستند (برای مثال، شامل قالبهای ممیز شناورِ "printf"). اگر کدی که با -mno-float کامپایل شده است تصادفاً حاوی عملیات ممیز شناور باشد، احتمالاً با شکست در زمان پیوند یا زمان اجرا مواجه خواهد شد.
- -msingle-float
- فرض میکند که کمکپردازندهٔ ممیز شناور تنها از عملیات با دقت یگانه (single-precision) پشتیبانی میکند.
- -mdouble-float
- فرض میکند که کمکپردازندهٔ ممیز شناور از عملیات با دقت دوگانه (double-precision) پشتیبانی میکند. این مقدار پیشفرض است.
- -modd-spreg
- -mno-odd-spreg
- استفاده از ثباتهای ممیز شناورِ دقت یگانه با شمارههای فرد را برای o32 ABI فعال میکند. این مقدار پیشفرض برای پردازندههایی است که مشخص شده است از این ثباتها پشتیبانی میکنند. هنگام استفاده از o32 FPXX ABI، گزینهٔ -mno-odd-spreg بهطور پیشفرض تنظیم میشود.
- -mabs=2008
- -mabs=legacy
- این
گزینهها
رفتار با
دادههای
ویژهٔ
ناعَدَد (NaN)
ممیز شناور
IEEE 754 را با
دستورالعملهای
ماشین
"abs.fmt"
و
"neg.fmt"
کنترل
میکنند.
بهطور پیشفرض یا هنگامی که از -mabs=legacy استفاده میشود، رفتار موروثی (legacy) انتخاب میشود. در این حالت این دستورالعملها حسابی در نظر گرفته میشوند و در جاهایی که عملکرد صحیح لازم است و ممکن است عملوند ورودی NaN باشد از آنها اجتناب میشود. در عوض توالی طولانیتری از دستورالعملها که بیت علامت دادهٔ ممیز شناور را بهصورت دستی دستکاری میکنند استفاده میشود، مگر اینکه گزینهٔ -ffinite-math-only نیز مشخص شده باشد.
گزینهٔ -mabs=2008 رفتار IEEE 754-2008 را انتخاب میکند. در این حالت این دستورالعملها غیرحسابی در نظر گرفته میشوند و بنابراین در تمام موارد، از جمله بهویژه زمانی که عملوند ورودی NaN است، بهدرستی عمل میکنند. در نتیجه این دستورالعملها همیشه برای عملیات مربوطه استفاده میشوند.
- -mnan=2008
- -mnan=legacy
- این
گزینهها
کدگذاری
دادههای
ویژهٔ
ناعَدَد (NaN)
ممیز شناور
IEEE 754 را کنترل
میکنند.
گزینهٔ -mnan=legacy کدگذاری موروثی (legacy) را انتخاب میکند. در این حالت NaNهای ساکت (qNaNs) با ۰ بودن بیت اول میدان بخش معنادار انتهاییشان نشان داده میشوند، در حالی که 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" را برابر با ۱ تعریف میکند.
- -mdspr2
- -mno-dspr2
- استفاده کردن (استفاده نکردن) از بازنگری ۲ از MIPS DSP ASE. این گزینه ماکروهای پیشپردازندهٔ "__mips_dsp" و "__mips_dspr2" را تعریف میکند. همچنین "__mips_dsp_rev" را برابر با ۲ تعریف میکند.
- -msmartmips
- -mno-smartmips
- استفاده کردن (استفاده نکردن) از MIPS SmartMIPS ASE.
- -mpaired-single
- -mno-paired-single
- استفاده کردن (استفاده نکردن) از دستورالعملهای ممیز شناور زوجتکی (paired-single). این گزینه نیازمند فعال بودن پشتیبانی سختافزاری از ممیز شناور است.
- -mdmx
- -mno-mdmx
- استفاده کردن (استفاده نکردن) از دستورالعملهای MIPS Digital Media Extension. این گزینه فقط هنگام تولید کد ۶۴ بیتی میتواند استفاده شود و نیازمند فعال بودن پشتیبانی سختافزاری از ممیز شناور است.
- -mips3d
- -mno-mips3d
- استفاده کردن (استفاده نکردن) از MIPS-3D ASE. گزینهٔ -mips3d متضمن -mpaired-single است.
- -mmicromips
- -mno-micromips
- تولید کردن
(تولید
نکردن) کد microMIPS.
تولید کد MicroMIPS همچنین میتواند برای هر تابع بهصورت جداگانه با استفاده از مشخصههای "micromips" و "nomicromips" کنترل شود.
- -mmt
- -mno-mt
- استفاده کردن (استفاده نکردن) از دستورالعملهای چندریسمانی MT.
- -mmcu
- -mno-mcu
- استفاده کردن (استفاده نکردن) از دستورالعملهای MIPS MCU ASE.
- -meva
- -mno-eva
- استفاده کردن (استفاده نکردن) از دستورالعملهای MIPS Enhanced Virtual Addressing.
- -mvirt
- -mno-virt
- استفاده کردن (استفاده نکردن) از دستورالعملهای مجازیسازی MIPS (VZ)..IP -mxpa 4
- -mno-xpa
- استفاده (یا عدم استفاده) از دستورالعملهای نشانی فیزیکی گسترشیافتهٔ MIPS (کوتهنوشت XPA).
- -mcrc
- -mno-crc
- استفاده (یا عدم استفاده) از دستورالعملهای بررسی افزونگی چرخهای MIPS (کوتهنوشت CRC).
- -mginv
- -mno-ginv
- استفاده (یا عدم استفاده) از دستورالعملهای ابطال سراسری MIPS (کوتهنوشت GINV).
- -mloongson-mmi
- -mno-loongson-mmi
- استفاده (یا عدم استفاده) از دستورالعملهای افزونههای چندرسانهای MIPS Loongson (کوتهنوشت MMI).
- -mloongson-ext
- -mno-loongson-ext
- استفاده (یا عدم استفاده) از دستورالعملهای افزونههای MIPS Loongson (کوتهنوشت EXT).
- -mloongson-ext2
- -mno-loongson-ext2
- استفاده (یا عدم استفاده) از دستورالعملهای نگارش ۲ افزونههای MIPS Loongson (کوتهنوشت EXT2).
- -mlong64
- اجبار انواع دادهٔ "long" به داشتن پهنای ۶۴ بیتی. برای توضیحات در مورد حالت پیشفرض و شیوهٔ تعیین اندازهٔ اشارهگر، -mlong32 را ببینید.
- -mlong32
- اجبار
انواع
دادهٔ
"long"،
"int" و
اشارهگرها
به داشتن
پهنای ۳۲
بیتی.
اندازهٔ پیشفرض "int"ها، "long"ها و اشارهگرها به ABI بستگی دارد. تمام ABIهای پشتیبانیشده از "int"های ۳۲ بیتی استفاده میکنند. رابط ABI نوع n64، همانند EABI شصتوچهار بیتی، از "long"های ۶۴ بیتی استفاده میکند؛ بقیه از "long"های ۳۲ بیتی استفاده میکنند. اندازهٔ اشارهگرها با اندازهٔ "long"ها یا اندازهٔ ثباتهای عدد صحیح (هرکدام که کوچکتر باشد) برابر است.
- -msym32
- -mno-sym32
- فرض کردن (یا فرض نکردن) این که تمام نمادها بدون در نظر گرفتن ABI انتخابشده مقادیر ۳۲ بیتی دارند. این گزینه در ترکیب با -mabi=64 و -mno-abicalls کاربردی است، چرا که به GCC اجازه میدهد ارجاعات کوتاهتر و سریعتری به نشانیهای نمادین ایجاد کند.
- -G num
- قرار دادن
تعاریف
دادههای
قابل
مشاهده از
خارج در یک
بخش
دادههای
کوچک (small data section)،
در صورتی که
اندازهٔ آن
داده
بزرگتر از
num بایت
نباشد. در
این صورت GCC
میتواند
دسترسیهای
کارآمدتری
به دادهها
تولید کند؛
برای
جزئیات -mgpopt
را ببینید.
مقدار پیشفرض گزینهٔ -G به پیکربندی بستگی دارد.
- -mlocal-sdata
- -mno-local-sdata
- گسترش دادن
(یا ندادن)
رفتار -G به
دادههای
محلی نیز،
مانند
متغیرهای
static در C.
گزینهٔ -mlocal-sdata
برای تمامی
پیکربندیها
حالت
پیشفرض
است.
اگر پیونددهنده ایراد گرفت که یک برنامه بیش از حد از دادههای کوچک استفاده میکند، میتوانید بازسازی بخشهایی را که از نظر کارایی کمتر حیاتی هستند با -mno-local-sdata امتحان کنید. همچنین ممکن است بخواهید کتابخانههای بزرگ را با -mno-local-sdata بسازید تا کتابخانهها فضای بیشتری برای برنامهٔ اصلی باقی بگذارند.
- -mextern-sdata
- -mno-extern-sdata
- فرض کردن
(یا فرض
نکردن) این
که
دادههای
تعریفشده
در خارج در
بخش
دادههای
کوچک قرار
دارند، در
صورتی که
اندازهٔ آن
داده در
محدودهٔ -G
باشد.
گزینهٔ -mextern-sdata
برای تمامی
پیکربندیها
حالت
پیشفرض
است.
اگر پیمانهٔ Mod را با گزینههای -mextern-sdata -G num -mgpopt کامپایل کنید و Mod به متغیر Var ارجاع دهد که بزرگتر از num بایت نیست، باید اطمینان حاصل کنید که Var در یک بخش دادههای کوچک قرار گرفته است. اگر Var توسط پیمانهٔ دیگری تعریف شده است، یا باید آن پیمانه را با تنظیم -G به اندازهٔ کافی بزرگ کامپایل کنید یا ویژگی "section" را به تعریف Var'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-relative) در MIPS16 میتوانند به بخشهای اجرایی دسترسی داشته باشند، اما سایر دستورالعملها نباید چنین کنند. این گزینه روی پردازندههای 4KSc و 4KSd، زمانی که بیت Read Inhibit در TLBهای کد تنظیم شده است، مفید خواهد بود. همچنین روی پردازندههایی که میتوان آنها را برای داشتن رابط دوگانهٔ دستورالعمل/داده SRAM پیکربندی کرد و مانند M4K بارگذاریهای PC-relative را بهطور خودکار به RAM دستورالعمل هدایت میکنند، کاربرد دارد.
- -mcode-readable=no
- دستورالعملها نباید به بخشهای اجرایی دسترسی داشته باشند. این گزینه میتواند در مقاصدی مفید باشد که برای داشتن رابط دوگانهٔ دستورالعمل/داده SRAM پیکربندی شدهاند اما (برخلاف M4K) بارگذاریهای PC-relative را بهطور خودکار به RAM دستورالعمل هدایت نمیکنند.
- -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 پشتیبانی میکند..IP -mcheck-zero-division 4
- -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) را جفت میکند تا پیوند بارگذاری/ذخیرهسازی (load/store bonding) فعال شود. این گزینه بهطور پیشفرض فعال است، اما تنها زمانی اعمال میشود که مشخص باشد معماری انتخابشده از پیوند (bonding) پشتیبانی میکند.
- -mstrict-align
- -mno-strict-align
- -munaligned-access
- -mno-unaligned-access
- غیرفعال (فعال) کردن دسترسی مستقیم غیرهمتراز (unaligned access) برای MIPS Release 6. معماری MIPSr6 نیازمند پشتیبانی از دسترسی غیرهمتراز برای load/store، بهصورت سختافزاری یا تله و شبیهسازی (trap&emulate) است. بنابراین ممکن است هسته به -mstrict-align نیاز داشته باشد. گزینههای -munaligned-access و -mno-unaligned-access منسوخ شدهاند و صرفاً برای سازگاری با گذشته هستند.
- -mmemcpy
- -mno-memcpy
- اجبار (عدم اجبار) به استفاده از "memcpy" برای انتقالهای غیربدیهی بلوک داده. پیشفرض -mno-memcpy است، که به GCC اجازه میدهد بیشتر کپیهای با اندازهٔ ثابت را درونخطی (inline) کند.
- -mlong-calls
- -mno-long-calls
- غیرفعال
(عدم
غیرفعالسازی)
کردن
استفاده از
دستورالعمل
"jal".
فراخوانی
توابع با
استفاده از
"jal"
کارآمدتر
است اما
نیاز دارد
که
فراخواننده
و
فراخواندهشده
در یک قطعهٔ
۲۵۶
مگابایتی
یکسان قرار
داشته
باشند.
این گزینه هیچ تأثیری بر کد abicalls ندارد. پیشفرض -mno-long-calls است.
- -mmad
- -mno-mad
- فعال (غیرفعال) کردن استفاده از دستورالعملهای "mad"، "madu" و "mul"، همانگونه که توسط معماری مجموعه دستورالعمل (ISA) مدل R4650 ارائه شده است.
- -mimadd
- -mno-imadd
- فعال (غیرفعال) کردن استفاده از دستورالعملهای عدد صحیح "madd" و "msub". پیشفرض در معماریهایی که از "madd" و "msub" پشتیبانی میکنند -mimadd است، بهجز معماری 74k که مشخص شد در آن کد کُندتری تولید میشود.
- -mfused-madd
- -mno-fused-madd
- فعال
(غیرفعال)
کردن
استفاده از
دستورالعملهای
ضرب-جمع
ممیز شناور
(floating-point multiply-accumulate)، در
صورت در
دسترس بودن
آنها.
پیشفرض
-mfused-madd است.
در پردازندهٔ R8000 هنگامی که از دستورالعملهای multiply-accumulate استفاده میشود، حاصلضرب میانی با دقت بینهایت محاسبه شده و مشمول بیت Flush to Zero در FCSR نمیشود. این موضوع ممکن است در برخی شرایط نامطلوب باشد. در سایر پردازندهها، نتیجه از نظر عددی با محاسبهٔ معادل با استفاده از دستورالعملهای مجزای ضرب، جمع، تفریق و منفیسازی (negate) یکسان است.
- -nocpp
- به اسمبلر MIPS اعلام میکند که هنگام اسمبل کردن فایلهای اسمبلی کاربر (دارای پسوند .s)، پیشپردازندهٔ خود را روی آنها اجرا نکند.
- -mfix-24k
- -mno-fix-24k
- دور زدن خطای سختافزاری 24K E48 (از دست رفتن دادهها در عملیاتهای ذخیرهسازی حین بازپرکنی/refill). راهکارهای دور زدن به جای GCC توسط اسمبلر پیادهسازی شدهاند.
- -mfix-r4000
- -mno-fix-r4000
- دور زدن برخی از خطاهای سختافزاری پردازندهٔ R4000:
- یک شیفت (انتقال) دوکلمهای یا متغیر اگر بلافاصله پس از شروع تقسیم عدد صحیح اجرا شود، ممکن است نتیجهٔ نادرستی بدهد.
- یک شیفت دوکلمهای یا متغیر اگر در حین انجام ضرب عدد صحیح اجرا شود، ممکن است نتیجهٔ نادرستی بدهد.
- یک تقسیم عدد صحیح اگر در شکاف تأخیر (delay slot) یک انشعاب محققشده یا یک پرش آغاز شود، ممکن است نتیجهٔ نادرستی بدهد.
- -mfix-r4400
- -mno-fix-r4400
- دور زدن برخی از خطاهای سختافزاری پردازندهٔ R4400:
- -
- یک شیفت دوکلمهای یا متغیر اگر بلافاصله پس از شروع تقسیم عدد صحیح اجرا شود، ممکن است نتیجهٔ نادرستی بدهد.
- -mfix-r10000
- -mno-fix-r10000
- دور زدن برخی از خطاهای سختافزاری R10000:
- -
- دنبالههای "ll"/"sc" ممکن است در بازبینیهای پیش از 3.0 رفتار اتمی نداشته باشند. آنها ممکن است در بازبینیهای 2.6 و قدیمیتر دچار بنبست (deadlock) شوند.
این گزینه تنها در صورتی قابل استفاده است که معماری هدف از دستورالعملهای branch-likely پشتیبانی کند. وقتی از -march=r10000 استفاده میشود، -mfix-r10000 پیشفرض است؛ در غیر این صورت پیشفرض -mno-fix-r10000 خواهد بود.
- -mfix-r5900
- -mno-fix-r5900
- تلاشی برای زمانبندی دستورالعمل پیشین در شکاف تأخیر یک دستور انشعاب واقع در انتهای یک حلقهٔ کوتاه با شش دستورالعمل یا کمتر صورت نگیرد و همواره بهجای آن یک دستورالعمل "nop" در آنجا زمانبندی شود. اشکال حلقهٔ کوتاه تحت شرایط خاص باعث میشود حلقهها به دلیل وجود یک اشکال سختافزاری در تراشهٔ R5900 تنها یک یا دو بار اجرا شوند. راهکار دور زدن به جای GCC توسط اسمبلر پیادهسازی شده است.
- -mfix-rm7000
- -mno-fix-rm7000
- دور زدن خطای سختافزاری "dmult"/"dmultu" در RM7000. راهکارهای دور زدن به جای GCC توسط اسمبلر پیادهسازی شدهاند.
- -mfix-vr4120
- -mno-fix-vr4120
- دور زدن برخی از خطاهای سختافزاری پردازندهٔ VR4120:
- -
- دستورات "div" و "ddiv" در صورتی که یکی از عملوندها منفی باشد، همیشه نتیجه درست را تولید نمیکنند.
راهکارهای دور زدن این خطاهای تقسیم به توابع ویژهای در libgcc.a وابسته هستند. در حال حاضر، این توابع فقط توسط پیکربندیهای "mips64vr*-elf" ارائه میشوند.
سایر خطاهای پردازنده VR4120 نیازمند درج یک NOP میان جفتدستورهای خاصی هستند. این خطاها توسط اسمبلر مدیریت میشوند، نه خود GCC.
- -mfix-vr4130
- خطاهای سختافزاری "mflo"/"mfhi" در VR4130 را دور میزند. این راهکارها بهجای GCC توسط اسمبلر پیادهسازی شدهاند، هرچند اگر دستورات "macc"، "macchi"، "dmacc" و "dmacchi" در پردازنده VR4130 در دسترس باشند، GCC از بهکارگیری "mflo" و "mfhi" خودداری میکند.
- -mfix-sb1
- -mno-fix-sb1
- خطاهای سختافزاری خاصی در هسته پردازنده SB-1 را دور میزند. (این پرچم در حال حاضر خطاهای ممیز شناور «F1» و «F2» در بازبینی ۲ پردازنده SB-1 را دور میزند.)
- -mr10k-cache-barrier=setting
- مشخص
میکند که
آیا GCC باید
حائلهای
حافظه
پنهان (cache barriers) را
برای
جلوگیری از
اثرات
جانبی
اجرای حدسی
(speculation) در
پردازندههای
R10K درج کند یا
خیر.
مشابه بسیاری از پردازندهها، R10K تلاش میکند نتیجه یک انشعاب شرطی را پیشبینی کرده و دستورات شاخه پیشبینیشده را بهصورت حدسی اجرا کند. اگر پیشبینی اشتباه باشد، بعداً این دستورات را لغو میکند. با این حال، در R10K حتی دستورات لغوشده نیز میتوانند اثرات جانبی داشته باشند.
این مشکل فقط بر عملیاتهای ذخیرهسازی هسته و بسته به سامانه، بر عملیاتهای بارگذاری هسته اثر میگذارد. به عنوان مثال، یک ذخیرهسازی که بهصورت حدسی اجرا شده است، ممکن است حافظه هدف را در حافظه پنهان بارگذاری کرده و سطر حافظه پنهان را به عنوان کثیف (dirty) علامتگذاری کند، حتی اگر خود عملیات ذخیرهسازی بعداً لغو شود. اگر پیش از تخلیه سطر «dirty»، یک عملیات DMA روی همان بخش از حافظه بنویسد، دادههای درون حافظه پنهان، دادههای نوشتهشده توسط DMA را بازنویسی و تخریب میکنند. برای توضیحات کاملتر و سایر مشکلات احتمالی، به دفترچه راهنمای پردازنده R10K مراجعه کنید.
یک راهکار، درج دستورات حائل حافظه پنهان پیش از هر دسترسی به حافظه است که ممکن است بهصورت حدسی اجرا شود و حتی در صورت لغو شدن اثرات جانبی داشته باشد. گزینه -mr10k-cache-barrier=setting نحوه پیادهسازی این راهکار توسط GCC را کنترل میکند. این گزینه فرض میکند دسترسیهای لغوشده به هر بایتی در نواحی زیر فاقد اثر جانبی است:
- 1.
- حافظه اشغالشده توسط چارچوب پشته تابع فعلی؛
- 2.
- حافظه اشغالشده توسط آرگومان ورودی پشته؛
- 3.
- حافظه اشغالشده توسط شیئی با آدرس ثابت در زمان پیوند.
اطمینان از ایمن بودن دسترسیهای حدسی به این نواحی، بر عهده هسته سیستمعامل است.
اگر برنامه ورودی حاوی اعلانی برای تابعی مانند نمونه زیر باشد:
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 و D باید فراخوانی شود، یا مشخص میکند که هیچ تابعی فراخوانی نشود. در صورت فراخوانی، این تابع باید آرگومانهایی مشابه تابع متداول "_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 به بعد، در صورت در دسترس بودن، دستور انشعاب فشرده تولید شود. اگر دستور انشعاب فشرده در دسترس نباشد (یا در نسخههای پیش از 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
از نوع
سوپراسکالر
دوخطه است،
اما تنها در
صورتی
میتواند
دو دستور را
همزمان
صادر کند که
دستور اول
با ۸ بایت
همتراز
شده باشد.
هنگامی که
این گزینه
فعال باشد،
GCC
جفتدستورهایی
را که تشخیص
میدهد
باید
بهصورت
موازی اجرا
شوند،
همتراز
میکند.
این گزینه تنها هنگام بهینهسازی برای VR4130 اثرگذار است. این گزینه معمولاً کد را سریعتر میکند، اما به قیمت افزایش حجم آن تمام میشود. این گزینه بهطور پیشفرض در سطح بهینهسازی -O3 فعال است.
- -msynci
- -mno-synci
- تولید
دستورالعملهای
"synci" را
در
معماریهایی
که از آن
پشتیبانی
میکنند،
فعال (یا
غیرفعال)
میکند.
دستورات
"synci" (در
صورت فعال
بودن) هنگام
کامپایل
"__builtin___clear_cache"
تولید
میشوند.
مقدار پیشفرض این گزینه -mno-synci است، اما این مقدار پیشفرض را میتوان با پیکربندی GCC با گزینه --with-synci بازنویسی کرد.
هنگام کامپایل کد برای سامانههای تکپردازندهای، استفاده از "synci" معمولاً ایمن است. با این حال، در بسیاری از سامانههای چندهستهای (SMP)، این دستور حافظه پنهان دستورالعمل را در همه هستهها باطل نمیکند و ممکن است به رفتار تعریفنشده منجر شود..IP -mrelax-pic-calls 4
- -mno-relax-pic-calls
- تلاش
میکند
فراخوانیهای
PIC را که
معمولاً از
طریق ثبات
$25 ارسال
میشوند،
به
فراخوانیهای
مستقیم
تبدیل کند.
این کار
تنها در
صورتی
امکانپذیر
است که
پیونددهنده
(linker) بتواند
مقصد را در
زمان پیوند
حلوفصل
کند و مقصد
در محدودهٔ
مجاز برای
یک
فراخوانی
مستقیم
باشد.
اگر GCC بهگونهای پیکربندی شده باشد که از یک اسمبلر و یک پیونددهنده با پشتیبانی از دستورالعمل اسمبلی ".reloc" استفاده کند و -mexplicit-relocs فعال باشد، گزینهٔ -mrelax-pic-calls حالت پیشفرض است. با -mno-explicit-relocs، این بهینهسازی میتواند توسط اسمبلر و پیونددهنده بهتنهایی و بدون کمک کامپایلر انجام شود.
- -mmcount-ra-address
- -mno-mcount-ra-address
- تولید (یا عدم تولید) کدی که به "_mcount" اجازه میدهد آدرس بازگشت تابع فراخواننده را تغییر دهد. در صورت فعال بودن، این گزینه رابط معمول "_mcount" را با یک پارامتر جدید ra-address گسترش میدهد که دارای نوع "intptr_t *" بوده و در ثبات $12 ارسال میشود. سپس "_mcount" میتواند با انجام هر دوی موارد زیر، آدرس بازگشت را اصلاح کند:
- بازگرداندن آدرس جدید در ثبات $31.
- ذخیرهٔ آدرس جدید در "*ra-address"، در صورتی که ra-address ناتهی (nonnull) باشد.
پیشفرض -mno-mcount-ra-address است.
- -mframe-header-opt
- -mno-frame-header-opt
- فعالسازی
(غیرفعالسازی)
بهینهسازی
سرآیند
فریم (frame header) در o32 ABI.
هنگام
استفاده از
o32 ABI، توابع
فراخواننده
۱۶ بایت را
در پشته
تخصیص
میدهند تا
تابع
فراخواندهشده
آرگومانهای
ثبات را در
آن بنویسد.
در صورت
فعال بودن،
اگر مشخص
شود که این
سرآیند
فریم
بیاستفاده
است، این
بهینهسازی
از تخصیص آن
جلوگیری
میکند.
این بهینهسازی بهطور پیشفرض در تمام سطوح بهینهسازی غیرفعال است.
- -mlxc1-sxc1
- -mno-lxc1-sxc1
- در صورت امکانپذیر بودن، تولید دستورالعملهای "lwxc1"، "swxc1"، "ldxc1" و "sdxc1" را فعال (غیرفعال) میکند. بهطور پیشفرض فعال است.
- -mmadd4
- -mno-madd4
- در صورت امکانپذیر بودن، تولید دستورالعملهای ۴ عملوندی "madd.s"، "madd.d" و دستورالعملهای مرتبط را فعال (غیرفعال) میکند. بهطور پیشفرض فعال است.
گزینههای MMIX
این گزینهها برای معماری MMIX تعریف شدهاند:
- -mlibfuncs
- -mno-libfuncs
- مشخص میکند که توابع درونی کتابخانه (intrinsic) در حال کامپایل هستند، و تمام مقادیر بدون توجه به اندازهشان در ثباتها ارسال میشوند.
- -mepsilon
- -mno-epsilon
- دستورالعملهای مقایسهٔ ممیز شناور تولید میکند که نسبت به ثبات اپسیلون "rE" مقایسه را انجام میدهند.
- -mabi=mmixware
- -mabi=gnu
- کدی تولید میکند که پارامترهای تابع و مقادیر بازگشتی را بهگونهای ارسال میکند که (در تابع فراخواندهشده) بهصورت ثباتهای $0 به بالا دیده میشوند، بر خلاف GNU ABI که از ثباتهای سراسری $231 به بالا استفاده میکند.
- -mzero-extend
- -mno-zero-extend
- هنگام خواندن دادهها از حافظه با اندازههای کوتاهتر از ۶۴ بیت، بهطور پیشفرض از دستورالعملهای بارگذاری گسترش با صفر (zero-extending) به جای گسترش با علامت (sign-extending) استفاده میکند (یا نمیکند).
- -mknuthdiv
- -mno-knuthdiv
- کاری میکند که حاصل تقسیمی که دارای باقیمانده است، همعلامت با مقسومعلیه باشد. در حالت پیشفرض، -mno-knuthdiv، علامت باقیمانده از علامت مقسوم پیروی میکند. هر دو روش از نظر ریاضی معتبر هستند، اما روش دوم تقریباً بهطور انحصاری استفاده میشود.
- -mtoplevel-symbols
- -mno-toplevel-symbols
- یک : به ابتدای تمام نمادهای سراسری اضافه میکند (یا اضافه نمیکند)، تا کد اسمبلی بتواند با دستورالعمل اسمبلی "PREFIX" استفاده شود.
- -melf
- یک فایل اجرایی در قالب ELF به جای قالب پیشفرض mmo که توسط شبیهساز mmix استفاده میشود، تولید میکند.
- -mbranch-predict
- -mno-branch-predict
- هنگامی که پیشبینی ایستا برای انشعاب (static branch prediction) یک انشعاب محتمل را نشان میدهد، از دستورالعملهای انشعاب محتمل (probable-branch) استفاده میکند (یا نمیکند).
- -mbase-addresses
- -mno-base-addresses
- کدی تولید میکند (یا نمیکند) که از آدرسهای پایه (base addresses) استفاده میکند. استفاده از یک آدرس پایه بهطور خودکار درخواستی را (که توسط اسمبلر و پیونددهنده مدیریت میشود) برای تنظیم یک مقدار ثابت در یک ثبات سراسری ایجاد میکند. این ثبات برای یک یا چند درخواست آدرس پایه در محدودهٔ ۰ تا ۲۵۵ از مقدار نگهداریشده در ثبات استفاده میشود. این موضوع بهطور کلی به کدی کوتاهتر و سریعتر منجر میشود، اما تعداد اقلام دادهای مختلف که میتوان به آنها آدرسدهی کرد محدود است. این بدان معناست که برنامهای که از مقادیر زیادی دادههای ایستا استفاده میکند ممکن است به -mno-base-addresses نیاز داشته باشد.
- -msingle-exit
- -mno-single-exit
- کد تولیدشده را مجبور میکند (یا نمیکند) که در هر تابع تنها یک نقطهٔ خروج داشته باشد.
گزینههای MN10300
این گزینههای -m برای معماریهای Matsushita MN10300 تعریف شدهاند:
- -mmult-bug
- کدی برای اجتناب از باگهای موجود در دستورالعملهای ضرب پردازندههای MN10300 تولید میکند. این حالت پیشفرض است.
- -mno-mult-bug
- کدی برای اجتناب از باگهای موجود در دستورالعملهای ضرب پردازندههای MN10300 تولید نمیکند.
- -mam33
- کدی با استفاده از قابلیتهای خاص پردازندهٔ AM33 تولید میکند.
- -mno-am33
- کدی با استفاده از قابلیتهای خاص پردازندهٔ AM33 تولید نمیکند. این حالت پیشفرض است.
- -mam33-2
- کدی با استفاده از قابلیتهای خاص پردازندهٔ AM33/2.0 تولید میکند.
- -mam34
- کدی با استفاده از قابلیتهای خاص پردازندهٔ AM34 تولید میکند.
- -mtune=cpu-type
- هنگام زمانبندی دستورالعملها، از مشخصات زمانبندی نوع CPU مشخصشده استفاده میکند. این کار نوع پردازندهٔ هدف را تغییر نمیدهد. نوع CPU باید یکی از موارد mn10300، am33، am33-2 یا am34 باشد.
- -mreturn-pointer-on-d0
- هنگام تولید تابعی که یک اشارهگر بازمیگرداند، اشارهگر را در هر دو ثبات "a0" و "d0" بازمیگرداند. در غیر این صورت، اشارهگر تنها در "a0" بازگردانده میشود، و تلاش برای فراخوانی چنین توابعی بدون پیشنمونه (prototype) منجر به بروز خطا خواهد شد. توجه داشته باشید که این گزینه بهطور پیشفرض فعال است؛ برای غیرفعال کردن آن از -mno-return-pointer-on-d0 استفاده کنید.
- -mno-crt0
- فایل شیءِ
مقداردهی
اولیهٔ
زمان اجرای
C را پیوند
نمیدهد..IP
-mrelax 4 به
پیونددهنده
اعلام
میکند که
باید یک
مرحله
بهینهسازی
آزادسازی
(relaxation) را برای
کوتاهتر
کردن
انشعابها،
فراخوانیها
و آدرسهای
حافظهٔ
مطلق انجام
دهد. این
گزینه تنها
زمانی
تأثیر دارد
که در خط
فرمان برای
مرحلهٔ
نهایی
پیوند
استفاده
شود.
این گزینه اشکالزدایی نمادین را غیرممکن میکند.
- -mliw
- در صورتی که هدف AM33 یا جدیدتر باشد، به کامپایلر اجازه میدهد دستورالعملهای Long Instruction Word را تولید کند. این حالت پیشفرض است. این گزینه ماکروی پیشپردازندهٔ "__LIW__" را تعریف میکند.
- -mno-liw
- به کامپایلر اجازه نمیدهد دستورالعملهای Long Instruction Word را تولید کند. این گزینه ماکروی پیشپردازندهٔ "__NO_LIW__" را تعریف میکند.
- -msetlb
- در صورتی که هدف AM33 یا جدیدتر باشد، به کامپایلر اجازه میدهد دستورالعملهای SETLB و Lcc را تولید کند. این حالت پیشفرض است. این گزینه ماکروی پیشپردازندهٔ "__SETLB__" را تعریف میکند.
- -mno-setlb
- به کامپایلر اجازهٔ تولید دستورالعملهای SETLB یا Lcc را نمیدهد. این گزینه ماکروی پیشپردازندهٔ "__NO_SETLB__" را تعریف میکند.
گزینههای Moxie
- -meb
- تولید کد با ترتیب بایت بزرگپایان (big-endian). این حالت پیشفرض برای پیکربندیهای moxie-*-* است.
- -mel
- تولید کد با ترتیب بایت کوچکپایان (little-endian).
- -mmul.x
- تولید دستورالعملهای mul.x و umul.x. این حالت پیشفرض برای پیکربندیهای moxiebox-*-* است.
- -mno-crt0
- فایل شیء راهاندازی زمان اجرای C را پیوند نزن.
گزینههای MSP430
این گزینهها برای MSP430 تعریف شدهاند:
- -masm-hex
- خروجی اسمبلی را وادار میکند تا همیشه از ثابتهای هگزادسیمال استفاده کند. به طور معمول چنین ثابتهایی به صورت دهدهی علامتدار هستند، اما این گزینه برای اهداف مجموعهٔ آزمایش (testsuite) و/یا زیباشناختی ارائه شده است.
- -mmcu=
- انتخاب MCU
مورد نظر
برای هدف.
این گزینه
برای ایجاد
یک نماد
پیشپردازندهٔ
C بر اساس
نام MCU به کار
میرود که
به حروف
بزرگ تبدیل
شده و
پیشوند و
پسوند __ به
آن اضافه
میشود. این
نماد به
نوبهٔ خود
توسط فایل
سرآیند msp430.h
جهت انتخاب
یک فایل
سرآیند
تکمیلی
ویژهٔ آن MCU
استفاده
میشود.
این گزینه همچنین معماری مجموعه دستورالعمل (ISA) مورد استفاده را مشخص میکند. اگر نام MCU از مواردی باشد که منحصراً از ISA 430 پشتیبانی میکند، همان انتخاب میشود، در غیر این صورت ISA 430X انتخاب خواهد شد. نام عمومی MCU با عنوان msp430 نیز میتواند برای انتخاب ISA 430 استفاده شود. به طور مشابه، نام عمومی MCU به صورت msp430x معماری ISA 430X را انتخاب میکند.
علاوه بر این، یک اسکریپت پیونددهندهٔ ویژهٔ MCU به خط فرمان پیونددهنده اضافه میشود. نام اسکریپت، نام MCU به همراه پسوند .ld است. بدین ترتیب تعیین -mmcu=xxx در خط فرمان gcc نماد پیشپردازندهٔ C "__XXX__" را تعریف کرده و باعث میشود پیونددهنده به دنبال اسکریپتی به نام xxx.ld بگردد.
پشتیبانی از ISA و ضرب سختافزاری برای MCUهای گوناگون به صورت توکار (hard-coded) در GCC تعبیه شده است. با این حال، میتوان از یک فایل خارجی devices.csv برای توسعهٔ پشتیبانی از دستگاهها فراتر از موارد توکار استفاده کرد.
کامپایلر GCC با استفاده از روشهای زیر و به ترتیب اولویت به دنبال فایل devices.csv میگردد؛ به این صورت که روش اول بر روش دوم و روش دوم بر روش سوم اولویت دارد.
- مسیر include مشخصشده با "-I" و "-L"
- فایل devices.csv در هر یک از دایرکتوریهای مشخصشده توسط مسیرهای include و مسیرهای جستجوی کتابخانهٔ پیونددهنده جستجو میشود.
- مسیر مشخصشده توسط متغیر محیطی MSP430_GCC_INCLUDE_DIR
- مقدار متغیر محیطی سراسری MSP430_GCC_INCLUDE_DIR را برابر مسیر کامل دایرکتوری حاوی devices.csv قرار دهید، و GCC این دایرکتوری را برای devices.csv جستجو خواهد کرد. در صورت پیدا شدن devices.csv، این دایرکتوری به عنوان مسیر include و مسیر کتابخانهٔ پیونددهنده نیز ثبت میشود. بنابراین فایلهای سرآیند و اسکریپتهای پیونددهنده در این دایرکتوری میتوانند بدون تعیین دستی "-I" و "-L" در خط فرمان استفاده شوند.
- دایرکتوری msp430-elf{,bare}/include/devices
- در نهایت، GCC مسیر msp430-elf{,bare}/include/devices را از دایرکتوری ریشهٔ زنجیره ابزار بررسی میکند. این دایرکتوری در نصب پیشفرض وجود ندارد، اما اگر کاربر آن را ایجاد کرده و devices.csv را در آنجا کپی کرده باشد، دادههای MCU خوانده میشوند. همانند مورد قبل، این دایرکتوری نیز به عنوان مسیر include و مسیر کتابخانهٔ پیونددهنده ثبت میشود.
اگر هیچیک از روشهای جستجوی بالا فایل devices.csv را پیدا نکنند، از دادههای توکار MCU استفاده میشود.
- -mwarn-mcu
- -mno-warn-mcu
- این گزینه هشدارهای مربوط به ناسازگاری میان نام MCU مشخصشده توسط گزینهٔ -mmcu و ISA تعیینشده با گزینهٔ -mcpu و/یا پشتیبانی ضرب سختافزاری تعیینشده با گزینهٔ -mhwmult را فعال یا غیرفعال میکند. همچنین هشدارهای مربوط به نامهای ناشناختهٔ MCU را فعال یا غیرفعال میسازد. این گزینه به طور پیشفرض فعال است.
- -mcpu=
- معماری مجموعه دستورالعمل (ISA) مورد استفاده را مشخص میکند. مقادیر پذیرفتهشده عبارتند از msp430، msp430x و msp430xv2. این گزینه منسوخ شده است. برای انتخاب ISA باید از گزینهٔ -mmcu= استفاده شود.
- -msim
- پیوند به کتابخانههای زمان اجرای شبیهساز و اسکریپت پیونددهنده. این گزینه بر هر اسکریپتی که توسط گزینهٔ -mmcu= انتخاب شود اولویت دارد.
- -mlarge
- استفاده از آدرسدهی مدل بزرگ (اشارهگرهای ۲۰ بیتی، "size_t" ۲۰ بیتی).
- -msmall
- استفاده از آدرسدهی مدل کوچک (اشارهگرهای ۱۶ بیتی، "size_t" ۱۶ بیتی).
- -mrelax
- این گزینه به اسمبلر و پیونددهنده منتقل میشود و به پیونددهنده اجازه میدهد بهینهسازیهای خاصی را که انجام آنها تا مرحلهٔ نهایی پیوند ممکن نیست، به انجام برساند.
- mhwmult=
- نوع ضرب
سختافزاری
پشتیبانیشده
توسط هدف را
شرح میدهد.
مقادیر
پذیرفتهشده
عبارتند از:
none برای عدم
وجود ضرب
سختافزاری،
16bit برای ضرب
اولیه و
صرفاً ۱۶
بیتی
پشتیبانیشده
در MCUهای
ابتدایی،
32bit برای ضرب
۱۶/۳۲ بیتی
پشتیبانیشده
در MCUهای
جدیدتر، و
f5series برای ضرب
۱۶/۳۲ بیتی
پشتیبانیشده
در MCUهای سری F5.
همچنین
مقدار auto
نیز
میتواند
مشخص شود.
این مقدار
به GCC اعلام
میکند که
پشتیبانی
از ضرب
سختافزاری
را بر اساس
نام MCU
ارائهشده
توسط
گزینهٔ -mmcu
استنتاج
کند. اگر
هیچ گزینهٔ
-mmcu تعیین
نشده باشد
یا اگر نام MCU
ناشناخته
باشد، عدم
پشتیبانی
از ضرب
سختافزاری
فرض میشود.
مقدار
"auto" حالت
پیشفرض
است.
ضربهای سختافزاری معمولاً با فراخوانی یک روال کتابخانهای انجام میشوند. این کار در اندازهٔ کد تولیدشده صرفهجویی میکند. اما در زمان کامپایل با سطح بهینهسازی -O3 یا بالاتر، ضربکنندهٔ سختافزاری به صورت درونخطی (inline) فراخوانی میشود. این امر کدی حجیمتر اما سریعتر به همراه دارد.
روالهای ضرب سختافزاری هنگام اجرا وقفهها را غیرفعال کرده و پس از پایان، وضعیت قبلی وقفه را بازیابی میکنند. این موضوع استفاده از آنها را هم در گردانندههای وقفه و هم در کدهای معمولی ایمن میسازد.
- -minrt
- استفاده از یک محیط زمان اجرای حداقلی را فعال میکند - بدون مقداردهندههای اولیه یا سازندههای (constructors) ایستا. این گزینه برای دستگاههای با محدودیت شدید حافظه در نظر گرفته شده است. کامپایلر نمادهای ویژهای را در برخی اشیاء قرار میدهد که به پیونددهنده و زمان اجرا اعلام میکنند کدام قطعهکدها مورد نیاز هستند.
- -mtiny-printf
- توابع
کتابخانهای
"printf" و
"puts" با
اندازه کد
کاهشیافته
را فعال
میکند.
پیادهسازیهای
tiny از این
توابع
دارای
ویژگی
بازورودی
(reentrant) نیستند،
بنابراین
در
برنامههای
چندریسمانی
باید با
احتیاط
استفاده
شوند.
پشتیبانی از جریانها (streams) حذف شده است و رشتهای که باید چاپ شود همیشه از طریق فراخوانی سیستمی "write" به stdout ارسال میشود. این رشته قبل از ارسال به write بافر نمیشود.
این گزینه به Newlib Nano IO نیازمند است، بنابراین GCC باید همراه با گزینهٔ --enable-newlib-nano-formatted-io پیکربندی شده باشد.
- -mmax-inline-shift=
- این گزینه
یک عدد صحیح
بین ۰ تا ۶۴
(شامل هر دو)
را دریافت
میکند و
حداکثر
تعداد
دستورالعملهای
شیفت
درونخطی
را تعیین
میکند که
باید برای
انجام
عملیات
شیفت با
مقداری
ثابت تولید
شوند.
هنگامی که
نیاز به
مقداری
فراتر از
این حد
باشد، به
جای آن از
یک تابع
کمکی mspabi
استفاده
میشود.
مقدار
پیشفرض ۴
است.
این گزینه فقط مواردی را تحت تأثیر قرار میدهد که در آنها شیفت با چندین موقعیت مختلف را نتوان با یک دستورالعمل واحد تکمیل کرد (به عنوان مثال، تمام شیفتهای بزرگتر از ۱ در ISA 430).
شیفتهای یک مقدار ۳۲ بیتی حداقل دو برابر هزینهبر هستند، بنابراین مقدار ارائهشده برای این گزینه بر ۲ تقسیم شده و مقدار حاصل به جای آن استفاده میشود.
- -mcode-region=
- -mdata-region=
- این گزینهها به کامپایلر مشخص میکنند توابع و دادههایی را که فاقد یکی از ویژگیهای "lower"، "upper"، "either" یا "section" هستند در کجا قرار دهد. مقادیر مجاز عبارتند از "lower"، "upper"، "either" یا "any". سه مقدار اول مانند ویژگیهای متناظر خود عمل میکنند. مقدار چهارم - "any" - حالت پیشفرض است. این مقدار، تصمیمگیری دربارهٔ جایگذاری را به طور کامل به اسکریپت پیونددهنده و نحوهٔ تخصیص بخشهای استاندارد (".text"، ".data" و غیره) به نواحی حافظه واگذار میکند..IP -msilicon-errata= 4 این گزینه درخواستی را به اسمبلر ارسال میکند تا اصلاحات مربوط به نقصهای سختافزاری (silicon errata) نامبرده را فعال کند.
- -msilicon-errata-warn=
- این گزینه درخواستی را به اسمبلر ارسال میکند تا پیامهای هشدار را در مواردی که ممکن است نیاز به اعمال اصلاحات نقص سختافزاری (silicon errata) باشد، فعال کند.
- -mwarn-devices-csv
- -mno-warn-devices-csv
- در صورت پیدا نشدن devices.csv یا وجود مشکل در تجزیه آن هشدار میدهد (پیشفرض: فعال).
گزینههای NDS32
این گزینهها برای پیادهسازیهای NDS32 تعریف شدهاند:
- -mbig-endian
- تولید کد در حالت big-endian.
- -mlittle-endian
- تولید کد در حالت little-endian.
- -mreduced-regs
- استفاده از مجموعه ثباتهای کاهشیافته برای تخصیص ثباتها.
- -mfull-regs
- استفاده از مجموعه ثباتهای کامل برای تخصیص ثباتها.
- -mcmov
- تولید دستورالعملهای انتقال شرطی (conditional move).
- -mno-cmov
- عدم تولید دستورالعملهای انتقال شرطی.
- -mext-perf
- تولید دستورالعملهای افزونه کارایی (performance extension).
- -mno-ext-perf
- عدم تولید دستورالعملهای افزونه کارایی.
- -mext-perf2
- تولید دستورالعملهای افزونه کارایی ۲ (performance extension 2).
- -mno-ext-perf2
- عدم تولید دستورالعملهای افزونه کارایی ۲.
- -mext-string
- تولید دستورالعملهای افزونه رشته (string extension).
- -mno-ext-string
- عدم تولید دستورالعملهای افزونه رشته.
- -mv3push
- تولید دستورالعملهای push25/pop25 نگارش v3.
- -mno-v3push
- عدم تولید دستورالعملهای push25/pop25 نگارش v3.
- -m16-bit
- تولید دستورالعملهای ۱۶ بیتی.
- -mno-16-bit
- عدم تولید دستورالعملهای ۱۶ بیتی.
- -misr-vector-size=num
- اندازه هر بردار وقفه (interrupt vector) را مشخص میکند که باید ۴ یا ۱۶ باشد.
- -mcache-block-size=num
- اندازه هر بلوک حافظه موقت (cache block) را مشخص میکند که باید توانی از ۲ بین ۴ تا ۵۱۲ باشد.
- -march=arch
- نام معماری هدف را مشخص میکند.
- -mcmodel=code-model
- مدل کد را بر روی یکی از موارد زیر تنظیم میکند:
- small
- تمام بخشهای داده (data) و دادههای فقطخواندنی (read-only data) باید در فضای آدرسدهی 512KB قرار گیرند. بخش کد (text) باید در فضای آدرسدهی 16MB باشد.
- medium
- بخش داده باید در 512KB قرار گیرد در حالی که بخش دادههای فقطخواندنی میتواند در فضای آدرسدهی 4GB باشد. بخش کد همچنان باید در فضای آدرسدهی 16MB قرار داشته باشد.
- large
- تمام بخشهای کد و داده میتوانند در فضای آدرسدهی 4GB قرار گیرند.
- -mctor-dtor
- فعالسازی قابلیت سازنده/ویرانگر (constructor/destructor).
- -mrelax
- هدایت پیونددهنده (linker) برای بهینهسازی و کاهش طول دستورالعملها (relax instructions).
گزینههای Nvidia PTX
این گزینهها برای Nvidia PTX تعریف شدهاند:
- -m64
- نادیده گرفته میشود، اما برای سازگاری رو به عقب حفظ شده است. تنها ABI شصت و چهار بیتی (64-bit) پشتیبانی میشود.
- -march=architecture-string
- تولید کد
برای
معماری هدف
مشخصشده PTX ISA.
رشتههای
معماری
معتبر
عبارتند از:
sm_30، sm_35، sm_37،
sm_52، sm_53، sm_61،
sm_70، sm_75، sm_80 و
sm_89. مقدار
پیشفرض به
نحوه
پیکربندی
کامپایلر
بستگی
دارد؛
گزینه --with-arch
را ببینید.
این گزینه مقدار ماکروی پیشپردازنده "__PTX_SM__" را تنظیم میکند؛ به عنوان مثال، برای sm_35 مقدار آن برابر 350 است.
- -misa=architecture-string
- نام مستعار -march=.
- -march-map=architecture-string
- نزدیکترین مقدار موجود برای -march= را که دارای قابلیتهای بیشتری نباشد، انتخاب میکند. برای مثال، برای -march-map=sm_50 مقدار -march=sm_37 و برای -march-map=sm_53 مقدار -march=sm_53 انتخاب میشود.
- -mptx=version-string
- تولید کد
برای نسخه
مشخصشده PTX ISA.
رشتههای
نسخه معتبر
عبارتند از:
3.1، 4.1، 4.2،
5.0، 6.0، 6.3،
7.0، 7.3 و 7.8.
نسخه
پیشفرض PTX ISA
نسخهای
است که
پشتیبانی
از معماری
هدف PTX ISA
انتخابشده
را افزوده
است (گزینه
-march= را
ببینید)،
اما حداقل
6.3 است، یا
برای -march=sm_52 و
بالاتر،
حداقل 7.3
میباشد.
این گزینه مقادیر ماکروهای پیشپردازنده "__PTX_ISA_VERSION_MAJOR__" و "__PTX_ISA_VERSION_MINOR__" را تنظیم میکند؛ به عنوان مثال، برای 3.1 این ماکروها به ترتیب دارای مقادیر 3 و 1 هستند.
- -mmainkernel
- کد مربوط به یک هسته (kernel) __main را پیوند میدهد. این گزینه برای اجرای مستقل (stand-alone) به جای برونسپاری محاسبات (offloading) به کار میرود.
- -moptimize
- اعمال بهینهسازیهای اجرای بخشبندیشده (partitioned execution). هنگام انتخاب هر سطحی از بهینهسازی، این حالت پیشفرض است.
- -msoft-stack
- -mno-soft-stack
- برای -mno-soft-stack
(حالت
پیشفرض،
مگر اینکه
-mgomp مشخص شده
باشد)، از
پشتههای
«بومی» (native) در
PTX استفاده
میشود؛
یعنی کدی
تولید
میشود که
مستقیماً
از حافظه
".local" یا
"alloca" در PTX
برای
ذخیرهسازی
پشته
استفاده
میکند. مگر
اینکه -mptx=7.3 یا
بالاتر و
-march=sm_52 یا
بالاتر
فعال
باشند،
آرایههای
با طول
متغیر (variable-length arrays) و
تخصیص
پویای
حافظه در
پشته با
"alloca"
پشتیبانی
نمیشوند.
برای -msoft-stack (که توسط -mgomp اعمال میشود)، کدی تولید میشود که مستقیماً از حافظه ".local" یا "alloca" در PTX برای ذخیرهسازی پشته استفاده نمیکند. در عوض، یک اشارهگر پشته به ازای هر warp به طور صریح نگهداری میشود. این کار تخصیص متغیر پشته (با استفاده از آرایههای با طول متغیر یا "alloca") را ممکن میسازد، و هنگامی که از حافظه سراسری (global memory) به عنوان فضای زیرین استفاده میشود، امکان دسترسی به متغیرهای خودکار (automatic variables) از طریق ریسمانهای دیگر یا با دستورالعملهای اتمیک را فراهم میکند. این شیوه تولید کد برای برونسپاری محاسبات OpenMP استفاده میشود، اما این گزینه به تنهایی نیز جهت آزمایش کامپایلر در دسترس قرار گرفته است؛ برای تولید کدی که برای پیوند به برنامههای استفادهکننده از برونسپاری محاسبات OpenMP مناسب باشد، از گزینه -mgomp استفاده کنید.
- -muniform-simt
- تغییر به حالت تولید کدی که اجازه میدهد تمام ریسمانها در هر warp اجرا شوند، در حالی که وضعیت حافظه و اثرات جانبی را به گونهای حفظ میکند که گویی تنها یک ریسمان در هر warp خارج از نواحی OpenMP SIMD فعال است. تمام عملیات اتمیک و فراخوانیهای زمان اجرا (malloc، free، vprintf) به صورت مشروط اجرا میشوند (تنها در صورتی که نمایه lane جاری با نمایه lane اصلی برابر باشد)، و ثباتی که مقداردهی میشود با استفاده از یک دستورالعمل shuffle از lane اصلی کپی میشود. خارج از نواحی SIMD، نمایه lane 0 به عنوان اصلی است؛ درون آن، هر ریسمان خود را به عنوان اصلی در نظر میگیرد. آرایه حافظه اشتراکی "int __nvptx_uni[]" ماسکهای بیتی تمامصفر یا تمامیک را برای هر warp ذخیره میکند که نشاندهنده حالت جاری است (۰ در خارج از نواحی SIMD). هر ریسمان میتواند ماسک بیتی را در موقعیت "tid.y" با نمایه lane جاری عملیات AND بیتی کند تا نمایه lane اصلی را محاسبه نماید.
- -mgomp
- تولید کد برای استفاده در برونسپاری محاسبات OpenMP: گزینههای -msoft-stack و -muniform-simt را فعال کرده و گونه multilib متناظر را انتخاب میکند..PP گزینههای OpenRISC
این گزینهها برای OpenRISC تعریف شدهاند:
- -mboard=name
- پیکربندی محیط زماناجرای (runtime) مخصوص یک برد خاص. این مقدار برای پیوند با کتابخانهٔ برد newlib به پیونددهنده ارسال میشود. مقدار پیشفرض "or1ksim" است.
- -mnewlib
- این گزینه نادیده گرفته میشود و صرفاً برای سازگاری وجود دارد. این گزینه قبلاً برای انتخاب گزینههای پیونددهنده و پیشپردازنده جهت استفاده با newlib به کار میرفت.
- -msoft-div
- -mhard-div
- انتخاب دستورالعملهای تقسیم نرمافزاری یا سختافزاری ("l.div"، "l.divu"). حالت پیشفرض تقسیم سختافزاری است.
- -msoft-mul
- -mhard-mul
- انتخاب دستورالعملهای ضرب نرمافزاری یا سختافزاری ("l.mul"، "l.muli"). حالت پیشفرض ضرب سختافزاری است.
- -msoft-float
- -mhard-float
- انتخاب حالت نرمافزاری یا سختافزاری برای عملیات ممیز شناور. حالت پیشفرض نرمافزاری است.
- -mdouble-float
- هنگامی که -mhard-float انتخاب شده باشد، تولید دستورالعملهای ممیز شناور با دقت مضاعف (double-precision) را فعال میکند. بهطور پیشفرض، برای انجام عملیات ممیز شناور با دقت مضاعف از توابع libgcc استفاده میشود.
- -munordered-float
- هنگامی که -mhard-float انتخاب شده باشد، تولید دستورالعملهای مقایسهٔ نامرتب ممیز شناور و تنظیم پرچم ("lf.sfun*") را فعال میکند. بهطور پیشفرض، از توابع libgcc برای انجام عملیات مقایسهٔ نامرتب ممیز شناور و تنظیم پرچم استفاده میشود.
- -mcmov
- فعالسازی تولید دستورالعملهای انتقال شرطی ("l.cmov"). بهطور پیشفرض، معادل آن با استفاده از تنظیم و انشعاب (set and branch) تولید میشود.
- -mror
- فعالسازی تولید دستورالعملهای چرخش به راست ("l.ror"). بهطور پیشفرض، برای انجام عملیات چرخش به راست از توابع libgcc استفاده میشود.
- -mrori
- فعالسازی تولید دستورالعملهای چرخش به راست با مقدار بیواسطه ("l.rori"). بهطور پیشفرض، برای انجام عملیات چرخش به راست با مقدار بیواسطه از توابع libgcc استفاده میشود.
- -msext
- فعالسازی تولید دستورالعملهای بسط علامت ("l.ext*"). بهطور پیشفرض، برای انجام بسط علامت از بارگذاریهای حافظه استفاده میشود.
- -msfimm
- فعالسازی تولید دستورالعملهای مقایسه و تنظیم پرچم با مقدار بیواسطه ("l.sf*i"). بهطور پیشفرض، ابتدا دستورالعملهای اضافی برای ذخیرهٔ مقدار بیواسطه در یک ثبات تولید خواهد شد.
- -mshftimm
- فعالسازی تولید دستورالعملهای شیفت با مقدار بیواسطه ("l.srai"، "l.srli"، "l.slli"). بهطور پیشفرض، ابتدا دستورالعملهای اضافی برای ذخیرهٔ مقدار بیواسطه در یک ثبات تولید خواهد شد.
- -mcmodel=small
- تولید کد OpenRISC برای مدل کوچک (small): جدول GOT به 64k محدود است. این مدل پیشفرض است.
- -mcmodel=large
- تولید کد OpenRISC برای مدل بزرگ (large): اندازهٔ جدول GOT میتواند تا 4G افزایش یابد.
گزینههای PDP-11
این گزینهها برای PDP-11 تعریف شدهاند:
- -mfpu
- استفاده از ممیز شناور سختافزاری FPP. این حالت پیشفرض است. (ممیز شناور FIS در PDP-11/40 پشتیبانی نمیشود.) مستلزم -m45 است.
- -msoft-float
- عدم استفاده از ممیز شناور سختافزاری.
- -mac0
- بازگرداندن نتایج ممیز شناور در ac0 (یا 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
- هدف دارای فضای داده و دستورالعمل تفکیکشده (split) است. مستلزم -m45 است.
- -munix-asm
- استفاده از نحو اسمبلی Unix.
- -mdec-asm
- استفاده از نحو اسمبلی DEC.
- -mgnu-asm
- استفاده از نحو اسمبلی GNU. این حالت پیشفرض است.
- -mlra
- استفاده از تخصیصدهندهٔ جدید ثبات LRA. بهطور پیشفرض، از تخصیصدهندهٔ قدیمی «reload» استفاده میشود.
گزینههای PowerPC
این موارد در بخش مربوطه فهرست شدهاند.
گزینههای PRU
این گزینههای خط فرمان برای هدف PRU تعریف شدهاند:
- -minrt
- پیوند با
حداقل محیط
زماناجرا
(runtime). این کار
میتواند
اندازهٔ
فایل نهایی
دودویی ELF را
به میزان
چشمگیری
کاهش دهد،
اما برخی از
ویژگیهای
استاندارد
زماناجرای
C حذف
میشوند.
این گزینه پشتیبانی از سازندهها (constructors) و مقداردهندههای اولیهٔ ایستا را غیرفعال میکند. توجه داشته باشید که کامپایلر همچنان ممکن است کدی با مقداردهندههای ایستا و سازندهها تولید کند؛ بنابراین اطمینان از عدم استفاده از این ویژگیها در برنامهٔ مبدأ بر عهدهٔ برنامهنویس است.
کد راهاندازی کمینه، آرگومانهای "argc" و "argv" را به "main" ارسال نمیکند، بنابراین تابع اصلی باید بهصورت "int main (void)" تعریف شود. این موضوع در بیشتر پروژههای سفتافزار (firmware) یک قاعدهٔ استاندارد است.
- -mmcu=mcu
- مشخص کردن
گونهٔ
سختافزاری
PRU مورد
استفاده. یک
فایل spec با
نام متناظر
بارگذاری
میشود که
اندازههای
ناحیهٔ
حافظه را به
پیونددهنده
منتقل کرده
و ماکروهای
C ویژهٔ
سختافزار
را تعریف
میکند.
کتابخانهٔ Newlib تنها مشخصات "sim" را ارائه میدهد که برای اجرای آزمونهای پسرفت با استفاده از شبیهساز در نظر گرفته شده است. مشخصات مربوط به سختافزار واقعی را میتوان با نصب بستهٔ GnuPruMcu ("https://github.com/dinuxbg/gnuprumcu") به دست آورد.
- -mno-relax
- باعث میشود GCC بهجای گزینهٔ --relax، گزینهٔ خط فرمان --no-relax را به پیونددهنده ارسال کند.
- -mloop
- اجازه دادن (یا ندادن) به GCC برای استفاده از دستورالعمل LOOP.
- -mabi=variant
- تعیین گونهٔ ABI برای تولید کد خروجی. گزینهٔ -mabi=ti رابط کاربری دودویی دستنخوردهٔ TI ABI را انتخاب میکند، در حالی که -mabi=gnu گونهای از GNU را انتخاب میکند که با فرضیات خاص GCC سازگاری طبیعیتری دارد. تفاوتها به شرح زیر است:
- اندازهٔ اشارهگر تابع
- در TI ABI مشخص شده است که اشارهگرهای تابع (کد) ۱۶ بیتی هستند، در حالی که GNU تنها از اشارهگرهای داده و کد ۳۲ بیتی پشتیبانی میکند.
- اشارهگر اختیاری مقدار بازگشتی
- مقادیر بازگشتی توابع که بزرگتر از ۶۴ بیت هستند، با استفاده از یک اشارهگر پنهان بهعنوان اولین آرگومان تابع ارسال میشوند. با این حال، TI ABI الزامی میکند که در صورت عدم استفادهٔ فراخواننده از مقدار بازگشتی، اشارهگر میتواند NULL باشد. اما GNU همیشه یک اشارهگر معتبر مقدار بازگشتی را ارسال و انتظار دارد.
پیادهسازی فعلی -mabi=ti در صورت شناسایی هر یک از ساختارهای کدی بالا، بهسادگی یک خطای کامپایل صادر میکند. در نتیجه، کتابخانهٔ استاندارد C قابل ساخت نیست و هنگام پیوند با -mabi=ti نادیده گرفته میشود.
قابلیت بازآرایی (Relaxation) یکی از ویژگیهای GNU است و به دلایل امنیتی هنگام استفاده از -mabi=ti غیرفعال میشود. زنجیره ابزار TI بازنشانیها (relocations) را برای دستورالعملهای QBBx تولید نمیکند، بنابراین پیونددهندهٔ GNU نمیتواند هنگام کوتاهسازی شبهدستورالعملهای مجاور LDI32، آنها را تنظیم کند. گزینههای RISC-V
این گزینههای خط فرمان برای مقصدهای RISC-V تعریف شدهاند:
- -mbranch-cost=n
- هزینهٔ انشعابها را تقریباً برابر با n دستورالعمل تعیین میکند.
- -mplt
- -mno-plt
- هنگام تولید کد PIC، استفاده از PLTها را مجاز یا غیرمجاز میکند. برای کدهای غیر PIC نادیده گرفته میشود. مقدار پیشفرض -mplt است.
- -mabi=ABI-string
- قرارداد
فراخوانی
اعداد صحیح
و ممیز
شناور را
مشخص
میکند. ABI-string
شامل دو بخش
است: اندازه
نوعهای
صحیح و
ثباتهای
مورد
استفاده
برای
نوعهای
ممیز شناور.
برای
نمونه، -march=rv64ifd
-mabi=lp64d بدین
معناست که
long و
اشارهگرها
۶۴ بیتی
هستند (که
بهطور
ضمنی int را
۳۲ بیتی
تعریف
میکند)، و
مقادیر
ممیز شناور
با پهنای
حداکثر ۶۴
بیت در
ثباتهای F
ارسال
میشوند.
این را
مقایسه
کنید با -march=rv64ifd
-mabi=lp64f که
همچنان به
کامپایلر
اجازه
میدهد کدی
تولید کند
که از
افزونههای
F و D استفاده
میکند،
اما تنها
اجازه
میدهد
مقادیر
ممیز شناور
با طول
حداکثر ۳۲
بیت در
ثباتها
ارسال
شوند؛ یا
-march=rv64ifd -mabi=lp64 که در
آن هیچ
آرگومان
ممیز
شناوری در
ثباتها
ارسال
نخواهد شد.
مقدار پیشفرض برای این آرگومان وابسته به سیستم است؛ کاربرانی که قرارداد فراخوانی خاصی میخواهند باید آن را صراحتاً مشخص کنند. قراردادهای فراخوانی معتبر عبارتاند از: ilp32، ilp32f، ilp32d، lp64، lp64f و lp64d. پیادهسازی برخی قراردادهای فراخوانی روی بعضی از ISAها غیرممکن است: برای نمونه، -march=rv32if -mabi=ilp32d نامعتبر است زیرا ABI نیازمند ارسال مقادیر ۶۴ بیتی در ثباتهای F است، در حالی که ثباتهای F تنها ۳۲ بیت پهنا دارند. همچنین ABIهای ilp32e وجود دارند که تنها با معماری rv32e قابل استفادهاند و lp64e که تنها با rv64e قابل استفاده است. این ABIها در حال حاضر بهخوبی مشخص نشدهاند و ممکن است دستخوش تغییر شوند.
- -mfdiv
- -mno-fdiv
- استفاده یا عدم استفاده از دستورالعملهای سختافزاری تقسیم و جذر ممیز شناور را تعیین میکند. این گزینه نیازمند افزونههای F یا D برای ثباتهای ممیز شناور است. پیشفرض این است که اگر معماریِ مشخصشده این دستورالعملها را داشته باشد، از آنها استفاده شود.
- -mfence-tso
- -mno-fence-tso
- استفاده یا عدم استفاده از دستورالعمل fence.tso را تعیین میکند که روی برخی پردازندهها (از جمله پردازندههای شرکت T-Head) پیادهسازی نشده است. اگر دستورالعمل fence.tso در دسترس نباشد، بهجای آن از یک fence قویتر استفاده میشود.
- -mdiv
- -mno-div
- استفاده یا عدم استفاده از دستورالعملهای سختافزاری برای تقسیم اعداد صحیح را تعیین میکند. این گزینه به افزونهٔ M نیاز دارد. پیشفرض این است که اگر معماریِ مشخصشده این دستورالعملها را داشته باشد، از آنها استفاده شود.
- -misa-spec=ISA-spec-string
- نسخهٔ مشخصات ISA غیرممتاز (پیشتر سطح کاربر یا User-Level) RISC-V را مشخص میکند تا کد مطابق با آن تولید شود. مقادیر ممکن برای ISA-spec-string عبارتاند از:
- 2.2
- تولید کد منطبق با نسخهٔ 2.2.
- 20190608
- تولید کد منطبق با نسخهٔ 20190608.
- 20191213
- تولید کد منطبق با نسخهٔ 20191213.
پیشفرض -misa-spec=20191213 است، مگر اینکه GCC با گزینهٔ --with-isa-spec= برای مشخص کردن نسخهٔ پیشفرض متفاوتی پیکربندی شده باشد.
- -march=ISA-string
- تولید کد
برای ISA
دادهشده
از RISC-V (مانند
rv64im).
رشتههای ISA
باید با
حروف کوچک
باشند.
نمونهها
شامل rv64i، rv32g،
rv32e و rv32imaf
هستند.
علاوه بر
این، مقدار
ویژهٔ help (-march=help)
برای فهرست
کردن تمام
افزونههای
پشتیبانیشده
پذیرفته
میشود.
نحو رشتهٔ ISA به شرح زیر تعریف شده است:
- "رشته باید با rv32 یا rv64 آغاز شود و پس از آن"
- i، e یا g بیاید، که به عنوان ISA پایه شناخته میشود.
- "بخش بعدی رشته، فهرستی از نامهای افزونه است. نامهای"
- افزونه میتوانند به دو دستهٔ چندحرفی (مانند zba) و تکحرفی (مانند v) تقسیم شوند. افزونههای تکحرفی میتوانند پشت سر هم قرار گیرند، اما افزونههای چندحرفی باید با زیرخط (underscore) از یکدیگر جدا شوند.
- "زیرخط میتواند در هر کجای پس از ISA پایه ظاهر شود. این نویسه هیچ اثر"
- خاصی ندارد، اما برای بهبود خوانایی استفاده میشود و میتواند به عنوان یک جداکننده عمل کند.
- "نامهای افزونه ممکن است شامل یک شماره نسخهٔ اختیاری باشند که از نحو"
- <major>p<minor> یا <major> پیروی میکند (مانند m2p1 یا m2).
افزونههای پشتیبانیشده در زیر فهرست شدهاند:
- نام افزونه : نسخهٔ پشتیبانیشده : توضیحات
- i
- @tab 2.0, 2.1 @tab افزونهٔ پایه اعداد صحیح.
- e
- @tab 2.0 @tab افزونهٔ پایه تقلیلیافته اعداد صحیح.
- g
- @tab - @tab افزونهٔ پایه محاسبات همهمنظوره؛ g به i، m، a، f، d، zicsr و zifencei بسط خواهد یافت.
- m
- @tab 2.0 @tab افزونهٔ ضرب و تقسیم اعداد صحیح.
- a
- @tab 2.0, 2.1 @tab افزونهٔ عملیات اتمیک (Atomic).
- f
- @tab 2.0, 2.2 @tab افزونهٔ ممیز شناور با دقت یگانه.
- d
- @tab 2.0, 2.2 @tab افزونهٔ ممیز شناور با دقت مضاعف.
- c
- @tab 2.0 @tab افزونهٔ دستورالعملهای فشرده (Compressed).
- h
- @tab 1.0 @tab افزونهٔ هایپروایزر (Hypervisor).
- v
- @tab 1.0 @tab افزونهٔ برداری (Vector).
- zicsr
- @tab 2.0 @tab افزونهٔ دسترسی به ثباتهای وضعیت و کنترل (CSR).
- zifencei
- @tab 2.0 @tab افزونهٔ سد واکشی دستورالعمل (Instruction-fetch fence).
- zicond
- @tab 1.0 @tab افزونهٔ عملیات شرطی اعداد صحیح.
- za64rs
- @tab 1.0 @tab اندازهٔ مجموعه رزرو ۶۴ بایت.
- za128rs
- @tab 1.0 @tab اندازهٔ مجموعه رزرو ۱۲۸ بایت.
- zawrs
- @tab 1.0 @tab افزونهٔ انتظار روی مجموعه رزرو (Wait-on-reservation-set).
- zba
- @tab 1.0 @tab افزونهٔ محاسبات آدرس.
- zbb
- @tab 1.0 @tab افزونهٔ دستکاری بیتی پایه..IP zbc 4 @tab 1.0 @tab افزونهی ضرب بدون رقم نقلی.
- zbs
- @tab 1.0 @tab افزونهی عملیات تکبیتی.
- zfinx
- @tab 1.0 @tab افزونهی ممیز شناور با دقت یگانه در ثباتهای عدد صحیح.
- zdinx
- @tab 1.0 @tab افزونهی ممیز شناور با دقت مضاعف در ثباتهای عدد صحیح.
- zhinx
- @tab 1.0 @tab افزونهی ممیز شناور با نیمدقت در ثباتهای عدد صحیح.
- zhinxmin
- @tab 1.0 @tab افزونهی کمینهی ممیز شناور با نیمدقت در ثباتهای عدد صحیح.
- zbkb
- @tab 1.0 @tab افزونهی دستکاری بیت برای رمزنگاری.
- zbkc
- @tab 1.0 @tab افزونهی ضرب بدون رقم نقلی برای رمزنگاری.
- zbkx
- @tab 1.0 @tab افزونهی جایگشت crossbar برای رمزنگاری.
- zkne
- @tab 1.0 @tab افزونهی رمزگذاری AES.
- zknd
- @tab 1.0 @tab افزونهی رمزگشایی AES.
- zknh
- @tab 1.0 @tab افزونهی تابع درهمسازی.
- zkr
- @tab 1.0 @tab افزونهی منبع انتروپی.
- zksed
- @tab 1.0 @tab افزونهی رمز قالبی SM4.
- zksh
- @tab 1.0 @tab افزونهی تابع درهمسازی SM3.
- zkt
- @tab 1.0 @tab افزونهی تاخیر اجرای مستقل از داده.
- zk
- @tab 1.0 @tab افزونهی استاندارد رمزنگاری اسکالر.
- zkn
- @tab 1.0 @tab افزونهی مجموعه الگوریتمهای NIST.
- zks
- @tab 1.0 @tab افزونهی مجموعه الگوریتمهای ShangMi.
- zihintntl
- @tab 1.0 @tab افزونهی سرنخهای محلیبودن غیرزمانی.
- zihintpause
- @tab 1.0 @tab افزونهی سرنخ توقف (Pause).
- zicboz
- @tab 1.0 @tab افزونهی صفر کردن بلوک کَش.
- zicbom
- @tab 1.0 @tab افزونهی مدیریت بلوک کَش.
- zicbop
- @tab 1.0 @tab افزونهی پیشواکشی بلوک کَش.
- zic64b
- @tab 1.0 @tab اندازهی بلوک کَش ۶۴ بایت است.
- ziccamoa
- @tab 1.0 @tab حافظهی اصلی از تمام عملیاتهای اتمیک در A پشتیبانی میکند.
- ziccif
- @tab 1.0 @tab حافظهی اصلی از واکشی دستورالعمل با نیازمندی اتمیک بودن پشتیبانی میکند.
- zicclsm
- @tab 1.0 @tab حافظهی اصلی از بارگذاریها/ذخیرهسازیهای ناتراز پشتیبانی میکند.
- ziccrse
- @tab 1.0 @tab حافظهی اصلی از پیشرفت رو به جلو در توالیهای LR/SC پشتیبانی میکند.
- zicntr
- @tab 2.0 @tab افزونهی استاندارد برای شمارندهها و زمانسنجهای پایه.
- zihpm
- @tab 2.0 @tab افزونهی استاندارد برای شمارندههای کارایی سختافزاری.
- ztso
- @tab 1.0 @tab افزونهی ترتیببندی کامل ذخیرهسازی (TSO).
- zve32x
- @tab 1.0 @tab افزونههای برداری برای پردازندههای تعبیهشده.
- zve32f
- @tab 1.0 @tab افزونههای برداری برای پردازندههای تعبیهشده.
- zve64x
- @tab 1.0 @tab افزونههای برداری برای پردازندههای تعبیهشده.
- zve64f
- @tab 1.0 @tab افزونههای برداری برای پردازندههای تعبیهشده.
- zve64d
- @tab 1.0 @tab افزونههای برداری برای پردازندههای تعبیهشده.
- zvl32b
- @tab 1.0 @tab افزونههای استاندارد کمینهی طول بردار.
- zvl64b
- @tab 1.0 @tab افزونههای استاندارد کمینهی طول بردار.
- zvl128b
- @tab 1.0 @tab افزونههای استاندارد کمینهی طول بردار.
- zvl256b
- @tab 1.0 @tab افزونههای استاندارد کمینهی طول بردار.
- zvl512b
- @tab 1.0 @tab افزونههای استاندارد کمینهی طول بردار.
- zvl1024b
- @tab 1.0 @tab افزونههای استاندارد کمینهی طول بردار.
- zvl2048b
- @tab 1.0 @tab افزونههای استاندارد کمینهی طول بردار.
- zvl4096b
- @tab 1.0 @tab افزونههای استاندارد کمینهی طول بردار.
- zvbb
- @tab 1.0 @tab افزونهی برداری دستکاری پایهای بیت.
- zvbc
- @tab 1.0 @tab افزونهی برداری ضرب بدون رقم نقلی.
- zvkb
- @tab 1.0 @tab افزونهی برداری دستکاری بیت برای رمزنگاری.
- zvkg
- @tab 1.0 @tab افزونهی برداری GCM/GMAC.
- zvkned
- @tab 1.0 @tab افزونهی برداری رمز قالبی AES..IP zvknha 4 @tab 1.0 @tab افزونه درهمسازی امن برداری SHA-2.
- zvknhb
- @tab 1.0 @tab افزونه درهمسازی امن برداری SHA-2.
- zvksed
- @tab 1.0 @tab افزونه رمز قالبی برداری SM4.
- zvksh
- @tab 1.0 @tab افزونه درهمسازی امن برداری SM3.
- zvkn
- @tab 1.0 @tab افزونه مجموعه الگوریتم برداری NIST؛ zvkn به zvkned، zvknhb، zvkb و zvkt بسط مییابد.
- zvknc
- @tab 1.0 @tab افزونه مجموعه الگوریتم برداری NIST با ضرب بدون رقم نقلی؛ zvknc به zvkn و zvbc بسط مییابد.
- zvkng
- @tab 1.0 @tab افزونه مجموعه الگوریتم برداری NIST با GCM؛ zvkng به zvkn و zvkg بسط مییابد.
- zvks
- @tab 1.0 @tab افزونه مجموعه الگوریتم برداری ShangMi؛ zvks به zvksed، zvksh، zvkb و zvkt بسط مییابد.
- zvksc
- @tab 1.0 @tab افزونه مجموعه الگوریتم برداری ShangMi با ضرب بدون رقم نقلی؛ zvksc به zvks و zvbc بسط مییابد.
- zvksg
- @tab 1.0 @tab افزونه مجموعه الگوریتم برداری ShangMi با GCM؛ zvksg به zvks و zvkg بسط مییابد.
- zvkt
- @tab 1.0 @tab افزونه برداری زمان تاخیر اجرای ناوابسته به داده.
- zfh
- @tab 1.0 @tab افزونه ممیز شناور با دقت نیمه.
- zfhmin
- @tab 1.0 @tab افزونه حداقلی ممیز شناور با دقت نیمه.
- zvfh
- @tab 1.0 @tab افزونه برداری ممیز شناور با دقت نیمه.
- zvfhmin
- @tab 1.0 @tab افزونه برداری حداقلی ممیز شناور با دقت نیمه.
- zvfbfmin
- @tab 1.0 @tab افزونه برداری تبدیلهای BF16.
- zfa
- @tab 1.0 @tab افزونه ممیز شناور اضافی.
- zmmul
- @tab 1.0 @tab افزونه ضرب عدد صحیح.
- zca
- @tab 1.0 @tab افزونه دستورالعملهای فشرده عدد صحیح.
- zcf
- @tab 1.0 @tab افزونه بارگذاری و ذخیرهسازی ممیز شناور با دقت تکی فشرده.
- zcd
- @tab 1.0 @tab افزونه بارگذاری و ذخیرهسازی ممیز شناور با دقت مضاعف فشرده.
- zcb
- @tab 1.0 @tab افزونه دستورالعملهای فشرده ساده.
- zce
- @tab 1.0 @tab افزونههای دستورالعمل فشرده برای پردازندههای تعبیهشده.
- zcmp
- @tab 1.0 @tab افزونه فشرده push و pop.
- zcmt
- @tab 1.0 @tab افزونه دستورالعمل پرش جدولی.
- smaia
- @tab 1.0 @tab افزونه معماری وقفه پیشرفته.
- smepmp
- @tab 1.0 @tab بهبودهای PMP برای دسترسی به حافظه و جلوگیری از اجرا در حالت Machine mode.
- smstateen
- @tab 1.0 @tab افزونه فعالسازی وضعیت.
- ssaia
- @tab 1.0 @tab افزونه معماری وقفه پیشرفته برای حالت supervisor-mode.
- sscofpmf
- @tab 1.0 @tab افزونه سرریز شمارش و پالایش.
- ssstateen
- @tab 1.0 @tab افزونه فعالسازی وضعیت برای حالت supervisor-mode.
- sstc
- @tab 1.0 @tab افزونه وقفههای زمانسنج حالت supervisor-mode.
- svinval
- @tab 1.0 @tab افزونه ابطال ریزدانهای حافظه پنهان ترجمه آدرس.
- svnapot
- @tab 1.0 @tab افزونه پیوستگی ترجمه NAPOT.
- svpbmt
- @tab 1.0 @tab افزونه انواع حافظه مبتنی بر صفحه.
- xcvmac
- @tab 1.0 @tab افزونه ضرب-انباشت Core-V.
- xcvalu
- @tab 1.0 @tab افزونه متفرقه ALU در Core-V.
- xcvelw
- @tab 1.0 @tab افزونه کلمه بارگذاری رویداد در Core-V.
- xtheadba
- @tab 1.0 @tab افزونه محاسبه آدرس T-head.
- xtheadbb
- @tab 1.0 @tab افزونه دستکاری بیتی پایهای T-head.
- xtheadbs
- @tab 1.0 @tab افزونه دستورالعملهای تکبیتی T-head.
- xtheadcmo
- @tab 1.0 @tab افزونه عملیات مدیریت حافظه پنهان T-head.
- xtheadcondmov
- @tab 1.0 @tab افزونه انتقال شرطی T-head.
- xtheadfmemidx
- @tab 1.0 @tab افزونه عملیات حافظه نمایهشده برای ثباتهای ممیز شناور T-head.
- xtheadfmv
- @tab 1.0 @tab افزونه انتقال داده بیت بالا در ممیز شناور مضاعف T-head.
- xtheadint
- @tab 1.0 @tab افزونه شتابدهی وقفه T-head.
- xtheadmac
- @tab 1.0 @tab افزونه ضرب-انباشت T-head.
- xtheadmemidx
- @tab 1.0 @tab افزونه عملیات حافظه نمایهشده T-head.
- xtheadmempair
- @tab 1.0 @tab افزونه عملیات حافظه دو-GPR در T-head..IP xtheadsync 4 @tab 1.0 @tab افزونهٔ همگامسازی چندهستهای T-head.
- xventanacondops
- @tab 1.0 @tab افزونهٔ عملیاتهای شرطی عدد صحیح Ventana.
هنگامی که -march= مشخص نشده باشد، از تنظیمات -mcpu استفاده میشود.
اگر هر دو گزینهٔ -march و -mcpu= مشخص نشده باشند، مقدار پیشفرض این آرگومان وابسته به سیستم است؛ کاربرانی که خواهان افزونههای معماری خاصی هستند باید آن را صراحتاً مشخص کنند.
هنگامی که مشخصات RISC-V یک افزونه را وابسته به سایر افزونهها تعریف میکند، در صورتی که آن افزونههای وابسته به طور صریح اضافه نشده باشند، GCC به صورت ضمنی آنها را به مجموعه افزونههای فعال اضافه میکند.
- -mcpu=processor-string
- استفاده از
معماری
پردازندهٔ
مشخصشده و
بهینهسازی
خروجی برای
آن
پردازنده
که با نام
پردازندهٔ
خاص (CPU) مشخص
میشود.
مقادیر
مجاز برای
این گزینه
عبارتند از:
sifive-e20، sifive-e21،
sifive-e24، sifive-e31،
sifive-e34، sifive-e76،
sifive-s21، sifive-s51،
sifive-s54، sifive-s76،
sifive-u54، sifive-u74،
sifive-x280، sifive-xp450،
sifive-x670، thead-c906،
tt-ascalon-d8، xiangshan-nanhu.
توجه داشته باشید که -mcpu تنظیمات -march یا -mtune را لغو (override) نمیکند.
- -mtune=processor-string
- بهینهسازی
خروجی برای
پردازندهٔ
مشخصشده،
تعیینشده
بر اساس
ریزمعماری
یا نام خاص CPU.
مقادیر
مجاز برای
این گزینه
عبارتند از:
generic-ooo، rocket،
sifive-3-series، sifive-5-series،
sifive-7-series، size،
sifive-p400-series، sifive-p600-series،
و تمام
گزینههای
معتبر برای
-mcpu=.
هنگامی که -mtune= مشخص نشده باشد، از تنظیمات -mcpu استفاده میشود؛ اگر هیچکدام مشخص نشده باشند، مقدار پیشفرض rocket است.
انتخاب size برای استفاده توسط کاربران نهایی در نظر گرفته نشده است. این گزینه زمانی استفاده میشود که -Os مشخص شده باشد. این انتخاب اطلاعات هزینهٔ دستورالعمل ارائهشده توسط -mtune= را لغو میکند، اما اطلاعات خطلوله (pipeline) را لغو نمیکند. این امر ضمن ارائهٔ عملکرد مناسب، به کاهش اندازهٔ کد کمک میکند.
- -mpreferred-stack-boundary=num
- تلاش برای
تراز
نگهداشتن
مرز پشته بر
روی مرز ۲
به توان num
بایت. اگر
-mpreferred-stack-boundary مشخص
نشده باشد،
مقدار
پیشفرض ۴
است (۱۶
بایت یا ۱۲۸
بیت).
هشدار: در صورت استفاده از این گزینه، باید تمام ماژولها از جمله تمامی کتابخانهها را با همین مقدار بسازید. این امر شامل کتابخانههای سیستم و ماژولهای راهاندازی (startup) نیز میشود.
- -msmall-data-limit=n
- قرار دادن دادههای سراسری و ایستا با اندازهٔ کمتر از n بایت در یک بخش ویژه (در برخی از مقصدها).
- -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
- تلاش یا عدم تلاش برای درونخطیسازی (inlining) فراخوانیهای strlen در صورت امکان. درونخطیسازی تنها در صورتی انجام خواهد شد که رشته به درستی تراز شده باشد و دستورالعملهای لازم برای پردازش شتابیافته موجود باشند. پیشفرض، درونخطی نکردن فراخوانیهای strlen است.
- -minline-strcmp
- -mno-inline-strcmp
- تلاش یا عدم
تلاش برای
درونخطیسازی
فراخوانیهای
strcmp در صورت
امکان.
درونخطیسازی
تنها در
صورتی
انجام
خواهد شد که
رشتهها به
درستی تراز
شده باشند و
دستورالعملهای
لازم برای
پردازش
شتابیافته
موجود
باشند.
پیشفرض،
درونخطی
نکردن
فراخوانیهای
strcmp است.
پارامتر --param riscv-strcmp-inline-limit=n حداکثر تعداد بایتهای مقایسهشده توسط کد درونخطیشده را کنترل میکند. مقدار پیشفرض ۶۴ است.
- -minline-strncmp
- -mno-inline-strncmp
- تلاش یا عدم
تلاش برای
درونخطیسازی
فراخوانیهای
strncmp در صورت
امکان.
درونخطیسازی
تنها در
صورتی
انجام
خواهد شد که
رشتهها به
درستی تراز
شده باشند و
دستورالعملهای
لازم برای
پردازش
شتابیافته
موجود
باشند.
پیشفرض،
درونخطی
نکردن
فراخوانیهای
strncmp است.
پارامتر --param riscv-strcmp-inline-limit=n حداکثر تعداد بایتهای مقایسهشده توسط کد درونخطیشده را کنترل میکند. مقدار پیشفرض ۶۴ است.
- -mshorten-memrefs
- -mno-shorten-memrefs
- تلاش یا عدم تلاش برای بهرهگیری بیشتر از دستورالعملهای فشردهٔ بارگذاری/ذخیرهسازی (load/store) از طریق جایگزین کردن بارگذاری/ذخیرهسازی «ثبات پایه + آفست بزرگ» با بارگذاری/ذخیرهسازی جدید «پایه جدید + آفست کوچک». اگر پایهٔ جدید در یک ثبات فشرده ذخیره شود، بارگذاری/ذخیرهسازی جدید میتواند فشرده گردد. در حال حاضر فقط بارگذاری/ذخیرهسازیهای عدد صحیح ۳۲ بیتی هدف قرار میگیرند.
- -mstrict-align
- -mno-strict-align
- تولید نکردن یا تولید کردن دسترسیهای ترازنشده به حافظه. مقدار پیشفرض بسته به اینکه پردازندهای که برای آن بهینهسازی میکنیم از دسترسی سریع ترازنشده پشتیبانی میکند یا خیر تنظیم میشود.
- -mscalar-strict-align
- -mno-scalar-strict-align
- تولید نکردن یا تولید کردن دسترسیهای ترازنشده به حافظه. مقدار پیشفرض بسته به اینکه پردازندهای که برای آن بهینهسازی میکنیم از دسترسی سریع ترازنشده پشتیبانی میکند یا خیر تنظیم میشود. این یک نام مستعار برای -mstrict-align است.
- -mvector-strict-align
- -mno-vector-strict-align
- تولید نکردن یا تولید کردن دسترسیهای برداری ترازنشده به حافظه. مقدار پیشفرض خاموش (off) است، مگر اینکه پردازندهای که برای آن بهینهسازی میکنیم صراحتاً از دسترسیهای برداری با عناصر ناتراز (element-misaligned) به حافظه پشتیبانی کند.
- -mcmodel=medlow
- تولید کد برای مدل کد medium-low. برنامه و نمادهای تعریفشدهٔ ایستای آن باید در یک محدودهٔ آدرس منفرد ۲ گیبیبایتی (2 GiB) قرار گیرند و بین آدرسهای مطلق -2 GiB و +2 GiB باشند. برنامهها را میتوان به صورت ایستا یا پویا پیوند داد. این مدل کد پیشفرض است مگر اینکه GCC با گزینهٔ --with-cmodel= که یک مدل کد پیشفرض متفاوت را تعیین میکند، پیکربندی شده باشد.
- -mcmodel=medany
- تولید کد
برای مدل کد
medium-any. برنامه و
نمادهای
تعریفشدهٔ
ایستای آن
باید درون
هر بازهٔ
آدرس منفرد
۲
گیبیبایتی
(2 GiB) قرار
گیرند.
برنامهها
میتوانند
به صورت
ایستا یا
پویا پیوند
داده شوند.
کد تولیدشده توسط مدل کد medium-any مستقل از موقعیت (position-independent) است، اما تضمین نمیشود که در صورت پیوند خوردن به فایلهای اجرایی یا کتابخانههای مستقل از موقعیت، به درستی کار کند.
- -mcmodel=large
- تولید کد برای مدل کد large، که هیچ محدودیتی در اندازه یا جایگذاری نمادها ندارد.
- -mexplicit-relocs
- -mno-exlicit-relocs
- استفاده یا عدم استفاده از عملگرهای بازآرایی (relocation) اسمبلر هنگام سر و کار داشتن با آدرسهای نمادین. روش جایگزین، استفاده از ماکروهای اسمبلر است که ممکن است بهینهسازی را محدود کند.
- -mrelax
- -mno-relax
- بهرهگیری از سادهسازیهای پیونددهنده (linker relaxations) به منظور کاهش تعداد دستورالعملهای لازم برای دسترسی به آدرسهای نماد. پیشفرض، بهرهگیری از سادهسازیهای پیونددهنده است..IP -mriscv-attribute 4
- -mno-riscv-attribute
- تولید کردن (یا نکردن) مشخصهٔ RISC-V برای ثبت اطلاعات اضافی در اشیاء ELF. این ویژگی دستکم به binutils 2.32 نیاز دارد.
- -mcsr-check
- -mno-csr-check
- بررسی CSR را فعال یا غیرفعال میکند.
- -malign-data=type
- نحوهٔ تراز کردن متغیرها و مقادیر ثابت با انواع آرایه، ساختار یا اجتماع توسط GCC را کنترل میکند. مقادیر پشتیبانیشده برای type عبارتاند از xlen که از پهنای ثبات x بهعنوان مقدار همترازی استفاده میکند، و natural که از تراز طبیعی بهره میبرد. مقدار پیشفرض xlen است.
- -mbig-endian
- تولید کد با ترتیب بایت بزرگپایان (big-endian). زمانی که GCC برای یک مقصد riscv64be-*-* یا riscv32be-*-* پیکربندی شده باشد، این حالت پیشفرض است.
- -mlittle-endian
- تولید کد با ترتیب بایت کوچکپایان (little-endian). زمانی که GCC برای یک مقصد riscv64-*-* یا riscv32-*-* و نه یک مقصد riscv64be-*-* یا riscv32be-*-* پیکربندی شده باشد، این حالت پیشفرض است.
- -mstack-protector-guard=guard
- -mstack-protector-guard-reg=reg
- -mstack-protector-guard-offset=offset
- تولید کد
محافظت از
پشته با
استفاده از
قناری (canary) در
guard.
مکانهای
پشتیبانیشده
عبارتاند
از global برای
قناری
سراسری یا
tls برای
قناری به
ازای هر
ریسه در
بلوک TLS.
با انتخاب حالت دوم، گزینههای -mstack-protector-guard-reg=reg و -mstack-protector-guard-offset=offset علاوه بر این مشخص میکنند که کدام ثبات بهعنوان ثبات پایه برای خواندن قناری، و چه آفستی از آن ثبات پایه باید استفاده شود. هیچ ثبات یا آفست پیشفرضی وجود ندارد چرا که این ویژگی منحصراً برای استفاده در هستهٔ Linux است.
- -mtls-dialect=desc
- استفاده از توصیفگرهای TLS بهعنوان سازوکار حافظهٔ محلی ریسه (thread-local storage) برای دسترسیهای پویای متغیرهای TLS.
- -mtls-dialect=trad
- استفاده از TLS سنتی بهعنوان سازوکار حافظهٔ محلی ریسه برای دسترسیهای پویای متغیرهای TLS. این حالت پیشفرض است.
گزینههای RL78
- -msim
- کتابخانههای هدف اضافی را جهت پشتیبانی از اجرا درون یک شبیهساز پیوند (link) میدهد.
- -mmul=none
- -mmul=g10
- -mmul=g13
- -mmul=g14
- -mmul=rl78
- نوع
پشتیبانی
سختافزاری
از ضرب و
تقسیم مورد
استفاده را
مشخص
میکند.
سادهترین
حالت "none"
است که از
نرمافزار
برای هر دو
عملیات ضرب
و تقسیم
استفاده
میکند. این
حالت
پیشفرض
است. مقدار
"g13" برای
واحد جانبی
ضرب/تقسیم
سختافزاری
موجود روی
مقصدهای RL78/G13
(هستهٔ S2) است.
مقدار
"g14"
استفاده از
دستورالعملهای
ضرب و تقسیم
پشتیبانیشده
توسط قطعات
RL78/G14 (هستهٔ S3) را
انتخاب
میکند.
مقدار
"rl78" یک
نام مستعار
برای "g14"
و مقدار
"mg10" یک
نام مستعار
برای "none"
است.
علاوه بر این، یک ماکروی پیشپردازندهٔ C بر اساس تنظیمات این گزینه تعریف میشود. مقادیر ممکن عبارتاند از: "__RL78_MUL_NONE__"، "__RL78_MUL_G13__" یا "__RL78_MUL_G14__".
- -mcpu=g10
- -mcpu=g13
- -mcpu=g14
- -mcpu=rl78
- هستهٔ هدف RL78
را مشخص
میکند.
پیشفرض
هستهٔ G14 است
که با نام
هستهٔ S3 یا
صرفاً RL78 نیز
شناخته
میشود.
هستهٔ G13 یا S2
فاقد
دستورالعملهای
ضرب یا
تقسیم است؛
در عوض برای
این عملیات
از یک واحد
جانبی
سختافزاری
استفاده
میکند.
هستهٔ G10 یا S1
فاقد
بانکهای
ثبات است،
بنابراین
از یک
قرارداد
فراخوانی (calling
convention) متفاوت
استفاده
میکند.
اگر این گزینه تنظیم شود، نوع پشتیبانی ضرب سختافزاری مورد استفاده را نیز انتخاب میکند، مگر اینکه با یک گزینهٔ صریح -mmul=none در خط فرمان لغو شود. بنابراین، مشخص کردن -mcpu=g13 استفاده از واحد جانبی ضرب سختافزاری G13 را فعال کرده و مشخص کردن -mcpu=g10 استفاده از ضربهای سختافزاری را بهطور کامل غیرفعال میسازد.
توجه داشته باشید که اگرچه هستهٔ RL78/G14 هدف پیشفرض است، مشخص کردن -mcpu=g14 یا -mcpu=rl78 در خط فرمان، رفتار زنجیره ابزار (toolchain) را تغییر میدهد، زیرا پشتیبانی ضرب سختافزاری G14 را نیز فعال میکند. اگر این گزینهها در خط فرمان مشخص نشوند، حتی اگر کد هستهٔ RL78 را هدف قرار داده باشد، از روالهای ضرب نرمافزاری استفاده خواهد شد. این موضوع به دلیل حفظ سازگاری با نسخههای قدیمیتر زنجیرههای ابزار است که از ضرب و تقسیم سختافزاری پشتیبانی نمیکردند.
علاوه بر این، یک ماکروی پیشپردازندهٔ C بر اساس تنظیمات این گزینه تعریف میشود. مقادیر ممکن عبارتاند از: "__RL78_G10__"، "__RL78_G13__" یا "__RL78_G14__".
- -mg10
- -mg13
- -mg14
- -mrl78
- اینها نامهای مستعاری برای گزینهٔ متناظر -mcpu= هستند. این گزینهها برای سازگاری با نسخههای پیشین فراهم شدهاند.
- -mallregs
- به کامپایلر اجازه میدهد از تمامی ثباتهای در دسترس استفاده کند. بهطور پیشفرض، ثباتهای "r24..r31" برای استفاده در گردانندههای وقفه (interrupt handlers) رزرو شدهاند. با فعال شدن این گزینه، این ثباتها میتوانند در توابع معمولی نیز مورد استفاده قرار گیرند.
- -m64bit-doubles
- -m32bit-doubles
- اندازهٔ نوع دادهٔ "double" را ۶۴ بیت (-m64bit-doubles) یا ۳۲ بیت (-m32bit-doubles) تعیین میکند. مقدار پیشفرض -m32bit-doubles است.
- -msave-mduc-in-interrupts
- -mno-save-mduc-in-interrupts
- مشخص میکند که توابع گردانندهٔ وقفه باید ثباتهای MDUC را حفظ کنند. این گزینه تنها در صورتی لازم است که کدهای عادی ممکن است از ثباتهای MDUC استفاده کنند، برای مثال به دلیل اینکه عملیات ضرب و تقسیم انجام میدهند. حالت پیشفرض، نادیده گرفتن ثباتهای MDUC است زیرا این کار موجب افزایش سرعت گردانندههای وقفه میشود. برای فعال شدن این ویژگی باید گزینهٔ هدف -mg13 ارسال شود، زیرا این قابلیت تنها روی هدف G13 (هستهٔ S2) در دسترس است. ثباتهای MDUC تنها در صورتی ذخیره خواهند شد که گردانندهٔ وقفه عملیات ضرب یا تقسیم انجام دهد یا تابع دیگری را فراخوانی کند.
گزینههای IBM RS/6000 و PowerPC
این گزینههای -m برای IBM RS/6000 و PowerPC تعریف شدهاند:
- -mpowerpc-gpopt
- -mno-powerpc-gpopt
- -mpowerpc-gfxopt
- -mno-powerpc-gfxopt
- -mpowerpc64
- -mno-powerpc64
- -mmfcrf
- -mno-mfcrf
- -mpopcntb
- -mno-popcntb
- -mpopcntd
- -mno-popcntd
- -mfprnd
- -mno-fprnd
- -mcmpb
- -mhard-dfp
- -mno-hard-dfp
- شما از این
گزینهها
برای مشخص
کردن
دستورالعملهای
موجود در
پردازندهٔ
مورد
استفاده
بهره
میبرید.
مقدار
پیشفرض
این
گزینهها
هنگام
پیکربندی GCC
تعیین
میشود.
مشخص کردن
-mcpu=cpu_type
تنظیمات
این
گزینهها
را لغو (override)
میکند.
توصیه
میشود به
جای
گزینههای
ذکرشده در
بالا، از
گزینهٔ
-mcpu=cpu_type
استفاده
کنید.
مشخص کردن -mpowerpc-gpopt به GCC اجازه میدهد از دستورالعملهای اختیاری معماری PowerPC در گروه کاربرد عمومی (General Purpose)، از جمله جذر نقطهٔ شناور (floating-point square root) استفاده کند. مشخص کردن -mpowerpc-gfxopt به GCC اجازه میدهد از دستورالعملهای اختیاری معماری PowerPC در گروه گرافیک، از جمله گزینش ممیز شناور (floating-point select) بهره ببرد.
گزینهٔ -mmfcrf به GCC اجازه میدهد دستور انتقال از فیلد ثبات وضعیت (move from condition register field) را که روی پردازندهٔ POWER4 و دیگر پردازندههای پشتیبانیکننده از معماری PowerPC V2.01 پیادهسازی شده است تولید کند. گزینهٔ -mpopcntb به GCC اجازه میدهد دستورالعملهای popcount و تخمین معکوس ممیز شناور با دقت مضاعف (double-precision FP reciprocal estimate) پیادهسازیشده در پردازندهٔ POWER5 و سایر پردازندههای پشتیبانیکننده از معماری PowerPC V2.02 را تولید کند. گزینهٔ -mpopcntd به GCC امکان میدهد دستورالعمل popcount پیادهسازیشده در پردازندهٔ POWER7 و سایر پردازندههای پشتیبانیکننده از معماری PowerPC V2.06 را تولید کند. گزینهٔ -mfprnd به GCC امکان میدهد دستورالعملهای گرد کردن ممیز شناور به عدد صحیح (FP round to integer) پیادهسازیشده در پردازندهٔ +POWER5 و سایر پردازندههای پشتیبانیکننده از معماری PowerPC V2.03 را تولید کند. گزینهٔ -mcmpb به GCC اجازه میدهد دستور مقایسهٔ بایتها (compare bytes) را که در پردازندهٔ POWER6 و سایر پردازندههای پشتیبانیکننده از معماری PowerPC V2.05 پیادهسازی شده است تولید کند. گزینهٔ -mhard-dfp به GCC اجازه میدهد دستورالعملهای ممیز شناور دهدهی (decimal floating-point) پیادهسازیشده در برخی پردازندههای POWER را تولید کند.
گزینهٔ -mpowerpc64 به GCC اجازه میدهد دستورالعملهای ۶۴ بیتی اضافی موجود در معماری کامل PowerPC64 را تولید کرده و با GPRها به عنوان مقادیر ۶۴ بیتی دوکلمهای (doubleword) رفتار کند. پیشفرض GCC گزینهٔ -mno-powerpc64 است.
- -mcpu=cpu_type
- نوع
معماری،
نحوهٔ
استفاده از
ثباتها (register
usage)، و
پارامترهای
زمانبندی
دستورالعملها
را برای
ماشین نوع
cpu_type تنظیم
میکند.
مقادیر
پشتیبانیشده
برای cpu_type
عبارتند از
401، 403، 405،
405fp، 440، 440fp،
464، 464fp، 476،
476fp، 505، 601،
602، 603، 603e،
604، 604e، 620،
630، 740، 7400،
7450، 750، 801،
821، 823، 860،
970، 8540، a2،
e300c2، e300c3، e500mc،
e500mc64، e5500، e6500،
ec603e، G3، G4،
G5، titan، power3،
power4، power5، power5+،
power6، power6x، power7،
power8، power9، power10،
power11، powerpc، powerpc64،
powerpc64le، rs64 و native.
گزینههای -mcpu=powerpc، -mcpu=powerpc64 و -mcpu=powerpc64le انواع معماری ماشینهای PowerPC خالص ۳۲ بیتی (با هر ترتیب بایتی)، PowerPC ۶۴ بیتی بزرگانتها (big endian) و PowerPC ۶۴ بیتی کوچکانتها (little endian) را مشخص میکنند و یک مدل پردازندهٔ عمومی و مناسب را برای اهداف زمانبندی فرض میگیرند.
مشخص کردن native به عنوان نوع CPU، گزینهٔ معماری متناظر با پردازندهٔ میزبان سیستمی را که کامپایل را انجام میدهد شناسایی و انتخاب میکند. اگر GCC پردازنده را شناسایی نکند، -mcpu=native هیچ تأثیری نخواهد داشت.
گزینههای دیگر یک پردازندهٔ مشخص را تعیین میکنند. کدی که تحت آن گزینهها تولید میشود، روی آن پردازنده بهترین اجرا را خواهد داشت و ممکن است روی پردازندههای دیگر اصلاً اجرا نشود.
گزینههای -mcpu به طور خودکار گزینههای زیر را فعال یا غیرفعال میکنند:
-maltivec -mfprnd -mhard-float -mmfcrf -mmultiple -mpopcntb -mpopcntd -mpowerpc64 -mpowerpc-gpopt -mpowerpc-gfxopt -mmulhw -mdlmzb -mmfpgpr -mvsx -mcrypto -mhtm -mpower8-fusion -mquad-memory -mquad-memory-atomic -mfloat128 -mfloat128-hardware -mprefixed -mpcrel -mmma -mrop-protect
گزینههای خاص تنظیمشده برای هر پردازندهٔ بهخصوص، میان نسخههای مختلف کامپایلر متفاوت است و بستگی به این دارد که چه تنظیمی به نظر میرسد کد بهینهای برای آن پردازنده تولید میکند؛ این لزوماً نشاندهندهٔ تواناییهای سختافزار واقعی نیست. اگر مایلید یک گزینهٔ منفرد را روی مقدار خاصی تنظیم کنید، میتوانید آن را پس از گزینهٔ -mcpu مشخص کنید، مانند -mcpu=970 -mno-altivec.
در AIX، گزینههای -maltivec و -mpowerpc64 در حال حاضر توسط گزینهٔ -mcpu فعال یا غیرفعال نمیشوند زیرا AIX پشتیبانی کاملی از این گزینهها ندارد. اگر مطمئن هستید که در محیط شما کار خواهد کرد، همچنان میتوانید آنها را به طور جداگانه فعال یا غیرفعال کنید.
- -mtune=cpu_type
- پارامترهای زمانبندی دستورالعملها را برای ماشین نوع cpu_type تنظیم میکند، اما برخلاف -mcpu=cpu_type، نوع معماری یا نحوهٔ استفاده از ثباتها را تغییر نمیدهد. همان مقادیر cpu_type که برای -mcpu معتبر هستند، برای -mtune نیز استفاده میشوند. اگر هر دو مشخص شوند، کد تولیدشده از معماری و ثباتهای تعیینشده توسط -mcpu، اما از پارامترهای زمانبندی تعیینشده توسط -mtune استفاده میکند.
- -mcmodel=small
- کد PowerPC64 را برای مدل کوچک (small model) تولید میکند: جدول TOC به 64k محدود میشود.
- -mcmodel=medium
- کد PowerPC64 را برای مدل متوسط (medium model) تولید میکند: مجموع اندازهٔ TOC و سایر دادههای ایستا (static) میتواند تا 4G باشد. این مقدار پیشفرض برای لینوکس ۶۴ بیتی است.
- -mcmodel=large
- کد PowerPC64 را برای مدل بزرگ (large model) تولید میکند: اندازهٔ TOC میتواند تا 4G باشد. سایر دادهها و کد فقط توسط فضای آدرسدهی ۶۴ بیتی محدود میشوند.
- -maltivec
- -mno-altivec
- کدی تولید
میکند که
از
دستورالعملهای
AltiVec استفاده
میکند (یا
استفاده
نمیکند)، و
همچنین
استفاده از
توابع
توکار (built-in) را
که دسترسی
مستقیمتری
به مجموعه
دستورالعملهای
AltiVec فراهم
میکنند
فعال
میسازد.
همچنین
ممکن است
لازم باشد
گزینهٔ -mabi=altivec
را برای
تطبیق ABI
جاری با
بهبودهای ABI
مربوط به AltiVec
تنظیم کنید.
هنگامی که -maltivec استفاده میشود، ترتیب عناصر برای توابع درونی (intrinsics) مربوط به AltiVec مانند "vec_splat"، "vec_extract" و "vec_insert" با ترتیب عناصر آرایه متناسب با اندیانبودن (endianness) هدف مطابقت دارد. به این معنا که هنگام هدف قرار دادن بسترهای بزرگانتها (big-endian)، عنصر صفر نشاندهندهٔ چپترین عنصر در یک ثبات برداری است، و هنگام هدف قرار دادن بسترهای کوچکانتها (little-endian)، راستترین عنصر را در یک ثبات برداری مشخص میکند.
- -mvrsave
- -mno-vrsave
- هنگام تولید کد AltiVec، دستورالعملهای VRSAVE را تولید میکند.
- -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ها برای یک ناحیهٔ قابل وصله (patchable) از طریق گزینهٔ -fpatchable-function-entry، NOPهای «قبل» را پیش از نقطهٔ ورود سراسری (global entry point) و NOPهای «بعد» را پس از نقطهٔ ورود محلی (local entry point) درج میکند. این کار باعث میشود زمانی که یک نقطهٔ ورود سراسری تولید میشود، توالی NOPها پیوسته نباشد. بدون این گزینه، NOPها مستقیماً قبل و بعد از نقطهٔ ورود محلی درج میشوند، که آنها را پیوسته میکند اما نقطهٔ ورود سراسری و محلی را از یکدیگر دورتر میسازد. اگر تنها یک نقطهٔ ورود تکی تولید شود، این گزینه هیچ اثری ندارد.
- -misel
- -mno-isel
- این سوییچ تولید دستورالعملهای ISEL را فعال یا غیرفعال میکند.
- -mvsx
- -mno-vsx
- کدی تولید میکند که از دستورالعملهای برداری/اسکالر (VSX) استفاده میکند (یا استفاده نمیکند)، و همچنین استفاده از توابع توکار را که دسترسی مستقیمتری به مجموعه دستورالعملهای VSX فراهم میآورند فعال میسازد.
- -mcrypto
- -mno-crypto
- استفاده از توابع توکار را که دسترسی مستقیم به دستورالعملهای رمزنگاری اضافهشده در نسخهٔ 2.07 از PowerPC ISA را فراهم میکنند، فعال (یا غیرفعال) میسازد..IP -mhtm 4
- -mno-htm
- فعالسازی (غیرفعالسازی) استفاده از توابع توکار که دسترسی مستقیم به دستورالعملهای حافظه تراکنشی سختافزاری (HTM) را ممکن میسازند؛ این دستورالعملها در نسخه 2.07 از PowerPC ISA اضافه شدهاند.
- -mpower8-fusion
- -mno-power8-fusion
- تولید کدی که برخی عملیاتهای عدد صحیح را مجاور یکدیگر نگه میدارد (نگه نمیدارد) تا این دستورالعملها بتوانند در پردازندههای power8 و بعد از آن با یکدیگر ادغام شوند.
- -mquad-memory
- -mno-quad-memory
- تولید کدی که از دستورالعملهای حافظه چهارکلمهای غیراتمیک استفاده میکند (استفاده نمیکند). گزینه -mquad-memory نیازمند استفاده از حالت ۶۴-بیتی است.
- -mquad-memory-atomic
- -mno-quad-memory-atomic
- تولید کدی که از دستورالعملهای حافظه چهارکلمهای اتمیک استفاده میکند (استفاده نمیکند). گزینه -mquad-memory-atomic نیازمند استفاده از حالت ۶۴-بیتی است.
- -mfloat128
- -mno-float128
- فعالسازی/غیرفعالسازی
کلیدواژه
__float128 برای
ممیز شناور
۱۲۸-بیتی IEEE و
استفاده از
شبیهسازی
نرمافزاری
یا
دستورالعملهای
سختافزاری
برای ممیز
شناور
۱۲۸-بیتی IEEE.
برای استفاده از پشتیبانی ممیز شناور ۱۲۸-بیتی IEEE، مجموعه دستورالعملهای VSX (-mvsx) باید فعال باشد. ممیز شناور ۱۲۸-بیتی IEEE تنها در Linux پشتیبانی میشود.
حالت پیشفرض برای -mfloat128 در سیستمهای PowerPC Linux که از مجموعه دستورالعملهای VSX استفاده میکنند فعال و در سایر سیستمها غیرفعال است.
اگر از مجموعه دستورالعملهای ISA 3.0 (-mcpu=power9) در یک سیستم ۶۴-بیتی استفاده کنید، پشتیبانی از ممیز شناور ۱۲۸-بیتی IEEE همچنین تولید دستورالعملهای ممیز شناور ۱۲۸-بیتی IEEE مربوط به ISA 3.0 را فعال میکند. در غیر این صورت، اگر تولید دستورالعملهای ISA 3.0 را تعیین نکنید یا هدف شما یک سیستم ۳۲-بیتی big endian باشد، ممیز شناور ۱۲۸-بیتی IEEE با شبیهسازی نرمافزاری انجام خواهد شد.
- -mfloat128-hardware
- -mno-float128-hardware
- فعالسازی/غیرفعالسازی
استفاده از
دستورالعملهای
سختافزاری
ISA 3.0 برای
پشتیبانی
از نوع داده
__float128.
حالت پیشفرض برای -mfloat128-hardware در سیستمهای PowerPC Linux که از مجموعه دستورالعملهای ISA 3.0 استفاده میکنند فعال و در سایر سیستمها غیرفعال است.
- -m32
- -m64
- تولید کد برای محیطهای ۳۲-بیتی یا ۶۴-بیتی از اهداف Darwin و SVR4 (شامل GNU/Linux). محیط ۳۲-بیتی مقادیر int، long و اشارهگر را روی ۳۲ بیت تنظیم میکند و کدی تولید میکند که روی هر گونهای از PowerPC اجرا میشود. محیط ۶۴-بیتی int را روی ۳۲ بیت و long و اشارهگر را روی ۶۴ بیت تنظیم کرده و مشابه -mpowerpc64 برای PowerPC64 کد تولید میکند.
- -mfull-toc
- -mno-fp-in-toc
- -mno-sum-in-toc
- -mminimal-toc
- اصلاح شیوه
تولید TOC
(جدول
محتویات)،
که برای هر
فایل
اجرایی
ایجاد
میشود.
گزینه -mfull-toc
بهصورت
پیشفرض
انتخاب شده
است. در این
حالت، GCC
دستکم یک
ورودی TOC را
به هر ارجاع
منحصربهفرد
به
متغیرهای
غیرخودکار
در برنامه
شما اختصاص
میدهد. GCC
همچنین
مقادیر
ثابت ممیز
شناور را در
TOC قرار
میدهد. با
این حال،
تنها
۱۶٬۳۸۴
ورودی در TOC
در دسترس
است.
اگر پیام خطایی از پیونددهنده دریافت کردید مبنی بر اینکه از فضای مجاز TOC سرریز کردهاید، میتوانید با استفاده از گزینههای -mno-fp-in-toc و -mno-sum-in-toc میزان فضای مصرفی TOC را کاهش دهید. گزینه -mno-fp-in-toc مانع قرار دادن ثابتهای ممیز شناور در TOC توسط GCC میشود و -mno-sum-in-toc کامپایلر GCC را وادار میکند تا بهجای قرار دادن مجموع یک آدرس و یک ثابت در TOC، کدی تولید کند که این مجموع را در زمان اجرا محاسبه نماید. میتوانید یکی از این گزینهها یا هر دو را تعیین کنید. هر کدام از آنها باعث میشود GCC به بهای صرفهجویی در فضای TOC، کدی اندکی کندتر و حجیمتر تولید کند.
اگر حتی با تعیین هر دوی این گزینهها همچنان فضای TOC تمام شد، در عوض -mminimal-toc را تعیین کنید. این گزینه باعث میشود GCC برای هر فایل تنها یک ورودی TOC ایجاد نماید. با مشخص کردن این گزینه، GCC کدی تولید میکند که کندتر و بزرگتر است اما فضای فوقالعاده اندکی از TOC را مصرف میکند. ممکن است بخواهید از این گزینه تنها برای فایلهایی استفاده کنید که کدهای آنها کمتر اجرا میشوند.
- -maix64
- -maix32
- فعالسازی ABI و قرارداد فراخوانی ۶۴-بیتی AIX: اشارهگرهای ۶۴-بیتی، نوع "long" ۶۴-بیتی و زیرساخت مورد نیاز برای پشتیبانی از آنها. مشخص کردن -maix64 بهمعنای فعالسازی ضمنی -mpowerpc64 است، در حالی که -maix32 ساختار ABI ۶۴-بیتی را غیرفعال کرده و بهمعنای ضمنی -mno-powerpc64 است. پیشفرض GCC گزینه -maix32 است.
- -mxl-compat
- -mno-xl-compat
- تولید کدی
که هنگام
استفاده از
ABI سازگار با
AIX، تطابق
بیشتری با
معناشناسی
کامپایلر IBM XL
داشته باشد.
ارسال
آرگومانهای
ممیز شناور
به توابع
پیشالگو
فراتر از
ناحیه
ذخیره ثبات
(RSA) روی پشته،
علاوه بر
FPRهای
آرگومان.
هنگام
مقایسه
مقادیر و
تبدیل به double،
فرض نکردن
این که
پرارزشترین
double در مقدار long
double ۱۲۸-بیتی
بهدرستی
گرد شده
است.
استفاده از
نامهای
نماد XL برای
روالهای
پشتیبانی long
double.
قرارداد فراخوانی AIX برای مدیریت یک حالت مبهم K&R C گسترش یافت (اما در ابتدا مستند نشد) که در آن تابعی فراخوانی میشد که آدرس آرگومانهایش را با تعداد آرگومانهای کمتری نسبت به آنچه اعلان شده بود دریافت میکرد. کامپایلرهای IBM XL هنگامی که یک زیرروال بدون بهینهسازی کامپایل میشود، به آرگومانهای ممیز شناوری که در RSA جا نمیشوند از طریق پشته دسترسی پیدا میکنند. از آنجا که ذخیره همیشگی آرگومانهای ممیز شناور روی پشته ناکارآمد بوده و بهندرت لازم است، این گزینه بهطور پیشفرض فعال نیست و تنها هنگام فراخوانی زیرروالهای کامپایلشده توسط کامپایلرهای IBM XL بدون بهینهسازی ضرورت دارد.
- -mpe
- پشتیبانی از IBM RS/6000 SP Parallel Environment (PE). پیوند دادن برنامهای که برای استفاده از تبادل پیام نوشته شده است با کد راهاندازی ویژه بهمنظور امکان اجرای برنامه. سیستم باید PE را در مکان استاندارد (/usr/lpp/ppe.poe/) نصب داشته باشد، یا فایل specs باید با گزینه -specs= برای مشخص کردن مکان دایرکتوری مناسب بازنویسی شود. محیط Parallel Environment از ریسهها پشتیبانی نمیکند، بنابراین گزینه -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
- تولید کدی که از دستورالعملهای بارگذاری چند کلمه و ذخیره چند کلمه استفاده میکند (استفاده نمیکند). این دستورالعملها بهصورت پیشفرض در سیستمهای POWER تولید میشوند و در سیستمهای PowerPC تولید نمیشوند. از -mmultiple در سیستمهای PowerPC با ترتیب بایت little-endian استفاده نکنید، زیرا این دستورالعملها زمانی که پردازنده در حالت little-endian است کار نمیکنند. استثناها PPC740 و PPC750 هستند که این دستورالعملها را در حالت little-endian مجاز میدانند.
- -mupdate
- -mno-update
- تولید کدی که از دستورالعملهای بارگذاری یا ذخیرهای استفاده میکند (استفاده نمیکند) که ثبات پایه را با آدرس مکان حافظه محاسبهشده بهروز میکنند. این دستورالعملها بهطور پیشفرض تولید میشوند. اگر از -mno-update استفاده کنید، فاصله زمانی کوتاهی میان زمان بهروزرسانی اشارهگر پشته و زمان ذخیره آدرس فریم پیشین وجود خواهد داشت؛ بدین معنا که کدی که فریمهای پشته را در هنگام وقفهها یا سیگنالها پیمایش میکند، ممکن است با دادههای خراب مواجه شود..IP -mavoid-indexed-addresses 4
- -mno-avoid-indexed-addresses
- تولید کدی که تلاش میکند از دستورالعملهای بارگذاری یا ذخیرهسازی نمایهدار (indexed) اجتناب کند (اجتناب نکند). این دستورالعملها میتوانند در پردازندههای Power6 در شرایط خاصی، مانند هنگام پیمایش آرایههای بزرگی که از مرز 16M عبور میکنند، باعث افت کارایی شوند. این گزینه هنگام هدفگیری Power6 به طور پیشفرض فعال و در غیر این صورت غیرفعال است.
- -mfused-madd
- -mno-fused-madd
- تولید کدی که از دستورالعملهای ضرب و انباشت (multiply and accumulate) ممیز شناور استفاده میکند (استفاده نمیکند). در صورت استفاده از ممیز شناور سختافزاری، این دستورالعملها به طور پیشفرض تولید میشوند. گزینه وابسته به ماشین -mfused-madd اکنون به گزینه مستقل از ماشین -ffp-contract=fast و -mno-fused-madd به -ffp-contract=off نگاشت شده است.
- -mmulhw
- -mno-mulhw
- تولید کدی که از دستورالعملهای ضرب و ضرب-انباشت نیمکلمه (half-word) در پردازندههای IBM 405، 440، 464 و 476 استفاده میکند (استفاده نمیکند). این دستورالعملها هنگام هدفگیری این پردازندهها به طور پیشفرض تولید میشوند.
- -mdlmzb
- -mno-dlmzb
- تولید کدی که از دستورالعمل جستجوی رشته dlmzb در پردازندههای IBM 405، 440، 464 و 476 استفاده میکند (استفاده نمیکند). این دستورالعمل هنگام هدفگیری این پردازندهها به طور پیشفرض تولید میشود.
- -mno-bit-align
- -mbit-align
- در
سیستمهای
System V.4 و PowerPC
تعبیهشده،
ساختارها و
اجتماعهای
حاوی
میدانهای
بیتی (bit-fields) را
مجبور به
تراز شدن با
نوع پایه
میدان بیتی
نمیکند
(میکند).
برای مثال، به طور پیشفرض ساختاری که تنها شامل ۸ میدان بیتی "unsigned" با طول ۱ باشد، در مرز ۴ بایتی تراز شده و اندازهای برابر با ۴ بایت دارد. با استفاده از -mno-bit-align، ساختار در مرز ۱ بایتی تراز شده و اندازه آن ۱ بایت خواهد بود.
- -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 پیوند داده شوند.
- -mno-toc
- -mtoc
- در سیستمهای System V.4 و PowerPC تعبیهشده، فرض نمیکند (فرض میکند) که ثبات ۲ حاوی اشارهگری به یک ناحیه سراسری است که به نشانیهای استفادهشده در برنامه اشاره دارد.
- -mlittle
- -mlittle-endian
- در سیستمهای System V.4 و PowerPC تعبیهشده، کد را برای پردازنده در حالت little-endian کامپایل میکند. گزینه -mlittle-endian مشابه -mlittle است.
- -mbig
- -mbig-endian
- در سیستمهای System V.4 و PowerPC تعبیهشده، کد را برای پردازنده در حالت big-endian کامپایل میکند. گزینه -mbig-endian مشابه -mbig است.
- -mdynamic-no-pic
- در سیستمهای Darwin / macOS، کد را به گونهای کامپایل میکند که غیرقابل بازنشانی باشد، اما ارجاعات خارجی آن قابل بازنشانی باشند. کد حاصل برای برنامههای کاربردی مناسب است، اما برای کتابخانههای اشتراکی مناسب نیست.
- -msingle-pic-base
- با ثبات مورد استفاده برای نشانیدهی PIC به عنوان فقطخواندنی رفتار میکند، به جای اینکه آن را در مقدمه (prologue) هر تابع بارگذاری کند. سیستم زمان اجرا مسئول مقداردهی اولیه این ثبات با یک مقدار مناسب پیش از شروع اجرا است.
- -mprioritize-restricted-insns=priority
- این گزینه اولویتی را که در دومین مرحله زمانبندی به دستورالعملهای محدود به شیار ارسال اختصاص مییابد، کنترل میکند. آرگومان priority مقادیر 0، 1 یا 2 را میگیرد تا به ترتیب هیچ، بالاترین یا دومین اولویت بالاتر را به دستورالعملهای محدود به شیار ارسال اختصاص دهد.
- -msched-costly-dep=dependence_type
- این گزینه مشخص میکند که کدام وابستگیها در طول زمانبندی دستورالعمل توسط هدف، هزینهبر در نظر گرفته شوند. آرگومان dependence_type یکی از مقادیر زیر را میپذیرد:
- no
- هیچ وابستگیای هزینهبر نیست.
- all
- تمام وابستگیها هزینهبر هستند.
- true_store_to_load
- یک وابستگی واقعی از ذخیره به بارگذاری (store to load) هزینهبر است.
- store_to_load
- هرگونه وابستگی از ذخیره به بارگذاری هزینهبر است.
- number
- هر وابستگی که زمان تاخیر آن بزرگتر یا مساوی number باشد، هزینهبر است.
- -minsert-sched-nops=scheme
- این گزینه طرح درج NOP مورد استفاده در دومین مرحله زمانبندی را کنترل میکند. آرگومان scheme یکی از مقادیر زیر را میپذیرد:
- no
- دستورهای NOP درج نشوند.
- pad
- پر کردن هر گروه ارسال که بر اساس گروهبندی زمانبند دارای شیارهای صدور خالی است با NOPها.
- regroup_exact
- درج NOP برای انتقال اجباری دستورالعملهای وابسته هزینهبر به گروههای جداگانه. بر اساس گروهبندی تخمینی پردازنده، دقیقا به تعداد مورد نیاز برای انتقال یک دستورالعمل به گروه جدید، NOP درج میکند.
- number
- درج NOP برای انتقال اجباری دستورالعملهای وابسته هزینهبر به گروههای جداگانه. برای انتقال یک دستورالعمل به گروه جدید، به تعداد number دستور NOP درج میکند.
- -mcall-sysv
- در سیستمهای System V.4 و PowerPC تعبیهشده، کد را با استفاده از قراردادهای فراخوانی منطبق بر پیشنویس مارس ۱۹۹۵ از مکمل پردازنده PowerPC برای System V Application Binary Interface، کامپایل میکند. این حالت پیشفرض است مگر اینکه GCC را با استفاده از powerpc-*-eabiaix پیکربندی کرده باشید.
- -mcall-sysv-eabi
- -mcall-eabi
- مشخص کردن همزمان هر دو گزینه -mcall-sysv و -meabi..IP -mcall-sysv-noeabi 4 هر دو گزینهٔ -mcall-sysv و -mno-eabi را مشخص میکند.
- -mcall-aixdesc
- در سامانههای System V.4 و PowerPC توکار، کد را برای سیستمعامل AIX کامپایل میکند.
- -mcall-linux
- در سامانههای System V.4 و PowerPC توکار، کد را برای سیستم گنو مبتنی بر لینوکس (Linux-based GNU) کامپایل میکند.
- -mcall-freebsd
- در سامانههای System V.4 و PowerPC توکار، کد را برای سیستمعامل FreeBSD کامپایل میکند.
- -mcall-netbsd
- در سامانههای System V.4 و PowerPC توکار، کد را برای سیستمعامل NetBSD کامپایل میکند.
- -mcall-openbsd
- در سامانههای System V.4 و PowerPC توکار، کد را برای سیستمعامل OpenBSD کامپایل میکند.
- -mtraceback=traceback_type
- نوع جدول traceback را انتخاب میکند. مقادیر معتبر برای traceback_type عبارتند از full، part و no.
- -maix-struct-return
- تمام ساختارها (structures) را در حافظه برمیگرداند (همانطور که توسط ABI مربوط به AIX مشخص شده است).
- -msvr4-struct-return
- ساختارهای کوچکتر از ۸ بایت را در ثباتها برمیگرداند (همانطور که توسط ABI مربوط به SVR4 مشخص شده است).
- -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 توکار، فرض میکند که تمام فراخوانیهای توابع با آرگومان متغیر بهدرستی پیشنمونهسازی (prototyped) شدهاند. در غیر این صورت، کامپایلر باید پیش از هر فراخوانی بدون پیشنمونه، دستوری درج کند تا بیت ۶ ثبات کد وضعیت ("CR") را تنظیم (set) یا پاک (clear) کند تا مشخص شود آیا مقادیر ممیز شناور در ثباتهای ممیز شناور ارسال میشوند یا خیر، در صورتی که تابع آرگومان متغیر دریافت کند. با گزینهٔ -mprototype، تنها فراخوانیهای توابع با آرگومان متغیرِ دارای پیشنمونه، این بیت را تنظیم یا پاک میکنند.
- -msim
- در سامانههای PowerPC توکار، فرض میکند که ماژول راهاندازی (startup module) نامش 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 تنظیم میکند تا نشان دهد از بازنشانیهای گسترشیافتهٔ (extended relocations) مربوط به eabi استفاده میشود.
- -meabi
- -mno-eabi
- در سامانههای System V.4 و PowerPC توکار، از مشخصات رابط دودویی برنامههای توکار (EABI)، که مجموعهای از تغییرات در مشخصات System V.4 است، پیروی میکند (یا نمیکند). انتخاب -meabi به این معنی است که پشته در مرز ۸ بایتی همتراز (aligned) میشود، تابعی به نام "__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 استفاده شود.
- -msdata=none
- -mno-sdata
- در سامانههای PowerPC توکار، تمام دادههای سراسری و ایستای مقداردهیشده را در بخش ".data"، و تمام دادههای مقداردهینشده را در بخش ".bss" قرار میدهد.
- -mreadonly-in-sdata
- اشیای فقطخواندنی را نیز در بخش ".sdata" قرار میدهد. این حالت پیشفرض است.
- -mblock-move-inline-limit=num
- تمام انتقالهای بلوکی (مانند فراخوانیهای "memcpy" یا رونوشتهای ساختار) کمتر یا مساوی با num بایت را درونخطی (inline) میکند. حداقل مقدار برای num در مقصدهای ۳۲ بیتی برابر ۳۲ بایت و در مقصدهای ۶۴ بیتی برابر ۶۴ بایت است. مقدار پیشفرض به مقصد بستگی دارد (target-specific).
- -mblock-compare-inline-limit=num
- کد درونخطیِ بدون حلقه برای تمام مقایسههای بلوکی (مانند فراخوانیهای "memcmp" یا مقایسههای ساختار) کمتر یا مساوی با num بایت تولید میکند. اگر num برابر 0 باشد، تمام گسترشهای درونخطی (حلقهای و بدون حلقه) برای مقایسهٔ بلوکی غیرفعال میشود. مقدار پیشفرض به مقصد بستگی دارد (target-specific).
- -mblock-compare-inline-loop-limit=num
- یک گسترش درونخطی با استفاده از کد حلقهای برای تمام مقایسههای بلوکی که کمتر یا مساوی با num بایت هستند اما از حد مجاز گسترش مقایسهٔ بلوکی درونخطیِ بدون حلقه بیشتر هستند، تولید میکند. اگر طول بلوک ثابت نباشد، حداکثر num بایت پیش از فراخوانی "memcmp" برای مقایسهٔ باقیماندهٔ بلوک، مقایسه خواهد شد. مقدار پیشفرض به مقصد بستگی دارد (target-specific)..IP -mstring-compare-inline-limit=num 4 حداکثر num بایت رشته را با کد درونخطی (inline) مقایسه میکند. اگر تفاوت یا پایان رشته در انتهای مقایسهٔ درونخطی یافت نشود، یک فراخوانی به "strcmp" یا "strncmp" باقیماندهٔ مقایسه را انجام خواهد داد. مقدار پیشفرض ۶۴ بایت است.
- -G num
- در سیستمهای تعبیهشدهٔ PowerPC، متغیرها و اقلام سراسری و ایستا (global and static) که کمتر یا مساوی num بایت هستند را به جای بخشهای معمولی data یا BSS، در بخشهای دادهٔ کوچک یا BSS کوچک قرار میدهد. بهطور پیشفرض، مقدار num برابر با 8 است. سوئیچ -G num به پیونددهنده نیز فرستاده میشود. تمام پودمانها باید با مقدار یکسان -G num کامپایل شوند.
- -mregnames
- -mno-regnames
- در System V.4 و سیستمهای تعبیهشدهٔ PowerPC، نامهای ثباتها را در خروجی زبان اسمبلی با استفاده از اشکال نمادین درج میکند (درج نمیکند).
- -mlongcall
- -mno-longcall
- بهطور
پیشفرض
فرض میکند
که تمام
فراخوانیها
دوردست
هستند،
بهگونهای
که به یک
توالی
فراخوانی
طولانیتر
و
پرهزینهتر
نیاز است.
این امر
برای
فراخوانیهایی
که دورتر از
۳۲ مگابایت
(۳۳٬۵۵۴٬۴۳۲
بایت) از
موقعیت
فعلی
هستند،
الزامی است.
اگر
کامپایلر
بداند که
فراخوانی
نمیتواند
تا این حد
دور باشد،
یک
فراخوانی
کوتاه
تولید
میشود. این
تنظیم را
میتوان با
مشخصهٔ
تابع
"shortcall" یا
با #pragma
longcall(0) لغو
کرد.
برخی پیونددهندهها قادر به تشخیص فراخوانیهای خارج از محدوده و تولید کد چسباننده (glue code) در هنگام اجرا هستند. در این سیستمها، فراخوانیهای دور غیرضروری هستند و کد کندتری تولید میکنند. در زمان نگارش این متن، پیونددهندهٔ AIX و همچنین پیونددهندهٔ GNU برای PowerPC/64 قادر به انجام این کار هستند. برنامهریزی شده است که این قابلیت به پیونددهندهٔ GNU برای سیستمهای ۳۲ بیتی PowerPC نیز افزوده شود.
در سیستمهای PowerPC64 ELFv2 و سیستمهای ۳۲ بیتی PowerPC با پیونددهندههای جدیدتر GNU، نرمافزار GCC میتواند فراخوانیهای دور را با استفاده از یک توالی فراخوانی درونخطی PLT تولید کند (نگاه کنید به -mpltseq). معماری PowerPC با -mbss-plt و PowerPC64 ELFv1 (موتور بزرگ یا big-endian) از فراخوانیهای درونخطی PLT پشتیبانی نمیکنند.
در سیستمهای Darwin/PPC، دستور "#pragma longcall" دستور "jbsr callee, L42" را به همراه یک جزیرهٔ انشعاب (کد چسباننده) تولید میکند. این دو آدرس مقصد نشاندهندهٔ تابع فراخواندهشده و جزیرهٔ انشعاب هستند. پیونددهندهٔ Darwin/PPC آدرس اول را ترجیح میدهد و در صورتی که دستور PPC "bl" مستقیماً به فراخواندهشده برسد، یک "bl callee" تولید میکند؛ در غیر این صورت، پیونددهنده دستور "bl L42" را برای فراخوانی جزیرهٔ انشعاب تولید مینماید. جزیرهٔ انشعاب به انتهای بدنهٔ تابع فراخواننده پیوست میشود؛ این بخش آدرس کامل ۳۲ بیتی فراخواندهشده را محاسبه کرده و به آن پرش میکند.
در سیستمهای Mach-O (Darwin)، این گزینه کامپایلر را هدایت میکند تا برای هر فراخوانی مستقیم، کد چسباننده را درج نماید و پیونددهندهٔ Darwin تصمیم میگیرد که از آن استفاده کند یا آن را دور بیندازد.
در آینده، زمانی که مشخص باشد پیونددهنده کد چسباننده تولید میکند، ممکن است GCC تمام مشخصات longcall را نادیده بگیرد.
- -mpltseq
- -mno-pltseq
- گزینهٔ -fno-plt و فراخوانیهای دور را با استفاده از یک توالی فراخوانی درونخطی PLT پیادهسازی میکند (پیادهسازی نمیکند) که از پیوند تنبل (lazy linking) و فراخوانیهای دور به توابع در کتابخانههای مشترک بارگذاریشده با dlopen پشتیبانی میکند. فراخوانیهای درونخطی PLT فقط در سامانههای PowerPC64 ELFv2 و PowerPC ۳۲ بیتی با پیونددهندههای جدیدتر GNU پشتیبانی میشوند، و در صورت شناسایی این پشتیبانی هنگام پیکربندی GCC، بهطور پیشفرض فعال میگردند؛ و در مورد PowerPC ۳۲ بیتی، به شرطی که GCC با --enable-secureplt پیکربندی شده باشد. کدهای کامپایلشده با -mpltseq و اشیاء بازمکانیابیپذیر (relocatable objects) در PowerPC ۳۲ بیتی با -mbss-plt نباید با یکدیگر پیوند داده شوند.
- -mtls-markers
- -mno-tls-markers
- فراخوانیها به "__tls_get_addr" را با یک بازتعیین مکان (relocation) که آرگومان تابع را مشخص میکند نشانهگذاری میکند (نشانهگذاری نمیکند). این بازتعیین مکان به پیونددهنده اجازه میدهد تا فراخوانی تابع را بهطور قابل اطمینانی با دستورهای آمادهسازی آرگومان برای بهینهسازی TLS مرتبط سازد، که به نوبهٔ خود به GCC امکان میدهد توالی را بهتر زمانبندی کند.
- -mrecip
- -mno-recip
- این گزینه استفاده از دستورهای برآورد معکوس و برآورد معکوس جذر را با گامهای اضافی نیوتون-رافسون (Newton-Raphson) برای افزایش دقت، به جای انجام تقسیم یا جذر و تقسیم برای آرگومانهای ممیز شناور فعال میکند. هنگام استفاده از -mrecip باید از گزینهٔ -ffast-math (یا حداقل -funsafe-math-optimizations، -ffinite-math-only، -freciprocal-math و -fno-trapping-math) استفاده کنید. توجه داشته باشید که هرچند توان عملیاتی (throughput) این توالی عموماً بالاتر از توان عملیاتی دستور غیرمعکوس است، اما دقت توالی میتواند تا ۲ ulp (یعنی معکوس 1.0 برابر با 0.99999994 میشود) برای معکوس جذرها کاهش یابد.
- -mrecip=opt
- این گزینه مشخص میکند که از کدام دستورهای برآورد معکوس میتوان استفاده کرد. opt فهرستی از گزینهها است که با کاما از هم جدا شدهاند، و ممکن است یک "!" پیش از آنها برای نقیض کردن گزینه قرار گیرد:
- all
- تمام دستورهای برآورد را فعال میکند.
- default
- دستورهای پیشفرض را فعال میکند که معادل با -mrecip است.
- none
- تمام دستورهای برآورد را غیرفعال میکند که معادل با -mno-recip است.
- div
- دستورهای تقریب معکوس را برای هر دو دقت یگانه و مضاعف فعال میکند.
- divf
- دستورهای تقریب معکوس با دقت یگانه را فعال میکند.
- divd
- دستورهای تقریب معکوس با دقت مضاعف را فعال میکند.
- rsqrt
- دستورهای تقریب معکوس جذر را برای هر دو دقت یگانه و مضاعف فعال میکند.
- rsqrtf
- دستورهای تقریب معکوس جذر با دقت یگانه را فعال میکند.
- rsqrtd
- دستورهای تقریب معکوس جذر با دقت مضاعف را فعال میکند.
بنابراین، به عنوان مثال، -mrecip=all,!rsqrtd تمام دستورهای برآورد معکوس را به جز دستورهای "FRSQRTE"، "XSRSQRTEDP" و "XVRSQRTEDP" که محاسبات معکوس جذر با دقت مضاعف را انجام میدهند، فعال میکند.
- -mrecip-precision
- -mno-recip-precision
- فرض میکند (فرض نمیکند) که دستورهای برآورد معکوس، برآوردهایی با دقت بالاتر از آنچه توسط ABI در PowerPC تعیین شده ارائه میدهند. انتخاب -mcpu=power6، -mcpu=power7 یا -mcpu=power8 بهطور خودکار -mrecip-precision را انتخاب میکند. دستورهای برآورد جذر با دقت مضاعف بهطور پیشفرض در ماشینهای با دقت پایین تولید نمیشوند، زیرا برآوردی که پس از سه مرحله همگرا شود ارائه نمیدهند.
- -mveclibabi=type
- نوع ABI مورد استفاده برای برداریسازی توابع درونی (intrinsics) با استفاده از یک کتابخانهٔ خارجی را تعیین میکند. تنها نوع پشتیبانیشده در حال حاضر mass است که استفاده از کتابخانههای Mathematical Acceleration Subsystem (MASS) شرکت IBM را برای برداریسازی توابع درونی با کتابخانههای خارجی مشخص میکند. کامپایلر GCC هنگام تولید کد برای power7 در حال حاضر فراخوانیهایی به "acosd2"، "acosf4"، "acoshd2"، "acoshf4"، "asind2"، "asinf4"، "asinhd2"، "asinhf4"، "atan2d2"، "atan2f4"، "atand2"، "atanf4"، "atanhd2"، "atanhf4"، "cbrtd2"، "cbrtf4"، "cosd2"، "cosf4"، "coshd2"، "coshf4"، "erfcd2"، "erfcf4"، "erfd2"، "erff4"، "exp2d2"، "exp2f4"، "expd2"، "expf4"، "expm1d2"، "expm1f4"، "hypotd2"، "hypotf4"، "lgammad2"، "lgammaf4"، "log10d2"، "log10f4"، "log1pd2"، "log1pf4"، "log2d2"، "log2f4"، "logd2"، "logf4"، "powd2"، "powf4"، "sind2"، "sinf4"، "sinhd2"، "sinhf4"، "sqrtd2"، "sqrtf4"، "tand2"، "tanf4"، "tanhd2" و "tanhf4" تولید میکند. هر دو گزینهٔ -ftree-vectorize و -funsafe-math-optimizations نیز باید فعال باشند. کتابخانههای MASS باید در زمان پیوند مشخص شوند.
- -mfriz
- -mno-friz
- هنگامی که از گزینهٔ -funsafe-math-optimizations برای بهینهسازی گرد کردن مقادیر ممیز شناور به عدد صحیح ۶۴ بیتی و بازگشت آن به ممیز شناور استفاده میشود، دستور "friz" را تولید میکند (تولید نمیکند). اگر عدد ممیز شناور برای جا گرفتن در یک عدد صحیح بیش از حد بزرگ باشد، دستور "friz" مقدار یکسانی را بازنمیگرداند.
- -mpointers-to-nested-functions
- -mno-pointers-to-nested-functions
- هنگام فراخوانی از طریق اشارهگر در سیستمهای AIX و لینوکس ۶۴ بیتی که در آنها یک اشارهگر تابع به توصیفگر ۳ کلمهای حاوی آدرس تابع، مقدار TOC برای بارگذاری در ثبات "r2"، و مقدار زنجیرهٔ ایستا (static chain) برای بارگذاری در ثبات "r11" اشاره دارد، کدی برای بارگذاری ثبات زنجیرهٔ ایستا ("r11") تولید میکند (تولید نمیکند). گزینهٔ -mpointers-to-nested-functions بهطور پیشفرض فعال است. در صورت استفاده از -mno-pointers-to-nested-functions، نمیتوانید از طریق اشارهگرها، توابع تودرتو یا اشارهگرها به توابعی را که به زبانهای دیگر کامپایل شده و از زنجیرهٔ ایستا استفاده میکنند فراخوانی نمایید..IP -msave-toc-indirect 4
- -mno-save-toc-indirect
- تولید (عدم تولید) کد برای ذخیره مقدار TOC در مکان رزروشده پشته در پرولوگ (prologue) تابع، در صورتی که تابع روی سیستمهای AIX و 64-bit Linux از طریق یک اشارهگر فراخوانی کند. اگر مقدار TOC در پرولوگ ذخیره نشود، دقیقاً پیش از فراخوانی از طریق اشارهگر ذخیره میشود. گزینه -mno-save-toc-indirect پیشفرض است.
- -mcompat-align-parm
- -mno-compat-align-parm
- تولید (عدم
تولید) کد
برای ارسال
پارامترهای
ساختار (structure)
با حداکثر
تراز ۶۴
بیت، جهت
سازگاری با
نسخههای
قدیمیتر 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 برای canary
سراسری یا
tls برای canary به
ازای هر
رشته در
بلوک TLS
(پیشفرض با
نسخه 2.4 یا
بالاتر GNU libc).
در صورت انتخاب مورد دوم، گزینههای -mstack-protector-guard-reg=reg و -mstack-protector-guard-offset=offset علاوه بر این مشخص میکنند که از کدام ثبات به عنوان ثبات پایه برای خواندن canary استفاده شود، و از چه آفستی نسبت به آن ثبات پایه خوانده شود. پیشفرض این موارد همان است که در ABI مربوطه مشخص شده است.
- -mpcrel
- -mno-pcrel
- تولید (عدم تولید) آدرسدهی وابسته به شمارنده برنامه (pc-relative). گزینه -mpcrel مستلزم فعال بودن مدل کد متوسط (-mcmodel=medium) و آدرسدهی پیشوندی (-mprefixed) است.
- -mprefixed
- -mno-prefixed
- تولید (عدم تولید) حالتهای آدرسدهی با استفاده از دستورالعملهای پیشوندی بارگذاری (load) و ذخیرهسازی (store). گزینه -mprefixed مستلزم فعال بودن گزینه -mcpu=power10 (یا جدیدتر) است.
- -mmma
- -mno-mma
- تولید (عدم تولید) دستورالعملهای MMA. گزینه -mma مستلزم فعال بودن گزینه -mcpu=power10 (یا جدیدتر) است.
- -mrop-protect
- -mno-rop-protect
- تولید (عدم تولید) دستورالعملهای محافظت در برابر ROP هنگامی که پردازنده هدف از آنها پشتیبانی میکند. در حال حاضر این گزینه بهینهسازی shrink-wrap (-fshrink-wrap) را غیرفعال میکند.
- -mprivileged
- -mno-privileged
- تولید (عدم تولید) کدی که در وضعیت ممتاز (privileged state) اجرا خواهد شد.
- -mblock-ops-unaligned-vsx
- -mno-block-ops-unaligned-vsx
- تولید (عدم تولید) بارگذاریها و ذخیرهسازیهای غیرتراز vsx برای گسترش درونخطی (inline expansion) توابع "memcpy" و "memmove".
- --param rs6000-vect-unroll-limit=
- بردارساز (vectorizer) اطلاعات پردازنده هدف را بررسی میکند تا تعیین کند که آیا باز کردن (unroll) حلقه برداری اصلی سودمند است یا خیر و تا چه اندازه. این پارامتر حد بالایی میزان باز کردن حلقه اصلی توسط بردارساز را تعیین میکند. مقدار پیشفرض چهار است.
گزینههای RX (RX Options)
این گزینههای خط فرمان برای اهداف RX تعریف شدهاند:
- -m64bit-doubles
- -m32bit-doubles
- اندازه نوع داده "double" را ۶۴ بیت (-m64bit-doubles) یا ۳۲ بیت (-m32bit-doubles) تعیین میکند. مقدار پیشفرض -m32bit-doubles است. توجه: سختافزار ممیز شناور RX تنها روی مقادیر ۳۲ بیتی کار میکند، به همین دلیل مقدار پیشفرض -m32bit-doubles است.
- -fpu
- -nofpu
- استفاده از
سختافزار
ممیز شناور
RX را فعال (-fpu)
یا غیرفعال
(-nofpu) میکند.
پیشفرض
برای سری RX600
فعال و برای
سری RX200
غیرفعال
است.
دستورالعملهای ممیز شناور تنها برای مقادیر ممیز شناور ۳۲ بیتی تولید میشوند، بنابراین در صورت استفاده از گزینه -m64bit-doubles، سختافزار FPU برای نوع double استفاده نمیشود.
توجه: اگر گزینه -fpu فعال باشد، گزینه -funsafe-math-optimizations نیز به طور خودکار فعال میشود. زیرا دستورالعملهای FPU در پردازنده RX ذاتاً ناامن هستند.
- -mcpu=name
- نوع
پردازنده RX
هدف را
انتخاب
میکند. در
حال حاضر سه
نوع
پشتیبانی
میشوند:
سختافزار
عمومی
سریهای RX600
و RX200 و
پردازنده
خاص RX610.
مقدار
پیشفرض RX600
است.
تنها تفاوت بین RX600 و RX610 این است که RX610 از دستورالعمل "MVTIPL" پشتیبانی نمیکند.
سری RX200 فاقد واحد سختافزاری ممیز شناور است و بنابراین هنگامی که این نوع انتخاب شود، گزینه -nofpu به طور پیشفرض فعال است.
- -mbig-endian-data
- -mlittle-endian-data
- دادهها (و نه کد) را در قالب big-endian ذخیره میکند. پیشفرض -mlittle-endian-data است، یعنی ذخیره دادهها در قالب little-endian.
- -msmall-data-limit=N
- حداکثر
اندازه
متغیرهای
سراسری (global) و
ایستا (static) بر
حسب بایت را
که
میتوانند
در ناحیه
دادههای
کوچک (small data area)
قرار
گیرند،
مشخص
میکند.
استفاده از
ناحیه
دادههای
کوچک
میتواند
به کدی
کوچکتر و
سریعتر
منجر شود،
اما اندازه
این ناحیه
محدود است و
برنامهنویس
باید
اطمینان
حاصل کند که
این ناحیه
سرریز نشود.
همچنین
هنگامی که
از ناحیه
دادههای
کوچک
استفاده
میشود،
یکی از
ثباتهای RX
(معمولاً
"r13") برای
اشاره به
این ناحیه
رزرو
میشود، در
نتیجه دیگر
توسط
کامپایلر
قابل
استفاده
نخواهد بود.
این امر در
صورتی که
متغیرها به
جای
نگهداری
در این ثبات
بر روی پشته
قرار
گیرند،
ممکن است به
تولید کدی
کندتر و/یا
بزرگتر
بینجامد.
توجه داشته باشید که متغیرهای عمومی یا مقداردهینشده (common variables) و ثابتها در ناحیه دادههای کوچک قرار نمیگیرند زیرا به بخشهای دیگری در فایل اجرایی خروجی اختصاص مییابند.
مقدار پیشفرض صفر است که این ویژگی را غیرفعال میکند. توجه داشته باشید که این ویژگی به دلیل اثرات بالقوه نامطلوب رزرو یک ثبات، در سطوح بهینهسازی بالاتر (-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 بدین معناست که مقادیر ثابت با هر اندازهای مجاز هستند..IP -mrelax 4 فعالسازی بهینهسازی پیونددهنده (linker relaxation). بهینهسازی پیونددهنده فرآیندی است که طی آن پیونددهنده با یافتن نسخههای کوتاهتر از دستورالعملهای گوناگون، تلاش میکند اندازه برنامه را کاهش دهد. بهطور پیشفرض غیرفعال است.
- -mint-register=N
- تعداد ثباتهای رزروشده برای توابع گرداننده وقفه سریع (fast interrupt handler) را مشخص میکند. مقدار 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) را فعال
میکند.
هنگام فعال
بودن،
هرگونه
دسترسی به
دادههای
ثابت از
طریق یک
آفست نسبت
به یک آدرس
پایه که در
یک ثبات
نگهداری
میشود
انجام
میگیرد.
این قابلیت
اجازه
میدهد
مکان
دادههای
ثابت در
زمان اجرا
تعیین شود
بدون اینکه
نیازی به
بازنشانی
مکان (relocate)
فایل
اجرایی
باشد، که
مزیتی برای
برنامههای
تعبیهشده
با
محدودیتهای
شدید حافظه
است.
دادههایی
که قابل
تغییر
هستند تحت
تأثیر این
گزینه قرار
نمیگیرند.
توجه داشته باشید که استفاده از این ویژگی یک ثبات، معمولاً "r13"، را برای آدرس پایه دادههای ثابت رزرو میکند. این امر بهویژه در توابع پیچیده میتواند منجر به ایجاد کدی کندتر و/یا حجیمتر شود.
ثبات واقعی انتخابشده برای نگهداری آدرس پایه دادههای ثابت بستگی به این دارد که گزینههای خط فرمان -msmall-data-limit و/یا -mint-register فعال باشند یا خیر. با شروع از ثبات "r13" و حرکت رو به پایین، ثباتها ابتدا برای برآورده کردن الزامات -mint-register، سپس -mpid و در نهایت -msmall-data-limit تخصیص مییابند. بنابراین، اگر هر دو گزینه -mint-register=4 و -mpid در خط فرمان مشخص شده باشند، ممکن است ثبات ناحیه دادههای کوچک "r8" باشد.
این ویژگی بهطور پیشفرض فعال نیست. حالت پیشفرض را میتوان از طریق گزینه خط فرمان -mno-pid بازگرداند.
- -mno-warn-multiple-fast-interrupts
- -mwarn-multiple-fast-interrupts
- از صدور پیام هشدار توسط GCC در صورتی که هنگام کامپایل یک فایل بیش از یک گرداننده وقفه سریع بیابد، جلوگیری میکند. حالت پیشفرض صدور هشدار برای هر گرداننده وقفه سریع اضافی یافتشده است، چرا که معماری RX تنها از یک وقفه از این نوع پشتیبانی میکند.
- -mallow-string-insns
- -mno-allow-string-insns
- استفاده از
دستورالعملهای
دستکاری
رشته
"SMOVF"،
"SCMPU"،
"SMOVB"،
"SMOVU"،
"SUNTIL"،
"SWHILE" و
همچنین
دستورالعمل
"RMPA" را
فعال یا
غیرفعال
میکند. این
دستورالعملها
ممکن است
دادهها را
از پیش
واکشی (prefetch)
کنند که در
صورت
دسترسی به
یک ثبات I/O،
انجام آن
ایمن نیست.
(برای
اطلاعات
بیشتر به
بخش 12.2.7 از RX62N Group User's Manual
مراجعه
کنید).
حالت پیشفرض، مجاز دانستن این دستورالعملها است، اما برای GCC ممکن نیست که تمام شرایطی را که ممکن است از یک دستورالعمل رشته برای دسترسی به یک ثبات I/O استفاده شود به طور مطمئن تشخیص دهد، بنابراین استفاده از آنها نمیتواند بهطور خودکار غیرفعال شود. در عوض، بر عهده برنامهنویس است که در صورت دسترسی برنامهاش به فضای I/O، از گزینه -mno-allow-string-insns استفاده کند.
هنگامی که این دستورالعملها فعال هستند، GCC نماد پیشپردازنده C به نام "__RX_ALLOW_STRING_INSNS__" را تعریف میکند، در غیر این صورت نماد "__RX_DISALLOW_STRING_INSNS__" را تعریف مینماید.
- -mjsr
- -mno-jsr
- استفاده فقط (یا نه فقط) از دستورالعملهای "JSR" برای دسترسی به توابع. این گزینه زمانی میتواند استفاده شود که اندازه کد از دامنهٔ مجاز دستورالعملهای "BSR" فراتر رود. توجه داشته باشید که -mno-jsr به معنی استفاده نکردن از "JSR" نیست، بلکه در عوض به این معنی است که میتوان از هر نوع پرشی (branch) استفاده کرد.
نکته: گزینه عمومی خط فرمان GCC به نام -ffixed-reg هنگامی که همراه با ویژگی تابع "interrupt" استفاده شود، اهمیت ویژهای برای معماری RX دارد. این ویژگی نشاندهنده تابعی است که برای پردازش وقفههای سریع در نظر گرفته شده است. GCC تضمین میکند که فقط از ثباتهای "r10"، "r11"، "r12" و/یا "r13" استفاده کند و این هم تنها به شرطی است که استفاده عادی از ثباتهای مربوطه از طریق گزینههای خط فرمان -ffixed-reg یا -mint-register محدود شده باشد.
گزینههای S/390 و zSeries
اینها گزینههای -m تعریفشده برای معماری S/390 و zSeries هستند.
- -mhard-float
- -msoft-float
- استفاده کردن (استفاده نکردن) از دستورالعملها و ثباتهای ممیز شناور سختافزاری برای عملیات ممیز شناور. هنگامی که -msoft-float مشخص شود، از توابع موجود در libgcc.a برای انجام عملیات ممیز شناور استفاده میشود. زمانی که -mhard-float مشخص شود، کامپایلر دستورالعملهای ممیز شناور IEEE را تولید میکند. این حالت پیشفرض است.
- -mhard-dfp
- -mno-hard-dfp
- استفاده کردن (استفاده نکردن) از دستورالعملهای سختافزاری ممیز شناور دهدهی برای عملیات ممیز شناور دهدهی. هنگامی که -mno-hard-dfp مشخص شود، از توابع موجود در libgcc.a برای انجام عملیات ممیز شناور دهدهی استفاده میشود. زمانی که -mhard-dfp مشخص شود، کامپایلر دستورالعملهای سختافزاری ممیز شناور دهدهی را تولید میکند. این حالت برای -march=z9-ec یا بالاتر پیشفرض است.
- -mlong-double-64
- -mlong-double-128
- این گزینهها اندازه نوع "long double" را کنترل میکنند. اندازه ۶۴ بیتی باعث میشود نوع "long double" معادل نوع "double" شود. این حالت پیشفرض است.
- -mbackchain
- -mno-backchain
- ذخیره کردن
(ذخیره
نکردن) آدرس
فریم
فراخواننده
به عنوان
اشارهگر backchain
در فریم
پشته
فراخواندهشده.
ممکن است یک
backchain برای
مجاز ساختن
اشکالزدایی
با استفاده
از
ابزارهایی
که اطلاعات
فریم
فراخوانی DWARF
را درک
نمیکنند،
مورد نیاز
باشد.
هنگامی که
-mno-packed-stack اعمال
شده باشد،
اشارهگر backchain
در انتهای
فریم پشته
ذخیره
میشود؛
هنگامی که
-mpacked-stack اعمال
شده باشد،
backchain در
بالاترین
کلمه (word) از
ناحیه
ذخیره ثبات
۹۶/۱۶۰
بایتی قرار
داده
میشود.
بهطور کلی، کدی که با -mbackchain کامپایل شده باشد از نظر فراخوانی با کدی که با -mno-backchain کامپایل شده سازگار (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 مشخص
شود،
اسلاتهای
ذخیره ثبات
به صورت
فشرده در
بالای
ناحیه
ذخیره ثبات
قرار
میگیرند؛
فضای
استفادهنشده
برای اهداف
دیگر
بازاستفاده
میشود که
امکان
استفاده
بهینهتر
از فضای
پشتهٔ
موجود را
فراهم
میکند. با
این حال،
هنگامی که
-mbackchain نیز
اعمال شده
باشد،
بالاترین
کلمه (word)
ناحیه
ذخیرهسازی
همیشه برای
ذخیره 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" به جای آن است که این محدودیت را ندارد..IP -m64 4
- -m31
- هنگامی که -m31 مشخص شود، کدی سازگار با ABI مربوط به GNU/Linux for S/390 تولید میشود. زمانی که -m64 مشخص شود، کدی سازگار با ABI مربوط به GNU/Linux for zSeries تولید میگردد. این امر بهویژه به GCC اجازه میدهد تا دستورالعملهای ۶۴-بیتی تولید کند. برای مقصدهای s390، حالت پیشفرض -m31 است، در حالی که برای مقصدهای s390x پیشفرض -m64 میباشد.
- -mzarch
- -mesa
- هنگامی که -mzarch مشخص شود، کد با استفاده از دستورالعملهای موجود در z/Architecture تولید میشود. هنگامی که -mesa مشخص شود، کد با استفاده از دستورالعملهای موجود در ESA/390 تولید خواهد شد. توجه داشته باشید که استفاده از -mesa همراه با -m64 امکانپذیر نیست. هنگام تولید کدی سازگار با ABI مربوط به GNU/Linux for S/390، پیشفرض -mesa است. هنگام تولید کدی سازگار با ABI مربوط به GNU/Linux for zSeries، پیشفرض -mzarch میباشد.
- -mhtm
- -mno-htm
- گزینهٔ -mhtm مجموعهای از توابع درونی (builtins) را فعال میکند که از دستورالعملهای ارائهشده در امکان اجرای تراکنشی (transactional execution facility) معرفیشده با نسل ماشینهای IBM zEnterprise EC12 استفاده میکنند S/390 System z Built-in Functions. -mhtm هنگام استفاده از -march=zEC12 بهطور پیشفرض فعال است.
- -mvx
- -mno-vx
- هنگامی که -mvx مشخص شود، کد با استفاده از دستورالعملهای ارائهشده در امکان افزونهٔ برداری (vector extension facility) معرفیشده با نسل ماشینهای IBM z13 تولید میشود. این گزینه ABI را برای برخی از مقادیر نوع برداری با توجه به ترازسازی (alignment) و قراردادهای فراخوانی (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 باید گنجانده (include) شود. -mzvector بهطور پیشفرض غیرفعال است.
- -mmvcle
- -mno-mvcle
- تولید (یا عدم تولید) کد با استفاده از دستورالعمل "mvcle" برای انجام جابهجاییهای بلوکی (block moves). وقتی -mno-mvcle مشخص شود، در عوض از یک حلقهٔ "mvc" استفاده خواهد شد. این حالت پیشفرض است مگر اینکه بهینهسازی برای اندازه انجام شود.
- -mdebug
- -mno-debug
- چاپ کردن (یا عدم چاپ) اطلاعات اشکالزدایی اضافی هنگام کامپایل. حالت پیشفرض، عدم چاپ اطلاعات اشکالزدایی است.
- -march=cpu-type
- تولید کدی
که بر روی cpu-type
اجرا شود،
که نام
سیستمی
نشاندهنده
یک نوع
پردازندهٔ
خاص است.
مقادیر
ممکن برای
cpu-type عبارتند
از z900/arch5،
z990/arch6، z9-109،
z9-ec/arch7، z10/arch8،
z196/arch9، zEC12،
z13/arch11، z14/arch12،
z15/arch13، z16/arch14،
z17/arch15، و native.
مقدار پیشفرض -march=z900 است.
مشخص کردن native بهعنوان نوع پردازنده را میتوان برای انتخاب بهترین گزینهٔ معماری مناسب با پردازندهٔ میزبان به کار برد. اگر GCC پردازنده را شناسایی نکند، -march=native هیچ تأثیری نخواهد داشت.
- -mtune=cpu-type
- تنظیم دقیق (Tune) همهٔ موارد مرتبط در کد تولیدشده برای 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.
- -mfused-madd
- -mno-fused-madd
- تولید کدی که از دستورالعملهای ضرب و تجمیع ممیز شناور (floating-point multiply and accumulate) استفاده میکند (یا استفاده نمیکند). در صورت استفاده از ممیز شناور سختافزاری، این دستورالعملها بهطور پیشفرض تولید میشوند.
- -mwarn-framesize=framesize
- صادر کردن هشدار در صورتی که اندازه فریم تابع فعلی از framesize دادهشده فراتر رود. از آنجا که این یک بررسی در زمان کامپایل است، لزوماً به این معنی نیست که هنگام اجرای برنامه مشکلی واقعی رخ دهد. این گزینه با هدف شناسایی توابعی در نظر گرفته شده که به احتمال بسیار زیاد باعث سرریز پشته (stack overflow) میشوند؛ همچنین برای استفاده در محیطهایی با اندازه پشتهٔ محدود مانند کرنل لینوکس بسیار سودمند است.
- -mwarn-dynamicstack
- صادر کردن یک هشدار در صورتی که تابع "alloca" را فراخوانی کند یا از آرایههای با اندازهٔ پویا استفاده نماید. این کار در پشته با اندازهٔ محدود عموماً ایدهٔ نادرستی به شمار میرود.
- -mstack-guard=stack-guard
- -mstack-size=stack-size
- اگر این گزینهها فراهم شوند، بخش پشتیبانی (back end) مربوط به S/390 دستورالعملهای اضافهای در مقدمهٔ تابع (function prologue) صادر میکند که در صورت فراتر رفتن اندازهٔ پشته به میزان stack-guard بایت بالاتر از stack-size، یک تله (trap) فعال میشود (به یاد داشته باشید که پشته در S/390 به سمت پایین رشد میکند). چنانچه گزینهٔ stack-guard حذف شود، کوچکترین توان ۲ که بزرگتر از اندازهٔ فریم تابع کامپایلشده باشد انتخاب میگردد. این گزینهها برای کمک به اشکالزدایی مشکلات سرریز پشته طراحی شدهاند. کد اضافه تولیدشده سربار ناچیزی ایجاد میکند و از این رو میتوان از آن در سیستمهای محیط عملیاتی (production) نیز بدون افت محسوس کارایی بهره برد. مقادیر مشخصشده باید دقیقاً توانهایی از ۲ باشند و stack-size باید بدون تجاوز از 64k از stack-guard بزرگتر باشد. برای افزایش کارایی، کد اضافه فرض میکند که پشته از آدرسی همتراز با مقدار تعیینشده در stack-size شروع میشود. گزینهٔ stack-guard تنها همراه با stack-size قابل استفاده است.
- -mhotpatch=pre-halfwords,post-halfwords
- اگر گزینهٔ
hotpatch فعال
باشد، یک
مقدمهٔ
تابع مخصوص
وصلهزدن
درجا (hot-patching)
برای تمام
توابع
موجود در
واحد
کامپایل
تولید
میشود. پیش
از برچسب
تابع،
تعداد
مشخصشدهای
از
دستورالعملهای
دو بایتی NOP
(pre-halfwords،
حداکثر
۱۰۰۰۰۰۰)
قرار
میگیرد. پس
از برچسب، ۲
* post-halfwords بایت با
استفاده از
بزرگترین
دستورالعملهای
مشابه NOP که
معماری
اجازه
میدهد
افزوده
میشود
(حداکثر
۱۰۰۰۰۰۰).
اگر هر دو آرگومان صفر باشند، hotpatching غیرفعال میشود.
این گزینه میتواند برای توابع مجزا با استفاده از مشخصهٔ "hotpatch" نادیده گرفته و بازنویسی (override) شود.
گزینههای SH (SH Options)
این گزینههای -m برای پیادهسازیهای SH تعریف شدهاند:
- -m1
- تولید کد برای SH1.
- -m2
- تولید کد برای SH2.
- -m2e
- تولید کد برای SH2e.
- -m2a-nofpu
- تولید کد برای SH2a فاقد FPU، یا برای SH2a-FPU به گونهای که از واحد ممیز شناور (FPU) استفاده نشود..IP -m2a-single-only 4 تولید کد برای SH2a-FPU بهگونهای که هیچ عملیات ممیز شناور با دقت مضاعف (double-precision) استفاده نشود.
- -m2a-single
- تولید کد برای SH2a-FPU با این فرض که واحد ممیز شناور بهطور پیشفرض در حالت دقت یگانه (single-precision) قرار دارد.
- -m2a
- تولید کد برای SH2a-FPU با این فرض که واحد ممیز شناور بهطور پیشفرض در حالت دقت مضاعف قرار دارد.
- -m3
- تولید کد برای SH3.
- -m3e
- تولید کد برای SH3e.
- -m4-nofpu
- تولید کد برای SH4 بدون واحد ممیز شناور.
- -m4-single-only
- تولید کد برای SH4 با یک واحد ممیز شناور که تنها از محاسبات با دقت یگانه پشتیبانی میکند.
- -m4-single
- تولید کد برای SH4 با این فرض که واحد ممیز شناور بهطور پیشفرض در حالت دقت یگانه قرار دارد.
- -m4
- تولید کد برای SH4.
- -m4-100
- تولید کد برای SH4-100.
- -m4-100-nofpu
- تولید کد برای SH4-100 بهگونهای که از واحد ممیز شناور استفاده نشود.
- -m4-100-single
- تولید کد برای SH4-100 با این فرض که واحد ممیز شناور بهطور پیشفرض در حالت دقت یگانه قرار دارد.
- -m4-100-single-only
- تولید کد برای SH4-100 بهگونهای که هیچ عملیات ممیز شناور با دقت مضاعف استفاده نشود.
- -m4-200
- تولید کد برای SH4-200.
- -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-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
- تراز کردن متغیرهای ممیز شناور مضاعف (doubles) در مرزهای ۶۴ بیتی. توجه داشته باشید که این کار قراردادهای فراخوانی (calling conventions) را تغییر میدهد و بنابراین برخی از توابع کتابخانه استاندارد C کار نخواهند کرد مگر اینکه ابتدا آن را با -mdalign بازکامپایل کنید.
- -mrelax
- کوتاه کردن برخی از ارجاعات آدرس در زمان پیوند در صورت امکان؛ از گزینه -relax در پیونددهنده استفاده میکند.
- -mbigtable
- استفاده از آفستهای ۳۲ بیتی در جدولهای "switch". پیشفرض استفاده از آفستهای ۱۶ بیتی است.
- -mbitops
- فعالسازی استفاده از دستورالعملهای دستکاری بیت روی SH2A.
- -mfmovd
- فعالسازی استفاده از دستورالعمل "fmovd". برای محدودیتهای تراز، -mdalign را بررسی کنید.
- -mrenesas
- سازگاری با قراردادهای فراخوانی تعریفشده توسط Renesas.
- -mno-renesas
- سازگاری با قراردادهای فراخوانی تعریفشده برای GCC پیش از ارائه قراردادهای Renesas. این گزینه برای تمام مقصدهای زنجیره ابزار SH پیشفرض است.
- -mnomacsave
- علامتگذاری ثبات "MAC" به عنوان تخریبشده حین فراخوانی (call-clobbered)، حتی اگر -mrenesas داده شده باشد.
- -mieee
- -mno-ieee
- کنترل انطباق مقایسههای ممیز شناور با استاندارد IEEE، که بر نحوه مدیریت مواردی که نتیجه مقایسه نامرتب (unordered) است تأثیر میگذارد. بهطور پیشفرض -mieee به صورت ضمنی فعال است. اگر -ffinite-math-only فعال باشد، -mno-ieee به صورت ضمنی تنظیم میشود که منجر به مقایسههای سریعتر بزرگتر مساوی و کوچکتر مساوی در ممیز شناور میگردد. تنظیمات ضمنی را میتوان با تعیین صریح -mieee یا -mno-ieee بازنویسی کرد.
- -minline-ic_invalidate
- درونخطسازی کد برای باطلکردن مدخلهای حافظه نهان دستورالعمل (instruction cache) پس از راهاندازی ترامپولینهای توابع تودرتو. این گزینه اگر -musermode برقرار باشد و گزینه تولید کد انتخابی (مانند -m4) اجازه استفاده از دستورالعمل "icbi" را ندهد، هیچ تأثیری ندارد. اگر گزینه تولید کد انتخابی اجازه استفاده از دستورالعمل "icbi" را ندهد و -musermode برقرار نباشد، کد درونخطشده مستقیماً آرایه آدرس حافظه نهان دستورالعمل را با نوشتن انجمنی (associative write) دستکاری میکند. این امر نهتنها در زمان اجرا به حالت ممتاز (privileged mode) نیاز دارد، بلکه در صورتی که خط حافظه نهان از طریق TLB نگاشت شده و سپس نگاشت آن حذف شده باشد نیز با شکست مواجه میشود.
- -misize
- ثبت اندازه و مکان دستورالعمل در کد اسمبلی.
- -mpadstruct
- این گزینه منسوخ شده است. این گزینه ساختارها را تا مضربی از ۴ بایت تراز/پر (pad) میکند، که با SH ABI ناسازگار است.
- -matomic-model=model
- تنظیم مدل عملیات اتمی و پارامترهای اضافی به صورت یک فهرست جداشده با کاما. برای جزئیات در مورد توابع درونی اتمی، __atomic Builtins را ببینید. مدلها و پارامترهای زیر پشتیبانی میشوند:
- none
- غیرفعال کردن توالیهای اتمی تولیدشده توسط کامپایلر و استفاده از فراخوانیهای کتابخانهای برای عملیات اتمی. این حالت در صورتی که مقصد "sh*-*-linux*" نباشد پیشفرض است.
- soft-gusa
- تولید توالیهای اتمی نرمافزاری gUSA سازگار با GNU/Linux برای توابع درونی اتمی. توالیهای اتمی تولیدشده نیازمند پشتیبانی اضافی از طرف کد مدیریت وقفه/استثنای سیستم هستند و فقط برای سیستمهای تکهستهای SH3* و SH4* مناسباند. این گزینه بهطور پیشفرض زمانی که مقصد "sh*-*-linux*" و SH3* یا SH4* باشد فعال است. هنگامی که مقصد SH4A باشد، این گزینه همچنین تا حدی از دستورالعملهای سختافزاری اتمی "movli.l" و "movco.l" برای تولید کدی بهینهتر استفاده میکند، مگر اینکه strict مشخص شده باشد.
- soft-tcb
- تولید توالیهای اتمی نرمافزاری که از یک متغیر در بلوک کنترل نخ (thread control block) استفاده میکنند. این گونهای از توالیهای gUSA است که میتواند روی مقصدهای SH1* و SH2* نیز استفاده شود. توالیهای اتمی تولیدشده نیازمند پشتیبانی اضافی از طرف کد مدیریت وقفه/استثنای سیستم هستند و تنها برای سیستمهای تکهستهای مناسباند. هنگام استفاده از این مدل، پارامتر gbr-offset= نیز باید مشخص شود..IP soft-imask 4 توالیهای اتمیک نرمافزاری تولید میکند که با تنظیم "SR.IMASK = 1111" وقفهها را موقتاً غیرفعال میکنند. این مدل تنها زمانی کار میکند که برنامه در حالت ممتاز (privileged mode) اجرا شود و فقط برای سیستمهای تکهستهای مناسب است. پشتیبانی اضافی از سوی کد مدیریت وقفه/استثنای سیستم مورد نیاز نیست. این مدل بهطور پیشفرض زمانی که هدف "sh*-*-linux*" و SH1* یا SH2* باشد فعال است.
- hard-llcs
- توالیهای اتمیک سختافزاری را تنها با استفاده از دستورالعملهای "movli.l" و "movco.l" تولید میکند. این گزینه فقط در SH4A موجود است و برای سیستمهای چندهستهای مناسب است. از آنجا که دستورالعملهای سختافزاری تنها از متغیرهای اتمیک ۳۲ بیتی پشتیبانی میکنند، دسترسی به متغیرهای ۸ یا ۱۶ بیتی با دسترسیهای ۳۲ بیتی شبیهسازی میشود. کدی که با این گزینه کامپایل شده است، در صورت اجرا بر روی یک سیستم SH4A، با سایر سیستمهای مدیریت وقفه/استثنای مدل اتمیک نرمافزاری نیز سازگار است. برای این مدل پشتیبانی اضافی از سوی کد مدیریت وقفه/استثنای سیستم مورد نیاز نیست.
- gbr-offset=
- این پارامتر آفست متغیر را بر حسب بایت در ساختار بلوک کنترل رشته (thread control block) مشخص میکند که باید توسط توالیهای اتمیک تولیدشده، هنگامی که مدل soft-tcb انتخاب شده است، استفاده شود. برای سایر مدلها این پارامتر نادیده گرفته میشود. مقدار مشخصشده باید مضرب صحیحی از چهار و در محدودهٔ 0-1020 باشد.
- strict
- این پارامتر از استفادهٔ ترکیبی چندین مدل اتمیک، حتی در صورت سازگار بودن آنها، جلوگیری میکند و باعث میشود کامپایلر تنها توالیهای اتمیک مدل مشخصشده را تولید کند.
- -mtas
- کد دستوری "tas.b" را برای "__atomic_test_and_set" تولید میکند. توجه داشته باشید که بسته به پیکربندی سختافزاری و نرمافزاری خاص، این کار میتواند به دلیل تخلیه خطوط حافظهٔ پنهان عملوند که توسط دستورالعمل "tas.b" تحمیل میشود، کارایی کلی را کاهش دهد. در پردازندههای چندهستهای SH4A، دستورالعمل "tas.b" باید با احتیاط استفاده شود زیرا میتواند در برخی پیکربندیهای حافظهٔ پنهان منجر به خرابی دادهها شود.
- -mprefergot
- هنگام تولید کد مستقل از موقعیت، فراخوانیهای توابع را به جای جدول پیوند رویه (Procedure Linkage Table) با استفاده از جدول آفست سراسری (Global Offset Table) صادر میکند.
- -musermode
- -mno-usermode
- به کامپایلر اجازه نمیدهد (اجازه میدهد) کد حالت ممتاز (privileged mode) تولید کند. مشخص کردن -musermode همچنین در صورتی که کد درونخطیشده در حالت کاربر کار نکند، مستلزم -mno-inline-ic_invalidate است. گزینهٔ -musermode زمانی که هدف "sh*-*-linux*" باشد پیشفرض است. اگر هدف SH1* یا SH2* باشد، -musermode هیچ تأثیری ندارد، زیرا حالت کاربر وجود ندارد.
- -multcost=number
- هزینهای را که برای دستورالعمل ضرب در نظر گرفته میشود تعیین میکند.
- -mdiv=strategy
- راهبرد تقسیم را برای استفاده در عملیات تقسیم عدد صحیح تعیین میکند. strategy میتواند یکی از موارد زیر باشد:
- call-div1
- یک تابع کتابخانهای را فراخوانی میکند که از دستورالعمل تقسیم تکمرحلهای "div1" برای انجام عملیات استفاده میکند. تقسیم بر صفر یک نتیجهٔ نامشخص را محاسبه میکند و تله (trap) ایجاد نمیکند. این حالت بهجز برای SH4، SH2A و SHcompact پیشفرض است.
- call-fp
- یک تابع کتابخانهای را فراخوانی میکند که عملیات را در ممیز شناور با دقت مضاعف انجام میدهد. تقسیم بر صفر موجب بروز یک استثنای ممیز شناور میشود. این حالت برای SHcompact دارای FPU پیشفرض است. مشخص کردن این مورد برای اهدافی که FPU با دقت مضاعف ندارند، به طور پیشفرض به "call-div1" برمیگردد.
- call-table
- یک تابع کتابخانهای را فراخوانی میکند که از یک جدول جستجو برای مقسومعلیههای کوچک و از دستورالعمل "div1" با تفکیک حالت برای مقسومعلیههای بزرگتر استفاده میکند. تقسیم بر صفر یک نتیجهٔ نامشخص را محاسبه میکند و تله ایجاد نمیکند. این حالت برای SH4 پیشفرض است. مشخص کردن این مورد برای اهدافی که فاقد دستورالعملهای شیفت پویا هستند به طور پیشفرض به "call-div1" برمیگردد.
هنگامی که راهبرد تقسیمی مشخص نشده باشد، راهبرد پیشفرض بر اساس هدف فعلی انتخاب میشود. برای SH2A، راهبرد پیشفرض استفاده از دستورالعملهای "divs" و "divu" به جای فراخوانیهای توابع کتابخانهای است.
- -maccumulate-outgoing-args
- فضا را یکبار در مقدمهٔ تابع (function prologue) برای آرگومانهای خروجی اختصاص میدهد، به جای آنکه در اطراف هر فراخوانی فضا اختصاص داده شود. این کار عموماً برای کارایی و اندازه مفید است. همچنین برای باز کردن پشته (unwinding) جهت جلوگیری از تغییر قاب پشته در اطراف کد شرطی لازم است.
- -mdivsi3_libfunc=name
- نام تابع کتابخانهایِ مورداستفاده برای تقسیم علامتدار ۳۲ بیتی را روی name تنظیم میکند. این مورد فقط بر نام استفادهشده در راهبردهای تقسیم call تأثیر میگذارد، و کامپایلر همچنان همان مجموعههای ثباتهای ورودی/خروجی/تغییریافته را انتظار دارد که گویی این گزینه وجود نداشته است.
- -mfixed-range=register-range
- کدی تولید میکند که با محدودهٔ ثبات دادهشده به عنوان ثباتهای ثابت (fixed registers) رفتار میکند. یک ثبات ثابت ثباتی است که تخصیصدهندهٔ ثبات نمیتواند از آن استفاده کند. این گزینه هنگام کامپایل کردن کد کرنل مفید است. یک محدودهٔ ثبات به صورت دو ثبات که با یک خط تیره جدا شدهاند مشخص میشود. میتوان چندین محدودهٔ ثبات را با کاما جدا کرده و مشخص نمود.
- -mbranch-cost=num
- مقدار num را به عنوان هزینه برای یک دستورالعمل پرش در نظر میگیرد. مقادیر بزرگتر باعث میشوند کامپایلر در صورت امکان سعی کند کد بدون پرش بیشتری تولید کند. اگر مشخص نشود، این مقدار بسته به نوع پردازندهای که برای آن کامپایل میشود انتخاب خواهد شد.
- -mzdcbranch
- -mno-zdcbranch
- فرض میکند (فرض نمیکند) که دستورالعملهای پرش شرطی با جابهجایی صفر (zero displacement) "bt" و "bf" سریع هستند. اگر -mzdcbranch مشخص شود، کامپایلر توالیهای کد پرش با جابهجایی صفر را ترجیح میدهد. این گزینه هنگام تولید کد برای SH4 و SH4A بهطور پیشفرض فعال است. میتوان آن را با مشخص کردن -mno-zdcbranch بهطور صریح غیرفعال کرد.
- -mcbranch-force-delay-slot
- استفاده از شکافهای تأخیر (delay slots) را برای پرشهای شرطی اجباری میکند، که در صورت نیافتن دستورالعمل مناسب، شکاف تأخیر را با یک "nop" پر میکند. این گزینه بهطور پیشفرض غیرفعال است. میتوان آن را برای دور زدن باگهای سختافزاری، مانند آنچه در SH7055 اولیه یافت شد، فعال کرد.
- -mfused-madd
- -mno-fused-madd
- کدی تولید میکند که از دستورالعملهای ضرب و انباشت ممیز شناور استفاده میکند (استفاده نمیکند). این دستورالعملها در صورت استفاده از ممیز شناور سختافزاری بهطور پیشفرض تولید میشوند. گزینهٔ وابسته به ماشین -mfused-madd اکنون به گزینهٔ مستقل از ماشین -ffp-contract=fast نگاشت شده است، و -mno-fused-madd به -ffp-contract=off نگاشت میشود.
- -mfsca
- -mno-fsca
- به کامپایلر اجازه میدهد یا نمیدهد که دستورالعمل "fsca" را برای تقریب سینوس و کسینوس صادر کند. گزینهٔ -mfsca باید در ترکیب با -funsafe-math-optimizations استفاده شود. هنگام تولید کد برای SH4A این گزینه بهطور پیشفرض فعال است. استفاده از -mno-fsca تقریبهای سینوس و کسینوس را حتی در صورت فعال بودن -funsafe-math-optimizations غیرفعال میکند.
- -mfsrra
- -mno-fsrra
- به کامپایلر اجازه میدهد یا نمیدهد که دستورالعمل "fsrra" را برای تقریبهای وارون ریشه دوم صادر کند. گزینهٔ -mfsrra باید در ترکیب با -funsafe-math-optimizations و -ffinite-math-only استفاده شود. هنگام تولید کد برای SH4A بهطور پیشفرض فعال است. استفاده از -mno-fsrra تقریبهای وارون ریشه دوم را حتی اگر -funsafe-math-optimizations و -ffinite-math-only برقرار باشند غیرفعال میکند.
- -mpretend-cmove
- پرشهای شرطی با جابهجایی صفر را برای الگوهای دستورالعمل انتقال شرطی (conditional move) ترجیح میدهد. این کار میتواند منجر به کد سریعتری در پردازنده SH4 شود.
- -mfdpic
- با استفاده از ABI مربوط به FDPIC کد تولید میکند.
گزینههای Solaris 2
این گزینههای -m در Solaris 2 پشتیبانی میشوند:
- -mclear-hwcap
- گزینهٔ -mclear-hwcap به کامپایلر میگوید قابلیتهای سختافزاری تولیدشده توسط اسمبلر Solaris را حذف کند. این گزینه تنها زمانی ضروری است که فایلهای شیء از افزونههای ISA استفاده کنند که توسط ماشین فعلی پشتیبانی نمیشود، اما در زمان اجرا بررسی میکنند که آیا باید از آنها استفاده شود یا خیر.
- -mimpure-text
- گزینهٔ
-mimpure-text،
هنگامی که
علاوه بر -shared
استفاده
شود، به
کامپایلر
میگوید
هنگام
پیوند یک
شیء
اشتراکی،
گزینهٔ -z text
را به
پیونددهنده
ارسال نکند.
با استفاده
از این
گزینه،
میتوانید
کد وابسته
به موقعیت
را در یک
شیء
اشتراکی
پیوند دهید.
گزینهٔ -mimpure-text پیام خطای پیونددهنده مبنی بر “relocations remain against allocatable but non-writable sections” را سرکوب میکند. با این حال، بازنشانیهای لازم موجب کپی در هنگام نوشتن (copy-on-write) میشوند، و شیء اشتراکی عملاً میان فرایندها به اشتراک گذاشته نمیشود. به جای استفاده از -mimpure-text، باید تمام کدهای منبع را با -fpic یا -fPIC کامپایل کنید..PP این گزینهها علاوه بر موارد بالا در Solaris 2 پشتیبانی میشوند:
- -pthreads
- این گزینه مترادفی برای -pthread است.
گزینههای SPARC
این گزینههای -m روی SPARC پشتیبانی میشوند:
- -mno-app-regs
- -mapp-regs
- مشخص کردن
-mapp-regs خروجی
را با
استفاده از
ثباتهای
سراسری (global registers)
۲ تا ۴
تولید
میکند؛
ثباتهایی
که SPARC SVR4 ABI آنها
را برای
برنامههای
کاربردی
رزرو کرده
است. مشابه
ثبات
سراسری ۱،
با هر یک از
ثباتهای
سراسری ۲ تا
۴ به عنوان
ثباتی
تخصیصپذیر
رفتار
میشود که
با
فراخوانی
توابع
بازنویسی
(clobbered) میشوند.
این حالت
پیشفرض
است.
برای سازگاری کامل با SVR4 ABI به قیمت مقداری افت کارایی، -mno-app-regs را مشخص کنید. شما باید کتابخانهها و نرمافزارهای سیستمی را با این گزینه کامپایل کنید.
- -mflat
- -mno-flat
- با -mflat،
کامپایلر
دستورالعملهای
save/restore را تولید
نمیکند و
از یک مدل
«مسطح» یا
پنجرهٔ
ثبات منفرد
استفاده
میکند. این
مدل با مدل
معمول
پنجرهٔ
ثبات
سازگار است.
با
ثباتهای
محلی و
ثباتهای
ورودی (۰ تا
۵) همچنان
به عنوان
ثباتهای
«ذخیرهشده
در
فراخوانی»
(call-saved) رفتار
میشود و در
صورت نیاز
روی پشته
ذخیره
میشوند.
با -mno-flat (حالت پیشفرض)، کامپایلر دستورالعملهای save/restore را تولید میکند (بهجز برای توابع برگ یا leaf functions). این حالت کاری عادی است.
- -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
- تولید
خروجی حاوی
فراخوانیهای
کتابخانهای
برای
دستورالعملهای
ممیز شناور
چهارکلمهای
(long double). توابع
فراخوانیشده
مواردی
هستند که در
SPARC ABI مشخص
شدهاند.
این حالت
پیشفرض
است.
تا زمان نگارش این متن، هیچ پیادهسازی از SPARC وجود ندارد که از دستورالعملهای ممیز شناور چهارکلمهای به صورت سختافزاری پشتیبانی کند. همهٔ آنها برای یکی از این دستورالعملها یک گردانندهٔ تله (trap handler) فراخوانی میکنند، و سپس گردانندهٔ تله تأثیر دستورالعمل را شبیهسازی میکند. به دلیل سربار گردانندهٔ تله، این روش بسیار کُندتر از فراخوانی روتینهای کتابخانهای ABI است. بنابراین گزینهٔ -msoft-quad-float پیشفرض است.
- -mno-unaligned-doubles
- -munaligned-doubles
- فرض میکند
که doubleها
دارای
همترازی ۸
بایتی
هستند. این
حالت
پیشفرض
است.
با -munaligned-doubles، کامپایلر GCC فرض میکند که doubleها تنها در صورتی دارای همترازی ۸ بایتی هستند که در یک نوع دادهٔ دیگر گنجانده شده باشند، یا آدرس مطلق داشته باشند. در غیر این صورت، فرض میکند که همترازی ۴ بایتی دارند. مشخص کردن این گزینه از برخی مشکلات نادرِ سازگاری با کدهای تولیدشده توسط سایر کامپایلرها جلوگیری میکند. این حالت پیشفرض نیست زیرا باعث افت کارایی، بهویژه برای کدهای ممیز شناور، میشود.
- -muser-mode
- -mno-user-mode
- کدی که فقط میتواند در حالت ناظر (supervisor mode) اجرا شود را تولید نمیکند. این موضوع تنها برای دستورالعمل "casa" که برای پردازندهٔ LEON3 صادر میشود کاربرد دارد. این حالت پیشفرض است.
- -mfaster-structs
- -mno-faster-structs
- با -mfaster-structs، کامپایلر فرض میکند که ساختارها (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 تولید میکند. این مورد دستورالعملهای ضرب عدد صحیح، گام تقسیم عدد صحیح (integer divide step) و پویش ("ffs") را اضافه میکند که در SPARClite موجود است اما در SPARC-V7 وجود ندارد. با -mcpu=f930، کامپایلر علاوه بر این کد را برای تراشهٔ Fujitsu MB86930 که SPARClite اصلی بدون FPU است بهینهسازی میکند. با -mcpu=f934، کامپایلر علاوه بر این کد را برای تراشهٔ Fujitsu MB86934 که SPARClite جدیدتر دارای FPU است بهینهسازی میکند.
با -mcpu=sparclet، کامپایلر GCC کدی برای گونهٔ SPARClet از معماری SPARC تولید میکند. این مورد دستورالعملهای ضرب عدد صحیح، ضرب/انباشت (multiply/accumulate)، گام تقسیم عدد صحیح و پویش ("ffs") را که در SPARClet وجود دارند اما در SPARC-V7 نیستند، اضافه میکند. با -mcpu=tsc701، کامپایلر علاوه بر این کد را برای تراشهٔ TEMIC SPARClet بهینهسازی میکند.
با -mcpu=v9، کامپایلر GCC کدی برای گونهٔ V9 از معماری SPARC تولید میکند. این مورد دستورالعملهای انتقال ۶۴ بیتی عدد صحیح و ممیز شناور، ۳ ثبات کد وضعیت ممیز شناور اضافی، و دستورالعملهای انتقال شرطی (conditional move) را اضافه میکند. با -mcpu=ultrasparc، کامپایلر علاوه بر این کد را برای تراشههای Sun UltraSPARC I/II/IIi بهینهسازی میکند. با -mcpu=ultrasparc3، کامپایلر علاوه بر این کد را برای تراشههای Sun UltraSPARC III/III+/IIIi/IIIi+/IV/IV+ بهینهسازی میکند. با -mcpu=niagara، کامپایلر علاوه بر این کد را برای تراشههای Sun UltraSPARC T1 بهینهسازی میکند. با -mcpu=niagara2، کامپایلر علاوه بر این کد را برای تراشههای Sun UltraSPARC T2 بهینهسازی میکند. با -mcpu=niagara3، کامپایلر علاوه بر این کد را برای تراشههای Sun UltraSPARC T3 بهینهسازی میکند. با -mcpu=niagara4، کامپایلر علاوه بر این کد را برای تراشههای Sun UltraSPARC T4 بهینهسازی میکند. با -mcpu=niagara7، کامپایلر علاوه بر این کد را برای تراشههای Oracle SPARC M7 بهینهسازی میکند. با -mcpu=m8، کامپایلر علاوه بر این کد را برای تراشههای Oracle M8 بهینهسازی میکند. پارامترهای زمانبندی دستورالعملها را برای نوع ماشین cpu_type تنظیم میکند، اما برخلاف گزینهٔ -mcpu=cpu_type، مجموعه دستورالعملها یا مجموعه ثباتها را تغییر نمیدهد.
همان مقادیر مجاز برای -mcpu=cpu_type را میتوان برای -mtune=cpu_type نیز استفاده کرد، اما تنها مقادیر سودمند، آنهایی هستند که یک پیادهسازی پردازندهٔ خاص را انتخاب میکنند. این مقادیر عبارتند از: cypress، supersparc، hypersparc، leon، leon3، leon3v7، leon5، f930، f934، sparclite86x، tsc701، ultrasparc، ultrasparc3، niagara، niagara2، niagara3، niagara4، niagara7 و m8. با زنجیرهابزارهای بومی Solaris و GNU/Linux، مقدار native را نیز میتوان به کار برد.
- -mv8plus
- -mno-v8plus
- با -mv8plus، کامپایلر GCC کدی برای 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 کدی تولید میکند که از دستورالعمل ممیز شناور Floating-point Multiply Single to Double (FsMULd) بهره میبرد. هنگام هدف قرار دادن پردازندهای که از نسخههای معماری V8 یا V9 به همراه FPU پشتیبانی میکند، مقدار پیشفرض -mfsmuld است، بهجز در صورت استفاده از -mcpu=leon.
- -mpopc
- -mno-popc
- با -mpopc، کامپایلر GCC کدی تولید میکند که از دستورالعمل شمارش جمعیت (Population Count) در UltraSPARC بهره میبرد. هنگام هدف قرار دادن پردازندهای که از چنین دستورالعملی پشتیبانی میکند (مانند Niagara-2 و بعد از آن)، مقدار پیشفرض -mpopc است.
- -msubxc
- -mno-subxc
- با -msubxc، کامپایلر GCC کدی تولید میکند که از دستورالعمل تفریق گسترشیافته با رقم نقلی (Subtract-Extended-with-Carry) در UltraSPARC بهره میبرد. هنگام هدف قرار دادن پردازندهای که از چنین دستورالعملی پشتیبانی میکند (مانند Niagara-7 و بعد از آن)، مقدار پیشفرض -msubxc است.
- -mfix-at697f
- راهکار مستندشده برای تکخطای سختافزاری (erratum) پردازندهٔ Atmel AT697F (که متناظر با خطای شماره ۱۳ پردازندهٔ AT697E است) را فعال میکند.
- -mfix-ut699
- راهکارهای مستندشده برای خطاهای سختافزاری ممیز شناور و خطاهای باطلسازی حافظهٔ نهان داده (data cache nullify) در پردازندهٔ UT699 را فعال میکند.
- -mfix-ut700
- راهکار مستندشده برای خطاهای سختافزاری ذخیرهسازی پشتسرهم (back-to-back store) در پردازندهٔ UT699E/UT700 را فعال میکند.
- -mfix-gr712rc
- راهکار مستندشده برای خطاهای سختافزاری ذخیرهسازی پشتسرهم (back-to-back store) در پردازندهٔ GR712RC را فعال میکند.
این گزینههای -m علاوه بر موارد بالا، بر روی پردازندههای SPARC-V9 در محیطهای ۶۴ بیتی پشتیبانی میشوند:
- -m32
- -m64
- تولید کد برای یک محیط ۳۲ بیتی یا ۶۴ بیتی. محیط ۳۲ بیتی، انواع int، long و pointer را روی ۳۲ بیت تنظیم میکند. محیط ۶۴ بیتی، نوع int را روی ۳۲ بیت و انواع long و pointer را روی ۶۴ بیت تنظیم میکند.
- -mcmodel=which
- مدل کد را روی یکی از موارد زیر تنظیم میکند:
- medlow
- مدل کد متوسط/پایین (Medium/Low): آدرسهای ۶۴ بیتی؛ برنامهها باید در ۳۲ بیت پایین حافظه پیوند (link) داده شوند. برنامهها میتوانند بهصورت ایستا یا پویا پیوند داده شوند.
- medmid
- مدل کد متوسط/میانه (Medium/Middle): آدرسهای ۶۴ بیتی؛ برنامهها باید در ۴۴ بیت پایین حافظه پیوند داده شوند، اندازهٔ بخشهای text و data باید کمتر از 2GB باشد و بخش data باید در فاصلهٔ کمتر از 2GB نسبت به بخش text قرار گیرد.
- medany
- مدل کد متوسط/هرکجا (Medium/Anywhere): آدرسهای ۶۴ بیتی؛ برنامهها میتوانند در هر کجای حافظه پیوند داده شوند، اندازهٔ بخشهای text و data باید کمتر از 2GB باشد و بخش data باید در فاصلهٔ کمتر از 2GB نسبت به بخش text قرار گیرد.
- embmedany
- مدل کد متوسط/هرکجا برای سامانههای تعبیهشده (embedded): آدرسهای ۶۴ بیتی؛ اندازهٔ بخشهای text و data باید کمتر از 2GB باشد و هر دو میتوانند در هر کجای حافظه شروع شوند (در زمان پیوند تعیین میشود). ثبات سراسری %g4 به ابتدای بخش data اشاره میکند. برنامهها بهصورت ایستا پیوند داده میشوند و PIC پشتیبانی نمیشود.
این مدلهای حافظه بهطور رسمی در پیوست D از کتابچهٔ راهنمای معماری SPARC-V9 تعریف شدهاند، همانطور که در فیلد "PSTATE.MM" پردازنده تنظیم میشود.
- -mstack-bias
- -mno-stack-bias
- با فعال بودن -mstack-bias، کامپایلر GCC فرض میکند که اشارهگر پشته (stack pointer)، و اشارهگر فریم (frame pointer) در صورت وجود، با آفست -2047 جابهجا شدهاند که باید هنگام ارجاع به فریم پشته مجدداً اضافه شود. این حالت پیشفرض در حالت 64-بیتی است. در غیر این صورت، فرض میشود چنین آفستی وجود ندارد.
گزینههای System V
این گزینههای اضافی در System V Release 4 برای سازگاری با سایر کامپایلرها در آن سیستمها در دسترس هستند:
- -G
- ایجاد یک شیء اشتراکی (shared object). توصیه میشود بهجای آن از -symbolic یا -shared استفاده شود.
- -Qy
- شناسایی نسخههای هر ابزار مورداستفاده توسط کامپایلر، در یک دستور اسمبلی ".ident" در خروجی.
- -Qn
- خودداری از افزودن دستورهای ".ident" به فایل خروجی (این رفتار پیشفرض است).
- -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 را روشن میکند.
- -mtda=n
- قرار دادن متغیرهای ایستا یا سراسری که اندازهٔ آنها n بایت یا کمتر است در ناحیهٔ دادههای بسیار کوچک (tiny data area) که ثبات "ep" به آن اشاره میکند. ناحیهٔ دادههای بسیار کوچک در مجموع میتواند تا ۲۵۶ بایت را در خود جای دهد (۱۲۸ بایت برای ارجاعات بایتی).
- -msda=n
- قرار دادن متغیرهای ایستا یا سراسری که اندازهٔ آنها n بایت یا کمتر است در ناحیهٔ دادههای کوچک (small data area) که ثبات "gp" به آن اشاره میکند. ناحیهٔ دادههای کوچک میتواند تا ۶۴ کیلوبایت را در خود جای دهد.
- -mzda=n
- قرار دادن متغیرهای ایستا یا سراسری که اندازهٔ آنها n بایت یا کمتر است در ۳۲ کیلوبایت اول حافظه.
- -mv850
- مشخص کردن اینکه پردازندهٔ مقصد V850 است.
- -mv850e3v5
- مشخص کردن اینکه پردازندهٔ مقصد V850E3V5 است. در صورت استفاده از این گزینه، ثابت پیشپردازندهٔ "__v850e3v5__" تعریف میشود.
- -mv850e2v4
- مشخص کردن اینکه پردازندهٔ مقصد V850E3V5 است. این یک نام مستعار برای گزینهٔ -mv850e3v5 است.
- -mv850e2v3
- مشخص کردن اینکه پردازندهٔ مقصد V850E2V3 است. در صورت استفاده از این گزینه، ثابت پیشپردازندهٔ "__v850e2v3__" تعریف میشود.
- -mv850e2
- مشخص کردن اینکه پردازندهٔ مقصد V850E2 است. در صورت استفاده از این گزینه، ثابت پیشپردازندهٔ "__v850e2__" تعریف میشود.
- -mv850e1
- مشخص کردن اینکه پردازندهٔ مقصد V850E1 است. در صورت استفاده از این گزینه، ثابتهای پیشپردازندهٔ "__v850e1__" و "__v850e__" تعریف میشوند.
- -mv850es
- مشخص کردن اینکه پردازندهٔ مقصد V850ES است. این یک نام مستعار برای گزینهٔ -mv850e1 است.
- -mv850e
- مشخص کردن
اینکه
پردازندهٔ
مقصد V850E است.
در صورت
استفاده از
این گزینه،
ثابت
پیشپردازندهٔ
"__v850e__"
تعریف
میشود.
اگر هیچیک از گزینههای -mv850، -mv850e، -mv850e1، -mv850e2، -mv850e2v3 یا -mv850e3v5 تعریف نشده باشند، یک پردازندهٔ مقصد پیشفرض انتخاب شده و ثابت پیشپردازندهٔ مربوطه بهصورت __v850*__ تعریف میشود.
ثابتهای پیشپردازندهٔ "__v850" و "__v851__" همواره تعریف میشوند، صرفنظر از اینکه کدام گونه از پردازنده مقصد باشد.
- -mdisable-callt
- -mno-disable-callt
- این گزینه
تولید
دستورالعمل
"CALLT" را
برای
گونههای
v850e، v850e1، v850e2، v850e2v3 و v850e3v5
از معماری v850
متوقف
میکند.
این گزینه هنگام استفاده از RH850 ABI بهطور پیشفرض فعال است (به -mrh850-abi مراجعه کنید)، و هنگام استفاده از GCC ABI بهطور پیشفرض غیرفعال است. اگر دستورالعملهای "CALLT" تولید شوند، نماد پیشپردازندهٔ C با عنوان "__V850_CALLT__" تعریف میشود.
- -mrelax
- -mno-relax
- ارسال (یا عدم ارسال) گزینهٔ خط فرمان -mrelax به اسمبلر.
- -mlong-jumps
- -mno-long-jumps
- غیرفعال کردن (یا فعالسازی مجدد) تولید دستورالعملهای پرش وابسته به شمارندهٔ برنامه (PC-relative).
- -msoft-float
- -mhard-float
- غیرفعال کردن (یا فعالسازی مجدد) تولید دستورالعملهای ممیز شناور سختافزاری. این گزینه تنها زمانی اثرگذار است که معماری مقصد V850E2V3 یا بالاتر باشد. اگر دستورالعملهای ممیز شناور سختافزاری در حال تولید باشند، نماد پیشپردازندهٔ C با عنوان "__FPU_OK__" تعریف میشود، در غیر این صورت نماد "__NO_FPU__" تعریف خواهد شد.
- -mloop
- استفاده از دستورالعمل LOOP مربوط به e3v5 را فعال میکند. هنگام انتخاب معماری e3v5، استفاده از این دستورالعمل بهطور پیشفرض فعال نیست، زیرا کاربرد آن هنوز در مرحلهٔ آزمایشی قرار دارد..IP -mrh850-abi 4
- -mghs
- پشتیبانی از نسخهٔ RH850 از V850 ABI را فعال میکند. این حالت پیشفرض است. با این نسخه از ABI قواعد زیر اعمال میشوند:
- ساختارها و اجتماعهای هماندازه با عدد صحیح، بهجای یک ثبات، از طریق یک اشارهگر حافظه بازگردانده میشوند.
- ساختارها و اجتماعهای بزرگ (با اندازهٔ بیش از ۸ بایت) با مقدار (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
- کد مناسب برای جدولهای سوئیچ بزرگ (big switch tables) تولید میکند. تنها در صورتی از این گزینه استفاده کنید که اسمبلر یا پیونددهنده خطای انشعابهای خارج از محدوده درون یک جدول switch را گزارش دهد.
- -mapp-regs
- این گزینه باعث میشود که r2 و r5 در کدهای تولیدشده توسط کامپایلر استفاده شوند. این تنظیم پیشفرض است.
- -mno-app-regs
- این گزینه باعث میشود که با r2 و r5 به عنوان ثباتهای ثابت رفتار شود.
گزینههای VAX
این گزینههای -m برای VAX تعریف شدهاند:
- -munix
- از تولید دستورهای پرش خاصی ("aobleq" و غیره) که اسمبلر Unix برای VAX نمیتواند آنها را در محدودههای طولانی مدیریت کند، خودداری میکند.
- -mgnu
- با این فرض که از اسمبلر GNU استفاده میشود، آن دستورهای پرش را تولید میکند.
- -md
- -md-float
- استفاده از قالب دادهای D_floating برای اعداد ممیز شناور با دقت مضاعف بهجای G_floating.
- -mg
- -mg-float
- استفاده از قالب دادهای G_floating برای اعداد ممیز شناور با دقت مضاعف بهجای D_floating.
- -mlra
- -mno-lra
- تخصیص محلی ثباتها (Local Register Allocation) را فعال میکند. این قابلیت هنوز برای VAX آزمایشی است، بنابراین کامپایلر بهطور پیشفرض از بارگذاری مجدد استاندارد (standard reload) استفاده میکند.
گزینههای Visium
- -mdebug
- برنامهای که ورودی/خروجی فایل انجام میدهد و قرار است روی یک هدف MCM اجرا شود باید با این گزینه پیوند داده شود. این کار باعث پیوند خوردن کتابخانههای libc.a و libdebug.a میشود. برنامه باید تحت کنترل استاب اشکالزدایی از راه دور GDB روی هدف اجرا شود.
- -msim
- برنامهای که ورودی/خروجی فایل انجام میدهد و قرار است روی شبیهساز اجرا شود باید با این گزینه پیوند داده شود. این کار باعث پیوند خوردن کتابخانههای libc.a و libsim.a میشود.
- -mfpu
- -mhard-float
- کد حاوی دستورهای ممیز شناور سختافزاری تولید میکند. این حالت پیشفرض است.
- -mno-fpu
- -msoft-float
- کد حاوی
فراخوانیهای
کتابخانهای
برای
عملیات
ممیز شناور
تولید
میکند.
گزینهٔ -msoft-float قرارداد فراخوانی را در فایل خروجی تغییر میدهد؛ بنابراین، تنها در صورتی مفید است که تمام برنامه را با این گزینه کامپایل کنید. بهویژه، لازم است کتابخانهٔ libgcc.a را که همراه GCC ارائه میشود، با گزینهٔ -msoft-float کامپایل کنید تا بهدرستی کار کند.
- -mcpu=cpu_type
- مجموعهٔ
دستورالعملها،
مجموعهٔ
ثباتها و
پارامترهای
زمانبندی
دستورالعمل
را برای نوع
ماشین cpu_type
تنظیم
میکند.
مقادیر
پشتیبانیشده
برای cpu_type
عبارتند از
mcm، gr5 و gr6.
مقدار mcm مترادفی برای gr5 است که جهت سازگاری با گذشته ارائه شده است.
بهطور پیشفرض (مگر اینکه طور دیگری پیکربندی شده باشد)، GCC کدی برای گونهٔ GR5 از معماری Visium تولید میکند.
با گزینهٔ -mcpu=gr6، کامپایلر GCC برای گونهٔ GR6 از معماری Visium کد تولید میکند. تنها تفاوت آن با کد GR5 در این است که کامپایلر دستورهای جابهجایی بلوکی (block move) را تولید خواهد کرد.
- -mtune=cpu_type
- پارامترهای زمانبندی دستورالعمل را برای نوع ماشین cpu_type تنظیم میکند، اما مجموعهٔ دستورالعملها یا مجموعهٔ ثباتها را آنگونه که گزینهٔ -mcpu=cpu_type تعیین میکند، تغییر نمیدهد.
- -msv-mode
- تولید کد برای حالت ناظر (supervisor mode)، جایی که هیچ محدودیتی برای دسترسی به ثباتهای عمومی وجود ندارد. این حالت پیشفرض است.
- -muser-mode
- تولید کد برای حالت کاربر (user mode)، جایی که دسترسی به برخی از ثباتهای عمومی ممنوع است: در GR5، ثباتهای r24 تا r31 در این حالت قابل دسترسی نیستند؛ در GR6، تنها ثباتهای r29 تا r31 تحت تأثیر قرار میگیرند.
گزینههای VMS
این گزینههای -m برای پیادهسازیهای VMS تعریف شدهاند:
- -mvms-return-codes
- کدهای وضعیت VMS را از "main" بازمیگرداند. پیشفرض، بازگرداندن کدهای وضعیت (مانند کدهای خطا) به سبک POSIX است.
- -mdebug-main=prefix
- نخستین روالی را که نام آن با prefix شروع میشود به عنوان روال اصلی برای اشکالزدا نشانهگذاری میکند.
- -mmalloc64
- روالهای تخصیص حافظهٔ ۶۴ بیتی را به عنوان پیشفرض قرار میدهد.
- -mpointer-size=size
- اندازهٔ پیشفرض اشارهگرها را تعیین میکند. گزینههای ممکن برای size عبارتند از 32 یا short برای اشارهگرهای ۳۲ بیتی، 64 یا long برای اشارهگرهای ۶۴ بیتی، و no برای پشتیبانی انحصاری از اشارهگرهای ۳۲ بیتی. گزینهٔ آخر دستور "pragma pointer_size" را غیرفعال میکند.
گزینههای VxWorks گزینههای این بخش برای تمامی مقصدهای VxWorks تعریف شدهاند. گزینههای خاص سختافزار مقصد، به همراه دیگر گزینههای مربوط به آن مقصد فهرست شدهاند.
- -mrtp
- کامپایلر GCC میتواند هم برای هستههای VxWorks و هم برای فرایندهای بلادرنگ (RTPها) کد تولید کند. این گزینه حالت تولید کد را از اولی به دومی تغییر میدهد. همچنین ماکروی پیشپردازندهٔ "__RTP__" را تعریف میکند.
- -msmp
- زمانهای اجرای SMP را برای پیوند (linking) انتخاب میکند. روی معماریهایی به جز PowerPC و همچنین در VxWorks نسخهٔ ۷ یا بالاتر در دسترس نیست؛ در این موارد این انتخاب بخشی از پیکربندی ساخت VxWorks است و مسیرهای کتابخانه برای هر دو حالت یکسان هستند.
- -non-static
- یک فایل اجرایی RTP را به جای کتابخانههای ایستا با کتابخانههای اشتراکی پیوند میدهد. گزینههای -static و -shared نیز میتوانند برای RTPها استفاده شوند؛ -static پیشفرض است.
- -Bstatic
- -Bdynamic
- این گزینهها به پیونددهنده منتقل میشوند. آنها برای سازگاری با Diab تعریف شدهاند.
- -Xbind-lazy
- اتصال تنبلانهٔ (lazy binding) فراخوانیهای توابع را فعال میکند. این گزینه معادل -Wl,-z,now است و برای سازگاری با Diab تعریف شده است.
- -Xbind-now
- اتصال تنبلانهٔ فراخوانیهای توابع را غیرفعال میکند. این گزینه پیشفرض است و برای سازگاری با Diab تعریف شده است.
گزینههای x86
این گزینههای -m برای خانوادهٔ رایانههای x86 تعریف شدهاند.
- -march=cpu-type
- دستورالعملها
را برای نوع
ماشین cpu-type
تولید
میکند. در
مقایسه با
-mtune=cpu-type که
صرفاً کد
تولیدشده
را برای cpu-type
مشخصشده
بهینهسازی
میکند،
-march=cpu-type به GCC
اجازه
میدهد کدی
تولید کند
که ممکن است
اصلاً روی
پردازندههایی
غیر از
پردازندهٔ
مشخصشده
اجرا نشود.
مشخص کردن
-march=cpu-type به طور
ضمنی به
معنای -mtune=cpu-type
نیز هست،
مگر در
مواردی که
خلاف آن ذکر
شده باشد.
انتخابهای موجود برای cpu-type عبارتند از:
- native
- این مورد با تعیین نوع پردازندهٔ ماشین کامپایلکننده، پردازندهای را که قرار است در زمان کامپایل برای آن کد تولید شود انتخاب میکند. استفاده از -march=native تمام زیرمجموعههای دستورالعملی پشتیبانیشده توسط ماشین محلی را فعال میکند (بنابراین نتیجه ممکن است روی ماشینهای دیگر اجرا نشود). استفاده از -mtune=native کدی بهینهشده برای ماشین محلی در چارچوب محدودیتهای مجموعه دستورالعمل انتخابشده تولید میکند.
- x86-64
- یک CPU عمومی با پشتیبانی از افزونههای ۶۴ بیتی و مجموعههای دستورالعمل MMX، SSE، SSE2 و FXSR.
- x86-64-v2
- x86-64-v3
- x86-64-v4
- این
انتخابها
برای cpu-type،
سطح
ریزمعماری
متناظر را
از psABI مربوط
به x86-64 انتخاب
میکنند. در
ABIهایی غیر
از psABI برای x86-64،
این
گزینهها
همان
ویژگیهای
CPU را انتخاب
میکنند که
مستندات psABI
برای x86-64 برای
آن سطح
ریزمعماری
خاص مشخص
کرده است.
از آنجا که این مقادیر cpu-type تنظیمات -mtune متناظری ندارند، استفاده از -march با این مقادیر، بهینهسازی عمومی (generic) را فعال میکند. بهینهسازی خاص را میتوان با استفاده از گزینهٔ -mtune=other-cpu-type به همراه مقدار مناسب برای other-cpu-type فعال کرد.
- i386
- پردازندهٔ اصلی Intel i386.
- i486
- پردازندهٔ Intel i486. (هیچ زمانبندیای برای این تراشه پیادهسازی نشده است.)
- i586
- pentium
- پردازندهٔ Intel Pentium بدون پشتیبانی از MMX.
- lakemont
- میکروکنترلر Intel Lakemont بر پایهٔ پردازندهٔ Intel Pentium.
- pentium-mmx
- پردازندهٔ Intel Pentium MMX بر پایهٔ هستهٔ Pentium با پشتیبانی از مجموعه دستورالعمل MMX.
- pentiumpro
- پردازندهٔ Intel Pentium Pro بدون پشتیبانی از MMX.
- i686
- هنگام استفاده با -march، مجموعه دستورالعمل Pentium Pro استفاده میشود تا کد روی تمامی تراشههای خانوادهٔ i686 اجرا شود. هنگام استفاده با -mtune، معنایی یکسان با generic دارد.
- pentium2
- پردازندهٔ Intel Pentium II بر پایهٔ هستهٔ Pentium Pro با پشتیبانی از مجموعههای دستورالعمل MMX و FXSR.
- pentium3
- pentium3m
- پردازندهٔ Intel Pentium III بر پایهٔ هستهٔ Pentium Pro با پشتیبانی از مجموعههای دستورالعمل MMX، FXSR و SSE.
- pentium-m
- پردازندهٔ Intel Pentium M؛ نسخهٔ کممصرف پردازندهٔ Intel Pentium III با پشتیبانی از مجموعههای دستورالعمل MMX، SSE، SSE2 و FXSR. مورد استفاده در نوتبوکهای Centrino.
- pentium4
- pentium4m
- پردازندهٔ Intel Pentium 4 با پشتیبانی از مجموعههای دستورالعمل MMX، SSE، SSE2 و FXSR.
- prescott
- نسخهٔ بهبودیافتهٔ پردازندهٔ Intel Pentium 4 با پشتیبانی از مجموعههای دستورالعمل MMX، SSE، SSE2، SSE3 و FXSR.
- nocona
- نسخهٔ بهبودیافتهٔ پردازندهٔ Intel Pentium 4 با افزونههای ۶۴ بیتی و پشتیبانی از مجموعههای دستورالعمل MMX، SSE، SSE2، SSE3 و FXSR.
- core2
- پردازندهٔ Intel Core 2 با افزونههای ۶۴ بیتی و پشتیبانی از مجموعههای دستورالعمل MMX، SSE، SSE2، SSE3، SSSE3، CX16، SAHF و FXSR.
- nehalem
- corei7
- پردازندهٔ Intel Nehalem با افزونههای ۶۴ بیتی و پشتیبانی از مجموعههای دستورالعمل MMX، SSE، SSE2، SSE3، SSSE3، SSE4.1، SSE4.2، POPCNT، CX16، SAHF و FXSR.
- westmere
- پردازندهٔ Intel Westmere با افزونههای ۶۴ بیتی و پشتیبانی از مجموعههای دستورالعمل MMX، SSE، SSE2، SSE3، SSSE3، SSE4.1، SSE4.2، POPCNT، CX16، SAHF، FXSR و PCLMUL.
- sandybridge
- corei7-avx
- پردازندهٔ Intel Sandy Bridge با افزونههای ۶۴ بیتی و پشتیبانی از مجموعههای دستورالعمل MMX، SSE، SSE2، SSE3، SSSE3، SSE4.1، SSE4.2، POPCNT، CX16، SAHF، FXSR، AVX، XSAVE و PCLMUL.
- ivybridge
- core-avx-i
- پردازندهٔ Intel Ivy Bridge با افزونههای ۶۴ بیتی و پشتیبانی از مجموعههای دستورالعمل MMX، SSE، SSE2، SSE3، SSSE3، SSE4.1، SSE4.2، POPCNT، CX16، SAHF، FXSR، AVX، XSAVE، PCLMUL، FSGSBASE، RDRND و F16C.
- haswell
- core-avx2
- پردازندهٔ Intel Haswell با افزونههای ۶۴ بیتی و پشتیبانی از مجموعههای دستورالعمل MMX، SSE، SSE2، SSE3، SSSE3، SSE4.1، SSE4.2، POPCNT، CX16، SAHF، FXSR، AVX، XSAVE، PCLMUL، FSGSBASE، RDRND، F16C، AVX2، BMI، BMI2، LZCNT، FMA، MOVBE و HLE.
- broadwell
- پردازندهٔ Intel Broadwell با افزونههای ۶۴ بیتی و پشتیبانی از مجموعههای دستورالعمل MMX، SSE، SSE2، SSE3، SSSE3، SSE4.1، SSE4.2، POPCNT، CX16، SAHF، FXSR، AVX، XSAVE، PCLMUL، FSGSBASE، RDRND، F16C، AVX2، BMI، BMI2، LZCNT، FMA، MOVBE، HLE، RDSEED، ADCX و PREFETCHW.
- skylake
- پردازندهٔ Intel Skylake با افزونههای ۶۴ بیتی و پشتیبانی از مجموعههای دستورالعمل MMX، SSE، SSE2، SSE3، SSSE3، SSE4.1، SSE4.2، POPCNT، CX16، SAHF، FXSR، AVX، XSAVE، PCLMUL، FSGSBASE، RDRND، F16C، AVX2، BMI، BMI2، LZCNT، FMA، MOVBE، HLE، RDSEED، ADCX، PREFETCHW، AES، CLFLUSHOPT، XSAVEC، XSAVES و SGX.
- skylake-avx512
- پردازندهٔ سرور 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..IP cascadelake 4 پردازنده Intel Cascade Lake با افزونههای 64-bit و پشتیبانی از مجموعهدستورهای MMX، SSE، SSE2، SSE3، SSSE3، SSE4.1، SSE4.2، POPCNT، CX16، SAHF، FXSR، AVX، XSAVE، PCLMUL، FSGSBASE، RDRND، F16C، AVX2، BMI، BMI2، LZCNT، FMA، MOVBE، HLE، RDSEED، ADCX، PREFETCHW، AES، CLFLUSHOPT، XSAVEC، XSAVES، SGX، AVX512F، CLWB، AVX512VL، AVX512BW، AVX512DQ، AVX512CD و AVX512VNNI.
- cannonlake
- پردازنده سرور Intel Cannon Lake با افزونههای 64-bit و پشتیبانی از مجموعهدستورهای MMX، SSE، SSE2، SSE3، SSSE3، SSE4.1، SSE4.2، POPCNT، CX16، SAHF، FXSR، AVX، XSAVE، PCLMUL، FSGSBASE، RDRND، F16C، AVX2، BMI، BMI2، LZCNT، FMA، MOVBE، HLE، RDSEED، ADCX، PREFETCHW، AES، CLFLUSHOPT، XSAVEC، XSAVES، SGX، AVX512F، AVX512VL، AVX512BW، AVX512DQ، AVX512CD، PKU، AVX512VBMI، AVX512IFMA و SHA.
- cooperlake
- پردازنده Intel Cooper Lake با افزونههای 64-bit و پشتیبانی از مجموعهدستورهای MMX، SSE، SSE2، SSE3، SSSE3، SSE4.1، SSE4.2، POPCNT، CX16، SAHF، FXSR، AVX، XSAVE، PCLMUL، FSGSBASE، RDRND، F16C، AVX2، BMI، BMI2، LZCNT، FMA، MOVBE، HLE، RDSEED، ADCX، PREFETCHW، AES، CLFLUSHOPT، XSAVEC، XSAVES، SGX، AVX512F، CLWB، AVX512VL، AVX512BW، AVX512DQ، AVX512CD، AVX512VNNI و AVX512BF16.
- icelake-client
- پردازنده کلاینت Intel Ice Lake با افزونههای 64-bit و پشتیبانی از مجموعهدستورهای MMX، SSE، SSE2، SSE3، SSSE3، SSE4.1، SSE4.2، POPCNT، CX16، SAHF، FXSR، AVX، XSAVE، PCLMUL، FSGSBASE، RDRND، F16C، AVX2، BMI، BMI2، LZCNT، FMA، MOVBE، HLE، RDSEED، ADCX، PREFETCHW، AES، CLFLUSHOPT، XSAVEC، XSAVES، SGX، AVX512F، AVX512VL، AVX512BW، AVX512DQ، AVX512CD، PKU، AVX512VBMI، AVX512IFMA، SHA، AVX512VNNI، GFNI، VAES، AVX512VBMI2، VPCLMULQDQ، AVX512BITALG، RDPID و AVX512VPOPCNTDQ.
- icelake-server
- پردازنده سرور Intel Ice Lake با افزونههای 64-bit و پشتیبانی از مجموعهدستورهای MMX، SSE، SSE2، SSE3، SSSE3، SSE4.1، SSE4.2، POPCNT، CX16، SAHF، FXSR، AVX، XSAVE، PCLMUL، FSGSBASE، RDRND، F16C، AVX2، BMI، BMI2، LZCNT، FMA، MOVBE، HLE، RDSEED، ADCX، PREFETCHW، AES، CLFLUSHOPT، XSAVEC، XSAVES، SGX، AVX512F، AVX512VL، AVX512BW، AVX512DQ، AVX512CD، PKU، AVX512VBMI، AVX512IFMA، SHA، AVX512VNNI، GFNI، VAES، AVX512VBMI2، VPCLMULQDQ، AVX512BITALG، RDPID، AVX512VPOPCNTDQ، PCONFIG، WBNOINVD و CLWB.
- tigerlake
- پردازنده Intel Tiger Lake با افزونههای 64-bit و پشتیبانی از مجموعهدستورهای MMX، SSE، SSE2، SSE3، SSSE3، SSE4.1، SSE4.2، POPCNT، CX16، SAHF، FXSR، AVX، XSAVE، PCLMUL، FSGSBASE، RDRND، F16C، AVX2، BMI، BMI2، LZCNT، FMA، MOVBE، HLE، RDSEED، ADCX، PREFETCHW، AES، CLFLUSHOPT، XSAVEC، XSAVES، SGX، AVX512F، AVX512VL، AVX512BW، AVX512DQ، AVX512CD، PKU، AVX512VBMI، AVX512IFMA، SHA، AVX512VNNI، GFNI، VAES، AVX512VBMI2، VPCLMULQDQ، AVX512BITALG، RDPID، AVX512VPOPCNTDQ، MOVDIRI، MOVDIR64B، CLWB، AVX512VP2INTERSECT و KEYLOCKER.
- rocketlake
- پردازنده Intel Rocket Lake با افزونههای 64-bit و پشتیبانی از مجموعهدستورهای MMX، SSE، SSE2، SSE3، SSSE3، SSE4.1، SSE4.2، POPCNT، CX16، SAHF، FXSR، AVX، XSAVE، PCLMUL، FSGSBASE، RDRND، F16C، AVX2، BMI، BMI2، LZCNT، FMA، MOVBE، HLE، RDSEED، ADCX، PREFETCHW، AES، CLFLUSHOPT، XSAVEC، XSAVES، AVX512F، AVX512VL، AVX512BW، AVX512DQ، AVX512CD، PKU، AVX512VBMI، AVX512IFMA، SHA، AVX512VNNI، GFNI، VAES، AVX512VBMI2، VPCLMULQDQ، AVX512BITALG، RDPID و AVX512VPOPCNTDQ.
- alderlake
- raptorlake
- meteorlake
- gracemont
- پردازنده Intel Alder Lake/Raptor Lake/Meteor Lake/Gracemont با افزونههای 64-bit و پشتیبانی از مجموعهدستورهای MOVBE، MMX، SSE، SSE2، SSE3، SSSE3، SSE4.1، SSE4.2، POPCNT، AES، PREFETCHW، PCLMUL، RDRND، XSAVE، XSAVEC، XSAVES، XSAVEOPT، FSGSBASE، PTWRITE، RDPID، SGX، GFNI-SSE، CLWB، MOVDIRI، MOVDIR64B، WAITPKG، ADCX، AVX، AVX2، BMI، BMI2، F16C، FMA، LZCNT، PCONFIG، PKU، VAES، VPCLMULQDQ، SERIALIZE، HRESET، KL، WIDEKL و AVX-VNNI.
- arrowlake
- پردازنده Intel Arrow Lake با افزونههای 64-bit و پشتیبانی از مجموعهدستورهای MOVBE، MMX، SSE، SSE2، SSE3، SSSE3، SSE4.1، SSE4.2، POPCNT، AES، PREFETCHW، PCLMUL، RDRND، XSAVE، XSAVEC، XSAVES، XSAVEOPT، FSGSBASE، PTWRITE، RDPID، SGX، GFNI-SSE، CLWB، MOVDIRI، MOVDIR64B، WAITPKG، ADCX، AVX، AVX2، BMI، BMI2، F16C، FMA، LZCNT، PCONFIG، PKU، VAES، VPCLMULQDQ، SERIALIZE، HRESET، KL، WIDEKL، AVX-VNNI، UINTR، AVXIFMA، AVXVNNIINT8، AVXNECONVERT و CMPCCXADD.
- arrowlake-s
- lunarlake
- پردازنده Intel Arrow Lake S/Lunar Lake با افزونههای 64-bit و پشتیبانی از مجموعهدستورهای MOVBE، MMX، SSE، SSE2، SSE3، SSSE3، SSE4.1، SSE4.2، POPCNT، AES، PREFETCHW، PCLMUL، RDRND، XSAVE، XSAVEC، XSAVES، XSAVEOPT، FSGSBASE، PTWRITE، RDPID، SGX، GFNI-SSE، CLWB، MOVDIRI، MOVDIR64B، WAITPKG، ADCX، AVX، AVX2، BMI، BMI2، F16C، FMA، LZCNT، PCONFIG، PKU، VAES، VPCLMULQDQ، SERIALIZE، HRESET، KL، WIDEKL، AVX-VNNI، UINTR، AVXIFMA، AVXVNNIINT8، AVXNECONVERT، CMPCCXADD، AVXVNNIINT16، SHA512، SM3 و SM4.
- pantherlake
- پردازنده Intel Panther Lake با افزونههای 64-bit و پشتیبانی از مجموعهدستورهای MOVBE، MMX، SSE، SSE2، SSE3، SSSE3، SSE4.1، SSE4.2، POPCNT، AES، PREFETCHW، PCLMUL، RDRND، XSAVE، XSAVEC، XSAVES، XSAVEOPT، FSGSBASE، PTWRITE، RDPID، SGX، GFNI-SSE، CLWB، MOVDIRI، MOVDIR64B، WAITPKG، ADCX، AVX، AVX2، BMI، BMI2، F16C، FMA، LZCNT، PCONFIG، PKU، VAES، VPCLMULQDQ، SERIALIZE، HRESET، AVX-VNNI، UINTR، AVXIFMA، AVXVNNIINT8، AVXNECONVERT، CMPCCXADD، AVXVNNIINT16، SHA512، SM3، SM4 و PREFETCHI.
- sapphirerapids
- emeraldrapids
- پردازنده Intel Sapphire Rapids/Emerald Rapids با افزونههای 64-bit و پشتیبانی از مجموعهدستورهای MMX، SSE، SSE2، SSE3، SSSE3، SSE4.1، SSE4.2، POPCNT، CX16، SAHF، FXSR، AVX، XSAVE، PCLMUL، FSGSBASE، RDRND، F16C، AVX2، BMI، BMI2، LZCNT، FMA، MOVBE، HLE، RDSEED، ADCX، PREFETCHW، AES، CLFLUSHOPT، XSAVEC، XSAVES، SGX، AVX512F، AVX512VL، AVX512BW، AVX512DQ، AVX512CD، PKU، AVX512VBMI، AVX512IFMA، SHA، AVX512VNNI، GFNI، VAES، AVX512VBMI2، VPCLMULQDQ، AVX512BITALG، RDPID، AVX512VPOPCNTDQ، PCONFIG، WBNOINVD، CLWB، MOVDIRI، MOVDIR64B، ENQCMD، CLDEMOTE، PTWRITE، WAITPKG، SERIALIZE، TSXLDTRK، UINTR، AMX-BF16، AMX-TILE، AMX-INT8، AVX-VNNI، AVX512-FP16 و AVX512BF16.
- graniterapids
- پردازنده Intel Granite Rapids با افزونههای 64-bit و پشتیبانی از مجموعهدستورهای MMX، SSE، SSE2، SSE3، SSSE3، SSE4.1، SSE4.2، POPCNT، CX16، SAHF، FXSR، AVX، XSAVE، PCLMUL، FSGSBASE، RDRND، F16C، AVX2، BMI، BMI2، LZCNT، FMA، MOVBE، HLE، RDSEED، ADCX، PREFETCHW، AES، CLFLUSHOPT، XSAVEC، XSAVES، SGX، AVX512F، AVX512VL، AVX512BW، AVX512DQ، AVX512CD، PKU، AVX512VBMI، AVX512IFMA، SHA، AVX512VNNI، GFNI، VAES، AVX512VBMI2، VPCLMULQDQ، AVX512BITALG، RDPID، AVX512VPOPCNTDQ، PCONFIG، WBNOINVD، CLWB، MOVDIRI، MOVDIR64B، ENQCMD، CLDEMOTE، PTWRITE، WAITPKG، SERIALIZE، TSXLDTRK، UINTR، AMX-BF16، AMX-TILE، AMX-INT8، AVX-VNNI، AVX512-FP16، AVX512BF16، AMX-FP16 و PREFETCHI.
- graniterapids-d
- پردازنده Intel Granite Rapids D با افزونههای 64-bit و پشتیبانی از مجموعهدستورهای MMX، SSE، SSE2، SSE3، SSSE3، SSE4.1، SSE4.2، POPCNT، CX16، SAHF، FXSR، AVX، XSAVE، PCLMUL، FSGSBASE، RDRND، F16C، AVX2، BMI، BMI2، LZCNT، FMA، MOVBE، HLE، RDSEED، ADCX، PREFETCHW، AES، CLFLUSHOPT، XSAVEC، XSAVES، SGX، AVX512F، AVX512VL، AVX512BW، AVX512DQ، AVX512CD، PKU، AVX512VBMI، AVX512IFMA، SHA، AVX512VNNI، GFNI، VAES، AVX512VBMI2، VPCLMULQDQ، AVX512BITALG، RDPID، AVX512VPOPCNTDQ، PCONFIG، WBNOINVD، CLWB، MOVDIRI، MOVDIR64B، ENQCMD، CLDEMOTE، PTWRITE، WAITPKG، SERIALIZE، TSXLDTRK، UINTR، AMX-BF16، AMX-TILE، AMX-INT8، AVX-VNNI، AVX512FP16، AVX512BF16، AMX-FP16، PREFETCHI و AMX-COMPLEX.
- diamondrapids
- پردازنده Intel Diamond Rapids با افزونههای 64-bit و پشتیبانی از مجموعهدستورهای MOVBE، MMX، SSE، SSE2، SSE3، SSSE3، SSE4.1، SSE4.2، POPCNT، CX16، SAHF، FXSR، AVX، XSAVE، PCLMUL، FSGSBASE، RDRND، F16C، AVX2، BMI، BMI2، LZCNT، FMA، MOVBE، HLE، RDSEED، ADCX، PREFETCHW، AES، CLFLUSHOPT، XSAVEC، XSAVES، SGX، AVX512F، AVX512VL، AVX512BW، AVX512DQ، AVX512CD، PKU، AVX512VBMI، AVX512IFMA، SHA، AVX512VNNI، GFNI، VAES، AVX512VBMI2، VPCLMULQDQ، AVX512BITALG، RDPID، AVX512VPOPCNTDQ، PCONFIG، WBNOINVD، CLWB، MOVDIRI، MOVDIR64B، ENQCMD، CLDEMOTE، PTWRITE، WAITPKG، SERIALIZE، TSXLDTRK، UINTR، AMX-BF16، AMX-TILE، AMX-INT8، AVX-VNNI، AVX512FP16، AVX512BF16، AMX-FP16، PREFETCHI، AMX-COMPLEX، AVX10.1-512، AVX-IFMA، AVX-NE-CONVERT، AVX-VNNI-INT16، AVX-VNNI-INT8، CMPccXADD، SHA512، SM3، SM4، AVX10.2-512، APX_F، AMX-AVX512، AMX-FP8، AMX-TF32، AMX-TRANSPOSE، MOVRS، AMX-MOVRS و USER_MSR.
- bonnell
- atom
- پردازنده Intel Bonnell با افزونههای 64-bit و پشتیبانی از مجموعهدستورهای MOVBE، MMX، SSE، SSE2، SSE3 و SSSE3.
- silvermont
- slm
- پردازنده Intel Silvermont با افزونههای 64-bit و پشتیبانی از مجموعهدستورهای MOVBE، MMX، SSE، SSE2، SSE3، SSSE3، SSE4.1، SSE4.2، POPCNT، CX16، SAHF، FXSR، PCLMUL، PREFETCHW و RDRND.
- goldmont
- پردازنده Intel Goldmont با افزونههای 64-bit و پشتیبانی از مجموعهدستورهای MOVBE، MMX، SSE، SSE2، SSE3، SSSE3، SSE4.1، SSE4.2، POPCNT، CX16، SAHF، FXSR، PCLMUL، PREFETCHW، RDRND، AES، SHA، RDSEED، XSAVE، XSAVEC، XSAVES، XSAVEOPT، CLFLUSHOPT و FSGSBASE.
- goldmont-plus
- پردازنده Intel Goldmont Plus با افزونههای 64-bit و پشتیبانی از مجموعهدستورهای MOVBE، MMX، SSE، SSE2، SSE3، SSSE3، SSE4.1، SSE4.2، POPCNT، CX16، SAHF، FXSR، PCLMUL، PREFETCHW، RDRND، AES، SHA، RDSEED، XSAVE، XSAVEC، XSAVES، XSAVEOPT، CLFLUSHOPT، FSGSBASE، PTWRITE، RDPID و SGX.
- tremont
- پردازنده Intel Tremont با افزونههای 64-bit و پشتیبانی از مجموعهدستورهای MOVBE، MMX، SSE، SSE2، SSE3، SSSE3، SSE4.1، SSE4.2، POPCNT، CX16، SAHF، FXSR، PCLMUL، PREFETCHW، RDRND، AES، SHA، RDSEED، XSAVE، XSAVEC، XSAVES، XSAVEOPT، CLFLUSHOPT، FSGSBASE، PTWRITE، RDPID، SGX، CLWB، GFNI-SSE، MOVDIRI، MOVDIR64B، CLDEMOTE و WAITPKG.
- sierraforest
- پردازنده Intel Sierra Forest با افزونههای 64-bit و پشتیبانی از مجموعهدستورهای MOVBE، MMX، SSE، SSE2، SSE3، SSSE3، SSE4.1، SSE4.2، POPCNT، AES، PREFETCHW، PCLMUL، RDRND، XSAVE، XSAVEC، XSAVES، XSAVEOPT، FSGSBASE، PTWRITE، RDPID، SGX، GFNI-SSE، CLWB، MOVDIRI، MOVDIR64B، CLDEMOTE، WAITPKG، ADCX، AVX، AVX2، BMI، BMI2، F16C، FMA، LZCNT، PCONFIG، PKU، VAES، VPCLMULQDQ، SERIALIZE، HRESET، KL، WIDEKL، AVX-VNNI، AVXIFMA، AVXVNNIINT8، AVXNECONVERT، CMPCCXADD، ENQCMD و UINTR.
- grandridge
- پردازنده Intel Grand Ridge با افزونههای 64-bit و پشتیبانی از مجموعهدستورهای MOVBE، MMX، SSE، SSE2، SSE3، SSSE3، SSE4.1، SSE4.2، POPCNT، AES، PREFETCHW، PCLMUL، RDRND، XSAVE، XSAVEC، XSAVES، XSAVEOPT، FSGSBASE، PTWRITE، RDPID، SGX، GFNI-SSE، CLWB، MOVDIRI، MOVDIR64B، CLDEMOTE، WAITPKG، ADCX، AVX، AVX2، BMI، BMI2، F16C، FMA، LZCNT، PCONFIG، PKU، VAES، VPCLMULQDQ، SERIALIZE، HRESET، KL، WIDEKL، AVX-VNNI، AVXIFMA، AVXVNNIINT8، AVXNECONVERT، CMPCCXADD، ENQCMD و UINTR..IP clearwaterforest 4 پردازنده Intel Clearwater Forest با پشتیبانی از افزونههای 64-bit و مجموعهدستورهای MOVBE، MMX، SSE، SSE2، SSE3، SSSE3، SSE4.1، SSE4.2، POPCNT، AES، PREFETCHW، PCLMUL، RDRND، XSAVE، XSAVEC، XSAVES، XSAVEOPT، FSGSBASE، PTWRITE، RDPID، SGX، GFNI-SSE، CLWB، MOVDIRI، MOVDIR64B، CLDEMOTE، WAITPKG، ADCX، AVX، AVX2، BMI، BMI2، F16C، FMA، LZCNT، PCONFIG، PKU، VAES، VPCLMULQDQ، SERIALIZE، HRESET، AVX-VNNI، ENQCMD، UINTR، AVXIFMA، AVXVNNIINT8، AVXNECONVERT، CMPCCXADD، AVXVNNIINT16، SHA512، SM3، SM4، USER_MSR و PREFETCHI.
- k6
- پردازنده AMD K6 با پشتیبانی از مجموعهدستورهای MMX.
- k6-2
- k6-3
- نسخههای بهبودیافته پردازنده AMD K6 با پشتیبانی از مجموعهدستورهای MMX و 3DNow!.
- athlon
- athlon-tbird
- پردازنده AMD Athlon با پشتیبانی از MMX، 3dNOW!، enhanced 3DNow! و دستورهای پیشواکشی SSE.
- athlon-4
- athlon-xp
- athlon-mp
- پردازنده بهبودیافته AMD Athlon با پشتیبانی کامل از مجموعهدستورهای MMX، 3DNow!، enhanced 3DNow! و SSE.
- k8
- opteron
- athlon64
- athlon-fx
- پردازندههای مبتنی بر هسته AMD K8 با پشتیبانی از مجموعهدستورهای x86-64، شامل پردازندههای AMD Opteron، Athlon 64 و Athlon 64 FX. (این فرامجموعهای از افزونههای مجموعهدستورهای MMX، SSE، SSE2، 3DNow!، enhanced 3DNow! و 64-bit است.)
- k8-sse3
- opteron-sse3
- athlon64-sse3
- نسخههای بهبودیافته هستههای AMD K8 با پشتیبانی از مجموعهدستورهای SSE3.
- amdfam10
- barcelona
- پردازندههای مبتنی بر هستههای AMD Family 10h با پشتیبانی از مجموعهدستورهای x86-64. (این فرامجموعهای از افزونههای مجموعهدستورهای MMX، SSE، SSE2، SSE3، SSE4A، 3DNow!، enhanced 3DNow!، ABM و 64-bit است.)
- 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 است.)
- btver1
- پردازندههای مبتنی بر هستههای AMD Family 14h با پشتیبانی از مجموعهدستورهای x86-64. (این فرامجموعهای از افزونههای مجموعهدستورهای MMX، SSE، SSE2، SSE3، SSSE3، SSE4A، CX16، ABM و 64-bit است.)
- btver2
- پردازندههای مبتنی بر هستههای AMD Family 16h با پشتیبانی از مجموعهدستورهای x86-64. این شامل افزونههای مجموعهدستورهای MOVBE، F16C، BMI، AVX، PCLMUL، AES، SSE4.2، SSE4.1، CX16، ABM، SSE4A، SSSE3، SSE3، SSE2، SSE، MMX و 64-bit است.
- winchip-c6
- پردازنده IDT WinChip C6، همانند i486 با آن رفتار میشود، به همراه پشتیبانی بیشتر از مجموعهدستورهای MMX.
- winchip2
- پردازنده IDT WinChip 2، همانند i486 با آن رفتار میشود، به همراه پشتیبانی بیشتر از مجموعهدستورهای MMX و 3DNow!.
- c3
- پردازنده VIA C3 با پشتیبانی از مجموعهدستورهای MMX و 3DNow!. (هیچ زمانبندیای برای این تراشه پیادهسازی نشده است.)
- c3-2
- پردازنده VIA C3-2 (Nehemiah/C5XL) با پشتیبانی از مجموعهدستورهای MMX و SSE. (هیچ زمانبندیای برای این تراشه پیادهسازی نشده است.)
- c7
- پردازنده VIA C7 (Esther) با پشتیبانی از مجموعهدستورهای MMX، SSE، SSE2 و SSE3. (هیچ زمانبندیای برای این تراشه پیادهسازی نشده است.)
- samuel-2
- پردازنده VIA Eden Samuel 2 با پشتیبانی از مجموعهدستورهای MMX و 3DNow!. (هیچ زمانبندیای برای این تراشه پیادهسازی نشده است.)
- nehemiah
- پردازنده VIA Eden Nehemiah با پشتیبانی از مجموعهدستورهای MMX و SSE. (هیچ زمانبندیای برای این تراشه پیادهسازی نشده است.)
- esther
- پردازنده VIA Eden Esther با پشتیبانی از مجموعهدستورهای MMX، SSE، SSE2 و SSE3. (هیچ زمانبندیای برای این تراشه پیادهسازی نشده است.)
- eden-x2
- پردازنده VIA Eden X2 با پشتیبانی از مجموعهدستورهای x86-64، MMX، SSE، SSE2 و SSE3. (هیچ زمانبندیای برای این تراشه پیادهسازی نشده است.)
- eden-x4
- پردازنده VIA Eden X4 با پشتیبانی از مجموعهدستورهای x86-64، MMX، SSE، SSE2، SSE3، SSSE3، SSE4.1، SSE4.2، AVX و AVX2. (هیچ زمانبندیای برای این تراشه پیادهسازی نشده است.)
- nano
- پردازنده عمومی VIA Nano با پشتیبانی از مجموعهدستورهای x86-64، MMX، SSE، SSE2، SSE3 و SSSE3. (هیچ زمانبندیای برای این تراشه پیادهسازی نشده است.)
- nano-1000
- پردازنده VIA Nano 1xxx با پشتیبانی از مجموعهدستورهای x86-64، MMX، SSE، SSE2، SSE3 و SSSE3. (هیچ زمانبندیای برای این تراشه پیادهسازی نشده است.)
- nano-2000
- پردازنده VIA Nano 2xxx با پشتیبانی از مجموعهدستورهای x86-64، MMX، SSE، SSE2، SSE3 و SSSE3. (هیچ زمانبندیای برای این تراشه پیادهسازی نشده است.)
- nano-3000
- پردازنده VIA Nano 3xxx با پشتیبانی از مجموعهدستورهای x86-64، MMX، SSE، SSE2، SSE3، SSSE3 و SSE4.1. (هیچ زمانبندیای برای این تراشه پیادهسازی نشده است.).IP nano-x2 4 پردازنده دو هستهای VIA Nano با پشتیبانی از مجموعهدستورهای x86-64، MMX، SSE، SSE2، SSE3، SSSE3 و SSE4.1. (هیچ زمانبندیای برای این تراشه پیادهسازی نشده است.)
- nano-x4
- پردازنده چهار هستهای VIA Nano با پشتیبانی از مجموعهدستورهای x86-64، MMX، SSE، SSE2، SSE3، SSSE3 و SSE4.1. (هیچ زمانبندیای برای این تراشه پیادهسازی نشده است.)
- lujiazui
- پردازنده ZHAOXIN lujiazui با پشتیبانی از مجموعهدستورهای x86-64، MOVBE، MMX، SSE، SSE2، SSE3، SSSE3، SSE4.1، SSE4.2، POPCNT، AES، PCLMUL، RDRND، XSAVE، XSAVEOPT، FSGSBASE، CX16، ABM، BMI، BMI2، FXSR و RDSEED. با وجود اینکه این پردازندهها از AVX و F16C پشتیبانی میکنند، اما این موارد به دلایل کارایی توسط "-march=lujiazui" فعال نمیشوند.
- yongfeng
- پردازنده ZHAOXIN yongfeng با پشتیبانی از مجموعهدستورهای x86-64، MOVBE، MMX، SSE، SSE2، SSE3، SSSE3، SSE4.1، SSE4.2، AVX، POPCNT، AES، PCLMUL، RDRND، XSAVE، XSAVEOPT، FSGSBASE، CX16، ABM، BMI، BMI2، F16C، FXSR، RDSEED، AVX2، FMA، SHA و LZCNT.
- shijidadao
- پردازنده ZHAOXIN shijidadao با پشتیبانی از مجموعهدستورهای x86-64، MOVBE، MMX، SSE، SSE2، SSE3، SSSE3، SSE4.1، SSE4.2، AVX، POPCNT، AES، PCLMUL، RDRND، XSAVE، XSAVEOPT، FSGSBASE، CX16، ABM، BMI، BMI2، F16C، FXSR، RDSEED، AVX2، FMA، SHA و LZCNT.
- geode
- پردازنده توکار AMD Geode با پشتیبانی از مجموعهدستورهای MMX و 3DNow!.
- -mtune=cpu-type
- کد
تولیدشده
را در تمام
موارد
ممکن، به جز
ABI و مجموعه
دستورهای
دردسترس،
برای cpu-type
تنظیم و
بهینهسازی
میکند. در
حالی که
انتخاب یک
cpu-type خاص،
زمانبندی
دستورها را
متناسب با
آن تراشه
تنظیم
میکند،
کامپایلر
هیچ کدی
تولید
نخواهد کرد
که روی نوع
ماشین
پیشفرض
قابل اجرا
نباشد، مگر
اینکه از
گزینه -march=cpu-type
استفاده
کنید. برای
مثال، اگر GCC
برای i686-pc-linux-gnu
پیکربندی
شده باشد،
گزینه -mtune=pentium4
کدی تولید
میکند که
برای Pentium 4
بهینه شده
است اما
همچنان روی
ماشینهای
i686 اجرا
میشود.
انتخابهای موجود برای cpu-type همانند گزینههای -march هستند. علاوه بر این، -mtune از ۲ انتخاب اضافی برای cpu-type پشتیبانی میکند:
- generic
- تولید کدی
که برای
رایجترین
پردازندههای
IA32/AMD64/EM64T
بهینهسازی
شده است.
اگر
پردازندهای
را که کد
شما روی آن
اجرا خواهد
شد
میشناسید،
باید
بهجای -mtune=generic
از گزینه
متناظر -mtune
یا -march
استفاده
کنید. اما
اگر دقیقاً
نمیدانید
کاربران
برنامه شما
از چه
پردازندهای
استفاده
خواهند
کرد، باید
از این
گزینه
استفاده
کنید.
با ورود پردازندههای جدید به بازار، رفتار این گزینه تغییر خواهد کرد. بنابراین، اگر به نسخه جدیدتری از GCC ارتقا دهید، تولید کد تحت کنترل این گزینه تغییر میکند تا پردازندههایی را منعکس کند که در زمان انتشار آن نسخه از GCC رایجتر بودهاند.
هیچ گزینه -march=generic وجود ندارد زیرا -march مشخصکننده مجموعهدستورهایی است که کامپایلر میتواند استفاده کند، و هیچ مجموعهدستور عمومی که برای تمام پردازندهها قابل اعمال باشد وجود ندارد. در مقابل، -mtune پردازنده (یا در این مورد، مجموعهای از پردازندهها) را مشخص میکند که کد برای آن بهینهسازی میشود.
- intel
- تولید کدی
که برای
جدیدترین
پردازندههای
Intel
بهینهسازی
شده است، که
برای این
نسخه از GCC
پردازندههای
Haswell و Silvermont هستند.
اگر
پردازندهای
را که کد
شما روی آن
اجرا خواهد
شد
میشناسید،
باید
بهجای -mtune=intel
از گزینه
متناظر -mtune
یا -march
استفاده
کنید. اما
اگر
میخواهید
برنامهتان
روی هر دو
معماری Haswell و
Silvermont عملکرد
بهتری
داشته
باشد، باید
از این
گزینه
استفاده
کنید.
با عرضه پردازندههای جدید Intel به بازار، رفتار این گزینه تغییر خواهد کرد. بنابراین، اگر به نسخه جدیدتری از GCC ارتقا دهید، تولید کد تحت کنترل این گزینه تغییر میکند تا جدیدترین پردازندههای Intel در زمان انتشار آن نسخه از GCC را منعکس کند.
هیچ گزینه -march=intel وجود ندارد زیرا -march مشخصکننده مجموعهدستورهایی است که کامپایلر میتواند استفاده کند، و هیچ مجموعهدستور مشترکی برای تمام پردازندهها وجود ندارد. در مقابل، -mtune پردازنده (یا در این مورد، مجموعهای از پردازندهها) را مشخص میکند که کد برای آن بهینهسازی میشود.
- -mcpu=cpu-type
- یک مترادف منسوخشده برای -mtune.
- -mfpmath=unit
- محاسبات ممیز شناور را برای واحد انتخابشده unit تولید میکند. انتخابها برای unit عبارتند از:
- 387
- استفاده از
کمکپردازنده
ممیز شناور
استاندارد
387 که در اکثر
تراشهها
وجود دارد و
در غیر این
صورت
شبیهسازی
میشود. کدی
که با این
گزینه
کامپایل
شود
تقریباً در
همهجا
اجرا
میشود.
نتایج موقت
بهجای دقت
مشخصشده
توسط نوع
داده، با
دقت ۸۰ بیتی
محاسبه
میشوند که
باعث ایجاد
نتایج
اندکی
متفاوت در
مقایسه با
اکثر
تراشههای
دیگر
میگردد.
برای
توضیحات
دقیقتر
-ffloat-store را
ببینید.
این انتخاب پیشفرض برای مقصدهای x86-32 غیر Darwin است.
- sse
- استفاده از
دستورهای
اسکالر
ممیز شناور
موجود در
مجموعهدستور
SSE. این
مجموعهدستور
توسط
پردازندههای
Pentium III و
جدیدتر، و
در خط تولید
AMD توسط
تراشههای
Athlon-4، Athlon XP و Athlon MP
پشتیبانی
میشود.
نسخه اولیه
مجموعهدستور
SSE تنها از
محاسبات با
دقتتکی
پشتیبانی
میکند،
بنابراین
محاسبات با
دقتمضاعف
و
دقتگسترشیافته
همچنان با
استفاده از
387 انجام
میشوند.
نسخه بعدی
که تنها در
پردازندههای
Pentium 4 و
تراشههای
x86-64 AMD موجود
است، از
محاسبات با
دقتمضاعف
نیز
پشتیبانی
میکند.
برای کامپایلر x86-32، جهت فعالسازی افزونههای SSE و اثرگذار ساختن این گزینه، باید از سوئیچهای -march=cpu-type، -msse یا -msse2 استفاده کنید. برای کامپایلر x86-64، این افزونهها بهطور پیشفرض فعال هستند.
کد حاصل در اکثر موارد باید به میزان قابلتوجهی سریعتر باشد و از مشکلات ناپایداری عددی کدهای 387 جلوگیری کند، اما ممکن است برخی از کدهای موجود را که انتظار دارند مقادیر موقت ۸۰ بیتی باشند، دچار مشکل کند.
این انتخاب پیشفرض برای کامپایلر x86-64، مقصدهای x86-32 در Darwin، و همچنین انتخاب پیشفرض برای مقصدهای x86-32 با مجموعهدستور SSE2 در هنگام فعال بودن -ffast-math است.
- sse,387
- sse+387
- both
- تلاش برای استفاده همزمان از هر دو مجموعهدستور. این کار بهطور مؤثری تعداد ثباتهای موجود و در تراشههایی با واحدهای اجرایی مجزا برای 387 و SSE، منابع اجرایی را دو برابر میکند. با احتیاط از این گزینه استفاده کنید چرا که هنوز آزمایشی است، زیرا تخصیصدهنده ثبات GCC واحدهای عملکردی مجزا را بهخوبی مدلسازی نمیکند و منجر به عملکرد ناپایدار میشود.
- -masm=dialect
- تولید دستورهای اسمبلی خروجی با استفاده از گویش (dialect) انتخابشده. همچنین بر اینکه چه گویشی برای "asm" پایه و "asm" گسترشیافته استفاده شود اثر میگذارد. انتخابهای پشتیبانیشده (به ترتیب گویش) عبارتند از att یا intel. پیشفرض att است. سیستمعامل Darwin از intel پشتیبانی نمیکند.
- -mieee-fp
- -mno-ieee-fp
- کنترل اینکه آیا کامپایلر از مقایسههای ممیز شناور IEEE استفاده کند یا خیر. این مقایسهها حالتی را که در آن نتیجه مقایسه نامرتب (unordered) است، بهدرستی مدیریت میکنند.
- -m80387
- -mhard-float
- تولید خروجی حاوی دستورهای 80387 برای ممیز شناور.
- -mno-80387
- -msoft-float
- تولید
خروجی حاوی
فراخوانیهای
کتابخانهای
برای ممیز
شناور.
هشدار: کتابخانههای مورد نیاز بخشی از GCC نیستند. بهطور معمول از امکانات کامپایلر C مرسوم ماشین استفاده میشود، اما این کار نمیتواند مستقیماً در کامپایل متقاطع (cross-compilation) انجام شود. شما باید تمهیدات لازم را برای فراهم کردن توابع کتابخانهای مناسب جهت کامپایل متقاطع در نظر بگیرید.
در ماشینهایی که یک تابع نتایج ممیز شناور را در پشته ثبات 80387 بازمیگرداند، حتی در صورت استفاده از -msoft-float نیز ممکن است برخی کدهای دستوری (opcode) ممیز شناور تولید شوند.
- -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 نیز استفاده کنید..IP -malign-double 4
- -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" را
کنترل
میکنند.
رابط
باینری
کاربردی x86-32
اندازه آن
را ۹۶ بیت
تعیین
میکند،
بنابراین
-m96bit-long-double در
حالت ۳۲
بیتی
پیشفرض
است.
معماریهای مدرنتر (Pentium و جدیدتر) ترجیح میدهند که "long double" روی یک مرز ۸ یا ۱۶ بایتی همتراز شود. در آرایهها یا ساختارهای مطابق با ABI، این امر امکانپذیر نیست. بنابراین، مشخص کردن -m128bit-long-double نوع "long double" را با افزودن یک صفر ۳۲ بیتی اضافی، روی یک مرز ۱۶ بایتی همتراز میکند.
در کامپایلر x86-64، گزینه -m128bit-long-double انتخاب پیشفرض است، زیرا ABI آن مشخص میکند که "long double" روی مرز ۱۶ بایتی همتراز شود.
توجه داشته باشید که هیچیک از این گزینهها دقت بیشتری نسبت به استاندارد ۸۰ بیتی x87 برای "long double" فراهم نمیکنند.
هشدار: اگر مقدار پیشفرض را برای ABI مقصد بازنویسی کنید، این کار اندازه ساختارها و آرایههای حاوی متغیرهای "long double" را تغییر داده و همچنین قرارداد فراخوانی تابع را برای توابعی که "long double" دریافت میکنند اصلاح مینماید. در نتیجه، آنها با کدهایی که بدون این سوئیچ کامپایل شدهاند از نظر باینری سازگار نخواهند بود.
- -mlong-double-64
- -mlong-double-80
- -mlong-double-128
- این
سوئیچها
اندازه نوع
داده "long
double" را
کنترل
میکنند.
اندازه ۶۴
بیت، نوع
"long double" را
معادل نوع
"double"
میکند. این
حالت
پیشفرض
برای
کتابخانه C
بیونیک (Bionic C library)
۳۲ بیتی
است. اندازه
۱۲۸ بیت،
نوع "long double"
را معادل
نوع "__float128"
میکند. این
حالت
پیشفرض
برای
کتابخانه Bionic C
۶۴ بیتی
است.
هشدار: اگر مقدار پیشفرض را برای ABI مقصد بازنویسی کنید، این کار اندازه ساختارها و آرایههای حاوی متغیرهای "long double" را تغییر داده و همچنین قرارداد فراخوانی تابع را برای توابعی که "long double" دریافت میکنند اصلاح مینماید. در نتیجه، آنها با کدهایی که بدون این سوئیچ کامپایل شدهاند از نظر باینری سازگار نخواهند بود.
- -malign-data=type
- چگونگی همتراز کردن متغیرها توسط GCC را کنترل میکند. مقادیر پشتیبانیشده برای type عبارتند از: compat که از مقدار همترازی افزایشیافته سازگار با GCC 4.8 و پیش از آن استفاده میکند، abi که از مقدار همترازی تعیینشده در psABI استفاده میکند، و cacheline که از مقدار همترازی افزایشیافته برای مطابقت با اندازه خط حافظه نهان (cache line) بهره میگیرد. compat مقدار پیشفرض است.
- -mlarge-data-threshold=threshold
- هنگامی که -mcmodel=medium یا -mcmodel=large مشخص شده باشد، اشیاء داده بزرگتر از threshold در بخشهای داده بزرگ (large data sections) قرار میگیرند. مقدار پیشفرض 65535 است.
- -mrtd
- از یک
قرارداد
فراخوانی
تابع
متفاوت
استفاده
میکند که
در آن،
توابعی با
تعداد
ثابتی از
آرگومانها،
با
دستورالعمل
"ret
num"
برمیگردند
که هنگام
بازگشت،
آرگومانها
را از پشته
خارج (pop)
میکند. این
کار یک
دستورالعمل
در بخش
فراخواننده
صرفهجویی
میکند،
زیرا نیازی
به خارج
کردن
آرگومانها
در آنجا
نخواهد بود.
میتوانید با استفاده از صفت تابع "stdcall" مشخص کنید که یک تابع خاص با این توالی فراخوانی شود. همچنین میتوانید با بهکارگیری صفت تابع "cdecl"، گزینه -mrtd را لغو و بازنویسی کنید.
هشدار: این قرارداد فراخوانی با آنچه بهطور معمول در Unix استفاده میشود ناسازگار است، بنابراین اگر نیاز به فراخوانی کتابخانههای کامپایلشده با کامپایلر Unix دارید، نمیتوانید از آن استفاده کنید.
همچنین، باید پیشنمونه (prototype) مناسبی برای تمام توابعی که تعداد متغیری از آرگومانها را دریافت میکنند (از جمله "printf") فراهم کنید؛ در غیر این صورت، کد نادرستی برای فراخوانی آن توابع تولید میشود.
علاوه بر این، اگر تابعی را با آرگومانهای بیش از حد فراخوانی کنید، کدی کاملاً نادرست تولید خواهد شد. (در شرایط عادی، آرگومانهای اضافه بدون مشکل نادیده گرفته میشوند.)
- -mregparm=num
- تعداد
ثباتهایی
را که برای
انتقال
آرگومانهای
عدد صحیح
استفاده
میشوند
کنترل
میکند.
بهطور
پیشفرض،
هیچ ثباتی
برای
انتقال
آرگومانها
به کار
نمیرود و
حداکثر
میتوان از
۳ ثبات
استفاده
کرد.
میتوانید
این رفتار
را برای یک
تابع مشخص
با استفاده
از صفت تابع
"regparm"
کنترل
نمایید.
هشدار: اگر از این سوئیچ استفاده کنید و num غیرصفر باشد، باید تمام ماژولها از جمله هرگونه کتابخانه را با همان مقدار بسازید. این امر شامل کتابخانههای سیستم و ماژولهای راهاندازی (startup) نیز میشود.
- -msseregparm
- از
قراردادهای
انتقال
ثبات SSE برای
آرگومانها
و مقادیر
بازگشتی float و
double استفاده
میکند.
میتوانید
این رفتار
را برای یک
تابع خاص با
استفاده از
صفت تابع
"sseregparm"
کنترل
نمایید.
هشدار: در صورت استفاده از این سوئیچ، باید تمام ماژولها از جمله هرگونه کتابخانه را با همان مقدار بسازید. این امر شامل کتابخانههای سیستم و ماژولهای راهاندازی نیز میشود.
- -mvect8-ret-in-mem
- بردارهای ۸ بایتی را به جای ثباتهای MMX در حافظه بازمیگرداند. این حالت در VxWorks پیشفرض است تا با ABI کامپایلرهای Sun Studio تا نسخه ۱۲ مطابقت داشته باشد. تنها در صورتی از این گزینه استفاده کنید که نیازمند حفظ سازگاری با کدهای موجودِ تولیدشده توسط آن نسخههای قبلی کامپایلر یا نسخههای قدیمیتر GCC باشید.
- -mpc32
- -mpc64
- -mpc80
- دقت ممیز
شناور 80387 را
روی ۳۲، ۶۴
یا ۸۰ بیت
تنظیم
میکند.
هنگامی که
-mpc32 مشخص
شود، بخش
معنادار
(مانتیس)
نتایج
عملیات
ممیز شناور
به ۲۴ بیت
گرد میشود
(دقت
یگانه)؛ -mpc64
مانتیس
نتایج
عملیات
ممیز شناور
را به ۵۳
بیت گرد
میکند (دقت
مضاعف) و -mpc80
مانتیس
نتایج را به
۶۴ بیت گرد
میکند (دقت
مضاعف
گسترده) که
مقدار
پیشفرض
است. با
استفاده از
این گزینه،
عملیات
ممیز شناور
در دقتهای
بالاتر
بدون تنظیم
صریح کلمه
کنترلی FPU در
دسترس
برنامهنویس
نخواهد بود.
تنظیم گرد کردن عملیات ممیز شناور به مقداری کمتر از مقدار پیشفرض ۸۰ بیتی میتواند سرعت اجرای برخی برنامهها را ۲٪ یا بیشتر بهبود بخشد. توجه داشته باشید که برخی کتابخانههای ریاضی فرض میکنند عملیات ممیز شناور با دقت گسترده (۸۰ بیتی) بهطور پیشفرض فعال است؛ روتینهای چنین کتابخانههایی ممکن است در صورت استفاده از این گزینه برای تنظیم دقت به مقداری کمتر از دقت گسترده، معمولاً به دلیل پدیدهای به نام «ابطال فاجعهبار» (catastrophic cancellation)، با افت دقت چشمگیری روبهرو شوند.
- -mdaz-ftz
- پرچمهای flush-to-zero (FTZ) و denormals-are-zero (DAZ) در ثبات MXCSR برای کنترل محاسبات ممیز شناور به کار میروند. دستورالعملهای SSE و AVX، شامل دستورالعملهای اسکالر و برداری، در صورت تعیین -mdaz-ftz میتوانند از فعالسازی پرچمهای FTZ و DAZ بهرهمند شوند. زمانی که -mno-daz-ftz یا -shared مشخص شده است، پرچمهای FTZ/DAZ را تنظیم نکنید؛ گزینه -mdaz-ftz حتی همراه با -shared نیز پرچمهای FTZ/DAZ را فعال خواهد کرد.
- -mstackrealign
- پشته را در بدو ورود دوباره همتراز میکند. در x86، گزینه -mstackrealign یک مقدمه و مؤخره جایگزین تولید میکند که در صورت لزوم، پشته زمان اجرا را مجدداً همتراز میسازد. این کار امکان ترکیب کدهای قدیمی که همترازی ۴ بایتی پشته را حفظ میکنند، با کدهای مدرنی که جهت سازگاری با SSE همترازی ۱۶ بایتی را نگه میدارند فراهم میآورد. همچنین صفت "force_align_arg_pointer" را که برای توابع منفرد قابل اعمال است، مشاهده نمایید.
- -mpreferred-stack-boundary=num
- تلاش
میکند مرز
پشته را روی
مرز ۲ به
توان num
بایت
همتراز
نگه دارد.
اگر -mpreferred-stack-boundary
مشخص نشده
باشد،
مقدار
پیشفرض ۴
است (۱۶
بایت یا ۱۲۸
بیت).
هشدار: هنگام تولید کد برای معماری x86-64 با افزونههای غیرفعال SSE، میتوان از -mpreferred-stack-boundary=3 برای نگه داشتن مرز پشته روی همترازی ۸ بایتی استفاده کرد. از آنجا که ABI معماری x86-64 نیازمند همترازی ۱۶ بایتی پشته است، این پیکربندی مغایر با ABI بوده و هدف از آن صرفاً استفاده در محیطهای کنترلشدهای است که فضای پشته در آنها محدودیتی اساسی به شمار میرود. این گزینه در صورتی که توابع کامپایلشده با همترازی ۱۶ بایتی (مانند توابع متعلق به یک کتابخانه استاندارد) با پشتهای ناتراز فراخوانی شوند، منجر به تولید کد نادرست میشود. در این وضعیت، دستورالعملهای SSE ممکن است به تلههای دسترسی نامتقارن/ناتراز به حافظه (misaligned memory access traps) منجر شوند. علاوه بر این، آرگومانهای متغیر برای اشیاء با همترازی ۱۶ بایتی (شامل x87 long double و __int128) بهطور نادرست مدیریت میشوند که خروجیهای غلطی به همراه خواهد داشت. باید تمام ماژولها، از جمله هرگونه کتابخانه را با -mpreferred-stack-boundary=3 بسازید. این امر شامل کتابخانههای سیستم و ماژولهای راهاندازی نیز میشود.
- -mincoming-stack-boundary=num
- فرض میکند
که پشته
ورودی روی
مرز ۲ به
توان num
بایت
همتراز
شده است.
اگر -mincoming-stack-boundary
مشخص نشده
باشد،
مقدار
تعیینشده
توسط -mpreferred-stack-boundary
به کار
گرفته
میشود.
در Pentium و Pentium Pro، مقادیر "double" و "long double" باید روی یک مرز ۸ بایتی همتراز شوند (نگاه کنید به -malign-double)؛ در غیر این صورت افت کارایی قابلتوجهی در زمان اجرا رخ خواهد داد. در Pentium III، نوع داده Streaming SIMD Extension (SSE) یعنی "__m128" در صورتی که با مرز ۱۶ بایتی همتراز نباشد، ممکن است بهدرستی کار نکند.
برای اطمینان از همترازی مناسب این مقادیر روی پشته، مرز پشته باید حداقل به اندازه مورد نیازِ هر مقداری که روی پشته ذخیره میشود همتراز باشد. علاوه بر این، تمام توابع باید بهگونهای تولید شوند که پشته را همتراز نگه دارند. از این رو، فراخوانی تابعی که با مرز ترجیحی پشته بالاتر کامپایل شده از درون تابعی که با مرز ترجیحی پشته پایینتر کامپایل شده است، به احتمال بسیار زیاد پشته را ناتراز خواهد کرد. توصیه میشود کتابخانههایی که از توابع بازخوان (callbacks) استفاده میکنند همواره تنظیمات پیشفرض را به کار گیرند.
این همترازی مازاد، فضای بیشتری از پشته مصرف میکند و عموماً حجم کد را افزایش میدهد. کدهایی که نسبت به مصرف فضای پشته حساس هستند، مانند سیستمهای تعبیهشده (embedded systems) و هستههای سیستمعامل، ممکن است مایل باشند همترازی ترجیحی را به -mpreferred-stack-boundary=2 کاهش دهند..IP -mmmx 4
- -msse
- -msse2
- -msse3
- -mssse3
- -msse4
- -msse4a
- -msse4.1
- -msse4.2
- -mavx
- -mavx2
- -mavx512f
- -mavx512cd
- -mavx512vl
- -mavx512bw
- -mavx512dq
- -mavx512ifma
- -mavx512vbmi
- -msha
- -maes
- -mpclmul
- -mclflushopt
- -mclwb
- -mfsgsbase
- -mptwrite
- -mrdrnd
- -mf16c
- -mfma
- -mpconfig
- -mwbnoinvd
- -mfma4
- -mprfchw
- -mrdpid
- -mrdseed
- -msgx
- -mxop
- -mlwp
- -m3dnow
- -m3dnowa
- -mpopcnt
- -mabm
- -madx
- -mbmi
- -mbmi2
- -mlzcnt
- -mfxsr
- -mxsave
- -mxsaveopt
- -mxsavec
- -mxsaves
- -mrtm
- -mhle
- -mtbm
- -mmwaitx
- -mclzero
- -mpku
- -mavx512vbmi2
- -mavx512bf16
- -mavx512fp16
- -mgfni
- -mvaes
- -mwaitpkg
- -mvpclmulqdq
- -mavx512bitalg
- -mmovdiri
- -mmovdir64b
- -menqcmd
- -muintr
- -mtsxldtrk
- -mavx512vpopcntdq
- -mavx512vp2intersect
- -mavx512vnni
- -mavxvnni
- -mcldemote
- -mserialize
- -mamx-tile
- -mamx-int8
- -mamx-bf16
- -mhreset
- -mkl
- -mwidekl
- -mavxifma
- -mavxvnniint8
- -mavxneconvert
- -mcmpccxadd
- -mamx-fp16
- -mprefetchi
- -mraoint
- -mamx-complex
- -mavxvnniint16
- -msm3
- -msha512
- -msm4
- -mapxf
- -musermsr
- -mavx10.1
- -mavx10.1-256
- -mavx10.1-512
- -mavx10.2
- -mamx-avx512
- -mamx-transpose
- -mamx-fp8
- -mmovrs
- -mamx-movrs
- این
سوئیچها
استفاده از
دستورالعملها
را در
مجموعههای
دستورالعمل
گسترشیافته
MMX، SSE، AVX512CD، AVX512VL، AVX512BW،
AVX512DQ، AVX512IFMA، AVX512VBMI، SHA،
AES، PCLMUL، CLFLUSHOPT، CLWB،
FSGSBASE، PTWRITE، RDRND، F16C، FMA،
PCONFIG، WBNOINVD، FMA4، PREFETCHW،
RDPID، RDSEED، SGX، XOP، LWP،
3DNow!، 3DNow!
بهبودیافته،
POPCNT، ABM، ADX، BMI، BMI2،
LZCNT، FXSR، XSAVE، XSAVEOPT، XSAVEC،
XSAVES، RTM، HLE، TBM، MWAITX،
CLZERO، PKU، AVX512VBMI2، GFNI، VAES،
WAITPKG، VPCLMULQDQ، AVX512BITALG، MOVDIRI،
MOVDIR64B، AVX512BF16، ENQCMD،
AVX512VPOPCNTDQ، AVX512VNNI، SERIALIZE، UINTR،
HRESET، AMXTILE، AMXINT8، AMXBF16، KL،
WIDEKL، AVXVNNI، AVX512-FP16، AVXIFMA،
AVXVNNIINT8، AVXNECONVERT، CMPCCXADD،
AMX-FP16، PREFETCHI، RAOINT، AMX-COMPLEX،
AVXVNNIINT16، SM3، SHA512، SM4، APX_F،
USER_MSR، AVX10.1، AVX10.2، AMX-AVX512،
AMX-TF32، AMX-TRANSPOSE، AMX-FP8، MOVRS،
AMX-MOVRS یا CLDEMOTE فعال
میکنند. هر
کدام دارای
یک گزینه
متناظر -mno-
برای
غیرفعال
کردن
استفاده از
این
دستورالعملها
هستند.
این گسترشها همچنین به صورت توابع درونی (built-in) در دسترس هستند: برای جزئیات توابع فعال و غیرفعالشده توسط این سوئیچها، x86 Built-in Functions را ببینید.
توجه داشته باشید که -msse4 پشتیبانی از هر دو SSE4.1 و SSE4.2 را فعال میکند، در حالی که -mno-sse4 آن ویژگیها را غیرفعال میکند؛ هیچیک از این دو حالت بر پشتیبانی از SSE4A، که به طور جداگانه با -msse4a کنترل میشود، تأثیری ندارند.
برای تولید خودکار دستورالعملهای SSE/SSE2 از کدهای ممیز شناور (در مقایسه با دستورالعملهای 387)، گزینه -mfpmath=sse را ببینید.
هنگامی که -mavx استفاده میشود، GCC دستورالعملهای SSEx را سرکوب میکند. در عوض، در صورت نیاز دستورالعملهای جدید AVX یا معادل AVX را برای تمام دستورالعملهای SSEx تولید میکند.
این گزینهها به GCC امکان میدهند تا از این دستورالعملهای گسترشیافته در کد تولیدشده استفاده کند، حتی بدون -mfpmath=sse. برنامههایی که تشخیص پردازنده را در زمان اجرا انجام میدهند، باید فایلهای جداگانهای را برای هر معماری پشتیبانیشده، با استفاده از پرچمهای مناسب کامپایل کنند. به ویژه، فایلی که شامل کد تشخیص پردازنده است باید بدون این گزینهها کامپایل شود.
- -mdump-tune-features
- این گزینه به GCC دستور میدهد نام ویژگیهای تنظیم کارایی x86 و تنظیمات پیشفرض را تخلیه (dump) کند. این نامها میتوانند در -mtune-ctrl=feature-list استفاده شوند.
- -mtune-ctrl=feature-list
- این گزینه برای اعمال کنترل دقیق و ریزدانه بر روی ویژگیهای تولید کد x86 استفاده میشود. feature-list فهرستی از نامهای feature است که با کاما از هم جدا شدهاند. همچنین -mdump-tune-features را ببینید. در صورت تعیین، چنانچه قبل از feature علامت ^ نیامده باشد فعال میشود، در غیر این صورت خاموش میگردد. -mtune-ctrl=feature-list برای استفاده توسط توسعهدهندگان GCC در نظر گرفته شده است. استفاده از آن ممکن است به مسیرهای کدی منجر شود که توسط آزمونها پوشش داده نشدهاند و میتواند احتمالاً به خطاهای داخلی کامپایلر (ICE) یا خطاهای زمان اجرا بیانجامد.
- -mno-default
- این گزینه به GCC دستور میدهد که تمام ویژگیهای قابل تنظیم را غیرفعال کند. همچنین -mtune-ctrl=feature-list و -mdump-tune-features را ببینید.
- -mcld
- این گزینه به GCC دستور میدهد که در مقدمه (prologue) توابعی که از دستورالعملهای رشتهای استفاده میکنند، یک دستورالعمل "cld" صادر کند. دستورالعملهای رشتهای برای انتخاب بین حالت افزایش خودکار یا کاهش خودکار به پرچم DF وابسته هستند. در حالی که ABI مشخص میکند که پرچم DF باید در بدو ورود به تابع پاک شود، برخی سیستمهای عامل با پاک نکردن پرچم DF در توزیعکنندههای استثنای (exception dispatchers) خود، این مشخصات را نقض میکنند. ممکن است گرداننده استثنا با پرچم DF تنظیمشده فراخوانی شود که هنگام استفاده از دستورالعملهای رشتهای منجر به جهتگیری نادرست خواهد شد. این گزینه میتواند در مقصدهای ۳۲ بیتی x86 با پیکربندی GCC از طریق گزینه پیکربندی --enable-cld به طور پیشفرض فعال شود. در این حالت، تولید دستورالعملهای "cld" را میتوان با گزینه کامپایلر -mno-cld لغو کرد.
- -mvzeroupper
- این گزینه به GCC دستور میدهد که پیش از انتقال جریان کنترل به خارج از تابع، یک دستورالعمل "vzeroupper" صادر کند تا جریمه گذار از AVX به SSE را به حداقل رسانده و همچنین توابع ذاتی (intrinsics) غیرضروری "zeroupper" را حذف نماید.
- -mprefer-avx128
- این گزینه به GCC دستور میدهد که در بردارساز خودکار (auto-vectorizer) به جای دستورالعملهای ۲۵۶ بیتی AVX، از دستورالعملهای ۱۲۸ بیتی AVX استفاده کند.
- -mprefer-vector-width=opt
- این گزینه به GCC دستور میدهد که در دستورالعملها به جای مقدار پیشفرض در پلتفرم انتخابشده، از عرض بردار opt بیتی استفاده کند.
- -mpartial-vector-fp-math
- این گزینه
به GCC امکان
میدهد
عملیات
ممیز
شناوری
تولید کند
که ممکن است
بر مجموعه
پرچمهای
وضعیت ممیز
شناور در
بردارهای
جزئی (partial vectors)
تأثیر
بگذارد،
جایی که
عناصر
بردار در
بخش پایینی
رجیستر ۱۲۸
بیتی SSE قرار
دارند. مگر
اینکه -fno-trapping-math
مشخص شده
باشد،
کامپایلر
با پاکسازی
تمام
عملوندهای
ورودی به
گونهای که
در بخش
بالایی
استفادهنشده
رجیستر
برداری
دارای صفر
باشند،
رفتار صحیح
را تضمین
میکند.
توجه داشته
باشید که با
استفاده از
توابع
درونی یا
اسمبلی
درونخطی (inline
assembly) با
آرگومانهای
بردار
جزئی،
مقادیر NaN،
غیرنرمال
(denormal) یا
نامعتبر
میتوانند
به بخش
بالایی
بردار نشت
کرده و در
صورت فعال
بودن -fno-trapping-math،
مشکلات
کارایی
بالقوه
ایجاد کنند.
این مشکلات
را میتوان
با پاکسازی
دستی بخش
بالایی
رجیستر
آرگومان
بردار
جزئی، یا با
استفاده از
-mdaz-ftz برای
تنظیم پرچم
denormals-are-zero (DAZ) در
رجیستر MXCSR
کاهش داد.
این گزینه به طور پیشفرض فعال است.
- -mmove-max=bits
- این گزینه به GCC دستور میدهد که حداکثر تعداد بیتهایی را که میتوانند به طور کارآمد از حافظه به حافظه منتقل شوند، روی bits تنظیم کند. مقادیر معتبر برای bits عبارتند از 128، 256 و 512.
- -mstore-max=bits
- این گزینه به GCC دستور میدهد که حداکثر تعداد بیتهایی را که میتوانند به طور کارآمد در حافظه ذخیره شوند، روی bits تنظیم کند. مقادیر معتبر برای bits عبارتند از 128، 256 و 512.
- none
- هیچ محدودیت اضافی به جز آنچه توسط پلتفرم انتخابشده تعیین شده، به GCC اعمال نمیشود.
- 128
- ترجیح دادن عرض بردار ۱۲۸ بیتی برای دستورالعملها.
- 256
- ترجیح دادن عرض بردار ۲۵۶ بیتی برای دستورالعملها.
- 512
- ترجیح دادن عرض بردار ۵۱۲ بیتی برای دستورالعملها.
- -mnoreturn-no-callee-saved-registers
- این گزینه توابع دارای مشخصه "noreturn" یا مشخصکننده "_Noreturn" را از این طریق بهینهسازی میکند که در مقدمه تابع از ذخیره رجیسترهای حفظشده توسط فراخواندهشونده (callee-saved) که در تابع استفاده شدهاند (به جز رجیستر "BP") صرفنظر میکند. این گزینه میتواند در اشکالزدایی فراخواننده تابع "noreturn" یا هر تابعی در سطوح بالاتر پشته فراخوانی اختلال ایجاد کند، بنابراین به طور پیشفرض فعال نیست.
- -mcx16
- این گزینه به GCC امکان میدهد دستورالعملهای "CMPXCHG16B" را در کد ۶۴ بیتی تولید کند تا عملیات مقایسه و جابجایی (compare-and-exchange) را بر روی اشیاء ۱۲۸ بیتی همتراز با ۱۶ بایت پیادهسازی نماید. این ویژگی برای بهروزرسانیهای اتمیک ساختارهای دادهای که اندازه آنها از یک کلمه ماشین فراتر میرود، مفید است. کامپایلر از این دستورالعمل برای پیادهسازی __sync Builtins استفاده میکند. با این حال، برای __atomic Builtins که روی اعداد صحیح ۱۲۸ بیتی عمل میکنند، همواره از یک فراخوانی کتابخانهای استفاده میشود.
- -msahf
- این گزینه تولید دستورالعملهای "SAHF" را در کد ۶۴ بیتی فعال میکند. پردازندههای اولیه Intel Pentium 4 با پشتیبانی از Intel 64، پیش از معرفی گام Pentium 4 G1 در دسامبر ۲۰۰۵، فاقد دستورالعملهای "LAHF" و "SAHF" بودند که توسط AMD64 پشتیبانی میشوند. اینها به ترتیب دستورالعملهای بارگذاری و ذخیرهسازی برای برخی از پرچمهای وضعیت هستند. در حالت ۶۴ بیتی، دستورالعمل "SAHF" برای بهینهسازی توابع درونی "fmod"، "drem"، و "remainder" استفاده میشود؛ برای جزئیات به Other Builtins مراجعه کنید.
- -mmovbe
- این گزینه استفاده از دستورالعمل "movbe" را برای بهینهسازی جابجایی ترتیبی بایتها (byte swapping) در موجودیتهای چهار و هشت بایتی فعال میکند.
- -mshstk
- گزینه -mshstk توابع درونی پشته سایه (shadow stack) برگرفته از فناوری اعمال جریان کنترل (CET) در معماری x86 را فعال میکند.
- -mcrc32
- این گزینه توابع درونی "__builtin_ia32_crc32qi"، "__builtin_ia32_crc32hi"، "__builtin_ia32_crc32si" و "__builtin_ia32_crc32di" را برای تولید دستورالعمل ماشین "crc32" فعال میکند.
- -mmwait
- این گزینه توابع درونی "__builtin_ia32_monitor" و "__builtin_ia32_mwait" را برای تولید دستورالعملهای ماشین "monitor" و "mwait" فعال میکند.
- -mrecip
- این گزینه
استفاده از
دستورالعملهای
"RCPSS" و
"RSQRTSS" (و
گونههای
برداریشده
آنها
"RCPPS" و
"RSQRTPS") را
با یک مرحله
نیوتن-رافسون
اضافی برای
افزایش
دقت، به جای
"DIVSS" و
"SQRTSS" (و
گونههای
برداریشده
آنها) برای
آرگومانهای
ممیز شناور
با دقت
یگانه فعال
میکند. این
دستورالعملها
تنها زمانی
تولید
میشوند که
-funsafe-math-optimizations
همراه با
-ffinite-math-only و -fno-trapping-math
فعال شده
باشد. توجه
داشته
باشید در
حالی که
توان
عملیاتی (throughput)
این توالی
بالاتر از
توان
عملیاتی
دستورالعملهای
غیرمعکوس
است، دقت
توالی
میتواند
تا ۲ ulp کاهش
یابد (به
عنوان
مثال،
معکوس ۱.۰
برابر با
۰.۹۹۹۹۹۹۹۴
خواهد بود).
توجه داشته باشید که GCC پیشاپیش عبارت "1.0f/sqrtf(x)" را بر حسب "RSQRTSS" (یا "RSQRTPS") با پرچم -ffast-math (یا ترکیب گزینههای فوق) پیادهسازی میکند و به -mrecip نیازی ندارد.
همچنین توجه داشته باشید که GCC توالی فوق را با مرحله اضافی نیوتن-رافسون برای تقسیم برداری با دقت یگانه و sqrtf(x) برداریشده، پیشاپیش با پرچم -ffast-math (یا ترکیب گزینههای فوق) صادر میکند و نیازی به -mrecip ندارد..IP -mrecip=opt 4 این گزینه مشخص میکند کدام دستورالعملهای برآورد معکوس (reciprocal estimate) میتوانند استفاده شوند. opt فهرستی از گزینهها است که با کاما از هم جدا شدهاند، و میتواند با یک ! برای معکوس کردن گزینه پیشوند شود:
- all
- فعالسازی تمام دستورالعملهای برآورد.
- default
- فعالسازی دستورالعملهای پیشفرض، معادل با -mrecip.
- none
- غیرفعالسازی تمام دستورالعملهای برآورد، معادل با -mno-recip.
- div
- فعالسازی تقریب برای تقسیم اسکالر.
- vec-div
- فعالسازی تقریب برای تقسیم برداری.
- sqrt
- فعالسازی تقریب برای ریشه دوم (جذر) اسکالر.
- vec-sqrt
- فعالسازی تقریب برای ریشه دوم (جذر) برداری.
بنابراین، برای مثال، -mrecip=all,!sqrt تمام تقریبهای معکوس را به جز ریشه دوم فعال میکند.
- -mveclibabi=type
- نوع ABI مورد
استفاده
برای
برداریسازی
توابع
درونی (intrinsics) با
استفاده از
یک
کتابخانه
خارجی را
مشخص
میکند.
مقادیر
پشتیبانیشده
برای type
عبارتند از
svml برای
کتابخانه
محاسبات
برداری
کوتاه Intel،
مقدار aocl
برای
کتابخانه
ریاضی (LibM)
متعلق به AMD Optimizing
CPU Libraries (AOCL) و acml برای
کتابخانه
ریاضی
منسوخشده
AMD core math library (که AOCL-LibM
جانشین آن
است). برای
استفاده از
این گزینه،
باید هر دو
گزینه -ftree-vectorize و
-funsafe-math-optimizations فعال
باشند، و یک
کتابخانه
سازگار با ABI
مربوط به SVML
یا ACML باید در
زمان پیوند
مشخص شود.
در حال حاضر GCC فراخوانیهایی را به "vmldExp2"، "vmldLn2"، "vmldLog102"، "vmldPow2"، "vmldTanh2"، "vmldTan2"، "vmldAtan2"، "vmldAtanh2"، "vmldCbrt2"، "vmldSinh2"، "vmldSin2"، "vmldAsinh2"، "vmldAsin2"، "vmldCosh2"، "vmldCos2"، "vmldAcosh2"، "vmldAcos2"، "vmlsExp4"، "vmlsLn4"، "vmlsLog104"، "vmlsPow4"، "vmlsTanh4"، "vmlsTan4"، "vmlsAtan4"، "vmlsAtanh4"، "vmlsCbrt4"، "vmlsSinh4"، "vmlsSin4"، "vmlsAsinh4"، "vmlsAsin4"، "vmlsCosh4"، "vmlsCos4"، "vmlsAcosh4" و "vmlsAcos4" برای نوع تابع متناظر در زمان استفاده از -mveclibabi=svml، "amd_vrs4_acosf"، "amd_vrs16_acosf"، "amd_vrd8_asin"، "amd_vrs4_asinf"، "amd_vrs8_asinf"، "amd_vrs16_asinf"، "amd_vrd2_atan"، "amd_vrd8_atan"، "amd_vrs4_atanf"، "amd_vrs8_atanf"، "amd_vrs16_atanf"، "amd_vrd2_cos"، "amd_vrd4_cos"، "amd_vrd8_cos"، "amd_vrs4_cosf"، "amd_vrs8_cosf"، "amd_vrs16_cosf"، "amd_vrs4_coshf"، "amd_vrs8_coshf"، "amd_vrd2_erf"، "amd_vrd4_erf"، "amd_vrd8_erf"، "amd_vrs4_erff"، "amd_vrs8_erff"، "amd_vrs16_erff"، "amd_vrd2_exp"، "amd_vrd4_exp"، "amd_vrd8_exp"، "amd_vrs4_expf"، "amd_vrs8_expf"، "amd_vrs16_expf"، "amd_vrd2_exp10"، "amd_vrs4_exp10f"، "amd_vrd2_exp2"، "amd_vrd4_exp2"، "amd_vrd8_exp2"، "amd_vrs4_exp2f"، "amd_vrs8_exp2f"، "amd_vrs16_exp2f"، "amd_vrs4_expm1f"، "amd_vrd2_log"، "amd_vrd4_log"، "amd_vrd8_log"، "amd_vrs4_logf"، "amd_vrs8_logf"، "amd_vrs16_logf"، "amd_vrd2_log10"، "amd_vrs4_log10f"، "amd_vrs8_log10f"، "amd_vrs16_log10f"، "amd_vrd2_log1p"، "amd_vrs4_log1pf"، "amd_vrd2_log2"، "amd_vrd4_log2"، "amd_vrd8_log2"، "amd_vrs4_log2f"، "amd_vrs8_log2f"، "amd_vrs16_log2f"، "amd_vrd2_pow"، "amd_vrd4_pow"، "amd_vrd8_pow"، "amd_vrs4_powf"، "amd_vrs8_powf"، "amd_vrs16_powf"، "amd_vrd2_sin"، "amd_vrd4_sin"، "amd_vrd8_sin"، "amd_vrs4_sinf"، "amd_vrs8_sinf"، "amd_vrs16_sinf"، "amd_vrd2_tan"، "amd_vrd4_tan"، "amd_vrd8_tan"، "amd_vrs16_tanf"، "amd_vrs4_tanhf"، "amd_vrs8_tanhf"، "amd_vrs16_tanhf" برای نوع تابع متناظر در زمان استفاده از -mveclibabi=aocl، و "__vrd2_sin"، "__vrd2_cos"، "__vrd2_exp"، "__vrd2_log"، "__vrd2_log2"، "__vrd2_log10"، "__vrs4_sinf"، "__vrs4_cosf"، "__vrs4_expf"، "__vrs4_logf"، "__vrs4_log2f"، "__vrs4_log10f" و "__vrs4_powf" را برای نوع تابع متناظر در زمان استفاده از -mveclibabi=acml صادر میکند.
- -mabi=name
- تولید کد برای قرارداد فراخوانی (calling convention) مشخصشده. مقادیر مجاز عبارتند از sysv برای ABI مورد استفاده در GNU/Linux و سایر سیستمها، و ms برای Microsoft ABI. پیشفرض این است که هنگام هدف قرار دادن Microsoft Windows از Microsoft ABI و در سایر سیستمها از SysV ABI استفاده شود. میتوانید این رفتار را برای توابع خاص با استفاده از مشخصههای تابع "ms_abi" و "sysv_abi" کنترل کنید.
- -mforce-indirect-call
- تمام فراخوانیهای توابع را مجبور به غیرمستقیم بودن میکند. این گزینه هنگام استفاده از Intel Processor Trace که اطلاعات زمانبندی دقیقتری را برای فراخوانیهای توابع تولید میکند، مفید است.
- -mmanual-endbr
- دستورالعمل ENDBR را در ورودی تابع تنها از طریق مشخصه تابع "cf_check" درج میکند. این گزینه زمانی که همراه با گزینه -fcf-protection=branch جهت کنترل درج ENDBR در ورودی تابع استفاده شود مفید است.
- -mcet-switch
- بهطور پیشفرض، تجهیز CET روی دستورهای switch که از جدول پرش (jump table) استفاده میکنند خاموش است و ردیابی شاخه غیرمستقیم غیرفعال میباشد. از آنجا که جدولهای پرش در حافظه فقطخواندنی ذخیره میشوند، این امر منجر به از دست رفتن مستقیم مقاومسازی (hardening) نمیشود. اما اگر اندیس جدول پرش توسط مهاجم کنترل شود، ممکن است پرش غیرمستقیم توسط CET مهار نشود. این گزینه تجهیز CET را فعال میکند تا ردیابی شاخه غیرمستقیم را برای دستورهای switch دارای جدول پرش فعال سازد، که باعث میشود اهداف پرش از طریق هر پرش غیرمستقیمی قابل دسترسی باشند.
- -mcall-ms2sysv-xlogues
- به دلیل تفاوتها در ABIهای ۶۴-بیتی، هر تابع Microsoft ABI که یک تابع System V ABI را فراخوانی میکند باید RSI، RDI و XMM6-15 را به عنوان بازنویسیشده (clobbered) در نظر بگیرد. بهطور پیشفرض، کد لازم برای ذخیره و بازیابی این ثباتها به صورت درونخطی (inline) صادر میشود که منجر به پیشدرآمدها و پسدرآمدهای (prologues and epilogues) نسبتاً طولانی میگردد. استفاده از -mcall-ms2sysv-xlogues پیشدرآمدها و پسدرآمدهایی را صادر میکند که از stubها در بخش ایستان libgcc برای انجام این ذخیرهها و بازیابیها استفاده میکنند، و بدین ترتیب اندازه تابع را به بهای چند دستورالعمل اضافه کاهش میدهد.
- -mtls-dialect=type
- تولید کد برای دسترسی به حافظه محلی رشته (thread-local storage) با استفاده از قراردادهای gnu یا gnu2. مقدار gnu پیشفرض محافظهکارانه است؛ gnu2 کارآمدتر است، اما ممکن است نیازمندیهایی در زمان ترجمه و اجرا ایجاد کند که در همه سیستمها قابل برآورده شدن نباشند.
- -mpush-args
- -mno-push-args
- برای ذخیره پارامترهای خروجی از عملیاتهای PUSH استفاده میکند. این روش کوتاهتر است و معمولاً به همان اندازه روش استفاده از عملیاتهای SUB/MOV سریع است و بهطور پیشفرض فعال میباشد. در برخی موارد غیرفعال کردن آن ممکن است به دلیل بهبود زمانبندی و کاهش وابستگیها، کارایی را افزایش دهد.
- -maccumulate-outgoing-args
- در صورت فعال بودن، بیشینه فضای مورد نیاز برای آرگومانهای خروجی در پیشدرآمد تابع محاسبه میشود. این کار روی اکثر پردازندههای مدرن سریعتر است به دلیل کاهش وابستگیها، بهبود زمانبندی و کاهش مصرف پشته زمانی که مرز پشته ترجیحی برابر ۲ نباشد. نکته منفی آن افزایش چشمگیر در اندازه کد است. این سوئیچ مستلزم -mno-push-args است.
- -mthreads
- پشتیبانی از مدیریت استثنای امن از نظر رشته (thread-safe) در MinGW. برنامههایی که به مدیریت استثنای thread-safe متکی هستند باید تمام کد را با گزینه -mthreads کامپایل و پیوند دهند. هنگام کامپایل، -mthreads عبارت -D_MT را تعریف میکند؛ هنگام پیوند دادن، کتابخانه کمکی رشته ویژه -lmingwthrd را پیوند میدهد که دادههای مدیریت استثنای مربوط به هر رشته را پاکسازی میکند.
- -mms-bitfields
- -mno-ms-bitfields
- فعال/غیرفعال
کردن
چیدمان
فیلدهای
بیتی
سازگار با
کامپایلر
بومی Microsoft Windows.
اگر "packed" روی یک ساختار استفاده شود، یا اگر فیلدهای بیتی به کار روند، ممکن است Microsoft ABI ساختار را به گونهای متفاوت از روش معمول GCC بچیند. به ویژه هنگام جابجایی دادههای فشرده (packed) میان توابع کامپایلشده با GCC و کامپایلر بومی مایکروسافت (خواه از طریق فراخوانی تابع یا به صورت داده درون یک فایل)، ممکن است دسترسی به هر یک از این قالبها لازم باشد.
این گزینه بهطور پیشفرض برای اهداف Microsoft Windows فعال است. این رفتار همچنین میتواند به صورت محلی با استفاده از مشخصههای متغیر یا نوع کنترل شود. برای اطلاعات بیشتر، x86 Variable Attributes و x86 Type Attributes را ببینید.
الگوریتم چیدمان ساختار در مایکروسافت به استثنای بستهبندی فیلدهای بیتی، نسبتاً ساده است. فاصلهگذاری (padding) و ترازسازی (alignment) اعضای ساختارها و اینکه آیا یک فیلد بیتی میتواند از مرز یک واحد ذخیرهسازی عبور کند یا خیر، با این قوانین تعیین میشود:
- ۱. اعضای ساختار به صورت متوالی و به ترتیبی که
- اعلان شدهاند ذخیره میشوند: اولین عضو کمترین نشانی حافظه و آخرین عضو بیشترین نشانی را دارد.
- ۲. هر شیء داده دارای یک الزام ترازسازی است. الزام ترازسازی
- برای تمام
دادهها به
جز
ساختارها،
اجتماعها
و
آرایهها،
یا اندازه
شیء است یا
اندازه
بستهبندی
فعلی (که با
مشخصه
"aligned" یا
پراگمای
"pack" مشخص
میشود)، هر
کدام که
کمتر باشد.
برای
ساختارها،
اجتماعها
و
آرایهها،
الزام
ترازسازی
برابر است
با
بزرگترین
الزام
ترازسازی
اعضای آن.
به هر شیء
یک آفست
تخصیص
مییابد به
طوری که:
offset % alignment_requirement == 0
- ۳. فیلدهای بیتی مجاور درون همان واحد تخصیص ۱، ۲ یا ۴ بایتی
- بستهبندی میشوند، اگر نوعهای عدد صحیح هماندازه باشند و اگر فیلد بیتی بعدی بدون عبور از مرز تحمیلشده توسط الزامات ترازسازی مشترک فیلدهای بیتی، در واحد تخصیص فعلی جای گیرد.
کامپایلر MSVC فیلدهای بیتی با طول صفر را به روشهای زیر تفسیر میکند:.IP "۱. اگر یک میدان بیتی با طول صفر بین دو میدان بیتی درج شود که" 4 بهطور معمول ادغام میشوند، آن میدانهای بیتی ادغام نخواهند شد.
برای مثال:
struct
{
unsigned long bf_1 : 12;
unsigned long : 0;
unsigned long bf_2 : 12;
} t1;
اندازهٔ "t1" با وجود میدان بیتی با طول صفر برابر ۸ بایت است. اگر میدان بیتی با طول صفر حذف میشد، اندازهٔ "t1" برابر با ۴ بایت میبود.
- ۲. اگر یک میدان بیتی با طول صفر پس از یک میدان بیتی، "foo"، درج شود و
- تراز میدان
بیتی با طول
صفر
بزرگتر از
عضوی باشد
که پس از آن
میآید،
"bar"،
آنگاه
"bar"
مطابق نوع
میدان بیتی
با طول صفر
تراز
میشود.
برای مثال:
struct { char foo : 4; short : 0; char bar; } t2; struct { char foo : 4; short : 0; double bar; } t3;برای "t2"، شناسهٔ "bar" به جای افست ۱ در افست ۲ قرار میگیرد. بر این اساس، اندازهٔ "t2" برابر ۴ است. برای "t3"، میدان بیتی با طول صفر بر تراز "bar" یا در نتیجه بر اندازهٔ ساختار تأثیری نمیگذارد.
با در نظر گرفتن این نکته، توجه به موارد زیر حائز اهمیت است:
- ۱. اگر یک میدان بیتی با طول صفر پس از یک میدان بیتی عادی قرار گیرد، نوعِ
- میدان بیتی با طول صفر ممکن است بر تراز کل ساختار اثر بگذارد. برای مثال، "t2" اندازهای معادل ۴ بایت دارد، زیرا میدان بیتی با طول صفر پس از یک میدان بیتی عادی آمده و از نوع short است.
- ۲. حتی اگر پس از یک میدان بیتی با طول صفر، میدان بیتی عادی قرار نگیرد، همچنان
- ممکن است بر
تراز
ساختار اثر
بگذارد:
struct { char foo : 6; long : 0; } t4;در اینجا، "t4" معادل ۴ بایت فضا میگیرد.
- ۳. میدانهای بیتی با طول صفر پس از اعضای غیر میدانبیتی نادیده گرفته میشوند:
-
struct { char foo; long : 0; char bar; } t5;در اینجا، "t5" معادل ۲ بایت فضا میگیرد.
- -mno-align-stringops
- مقصد عملیاتهای رشتهای درونخطیشده را تراز نکن. این سوییچ اندازهٔ کد را کاهش میدهد و در مواردی که مقصد از قبل تراز است، اما GCC از آن مطلع نیست، کارایی را بهبود میبخشد.
- -minline-all-stringops
- بهطور پیشفرض، GCC عملیاتهای رشتهای را تنها زمانی درونخطی میکند که مشخص باشد مقصد حداقل بر روی یک مرز ۴ بایتی تراز است. این گزینه درونخطیسازی بیشتری را ممکن میسازد و اندازهٔ کد را افزایش میدهد، اما ممکن است کارایی کدی را که برای طولهای کوتاه به سرعت "memcpy" و "memset" وابسته است، بهبود بخشد. این گزینه بسط درونخطی "strlen" را برای تمامی ترازهای اشارهگر فعال میکند.
- -minline-stringops-dynamically
- برای عملیاتهای رشتهای با اندازهٔ نامشخص، از بررسیهای زمان اجرا به همراه کد درونخطی برای بلوکهای کوچک و فراخوانی کتابخانهای برای بلوکهای بزرگ استفاده کن.
- -mstringop-strategy=alg
- هیوریستیک تصمیمگیری داخلی را برای الگوریتم خاصی که باید برای درونخطیسازی عملیاتهای رشتهای استفاده شود لغو میکند. مقادیر مجاز برای alg عبارتند از:
- -mmemcpy-strategy=strategy
- هیوریستیک تصمیمگیری داخلی را برای تعیین اینکه آیا "__builtin_memcpy" باید درونخطی شود و در صورت معلوم بودن اندازهٔ مورد انتظار عملیات کپی، از چه الگوریتم درونخطی استفاده گردد، لغو میکند. آرگومان strategy فهرستی جداشده با کاما از سهگانههای alg:max_size:dest_align است. alg در -mstringop-strategy مشخص میشود، و max_size بیشینه اندازه بر حسب بایت را مشخص میکند که الگوریتم درونخطی alg برای آن مجاز است. برای آخرین سهگانه، max_size باید -1 باشد. مقدار max_size سهگانهها در فهرست باید به ترتیب صعودی مشخص شود. کمینه اندازه بر حسب بایت برای alg برای سهگانهٔ نخست برابر با 0 و برای بازههای بعدی برابر با "max_size + 1" بازهٔ قبلی است.
- -mmemset-strategy=strategy
- این گزینه مشابه -mmemcpy-strategy= است با این تفاوت که بسط "__builtin_memset" را کنترل میکند.
- -momit-leaf-frame-pointer
- اشارهگر قاب (frame pointer) را در یک ثبات برای توابع برگ (leaf functions) نگه ندار. این کار از دستورالعملهای ذخیره، برپایی و بازیابی اشارهگرهای قاب جلوگیری کرده و یک ثبات اضافی را در توابع برگ در دسترس قرار میدهد. گزینهٔ -fomit-leaf-frame-pointer اشارهگر قاب را برای توابع برگ حذف میکند که ممکن است اشکالزدایی را دشوارتر سازد.
- -mtls-direct-seg-refs
- -mno-tls-direct-seg-refs
- کنترل
میکند که
آیا
متغیرهای TLS
را میتوان
با
افستهایی
از ثبات
سگمنت TLS (%gs
برای ۳۲
بیتی، %fs
برای ۶۴
بیتی)
آدرسدهی
کرد، یا
اینکه باید
اشارهگر
پایهٔ ریسه
(thread base pointer) اضافه
شود. معتبر
بودن یا
نبودن این
حالت به
سیستمعامل
بستگی دارد
و اینکه آیا
سگمنت را
طوری نگاشت
میکند که
کل ناحیهٔ TLS
را پوشش دهد
یا خیر.
برای سیستمهایی که از GNU C Library استفاده میکنند، حالت پیشفرض روشن (on) است.
- -msse2avx
- -mno-sse2avx
- مشخص میکند که اسمبلر باید دستورالعملهای SSE را با پیشوند VEX کدگذاری کند. گزینهٔ -mavx این حالت را بهطور پیشفرض روشن میکند.
- -mfentry
- -mno-fentry
- اگر پروفایلسازی فعال باشد (-pg)، فراخوانی شمارندهٔ پروفایلسازی را پیش از مقدمه (prologue) قرار بده. نکته: در معماریهای x86 در حال حاضر مشخصهٔ "ms_hook_prologue" برای -mfentry و -pg ممکن نیست.
- -mrecord-mcount
- -mno-record-mcount
- اگر پروفایلسازی فعال باشد (-pg)، یک بخش __mcount_loc تولید کن که حاوی اشارهگرهایی به هر فراخوانی پروفایلسازی است. این گزینه برای وصله کردن خودکار فراخوانیها به داخل و خارج (patching in and out) مفید است.
- -mnop-mcount
- -mno-nop-mcount
- اگر پروفایلسازی فعال باشد (-pg)، فراخوانیهای توابع پروفایلسازی را به صورت NOP تولید کن. این ویژگی زمانی مفید است که باید بعداً بهطور پویا وصله شوند. این گزینه احتمالاً تنها همراه با -mrecord-mcount مفید خواهد بود..IP -minstrument-return=type 4 خروج تابع را در توابعی که با -pg و -mfentry ابزارگذاری شدهاند، با یک فراخوانی به تابع مشخصشده ابزارگذاری میکند. این فقط بازگشتهای واقعی منتهی به ret را ابزارگذاری میکند، نه فراخوانیهای همسطح (sibling calls) منتهی به jump را. مقادیر معتبر عبارتند از none برای عدم ابزارگذاری، call برای تولید یک فراخوانی به __return__، یا nop5 برای تولید یک nop پنج بایتی.
- -mrecord-return
- -mno-record-return
- یک بخش __return_loc ایجاد میکند که به تمام کدهای ابزارگذاری بازگشت اشاره دارد.
- -mfentry-name=name
- نام نماد __fentry__ را که در بدو ورود به تابع برای توابع -pg -mfentry فراخوانی میشود، تعیین میکند.
- -mfentry-section=name
- نام بخشی را برای ثبت فراخوانیهای -mrecord-mcount تعیین میکند (پیشفرض __mcount_loc).
- -mskip-rax-setup
- -mno-skip-rax-setup
- هنگام
تولید کد
برای
معماری x86-64 با
افزونههای
غیرفعالشدهی
SSE، گزینهٔ
-mskip-rax-setup
میتواند
برای
صرفنظر
کردن از
مقداردهی
اولیهٔ
ثبات RAX در
صورتی که
هیچ
آرگومان
متغیری در
ثباتهای
برداری
ارسال
نشود،
استفاده
شود.
هشدار: از آنجا که ثبات RAX برای جلوگیری از ذخیرهٔ غیرضروری ثباتهای برداری در پشته هنگام ارسال آرگومانهای متغیر استفاده میشود، پیامدهای این گزینه این است که توابع فراخوانیشده ممکن است مقداری از فضای پشته را هدر دهند، رفتار نادرست داشته باشند یا به مکانی تصادفی بپرند. نسخههای GCC 4.4 یا جدیدتر صرفنظر از مقدار ثبات RAX چنین مشکلاتی ندارند.
- -m8bit-idiv
- -mno-8bit-idiv
- روی برخی پردازندهها، مانند Intel Atom، تقسیم عدد صحیح بدون علامت ۸ بیتی بسیار سریعتر از تقسیم عدد صحیح ۳۲ بیتی/۶۴ بیتی است. این گزینه یک بررسی زمان اجرا تولید میکند. اگر هر دو مقسوم و مقسومعلیه در محدودهٔ ۰ تا ۲۵۵ باشند، به جای تقسیم عدد صحیح ۳۲ بیتی/۶۴ بیتی، از تقسیم عدد صحیح بدون علامت ۸ بیتی استفاده میشود.
- -mavx256-split-unaligned-load
- -mavx256-split-unaligned-store
- بارگذاری و ذخیرهسازی همترازنشدهٔ ۳۲ بایتی AVX را به بخشهای کوچکتر تقسیم میکند.
- -mstack-protector-guard=guard
- -mstack-protector-guard-reg=reg
- -mstack-protector-guard-offset=offset
- -mstack-protector-guard-symbol=symbol
- کد محافظت
از پشته را
با استفاده
از قناری (canary)
در guard تولید
میکند.
مکانهای
پشتیبانیشده
عبارتند از
global برای
قناری
سراسری یا
tls برای
قناری
بهازای هر
رشته در
بلوک TLS
(پیشفرض).
این گزینه
فقط زمانی
تأثیر دارد
که -fstack-protector یا
-fstack-protector-all مشخص
شده باشد.
با انتخاب مورد دوم، گزینههای -mstack-protector-guard-reg=reg و -mstack-protector-guard-offset=offset علاوه بر این مشخص میکنند که کدام ثبات قطعه (%fs یا %gs) به عنوان ثبات پایه برای خواندن قناری، و از چه آفستی نسبت به آن ثبات پایه استفاده شود. مقدار پیشفرض آنها مطابق با ABI مربوطه تعیین میشود.
گزینهٔ -mstack-protector-guard-symbol=symbol مقدار آفست را با یک ارجاع نمادین به یک قناری در بلوک TLS جایگزین میکند.
- -mgeneral-regs-only
- کدی تولید میکند که تنها از ثباتهای همهمنظوره استفاده میکند. این کار کامپایلر را از استفاده از ثباتهای ممیز شناور، برداری، ماسک و کران (bound) بازمیدارد.
- -mrelax-cmpxchg-loop
- هنگام ایجاد یک حلقهٔ مقایسه-و-تبادل (compare-and-swap) برای __sync Builtins و __atomic Builtins که فاقد دستورالعمل بومی هستند، با صدور یک بارگذاری اتمی پیش از دستورالعمل "CMPXCHG" و استفاده از دستورالعمل "PAUSE" برای صرفهجویی در توان مصرفی پردازنده هنگام شروع مجدد حلقه، عملیات را برای موارد دارای رقابت بالا (highly contended) بهینهسازی میکند.
- -mindirect-branch=choice
- فراخوانی و
پرش
غیرمستقیم
را با choice
تبدیل
میکند.
پیشفرض keep
است که
فراخوانی و
پرش
غیرمستقیم
را بدون
تغییر نگه
میدارد.
مقدار thunk
فراخوانی و
پرش
غیرمستقیم
را به ثانک (thunk)
فراخوانی و
بازگشت
تبدیل
میکند.
مقدار thunk-inline
فراخوانی و
پرش
غیرمستقیم
را به ثانک
فراخوانی و
بازگشت
درونخطی
تبدیل
میکند.
مقدار thunk-extern
فراخوانی و
پرش
غیرمستقیم
را به ثانک
فراخوانی و
بازگشت
خارجی
فراهمشده
در یک فایل
شیء مجزا
تبدیل
میکند.
میتوانید
این رفتار
را برای یک
تابع خاص با
استفاده از
ویژگی
تابعی
"indirect_branch"
کنترل کنید.
توجه داشته باشید که -mcmodel=large با -mindirect-branch=thunk و -mindirect-branch=thunk-extern ناسازگار است زیرا ممکن است تابع ثانک در مدل کد بزرگ در دسترس نباشد.
توجه داشته باشید که -mindirect-branch=thunk-extern با -fcf-protection=branch سازگار است زیرا ثانک خارجی میتواند بهگونهای ساخته شود که بررسی جریان کنترل را فعال کند.
- -mfunction-return=choice
- بازگشت
تابع را با
choice تبدیل
میکند.
مقدار
پیشفرض keep
است که
بازگشت
تابع را
دستنخورده
نگه
میدارد. thunk
بازگشت
تابع را به
ثانک
فراخوانی و
بازگشت
تبدیل
میکند. thunk-inline
بازگشت
تابع را به
ثانک
فراخوانی و
بازگشت
درونخطی
تبدیل
میکند. thunk-extern
بازگشت
تابع را به
ثانک
فراخوانی و
بازگشت
خارجی
ارائهشده
در یک فایل
شیء
جداگانه
تبدیل
میکند.
میتوانید
این رفتار
را برای یک
تابع خاص با
استفاده از
ویژگی
تابعی
"function_return"
کنترل کنید.
توجه داشته باشید که -mindirect-return=thunk-extern با -fcf-protection=branch سازگار است زیرا ثانک خارجی میتواند طوری پیادهسازی شود که بررسی جریان کنترل را فعال کند.
توجه داشته باشید که -mcmodel=large با -mfunction-return=thunk و -mfunction-return=thunk-extern ناسازگار است زیرا تابع ثانک ممکن است در مدل کد بزرگ قابل دسترسی نباشد.
- -mindirect-branch-register
- فراخوانی و پرش غیرمستقیم را از طریق ثبات اجباری میکند.
- -mharden-sls=choice
- کدی برای کاهش خطرات ناشی از گمانهزنی خط مستقیم (straight line speculation یا SLS) با choice تولید میکند. پیشفرض none است که تمام مقاومسازیهای SLS را غیرفعال میکند. مقدار return مقاومسازی SLS را برای بازگشتهای توابع فعال میکند. مقدار indirect-jmp مقاومسازی SLS را برای پرشهای غیرمستقیم فعال میکند. مقدار all تمام مقاومسازیهای SLS را فعال میکند.
- -mindirect-branch-cs-prefix
- پیشوند CS را به دستورات call و jmp به ثانکهای غیرمستقیم با مقصد انشعاب در ثباتهای r8-r15 اضافه میکند تا طول دستورات call و jmp به ۶ بایت برسد و امکان جایگزینی آنها با lfence; call *%r8-r15 یا lfence; jmp *%r8-r15 در زمان اجرا فراهم شود.
- -mapx-inline-asm-use-gpr32
- برای پشتیبانی از asm درونخطی با APX، قابلیت EGPR بهطور پیشفرض غیرفعال بود تا از ایجاد احتمالی دستورالعملهای غیرمجاز با EGPR جلوگیری شود. برای بهکارگیری egpr در اسمبلی درونخطی، از گزینهٔ جدید کامپایلر -mapx-inline-asm-use-gpr32 استفاده کنید و کاربر باید اطمینان حاصل کند که دستورالعمل مربوطه از EGPR پشتیبانی میکند.
- -mevex512
- -mno-evex512
- بردارهای ۵۱۲ بیتی را فعال/غیرفعال میکند. در صورت فعال بودن AVX512F، بهطور پیشفرض فعال خواهد بود.
این سوئیچهای -m علاوه بر موارد فوق، روی پردازندههای x86-64 در محیطهای ۶۴ بیتی پشتیبانی میشوند.
- -m32
- -m64
- -mx32
- -m16
- -miamcu
- تولید کد
برای یک
محیط ۱۶
بیتی، ۳۲
بیتی یا ۶۴
بیتی.
گزینهٔ -m32
نوعهای
دادهٔ
"int"،
"long" و
اشارهگر
را به ۳۲
بیت تنظیم
میکند و
کدی تولید
میکند که
در حالت ۳۲
بیتی اجرا
میشود.
گزینهٔ -m64 نوع "int" را به ۳۲ بیت و نوعهای "long" و اشارهگر را به ۶۴ بیت تنظیم میکند و کدی برای معماری x86-64 تولید میکند. تنها در سیستمهای Darwin، گزینهٔ -m64 همچنین گزینههای -fno-pic و -mdynamic-no-pic را خاموش میکند.
گزینهٔ -mx32 نوعهای دادهٔ "int"، "long" و اشارهگر را به ۳۲ بیت تنظیم میکند و کدی برای معماری x86-64 تولید میکند.
گزینهٔ -m16 همانند -m32 است، با این تفاوت که دستورالعمل اسمبلی ".code16gcc" را در ابتدای خروجی اسمبلی درج میکند تا پروندهٔ اجرایی بتواند در حالت ۱۶ بیتی اجرا شود.
گزینهٔ -miamcu کدی مطابق با مشخصات Intel MCU psABI تولید میکند. این گزینه نیازمند فعال بودن گزینهٔ -m32 است.
- -mno-red-zone
- از اصطلاحاً «ناحیهٔ قرمز» (red zone) برای کد x86-64 استفاده نمیکند. ناحیهٔ قرمز توسط ABI معماری x86-64 الزامی شده است؛ این ناحیه فضایی ۱۲۸ بایتی پس از مکان اشارهگر پشته است که توسط گردانندههای سیگنال یا وقفه دستکاری نمیشود و بنابراین میتواند برای دادههای موقت بدون تنظیم مجدد اشارهگر پشته مورد استفاده قرار گیرد. پرچم -mno-red-zone این ناحیهٔ قرمز را غیرفعال میکند.
- -mcmodel=small
- کد را برای مدل کد کوچک (small code model) تولید میکند: برنامه و نمادهای آن باید در ۲ گیگابایت ابتدایی فضای آدرس پیوند داده شوند. اشارهگرها ۶۴ بیتی هستند. برنامهها میتوانند بهصورت ایستا یا پویا پیوند یابند. این مدل کد، مدل پیشفرض است..IP -mcmodel=kernel 4 تولید کد برای مدل کد کرنل (kernel code model). کرنل در ۲ گیگابایت منفی از فضای آدرس اجرا میشود. این مدل باید برای کد هسته لینوکس استفاده شود.
- -mcmodel=medium
- تولید کد برای مدل متوسط: برنامه در ۲ گیگابایت پایینی از فضای آدرس پیوند میخورد. نمادهای کوچک نیز در آنجا قرار میگیرند. نمادهایی با اندازهٔ بزرگتر از -mlarge-data-threshold در بخشهای داده بزرگ یا BSS قرار داده میشوند و میتوانند بالای 2GB قرار گیرند. برنامهها میتوانند بهصورت ایستا یا پویا پیوند زده شوند.
- -mcmodel=large
- تولید کد برای مدل بزرگ. این مدل هیچ فرضی دربارهٔ آدرسها و اندازهٔ بخشها در نظر نمیگیرد.
- -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
- باز کردن محافظهکارانهٔ حلقههای کوچک را کنترل میکند. این گزینه بهطور پیشفرض توسط O2 فعال میشود، و حلقههای با کمتر از ۴ دستورالعمل را ۱ بار باز میکند. استفاده صریح از -f[no-]unroll-[all-]loops این پرچم را غیرفعال میکند تا از هرگونه رفتار باز کردن ناخواسته که کاربر تمایلی به آن ندارد، جلوگیری شود.
- -mlam=choice
- ویژگی LAM (پوششدهی آدرس خطی یا linear-address masking) اجازه میدهد بیتهای خاصی در اشارهگر برای فراداده استفاده شوند. مقدار پیشفرض none است. با u48، بیتهای اشارهگر در موقعیتهای 62:48 میتوانند برای فراداده استفاده شوند؛ با u57، بیتهای اشارهگر در موقعیتهای 62:57 میتوانند برای فراداده به کار روند.
گزینههای x86 Windows
گزینههای Xstormy16
این گزینهها برای Xstormy16 تعریف شدهاند:
- -msim
- انتخاب فایلهای راهاندازی (startup) و اسکریپت پیونددهنده مناسب برای شبیهساز.
گزینههای Xtensa
این گزینهها برای مقصدهای Xtensa پشتیبانی میشوند:
- -mconst16
- -mno-const16
- فعال یا غیرفعال کردن استفاده از دستورالعملهای "CONST16" برای بارگذاری مقادیر ثابت. دستورالعمل "CONST16" در حال حاضر یک گزینهٔ استاندارد از طرف Tensilica نیست. در صورت فعال بودن، دستورالعملهای "CONST16" همواره بهجای دستورالعملهای استاندارد "L32R" استفاده میشوند. استفاده از "CONST16" بهطور پیشفرض تنها زمانی فعال است که دستورالعمل "L32R" در دسترس نباشد.
- -mfused-madd
- -mno-fused-madd
- فعال یا غیرفعال کردن استفاده از دستورالعملهای ترکیبشدهٔ ضرب/جمع و ضرب/تفریق در گزینهٔ ممیز شناور (floating-point). اگر گزینهٔ ممیز شناور فعال نباشد، این گزینه هیچ تاثیری ندارد. غیرفعال کردن دستورالعملهای ضرب/جمع و ضرب/تفریق ترکیبشده کامپایلر را مجبور میکند تا از دستورالعملهای جداگانه برای عملیاتهای ضرب و جمع/تفریق استفاده کند. این امر ممکن است در مواردی که نتایج کاملاً منطبق با استاندارد IEEE 754 مورد نیاز است، مطلوب باشد: دستورالعملهای ترکیبشدهٔ ضرب جمع/تفریق، نتیجهٔ میانی را گرد نمیکنند، بنابراین نتایجی با بیتهای دقت بیشتری نسبت به آنچه توسط استاندارد IEEE مشخص شده تولید میکنند. همچنین غیرفعال کردن این دستورالعملها تضمین میکند که خروجی برنامه به توانایی کامپایلر در ادغام عملیاتهای ضرب و جمع/تفریق وابسته نباشد.
- -mserialize-volatile
- -mno-serialize-volatile
- هنگامی که این گزینه فعال باشد، GCC دستورالعملهای "MEMW" را قبل از مراجع حافظهٔ "volatile" درج میکند تا سازگاری ترتیبی (sequential consistency) تضمین شود. حالت پیشفرض -mserialize-volatile است. از -mno-serialize-volatile برای حذف دستورالعملهای "MEMW" استفاده کنید.
- -mforce-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 section) پخش میشوند تا تا حد امکان نزدیک به مراجع خود نگه داشته شوند. این ممکن است برای فایلهای اسمبلی بزرگ لازم باشد. مقادیر لفظی برای هر تابع درست قبل از همان تابع قرار میگیرند.
- -mauto-litpools
- -mno-auto-litpools
- این گزینهها نحوه مدیریت استخرهای مقادیر لفظی را کنترل میکنند. حالت پیشفرض -mno-auto-litpools است که مقادیر لفظی را در یک بخش مجزا در فایل خروجی قرار میدهد، مگر اینکه از -mtext-section-literals استفاده شده باشد. با -mauto-litpools مقادیر لفظی توسط اسمبلر در بخش متنی پخش میشوند. کامپایلر دستورات صریح ".literal" تولید نمیکند و مقادیر لفظی را با دستورالعملهای "MOVI" بهجای "L32R" در ثباتها بارگذاری میکند تا به اسمبلر اجازه دهد تنظیم فاصله (relaxation) را انجام داده و مقادیر لفظی را در صورت نیاز جاگذاری کند. این گزینه به اسمبلر امکان میدهد چندین استخر مقادیر لفظی برای هر تابع ایجاد کرده و توابع بسیار بزرگ را سرهمبندی کند، کاری که ممکن است با -mtext-section-literals امکانپذیر نباشد.
- -mtarget-align
- -mno-target-align
- هنگامی که این گزینه فعال باشد، GCC به اسمبلر دستور میدهد تا دستورالعملها را بهطور خودکار تراز کند تا جریمههای انشعاب به قیمت فدا کردن مقداری از فشردگی کد کاهش یابد. اسمبلر سعی میکند دستورالعملهای چگالی (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__" تعریف میشود..IP -mextra-l32r-costs=n 4 هزینه اضافی دسترسی به RAM/ROM دستورالعملها را برای دستورهای "L32R"، بر حسب چرخههای ساعت مشخص میکند. هنگام بهینهسازی برای سرعت، این گزینه تعیین میکند که آیا یک ثابت از مخزن مقادیر تحتاللفظی (literal pool) با استفاده از "L32R" بارگذاری شود یا با چند دستور حسابی از یک مقدار کوچک ساخته شود. مقدار پیشفرض 0 است.
- -mstrict-align
- -mno-strict-align
- از تولید دسترسیهای حافظهای که ممکن است طبق مشخصات معماری بر روی مرز طبیعی شیء تراز نشده باشند جلوگیری کرده یا به آنها اجازه میدهد. پیشفرض برای هستههایی که در سختافزار از هر دو بارگذاری و ذخیرهسازی ناتراز پشتیبانی میکنند -mno-strict-align و برای سایر هستهها -mstrict-align است.
گزینههای zSeries
این موارد در ادامه فهرست شدهاند:
محیط (ENVIRONMENT)
این بخش چندین متغیر محیطی را شرح میدهد که بر نحوه عملکرد GCC تأثیر میگذارند. برخی از آنها با مشخص کردن دایرکتوریها یا پیشوندهایی که هنگام جستجو برای انواع مختلف فایلها به کار میروند، عمل میکنند. برخی دیگر برای تعیین سایر جنبههای محیط کامپایل استفاده میشوند.
توجه داشته باشید که میتوانید مکانهای جستجو را با استفاده از گزینههایی مانند -B، -I و -L نیز مشخص کنید. این گزینهها بر مکانهای تعیینشده از طریق متغیرهای محیطی اولویت دارند، و متغیرهای محیطی نیز به نوبه خود بر موارد تعیینشده توسط پیکربندی GCC اولویت دارند.
- LANG
- LC_CTYPE
- LC_MESSAGES
- LC_ALL
- این
متغیرهای
محیطی روش
استفاده GCC
از اطلاعات
بومیسازی
را کنترل
میکنند که
به GCC اجازه
میدهد با
رسوم و
قواعد ملی
مختلف کار
کند. GCC در
صورتی که
برای این
کار
پیکربندی
شده باشد،
دستههای
محلی LC_CTYPE و
LC_MESSAGES را
بررسی
میکند. این
دستههای
محلی را
میتوان
روی هر
مقداری که
توسط سیستم
نصبشده
شما
پشتیبانی
میشود
تنظیم کرد.
یک مقدار
رایج en_GB.UTF-8
برای زبان
انگلیسی در
بریتانیا
با کدگذاری
UTF-8 است.
متغیر محیطی LC_CTYPE ردهبندی نویسهها را مشخص میکند. GCC از آن برای تعیین مرزهای نویسه در یک رشته استفاده میکند؛ این امر برای برخی کدگذاریهای چندبایتی لازم است که شامل نویسههای نقلقول و گریز هستند که در غیر این صورت به عنوان پایان رشته یا توالی گریز تفسیر میشوند.
متغیر محیطی LC_MESSAGES زبانی را که باید در پیامهای عیبیابی استفاده شود مشخص میکند.
اگر متغیر محیطی LC_ALL تنظیم شده باشد، مقدار LC_CTYPE و LC_MESSAGES را بازنویسی میکند؛ در غیر این صورت، LC_CTYPE و LC_MESSAGES به مقدار متغیر محیطی LANG برمیگردند. اگر هیچیک از این متغیرها تنظیم نشده باشند، رفتار GCC به طور پیشفرض همان رفتار سنتی C انگلیسی خواهد بود.
- TMPDIR
- اگر TMPDIR تنظیم شده باشد، دایرکتوری مورد استفاده برای فایلهای موقت را تعیین میکند. GCC از فایلهای موقت برای نگهداری خروجی یک مرحله از کامپایل که قرار است به عنوان ورودی مرحله بعد استفاده شود بهره میبرد: برای نمونه، خروجی پیشپردازنده که ورودی خودِ کامپایلر است.
- GCC_COMPARE_DEBUG
- تنظیم GCC_COMPARE_DEBUG تقریباً معادل ارسال -fcompare-debug به گرداننده کامپایلر است. برای جزئیات بیشتر به مستندات این گزینه مراجعه کنید.
- GCC_EXEC_PREFIX
- اگر GCC_EXEC_PREFIX
تنظیم شده
باشد،
پیشوندی را
برای
استفاده در
نام
زیربرنامههای
اجراشده
توسط
کامپایلر
مشخص
میکند.
هنگام
ترکیب این
پیشوند با
نام یک
زیربرنامه
هیچ اسلشی
اضافه
نمیشود،
اما در صورت
تمایل
میتوانید
پیشوندی را
مشخص کنید
که به یک
اسلش ختم
شود.
اگر GCC_EXEC_PREFIX تنظیم نشده باشد، GCC تلاش میکند بر اساس مسیر فایلی که با آن فراخوانی شده است، پیشوند مناسبی را برای استفاده بیابد.
اگر GCC نتواند زیربرنامه را با استفاده از پیشوند مشخصشده پیدا کند، سعی میکند در مکانهای معمول به دنبال آن زیربرنامه بگردد.
مقدار پیشفرض GCC_EXEC_PREFIX برابر با prefix/lib/gcc/ است که در آن prefix پیشوندِ کامپایلر نصبشده است. در بسیاری از موارد prefix مقدار "prefix" در زمان اجرای اسکریپت configure است.
سایر پیشوندهای مشخصشده با -B بر این پیشوند اولویت دارند.
این پیشوند همچنین برای یافتن فایلهایی مانند crt0.o که برای پیوند دادن استفاده میشوند، به کار میرود.
علاوه بر این، این پیشوند به شیوهای غیرمعمول در یافتن دایرکتوریهای جستجو برای فایلهای هدر استفاده میشود. برای هر یک از دایرکتوریهای استانداردی که نام آنها به طور معمول با /usr/local/lib/gcc آغاز میشود (دقیقتر، با مقدار GCC_INCLUDE_DIR)، GCC سعی میکند آن بخش آغازین را با پیشوند مشخصشده جایگزین کند تا نام دایرکتوری جایگزینی تولید شود. بنابراین، با -Bfoo/، GCC درست پیش از جستجوی دایرکتوری استاندارد /usr/local/lib/bar، دایرکتوری foo/bar را جستجو میکند. اگر یک دایرکتوری استاندارد با prefix پیکربندیشده آغاز شود، هنگام جستجوی فایلهای هدر مقدار prefix با GCC_EXEC_PREFIX جایگزین میشود.
- COMPILER_PATH
- مقدار COMPILER_PATH فهرستی از دایرکتوریها است که با دونقطه از هم جدا شدهاند، بسیار شبیه به PATH. اگر GCC نتواند زیربرنامهها را با استفاده از GCC_EXEC_PREFIX پیدا کند، دایرکتوریهایی را که بدینگونه مشخص شدهاند هنگام جستجوی زیربرنامهها امتحان میکند.
- LIBRARY_PATH
- مقدار LIBRARY_PATH فهرستی از دایرکتوریها است که با دونقطه از هم جدا شدهاند، بسیار شبیه به PATH. زمانی که به عنوان یک کامپایلر بومی پیکربندی شده باشد، اگر GCC نتواند فایلهای ویژه پیونددهنده را با استفاده از GCC_EXEC_PREFIX پیدا کند، دایرکتوریهای مشخصشده را امتحان میکند. پیوند زدن با استفاده از GCC همچنین هنگام جستجوی کتابخانههای عادی برای گزینه -l از این دایرکتوریها استفاده میکند (اما دایرکتوریهای مشخصشده با -L اولویت دارند).
- LANG
- این متغیر برای ارسال اطلاعات محلی (locale) به کامپایلر استفاده میشود. یکی از مواردی که این اطلاعات به کار میرود، تعیین مجموعه نویسهای است که باید هنگام تجزیه مقادیر حرفی نویسهای، رشتهای و توضیحات در C و C++ استفاده شود. زمانی که کامپایلر برای مجاز دانستن نویسههای چندبایتی پیکربندی شده باشد، مقادیر زیر برای LANG شناخته میشوند:
اگر LANG تعریف نشده باشد یا مقدار دیگری داشته باشد، کامپایلر از "mblen" و "mbtowc" همانطور که توسط محلی پیشفرض تعریف شده برای شناسایی و ترجمه نویسههای چندبایتی استفاده میکند.
- GCC_EXTRA_DIAGNOSTIC_OUTPUT
- اگر GCC_EXTRA_DIAGNOSTIC_OUTPUT روی یکی از مقادیر زیر تنظیم شده باشد، هنگام صدور راهنماییهای اصلاحی (fix-it hints)، متن بیشتری به خروجی خطای استاندارد (stderr) ارسال خواهد شد. گزینههای -fdiagnostics-parseable-fixits و -fno-diagnostics-parseable-fixits بر این متغیر محیطی اولویت دارند.
- fixits-v1
- صدور راهنماییهای اصلاحی قابل تجزیه، معادل -fdiagnostics-parseable-fixits. بهویژه، ستونها به عنوان شمارشی از بایتها بیان میشوند که از بایت ۱ برای ستون نخست آغاز میشود.
- fixits-v2
- همانند "fixits-v1"، اما ستونها طبق -fdiagnostics-column-unit=display به صورت ستونهای نمایشی بیان میشوند.
چند متغیر محیطی دیگر نیز بر رفتار پیشپردازنده تأثیر میگذارند.
- CPATH
- C_INCLUDE_PATH
- CPLUS_INCLUDE_PATH
- OBJC_INCLUDE_PATH
- مقدار هر
متغیر
فهرستی از
دایرکتوریها
است که
همانند PATH
با یک نویسه
ویژه از هم
جدا
شدهاند و
در آنها به
دنبال
فایلهای
هدر جستجو
میشود. این
نویسه
ویژه، یعنی
"PATH_SEPARATOR"،
وابسته به
هدف بوده و
در زمان
ساخت GCC
تعیین
میگردد.
برای
سیستمهای
هدف مبتنی
بر Microsoft Windows یک
نقطهویرگول
(semicolon) و
تقریباً
برای همه
سیستمهای
هدف دیگر یک
دونقطه (colon)
است.
متغیر CPATH فهرستی از دایرکتوریها را برای جستجو تعیین میکند که گویی با گزینه -I مشخص شدهاند، اما پس از هر مسیری که با گزینههای -I در خط فرمان داده شده، جستجو میشوند. این متغیر محیطی بدون در نظر گرفتن این که چه زبانی در حال پیشپردازش است استفاده میشود.
متغیرهای محیطی باقیمانده تنها هنگام پیشپردازش زبان مشخصشده اعمال میشوند. هر یک فهرستی از دایرکتوریها را مشخص میکند که گویی با گزینه -isystem مشخص شدهاند، اما پس از هر مسیری که با گزینههای -isystem در خط فرمان داده شده، جستجو خواهند شد.
در تمام این متغیرها، یک عضو خالی به کامپایلر دستور میدهد که دایرکتوری کاری جاری خود را جستجو کند. اعضای خالی میتوانند در ابتدا یا انتهای یک مسیر ظاهر شوند. برای نمونه، اگر مقدار CPATH برابر ":/special/include" باشد، همان اثری را دارد که -I. -I/special/include دارد..IP DEPENDENCIES_OUTPUT 4 اگر این متغیر مقداردهی شده باشد، مقدار آن نحوه خروجی دادن وابستگیها برای Make را بر اساس سرپروندههای غیرسیستمیِ پردازششده توسط کامپایلر مشخص میکند. سرپروندههای سیستمی در خروجی وابستگیها نادیده گرفته میشوند.
مقدار DEPENDENCIES_OUTPUT میتواند صرفاً یک نام فایل باشد، که در این حالت قواعد Make در آن فایل نوشته میشوند و نام هدف از روی نام فایل منبع حدس زده میشود. همچنین مقدار میتواند به شکل file target باشد که در این حالت قواعد در فایل file با استفاده از target به عنوان نام هدف نوشته میشوند.
به عبارت دیگر، این متغیر محیطی معادل ترکیب گزینههای -MM و -MF به همراه سوئیچ اختیاری -MT است.
- SUNPRO_DEPENDENCIES
- این متغیر همانند DEPENDENCIES_OUTPUT است (بالا را ببینید)، با این تفاوت که سرپروندههای سیستمی نادیده گرفته نمیشوند، بنابراین بیانگر -M به جای -MM است. با این حال، وابستگی به فایل ورودی اصلی حذف میشود.
- SOURCE_DATE_EPOCH
- اگر این
متغیر
مقداردهی
شده باشد،
مقدار آن یک
برچسب
زمانی UNIX را
مشخص
میکند تا
به جای
تاریخ و
زمان جاری
در
ماکروهای
"__DATE__" و
"__TIME__"
استفاده
شود، به
طوری که
برچسبهای
زمانیِ
تعبیهشده
بازتولیدپذیر
شوند.
مقدار SOURCE_DATE_EPOCH باید یک برچسب زمانی UNIX باشد که به صورت تعداد ثانیهها (به استثنای ثانیههای کبیسه) از تاریخ 01 Jan 1970 00:00:00 در قالب ASCII تعریف میشود؛ دقیقاً یکسان با خروجی "date +%s" در GNU/Linux و سایر سیستمهایی که از پسوند %s در دستور "date" پشتیبانی میکنند.
این مقدار باید یک برچسب زمانی مشخص مانند زمان آخرین تغییرات منبع یا بسته باشد و باید توسط فرآیند ساخت تنظیم شود.
گزارش باگها (BUGS)
برای دیدن دستورالعملهای گزارش باگها، پیوند زیر را ببینید: https://gitlab.archlinux.org/archlinux/packaging/packages/riscv64-elf-gcc/-/issues.
پانویسها (FOOTNOTES)
- 1.
- در برخی سیستمها، gcc -shared برای اینکه سازندهها (constructors) به درستی کار کنند، نیاز دارد که کد خرد تکمیلی (stub code) بسازد. در سیستمهای چندکتابخانهای (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)
Copyright (c) 1988-2025 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.
| 2025-08-08 | gcc-15.2.0 |