| GCC(1) | GNU | GCC(1) |
نام (NAME)
gcc - کامپایلر C و ++C پروژه گنو
خلاصه دستور (SYNOPSIS)
gcc [-c|-S|-E] [-std=standard]
[-g] [-pg] [-Olevel]
[-Wwarn...] [-Wpedantic]
[-Idir...] [-Ldir...]
[-Dmacro[=defn]...] [-Umacro]
[-foption...] [-mmachine-option...]
[-o outfile] [@file] infile...
در اینجا تنها کاربردیترین گزینهها فهرست شدهاند؛ برای سایر موارد به بخشهای پایینتر مراجعه کنید. برنامهٔ g++ تقریباً بیشتر گزینههای مشابه با gcc را میپذیرد.
توضیحات (DESCRIPTION)
هنگامی که GCC را فراخوانی میکنید، معمولاً پیشپردازش، کامپایل، اسمبل و پیونددهی را انجام میدهد. «گزینههای کلی» به شما امکان میدهند این فرایند را در یک مرحلهٔ میانی متوقف کنید. برای مثال، گزینهٔ -c میگوید که پیونددهنده اجرا نشود. در این حالت، خروجی شامل فایلهای شیء تولیدشده توسط اسمبلر خواهد بود.
سایر گزینهها به یک یا چند مرحله از پردازش فرستاده میشوند. برخی گزینهها پیشپردازنده و برخی دیگر خود کامپایلر را کنترل میکنند. گزینههای دیگری نیز اسمبلر و پیونددهنده را کنترل میکنند؛ بیشتر این گزینهها در اینجا مستند نشدهاند، چرا که به ندرت به استفاده از آنها نیاز خواهید داشت.
بیشتر گزینههای خط فرمانی که میتوانید با GCC به کار ببرید برای برنامههای C مفید هستند؛ هنگامی که گزینهای تنها برای زبانی دیگر (معمولاً ++C) کاربرد دارد، در توضیحات صراحتاً به آن اشاره شده است. اگر در توضیحات یک گزینهٔ خاص به زبان مبدأ مشخصی اشاره نشده باشد، میتوانید از آن گزینه برای همهٔ زبانهای پشتیبانیشده استفاده کنید.
روش معمول برای اجرای GCC، اجرای فایل اجرایی با نام gcc است، یا در زمان کامپایل متقاطع اجرای machine-gcc، یا machine-gcc-version برای اجرای یک نسخهٔ خاص از GCC است. هنگامی که برنامههای ++C را کامپایل میکنید، باید در عوض GCC را با نام g++ فراخوانی کنید.
برنامهٔ gcc گزینهها و نامهای فایل را به عنوان عملوند میپذیرد. بسیاری از گزینهها نامهای چندحرفی دارند؛ بنابراین چندین گزینهٔ تکحرفی را نمیتوان با هم گروهبندی کرد: -dv با -d -v بسیار متفاوت است.
میتوانید گزینهها و سایر آرگومانها را با هم ترکیب کنید. در بیشتر موارد، ترتیبی که استفاده میکنید اهمیتی ندارد. با این حال هنگام استفاده از چندین گزینه از یک نوع، ترتیب مهم است؛ برای مثال، اگر -L را بیش از یک بار مشخص کنید، دایرکتوریها بر اساس همان ترتیب تعیینشده جستجو میشوند. همچنین، جایگاه قرارگیری گزینهٔ -l دارای اهمیت است.
بسیاری از گزینهها نامهای بلندی دارند که با -f یا با -W آغاز میشوند---برای نمونه، -fmove-loop-invariants، -Wformat و غیره. بیشتر این گزینهها هم شکل مثبت و هم شکل منفی دارند؛ شکل منفی -ffoo به صورت -fno-foo است. این راهنما تنها یکی از این دو شکل را مستند میکند، یعنی هر کدام که پیشفرض نباشد.
برخی گزینهها یک یا چند آرگومان دریافت میکنند که معمولاً با یک فاصله یا با علامت مساوی (=) از نام گزینه جدا میشوند. مگر اینکه به گونهٔ دیگری مستند شده باشد، یک آرگومان میتواند عددی یا یک رشته باشد. آرگومانهای عددی معمولاً باید اعداد صحیح دهدهی یا شانزدهشانزدهی کوچک و بدون علامت باشند. آرگومانهای شانزدهشانزدهی باید با پیشوند 0x آغاز شوند. آرگومانهای گزینههایی که نوعی آستانهٔ اندازه را مشخص میکنند، میتوانند اعداد صحیح دهدهی یا شانزدهشانزدهی به بزرگی دلخواه باشند که پسوند اندازهٔ بایت به دنبال آنها آمده و ضریبی از بایت را مشخص میکند؛ مانند "kB" و "KiB" به ترتیب برای کیلوبایت و کیبیبایت، "MB" و "MiB" برای مگابایت و مبیبایت، "GB" و "GiB" برای گیگابایت و گیبیبایت، و غیره. چنین آرگومانهایی در متن بعدی با byte-size مشخص میشوند. برای فهرست کامل و توضیحات مربوط به پیشوندهای دودویی و دهدهی اندازهٔ بایت، به استانداردهای NIST، IEC و سایر استانداردهای ملی و بینالمللی مربوطه مراجعه کنید..SH "گزینهها (OPTIONS)"
خلاصه گزینهها (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 "گزینههای ابزارگذاری برنامه" 4 -p -pg -fprofile-arcs --coverage -ftest-coverage -fcondition-coverage -fpath-coverage -fprofile-abs-path -fprofile-dir=path -fprofile-generate -fprofile-generate=path -fprofile-info-section -fprofile-info-section=name -fprofile-note=path -fprofile-prefix-path=path -fprofile-update=method -fprofile-filter-files=regex -fprofile-exclude-files=regex -fprofile-reproducible=[multithreaded|parallel-runs|serial] -fsanitize=style -fsanitize-recover -fsanitize-recover=style -fsanitize-trap -fsanitize-trap=style -fasan-shadow-offset=number -fsanitize-sections=s1,s2,... -fsanitize-undefined-trap-on-error -fbounds-check -fcf-protection -fcf-protection=[full|branch|return|none|check] -fharden-compares -fharden-conditional-branches -fhardened -fharden-control-flow-redundancy -fhardcfr-skip-leaf -fhardcfr-check-exceptions -fhardcfr-check-returning-calls -fhardcfr-check-noreturn-calls=[always|no-xthrow|nothrow|never] -fstack-protector -fstack-protector-all -fstack-protector-strong -fstack-protector-explicit -fstack-check -fstack-limit-register=reg -fstack-limit-symbol=sym -fno-stack-limit -fsplit-stack -fstrub=disable -fstrub=strict -fstrub=relaxed -fstrub=all -fstrub=at-calls -fstrub=internal -fvtable-verify=[std|preinit|none] -fvtv-counts -fvtv-debug -finstrument-functions -finstrument-functions-once -finstrument-functions-exclude-function-list=sym,sym,... -finstrument-functions-exclude-file-list=file,file,... -fprofile-prefix-map=old=new -fpatchable-function-entry=N[,M]
- گزینههای پیشپردازنده
- -Aquestion=answer -A-question[=answer] -C -CC -Dmacro[=defn] -dD -dI -dM -dN -dU -fdebug-cpp -fdirectives-only -fdollars-in-identifiers -fexec-charset=charset -fextended-identifiers -finput-charset=charset -fmacro-prefix-map=old=new -fmax-include-depth=depth -fno-canonical-system-headers -fpch-deps -fpch-preprocess -fpreprocessed -ftabstop=width -ftrack-macro-expansion -fwide-exec-charset=charset -fworking-directory -H -imacros file -include file -M -MD -MF -MG -MM -MMD -MP -MQ -MT -Mno-modules -no-integrated-cpp -P -pthread -remap -traditional -traditional-cpp -trigraphs -Umacro -undef -Wp,option -Xpreprocessor option
- گزینههای اسِمبلر
- -Wa,option -Xassembler option
- گزینههای پیونددهنده
- object-file-name -fuse-ld=linker -llibrary -nostartfiles -nodefaultlibs -nolibc -nostdlib -nostdlib++ -e entry --entry=entry -pie -pthread -r -rdynamic -s -static -static-pie -static-libgcc -static-libstdc++ -static-libasan -static-libtsan -static-liblsan -static-libubsan -shared -shared-libgcc -symbolic -T script -Wl,option -Xlinker option -u symbol -z keyword
- گزینههای دایرکتوری
- -Bprefix -Idir -I- -idirafter dir -imacros file -imultilib dir -iplugindir=dir -iprefix file -iquote dir -isysroot dir -isystem dir -iwithprefix dir -iwithprefixbefore dir --embed-dir=dir -Ldir -no-canonical-prefixes --no-sysroot-suffix -nostdinc -nostdinc++ --sysroot=dir
- گزینههای تولید کد
- -fcall-saved-reg -fcall-used-reg -ffixed-reg -fexceptions -fnon-call-exceptions -fdelete-dead-exceptions -funwind-tables -fasynchronous-unwind-tables -fno-gnu-unique -finhibit-size-directive -fcommon -fno-ident -fpcc-struct-return -fpic -fPIC -fpie -fPIE -fno-plt -fno-jump-tables -fno-bit-tests -frecord-gcc-switches -freg-struct-return -fshort-enums -fshort-wchar -fverbose-asm -fpack-struct[=n] -fleading-underscore -ftls-model=model -fstack-reuse=reuse_level -ftrampolines -ftrampoline-impl=[stack|heap] -ftrapv -fwrapv -fvisibility=[default|internal|hidden|protected] -fstrict-volatile-bitfields -fsync-libcalls -fzero-init-padding-bits=value
- گزینههای توسعهدهنده
- -dletters -dumpspecs -dumpmachine -dumpversion -dumpfullversion -fcallgraph-info[=su,da] -fchecking -fchecking=n -fdbg-cnt-list -fdbg-cnt=counter-value-list -fdisable-ipa-pass_name -fdisable-rtl-pass_name -fdisable-rtl-pass-name=range-list -fdisable-tree-pass_name -fdisable-tree-pass-name=range-list -fdump-debug -fdump-earlydebug -fdump-noaddr -fdump-unnumbered -fdump-unnumbered-links -fdump-final-insns[=file] -fdump-ipa-all -fdump-ipa-cgraph -fdump-ipa-inline -fdump-lang-all -fdump-lang-switch -fdump-lang-switch-options -fdump-lang-switch-options=filename -fdump-passes -fdump-rtl-pass -fdump-rtl-pass=filename -fdump-statistics -fdump-tree-all -fdump-tree-switch -fdump-tree-switch-options -fdump-tree-switch-options=filename -fcompare-debug[=opts] -fcompare-debug-second -fenable-kind-pass -fenable-kind-pass=range-list -fira-verbose=n -flto-report -flto-report-wpa -fmem-report-wpa -fmem-report -fpre-ipa-mem-report -fpost-ipa-mem-report -fopt-info -fopt-info-options[=file] -fmultiflags -fprofile-report -frandom-seed=string -fsched-verbose=n -fsel-sched-verbose -fsel-sched-dump-cfg -fsel-sched-pipelining-verbose -fstats -fstack-usage -ftime-report -ftime-report-details -fvar-tracking-assignments-toggle -gtoggle -print-file-name=library -print-libgcc-file-name -print-multi-directory -print-multi-lib -print-multi-os-directory -print-prog-name=program -print-search-dirs -Q -print-sysroot -print-sysroot-headers-suffix -save-temps -save-temps=cwd -save-temps=obj -time[=file]
- گزینههای وابسته به ماشین
- گزینههای
AArch64 (AArch64 Options) -mabi=name
-mbig-endian -mlittle-endian -mgeneral-regs-only
-mcmodel=tiny -mcmodel=small -mcmodel=large -mstrict-align
-mno-strict-align -momit-leaf-frame-pointer
-mtls-dialect=desc -mtls-dialect=traditional
-mtls-size=size -mfix-cortex-a53-835769
-mfix-cortex-a53-843419 -mlow-precision-recip-sqrt
-mlow-precision-sqrt -mlow-precision-div
-mpc-relative-literal-loads
-msign-return-address=scope
-mbranch-protection=none|standard|pac-ret[+leaf
+b-key]|bti|gcs
-mharden-sls=opts -march=name
-mcpu=name -mtune=name
-moverride=string -mverbose-cost-dump
-mstack-protector-guard=guard
-mstack-protector-guard-reg=sysreg
-mstack-protector-guard-offset=offset
-mtrack-speculation -moutline-atomics -mearly-ldp-fusion
-mlate-ldp-fusion -Wexperimental-fmv-target
گزینههای Adapteva Epiphany (Adapteva Epiphany Options) -mhalf-reg-file -mprefer-short-insn-regs -mbranch-cost=num -mcmove -mnops=num -msoft-cmpsf -msplit-lohi -mpost-inc -mpost-modify -mstack-offset=num -mround-nearest -mlong-calls -mshort-calls -msmall16 -mfp-mode=mode -mvect-double -max-vect-align=num -msplit-vecmove-early -m1reg-reg
گزینههای AMD GCN (AMD GCN Options) -march=gpu -mtune=gpu -mstack-size=bytes
گزینههای ARC (ARC Options) -mbarrel-shifter -mjli-always -mcpu=cpu -mA6 -mARC600 -mA7 -mARC700 -mdpfp -mdpfp-compact -mdpfp-fast -mno-dpfp-lrsr -mea -mno-mpy -mmul32x16 -mmul64 -matomic -mnorm -mspfp -mspfp-compact -mspfp-fast -msimd -msoft-float -mswap -mcrc -mdsp-packa -mdvbf -mlock -mmac-d16 -mmac-24 -mrtsc -mswape -mtelephony -mxy -misize -mannotate-align -marclinux -marclinux_prof -mlong-calls -mmedium-calls -msdata -mirq-ctrl-saved -mrgf-banked-regs -mlpc-width=width -G num -mvolatile-cache -mtp-regno=regno -malign-call -mauto-modify-reg -mbbit-peephole -mno-brcc -mcase-vector-pcrel -mcompact-casesi -mno-cond-exec -mearly-cbranchsi -mexpand-adddi -mindexed-loads -mlra -mlra-priority-none -mlra-priority-compact -mlra-priority-noncompact -mmillicode -mmixed-code -mq-class -mRcq -mRcw -msize-level=level -mtune=cpu -mmultcost=num -mcode-density-frame -munalign-prob-threshold=probability -mmpy-option=multo -mdiv-rem -mcode-density -mll64 -mfpu=fpu -mrf16 -mbranch-index
گزینههای ARM (ARM Options) -mapcs-frame -mno-apcs-frame -mabi=name -mapcs-stack-check -mno-apcs-stack-check -mapcs-reentrant -mno-apcs-reentrant -mgeneral-regs-only -msched-prolog -mno-sched-prolog -mlittle-endian -mbig-endian -mbe8 -mbe32 -mfloat-abi=name -mfp16-format=name -mthumb-interwork -mno-thumb-interwork -mcpu=name -march=name -mfpu=name -mtune=name -mprint-tune-info -mstructure-size-boundary=n -mabort-on-noreturn -mlong-calls -mno-long-calls -msingle-pic-base -mno-single-pic-base -mpic-register=reg -mnop-fun-dllimport -mpoke-function-name -mthumb -marm -mflip-thumb -mtpcs-frame -mtpcs-leaf-frame -mcaller-super-interworking -mcallee-super-interworking -mtp=name -mtls-dialect=dialect -mword-relocations -mfix-cortex-m3-ldrd -mfix-cortex-a57-aes-1742098 -mfix-cortex-a72-aes-1655431 -munaligned-access -mneon-for-64bits -mslow-flash-data -masm-syntax-unified -mrestrict-it -mverbose-cost-dump -mpure-code -mcmse -mfix-cmse-cve-2021-35465 -mstack-protector-guard=guard -mstack-protector-guard-offset=offset -mfdpic -mbranch-protection=none|standard|pac-ret[+leaf] [+bti]|bti[+pac-ret[+leaf]]
گزینههای AVR (AVR Options) -mmcu=mcu -mabsdata -maccumulate-args -mcvt -mbranch-cost=cost -mfuse-add=level -mfuse-move=level -mfuse-move2 -mcall-prologues -mgas-isr-prologues -mint8 -mflmap -mdouble=bits -mlong-double=bits -mno-call-main -mn_flash=size -mfract-convert-truncate -mno-interrupts -mmain-is-OS_task -mrelax -mrmw -mstrict-X -mtiny-stack -mrodata-in-ram -msplit-bit-shift -msplit-ldst -mshort-calls -mskip-bug -muse-nonzero-bits -nodevicelib -nodevicespecs -Waddr-space-convert -Wmisspelled-isr
گزینههای Blackfin (Blackfin Options) -mcpu=cpu[-sirevision] -msim -momit-leaf-frame-pointer -mno-omit-leaf-frame-pointer -mspecld-anomaly -mno-specld-anomaly -mcsync-anomaly -mno-csync-anomaly -mlow-64k -mno-low64k -mstack-check-l1 -mid-shared-library -mno-id-shared-library -mshared-library-id=n -mleaf-id-shared-library -mno-leaf-id-shared-library -msep-data -mno-sep-data -mlong-calls -mno-long-calls -mfast-fp -minline-plt -mmulticore -mcorea -mcoreb -msdram -micplb.Sp گزینههای C6X (C6X Options) -mbig-endian -mlittle-endian -march=cpu -msim -msdata=sdata-type
گزینههای CRIS (CRIS Options) -mcpu=cpu -march=cpu -mtune=cpu -mmax-stack-frame=n -metrax4 -metrax100 -mpdebug -mcc-init -mno-side-effects -mstack-align -mdata-align -mconst-align -m32-bit -m16-bit -m8-bit -mno-prologue-epilogue -melf -maout -sim -sim2 -mmul-bug-workaround -mno-mul-bug-workaround
گزینههای C-SKY (C-SKY Options) -march=arch -mcpu=cpu -mbig-endian -EB -mlittle-endian -EL -mhard-float -msoft-float -mfpu=fpu -mdouble-float -mfdivdu -mfloat-abi=name -melrw -mistack -mmp -mcp -mcache -msecurity -mtrust -mdsp -medsp -mvdsp -mdiv -msmart -mhigh-registers -manchor -mpushpop -mmultiple-stld -mconstpool -mstack-size -mccrt -mbranch-cost=n -mcse-cc -msched-prolog -msim
گزینههای Cygwin و MinGW (Cygwin and MinGW Options) -mconsole -mcrtdll=library -mdll -mnop-fun-dllimport -mthread -municode -mwin32 -mwindows -fno-set-stack-executable
گزینههای Darwin (Darwin Options) -all_load -allowable_client -arch -arch_errors_fatal -arch_only -bind_at_load -bundle -bundle_loader -client_name -compatibility_version -current_version -dead_strip -dependency-file -dylib_file -dylinker_install_name -dynamic -dynamiclib -exported_symbols_list -filelist -flat_namespace -force_cpusubtype_ALL -force_flat_namespace -headerpad_max_install_names -iframework -image_base -init -install_name -keep_private_externs -multi_module -multiply_defined -multiply_defined_unused -noall_load -no_dead_strip_inits_and_terms -nodefaultrpaths -nofixprebinding -nomultidefs -noprebind -noseglinkedit -pagezero_size -prebind -prebind_all_twolevel_modules -private_bundle -read_only_relocs -sectalign -sectobjectsymbols -whyload -seg1addr -sectcreate -sectobjectsymbols -sectorder -segaddr -segs_read_only_addr -segs_read_write_addr -seg_addr_table -seg_addr_table_filename -seglinkedit -segprot -segs_read_only_addr -segs_read_write_addr -single_module -static -sub_library -sub_umbrella -twolevel_namespace -umbrella -undefined -unexported_symbols_list -weak_reference_mismatches -whatsloaded -F -gused -gfull -mmacosx-version-min=version -mkernel -mone-byte-bool
گزینههای DEC Alpha (DEC Alpha Options) -mno-fp-regs -msoft-float -mieee -mieee-with-inexact -mieee-conformant -mfp-trap-mode=mode -mfp-rounding-mode=mode -mtrap-precision=mode -mbuild-constants -mcpu=cpu-type -mtune=cpu-type -mbwx -mmax -mfix -mcix -msafe-bwa -msafe-partial -mfloat-vax -mfloat-ieee -mexplicit-relocs -msmall-data -mlarge-data -msmall-text -mlarge-text -mmemory-latency=time
گزینههای eBPF (eBPF Options) -mbig-endian -mlittle-endian -mframe-limit=bytes -mxbpf -mco-re -mno-co-re -mjmpext -mjmp32 -malu32 -mv3-atomics -mbswap -msdiv -msmov -mcpu=version -masm=dialect -minline-memops-threshold=bytes
گزینههای FR30 (FR30 Options) -msmall-model -mno-lsim
گزینههای FT32 (FT32 Options) -msim -mlra -mnodiv -mft32b -mcompress -mnopm
گزینههای FRV (FRV Options) -mgpr-32 -mgpr-64 -mfpr-32 -mfpr-64 -mhard-float -msoft-float -malloc-cc -mfixed-cc -mdword -mno-dword -mdouble -mno-double -mmedia -mno-media -mmuladd -mno-muladd -mfdpic -minline-plt -mgprel-ro -multilib-library-pic -mlinked-fp -mlong-calls -malign-labels -mlibrary-pic -macc-4 -macc-8 -mpack -mno-pack -mno-eflags -mcond-move -mno-cond-move -moptimize-membar -mno-optimize-membar -mscc -mno-scc -mcond-exec -mno-cond-exec -mvliw-branch -mno-vliw-branch -mmulti-cond-exec -mno-multi-cond-exec -mnested-cond-exec -mno-nested-cond-exec -mtomcat-stats -mTLS -mtls -mcpu=cpu
گزینههای GNU/Linux (GNU/Linux Options) -mglibc -muclibc -mmusl -mbionic -mandroid -tno-android-cc -tno-android-ld
گزینههای H8/300 (H8/300 Options) -mrelax -mh -ms -mn -mexr -mno-exr -mint32 -malign-300
گزینههای HPPA (HPPA Options) -march=architecture-type -matomic-libcalls -mbig-switch -mcaller-copies -mdisable-fpregs -mdisable-indexing -mordered -mfast-indirect-calls -mgas -mgnu-ld -mhp-ld -mfixed-range=register-range -mcoherent-ldcw -mjump-in-delay -mlinker-opt -mlong-calls -mlong-load-store -mno-atomic-libcalls -mno-disable-fpregs -mno-disable-indexing -mno-fast-indirect-calls -mno-gas -mno-jump-in-delay -mno-long-load-store -mno-portable-runtime -mno-soft-float -mno-space-regs -msoft-float -mpa-risc-1-0 -mpa-risc-1-1 -mpa-risc-2-0 -mportable-runtime -mschedule=cpu-type -mspace-regs -msoft-mult -msio -mwsio -munix=unix-std -nolibdld -static -threads
گزینههای IA-64 (IA-64 Options) -mbig-endian -mlittle-endian -mgnu-as -mgnu-ld -mno-pic -mvolatile-asm-stop -mregister-names -msdata -mno-sdata -mconstant-gp -mauto-pic -mfused-madd -minline-float-divide-min-latency -minline-float-divide-max-throughput -mno-inline-float-divide -minline-int-divide-min-latency -minline-int-divide-max-throughput -mno-inline-int-divide -minline-sqrt-min-latency -minline-sqrt-max-throughput -mno-inline-sqrt -mdwarf2-asm -mearly-stop-bits -mfixed-range=register-range -mtls-size=tls-size -mtune=cpu-type -milp32 -mlp64 -msched-br-data-spec -msched-ar-data-spec -msched-control-spec -msched-br-in-data-spec -msched-ar-in-data-spec -msched-in-control-spec -msched-spec-ldc -msched-spec-control-ldc -msched-prefer-non-data-spec-insns -msched-prefer-non-control-spec-insns -msched-stop-bits-after-every-cycle -msched-count-spec-in-critical-path -msel-sched-dont-check-control-spec -msched-fp-mem-deps-zero-cost -msched-max-memory-insns-hard-limit -msched-max-memory-insns=max-insns
گزینههای LM32 (LM32 Options) -mbarrel-shift-enabled -mdivide-enabled -mmultiply-enabled -msign-extend-enabled -muser-enabled
گزینههای LoongArch (LoongArch Options) -march=arch-type -mtune=tune-type -mabi=base-abi-type -mfpu=fpu-type -msimd=simd-type -msoft-float -msingle-float -mdouble-float -mlsx -mno-lsx -mlasx -mno-lasx -mbranch-cost=n -maddr-reg-reg-cost=n -mcheck-zero-division -mno-check-zero-division -mcond-move-int -mno-cond-move-int -mcond-move-float -mno-cond-move-float -memcpy -mno-memcpy -mstrict-align -mno-strict-align -G num -mmax-inline-memcpy-size=n -mexplicit-relocs=style -mexplicit-relocs -mno-explicit-relocs -mdirect-extern-access -mno-direct-extern-access -mcmodel=code-model -mrelax -mpass-mrelax-to-as -mrecip -mrecip=opt -mfrecipe -mno-frecipe -mdiv32 -mno-div32 -mlam-bh -mno-lam-bh -mlamcas -mno-lamcas -mld-seq-sa -mno-ld-seq-sa -mtls-dialect=opt -mannotate-tablejump -mno-annotate-tablejump
گزینههای M32C (M32C Options) -mcpu=cpu -msim -memregs=number
گزینههای M32R/D (M32R/D Options) -m32r2 -m32rx -m32r -mdebug -malign-loops -mno-align-loops -missue-rate=number -mbranch-cost=number -mmodel=code-size-model-type -msdata=sdata-type -mno-flush-func -mflush-func=name -mno-flush-trap -mflush-trap=number -G num
گزینههای M680x0 (M680x0 Options) -march=arch -mcpu=cpu -mtune=tune -m68000 -m68020 -m68020-40 -m68020-60 -m68030 -m68040 -m68060 -mcpu32 -m5200 -m5206e -m528x -m5307 -m5407 -mcfv4e -mbitfield -mno-bitfield -mc68000 -mc68020 -mnobitfield -mrtd -mno-rtd -mdiv -mno-div -mshort -mno-short -mhard-float -m68881 -msoft-float -mpcrel -malign-int -mstrict-align -msep-data -mno-sep-data -mshared-library-id=n -mid-shared-library -mno-id-shared-library -mxgot -mno-xgot -mlong-jump-table-offsets
گزینههای MCore (MCore Options) -mhardlit -mno-hardlit -mdiv -mno-div -mrelax-immediates -mno-relax-immediates -mwide-bitfields -mno-wide-bitfields -m4byte-functions -mno-4byte-functions -mcallgraph-data -mno-callgraph-data -mslow-bytes -mno-slow-bytes -mno-lsim -mlittle-endian -mbig-endian -m210 -m340 -mstack-increment
گزینههای MicroBlaze (MicroBlaze Options) -msoft-float -mhard-float -msmall-divides -mcpu=cpu -mmemcpy -mxl-soft-mul -mxl-soft-div -mxl-barrel-shift -mxl-pattern-compare -mxl-stack-check -mxl-gp-opt -mno-clearbss -mxl-multiply-high -mxl-float-convert -mxl-float-sqrt -mbig-endian -mlittle-endian -mxl-reorder -mxl-mode-app-model -mpic-data-is-text-relative
گزینههای MIPS (MIPS Options) -EL -EB -march=arch -mtune=arch -mips1 -mips2 -mips3 -mips4 -mips32 -mips32r2 -mips32r3 -mips32r5 -mips32r6 -mips64 -mips64r2 -mips64r3 -mips64r5 -mips64r6 -mips16 -mno-mips16 -mflip-mips16 -minterlink-compressed -mno-interlink-compressed -minterlink-mips16 -mno-interlink-mips16 -mabi=abi -mabicalls -mno-abicalls -mshared -mno-shared -mplt -mno-plt -mxgot -mno-xgot -mgp32 -mgp64 -mfp32 -mfpxx -mfp64 -mhard-float -msoft-float -mno-float -msingle-float -mdouble-float -modd-spreg -mno-odd-spreg -mabs=mode -mnan=encoding -mdsp -mno-dsp -mdspr2 -mno-dspr2 -mmcu -mmno-mcu -meva -mno-eva -mvirt -mno-virt -mxpa -mno-xpa -mcrc -mno-crc -mginv -mno-ginv -mmicromips -mno-micromips -mmsa -mno-msa -mloongson-mmi -mno-loongson-mmi -mloongson-ext -mno-loongson-ext -mloongson-ext2 -mno-loongson-ext2 -mfpu=fpu-type -msmartmips -mno-smartmips -mpaired-single -mno-paired-single -mdmx -mno-mdmx -mips3d -mno-mips3d -mmt -mno-mt -mllsc -mno-llsc -mlong64 -mlong32 -msym32 -mno-sym32 -Gnum -mlocal-sdata -mno-local-sdata -mextern-sdata -mno-extern-sdata -mgpopt -mno-gopt -membedded-data -mno-embedded-data -muninit-const-in-rodata -mno-uninit-const-in-rodata -mcode-readable=setting -msplit-addresses -mno-split-addresses -mexplicit-relocs -mno-explicit-relocs -mexplicit-relocs=release -mcheck-zero-division -mno-check-zero-division -mdivide-traps -mdivide-breaks -mload-store-pairs -mno-load-store-pairs -mstrict-align -mno-strict-align -mno-unaligned-access -munaligned-access -mmemcpy -mno-memcpy -mlong-calls -mno-long-calls -mmad -mno-mad -mimadd -mno-imadd -mfused-madd -mno-fused-madd -nocpp -mfix-24k -mno-fix-24k -mfix-r4000 -mno-fix-r4000 -mfix-r4400 -mno-fix-r4400 -mfix-r5900 -mno-fix-r5900 -mfix-r10000 -mno-fix-r10000 -mfix-rm7000 -mno-fix-rm7000 -mfix-vr4120 -mno-fix-vr4120 -mfix-vr4130 -mno-fix-vr4130 -mfix-sb1 -mno-fix-sb1 -mflush-func=func -mno-flush-func -mbranch-cost=num -mbranch-likely -mno-branch-likely -mcompact-branches=policy -mfp-exceptions -mno-fp-exceptions -mvr4130-align -mno-vr4130-align -msynci -mno-synci -mlxc1-sxc1 -mno-lxc1-sxc1 -mmadd4 -mno-madd4 -mrelax-pic-calls -mno-relax-pic-calls -mmcount-ra-address -mframe-header-opt -mno-frame-header-opt.Sp گزینههای MMIX (گزینههای MMIX) -mlibfuncs -mno-libfuncs -mepsilon -mno-epsilon -mabi=gnu -mabi=mmixware -mzero-extend -mknuthdiv -mtoplevel-symbols -melf -mbranch-predict -mno-branch-predict -mbase-addresses -mno-base-addresses -msingle-exit -mno-single-exit
گزینههای MN10300 (گزینههای MN10300) -mmult-bug -mno-mult-bug -mno-am33 -mam33 -mam33-2 -mam34 -mtune=cpu-type -mreturn-pointer-on-d0 -mno-crt0 -mrelax -mliw -msetlb
گزینههای Moxie (گزینههای Moxie) -meb -mel -mmul.x -mno-crt0
گزینههای MSP430 (گزینههای MSP430) -msim -masm-hex -mmcu= -mcpu= -mlarge -msmall -mrelax -mwarn-mcu -mcode-region= -mdata-region= -msilicon-errata= -msilicon-errata-warn= -mhwmult= -minrt -mtiny-printf -mmax-inline-shift=
گزینههای NDS32 (گزینههای NDS32) -mbig-endian -mlittle-endian -mreduced-regs -mfull-regs -mcmov -mno-cmov -mext-perf -mno-ext-perf -mext-perf2 -mno-ext-perf2 -mext-string -mno-ext-string -mv3push -mno-v3push -m16bit -mno-16bit -misr-vector-size=num -mcache-block-size=num -march=arch -mcmodel=code-model -mctor-dtor -mrelax
گزینههای Nvidia PTX (گزینههای Nvidia PTX) -m64 -mmainkernel -moptimize
گزینههای OpenRISC (گزینههای OpenRISC) -mboard=name -mnewlib -mhard-mul -mhard-div -msoft-mul -msoft-div -msoft-float -mhard-float -mdouble-float -munordered-float -mcmov -mror -mrori -msext -msfimm -mshftimm -mcmodel=code-model
گزینههای PDP-11 (گزینههای PDP-11) -mfpu -msoft-float -mac0 -mno-ac0 -m40 -m45 -m10 -mint32 -mno-int16 -mint16 -mno-int32 -msplit -munix-asm -mdec-asm -mgnu-asm -mlra
گزینههای PowerPC گزینههای RS/6000 و PowerPC را ببینید.
گزینههای PRU (گزینههای PRU) -mmcu=mcu -minrt -mno-relax -mloop -mabi=variant
گزینههای RISC-V (گزینههای RISC-V) -mbranch-cost=N-instruction -mplt -mno-plt -mabi=ABI-string -mfdiv -mno-fdiv -mfence-tso -mno-fence-tso -mdiv -mno-div -misa-spec=ISA-spec-string -march=ISA-string -mtune=processor-string -mpreferred-stack-boundary=num -msmall-data-limit=N-bytes -msave-restore -mno-save-restore -mshorten-memrefs -mno-shorten-memrefs -mstrict-align -mno-strict-align -mcmodel=medlow -mcmodel=medany -mcmodel=large -mexplicit-relocs -mno-explicit-relocs -mrelax -mno-relax -mriscv-attribute -mno-riscv-attribute -malign-data=type -mbig-endian -mlittle-endian -mstack-protector-guard=guard -mstack-protector-guard-reg=reg -mstack-protector-guard-offset=offset -mcsr-check -mno-csr-check -mmovcc -mno-movcc -minline-atomics -mno-inline-atomics -minline-strlen -mno-inline-strlen -minline-strcmp -mno-inline-strcmp -minline-strncmp -mno-inline-strncmp -mtls-dialect=desc -mtls-dialect=trad
گزینههای RL78 (گزینههای RL78) -msim -mmul=none -mmul=g13 -mmul=g14 -mallregs -mcpu=g10 -mcpu=g13 -mcpu=g14 -mg10 -mg13 -mg14 -m64bit-doubles -m32bit-doubles -msave-mduc-in-interrupts
گزینههای RS/6000 و PowerPC (گزینههای RS/6000 و PowerPC) -mcpu=cpu-type -mtune=cpu-type -mcmodel=code-model -mpowerpc64 -maltivec -mno-altivec -mpowerpc-gpopt -mno-powerpc-gpopt -mpowerpc-gfxopt -mno-powerpc-gfxopt -mmfcrf -mno-mfcrf -mpopcntb -mno-popcntb -mpopcntd -mno-popcntd -mfprnd -mno-fprnd -mcmpb -mno-cmpb -mhard-dfp -mno-hard-dfp -mfull-toc -mminimal-toc -mno-fp-in-toc -mno-sum-in-toc -m64 -m32 -mxl-compat -mno-xl-compat -mpe -malign-power -malign-natural -msoft-float -mhard-float -mmultiple -mno-multiple -mupdate -mno-update -mavoid-indexed-addresses -mno-avoid-indexed-addresses -mfused-madd -mno-fused-madd -mbit-align -mno-bit-align -mstrict-align -mno-strict-align -mrelocatable -mno-relocatable -mrelocatable-lib -mno-relocatable-lib -mtoc -mno-toc -mlittle -mlittle-endian -mbig -mbig-endian -mdynamic-no-pic -mswdiv -msingle-pic-base -mprioritize-restricted-insns=priority -msched-costly-dep=dependence_type -minsert-sched-nops=scheme -mcall-aixdesc -mcall-eabi -mcall-freebsd -mcall-linux -mcall-netbsd -mcall-openbsd -mcall-sysv -mcall-sysv-eabi -mcall-sysv-noeabi -mtraceback=traceback_type -maix-struct-return -msvr4-struct-return -mabi=abi-type -msecure-plt -mbss-plt -msplit-patch-nops -mlongcall -mno-longcall -mpltseq -mno-pltseq -mblock-move-inline-limit=num -mblock-compare-inline-limit=num -mblock-compare-inline-loop-limit=num -mno-block-ops-unaligned-vsx -mstring-compare-inline-limit=num -misel -mno-isel -mvrsave -mno-vrsave -mmulhw -mno-mulhw -mdlmzb -mno-dlmzb -mprototype -mno-prototype -msim -mmvme -mads -myellowknife -memb -msdata -msdata=opt -mreadonly-in-sdata -mvxworks -G num -mrecip -mrecip=opt -mno-recip -mrecip-precision -mno-recip-precision -mveclibabi=type -mfriz -mno-friz -mpointers-to-nested-functions -mno-pointers-to-nested-functions -msave-toc-indirect -mno-save-toc-indirect -mpower8-fusion -mno-mpower8-fusion -mcrypto -mno-crypto -mhtm -mno-htm -mquad-memory -mno-quad-memory -mquad-memory-atomic -mno-quad-memory-atomic -mcompat-align-parm -mno-compat-align-parm -mfloat128 -mno-float128 -mfloat128-hardware -mno-float128-hardware -mgnu-attribute -mno-gnu-attribute -mstack-protector-guard=guard -mstack-protector-guard-reg=reg -mstack-protector-guard-offset=offset -mprefixed -mno-prefixed -mpcrel -mno-pcrel -mmma -mno-mmma -mrop-protect -mno-rop-protect -mprivileged -mno-privileged
گزینههای RX (گزینههای RX) -m64bit-doubles -m32bit-doubles -fpu -nofpu -mcpu= -mbig-endian-data -mlittle-endian-data -msmall-data -msim -mno-sim -mas100-syntax -mno-as100-syntax -mrelax -mmax-constant-size= -mint-register= -mpid -mallow-string-insns -mno-allow-string-insns -mjsr -mno-warn-multiple-fast-interrupts -msave-acc-in-interrupts
گزینههای S/390 و zSeries (گزینههای S/390 و zSeries) -mtune=cpu-type -march=cpu-type -mhard-float -msoft-float -mhard-dfp -mno-hard-dfp -mlong-double-64 -mlong-double-128 -mbackchain -mno-backchain -mpacked-stack -mno-packed-stack -msmall-exec -mno-small-exec -mmvcle -mno-mvcle -m64 -m31 -mdebug -mno-debug -mesa -mzarch -mhtm -mvx -mzvector -mtpf-trace -mno-tpf-trace -mtpf-trace-skip -mno-tpf-trace-skip -mfused-madd -mno-fused-madd -mwarn-framesize -mwarn-dynamicstack -mstack-size -mstack-guard -mhotpatch=halfwords,halfwords
گزینههای SH (گزینههای SH) -m1 -m2 -m2e -m2a-nofpu -m2a-single-only -m2a-single -m2a -m3 -m3e -m4-nofpu -m4-single-only -m4-single -m4 -m4a-nofpu -m4a-single-only -m4a-single -m4a -m4al -mb -ml -mdalign -mrelax -mbigtable -mfmovd -mrenesas -mno-renesas -mnomacsave -mieee -mno-ieee -mbitops -misize -minline-ic_invalidate -mpadstruct -mprefergot -musermode -multcost=number -mdiv=strategy -mdivsi3_libfunc=name -mfixed-range=register-range -maccumulate-outgoing-args -matomic-model=atomic-model -mbranch-cost=num -mzdcbranch -mno-zdcbranch -mcbranch-force-delay-slot -mfused-madd -mno-fused-madd -mfsca -mno-fsca -mfsrra -mno-fsrra -mpretend-cmove -mtas
گزینههای Solaris 2 (گزینههای Solaris 2) -mclear-hwcap -mno-clear-hwcap -mimpure-text -mno-impure-text -pthreads
گزینههای SPARC (گزینههای SPARC) -mcpu=cpu-type -mtune=cpu-type -mcmodel=code-model -mmemory-model=mem-model -m32 -m64 -mapp-regs -mno-app-regs -mfaster-structs -mno-faster-structs -mflat -mno-flat -mfpu -mno-fpu -mhard-float -msoft-float -mhard-quad-float -msoft-quad-float -mstack-bias -mno-stack-bias -mstd-struct-return -mno-std-struct-return -munaligned-doubles -mno-unaligned-doubles -muser-mode -mno-user-mode -mv8plus -mno-v8plus -mvis -mno-vis -mvis2 -mno-vis2 -mvis3 -mno-vis3 -mvis3b -mno-vis3b -mvis4 -mno-vis4 -mvis4b -mno-vis4b -mcbcond -mno-cbcond -mfmaf -mno-fmaf -mfsmuld -mno-fsmuld -mpopc -mno-popc -msubxc -mno-subxc -mfix-at697f -mfix-ut699 -mfix-ut700 -mfix-gr712rc
گزینههای System V (گزینههای System V) -Qy -Qn -YP,paths -Ym,dir
گزینههای V850 (گزینههای V850) -mlong-calls -mno-long-calls -mep -mno-ep -mprolog-function -mno-prolog-function -mspace -mtda=n -msda=n -mzda=n -mapp-regs -mno-app-regs -mdisable-callt -mno-disable-callt -mv850e2v3 -mv850e2 -mv850e1 -mv850es -mv850e -mv850 -mv850e3v5 -mloop -mrelax -mlong-jumps -msoft-float -mhard-float -mgcc-abi -mrh850-abi -mbig-switch.Sp گزینههای VAX (VAX Options) -munix -mgnu -md -md-float -mg -mg-float -mlra
گزینههای Visium (Visium Options) -mdebug -msim -mfpu -mno-fpu -mhard-float -msoft-float -mcpu=cpu-type -mtune=cpu-type -msv-mode -muser-mode
گزینههای VMS (VMS Options) -mvms-return-codes -mdebug-main=prefix -mmalloc64 -mpointer-size=size
گزینههای VxWorks (VxWorks Options) -mrtp -msmp -non-static -Bstatic -Bdynamic -Xbind-lazy -Xbind-now
گزینههای x86 (x86 Options) -mtune=cpu-type -march=cpu-type -mtune-ctrl=feature-list -mdump-tune-features -mno-default -mfpmath=unit -masm=dialect -mno-fancy-math-387 -mno-fp-ret-in-387 -m80387 -mhard-float -msoft-float -mno-wide-multiply -mrtd -malign-double -mpreferred-stack-boundary=num -mincoming-stack-boundary=num -mcld -mcx16 -msahf -mmovbe -mcrc32 -mmwait -mrecip -mrecip=opt -mvzeroupper -mprefer-avx128 -mprefer-vector-width=opt -mpartial-vector-fp-math -mmove-max=bits -mstore-max=bits -mnoreturn-no-callee-saved-registers -mmmx -msse -msse2 -msse3 -mssse3 -msse4.1 -msse4.2 -msse4 -mavx -mavx2 -mavx512f -mavx512cd -mavx512vl -mavx512bw -mavx512dq -mavx512ifma -mavx512vbmi -msha -maes -mpclmul -mfsgsbase -mrdrnd -mf16c -mfma -mpconfig -mwbnoinvd -mptwrite -mclflushopt -mclwb -mxsavec -mxsaves -msse4a -m3dnow -m3dnowa -mpopcnt -mabm -mbmi -mtbm -mfma4 -mxop -madx -mlzcnt -mbmi2 -mfxsr -mxsave -mxsaveopt -mrtm -mhle -mlwp -mmwaitx -mclzero -mpku -mthreads -mgfni -mvaes -mwaitpkg -mshstk -mmanual-endbr -mcet-switch -mforce-indirect-call -mavx512vbmi2 -mavx512bf16 -menqcmd -mvpclmulqdq -mavx512bitalg -mmovdiri -mmovdir64b -mavx512vpopcntdq -mavx512vnni -mprfchw -mrdpid -mrdseed -msgx -mavx512vp2intersect -mserialize -mtsxldtrk -mamx-tile -mamx-int8 -mamx-bf16 -muintr -mhreset -mavxvnni -mamx-fp8 -mavx512fp16 -mavxifma -mavxvnniint8 -mavxneconvert -mcmpccxadd -mamx-fp16 -mprefetchi -mraoint -mamx-complex -mavxvnniint16 -msm3 -msha512 -msm4 -mapxf -musermsr -mavx10.1 -mavx10.1-256 -mavx10.1-512 -mevex512 -mavx10.2 -mamx-avx512 -mamx-tf32 -mamx-transpose -mmovrs -mamx-movrs -mcldemote -mms-bitfields -mno-align-stringops -minline-all-stringops -minline-stringops-dynamically -mstringop-strategy=alg -mkl -mwidekl -mmemcpy-strategy=strategy -mmemset-strategy=strategy -mpush-args -maccumulate-outgoing-args -m128bit-long-double -m96bit-long-double -mlong-double-64 -mlong-double-80 -mlong-double-128 -mregparm=num -msseregparm -mveclibabi=type -mvect8-ret-in-mem -mpc32 -mpc64 -mpc80 -mdaz-ftz -mstackrealign -momit-leaf-frame-pointer -mno-red-zone -mno-tls-direct-seg-refs -mcmodel=code-model -mabi=name -maddress-mode=mode -m32 -m64 -mx32 -m16 -miamcu -mlarge-data-threshold=num -msse2avx -mfentry -mrecord-mcount -mnop-mcount -m8bit-idiv -minstrument-return=type -mfentry-name=name -mfentry-section=name -mavx256-split-unaligned-load -mavx256-split-unaligned-store -malign-data=type -mstack-protector-guard=guard -mstack-protector-guard-reg=reg -mstack-protector-guard-offset=offset -mstack-protector-guard-symbol=symbol -mgeneral-regs-only -mcall-ms2sysv-xlogues -mrelax-cmpxchg-loop -mindirect-branch=choice -mfunction-return=choice -mindirect-branch-register -mharden-sls=choice -mindirect-branch-cs-prefix -mneeded -mno-direct-extern-access -munroll-only-small-loops -mlam=choice
گزینههای ویندوز x86 گزینههای 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
- فایل سرآیند (header) زبانهای C، ++C، Objective-C یا ++Objective-C که قرار است به یک سرآیند پیشکامپایلشده (پیشفرض) تبدیل شود، یا فایل سرآیند C یا ++C که قرار است به یک مشخصه Ada (از طریق سوئیچ -fdump-ada-spec) تبدیل گردد.
- file.cc
- file.cp
- file.cxx
- file.cpp
- file.CPP
- file.c++
- file.C
- کد منبع ++C که باید پیشپردازش شود. توجه داشته باشید که در .cxx، دو حرف پایانی باید دقیقاً حرف کوچک x باشند. به همین ترتیب، .C دقیقاً به حرف بزرگ C اشاره دارد.
- file.mm
- file.M
- کد منبع ++Objective-C که باید پیشپردازش شود.
- file.mii
- کد منبع ++Objective-C که نباید پیشپردازش شود.
- file.hh
- file.H
- file.hp
- file.hxx
- file.hpp
- file.HPP
- file.h++
- file.tcc
- فایل سرآیند ++C که قرار است به یک سرآیند پیشکامپایلشده یا مشخصه Ada تبدیل شود.
- file.f
- file.for
- file.ftn
- file.fi
- کد منبع Fortran با قالب ثابت (fixed form) که نباید پیشپردازش شود.
- file.F
- file.FOR
- file.fpp
- file.FPP
- file.FTN
- کد منبع Fortran با قالب ثابت (fixed form) که باید پیشپردازش شود (با پیشپردازنده سنتی).
- file.f90
- file.f95
- file.f03
- file.f08
- file.fii
- کد منبع Fortran با قالب آزاد (free form) که نباید پیشپردازش شود.
- file.F90
- file.F95
- file.F03
- file.F08
- کد منبع Fortran با قالب آزاد (free form) که باید پیشپردازش شود (با پیشپردازنده سنتی).
- file.cob
- file.COB
- file.cbl
- file.CBL
- کد منبع COBOL.
- file.go
- کد منبع Go.
- file.d
- کد منبع D.
- file.di
- فایل رابط (interface) زبان D.
- file.dd
- کد مستندسازی زبان Ddoc) D).
- file.ads
- فایل کد منبع Ada که شامل اعلان یک واحد کتابخانهای است (اعلان یک بسته، زیربرنامه یا generic، و یا نمونهسازی یک generic)، و یا اعلان تغییر نام یک واحد کتابخانهای (اعلان تغییر نام یک بسته، generic یا زیربرنامه). این فایلها specs (مشخصات) نیز نامیده میشوند.
- file.adb
- فایل کد منبع Ada شامل بدنه یک واحد کتابخانهای (بدنه یک زیربرنامه یا بسته). این فایلها bodies (بدنهها) نیز نامیده میشوند.
- file.s
- کد اسمبلر..IP file.S 4
- file.sx
- کد اسمبلی که باید پیشپردازش شود.
- other
- یک فایل شیء که مستقیماً وارد مرحله پیوند میشود. با هر نام فایلی که پسوند شناختهشدهای نداشته باشد، به این صورت رفتار میشود.
میتوانید زبان ورودی را بهصورت صریح با گزینه -x مشخص کنید:
- -x language
- زبان (language) را
بهطور
صریح برای
فایلهای
ورودی پس از
آن مشخص
میکند (به
جای اینکه
به
کامپایلر
اجازه دهد
بر اساس
پسوند نام
فایل یک
پیشفرض را
انتخاب
کند). این
گزینه بر
همه
فایلهای
ورودی پس از
آن تا گزینه
بعدی -x
اعمال
میشود.
مقادیر
ممکن برای
language عبارتند
از:
c c-header cpp-output c++ c++-header c++-system-header c++-user-header c++-cpp-output objective-c objective-c-header objective-c-cpp-output objective-c++ objective-c++-header objective-c++-cpp-output assembler assembler-with-cpp ada cobol d f77 f77-cpp-input f95 f95-cpp-input go
توجه داشته باشید که -x به معنای یک استاندارد زبان خاص نیست. به عنوان مثال، -x f77 ممکن است برای برخی کدهای منبع قدیمیتر به -std=legacy نیز نیاز داشته باشد.
- -x none
- هرگونه تعیین زبان را غیرفعال میکند، به طوری که با فایلهای پس از آن بر اساس پسوند نام فایل خود رفتار میشود (درست مانند حالتی که -x اصلاً استفاده نشده باشد).
اگر فقط برخی از مراحل کامپایل را میخواهید، میتوانید از -x (یا پسوندهای نام فایل) استفاده کنید تا به gcc بگویید از کجا شروع کند، و از یکی از گزینههای -c، -S یا -E برای تعیین محل توقف gcc بهره بگیرید. توجه داشته باشید که برخی ترکیبها (برای مثال، -x cpp-output -E) به gcc دستور میدهند که اصلاً هیچ کاری انجام ندهد.
- -c
- فایلهای
منبع را
کامپایل یا
اسمبل
میکند،
اما پیوند
نمیزند.
مرحله
پیوند
اصلاً
انجام
نمیشود.
خروجی
نهایی به
شکل یک فایل
شیء برای هر
فایل منبع
خواهد بود.
بهطور پیشفرض، نام فایل شیء برای یک فایل منبع با جایگزین کردن پسوند .c، .i، .s و غیره با .o ساخته میشود.
فایلهای ورودی ناشناخته که به کامپایل یا اسمبل نیازی ندارند، نادیده گرفته میشوند.
- -S
- پس از مرحله
کامپایل
اصلی متوقف
میشود؛
عملیات
اسمبل را
انجام
نمیدهد.
خروجی به
شکل یک فایل
کد اسمبلی
برای هر
فایل
ورودیِ
مشخصشدهٔ
غیر اسمبلی
خواهد بود.
بهطور پیشفرض، نام فایل اسمبلی برای یک فایل منبع با جایگزین کردن پسوند .c، .i و غیره با .s ساخته میشود.
فایلهای ورودی که نیازی به کامپایل ندارند نادیده گرفته میشوند.
- -E
- پس از مرحله
پیشپردازش
متوقف
میشود؛
کامپایلر
اصلی را
اجرا
نمیکند.
خروجی به
شکل کد منبع
پیشپردازششده
است که به
خروجی
استاندارد
فرستاده
میشود.
فایلهای ورودی که نیازی به پیشپردازش ندارند نادیده گرفته میشوند.
- -o file
- خروجی اصلی
را در فایل
file قرار
میدهد. این
موضوع برای
هر نوع
خروجی
تولیدشده
اعمال
میشود،
خواه یک
فایل
اجرایی
باشد، یک
فایل شیء،
یک فایل
اسمبلی، یا
کد سی
پیشپردازششده.
اگر -o مشخص نشود، پیشفرض این است که فایل اجرایی در a.out، فایل شیء برای source.suffix در source.o، فایل اسمبلی آن در source.s، فایل سرآیند پیشکامپایلشده در source.suffix.gch، و تمام کدهای منبع سی پیشپردازششده در خروجی استاندارد قرار گیرند.
اگرچه -o فقط خروجی اصلی را نامگذاری میکند، اما بر نامگذاری خروجیهای کمکی و رونوشت نیز تأثیر میگذارد. مثالهای زیر را ببینید. مگر در صورت بازنویسی، هر دو خروجی کمکی و رونوشت در همان دایرکتوری خروجی اصلی قرار میگیرند. در خروجیهای کمکی، پسوند فایل ورودی با پسوند نوع فایل خروجی کمکی جایگزین میشود؛ در خروجیهای رونوشت، پسوند فایل رونوشت به پسوند فایل ورودی اضافه میگردد. در دستورهای کامپایل، نام پایهٔ هر دو خروجی کمکی و رونوشت همان نام پایه خروجی اصلی است؛ در دستورهای کامپایل و پیوند، نام خروجی اصلی، منهای پسوند اجرایی، با نام فایل ورودی ترکیب میشود. اگر هر دو، بدون در نظر گرفتن پسوند، نام پایه یکسانی داشته باشند، حاصل ترکیب همان نام پایه خواهد بود، در غیر این صورت، با خط تیره به هم متصل میشوند.
gcc -c foo.c ...
از foo.o به عنوان خروجی اصلی استفاده میکند و خروجیهای کمکی و رونوشت را در کنار آن قرار میدهد، مانند فایل کمکی foo.dwo برای -gsplit-dwarf و فایل رونوشت foo.c.???r.final برای -fdump-rtl-final.
اگر یک فایل خروجیِ غیرپیونددهنده بهطور صریح مشخص شود، فایلهای کمکی و رونوشت بهطور پیشفرض همان نام پایه را میگیرند:
gcc -c foo.c -o dir/foobar.o ...
خروجیهای کمکی را به صورت dir/foobar.* و خروجیهای رونوشت را به صورت dir/foobar.c.* نامگذاری خواهد کرد.
یک خروجی پیونددهنده در عوض به عنوان پیشوند خروجیهای کمکی و رونوشت قرار میگیرد:
gcc foo.c bar.c -o dir/foobar ...
عموماً خروجیهای کمکی را dir/foobar-foo.* و dir/foobar-bar.*، و خروجیهای رونوشت را dir/foobar-foo.c.* و dir/foobar-bar.c.* نامگذاری میکند.
تنها استثنا بر موارد بالا زمانی است که فایل اجرایی نام پایهای مشترک با تک فایل ورودی داشته باشد:
gcc foo.c -o dir/foo ...
که در این حالت خروجیهای کمکی dir/foo.* و خروجیهای رونوشت dir/foo.c.* نامگذاری میشوند.
محل و نامهای خروجیهای کمکی و رونوشت را میتوان با گزینههای -dumpbase، -dumpbase-ext، -dumpdir، -save-temps=cwd و -save-temps=obj تنظیم کرد.
- -dumpbase dumpbase
- این گزینه
نام پایه را
برای
فایلهای
خروجی کمکی
و رونوشت
تعیین
میکند. این
گزینه بر
نام فایل
خروجی اصلی
تأثیری
ندارد.
خروجیهای
میانی،
هنگامی که
حفظ
میشوند،
به عنوان
خروجیهای
اصلی در نظر
گرفته
نمیشوند،
بلکه به
عنوان
خروجیهای
کمکی تلقی
میگردند:
gcc -save-temps -S foo.c
فایل پیشپردازششدهٔ (دیگر غیر) موقت را در foo.i ذخیره میکند و سپس آن را به فایل خروجی (ضمنی) foo.s کامپایل میکند، در حالی که:
gcc -save-temps -dumpbase save-foo -c foo.c
عملیات پیشپردازش را در save-foo.i انجام میدهد، به save-foo.s کامپایل میکند (که اکنون یک خروجی میانی و در نتیجه کمکی است)، و سپس به فایل خروجی (ضمنی) foo.o اسمبل مینماید.
در نبود این گزینه، فایلهای رونوشت و کمکی نام خود را از فایل ورودی یا از فایل خروجی (غیرپیونددهنده) در صورت تعیین صریح میگیرند: فایلهای خروجی رونوشت (مثلاً مواردی که توسط گزینههای -fdump-* درخواست میشوند) همراه با پسوند نام ورودی، و فایلهای خروجی کمکی (آنهایی که توسط سایر گزینههای غیررونوشت درخواست میشوند، مانند "-save-temps"، "-gsplit-dwarf"، "-fcallgraph-info") بدون آن.
تفکیک پسوند مشابه برای خروجیهای رونوشت و کمکی را میتوان برای -dumpbase basename.suf که بهطور صریح داده شده است، با مشخص کردن -dumpbase-ext .suf نیز به دست آورد.
اگر dumpbase بهطور صریح همراه با هر مؤلفهٔ دایرکتوری مشخص شود، هرگونه تعیین dumppfx (مانند -dumpdir یا -save-temps=*) نادیده گرفته میشود، و به جای الحاق به آن، dumpbase بهطور کامل آن را بازنویسی میکند: gcc foo.c -c -o dir/foo.o -dumpbase alt/foo \ -dumpdir pfx- -save-temps=cwd ...
خروجیهای کمکی و dump را به نام alt/foo.* ایجاد میکند، و dir/ در -o، پیشوند ./ ناشی از -save-temps=cwd، و pfx- در -dumpdir را نادیده میگیرد.
هنگامی که -dumpbase در دستوری مشخص شود که چندین ورودی را کامپایل میکند، یا کامپایل کرده و سپس پیوند میدهد، ممکن است همانطور که در توضیحات -dumpdir آمده است با dumppfx ترکیب شود. آنگاه، هر فایل ورودی با استفاده از dumppfx ترکیبشده کامپایل میشود و مقادیر پیشفرض برای dumpbase و auxdropsuf برای هر فایل ورودی محاسبه میگردد:
gcc foo.c bar.c -c -dumpbase main ...
فایلهای foo.o و bar.o را به عنوان خروجیهای اصلی ایجاد کرده و با استفاده از dumpbase به عنوان پیشوند، از رونویسی خروجیهای کمکی و dump جلوگیری میکند و خروجیهای کمکی و dump را با نامهای main-foo.* و main-bar.* میسازد.
تعیین یک رشتهی خالی به عنوان dumpbase از تأثیر نام پایهی خروجی بر نامگذاری خروجیهای کمکی و dump در طول کامپایل جلوگیری کرده و مقادیر پیشفرض را محاسبه میکند:
gcc -c foo.c -o dir/foobar.o -dumpbase " ...
خروجیهای کمکی را dir/foo.* و خروجیهای dump را dir/foo.c.* نامگذاری خواهد کرد. توجه کنید که چگونه نامهای پایهی آنها از نام ورودی گرفته شده، اما دایرکتوری همچنان بهطور پیشفرض همان دایرکتوری خروجی است.
رشتهی خالی dumpbase مانع از استفاده از نام پایهی خروجی برای فایلهای حاصل از مرحلهی پیوند نمیشود:
gcc foo.c bar.c -o dir/foobar -dumpbase " -flto ...
کامپایل فایلهای منبع، خروجیهای کمکی را به نام dir/foo.* و dir/bar.*، و خروجیهای dump را به نام dir/foo.c.* و dir/bar.c.* نامگذاری میکند. کامپایل مجدد LTO در طول پیوند از dir/foobar. به عنوان پیشوند فایلهای dump و کمکی استفاده خواهد کرد.
- -dumpbase-ext auxdropsuf
- هنگام
شکلدهی
نام فایل
خروجی کمکی
(اما نه
خروجی dump)،
پسوند
انتهایی auxdropsuf
را پیش از
افزودن هر
پسوند
دیگری، از
dumpbase حذف
میکند. در
صورت عدم
تعیین، این
گزینه
بهطور
پیشفرض
برابر با
پسوند dumpbase
پیشفرض
خواهد بود؛
یعنی پسوند
فایل ورودی
هنگامی که
-dumpbase در خط
فرمان مشخص
نشده باشد،
یا زمانی که
dumpbase با dumppfx
ترکیب شده
باشد.
gcc foo.c -c -o dir/foo.o -dumpbase x-foo.c -dumpbase-ext .c ...
فایل dir/foo.o را به عنوان خروجی اصلی ایجاد کرده و خروجیهای کمکی را با در نظر گرفتن مکان خروجی اصلی و حذف پسوند .c از dumpbase، در dir/x-foo.* تولید میکند. خروجیهای dump پسوند را حفظ میکنند: dir/x-foo.c.*.
اگر این گزینه با پسوند dumpbase مشخصشده مطابقت نداشته باشد نادیده گرفته میشود، مگر به عنوان جایگزینی برای پسوند فایل اجرایی هنگام الحاق نام پایهی خروجی پیونددهنده به dumppfx، همانطور که در ادامه مشخص شده است:
gcc foo.c bar.c -o main.out -dumpbase-ext .out ...
فایل main.out را به عنوان خروجی اصلی ایجاد میکند، و با استفاده از نام فایل اجرایی منهای auxdropsuf به عنوان پیشوند، از رونویسی خروجیهای کمکی و dump جلوگیری کرده و خروجیهای کمکی به نامهای main-foo.* و main-bar.* و خروجیهای dump به نامهای main-foo.c.* و main-bar.c.* ایجاد میکند.
- -dumpdir dumppfx
- هنگام
شکلدهی
نام یک فایل
خروجی کمکی
یا dump، از dumppfx
به عنوان
پیشوند
استفاده
میکند:
gcc -dumpdir pfx- -c foo.c ...
فایل foo.o را به عنوان خروجی اصلی، و خروجیهای کمکی را به نام pfx-foo.* ایجاد میکند؛ با ترکیب dumppfx دادهشده با dumpbase پیشفرضی که از خروجی اصلی پیشفرض مشتق شده و آن هم به نوبه خود از نام ورودی گرفته شده است. خروجیهای dump پسوند نام ورودی را نیز دریافت میکنند: pfx-foo.c.*.
اگر قرار است از dumppfx به عنوان نام دایرکتوری استفاده شود، باید به یک جداکنندهی دایرکتوری ختم شود:
gcc -dumpdir dir/ -c foo.c -o obj/bar.o ...
فایل obj/bar.o را به عنوان خروجی اصلی، و خروجیهای کمکی را به نام dir/bar.* ایجاد میکند؛ با ترکیب dumppfx مشخصشده با dumpbase پیشفرضی که از نام خروجی اصلی گرفته شده است. خروجیهای dump پسوند نام ورودی را نیز به همراه دارند: dir/bar.c.*.
مقدار آن بهطور پیشفرض مکان فایل خروجی است، مگر اینکه فایل خروجی یک فایل خاص مانند "/dev/null" باشد. گزینههای -save-temps=cwd و -save-temps=obj این پیشفرض را لغو و بازنویسی میکنند، درست همانند گزینهی صریح -dumpdir. در صورتی که چندین گزینه از این دست داده شود، آخرین گزینه اولویت خواهد داشت:
gcc -dumpdir pfx- -c foo.c -save-temps=obj ...
فایل foo.o را در خروجی میسازد، همراه با خروجیهای کمکی به نام foo.* چرا که -save-temps=* بر مقدار dumppfx دادهشده در گزینهی پیشین -dumpdir اولویت مییابد. فرقی نمیکند که =obj مقدار پیشفرض برای -save-temps باشد، یا اینکه دایرکتوری خروجی بهطور ضمنی همان دایرکتوری جاری باشد. خروجیهای dump با نام foo.c.* ساخته میشوند.
هنگام کامپایل از چندین فایل ورودی، اگر -dumpbase مشخص شده باشد، مقدار dumpbase منهای پسوند auxdropsuf به همراه یک خط تیره به dumppfx صریح یا پیشفرض الحاق میشود (یا اگر حاوی مؤلفههای دایرکتوری باشد، جایگزین آن میشود)، به طوری که هر یک از کامپایلهای متعدد، خروجیهای کمکی و dump با نامهای متفاوتی دریافت کنند.
gcc foo.c bar.c -c -dumpdir dir/pfx- -dumpbase main ...
خروجیهای کمکی dump را در dir/pfx-main-foo.* و dir/pfx-main-bar.* ایجاد میکند، با الحاق dumpbase- به dumppfx. خروجیهای dump پسوند فایل ورودی را حفظ میکنند: به ترتیب dir/pfx-main-foo.c.* و dir/pfx-main-bar.c.*. این رفتار را با کامپایل تکورودی مقایسه کنید:
gcc foo.c -c -dumpdir dir/pfx- -dumpbase main ...
که با اعمال -dumpbase بر یک منبع واحد، یک dumpbase مجزا برای هر فایل ورودی محاسبه و الحاق نمیکند. خروجیهای کمکی و dump آن در dir/pfx-main.* قرار میگیرند.
هنگام کامپایل و سپس پیوند از چندین فایل ورودی، dumppfx پیشفرض یا صریحاً مشخصشده نیز دستخوش تبدیل dumpbase- فوق میشود (مانند کامپایل foo.c و bar.c در بالا، اما بدون -c). اگر نه -dumpdir و نه -dumpbase تعیین نشده باشند، نام پایهی خروجی پیونددهنده منهای auxdropsuf (در صورت تعیین) یا پسوند فایل اجرایی (در غیر این صورت)، به همراه یک خط تیره به dumppfx پیشفرض الحاق میگردد. با این حال توجه داشته باشید که برخلاف موارد پیشین پیوند:
gcc foo.c bar.c -dumpdir dir/pfx- -o main ...
نام خروجی main را به dumppfx الحاق نمیکند، زیرا -dumpdir به صراحت مشخص شده است. هدف این است که dumppfx صریحاً مشخصشده در صورت تمایل بتواند نام خروجی تعیینشده را به عنوان بخشی از پیشوند داشته باشد؛ فقط یک -dumpbase صریح با آن ترکیب میشود تا از نادیده گرفته شدن یک گزینهی معنادار جلوگیری به عمل آید.
هنگام کامپایل و سپس پیوند از یک فایل ورودی واحد، نام پایهی خروجی پیونددهنده تنها در صورتی مانند بالا به dumppfx پیشفرض الحاق میشود که نام پایهی مشترکی با نام فایل ورودی واحد نداشته باشد. این حالت در موارد پیوند تکورودی بالا بررسی شد، اما نه با یک -dumpdir صریح که مانع این ترکیب میشود، حتی اگر توسط -save-temps=* بازنویسی شود:
gcc foo.c -dumpdir alt/pfx- -o dir/main.exe -save-temps=cwd ...
خروجیهای کمکی به نام foo.*، و خروجیهای dump به نام foo.c.*، در دایرکتوری کاری فعلی ساخته میشوند، همانطور که نهایتاً توسط -save-temps=cwd درخواست شده است.
برای جمعبندی کلی به صورت یک جریان دادهی شهودی هرچند اندکی غیردقیق: نام خروجی اصلی به یک بخش دایرکتوری و یک بخش نام پایه تقسیم میشود؛ dumppfx بر روی بخش اول تنظیم میشود، مگر اینکه توسط -dumpdir یا -save-temps=* بازنویسی شود، و dumpbase بر روی بخش دوم تنظیم میشود، مگر اینکه توسط -dumpbase بازنویسی گردد. اگر چندین ورودی یا پیوند وجود داشته باشد، این dumpbase ممکن است با dumppfx ترکیب شده و از هر فایل ورودی گرفته شود. نام خروجیهای کمکی برای هر ورودی با ترکیب dumppfx، dumpbase منهای پسوند، و پسوند خروجی کمکی شکل میگیرد؛ خروجیهای dump تنها از این جهت تفاوت دارند که پسوند dumpbase در آنها حفظ میشود.
در خصوص خروجیهای کمکی و dump ایجادشده در طول کامپایل مجدد LTO، ترکیبی از dumppfx و dumpbase، به صورت تعیینشده یا مشتقشده از نام خروجی پیونددهنده (و نه ورودیها) ــ حتی در مواردی که این ترکیب در حالت عادی بدین شکل به کار نمیرفت ــ همراه با یک نقطهی پایانی که جایگزین خط تیرهی اضافهشده توسط کامپایلر میشود (در صورت وجود)، به عنوان یک گزینهی -dumpdir به lto-wrapper ارسال میشود؛ این برنامه به علت مداخله در پیوند، معمولاً هیچ -dumpbase یا -dumpbase-ext دریافت نمیکند و آنها را نادیده میگیرد.
هنگام اجرای زیرکامپایلرها، lto-wrapper نام مراحل LTO را به dumppfx دریافتی الحاق میکند، اطمینان حاصل میکند که حاوی یک مؤلفهی دایرکتوری باشد تا بر هرگونه -dumpdir اولویت یابد، و آن را به عنوان -dumpbase به زیرکامپایلرها ارسال مینماید..IP -v 4 چاپ دستورهای اجراشده برای اجرای مراحل کامپایل (در خروجی خطای استاندارد). همچنین شمارهٔ نسخهٔ برنامهٔ راهانداز کامپایلر، پیشپردازنده و خود کامپایلر را چاپ میکند.
- -###
- مانند -v عمل میکند، با این تفاوت که دستورها اجرا نمیشوند و آرگومانها نقلقول میشوند مگر اینکه تنها شامل نویسههای الفباییعددی یا "./-_" باشند. این گزینه برای اسکریپتهای شل جهت دریافت خط فرمانهای تولیدشده توسط راهانداز سودمند است.
- --help
- چاپ توضیحی از گزینههای خط فرمان شناختهشده برای gcc (در خروجی استاندارد). اگر گزینهٔ -v نیز مشخص شده باشد، آنگاه --help به فرایندهای گوناگون فراخوانیشده توسط gcc نیز فرستاده میشود تا آنها بتوانند گزینههای خط فرمانی را که میپذیرند نمایش دهند. اگر گزینهٔ -Wextra نیز (پیش از گزینهٔ --help) مشخص شده باشد، گزینههای خط فرمانی که فاقد مستندات هستند نیز نمایش داده میشوند.
- --target-help
- چاپ توضیحی از گزینههای خط فرمان ویژهٔ مقصد برای هر ابزار (در خروجی استاندارد). برای برخی از مقاصد ممکن است اطلاعات اضافی ویژهٔ مقصد نیز چاپ شود.
- --help={class|[^]qualifier}[,...]
- چاپ توضیحی از گزینههای خط فرمان شناختهشده برای کامپایلر که در تمام ردهها و توصیفکنندههای مشخصشده میگنجند (در خروجی استاندارد). ردههای پشتیبانیشده به شرح زیر هستند:
- optimizers
- نمایش تمام گزینههای بهینهسازی که توسط کامپایلر پشتیبانی میشوند.
- warnings
- نمایش تمام گزینههای مهارکنندهٔ پیامهای هشدار تولیدشده توسط کامپایلر.
- target
- نمایش گزینههای ویژهٔ مقصد. با این حال بر خلاف گزینهٔ --target-help، گزینههای ویژهٔ مقصد برای پیونددهنده و اسمبلر نمایش داده نمیشوند. این امر بدان دلیل است که این ابزارها در حال حاضر از نحو گسترشیافتهٔ --help= پشتیبانی نمیکنند.
- params
- نمایش مقادیر شناختهشده توسط گزینهٔ --param.
- language
- نمایش گزینههای پشتیبانیشده برای language، که در آن language نام یکی از زبانهای پشتیبانیشده در این نسخه از GCC است. اگر گزینهای توسط همهٔ زبانها پشتیبانی شود، باید ردهٔ common انتخاب شود.
- common
- نمایش گزینههایی که میان همهٔ زبانها مشترک هستند.
توصیفکنندههای پشتیبانیشده به شرح زیر هستند:
- undocumented
- نمایش تنها آن دسته از گزینههایی که فاقد مستندات هستند.
- joined
- نمایش گزینههایی که آرگومانی میپذیرند که پس از علامت مساوی در همان قطعه متن پیوسته میآید، مانند: --help=target.
- separate
- نمایش گزینههایی که آرگومانی میپذیرند که به عنوان یک کلمهٔ جداگانه پس از گزینهٔ اصلی ظاهر میشود، مانند: -o output-file.
بنابراین به عنوان مثال برای نمایش تمام سوئیچهای ویژهٔ مقصد و مستندنشده که توسط کامپایلر پشتیبانی میشوند، از این دستور استفاده کنید:
--help=target,undocumented
مفهوم یک توصیفکننده را میتوان با پیشوند قرار دادن نویسهٔ ^ معکوس کرد؛ بنابراین برای نمونه جهت نمایش تمام گزینههای هشدار دوحالتی (یعنی مواردی که یا روشن یا خاموش هستند و آرگومانی نمیپذیرند) که دارای توضیحات هستند، از این دستور استفاده کنید:
--help=warnings,^joined,^undocumented
آرگومان --help= نباید صرفاً شامل توصیفکنندههای معکوس باشد.
ترکیب چندین رده امکانپذیر است، اگرچه این کار معمولاً خروجی را چنان محدود میکند که چیزی برای نمایش باقی نمیماند. با این حال یکی از مواردی که کار میکند زمانی است که یکی از ردهها target باشد. به عنوان مثال، برای نمایش تمام گزینههای بهینهسازی ویژهٔ مقصد، از این دستور استفاده کنید:
--help=target,optimizers
گزینهٔ --help= میتواند در خط فرمان تکرار شود. هر بار استفادهٔ متوالی، ردهٔ گزینههای درخواستی خود را نمایش داده و از مواردی که پیشتر نمایش داده شدهاند صرفنظر میکند. اگر --help نیز در هر کجای خط فرمان مشخص شده باشد، بر هر گزینهٔ --help= اولویت خواهد داشت.
اگر گزینهٔ -Q پیش از گزینهٔ --help= در خط فرمان قرار گیرد، متن توضیحی نمایشدادهشده توسط --help= تغییر میکند. در این حالت به جای شرح گزینههای نمایشدادهشده، مشخص میشود که آیا گزینه فعال، غیرفعال یا روی مقدار خاصی تنظیم شده است (با این فرض که کامپایلر در نقطهای که گزینهٔ --help= استفاده شده است، از این وضعیت آگاه باشد).
در اینجا یک مثال خلاصهشده از پورت ARM برای gcc آورده شده است:
% gcc -Q -mabi=2 --help=target -c The following options are target specific: -mabi= 2 -mabort-on-noreturn [disabled] -mapcs [disabled]
خروجی نسبت به اثرات گزینههای پیشین خط فرمان حساس است؛ بنابراین به عنوان مثال میتوان پی برد که چه بهینهسازیهایی در -O2 فعال هستند با استفاده از:
-Q -O2 --help=optimizers
یا به عنوان روشی دیگر میتوانید با استفاده از دستورهای زیر بررسی کنید که چه بهینهسازیهای دوحالتی توسط -O3 فعال میشوند:
gcc -c -Q -O3 --help=optimizers > /tmp/O3-opts gcc -c -Q -O2 --help=optimizers > /tmp/O2-opts diff /tmp/O2-opts /tmp/O3-opts | grep enabled
- --version
- نمایش شمارهٔ نسخه و کپیرایتهای GCC فراخوانیشده.
- -pass-exit-codes
- به طور معمول اگر هر مرحلهای از کامپایلر یک کد بازگشتی ناموفق برگرداند، برنامهٔ gcc با کد خروج ۱ خارج میشود. اگر -pass-exit-codes را مشخص کنید، برنامهٔ gcc در عوض با بالاترین خطای عددی تولیدشده توسط هر مرحلهای که نشانگر خطا را برگردانده خارج میشود. بخشهای فرانتاند زبانهای C، C++ و Fortran در صورتی که با خطای داخلی کامپایلر روبرو شوند کد ۴ را برمیگردانند.
- -pipe
- استفاده از لولهها (pipe) به جای فایلهای موقت برای برقراری ارتباط میان مراحل گوناگون کامپایل. این قابلیت در برخی سیستمها که اسمبلر در آنها قادر به خواندن از یک لوله نیست با شکست مواجه میشود؛ اما اسمبلر GNU در این زمینه مشکلی ندارد.
- -specs=file
- پردازش file پس از آنکه کامپایلر فایل استاندارد specs را میخواند، جهت بازنویسی مقادیر پیشفرضی که برنامهٔ راهانداز gcc هنگام تعیین سوئیچهای ارسالی به cc1، cc1plus، as، ld و غیره استفاده میکند. بیش از یک -specs=file را میتوان در خط فرمان مشخص کرد، و آنها به ترتیب، از چپ به راست پردازش میشوند.
- -wrapper
- فراخوانی
تمام
زیردستورها
زیر چتر یک
برنامهٔ
لفاف (wrapper). نام
برنامهٔ
لفاف و
پارامترهای
آن به صورت
فهرستی
جداشده با
کاما ارسال
میشوند.
gcc -c t.c -wrapper gdb,--args
این کار تمام زیربرنامههای gcc را تحت gdb --args فراخوانی میکند، بنابراین فراخوانی cc1 به صورت gdb --args cc1 ... خواهد بود..IP -ffile-prefix-map=old=new 4 هنگام کامپایل فایلهای مستقر در دایرکتوری old، هرگونه ارجاع به آنها در نتیجهٔ کامپایل طوری ثبت میشود که گویی فایلها در دایرکتوری new قرار دارند. مشخص کردن این گزینه معادل مشخص کردن تمام گزینههای تکی -f*-prefix-map است. این قابلیت میتواند برای ایجاد ساختهای بازتولیدپذیر (reproducible builds) که مستقل از مکان هستند به کار رود. دایرکتوریهایی که توسط دستورالعملها ارجاع داده میشوند تحت تأثیر این گزینهها قرار نمیگیرند. همچنین گزینههای -fmacro-prefix-map، -fdebug-prefix-map، -fprofile-prefix-map و -fcanon-prefix-map را ببینید.
- -fcanon-prefix-map
- برای گزینههای -f*-prefix-map، معمولاً مقایسهٔ پیشوند old با نام فایلی که در حالت عادی در نتیجهٔ کامپایل ارجاع داده میشود با مقایسهٔ متنی پیشوندها، یا صرفنظر از بزرگی و کوچکی حروف در فایلسیستمهای حساسنبودن به حروف و برابر در نظر گرفتن اسلشها و بکاسلشها در فایلسیستمهای مبتنی بر DOS انجام میشود. گزینهٔ -fcanon-prefix-map باعث میشود این مقایسهها روی مسیرهای استانداردشدهٔ (canonicalized) old و نام فایل ارجاع دادهشده انجام شوند.
- -fplugin=name.so
- کد افزونه را در فایل name.so بارگذاری میکند؛ فرض میشود که این فایل یک شیء مشترک (shared object) است که توسط کامپایلر با dlopen باز خواهد شد. نام پایهٔ فایل شیء مشترک برای شناسایی افزونه به منظور تجزیهٔ آرگومانها استفاده میشود (گزینهٔ -fplugin-arg-name-key=value در زیر را ببینید). هر افزونه باید توابع بازخوانی (callback) مشخصشده در Plugins API را تعریف کند.
- -fplugin-arg-name-key=value
- یک آرگومان به نام key با مقدار value برای افزونهٔ name تعریف میکند.
- -fdump-ada-spec[-slim]
- برای فایلهای منبع و شمول (include) زبانهای C و C++، مشخصات (specs) متناظر در Ada را تولید میکند.
- -fada-spec-parent=unit
- در ترکیب با -fdump-ada-spec[-slim] در بالا، مشخصات Ada را به عنوان واحدهای فرزند واحد والد unit تولید میکند.
- -fdump-go-spec=file
- برای فایلهای ورودی در هر زبانی، اعلانهای متناظر در Go را در file تولید میکند. این گزینه اعلانهای "const"، "type"، "var" و "func" در Go را ایجاد میکند که میتواند روش مفیدی برای آغاز نوشتن یک واسط Go برای کدهای نوشتهشده به زبانی دیگر باشد.
- @file
- گزینههای
خط فرمان را
از file
میخواند.
گزینههای
خواندهشده
به جای
گزینهٔ
اصلی @file درج
میشوند.
اگر file وجود
نداشته
باشد، یا
خوانده
نشود، با
این گزینه
بهصورت
لفظی رفتار
شده و حذف
نمیشود.
گزینهها در file با فاصله (whitespace) جدا میشوند. میتوان یک نویسهٔ فاصله را با احاطه کردن کل گزینه در نقلقول تکی یا دوتایی در داخل گزینه گنجاند. هر نویسهای (از جمله بکاسلش) میتواند با قرار دادن یک بکاسلش در پیش از آن گنجانده شود. خود file میتواند حاوی گزینههای @file دیگری نیز باشد؛ هر یک از این گزینهها بهصورت بازگشتی پردازش خواهند شد.
کامپایل برنامههای C++ (Compiling C++ Programs)
فایلهای منبع C++ طبق قرارداد از یکی از پسوندهای .C، .cc، .cpp، .CPP، .c++، .cp، یا .cxx استفاده میکنند؛ فایلهای سرآیند 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، و گویشهای گنو از این استانداردها مانند gnu90 یا gnu++98 را بپذیرد. هنگامی که یک استاندارد پایه مشخص میشود، کامپایلر تمام برنامههای منطبق با آن استاندارد به علاوه برنامههایی را که از افزونههای گنو بدون تضاد با آن استفاده میکنند، میپذیرد. برای مثال، -std=c90 ویژگیهای خاصی از GCC را که با ISO C90 ناسازگار هستند (مانند کلیدواژههای "asm" و "typeof") غیرفعال میکند، اما سایر افزونههای گنو را که در ISO C90 معنایی ندارند (مانند حذف عبارت میانی در یک عبارت "?:") غیرفعال نمیسازد. از سوی دیگر، هنگامی که گویش گنو از یک استاندارد مشخص میشود، تمام ویژگیهای پشتیبانیشده توسط کامپایلر فعال میشوند، حتی اگر آن ویژگیها معنای استاندارد پایه را تغییر دهند. در نتیجه، ممکن است برخی از برنامههایی که انطباق دقیقی با استاندارد دارند رد شوند. استانداردِ مشخصشده توسط -Wpedantic به کار میرود تا مشخص شود چه ویژگیهایی با توجه به آن نسخه از استاندارد، افزونههای گنو به شمار میروند. برای مثال -std=gnu90 -Wpedantic درباره کامنتهای سبک C++ با // هشدار میدهد، در حالی که -std=gnu99 -Wpedantic این کار را نمیکند.
باید مقداری برای این گزینه مشخص شود؛ مقادیر ممکن عبارتند از:
- c90
- c89
- iso9899:1990
- پشتیبانی از تمام برنامههای ISO C90 (افزونههای گنو مشخصی که با ISO C90 تداخل دارند غیرفعال میشوند). معادل -ansi برای کد C.
- iso9899:199409
- استاندارد ISO C90 طبق اصلاحیه شماره ۱ (amendment 1).
- c99
- c9x
- iso9899:1999
- iso9899:199x
- استاندارد ISO C99. این استاندارد اساساً بهطور کامل پشتیبانی میشود، صرفنظر از اشکالات نرمافزاری و مسائل مربوط به ممیز شناور (عمدتاً اما نه کاملاً در رابطه با ویژگیهای اختیاری C99 از Annexes F و G). برای اطلاعات بیشتر به https://gcc.gnu.org/c99status.html مراجعه کنید. نامهای c9x و iso9899:199x منسوخ شدهاند.
- c11
- c1x
- iso9899:2011
- استاندارد ISO C11، بازنگری سال ۲۰۱۱ استاندارد ISO C. این استاندارد اساساً بهطور کامل پشتیبانی میشود، صرفنظر از اشکالات نرمافزاری، مسائل ممیز شناور (عمدتاً اما نه کاملاً مربوط به ویژگیهای اختیاری C11 از Annexes F و G) و پیوستهای اختیاری Annexes K (رابطهای بررسی محدوده) و L (تحلیلپذیری). نام c1x منسوخ شده است.
- c17
- c18
- iso9899:2017
- iso9899:2018
- استاندارد ISO C17، بازنگری سال ۲۰۱۷ استاندارد ISO C (منتشرشده در ۲۰۱۸). این استاندارد به جز اصلاح ایرادات (که تمام آنها با -std=c11 نیز اعمال میشوند) و مقدار جدیدی برای "__STDC_VERSION__"، همان C11 است و بنابراین به همان میزان C11 پشتیبانی میشود.
- c23
- c2x
- iso9899:2024
- استاندارد ISO C23، بازنگری سال ۲۰۲۳ استاندارد ISO C (منتشرشده در ۲۰۲۴). نام c2x منسوخ شده است.
- c2y
- نسخه بعدی استاندارد ISO C، که همچنان در حال توسعه است. پشتیبانی از این نسخه آزمایشی و ناکامل است.
- gnu90
- gnu89
- گویش گنو از ISO C90 (شامل برخی از ویژگیهای C99).
- gnu99
- gnu9x
- گویش گنو از ISO C99. نام gnu9x منسوخ شده است.
- gnu11
- gnu1x
- گویش گنو از ISO C11. نام gnu1x منسوخ شده است.
- gnu17
- gnu18
- گویش گنو از ISO C17.
- gnu23
- gnu2x
- گویش گنو از ISO C23. این گزینه پیشفرض برای کد C است. نام gnu2x منسوخ شده است.
- gnu2y
- نسخه بعدی استاندارد ISO C، که همچنان در حال توسعه است، به همراه افزونههای گنو. پشتیبانی از این نسخه آزمایشی و ناکامل است. نام gnu2x منسوخ شده است.
- c++98
- c++03
- استاندارد ISO C++ سال ۱۹۹۸ به همراه اصلاحیه فنی ۲۰۰۳ و برخی گزارشهای رفع نقص اضافی. معادل -ansi برای کد C++.
- gnu++98
- gnu++03
- گویش گنو از -std=c++98.
- c++11
- c++0x
- استاندارد ISO C++ سال ۲۰۱۱ به همراه اصلاحیهها. نام c++0x منسوخ شده است.
- gnu++11
- gnu++0x
- گویش گنو از -std=c++11. نام gnu++0x منسوخ شده است.
- c++14
- c++1y
- استاندارد ۲۰۱۴ ISO C++ بههمراه اصلاحیهها. نام c++1y منسوخ شده است.
- gnu++14
- gnu++1y
- لهجهٔ گنو از -std=c++14. نام gnu++1y منسوخ شده است.
- c++17
- c++1z
- استاندارد ۲۰۱۷ ISO C++ بههمراه اصلاحیهها. نام c++1z منسوخ شده است.
- gnu++17
- gnu++1z
- لهجهٔ گنو از -std=c++17. این پیشفرض برای کدهای C++ است. نام gnu++1z منسوخ شده است.
- c++20
- c++2a
- استاندارد ۲۰۲۰ ISO C++ بههمراه اصلاحیهها. پشتیبانی از این استاندارد آزمایشی است و ممکن است در نگارشهای آینده به روشهایی ناسازگار تغییر کند. نام c++2a منسوخ شده است.
- gnu++20
- gnu++2a
- لهجهٔ گنو از -std=c++20. پشتیبانی از این استاندارد آزمایشی است و ممکن است در نگارشهای آینده به روشهایی ناسازگار تغییر کند. نام gnu++2a منسوخ شده است.
- c++23
- c++2b
- استاندارد ۲۰۲۳ ISO C++ بههمراه اصلاحیهها (منتشر شده در ۲۰۲۴). پشتیبانی از این استاندارد آزمایشی است و ممکن است در نگارشهای آینده به روشهایی ناسازگار تغییر کند. نام c++2b منسوخ شده است.
- gnu++23
- gnu++2b
- لهجهٔ گنو از -std=c++23. پشتیبانی از این استاندارد آزمایشی است و ممکن است در نگارشهای آینده به روشهایی ناسازگار تغییر کند. نام gnu++2b منسوخ شده است.
- c++2c
- c++26
- بازنگری بعدی استاندارد ISO C++، برنامهریزیشده برای ۲۰۲۶. پشتیبانی کاملاً آزمایشی است و تقریباً به طور قطع در نگارشهای آینده به روشهایی ناسازگار تغییر خواهد کرد.
- gnu++2c
- gnu++26
- لهجهٔ گنو از -std=c++2c. پشتیبانی کاملاً آزمایشی است و تقریباً به طور قطع در نگارشهای آینده به روشهایی ناسازگار تغییر خواهد کرد.
- -aux-info filename
- اعلانهای
دارای
پیشنمونه
(prototyped) را برای
تمامی
توابع
اعلانشده
و/یا
تعریفشده
در یک واحد
ترجمه (translation unit)،
از جمله
توابع
موجود در
فایلهای
سرآیند (header)،
در
نامفایل
ارائهشده
مینویسد.
این گزینه
در هر زبانی
بهجز 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 functions)
که پیشوند
__builtin_ ندارند
را شناسایی
نمیکند.
کامپایلر GCC معمولاً کدهای ویژهای تولید میکند تا با برخی توابع توکار با کارایی بالاتری رفتار کند؛ برای نمونه، فراخوانیهای تابع "alloca" ممکن است به تکدستوراتی تبدیل شوند که مستقیماً پشته (stack) را تنظیم میکنند، و فراخوانیهای "memcpy" ممکن است به حلقههای رونوشت درونخطی تبدیل شوند. کد حاصل اغلب هم کوچکتر و هم سریعتر است، اما از آنجا که این فراخوانیها دیگر بهصورت فراخوانی تابع ظاهر نمیشوند، نمیتوانید روی آنها نقطهٔ توقف (breakpoint) تنظیم کنید، و همچنین نمیتوانید رفتار توابع را با پیوند به کتابخانهای دیگر تغییر دهید. علاوه بر این، هنگامی که یک تابع بهعنوان تابع توکار شناخته میشود، GCC ممکن است از اطلاعات آن تابع برای هشدار دادن دربارهٔ اشکالات مربوط به فراخوانیهای آن استفاده کند، یا کدی کارآمدتر تولید نماید، حتی اگر کد نهایی همچنان حاوی فراخوانیهای آن تابع باشد. برای نمونه، در صورت استفاده از -Wformat برای فراخوانیهای نامناسب به "printf" زمانی که "printf" توکار است و مشخص است که "strlen" حافظهٔ سراسری را تغییر نمیدهد، هشدار صادر میشود.
با گزینهٔ -fno-builtin-function فقط تابع توکار function غیرفعال میشود. نام function نباید با __builtin_ آغاز شود. اگر تابعی نام برده شود که در این نگارش از GCC توکار نیست، این گزینه نادیده گرفته میشود. گزینهٔ متناظر -fbuiltin-function وجود ندارد؛ چنانچه مایلید هنگام استفاده از -fno-builtin یا -ffreestanding توابع توکار را بهصورت گزینشی فعال کنید، میتوانید ماکروهایی نظیر این تعریف نمایید:
#define abs(n) __builtin_abs ((n)) #define strcpy(d, s) __builtin_strcpy ((d), (s))
- -fcond-mismatch
- به عبارتهای شرطی با نوعهای ناهمخوان در آرگومانهای دوم و سوم اجازه میدهد. مقدار چنین عبارتی void خواهد بود. این گزینه برای C++ پشتیبانی نمیشود.
- -ffreestanding
- تصریح میکند که کامپایل یک محیط مستقل (freestanding) را هدف قرار داده است. این گزینه متضمن -fno-builtin است. محیط مستقل محیطی است که ممکن است کتابخانهٔ استاندارد در آن وجود نداشته باشد، و آغاز اجرای برنامه لزوماً از "main" نباشد. بارزترین نمونه، هستهٔ سیستمعامل است. این گزینه معادل -fno-hosted است.
- -fgimple
- تجزیهٔ تعاریف توابع نشانهگذاریشده با "__GIMPLE" را فعال میکند. این یک قابلیت آزمایشی است که امکان آزمون واحد (unit test) برای مراحل و گذرهای GIMPLE را فراهم میسازد.
- -fgnu-tm
- هنگامی که
گزینهٔ -fgnu-tm
مشخص شود،
کامپایلر
برای گونهٔ
لینوکسی از
سند مشخصات
فعلی ABI
حافظه
تراکنشی
اینتل
(بازنگری
۱.۱، ۶ مه
۲۰۰۹) کد
تولید
میکند. این
یک قابلیت
آزمایشی
است که ممکن
است رابط آن
همگام با
تغییر
مشخصات
رسمی، در
نگارشهای
آیندهٔ GCC
تغییر کند.
لطفاً توجه
داشته
باشید که
این قابلیت
در همهٔ
معماریها
پشتیبانی
نمیشود.
برای اطلاعات بیشتر در مورد پشتیبانی GCC از حافظهٔ تراکنشی،
توجه داشته باشید که قابلیت حافظهٔ تراکنشی همراه با استثناهای غیرفراخوانی (-fnon-call-exceptions) پشتیبانی نمیشود..IP -fgnu89-inline 4 گزینهٔ -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
- برخی
ساختارهای
غیراستاندارد
بهکاررفته
در
فایلهای
سرایند Microsoft
را
میپذیرد.
در کد ++C، این گزینه اجازه میدهد نام اعضای ساختارها مشابه اعلانهای قبلی نوعها باشد.
typedef int UOW; struct ABC { UOW UOW; };برخی موارد فیلدهای بینام در ساختارها و اجتماعها تنها با این گزینه پذیرفته میشوند.
توجه داشته باشید که این گزینه برای تمام هدفها به جز هدفهای x86 که از ms-abi استفاده میکنند، غیرفعال است.
- -fpermitted-flt-eval-methods=style
- استاندارد
ISO/IEC TS 18661-3 مقادیر
مجاز جدیدی
برای
"FLT_EVAL_METHOD"
تعریف
میکند که
نشان
میدهند
عملیات و
مقادیر
ثابتی که
دارای یک
نوع
معناییِ
تعویضپذیر
یا قالب
گسترشیافته
هستند،
باید با دقت
و دامنهٔ آن
نوع
ارزیابی
شوند. این
مقادیر
جدید یک
ابرمجموعه
از مقادیر
مجاز تحت C99/C11
هستند، که
معنای سایر
مقادیر
مثبت
"FLT_EVAL_METHOD" را
مشخص
نمیکند. به
همین دلیل،
کدهایی که
منطبق بر C11
نوشته
شدهاند
ممکن است
بدون
پیشبینی
احتمال
وجود این
مقادیر
جدید نوشته
شده باشند.
گزینهٔ -fpermitted-flt-eval-methods مشخص میکند که آیا کامپایلر باید تنها مقادیر "FLT_EVAL_METHOD" مشخصشده در C99/C11 را بپذیرد، یا مجموعهٔ گسترشیافتهٔ مقادیر مشخصشده در ISO/IEC TS 18661-3 را.
مقدار style بسته به نیاز یکی از دو مقدار "c11" یا "ts-18661-3" است.
رفتار پیشفرض هنگام قرار داشتن در حالت منطبق با استاندارد (-std=c11 یا موارد مشابه)، -fpermitted-flt-eval-methods=c11 است. رفتار پیشفرض در گویش GNU (-std=gnu11 یا موارد مشابه) برابر با -fpermitted-flt-eval-methods=ts-18661-3 میباشد.
گزینههای -fdeps-* برای استخراج اطلاعات ساختاریافتهٔ وابستگی از یک مبدأ بهکار میروند. این کار شامل تعیین منابع ارائهشده توسط دیگر فایلهای مبدأ که برای کامپایل این مبدأ لازم است، و همچنین منابع ارائهشده توسط خود این مبدأ میباشد. این اطلاعات میتواند برای افزودن وابستگیهای لازم بین قواعد کامپایل مبدأهای وابسته بر پایهٔ محتوای آنها استفاده شود، بدون اینکه نیازی به بازتاب این اطلاعات در ابزارهای ساخت باشد.
- -fdeps-file=file
- محل نوشتن اطلاعات ساختاریافتهٔ وابستگی.
- -fdeps-format=format
- قالبی که باید برای اطلاعات ساختاریافتهٔ وابستگی استفاده شود. در حال حاضر p1689r5 تنها قالب پشتیبانیشده است. توجه داشته باشید که وقتی این آرگومان مشخص میشود، خروجی -MF از برخی اطلاعات (بهویژه ماژولهای ++C) پاکسازی میشود تا از نحو توسعهیافتهٔ makefile که توسط بیشتر ابزارها درک نمیشود، استفاده نکند.
- -fdeps-target=file
- مشابه با -MT اما برای اطلاعات ساختاریافتهٔ وابستگی. این گزینه هدفی را مشخص میکند که در نهایت به هرگونه منبعِ مورد نیاز محتاج است و هرگونه منبع استخراجشده از مبدأ را که ممکن است مورد نیاز سایر مبدأها باشد، ارائه میدهد.
- -fplan9-extensions
- برخی
ساختارهای
غیراستاندارد
بهکاررفته
در کدهای Plan 9
را
میپذیرد.
این گزینه -fms-extensions را فعال میکند، اجازه میدهد اشارهگرها به ساختارهایی با فیلدهای بینام به توابعی فرستاده شوند که انتظار اشارهگر به عناصری از نوع فیلد مذکور را دارند، و ارجاع به فیلدهای بینامِ اعلانشده با استفاده از typedef را ممکن میسازد. این گزینه تنها برای C پشتیبانی میشود و نه ++C.
- -fsigned-bitfields
- -funsigned-bitfields
- -fno-signed-bitfields
- -fno-unsigned-bitfields
- این گزینهها تعیین میکنند که آیا یک میدان بیتی (bit-field) علامتدار است یا بدون علامت، در شرایطی که در اعلان آن از هیچکدام از "signed" یا "unsigned" استفاده نشده باشد. بهطور پیشفرض، چنین میدان بیتی علامتدار است، زیرا این حالت سازگارتر است: انواع دادههای صحیح پایه نظیر "int" از نوع علامتدار هستند.
- -fsigned-char
- نوع "char"
را مانند
"signed char"
علامتدار
در نظر
میگیرد.
توجه داشته باشید که این گزینه معادل با -fno-unsigned-char است که صورت نقیض -funsigned-char میباشد. بههمینصورت، گزینهٔ -fno-signed-char معادل با -funsigned-char است.
- -funsigned-char
- نوع "char"
را مانند
"unsigned char"
بدون علامت
در نظر
میگیرد.
هر نوع ماشینی یک رفتار پیشفرض برای آنچه "char" باید باشد دارد. این نوع بهطور پیشفرض یا مانند "unsigned char" است یا مانند "signed char".
در حالت آرمانی، یک برنامهٔ قابلحمل اگر به علامتدار بودن یک شیء وابسته باشد باید همیشه از "signed char" یا "unsigned char" استفاده کند. اما برنامههای بسیاری با استفاده از "char" ساده نوشته شدهاند و بسته به ماشینی که برای آن توسعه یافتهاند، انتظار دارند علامتدار یا بدون علامت باشد. این گزینه، و معکوس آن، به شما اجازه میدهند چنین برنامهای را با رفتار پیشفرضِ معکوس به کار بیندازید.
نوع "char" همواره نوعی متمایز از هر یک از "signed char" یا "unsigned char" است، هرچند رفتار آن همواره دقیقاً شبیه یکی از این دو میباشد.
- -fstrict-flex-arrays (تنها C و ++C)
- -fstrict-flex-arrays=level (تنها C و ++C)
- کنترل
میکند که
چه زمانی
آرایهٔ
انتهاییِ
یک ساختار
به منظور
دسترسی به
عناصر آن
آرایه به
عنوان عضو
آرایهٔ
انعطافپذیر
(flexible array member) در نظر
گرفته شود.
مقدار level
سطح
سختگیری
را کنترل
میکند.
گزینهٔ -fstrict-flex-arrays معادل با -fstrict-flex-arrays=3 است که سختگیرانهترین حالت میباشد؛ آرایهٔ انتهایی تنها زمانی به عنوان عضو آرایهٔ انعطافپذیر تلقی میشود که مطابق استاندارد C99 به بعد به عنوان عضو آرایهٔ انعطافپذیر اعلان شده باشد.
صورت نقیض -fno-strict-flex-arrays معادل با -fstrict-flex-arrays=0 است که کمترین سختگیری را دارد. در این حالت تمام آرایههای انتهایی ساختارها به عنوان اعضای آرایهٔ انعطافپذیر در نظر گرفته میشوند.
دو سطح دیگر بین 0 و 3 وجود دارد که برای پشتیبانی از کدهای قدیمیتر که از افزونهٔ GCC برای آرایههای با طول صفر ([0]) یا آرایههای تکعنصری به عنوان اعضای آرایهٔ انعطافپذیر ([1]) استفاده میکردند، ارائه شده است. هنگامی که level برابر 1 باشد، آرایهٔ انتهایی در صورتی به عنوان عضو آرایهٔ انعطافپذیر در نظر گرفته میشود که به صورت []، [0]، یا [1] اعلان شده باشد. هنگامی که level برابر 2 باشد، آرایهٔ انتهایی در صورتی به عنوان عضو آرایهٔ انعطافپذیر در نظر گرفته میشود که به صورت [] یا [0] اعلان شده باشد.
میتوانید این رفتار را برای یک فیلد آرایهٔ انتهایی خاص از یک ساختار با استفاده از صفت متغیر "strict_flex_array" کنترل کنید.
گزینهٔ -fstrict_flex_arrays با گزینهٔ -Wstrict-flex-arrays برهمکنش دارد.
- -fsso-struct=endianness
- ترتیب
ذخیرهسازی
اسکالر
پیشفرض
برای
ساختارها و
اجتماعها
را روی
ترتیب بایت
(endianness)
مشخصشده
تنظیم
میکند.
مقادیر
پذیرفتهشده
عبارتند از
big-endian، little-endian و native
برای ترتیب
بایتِ بومی
هدف
(پیشفرض).
این گزینه
برای ++C
پشتیبانی
نمیشود.
هشدار: سوئیچ -fsso-struct باعث میشود در صورتی که ترتیب بایتِ مشخصشده با ترتیب بایت بومیِ هدف یکسان نباشد، GCC کدی تولید کند که از نظر دودویی با کد تولیدشده بدون این گزینه سازگار نیست..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 در نسخههای مختلف G++ همگام با رفع اشکالات ABI تغییر خواهد کرد.
نسخهٔ 1 نسخهای از C++ ABI است که نخستینبار در G++ 3.2 ظاهر شد.
نسخهٔ 2 نسخهای از C++ ABI است که نخستینبار در G++ 3.4 معرفی شد و تا G++ 4.9 حالت پیشفرض بود.
نسخهٔ 3 خطایی را در درهمسازی نام (mangling) یک نشانی ثابت بهعنوان یک آرگومان الگو (template argument) تصحیح میکند.
نسخهٔ 4، که نخستینبار در G++ 4.5 ارائه شد، یک mangling استاندارد را برای انواع برداری (vector types) پیادهسازی میکند.
نسخهٔ 5، که نخستینبار در G++ 4.6 ظاهر شد، mangling مشخصههای const/volatile را روی انواع اشارهگر به تابع، decltype یک اعلان ساده (plain decl)، و استفاده از یک پارامتر تابع در اعلان پارامتری دیگر را تصحیح میکند.
نسخهٔ 6، که نخستینبار در G++ 4.7 ارائه شد، رفتار ارتقای (promotion) نوعهای شمارشی محدودهدار (scoped enums) در C++11 و mangling بستههای آرگومان الگو (template argument packs)، عملگرهای const/static_cast، پیشوندهای ++ و --، و تابعی با حوزهٔ کلاس که بهعنوان آرگومان الگو استفاده شده است را تصحیح میکند.
نسخهٔ 7، که نخستینبار در G++ 4.8 ظاهر شد، با nullptr_t بهعنوان یک نوع توکار رفتار میکند و mangling توابع لامبدا را در حوزهٔ آرگومان پیشفرض تصحیح میکند.
نسخهٔ 8، که نخستینبار در G++ 4.9 ارائه شد، رفتار جایگزینی (substitution) انواع توابع دارای function-cv-qualifiers را تصحیح میکند.
نسخهٔ 9، که نخستینبار در G++ 5.2 معرفی شد، تراز (alignment) را برای "nullptr_t" تصحیح میکند.
نسخهٔ 10، که نخستینبار در G++ 6.1 ظاهر شد، mangling مشخصههای تأثیرگذار بر هویت نوع، مانند مشخصههای قرارداد فراخوانی ia32 (مانند stdcall) را اضافه میکند.
نسخهٔ 11، که نخستینبار در G++ 7 معرفی شد، mangling عبارتهای ...sizeof و نامهای عملگرها را تصحیح میکند. برای موجودیتهای چندگانه با نام یکسان درون یک تابع که در حوزههای مختلفی اعلان شدهاند، mangling اکنون از رخداد دوازدهم به بعد تغییر میکند. این گزینه همچنین -fnew-inheriting-ctors را نیز در بر دارد.
نسخهٔ 12، که نخستینبار در G++ 8 ظاهر شد، قراردادهای فراخوانی (calling conventions) را برای کلاسهای تهی روی معماری مقصد x86_64 و برای کلاسهایی که فقط سازندههای کپی/انتقال حذفشده دارند، تصحیح میکند. این نسخه بهطور ناخواسته قرارداد فراخوانی را برای کلاسهای دارای یک سازندهٔ کپی حذفشده و یک سازندهٔ انتقال ساده (trivial) تغییر میدهد.
نسخهٔ 13، که نخستینبار در G++ 8.2 ارائه شد، تغییر ناخواسته در نسخهٔ 12 را رفع میکند.
نسخهٔ 14، که نخستینبار در G++ 10 معرفی شد، mangling عبارت nullptr را تصحیح میکند.
نسخهٔ 15، که نخستینبار در G++ 10.3 ظاهر شد، پسرفت (regression) برچسب ABI در G++ 10 را تصحیح میکند.
نسخهٔ 16، که نخستینبار در G++ 11 ارائه شد، mangling مربوط به "__alignof__" را متمایز از "alignof" میکند و mangling نام عملگرهای وابسته را نیز تغییر میدهد.
نسخهٔ 17، که نخستینبار در G++ 12 معرفی شد، ساختار چیدمان (layout) کلاسهایی را که از کلاسهای تجمعی (aggregate classes) با مقداردهی اولیهسازهای پیشفرض عضو در C++14 به بالا ارثبری میکنند، اصلاح میکند.
نسخهٔ 18، که نخستینبار در G++ 13 ظاهر شد، mangling لامبداهایی را که زمینهٔ (context) اضافی دارند، تصحیح میکند.
نسخهٔ 19، که نخستینبار در G++ 14 معرفی شد، mangling اتصالات ساختیافته (structured bindings) را جهت گنجاندن برچسبهای ABI تصحیح میکند.
نسخهٔ 20، که نخستینبار در G++ 15 ارائه شد، mangling لامبداها را در مقداردهی اولیهسازهای اعضای دادهای ایستا تصحیح میکند.
همچنین -Wabi را ببینید.
- -fabi-compat-version=n
- در
مقصدهایی
که از
نامهای
مستعار قوی
(strong aliases)
پشتیبانی
میکنند، G++
تغییرات mangling
را با ایجاد
یک نام
مستعار با
نام mangled درست
در هنگام
تعریف یک
نماد با نام
mangled نادرست
دور میزند.
این گزینه
مشخص
میکند که
از کدام
نسخهٔ ABI
برای نام
مستعار
استفاده
شود.
همراه با -fabi-version=0 (حالت پیشفرض)، مقدار این گزینه بهطور پیشفرض 13 (سازگاری با GCC 8.2) است. اگر نسخهٔ ABI دیگری بهصراحت تعیین شده باشد، مقدار پیشفرض آن 0 خواهد بود. برای سازگاری با نسخههای 3.2 تا 4.9 کامپایلر GCC، از -fabi-compat-version=2 استفاده کنید.
اگر این گزینه ارائه نشود اما -Wabi=n تنظیم شده باشد، آن نسخه برای نامهای مستعار سازگاری بهکار میرود. اگر این گزینه همراه با -Wabi (بدون ذکر شماره نسخه) استفاده شود، نسخهٔ مشخصشده توسط این گزینه برای هشدار در نظر گرفته میشود.
- -fno-access-control
- غیرفعالسازی تمامی بررسیهای سطح دسترسی. این گزینه عمدتاً برای دور زدن ایرادات و باگهای موجود در کد کنترل دسترسی کاربرد دارد.
- -faligned-new
- فعالسازی
پشتیبانی
از "new" در
C++17 برای
انواعی که
به ترازی (alignment)
بیشتر از
آنچه توسط
"void* ::operator new(std::size_t)"
فراهم
میشود
نیاز دارند.
یک آرگومان
عددی مانند
"-faligned-new=32"
میتواند
برای تعیین
میزان تراز
(به بایت)
فراهمشده
توسط آن
تابع
استفاده
شود، هرچند
کاربران
اندکی نیاز
به لغو و
جایگزینی
مقدار
پیشفرض
alignof(std::max_align_t)
خواهند
داشت.
این پرچم بهطور پیشفرض برای -std=c++17 فعال است.
- -fno-assume-sane-operators-new
- استاندارد ++C اجازه میدهد عملگرهای سراسری "new"، "new[]"، "delete" و "delete[]" جایگزین شوند، هرچند بسیاری از برنامههای ++C آنها را جایگزین نکرده و فقط از نسخهٔ ارائهشده توسط پیادهسازی استفاده میکنند. علاوهبر این، استاندارد ++C اجازه میدهد فراخوانیهای مذکور در صورتی که از عبارات new یا delete انجام شده باشند حذف گردند (و به همین صورت در مواردی که از توابع "__builtin_operator_new" یا "__builtin_operator_delete" استفاده شود نیز همین فرض برقرار است). این گزینه امکان کنترل برخی از بهینهسازیها در خصوص فراخوانی این عملگرها را فراهم میکند. با گزینهٔ "-fassume-sane-operators-new-delete" کامپایلر GCC ممکن است فرض کند فراخوانیهای عملگرهای سراسریِ قابلجایگزینی از عبارات new یا delete یا از فراخوانیهای "__builtin_operator_new" یا "__builtin_operator_delete" هیچ متغیر سراسری یا متغیری را که ممکن است آدرسش به این عملگرها نشت کند نمیخوانند یا تغییر نمیدهند (وضعیت سراسری؛ بهجز "errno" برای عملگرهای "new" و "new[]"). این امر بیشترین بهینهسازیها را در طول این فراخوانیها ممکن میسازد و چیزی است که عملگرهای ارائهشده توسط پیادهسازی برآورده میکنند، مگر اینکه جزئیات پیادهسازی "malloc" در کد قابل مشاهده باشد یا از هوکهای (hooks) "malloc" استفاده شده باشد، اما اگر برنامهای این عملگرها را بازنویسی کند ممکن است صادق نباشد. این رفتار بهطور پیشفرض فعال است. با گزینهٔ "-fno-assume-sane-operators-new-delete" کامپایلر GCC باید فرض کند تمامی این فراخوانیها (چه از عبارات new یا delete باشند یا مستقیماً فراخوانی شوند) ممکن است وضعیت سراسری را بخوانند و بنویسند، مگر اینکه خلاف آن اثبات شود (مثلاً زمانی که GCC پیادهسازی آنها را کامپایل میکند). اگر این عملگرها جایگزین شدهاند یا امکان جایگزینی آنها وجود دارد و کد باید انتظار چنین رفتاری را داشته باشد، از این گزینه استفاده کنید.
- -fchar8_t
- -fno-char8_t
- فعالسازی
پشتیبانی
از "char8_t"
مطابق با
تصویبشده
در C++20. این
شامل اضافه
شدن یک نوع
پایهای
جدید
"char8_t"،
تغییراتی
در انواع
مقادیر
لفظی (literals)
رشتهای و
نویسهای
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 - -fcheck-new
- بررسی میکند که اشارهگر بازگرداندهشده توسط "operator new" پیش از تلاش برای تغییر فضای ذخیرهسازی تخصیصیافته، غیرتهی (non-null) باشد. این بررسی معمولاً غیرضروری است زیرا استاندارد C++ مشخص میکند که "operator new" تنها در صورتی 0 برمیگرداند که بهصورت throw() اعلان شده باشد، که در این حالت کامپایلر حتی بدون این گزینه هم همواره مقدار بازگشتی را بررسی میکند. در تمامی حالتهای دیگر، هنگامی که "operator new" دارای یک مشخصات استثنای (exception specification) غیرخالی است، اتمام حافظه با پرتاب "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 تنظیم میکند. برای تشخیص بازگشتهای بیپایان در حین ارزیابی عبارت ثابت، به یک حد نیاز است. حداقل مقدار مشخصشده توسط استاندارد 512 است.
- -fconstexpr-cache-depth=n
- بیشینهٔ سطح عمق ارزیابی تو در تو برای توابع constexpr در C++11 را که در حافظهٔ نهان ذخیره (cache) میشوند روی n تنظیم میکند. این یک روش مکاشفهای (heuristic) است که تعادلی میان سرعت کامپایل (زمانی که حافظهٔ نهان از محاسبات تکراری جلوگیری میکند) و مصرف حافظه (زمانی که حافظهٔ نهان ناشی از ارزیابیهای بسیار بازگشتی بیش از حد بزرگ میشود) برقرار میسازد. مقدار پیشفرض 8 است. احتمالاً کاربران بسیار کمی مایل به تغییر آن باشند، اما اگر کد شما محاسبات سنگین constexpr انجام میدهد ممکن است بخواهید برای یافتن بهترین مقدار، آزمایش کنید.
- -fconstexpr-fp-except
- پیوست F
استاندارد C
مشخص
میکند که
استثناهای
ممیز شناور
IEC559 که در زمان
کامپایل رخ
میدهند
نباید مانع
کامپایل
شوند.
کامپایلرهای
C++ از لحاظ
تاریخی این
رهنمود را
دنبال
نکردهاند
و در عوض با
تقسیم ممیز
شناور بر
صفر
بهصورت
غیرثابت
برخورد
کردهاند،
اگرچه
دارای
مقداری
کاملاً
تعریفشده
است. این
پرچم به
کامپایلر
میگوید که
به پیوست F
نسبت به
قواعد
دیگری که
میگویند
یک عملیات
خاص
تعریفنشده
است،
اولویت دهد.
constexpr float inf = 1./0.; // OK with -fconstexpr-fp-except
- -fconstexpr-loop-limit=n
- بیشینهٔ تعداد تکرارهای یک حلقه در توابع constexpr در C++14 را روی n تنظیم میکند. برای تشخیص حلقههای بیپایان در حین ارزیابی عبارت ثابت، به یک حد نیاز است. مقدار پیشفرض 262144 (1<<18) است.
- -fconstexpr-ops-limit=n
- بیشینهٔ تعداد عملیاتها را در طول یک ارزیابی تکی constexpr تنظیم میکند. حتی زمانی که تعداد تکرارهای یک حلقه با حد بالا محدود شده باشد، اگر چندین حلقهٔ تو در تو وجود داشته باشد و هر یک دارای تکرارهای بسیار اما همچنان کمتر از حد بالا باشد، یا اگر در بدنهٔ یک حلقه یا حتی خارج از آن عبارتهای بیش از حدی نیاز به ارزیابی داشته باشند، ارزیابی constexpr حاصل ممکن است بیش از حد زمان ببرد. مقدار پیشفرض 33554432 (1<<25) است.
- -fcontracts
- پشتیبانی
آزمایشی از
ویژگی
قراردادهای
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] معناشناسی واقعی (concrete semantics) را برای هر سطح قرارداد از یک نقش قرارداد خاص تعیین میکند.
- -fcontract-semantic=[default|audit|axiom]:<semantic>
- [P1429] معناشناسی واقعی را برای یک سطح قرارداد خاص مشخص میکند.
- -fcontract-strict-declarations=[on|off]
- کنترل میکند که آیا افزودن قراردادها به یک تابع پس از نخستین اعلان آن رد شود یا خیر. پیشفرض off است.
معناشناسیهای واقعی ممکنی که میتوان با -fcontract-role یا -fcontract-semantic تعیین کرد عبارتند از:
- "ignore"
- این قرارداد هیچ تأثیری ندارد.
- "assume"
- با این قرارداد مانند "[[assume]]" در C++23 رفتار میشود.
- "check_never_continue"
- "never"
- "abort"
- این قرارداد بررسی میشود. در صورت شکست، گردانندهٔ نقض فراخوانی میشود. اگر گرداننده بازگردد، "std::terminate" فراخوانی خواهد شد.
- "check_maybe_continue"
- "maybe"
- این قرارداد بررسی میشود. در صورت شکست، گردانندهٔ نقض فراخوانی میشود. اگر گرداننده بازگردد، اجرا بهطور عادی ادامه مییابد.
- -fdiagnostics-all-candidates
- به بخش فرانتاند C++ اجازه میدهد هنگام شکست در تفکیک اضافه بار (overload resolution)، تمام گزینههای نامزد را ثبت کند، از جمله زمانی که یک تابع حذفشده (deleted) انتخاب شده باشد.
- -fno-elide-constructors
- استاندارد
C++ به
پیادهسازی
اجازه
میدهد از
ایجاد شیء
موقتی که
تنها برای
مقداردهی
اولیه شیء
دیگری از
همان نوع
استفاده
میشود،
صرفنظر
کند. مشخص
کردن این
گزینه آن
بهینهسازی
را غیرفعال
کرده و G++ را
وادار
میکند در
تمام موارد
سازندهٔ
کپی (copy constructor) را
فراخوانی
کند. این
گزینه
همچنین
باعث
میشود G++
توابع عضو
بدیهی (trivial) را
که در غیر
این صورت به
صورت
درونخطی (inline)
بسط
مییافتند،
فراخوانی
کند.
در C++17، کامپایلر موظف است این اشیاء موقت را حذف کند، اما این گزینه همچنان بر توابع عضو بدیهی تأثیر میگذارد.
- -fno-enforce-eh-specs
- برای بررسی نقض مشخصات استثنا (exception specifications) در زمان اجرا، کد تولید نمیکند. این گزینه استاندارد C++ را نقض میکند، اما ممکن است برای کاهش حجم کد در ساختهای نهایی، بسیار شبیه به تعریف "NDEBUG"، مفید باشد. این مورد به کد کاربر اجازهٔ پرتاب استثناها در مغایرت با مشخصات استثنا را نمیدهد؛ کامپایلر همچنان بر اساس مشخصات بهینهسازی میکند، بنابراین پرتاب یک استثنای غیرمنتظره منجر به رفتار تعریفنشده در زمان اجرا خواهد شد.
- -fextern-tls-init
- -fno-extern-tls-init
- استانداردهای
C++11 و OpenMP به
متغیرهای
"thread_local" و
"threadprivate"
اجازه
میدهند
مقداردهی
اولیه پویا
(در زمان
اجرا) داشته
باشند. برای
پشتیبانی
از این امر،
هرگونه
استفاده از
چنین
متغیری از
طریق یک
تابع پوششی
(wrapper) انجام
میشود که
هرگونه
مقداردهی
اولیه لازم
را انجام
میدهد.
هنگامی که
استفاده و
تعریف
متغیر در یک
واحد ترجمه
(translation unit) باشند،
این بار
اضافی
میتواند
بهینهسازی
و حذف شود،
اما هنگامی
که استفاده
در یک واحد
ترجمه
متفاوت
باشد، بار
اضافی قابل
توجهی وجود
دارد حتی
اگر متغیر
در عمل
نیازی به
مقداردهی
اولیه پویا
نداشته
باشد. اگر
برنامهنویس
مطمئن باشد
که هیچ
استفادهای
از متغیر در
یک TU
غیرتعریفکننده
نیازی به
راهاندازی
مقداردهی
اولیه پویا
ندارد (خواه
به این دلیل
که متغیر به
صورت ایستا
مقداردهی
شده، یا
استفاده از
متغیر در TU
تعریفکننده
پیش از
هرگونه
استفاده در
TU دیگر اجرا
خواهد شد)،
میتواند
با گزینهٔ
-fno-extern-tls-init از این
بار اضافی
جلوگیری
کند.
در مقصدهایی که از نامهای مستعار نماد (symbol aliases) پشتیبانی میکنند، پیشفرض -fextern-tls-init است. در مقصدهایی که از نامهای مستعار نماد پشتیبانی نمیکنند، پیشفرض -fno-extern-tls-init است.
- -ffold-simple-inlines
- -fno-fold-simple-inlines
- به فرانتاند C++ اجازه میدهد فراخوانیهای "std::move"، "std::forward"، "std::addressof" و "std::as_const" را سادهسازی (fold) کند. بر خلاف درونخطیسازی، این بدین معنی است که هیچ اطلاعات اشکالزدایی برای چنین فراخوانیهایی تولید نخواهد شد. از آنجا که این توابع بهندرت برای اشکالزدایی اهمیت دارند، این پرچم به صورت پیشفرض فعال است مگر اینکه -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
- هرگز برای الگوهای غیردرونخطی که به صورت ضمنی نمونهسازی (instantiate) شدهاند (یعنی بر اثر استفاده)، کد تولید نمیکند؛ تنها برای نمونهسازیهای صریح کد تولید میکند. اگر از این گزینه استفاده میکنید، باید مراقب باشید که کد خود را طوری ساختاردهی کنید که شامل تمام نمونهسازیهای صریح لازم باشد تا از مواجهه با نمادهای تعریفنشده در زمان پیوند جلوگیری شود.
- -fno-implicit-inline-templates
- برای نمونهسازیهای ضمنی الگوهای درونخطی نیز کد تولید نمیکند. حالت پیشفرض این است که با موارد درونخطی به گونهای متفاوت رفتار شود تا کامپایل با و بدون بهینهسازی به مجموعه یکسانی از نمونهسازیهای صریح نیاز داشته باشد.
- -fno-implement-inlines
- برای صرفهجویی در فضا، نسخههای برونخطی (out-of-line) توابع درونخطی کنترلشده توسط "#pragma implementation" را تولید نمیکند. اگر این توابع در هر جایی که فراخوانی میشوند به صورت درونخطی درنیایند، این کار باعث ایجاد خطاهای پیونددهنده خواهد شد.
- -fmodules
- -fno-modules
- فعالسازی پشتیبانی از ماژولهای C++20. معمولاً به -fno-modules نیازی نیست، زیرا این حالت پیشفرض است. با اینکه این قابلیت مربوط به C++20 است، در حال حاضر با انتخاب نسخهٔ این استاندارد به صورت ضمنی فعال نمیشود.
- -fmodule-header
- -fmodule-header=user
- -fmodule-header=system
- کامپایل یک فایل سرایند برای ایجاد یک واحد سرایند (header unit) قابل وارد کردن.
- -fmodule-implicit-inline
- توابع عضوی که درون تعریف کلاس خود تعریف شدهاند، برای کد ماژولار به صورت ضمنی inline نیستند. این رفتار به دلایل موجهی با رفتار سنتی C++ متفاوت است. با این حال، ممکن است هنگام انتقال کد باعث بروز مشکلاتی شود. این گزینه تعاریف اینگونه توابع را به صورت ضمنی inline میکند. البته این کار باعث ناسازگاری ABI میشود، بنابراین باید آن را در همهجا یا هیچجا استفاده کنید. (چنین تعاریفی در خارج از یک ماژول نامگذاریشده، در هر صورت به صورت ضمنی inline باقی میمانند.)
- -fno-module-lazy
- غیرفعالسازی وارد کردن تنبل ماژول و ایجاد نگاشتگر ماژول (module mapper).
- -fmodule-mapper=[hostname]:port[?ident]
- -fmodule-mapper=|program[?ident] args...
- -fmodule-mapper==socket[?ident]
- -fmodule-mapper=<>[inout][?ident]
- -fmodule-mapper=<in>out[?ident]
- -fmodule-mapper=file[?ident]
- یک مرجع استعلام برای نگاشت نام ماژول به نام فایل. در صورت مشخص نشدن، از متغیر محیطی CXX_MODULE_MAPPER استفاده میشود و اگر آن هم تنظیم نشده باشد، یک پیشفرض درونپردازشی ارائه میگردد.
- -fmodule-only
- فقط واسط ماژول کامپایلشده (Compiled Module Interface) را تولید میکند و از تولید هرگونه فایل شیء جلوگیری مینماید.
- -fms-extensions
- هشدارهای Wpedantic را دربارهٔ ساختارهای بهکاررفته در MFC، مانند int ضمنی و دریافت اشارهگر به تابع عضو از طریق نحو غیراستاندارد، غیرفعال میکند.
- -fnew-inheriting-ctors
- تعدیلهای P0136 در معناشناسی وراثت سازنده در C++11 را فعال میکند. این قابلیت بخشی از C++17 است اما به عنوان یک گزارش نقص (Defect Report) علیه C++11 و C++14 نیز در نظر گرفته میشود. این پرچم به صورت پیشفرض فعال است مگر اینکه -fabi-version=10 یا پایینتر مشخص شده باشد..IP -fnew-ttp-matching 4 مصوبه P0522 را برای Core issue 150 در خصوص «پارامترهای قالبِ قالب» (template template parameters) و آرگومانهای پیشفرض فعال میکند: این کار اجازه میدهد قالبی با آرگومانهای پیشفرض قالب، به عنوان یک آرگومان برای یک پارامتر قالبِ قالب با پارامترهای قالب کمتر به کار رود. این پرچم بهطور پیشفرض برای -std=c++17 فعال است.
- -fno-nonansi-builtins
- اعلانهای توکار (built-in) توابعی را که توسط ANSI/ISO C الزامی نشدهاند غیرفعال میکند. این توابع شامل "ffs"، "alloca"، "_exit"، "index"، "bzero"، "conjf" و سایر توابع مرتبط هستند.
- -fnothrow-opt
- با مشخصات استثنای throw() طوری رفتار میکند که گویی یک مشخصات "noexcept" است تا سربار اندازه متن (text size) را نسبت به تابعی بدون مشخصات استثنا کاهش دهد یا حذف کند. اگر تابع متغیرهای محلی از نوعهایی با تخریبکنندههای (destructors) غیربدیهی (non-trivial) داشته باشد، این مشخصات استثنا در واقع تابع را کوچکتر میکند، چرا که پاکسازیهای EH برای آن متغیرها میتوانند با بهینهسازی حذف شوند. اثر معنایی این است که پرتاب یک استثنا به بیرون از تابعی با چنین مشخصات استثنایی، به جای "unexpected" منجر به فراخوانی "terminate" میشود.
- -fno-operator-names
- با کلمات کلیدی نام عملگرها یعنی "and"، "bitand"، "bitor"، "compl"، "not"، "or" و "xor" به عنوان کلمات کلیدی مترادف رفتار نمیکند.
- -fno-optional-diags
- پیامهای تشخیصی (diagnostics) را که استاندارد میگوید کامپایلر نیازی به صدور آنها ندارد، غیرفعال میکند. در حال حاضر، تنها پیام تشخیصی از این دست که توسط G++ صادر میشود، مربوط به نامی است که درون یک کلاس چندین معنی دارد.
- -fno-pretty-templates
- هنگامی که یک پیام خطا به یک حالت خاص (specialization) از یک قالب تابع اشاره میکند، کامپایلر معمولاً امضای قالب و به دنبال آن آرگومانهای قالب و هرگونه typedef یا typename موجود در امضا را چاپ میکند (برای مثال "void f(T) [with T = int]" به جای "void f(int)") تا مشخص شود کدام قالب درگیر است. هنگامی که یک پیام خطا به تخصیص یک قالب کلاس اشاره میکند، کامپایلر هر آرگومان قالبی را که با آرگومانهای پیشفرض آن قالب مطابقت داشته باشد حذف میکند. اگر هر یک از این رفتارها فهم پیام خطا را به جای آسانتر کردن، دشوارتر کند، میتوانید از -fno-pretty-templates برای غیرفعال کردن آنها استفاده کنید.
- -frange-for-ext-temps
- تمدید طول عمر اشیاء موقت در حلقههای range-based for زبان C++ را فعال میکند. با -std=c++23 و بالاتر، این قابلیت بخشی از استاندارد زبان است، بنابراین طول عمر اشیاء موقت بهطور پیشفرض تا پایان حلقه تمدید میشود. این گزینه اجازه میدهد تا این رفتار در نسخههای پیشین استاندارد نیز فعال شود.
- -fno-rtti
- تولید
اطلاعات
مربوط به هر
کلاس دارای
توابع
مجازی را
برای
استفاده
توسط
ویژگیهای
شناسایی
نوع زمان
اجرا در C++
("dynamic_cast" و
"typeid")
غیرفعال
میکند. اگر
از این
بخشهای
زبان
استفاده
نمیکنید،
میتوانید
با استفاده
از این پرچم
مقداری فضا
ذخیره کنید.
توجه داشته
باشید که
مدیریت
استثنا (exception handling)
از همین
اطلاعات
استفاده
میکند،
اما G++ آن را
بر حسب نیاز
تولید
مینماید.
عملگر
"dynamic_cast"
همچنان
میتواند
برای
تبدیلهایی
که نیازی به
اطلاعات
نوع در زمان
اجرا
ندارند
استفاده
شود، یعنی
تبدیل به
"void *" یا
به
کلاسهای
پایه
غیرمبهم.
ترکیب کدهای کامپایلشده با -frtti با کدهای کامپایلشده با -fno-rtti ممکن است کار نکند. برای مثال، اگر کلاسی که با -fno-rtti کامپایل شده به عنوان پایه برای کلاسی استفاده شود که با -frtti کامپایل شده است، ممکن است پیوند (link) برنامهها با شکست مواجه شود.
- -fsized-deallocation
- اعلانهای
عمومی
توکارِ
void operator delete (void *, std::size_t) noexcept; void operator delete[] (void *, std::size_t) noexcept;
را همانگونه که در C++14 معرفی شدند، فعال میکند. این گزینه برای توابع آزادسازی حافظه (deallocation) جایگزینِ تعریفشده توسط کاربر مفید است که به عنوان مثال، از اندازه شیء برای سریعتر کردن آزادسازی استفاده میکنند. این گزینه تحت -std=c++14 و بالاتر بهطور پیشفرض فعال است. پرچم -Wsized-deallocation درباره مکانهایی که ممکن است نیاز به افزودن تعریف داشته باشند هشدار میدهد.
- -fstrict-enums
- به کامپایلر اجازه میدهد تا با این فرض بهینهسازی کند که مقدار یک نوع شمارشی (enumerated type) تنها میتواند یکی از مقادیر آن شمارش باشد (همانطور که در استاندارد C++ تعریف شده است؛ اساساً، مقداری که بتوان آن را با حداقل تعداد بیتهای لازم برای نمایش همه مقادیر شمارشپذیر نمایش داد). اگر برنامه از یک تبدیل نوع (cast) برای تبدیل یک مقدار عدد صحیح اختیاری به نوع شمارشی استفاده کند، این فرض ممکن است نامعتبر باشد. این گزینه برای یک نوع شمارشی با نوع پایهای ثابت (fixed underlying type) هیچ تأثیری ندارد.
- -fstrong-eval-order
- -fstrong-eval-order=kind
- دسترسی به
عضو،
زیرنویس
آرایه (array subscripting)،
و عبارات
تغییر مکان
(shift) را به
ترتیب
چپبهراست
و مقداردهی
(assignment) را به
ترتیب
راستبهچپ،
همانطور
که برای C++17
تصویب شده
است،
ارزیابی
میکند.
گزینه -fstrong-eval-order
معادل -fstrong-eval-order=all
است و
بهطور
پیشفرض با
-std=c++17 یا
بالاتر
فعال
میشود.
گزینه -fstrong-eval-order=some تنها ترتیب دسترسی به عضو و عبارات shift را فعال میکند، و حالت پیشفرض برای گویشهای 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) برای متغیرهای ایستای محلی خودداری میکند. میتوانید از این گزینه برای کاهش اندک اندازه کد در کدهایی که نیازی به thread-safe بودن ندارند استفاده کنید.
- -fuse-cxa-atexit
- تخریبکنندههای اشیاء با طول دوره ذخیرهسازی ایستا (static storage duration) را به جای تابع "atexit" با تابع "__cxa_atexit" ثبت میکند. این گزینه برای مدیریت کاملاً منطبق بر استانداردِ تخریبکنندههای ایستا الزامی است، اما تنها در صورتی کار میکند که کتابخانه C شما از "__cxa_atexit" پشتیبانی کند.
- -fno-use-cxa-get-exception-ptr
- از روتین زمان اجرای "__cxa_get_exception_ptr" استفاده نمیکند. این امر باعث میشود "std::uncaught_exception" نادرست عمل کند، اما در صورتی که این روتین زمان اجرا در دسترس نباشد، ضروری است.
- -fvisibility-inlines-hidden
- این سوئیچ
اعلان
میکند که
کاربر
تلاشی برای
مقایسه
اشارهگرها
به توابع یا
متدهای
درونخطی (inline)
در مواردی
که
آدرسهای
دو تابع در
اشیاء
اشتراکی
متفاوتی
گرفته
شدهاند،
انجام
نمیدهد.
اثر این کار این است که GCC میتواند عملاً متدهای inline را با "__attribute__ ((visibility ("hidden")))" علامتگذاری کند تا در جدول صدور یک DSO ظاهر نشوند و هنگام استفاده در داخل همان DSO نیازی به ارجاع غیرمستقیم PLT نداشته باشند. فعال کردن این گزینه میتواند تأثیر چشمگیری بر زمان بارگذاری و پیوند یک DSO داشته باشد، زیرا در صورتی که کتابخانه استفاده فراوانی از قالبها داشته باشد، اندازه جدول صدور پویا را به شدت کاهش میدهد.
رفتار این سوئیچ کاملاً مشابه علامتگذاری مستقیم متدها به عنوان hidden نیست، زیرا بر متغیرهای ایستای محلیِ تابع تأثیری نمیگذارد و باعث نمیشود کامپایلر استنباط کند که تابع تنها در یک شیء اشتراکی تعریف شده است.
میتوانید برای خنثی کردن اثر سوئیچ برای یک متد خاص، آن متد را بهطور صریح با یک وضعیت دیداری علامتگذاری کنید. برای مثال، اگر میخواهید اشارهگرها به یک متد درونخطی خاص را مقایسه کنید، میتوانید آن را به عنوان دارای دیداری پیشفرض علامتگذاری نمایید. علامتگذاری کلاس دربرگیرنده با دیداری صریح تأثیری ندارد.
متدهای درونخطی که بهطور صریح نمونهسازی شدهاند (explicitly instantiated) تحت تأثیر این گزینه قرار نمیگیرند، چرا که پیوند (linkage) آنها ممکن است در غیر این صورت از مرز یک کتابخانه اشتراکی عبور کند.
- -fvisibility-ms-compat
- این پرچم
تلاش
میکند با
استفاده از
تنظیمات
دیداری،
مدل پیوند C++
کامپایلر GCC
را با Microsoft Visual Studio
سازگار
سازد.
این پرچم تغییرات زیر را در مدل پیوند GCC اعمال میکند:
- 1.
- دیداری پیشفرض را مانند -fvisibility=hidden روی "hidden" تنظیم میکند.
- 2.
- نوعها، اما نه اعضای آنها، بهطور پیشفرض پنهان نیستند.
- 3.
- قاعده یک تعریف (One Definition Rule یا ODR) برای نوعهای فاقد مشخصات صریح دیداری که در بیش از یک شیء اشتراکی تعریف شدهاند آسانتر میشود: آن اعلانها در صورتی مجاز هستند که در زمان عدم استفاده از این گزینه نیز مجاز باشند.
در کدهای جدید بهتر است از -fvisibility=hidden استفاده شود و کلاسهایی که قرار است از بیرون قابل مشاهده باشند صادر (export) شوند. متأسفانه این احتمال وجود دارد که کدها، شاید به طور ناخواسته، به رفتار Visual Studio وابسته باشند.
از جمله پیامدهای این تغییرات این است که اعضای دادهای ایستای همنوع و همنام اما تعریفشده در اشیاء اشتراکی مختلف، متفاوت خواهند بود، بنابراین تغییر یکی باعث تغییر دیگری نمیشود؛ و همچنین ممکن است اشارهگرها به توابع عضوی که در اشیاء اشتراکی مختلف تعریف شدهاند در مقایسه برابر نباشند. در صورت استفاده از این پرچم، تعریف متفاوت نوعهای همنام، نقض ODR تلقی میشود. از پشتیبانی نمادهای ضعیف (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 به یک سرآیند کاربر یا سیستم خاص حلوفصل خواهد شد.
- -flang-info-module-cmi
- -flang-info-module-cmi=module
- نام مسیرهای Compiled Module Interface را اطلاع بده. شکل نخست همه مسیرهای CMI خواندهشده را ثبت میکند. شکل module خواندن CMI یک ماژول خاص را ذکر میکند. module میتواند یک ماژول نامگذاریشده یا یک واحد سرآیند (header-unit) باشد (مورد اخیر یا با نام مسیری حاوی جداکنندههای دایرکتوری مشخص میشود یا درون "<>" یا "" قرار میگیرد).
- -stdlib=libstdc++,libc++
- هنگامی که G++ برای پشتیبانی از این گزینه پیکربندی شده باشد، امکان تعیین کتابخانههای زمان اجرای جایگزین C++ را فراهم میکند. دو گزینه در دسترس است: libstdc++ (زمان اجرای پیشفرض و بومی C++ برای G++) و libc++ که زمان اجرای C++ نصبشده روی برخی از سیستمعاملها است (برای نمونه نسخههای Darwin از Darwin11 به بعد). این گزینه G++ را تغییر میدهد تا از سرآیندهای کتابخانه مشخصشده استفاده کند و هنگام نیاز به یک زمان اجرای C++ برای پیوند، به ترتیب "-lstdc++" یا "-lc++" را صادر کند.
علاوه بر این، این گزینههای هشدار تنها برای برنامههای C++ معنی دارند:
- -Wabi-tag (فقط C++ و Objective-C++)
- هنگامی که نوعی با یک برچسب ABI در زمینهای استفاده شود که فاقد آن برچسب ABI است، هشدار بده. برای اطلاعات بیشتر درباره برچسبهای ABI، به C++ Attributes مراجعه کنید.
- -Wcomma-subscript (فقط C++ و Objective-C++)
- درباره
استفاده از
عبارت
ویرگول
درون یک
عبارت
زیرنویس (subscripting)
هشدار بده.
این کاربرد
در C++20 منسوخ
شده و قرار
است در C++23 حذف
شود. با این
وجود،
عبارت
ویرگولی که
درون "( )"
قرار گرفته
باشد منسوخ
نیست. مثال:
void f(int *a, int b, int c) { a[b,c]; // deprecated in C++20, invalid in C++23 a[(b,c)]; // OK }در C++23 داشتن عبارتهای جداشده با ویرگول در یک زیرنویس زمانی معتبر است که یک عملگر زیرنویس سربارگذاریشده یافت شود و از تعداد و انواع درست آرگومانها پشتیبانی کند. G++ نحوِ پیشتر معتبر را برای کدهایی که در C++23 معتبر نیستند اما در C++20 معتبر ولی منسوخ بودند، همراه با یک هشدار سختگیرانه (pedantic) میپذیرد که میتوان آن را با -Wno-comma-subscript غیرفعال کرد.
به طور پیشفرض با -std=c++20 فعال میشود مگر اینکه -Wno-deprecated داده شده باشد، و پس از -std=c++23 صرفنظر از -Wno-deprecated فعال است. پیش از -std=c++20، با -Wdeprecated صریح فعال میشود.
این هشدار با -pedantic-errors در حالت C++23 یا بالاتر به یک خطا ارتقا مییابد.
- -Wctad-maybe-unsupported (فقط C++ و Objective-C++)
- هنگام
انجام
استنتاج
آرگومان
الگوی کلاس
(CTAD) روی نوعی
بدون
راهنماهای
استنتاج
صریحاً
نوشتهشده،
هشدار بده.
این هشدار
مواردی را
مشخص
میکند که CTAD
تنها به این
دلیل موفق
شده است که
کامپایلر
راهنماهای
استنتاج
ضمنی را
سنتز کرده
است، که
ممکن است
مقصود
برنامهنویس
نبوده باشد.
برخی
راهنماهای
سبک
کدنویسی
استفاده از
CTAD را فقط
برای
انواعی
مجاز
میدانند
که صریحاً
پشتیبانی
خود را
اعلام کرده
باشند (opt-in)؛
یعنی روی
انواعی که
برای
پشتیبانی
از CTAD طراحی
شدهاند.
این هشدار
را میتوان
با الگوی
زیر
فرونشاند:
struct allow_ctad_t; // any name works template <typename T> struct S { S(T) { } }; // Guide with incomplete parameter type will never be considered. S(allow_ctad_t) -> S<void>; - -Wctor-dtor-privacy (فقط C++ و Objective-C++)
- هنگامی که به نظر میرسد یک کلاس غیرقابل استفاده است چون تمام سازندهها یا ویرانگرها در آن کلاس خصوصی هستند، و کلاس هیچ دوست (friend) یا تابع عضو ایستای عمومی ندارد، هشدار بده. همچنین اگر هیچ متد غیرخصوصی وجود نداشته باشد و حداقل یک تابع عضو خصوصی وجود داشته باشد که سازنده یا ویرانگر نباشد، هشدار بده.
- -Wdangling-reference (فقط C++ و Objective-C++)
- هنگامی که
یک مرجع به
یک شیء موقت
که طول عمر
آن به پایان
رسیده متصل
شود، هشدار
بده. برای
مثال:
int n = 1; const int& r = std::max(n - 1, n + 1); // r is dangling
در مثال بالا، دو شیء موقت ایجاد میشوند، یکی برای هر آرگومان، و مرجعی به یکی از اشیاء موقت بازگردانده میشود. با این حال، هر دو شیء موقت در انتهای عبارت کامل نابود میشوند، بنابراین مرجع "r" معلق (dangling) است. این هشدار همچنین مراجع معلق را در فهرستهای مقداردهی اولیه اعضا تشخیص میدهد:
const int& f(const int& i) { return i; } struct S { const int &r; // r is dangling S() : r(f(10)) { } };توابع عضو نیز بررسی میشوند، اما فقط آرگومان شیء آنها:
struct S { const S& self () { return *this; } }; const S& s = S().self(); // s is danglingبرخی از توابع از این نظر ایمن هستند، برای نمونه "std::use_facet": آنها مرجعی را دریافت کرده و بازمیگردانند، اما یکی از آرگومانهای آن را بازنمیگردانند، که میتواند این هشدار را گمراه کند. چنین توابعی را میتوان با قرار دادن آنها در یک "#pragma" از هشدار مستثنی کرد:
#pragma GCC diagnostic push #pragma GCC diagnostic ignored "-Wdangling-reference" const T& foo (const T&) { ... } #pragma GCC diagnostic popدستور "#pragma" همچنین میتواند کلاس را در بر گیرد؛ در این صورت، هشدار برای تمامی توابع عضو غیرفعال خواهد شد.
گزینه -Wdangling-reference همچنین در مورد کدهایی مانند
auto p = std::minmax(1, 2);
هشدار میدهد که در آن "std::minmax" مقدار "std::pair<const int&, const int&>" را بازمیگرداند، و هر دو مرجع پس از پایان عبارت کاملی که شامل فراخوانی "std::minmax" است معلق خواهند شد.
این هشدار برای کلاسهای شبه-"std::span" هشداری صادر نمیکند. ما کلاسهایی به شکل:
template<typename T> struct Span { T* data_; std::size len_; };را شبه-"std::span" در نظر میگیریم؛ بدین معنی که کلاس یک کلاس غیر-union است که یک عضو دادهای اشارهگر و یک ویرانگر ناچیز (trivial) دارد.
این هشدار را میتوان با استفاده از ویژگی "gnu::no_dangling" غیرفعال کرد.
این هشدار توسط -Wextra فعال میشود..IP "-Wdelete-non-virtual-dtor (فقط در C++ و Objective-C++)" 4 هنگامی که از "delete" برای از بین بردن نمونهای از یک کلاس دارای توابع مجازی و مخرب (destructor) غیرمجازی استفاده میشود، هشدار میدهد. حذف یک نمونه از کلاس مشتقشده از طریق اشارهگری به کلاس پایه در صورتی که کلاس پایه فاقد مخرب مجازی باشد، ناامن است. این هشدار با -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++)
- هشدار
مربوط به
حالتی را که
در آن
تبدیلهای
محاسباتی
معمول بر
روی
عملوندهایی
اعمال
میشوند که
یکی از نوع
شمارشی (enumeration) و
دیگری از یک
نوع شمارشی
متفاوت
است،
غیرفعال
میکند. این
تبدیل در C++20
منسوخ شده
است. برای
مثال:
enum E1 { e }; enum E2 { f }; int k = f - e;گزینه -Wdeprecated-enum-enum-conversion بهطور پیشفرض با -std=c++20 فعال است. در نسخههای پیش از C++20، این هشدار میتواند توسط -Wenum-conversion یا -Wdeprecated فعال شود.
- -Wno-deprecated-enum-float-conversion (فقط در C++ و Objective-C++)
- هشدار
مربوط به
حالتی را که
در آن
تبدیلهای
محاسباتی
معمول بر
روی
عملوندهایی
اعمال
میشوند که
یکی از نوع
شمارشی و
دیگری از
نوع ممیز
شناور است،
غیرفعال
میکند. این
تبدیل در C++20
منسوخ شده
است. برای
مثال:
enum E1 { e }; enum E2 { f }; bool b = e <= 3.7;گزینه -Wdeprecated-enum-float-conversion بهطور پیشفرض با -std=c++20 فعال است. در نسخههای پیش از C++20، این هشدار میتواند توسط -Wenum-conversion یا -Wdeprecated فعال شود.
- -Wdeprecated-literal-operator (فقط در C++ و Objective-C++)
- هشدار
میدهد که
اعلان یک
عملگر لفظی
تعریفشده
توسط کاربر
(user-defined literal operator) با یک
فاصله پیش
از پسوند،
منسوخ شده
است. این
هشدار
بهطور
پیشفرض در
C++23، یا با
مشخصکردن
صریح -Wdeprecated
فعال
میشود.
string operator "" _i18n(const char*, std::size_t); // deprecated string operator ""_i18n(const char*, std::size_t); // preferred
- -Wdeprecated-variadic-comma-omission (فقط در C++ و Objective-C++)
- هشدار
میدهد که
حذف ویرگول
پیش از
آرگومانهای
متغیر
"..." در
انتهای
فهرست
پارامترهای
تابع منسوخ
شده است.
این هشدار
بهطور
پیشفرض در
C++26، یا با
مشخصکردن
صریح -Wdeprecated
فعال
میشود.
void f1(int...); // deprecated void f1(int, ...); // preferred template <typename ...T> void f2(T...); // ok template <typename ...T> void f3(T......); // deprecated
- -Wno-elaborated-enum-base
- برای C++11 و بالاتر، در صورتی که یک enum-base اضافی (نامعتبر) در یک elaborated-type-specifier استفاده شود، هشدار میدهد؛ یعنی اگر یک enum با نوع پایهای مشخص و بدون فهرست شمارندهها (enumerator list)، در اعلانی غیر از صرفاً یک اعلان مستقل از enum به کار رود. بهطور پیشفرض فعال است. این هشدار با -pedantic-errors به یک خطا ارتقا مییابد.
- -Wno-init-list-lifetime (فقط در C++ و Objective-C++)
- درباره استفادههایی از "std::initializer_list" که احتمالاً به اشارهگرهای معلق (dangling pointers) منجر میشوند، هشدار نمیدهد. از آنجا که با آرایه زیرین یک "initializer_list" مانند یک شیء موقت معمولی در C++ رفتار میشود، بهسادگی ممکن است اشارهگری به آرایه فراتر از پایان طول عمر آن نگهداشته شود. برای مثال:
- اگر تابعی یک "initializer_list" موقت یا یک متغیر محلی "initializer_list" را برگرداند، طول عمر آرایه در پایان دستور return تمام میشود، بنابراین مقدار بازگرداندهشده دارای یک اشارهگر معلق خواهد بود.
- اگر یک عبارت new اقدام به ایجاد یک "initializer_list" کند، آرایه تنها تا پایان عبارت کامل (full-expression) دربرگیرنده زنده میماند، بنابراین "initializer_list" موجود در حافظه heap دارای یک اشارهگر معلق خواهد بود.
- هنگامی که
به یک متغیر
"initializer_list" از
طریق یک
فهرست
مقداردهی
محصور در
آکولاد
انتساب
داده
میشود،
آرایه موقت
ایجادشده
برای سمت
راست
انتساب
تنها تا
پایان
عبارت کامل
زنده
میماند؛
بنابراین
در دستور
بعدی متغیر
"initializer_list"
دارای یک
اشارهگر
معلق است.
// li's initial underlying array lives as long as li std::initializer_list<int> li = { 1,2,3 }; // assignment changes li to point to a temporary array li = { 4, 5 }; // now the temporary is gone and li has a dangling pointer int i = li.begin()[0] // undefined behavior - هنگامی که یک سازنده مبتنی بر فهرست (list constructor)، اشارهگر "begin" را از آرگومان "initializer_list" ذخیره میکند، این کار طول عمر آرایه را تمدید نمیکند؛ بنابراین اگر یک متغیر کلاس از یک "initializer_list" موقت ساخته شود، اشارهگر در پایان دستور اعلان متغیر بهصورت معلق رها میشود.
- -Winvalid-constexpr
- هنگامی که
یک تابع
هرگز یک
عبارت ثابت
(constant expression) تولید
نمیکند،
هشدار
میدهد. در C++20
و پیش از
آن، برای هر
تابع و
الگوی تابع
"constexpr"،
باید حداقل
یک مجموعه
از
آرگومانهای
تابع در
حداقل یک
نمونهسازی
(instantiation) وجود
داشته باشد
بهگونهای
که
فراخوانی
تابع یا
سازنده
بتواند
زیرعبارتی
ارزیابیشده
از یک عبارت
ثابت
هستهای (core constant
expression) باشد. C++23
این
محدودیت را
حذف کرد،
بنابراین
ممکن است
تابع یا
الگوی
تابعی با
مشخصه
"constexpr"
وجود داشته
باشد که هیچ
فراخوانیای
از آن شرایط
یک عبارت
ثابت
هستهای را
برآورده
نکند.
این هشدار بهطور پیشفرض بهعنوان یک هشدار سختگیرانه (pedantic) در C++20 و پیش از آن فعال است. در C++23، گزینه -Winvalid-constexpr را میتوان فعال کرد، که در این حالت یک هشدار معمولی خواهد بود. برای مثال:
void f (int& i); constexpr void g (int& i) { // Warns by default in C++20, in C++23 only with -Winvalid-constexpr. f(i); } - -Winvalid-imported-macros
- معتبر بودن تمام تعاریف ماکروهای واردشده را در پایان کامپایل بررسی میکند. این گزینه بهطور پیشفرض فعال نیست، زیرا تعیین آن نیازمند پردازش اضافی است. این گزینه ممکن است هنگام آمادهسازی مجموعههایی از header-unitها برای اطمینان از سازگاری ماکروها مفید باشد.
- -Wno-literal-suffix (فقط در C++ و Objective-C++)
- هنگامی که
پس از یک
لیترال
رشتهای یا
نویسهای
یک ud-suffix قرار
میگیرد که
با زیرخط
آغاز
نمیشود،
هشدار
نمیدهد. به
عنوان یک
افزونه
استاندارد،
GCC با این
پسوندها به
عنوان
نشانههای
پیشپردازش
مجزا رفتار
میکند تا
سازگاری
عقبرو با
کدهایی که
از
ماکروهای
قالببندی
"<inttypes.h>"
استفاده
میکنند
حفظ شود.
برای مثال:
#define __STDC_FORMAT_MACROS #include <inttypes.h> #include <stdio.h> int main() { int64_t i64 = 123; printf("My int64: %" PRId64"\n", i64); }در این حالت، با "PRId64" به عنوان یک نشانه پیشپردازش مجزا رفتار میشود.
این گزینه همچنین هشدارهایی را کنترل میکند که در آنها یک عملگر لیترال تعریفشده توسط کاربر با شناسهای برای پسوند لیترال اعلان شده که با زیرخط آغاز نمیشود. شناسههای پسوند لیترال که با زیرخط شروع نمیشوند برای استانداردسازیهای آینده رزرو شدهاند.
این هشدارها بهطور پیشفرض فعال هستند.
- -Wno-narrowing (فقط در C++ و Objective-C++)
- برای C++11 و
استانداردهای
پس از آن،
همانطور
که توسط
استاندارد
الزام شده
است،
تبدیلهای
باریککننده
(narrowing conversions) بهطور
پیشفرض
تشخیص داده
میشوند.
تبدیل
باریککننده
از یک مقدار
ثابت خطا
ایجاد
میکند و
تبدیل
باریککننده
از یک مقدار
غیرثابت
هشدار
تولید
مینماید،
اما -Wno-narrowing از
نمایش این
تشخیص
جلوگیری
میکند.
توجه داشته
باشید که
این کار بر
معنای
کدهای با
ساختار
صحیح (well-formed)
تأثیری
ندارد؛
تبدیلهای
باریککننده
همچنان در
زمینههای
SFINAE ناصحیح (ill-formed)
در نظر
گرفته
میشوند.
با -Wnarrowing در C++98، هنگامی که تبدیل باریککنندهای که توسط C++11 ممنوع شده در داخل { } رخ دهد، هشدار داده میشود؛ مانند: int i = { 2.2 }; // error: narrowing from double to int
این پرچم در -Wall و -Wc++11-compat گنجانده شده است.
- -Wnoexcept (فقط C++ و Objective-C++)
- هنگامی هشدار میدهد که یک عبارت noexcept به دلیل فراخوانی تابعی که مشخصه استثنای غیراندازنده (non-throwing exception specification؛ یعنی throw() یا "noexcept") ندارد اما کامپایلر میداند که هرگز استثنایی پرتاب نمیکند، به مقدار false ارزیابی شود.
- -Wnoexcept-type (فقط C++ و Objective-C++)
- اگر ویژگی C++17
که "noexcept"
را بخشی از
نوع تابع
قرار
میدهد،
نام
درهمپیچیده
(mangled name) یک نماد
را نسبت به C++14
تغییر دهد،
هشدار
میدهد. این
گزینه توسط
-Wabi و -Wc++17-compat
فعال
میشود.
به عنوان مثال:
template <class T> void f(T t) { t(); }; void g() noexcept; void h() { f(g); }در C++14، تابع "f" تابع "f<void(*)()>" را فراخوانی میکند، اما در C++17 تابع "f<void(*)()noexcept>" را فراخوانی میکند.
- -Wclass-memaccess (فقط C++ و Objective-C++)
- هنگامی که
مقصد
فراخوانی
یک تابع
حافظه خام
مانند
"memset" یا
"memcpy"
شیئی از نوع
کلاس باشد و
نوشتن در
چنین شیئی
ممکن است
سازنده یا
انتساب
رونوشت
غیربدیهی
(non-trivial) یا
حذفشده
کلاس را دور
بزند،
درستیِ const
بودن یا
کپسولهسازی
را نقض کند،
یا
اشارهگرهای
جدول مجازی
(vtable) را تخریب
کند، هشدار
میدهد.
تغییر دادن
نمایش چنین
اشیائی
ممکن است
نامتغیرهایی
(invariants) را که
توسط توابع
عضو کلاس
حفظ
میشوند
نقض کند.
برای مثال،
فراخوانی
"memset" در
زیر
تعریفنشده
است چرا که
یک شیء کلاس
غیربدیهی
را تغییر
میدهد و
بنابراین
تشخیص داده
میشود. روش
ایمن برای
مقداردهی
اولیه یا
پاککردن
فضای حافظه
اشیای چنین
انواعی،
استفاده از
سازنده یا
عملگر
انتساب
مناسب در
صورت وجود
است.
std::string str = "abc"; memset (&str, 0, sizeof str);
گزینه -Wclass-memaccess توسط -Wall فعال میشود. تبدیل صریح (cast) اشارهگر شیء کلاس به "void *" یا نوعی که بتواند با تابع حافظه خام به صورت ایمن دسترسی داشته باشد، هشدار را فرومینشاند.
- -Wnon-virtual-dtor (فقط C++ و Objective-C++)
- هنگامی هشدار میدهد که کلاسی دارای توابع مجازی و یک مخرب غیرمجازی قابلدسترس در خود یا در یک کلاس پایه چندریختی قابلدسترس باشد؛ که در این صورت حذف نمونهای از کلاس مشتقشده از طریق اشارهگری به خود کلاس یا کلاس پایه امکانپذیر اما ناامن است. این هشدار در صورت تعیین -Weffc++ به طور خودکار فعال میشود. گزینه -Wdelete-non-virtual-dtor (فعالشده توسط -Wall) ارجح است زیرا در مورد موارد ناامن بدون هشدارهای کاذب (false positives) هشدار میدهد.
- -Wregister (فقط C++ و Objective-C++)
- در مورد استفاده از مشخصکننده رده حافظه "register" هشدار میدهد، مگر اینکه بخشی از افزونه Explicit Register Variables مربوط به GNU باشد. استفاده از کلیدواژه "register" به عنوان مشخصکننده رده حافظه در C++11 منسوخ شده و در C++17 حذف شده است. به صورت پیشفرض با -std=c++17 فعال است.
- -Wreorder (فقط C++ و Objective-C++)
- هنگامی که
ترتیب
مقداردهندههای
اولیه اعضا
(member initializers) در کد با
ترتیبی که
باید اجرا
شوند
مطابقت
ندارد،
هشدار
میدهد. به
عنوان مثال:
struct A { int i; int j; A(): j (0), i (1) { } };کامپایلر مقداردهندههای اعضا را برای "i" و "j" بازآرایی میکند تا با ترتیب اعلان اعضا مطابقت داشته باشد و هشداری در این خصوص صادر میکند. این هشدار توسط -Wall فعال میشود.
- -Wno-pessimizing-move (فقط C++ و Objective-C++)
- این گزینه
زمانی
هشدار
میدهد که
فراخوانی
"std::move" از
حذف رونوشت
(copy elision) جلوگیری
کند.
سناریوی
متداولی که
در آن حذف
رونوشت
میتواند
رخ دهد،
هنگام
بازگشت از
تابعی با
نوع
بازگشتی
کلاس است،
هنگامی که
عبارتِ در
حال
بازگشت،
نام یک شیء
خودکار (automatic object)
غیر فرّار
(non-volatile) باشد،
پارامتر
تابع
نباشد، و
نوعی مشابه
نوع
بازگشتی
تابع داشته
باشد.
struct T { ... }; T fn() { T t; ... return std::move (t); }اما در این مثال، فراخوانی "std::move" مانع از حذف رونوشت میشود.
این هشدار توسط -Wall فعال میشود.
- -Wno-redundant-move (فقط C++ و Objective-C++)
- این گزینه
در مورد
فراخوانیهای
زائد
"std::move"
هشدار
میدهد؛
یعنی زمانی
که عملیات
انتقال (move)
حتی بدون
فراخوانی
"std::move" نیز
انجام
میشد. این
وضعیت به
این دلیل رخ
میدهد که
کامپایلر
در
موقعیتهای
خاصی مانند
بازگرداندن
متغیر محلی
در جایی که
حذف رونوشت
قابل اعمال
نیست، ملزم
است با شیء
همانند یک rvalue
رفتار کند.
در نظر
بگیرید:
struct T { ... }; T fn(T t) { ... return std::move (t); }در اینجا، فراخوانی "std::move" زائد است. از آنجا که G++ مورد Core Issue 1579 را پیادهسازی میکند، مثال دیگر به این صورت است:
struct T { // convertible to U ... }; struct U { ... }; U fn() { T t; ... return std::move (t); }در این مثال، حذف رونوشت قابل اعمال نیست زیرا نوع عبارت در حال بازگشت و نوع بازگشتی تابع متفاوت هستند، با این حال G++ با مقدار بازگشتی به گونهای رفتار میکند که گویی توسط یک rvalue تعیین شده است.
این هشدار توسط -Wextra فعال میشود.
- -Wrange-loop-construct (فقط C++ و Objective-C++)
- این گزینه
زمانی
هشدار
میدهد که
یک حلقه for
مبتنی بر
دامنه (range-based for-loop)
در C++ یک
رونوشت
غیرضروری
ایجاد کند.
این وضعیت
زمانی رخ
میدهد که
اعلان
دامنه یک
ارجاع
نیست، اما
احتمالاً
باید باشد.
برای مثال:
struct S { char arr[128]; }; void fn () { S arr[5]; for (const auto x : arr) { ... } }هنگامی که نوع در حال کپی شدن، نوعی با قابلیت کپی بدیهی (trivially-copyable) باشد که اندازه آن کمتر از ۶۴ بایت است، هشداری داده نمیشود.
این گزینه همچنین زمانی هشدار میدهد که متغیر حلقه در یک حلقه for مبتنی بر دامنه با مقداری از نوع متفاوت مقداردهی اولیه شود که به یک رونوشت منجر شود. برای مثال:
void fn() { int arr[10]; for (const double &x : arr) { ... } }در مثال بالا، در هر تکرار حلقه یک مقدار موقت از نوع "double" ایجاد و نابود میشود که ارجاع "const double &" به آن مقید (bind) شده است.
این هشدار توسط -Wall فعال میشود.
- -Wredundant-tags (فقط C++ و Objective-C++)
- در مورد class-key و
enum-key زائد در
مراجع به
انواع کلاس
و انواع
شمارشی در
زمینههایی
که میتوان
کلید را
بدون ایجاد
ابهام حذف
کرد، هشدار
میدهد.
برای مثال: struct
foo; struct foo *p; // warn that keyword struct can be eliminated
از سوی دیگر، در این مثال هیچ هشداری داده نمیشود:
struct foo; void foo (); // "hides" struct foo void bar (struct foo&); // no warning, keyword struct is necessary
- -Wno-subobject-linkage (تنها C++ و Objective-C++)
- اگر یک نوع کلاس دارای یک کلاس پایه یا فیلدی باشد که نوع آن از فضای نام ناشناس (anonymous namespace) استفاده میکند یا به نوعی بدون پیوند (linkage) وابسته است، هشدار ندهد. اگر نوع A به نوع B با پیوند درونی (internal linkage) یا بدون پیوند وابسته باشد، تعریف آن در چندین واحد ترجمه (translation unit) نقض ODR خواهد بود، زیرا معنای B در هر واحد ترجمه متفاوت است. اگر A تنها در یک واحد ترجمه ظاهر میشود، بهترین راه برای بیصدا کردن هشدار، دادن پیوند درونی به آن با قرار دادنش در یک فضای نام ناشناس است. کامپایلر این هشدار را برای نوعهای تعریفشده در فایل اصلی .C صادر نمیکند، زیرا بعید است که آنها دارای چندین تعریف باشند. گزینهٔ -Wsubobject-linkage به صورت پیشفرض فعال است.
- -Weffc++ (تنها C++ و Objective-C++)
- دربارهٔ نقض رهنمودهای شیوهنامهٔ زیر از مجموعه کتابهای Effective C++ اثر Scott Meyers هشدار میدهد:
- برای کلاسهای دارای حافظه با تخصیص پویا، یک سازندهٔ رونوشت (copy constructor) و یک عملگر انتساب تعریف کنید.
- در سازندهها، مقداردهی اولیه را بر انتساب ترجیح دهید.
- کاری کنید که "operator=" ارجاعی به *this برگرداند.
- زمانی که باید یک شیء را برگردانید، سعی نکنید یک ارجاع برگردانید.
- بین فرمهای پیشوندی و پسوندی عملگرهای افزایش و کاهش تمایز قائل شوید.
- هرگز "&&"، "||" یا "," را سربارگذاری نکنید.
این گزینه همچنین -Wnon-virtual-dtor را که یکی دیگر از توصیههای Effective C++ است فعال میکند. با این حال، این بررسی گسترش یافته تا در مورد نبود ویرانگر مجازی (virtual destructor) در کلاسهای پایه غیرچندریختیِ قابلدسترس نیز هشدار دهد.
هنگام انتخاب این گزینه، توجه داشته باشید که هدرهای کتابخانه استاندارد از تمام این رهنمودها پیروی نمیکنند؛ برای فیلتر کردن این هشدارها از grep -v استفاده کنید.
- -Wno-exceptions (تنها C++ و Objective-C++)
- هشدار مربوط به حالتی را که یک گردانندهٔ استثنا (exception handler) توسط گردانندهٔ دیگری سایهاندازی (shadow) میشود غیرفعال میکند؛ وضعیتی که میتواند نشاندهندهٔ ترتیب نادرست گردانندههای استثنا باشد.
- -Wstrict-null-sentinel (تنها C++ و Objective-C++)
- در مورد استفاده از "NULL" بدون تبدیل نوع به عنوان نگهبان (sentinel) هشدار میدهد. هنگام کامپایل تنها با GCC این یک نگهبان معتبر است، زیرا "NULL" به صورت "__null" تعریف شده است. اگرچه این یک ثابت اشارهگر تهی است نه یک اشارهگر تهی، اما تضمین میشود که اندازهای برابر با یک اشارهگر داشته باشد. با این حال این شیوهٔ استفاده در کامپایلرهای مختلف قابل حمل نیست.
- -Wno-non-template-friend (تنها C++ و Objective-C++)
- هشدارهای مربوط به اعلان توابع دوست غیرالگو (non-template friend functions) را درون یک الگو غیرفعال میکند. در نسخههای بسیار قدیمی GCC که پیش از پیادهسازی استاندارد ISO بودند، اعلانهایی مانند friend int foo(int) که در آنها نام تابع دوست یک شناسه نامقید (unqualified-id) است، میتوانست به عنوان یک تخصیص خاص (specialization) از یک تابع الگو تفسیر شود؛ این هشدار برای تشخیص مشکلات سازگاری وجود دارد و به طور پیشفرض فعال است.
- -Wold-style-cast (تنها C++ و Objective-C++)
- اگر از تبدیل نوع به سبک قدیمی (سبک C) به نوعی غیر از void در یک برنامهٔ C++ استفاده شود، هشدار میدهد. تبدیل نوعهای سبک جدید ("dynamic_cast"، "static_cast"، "reinterpret_cast" و "const_cast") کمتر در معرض اثرات ناخواسته هستند و جستجوی آنها در کد بسیار آسانتر است.
- -Woverloaded-virtual (تنها C++ و Objective-C++)
- -Woverloaded-virtual=n
- زمانی که یک
اعلان
تابع،
توابع
مجازی کلاس
پایه را
پنهان
میکند،
هشدار
میدهد. به
عنوان
مثال، در:
struct A { virtual void f(); }; struct B: public A { void f(int); // does not override };نسخهٔ کلاس "A" از تابع "f" در کلاس "B" پنهان میشود و کدی مانند:
B* b; b->f();
کامپایل نمیشود.
در مواردی که امضاهای متفاوت تصادفی نیستند، سادهترین راهحل افزودن یک اعلان using به کلاس مشتقشده است تا تابع کلاس پایه از حالت پنهان خارج شود؛ برای مثال، افزودن "using A::f;" به "B".
پسوند اختیاری سطح، رفتار را زمانی کنترل میکند که تمام اعلانها در کلاس مشتقشده توابع مجازی کلاس پایه را بازنویسی (override) کنند، حتی اگر همهٔ توابع کلاس پایه بازنویسی نشده باشند:
struct C { virtual void f(); virtual void f(int); }; struct D: public C { void f(int); // does override }این الگو کمتر احتمال دارد که یک اشتباه باشد؛ اگر از D فقط به صورت مجازی استفاده شود، کاربر ممکن است تشخیص داده باشد که معناشناسی کلاس پایه برای برخی از سربارگذاریها مناسب است.
در سطح ۱، این حالت هشداری تولید نمیکند؛ در سطح ۲ هشدار میدهد. گزینهٔ -Woverloaded-virtual به تنهایی سطح ۲ را انتخاب میکند. سطح ۱ در -Wall گنجانده شده است.
- -Wno-pmf-conversions (تنها C++ و Objective-C++)
- پیام تشخیصی برای تبدیل یک اشارهگر مقید به تابع عضو (bound pointer to member function) به یک اشارهگر معمولی را غیرفعال میکند.
- -Wsign-promo (تنها C++ و Objective-C++)
- زمانی که تفکیک سربارگذاری (overload resolution)، ترفیع از نوع بدون علامت یا شمارشی به یک نوع علامتدار را به تبدیل به یک نوع بدون علامت با همان اندازه ترجیح میدهد، هشدار میدهد. نسخههای قبلی G++ سعی میکردند بدون علامت بودن را حفظ کنند، اما استاندارد رفتار فعلی را الزامی کرده است.
- -Wtemplates (تنها C++ و Objective-C++)
- هنگامی که با اعلان یک الگوی اولیه (primary template) مواجه میشود، هشدار میدهد. برخی قواعد کدنویسی استفاده از الگوها را منع میکنند و از این گزینه میتوان برای اعمال آن قاعده استفاده کرد. این هشدار در فایلهای هدر سیستمی، مانند STL، غیرفعال است، بنابراین همچنان میتوان از STL استفاده کرد. همچنین میتوان الگوها را نمونهسازی یا تخصیص داد.
- -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 برای اعلانهای ساختارها (structs)، کلاسها (classes) و الگوهای کلاس (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 پورتپذیر باشند، این هشدار به جلوگیری از ارجاعهای حلنشده به دلیل تفاوت در درهمسازی نمادهای (mangling of symbols) اعلانشده با class-keyهای متفاوت کمک میکند. این گزینه را میتوان به تنهایی یا در کنار -Wredundant-tags به کار برد.
- -Wmultiple-inheritance (فقط C++ و Objective-C++)
- هنگامی که یک کلاس با چندین کلاس پایهٔ مستقیم تعریف شود، هشدار میدهد. برخی از قواعد کدنویسی وراثت چندگانه را منع میکنند و این گزینه میتواند برای اعمال آن قاعده به کار رود. این هشدار درون فایلهای سرآیند سیستم، مانند STL غیرفعال است، بنابراین همچنان میتوان از STL استفاده کرد. همچنین میتوان کلاسهایی تعریف کرد که بهطور غیرمستقیم از وراثت چندگانه استفاده میکنند.
- -Wvirtual-inheritance
- هنگامی که یک کلاس با یک کلاس پایهٔ مستقیم مجازی تعریف شود، هشدار میدهد. برخی از قواعد کدنویسی وراثت چندگانه را منع میکنند و این گزینه میتواند برای اعمال آن قاعده به کار رود. این هشدار درون فایلهای سرآیند سیستم، مانند STL غیرفعال است، بنابراین همچنان میتوان از STL استفاده کرد. همچنین میتوان کلاسهایی تعریف کرد که بهطور غیرمستقیم از وراثت مجازی استفاده میکنند.
- -Wno-virtual-move-assign
- هشدارهای مربوط به ارثبری از یک پایهٔ مجازی با عملگر انتساب انتقال (move assignment operator) غیربدیهی (non-trivial) در C++11 را نادیده میگیرد. این وضعیت خطرناک است، زیرا اگر پایهٔ مجازی از بیش از یک مسیر در دسترس باشد، چندین بار منتقل (move) میشود که میتواند به این معنی باشد هر دو شیء در وضعیت منتقلشده (moved-from) قرار میگیرند. اگر عملگر انتساب انتقال بهگونهای نوشته شده باشد که از انتقال مجدد از یک شیء منتقلشده جلوگیری کند، میتوان این هشدار را غیرفعال کرد.
- -Wnamespaces
- هنگامی که یک تعریف فضای نام (namespace) باز میشود، هشدار میدهد. برخی قواعد کدنویسی استفاده از فضاهای نام را منع میکنند و این گزینه میتواند برای اعمال آن قاعده استفاده شود. این هشدار درون فایلهای سرآیند سیستم مانند STL غیرفعال است، بنابراین همچنان میتوان از STL استفاده کرد. همچنین میتوان از رهنمودهای using و نامهای واجد شرایط (qualified names) استفاده کرد.
- -Wno-template-body (فقط C++ و Objective-C++)
- تشخیص خطاها را هنگام تجزیهٔ یک الگو غیرفعال کرده و به جای آن، خطا را تنها هنگام نمونهسازی (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 entity) را
پنهان
میکند،
هشدار
میدهد. در
بیشتر
موارد،
ارجاع به یک
نهاد محلیِ
واحد ترجمه
(مانند یک
اعلان با
پیوند
درونی / 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++)
- هنگامی که یک تابع تبدیل، یک شیء را به همان نوع، به یک کلاس پایه از آن نوع، یا به 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-expression برای
نوعی که به
همترازی
(alignment)
بزرگتری
نسبت به
alignof(std::max_align_t)
نیاز دارد
اما از یک
تابع تخصیص
بدون
پارامتر
همترازی
صریح
استفاده
میکند،
هشدار
میدهد. این
گزینه توسط
-Wall فعال
میشود.
معمولاً این گزینه تنها دربارهٔ توابع تخصیص سراسری هشدار میدهد، اما -Waligned-new=all دربارهٔ توابع تخصیص عضو کلاس نیز هشدار صادر میکند.
- -Wno-placement-new
- -Wplacement-new=n
- دربارهٔ
عبارتهای
placement new با رفتار
تعریفنشده
(undefined behavior) هشدار
میدهد،
مانند ساخت
یک شیء در
بافری که از
نوع شیء
کوچکتر
است. برای
نمونه،
عبارت placement new
زیر تشخیص
داده
میشود
زیرا تلاش
میکند
آرایهای
از ۶۴ عدد
صحیح را در
بافری که
تنها ۶۴
بایت است
بسازد.
char buf [64]; new (buf) int[64];
این هشدار به صورت پیشفرض فعال است.
- -Wplacement-new=1
- این سطحِ
هشدارِ
پیشفرض
برای -Wplacement-new
است. در این
سطح، هشدار
برای برخی
ساختارهای
اکیداً
تعریفنشده
که GCC آنها
را به عنوان
افزونه جهت
سازگاری با
کدهای
قدیمی مجاز
میداند،
صادر
نمیشود.
برای
نمونه،
عبارت
"new" زیر
در این سطح
تشخیص داده
نمیشود با
اینکه بر
اساس
استاندارد
C++ دارای
رفتار
تعریفنشده
است، چرا که
فراتر از
انتهای
آرایهٔ
تکعنصری
مینویسد.
struct S { int n, a[1]; }; S *s = (S *)malloc (sizeof *s + 31 * sizeof s->a[0]); new (s->a)int [32](); در این سطح، علاوه بر تشخیص تمامی ساختارهای مشابه در سطح ۱، برای عبارتهای placement new نیز که شیئی را در آخرین عضو از ساختاری میسازند که نوع آن یک آرایهٔ تکعنصری است و اندازهٔ آن کمتر از اندازهٔ شیء در حال ساخت است، پیام تشخیصی صادر میشود. در حالی که مثال قبلی مشمول هشدار میشد، ساختار زیر با استفاده از افزونهٔ عضو آرایهای انعطافپذیر (flexible member array) از هشدار در سطح ۲ جلوگیری میکند. struct S { int n, a[]; }; S *s = (S *)malloc (sizeof *s + 32 * sizeof s->a[0]); new (s->a)int [32]();
- -Wcatch-value
- -Wcatch-value=n (فقط C++ و Objective-C++)
- هشدار دربارهٔ گردانندههای catch که با ارجاع (reference) دریافت نمیکنند. با -Wcatch-value=1 (یا به اختصار -Wcatch-value) دربارهٔ انواع کلاسهای چندریختی (polymorphic) که با مقدار (by value) گرفته میشوند هشدار میدهد. با -Wcatch-value=2 دربارهٔ تمامی انواع کلاسهایی که با مقدار دریافت میشوند هشدار میدهد. با -Wcatch-value=3 دربارهٔ تمامی انواعی که از طریق ارجاع گرفته نمیشوند هشدار میدهد. -Wcatch-value توسط -Wall فعال میشود.
- -Wconditionally-supported (فقط C++ و Objective-C++)
- هشدار برای ساختارهای با پشتیبانی مشروط (C++11 [intro.defs]).
- -Wno-defaulted-function-deleted (فقط C++ و Objective-C++)
- هشدار زمانی که یک تابع صراحتاً پیشفرضشده (defaulted)، توسط کامپایلر حذف (delete) میشود. این حالت زمانی میتواند رخ دهد که نوع اعلانشدهٔ تابع با نوع تابعی که به طور ضمنی اعلان میشد مطابقت نداشته باشد. این هشدار به طور پیشفرض فعال است.
- -Wno-delete-incomplete (فقط C++ و Objective-C++)
- هنگام حذف (delete کردن) یک اشارهگر به نوع ناقص (incomplete type)، که ممکن است رفتار تعریفنشدهای در زمان اجرا ایجاد کند، هشدار نده. این هشدار به طور پیشفرض فعال است.
- -Wextra-semi (فقط C++ و Objective-C++)
- هشدار
دربارهٔ
نقطهویرگولهای
(semicolon) اضافه.
زمینههای
مختلفی
وجود دارد
که در آنها
ممکن است
نقطهویرگول
اضافی رخ
دهد. یکی از
آنها
نقطهویرگول
پس از
تعاریف
توابع
درونکلاسی
است که در
همهٔ
گویشهای C++
معتبر است
(و هرگز یک pedwarn
نیست):
struct S { void foo () {}; };دیگری یک نقطهویرگول اضافی در حوزهٔ فضای نام (namespace scope) است که از C++11 به بعد مجاز شده است (بنابراین در C++98 یک pedwarn محسوب میشود):
struct S { }; ;و مورد دیگر یک نقطهویرگول اضافی در تعاریف کلاس است که از C++11 مجاز شده است (بنابراین در C++98 یک pedwarn است):
struct S { int a; ; }; - -Wno-global-module (فقط C++ و Objective-C++)
- غیرفعال کردن پیام تشخیصی در زمانی که قطعهٔ ماژول سراسری (global module fragment) یک واحد ماژول، صرفاً از دستورات پیشپردازنده تشکیل نشده باشد.
- -Wno-inaccessible-base (فقط C++ و Objective-C++)
- این گزینه
هشدارهایی
را کنترل
میکند که
در صورت عدم
دسترسی به
یک کلاس
پایه در
کلاس
مشتقشده
از آن به
دلیل ابهام
صادر
میشوند.
این هشدار
به طور
پیشفرض
فعال است.
توجه داشته
باشید که
هشدار
مربوط به
کلاسهای
پایهٔ
مجازیِ (virtual base)
مبهم، با
گزینهٔ -Wextra
فعال
میشود.
struct A { int a; }; struct B : A { }; struct C : B, A { }; - -Wno-inherited-variadic-ctor
- فرونشاندن هشدارها دربارهٔ استفاده از سازندههای ارثبریشدهٔ C++11 در زمانی که کلاس پایهای که از آن ارث برده شده، دارای سازندهٔ متغیرآرگومان به سبک C (موسوم به C variadic) باشد؛ این هشدار به طور پیشفرض فعال است زیرا سهنقطه (ellipsis) به ارث برده نمیشود.
- -Wno-invalid-offsetof (فقط C++ و Objective-C++)
- فرونشاندن
هشدارهای
ناشی از
اعمال
ماکروی
"offsetof" بر
روی یک نوع
غیر POD (یا non-POD). بر
اساس
استاندارد
ISO C++ سال ۲۰۱۴،
اعمال
"offsetof" بر
روی نوعی که
ساختار
استاندارد
ندارد (non-standard-layout)
تعریفنشده
(undefined) است. با
این حال، در
پیادهسازیهای
موجود C++،
معمولاً
"offsetof"
نتایج
معناداری
ارائه
میدهد. این
پرچم برای
کاربرانی
است که
آگاهند کدی
غیرقابلحمل
(nonportable)
مینویسند
و آگاهانه
تصمیم
گرفتهاند
هشدار
مربوط به آن
را نادیده
بگیرند.
محدودیتهای مربوط به "offsetof" ممکن است در نسخههای آیندهٔ استاندارد C++ تسهیل شوند.
- -Wsized-deallocation (فقط C++ و Objective-C++)
- هشدار
دربارهٔ
تعریف یک
تابع
آزادسازی
حافظهٔ
بدون
اندازه (unsized deallocation)
void operator delete (void *) noexcept; void operator delete[] (void *) noexcept;
بدون تعریف تابع متناظر آزادسازی حافظه با اندازه (sized deallocation)
void operator delete (void *, std::size_t) noexcept; void operator delete[] (void *, std::size_t) noexcept;
یا برعکس. این گزینه با -Wextra به همراه -fsized-deallocation فعال میشود.
- -Wsuggest-final-types
- هشدار دربارهٔ انواعی با متدهای مجازی که اگر آن نوع با مشخصکنندهٔ "final" در C++11 اعلان میشد، یا در صورت امکان درون یک فضای نام بینام (anonymous namespace) قرار میگرفت، کیفیت کد بهبود مییافت. این امر به GCC اجازه میدهد تا فراخوانیهای چندریختی را با تهاجم بیشتری مجازیزدایی (devirtualize) کند. این هشدار در هنگام بهینهسازی زمان پیوند (link-time optimization) که اطلاعات مربوط به گراف سلسلهمراتب کلاسها کاملتر است، کارایی بیشتری دارد.
- -Wsuggest-final-methods
- هشدار دربارهٔ متدهای مجازی که اگر متد با مشخصکنندهٔ "final" در C++11 اعلان میشد، یا در صورت امکان نوع آن در یک فضای نام بینام یا با مشخصکنندهٔ "final" اعلان میشد، کیفیت کد بهبود مییافت. این هشدار همراه با بهینهسازی زمان پیوند (link-time optimization) که اطلاعات مربوط به گراف سلسلهمراتب کلاسها کاملتر است، کارایی بیشتری دارد. پیشنهاد میشود ابتدا توصیههای -Wsuggest-final-types را بررسی کرده و سپس با نشانهگذاریهای جدید برنامه را بازسازی کنید.
- -Wsuggest-override
- هشدار دربارهٔ توابع مجازی بازنویسیشدهای که با کلمهٔ کلیدی "override" نشانهگذاری نشدهاند.
- -Wno-conversion-null (فقط C++ و Objective-C++)
- برای تبدیلها میان "NULL" و انواع غیر اشارهگری هشدار نده. -Wconversion-null به طور پیشفرض فعال است..SS "گزینههای کنترلکننده گویشهای Objective-C و Objective-C++" (یادداشت: این راهنما خود زبانهای Objective-C و Objective-C++ را توصیف نمیکند.
این بخش گزینههای خط فرمانی را شرح میدهد که تنها برای برنامههای Objective-C و Objective-C++ معنا دارند. شما همچنین میتوانید از بیشتر گزینههای مستقل از زبان کامپایلر GNU استفاده کنید. برای نمونه، ممکن است یک فایل some_class.m را اینگونه کامپایل کنید:
gcc -g -fgnu-runtime -O -c some_class.m
در این مثال، -fgnu-runtime گزینهای است که تنها برای برنامههای Objective-C و Objective-C++ در نظر گرفته شده است؛ میتوانید گزینههای دیگر را با هر زبانی که توسط GCC پشتیبانی میشود استفاده کنید.
توجه داشته باشید از آنجا که Objective-C گسترشی از زبان C است، کامپایلهای Objective-C ممکن است از گزینههای مختص پیشانه (front-end) زبان C نیز استفاده کنند (مانند -Wtraditional). بهطور مشابه، کامپایلهای Objective-C++ میتوانند از گزینههای ویژه C++ بهره ببرند (مانند -Wabi).
در ادامه فهرستی از گزینههایی آمده است که تنها برای کامپایل برنامههای Objective-C و Objective-C++ هستند:
- -fconstant-string-class=class-name
- از class-name به عنوان نام کلاسی که باید برای هر رشتهی مصرح (literal string) مشخصشده با نحو "@"..."" نمونهسازی شود، استفاده میکند. در صورتی که زمان اجرای (runtime) گنو استفاده شود نام کلاس پیشفرض "NXConstantString" است، و در صورتی که زمان اجرای NeXT استفاده شود "NSConstantString" خواهد بود (پایین را ببینید). در پلتفرمهای Darwin / macOS، گزینهی -fconstant-cfstrings در صورت حضور، تنظیمات -fconstant-string-class را بازنویسی کرده و موجب میشود مقادیر مصرح "@"..."" به عنوان رشتههای ثابت CoreFoundation چیدمان شوند. توجه داشته باشید که -fconstant-cfstrings یک نام مستعار برای معادل مختص هدف -mconstant-cfstrings است.
- -fgnu-runtime
- کد شیء (object code) سازگار با زمان اجرای استاندارد GNU Objective-C تولید میکند. این حالت پیشفرض برای اکثر انواع سیستمها است.
- -fnext-runtime
- خروجی سازگار با زمان اجرای NeXT تولید میکند. این حالت پیشفرض برای سیستمهای مبتنی بر NeXT، از جمله Darwin / macOS است. ماکروی "__NEXT_RUNTIME__" در صورتی که (و تنها در صورتی که) این گزینه استفاده شود، از پیش تعریف میشود.
- -fno-nil-receivers
- فرض میکند که تمام ارسالهای پیام (message dispatches) در Objective-C ("[receiver message:arg]") در این واحد ترجمه (translation unit) تضمین میکنند که گیرنده "nil" نیست. این کار امکان استفاده از نقاط ورود کارآمدتر را در زمان اجرا فراهم میسازد. این گزینه تنها همراه با زمان اجرای NeXT و نسخه ۰ یا ۱ از ABI در دسترس است.
- -fobjc-abi-version=n
- از نسخه n از Objective-C ABI برای زمان اجرای انتخابشده استفاده میکند. این گزینه در حال حاضر تنها برای زمان اجرای NeXT پشتیبانی میشود. در آن حالت، نسخه ۰ همان ABI سنتی (۳۲ بیتی) بدون پشتیبانی از مشخصهها (properties) و دیگر امکانات افزوده Objective-C 2.0 است. نسخه ۱ همان ABI سنتی (۳۲ بیتی) با پشتیبانی از مشخصهها و دیگر امکانات افزوده Objective-C 2.0 است. نسخه ۲ همان ABI مدرن (۶۴ بیتی) است. اگر چیزی مشخص نشود، پیشفرض در ماشینهای هدف ۳۲ بیتی نسخه ۰ و در ماشینهای هدف ۶۴ بیتی نسخه ۲ است.
- -fobjc-call-cxx-cdtors
- برای هر
کلاس Objective-C،
بررسی
میکند که
آیا هیچیک
از
متغیرهای
نمونه آن یک
شیء C++ با
سازنده
پیشفرض
غیربدیهی
(non-trivial) هست یا
خیر. در این
صورت، متد
نمونه ویژه
"- (id) .cxx_construct" را
میسازد که
سازندههای
پیشفرض
غیربدیهی
را روی هر
یک از این
متغیرهای
نمونه، به
ترتیب اجرا
میکند و
سپس "self"
را
برمیگرداند.
بهطور
مشابه،
بررسی
میکند که
آیا متغیر
نمونهای
شیء C++ با
ویرانکننده
(destructor)
غیربدیهی
هست یا خیر،
و در این
صورت متد
ویژه "- (void)
.cxx_destruct" را
میسازد که
تمام این
ویرانکنندههای
پیشفرض را
به ترتیب
معکوس اجرا
میکند.
متدهای "- (id) .cxx_construct" و "- (void) .cxx_destruct" که بدین ترتیب ساخته میشوند تنها روی متغیرهای نمونه اعلانشده در کلاس Objective-C فعلی عمل میکنند، نه متغیرهایی که از ابرکلاسها به ارث رسیدهاند. فراخوانی تمام این متدها در سلسلهمراتب وراثت یک شیء بر عهده زمان اجرای Objective-C است. متدهای "- (id) .cxx_construct" بلافاصله پس از تخصیص نمونه شیء جدید توسط زمان اجرا فراخوانی میشوند؛ متدهای "- (void) .cxx_destruct" نیز بلافاصله پیش از آنکه زمان اجرا نمونه شیء را آزاد کند، فراخوانی میشوند.
در زمان نگارش این مستند، تنها زمان اجرای NeXT در Mac OS X 10.4 و جدیدتر از فراخوانی متدهای "- (id) .cxx_construct" و "- (void) .cxx_destruct" پشتیبانی میکند.
- -fobjc-direct-dispatch
- پرشهای سریع به توزیعکننده پیام (message dispatcher) را مجاز میشمارد. در Darwin این کار از طریق comm page انجام میگیرد.
- -fobjc-exceptions
- پشتیبانی نحوی از مدیریت ساختاریافته استثناها را در Objective-C، مشابه آنچه در C++ ارائه میشود، فعال میکند. این گزینه برای استفاده از کلمات کلیدی Objective-C شامل @try، @throw، @catch، @finally و @synchronized الزامی است. این گزینه هم با زمان اجرای GNU و هم با زمان اجرای NeXT در دسترس است (اما در Mac OS X 10.2 و قدیمیتر همراه با زمان اجرای NeXT در دسترس نیست).
- -fobjc-gc
- بازیافت حافظه (GC) را در برنامههای Objective-C و Objective-C++ فعال میکند. این گزینه تنها با زمان اجرای NeXT در دسترس است؛ زمان اجرای GNU پیادهسازی متفاوتی از بازیافت حافظه دارد که نیازی به پرچمهای خاص کامپایلر ندارد.
- -fobjc-nilcheck
- برای زمان اجرای NeXT با نسخه ۲ از ABI، گیرنده را پیش از انجام فراخوانی واقعی متد، از نظر nil بودن در فراخوانیهای متد بررسی میکند. این حالت پیشفرض است و با استفاده از -fno-objc-nilcheck میتواند غیرفعال شود. متدهای کلاس و فراخوانیهای super بدون توجه به مقدار این پرچم، هرگز به این صورت برای nil بررسی نمیشوند. در حال حاضر هنگام استفاده از زمان اجرای GNU یا نسخه قدیمیتر ABI زمان اجرای NeXT، این پرچم هیچ عملی انجام نمیدهد.
- -fobjc-std=objc1
- از نحو زبان Objective-C 1.0، زبانی که توسط GCC 4.0 شناخته میشود، پیروی میکند. این گزینه تنها بر افزونههای Objective-C به زبان C/C++ اثر میگذارد؛ و بر انطباق با استانداردهای C/C++ که با پرچمهای مجزای گزینههای گویش C/C++ کنترل میشوند، اثری ندارد. هنگامی که این گزینه با کامپایلر Objective-C یا Objective-C++ استفاده شود، هر نحو Objective-C که توسط GCC 4.0 شناخته نشود رد میشود. این ویژگی زمانی مفید است که بخواهید اطمینان حاصل کنید کد Objective-C شما با نسخههای قدیمیتر GCC قابل کامپایل است.
- -freplace-objc-classes
- یک نشانگر ویژه صادر میکند که به ld(1) دستور میدهد فایل شیء حاصل را به صورت ایستا پیوند ندهد و در عوض به dyld(1) اجازه دهد آن را در زمان اجرا بارگذاری کند. این گزینه همراه با حالت اشکالزدایی Fix-and-Continue استفاده میشود، که در آن فایل شیء مورد نظر ممکن است در جریان اجرای برنامه و بدون نیاز به راهاندازی مجدد خود برنامه، دوباره کامپایل شده و به طور پویا مجدداً بارگذاری شود. در حال حاضر، قابلیت Fix-and-Continue تنها همراه با زمان اجرای NeXT در Mac OS X 10.3 و جدیدتر در دسترس است.
- -fzero-link
- هنگام کامپایل برای زمان اجرای NeXT، کامپایلر به طور معمول فراخوانیهای objc_getClass("...") را (زمانی که نام کلاس در زمان کامپایل مشخص است) با ارجاعات ایستای کلاس که در زمان بارگذاری مقداردهی اولیه میشوند جایگزین میکند، که کارایی زمان اجرا را بهبود میبخشد. مشخص کردن پرچم -fzero-link این رفتار را لغو کرده و موجب میشود فراخوانیهای objc_getClass("...") حفظ شوند. این ویژگی در حالت اشکالزدایی Zero-Link مفید است، زیرا امکان تغییر پیادهسازی کلاسهای منفرد را در حین اجرای برنامه فراهم میکند. زمان اجرای GNU در حال حاضر بدون توجه به گزینههای خط فرمان، همیشه فراخوانیهای objc_get_class("...") را حفظ میکند.
- -fno-local-ivars
- بهطور پیشفرض در Objective-C، میتوان از درون متدهای کلاسی که متغیرهای نمونه در آن اعلان شدهاند، به گونهای به آنها دسترسی داشت که گویی متغیرهای محلی هستند. این امر میتواند منجر به سایهاندازی (shadowing) میان متغیرهای نمونه و متغیرهای دیگری شود که یا به صورت محلی درون متد کلاس و یا به صورت سراسری با همان نام اعلان شدهاند. تعیین پرچم -fno-local-ivars این رفتار را غیرفعال کرده و بدین ترتیب از مسائل سایهاندازی متغیرها جلوگیری میکند.
- -fivar-visibility=[public|protected|private|package]
- دیداریپذیری پیشفرض متغیر نمونه را روی گزینه مشخصشده تنظیم میکند، به طوری که متغیرهای نمونه اعلانشده در خارج از محدوده هرگونه دستور اصلاحکننده دسترسی، بهطور پیشفرض دارای دیداریپذیری مشخصشده باشند.
- -gen-decls
- اعلانهای واسط (interface declarations) را برای تمام کلاسهای دیدهشده در فایل مبدأ، درون فایلی به نام sourcename.decl تخلیه (dump) میکند.
- -Wassign-intercept (تنها Objective-C و Objective-C++)
- هر زمان که یک انتساب Objective-C توسط بازیافتکننده حافظه (garbage collector) رهگیری شود، هشدار میدهد.
- -Wno-property-assign-default (تنها Objective-C و Objective-C++)
- اگر برای یک مشخصه شیء Objective-C هیچ معناشناسی انتسابی (assign semantics) مشخص نشده باشد، هشداری صادر نمیکند.
- -Wno-protocol (تنها Objective-C و Objective-C++)
- اگر کلاسی برای پیادهسازی یک پروتکل اعلان شده باشد، برای هر متدی در پروتکل که توسط کلاس پیادهسازی نشده باشد هشداری صادر میشود. رفتار پیشفرض این است که برای هر متدی که صریحاً در کلاس پیادهسازی نشده هشدار صادر شود، حتی اگر پیادهسازی آن متد از ابرکلاس به ارث رسیده باشد. اگر از گزینه -Wno-protocol استفاده کنید، متدهای به ارث رسیده از ابرکلاس به عنوان پیادهسازیشده در نظر گرفته میشوند و هیچ هشداری برای آنها صادر نمیشود..IP "-Wobjc-root-class (تنها Objective-C و Objective-C++)" 4 اگر رابط یک کلاس فاقد ابرکلاس باشد، هشدار میدهد. برای نمونه، اکثر کلاسها از "NSObject" (یا "Object") ارثبری میکنند. هنگام اعلان کلاسهایی که قرار است کلاسهای ریشه باشند، میتوان با نشانهگذاری رابط آنها با "__attribute__((objc_root_class))" این هشدار را لغو کرد.
- -Wselector (تنها Objective-C و Objective-C++)
- اگر در طول کامپایل، متدهای متعددی با انواع مختلف برای یک سلکتور یکسان پیدا شوند، هشدار میدهد. این بررسی بر روی فهرست متدها در مرحله نهایی کامپایل انجام میشود. علاوه بر این، بررسی برای هر سلکتوری که در یک عبارت @selector(...) ظاهر شده و متد متناظر با آن سلکتور در طول کامپایل پیدا شده باشد، صورت میگیرد. از آنجا که این بررسیها جدول متدها را تنها در پایان کامپایل پیمایش میکنند، چنانچه مرحله نهایی کامپایل حاصل نشود، مثلاً به دلیل بروز خطا در طول کامپایل یا استفاده از گزینه -fsyntax-only، این هشدارها تولید نخواهند شد.
- -Wstrict-selector-match (تنها Objective-C و Objective-C++)
- اگر هنگام تلاش برای ارسال پیام با استفاده از این سلکتور به دریافتکنندهای از نوع "id" یا "Class"، متدهای متعددی با انواع آرگومان و/یا انواع بازگشتی متفاوت برای آن سلکتور یافت شوند، هشدار میدهد. هنگامی که این پرچم خاموش است (که رفتار پیشفرض است)، کامپایلر در صورتی که تفاوتهای یافتشده به انواعی که اندازه و تراز یکسانی دارند محدود باشد، از این هشدارها صرفنظر میکند.
- -Wundeclared-selector (تنها Objective-C و Objective-C++)
- اگر یک عبارت @selector(...) که به یک سلکتور اعلاننشده ارجاع میدهد پیدا شود، هشدار میدهد. یک سلکتور در صورتی اعلاننشده در نظر گرفته میشود که هیچ متدی با آن نام پیش از عبارت @selector(...) اعلان نشده باشد، خواه به صورت صریح در یک اعلان @interface یا @protocol، یا به صورت ضمنی در یک بخش @implementation. این گزینه همیشه بررسیهای خود را به محض یافتن یک عبارت @selector(...) انجام میدهد، در حالی که -Wselector بررسیهای خود را تنها در مرحله نهایی کامپایل اجرا مینماید. این امر همچنین این شیوه استاندارد کدنویسی را تحمیل میکند که متدها و سلکتورها باید پیش از استفاده اعلان شوند.
- -print-objc-runtime-info
- یک سربرگ C تولید میکند که بزرگترین ساختاری را که بر حسب مقدار (by value) ارسال میشود، در صورت وجود، توصیف مینماید.
گزینههای کنترل OpenMP و OpenACC
کامپایلر GCC از افزونههای OpenMP برای زبانهای C، C++ و Fortran با استفاده از گزینه -fopenmp پشتیبانی میکند. به طور مشابه، افزونههای OpenACC در هر سه زبان از طریق -fopenacc پشتیبانی میشوند.
- -foffload=disable
- -foffload=default
- -foffload=target-list
- مشخص
میکند که
برای کدام
مقصدهای
برونسپاری
(offload) در OpenMP و OpenACC
باید کد
تولید شود.
رفتار
پیشفرض،
معادل -foffload=default،
تولید کد
برای تمامی
مقصدهای
برونسپاری
پشتیبانیشده
است. حالت
-foffload=disable کد را
تنها برای
میزبان
جایگزین (host fallback)
تولید
میکند، در
حالی که
-foffload=target-list کد را
تنها برای
فهرست
مشخصشدهای
از مقصدهای
برونسپاری
که با کاما
جدا
شدهاند،
تولید
مینماید.
مقصدهای برونسپاری در قالب سهگانه مقصد (target-triplet) داخلی GCC تعیین میشوند. میتوانید کامپایلر را با گزینه -v اجرا کنید تا فهرست مقصدهای برونسپاری پیکربندیشده در زیر "OFFLOAD_TARGET_NAMES" نمایش داده شود.
- -foffload-options=options
- -foffload-options=target-triplet-list=options
- با استفاده
از -foffload-options=options،
کامپایلر GCC
گزینههای
مشخصشده
در options را به
کامپایلرهای
تمامی
مقصدهای
برونسپاریِ
فعال ارسال
میکند. با
استفاده از
ساختار
-foffload-options=target-list=options
میتوانید
گزینههایی
را مشخص
کنید که
تنها بر روی
یک مقصد یا
مقصدهای
مشخص اعمال
شوند. target-list
فهرستی از
مقادیر جدا
شده با کاما
در همان
قالبی است
که برای
گزینه -foffload=
به کار
میرود.
خط فرمانهای معمول به شرح زیر هستند:
-foffload-options='-fno-math-errno -ffinite-math-only' \ -foffload-options=nvptx-none=-latomic -foffload-options=amdgcn-amdhsa=-march=gfx906 - -fopenacc
- پردازش رهنمودهای OpenACC شامل #pragma acc در C/C++ و !$acc در Fortran با قالب آزاد و همچنین !$acc، c$acc و *$acc در Fortran با قالب ثابت را فعال میکند. این گزینه مستلزم -pthread است، و بنابراین تنها در مقصدهایی پشتیبانی میشود که از -pthread پشتیبانی کنند.
- -fopenacc-dim=geom
- ابعاد محاسباتی پیشفرض را برای نواحی برونسپاری موازی که آنها را به طور صریح مشخص نکردهاند، تعیین میکند. مقدار geom یک سهتایی از اندازههای جدا شده با : به ترتیب gang، worker و vector است. میتوان یک اندازه را حذف کرد تا مقدار پیشفرضِ مختص آن مقصد استفاده شود.
- -fopenmp
- پردازش
رهنمودهای
OpenMP شامل #pragma omp،
[[omp::directive(...)]]، [[omp::decl(...)]] و
[[omp::sequence(...)]] در C/C++ را
فعال
میکند. در
Fortran، گزینه !$omp
و نشانه
کامپایل
شرطی !$ را
فعال
میسازد. در
Fortran با ساختار
منبع ثابت،
نشانهها
همچنین
میتوانند
با c یا *
آغاز شوند.
این گزینه مستلزم -pthread است، و به همین جهت تنها بر روی مقصدهایی پشتیبانی میشود که از -pthread پشتیبانی کنند. -fopenmp متضمن -fopenmp-simd نیز هست.
- -fopenmp-simd
- پردازش رهنمودهای "simd"، "declare simd"، "declare reduction"، "assume"، "ordered"، "scan" و "loop" در OpenMP و همچنین رهنمودهای ترکیبی یا تلفیقی با جزء "simd" را با "#pragma omp"، "[[omp::directive(...)]]"، "[[omp::sequence(...)]]" و "[[omp::decl(...)]]" در C/C++ و "!$omp" در Fortran فعال میکند. علاوه بر این، نشانه کامپایل شرطی !$ را در Fortran فعال میسازد. در قالب منبع ثابت Fortran، نشانهها میتوانند با c یا * نیز شروع شوند. سایر رهنمودهای OpenMP نادیده گرفته میشوند. مگر اینکه علاوه بر این -fopenmp نیز مشخص شده باشد، ناحیه "loop" مستقل از بند "bind" تعیینشده، به ناحیه وظیفه جاری متصل (bind) میشود.
- -fopenmp-target-simd-clone
- -fopenmp-target-simd-clone=device-type
- علاوه بر
ایجاد
همتاهای (clones) SIMD
برای
توابعی که
با رهنمود
"declare simd"
نشانهگذاری
شدهاند،
زمانی که
این گزینه
فعال باشد GCC
همتاهایی
را نیز برای
توابعی که
با رهنمود OpenMP
به نام "declare
target" مشخص
شده و برای
برداریسازی
مناسب
هستند،
تولید
میکند.
مقدار device-type
میتواند
یکی از
مقادیر
"none"،
"host"،
"nohost" و
"any" باشد
که با کلمات
کلیدیِ بند
"device_type" در
رهنمود
"declare target"
متناظر
هستند؛
همتاها
برای
اشتراک
دستگاههای
مشخصشده
ایجاد
میشوند.
-fopenmp-target-simd-clone معادل
-fopenmp-target-simd-clone=any بوده
و -fno-openmp-target-simd-clone
معادل
-fopenmp-target-simd-clone=none است.
در بهینهسازی -O2 و بالاتر (به جز -Os یا -Og) مقدار پیشفرض این بهینهسازی -fopenmp-target-simd-clone=nohost است؛ در غیر این صورت به طور پیشفرض غیرفعال میباشد..SS "گزینههای واپایش قالببندی پیامهای تشخیصی (Options to Control Diagnostic Messages Formatting)" بهطور سنتی، پیامهای تشخیصی بدون در نظر گرفتن وضعیت ظاهری دستگاه خروجی (مانند پهنای آن، ...) قالببندی شدهاند. میتوانید از گزینههای شرحدادهشده در زیر برای واپایش الگوریتم قالببندی پیامهای تشخیصی استفاده کنید، مانند این که چند نویسه در هر خط قرار گیرد یا اطلاعات مکان در کد منبع هر چند وقت یکبار گزارش شود. توجه داشته باشید که ممکن است برخی فرانتاندهای زبانها این گزینهها را رعایت نکنند.
- -fmessage-length=n
- تلاش
میکند
پیامهای
خطا را
بهگونهای
قالببندی
کند که در
خطوطی با
حدود n
نویسه جا
شوند. اگر n
صفر باشد،
هیچ شکست
خطی انجام
نمیشود؛
هر پیام خطا
در یک خط
نمایان
میشود. این
حالت
پیشفرض
برای تمامی
فرانتاندها
است.
نکته - این گزینه همچنین بر نمایش دستورات پیشپردازندهٔ #error و #warning، و ویژگی deprecated برای توابع/انواع/متغیرها تأثیر میگذارد. با این حال، بر پراگماهای pragma GCC warning و pragma GCC error تأثیری ندارد.
- -fdiagnostics-plain-output
- این گزینه درخواست میکند خروجی تشخیصی تا حد امکان ساده باشد، که ممکن است هنگام اجرای dejagnu یا ابزارهای دیگری که نیاز به تجزیهٔ خروجی تشخیصی دارند و ترجیح میدهند این خروجی در گذر زمان پایدارتر بماند، مفید باشد. -fdiagnostics-plain-output در حال حاضر معادل گزینههای زیر است: -fno-diagnostics-show-caret -fno-diagnostics-show-line-numbers -fdiagnostics-color=never -fdiagnostics-urls=never -fdiagnostics-path-format=separate-events -fdiagnostics-text-art-charset=none -fno-diagnostics-show-event-links در آینده، اگر 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
تنها زمانی
از رنگ
استفاده
کند که
خروجی خطای
استاندارد
یک پایانه
باشد، و در
پوستهٔ emacs
اجرا نشود.
فرمهای
-fdiagnostics-color و -fno-diagnostics-color
بهترتیب
نامهای
مستعاری
برای -fdiagnostics-color=always
و -fdiagnostics-color=never
هستند.
رنگها توسط متغیر محیطی GCC_COLORS تعریف میشوند. مقدار آن فهرستی جداشده با دونقطه از قابلیتها و زیررشتههای Select Graphic Rendition (SGR) است. دستورات SGR توسط پایانه یا شبیهساز پایانه تفسیر میشوند. (برای مقادیر مجاز و معانی آنها بهعنوان مشخصههای نویسه، بخش مربوطه در مستندات پایانه متنی خود را ببینید.) این مقادیر زیررشته، اعداد صحیحی در مبنای ده هستند و میتوان آنها را با نقطهویرگول پیوند داد. مقادیر متداول برای ترکیب کردن شامل موارد زیر هستند: 1 برای توپر (bold)، 4 برای خط زیرین (underline)، 5 برای چشمکزن (blink)، 7 برای معکوس (inverse)، 39 برای رنگ پیشزمینهٔ پیشفرض، 30 تا 37 برای رنگهای پیشزمینه، 90 تا 97 برای رنگهای پیشزمینهٔ حالت ۱۶ رنگ، 38;5;0 تا 38;5;255 برای رنگهای پیشزمینهٔ حالتهای ۸۸ رنگ و ۲۵۶ رنگ، 49 برای رنگ پسزمینهٔ پیشفرض، 40 تا 47 برای رنگهای پسزمینه، 100 تا 107 برای رنگهای پسزمینهٔ حالت ۱۶ رنگ، و 48;5;0 تا 48;5;255 برای رنگهای پسزمینهٔ حالتهای ۸۸ رنگ و ۲۵۶ رنگ.
مقدار پیشفرض GCC_COLORS عبارت است از:
error=01;31:warning=01;35:note=01;36:range1=32:range2=34:locus=01:\ quote=01:path=01;36:fixit-insert=32:fixit-delete=31:\ diff-filename=01:diff-hunk=32:diff-delete=31:diff-insert=32:\ type-diff=01;32:fnname=01;32:targs=35:valid=01;31:invalid=01;32\ highlight-a=01;32:highlight-b=01;34
که در آن 01;31 قرمز توپر، 01;35 ارغوانی توپر، 01;36 فیروزهای توپر، 32 سبز، 34 آبی، 01 توپر، و 31 قرمز است. تنظیم GCC_COLORS روی یک رشتهٔ خالی، رنگها را غیرفعال میکند. قابلیتهای پشتیبانیشده به شرح زیر هستند.
- "error="
- زیررشتهٔ SGR برای نشانگرهای :error.
- "warning="
- زیررشتهٔ SGR برای نشانگرهای :warning.
- "note="
- زیررشتهٔ SGR برای نشانگرهای :note.
- "path="
- زیررشتهٔ SGR برای رنگآمیزی مسیرهای رخدادهای جریان کنترل که از طریق -fdiagnostics-path-format= چاپ میشوند، مانند شناسههای رخدادهای منفرد و خطوط نشاندهندهٔ فراخوانیها و بازگشتهای بینروالی.
- "range1="
- زیررشتهٔ SGR برای اولین محدودهٔ اضافی.
- "range2="
- زیررشتهٔ SGR برای دومین محدودهٔ اضافی.
- "locus="
- زیررشتهٔ SGR برای اطلاعات مکان، مانند file:line یا file:line:column و غیره.
- "quote="
- زیررشتهٔ SGR برای اطلاعات چاپشده درون نقلقولها.
- "fnname="
- زیررشتهٔ SGR برای نام توابع ++C.
- "targs="
- زیررشتهٔ SGR برای مقیدسازی پارامترهای قالب توابع ++C.
- "fixit-insert="
- زیررشتهٔ SGR برای نکات راهنمای اصلاحی (fix-it) که متن مورد نظر جهت درج یا جایگزینی را پیشنهاد میدهند.
- "fixit-delete="
- زیررشتهٔ SGR برای نکات راهنمای اصلاحی (fix-it) که متن مورد نظر جهت حذف را پیشنهاد میدهند.
- "diff-filename="
- زیررشتهٔ SGR برای سرآیند نام فایل درون وصلههای تولیدشده.
- "diff-hunk="
- زیررشتهٔ SGR برای آغاز قطعات (hunks) در وصلههای تولیدشده.
- "diff-delete="
- زیررشتهٔ SGR برای خطوط حذفشده در وصلههای تولیدشده.
- "diff-insert="
- زیررشتهٔ SGR برای خطوط درجشده در وصلههای تولیدشده.
- "type-diff="
- زیررشتهٔ SGR برای برجستهسازی انواع ناهمخوان درون آرگومانهای قالب در فرانتاند ++C.
- "valid="
- زیررشتهٔ SGR برای برجستهسازی عنصرهای معتبر درون دیاگرامهای متنی (text art).
- "invalid="
- زیررشتهٔ SGR برای برجستهسازی عنصرهای نامعتبر درون دیاگرامهای متنی (text art).
- "highlight-a="
- "highlight-b="
- زیررشتههای SGR برای ایجاد تضاد دیداری میان دو چیز متفاوت در پیامهای تشخیصی، مانند یک جفت نوع دادهٔ ناهماهنگ. ببینید: -fdiagnostics-show-highlight-colors.
- -fdiagnostics-urls[=WHEN]
- استفاده از
توالیهای
گریز (escape sequences)
برای
گنجاندن
URLها در
پیامهای
تشخیصی.
برای
نمونه،
هنگامی که
-fdiagnostics-show-option متنی
را نمایش
میدهد که
گزینهٔ خط
فرمانیِ
کنترلکنندهٔ
یک پیام
تشخیصی را
مشخص
میکند، یک
URL برای
مستندات آن
گزینه
تعبیه
میشود.
مقدار 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، و mingw است. با استفاده از -fdiagnostics-urls=always میتوان از این بررسی صرفنظر کرد.
- -fno-diagnostics-show-option
- بهطور پیشفرض، هر پیام تشخیصیِ صادرشده شامل متنی است که گزینهٔ خط فرمانیِ کنترلکنندهٔ مستقیم آن پیام را نشان میدهد (در صورتی که چنین گزینهای برای سازوکار تشخیصی شناختهشده باشد). تعیین پرچم -fno-diagnostics-show-option مانع از این رفتار میشود.
- -fno-diagnostics-show-caret
- بهطور پیشفرض، هر پیام تشخیصیِ صادرشده شامل خط مبدأ اصلی کد و یک نشانگر هشتک ^ برای نشان دادن ستون مربوطه است. این گزینه این اطلاعات را حذف میکند. در صورتی که گزینهٔ -fmessage-length=n داده شده باشد، خط مبدأ به n نویسه کوتاه میشود. هنگامی که خروجی در ترمینال نمایش داده میشود، عرض آن به مقداری که توسط متغیر محیطی COLUMNS مشخص شده، یا در صورت عدم تنظیم، به عرض ترمینال محدود میگردد.
- -fno-diagnostics-show-labels
- بهطور
پیشفرض،
هنگام چاپ
کد منبع (از
طریق -fdiagnostics-show-caret)،
پیامهای
تشخیصی
میتوانند
محدودههایی
از کد منبع
را با
اطلاعات
مرتبط
برچسبگذاری
کنند؛
مانند نوع
عبارات:
printf ("foo %s bar", long_i + long_j); ~^ ~~~~~~~~~~~~~~~ | | char * long intاین گزینه از چاپ این برچسبها (در مثال بالا، خطوط عمودی و متنهای "char *" و "long int") جلوگیری میکند.
- -fno-diagnostics-show-event-links
- بهطور
پیشفرض،
هنگام چاپ
مسیرهای
اجرا (از
طریق
-fdiagnostics-path-format=inline-events)، GCC
خطوطی را
چاپ میکند
که
رویدادهای
مرتبط را به
هم متصل
میسازند؛
مانند خطی
که
رویدادهای
۱ و ۲ را در
مثال زیر
متصل
میکند:
3 | if (p) | ^ | | | (1) following `false' branch (when `p' is NULL)... ->-+ | | | | |+------------------------------------------------------------+ 4 || return 0; 5 || return *p; || ~ || | |+-------->(2) ...to here | (3) dereference of NULL `p'
این گزینه از چاپ چنین خطوط اتصالدهندهای جلوگیری میکند.
- -fno-diagnostics-show-cwe
- پیامهای
تشخیصی
میتوانند
به صورت
اختیاری
دارای یک
شناسهٔ
CWE ("https://cwe.mitre.org/index.html") مرتبط باشند. خود GCC چنین فرادادهای را تنها برای برخی از پیامهای تشخیصیِ -fanalyzer ارائه میکند. همچنین افزایههای GCC نیز ممکن است پیامهای تشخیصی را همراه با چنین فرادادهای ارائه دهند. بهطور پیشفرض، در صورت وجود این اطلاعات، همراه با پیام تشخیصی چاپ خواهد شد. این گزینه از چاپ این فراداده جلوگیری میکند. - -fno-diagnostics-show-rules
- پیامهای تشخیصی میتوانند به صورت اختیاری دارای قواعدی مرتبط با خود باشند؛ مانند قواعد برگرفته از یک استاندارد کدنویسی یا یک مشخصه فنی. خود GCC این کار را برای هیچیک از پیامهای تشخیصی خود انجام نمیدهد، اما افزایهها ممکن است چنین کنند. بهطور پیشفرض، در صورت وجود این اطلاعات، همراه با پیام تشخیصی چاپ خواهد شد. این گزینه از چاپ این فراداده جلوگیری میکند.
- -fno-diagnostics-show-highlight-colors
- GCC میتواند
هنگام چاپ
پیامهای
تشخیصی و
نقل کد منبع
کاربر، از
رنگ برای
تأکید و
ایجاد تضاد
دیداری
استفاده
کند.
برای نمونه، در:
demo.c: In function `test_bad_format_string_args': ../../src/demo.c:25:18: warning: format `%i' expects argument of type `int', but argument 2 has type `const char *' [-Wformat=] 25 | printf("hello %i", msg); | ~^ ~~~ | | | | int const char * | %s
- موارد %i و "int" در پیام و "int" در کد منبعِ نقلشده با استفاده از "highlight-a" رنگآمیزی میشوند (بهطور پیشفرض سبز برجسته)، و
- مورد "const char *" در پیام و در کد منبعِ نقلشده، هر دو با استفاده از "highlight-b" رنگآمیزی میشوند (بهطور پیشفرض آبی برجسته).
هدف از این کار جلب توجه خواننده به روابط میان جنبههای گوناگون پیام تشخیصی و کد منبع، از طریق بهکارگیری رنگ برای گروهبندی عناصر مرتبط و تمایز بخشیدن میان موارد ناهماهنگ است.
این رنگآمیزیِ اضافی در صورت فعال بودن چاپ رنگی (طبق -fdiagnostics-color=) بهطور پیشفرض فعال است، اما میتوان آن را به صورت جداگانه با -fno-diagnostics-show-highlight-colors غیرفعال کرد.
- -fno-diagnostics-show-line-numbers
- بهطور پیشفرض، هنگام چاپ کد منبع (از طریق -fdiagnostics-show-caret)، حاشیهٔ چپی چاپ میشود که شمارههای خطوط را نشان میدهد. این گزینه از چاپ این حاشیهٔ چپ جلوگیری میکند.
- -fdiagnostics-minimum-margin-width=width
- این گزینه کمینهٔ عرض حاشیهٔ چپ چاپشده توسط -fdiagnostics-show-line-numbers را کنترل میکند. مقدار پیشفرض آن 6 است.
- -fdiagnostics-parseable-fixits
- ارائهٔ
راهنماییهای
اصلاحی (fix-it hints)
در قالبی
قابل تجزیه
توسط
ماشین،
مناسب برای
استفاده در
IDEها. به ازای
هر اصلاح،
یک سطر پس
از پیام
تشخیصیِ
مربوطه چاپ
میشود که
با رشتهٔ
"fix-it:" آغاز
میگردد.
برای نمونه:
fix-it:"test.c":{45:3-45:21}:"gtk_widget_show_all"موقعیت به صورت یک بازهٔ نیمهباز، بیانشده به تعداد بایتها و با شروع از بایت ۱ برای ستون نخست نشان داده میشود. در مثال بالا، بایتهای ۳ تا ۲۰ از خط ۴۵ فایل "test.c" باید با رشتهٔ ارائهشده جایگزین شوند:
00000000011111111112222222222 12345678901234567890123456789 gtk_widget_showall (dlg); ^^^^^^^^^^^^^^^^^^ gtk_widget_show_all
نام فایل و رشتهٔ جایگزین، بکاسلش را به صورت "\\"، تب را به صورت "\t"، خط جدید را به صورت "\n"، نقلقول دوگانه را به صورت "\""، و نویسههای غیرقابلچاپ را به صورت هشتهشتی (مثلاً تب عمودی به صورت "\013") گریز میدهند.
یک رشتهٔ جایگزین خالی نشاندهندهٔ آن است که محدودهٔ مورد نظر باید حذف شود. یک محدودهٔ خالی (مانند "45:3-45:3") نشاندهندهٔ آن است که رشته باید در موقعیت دادهشده درج شود..IP -fdiagnostics-generate-patch 4 راهنماییهای تصحیح (fix-it hints) را پس از چاپ هرگونه پیام عیبیابی، در قالب unified diff روی stderr چاپ میکند. برای مثال:
--- test.c +++ test.c @ -42,5 +42,5 @ void show_cb(GtkDialog *dlg) { - gtk_widget_showall(dlg); + gtk_widget_show_all(dlg); }این diff ممکن است بسته به همان قواعد مربوط به پیامهای عیبیابی، رنگی باشد یا نباشد (ببینید -fdiagnostics-color).
- -fdiagnostics-show-template-tree
- در
فرانتاند
C++، هنگام
چاپ
پیامهای
عیبیابی
که عدم
تطابق
نوعهای
الگو (template) را
نشان
میدهند،
مانند:
could not convert 'std::map<int, std::vector<double> >()' from 'map<[...],vector<double>>' to 'map<[...],vector<float>>
پرچم -fdiagnostics-show-template-tree امکان چاپ یک ساختار درختمانند را فعال میکند که بخشهای مشترک و متفاوت نوعها را نشان میدهد، مانند:
map< [...], vector< [double != float]>>بخشهایی که تفاوت دارند با رنگ برجسته میشوند (در این مورد "double" و "float").
- -fno-elide-type
- بهطور
پیشفرض،
زمانی که
فرانتاند
C++ پیامهای
عیبیابیِ
نشاندهنده
عدم تطابق
نوعهای
الگو را چاپ
میکند،
بخشهای
مشترک
نوعها
بهصورت "[...]"
چاپ
میشوند تا
پیام خطا
سادهتر
شود. برای
مثال:
could not convert 'std::map<int, std::vector<double> >()' from 'map<[...],vector<double>>' to 'map<[...],vector<float>>
مشخص کردن پرچم -fno-elide-type این رفتار را لغو میکند. این پرچم همچنین بر خروجی پرچم -fdiagnostics-show-template-tree تأثیر میگذارد.
- -fdiagnostics-path-format=KIND
- چگونگی چاپ
مسیرهای
رخدادهای
جریان
کنترل (control-flow) را
برای
پیامهای
عیبیابی
که چنین
مسیری به
آنها
مرتبط است،
مشخص
میکند.
مقدارهای ممکن برای KIND عبارتند از none، separate-events، یا مقدار پیشفرض inline-events.
مقدار none به معنای چاپ نکردن مسیرهای عیبیابی است.
مقدار separate-events به این معنی است که برای هر رخداد در پیام عیبیابی، یک پیام یادداشت ("note") جداگانه چاپ شود. برای مثال:
test.c:29:5: error: passing NULL as argument 1 to 'PyList_Append' which requires a non-NULL parameter test.c:25:10: note: (1) when 'PyList_New' fails, returning NULL test.c:27:3: note: (2) when 'i < count' test.c:29:5: note: (3) when calling 'PyList_Append', passing NULL from (1) as argument 1
مقدار inline-events به این معنی است که رخدادها بهصورت درونخطی ("inline") در داخل کد منبع چاپ شوند. این نما تلاش میکند تا رخدادها را در قالب توالیهایی از رخدادهای بهاندازه کافی نزدیک به هم تجمیع کند و آنها را بهصورت محدودههای برچسبدار درون کد منبع نمایش دهد.
برای مثال، همان رخدادهای بالا ممکن است به این شکل چاپ شوند:
'test': events 1-3 25 | list = PyList_New(0); | ^~~~~~~~~~~~~ | | | (1) when 'PyList_New' fails, returning NULL 26 | 27 | for (i = 0; i < count; i++) { | ~~~ | | | (2) when 'i < count' 28 | item = PyLong_FromLong(random()); 29 | PyList_Append(list, item); | ~~~~~~~~~~~~~~~~~~~~~~~~~ | | | (3) when calling 'PyList_Append', passing NULL from (1) as argument 1جریان کنترل بینروالی (Interprocedural) با گروهبندی رخدادها بر اساس فریم پشته (stack frame) و استفاده از تورفتگی جهت نشان دادن نحوه تو در تو شدن، وارد شدن (push) و خارج شدن (pop) فریمهای پشته نمایش داده میشود.
برای مثال:
'test': events 1-2 | | 133 | { | | ^ | | | | | (1) entering 'test' | 134 | boxed_int *obj = make_boxed_int (i); | | ~~~~~~~~~~~~~~~~~~ | | | | | (2) calling 'make_boxed_int' | +--> 'make_boxed_int': events 3-4 | | 120 | { | | ^ | | | | | (3) entering 'make_boxed_int' | 121 | boxed_int *result = (boxed_int *)wrapped_malloc (sizeof (boxed_int)); | | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ | | | | | (4) calling 'wrapped_malloc' | +--> 'wrapped_malloc': events 5-6 | | 7 | { | | ^ | | | | | (5) entering 'wrapped_malloc' | 8 | return malloc (size); | | ~~~~~~~~~~~~~ | | | | | (6) calling 'malloc' | <-------------+ | 'test': event 7 | | 138 | free_boxed_int (obj); | | ^~~~~~~~~~~~~~~~~~~~ | | | | | (7) calling 'free_boxed_int' | (etc) - -fdiagnostics-show-path-depths
- این گزینه
اطلاعات
اضافهای
را هنگام
چاپ
مسیرهای
جریان
کنترل
مرتبط با یک
پیام
عیبیابی
ارائه
میدهد.
اگر این گزینه مشخص شود، عمق پشته برای هر توالی از رخدادها در -fdiagnostics-path-format=inline-events چاپ خواهد شد. اگر همراه با -fdiagnostics-path-format=separate-events ارائه شود، عمق پشته و اعلان تابع هنگام چاپ هر رخداد پیوست خواهد شد.
این گزینه برای استفاده توسعهدهندگان GCC و توسعهدهندگان افزونه هنگام اشکالزدایی پیامهای عیبیابی که جریان کنترل بینروالی را گزارش میکنند در نظر گرفته شده است.
- -fno-show-column
- شماره ستونها را در پیامهای عیبیابی چاپ نمیکند. این ممکن است زمانی لازم باشد که پیامهای عیبیابی توسط برنامهای که شماره ستونها را متوجه نمیشود، مانند dejagnu، بررسی (scan) میشوند.
- -fdiagnostics-column-unit=UNIT
- واحد شماره
ستون را
انتخاب
میکند. این
گزینه بر
پیامهای
عیبیابی
سنتی (در
صورت نبود
-fno-show-column)، و
همچنین در
صورت
درخواست بر
پیامهای
عیبیابی
با قالب JSON
تأثیر
میگذارد.
مقدار پیشفرض UNIT، یعنی display، تعداد ستونهای نمایشی را که توسط هر نویسه اشغال میشود در نظر میگیرد. این مقدار در مورد نویسههای تب (tab) ممکن است بزرگتر از تعداد بایتهای مورد نیاز برای کدگذاری نویسه باشد، یا در مورد نویسههای چندبایتی، ممکن است کوچکتر باشد. برای مثال، نویسه «GREEK SMALL LETTER PI (U+03C0)» یک ستون نمایشی را اشغال میکند و کدگذاری UTF-8 آن به دو بایت نیاز دارد؛ نویسه «SLIGHTLY SMILING FACE (U+1F642)» دو ستون نمایشی را اشغال میکند و کدگذاری UTF-8 آن به چهار بایت نیاز دارد.
تنظیم UNIT روی byte شماره ستون را در تمام موارد به شمارش خام بایتها تغییر میدهد، همانطور که بهطور سنتی در نسخههای قبل از 11.1.0 در GCC خروجی داده میشد..IP -fdiagnostics-column-origin=ORIGIN 4 مبدا شمارهگذاری ستونها، یعنی شماره ستونی که به نخستین ستون اختصاص داده میشود را مشخص میکند. مقدار پیشفرض ۱ با رفتار سنتی GCC و راهنمای نگارش GNU مطابقت دارد. برخی ابزارها ممکن است با مبدا ۰ عملکرد بهتری داشته باشند؛ هر مقدار غیرمنفی میتواند مشخص شود.
- -fdiagnostics-escape-format=FORMAT
- هنگامی که GCC
خطوط سورس
مرتبط با یک
پیام
تشخیصی را
چاپ
میکند،
معمولاً
سعی میکند
بایتهای
سورس را
مستقیماً
چاپ کند. با
این حال،
برخی از
پیامهای
تشخیصی
مربوط به
مشکلات
کدگذاری (encoding)
در فایل
سورس
هستند،
مانند
بایتهای
ناهنجار UTF-8
یا مشکلات
مرتبط با
نرمالسازی
یونیکد. این
پیامها
نشانهگذاری
میشوند تا
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
- -fdiagnostics-text-art-charset=CHARSET
- برخی
پیامهای
تشخیصی
میتوانند
شامل
نمودارهای
«هنر متنی»
(text art) باشند:
ترسیمهای
بصری
ساختهشده
از متن که
برای نمایش
با قلمهای
تکعرض (monospaced)
در نظر
گرفته
شدهاند.
این گزینه مشخص میکند در صورت وجود، چه نویسههایی برای چاپ چنین نمودارهایی استفاده شود. CHARSET میتواند یکی از مقادیر none، ascii، unicode یا emoji باشد.
مقدار none از چاپ چنین نمودارهایی جلوگیری میکند. مقدار ascii تضمین میکند که این نمودارها کاملاً از نویسههای اسکی («ASCII art») تشکیل شوند. مقدار unicode امکان استفاده محافظهکارانه از نویسههای ترسیمی یونیکد (مانند نویسههای رسم کادر) را فراهم میآورد. مقدار emoji علاوه بر آن، امکان استفاده از ایموجی در خروجی را اضافه میکند (مانند چاپ U+26A0 WARNING SIGN به دنبال U+FE0F VARIATION SELECTOR-16 برای انتخاب گونه ایموجیِ نویسه).
مقدار پیشفرض emoji است، مگر در حالتی که متغیر محیطی LANG روی C تنظیم شده باشد که در این صورت پیشفرض ascii خواهد بود.
- -fdiagnostics-format=FORMAT
- قالبی
متفاوت را
برای چاپ
پیامهای
تشخیصی
انتخاب
میکند. FORMAT
میتواند
text، sarif-stderr، sarif-file،
json، json-stderr یا json-file
باشد.
استفاده از این گزینه، تمامی «مقصدهای خروجی» (output sinks) اضافی افزودهشده توسط -fdiagnostics-add-output= یا موارد تنظیمشده توسط -fdiagnostics-set-output= را جایگزین میکند.
مقدار پیشفرض text است.
قالبهای sarif-stderr و sarif-file هر دو پیامهای تشخیصی را در قالب SARIF نسخه 2.1.0، به ترتیب در stderr یا در فایلی با نام source.sarif صادر میکنند.
مقادیر مختلف json، json-stderr و json-file منسوخ (deprecated) شدهاند و به یک قالب خروجی قدیمی بر پایه JSON اشاره دارند. قالب json مترادفی برای json-stderr است. قالبهای json-stderr و json-file به جز در محل ارسال خروجی JSON، کاملاً یکسان هستند. با json-stderr، خروجی JSON به stderr فرستاده میشود، در حالی که با json-file در source.gcc.json نوشته میشود.
- -fdiagnostics-add-output=DIAGNOSTICS-OUTPUT-SPEC
- یک «مقصد
خروجی» (output sink)
دیگر برای
ارسال
پیامهای
تشخیصی
اضافه
میکند.
DIAGNOSTICS-OUTPUT-SPEC باید یک شِما (scheme) را مشخص کند که میتواند به صورت اختیاری با ":" و یک یا چند جفت KEY=VALUE دنبال شود، به این صورت:
<SCHEME> <SCHEME>:<KEY>=<VALUE> <SCHEME>:<KEY>=<VALUE>,<KEY2>=<VALUE2>
و غیره.
شِماها، کلیدها یا مقادیری که نام آنها دارای پیشوند "experimental" است ممکن است بدون اطلاع قبلی تغییر یافته یا حذف شوند.
SCHEME میتواند یکی از موارد زیر باشد:
- text
- ارسال
پیامهای
تشخیصی به stderr
با استفاده
از قالب
متنی
کلاسیک GCC.
کلیدهای پشتیبانیشده عبارتند از:
- color=[yes|no]
- تنظیمات رنگآمیزی اعمالشده توسط -fdiagnostics-color را برای این خروجی متنی بازنویسی (override) میکند.
- experimental-nesting=[yes|no]
- یک حالت آزمایشی را فعال میکند که بر روابط سلسلهمراتبی در پیامهای تشخیصی تأکید دارد و اطلاعات موقعیت مکانی را در خطوط جداگانه نمایش میدهد.
- experimental-nesting-show-locations=[yes|no]
- چنانچه "experimental-nesting=yes" باشد، مکانها به صورت پیشفرض نمایش داده میشوند؛ این کلید را روی "no" تنظیم کنید تا چاپ این مکانها غیرفعال شود. این مورد برای استفاده توسعهدهندگان GCC هنگام نگارش موارد آزمون DejaGnu در نظر گرفته شده است.
- experimental-nesting-show-levels=[yes|no]
- این یک گزینه اشکالزدایی برای استفاده همراه با "experimental-nesting=yes" است. این کلید را روی "yes" تنظیم کنید تا سطوح تودرتویی به صراحت در خروجی چاپ شوند. این مورد برای استفاده توسعهدهندگان GCC فراهم شده است.
- sarif
- ارسال
پیامهای
تشخیصی به
یک فایل در
قالب SARIF.
کلیدهای پشتیبانیشده عبارتند از:
- file=FILENAME
- نام فایلی که خروجی SARIF در آن نوشته میشود را مشخص میکند، که میتواند همراه با مسیر مطلق یا نسبی باشد. در صورت عدم تعیین، مقدار پیشفرض source.sarif خواهد بود.
- version=[2.1|2.2-prerelease]
- نسخه SARIF مورد استفاده برای خروجی را تعیین میکند. در صورت عدم تعیین، پیشفرض 2.1 است. مقدار "2.2-prerelease" از یک پیشنویس غیررسمی از مشخصات آینده SARIF 2.2 استفاده میکند و در این نسخه فقط باید برای مقاصد آزمایشی استفاده شود.
برای نمونه،
-fdiagnostics-add-output=sarif:version=2.1,file=foo.2.1.sarif -fdiagnostics-add-output=sarif:version=2.2-prerelease,file=foo.2.2.sarif
یک جفت خروجی اضافه میکند که هر یک در فایلی جداگانه و به ترتیب با استفاده از نسخههای 2.1 و 2.2 استاندارد SARIF خروجی تولید میکنند.
در قالب EBNF:
<diagnostics-output-specifier> = <diagnostics-output-name>
| <diagnostics-output-name>, ":", <key-value-pairs>;
<diagnostics-output-name> = "text" | "sarif";
<key-value-pairs> = <key-value-pair>
| <key-value-pair> "," <key-value-pairs>;
<key-value-pair> = <key> "=" <value>;
<key> = ? string without a '=' ? ;
<value> = ? string without a ',' ? ;
- -fdiagnostics-set-output=DIAGNOSTICS-OUTPUT-SPEC
- عملکردی
مشابه با
-fdiagnostics-add-output= دارد،
با این
تفاوت که به
جای افزودن
یک «مقصد
خروجی»
اضافی برای
پیامهای
تشخیصی،
تمامی
مقصدهای
خروجی
موجود
(مانند
مقصدهای
ناشی از
-fdiagnostics-format=، -fdiagnostics-add-output=
یا استفاده
قبلی از
-fdiagnostics-set-output=) را
جایگزین
میکند..IP
-fno-diagnostics-json-formatting 4
بهطور
پیشفرض،
هنگامی که JSON
برای
پیامهای
تشخیصی
صادر
میشود (از
طریق
-fdiagnostics-format=sarif-stderr،
-fdiagnostics-format=sarif-file،
-fdiagnostics-format=json،
-fdiagnostics-format=json-stderr،
-fdiagnostics-format=json-file)،
کامپایلر GCC
خطوط جدید و
تورفتگیهایی
را اضافه
میکند تا
ساختار
سلسلهمراتبی
JSON را از نظر
بصری
برجسته
سازد.
از -fno-diagnostics-json-formatting برای حذف این فاصلههای خالی استفاده کنید. این گزینه باید پیش از گزینهای که قرار است بر آن تأثیر بگذارد، مشخص شود.
این گزینه برای سازگاری با ابزارهایی در نظر گرفته شده است که انتظار ندارند خروجی حاوی خطوط جدید باشد، مانند خروجی تولیدشده توسط نسخههای قدیمیتر GCC.
گزینههای درخواست یا بازداری هشدارها (Options to Request or Suppress Warnings)
هشدارها پیامهای تشخیصی هستند که ساختارهایی را گزارش میکنند که ذاتاً نادرست نیستند، اما خطرناک بوده یا نشاندهنده یک خطای احتمالی هستند.
گزینههای مستقل از زبان زیر، هشدارهای خاصی را فعال نمیکنند، بلکه انواع پیامهای تشخیصی تولیدشده توسط GCC را کنترل میکنند.
- -fsyntax-only
- کد را تنها از نظر خطاهای نحوی بررسی میکند، اما فراتر از آن کاری انجام نمیدهد.
- -fmax-errors=n
- حداکثر تعداد پیامهای خطا را به n محدود میکند؛ در این نقطه GCC بهجای تلاش برای ادامه پردازش کد منبع، متوقف میشود. اگر n برابر با 0 باشد (پیشفرض)، محدودیتی در تعداد پیامهای خطای تولیدشده وجود نخواهد داشت. اگر -Wfatal-errors نیز مشخص شده باشد، -Wfatal-errors بر این گزینه اولویت دارد.
- -w
- تمام پیامهای هشدار را بازداری و متوقف میکند.
- -Werror
- تمام هشدارها را به خطا تبدیل میکند.
- -Werror=
- هشدار
مشخصشده
را به خطا
تبدیل
میکند.
مشخصهٔ
هشدار به
انتهای
گزینه
الحاق
میشود؛
برای نمونه
-Werror=switch
هشدارهایی
را که توسط
-Wswitch کنترل
میشوند،
به خطا
تبدیل
میکند. این
گزینه فرم
منفی نیز
میپذیرد
که برای نفی
-Werror در
هشدارهای
خاص
استفاده
میشود؛
برای نمونه
-Wno-error=switch باعث
میشود
هشدارهای
-Wswitch حتی
زمانی که -Werror
فعال است،
خطا تلقی
نشوند.
پیام هشدار برای هر هشدارِ قابل کنترل، شامل گزینهای است که آن هشدار را کنترل میکند. سپس میتوان از آن گزینه همراه با -Werror= و -Wno-error= به شکلی که در بالا شرح داده شد استفاده کرد. (چاپ گزینه در پیام هشدار را میتوان با استفاده از پرچم -fno-diagnostics-show-option غیرفعال کرد.)
توجه داشته باشید که مشخص کردن -Werror=foo بهطور خودکار به معنی -Wfoo است. با این حال، -Wno-error=foo به معنای چیز دیگری نیست.
- -Wfatal-errors
- این گزینه باعث میشود کامپایلر با رخ دادن نخستین خطا، بهجای تلاش برای ادامه و چاپ پیامهای خطای بعدی، فرایند کامپایل را متوقف کند.
میتوانید هشدارهای خاص بسیاری را با گزینههایی که با -W آغاز میشوند درخواست کنید؛ برای مثال -Wunused-variable برای درخواست هشدار درباره اعلان متغیرهایی که هرگز استفاده نشدهاند. هر یک از این گزینههای هشدار خاص دارای یک فرم منفی نیز هستند که با -Wno- برای خاموش کردن هشدارها شروع میشود؛ برای مثال، -Wno-unused-variable. این راهنما تنها یکی از دو حالت را (هر کدام که پیشفرض نباشد) فهرست میکند. برای گزینههای خاص زبانهای دیگر به C++ Dialect Options و Objective-C and Objective-C++ Dialect Options نیز مراجعه کنید. هشدارهای اضافی را میتوان با فعال کردن تحلیلگر ایستا (static analyzer) به دست آورد؛
برخی گزینهها، مانند -Wall و -Wextra، گزینههای دیگری همچون -Wunused را روشن میکنند، که آن هم ممکن است گزینههای بیشتری نظیر -Wunused-variable را فعال کند. اثر ترکیبی فرمهای مثبت و منفی این است که گزینههای خاصتر، مستقل از موقعیتشان در خط فرمان، بر گزینههای عمومیتر اولویت دارند. برای گزینههایی با درجهٔ اختصاصی یکسان، آخرین گزینه اعمال میشود. گزینههایی که از طریق عملگرهای ساختاریافته (pragma) فعال یا غیرفعال میشوند، بهگونهای اعمال میشوند که گویی در انتهای خط فرمان ظاهر شدهاند.
هنگامی که یک گزینه هشدار ناشناخته درخواست شود (مانند -Wunknown-warning)، GCC خطایی صادر کرده و اعلام میکند که گزینه ناشناخته است. با این حال، اگر فرم -Wno- استفاده شود، رفتار کمی متفاوت خواهد بود: هیچ پیام تشخیصی برای -Wno-unknown-warning صادر نمیشود مگر اینکه پیامهای تشخیصی دیگری نیز در حال تولید باشند. این امر امکان استفاده از گزینههای جدید -Wno- را در کامپایلرهای قدیمی فراهم میکند، اما اگر خطایی رخ دهد، کامپایلر هشدار میدهد که یک گزینه ناشناخته وجود دارد.
اثرگذاری برخی هشدارها به فعال بودن بهینهسازیها بستگی دارد. برای مثال، -Wsuggest-final-types با بهینهسازی زمان پیوند (link-time optimization) مؤثرتر است. برخی هشدارهای دیگر ممکن است تا زمانی که بهینهسازی فعال نباشد اصلاً صادر نشوند. در حالی که بهینهسازی بهطور کلی کارایی هشدارها را در مورد مشکلات جریان کنترل و جریان داده بهبود میبخشد، در برخی موارد ممکن است باعث هشدارهای مثبت کاذب (false positive) نیز بشود.
- -Wpedantic
- -pedantic
- تمامی
هشدارهای
الزامی
تعیینشده
توسط
استانداردهای
دقیق ISO C و ISO C++ را
صادر
میکند؛
تمام
برنامههایی
را که از
افزونههای
ممنوع
استفاده
میکنند و
برخی
برنامههای
دیگر را که
از ISO C و ISO C++
پیروی
نمیکنند،
عیبیابی
میکند. این
گزینه از
نسخهٔ
استاندارد
ISO C یا C++
مشخصشده
توسط هر
گزینهٔ -std
بهکاررفته
پیروی
میکند.
برنامههای معتبر ISO C و ISO C++ باید با یا بدون این گزینه بهدرستی کامپایل شوند (اگرچه تعداد انگشتشماری نیاز به -ansi یا گزینهٔ -std برای تعیین نسخه استاندارد دارند). با این حال، بدون این گزینه، برخی افزونههای گنو (GNU) و ویژگیهای سنتی C و C++ نیز پشتیبانی میشوند. با فعال بودن این گزینه، آنها تشخیص داده میشوند (یا با -pedantic-errors رد میشوند).
گزینهٔ -Wpedantic برای استفاده از کلمات کلیدی جایگزینی که نام آنها با __ آغاز و پایان مییابد، هشداری صادر نمیکند. این قالب جایگزین همچنین میتواند برای غیرفعال کردن هشدارها برای انواع غیر استاندارد __intN (یعنی __intN__) استفاده شود. هشدارهای وسواسگونه (pedantic) در عباراتی که پس از "__extension__" میآیند نیز غیرفعال میشوند. با این حال، تنها فایلهای سرآیند سیستمی باید از این راههای فرار استفاده کنند؛ برنامههای کاربردی باید از آنها اجتناب ورزند.
برخی هشدارها درباره برنامههای ناسازگار توسط گزینههایی غیر از -Wpedantic کنترل میشوند؛ در بسیاری از موارد آنها توسط -Wpedantic فعال میشوند اما میتوان آنها را بهطور جداگانه با گزینهٔ اختصاصیشان غیرفعال کرد، مانند -Wpedantic -Wno-pointer-sign.
در مواردی که استاندارد مشخصشده با -std نشاندهنده یک لهجهٔ گسترشیافتهٔ گنو از C باشد (مانند gnu90 یا gnu99)، یک استاندارد پایه (base standard) متناظر وجود دارد، یعنی همان نسخه از ISO C که لهجهٔ گسترشیافته گنو بر پایه آن شکل گرفته است. هشدارهای ناشی از -Wpedantic در جایی صادر میشوند که توسط استاندارد پایه الزامی شده باشند. (منطقی نیست که چنین هشدارهایی تنها برای قابلیتهایی صادر شوند که در لهجهٔ مشخصشدهٔ گنو سی وجود ندارند، زیرا طبق تعریف، لهجههای گنو از C شامل تمامی قابلیتهایی هستند که کامپایلر با گزینهٔ دادهشده پشتیبانی میکند و در نتیجه موردی برای هشدار دادن وجود نخواهد داشت.)
- -pedantic-errors
- هر زمان که
استاندارد
پایه (به -Wpedantic
مراجعه
کنید) نیاز
به یک پیام
تشخیصی
داشته
باشد،
خطایی صادر
میکند؛ در
برخی موارد
که رفتار
تعریفنشده
(undefined behavior) در زمان
کامپایل رخ
میدهد و در
برخی موارد
دیگر که
مانع
کامپایل
برنامههای
معتبر بر
اساس
استاندارد
نمیشوند.
این گزینه
معادل -Werror=pedantic
نیست:
گزینهٔ دوم
بعید است
مفید باشد،
زیرا تنها
هشدارهای
کنترلشده
توسط -Wpedantic را
تبدیل به
خطا
میکند، در
حالی که این
گزینه بر
پیامهای
تشخیصی
الزامی که
همیشه فعال
هستند یا
توسط
گزینههایی
غیر از -Wpedantic
کنترل
میشوند
نیز اثر
میگذارد.
اگر میخواهید پیامهای تشخیصی الزامی که بهطور پیشفرض هشدار هستند تبدیل به خطا شوند، اما نمیخواهید پیامهای تشخیصی -Wpedantic را نیز فعال کنید، میتوانید -pedantic-errors -Wno-pedantic را مشخص کنید (یا -pedantic-errors -Wno-error=pedantic را برای فعال کردن آنها صرفاً در قالب هشدار).
برخی پیامهای تشخیصی الزامی بهطور پیشفرض خطا هستند، اما میتوان با استفاده از -fpermissive یا گزینه هشدار اختصاصی آنها، مانند -Wno-error=narrowing، سطح آنها را به هشدار کاهش داد.
برخی پیامهای تشخیصی برای شیوههای غیر استاندارد ISO توسط گزینههای هشدار اختصاصی دیگری غیر از -Wpedantic کنترل میشوند، اما با -pedantic-errors نیز به خطا تبدیل میشوند. برای نمونه:
-Wattributes (برای ویژگیهای استاندارد) -Wchanges-meaning (در C++) -Wcomma-subscript (در C++23 یا بالاتر) -Wdeclaration-after-statement (در C90 یا قبلتر) -Welaborated-enum-base (در C++11 یا بالاتر) -Wimplicit-int (در C99 یا بالاتر) -Wimplicit-function-declaration (در C99 یا بالاتر) -Wincompatible-pointer-types -Wint-conversion -Wlong-long (در C90 یا قبلتر) -Wmain -Wnarrowing (در C++11 یا بالاتر) -Wpointer-arith -Wpointer-sign -Wincompatible-pointer-types -Wregister (در C++17 یا بالاتر) -Wvla (در C90 یا قبلتر) -Wwrite-strings (در C++11 یا بالاتر) .IP -fpermissive 4 برخی از پیامهای تشخیصیِ الزامی درباره کدهای ناسازگار با استاندارد را از خطا به هشدار تنزل میدهد. بدین ترتیب، استفاده از -fpermissive اجازه میدهد برخی کدهای غیرمنطبق کامپایل شوند. برخی از تشخیصهای ++C تنها توسط این پرچم کنترل میشوند، اما این گزینه همچنین برخی از تشخیصهای C و ++C را که دارای پرچم اختصاصی خود هستند نیز تنزل میدهد:
-Wdeclaration-missing-parameter-type (فقط C و Objective-C) -Wimplicit-function-declaration (فقط C و Objective-C) -Wimplicit-int (فقط C و Objective-C) -Wincompatible-pointer-types (فقط C و Objective-C) -Wint-conversion (فقط C و Objective-C) -Wnarrowing (فقط ++C و ++Objective-C) -Wreturn-mismatch (فقط C و Objective-C) -Wtemplate-body (فقط ++C و ++Objective-C)
گزینه -fpermissive برای حالتهای سنتی زبان C (-std=c89، -std=gnu89، -std=c90، -std=gnu90) حالت پیشفرض است.
- -Wall
- این گزینه
تمام
هشدارهای
مربوط به
ساختارهایی
را که برخی
کاربران
آنها را
محل اشکال
میدانند و
اجتناب از
آنها (یا
اصلاح کد
جهت
جلوگیری از
هشدار) آسان
است—حتی در
هنگام
استفاده از
ماکروها—فعال
میکند. این
گزینه
همچنین
برخی
هشدارهای
مختص زبان
را که در C++ Dialect
Options و Objective-C and Objective-C++ Dialect Options
شرح داده
شدهاند
فعال
میسازد.
-Wall پرچمهای هشدار زیر را فعال میکند:
-Waddress -Waligned-new (فقط ++C و ++Objective-C) -Warray-bounds=1 (تنها با -O2) -Warray-compare -Warray-parameter=2 -Wbool-compare -Wbool-operation -Wc++11-compat -Wc++14-compat -Wc++17compat -Wc++20compat -Wcatch-value (فقط ++C و ++Objective-C) -Wchar-subscripts -Wclass-memaccess (فقط ++C و ++Objective-C) -Wcomment -Wdangling-else -Wdangling-pointer=2 -Wdelete-non-virtual-dtor (فقط ++C و ++Objective-C) -Wduplicate-decl-specifier (فقط C و Objective-C) -Wenum-compare (در C/ObjC؛ این گزینه در ++C بهطور پیشفرض فعال است) -Wenum-int-mismatch (فقط C و Objective-C) -Wformat=1 -Wformat-contains-nul -Wformat-diag -Wformat-extra-args -Wformat-overflow=1 -Wformat-truncation=1 -Wformat-zero-length -Wframe-address -Wimplicit (فقط C و Objective-C) -Wimplicit-function-declaration (فقط C و Objective-C) -Wimplicit-int (فقط C و Objective-C) -Winfinite-recursion -Winit-self (فقط ++C و ++Objective-C) -Wint-in-bool-context -Wlogical-not-parentheses -Wmain (فقط برای C/ObjC و مگر با -ffreestanding) -Wmaybe-uninitialized -Wmemset-elt-size -Wmemset-transposed-args -Wmisleading-indentation (فقط برای C/++C) -Wmismatched-dealloc -Wmismatched-new-delete (فقط ++C و ++Objective-C) -Wmissing-attributes -Wmissing-braces (فقط برای C/ObjC) -Wmultistatement-macros -Wnarrowing (فقط ++C و ++Objective-C) -Wnonnull -Wnonnull-compare -Wopenmp-simd (فقط C و ++C) -Woverloaded-virtual=1 (فقط ++C و ++Objective-C) -Wpacked-not-aligned -Wparentheses -Wpessimizing-move (فقط ++C و ++Objective-C) -Wpointer-sign (فقط برای C/ObjC) -Wrange-loop-construct (فقط ++C و ++Objective-C) -Wreorder (فقط ++C و ++Objective-C) -Wrestrict -Wreturn-type -Wself-move (فقط ++C و ++Objective-C) -Wsequence-point -Wsign-compare (فقط ++C و ++Objective-C) -Wsizeof-array-div -Wsizeof-pointer-div -Wsizeof-pointer-memaccess -Wstrict-aliasing -Wstrict-overflow=1 -Wswitch -Wtautological-compare -Wtrigraphs -Wuninitialized -Wunknown-pragmas -Wunused -Wunused-but-set-variable -Wunused-const-variable=1 (فقط برای C/ObjC) -Wunused-function -Wunused-label -Wunused-local-typedefs -Wunused-value -Wunused-variable -Wuse-after-free=2 -Wvla-parameter -Wvolatile-register-var -Wzero-length-bounds
توجه داشته باشید که برخی از پرچمهای هشدار توسط -Wall فعال نمیشوند. برخی از آنها در مورد ساختارهایی هشدار میدهند که کاربران عموماً آنها را محل اشکال نمیدانند، اما ممکن است گاهی مایل به بررسی آنها باشید؛ برخی دیگر درباره ساختارهایی هشدار میدهند که در پارهای موارد اجتنابناپذیرند یا دوری از آنها دشوار است، و هیچ راه سادهای برای تغییر کد جهت جلوگیری از هشدار وجود ندارد. تعدادی از این موارد با -Wextra فعال میشوند اما بسیاری از آنها را باید بهصورت اختصاصی فعال کرد.
- -Wextra
- این گزینه
برخی
پرچمهای
هشدار
اضافی را که
توسط -Wall
فعال
نشدهاند
روشن
میکند.
(این گزینه
پیشتر -W
نامیده
میشد. نام
قدیمیتر
همچنان
پشتیبانی
میشود،
اما نام
جدید
توصیفیتر
و گویاتر
است.)
-Wabsolute-value (فقط برای C/ObjC) -Walloc-size -Wcalloc-transposed-args -Wcast-function-type -Wclobbered -Wdangling-reference (فقط ++C) -Wdeprecated-copy (فقط ++C و ++Objective-C) -Wempty-body -Wenum-conversion (فقط برای C/ObjC) -Wexpansion-to-defined -Wignored-qualifiers (فقط برای C/++C) -Wimplicit-fallthrough=3 -Wmaybe-uninitialized -Wmissing-field-initializers -Wmissing-parameter-name (فقط C/ObjC) -Wmissing-parameter-type (فقط C/ObjC) -Wold-style-declaration (فقط C/ObjC) -Woverride-init (فقط C/ObjC) -Wredundant-move (فقط ++C و ++Objective-C) -Wshift-negative-value (در C++11 تا C++17 و در C99 و جدیدتر) -Wsign-compare (فقط ++C و ++Objective-C) -Wsized-deallocation (فقط ++C و ++Objective-C) -Wstring-compare -Wtype-limits -Wuninitialized -Wunterminated-string-initialization -Wunused-parameter (تنها با -Wunused یا -Wall) -Wunused-but-set-parameter (تنها با -Wunused یا -Wall)
گزینه -Wextra همچنین برای موارد زیر پیام هشدار چاپ میکند:
- یک اشارهگر با "<"، "<="، ">"، یا ">=" با مقدار صحیح صفر مقایسه شود.
- (فقط ++C) یک شمارشگر (enumerator) و یک غیرشمارشگر هر دو در یک عبارت شرطی ظاهر شوند.
- (فقط ++C) پایههای مجازی مبهم.
- (فقط ++C) اندیسگذاری آرایهای که بهصورت "register" اعلان شده است.
- (فقط ++C) دریافت آدرس متغیری که بهصورت "register" اعلان شده است.
- (فقط ++C) کلاس پایه در سازنده رونوشت (copy constructor) یک کلاس مشتقشده مقداردهی اولیه نشود.
- -Wabi (فقط C، Objective-C، ++C و ++Objective-C)
- درباره
کدهایی که
تحت تأثیر
تغییرات ABI
قرار
میگیرند
هشدار
میدهد. این
شامل
کدهایی است
که ممکن است
با ABI مستقل
از سازنده ++C
یا psABI مربوط
به معماری
هدف خاص
سازگار
نباشند.
هشدارهای
مربوط به
مورد دوم
همچنین
بهطور
جداگانه
توسط -Wpsabi
کنترل
میشوند که
توسط -Wabi نیز
اعمال
میگردد.
از آنجا که اکنون رفتار پیشفرض ++G بهروزرسانی ABI با هر انتشار اصلی است، بهطور معمول -Wabi تنها زمانی درباره مشکلات سازگاری ABI زبان ++C هشدار میدهد که در یک سری از انتشارها پس از انتشار اولیه، بررسی جدیدی برای یک مشکل ABI کشفشده اضافه شده باشد. در صورتی که یک نسخه قدیمیتر ABI انتخاب شود (با -fabi-version=n)، گزینه -Wabi درباره موارد بیشتری هشدار میدهد.
-Wabi همچنین میتواند با یک شماره نسخه صریح برای هشدار درباره سازگاری ABI زبان ++C با یک سطح معین از -fabi-version به کار رود، برای نمونه -Wabi=2 جهت هشدار درباره تغییرات نسبت به -fabi-version=2.
اگر یک شماره نسخه صریح ارائه شده باشد و -fabi-compat-version مشخص نشده باشد، شماره نسخه حاصل از این گزینه برای نامهای مستعار سازگاری به کار میرود. اگر هیچ شماره نسخه صریحی با این گزینه داده نشود، اما -fabi-compat-version تعیین شده باشد، آن شماره نسخه برای هشدارهای ABI در ++C استفاده میشود.
اگرچه تلاش شده است درباره تمام این موارد هشدار داده شود، احتمالاً مواردی وجود دارد که علیرغم تولید کد ناسازگار توسط ++G، هشداری صادر نمیشود. همچنین ممکن است مواردی پیش آید که با وجود سازگار بودن کد تولیدشده، هشدار صادر گردد.
اگر نگران این موضوع هستید که کد تولیدشده توسط ++G ممکن است در سطح باینری (binary compatible) با کدهای تولیدشده توسط سایر کامپایلرها سازگار نباشد، باید کد خود را برای اجتناب از این هشدارها بازنویسی کنید.
ناسازگاریهای شناختهشده در -fabi-version=2 (که از GCC 3.4 تا 4.9 حالت پیشفرض بود) شامل موارد زیر است:
extern int N;
template <int &> struct S {};
void n (S<N>) {2}
این مورد در -fabi-version=3 برطرف شد.
- نوعهای
برداری SIMD که
با استفاده
از "__attribute
((vector_size))" تعریف
شده بودند،
به روشی غیر
استاندارد
درهمسازی
میشدند که
اجازه
سربارگذاری
(overloading) توابعی
با بردارها
در
اندازههای
مختلف را
نمیداد.
روش درهمسازی در -fabi-version=4 تغییر یافت.
- "__attribute ((const))" و
"noreturn"
بهعنوان
توصیفکنندههای
نوع
درهمسازی
میشدند، و
"decltype" یک
اعلان ساده
جمع میشد (folded
away).
این مشکلات درهمسازی در -fabi-version=5 رفع شدند.
- شمارندههای
دارای حوزه
(Scoped enumerators) که
بهعنوان
آرگومان به
یک تابع با
تعداد
متغیر
آرگومان (variadic)
ارسال
میشدند،
مانند
شمارندههای
بدون حوزه
ترفیع
مییافتند
و باعث
ایجاد مشکل
در "va_arg"
میشدند. در
اغلب
مقاصد، این
امر عملاً
بر ABI پاس
دادن
پارامترها
تأثیری
ندارد،
زیرا راهی
برای ارسال
آرگومانی
کوچکتر از
"int" وجود
ندارد.
همچنین، واسط ABI نحوه درهمسازی بستههای آرگومان الگو، "const_cast"، "static_cast"، افزایش/کاهش پیشوندی، و تابعِ با حوزه کلاس استفادهشده بهعنوان آرگومان الگو را تغییر داد.
این موارد در -fabi-version=6 تصحیح شدند.
- توابع
لامبدا در
حوزه
آرگومان
پیشفرض
بهصورت
نادرست
درهمسازی
میشدند، و
واسط ABI نحوه
درهمسازی
"nullptr_t" را
تغییر داد.
این موارد در -fabi-version=7 تصحیح شدند.
- هنگام
درهمسازی
نوع یک تابع
با
توصیفکنندههای
cv تابع (function-cv-qualifiers)،
نوع تابع
بدون
توصیفکننده
بهاشتباه
بهعنوان
یک
کاندیدای
جایگزینی
تلقی میشد.
این مورد در -fabi-version=8، که پیشفرض GCC 5.1 است، اصلاح شد.
- decltype(nullptr)
بهاشتباه
ترازبندی
برابر با ۱
داشت که
منجر به
دسترسیهای
ترازنشده
میشد. توجه
داشته
باشید که
این مسئله
بر ABI تابعی
با پارامتر
"nullptr_t"
تأثیری
نداشت،
زیرا
پارامترها
دارای یک
حداقل
ترازبندی
هستند.
این مورد در -fabi-version=9، که پیشفرض GCC 5.2 است، برطرف شد.
- ویژگیهای
مختص به
مقصد که بر
هویت یک نوع
تأثیر
میگذارند،
مانند
قراردادهای
فراخوانی ia32
روی یک نوع
تابع (stdcall، regparm و
غیره)، روی
نام
درهمسازیشده
تأثیری
نداشتند؛
این امر
هنگام
استفاده از
اشارهگرهای
تابع
بهعنوان
آرگومان
الگو منجر
به برخورد
نامها
میشد.
این مورد در -fabi-version=10، که پیشفرض GCC 6.1 است، اصلاح شد.
- -Wpsabi (تنها C، Objective-C، C++ و Objective-C++)
- گزینه -Wpsabi
هشدارهای
مربوط به
تغییرات ABI
مختص
پردازنده
را فعال
میکند،
مانند
تغییرات در
الزامات
ترازبندی
یا نحوه
ارسال
آرگومانهای
تابع. در
چندین
معماری
مقصد، از
جمله AArch64، ARM، x86،
MIPS، RS6000/PowerPC و S/390،
این جزئیات
در بین
نسخههای
مختلف GCC و/یا
نسخههای
مختلف
استانداردهای
زبان C یا C++
به گونهای
تغییر
کردهاند
که بر
سازگاری
دودویی
کدهای
کامپایلشده
تأثیر
میگذارند.
با -Wpsabi،
کامپایلر GCC
میتواند
موارد
استفاده
بالقوه
ناسازگار
را شناسایی
کرده و
درباره
آنها
هشدار دهد.
گزینه -Wpsabi بهطور پیشفرض فعال است، و همچنین توسط -Wabi بهصورت ضمنی اعمال میشود.
- -Wno-changes-meaning (تنها C++ و Objective-C++)
- زبان C++
ایجاب
میکند که
استفادههای
بدون قید از
یک نام در
داخل کلاس،
در تمام
حوزه کلاس
معنای
یکسانی
داشته
باشند،
بنابراین
اعلان نام
پس از
استفاده از
آن نادرست
(ill-formed) است:
struct A; struct B1 { A a; typedef A A; }; // warning, 'A' changes meaning struct B2 { A a; struct A { }; }; // error, 'A' changes meaningبهطور پیشفرض، حالت B1 تنها یک هشدار است چون هر دو اعلان نوع یکسانی دارند، در حالی که حالت B2 یک خطا محسوب میشود. هر دو پیام تشخیصی را میتوان با -Wno-changes-meaning غیرفعال کرد. در غیر این صورت، حالت خطا را میتوان با استفاده از -Wno-error=changes-meaning یا -fpermissive به یک هشدار تقلیل داد.
هر دو پیام تشخیصی با -fms-extensions نیز مهار میشوند.
- -Wchar-subscripts
- اگر اندیس یک آرایه از نوع "char" باشد، هشدار میدهد. این یکی از عوامل رایج خطا است، زیرا برنامهنویسان اغلب فراموش میکنند که این نوع در برخی ماشینها علامتدار است. این هشدار توسط -Wall فعال میشود.
- -Wno-coverage-mismatch
- در صورت عدم تطابق پروفایلهای بازخورد هنگام استفاده از گزینه -fprofile-use، هشدار میدهد. اگر یک فایل مبدأ بین کامپایل با -fprofile-generate و -fprofile-use تغییر کند، ممکن است فایلهای حاوی بازخورد پروفایل با فایل مبدأ مطابقت نداشته باشند و GCC نتواند از اطلاعات بازخورد پروفایل استفاده کند. بهطور پیشفرض، این هشدار فعال است و با آن مانند یک خطا برخورد میشود. از -Wno-coverage-mismatch میتوان برای غیرفعال کردن هشدار یا از -Wno-error=coverage-mismatch برای غیرفعال کردن تبدیل آن به خطا استفاده کرد. غیرفعال کردن خطا برای این هشدار میتواند به تولید کدی با بهینهسازی ضعیف منجر شود و فقط در مواردی با تغییرات بسیار جزئی مانند رفع باگ در یک پایگاه کد موجود مفید است. غیرفعال کردن کامل این هشدار توصیه نمیشود.
- -Wno-coverage-too-many-conditions
- در صورتی که از -fcondition-coverage استفاده شود و یک عبارت دارای شروط جزئی بیش از حدی باشد و GCC از پوشش صرفنظر کند، هشدار میدهد. صرفنظر کردن از پوشش زمانی رخ میدهد که تعداد شروط جزئی در عبارت شرطی، بیشتر از تعداد بیتهای موجود در یک "gcov_type_unsigned" باشد. این هشدار بهطور پیشفرض فعال است.
- -Wno-coverage-too-many-paths
- در صورتی که از -fpath-coverage استفاده شود و یک تابع مسیرهای بسیار زیادی داشته باشد و GCC از پوشش صرفنظر کند، هشدار میدهد. انصراف از پوشش توسط -fpath-coverage-limit کنترل میشود. این هشدار بهطور پیشفرض فعال است.
- -Wno-coverage-invalid-line-number
- در صورتی که
به دلیل
ماکروهای
نامعتبرِ
شماره خط،
تابعی
زودتر از
شروع شدنش
به پایان
برسد،
هشدار
میدهد. این
هشدار تنها
با فعال
بودن --coverage
صادر
میشود.
بهطور پیشفرض، این هشدار فعال است و مانند یک خطا با آن برخورد میشود. میتوان از -Wno-coverage-invalid-line-number برای غیرفعال کردن هشدار یا از -Wno-error=coverage-invalid-line-number برای غیرفعال کردن حالت خطای آن استفاده کرد.
- -Wno-cpp (تنها C، Objective-C، C++، Objective-C++ و Fortran)
- پیامهای هشدار صادرشده توسط دستورالعملهای "#warning" را فرو مینشاند.
- -Wdouble-promotion (تنها C، C++، Objective-C و Objective-C++)
- زمانی که
مقداری از
نوع "float"
بهطور
ضمنی به
"double"
ترفیع
مییابد،
هشدار
میدهد.
پردازندههایی
با واحد
ممیز شناور
۳۲ بیتی
«دقت
یگانه»،
نوع "float"
را در
سختافزار
پیادهسازی
میکنند،
اما "double"
را در
نرمافزار
شبیهسازی
مینمایند.
در چنین
ماشینهایی،
انجام
محاسبات با
مقادیر
"double" به
دلیل بار
محاسباتی
شبیهسازی
نرمافزاری
بسیار
پرهزینهتر
است.
انجام تصادفی محاسبات با "double" بهسادگی رخ میدهد زیرا لیترالهای ممیز شناور بهصورت ضمنی از نوع "double" هستند. بهعنوان مثال، در:
float area(float radius) { return 3.14159 * radius * radius; }کامپایلر کل محاسبات را با "double" انجام میدهد چرا که لیترال ممیز شناور از نوع "double" است.
- -Wduplicate-decl-specifier (تنها C و Objective-C)
- اگر اعلانی دارای مشخصکننده تکراری "const"، "volatile"، "restrict" یا "_Atomic" باشد، هشدار میدهد. این هشدار با -Wall فعال میشود.
- -Wformat
- -Wformat=n
- فراخوانیهای
توابعی
مانند
"printf"،
"scanf" و
غیره را
بررسی
میکند تا
مطمئن شود
نوع
آرگومانهای
دادهشده
با رشته
قالب
مشخصشده
مطابقت
دارند، و
تبدیلات
مشخصشده
در رشته
قالب منطقی
هستند. این
شامل توابع
استاندارد
و سایر
توابع
مشخصشده
توسط
ویژگیهای
format، در
خانوادههای
"printf"،
"scanf"،
"strftime" و
"strfmon" (یک
افزونه X/Open که
در
استاندارد C
وجود ندارد)
(یا سایر
خانوادههای
مختص
معماری
مقصد)
میشود.
اینکه
کدام توابع
بدون مشخص
شدن
ویژگیهای
format بررسی
شوند به
نسخه
استاندارد
انتخابشده
بستگی
دارد، و
بررسی چنین
توابعی
بدون صفت
مذکور توسط
-ffreestanding یا -fno-builtin
غیرفعال
میشود.
قالبها بر اساس قابلیتهای قالببندی پشتیبانیشده توسط GNU libc نسخه 2.2 بررسی میشوند. این قابلیتها شامل تمامی ویژگیهای استاندارد ISO C90 و C99 و همچنین ویژگیهایی از Single Unix Specification و برخی الحاقات BSD و GNU است. سایر پیادهسازیهای کتابخانهها ممکن است از تمامی این قابلیتها پشتیبانی نکنند؛ GCC از هشدار دادن درباره قابلیتهایی که فراتر از محدودیتهای یک کتابخانه خاص باشند پشتیبانی نمیکند. با این حال، اگر -Wpedantic همراه با -Wformat استفاده شود، درباره ویژگیهای قالبی که در نسخه استاندارد انتخابشده وجود ندارند هشدار داده خواهد شد (اما نه برای قالبهای "strfmon"، زیرا در هیچ نسخهای از استاندارد C وجود ندارند).
- -Wformat
- گزینهٔ -Wformat معادل -Wformat=1 و -Wno-format معادل -Wformat=0 است. از آنجا که -Wformat آرگومانهای قالب تهی (null) را نیز برای چندین تابع بررسی میکند، -Wformat متضمن -Wnonnull نیز هست. برخی از جنبههای این سطح از بررسی قالب را میتوان با گزینههای -Wno-format-contains-nul، -Wno-format-extra-args و -Wno-format-zero-length غیرفعال کرد. -Wformat توسط -Wall فعال میشود.
- -Wformat=2
- فعالسازی -Wformat بههمراه بررسیهای قالب بیشتر. در حال حاضر معادل -Wformat -Wformat-nonliteral -Wformat-security -Wformat-y2k است.
- -Wno-format-contains-nul
- اگر -Wformat مشخص شده باشد، دربارهٔ رشتههای قالبی که حاوی بایتهای NUL هستند هشدار داده نمیشود.
- -Wno-format-extra-args
- اگر -Wformat مشخص
شده باشد،
دربارهٔ
آرگومانهای
اضافی برای
تابع قالب
"printf" یا
"scanf"
هشدار داده
نمیشود.
استاندارد C
مشخص
میکند که
چنین
آرگومانهایی
نادیده
گرفته
میشوند.
در جایی که آرگومانهای استفادهنشده میان آرگومانهای استفادهشدهای قرار دارند که با مشخصکنندههای شماره عملوند $ تعیین شدهاند، معمولاً هنوز هشدار داده میشود، زیرا پیادهسازی نمیتواند بداند چه نوعی را باید برای رد کردن آرگومانهای استفادهنشده به "va_arg" ارسال کند. با این حال، در مورد قالبهای "scanf"، اگر آرگومانهای استفادهنشده همگی اشارهگر باشند، این گزینه هشدار را سرکوب میکند، زیرا استاندارد Single Unix Specification میگوید چنین آرگومانهای استفادهنشدهای مجاز هستند.
- -Wformat-overflow
- -Wformat-overflow=level
- دربارهٔ فراخوانیهای توابع ورودی/خروجی قالببندیشده مانند "sprintf" و "vsprintf" که ممکن است باعث سرریز بافر مقصد شوند هشدار میدهد. هنگامی که تعداد دقیق بایتهای نوشتهشده توسط یک راهنمای قالب را نتوان در زمان کامپایل تعیین کرد، بر اساس روشهای اکتشافی که به آرگومان level و بهینهسازی بستگی دارند تخمین زده میشود. اگرچه فعال کردن بهینهسازی در بیشتر موارد دقت هشدار را بهبود میبخشد، اما ممکن است منجر به هشدارهای مثبت کاذب نیز بشود.
- -Wformat-overflow
- -Wformat-overflow=1
- سطح 1 از
-Wformat-overflow که توسط
-Wformat فعال
میشود،
رویکردی
محافظهکارانه
را به کار
میگیرد که
فقط
دربارهٔ
فراخوانیهایی
هشدار
میدهد که
به احتمال
زیاد از
بافر سرریز
میکنند. در
این سطح،
فرض میشود
آرگومانهای
عددی با
مقادیر
نامعلوم
برای
راهنماهای
قالب،
دارای
مقدار یک
هستند، و
رشتههایی
با طول
نامعلوم،
خالی فرض
میشوند.
برای
آرگومانهای
عددی که
مشخص است به
زیرمحدودهای
از نوع خود
محدود
هستند، یا
آرگومانهای
رشتهای که
خروجی
آنها چه با
دقت
راهنمایشان
و چه با
مجموعهای
متناهی از
لیترالهای
رشتهای
محدود شده
است، فرضی
در نظر
گرفته
میشود که
مقداری
درون آن
محدوده
اختیار
کنند که
منجر به
بیشترین
بایتها در
خروجی شود.
برای مثال،
فراخوانی
"sprintf" زیر
گزارش
میشود
زیرا حتی با
برابر صفر
بودن هر دو
a و b،
نویسهٔ
پایانی NUL
('\0') که
توسط تابع
به بافر
مقصد الحاق
میشود،
فراتر از
انتهای آن
نوشته
خواهد شد.
افزایش
اندازهٔ
بافر به
میزان یک
بایت برای
اجتناب از
هشدار کافی
است، هرچند
ممکن است
برای
جلوگیری از
سرریز کافی
نباشد.
void f (int a, int b) { char buf [13]; sprintf (buf, "a = %i, b = %i\n", a, b); } - -Wformat-overflow=2
- سطح 2
همچنین
دربارهٔ
فراخوانیهایی
هشدار
میدهد که
ممکن است در
صورت وجود
آرگومانی
با طول یا
بزرگی
کافی، از
بافر مقصد
سرریز کنند.
در سطح 2،
برای
آرگومانهای
عددی
نامعلوم،
در صورت
داشتن نوع
علامتدار
با دقتی
بیشتر از ۱،
حداقل
مقدار
قابلنمایش،
و در غیر
این صورت
حداکثر
مقدار
قابلنمایش
فرض میشود.
برای
آرگومانهای
رشتهای
نامعلوم که
طول آنها
را نتوان
محدود به
دقت
راهنما، یا
به
مجموعهای
متناهی از
لیترالهای
رشتهای که
ممکن است به
آنها
ارزیابی
شوند، یا به
آرایهٔ
نویسهای
که ممکن است
به آن اشاره
کنند در نظر
گرفت، طولی
برابر ۱
نویسه فرض
میشود.
در سطح 2، فراخوانی مثال بالا دوباره گزارش میشود، اما این بار به این دلیل که اگر a برابر یک "INT_MIN" ۳۲ بیتی باشد، نخستین راهنمای %i برخی از ارقام خود را فراتر از انتهای بافر مقصد خواهد نوشت. برای ایمنسازی این فراخوانی بدون در نظر گرفتن مقادیر دو متغیر، اندازهٔ بافر مقصد باید حداقل به ۳۴ بایت افزایش یابد. GCC حداقل اندازهٔ بافر را در یک یادداشت اطلاعاتی در ادامهٔ هشدار ذکر میکند.
یک جایگزین برای افزایش اندازهٔ بافر مقصد، محدود کردن دامنهٔ مقادیر قالببندیشده است. حداکثر طول آرگومانهای رشتهای را میتوان با مشخص کردن دقت در راهنمای قالب محدود کرد. هنگامی که بتوان فرض کرد آرگومانهای عددیِ راهنماهای قالب به مقداری کمتر از دقت نوع خود محدود هستند، انتخاب یک اصلاحکنندهٔ طول مناسب برای مشخصکنندهٔ قالب، اندازهٔ بافر مورد نیاز را کاهش خواهد داد. برای مثال، اگر در نمونهٔ بالا بتوان فرض کرد a و b در محدودهٔ دقت نوع "short int" قرار دارند، استفاده از راهنمای قالب %hi یا تبدیل نوع آرگومان به "short"، حداکثر اندازهٔ بافر مورد نیاز را به ۲۴ بایت کاهش میدهد.
void f (int a, int b) { char buf [23]; sprintf (buf, "a = %hi, b = %i\n", a, (short)b); }
- -Wno-format-zero-length
- اگر -Wformat مشخص شده باشد، دربارهٔ قالبهای با طول صفر هشدار نده. استاندارد C مشخص میکند که قالبهای با طول صفر مجاز هستند.
- -Wformat-nonliteral
- اگر -Wformat مشخص شده باشد، همچنین در صورتی که رشتهٔ قالب یک لیترال رشتهای نباشد و بنابراین نتوان آن را بررسی کرد هشدار میدهد، مگر اینکه تابع قالب آرگومانهای قالب خود را بهصورت یک "va_list" دریافت کند.
- -Wformat-security
- اگر -Wformat مشخص شده باشد، همچنین دربارهٔ استفاده از توابع قالبی که نشاندهندهٔ مشکلات امنیتی احتمالی هستند هشدار میدهد. در حال حاضر، این گزینه دربارهٔ فراخوانیهای توابع "printf" و "scanf" در جایی که رشتهٔ قالب یک لیترال رشتهای نیست و هیچ آرگومان قالبی وجود ندارد هشدار میدهد، مانند "printf (foo);". اگر رشتهٔ قالب از ورودی غیرقابلاعتماد آمده باشد و شامل %n باشد، این میتواند یک رخنهٔ امنیتی باشد. (این گزینه در حال حاضر زیرمجموعهای از مواردی است که -Wformat-nonliteral دربارهٔ آنها هشدار میدهد، اما در آینده ممکن است هشدارهایی به -Wformat-security افزوده شوند که در -Wformat-nonliteral گنجانده نشدهاند.)
- -Wformat-signedness
- اگر -Wformat مشخص شده باشد، همچنین در صورتی که رشتهٔ قالب نیازمند یک آرگومان بدون علامت (unsigned) باشد و آرگومان علامتدار (signed) باشد، و برعکس، هشدار میدهد.
- -Wformat-truncation
- -Wformat-truncation=level
- دربارهٔ فراخوانیهای توابع ورودی/خروجی قالببندیشده مانند "snprintf" و "vsnprintf" که ممکن است به بریدهشدن خروجی (truncation) منجر شوند، هشدار میدهد. هنگامی که تعداد دقیق بایتهای نوشتهشده توسط یک راهنمای قالب در زمان کامپایل قابل تعیین نباشد، بر اساس روشهای اکتشافی که به آرگومان level و بهینهسازی وابسته است تخمین زده میشود. اگرچه فعالسازی بهینهسازی در بیشتر موارد دقت هشدار را بهبود میبخشد، اما ممکن است منجر به موارد مثبت کاذب نیز بشود. بهجز مواردی که قید شده است، این گزینه از همان منطق -Wformat-overflow استفاده میکند.
- -Wformat-truncation
- -Wformat-truncation=1
- سطح 1 از -Wformat-truncation که توسط -Wformat فعال میشود، رویکردی محافظهکارانه را به کار میگیرد که فقط دربارهٔ فراخوانی توابع دارای کران هشدار میدهد که مقدار بازگشتی آنها بدون استفاده مانده است و به احتمال بسیار زیاد به بریدهشدن خروجی منجر خواهند شد.
- -Wformat-truncation=2
- سطح 2 همچنین دربارهٔ فراخوانی توابع دارای کران هشدار میدهد که مقدار بازگشتی آنها استفاده شده است و با فرض وجود آرگومانی با طول یا بزرگی کافی، ممکن است به بریدهشدن خروجی منجر شوند.
- -Wformat-y2k
- اگر -Wformat مشخص
شده باشد،
همچنین
دربارهٔ
قالبهای
"strftime" که
ممکن است
تنها یک سال
دو رقمی
تولید کنند
هشدار
میدهد..IP -Wnonnull 4
دربارهٔ
ارسال یک
اشارهگر
تهی (null pointer) برای
آرگومانهایی
که با
مشخصهٔ
تابع
"nonnull" به
عنوان
نیازمند
مقدار
غیرتهی
علامتگذاری
شدهاند،
هشدار
میدهد.
-Wnonnull در -Wall و -Wformat گنجانده شده است. این گزینه میتواند با گزینهٔ -Wno-nonnull غیرفعال شود.
- -Wnonnull-compare
- هنگام
مقایسهٔ یک
آرگومان
نشانهگذاریشده
با مشخصهٔ
تابع
"nonnull" با
مقدار null در
درون تابع،
هشدار
میدهد.
-Wnonnull-compare در -Wall گنجانده شده است. این گزینه میتواند با گزینهٔ -Wno-nonnull-compare غیرفعال شود.
- -Wnull-dereference
- اگر کامپایلر مسیرهایی را تشخیص دهد که به دلیل ارجاعزدایی یک اشارهگر تهی رفتار نادرست یا تعریفنشده (undefined behavior) ایجاد میکنند، هشدار میدهد. این گزینه تنها زمانی فعال است که -fdelete-null-pointer-checks فعال باشد، که در بیشتر هدفها (targets) توسط بهینهسازیها فعال میشود. دقت این هشدارها به گزینههای بهینهسازیِ استفادهشده بستگی دارد.
- -Wno-musttail-local-addr
- دربارهٔ ارسال یک اشارهگر (یا در ++C، یک ارجاع) به متغیر محلی یا برچسب به عنوان آرگومان یک فراخوانی "musttail" هشدار نمیدهد. این متغیرها پیش از دستور فراخوانی دم (tail call instruction) از حوزه (scope) خارج میشوند.
- -Wmaybe-musttail-local-addr
- هنگامی که
نشانی یک
متغیر محلی
بتواند به
یک
فراخوانی
"musttail" نشت
کند (escape کند)،
هشدار
میدهد؛
مگر آنکه از
پیش و پیش
از
فراخوانی
"musttail" از
حوزه خارج
شده باشد.
int foo (int *); int bar (int *x) { if (x[0] == 1) { int a = 42; foo (&a); /* Without the C<musttail> attribute this call would not be tail called, because address of the C<a> variable escapes and the second foo call could dereference it. With the attribute the local variables are assumed to go out of scope immediately before the tail call instruction and the compiler warns about this. */ [[gnu::musttail]] return foo (nullptr); } else { { int a = 42; foo (&a); } /* The C<a> variable isn't already in scope, so even when it escaped, even without C<musttail> attribute it would be undefined behavior to dereference it and the compiler could turn this into a tail call. No warning is diagnosed here. */ [[gnu::musttail]] return foo (nullptr); } }این هشدار توسط -Wextra فعال میشود.
- -Wnrvo (تنها ++C و Objective-C++)
- اگر
کامپایلر
رونوشت (copy) از
یک متغیر
محلی به
مقدار
بازگشتی یک
تابع را در
زمینهای
که طبق [class.copy.elision]
مجاز است
حذف نکند (elide
نکند)،
هشدار
میدهد. این
حذف رونوشت
معمولاً به
عنوان
«بهینهسازی
مقدار
بازگشتی
نامگذاریشده»
(Named Return Value Optimization یا NRVO)
شناخته
میشود.
برای
نمونه، در
مثال زیر
کامپایلر
نمیتواند
رونوشتها
را از هر
دوی v1 و v2 حذف
کند،
بنابراین
هیچکدام
را حذف
نمیکند.
std::vector<int> f() { std::vector<int> v1, v2; // ... if (cond) return v1; else return v2; // warning: not eliding copy } - -Winfinite-recursion
- دربارهٔ
فراخوانیهای
بازگشتی
بینهایت
هشدار
میدهد. این
هشدار در
تمام سطوح
بهینهسازی
مؤثر است،
اما برای
تشخیص
بازگشت
بینهایت
در
فراخوانیهای
میان دو یا
چند تابع،
نیازمند
بهینهسازی
است. -Winfinite-recursion در
-Wall گنجانده
شده است.
با -Wanalyzer-infinite-recursion مقایسه کنید که تشخیص مشابهی ارائه میدهد، اما به شیوهٔ متفاوتی (به عنوان بخشی از -fanalyzer) پیادهسازی شده است.
- -Winit-self (تنها C، ++C، Objective-C و Objective-C++)
- دربارهٔ
متغیرهای
مقداردهینشدهای
که با
خودشان
مقداردهی
اولیه
میشوند
هشدار
میدهد.
توجه داشته
باشید که
این گزینه
تنها
میتواند
همراه با
گزینهٔ -Wuninitialized
استفاده
شود.
برای نمونه، GCC دربارهٔ مقداردهینشدن "i" در قطعهکد زیر تنها زمانی هشدار میدهد که -Winit-self مشخص شده باشد:
int f() { int i = i; return i; }این هشدار در ++C توسط -Wall فعال میشود.
- -Wno-implicit-int (تنها C و Objective-C)
- این گزینه
هشدارهای
مربوط به
زمانی را که
یک اعلان (declaration)
نوعی را
مشخص
نمیکند،
کنترل
میکند. این
هشدار به
طور
پیشفرض،
به صورت یک
خطا، در C99 و
نگارشهای
بعدی C، و
همچنین
توسط -Wall
فعال است.
این خطا
میتواند
با استفاده
از -fpermissive (به
همراه برخی
خطاهای
دیگر)، یا
تنها برای
همین خطا با
-Wno-error=implicit-int، به یک
هشدار
تقلیل یابد.
این هشدار توسط -pedantic-errors به یک خطا ارتقا مییابد.
- -Wno-implicit-function-declaration (تنها C و Objective-C)
- این گزینه
هشدارهای
مربوط به
زمانی را که
یک تابع پیش
از اعلان
شدن
استفاده
میشود،
کنترل
میکند. این
هشدار به
طور
پیشفرض،
به صورت یک
خطا، در C99 و
نگارشهای
بعدی C، و
همچنین
توسط -Wall
فعال است.
این خطا
میتواند
با استفاده
از -fpermissive (به
همراه برخی
خطاهای
دیگر)، یا
تنها برای
همین خطا با
-Wno-error=implicit-function-declaration، به
یک هشدار
تقلیل یابد.
این هشدار توسط -pedantic-errors به یک خطا ارتقا مییابد.
- -Wimplicit (تنها C و Objective-C)
- مشابه با -Wimplicit-int و -Wimplicit-function-declaration است. این هشدار توسط -Wall فعال میشود.
- -Whardened
- زمانی که
-fhardened
گزینهای
از مجموعهٔ
خود را فعال
نکرده باشد
هشدار
میدهد (که
برای
مشاهدهٔ آن
-fhardened را
ببینید).
برای
نمونه،
استفادهٔ
همزمان از
-fhardened و -fstack-protector در
خط فرمان
باعث
میشود -Whardened
هشدار دهد،
زیرا -fstack-protector-strong
توسط -fhardened
فعال
نخواهد شد.
این هشدار به طور پیشفرض فعال است و تنها زمانی اثر دارد که -fhardened فعال باشد.
- -Wimplicit-fallthrough
- -Wimplicit-fallthrough همانند -Wimplicit-fallthrough=3 است و -Wno-implicit-fallthrough همانند -Wimplicit-fallthrough=0 است.
- -Wimplicit-fallthrough=n
- هنگامی که
یک مورد switch به
مورد بعدی
سرریز
میکند (falls through)،
هشدار
میدهد.
برای نمونه:
switch (cond) { case 1: a = 1; break; case 2: a = 2; case 3: a = 3; break; }این هشدار زمانی که آخرین دستور یک مورد نتواند سرریز کند هشدار نمیدهد؛ برای نمونه زمانی که یک دستور return یا فراخوانی تابعی با مشخصهٔ noreturn وجود داشته باشد. -Wimplicit-fallthrough= همچنین دستورهای کنترل جریان مانند ifها را در نظر میگیرد و تنها زمانی که مناسب باشد هشدار میدهد. برای نمونه:
switch (cond) { case 1: if (i > 3) { bar (5); break; } else if (i < 1) { bar (0); } else return; default: ... }از آنجا که مواقعی وجود دارد که سرریز شدن مورد در switch مطلوب است، GCC مشخصهای به نام "__attribute__ ((fallthrough))" فراهم کرده است که باید همراه با یک دستور پوچ (null statement) برای فرونشاندن این هشدار که در حالت عادی رخ میدهد، استفاده شود: switch (cond) { case 1: bar (0); __attribute__ ((fallthrough)); default: ... }
در C++17 یک روش استاندارد برای فرونشاندن هشدار -Wimplicit-fallthrough با استفاده از "[[fallthrough]];" بهجای صفت GNU فراهم شده است. در C++11 یا C++14 کاربران میتوانند از "[[gnu::fallthrough]];" که یک افزونهٔ GNU است استفاده کنند. بهجای این صفتها، همچنین امکان افزودن یک کامنت fallthrough برای خاموش کردن هشدار وجود دارد. کل بدنهٔ کامنت به سبک C یا C++ باید با عبارتهای منظم ارائهشده در زیر مطابقت داشته باشد. آرگومان گزینهٔ n مشخص میکند چه نوع کامنتهایی پذیرفته میشوند:
- *<-Wimplicit-fallthrough=0 هشدار را بهکلی غیرفعال میکند.>
- *<-Wimplicit-fallthrough=1 با عبارت منظم ".*" مطابقت دارد؛>
- هر کامنتی بهعنوان کامنت fallthrough در نظر گرفته میشود.
- *<-Wimplicit-fallthrough=2 بدون حساسیت به بزرگی و کوچکی حروف با>
- عبارت منظم ".*falls?[ \t-]*thr(ough|u).*" مطابقت مییابد.
- *<-Wimplicit-fallthrough=3 با حساسیت به بزرگی و کوچکی حروف با یکی از>
- عبارتهای منظم زیر مطابقت مییابد:
- *<"-fallthrough">
- *<"@fallthrough@">
- *<"lint -fallthrough[ \t]*">
- *<"[ \t.!]*(ELSE,? |INTENTIONAL(LY)? )?FALL(S | |-)?THR(OUGH|U)[ \t.!]*(-[^\n\r]*)?">
- *<"[ \t.!]*(Else,? |Intentional(ly)? )?Fall((s | |-)[Tt]|t)hr(ough|u)[ \t.!]*(-[^\n\r]*)?">
- *<"[ \t.!]*([Ee]lse,? |[Ii]ntentional(ly)? )?fall(s | |-)?thr(ough|u)[ \t.!]*(-[^\n\r]*)?">
- *<-Wimplicit-fallthrough=4 با حساسیت به بزرگی و کوچکی حروف با یکی از>
- عبارتهای منظم زیر مطابقت مییابد:
- *<"-fallthrough">
- *<"@fallthrough@">
- *<"lint -fallthrough[ \t]*">
- *<"[ \t]*FALLTHR(OUGH|U)[ \t]*">
- *<-Wimplicit-fallthrough=5 هیچ کامنتی را بهعنوان>
- کامنت fallthrough شناسایی نمیکند؛ تنها صفتها هشدار را غیرفعال میکنند.
کامنت باید پس از فاصلههای خالی و کامنتهای دیگر (در صورت وجود)، با کلمات کلیدی "case" یا "default"، یا با یک برچسب کاربر که پیش از یک برچسب "case" یا "default" قرار دارد، دنبال شود.
switch (cond)
{
case 1:
bar (0);
/* FALLTHRU */
default:
...
}
هشدار -Wimplicit-fallthrough=3 توسط -Wextra فعال میشود.
- -Wno-if-not-aligned (فقط C، C++، Objective-C و Objective-C++)
- کنترل میکند که آیا هشدارهای راهاندازیشده توسط صفت "warn_if_not_aligned" باید صادر شوند یا خیر. این هشدارها بهطور پیشفرض فعال هستند.
- -Wignored-qualifiers (فقط C و C++)
- اگر نوع
بازگشتی یک
تابع دارای
یک
توصیفگر
نوع مانند
"const"
باشد،
هشدار
میدهد.
برای ISO C چنین
توصیفگر
نوعی اثری
ندارد، چرا
که مقدار
بازگرداندهشده
توسط یک
تابع یک lvalue
نیست. برای
C++، این
هشدار تنها
برای انواع
اسکالر یا
"void" صادر
میشود.
استاندارد
ISO C انواع
بازگشتی
مقیدشدهٔ
"void" را در
تعاریف
توابع
ممنوع
میکند،
بنابراین
چنین انواع
بازگشتی
حتی بدون
این گزینه
نیز همیشه
هشدار
دریافت
میکنند.
این هشدار همچنین توسط -Wextra فعال میشود.
- -Wno-ignored-attributes (فقط C و C++)
- این گزینه هشدارهای مربوط به نادیده گرفته شدن یک صفت را کنترل میکند. این گزینه با گزینهٔ -Wattributes از این نظر تفاوت دارد که هرگاه کامپایلر تصمیم به حذف یک صفت بگیرد هشدار میدهد، نه اینکه صفت ناشناخته باشد یا در مکان نادرستی استفاده شده باشد و غیره. این هشدار بهطور پیشفرض فعال است.
- -Wmain
- اگر نوع
"main"
مشکوک
باشد،
هشدار
میدهد.
"main" باید
تابعی با
پیوند
خارجی (external linkage)
باشد که int
بازمیگرداند
و صفر، دو
یا سه
آرگومان با
انواع
مناسب
میپذیرد.
این هشدار
بهطور
پیشفرض در
C++ فعال است و
توسط -Wall یا
-Wpedantic نیز
فعال
میشود.
این هشدار با -pedantic-errors به یک خطا ارتقا مییابد.
- -Wmisleading-indentation (فقط C و C++)
- زمانی که
تورفتگی کد
منعکسکنندهٔ
ساختار
بلوکی
نباشد،
هشدار
میدهد.
بهطور
مشخص، برای
بندهای
"if"،
"else"،
"while" و
"for" با
دستور
محافظتشدهای
که از
آکوالاد
استفاده
نمیکند و
پس از آن یک
دستور
محافظتنشده
با همان
میزان
تورفتگی
آمده باشد،
هشدار صادر
میشود.
در مثال زیر، فراخوانی «bar» بهطور گمراهکنندهای دارای تورفتگی است، بهگونهای که گویی توسط شرط «if» محافظت شده است.
if (some_condition ()) foo (); bar (); /* Gotcha: this is not guarded by the "if". */
در صورت ترکیب تبها و فاصلهها، این هشدار از گزینهٔ -ftabstop= برای تعیین همتراز بودن دستورها استفاده میکند (پیشفرض ۸ است).
این هشدار برای کدهایی که شامل منطق چندخطی پیشپردازنده هستند، مانند مثال زیر، صادر نمیشود.
if (flagA) foo (0); #if SOME_CONDITION_THAT_DOES_NOT_HOLD if (flagB) #endif foo (1);این هشدار پس از یک دستورالعمل "#line" صادر نمیشود، زیرا این مورد معمولاً نشاندهندهٔ کد تولیدشده بهصورت خودکار است و هیچ فرضی دربارهٔ چیدمان فایلی که دستورالعمل به آن اشاره میکند نمیتوان داشت.
این هشدار توسط -Wall در C و C++ فعال میشود.
- -Wmissing-attributes
- زمانی که در
اعلان یک
تابع، یک یا
چند صفت که
تابع مرتبط
با آن اعلان
شده وجود
نداشته
باشد و
نبودِ
آنها
بتواند بر
درستی یا
کارایی کد
تولیدشده
اثر منفی
بگذارد،
هشدار
میدهد.
برای
نمونه، این
هشدار برای
اعلانهای
نامهای
مستعار
صادر
میشود که
از صفتها
برای تعیین
الزاماتی
با محدودیت
کمتر نسبت
به اهداف
خود
استفاده
میکنند.
این امر
معمولاً
نشاندهندهٔ
یک فرصت
بهینهسازی
بالقوه است.
در مقابل،
گزینهٔ
-Wattribute-alias=2
هشدارهای
صادرشده در
هنگامی را
کنترل
میکند که
نام مستعار
نسبت به هدف
محدودکنندهتر
باشد، که
میتواند
به تولید کد
نادرست
منجر شود.
صفتهای
بررسیشده
شامل
"alloc_align"،
"alloc_size"،
"cold"،
"const"،
"hot"،
"leaf"،
"malloc"،
"nonnull"،
"noreturn"،
"nothrow"،
"pure"،
"returns_nonnull" و
"returns_twice"
هستند.
در C++، این هشدار زمانی صادر میشود که یک تخصیص صریح (explicit specialization) از یک الگوی پایه که با صفت "alloc_align"، "alloc_size"، "assume_aligned"، "format"، "format_arg"، "malloc" یا "nonnull" اعلان شده است، بدون آن صفت اعلان شود. صفتهای "deprecated"، "error" و "warning" این هشدار را فرومینشانند..
میتوانید از صفت "copy" برای اعمال همان مجموعه از صفتها بر روی یک اعلان، مشابه اعلان دیگر، بدون فهرست کردن صریح صفتها استفاده کنید. این صفت را میتوان برای اعلانهای توابع، متغیرها یا انواع به کار برد.
گزینهٔ -Wmissing-attributes توسط -Wall فعال میشود.
برای مثال، از آنجا که اعلان الگوی تابع پایه در زیر از هر دو صفت "malloc" و "alloc_size" استفاده میکند، اعلان تخصیص صریح این الگو به دلیل نبود یکی از صفتها تشخیص داده شده و برای آن هشدار صادر میشود. template <class T> T* __attribute__ ((malloc, alloc_size (1))) allocate (size_t); template <> void* __attribute__ ((malloc)) // missing alloc_size allocate<void> (size_t);
- -Wmissing-braces
- اگر
مقداردهی
اولیه برای
یک نوع
تجمیعی (aggregate)
یا union بهطور
کامل درون
آکولاد
قرار
نگرفته
باشد،
هشدار
میدهد. در
مثال زیر،
مقداردهی
اولیه برای
"a"
بهطور
کامل در
آکولاد
نیست، اما
برای "b"
بهطور
کامل در
آکولاد
قرار گرفته
است.
int a[2][2] = { 0, 1, 2, 3 }; int b[2][2] = { { 0, 1 }, { 2, 3 } };این هشدار با -Wall فعال میشود.
- -Wmissing-include-dirs (فقط C، C++، Objective-C، Objective-C++ و Fortran)
- اگر دایرکتوری include ارائهشده توسط کاربر وجود نداشته باشد، هشدار میدهد. این گزینه بهطور پیشفرض برای C، C++، Objective-C و Objective-C++ غیرفعال است. برای Fortran، بهطور پیشفرض تنها با هشدار دادن برای -I و -J بهصورت جزئی فعال است.
- -Wno-missing-profile
- این گزینه هشدارهای مربوط به نبود پروفایلهای بازخورد را هنگام استفاده از گزینهٔ -fprofile-use کنترل میکند. این گزینه مواردی را شناسایی میکند که بین کامپایل با -fprofile-generate و کامپایل با -fprofile-use، یک تابع جدید یا فایل جدید بدون تولید مجدد پروفایلها اضافه شده باشد. در این موارد، فایلهای دادهٔ بازخورد پروفایل به ترتیب حاوی هیچ اطلاعات بازخوردی برای تابع یا فایل جدید اضافه شده نیستند. همچنین در صورتی که فایلهای دادههای شمارش پروفایل (.gcda) حذف شده باشند، GCC نمیتواند از هیچ اطلاعات بازخوردی استفاده کند. در تمام این موارد، هشدارهایی صادر میشوند تا به شما اطلاع دهند که باید مرحلهٔ تولید پروفایل انجام گیرد. نادیده گرفتن این هشدار میتواند منجر به تولید کدی با بهینهسازی ضعیف شود. میتوان از -Wno-missing-profile برای غیرفعال کردن این هشدار استفاده کرد، اما این کار توصیه نمیشود و تنها در صورتی باید انجام شود که عدم وجود دادههای پروفایل توجیهپذیر باشد.
- -Wmismatched-dealloc
- در مورد
فراخوانی
توابع
آزادسازی
حافظه با
آرگومانهای
اشارهگری
که از توابع
تخصیصی
بازگردانده
شدهاند و
تابع نخست
یک
آزادکنندهٔ
مناسب برای
آنها
نیست،
هشدار
میدهد. یک
جفت تابع
میتوانند
با استفاده
از مشخصهٔ
"malloc" به
عنوان
تخصیصدهنده
و
آزادکنندهٔ
متناظر به
یکدیگر
پیوند داده
شوند. مگر
اینکه توسط
گزینهٔ -fno-builtin
غیرفعال
شده باشد،
توابع
استاندارد
"calloc"،
"malloc"،
"realloc" و
"free"، و
همچنین
اشکال
متناظر
"operator new" و
"operator delete" در C++
بهطور
ضمنی به
عنوان
تخصیصدهنده
و
آزادکنندهٔ
منطبق با
یکدیگر در
نظر گرفته
میشوند. در
مثال زیر،
"mydealloc"
آزادکننده
برای
اشارهگرهای
بازگرداندهشده
از "myalloc"
است.
void mydealloc (void*); __attribute__ ((malloc (mydealloc, 1))) void* myalloc (size_t); void f (void) { void *p = myalloc (32); // ...use p... free (p); // warning: not a matching deallocator for myalloc mydealloc (p); // ok }در C++، گزینهٔ مرتبط -Wmismatched-new-delete عدم تطابقهای مربوط به "operator new" یا "operator delete" را بررسی میکند.
گزینهٔ -Wmismatched-dealloc در -Wall گنجانده شده است.
- -Wmultistatement-macros
- در مورد
ماکروهای
چنددستوری
ناامن که به
نظر میرسد
توسط
عبارتی
مانند
"if"،
"else"،
"for"،
"switch" یا
"while"
محافظت
شدهاند،
اما پس از
بسط ماکرو
تنها دستور
اول واقعاً
محافظت
میشود،
هشدار
میدهد.
برای مثال:
#define DOIT x++; y++ if (c) DOIT;
مقدار "y" را بدون قید و شرط افزایش میدهد، نه فقط در زمانی که شرط "c" برقرار باشد. این مشکل معمولاً میتواند با قرار دادن ماکرو درون یک حلقهٔ do-while برطرف شود:
#define DOIT do { x++; y++; } while (0) if (c) DOIT;این هشدار توسط -Wall در C و C++ فعال میشود.
- -Wparentheses
- اگر
پرانتزها
در
زمینههای
خاصی حذف
شده باشند،
مانند
زمانی که در
بستری که
مقدار بولی
(درستی/نادرستی)
مورد
انتظار است
یک انتساب
انجام شده
باشد، یا
هنگامی که
عملگرهایی
تو در تو
شده باشند
که تقدم
آنها
معمولاً
افراد را
دچار
سردرگمی
میکند،
هشدار
میدهد.
همچنین اگر مقایسهای مانند "x<=y<=z" ظاهر شود هشدار میدهد؛ این عبارت معادل "(x<=y ? 1 : 0) <= z" است که با نمادگذاری معمول ریاضی تفسیر متفاوتی دارد.
همچنین در مورد استفادههای خطرناک از افزونهٔ GNU برای عملگر "?:" با عملوند میانی حذفشده هشدار میدهد. هنگامی که شرط در عملگر "?": یک عبارت بولی باشد، مقدار حذفشده همیشه ۱ است. در حالی که برنامهنویسان اغلب انتظار دارند این مقدار، مقداری باشد که در داخل عبارت شرطی محاسبه شده است.
برای C++، این گزینه همچنین برای برخی موارد پرانتزهای غیرضروری در اعلانها هشدار میدهد، که میتواند نشاندهندهٔ تلاش برای فراخوانی تابع به جای اعلان باشد:
{ // Declares a local variable called mymutex. std::unique_lock<std::mutex> (mymutex); // User meant std::unique_lock<std::mutex> lock (mymutex); }این هشدار توسط -Wall فعال میشود.
- -Wno-self-move (فقط C++ و Objective-C++)
- این هشدار
زمانی
اعلام
میشود که
یک مقدار با
استفاده از
"std::move" به
خودش منتقل
شود. چنین
عمل "std::move"
عموماً هیچ
اثری ندارد.
struct T { ... }; void fn() { T t; ... t = std::move (t); }این هشدار با -Wall فعال میشود.
- -Wsequence-point
- در مورد
کدهایی که
ممکن است به
دلیل نقض
قواعد
«نقاط
توالی» (sequence points)
در
استانداردهای
C و C++ رفتار
معنایی
تعریفنشدهای
داشته
باشند،
هشدار
میدهد.
استانداردهای C و C++ ترتیب ارزیابی عبارات را در یک برنامه بر حسب نقاط توالی تعریف میکنند؛ نقاطی که نمایانگر یک ترتیب جزئی (partial ordering) بین اجرای بخشهایی از برنامه هستند: بخشهایی که قبل از نقطه توالی اجرا میشوند، و بخشهایی که پس از آن اجرا میگردند. این نقاط پس از ارزیابی یک عبارت کامل (عبارتی که بخشی از یک عبارت بزرگتر نیست)، پس از ارزیابی اولین عملوند از عملگرهای "&&"، "||"، "? :" یا "," (کاما)، پیش از فراخوانی یک تابع (اما پس از ارزیابی آرگومانهای آن و عبارتی که تابع فراخوانیشده را مشخص میکند)، و در برخی جاهای دیگر رخ میدهند. به غیر از آنچه توسط قواعد نقاط توالی بیان شده است، ترتیب ارزیابی زیرعبارتهای یک عبارت نامشخص است. همه این قوانین صرفاً یک ترتیب جزئی را بیان میکنند نه یک ترتیب کل، زیرا برای مثال اگر دو تابع درون یک عبارت فراخوانی شوند بدون اینکه هیچ نقطه توالی بین آنها وجود داشته باشد، ترتیبی که در آن توابع فراخوانی میشوند نامشخص است. با این حال، کمیتهٔ استاندارد مقرر کرده است که فراخوانیهای توابع با یکدیگر همپوشانی ندارند.
مشخص نشده است که در چه زمانی میان دو نقطه توالی، تغییر در مقادیر اشیاء اعمال میشود. برنامههایی که رفتار آنها به این موضوع وابسته باشد، رفتار تعریفنشده (undefined behavior) دارند؛ استانداردهای C و C++ تصریح میکنند که «بین نقطه توالی قبلی و بعدی، مقدار ذخیرهشدهٔ یک شیء در اثر ارزیابی یک عبارت حداکثر باید یک بار تغییر یابد. علاوه بر این، مقدار قبلی تنها باید برای تعیین مقداری که قرار است ذخیره شود خوانده شود.». اگر برنامهای این قوانین را نقض کند، نتایج در هر پیادهسازی خاص کاملاً غیرقابلپیشبینی خواهند بود.
نمونههایی از کدهایی با رفتار تعریفنشده عبارتند از "a = a++;"، "a[n] = b[n++]" و "a[i++] = i;". برخی از موارد پیچیدهتر توسط این گزینه شناسایی نمیشوند، و ممکن است گاهی نتایج مثبت کاذب (false positive) بدهد، اما بهطور کلی مشخص شده که در شناسایی این نوع مشکلات در برنامهها نسبتاً کارآمد است.
استاندارد C++17 ترتیب ارزیابی عملوندها را در موارد بیشتری تعریف میکند: بهویژه الزام میکند که سمت راست یک انتساب باید پیش از سمت چپ آن ارزیابی شود، بنابراین مثالهای بالا دیگر رفتار تعریفنشده ندارند. اما این گزینه همچنان دربارهٔ آنها هشدار میدهد تا به افراد کمک کند از نوشتن کدی که در C و نگارشهای قبلی C++ رفتار تعریفنشده دارد، خودداری کنند.
متن استاندارد به شیوهای گیجکننده نگارش شده است، بنابراین در موارد ظریف و پیچیده بحثهایی بر سر معنای دقیق قواعد نقاط توالی وجود دارد. پیوندهایی به مباحث مربوط به این مسئله، از جمله تعاریف رسمی پیشنهادی، را میتوان در صفحهٔ متون GCC به آدرس زیر یافت: https://gcc.gnu.org/readings.html.
این هشدار برای C و C++ توسط -Wall فعال میشود..IP -Wno-return-local-addr 4 درباره بازگرداندن اشارهگر (یا در C++، یک ارجاع) به متغیری که پس از بازگشت تابع از دامنه (scope) خارج میشود، هشدار نده.
- -Wreturn-mismatch
- درباره
دستورهای return
بدون عبارت
در توابعی
که "void"
برنمیگردانند،
هشدار بده.
همچنین
درباره
دستور
"return"
دارای
عبارت در
تابعی که
نوع
بازگشتی آن
"void" است،
هشدار بده،
مگر اینکه
نوع عبارت
نیز "void"
باشد. به
عنوان یک
افزونه گنو
(GNU extension)، مورد
دوم بدون
هشدار
پذیرفته
میشود مگر
اینکه -Wpedantic
استفاده
شده باشد.
تلاش برای استفاده از مقدار بازگشتی یک تابع غیر-"void" به جز "main" که اجرای آن با رسیدن به آکولاد پایانی خاتمهدهنده تابع پایان میپذیرد، رفتار تعریفنشده (undefined) است.
این هشدار مخصوص C بوده و به صورت پیشفرض فعال است. در نگارش C99 و گویشهای پس از آن، این مورد به عنوان خطا در نظر گرفته میشود. این خطا میتواند با استفاده از -fpermissive (همراه با دیگر هشدارها)، یا فقط برای همین هشدار با -Wno-error=return-mismatch به یک هشدار تنزل یابد.
- -Wreturn-type
- هرگاه
تابعی با
نوع
بازگشتی
تعریف شود
که به طور
پیشفرض
"int" است
هشدار بده
(مگر اینکه
-Wimplicit-int فعال
باشد که
اولویت
دارد).
همچنین اگر
ممکن باشد
جریان اجرا
به انتهای
بدنه تابع
برسد، یا
اگر تابع
اصلاً حاوی
هیچ دستور return
نباشد،
هشدار بده.
تلاش برای استفاده از مقدار بازگشتی یک تابع غیر-"void" به جز "main" که اجرای آن با رسیدن به آکولاد بسته خاتمهدهنده تابع پایان میپذیرد، تعریفنشده است.
برخلاف C، در C++ رسیدن جریان اجرا به انتهای یک تابع غیر-"void" به جز "main"، حتی اگر از مقدار بازگشتی تابع استفاده نشود، منجر به رفتار تعریفنشده (undefined behavior) خواهد شد.
این هشدار به طور پیشفرض در C++ و در غیر این صورت با -Wall فعال میشود.
- -Wno-shift-count-negative
- هشدارهای مربوط به منفی بودن مقدار شیفت (shift count) را کنترل میکند. این هشدار به طور پیشفرض فعال است.
- -Wno-shift-count-overflow
- هشدارهای مربوط به بزرگتر یا مساوی بودن تعداد شیفت نسبت به پهنای بیتی نوع داده را کنترل میکند. این هشدار به طور پیشفرض فعال است.
- -Wshift-negative-value
- در صورت شیفت دادن مقداری منفی به چپ، هشدار بده. این هشدار با -Wextra در حالتهای C99 (و جدیدتر) و C++11 تا C++17 فعال میشود.
- -Wno-shift-overflow
- -Wshift-overflow=n
- این گزینهها هشدارهای مربوط به سرریزهای شیفت به چپ را کنترل میکنند.
- -Wshift-overflow=1
- این سطح، سطح هشدار پیشفرض -Wshift-overflow است و به صورت پیشفرض در حالتهای C99 و C++11 (و جدیدتر) فعال است. این سطح هشدار درباره شیفت دادن ۱ به چپ در داخل بیت علامت (sign bit) هشداری نمیدهد. (با این حال، در C، چنین سرریزی در موقعیتهایی که یک عبارت ثابت عدد صحیح مورد نیاز است کماکان رد میشود.) در حالت C++20 (و جدیدتر) هیچ هشداری صادر نمیشود، زیرا شیفتهای به چپ علامتدار همیشه سرریز چرخشی (wrap) دارند.
- -Wshift-overflow=2
- این سطح هشدار همچنین درباره شیفت دادن ۱ به چپ در داخل بیت علامت هشدار میدهد، مگر اینکه حالت C++14 (یا جدیدتر) فعال باشد.
- -Wswitch
- هرگاه یک دستور "switch" دارای شاخصی از نوع شمارشی (enumerated) باشد و فاقد "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
خارج از
محدوده نوع
بولی
هستند،
هشدار نده.
میتوان
این هشدار
را با تبدیل
نوع عبارت
کنترلی به
نوعی غیر از
"bool"
فرونشاند.
برای مثال:
switch ((int) (a == 4)) { ... }این هشدار به طور پیشفرض برای برنامههای C و C++ فعال است.
- -Wno-switch-outside-range
- این گزینه هشدارهای مربوط به زمانی را کنترل میکند که یک "case" در دستور "switch" دارای مقداری خارج از محدوده نوع مربوط به خود باشد. این هشدار به طور پیشفرض برای برنامههای C و C++ فعال است.
- -Wno-switch-unreachable
- زمانی که یک
دستور
"switch"
حاوی
دستوراتی
بین عبارت
کنترلی و
نخستین
برچسب case
باشد که
هرگز اجرا
نخواهند
شد، هشدار
نده. برای
مثال:
switch (cond) { i = 15; ... case 5: ... }گزینه -Wswitch-unreachable در صورتی که دستور بین عبارت کنترلی و نخستین برچسب case صرفاً یک اعلان (declaration) باشد، هشدار نمیدهد:
switch (cond) { int i; ... case 5: i = 5; ... }این هشدار به طور پیشفرض برای برنامههای C و C++ فعال است.
- -Wsync-nand (فقط C و C++)
- هنگامی که توابع توکار "__sync_fetch_and_nand" و "__sync_nand_and_fetch" استفاده شوند هشدار بده. معناشناسی این توابع در GCC 4.4 تغییر کرده است.
- -Wtrivial-auto-var-init
- زمانی که "-ftrivial-auto-var-init" نتواند متغیر خودکار (automatic) را مقداردهی اولیه کند، هشدار بده. یک وضعیت رایج، متغیر خودکاری است که بین عبارت کنترلی و اولین برچسب case در یک دستور "switch" اعلان شده باشد.
- -Wunused-but-set-parameter
- هرگاه به یک
پارامتر
تابع
مقداری
انتساب
داده شود،
اما در غیر
این صورت
(صرفنظر از
اعلان آن)
بدون
استفاده
بماند،
هشدار بده.
برای فرونشاندن این هشدار از صفت "unused" استفاده کنید.
این هشدار همچنین با -Wunused همراه با -Wextra فعال میشود.
- -Wunused-but-set-variable
- هرگاه به یک
متغیر محلی
مقداری
انتساب
داده شود،
اما در غیر
این صورت
(صرفنظر از
اعلان آن)
بدون
استفاده
بماند،
هشدار بده.
این هشدار
با -Wall فعال
میشود.
برای فرونشاندن این هشدار از صفت "unused" استفاده کنید.
این هشدار همچنین با -Wunused که خود با -Wall روشن میشود، فعال میگردد.
- -Wunused-function
- هرگاه یک
تابع ایستا
(static) اعلان شود
اما تعریف
نشود، یا یک
تابع
ایستای
غیردرونخطی
(non-inline)
بلااستفاده
بماند،
هشدار بده.
این هشدار
با -Wall فعال
میشود..IP -Wunused-label
4 هرگاه یک
برچسب
اعلان شود
اما
استفاده
نشود،
هشدار
میدهد. این
هشدار توسط
-Wall فعال
میشود.
برای فرونشاندن این هشدار از صفت "unused" استفاده کنید.
- -Wunused-local-typedefs (تنها در C، Objective-C، C++ و Objective-C++)
- زمانی که یک typedef که به صورت محلی درون یک تابع تعریف شده استفاده نشود، هشدار میدهد. این هشدار توسط -Wall فعال میشود.
- -Wunused-parameter
- هرگاه
پارامتر یک
تابع،
صرفنظر از
اعلان آن،
بدون
استفاده
بماند
هشدار
میدهد. این
گزینه توسط
"-Wunused"
فعال
نمیشود
مگر اینکه
"-Wextra" نیز
مشخص شده
باشد.
برای فرونشاندن این هشدار از صفت "unused" استفاده کنید.
- -Wno-unused-result
- اگر فراخوانندهٔ تابعی که با صفت "warn_unused_result" علامتگذاری شده است از مقدار بازگشتی آن استفاده نکند، هشدار نده. پیشفرض -Wunused-result است.
- -Wunused-variable
- هرگاه یک
متغیر محلی
یا ایستا
صرفنظر از
اعلانش
بدون
استفاده
بماند،
هشدار
میدهد. این
گزینه برای
C به معنی
-Wunused-const-variable=1 است،
اما برای C++
خیر. این
هشدار توسط
-Wall فعال
میشود.
برای فرونشاندن این هشدار از صفت "unused" استفاده کنید.
- -Wunused-const-variable
- -Wunused-const-variable=n
- هرگاه یک
متغیر ثابت
ایستا
صرفنظر از
اعلانش
بدون
استفاده
بماند،
هشدار
میدهد.
برای فرونشاندن این هشدار از صفت "unused" استفاده کنید.
- -Wunused-const-variable=1
- دربارهٔ
متغیرهای static
const بدون
استفاده که
در واحد
ترجمهٔ
اصلی تعریف
شدهاند
هشدار
میدهد،
اما نه
درباره
متغیرهای static
const
اعلانشده
در هر
سرایند
پیوستشده
(include شده).
-Wunused-const-variable=1 توسط -Wunused-variable یا -Wunused برای C فعال میشود، اما نه برای 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 تنها -Wunused-const-variable=1 را فعال میکند، و آن هم فقط برای 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++)
- زمانی که یک
عبارت به
نوع خودش
تبدیل شود،
هشدار
میدهد. این
هشدار
هنگامی که
یک شیء کلاس
به یک نوع
غیرمرجع
تبدیل شود
رخ
نمیدهد،
زیرا آن
روشی برای
ایجاد یک
مقدار موقت
(temporary) است:
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 استفاده کنید.
این هشدارها هم برای تکتک عناصر مقداردهینشدهٔ متغیرهای ساختار، اجتماع یا آرایه و هم برای متغیرهایی که در کل مقداردهی اولیه نشدهاند رخ میدهند. آنها برای متغیرها یا عناصری که به صورت "volatile" اعلان شدهاند رخ نمیدهند. از آنجا که این هشدارها به بهینهسازی وابسته هستند، متغیرها یا عناصر دقیقی که برای آنها هشدار صادر میشود به گزینههای بهینهسازی دقیق و نسخهٔ GCC مورد استفاده بستگی دارد.
توجه داشته باشید که ممکن است دربارهٔ متغیری که فقط برای محاسبهٔ مقداری استفاده شده که خود آن مقدار هرگز استفاده نمیشود هشداری داده نشود، زیرا چنین محاسباتی ممکن است پیش از چاپ هشدارها توسط تحلیل جریان داده حذف شوند.
در C++، این گزینه همچنین دربارهٔ استفاده از اشیاء مقداردهینشده در فهرستهای مقداردهی اولیهٔ اعضا (member-initializer-lists) هشدار میدهد. برای نمونه، GCC دربارهٔ مقداردهینشده بودن "b" در قطعهکد زیر هشدار میدهد: struct A { int a; int b; A() : a(b) { } };
- -Wno-invalid-memory-model
- این گزینه
هشدارهای
مربوط به
فراخوانیهای
__atomic Builtins، __sync Builtins و
توابع
عمومی
اتمیک C11 را
با آرگومان
سازگاری
حافظهای
کنترل
میکند که
یا برای
عملیات
نامعتبر
است یا خارج
از محدوده
مقادیر
شمارش
"memory_order"
قرار دارد.
به عنوان
مثال، از
آنجا که
توابع
توکار
"__atomic_store" و
"__atomic_store_n"
فقط برای
ترتیبات
حافظه relaxed، release و
sequentially consistent تعریف
شدهاند،
کد زیر
مشمول
اخطار
میشود:
void store (int *i) { __atomic_store_n (i, 0, memory_order_consume); }گزینه -Winvalid-memory-model بهطور پیشفرض فعال است.
- -Wmaybe-uninitialized
- برای شیئی
با طول عمر
ذخیرهسازی
خودکار (automatic)
یا
تخصیصیافته
(allocated)، اگر
مسیری از
ابتدای
تابع به محل
استفاده از
شیء وجود
داشته باشد
که در آن
شیء
مقداردهی
اولیه شده
است، اما
مسیرهای
دیگری نیز
وجود داشته
باشند که در
آنها شیء
مقداردهی
نشده باشد،
کامپایلر
چنانچه
نتواند
اثبات کند
مسیرهای
مقداردهینشده
در زمان
اجرا اجرا
نمیشوند،
هشداری
صادر
میکند.
علاوه بر این، ارسال یک اشارهگر (یا در C++، یک ارجاع) به شیء مقداردهینشده به آرگومان تابعی با صلاحیت "const" نیز توسط این هشدار شناسایی میشود. (-Wuninitialized برای توابع توکاری صادر میشود که مشخص است شیء را میخوانند.) نشانهگذاری تابع با صفت "access (none)" مشخص میکند که از این آرگومان برای دسترسی به شیء استفاده نمیشود و از صدور هشدار جلوگیری میکند.
این هشدارها تنها در کامپایل بهینهساز ممکن هستند، زیرا در غیر این صورت GCC وضعیت متغیرها را ردیابی نمیکند.
این هشدارها اختیاری در نظر گرفته شدهاند زیرا ممکن است GCC نتواند تشخیص دهد که چه زمانی کد با وجود داشتن ظاهر نادرست، صحیح عمل میکند. در اینجا نمونهای از نحوه رخ دادن این حالت آورده شده است:
{ int x; switch (y) { case 1: x = 1; break; case 2: x = 4; break; case 3: x = 5; } foo (x); }اگر مقدار "y" همیشه ۱، ۲ یا ۳ باشد، آنگاه "x" همیشه مقداردهی میشود، اما GCC این موضوع را نمیداند. برای فرونشاندن هشدار، باید یک حالت پیشفرض (default) با دستور assert(0) یا کدی مشابه ارائه دهید.
این گزینه همچنین زمانی هشدار میدهد که یک متغیر خودکارِ غیر فرار (non-volatile) ممکن است توسط فراخوانی "longjmp" تغییر کند. کامپایلر فقط فراخوانیهای "setjmp" را میبیند. کامپایلر نمیتواند بداند که "longjmp" در کجا فراخوانی خواهد شد؛ در واقع، یک مدیر سیگنال میتواند آن را در هر نقطهای از کد فراخوانی کند. در نتیجه، ممکن است حتی زمانی که مشکلی وجود ندارد هشداری دریافت کنید، چرا که "longjmp" در واقع نمیتواند در جایی فراخوانی شود که مشکلی به وجود آورد.
با اعلان کلیه توابع بدون بازگشت مورد استفاده با مشخصه "noreturn"، میتوان از برخی هشدارهای کاذب جلوگیری کرد.
این هشدار توسط -Wall یا -Wextra فعال میشود.
- -Wunknown-pragmas
- هنگامی که با یک دستور "#pragma" مواجه شود که برای GCC قابل درک نیست، هشدار میدهد. اگر از این گزینه خط فرمان استفاده شود، هشدارها حتی برای پراگماهای ناشناخته در فایلهای سرآیند سیستمی نیز صادر میشوند. این امر زمانی که هشدارها فقط از طریق گزینه -Wall فعال شده باشند صادق نیست.
- -Wno-pragmas
- در مورد استفادههای نادرست از پراگماها، مانند پارامترهای نادرست، نحو نامعتبر یا تداخل بین پراگماها هشدار نمیدهد. همچنین ببینید: -Wunknown-pragmas.
- -Wno-pragma-once-outside-header
- زمانی که "#pragma once" در فایلی غیر از فایل سرآیند، مانند یک فایل اصلی (main)، استفاده شود هشدار نمیدهد.
- -Wno-prio-ctor-dtor
- در صورتی که از اولویتی بین ۰ تا ۱۰۰ برای سازنده (constructor) یا ویرانگر (destructor) استفاده شود، هشدار نمیدهد. استفاده از صفتهای سازنده و ویرانگر به شما امکان میدهد برای کنترل ترتیب اجرای سازنده/ویرانگر قبل از فراخوانی "main" یا پس از بازگشت از آن، اولویتی اختصاص دهید. مقادیر اولویت باید بزرگتر از ۱۰۰ باشند زیرا کامپایلر مقادیر اولویت بین ۰ تا ۱۰۰ را برای پیادهسازی رزرو کرده است.
- -Wstrict-aliasing
- این گزینه تنها زمانی کار میکند که -fstrict-aliasing فعال باشد. این گزینه درباره کدهایی هشدار میدهد که ممکن است قواعد نام مستعار دقیق (strict aliasing) را که کامپایلر برای بهینهسازی استفاده میکند نقض کنند. این هشدار تمام موارد را پوشش نمیدهد، اما سعی میکند خطاهای رایجتر را شناسایی کند. این گزینه در -Wall گنجانده شده است. این گزینه معادل -Wstrict-aliasing=3 است.
- -Wstrict-aliasing=n
- این گزینه
تنها زمانی
کار میکند
که -fstrict-aliasing فعال
باشد. این
گزینه
درباره
کدهایی
هشدار
میدهد که
ممکن است
قواعد نام
مستعار
دقیق را که
کامپایلر
برای
بهینهسازی
استفاده
میکند نقض
کنند. سطوح
بالاتر
متناظر با
دقت بیشتر
(موارد مثبت
کاذب کمتر)
هستند. سطوح
بالاتر
همچنین
متناظر با
پردازش و
تلاش بیشتر
هستند،
مشابه نحوه
عملکرد -O.
گزینه -Wstrict-aliasing
معادل -Wstrict-aliasing=3
است.
سطح ۱: تهاجمیترین، سریع، کمترین دقت. احتمالاً زمانی مفید است که سطوح بالاتر هشدار نمیدهند اما -fstrict-aliasing همچنان کد را مختل میکند، زیرا این سطح موارد منفی کاذب بسیار کمی دارد. با این حال، موارد مثبت کاذب زیادی تولید میکند. برای تمام تبدیلهای اشارهگر بین انواع احتمالاً ناسازگار، حتی اگر هرگز ارجاعزدایی (dereference) نشوند، هشدار میدهد. فقط در بخش فرانتاند اجرا میشود.
سطح ۲: تهاجمی، سریع، نه چندان دقیق. ممکن است همچنان موارد مثبت کاذب زیادی داشته باشد (البته نه به اندازه سطح ۱)، و موارد منفی کاذب کمی دارد (اما احتمالاً بیشتر از سطح ۱). برخلاف سطح ۱، فقط زمانی هشدار میدهد که آدرسی گرفته شود. در مورد انواع ناقص (incomplete types) هشدار میدهد. فقط در فرانتاند اجرا میشود.
سطح ۳ (پیشفرض برای -Wstrict-aliasing): باید موارد مثبت کاذب بسیار کم و موارد منفی کاذب اندکی داشته باشد. در صورت فعال بودن بهینهسازی، کمی کندتر از سطوح ۱ یا ۲ است. الگوی معمول تبدیل نوع (type punning) + ارجاعزدایی را در فرانتاند مدیریت میکند: "*(int*)&some_float". اگر بهینهسازی فعال باشد، در بکاند نیز اجرا میشود؛ جایی که با استفاده از اطلاعات اشاره حساس به جریان (flow-sensitive points-to)، با موارد چنددستوری برخورد میکند. تنها زمانی هشدار میدهد که اشارهگر تبدیلشده ارجاعزدایی شود. در مورد انواع ناقص هشدار نمیدهد.
- -Wstrict-overflow
- -Wstrict-overflow=n
- این گزینه
تنها زمانی
فعال است که
سرریز
علامتدار
تعریفنشده
باشد. این
گزینه
درباره
مواردی
هشدار
میدهد که
در آنها
کامپایلر
بر اساس این
فرض که
سرریز
علامتدار
رخ نمیدهد
بهینهسازی
میکند.
توجه داشته
باشید که
این گزینه
درباره همه
مواردی که
ممکن است کد
سرریز کند
هشدار
نمیدهد:
بلکه فقط در
مواردی
هشدار
میدهد که
کامپایلر
بهینهسازی
خاصی را
پیادهسازی
کند.
بنابراین
این هشدار
به سطح
بهینهسازی
بستگی دارد.
بهینهسازیای که فرض میکند سرریز علامتدار رخ نمیدهد، اگر مقادیر متغیرهای درگیر به گونهای باشند که سرریز در عمل هرگز رخ ندهد، کاملاً ایمن است. بنابراین این هشدار میتواند به راحتی یک مورد مثبت کاذب ایجاد کند: هشداری در مورد کدی که در واقعیت مشکلی ندارد. برای کمک به تمرکز روی مسائل مهم، چندین سطح هشدار تعریف شده است. برای استفاده از سرریز علامتدار تعریفنشده هنگام تخمین تعداد تکرارهای یک حلقه، بهویژه هنگام تعیین اینکه آیا حلقه اصلاً اجرا خواهد شد یا خیر، هیچ هشداری صادر نمیشود.
- -Wstrict-overflow=1
- در مورد مواردی که هم مشکوک هستند و هم اجتناب از آنها آسان است، هشدار میدهد. به عنوان مثال کامپایلر عبارت "x + 1 > x" را به 1 سادهسازی میکند. این سطح از -Wstrict-overflow توسط -Wall فعال میشود؛ سطوح بالاتر فعال نمیشوند و باید صراحتاً درخواست گردند.
- -Wstrict-overflow=2
- همچنین درباره سایر مواردی که در آنها یک مقایسه به یک مقدار ثابت ساده میشود هشدار میدهد. به عنوان مثال: "abs (x) >= 0". این مورد تنها زمانی میتواند ساده شود که سرریز عدد صحیح علامتدار تعریفنشده باشد، زیرا "abs (INT_MIN)" سرریز کرده و به "INT_MIN" که کمتر از صفر است تبدیل میشود. گزینه -Wstrict-overflow (بدون سطح) معادل -Wstrict-overflow=2 است..IP -Wstrict-overflow=3 4 همچنین دربارهٔ سایر مواردی که یک مقایسه سادهسازی میشود هشدار میدهد. به عنوان مثال: "x + 1 > 1" به "x > 0" ساده میشود.
- -Wstrict-overflow=4
- همچنین دربارهٔ سایر سادهسازیهایی که توسط موارد بالا پوشش داده نشدهاند هشدار میدهد. به عنوان مثال: "(x * 10) / 5" به "x * 2" سادهسازی میشود.
- -Wstrict-overflow=5
- همچنین دربارهٔ مواردی که کامپایلر بزرگی یک مقدار ثابتِ درگیر در مقایسه را کاهش میدهد هشدار میدهد. به عنوان مثال: "x + 2 > y" به "x + 1 >= y" سادهسازی میشود. این مورد تنها در بالاترین سطح هشدار گزارش میشود، زیرا این سادهسازی روی مقایسههای متعددی اعمال میگردد؛ از این رو این سطح هشدار تعداد بسیار زیادی مثبت کاذب (false positive) ایجاد میکند.
- -Wstring-compare
- دربارهٔ
فراخوانیهای
"strcmp" و
"strncmp" که
نتیجهٔ
آنها در
آزمونهای
برابری، به
دلیل
بزرگتر
بودن طول یک
آرگومان از
اندازهٔ
آرایهای
که آرگومان
دیگر در آن
ذخیره شده
است (یا
کران، در
مورد
"strncmp")،
صفر یا
غیرصفر
تعیین
میشود
هشدار
میدهد.
چنین
فراخوانیهایی
ممکن است
اشتباه
باشند. به
عنوان
مثال،
فراخوانی
"strcmp" در
ادامه
تشخیص داده
میشود
زیرا
نتیجهٔ آن
بدون توجه
به محتویات
آرایهٔ
"a"
لزوماً
غیرصفر است.
extern char a[4]; void f (char *d) { strcpy (d, "string"); ... if (0 == strcmp (a, d)) // cannot be true puts ("a and d are the same"); }گزینهٔ -Wstring-compare توسط -Wextra فعال میشود.
- -Wno-stringop-overflow
- -Wstringop-overflow
- -Wstringop-overflow=type
- دربارهٔ
کدهایی که
میتوان به
صورت ایستا
تشخیص داد
باعث سرریز
بافر یا
دستاندازی
به حافظه
میشوند،
مانند
فراخوانیهای
"memcpy" و
"strcpy" که
از بافر
مقصد سرریز
میکنند،
هشدار
میدهد.
آرگومان
اختیاری یک
واحد بیشتر
از نوع
بررسی
اندازه شیء
(Object Size Checking) است که
برای تعیین
اندازهٔ
مقصد انجام
میشود. این
آرگومان
تنها برای
توابع
رشتهای که
روی
آرایههای
نویسهای
عمل
میکنند
معنادار
است؛ توابع
حافظهٔ خام
مانند
"memcpy"
همواره از
بررسی
اندازه شیء
نوع صفر
استفاده
میکنند.
این گزینه همچنین برای فراخوانیهایی که اندازهای فراتر از بزرگترین شیء ممکن یا حداکثر "SIZE_MAX / 2" بایت را مشخص میکنند، هشدار میدهد.
این گزینه در صورت فعال بودن بهینهسازی بهترین نتایج را ارائه میدهد، اما حتی بدون بهینهسازی نیز میتواند زیرمجموعهٔ کوچکی از سرریزهای سادهٔ بافر را در فراخوانی توابع توکار GCC مانند "__builtin_memcpy" که متناظر با توابع استاندارد هستند تشخیص دهد. در هر حال، این گزینه تنها دربارهٔ زیرمجموعهای از سرریزهای بافر هشدار میدهد که توسط توابع توکار بررسی سرریز متناظر، مانند "__builtin___memcpy_chk"، تشخیص داده میشوند که در صورت عدم امکان تشخیص ایمن بودن دسترسی در زمان کامپایل، میتوانند بررسی زمان اجرا را انجام دهند.
به عنوان مثال، این گزینه برای فراخوانی "strcpy" در ادامه یک هشدار صادر میکند، زیرا حداقل ۵ نویسه (رشتهٔ "blue" شامل NUL پایانی) را در بافری به اندازهٔ ۴ کپی میکند.
enum Color { blue, purple, yellow }; const char* f (enum Color clr) { static char buf [4]; const char *str; switch (clr) { case blue: str = "blue"; break; case purple: str = "purple"; break; case yellow: str = "yellow"; break; } return strcpy (buf, str); // warning here }تأثیر این گزینه به توابع دستکاری رشته یا حافظه محدود نمیشود. در این مثال، یک هشدار صادر میشود زیرا یک آرایهٔ ۱-عنصری به تابعی فرستاده شده که به آرگومانی با حداقل ۴ عنصر نیاز دارد:
void f (int[static 4]); void g (void) { int *p = (int *) malloc (1 * sizeof(int)); f (p); // warning here }گزینهٔ -Wstringop-overflow=2 به صورت پیشفرض فعال است.
- -Wstringop-overflow
- -Wstringop-overflow=1
- گزینهٔ -Wstringop-overflow=1 از بررسی اندازه شیء نوع صفر برای تعیین اندازهٔ اشیاء مقصد استفاده میکند. در این تنظیم، این گزینه برای نوشتن فراتر از انتهای زیرشیءهایِ اشیاء بزرگتر که از طریق اشارهگرها قابل دسترسی هستند هشداری نمیدهد، مگر اینکه اندازهٔ بزرگترین شیء دربرگیرنده مشخص باشد. زمانی که مقصد ممکن است یکی از چندین شیء باشد، بزرگترین آنها در نظر گرفته میشود. در سیستمهای لینوکس، هنگامی که بهینهسازی در این تنظیم فعال است، این گزینه برای همان کدهایی هشدار میدهد که در زمان تعریف ماکروی "_FORTIFY_SOURCE" با مقداری غیرصفر هشدار داده میشد.
- -Wstringop-overflow=2
- گزینهٔ -Wstringop-overflow=2 از بررسی اندازه شیء نوع یک برای تعیین اندازهٔ اشیاء مقصد استفاده میکند. در این تنظیم، گزینه دربارهٔ سرریزها هنگام نوشتن در اعضای بزرگترین اشیاء کاملی که اندازهٔ دقیق آنها مشخص است هشدار میدهد. با این حال، دربارهٔ نوشتن بیش از اندازه در همان اعضای اشیاء ناشناختهای که توسط اشارهگرها ارجاع داده شدهاند هشداری نمیدهد، زیرا ممکن است به آرایههایی حاوی تعداد نامشخصی از عناصر اشاره کنند. این تنظیمِ پیشفرض این گزینه است.
- -Wstringop-overflow=3
- گزینهٔ -Wstringop-overflow=3 از بررسی اندازه شیء نوع دو برای تعیین اندازهٔ اشیاء مقصد استفاده میکند. در این تنظیم، گزینه دربارهٔ سرریز شدن کوچکترین شیء یا عضو داده هشدار میدهد. این محدودکنندهترین تنظیم این گزینه است که ممکن است به صدور هشدار برای کدهای امن منجر شود.
- -Wstringop-overflow=4
- گزینهٔ -Wstringop-overflow=4 از بررسی اندازه شیء نوع سه برای تعیین اندازهٔ اشیاء مقصد استفاده میکند. در این تنظیم، این گزینه دربارهٔ سرریز شدن هر یک از اعضای داده هشدار میدهد، و زمانی که مقصد یکی از چندین شیء باشد، از اندازهٔ بزرگترین آنها برای تصمیمگیری در خصوص صدور هشدار استفاده میکند. مشابه -Wstringop-overflow=3، این تنظیمِ گزینه ممکن است به صدور هشدار برای کدهای بیخطر بیانجامد.
- -Wno-stringop-overread
- دربارهٔ
فراخوانیهای
توابع
دستکاری
رشته مانند
"memchr" یا
"strcpy" که
مشخص شده
است فراتر
از انتهای
توالی مبدأ
میخوانند،
هشدار
میدهد.
گزینهٔ -Wstringop-overread به صورت پیشفرض فعال است.
- -Wno-stringop-truncation
- برای
فراخوانی
توابع
دارای
کرانِ
دستکاری
رشته مانند
"strncat"،
"strncpy" و
"stpncpy" که
ممکن است یا
رشتهٔ
کپیشده را
کوتاه (truncate)
کنند یا
مقصد را
بدون تغییر
باقی
بگذارند،
هشدار
نمیدهد.
در مثال زیر، فراخوانی "strncat" کرانی را مشخص میکند که کمتر از طول رشتهٔ مبدأ است. در نتیجه، کپی مبدأ کوتاه خواهد شد و بنابراین فراخوانی تشخیص داده میشود. برای جلوگیری از این هشدار، از "bufsize - strlen (buf) - 1)" به عنوان کران استفاده کنید.
void append (char *buf, size_t bufsize) { strncat (buf, ".txt", 3); }به عنوان مثالی دیگر، فراخوانی زیر برای "strncpy" منجر به کپی شدن صرفاً نویسههای قبل از NUL پایانی در "d" میشود، بدون آنکه NUL به انتها افزوده شود. این فرض که نتیجهٔ "strncpy" لزوماً یک رشتهٔ ختمشده به NUL است یک اشتباه رایج است و بنابراین این فراخوانی تشخیص داده میشود. برای جلوگیری از هشدار در مواردی که انتظار نمیرود نتیجه به NUL ختم شود، به جای آن "memcpy" را فراخوانی کنید. void copy (char *d, const char *s) { strncpy (d, s, strlen (s)); }
در مثال زیر، فراخوانی "strncpy" اندازهٔ بافر مقصد را به عنوان کران مشخص میکند. اگر طول رشتهٔ مبدأ برابر با این اندازه یا بزرگتر از آن باشد، نتیجهٔ رونوشت به "NUL" ختم نخواهد شد. بنابراین، این فراخوانی نیز مشمول هشدار میشود. برای اجتناب از این هشدار، "sizeof buf - 1" را به عنوان کران مشخص کرده و آخرین عنصر بافر را روی "NUL" قرار دهید.
void copy (const char *s) { char buf[80]; strncpy (buf, s, sizeof buf); ... }در شرایطی که هدف از یک آرایهٔ نویسهای، ذخیرهٔ دنبالهای از بایتها بدون "NUL" پایانی است، میتوان چنین آرایهای را با صفت "nonstring" نشانهگذاری کرد تا از این هشدار اجتناب شود. با این حال، چنین آرایههایی آرگومانهای مناسبی برای توابعی که انتظار رشتههای منتهی به "NUL" را دارند نیستند. برای کمک به شناسایی استفادههای نادرست و سهوی از این آرایهها، GCC هشدار صادر میکند، مگر آنکه بتواند بیخطر بودن استفاده را اثبات نماید.
- -Wstrict-flex-arrays (فقط C و ++C)
- دربارهٔ
استفادههای
نادرست از
اعضای
آرایهٔ
منعطف، با
توجه به level
صفت "strict_flex_array
(level)"
پیوستشده
به فیلد
آرایهٔ
انتهاییِ
ساختار (در
صورت در
دسترس
بودن)، و در
غیر این
صورت با
توجه به level
گزینهٔ
-fstrict-flex-arrays=level
هشدار
میدهد.
گزینهٔ
"-Wstrict-flex-arrays"
تنها زمانی
مؤثر است که
level بزرگتر
از 0 باشد.
هنگامی که level=1 باشد، اگر به آرایهٔ انتهاییِ یک ساختار که ۲ عنصر یا بیشتر دارد بهصورت یک عضو آرایهٔ منعطف ارجاع داده شود، هشدار صادر میشود.
هنگامی که level=2 باشد، علاوه بر موارد level=1، اگر به آرایهٔ انتهاییِ تکعنصریِ یک ساختار بهصورت یک عضو آرایهٔ منعطف ارجاع داده شود، هشدارهای بیشتری صادر خواهد شد.
هنگامی که level=3 باشد، علاوه بر موارد level=2، اگر به آرایهٔ انتهاییِ با طول صفرِ یک ساختار بهصورت یک عضو آرایهٔ منعطف ارجاع داده شود، هشدارهای بیشتری صادر خواهد شد.
این گزینه زمانی که -ftree-vrp فعال باشد (حالت پیشفرض برای -O2 و بالاتر) مؤثرتر است، اما برخی از هشدارها حتی بدون بهینهسازی نیز ممکن است شناسایی شوند.
- -Wsuggest-attribute=attribute-name
- در مواردی که افزودن یک صفت ممکن است سودمند باشد هشدار میدهد. مقدارهای attribute-name که در حال حاضر پشتیبانی میشوند در زیر فهرست شدهاند.
- -Wsuggest-attribute=pure
- -Wsuggest-attribute=const
- -Wsuggest-attribute=noreturn
- -Wmissing-noreturn
- -Wsuggest-attribute=malloc
- -Wsuggest-attribute=returns_nonnull
- دربارهٔ توابعی که ممکن است نامزد مناسبی برای صفتهای "pure"، "const"، "noreturn"، "malloc" یا "returns_nonnull" باشند هشدار میدهد. کامپایلر تنها برای توابعی که در سایر واحدهای ترجمه قابل مشاهده هستند یا (در مورد "pure" و "const") اگر نتواند اثبات کند که تابع بهطور عادی برمیگردد هشدار میدهد. یک تابع در صورتی بهطور عادی برمیگردد که حاوی حلقهٔ بینهایت نبوده و با پرتاب استثنا، فراخوانی "abort" یا به دام افتادن (trapping) بهطور غیرعادی بازنگردد. این تحلیل نیازمند گزینهٔ -fipa-pure-const است که بهطور پیشفرض در -O و بالاتر فعال است. سطوح بالاتر بهینهسازی، دقت این تحلیل را بهبود میبخشند.
- -Wsuggest-attribute=format
- -Wmissing-format-attribute
- دربارهٔ
اشارهگرهای
تابعی که
ممکن است
نامزد
مناسبی
برای
صفتهای
"format"
باشند
هشدار
میدهد.
توجه کنید
که اینها
فقط
نامزدهای
احتمالی
هستند، نه
قطعی. GCC حدس
میزند که
اشارهگرهای
تابعی
دارای صفت
"format" که
در انتساب،
مقداردهی
اولیه،
ارسال
پارامتر یا
عبارات
بازگشت
استفاده
شدهاند،
باید صفت
"format"
متناظری در
نوع حاصل
داشته
باشند؛
یعنی برای
جلوگیری از
هشدار، سمت
چپ انتساب
یا
مقداردهی
اولیه، نوع
متغیرِ
پارامتر،
یا نوع
بازگشتی
تابع
دربرگیرنده
نیز باید
بهترتیب
دارای صفت
"format"
باشند.
همچنین GCC دربارهٔ تعاریف توابعی که ممکن است کاندیدای صفتهای "format" باشند هشدار میدهد. مجدداً، اینها تنها کاندیداهای احتمالی هستند. GCC حدس میزند که صفتهای "format" ممکن است برای هر تابعی که تابعی مانند "vprintf" یا "vscanf" را فراخوانی میکند مناسب باشد، اما این امر ممکن است همیشه برقرار نباشد و برخی از توابعی که صفتهای "format" برای آنها مناسب است ممکن است شناسایی نشوند.
- -Wsuggest-attribute=cold
- دربارهٔ توابعی که ممکن است کاندیدای صفت "cold" باشند هشدار میدهد. این قابلیت مبتنی بر تشخیص ایستا است و معمولاً تنها دربارهٔ توابعی هشدار میدهد که همواره منجر به فراخوانی یک تابع "cold" دیگر میشوند؛ مانند پوششدهندههای (wrappers) دستور "throw" در ++C یا توابع گزارش خطای مرگبار که به "abort" ختم میشوند.
- -Walloc-size
- دربارهٔ فراخوانی توابع تخصیص مزین به صفت "alloc_size" که اندازهای ناکافی برای نوع مقصدِ اشارهگری که نتیجه به آن تخصیص مییابد مشخص میکنند، هشدار میدهد؛ از جمله شکلهای توکارِ توابع "aligned_alloc"، "alloca"، "calloc"، "malloc" و "realloc".
- -Walloc-zero
- دربارهٔ فراخوانی توابع تخصیص مزین به صفت "alloc_size" که اندازهٔ صفر بایت را مشخص میکنند هشدار میدهد؛ از جمله شکلهای توکار توابع "aligned_alloc"، "alloca"، "calloc"، "malloc" و "realloc". از آنجا که رفتار این توابع هنگام فراخوانی با اندازهٔ صفر در بین پیادهسازیهای مختلف متفاوت است (و در مورد "realloc" منسوخ شده است)، اتکا به آن ممکن است منجر به باگهای نامحسوس در قابلیت حمل شده و باید از آن اجتناب گردد.
- -Wcalloc-transposed-args
- دربارهٔ فراخوانی توابع تخصیص مزین به صفت "alloc_size" با دو آرگومان که عملگر "sizeof" را برای آرگومان اندازهٔ اول بهکار میبرند و آن را برای آرگومان اندازهٔ بعدی استفاده نمیکنند هشدار میدهد. این یک هشدار سبک کدنویسی است. آرگومان اول "calloc" طبق مستندات تعداد عناصر در آرایه است، در حالی که آرگومان دوم اندازهٔ هر عنصر است؛ بنابراین "calloc (n, sizeof (int))" نسبت به "calloc (sizeof (int), n)" ترجیح داده میشود. اگر وجود "sizeof" در آرگومان قبلی و عدم وجود آن در آرگومان بعدی عمدی باشد، میتوان با استفاده از "calloc (sizeof (struct S) + 0, n)" یا "calloc (1 * sizeof (struct S), 4)" یا بهکارگیری "sizeof" در آرگومان بعدی نیز این هشدار را فرونشاند.
- -Walloc-size-larger-than=byte-size
- دربارهٔ فراخوانی توابع مزین به صفت "alloc_size" که سعی در تخصیص اشیائی بزرگتر از تعداد بایتهای مشخصشده دارند، یا جایی که نتیجهٔ محاسبهٔ اندازه در یک نوع عدد صحیح با دقت نامتناهی از مقدار PTRDIFF_MAX در سامانهٔ مقصد فراتر رود، هشدار میدهد. گزینهٔ -Walloc-size-larger-than=PTRDIFF_MAX بهطور پیشفرض فعال است. هشدارهای تحت نظارت این گزینه را میتوان با مشخص کردن byte-size برابر یا بیشتر از SIZE_MAX یا از طریق -Wno-alloc-size-larger-than غیرفعال کرد.
- -Wno-alloc-size-larger-than
- هشدارهای -Walloc-size-larger-than= را غیرفعال میکند. این گزینه معادل -Walloc-size-larger-than=SIZE_MAX یا بزرگتر از آن است.
- -Walloca
- این گزینه در مورد تمامی استفادهها از "alloca" در کد منبع هشدار میدهد.
- -Walloca-larger-than=byte-size
- این گزینه
دربارهٔ
فراخوانیهای
"alloca" با
یک آرگومان
عدد صحیح
هشدار
میدهد که
مقدار آن یا
صفر است، یا
با یک
گزارهٔ
کنترلی که
مقدارش را
حداکثر به
byte-size محدود
کند مقید
نشده است.
همچنین
برای
فراخوانیهایی
به "alloca"
که مقدار
کران در
آنها
ناشناخته
است هشدار
میدهد.
آرگومانهای
با انواع
غیرصحیح
نامقید
تلقی
میشوند،
حتی اگر به
نظر برسد که
در محدودهٔ
مورد
انتظار
قرار دارند.
برای مثال، یک مورد مقید از "alloca" میتواند چنین باشد:
void func (size_t n) { void *p; if (n <= 1000) p = alloca (n); else p = malloc (n); f (p); }در مثال بالا، ارسال "-Walloca-larger-than=1000" هشداری صادر نخواهد کرد زیرا مشخص است که فراخوانی "alloca" حداکثر ۱۰۰۰ بایت است. با این حال، اگر "-Walloca-larger-than=500" ارسال میشد، کامپایلر هشدار صادر میکرد.
از سوی دیگر، استفادههای نامقید، استفادههایی از "alloca" بدون گزارههای کنترلی برای محدود کردن آرگومان عدد صحیح آن هستند. برای مثال: void func () { void *p = alloca (n); f (p); }
اگر "-Walloca-larger-than=500" داده شود، کد بالا موجب ایجاد یک هشدار میشود، اما این بار به دلیل عدم بررسی محدودهها.
توجه داشته باشید که حتی کدهای بهظاهر درست که شامل اعداد صحیح علامتدار هستند نیز میتوانند موجب صدور هشدار شوند:
void func (signed int n) { if (n < 500) { p = alloca (n); f (p); } }در مثال بالا، n میتواند منفی باشد و باعث شود آرگومانی بزرگتر از حد انتظار بهطور ضمنی در فراخوانی "alloca" تبدیل نوع شود.
این گزینه همچنین هنگامی که از "alloca" درون یک حلقه استفاده شود هشدار میدهد.
-Walloca-larger-than=PTRDIFF_MAX بهطور پیشفرض فعال است اما معمولاً تنها زمانی اثرگذار است که -ftree-vrp فعال باشد (پیشفرض برای -O2 و بالاتر).
همچنین -Wvla-larger-than=byte-size را ببینید.
- -Wno-alloca-larger-than
- هشدارهای -Walloca-larger-than= را غیرفعال میکند. این گزینه معادل با -Walloca-larger-than=SIZE_MAX یا بزرگتر است.
- -Warith-conversion
- دربارهٔ
تبدیلهای
نوع ضمنی
ناشی از
عملیات
حسابی
هشدار
میدهد،
حتی زمانی
که تبدیل
عملوندها
به نوع
یکسان
نتواند
مقادیر
آنها را
تغییر دهد.
این گزینه
بر
هشدارهای
ناشی از
-Wconversion، -Wfloat-conversion و
-Wsign-conversion تأثیر
میگذارد.
void f (char c, int i) { c = c + i; // warns with B<-Wconversion> c = c + 1; // only warns with B<-Warith-conversion> } - -Warray-bounds
- -Warray-bounds=n
- دربارهٔ
اندیسها
یا
آفستهای
خارج از
محدوده در
آرایهها
هشدار
میدهد. این
هشدار توسط
-Wall فعال
میشود. این
گزینه
زمانی که
-ftree-vrp فعال
باشد
مؤثرتر است
(پیشفرض
برای -O2 و
بالاتر)،
اما
زیرمجموعهای
از موارد
حتی بدون
بهینهسازی
نیز گزارش
میشوند.
بهطور پیشفرض، آرایهٔ پایانی یک ساختار (structure) توسط -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=1
- این سطح پیشفرض هشدارِ -Warray-bounds است و توسط -Wall فعال میشود؛ سطوح بالاتر فعال نمیشوند و باید صراحتاً درخواست شوند.
- -Warray-bounds=2
- این سطح هشدار همچنین دربارهٔ نتایج میانی محاسبات اشارهگر که ممکن است مقادیر خارج از محدوده تولید کنند هشدار میدهد. این سطح هشدار ممکن است تعداد بیشتری مثبت کاذب ایجاد کند و بهطور پیشفرض غیرفعال است.
- -Wunterminated-string-initialization (فقط C و Objective-C)
- دربارهٔ
آرایههای
نویسهای
که با یک
رشتهٔ
لیتِرال به
عنوان
دنبالهٔ
نویسهای
بدون
پایاندهنده
مقداردهی
اولیه
شدهاند
هشدار
میدهد،
مگر اینکه
اعلانی که
مقداردهی
میشود
دارای صفت
"nonstring"
باشد. برای
مثال:
char arr[3] = "foo"; /* Warning. */ char arr2[3] __attribute__((nonstring)) = "bar"; /* No warning. */
این هشدار توسط -Wextra فعال میشود. اگر -Wc++-compat فعال باشد، متن هشدار کمی متفاوت است و حتی اگر اعلانی که مقداردهی اولیه میشود دارای صفت "nonstring" باشد نیز هشدار میدهد، چرا که در ++C چنین مقداردهیهای اولیهای یک خطا هستند.
- -Warray-compare
- دربارهٔ
مقایسههای
برابری و
رابطهای
میان دو
عملوند از
نوع آرایه
هشدار
میدهد. این
نوع مقایسه
در C++20 منسوخ
شده است.
برای مثال:
int arr1[5]; int arr2[5]; bool same = arr1 == arr2;
-Warray-compare توسط -Wall فعال میشود.
- -Warray-parameter
- -Warray-parameter=n
- دربارهٔ
اعلانهای
مجدد
توابعی که
شامل
پارامترهایی
از انواع
آرایه یا
اشارهگر
با نوعها
یا شکلهای
ناهمگون
هستند
هشدار
میدهد و
امکان
تشخیص
دسترسیهای
خارج از
محدوده به
چنین
پارامترهایی
را توسط
هشدارهایی
مانند -Warray-bounds
فراهم
میکند.
اگر نخستین اعلان تابع برای اعلان یک پارامتر از شکل آرایهای استفاده کند، کران مشخصشده در آرایه به عنوان حداقل تعداد عناصر مورد انتظار برای ارائه در فراخوانیهای تابع و حداکثر تعداد عناصر مورد دسترسی توسط آن فرض میشود. عدم ارائهٔ آرگومانهایی با اندازهٔ کافی یا دسترسی به بیش از حداکثر تعداد عناصر ممکن است توسط هشدارهایی نظیر -Warray-bounds یا -Wstringop-overflow تشخیص داده شود. در سطح ۱، این هشدار ناهمگونیهای مربوط به پارامترهای آرایهای را که با استفاده از شکل "T[static N]" اعلان شدهاند تشخیص میدهد.
برای مثال، این هشدار برای دومین اعلان "f" صادر میشود زیرا اعلان نخست با کلمهٔ کلیدی "static" مشخص میکند که آرگومان آرایه باید دستکم چهار عنصر داشته باشد، در حالی که اعلان دوم اجازه میدهد آرایهای با هر اندازهای به "f" ارسال شود.
void f (int[static 4]); void f (int[]); // warning (inconsistent array form) void g (void) { int *p = (int *)malloc (1 * sizeof (int)); f (p); // warning (array too small) ... }در سطح ۲، این هشدار همچنین برای اعلانهای مجددی که شامل هرگونه ناهمگونی دیگری در شکلهای آرگومان آرایهای یا اشارهگری بیانگر اندازهٔ آرایه باشند صادر میشود. اشارهگرها و آرایههای با کران نامشخص یکسان در نظر گرفته میشوند و هشداری ایجاد نمیکنند.
void g (int*); void g (int[]); // no warning void g (int[8]); // warning (inconsistent array bound)
-Warray-parameter=2 در -Wall گنجانده شده است. گزینهٔ -Wvla-parameter هشدارهایی را برای ناهمگونیهای مشابه شامل آرگومانهای آرایه با طول متغیر صادر میکند.
شکل کوتاه گزینهٔ -Warray-parameter معادل با -Warray-parameter=2 است. شکل منفی آن، -Wno-array-parameter، معادل با -Warray-parameter=0 است.
- -Wattribute-alias=n
- -Wno-attribute-alias
- درباره اعلانهایی که از مشخصهٔ "alias" و مشخصههای مشابه استفاده میکنند در حالی که هدف آنها با نوع alias ناسازگار است، هشدار میدهد.
- -Wattribute-alias=1
- سطح هشدار پیشفرض گزینهٔ -Wattribute-alias، ناسازگاریهای میان نوع اعلان alias و نوع هدف آن را تشخیص میدهد. چنین ناسازگاریهایی معمولاً نشاندهندهٔ اشکالات برنامهنویسی (باگها) هستند.
- -Wattribute-alias=2
- در این سطح،
-Wattribute-alias مواردی
را نیز
تشخیص
میدهد که
در آن
مشخصههای
اعلان alias
محدودکنندهتر
از
مشخصههای
اعمالشده
به هدف آن
باشند. این
عدم
تطابقها
میتوانند
بهطور
بالقوه
منجر به
تولید کد
نادرست
شوند. در
موارد دیگر
ممکن است
بیخطر
باشند و
صرفاً با
افزودن
مشخصهٔ
غایب به هدف
برطرف
گردند. برای
مقایسه،
گزینهٔ
-Wmissing-attributes را
ببینید که
پیامهای
تشخیصی را
هنگامی
کنترل
میکند که
اعلان alias
نسبت به هدف
محدودیت
کمتری
داشته
باشد، نه
محدودیت
بیشتر.
مشخصههای مورد بررسی شامل "alloc_align"، "alloc_size"، "cold"، "const"، "hot"، "leaf"، "malloc"، "nonnull"، "noreturn"، "nothrow"، "pure"، "returns_nonnull" و "returns_twice" هستند.
گزینهٔ -Wattribute-alias معادل -Wattribute-alias=1 است. این مقدار پیشفرض است. میتوانید این هشدارها را با -Wno-attribute-alias یا -Wattribute-alias=0 غیرفعال کنید.
- -Wbidi-chars=[none|unpaired|any|ucn]
- درباره
نویسههای
کنترلی
دوجهتهٔ (bidi)
بالقوه
گمراهکنندهٔ
UTF-8 در
کامنتها،
رشتههای
تحتاللفظی،
ثابتهای
نویسهای و
شناسهها
هشدار
میدهد.
چنین
نویسههایی
میتوانند
جهت نگارش
چپبهراست
را به
راستبهچپ
(و برعکس)
تغییر دهند
که ممکن است
موجب
سردرگمی
بین ترتیب
منطقی و
ترتیب بصری
شود. این
امر
میتواند
خطرناک
باشد؛ برای
نمونه،
ممکن است به
نظر برسد که
بخشی از کد
کامنت نشده
است، در
حالی که در
واقع کامنت
شده است.
سه سطح هشدار توسط GCC پشتیبانی میشود. مقدار پیشفرض -Wbidi-chars=unpaired است که درباره بافتهای bidi که به درستی پایان نیافتهاند هشدار میدهد. -Wbidi-chars=none هشدار را غیرفعال میکند. -Wbidi-chars=any درباره هرگونه استفاده از نویسههای کنترلی دوجهته هشدار میدهد.
بهطور پیشفرض، این هشدار درباره UCNها هشدار نمیدهد. با این حال، با استفاده از -Wbidi-chars=unpaired,ucn یا -Wbidi-chars=any,ucn میتوان چنین بررسیای را فعال کرد. استفاده از -Wbidi-chars=ucn معتبر است و در صورتی که پیشتر -Wbidi-chars=any تعیین نشده باشد، معادل -Wbidi-chars=unpaired,ucn است.
- -Wbool-compare
- درباره
مقایسه
عبارت بولی
با مقدار
عدد صحیحی
متفاوت از
"true"/"false"
هشدار
میدهد.
برای
نمونه،
مقایسه زیر
همیشه
نادرست (false)
است:
int n = 5; ... if ((n > 1) == 2) { ... }این هشدار با -Wall فعال میشود.
- -Wbool-operation
- درباره
عملیات
مشکوک روی
عبارتهایی
از نوع بولی
هشدار
میدهد.
برای
نمونه،
نقیض بیتی
یک مقدار
بولی به
احتمال
زیاد یک باگ
در برنامه
است. در C،
این هشدار
همچنین
درباره
افزایش یا
کاهش مقدار
بولی، که
بهندرت
معنا دارد،
هشدار
میدهد. (در
C++، کاهش
دادن مقدار
بولی
همواره
نامعتبر
است. افزایش
مقدار بولی
در C++17
نامعتبر
بوده و در
غیر این
صورت منسوخ
است.)
این هشدار با -Wall فعال میشود.
- -Wduplicated-branches
- هنگامی که
یک ساختار if-else
دارای
شاخههای
یکسان
باشد،
هشدار
میدهد. این
هشدار
مواردی
مانند
if (p != NULL) return 0; else return 0;
را تشخیص میدهد. این گزینه زمانی که هر دو شاخه تنها شامل یک عبارت تهی (null statement) باشند هشدار نمیدهد. این هشدار برای عملگرهای شرطی نیز هشدار صادر میکند:
int i = x ? *p : *p;
- -Wduplicated-cond
- درباره
شرطهای
تکراری در
زنجیرهای
از if-else-if هشدار
میدهد.
برای
نمونه،
برای کد زیر
هشدار صادر
میکند:
if (p->q != NULL) { ... } else if (p->q != NULL) { ... } - -Wframe-address
- هنگامی که __builtin_frame_address یا __builtin_return_address با آرگومانی بزرگتر از 0 فراخوانی شوند، هشدار میدهد. چنین فراخوانیهایی ممکن است مقادیر نامعینی بازگردانند یا باعث خرابی (crash) برنامه شوند. این هشدار در -Wall گنجانده شده است.
- -Wno-discarded-qualifiers (فقط C و Objective-C)
- در صورتی که توصیفکنندههای نوع (type qualifiers) روی اشارهگرها نادیده گرفته شوند، هشدار ندهد. بهطور معمول، کامپایلر زمانی که یک متغیر "const char *" به تابعی ارسال میشود که پارامتر "char *" میپذیرد، هشدار میدهد. از این گزینه میتوان برای فرونشاندن چنین هشداری استفاده کرد.
- -Wno-discarded-array-qualifiers (فقط C و Objective-C)
- در صورتی که توصیفکنندههای نوع روی آرایههایی که هدف اشارهگر هستند نادیده گرفته شوند، هشدار ندهد. بهطور معمول، کامپایلر زمانی که یک متغیر "const int (*)[]" به تابعی ارسال میشود که پارامتر "int (*)[]" میپذیرد، هشدار میدهد. از این گزینه میتوان برای فرونشاندن چنین هشداری استفاده کرد.
- -Wno-incompatible-pointer-types (فقط C و Objective-C)
- هنگامی که
تبدیلی بین
اشارهگرهایی
با انواع
ناسازگار
وجود دارد،
هشدار ندهد.
این هشدار
برای
مواردی است
که تحت پوشش
-Wno-pointer-sign قرار
نمیگیرند؛
گزینهای
که برای
ارسال
آرگومان
اشارهگر
یا انتساب
با
علامتداری
(signedness) متفاوت
هشدار
میدهد.
بهطور پیشفرض در C99 و گویشهای پس از آن در C، کامپایلر GCC با این موضوع به عنوان یک خطا رفتار میکند. این خطا میتواند با استفاده از -fpermissive (همراه با برخی خطاهای دیگر) یا صرفاً برای این خطا با -Wno-error=incompatible-pointer-types به یک هشدار تنزل یابد.
این هشدار با -pedantic-errors به یک خطا ارتقا مییابد.
- -Wno-int-conversion (فقط C و Objective-C)
- درباره
تبدیلات
ناسازگار
عدد صحیح به
اشارهگر و
اشارهگر
به عدد صحیح
هشدار ندهد.
این هشدار
درباره
تبدیلات
ضمنی (implicit)
است؛ برای
تبدیلات
صریح (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
- درباره تقسیم عدد صحیح بر صفر در زمان کامپایل هشدار ندهد. برای تقسیم ممیز شناور بر صفر هشداری داده نمیشود، چرا که میتواند روشی مشروع برای بهدست آوردن مقادیر بینهایت و NaN باشد.
- -Wsystem-headers
- پیامهای
هشدار را
برای
ساختارهای
یافتشده
در
فایلهای
سرایند
سیستم (system header files)
چاپ کند.
هشدارهای
حاصل از
سرایندهای
سیستم
معمولاً با
این فرض که
نشاندهنده
مشکلات
واقعی
نیستند و
تنها
خواندن
خروجی
کامپایلر
را دشوارتر
میکنند،
فرونشانده
میشوند.
استفاده از
این گزینهٔ
خط فرمان به
GCC اعلام
میکند که
هشدارهای
سرایندهای
سیستم را به
گونهای
نمایش دهد
که گویی در
کد کاربر رخ
دادهاند.
با این حال،
توجه داشته
باشید که
استفاده از
-Wall همراه با
این گزینه،
درباره
دستورهای
پیشپردازندهٔ
(pragma) ناشناخته
در
سرایندهای
سیستم
هشدار
نمیدهد---برای
آن منظور،
باید از -Wunknown-pragmas
نیز
استفاده
شود..IP -Wtautological-compare 4
اگر یک
مقایسه با
خود (self-comparison)
همواره به
درست یا
نادرست
ارزیابی
شود، هشدار
میدهد. این
هشدار
خطاهای
گوناگونی
را تشخیص
میدهد،
مانند:
int i = 1; ... if (i > i) { ... }این هشدار همچنین دربارهٔ مقایسههای بیتی که همواره به درست یا نادرست ارزیابی میشوند هشدار میدهد؛ برای نمونه:
if ((a & 16) == 10) { ... }همواره نادرست خواهد بود.
این هشدار با -Wall فعال میشود.
- -Wtrailing-whitespace
- -Wtrailing-whitespace=kind
- دربارهٔ فضای خالی انتهایی در انتهای خطوط، از جمله درون کامنتها، اما بهجز فضای خالی انتهایی در لیترالهای رشتهای خام (raw string literals)، هشدار میدهد. "-Wtrailing-whitespace" معادل با "-Wtrailing-whitespace=blanks" است و تنها دربارهٔ نویسههای فاصله و برگهٔ افقی انتهایی هشدار میدهد. "-Wtrailing-whitespace=any" دربارهٔ آنها یا نویسههای تغذیهٔ صفحه (form feed) یا برگهٔ عمودی انتهایی هشدار میدهد. "-Wno-trailing-whitespace" یا "-Wtrailing-whitespace=none" این هشدار را غیرفعال میکند، که حالت پیشفرض است. این یک هشدار شیوهٔ کدنویسی است.
- -Wleading-whitespace=kind
- دربارهٔ ایرادهای شیوهای در فضای خالی ابتدایی هشدار میدهد، اما نه دربارهٔ مقدار تورفتگی. برخی پروژهها از شیوههای کدنویسی استفاده میکنند که در آنها فقط از فاصله برای تورفتگی استفاده میشود، برخی دیگر فقط از برگه (tab)، و برخی دیگر از صفر یا چند برگه (برای مضارب "-ftabstop=n") و به دنبال آن صفر یا کمتر از n فاصله استفاده میکنند. در خطوطی که صرفاً حاوی فضای خالی هستند هشداری صادر نمیشود (اگرچه ممکن است هشدار "-Wtrailing-whitespace=" صادر شود)، و درون لیترالهای رشتهای خام هشداری داده نمیشود. همچنین برای فضای خالی ابتدایی درون کامنتهای چندخطی هشدار صادر میشود. "-Wleading-whitespace=spaces" دربارهٔ فضای خالی ابتدایی غیر از فاصله برای پروژههایی که میخواهند تورفتگی را فقط با فاصله انجام دهند هشدار میدهد. "-Wleading-whitespace=tabs" دربارهٔ فضای خالی ابتدایی غیر از برگههای افقی برای پروژههایی که میخواهند تورفتگی را فقط با برگههای افقی انجام دهند هشدار میدهد. "-Wleading-whitespace=blanks" دربارهٔ فضای خالی ابتدایی غیر از فاصله و برگهٔ افقی، یا دربارهٔ برگهٔ افقی پس از یک فاصله در فضای خالی ابتدایی، یا دربارهٔ n یا تعداد بیشتری فاصلهٔ متوالی در فضای خالی ابتدایی (که n آرگومان "-ftabstop=n" است و بهطور پیشفرض 8 میباشد) هشدار میدهد. "-Wleading-whitespace=none" هشدار را غیرفعال میکند، که حالت پیشفرض است. این یک هشدار شیوهٔ کدنویسی است.
- -Wtrampolines
- دربارهٔ ترامپولینهای (trampolines) تولیدشده برای اشارهگرها به توابع تو در تو (nested functions) هشدار میدهد. ترامپولین قطعهٔ کوچکی از داده یا کد است که در زمان اجرا، هنگامی که نشانی یک تابع تو در تو گرفته میشود، روی پشته ایجاد شده و برای فراخوانی غیرمستقیم تابع تو در تو به کار میرود. برای برخی معماریهای مقصد، این ساختار تنها از داده تشکیل شده و بنابراین نیاز به رسیدگی خاصی ندارد. اما برای بیشتر مقاصد، از کد تشکیل شده است و بنابراین مستلزم آن است که پشته قابل اجرا (executable) شود تا برنامه به درستی کار کند.
- -Wfloat-equal
- اگر مقادیر
ممیز شناور
در
مقایسههای
برابری
استفاده
شوند،
هشدار
میدهد.
ایدهٔ پشت این هشدار این است که گاهی اوقات (برای برنامهنویس) راحتتر است که مقادیر ممیز شناور را به عنوان تقریبی از اعداد حقیقی با دقت نامتناهی در نظر بگیرد. اگر چنین کاری میکنید، باید (با تجزیه و تحلیل کد یا از راهی دیگر) بیشترین یا خطای بیشینهٔ محتمل را که محاسبات ایجاد میکند محاسبه کنید و هنگام انجام مقایسهها (و هنگام تولید خروجی، هرچند آن مسئلهٔ متفاوتی است) آن را لحاظ نمایید. بهویژه، به جای بررسی برابری، باید بررسی کنید که آیا بازههای این دو مقدار همپوشانی دارند یا خیر؛ و این کار با عملگرهای رابطهای انجام میشود، بنابراین مقایسههای برابری احتمالاً نادرست هستند.
- -Wtraditional (تنها C و Objective-C)
- دربارهٔ ساختارهای خاصی که در C سنتی و ISO C رفتار متفاوتی دارند هشدار میدهد. همچنین دربارهٔ ساختارهای ISO C که معادلی در C سنتی ندارند، یا ساختارهای مشکلسازی که باید از آنها اجتناب شود، هشدار میدهد.
- پارامترهای ماکرو که درون لیترالهای رشتهای در بدنهٔ ماکرو ظاهر میشوند. در C سنتی، جایگزینی ماکرو درون لیترالهای رشتهای انجام میشود، اما در ISO C اینگونه نیست.
- در C سنتی، برخی از دستورهای پیشپردازنده وجود نداشتند. پیشپردازندههای سنتی تنها در صورتی یک خط را به عنوان یک دستور در نظر میگرفتند که # در ستون ۱ خط ظاهر میشد. بنابراین -Wtraditional دربارهٔ دستورهایی که C سنتی میفهمد اما نادیده میگیرد چون # به عنوان نخستین نویسه در خط قرار نگرفته است، هشدار میدهد. همچنین پیشنهاد میکند دستورهایی مانند "#pragma" را که برای C سنتی قابل فهم نیستند، با ایجاد تورفتگی برای آنها پنهان کنید. برخی پیادهسازیهای سنتی "#elif" را تشخیص نمیدهند، بنابراین این گزینه پیشنهاد میکند بهطور کلی از آن اجتناب شود.
- یک ماکروی تابعگونه که بدون آرگومان ظاهر شود.
- عملگر جمع یکانی (unary plus).
- پسوند ثابت عدد صحیح U، یا پسوندهای ثابت ممیز شناور F یا L. (C سنتی از پسوند L در ثابتهای عدد صحیح پشتیبانی میکند.) توجه داشته باشید که این پسوندها در ماکروهای تعریفشده در سربرگهای سیستمی بیشتر سیستمهای امروزی ظاهر میشوند، مانند ماکروهای _MIN/_MAX در "<limits.h>". استفاده از این ماکروها در کد کاربر معمولاً ممکن است به هشدارهای کاذب منجر شود، با این حال پیشپردازندهٔ یکپارچهٔ GCC زمینه و اطلاعات کافی را دارد تا در این موارد از هشدار دادن خودداری کند.
- تابعی که در یک بلوک به صورت خارجی (external) اعلان شده و سپس پس از پایان آن بلوک استفاده شده است.
- یک دستور "switch" دارای عملوندی از نوع "long" باشد.
- یک اعلان تابع غیر-"static" که پس از یک اعلان "static" قرار گرفته باشد. این ساختار توسط برخی کامپایلرهای C سنتی پذیرفته نمیشود.
- نوع ISO یک ثابت عدد صحیح دارای پهنا یا علامتداری متفاوتی نسبت به نوع سنتی آن باشد. این هشدار تنها در صورتی صادر میشود که مبنای عدد ثابت، ده باشد؛ یعنی دربارهٔ مقادیر هگزادسیمال یا اکتال، که معمولاً الگوهای بیتی را نشان میدهند، هشداری صادر نمیشود.
- استفاده از الحاق رشته در ISO C شناسایی شود.
- مقداردهی اولیهٔ نوعهای مجتمع خودکار (automatic aggregates).
- تداخل شناسهها با برچسبها (labels). C سنتی فاقد یک فضای نام مجزا برای برچسبها است.
- مقداردهی اولیهٔ اجتماعها (unions). اگر مقداردهی اولیه صفر باشد، هشدار نادیده گرفته میشود. این کار بر اساس این فرض انجام میشود که مقداردهی اولیه با صفر در کد کاربر، برای نمونه مشروط به "__STDC__" قرار گرفته تا از هشدارهای مربوط به فقدان مقداردهی اولیه جلوگیری شود و در حالت C سنتی به مقداردهی اولیهٔ پیشفرض به صفر متکی است.
- تبدیلها توسط پیشنمونهها (prototypes) میان مقادیر ممیز ثابت و ممیز شناور و برعکس. نبود این پیشنمونهها هنگام کامپایل با C سنتی مشکلات جدی ایجاد میکند. این یک زیرمجموعه از هشدارهای تبدیل ممکن است؛ برای مجموعهٔ کامل از -Wtraditional-conversion استفاده کنید.
- استفاده از تعاریف توابع به شیوهٔ ISO C. این هشدار عمداً برای اعلانهای پیشنمونه یا توابع با تعداد متغیر آرگومان (variadic) صادر نمیشود، زیرا این ویژگیهای ISO C هنگام استفاده از ماکروهای سازگاری با C سنتی در libiberty، یعنی "PARAMS" و "VPARAMS"، در کد شما ظاهر میشوند. این هشدار همچنین برای توابع تو در تو نادیده گرفته میشود چون آن ویژگی در حال حاضر یک افزونهٔ GCC است و بنابراین ربطی به سازگاری با C سنتی ندارد.
- -Wtraditional-conversion (تنها C و Objective-C)
- اگر یک پیشنمونه باعث تبدیل نوعی شود که با آنچه برای همان آرگومان در نبود پیشنمونه رخ میداد متفاوت باشد، هشدار میدهد. این شامل تبدیلهای ممیز ثابت به ممیز شناور و برعکس، و تبدیلهایی است که پهنا یا علامتداری یک آرگومان ممیز ثابت را تغییر میدهند، مگر زمانی که همانند ارتقای پیشفرض (default promotion) باشد.
- -Wdeclaration-after-statement (تنها C و Objective-C)
- هنگامی که
یک اعلان پس
از یک دستور
در یک بلوک
قرار گرفته
باشد،
هشدار
میدهد. این
ساختار که
از C++ شناخته
شده است، با
ISO C99 معرفی شد و
بهطور
پیشفرض در
GCC مجاز است.
این ساختار
در ISO C90
پشتیبانی
نمیشود.
این هشدار با -pedantic-errors به یک خطا ارتقا مییابد.
- -Wshadow
- هرگاه یک متغیر محلی یا اعلان نوع، متغیر، پارامتر، نوع، عضو کلاس (در C++) یا متغیر نمونهٔ (در Objective-C) دیگری را سایهاندازی کند، یا هرگاه یک تابع توکار (built-in) سایهاندازی شود، هشدار میدهد. توجه داشته باشید که در C++، کامپایلر در صورتی که یک متغیر محلی یک typedef صریح را سایهاندازی کند هشدار میدهد، اما اگر یک struct/class/enum را سایهاندازی کند هشداری صادر نمیکند. اگر این هشدار فعال شود، همچنین تمام نمونههای سایهاندازی محلی را نیز شامل میشود. این بدان معناست که در صورت استفاده از -Wshadow، گزینههای -Wno-shadow=local و -Wno-shadow=compatible-local نادیده گرفته میشوند. همانند -Wshadow=global است..IP "-Wno-shadow-ivar (فقط در Objective-C)" 4 هشدار ندادن هرگاه یک متغیر محلی، یک متغیر نمونه (instance variable) را در یک متد Objective-C بپوشاند (shadow کند).
- -Wshadow=global
- هشدار برای هرگونه همپوشانی (shadowing). همانند -Wshadow.
- -Wshadow=local
- هشدار هنگامی که یک متغیر محلی، متغیر محلی دیگر یا یک پارامتر را بپوشاند.
- -Wshadow=compatible-local
- هشدار
هنگامی که
یک متغیر
محلی،
متغیر محلی
دیگر یا
پارامتری
را بپوشاند
که نوع آن
با نوع
متغیر
پوشاننده
سازگار است.
در C++،
سازگاری
نوع در
اینجا به
این معنی
است که نوع
متغیر
پوشاننده
بتواند به
نوع متغیر
پوشاندهشده
تبدیل شود.
ایجاد این
پرچم (علاوه
بر -Wshadow=local) بر
این ایده
استوار است
که هرگاه یک
متغیر محلی
متغیر
دیگری با
نوع
ناسازگار
را
بپوشاند،
این عمل به
احتمال
زیاد عمدی
است، نه یک
باگ یا
اشتباه
تایپی،
همانطور
که در مثال
زیر نشان
داده شده
است:
for (SomeIterator i = SomeObj.begin(); i != SomeObj.end(); ++i) { for (int i = 0; i < N; ++i) { ... } ... }از آنجا که دو متغیر "i" در مثال بالا انواع ناسازگاری دارند، تنها فعالسازی -Wshadow=compatible-local هشداری صادر نمیکند. به دلیل ناسازگار بودن نوعهای آنها، اگر برنامهنویسی تصادفاً یکی را به جای دیگری استفاده کند، انتظار میرود که بررسی نوع (type checking) آن را تشخیص داده و خطا یا هشداری صادر کند. استفاده از این پرچم به جای -Wshadow=local میتواند شمار هشدارهای ناشی از همپوشانیهای عمدی را کاهش دهد. توجه داشته باشید که این همچنین بدین معنی است که پوشاندن "const char *i" توسط "char *i" هشداری صادر نمیکند.
این هشدار همچنین با -Wshadow=local فعال میشود.
- -Wlarger-than=byte-size
- هشدار
هرگاه شیئی
تعریف شود
که
اندازهاش
از byte-size فراتر
رود. -Wlarger-than=PTRDIFF_MAX
بهطور
پیشفرض
فعال است.
هشدارهای
کنترلشده
توسط این
گزینه را
میتوان با
مشخص کردن
byte-size برابر با
SIZE_MAX یا
بیشتر، یا
با -Wno-larger-than
غیرفعال
کرد.
همچنین برای فراخوانی توابع کراندار مانند "memchr" یا "strnlen" که کرانی بزرگتر از بزرگترین شیء ممکن تعیین میکنند (که بهطور پیشفرض PTRDIFF_MAX بایت است) هشدار میدهد. این هشدارها تنها با -Wno-larger-than قابل غیرفعالسازی هستند.
- -Wno-larger-than
- غیرفعال کردن هشدارهای -Wlarger-than=. این گزینه معادل -Wlarger-than=SIZE_MAX یا بزرگتر است.
- -Wframe-larger-than=byte-size
- هشدار در صورتی که اندازه قاب یک تابع (function frame) از byte-size فراتر رود. محاسبه انجامشده برای تعیین اندازه قاب پشته، تقریبی است و محافظهکارانه (conservative) نیست. نیازمندیهای واقعی پشته ممکن است تا حدی بیشتر از 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"
اشارهگری
به نویسه
تهی پایانی
(terminating nul character)
برمیگرداند
و نه به
ابتدای
شیء،
فراخوانی
"free" در
قطعه کد زیر
شناسایی
شده و هشدار
میگیرد.
void f (char *p) { p = stpcpy (p, "abc"); // ... free (p); // warning }-Wfree-nonheap-object در -Wall گنجانده شده است.
- -Wstack-usage=byte-size
- هشدار در
صورتی که
مصرف پشته
یک تابع
ممکن است از
byte-size فراتر
رود. محاسبه
انجامشده
برای تعیین
مصرف پشته،
دست بالا و
محافظهکارانه
(conservative) است. هر
فضایی که از
طریق
"alloca"،
آرایههای
با طول
متغیر، یا
ساختارهای
مرتبط
تخصیص
یابد،
هنگام
تعیین صدور
یا عدم صدور
هشدار توسط
کامپایلر
لحاظ
میشود.
این پیام مطابق با خروجی -fstack-usage است.
- اگر مصرف
پشته
کاملاً
ایستا باشد
اما از
مقدار
تعیینشده
فراتر رود،
پیام
اینگونه
است:
warning: stack usage is 1120 bytes
- اگر مصرف
پشته (تا
حدی) پویا
اما
کراندار و
محدود
باشد، پیام
اینگونه
است:
warning: stack usage might be 1648 bytes
- اگر مصرف
پشته (تا
حدی) پویا و
نامحدود
باشد، پیام
اینگونه
است:
warning: stack usage might be unbounded
-Wstack-usage=PTRDIFF_MAX بهطور پیشفرض فعال است. هشدارهای کنترلشده با این گزینه را میتوان با مشخص کردن byte-size برابر با SIZE_MAX یا بیشتر، یا با -Wno-stack-usage غیرفعال کرد.
- -Wno-stack-usage
- غیرفعال کردن هشدارهای -Wstack-usage=. این گزینه معادل -Wstack-usage=SIZE_MAX یا بزرگتر است.
- -Wunsafe-loop-optimizations
- هشدار در صورتی که حلقه بهینهسازی نشود زیرا کامپایلر نمیتواند هیچ فرضی درباره کرانهای اندیسهای حلقه در نظر بگیرد. همراه با -funsafe-loop-optimizations، اگر کامپایلر چنین فرضیاتی را لحاظ کند، هشدار میدهد.
- -Wno-pedantic-ms-format (فقط در مقصدهای MinGW)
- هنگامی که در ترکیب با -Wformat و -pedantic بدون افزونههای GNU به کار رود، این گزینه هشدارهای مربوط به تعیینکنندههای عرض قالب غیر ISO در "printf" / "scanf" نظیر "I32"، "I64" و "I" را که در مقصدهای Windows استفاده میشوند و به زمان اجرای MS وابستهاند، غیرفعال میکند.
- -Wpointer-arith
- هشدار
درباره هر
چیزی که به
«اندازه» (size of)
یک نوع تابع
یا "void"
وابسته
باشد. GNU C به
این نوعها
اندازه ۱
اختصاص
میدهد تا
انجام
محاسبات با
اشارهگرهای
"void *" و
اشارهگرها
به توابع
راحتتر
شود. در C++،
همچنین در
صورتی که یک
عملیات
حسابی شامل
"NULL" باشد
هشدار
میدهد. این
هشدار با
-Wpedantic نیز
فعال
میشود.
این هشدار با استفاده از -pedantic-errors به یک خطا تبدیل میشود.
- -Wno-pointer-compare
- هشدار
ندادن در
صورتی که یک
اشارهگر
با یک مقدار
ثابت
نویسهایِ
صفر مقایسه
شود. این
مقایسه
معمولاً
بدین معنی
است که هدف
اصلی،
ارجاعزدایی
(dereference) از
اشارهگر
بوده است.
به عنوان
مثال:
const char *p = foo (); if (p == '\0') return 42;
توجه داشته باشید که کد بالا در C++11 نامعتبر است.
این هشدار بهطور پیشفرض فعال است.
- -Wno-tsan
- غیرفعال
کردن
هشدارها
درباره
ویژگیهای
پشتیبانینشده
در ThreadSanitizer.
ابزار ThreadSanitizer از "std::atomic_thread_fence" پشتیبانی نمیکند و ممکن است موارد مثبت کاذب (false positive) گزارش کند.
- -Wtype-limits
- هشدار در صورتی که یک مقایسه به دلیل محدوده متناهی نوع داده، همواره درست یا همواره نادرست باشد، اما برای عبارتهای ثابت هشداری صادر نمیکند. به عنوان مثال، اگر یک متغیر بدون علامت (unsigned) با "<" یا ">=" با صفر مقایسه شود، هشدار میدهد. این هشدار با -Wextra نیز فعال میشود..IP "-Wabsolute-value (فقط C و Objective-C)" 4 هنگامی که یک تابع استاندارد مناسبتر در دسترس باشد، برای فراخوانی توابع استانداردی که مقدار مطلق (قدر مطلق) یک آرگومان را محاسبه میکنند، هشدار میدهد. برای نمونه، فراخوانی abs(3.14) این هشدار را فعال میکند زیرا تابع مناسبتر برای محاسبهٔ مقدار مطلق یک آرگومان با نوع double تابع "fabs" است. این گزینه همچنین زمانی که آرگومانِ چنین تابعی از نوعِ بدون علامت (unsigned) باشد، هشدار میدهد. این هشدار را میتوان با تبدیل نوع صریح (explicit cast) نادیده گرفت و همچنین با -Wextra نیز فعال میشود.
- -Wcomment
- -Wcomments
- هر زمان که توالی شروع توضیح /* درون یک توضیحِ /* پدیدار شود، یا هر زمان که یک بکاسلش-خطجدید (backslash-newline) درون یک توضیحِ // ظاهر شود، هشدار میدهد. این هشدار توسط -Wall فعال میشود.
- -Wtrigraphs
- اگر
سهنگارههایی
(trigraphs) یافت
شوند که
ممکن است
معنای
برنامه را
تغییر
دهند،
هشدار
میدهد.
دربارهٔ
سهنگارههای
درون
توضیحات
هشداری
داده
نمیشود،
مگر مواردی
که یک خط
جدید
گریزدار (escaped newline)
ایجاد کنند.
این گزینه به طور ضمنی توسط -Wall فعال میشود. اگر -Wall مشخص نشده باشد، این گزینه همچنان فعال خواهد بود مگر اینکه سهنگارهها فعال شده باشند. برای دریافت تبدیل سهنگارهها بدون هشدار، اما دریافت سایر هشدارهای -Wall، از -trigraphs -Wall -Wno-trigraphs استفاده کنید.
- -Wundef
- اگر یک شناسهٔ تعریفنشده در یک دستورالعمل "#if" ارزیابی شود، هشدار میدهد. چنین شناسههایی با صفر جایگزین میشوند.
- -Wexpansion-to-defined
- هر زمان که عملگر defined در فرآیند بسط یک ماکرو دیده شود (از جمله در مواردی که ماکرو توسط یک دستورالعمل #if بسط داده میشود)، هشدار میدهد. چنین کاربردی قابلحمل (portable) نیست. این هشدار همچنین با -Wpedantic و -Wextra فعال میشود.
- -Wunused-macros
- دربارهٔ
ماکروهای
تعریفشده
در فایل
اصلی که
مورد
استفاده
قرار
نگرفتهاند
هشدار
میدهد. یک
ماکرو
زمانی
استفادهشده
تلقی
میشود که
دستکم یک
بار بسط
داده شود یا
وجود آن
ارزیابی
گردد.
پیشپردازنده
همچنین در
صورتی که
ماکرو تا
زمان
بازتعریف
یا حذف
تعریف (undefine)
استفاده
نشده باشد،
هشدار
میدهد.
برای ماکروهای توکار (built-in)، ماکروهای تعریفشده در خط فرمان، و ماکروهای تعریفشده در فایلهای ضمیمهشده (include) هشداری داده نمیشود.
نکته: اگر ماکرویی واقعاً استفاده شده باشد، اما صرفاً درون بلوکهای شرطی نادیدهگرفتهشده قرار داشته باشد، پیشپردازنده آن را به عنوان استفادهنشده گزارش میکند. برای جلوگیری از این هشدار، میتوانید دامنهٔ تعریف ماکرو را محدودتر کنید، برای نمونه با انتقال آن به اولین بلوک شرطی ردشده. در غیر این صورت، میتوانید با دستوری شبیه به عبارت زیر یک کاربرد ساختگی برای آن ایجاد کنید:
#if defined the_macro_causing_the_warning #endif
- -Wno-endif-labels
- هر زمان که
پس از
"#else" یا
"#endif"
متنی
بیاید،
هشدار
نمیدهد.
این موضوع
گاهی در
برنامههای
قدیمیتر
با کدهایی
به فرم زیر
پیش میآید:
#if FOO ... #else FOO ... #endif FOO
دومین و سومین "FOO" باید درون توضیح قرار گیرند. این هشدار به طور پیشفرض فعال است.
- -Wbad-function-cast (فقط C و Objective-C)
- هنگامی که خروجی فراخوانی یک تابع به نوعی ناسازگار تبدیل شود (cast)، هشدار میدهد. برای نمونه، اگر حاصل فراخوانی تابعی که یک نوع عدد صحیح (integer) برمیگرداند به یک نوع اشارهگر تبدیل شود، هشدار داده خواهد شد.
- -Wc90-c99-compat (فقط C و Objective-C)
- دربارهٔ ویژگیهایی که در ISO C90 وجود ندارند اما در ISO C99 معرفی شدهاند هشدار میدهد. به عنوان مثال، در مورد استفاده از آرایههای با طول متغیر (variable length arrays)، نوع "long long"، نوع "bool"، مقادیر لفظی مرکب (compound literals)، مقداردهندههای معین (designated initializers) و مانند آنها هشدار میدهد. این گزینه مستقل از حالت استاندارد انتخابی است. هشدارها در عبارتی که پس از "__extension__" میآید غیرفعال میشوند.
- -Wc99-c11-compat (فقط C و Objective-C)
- دربارهٔ ویژگیهایی که در ISO C99 وجود ندارند اما در ISO C11 معرفی شدهاند هشدار میدهد. برای نمونه، در مورد استفاده از ساختارها (structures) و اجتماعات (unions) بینام، توصیفگر نوعِ "_Atomic"، مشخصکنندهٔ کلاس حافظهٔ "_Thread_local"، مشخصکنندهٔ "_Alignas"، عملگر "Alignof"، کلمهٔ کلیدی "_Generic" و موارد مشابه هشدار میدهد. این گزینه مستقل از حالت استاندارد انتخابی است. هشدارها در عبارتی که پس از "__extension__" میآید غیرفعال میشوند.
- -Wc11-c23-compat (فقط C و Objective-C)
- -Wc11-c2x-compat (فقط C و Objective-C)
- دربارهٔ
ویژگیهایی
که در ISO C11 وجود
ندارند اما
در ISO C23 معرفی
شدهاند
هشدار
میدهد.
برای
نمونه،
دربارهٔ
حذف رشته در
"_Static_assert"،
استفاده از
نحو [[]] برای
ویژگیها
(attributes)،
استفاده از
انواع ممیز
شناور
دهدهی (decimal floating-point)
و موارد
دیگر هشدار
میدهد. این
گزینه
مستقل از
حالت
استاندارد
انتخابی
است.
هشدارها در
عبارتی که
پس از
"__extension__"
میآید
غیرفعال
میشوند.
نام -Wc11-c2x-compat
منسوخ شده
است.
هنگامی که کامپایل در حالت C23 نباشد، این هشدارها توسط -pedantic-errors به خطا تبدیل میشوند.
- -Wc23-c2y-compat (فقط C و Objective-C)
- -Wc23-c2y-compat (فقط C و Objective-C)
- دربارهٔ
ویژگیهایی
که در ISO C23 وجود
ندارند اما
در ISO C2Y موجود
هستند
هشدار
میدهد.
برای
نمونه،
دربارهٔ
انتخاب
"_Generic" بر
پایهٔ نام
یک نوع به
جای یک
عبارت
هشدار
میدهد. این
گزینه
مستقل از
حالت
استاندارد
انتخابی
است.
هشدارها در
عبارتی که
پس از
"__extension__"
میآید
غیرفعال
میشوند.
هنگامی که کامپایل در حالت C2Y نباشد، این هشدارها توسط -pedantic-errors به خطا ارتقا مییابند.
- -Wc++-compat (فقط C و Objective-C)
- دربارهٔ ساختارهای ISO C که خارج از زیرمجموعهٔ مشترک ISO C و ISO C++ هستند هشدار میدهد، به عنوان مثال درخواست تبدیل ضمنی از "void *" به اشارهگری از نوع غیر-"void".
- -Wc++11-compat (فقط C++ و Objective-C++)
- دربارهٔ ساختارهای C++ که معنای آنها میان ISO C++ 1998 و ISO C++ 2011 متفاوت است هشدار میدهد، مانند شناسههایی در ISO C++ 1998 که در ISO C++ 2011 جزو کلمات کلیدی هستند. این هشدار گزینهٔ -Wnarrowing را روشن میکند و توسط -Wall نیز فعال میشود.
- -Wc++14-compat (فقط C++ و Objective-C++)
- دربارهٔ ساختارهای C++ که معنای آنها میان ISO C++ 2011 و ISO C++ 2014 تفاوت دارد هشدار میدهد. این هشدار توسط -Wall فعال میشود.
- -Wc++17-compat (فقط C++ و Objective-C++)
- دربارهٔ ساختارهای C++ که معنای آنها میان ISO C++ 2014 و ISO C++ 2017 تفاوت دارد هشدار میدهد. این هشدار توسط -Wall فعال میشود.
- -Wc++20-compat (فقط C++ و Objective-C++)
- دربارهٔ ساختارهای C++ که معنای آنها میان ISO C++ 2017 و ISO C++ 2020 تفاوت دارد هشدار میدهد. این هشدار توسط -Wall فعال میشود.
- -Wno-c++11-extensions (فقط C++ و Objective-C++)
- دربارهٔ ساختارهای C++11 در کدی که با استفاده از استانداردهای قدیمیتر C++ کامپایل میشود هشدار ندهد. حتی بدون این گزینه، برخی از ساختارهای C++11 تنها در صورتی مشخص میشوند که از -Wpedantic استفاده شده باشد.
- -Wno-c++14-extensions (فقط C++ و Objective-C++)
- دربارهٔ ساختارهای C++14 در کدی که با استفاده از استانداردهای قدیمیتر C++ کامپایل میشود هشدار ندهد. حتی بدون این گزینه، برخی از ساختارهای C++14 تنها در صورتی مشخص میشوند که از -Wpedantic استفاده شده باشد.
- -Wno-c++17-extensions (فقط C++ و Objective-C++)
- دربارهٔ ساختارهای C++17 در کدی که با استفاده از استانداردهای قدیمیتر C++ کامپایل میشود هشدار ندهد. حتی بدون این گزینه، برخی از ساختارهای C++17 تنها در صورتی مشخص میشوند که از -Wpedantic استفاده شده باشد.
- -Wno-c++20-extensions (فقط C++ و Objective-C++)
- دربارهٔ ساختارهای C++20 در کدی که با استفاده از استانداردهای قدیمیتر C++ کامپایل میشود هشدار ندهد. حتی بدون این گزینه، برخی از ساختارهای C++20 تنها در صورتی مشخص میشوند که از -Wpedantic استفاده شده باشد.
- -Wno-c++23-extensions (فقط C++ و Objective-C++)
- دربارهٔ ساختارهای C++23 در کدی که با استفاده از استانداردهای قدیمیتر C++ کامپایل میشود هشدار ندهد. حتی بدون این گزینه، برخی از ساختارهای C++23 تنها در صورتی مشخص میشوند که از -Wpedantic استفاده شده باشد.
- -Wno-c++26-extensions (فقط C++ و Objective-C++)
- دربارهٔ ساختارهای C++26 در کدی که با استفاده از استانداردهای قدیمیتر C++ کامپایل میشود هشدار ندهد. حتی بدون این گزینه، برخی از ساختارهای C++26 تنها در صورتی مشخص میشوند که از -Wpedantic استفاده شده باشد.
- -Wcast-qual
- هر زمان که
یک
اشارهگر
به گونهای
تبدیل شود (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
- هشدار میدهد هرگاه اشارهگری طوری تبدیل نوع (cast) شود که تراز (alignment) مورد نیاز مقصد افزایش یابد. برای مثال، اگر در ماشینهایی که اعداد صحیح تنها در مرزهای دو یا چهار بایتی قابل دسترسی هستند، یک "char *" به یک "int *" تبدیل نوع شود هشدار میدهد.
- -Wcast-align=strict
- هشدار میدهد هرگاه اشارهگری طوری تبدیل نوع شود که تراز مورد نیاز مقصد افزایش یابد. برای مثال، صرفنظر از ماشین مقصد، اگر یک "char *" به یک "int *" تبدیل نوع شود هشدار میدهد.
- -Wcast-function-type
- هنگامی که یک اشارهگر تابع به یک اشارهگر تابع ناسازگار تبدیل نوع شود هشدار میدهد. در تبدیل نوعی که شامل انواع تابع با فهرست آرگومان متغیر است، تنها انواع آرگومانهای اولیهای که ارائه شدهاند در نظر گرفته میشوند. هر پارامتری از نوع اشارهگر با هر نوع اشارهگر دیگری مطابقت دارد. هرگونه تفاوت بیخطر در انواع صحیح (integral types) نادیده گرفته میشود، مانند "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++، درباره تبدیل منسوخشده از رشتههای لفظی (string literals) به "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
- درباره
تبدیلات
ضمنی (implicit conversions) که
ممکن است یک
مقدار را
تغییر دهند
هشدار
میدهد. این
شامل
تبدیلات
بین حقیقی و
صحیح است،
مانند "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; }
در این مثال، آرایهٔ a هنگامی که اشارهگر s استفاده میشود خارج از دامنه (out of scope) است. از آنجا که کدی که "s" را مقداردهی میکند شرطی است، این هشدار در سطح ۲ فعال میشود.
extern void frob (const char *);
void h (char *s)
{
if (!s)
{
char a[12] = "tmpname";
s = a;
}
// warning: dangling pointer 's' to 'a' may be used
frob (s);
}
- -Wdate-time
- هشدار هنگام مواجهه با ماکروهای "__TIME__"، "__DATE__" یا "__TIMESTAMP__"؛ چرا که ممکن است از کامپایلهای بازتولیدپذیرِ بیتبهبیت یکسان جلوگیری کنند.
- -Wempty-body
- هشدار در صورت وجود یک بدنهٔ خالی در دستور "if"، "else" یا "do while". این هشدار با -Wextra نیز فعال میشود.
- -Wno-endif-labels
- در مورد نشانههای سرگردان پس از "#else" و "#endif" هشدار ندهد.
- -Wenum-compare
- هشدار دربارهٔ مقایسهٔ بین مقادیر با نوعهای شمارشی متفاوت. در C++ ناهمخوانیهای نوع شمارشی در عبارات شرطی نیز بررسی و تشخیص داده میشوند و این هشدار بهطور پیشفرض فعال است. در C این هشدار با -Wall فعال میشود.
- -Wenum-conversion
- هشدار هنگام تبدیل ضمنی یک مقدار از نوع شمارشی به یک نوع شمارشی دیگر. این هشدار در C با -Wextra فعال میشود.
- -Wenum-int-mismatch (فقط C و Objective-C)
- هشدار
دربارهٔ
عدم تطابق
میان یک نوع
شمارشی و یک
نوع عدد
صحیح در
اعلانها.
برای مثال:
enum E { l = -1, z = 0, g = 1 }; int foo(void); enum E foo(void);در C، یک نوع شمارشی با "char"، یک نوع عدد صحیح علامتدار، یا یک نوع عدد صحیح بدون علامت سازگار است. با این حال، از آنجا که انتخاب نوع زیرین یک نوع شمارشی وابسته به پیادهسازی (implementation-defined) است، چنین عدم تطابقهایی ممکن است موجب مسائل مربوط به قابلیت حمل کد شوند. در C++، چنین عدم تطابقهایی یک خطا به شمار میروند. در C، این هشدار با -Wall و -Wc++-compat فعال میشود.
- -Wjump-misses-init (فقط C و Objective-C)
- هشدار در
صورتی که یک
دستور
"goto" یا
دستور
"switch" به
سمت جلو از
روی
مقداردهی
اولیهٔ یک
متغیر
بپرد، یا به
سمت عقب به
برچسبی
بپرد که پس
از
مقداردهی
اولیه شدن
متغیر قرار
دارد. این
گزینه تنها
دربارهٔ
متغیرهایی
هشدار
میدهد که
هنگام
اعلان
مقداردهی
اولیه
شدهاند.
این هشدار
فقط برای C و
Objective-C
پشتیبانی
میشود؛ در
C++ این قبیل
انشعابها
در هر حالتی
خطا هستند.
-Wjump-misses-init در -Wc++-compat گنجانده شده است. این هشدار را میتوان با گزینهٔ -Wno-jump-misses-init غیرفعال کرد.
- -Wsign-compare
- هشدار هنگامی که مقایسهٔ میان مقادیر علامتدار و بدون علامت بتواند با تبدیل مقدار علامتدار به بدون علامت، نتیجهای نادرست تولید کند. در C++، این هشدار با -Wall نیز فعال میشود. در C، با -Wextra نیز فعال میگردد.
- -Wsign-conversion
- هشدار برای تبدیلهای ضمنی که ممکن است علامت یک مقدار عدد صحیح را تغییر دهند، مانند انتساب یک عبارت عدد صحیح علامتدار به یک متغیر عدد صحیح بدون علامت. یک تبدیل نوع صریح (explicit cast) این هشدار را بیاثر میکند. در C، این گزینه همچنین با -Wconversion فعال میشود.
- -Wflex-array-member-not-at-end (فقط C و C++)
- هشدار
هنگامی که
یک ساختار
حاوی عضو
آرایهٔ
انعطافپذیر
C99 به عنوان
آخرین
فیلد، در
انتهای یک
ساختار
دیگر قرار
نگرفته
باشد. این
هشدار به
عنوان مثال
در چنین
مواردی
هشدار
میدهد:
struct flex { int length; char data[]; }; struct mid_flex { int m; struct flex flex_data; int n; }; - -Wfloat-conversion
- هشدار برای تبدیلهای ضمنی که دقت یک مقدار ممیز شناور (حقیقی) را کاهش میدهند. این شامل تبدیل از مقدار ممیز شناور به عدد صحیح، و از ممیز شناور با دقت بالاتر به دقت پایینتر است. این گزینه همچنین با -Wconversion فعال میشود.
- -Wno-scalar-storage-order
- در مورد ساختارهای مشکوک مرتبط با ترتیب معکوس ذخیرهسازی اسکالر هشدار ندهد.
- -Wsizeof-array-div
- هشدار
دربارهٔ
تقسیم دو
عملگر sizeof
هنگامی که
اولی روی یک
آرایه
اعمال شده و
مقسومعلیه
با اندازهٔ
عنصر آرایه
برابر نیست.
در چنین
حالتی، این
محاسبه
تعداد
عناصر
آرایه را به
دست نخواهد
داد که
احتمالاً
مقصود
کاربر بوده
است. این
هشدار به
عنوان مثال
در این مورد
هشدار
میدهد:
int fn () { int arr[10]; return sizeof (arr) / sizeof (short); }این هشدار با -Wall فعال میشود.
- -Wsizeof-pointer-div
- هشدار برای تقسیمهای مشکوک دو عبارت sizeof که اندازهٔ اشارهگر را بر اندازهٔ عنصر تقسیم میکنند؛ روشی که شیوهٔ معمول برای محاسبهٔ اندازهٔ آرایه است اما با اشارهگرها درست کار نخواهد کرد. این هشدار برای نمونه دربارهٔ "sizeof (ptr) / sizeof (ptr[0])" در صورتی که "ptr" یک آرایه نبوده و یک اشارهگر باشد هشدار میدهد. این هشدار با -Wall فعال میشود.
- -Wsizeof-pointer-memaccess
- هشدار برای
پارامترهای
طول مشکوک
در توابع
توکار خاص
رشته و
حافظه، در
صورتی که
آرگومان از
"sizeof"
استفاده
کند. این
هشدار برای
مثال برای
"memset (ptr, 0, sizeof (ptr));"
در صورتی که
"ptr"
آرایه
نبوده بلکه
یک
اشارهگر
باشد فعال
میشود و
راهکار
اصلاحی
احتمالی را
پیشنهاد
میدهد، یا
دربارهٔ
"memcpy (&foo, ptr, sizeof
(&foo));".
همچنین
-Wsizeof-pointer-memaccess
دربارهٔ
فراخوانیهای
توابع کپی
رشتهای
محدودشده
مانند
"strncat" یا
"strncpy" که
یک عبارت
"sizeof" از
آرایهٔ
مبدأ را به
عنوان کران
مشخص
میکنند
هشدار
میدهد.
برای
نمونه، در
تابع زیر
فراخوانی
"strncat"
اندازهٔ
رشتهٔ مبدأ
را به عنوان
حد مشخص
میکند. این
عمل
تقریباً به
طور قطع یک
اشتباه است
و بنابراین
فراخوانی
خطا تشخیص
داده
میشود.
void make_file (const char *name) { char path[PATH_MAX]; strncpy (path, name, sizeof path - 1); strncat (path, ".text", sizeof ".text"); ... }گزینهٔ -Wsizeof-pointer-memaccess با -Wall فعال میشود.
- -Wno-sizeof-array-argument
- هنگامی که عملگر "sizeof" روی پارامتری اعمال میشود که در تعریف تابع به عنوان آرایه اعلان شده است، هشدار ندهد. این هشدار به صورت پیشفرض برای برنامههای C و C++ فعال است.
- -Wmemset-elt-size
- هشدار برای فراخوانیهای مشکوک به تابع توکار "memset"، در صورتی که آرگومان اول به یک آرایه ارجاع داشته باشد و آرگومان سوم عددی برابر با تعداد عناصر بوده، اما با اندازهٔ آرایه در حافظه برابر نباشد. این نشان میدهد که کاربر ضرب در اندازهٔ عنصر را از قلم انداخته است. این هشدار با -Wall فعال میشود.
- -Wmemset-transposed-args
- هشدار برای فراخوانیهای مشکوک به تابع توکار "memset" که در آن آرگومان دوم صفر نبوده و آرگومان سوم صفر است. برای مثال، فراخوانی "memset (buf, sizeof buf, 0)" خطا تشخیص داده میشود زیرا در عوض "memset (buf, 0, sizeof buf)" مد نظر بوده است. این پیام تنها زمانی صادر میشود که آرگومان سوم یک لیترال صفر باشد. در غیر این صورت، اگر عبارتی باشد که به صفر سادهسازی (fold) میشود، یا تبدیل صفر به یک نوع داده باشد، احتمال اینکه آرگومانها به اشتباه جابهجا شده باشند بسیار کمتر است و هشداری صادر نمیشود. این هشدار با -Wall فعال میشود.
- -Waddress
- هشدار
دربارهٔ
استفادههای
مشکوک از
عبارات
آدرس. این
موارد شامل
مقایسهٔ
آدرس یک
تابع یا یک
شیء
اعلانشده
با ثابت
اشارهگر
تهی (null pointer constant)
است، مانند
آنچه در void f (void); void g
(void) { if (!f) // warning: expression evaluates to false abort (); }
مقایسههای یک اشارهگر با یک لیترال رشتهای، مانند:
void f (const char *x) { if (x == "abc") // warning: expression evaluates to false puts ("equal"); }و بررسی برابری نتیجهٔ جمع یا تفریق اشارهگر با null، مانند:
void f (const int *p, int i) { return p + i == NULL; }چنین استفادههایی معمولاً نشاندهندهٔ خطای برنامهنویس است: آدرس بیشتر توابع و اشیاء لزوماً به درستی (true) ارزیابی میشود (استثنا، نمادهای ضعیف یا weak symbols هستند)، بنابراین استفاده از آنها در یک شرط ممکن است نشاندهندهٔ جا افتادن پرانتزها در فراخوانی تابع یا عدم ارجاعزدایی (dereference) در یک عبارت آرایهای باشد. زیرمجموعهای از این هشدار که مربوط به اشارهگرهای شیء است را میتوان با تبدیل نوع (cast) عملوند اشارهگر به یک نوع عدد صحیح مانند "intptr_t" یا "uintptr_t" نادیده گرفت. مقایسه با لیترالهای رشتهای به رفتار تعریفنشده یا نامشخص (unspecified behavior) میانجامد و قابل حمل نیست و نشان میدهد که احتمالاً قصد برنامهنویس فراخوانی "strcmp" بوده است. اگر عبارت مشکوک حاصل بسط یک ماکرو باشد، هشدار غیرفعال میشود. هشدار -Waddress توسط -Wall فعال میشود.
- -Wno-address-of-packed-member
- هنگامی که آدرس یک عضو بستهبندیشده (packed) از یک struct یا union گرفته میشود، که معمولاً به یک مقدار اشارهگر ناهمتراز (unaligned) میانجامد، هشدار ندهد. این گزینه بهطور پیشفرض فعال است.
- -Wlogical-op
- دربارهٔ
استفادههای
مشکوک از
عملگرهای
منطقی در
عبارات
هشدار
میدهد. این
شامل
استفاده از
عملگرهای
منطقی در
زمینههایی
است که
احتمالاً
عملگر بیتی
(bit-wise) مورد
انتظار
بوده است.
همچنین در
صورتی که
عملوندهای
یک عملگر
منطقی
یکسان
باشند،
هشدار
میدهد:
extern int a; if (a < 0 && a < 0) { ... } - -Wlogical-not-parentheses
- دربارهٔ
استفاده از
نقیض منطقی
(logical not) در
عملوند سمت
چپ یک
مقایسه
هشدار
میدهد. این
گزینه در
صورتی که
عملوند سمت
راست یک
عبارت بولی
در نظر
گرفته شود،
هشدار
نمیدهد.
هدف آن
شناسایی
کدهای
مشکوکی
مانند
موارد زیر
است:
int a; ... if (!a > 1) { ... }میتوان با قرار دادن عملوند سمت چپ (LHS) در پرانتز، این هشدار را برطرف کرد:
if ((!a) > 1) { ... }این هشدار با -Wall فعال میشود.
- -Waggregate-return
- اگر تابعی که ساختارها (structures) یا اجتماعها (unions) را برمیگرداند تعریف یا فراخوانی شود، هشدار میدهد. (در زبانهایی که امکان بازگرداندن آرایه وجود دارد، این مورد نیز هشدار ایجاد میکند.)
- -Wno-aggressive-loop-optimizations
- اگر کامپایلر رفتار تعریفنشدهای را در یک حلقه با تعداد تکرار ثابت تشخیص دهد، هشدار ندهد. گزینهٔ -Waggressive-loop-optimizations بهطور پیشفرض فعال است.
- -Wno-attributes
- در صورت
استفاده از
یک "__attribute__"
غیرمنتظره،
مانند
صفتهای
ناشناخته،
صفتهای
تابع
اعمالشده
روی
متغیرها و
غیره،
هشدار ندهد.
این گزینه
مانع از
خطاهای
ناشی از
استفادهٔ
نادرست از
صفتهای
پشتیبانیشده
نمیشود.
هشدارهای مربوط به استفادههای نادرست (ill-formed) از صفتهای استاندارد با -pedantic-errors به خطا ارتقا مییابند.
علاوه بر این، با استفاده از -Wno-attributes= میتوان هشدارهای مربوط به صفتهای با حوزهٔ ناشناخته (scoped attributes) را (در C++11 و C23) غیرفعال کرد. به عنوان مثال، -Wno-attributes=vendor::attr هشدار دربارهٔ اعلان زیر را غیرفعال میکند:
[[vendor::attr]] void f();
همچنین میتوان با استفاده از -Wno-attributes=vendor:: هشدار مربوط به تمامی صفتهای درون یک فضای نام (namespace) را غیرفعال کرد، که از هشدار دربارهٔ هر دوی این اعلانها جلوگیری میکند:
[[vendor::safe]] void f(); [[vendor::unsafe]] void f2();
توجه داشته باشید که -Wno-attributes= به معنای فعال شدن -Wno-attributes نیست.
- -Wno-builtin-declaration-mismatch
- هشدار
میدهد اگر
یک تابع
توکار (built-in) با
امضای
ناسازگار
یا به عنوان
یک غیرتابع
اعلان شود،
یا زمانی که
یک تابع
توکار
اعلانشده
با نوعی
فاقد
پیشنمونه
(prototype)، با
آرگومانهایی
فراخوانی
شود که
نوعهای
ارتقایافتهٔ
(promoted) آنها با
نوعهای
مورد
انتظار
تابع
مطابقت
نداشته
باشد.
هنگامی که
-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)
به یک
غیردستور
(non-statement) اختصاص
داده شود،
یا در
انتهای یک
عبارت مرکب
(compound statement) قرار
گیرد. چنین
برچسبهایی
در C23 و
گویشهای
بعدی C مجاز
هستند و در
سایر
گویشها به
عنوان یک
افزونهٔ GCC
در دسترس
میباشند.
این هشدار همچنین با -Wc11-c23-compat فعال میشود. در صورت ساخت (build) برای نسخهای از C قبل از C23، توسط -pedantic-errors به یک خطا تبدیل میشود.
- -Wheader-guard
- هشدار میدهد اگر یک محافظ درج چندبارهٔ معتبر سرایند در پیشپردازنده (multiple inclusion guard)، بلافاصله پس از دستورالعمل "#ifndef" یا "#if !defined" محافظ، یک دستورالعمل "#define" داشته باشد که ماکرویی متفاوت از ماکروی محافظ با نامی مشابه را تعریف کند، ماکروی واقعی محافظ درج چندباره در دستورالعمل متناظر در انتهای سرایند تعریف نشده باشد، و دستورالعمل "#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)
است، اما
برای
استانداردهای
قدیمیتر،
تعریفی به
سبک قدیمی
تلقی
میشود..IP
"-Wdeprecated-non-prototype (فقط C
و Objective-C)" 4 اگر
تابعی که با
یک فهرست
پارامتر
خالی ()
اعلان شده
است با یک
یا چند
آرگومان
فراخوانی
شود، یا اگر
پس از چنین
اعلانی با
تعریف
تابعی با یک
یا چند
پارامتر
مواجه شود،
هشدار
میدهد. هر
دو مورد در C23
و گویشهای
پس از آن در C
خطا هستند.
این هشدار همچنین توسط -Wc11-c23-compat فعال میشود.
- -Wmissing-parameter-name (فقط C و Objective-C)
- اگر در
تعریف یک
تابع نام
پارامتر
حذف شده و
تنها نوع آن
مشخص شده
باشد،
هشدار
میدهد. این
مورد
میتواند
برای
مستندسازی
استفاده
نشدن یک
پارامتر در
تعریف تابع
به کار رود.
این ویژگی
بخشی از C23 و
گویشهای
پس از آن در C
است، و به
عنوان یک
افزونهٔ GCC
در تمام
گویشهای
دیگر نیز در
دسترس است.
این هشدار همچنین با -Wc11-c23-compat فعال میشود. در صورت ساخت برای نسخهای از C قبل از C23، با استفاده از -pedantic-errors به یک خطا تبدیل میشود.
- -Wmissing-parameter-type (فقط C و Objective-C)
- اگر
پارامتر
تابع در
توابع به
سبک K&R بدون
مشخصکنندهٔ
نوع اعلان
شده باشد:
void foo(bar) { }این هشدار همچنین با -Wextra فعال میشود.
- -Wno-declaration-missing-parameter-type (فقط C و Objective-C)
- اگر اعلان
یک تابع
شامل نام
پارامتر
بدون نوع
باشد،
هشدار ندهد.
چنین
اعلانهای
تابعی،
پیشنمونه
تابع (prototype)
ارائه
نمیدهند و
مانع از
بیشتر
بررسیهای
نوع در
فراخوانیهای
تابع
میشوند.
این هشدار به طور پیشفرض فعال است. در C99 و گویشهای پس از آن در C، با این مورد به عنوان خطا برخورد میشود. این خطا میتواند با استفاده از -fpermissive (همراه با برخی خطاهای دیگر) یا به تنهایی برای همین خطا با -Wno-error=declaration-missing-parameter-type به یک هشدار تنزل یابد.
این هشدار توسط -pedantic-errors به یک خطا ارتقا مییابد.
- -Wmissing-prototypes (فقط C و Objective-C)
- اگر یک تابع سراسری بدون اعلان قبلی پیشنمونه (prototype) تعریف شود، هشدار میدهد. این هشدار حتی در صورتی که خود تعریف، یک پیشنمونه ارائه دهد نیز صادر میشود. از این گزینه برای تشخیص توابع سراسری که اعلان پیشنمونهٔ مطابقی در یک فایل سرآیند ندارند استفاده کنید. این گزینه برای C++ معتبر نیست زیرا تمام اعلانهای تابع در آن پیشنمونه ارائه میدهند و یک اعلان نامطابق، به جای تداخل با اعلان قبلی، یک سربارگذاری (overload) جدید اعلان میکند. برای تشخیص اعلانهای مفقود در C++ از -Wmissing-declarations استفاده کنید.
- -Wmissing-variable-declarations (فقط C و Objective-C)
- اگر یک متغیر سراسری بدون اعلان قبلی تعریف شود، هشدار میدهد. از این گزینه برای تشخیص متغیرهای سراسری که اعلان extern مطابقی در یک فایل سرآیند ندارند استفاده کنید.
- -Wmissing-declarations
- اگر یک تابع سراسری بدون اعلان قبلی تعریف شود، هشدار میدهد. این کار حتی در صورتی که خود تعریف یک پیشنمونه ارائه دهد نیز انجام میشود. از این گزینه برای تشخیص توابع سراسری که در فایلهای سرآیند اعلان نشدهاند استفاده کنید. در C، برای توابعی با اعلانهای قبلی فاقد پیشنمونه (non-prototype) هشداری صادر نمیشود؛ برای تشخیص پیشنمونههای مفقود از -Wmissing-prototypes استفاده کنید. در C++، برای الگوهای تابع (function templates)، توابع برخط (inline) یا توابع درون فضاهای نام ناشناس هشداری صادر نمیشود.
- -Wmissing-field-initializers
- اگر
مقداردهندهٔ
اولیهٔ یک
ساختار
برخی از
فیلدها را
کم داشته
باشد،
هشدار
میدهد.
برای
نمونه، کد
زیر باعث
ایجاد چنین
هشداری
میشود،
زیرا "x.h"
به طور ضمنی
صفر است:
struct s { int f, g, h; }; struct s x = { 3, 4 };در C این گزینه در مورد مقداردهندههای اولیهی مشخصشده (designated initializers) هشدار نمیدهد، بنابراین تغییر زیر هشداری ایجاد نمیکند:
struct s { int f, g, h; }; struct s x = { .f = 3, .g = 4 };در C این گزینه درباره مقداردهنده اولیه صفر همگانی { 0 } هشدار نمیدهد:
struct s { int f, g, h; }; struct s x = { 0 };به همین ترتیب، در C++ این گزینه در مورد مقداردهنده اولیه خالی { } هشدار نمیدهد، برای نمونه:
struct s { int f, g, h; }; s x = { };این هشدار در -Wextra گنجانده شده است. برای دریافت سایر هشدارهای -Wextra بدون این مورد، از -Wextra -Wno-missing-field-initializers استفاده کنید.
- -Wno-missing-requires
- به طور
پیشفرض،
کامپایلر
درباره
ظاهر شدن یک
concept-id به عنوان
یک simple-requirement در C++20
هشدار
میدهد:
bool satisfied = requires { C<T> };در اینجا در صورتی که C<T> یک عبارت معتبر باشد، مقدار satisfied برابر true خواهد بود، که برای همه Tها چنین است. احتمالاً منظور کاربر نوشتن عبارت زیر بوده است:
bool satisfied = requires { requires C<T> };تا satisfied تنها در صورتی true باشد که مفهوم (concept) C برای نوع T برآورده شود.
این هشدار را میتوان با -Wno-missing-requires غیرفعال کرد.
- -Wno-missing-template-keyword
- در صورتی که
شیء والد
وابسته (dependent)
باشد و عضوی
که نام برده
میشود یک
الگو (template)
باشد،
نشانههای
دسترسی به
عضو .، -> و ::
باید با
کلمه کلیدی
"template"
دنبال شوند.
template <class X> void DoStuff (X x) { x.template DoSomeOtherStuff<X>(); // Good. x.DoMoreStuff<X>(); // Warning, x is dependent. }در موارد نادر ممکن است هشدارهای مثبت کاذب ایجاد شود. برای رفع این هشدار، عبارت را درون پرانتز قرار دهید. برای نمونه، مورد زیر حتی در جایی که m و N عدد صحیح هستند، به عنوان یک الگو در نظر گرفته میشود:
void NotATemplate (my_class t) { int N = 5; bool test = t.m < N > (0); // Treated as a template. test = (t.m < N) > (0); // Same meaning, but not treated as a template. }این هشدار را میتوان با -Wno-missing-template-keyword غیرفعال کرد.
- -Wno-multichar
- در صورت استفاده از یک ثابت چندنویسهای ('FOOF')، هشدار ندهد. از آنجا که مقادیر آنها وابسته به پیادهسازی (implementation-defined) است و نباید در کد پرتابل استفاده شوند، معمولاً نشاندهنده یک اشتباه تایپی در کد کاربر هستند.
- -Wnormalized=[none|id|nfc|nfkc]
- در ISO C و ISO C++، دو
شناسه در
صورتی
متفاوت
هستند که
دنبالههای
متفاوتی از
نویسهها
باشند. با
این حال،
گاهی اوقات
هنگامی که
از
نویسههای
خارج از
مجموعه
نویسههای
پایهای ASCII
استفاده
میشود،
ممکن است دو
دنباله
نویسه
متفاوت
داشته
باشید که
یکسان به
نظر
میرسند.
برای
جلوگیری از
سردرگمی،
استاندارد
ISO 10646 برخی
قواعد
نرمالسازی
را تعیین
میکند که
در صورت
اعمال،
تضمین
میکنند دو
دنباله با
ظاهر یکسان
به
دنبالهای
یکسان
تبدیل شوند.
اگر از
شناسههایی
استفاده
کنید که
نرمالسازی
نشدهاند،
GCC میتواند
به شما
هشدار دهد؛
این گزینه
آن هشدار را
کنترل
میکند.
چهار سطح هشدار توسط GCC پشتیبانی میشود. پیشفرض -Wnormalized=nfc است که درباره هر شناسهای که در قالب نرمالشدهٔ «C» استاندارد ISO 10646 یعنی NFC نباشد، هشدار میدهد. NFC فرم توصیهشده برای بیشتر کاربردها است و معادل -Wnormalized میباشد.
متأسفانه، برخی نویسهها وجود دارند که در ISO C و ISO C++ در شناسهها مجاز دانسته شدهاند، اما وقتی به NFC تبدیل میشوند، در شناسهها مجاز نیستند. بدین معنا که هیچ راهی وجود ندارد که از این نمادها در ISO C یا C++ پرتابل استفاده کنید و در عین حال تمام شناسههایتان نیز در قالب NFC باشند. -Wnormalized=id هشدار را برای این نویسهها فرومینشاند. امید میرود که نسخههای آینده استانداردهای مربوطه این مشکل را اصلاح کنند، به همین دلیل این گزینه پیشفرض نیست.
میتوانید هشدار را برای تمام نویسهها با نوشتن -Wnormalized=none یا -Wno-normalized غیرفعال کنید. تنها در صورتی باید این کار را انجام دهید که از یک طرح نرمالسازی دیگر (مانند «D») استفاده میکنید، زیرا در غیر این صورت ممکن است به راحتی باگهایی ایجاد کنید که به معنای واقعی کلمه دیدن آنها غیرممکن است.
برخی نویسهها در ISO 10646 معانی متمایزی دارند اما در برخی فونتها یا روشهای نمایش، بهویژه هنگامی که قالببندی اعمال شده باشد، یکسان به نظر میرسند. برای نمونه "\u207F"، یعنی «SUPERSCRIPT LATIN SMALL LETTER N»، دقیقاً مانند یک "n" معمولی نمایش داده میشود که در بالانویس قرار گرفته است. ISO 10646 طرح نرمالسازی NFKC را نیز برای تبدیل همه این موارد به یک شکل استاندارد تعریف میکند، و در صورت استفاده از -Wnormalized=nfkc، اگر کد شما در قالب NFKC نباشد GCC هشدار میدهد. این هشدار شبیه به هشدار دادن درباره هر شناسهای است که حاوی حرف O باشد به این دلیل که ممکن است با رقم 0 اشتباه گرفته شود، و بنابراین پیشفرض نیست؛ اما اگر نتوان محیط برنامهنویسی را طوری اصلاح کرد که این نویسهها را متمایز نمایش دهد، ممکن است به عنوان یک قرارداد کدنویسی محلی مفید باشد..IP -Wno-attribute-warning 4 درباره استفاده از توابعی که با صفت "warning" اعلان شدهاند هشدار داده نشود. بهطور پیشفرض، این هشدار فعال است. میتوان از -Wno-attribute-warning برای غیرفعال کردن هشدار، یا از -Wno-error=attribute-warning برای جلوگیری از خطا شدن آن در هنگام کامپایل با پرچم -Werror استفاده کرد.
- -Wno-deprecated
- درباره
استفاده از
قابلیتهای
منسوخشده
(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
- اگر به یک
ساختار (structure)
صفت packed
اختصاص
داده شده
باشد، اما
این صفت هیچ
تاثیری بر
ساختاربندی
یا اندازه
ساختار
نداشته
باشد،
هشدار داده
شود. چنین
ساختارهایی
ممکن است در
ازای فایده
اندک دچار
ناترازی
شوند. برای
مثال، در
این کد،
متغیر
"f.x" در
"struct bar"
ناتراز است
حتی با
اینکه خود
"struct bar" صفت
packed را ندارد:
struct foo { int x; char a, b, c, d; } __attribute__((packed)); struct bar { char z; struct foo f; }; - -Wnopacked-bitfield-compat
- سریهای
۴.۱، ۴.۲ و ۴.۳
کامپایلر GCC
صفت "packed"
را روی
میدانهای
بیتی از نوع
"char"
نادیده
میگیرند.
این مورد در
GCC 4.4 رفع شد،
اما این
تغییر
میتواند
منجر به
تفاوت در
ساختاربندی
ساختار شود.
کامپایلر GCC
زمانی که
آفست چنین
فیلدی در GCC 4.4
تغییر کرده
باشد به شما
اطلاع
میدهد.
برای مثال
دیگر یک
پدینگ (padding) ۴
بیتی بین
فیلد "a"
و "b" در
این ساختار
وجود ندارد:
struct foo { char a:4; char b:8; } __attribute__ ((packed));این هشدار بهطور پیشفرض فعال است. از -Wno-packed-bitfield-compat برای غیرفعال کردن این هشدار استفاده کنید.
- -Wpacked-not-aligned (فقط C، C++، Objective-C و Objective-C++)
- اگر فیلدی
از ساختار
با تراز
مشخصشدهی
صریح در یک 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 برای پردازنده مقصد، و گاهی به صورت یک بازه در صورت بهینهسازی برای یک مقصد عمومی تنظیم میشوند. بنابراین تمام واحدهای ترجمه که برای استفاده از این متغیرها به سازگاری ABI وابسته هستند باید با همان -mtune (یا -mcpu) کامپایل شوند.
اگر پایداری ABI اهمیت دارد، مانند زمانی که کاربرد آن در سرآیند یک کتابخانه است، احتمالاً اصلاً نباید از متغیرهای اندازه تداخل سختافزاری استفاده کنید. در غیر این صورت، میتوانید با --param یک مقدار خاص را تحمیل کنید.
اگر اطمینان دارید که استفاده شما از این متغیر بر ABI در خارج از یک ساخت مجزای پروژهتان تأثیر نمیگذارد، میتوانید با -Wno-interference-size این هشدار را غیرفعال کنید..IP -Wint-in-bool-context 4 دربارهٔ استفادهٔ مشکوک از مقادیر عدد صحیح در جاهایی که مقادیر بولی مورد انتظار است هشدار میدهد؛ مانند عبارات شرطی (?:) با استفاده از ثابتهای صحیح غیربولی در بافتار بولی، مثل "if (a <= b ? 2 : 3)". یا شیفت به چپ اعداد صحیح علامتدار در بافتار بولی، مانند "for (a = 0; 1 << a; a++);". همچنین برای همهٔ انواع ضرب بدون در نظر گرفتن نوع داده. این هشدار توسط -Wall فعال میشود.
- -Wno-int-to-pointer-cast
- هشدارهای ناشی از تبدیل نوع (cast) یک عدد صحیح با اندازهٔ متفاوت به نوع اشارهگر را نادیده میگیرد. در C++، تبدیل نوع به یک نوع اشارهگر با اندازهٔ کوچکتر یک خطا محسوب میشود. Wint-to-pointer-cast بهطور پیشفرض فعال است.
- -Wno-pointer-to-int-cast (تنها در C و Objective-C)
- هشدارهای ناشی از تبدیل نوع (cast) از یک اشارهگر به نوع عدد صحیح با اندازهٔ متفاوت را نادیده میگیرد.
- -Winvalid-pch
- اگر یک سرآیند پیشکامپایلشده (precompiled header) در مسیر جستجو یافت شود اما قابل استفاده نباشد، هشدار میدهد.
- -Winvalid-utf8
- اگر یک نویسهٔ نامعتبر UTF-8 یافت شود، هشدار میدهد. این هشدار بهطور پیشفرض برای C++23 در صورت استفاده از -finput-charset=UTF-8 فعال است و با -pedantic-errors به خطا تبدیل میشود.
- -Wno-unicode
- فرمهای نامعتبر توالیهای گریز (escape sequences) محدودشده یا نامگذاریشده را که بهعنوان توکنهای مجزا در نظر گرفته میشوند، عیبیابی نمیکند. Wunicode بهطور پیشفرض فعال است.
- -Wlong-long
- در صورت
استفاده از
نوع "long long"
هشدار
میدهد. این
گزینه توسط
هر یک از
گزینههای
-Wpedantic یا -Wtraditional در
حالتهای ISO C90
و C++98 فعال
میشود.
برای
جلوگیری از
پیامهای
هشدار، از
-Wno-long-long
استفاده
کنید.
این هشدار با -pedantic-errors به یک خطا ارتقا مییابد.
- -Wvariadic-macros
- در صورت استفاده از ماکروهای با تعداد آرگومان متغیر (variadic macros) در حالت ISO C90، یا در صورت استفاده از نحو جایگزین GNU در حالت ISO C99، هشدار میدهد. این گزینه توسط -Wpedantic یا -Wtraditional فعال میشود. برای جلوگیری از پیامهای هشدار، از -Wno-variadic-macros استفاده کنید.
- -Wno-varargs
- در صورت استفادهٔ مشکوک از ماکروهای مورد استفاده برای مدیریت آرگومانهای متغیر مانند "va_start" هشدار نمیدهد. این هشدارها بهطور پیشفرض فعال هستند.
- -Wvector-operation-performance
- اگر عملیات برداری از طریق قابلیتهای SIMD معماری پیادهسازی نشده باشد، هشدار میدهد. عمدتاً برای بهینهسازی کارایی سودمند است. عملیات برداری میتواند بهصورت "piecewise" (تکهبهتکه) پیادهسازی شود، به این معنی که عملیات اسکالر روی هر یک از عناصر بردار انجام میشود؛ "in parallel" (موازی)، به این معنی که عملیات برداری با استفاده از اسکالرهای نوع پهنتر پیادهسازی میشود که معمولاً از نظر کارایی بهینهتر است؛ و "as a single scalar" (بهصورت یک اسکالر منفرد)، به این معنی که بردار در یک نوع اسکالر جای میگیرد.
- -Wvla
- اگر یک
آرایه با
طول متغیر
(variable-length array) در کد
استفاده
شود، هشدار
میدهد.
گزینهٔ -Wno-vla
از هشدار
-Wpedantic دربارهٔ
آرایههای
با طول
متغیر
جلوگیری
میکند.
این هشدار با -pedantic-errors به یک خطا ارتقا مییابد.
- -Wvla-larger-than=byte-size
- اگر از این
گزینه
استفاده
شود،
کامپایلر
برای
اعلانهای
آرایههای
با طول
متغیری که
اندازهٔ
آنها یا
نامحدود
است، یا
توسط
آرگومانی
محدود شده
که اجازه
میدهد
اندازهٔ
آرایه از byte-size
بایت فراتر
رود، هشدار
میدهد. این
عملکرد
مشابه
نحوهٔ
کارکرد
-Walloca-larger-than=byte-size
است، اما
برای
آرایههای
با طول
متغیر
اعمال
میشود.
توجه داشته باشید که GCC ممکن است آرایههای کوچک با طول متغیر با مقدار مشخص را به آرایههای معمولی بهینهسازی کند، بنابراین این هشدار ممکن است برای چنین آرایههایی صادر نشود.
گزینهٔ -Wvla-larger-than=PTRDIFF_MAX بهطور پیشفرض فعال است اما معمولاً تنها زمانی اثرگذار است که -ftree-vrp فعال باشد (پیشفرض برای -O2 و بالاتر).
همچنین ببینید: -Walloca-larger-than=byte-size.
- -Wno-vla-larger-than
- هشدارهای -Wvla-larger-than= را غیرفعال میکند. این گزینه معادل -Wvla-larger-than=SIZE_MAX یا بزرگتر است.
- -Wvla-parameter
- دربارهٔ
اعلانهای
مجدد
توابعی که
شامل
آرگومانهایی
از انواع
آرایه با
طول متغیر (VLA)
با انواع یا
فرمهای
ناسازگار
هستند
هشدار
میدهد، و
تشخیص
دسترسیهای
خارج از
محدوده به
چنین
پارامترهایی
را از طریق
هشدارهایی
مانند -Warray-bounds
فعال
میکند.
اگر نخستین اعلان تابع از فرم VLA استفاده کند، کران مشخصشده در آرایه بهعنوان حداقل تعداد عنصرهایی که انتظار میرود در فراخوانیهای تابع ارائه شوند و حداکثر تعداد عنصرهایی که توسط آن دسترسی مییابند فرض میشود. ناتوانی در ارائهٔ آرگومانهایی با اندازهٔ کافی یا دسترسی به بیش از حداکثر تعداد عناصر ممکن است گزارش شود.
برای مثال، این هشدار برای اعلانهای مجدد زیر صادر میشود زیرا اعلان اول اجازه میدهد آرایهای با هر اندازهای به "f" ارسال شود در حالی که اعلان دوم مشخص میکند آرگومان آرایه باید حداقل شامل "n" عنصر باشد. علاوه بر این، فراخوانی "f" با پارامتر کران VLA مرتبط فراتر از کران واقعی VLA نیز موجب هشدار میشود.
void f (int n, int[n]); // warning: argument 2 previously declared as a VLA void f (int, int[]); void g (int n) { if (n > 4) return; int a[n]; // warning: access to a by f may be out of bounds f (sizeof a, a); ... }گزینهٔ -Wvla-parameter در -Wall گنجانده شده است. گزینهٔ -Warray-parameter برای مشکلات مشابه مرتبط با آرگومانهای آرایهٔ معمولی هشدار میدهد.
- -Wvolatile-register-var
- اگر یک متغیر ثبات (register) بهصورت volatile اعلان شده باشد، هشدار میدهد. اصلاحکنندهٔ volatile از تمام بهینهسازیهایی که ممکن است خواندن و/یا نوشتن روی متغیرهای ثبات را حذف کنند جلوگیری نمیکند. این هشدار توسط -Wall فعال میشود.
- -Wno-xor-used-as-pow (تنها در C، C++، Objective-C و Objective-C++)
- هشدارهای
مربوط به
استفاده از
"^"،
عملگر XOR، را
در مواردی
که به نظر
میرسد
مقصود کد
توانرسانی
بوده است
غیرفعال
میکند.
بهطور
خاص، این
هشدار
زمانی رخ
میدهد که
سمت چپ ثابت
دهدهی 2 یا 10
باشد و سمت
راست نیز یک
ثابت
دهدهی
باشد.
در C و C++، عملگر "^" به معنای XOR است، در حالی که در برخی زبانهای دیگر (مانند TeX و برخی نسخههای BASIC) به معنای توانرسانی است.
این هشدار را میتوان با تبدیل یکی از عملوندها به هگزادسیمال و همچنین با کامپایل با گزینهٔ -Wno-xor-used-as-pow بیصدا کرد.
- -Wdisabled-optimization
- اگر یک گام بهینهسازی (optimization pass) درخواستشده غیرفعال شود، هشدار میدهد. این هشدار عموماً نشاندهندهٔ اشکالی در کد شما نیست؛ بلکه صرفاً بیانگر آن است که بهینهسازهای GCC قادر به پردازش کارآمد کد نیستند. اغلب، مشکل این است که کد شما بیش از حد بزرگ یا پیچیده است؛ GCC زمانی که خودِ فرایند بهینهسازی احتمالاً زمان بیش از حدی ببرد، از بهینهسازی برنامهها خودداری میکند.
- -Wpointer-sign (تنها در C و Objective-C)
- برای ارسال
یا انتساب
آرگومان
اشارهگر
با
علامتداری
(signedness) متفاوت،
هشدار
میدهد. این
گزینه فقط
برای C و Objective-C
پشتیبانی
میشود. این
هشدار
بهطور
ضمنی با -Wall و
-Wpedantic فعال
میشود، و
میتوان آن
را با -Wno-pointer-sign
غیرفعال
کرد.
این هشدار با -pedantic-errors به یک خطا ارتقا مییابد.
- -Wstack-protector
- این گزینه تنها زمانی که -fstack-protector فعال باشد اثرگذار است. این گزینه دربارهٔ توابعی که در برابر تخریب پشته (stack smashing) محافظت نشدهاند هشدار میدهد.
- -Woverlength-strings
- دربارهٔ
ثابتهای
رشتهای که
طولانیتر
از طول
«حداقل
حداکثر» (minimum maximum)
مشخصشده
در
استاندارد C
هستند
هشدار
میدهد.
کامپایلرهای
امروزی
عموماً به
ثابتهای
رشتهای
اجازه
میدهند
بسیار
طولانیتر
از حد مجاز
استاندارد
باشند، اما
برنامههایی
با قابلیت
حمل بالا
باید از
استفاده از
رشتههای
طولانیتر
خودداری
کنند.
این محدودیت پس از الحاق ثابتهای رشتهای اعمال میشود، و نویسهٔ تهی پایانی (NUL) را به حساب نمیآورد. در C90، این حد ۵۰۹ نویسه بود؛ در C99 به ۴۰۹۵ افزایش یافت. استاندارد C++98 یک حداقل حداکثر قانونی مشخص نکرده است، بنابراین رشتههای بیش از حد طولانی در C++ عیبیابی نمیشوند.
این گزینه بهطور ضمنی توسط -Wpedantic فعال میشود، و میتوان آن را با -Wno-overlength-strings غیرفعال کرد.
- -Wunsuffixed-float-constants (تنها در C و Objective-C)
- برای هر ثابت ممیز شناوری که پسوند ندارد، یک هشدار صادر میکند. هنگامی که همراه با -Wsystem-headers استفاده شود، دربارهٔ چنین ثابتهایی در فایلهای سرآیند سیستمی هشدار میدهد. این میتواند هنگام آمادهسازی کد برای استفاده با عملگر کاربردی (pragma) "FLOAT_CONST_DECIMAL64" از افزونهٔ ممیز شناور دهدهی برای C99 سودمند باشد..IP -Wno-lto-type-mismatch 4 در طول بهینهسازی زمان پیوند (LTO)، دربارهٔ عدم تطابق نوع در اعلانهای سراسری از واحدهای ترجمهٔ متفاوت هشدار نمیدهد. نیازمند فعال بودن -flto است. بهطور پیشفرض فعال است.
- -Wno-designated-init (تنها C و Objective-C)
- هنگامی که یک مقداردهیاولیهٔ موضعی برای مقداردهی اولیهٔ ساختاری که با مشخصهٔ "designated_init" علامتگذاری شده به کار میرود، از نمایش هشدارها جلوگیری میکند.
گزینههای واپایش تحلیل ایستا (Options That Control Static Analysis)
- -fanalyzer
- این گزینه
تحلیلی
ایستا از
جریان
برنامه را
فعال
میکند که
به دنبال
مسیرهای
میانروالهای
«جالب» در
طول کد
میگردد، و
برای
مشکلات
یافتشده
در آنها
هشدار صادر
میکند.
این تحلیل بسیار سنگینتر و هزینهبرتر از سایر هشدارهای GCC است.
از دیدگاه فنی، این گزینه اجرای نمادین مبتنی بر پوشش (coverage-guided symbolic execution) را روی کدی که کامپایل میشود انجام میدهد. این تحلیل نه صائب است و نه کامل: میتواند مثبت کاذب و منفی کاذب داشته باشد. این ابزار به جای اثبات درستی برنامه، ابزاری برای یافتن باگ است.
این تحلیلگر در این نگارش تنها برای استفاده روی کد C مناسب است.
فعال کردن این گزینه در عمل هشدارهای زیر را فعال میکند:
-Wanalyzer-allocation-size -Wanalyzer-deref-before-check -Wanalyzer-double-fclose -Wanalyzer-double-free -Wanalyzer-exposure-through-output-file -Wanalyzer-exposure-through-uninit-copy -Wanalyzer-fd-access-mode-mismatch -Wanalyzer-fd-double-close -Wanalyzer-fd-leak -Wanalyzer-fd-phase-mismatch -Wanalyzer-fd-type-mismatch -Wanalyzer-fd-use-after-close -Wanalyzer-fd-use-without-check -Wanalyzer-file-leak -Wanalyzer-free-of-non-heap -Wanalyzer-imprecise-fp-arithmetic -Wanalyzer-infinite-loop -Wanalyzer-infinite-recursion -Wanalyzer-jump-through-null -Wanalyzer-malloc-leak -Wanalyzer-mismatching-deallocation -Wanalyzer-null-argument -Wanalyzer-null-dereference -Wanalyzer-out-of-bounds -Wanalyzer-overlapping-buffers -Wanalyzer-possible-null-argument -Wanalyzer-possible-null-dereference -Wanalyzer-putenv-of-auto-var -Wanalyzer-shift-count-negative -Wanalyzer-shift-count-overflow -Wanalyzer-stale-setjmp-buffer -Wanalyzer-tainted-allocation-size -Wanalyzer-tainted-array-index -Wanalyzer-tainted-assertion -Wanalyzer-tainted-divisor -Wanalyzer-tainted-offset -Wanalyzer-tainted-size -Wanalyzer-undefined-behavior-ptrdiff -Wanalyzer-undefined-behavior-strtok -Wanalyzer-unsafe-call-within-signal-handler -Wanalyzer-use-after-free -Wanalyzer-use-of-pointer-in-stale-stack-frame -Wanalyzer-use-of-uninitialized-value -Wanalyzer-va-arg-type-mismatch -Wanalyzer-va-list-exhausted -Wanalyzer-va-list-leak -Wanalyzer-va-list-use-after-va-end -Wanalyzer-write-to-const -Wanalyzer-write-to-string-literal
این گزینه تنها در صورتی موجود است که GCC با فعال بودن پشتیبانی از analyzer پیکربندی شده باشد.
- -Wanalyzer-symbol-too-complex
- اگر -fanalyzer
فعال باشد،
تحلیلگر
از روشهای
اکتشافی
گوناگونی
برای
ردیابی
وضعیت
حافظه
استفاده
میکند،
اما کدهای
به اندازهٔ
کافی
پیچیده
میتوانند
این روشها
را ناکام
بگذارند.
بهطور پیشفرض، اگر مقادیر عبارتها از آستانهٔ تعیینشده توسط --param analyzer-max-svalue-depth=value فراتر رود، تحلیل بدون نمایش پیام ردیابی مقادیر عبارتها را متوقف کرده و برای چنین عبارتهایی به یک نمایش نادقیق بازمیگردد. گزینهٔ -Wanalyzer-symbol-too-complex در صورت رخداد این وضعیت هشدار میدهد.
- -Wanalyzer-too-complex
- اگر -fanalyzer
فعال باشد،
تحلیلگر
از روشهای
اکتشافی
گوناگونی
برای کاوش
جریان
واپایش و
جریان داده
در برنامه
استفاده
میکند،
اما کدهای
به اندازهٔ
کافی
پیچیده
میتوانند
این
تلاشها را
ناکام
بگذارند.
بهطور پیشفرض، اگر کد برای کاوش کامل تحلیلگر بیش از حد پیچیده باشد و به یک حد درونی برسد، تحلیل بدون اعلام متوقف میشود. گزینهٔ -Wanalyzer-too-complex در صورت رخداد این حالت هشدار میدهد.
- -Wno-analyzer-allocation-size
- این هشدار
نیازمند -fanalyzer
است که آن
را فعال
میکند؛
برای
غیرفعال
کردن آن از
-Wno-analyzer-allocation-size
استفاده
کنید.
این پیام تشخیصی برای مسیرهایی در کد هشدار میدهد که در آنها یک اشارهگر به بافر مقداردهی میشود تا به بافری با اندازهای اشاره کند که مضربی از "sizeof (*pointer)" نیست.
ببینید: CWE-131: Incorrect Calculation of Buffer Size ("https://cwe.mitre.org/data/definitions/131.html").
- -Wno-analyzer-deref-before-check
- این هشدار
نیازمند -fanalyzer
است که آن
را فعال
میکند؛
برای
غیرفعال
کردنش از
-Wno-analyzer-deref-before-check
استفاده
کنید.
این پیام تشخیصی برای مسیرهایی در کد هشدار میدهد که در آنها یک اشارهگر *پس از* اینکه از پیش ارجاعزدایی شده است، برای "NULL" بررسی میشود؛ که نشان میدهد ممکن بوده اشارهگر NULL باشد. چنین مواردی بیانگر آن است که بررسی برای NULL یا زائد است، یا اینکه باید به پیش از ارجاعزدایی اشارهگر منتقل شود.
این پیام تشخیصی همچنین مقادیر ارسالشده به آرگومان تابعی که با "__attribute__((nonnull))" علامتگذاری شده را نیازمند مقداری غیر NULL در نظر میگیرد، و بنابراین اگر چنین مقادیری پس از بازگشت از فراخوانی چنان تابعی برای "NULL" بررسی شوند، اخطار میدهد.
بعید است که این پیام تشخیصی هنگام فعال بودن هر سطحی از بهینهسازی گزارش شود، چرا که منطق بهینهسازی GCC معمولاً چنین بررسیهایی برای NULL را زائد در نظر میگیرد و پیش از آنکه تحلیلگر آنها را ببیند، با بهینهسازی حذفشان میکند. از این رو، هنگام تلاش برای برانگیختن این پیام تشخیصی، بهینهسازی باید غیرفعال باشد.
- -Wno-analyzer-double-fclose
- این هشدار
نیازمند -fanalyzer
است که آن
را فعال
میکند؛
برای
غیرفعال
کردن آن از
-Wno-analyzer-double-fclose
استفاده
کنید.
این پیام تشخیصی برای مسیرهایی در کد هشدار میدهد که در آنها ممکن است روی یک "FILE *" بیش از یک بار "fclose" فراخوانی شود.
ببینید: CWE-1341: Multiple Releases of Same Resource or Handle ("https://cwe.mitre.org/data/definitions/1341.html").
- -Wno-analyzer-double-free
- این هشدار
نیازمند -fanalyzer
است که آن
را فعال
میکند؛
برای
غیرفعال
کردن آن از
-Wno-analyzer-double-free
استفاده
کنید.
این پیام تشخیصی برای مسیرهایی در کد هشدار میدهد که در آنها ممکن است روی یک اشارهگر بیش از یک بار یک آزادساز فراخوانی شود؛ چه "free" باشد، یا یک تابع آزادسازی حافظه که با مشخصهٔ "malloc" ارجاع داده شده است.
ببینید: CWE-415: Double Free ("https://cwe.mitre.org/data/definitions/415.html").
- -Wno-analyzer-exposure-through-output-file
- این هشدار
نیازمند -fanalyzer
است که آن
را فعال
میکند؛
برای
غیرفعال
کردن آن از
-Wno-analyzer-exposure-through-output-file
استفاده
کنید.
این پیام تشخیصی برای مسیرهایی در کد هشدار میدهد که در آنها یک مقدار حساس امنیتی درون یک فایل خروجی نوشته میشود (مانند نوشتن یک گذرواژه در فایل لاگ).
ببینید: CWE-532: Information Exposure Through Log Files ("https://cwe.mitre.org/data/definitions/532.html").
- -Wanalyzer-exposure-through-uninit-copy
- این هشدار
هم نیازمند
-fanalyzer و هم
نیازمند
استفاده از
یک افزونه
برای مشخص
کردن تابعی
است که از
میان یک
«مرز
اعتماد»
رونوشتبرداری
میکند.
برای
غیرفعال
کردن آن از
-Wno-analyzer-exposure-through-uninit-copy
استفاده
کنید.
این پیام تشخیصی دربارهٔ «نشت اطلاعات» (infoleaks) هشدار میدهد - مسیرهایی در کد که در آنها مقادیر مقداردهینشده از یک مرز امنیتی رونوشت میشوند (مانند کدی در هستهٔ سیستمعامل که یک ساختار (struct) با مقداردهی ناقص روی پشته را به فضای کاربری کپی میکند).
ببینید: CWE-200: Exposure of Sensitive Information to an Unauthorized Actor ("https://cwe.mitre.org/data/definitions/200.html").
- -Wno-analyzer-fd-access-mode-mismatch
- این هشدار
نیازمند -fanalyzer
است که آن
را فعال
میکند؛
برای
غیرفعال
کردن آن از
-Wno-analyzer-fd-access-mode-mismatch
استفاده
کنید.
این پیام تشخیصی برای مسیرهایی در کد هشدار میدهد که در آنها تلاشی برای "read" روی یک توصیفگر فایل فقطنوشتنی صورت میگیرد، یا برعکس.
این پیام تشخیصی همچنین برای مسیرهایی در کد هشدار میدهد که در آنها تابعی با مشخصهٔ "fd_arg_read (N)" با توصیفگر فایلی که با "O_WRONLY" باز شده در آرگومان ارجاعشدهٔ "N" فراخوانی شود، یا تابعی با مشخصهٔ "fd_arg_write (N)" با توصیفگر فایلی که با "O_RDONLY" باز شده در آرگومان ارجاعشدهٔ N فراخوانی گردد..IP -Wno-analyzer-fd-double-close 4 این هشدار نیازمند -fanalyzer است که آن را فعال میکند؛ برای غیرفعال کردن آن از -Wno-analyzer-fd-double-close استفاده کنید.
این پیام تشخیصی درباره مسیرهایی از کد که در آنها ممکن است یک توصیفگر فایل بیش از یک بار بسته شود هشدار میدهد.
ببینید: CWE-1341: Multiple Releases of Same Resource or Handle ("https://cwe.mitre.org/data/definitions/1341.html").
- -Wno-analyzer-fd-leak
- این هشدار
نیازمند -fanalyzer
است که آن
را فعال
میکند؛
برای
غیرفعال
کردن آن از
-Wno-analyzer-fd-leak
استفاده
کنید.
این پیام تشخیصی برای مسیرهایی در کد که در آنها یک توصیفگر فایلِ باز نشت پیدا میکند هشدار میدهد.
ببینید: CWE-775: Missing Release of File Descriptor or Handle after Effective Lifetime ("https://cwe.mitre.org/data/definitions/775.html").
- -Wno-analyzer-fd-phase-mismatch
- این هشدار
نیازمند -fanalyzer
است که آن
را فعال
میکند؛
برای
غیرفعال
کردن آن از
-Wno-analyzer-fd-phase-mismatch
استفاده
کنید.
این پیام تشخیصی درباره مسیرهایی از کد هشدار میدهد که در آنها عملیاتی در فاز نادرستی از چرخه حیات توصیفگر فایل صورت میگیرد. برای نمونه، درباره تلاش برای فراخوانی "accept" روی یک سوکت جریانی (stream socket) که هنوز "listen" با موفقیت روی آن فراخوانی نشده است، هشدار خواهد داد.
ببینید: CWE-666: Operation on Resource in Wrong Phase of Lifetime ("https://cwe.mitre.org/data/definitions/666.html").
- -Wno-analyzer-fd-type-mismatch
- این هشدار
نیازمند -fanalyzer
است که آن
را فعال
میکند؛
برای
غیرفعال
کردن آن از
-Wno-analyzer-fd-type-mismatch
استفاده
کنید.
این پیام تشخیصی برای مسیرهایی از کد که در آنها عملیاتی روی نوع نادرستی از توصیفگر فایل انجام میشود هشدار میدهد. برای نمونه، در صورت تلاش برای انجام عملیاتهای سوکت روی یک توصیفگر فایل به دست آمده از طریق "open"، یا تلاش برای انجام عملیات سوکت جریانی روی یک سوکت دیتاگرام (datagram socket)، هشدار میدهد.
- -Wno-analyzer-fd-use-after-close
- این هشدار
نیازمند -fanalyzer
است که آن
را فعال
میکند؛
برای
غیرفعال
کردن آن از
-Wno-analyzer-fd-use-after-close
استفاده
کنید.
این پیام تشخیصی درباره مسیرهایی از کد که در آنها یک فراخوانی خواندن یا نوشتن روی یک توصیفگر فایلِ بسته انجام میشود هشدار میدهد.
همچنین این پیام تشخیصی برای مسیرهایی از کد هشدار میدهد که در آنها تابعی با مشخصه "fd_arg (N)" یا "fd_arg_read (N)" یا "fd_arg_write (N)" به همراه یک توصیفگر فایل بسته در آرگومان ارجاعشده "N" فراخوانی شود.
- -Wno-analyzer-fd-use-without-check
- این هشدار
نیازمند -fanalyzer
است که آن
را فعال
میکند؛
برای
غیرفعال
کردن آن از
-Wno-analyzer-fd-use-without-check
استفاده
کنید.
این پیام تشخیصی درباره مسیرهایی در کد که در آنها از یک توصیفگر فایل بدون بررسی معتبر بودن آن استفاده شده است هشدار میدهد.
همچنین این پیام تشخیصی درباره مسیرهایی از کد هشدار میدهد که در آنها تابعی با مشخصه "fd_arg (N)" یا "fd_arg_read (N)" یا "fd_arg_write (N)" همراه با یک توصیفگر فایل در آرگومان ارجاعشده "N"، بدون اعتبارسنجی آن فراخوانی شود.
- -Wno-analyzer-file-leak
- این هشدار
نیازمند -fanalyzer
است که آن
را فعال
میکند؛
برای
غیرفعال
کردن آن از
-Wno-analyzer-file-leak
استفاده
کنید.
این پیام تشخیصی برای مسیرهایی از کد که در آنها شیء جریانِ "FILE *" از "<stdio.h>" نشت میکند هشدار میدهد.
ببینید: CWE-775: Missing Release of File Descriptor or Handle after Effective Lifetime ("https://cwe.mitre.org/data/definitions/775.html").
- -Wno-analyzer-free-of-non-heap
- این هشدار
نیازمند -fanalyzer
است که آن
را فعال
میکند؛
برای
غیرفعال
کردن آن از
-Wno-analyzer-free-of-non-heap
استفاده
کنید.
این پیام تشخیصی برای مسیرهایی از کد که در آنها "free" روی اشارهگری غیر از حافظه هیپ (مانند بافری روی پشته، یا یک متغیر سراسری) فراخوانی میشود، هشدار میدهد.
ببینید: 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
استفاده
کنید.
این پیام تشخیصی برای مسیرهایی از کد که به نظر میرسد به یک حلقه بینهایت منجر میشوند هشدار میدهد.
بهطور مشخص، تحلیلگر زمانی این هشدار را صادر میکند که حلقهای را ببیند که در آن:
- هیچ کار قابلمشاهدهای از بیرون در داخل حلقه انجام نشود
- هیچ راهی برای خروج از حلقه وجود نداشته باشد
- تحلیلگر به اندازه کافی درباره وضعیت برنامه در طول حلقه اطمینان داشته باشد که موارد فوق صادق هستند
یکی از شرایط صدور این هشدار زمانی است که یک مسیر اجرایی در حلقه وجود داشته باشد که پیمایش آن در یک دور بدین معنا باشد که در تمام دورهای بعدی نیز همان مسیر پیموده خواهد شد.
به عنوان مثال، قطعهکد زیر را در نظر بگیرید:
while (1)
{
char opcode = *cpu_state.pc;
switch (opcode)
{
case OPCODE_FOO:
handle_opcode_foo (&cpu_state);
break;
case OPCODE_BAR:
handle_opcode_bar (&cpu_state);
break;
}
}
تحلیلگر در مورد بالا هشدار خواهد داد زیرا اگر "opcode" با هیچیک از حالتها مطابقت نداشته باشد، دستور "switch" حالتِ ضمنی "default" را طی میکند و بدنه حلقه را به یک دستور بیاثر (no-op) با مقدار تغییرنیافته "cpu_state.pc" تبدیل میکند، و در نتیجه در تمام دورهای بعدی همان مقدار "opcode" استفاده شده و منجر به یک حلقه بینهایت میشود.
ببینید: CWE-835: Loop with Unreachable Exit Condition ('Infinite Loop') ("https://cwe.mitre.org/data/definitions/835.html").
- -Wno-analyzer-infinite-recursion
- این هشدار
نیازمند -fanalyzer
است که آن
را فعال
میکند؛
برای
غیرفعال
کردن آن از
-Wno-analyzer-infinite-recursion
استفاده
کنید.
این پیام تشخیصی درباره مسیرهایی از کد که به نظر میرسد به یک بازگشت بینهایت منجر میشوند هشدار میدهد.
بهطور مشخص، هنگامی که تحلیلگر یک فراخوانی بازگشتی را میبیند، وضعیت حافظه در بدو ورود به فریم جدید را با وضعیت ورود به فریم قبلی آن تابع روی پشته مقایسه میکند. اگر به نظر برسد هیچ چیز در حافظه تغییر نمیکند، هشدار صادر میشود؛ فرض بر این است که هرگونه تغییرِ دیدهشده در پارامترها یا متغیرهای سراسری باعث خاتمه بازگشت میشود و در نتیجه از صدور هشدار جلوگیری میکند.
این پیام تشخیصی به احتمال زیاد مواردی از بازگشت بینهایت را که پیش از دیدهشدن توسط تحلیلگر، توسط بهینهساز به تکرار (حلقه) تبدیل شدهاند از دست میدهد. از این رو، هنگام تلاش برای فعالسازی این پیام تشخیصی، باید بهینهسازی غیرفعال باشد.
با -Winfinite-recursion مقایسه شود، که پیام تشخیصی مشابهی ارائه میدهد، اما به روش دیگری پیادهسازی شده است.
ببینید: CWE-674: Uncontrolled Recursion ("https://cwe.mitre.org/data/definitions/674.html").
- -Wno-analyzer-jump-through-null
- این هشدار
نیازمند -fanalyzer
است که آن
را فعال
میکند؛
برای
غیرفعال
کردن آن از
-Wno-analyzer-jump-through-null
استفاده
کنید.
این پیام تشخیصی درباره مسیرهایی از کد هشدار میدهد که در آنها یک اشارهگر تابع "NULL" فراخوانی میشود..IP -Wno-analyzer-malloc-leak 4 این هشدار نیازمند -fanalyzer است که آن را فعال میکند؛ برای غیرفعالسازی آن از -Wno-analyzer-malloc-leak استفاده کنید.
این پیام تشخیصی درباره مسیرهایی از کد هشدار میدهد که در آنها اشارهگری که توسط یک تخصیصدهنده حافظه تخصیص یافته، نشت پیدا میکند: چه "malloc"، و چه تابعی که با صفت "malloc" علامتگذاری شده باشد.
ببینید: CWE-401: Missing Release of Memory after Effective Lifetime ("https://cwe.mitre.org/data/definitions/401.html").
- -Wno-analyzer-mismatching-deallocation
- این هشدار
نیازمند -fanalyzer
است که آن
را فعال
میکند؛
برای
غیرفعالسازی
آن از
-Wno-analyzer-mismatching-deallocation
استفاده
کنید.
این پیام تشخیصی درباره مسیرهایی از کد هشدار میدهد که در آنها تابع آزادسازی نادرستی بر روی یک مقدار اشارهگر فراخوانی شده است، بر اساس اینکه کدام تابع برای تخصیص آن مقدار اشارهگر به کار رفته بود. این پیام تشخیصی عدم تطابق بین "free"، عملگر اسکالر "delete" و عملگر برداری "delete[]"، و مواردی که با استفاده از صفت "malloc" به عنوان جفتهای تخصیصدهنده/آزادساز علامتگذاری شدهاند را هشدار میدهد.
ببینید: CWE-762: Mismatched Memory Management Routines ("https://cwe.mitre.org/data/definitions/762.html").
- -Wno-analyzer-out-of-bounds
- این هشدار
نیازمند -fanalyzer
است که آن
را فعال
میکند؛
برای
غیرفعالسازی
آن از -Wno-analyzer-out-of-bounds
استفاده
کنید.
این پیام تشخیصی درباره مسیرهایی از کد هشدار میدهد که در آنها قطعا یک بافر فراتر از محدوده مجاز (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 بودن، دیرفرنس (dereference) میشود.
ببینید: CWE-690: Unchecked Return Value to NULL Pointer Dereference ("https://cwe.mitre.org/data/definitions/690.html").
- -Wno-analyzer-null-argument
- این هشدار
نیازمند -fanalyzer
است که آن
را فعال
میکند؛
برای
غیرفعالسازی
آن از -Wno-analyzer-null-argument
استفاده
کنید.
این پیام تشخیصی درباره مسیرهایی از کد هشدار میدهد که در آنها مقداری که مشخصاً NULL است، به آرگومان تابعی ارسال میشود که با "__attribute__((nonnull))" به عنوان آرگومانی که نیازمند مقدار غیر-NULL است، علامتگذاری شده است.
ببینید: CWE-476: NULL Pointer Dereference ("https://cwe.mitre.org/data/definitions/476.html").
- -Wno-analyzer-null-dereference
- این هشدار
نیازمند -fanalyzer
است که آن
را فعال
میکند؛
برای
غیرفعالسازی
آن از -Wno-analyzer-null-dereference
استفاده
کنید.
این پیام تشخیصی درباره مسیرهایی از کد هشدار میدهد که در آنها مقداری که مشخصاً NULL است، دیرفرنس (dereference) میشود.
ببینید: 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 variable) یا یک بافر روی پشته (on-stack) به آن ارسال میشود.
ببینید: POS34-C. Do not call putenv() with a pointer to an automatic variable as the argument ("https://wiki.sei.cmu.edu/confluence/x/6NYxBQ").
- -Wno-analyzer-shift-count-negative
- این هشدار
نیازمند -fanalyzer
است که آن
را فعال
میکند؛
برای
غیرفعالسازی
آن از
-Wno-analyzer-shift-count-negative
استفاده
کنید.
این پیام تشخیصی درباره مسیرهایی از کد هشدار میدهد که در آنها تلاش شده یک شیفت (shift) با تعداد منفی انجام گیرد. این پیام مشابه هشدار -Wshift-count-negative است که در فرانتاند C/C++ پیادهسازی شده، اما به جای تجزیه صِرف درخت نحو (syntax tree)، بر اساس تحلیل مسیرهای میانرویهای (interprocedural) پیادهسازی شده است. با این حال، تحلیلگر اولویتی برای تشخیص چنین مسیرهایی قائل نمیشود، بنابراین در مقایسه با سایر هشدارها احتمال منفی کاذب (false negative) بیشتر است.
- -Wno-analyzer-shift-count-overflow
- این هشدار
نیازمند -fanalyzer
است که آن
را فعال
میکند؛
برای
غیرفعالسازی
آن از
-Wno-analyzer-shift-count-overflow
استفاده
کنید.
این پیام تشخیصی درباره مسیرهایی از کد هشدار میدهد که در آنها تلاش شده یک شیفت با تعدادی بزرگتر یا مساوی دقت نوع عملوند (operand's type) انجام گیرد. این پیام مشابه هشدار -Wshift-count-overflow است که در فرانتاند C/C++ پیادهسازی شده، اما به جای تجزیه صِرف درخت نحو، بر اساس تحلیل مسیرهای میانرویهای پیادهسازی شده است. با این حال، تحلیلگر اولویتی برای تشخیص چنین مسیرهایی قائل نمیشود، بنابراین در مقایسه با سایر هشدارها احتمال منفی کاذب بیشتر است.
- -Wno-analyzer-stale-setjmp-buffer
- این هشدار
نیازمند -fanalyzer
است که آن
را فعال
میکند؛
برای
غیرفعالسازی
آن از -Wno-analyzer-stale-setjmp-buffer
استفاده
کنید.
این پیام تشخیصی درباره مسیرهایی از کد هشدار میدهد که در آنها "longjmp" برای بازگشت به یک "jmp_buf" مربوط به یک فراخوانی "setjmp" در تابعی فراخوانی میشود که قبلاً بازگشته است.
هنگامی که "setjmp" بر روی یک "jmp_buf" فراخوانی میشود تا موقعیت بازگشت را ثبت کند، فریم پشته (stack frame) را ثبت میکند. فریم پشته با بازگشت تابعی که شامل فراخوانی "setjmp" است، نامعتبر میشود. تلاش برای بازگشت به آن از طریق "longjmp" به فریم پشتهای ارجاع خواهد داد که دیگر وجود ندارد، و به احتمال زیاد به از کار افتادن برنامه (یا پیامدهای بدتر) منجر میشود.
- -Wno-analyzer-tainted-allocation-size
- این هشدار
نیازمند -fanalyzer
است که آن
را فعال
میکند؛
برای
غیرفعالسازی
آن از
-Wno-analyzer-tainted-allocation-size
استفاده
کنید.
این پیام تشخیصی درباره مسیرهایی از کد هشدار میدهد که در آنها مقداری که ممکن است تحت کنترل یک مهاجم باشد، بدون پاکسازی یا اعتبارسنجی شدن به عنوان اندازه یک تخصیص حافظه استفاده میشود، بهگونهای که مهاجم میتواند یک تخصیص اندازه بیش از حد بزرگ را تزریق کرده و بالقوه موجب بروز یک حمله محرومسازی از سرویس (DoS) شود.
ببینید: CWE-789: Memory Allocation with Excessive Size Value ("https://cwe.mitre.org/data/definitions/789.html").
- -Wno-analyzer-tainted-assertion
- این هشدار
نیازمند -fanalyzer
است که آن
را فعال
میکند؛
برای
غیرفعالسازی
آن از -Wno-analyzer-tainted-assertion
استفاده
کنید.
این پیام تشخیصی درباره مسیرهایی از کد هشدار میدهد که در آنها مقداری که ممکن است تحت کنترل یک مهاجم باشد، بدون اینکه ابتدا پاکسازی یا اعتبارسنجی شود، به عنوان بخشی از یک شرط استفاده میشود، و آن شرط از فراخوانی تابعی که با صفت "noreturn" علامتگذاری شده است (مانند تابع "__builtin_unreachable") محافظت میکند. چنین توابعی معمولاً نشاندهنده خاتمه غیرعادی برنامه هستند، مانند گردانندههای شکست تأییدیه (assertion failure). به عنوان مثال: assert (some_tainted_value < SOME_LIMIT);
در چنین مواردی:
- هنگامی که بررسی اعتبارسنجی (assertion-checking) فعال باشد: یک مهاجم میتواند با تزریق یک شکست اعتبارسنجی، باعث بروز منع خدمت (denial of service) شود
- هنگامی که بررسی اعتبارسنجی غیرفعال باشد، مانند تعریف "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
استفاده
کنید.
این پیام تشخیصی در مورد مسیرهایی در کد هشدار میدهد که در آنها مقداری که میتواند تحت کنترل یک مهاجم باشد، بدون پاکسازی به عنوان مقسومعلیه در یک عملیات تقسیم یا باقیمانده استفاده شده است، به طوری که یک مهاجم میتواند یک تقسیم بر صفر تزریق کند.
ببینید: CWE-369: Divide By Zero ("https://cwe.mitre.org/data/definitions/369.html").
- -Wno-analyzer-tainted-offset
- این هشدار
به -fanalyzer نیاز
دارد که آن
را فعال
میکند؛
برای
غیرفعال
کردن آن از
-Wno-analyzer-tainted-offset
استفاده
کنید.
این پیام تشخیصی در مورد مسیرهایی در کد هشدار میدهد که در آنها مقداری که میتواند تحت کنترل یک مهاجم باشد، بدون پاکسازی به عنوان آفست یک اشارهگر استفاده شده است، به طوری که یک مهاجم میتواند یک دسترسی خارج از محدوده تزریق کند.
ببینید: CWE-823: Use of Out-of-range Pointer Offset ("https://cwe.mitre.org/data/definitions/823.html").
- -Wno-analyzer-tainted-size
- این هشدار
به -fanalyzer نیاز
دارد که آن
را فعال
میکند؛
برای
غیرفعال
کردن آن از
-Wno-analyzer-tainted-size
استفاده
کنید.
این پیام تشخیصی در مورد مسیرهایی در کد هشدار میدهد که در آنها مقداری که میتواند تحت کنترل یک مهاجم باشد، بدون پاکسازی به عنوان اندازه یک عملیات مانند "memset" استفاده شده است، به طوری که یک مهاجم میتواند یک دسترسی خارج از محدوده تزریق کند.
ببینید: CWE-129: Improper Validation of Array Index ("https://cwe.mitre.org/data/definitions/129.html").
- -Wno-analyzer-undefined-behavior-ptrdiff
- این هشدار
به -fanalyzer نیاز
دارد، که آن
را فعال
میکند؛
برای
غیرفعال
کردن آن از
-Wno-analyzer-undefined-behavior-ptrdiff
استفاده
کنید.
این پیام تشخیصی در مورد مسیرهایی در کد هشدار میدهد که در آنها تفریق اشارهگر رخ میدهد در حالی که اشارهگرها به بلوکهای متفاوتی از حافظه ارجاع دارند. چنین کدی به رفتار تعریفنشده متکی است، چرا که تفریق اشارهگر تنها برای مواردی تعریف شده است که هر دو اشارهگر به داخل (یا دقیقاً بلافاصله بعد از) یک آرایه اشاره کنند.
ببینید: CWE-469: Use of Pointer Subtraction to Determine Size ("https://cwe.mitre.org/data/definitions/469.html").
- -Wno-analyzer-undefined-behavior-strtok
- این هشدار
به -fanalyzer نیاز
دارد، که آن
را فعال
میکند؛
برای
غیرفعال
کردن آن از
-Wno-analyzer-undefined-behavior-strtok
استفاده
کنید.
این پیام تشخیصی در مورد مسیرهایی در کد هشدار میدهد که در آنها فراخوانی "strtok" با رفتار تعریفنشده انجام میشود.
به طور مشخص، ارسال NULL به عنوان پارامتر اول در فراخوانی اولیه "strtok" در یک فرایند، دارای رفتار تعریفنشده است.
- -Wno-analyzer-unsafe-call-within-signal-handler
- این هشدار
به -fanalyzer نیاز
دارد، که آن
را فعال
میکند؛
برای
غیرفعال
کردن آن از
-Wno-analyzer-unsafe-call-within-signal-handler
استفاده
کنید.
این پیام تشخیصی در مورد مسیرهایی در کد هشدار میدهد که در آنها تابعی که به عنوان ناامن در برابر سیگنال ناهمگام (async-signal-unsafe) شناخته میشود (مانند "fprintf")، از داخل یک گرداننده سیگنال فراخوانی شده است.
ببینید: CWE-479: Signal Handler Use of a Non-reentrant Function ("https://cwe.mitre.org/data/definitions/479.html").
- -Wno-analyzer-use-after-free
- این هشدار
به -fanalyzer نیاز
دارد، که آن
را فعال
میکند؛
برای
غیرفعال
کردن آن از
-Wno-analyzer-use-after-free
استفاده
کنید.
این پیام تشخیصی در مورد مسیرهایی در کد هشدار میدهد که در آنها یک اشارهگر پس از فراخوانی یک تابع آزادساز روی آن، مورد استفاده قرار میگیرد: چه "free"، یا یک آزادساز که با صفت "malloc" مشخص شده باشد.
ببینید: CWE-416: Use After Free ("https://cwe.mitre.org/data/definitions/416.html").
- -Wno-analyzer-use-of-pointer-in-stale-stack-frame
- این هشدار
به -fanalyzer نیاز
دارد، که آن
را فعال
میکند؛
برای
غیرفعال
کردن آن از
-Wno-analyzer-use-of-pointer-in-stale-stack-frame
استفاده
کنید.
این پیام تشخیصی در مورد مسیرهایی در کد هشدار میدهد که در آنها اشارهگری که به یک متغیر در قاب پشته منقضیشده (stale stack frame) اشاره دارد، بازارجاع میشود.
- -Wno-analyzer-va-arg-type-mismatch
- این هشدار
به -fanalyzer نیاز
دارد، که آن
را فعال
میکند؛
برای
غیرفعال
کردن آن از
-Wno-analyzer-va-arg-type-mismatch
استفاده
کنید.
این پیام تشخیصی برای مسیرهای بینروالی در کد هشدار میدهد که تحلیلگر در آنها تلاشی برای استفاده از "va_arg" جهت استخراج مقداری که به یک فراخوانی با آرگومانهای متغیر ارسال شده شناسایی میکند، اما از نوعی استفاده میشود که با نوع عبارت ارسالشده به فراخوانی همخوانی ندارد.
ببینید: CWE-686: Function Call With Incorrect Argument Type ("https://cwe.mitre.org/data/definitions/686.html").
- -Wno-analyzer-va-list-exhausted
- این هشدار
به -fanalyzer نیاز
دارد، که آن
را فعال
میکند؛
برای
غیرفعال
کردن آن از
-Wno-analyzer-va-list-exhausted
استفاده
کنید.
این پیام تشخیصی برای مسیرهای بینروالی در کد هشدار میدهد که تحلیلگر در آنها تلاشی برای استفاده از "va_arg" جهت دسترسی به مقدار بعدی ارسالشده به یک فراخوانی با آرگومانهای متغیر شناسایی میکند، در حالی که تمام مقادیر موجود در "va_list" قبلاً مصرف شدهاند.
ببینید: CWE-685: Function Call With Incorrect Number of Arguments ("https://cwe.mitre.org/data/definitions/685.html").
- -Wno-analyzer-va-list-leak
- این هشدار
به -fanalyzer نیاز
دارد، که آن
را فعال
میکند؛
برای
غیرفعال
کردن آن از
-Wno-analyzer-va-list-leak
استفاده
کنید.
این پیام تشخیصی برای مسیرهای بینروالی در کد هشدار میدهد که تحلیلگر در آنها تشخیص میدهد که "va_start" یا "va_copy" روی یک "va_list" فراخوانی شده است بدون اینکه فراخوانی متناظری برای "va_end" انجام گیرد.
- -Wno-analyzer-va-list-use-after-va-end
- این هشدار
به -fanalyzer نیاز
دارد، که آن
را فعال
میکند؛
برای
غیرفعال
کردن آن از
-Wno-analyzer-va-list-use-after-va-end
استفاده
کنید.
این پیام تشخیصی برای مسیرهای بینروالی در کد هشدار میدهد که تحلیلگر در آنها تلاشی برای استفاده از یک "va_list" پس از فراخوانی "va_end" روی آن را تشخیص میدهد. "va_list"..IP -Wno-analyzer-write-to-const 4 این هشدار نیازمند -fanalyzer است که آن را فعال میکند؛ برای غیرفعال کردن آن از -Wno-analyzer-write-to-const استفاده کنید.
این پیام تشخیصی دربارهٔ مسیرهایی درون کد هشدار میدهد که تحلیلگر در آنها تلاشی برای نوشتن از طریق یک اشارهگر به یک شیء "const" را شناسایی کند. با این حال، تحلیلگر اولویتی برای شناسایی چنین مسیرهایی قائل نمیشود، بنابراین احتمال خطاهای منفی کاذب در مقایسه با سایر هشدارها بیشتر است.
- -Wno-analyzer-write-to-string-literal
- این هشدار
نیازمند -fanalyzer
است که آن
را فعال
میکند؛
برای
غیرفعال
کردن آن از
-Wno-analyzer-write-to-string-literal
استفاده
کنید.
این پیام تشخیصی دربارهٔ مسیرهایی درون کد هشدار میدهد که تحلیلگر در آنها تلاشی برای نوشتن از طریق یک اشارهگر به یک رشتهٔ لغوی (string literal) را شناسایی کند. با این حال، تحلیلگر اولویتی برای شناسایی چنین مسیرهایی قائل نمیشود، بنابراین احتمال خطاهای منفی کاذب در مقایسه با سایر هشدارها بیشتر است.
- -Wno-analyzer-use-of-uninitialized-value
- این هشدار
نیازمند -fanalyzer
است که آن
را فعال
میکند؛
برای
غیرفعال
کردن آن از
-Wno-analyzer-use-of-uninitialized-value
استفاده
کنید.
این پیام تشخیصی دربارهٔ مسیرهایی درون کد که در آنها از یک مقدار مقداردهینشده استفاده میشود، هشدار میدهد.
ببینید: CWE-457: Use of Uninitialized Variable ("https://cwe.mitre.org/data/definitions/457.html").
تحلیلگر شناختی تعبیهشده (hardcoded) از رفتار توابع مدیریت حافظهٔ زیر دارد:
- *<"alloca">
- *<توابع توکار "__builtin_alloc",>
- "__builtin_alloc_with_align", @item "__builtin_calloc", "__builtin_free", "__builtin_malloc", "__builtin_memcpy", "__builtin_memcpy_chk", "__builtin_memset", "__builtin_memset_chk", "__builtin_realloc", "__builtin_stack_restore" و "__builtin_stack_save"
- *<"calloc">
- *<"free">
- *<"malloc">
- *<"memset">
- *<"operator delete">
- *<"operator delete []">
- *<"operator new">
- *<"operator new []">
- *<"realloc">
- *<"strdup">
- *<"strndup">
از توابع زیر برای کار با توصیفکنندههای فایل:
- *<"open">
- *<"close">
- *<"creat">
- *<"dup"، "dup2" و "dup3">
- *<"isatty">
- *<"pipe" و "pipe2">
- *<"read">
- *<"write">
- *<"socket"، "bind"، "listen"، "accept" و "connect">
از توابع زیر برای کار با جریانهای "<stdio.h>":
- *<توابع توکار "__builtin_fprintf",>
- "__builtin_fprintf_unlocked", "__builtin_fputc", "__builtin_fputc_unlocked", "__builtin_fputs", "__builtin_fputs_unlocked", "__builtin_fwrite", "__builtin_fwrite_unlocked", "__builtin_printf", "__builtin_printf_unlocked", "__builtin_putc", "__builtin_putchar", "__builtin_putchar_unlocked", "__builtin_putc_unlocked", "__builtin_puts", "__builtin_puts_unlocked", "__builtin_vfprintf" و "__builtin_vprintf"
- *<"fopen">
- *<"fclose">
- *<"ferror">
- *<"fgets">
- *<"fgets_unlocked">
- *<"fileno">
- *<"fread">
- *<"getc">
- *<"getchar">
- *<"fprintf">
- *<"printf">
- *<"fwrite">
و از توابع زیر:
- *<توابع توکار "__builtin_expect",>
- "__builtin_expect_with_probability", "__builtin_strchr", "__builtin_strcpy", "__builtin_strcpy_chk", "__builtin_strlen", "__builtin_va_copy" و "__builtin_va_start"
- *<افزونههای گنو "error" و "error_at_line">
- *<"getpass">
- *<"longjmp">
- *<"putenv">
- *<"setjmp">
- *<"siglongjmp">
- *<"signal">
- *<"sigsetjmp">
- *<"strcat">
- *<"strchr">
- *<"strlen">
علاوه بر این، توابع متعددی با پیشوند "__analyzer_" معنای ویژهای برای تحلیلگر دارند که در کتابچهٔ راهنمای GCC Internals شرح داده شدهاند.
پارامترهای مرتبط برای واپایش کاوش عبارتاند از:
- *<--param analyzer-bb-explosion-factor=value>
- *<--param analyzer-max-enodes-per-program-point=value>
- *<--param analyzer-max-recursion-depth=value>
- *<--param analyzer-min-snodes-for-call-summary=value>
گزینههای زیر تحلیلگر را واپایش میکنند.
- -fanalyzer-call-summaries
- تحلیل
بینرویهای
را با
محاسبهٔ
اثر
فراخوانیهای
خاص،
بهجای
کاوش در
تمام
مسیرهای
درون تابع
از نقطهٔ
فراخوانی
تا هر
بازگشت
ممکن،
سادهسازی
میکند.
در صورت فعال بودن، خلاصههای فراخوانی تنها برای توابعی استفاده میشوند که بیش از یک نقطهٔ فراخوانی داشته باشند و به اندازهٔ کافی پیچیده باشند (مطابق با --param analyzer-min-snodes-for-call-summary=value).
- -fanalyzer-checker=name
- تحلیلگر را به اجرای صرفاً بررسیکنندهٔ (checker) نامبرده محدود کرده و آن را فعال میکند.
- -fanalyzer-debug-text-art-headings
- این گزینه برای توسعهدهندگان تحلیلگر در نظر گرفته شده است. در صورت فعال بودن، تحلیلگر حاشیهنویسیهای اضافی را به هر نموداری که تولید میکند خواهد افزود.
- -fno-analyzer-feasibility
- این گزینه
برای
توسعهدهندگان
تحلیلگر
در نظر
گرفته شده
است.
بهطور پیشفرض، تحلیلگر بررسی میکند که آیا مسیر جریان واپایش شدنی برای هر تشخیصی که صادر میکند وجود دارد یا خیر: به این معنی که شرایط برقرار با یکدیگر ناسازگار نباشند. تشخیصهایی که هیچ مسیر شدنی برای آنها یافت نشود رد میشوند. این پالایش را میتوان با -fno-analyzer-feasibility، به منظور اشکالزدایی مسائل درون این کد، غیرفعال کرد.
- -fanalyzer-fine-grained
- این گزینه
برای
توسعهدهندگان
تحلیلگر
در نظر
گرفته شده
است.
تحلیلگر بهطور درونی یک «گراف منفجرشده» (exploded graph) میسازد که گرافهای جریان واپایش را با اطلاعات جریان داده ترکیب میکند.
بهطور پیشفرض، یک یال در این گراف میتواند حاوی اثرات اجرای چندین دستورالعمل در یک بلوک پایه (basic block) باشد. با -fanalyzer-fine-grained، هر دستورالعمل یال مختص به خود را دریافت میکند.
- -fanalyzer-show-duplicate-count
- این گزینه برای توسعهدهندگان تحلیلگر در نظر گرفته شده است: اگر چند مورد تشخیصی به عنوان رونوشت یکدیگر شناسایی شوند، هنگام گزارش بهترین مورد، یادداشتی شامل تعداد تشخیصهای اضافی که توسط منطق حذف موارد تکراری سرکوب شدهاند، صادر میکند.
- -fanalyzer-show-events-in-system-headers
- بهطور پیشفرض، تحلیلگر با پنهان کردن رویدادهایی که بهطور کامل در یک سرآیند سیستمی قرار دارند، مسیرهای تشخیصی سادهشدهای صادر میکند. با -fanalyzer-show-events-in-system-headers این رویدادها دیگر پنهان نمیشوند.
- -fno-analyzer-state-merge
- این گزینه
برای
توسعهدهندگان
تحلیلگر
در نظر
گرفته شده
است.
بهطور پیشفرض، تحلیلگر تلاش میکند با ادغام وضعیتهای به اندازهٔ کافی مشابه در هر نقطه از برنامه هنگام ساخت «گراف منفجرشده»، تحلیل را ساده کند. با -fno-analyzer-state-merge میتوان این ادغام را برای اشکالزدایی مسائل مربوط به مدیریت وضعیت سرکوب کرد.
- -fno-analyzer-state-purge
- این گزینه
برای
توسعهدهندگان
تحلیلگر
در نظر
گرفته شده
است.
بهطور پیشفرض، تحلیلگر تلاش میکند با پاکسازی جنبههایی از وضعیت در یک نقطه از برنامه که دیگر مرتبط به نظر نمیرسند (مثلاً مقادیر متغیرهای محلی که در ادامهٔ تابع دسترسی داده نمیشوند و به تحلیل نشت حافظه مربوط نیستند)، تحلیل را ساده کند.
با -fno-analyzer-state-purge میتوان این پاکسازی وضعیت را برای اشکالزدایی مسائل مربوط به مدیریت وضعیت سرکوب کرد.
- -fno-analyzer-suppress-followups
- این گزینه
برای
توسعهدهندگان
تحلیلگر
در نظر
گرفته شده
است.
بهطور پیشفرض، تحلیلگر پس از مواجهه با برخی از موارد تشخیصی، کاوش در مسیر اجرا را متوقف میکند تا از صدور بالقوهٔ زنجیرهای از هشدارهای تشخیصی پسآیند جلوگیری کند.
تشخیصهایی که تحلیل را در طول یک مسیر خاتمه میدهند عبارتاند از:
- *<-Wanalyzer-null-argument>
- *<-Wanalyzer-null-dereference>
- *<-Wanalyzer-use-after-free>
- *<-Wanalyzer-use-of-pointer-in-stale-stack-frame>
- *<-Wanalyzer-use-of-uninitialized-value>
با -fno-analyzer-suppress-followups تحلیلگر به کاوش چنین مسیرهایی حتی پس از این تشخیصها ادامه میدهد، که میتواند برای اشکالزدایی مسائل درون تحلیلگر یا برای معیارهای سنجش ریز (microbenchmarks) در جهت شناسایی رفتار تعریفنشده مفید باشد.
- -fanalyzer-transitivity
- این گزینه خاصیت تراگذری (transitivity) قیدها را در تحلیلگر فعال میکند.
- -fno-analyzer-undo-inlining
- این گزینه
برای
توسعهدهندگان
تحلیلگر
در نظر
گرفته شده
است.
-fanalyzer در مقایسه با سایر ابزارهای تحلیل کد نسبتاً دیر اجرا میشود و برخی بهینهسازیها پیشتر روی کد اعمال شدهاند. بهویژه، ممکن است درونخطیسازی تابع (function inlining) رخ داده باشد که باعث میشود مسیرهای اجرای بینرویهای صادرشده توسط تحلیلگر حاوی فریمهای تابعی باشند که با فریمهای موجود در کد مبدأ اصلی مطابقت ندارند.
بهطور پیشفرض، تحلیلگر تلاش میکند فریمهای اصلی تابع را بازسازی کرده و رویدادهایی را صادر کند که فراخوانیهای درونخطیشده را نشان دهند.
با -fno-analyzer-undo-inlining میتوان این تلاش برای بازسازی اطلاعات فریم اصلی را غیرفعال کرد، که ممکن است هنگام اشکالزدایی مسائل درون تحلیلگر مفید باشد.
- -fanalyzer-verbose-edges
- این گزینه برای توسعهدهندگان تحلیلگر در نظر گرفته شده است. این گزینه جزئیات پرگوتر و سطحپایینتری را در توصیف جریان واپایش درون مسیرهای تشخیصی فعال میکند.
- -fanalyzer-verbose-state-changes
- این گزینه برای توسعهدهندگان تحلیلگر در نظر گرفته شده است. این گزینه جزئیات پرگوتر و سطحپایینتری را در توصیف رویدادهای مربوط به ماشینهای وضعیت درون مسیرهای تشخیصی فعال میکند.
- -fanalyzer-verbosity=level
- این گزینه
پیچیدگی
مسیرهای
جریان
واپایشی را
که برای
تشخیصهای
تحلیلگر
صادر
میشوند
واپایش
میکند.
مقدار level میتواند یکی از موارد زیر باشد:
- 0
- در این سطح، رویدادهای فراخوانی و بازگشت بینرویهای به همراه مرتبطترین رویدادهای تغییر وضعیت مربوط به یک تشخیص نمایش داده میشوند. برای مثال، برای یک تشخیص "free" دوگانه (double-free)، هر دو فراخوانی به "free" نشان داده خواهند شد.
- 1
- مانند سطح قبلی، اما رویدادهای ورود به هر تابع را نیز نشان میدهد.
- 2
- مانند سطح
قبلی، اما
رویدادهای
مربوط به
جریان
واپایشی را
که در تحریک
و ایجاد
مشکل اهمیت
دارند نیز
نشان
میدهد
(مانند «طی
شدن مسیر
درست» در یک
گزارهٔ
شرطی).
این سطح، پیشفرض است.
- 3
- مانند سطح قبلی، اما همهٔ رویدادهای جریان واپایش را نشان میدهد، نه فقط موارد مهم را.
- 4
- این سطح برای توسعهدهندگان تحلیلگر در نظر گرفته شده است؛ رویدادهای مختلف دیگری را که برای اشکالزدایی تحلیلگر هدفگذاری شدهاند میافزاید.
- -fdump-analyzer
- جزئیات درونی دربارهٔ اقدامات تحلیلگر را در file.analyzer.txt ذخیره میکند. -fdump-analyzer-stderr این گزینه را لغو میکند..IP -fdump-analyzer-stderr 4 تخلیه جزئیات داخلی مربوط به عملکرد تحلیلگر در stderr. این گزینه -fdump-analyzer را بازنویسی میکند.
- -fdump-analyzer-callgraph
- تخلیه نمایشی از نمودار فراخوانی (call graph) مناسب برای مشاهده با GraphViz در file.callgraph.dot.
- -fdump-analyzer-exploded-graph
- تخلیه نمایشی از «exploded graph» مناسب برای مشاهده با GraphViz در file.eg.dot. گرهها بر اساس وضعیتهای ماشین حالت با رنگ کدگذاری شدهاند تا تغییرات وضعیت برجسته شوند.
- -fdump-analyzer-exploded-nodes
- صدور پیامهای تشخیصی که نشان میدهند گرهها در «exploded graph» در چه موقعیتی نسبت به کد منبع برنامه قرار دارند.
- -fdump-analyzer-exploded-nodes-2
- تخلیه نمایشی متنی از «exploded graph» در file.eg.txt.
- -fdump-analyzer-exploded-nodes-3
- تخلیه نمایشی متنی از «exploded graph» به ازای هر گره در یک فایل تخلیه، در file.eg-id.txt. این کار معمولاً به ایجاد تعداد زیادی فایل تخلیه منجر میشود.
- -fdump-analyzer-exploded-paths
- تخلیه نمایشی متنی از «exploded path» برای هر پیام تشخیصی در file.idx.kind.epath.txt.
- -fdump-analyzer-feasibility
- تخلیه جزئیات داخلی درباره جستجوی تحلیلگر برای مسیرهای امکانپذیر (feasible paths). این جزئیات به شکلی مناسب برای مشاهده با GraphViz در فایلهایی با نامهای file.*.fg.dot، file.*.tg.dot و file.*.fpath.txt نوشته میشوند.
- -fdump-analyzer-infinite-loop
- تخلیه جزئیات داخلی درباره جستجوی تحلیلگر برای حلقههای بیپایان. این جزئیات به شکلی مناسب برای مشاهده با GraphViz در فایلهایی با نامهای file.*.infinite-loop.dot نوشته میشوند.
- -fdump-analyzer-json
- تخلیه نمایشی فشردهشده از ساختار داخلی تحلیلگر در قالب JSON در file.analyzer.json.gz. ساختار دقیق آن ممکن است تغییر کند.
- -fdump-analyzer-state-purge
- مشابه -fdump-analyzer-supergraph، نمایشی از «supergraph» را که برای مشاهده با GraphViz مناسب است تخلیه میکند، اما نمودار را با اطلاعاتی درباره اینکه چه وضعیتی در هر گره پاکسازی خواهد شد، حاشیهنویسی میکند. این نمودار در file.state-purge.dot نوشته میشود.
- -fdump-analyzer-supergraph
- تخلیه نماهایی از «supergraph» مناسب برای مشاهده با GraphViz در file.supergraph.dot و file.supergraph-eg.dot. این موارد تمام نمودارهای جریان کنترل را در برنامه، با یالهای بینروالی برای فراخوانیها و بازگشتها نشان میدهند. تخلیه دوم شامل حاشیهنویسیهایی است که گرهها در «exploded graph» و پیامهای تشخیصی مرتبط با آنها را نمایش میدهد.
- -fdump-analyzer-untracked
- صدور هشدارهای سفارشی همراه با جزئیات داخلی که برای توسعهدهندگان تحلیلگر در نظر گرفته شدهاند.
گزینههای اشکالزدایی برنامه شما (Options for Debugging Your Program)
برای اینکه به GCC بگویید اطلاعات اضافی را برای استفاده اشکالزدا (debugger) تولید کند، تقریباً در تمام موارد تنها کافی است -g را به گزینههای دیگر خود اضافه کنید. برخی قالبهای اشکالزدایی میتوانند همزمان وجود داشته باشند (مانند DWARF همراه با CTF)، به شرطی که هر یک از آنها به صورت صریح با افزودن گزینه خط فرمان مربوطه به دیگر گزینههایتان فعال شوند.
کامپایلر GCC به شما اجازه میدهد -g را همراه با -O استفاده کنید. میانبرهایی که کدهای بهینهسازیشده در پیش میگیرند ممکن است گاهی غافلگیرکننده باشند: ممکن است برخی متغیرهایی که تعریف کردهاید اصلاً وجود نداشته باشند؛ جریان کنترل ممکن است لحظهای به جایی که انتظار نداشتید برود؛ برخی دستورها ممکن است اجرا نشوند زیرا نتایج ثابتی را محاسبه میکنند یا مقادیر آنها از قبل آماده است؛ برخی دستورها ممکن است در جاهای متفاوتی اجرا شوند زیرا از درون حلقهها به بیرون منتقل شدهاند. با این حال، اشکالزدایی خروجی بهینهسازیشده امکانپذیر است. این امر استفاده از بهینهساز را برای برنامههایی که ممکن است باگ داشته باشند منطقی میسازد.
اگر از گزینه بهینهسازی دیگری استفاده نمیکنید، استفاده از -Og را همراه با -g در نظر بگیرید. بدون وجود هیچ گزینه -O، برخی گذرها (passes)ی کامپایلر که اطلاعات مفید برای اشکالزدایی را جمعآوری میکنند اصلاً اجرا نمیشوند؛ بنابراین -Og ممکن است به تجربه اشکالزدایی بهتری منجر شود.
- -g
- تولید
اطلاعات
اشکالزدایی
در قالب
بومی
سیستمعامل
(stabs، COFF، XCOFF یا DWARF).
برنامه GDB
میتواند
با این
اطلاعات
اشکالزدایی
کار کند.
در بیشتر سیستمهایی که از قالب stabs استفاده میکنند، -g استفاده از اطلاعات اشکالزدایی اضافهای را فعال میکند که تنها GDB قادر به استفاده از آن است؛ این اطلاعات اضافی کارکرد اشکالزدایی را در GDB بهبود میبخشد، اما احتمالاً موجب فروپاشی سایر اشکالزداها یا امتناع آنها از خواندن برنامه میشود. اگر میخواهید با اطمینان مشخص کنید که آیا اطلاعات اضافی تولید شوند یا خیر، از -gvms استفاده کنید (ادامه را ببینید).
- -ggdb
- تولید اطلاعات اشکالزدایی برای استفاده توسط GDB. این به معنای استفاده از گویاترین قالب موجود است (DWARF، stabs یا قالب بومی سیستم در صورتی که هیچیک از آن دو پشتیبانی نشوند)، از جمله افزونههای ویژه GDB در صورت امکان.
- -gdwarf
- -gdwarf-version
- تولید
اطلاعات
اشکالزدایی
در قالب DWARF (در
صورت
پشتیبانی).
مقدار version
میتواند 2،
3، 4 یا 5 باشد؛
نسخه
پیشفرض
برای بیشتر
مقاصد 5 است
(به استثنای
VxWorks، TPF و Darwin / macOS که
به طور
پیشفرض از
نسخه 2
استفاده
میکنند، و
AIX که
پیشفرض آن
نسخه 4 است).
توجه داشته باشید که با DWARF Version 2، برخی پورتها به برخی افزونههای غیرمتعارض DWARF 3 در جدولهای unwind نیاز دارند و همیشه از آنها استفاده میکنند.
نسخه 4 ممکن است برای دستیابی به بیشترین کارایی به GDB 7.0 و -fvar-tracking-assignments نیاز داشته باشد. نسخه 5 به GDB 8.0 یا بالاتر نیاز دارد.
کامپایلر GCC دیگر از DWARF Version 1 پشتیبانی نمیکند، که تفاوت اساسی با نسخه 2 و پس از آن دارد. بنا به دلایل تاریخی، برخی دیگر از گزینههای مرتبط با DWARF (مانند -fno-dwarf2-cfi-asm) ارجاعی به DWARF Version 2 در نام خود دارند، اما بر تمامی نسخههای DWARF که در حال حاضر پشتیبانی میشوند اعمال میگردند.
- -gbtf
- درخواست اطلاعات اشکالزدایی BTF. قالب BTF قالب پیشفرض اشکالزدایی برای مقصد eBPF است. در سایر مقاصد مانند x86، اطلاعات اشکالزدایی BTF میتواند همراه با اطلاعات اشکالزدایی DWARF تولید شود، به شرطی که هر دو قالب اشکالزدایی به صورت صریح از طریق گزینههای خط فرمان مربوطه خود فعال شده باشند.
- -gprune-btf
- -gno-prune-btf
- هرس کردن
اطلاعات BTF
پیش از
انتشار.
هنگام هرس
کردن، تنها
اطلاعات
نوع برای
انواعی
صادر خواهد
شد که توسط
متغیرهای
سراسری و
توابع با
دامنه فایل
(file-scope) استفاده
شدهاند. در
صورت
کامپایل
برای مقصد BPF
با فعال
بودن BPF CO-RE،
اطلاعات
نوع برای
انواع
بهکاررفته
در
بازنشانیهای
(relocations) مربوط به
BPF CO-RE نیز صادر
خواهد شد.
علاوه بر
این، انواع
struct و union که تنها
از طریق
اشارهگر
از اعضای
سایر انواع
struct یا union مورد
ارجاع قرار
گرفتهاند
هرس شده و
با BTF_KIND_FWD
جایگزین
میشوند،
گویی آن
انواع
صرفاً به
عنوان
اعلان رو به
جلو (forward declaration) در
ورودی حضور
داشتهاند.
این گزینه حجم اطلاعات 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 استفاده میشود..IP -gcodeview 4 تولید اطلاعات اشکالزدایی در قالب اشکالزدایی CodeView (در صورت پشتیبانی). این قالبی است که توسط Microsoft Visual C++ در Windows استفاده میشود.
- -glevel
- -ggdblevel
- -gvmslevel
- درخواست
اطلاعات
اشکالزدایی
و همچنین
استفاده از
level برای
مشخص کردن
میزان
اطلاعات.
سطح
پیشفرض ۲
است.
سطح ۰ اصلاً هیچ اطلاعات اشکالزدایی تولید نمیکند؛ بنابراین، -g0 گزینهٔ -g را خنثی میکند.
سطح ۱ کمترین میزان اطلاعات را تولید میکند، در حدی که برای ایجاد backtrace در بخشهایی از برنامه که قصد اشکالزدایی آنها را ندارید کافی باشد. این شامل توصیف توابع و متغیرهای خارجی و جدولهای شمارهٔ خطوط است، اما اطلاعاتی دربارهٔ متغیرهای محلی ارائه نمیدهد.
سطح ۳ شامل اطلاعات اضافی است، مانند تمام تعاریف ماکروی موجود در برنامه. برخی از اشکالزداها هنگام استفاده از -g3 از بسط ماکرو (macro expansion) پشتیبانی میکنند.
اگر از چندین گزینهٔ -g، همراه با شمارهٔ سطح یا بدون آن استفاده کنید، آخرین گزینه از این میان مؤثر خواهد بود.
گزینهٔ -gdwarf برای جلوگیری از سردرگمی با -gdwarf-level، سطح اشکالزدایی متصلشده را نمیپذیرد. بهجای آن، از یک گزینهٔ اضافی -glevel برای تغییر سطح اشکالزدایی DWARF استفاده کنید.
- -fno-eliminate-unused-debug-symbols
- بهطور پیشفرض، برای نمادهایی که در عمل استفاده نمیشوند هیچ اطلاعات اشکالزدایی تولید نمیشود. اگر اطلاعات اشکالزدایی را برای تمام نمادها میخواهید، از این گزینه استفاده کنید.
- -femit-class-debug-always
- بهجای درج اطلاعات اشکالزدایی برای یک کلاس C++ تنها در یک فایل شیء، آن را در تمام فایلهای شیءِ استفادهکننده از آن کلاس درج میکند. این گزینه فقط باید با اشکالزداهایی استفاده شود که قادر به مدیریت شیوهٔ عادی درج اطلاعات اشکالزدایی کلاسها توسط GCC نیستند، چرا که استفاده از این گزینه اندازهٔ اطلاعات اشکالزدایی را تا دو برابر افزایش میدهد.
- -fno-merge-debug-strings
- به پیونددهنده هدایت میدهد که رشتههای یکسان در اطلاعات اشکالزدایی را از فایلهای شیء مختلف با یکدیگر ادغام نکند. ادغام در تمام اسمبلرها یا پیونددهندهها پشتیبانی نمیشود. ادغام اندازهٔ اطلاعات اشکالزدایی را در فایل خروجی کاهش میدهد، اما به بهای افزایش زمان پردازش پیوند. ادغام بهطور پیشفرض فعال است.
- -fdebug-prefix-map=old=new
- هنگام کامپایل فایلهای واقع در دایرکتوری old، اطلاعات اشکالزدایی را طوری ثبت میکند که گویی فایلها در دایرکتوری new قرار دارند. این گزینه میتواند برای جایگزینی مسیر زمان ساخت با مسیر زمان نصب در اطلاعات اشکالزدایی استفاده شود. همچنین میتواند با استفاده از . برای new، یک مسیر مطلق را به یک مسیر نسبی تبدیل کند. این کار میتواند منجر به ساختهای بازتولیدپذیرتری شود که مستقل از مکان هستند، اما ممکن است برای گفتن مکان یافتن فایلهای منبع به GDB نیازمند یک دستور اضافی باشد. همچنین -ffile-prefix-map و -fcanon-prefix-map را ببینید.
- -fvar-tracking
- اجرای گذر
ردگیری
متغیرها.
این گذر
محاسبه
میکند که
متغیرها در
هر نقطه از
کد در کجا
ذخیره
شدهاند؛
سپس
اطلاعات
اشکالزدایی
بهتری
تولید
میشود (در
صورتی که
قالب
اطلاعات
اشکالزدایی
از این
اطلاعات
پشتیبانی
کند).
این گزینه هنگام کامپایل با بهینهسازی (-Os، -O، -O2، ...)، فعال بودن اطلاعات اشکالزدایی (-g) و پشتیبانی قالب اطلاعات اشکالزدایی از آن، بهطور پیشفرض فعال است.
- -fvar-tracking-assignments
- یادداشتگذاری
انتسابها
به
متغیرهای
کاربر در
مراحل
اولیهٔ
کامپایل و
تلاش برای
حفظ این
یادداشتها
در سراسر
مراحل
کامپایل تا
انتها، با
هدف بهبود
اطلاعات
اشکالزدایی
در هنگام
بهینهسازی.
استفاده از
-gdwarf-4 به همراه
آن توصیه
میشود.
این گزینه حتی در صورت غیرفعال بودن var-tracking نیز میتواند فعال شود، که در این حالت یادداشتها ایجاد و نگهداری میشوند اما در پایان دور ریخته میشوند. بهطور پیشفرض، این پرچم به همراه -fvar-tracking فعال است، مگر زمانی که زمانبندی انتخابی فعال باشد.
- -gsplit-dwarf
- در صورت فعال بودن اطلاعات اشکالزدایی DWARF، تا حد امکان اطلاعات اشکالزدایی را به یک فایل خروجی جداگانه با پسوند .dwo تفکیک میکند. این گزینه به سامانهٔ ساخت اجازه میدهد از پیوند دادن فایلها با اطلاعات اشکالزدایی خودداری کند. برای سودمند بودن، این گزینه نیازمند اشکالزدایی است که توانایی خواندن فایلهای .dwo را داشته باشد.
- -gdwarf32
- -gdwarf64
- در صورت فعال بودن اطلاعات اشکالزدایی DWARF، گزینهٔ -gdwarf32 قالب ۳۲ بیتی DWARF و گزینهٔ -gdwarf64 قالب ۶۴ بیتی DWARF را انتخاب میکند. پیشفرض وابسته به مقصد است، هرچند روی بیشتر مقصدها -gdwarf32 است. قالب ۳۲ بیتی DWARF کوچکتر است، اما نمیتواند بیش از ۲ گیبیبایت (2GiB) اطلاعات اشکالزدایی را در هر یک از بخشهای اطلاعات اشکالزدایی DWARF پشتیبانی کند. قالب ۶۴ بیتی DWARF امکان ذخیرهٔ اطلاعات اشکالزدایی بزرگتر را فراهم میآورد اما ممکن است هنوز توسط همهٔ مصرفکنندگان بهخوبی پشتیبانی نشود.
- -gdescribe-dies
- افزودن صفتهای توصیف به برخی از DIEهای DWARF که صفت نام ندارند، مانند متغیرهای ساختگی (artificial variables)، ارجاعات خارجی و DIEهای پارامترهای جایگاه فراخوانی.
- -gpubnames
- تولید بخشهای ".debug_pubnames" و ".debug_pubtypes" در DWARF.
- -ggnu-pubnames
- تولید بخشهای ".debug_pubnames" و ".debug_pubtypes" در قالبی مناسب برای تبدیل به نمایهٔ GDB. این گزینه تنها با پیونددهندهای مفید است که بتواند نسخهٔ ۷ نمایهٔ GDB را تولید کند.
- -fdebug-types-section
- هنگام استفاده از DWARF نسخهٔ ۴ یا بالاتر، DIEهای نوع میتوانند بهجای قرار گرفتن در بخش ".debug_info"، در بخش مستقل ".debug_types" قرار گیرند. قرار دادن آنها در یک بخش comdat مجزا کارآمدتر است، زیرا در این صورت پیونددهنده میتواند موارد تکراری را حذف کند. اما هنوز همهٔ مصرفکنندگان DWARF از بخشهای ".debug_types" پشتیبانی نمیکنند و در برخی شیءها، ".debug_types" بهجای کوچکتر کردن اطلاعات اشکالزدایی، آن را بزرگتر میکند.
- -grecord-gcc-switches
- -gno-record-gcc-switches
- این گزینه باعث میشود گزینههای خط فرمانی که برای فراخوانی کامپایلر استفاده شدهاند و ممکن است بر تولید کد تأثیر بگذارند، به صفت DW_AT_producer در اطلاعات اشکالزدایی DWARF پیوست شوند. این گزینهها با فاصله از یکدیگر و از نسخهٔ کامپایلر جدا شده و به هم متصل میشوند. این گزینه بهطور پیشفرض فعال است. همچنین -frecord-gcc-switches را بهعنوان روشی دیگر برای ذخیرهٔ گزینههای کامپایلر در فایل شیء ببینید.
- -gstrict-dwarf
- استفاده از افزونههای نسخههای بعدی استاندارد DWARF نسبت به نسخهٔ انتخابشده با -gdwarf-version را غیرمجاز میکند. در بیشتر مقصدها، استفاده از افزونههای بدون تداخل DWARF از نسخههای بعدی استاندارد مجاز است.
- -gno-strict-dwarf
- استفاده از افزونههای نسخههای بعدی استاندارد DWARF نسبت به نسخهٔ انتخابشده با -gdwarf-version را مجاز میکند.
- -gas-loc-support
- به
کامپایلر
اطلاع
میدهد که
اسمبلر از
دستورالعملهای
".loc"
پشتیبانی
میکند. در
این صورت،
کامپایلر
میتواند
از آنها
استفاده
کند تا
اسمبلر
جدولهای
شمارهٔ
خطوط DWARF2+ را
تولید کند.
این امر عموماً مطلوب است، زیرا جدولهای شمارهٔ خط تولیدشده توسط اسمبلر بسیار فشردهتر از آنهایی است که خود کامپایلر میتواند تولید کند.
اگر در زمان پیکربندی GCC مشخص شود که اسمبلر از چنین دستورالعملهایی پشتیبانی میکند، این گزینه بهطور پیشفرض فعال خواهد شد.
- -gno-as-loc-support
- چنانچه قرار باشد جدولهای شمارهٔ خط DWARF2+ تولید شوند، GCC را مجبور میکند آنها را بهصورت داخلی تولید کند.
- -gas-locview-support
- به
کامپایلر
اطلاع
میدهد که
اسمبلر از
انتساب
"view" و
بازنشانی
بررسی ادعا
در
دستورالعملهای
".loc"
پشتیبانی
میکند.
اگر در زمان پیکربندی GCC مشخص شود که اسمبلر از آنها پشتیبانی میکند، این گزینه بهطور پیشفرض فعال خواهد شد.
- -gno-as-locview-support
- چنانچه -gvariable-location-views صراحتاً درخواست شده باشد، GCC را مجبور میکند که شمارههای view را بهصورت داخلی تخصیص دهد.
- -gcolumn-info
- انتشار اطلاعات ستون مکان در اطلاعات اشکالزدایی DWARF، بهجای صرفاً فایل و سطر. این گزینه بهطور پیشفرض فعال است.
- -gstatement-frontiers
- -gno-statement-frontiers
- این گزینه باعث میشود GCC نشانگرهایی را در بازنمود درونی در ابتدای عبارات ایجاد کند، و آنها را در طول فرایند کامپایل تقریباً در جای خود نگه دارد، و از آنها برای هدایت خروجی نشانگرهای "is_stmt" در جدول شماره سطر استفاده کند. این گزینه بهطور پیشفرض هنگام کامپایل با بهینهسازی (-Os، -O1، -O2، ...) و تولید اطلاعات اشکالزدایی DWARF 2 در سطح عادی فعال است.
- -gvariable-location-views
- -gvariable-location-views=incompat5
- -gno-variable-location-views
- بهبود
فهرستهای
مکان
متغیرها با
شمارههای
نمای (view numbers)
فزایندهای
که از جدول
شماره سطر
برداشت
میشوند.
این به
مصرفکنندگان
اطلاعات
اشکالزدایی
امکان
میدهد تا
وضعیت را در
نقاط مشخصی
از برنامه
بررسی
کنند، حتی
اگر در آن
نقطه هیچ
دستورالعملی
مرتبط با
مکانهای
سورس
متناظر
وجود
نداشته
باشد. اگر
اسمبلر از
شمارههای
نما در
جداول
شماره سطر
پشتیبانی
نکند، این
امر باعث
میشود که
کامپایلر
جدول شماره
سطر را صادر
کند که
عموماً
فشردگی
آنها را
اندکی کاهش
میدهد.
جداول
شماره سطر و
فهرستهای
مکان
بهبودیافته
کاملاً با
نسخههای
پیشین
سازگار
هستند (backward-compatible)،
بنابراین
میتوانند
توسط
مصرفکنندگان
اطلاعات
اشکالزدایی
که از این
بهبودها
آگاه
نیستند نیز
استفاده
شوند،
هرچند سودی
از آنها
نخواهند
برد.
این ویژگی بهطور پیشفرض هنگام تولید اطلاعات اشکالزدایی DWARF 2 در سطح عادی فعال است، مادامی که پشتیبانی اسمبلر وجود داشته باشد، -fvar-tracking-assignments فعال باشد و -gstrict-dwarf فعال نباشد. هنگامی که پشتیبانی اسمبلر در دسترس نیست، این گزینه همچنان ممکن است فعال شود، اما GCC را مجبور به صادر کردن جداول شماره سطر درونی میکند، و چنانچه -ginternal-reset-location-views فعال نباشد، این حالت بهاحتمال بسیار زیاد به عدم تطابق بیسروصدای نماهای مکان منجر خواهد شد.
یک بازنمود پیشنهادی برای شمارههای نما وجود دارد که با قالب فهرست مکان معرفیشده در DWARF 5 سازگار با گذشته نیست، و میتواند با -gvariable-location-views=incompat5 فعال شود. این گزینه ممکن است در آینده حذف شود و صرفاً بهعنوان یک پیادهسازی مرجع از بازنمود پیشنهادی ارائه شده است. انتظار نمیرود مصرفکنندگان اطلاعات اشکالزدایی از این قالب گسترشیافته پشتیبانی کنند، و قادر به رمزگشایی فهرستهای مکانی که از آن استفاده میکنند نخواهند بود.
- -ginternal-reset-location-views
- -gno-internal-reset-location-views
- تلاش برای تعیین نماهای مکانی که میتوان آنها را از فهرستهای نمای مکان حذف کرد. این کار نیازمند آن است که کامپایلر تخمینهای بسیار دقیقی از طول دستورالعمل (insn) داشته باشد، که همیشه چنین نیست، و هنگام استفاده از اسمبلری که از فهرستهای نمای مکان پشتیبانی نمیکند، ممکن است باعث ایجاد بیسروصدای فهرستهای نمای نادرست شود. اسمبلر GNU هر گونه خطای اینچنینی را بهعنوان "view number mismatch" گزارش خواهد کرد. این ویژگی تنها روی درگاههایی (ports) فعال است که یک تابع تخمین قابل اطمینان تعریف کرده باشند.
- -ginline-points
- -gno-inline-points
- تولید اطلاعات اشکالزدایی گسترشیافته برای توابع درونخطی (inlined). نشانگرهای ردیابی نمای مکان در نقاط ورودی درونخطی درج میشوند تا آدرس و شمارههای نما محاسبه شده و در اطلاعات اشکالزدایی صادر شوند. این گزینه میتواند مستقل از نماهای مکان فعال شود، که در این صورت شمارههای نما صادر نخواهند شد، اما تنها میتواند همراه با مرزهای عبارات (statement frontiers) فعال شود، و تنها در صورتی بهطور پیشفرض فعال است که نماهای مکان فعال باشند.
- -gz[=type]
- تولید بخشهای (sections) اشکالزدایی فشردهشده در قالب DWARF، در صورت پشتیبانی. اگر type مشخص نشود، نوع پیشفرض به قابلیتهای اسمبلر و پیونددهنده (linker) مورداستفاده بستگی دارد. مقدار type میتواند یکی از مقادیر none (عدم فشردهسازی بخشهای اشکالزدایی) یا zlib (استفاده از فشردهسازی zlib در قالب ELF gABI) باشد. اگر پیونددهنده از نوشتن بخشهای اشکالزدایی فشرده پشتیبانی نکند، گزینه رد میشود. در غیر این صورت، اگر اسمبلر از آنها پشتیبانی نکند، -gz هنگام تولید فایلهای شیء (object files) بدون هشدار نادیده گرفته میشود.
- -femit-struct-debug-baseonly
- صادر کردن
اطلاعات
اشکالزدایی
برای انواع
شبیه
ساختار (struct-like types)
تنها زمانی
که نام پایه
(base name) فایل
سورس
کامپایل با
نام پایه
فایلی که
ساختار در
آن تعریف
شده مطابقت
داشته باشد.
این گزینه حجم اطلاعات اشکالزدایی را به میزان قابل توجهی کاهش میدهد، اما با احتمال از دست رفتن چشمگیر اطلاعات نوع برای اشکالزدا (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:). یک نوع ساختار زمانی مستقیماً استفاده میشود که نوع یک متغیر یا عضو باشد. کاربردهای غیرمستقیم از طریق اشارهگرها به ساختارها ناشی میشوند؛ یعنی زمانی که استفاده از یک ساختار ناقص معتبر باشد، کاربرد غیرمستقیم است. یک مثال عبارت است از: struct one direct; struct two * indirect;.
کلمه اختیاری دوم، مشخصه را به ساختارهای معمولی (ord:) یا ساختارهای جنریک (gen:) محدود میکند. توضیح ساختارهای جنریک کمی پیچیده است. در ++C، اینها تخصیصهای غیرصریح (non-explicit specializations) کلاسهای قالب، یا کلاسهای غیرقالب درون موارد بالا هستند. زبانهای برنامهنویسی دیگر دارای جنریک هستند، اما -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) کنید. با این حال، در بیشتر مواقع این امر منجر به اتلاف مقدار قابل توجهی فضا میشود..SS "گزینههای کنترل بهینهسازی (Options That Control Optimization)" این گزینهها انواع مختلفی از بهینهسازیها را کنترل میکنند.
بدون هیچ گزینهٔ بهینهسازی، هدف کامپایلر کاهش هزینهٔ کامپایل و اطمینان از این است که اشکالزدایی نتایج مورد انتظار را ارائه دهد. دستورها (statements) مستقل از یکدیگرند: اگر برنامه را با یک نقطهٔ توقف (breakpoint) بین دستورها متوقف کنید، میتوانید مقداری جدید به هر متغیر انتساب دهید یا شمارندهٔ برنامه (program counter) را به هر دستور دیگری در تابع تغییر داده و دقیقاً همان نتایجی را دریافت کنید که بر اساس کد منبع انتظار دارید.
فعالسازی پرچمهای بهینهسازی باعث میشود کامپایلر تلاش کند تا کارایی و/یا اندازهٔ کد را به بهای افزایش زمان کامپایل و احتمالاً کاهش قابلیت اشکالزدایی برنامه بهبود بخشد.
کامپایلر بهینهسازی را بر اساس شناختی که از برنامه دارد انجام میدهد. کامپایل چندین فایل بهطور همزمان در حالت یک فایل خروجی واحد، به کامپایلر امکان میدهد هنگام کامپایل هر فایل، از اطلاعات بهدستآمده از تمام فایلها استفاده کند.
همهٔ بهینهسازیها مستقیماً با یک پرچم کنترل نمیشوند. در این بخش فقط بهینهسازیهایی که پرچم دارند فهرست شدهاند.
اکثر بهینهسازیها در سطح -O0 یا در صورتی که سطح -O در خط فرمان مشخص نشده باشد، حتی اگر پرچمهای بهینهسازی بهصورت جداگانه تعیین شده باشند، کاملاً غیرفعال میشوند. بهطور مشابه، -Og بسیاری از گذرهای بهینهسازی را لغو میکند.
بسته به معماری هدف و نحوهٔ پیکربندی GCC، ممکن است در هر سطح -O مجموعهٔ متفاوتی از بهینهسازیها نسبت به موارد ذکرشده در اینجا فعال شوند. میتوانید GCC را با -Q --help=optimizers اجرا کنید تا مجموعهٔ دقیق بهینهسازیهای فعال در هر سطح را دریابید.
- -O
- -O1
- بهینهسازی.
کامپایل
بهینهشده
به زمان تا
حدی بیشتر،
و برای
توابع بزرگ
به حافظهٔ
بسیار
بیشتری
نیاز دارد.
با -O، کامپایلر بدون انجام بهینهسازیهایی که زمان زیادی از کامپایل را مصرف میکنند، سعی در کاهش اندازهٔ کد و زمان اجرا دارد.
گزینهٔ -O سطح بهینهسازی پیشنهادی برای کدهای حجیم تولیدشده توسط ماشین است، چرا که تعادلی منطقی میان زمان لازم برای کامپایل و مصرف حافظه برقرار میکند: سطوح بهینهسازی بالاتر، بهینهسازیهایی با پیچیدگی الگوریتمی بیشتری نسبت به -O انجام میدهند.
گزینهٔ -O پرچمهای بهینهسازی زیر را فعال میکند:
-fauto-inc-dec -fbranch-count-reg -fcombine-stack-adjustments -fcompare-elim -fcprop-registers -fdce -fdefer-pop -fdelayed-branch -fdse -fforward-propagate -fguess-branch-probability -fif-conversion -fif-conversion2 -finline-functions-called-once -fipa-modref -fipa-profile -fipa-pure-const -fipa-reference -fipa-reference-addressable -fivopts -fmerge-constants -fmove-loop-invariants -fmove-loop-stores -fomit-frame-pointer -freorder-blocks -fshrink-wrap -fshrink-wrap-separate -fsplit-wide-types -fssa-backprop -fssa-phiopt -ftree-bit-ccp -ftree-ccp -ftree-ch -ftree-coalesce-vars -ftree-copy-prop -ftree-dce -ftree-dominator-opts -ftree-dse -ftree-forwprop -ftree-fre -ftree-phiprop -ftree-pta -ftree-scev-cprop -ftree-sink -ftree-slsr -ftree-sra -ftree-ter -funit-at-a-time
- -O2
- بهینهسازی
حتی بیشتر. GCC
تقریباً
تمامی
بهینهسازیهای
پشتیبانیشده
را که
موازنهای
میان فضا و
سرعت
ندارند،
اعمال
میکند. این
گزینه در
مقایسه با
-O، هم زمان
کامپایل و
هم کارایی
کد
تولیدشده
را افزایش
میدهد.
گزینهٔ -O2 تمامی پرچمهای بهینهسازی تعیینشده توسط -O1 را فعال میکند. این گزینه همچنین پرچمهای بهینهسازی زیر را فعال میکند:
-falign-functions -falign-jumps -falign-labels -falign-loops -fcaller-saves -fcode-hoisting -fcrossjumping -fcse-follow-jumps -fcse-skip-blocks -fdelete-null-pointer-checks -fdevirtualize -fdevirtualize-speculatively -fexpensive-optimizations -ffinite-loops -fgcse -fgcse-lm -fhoist-adjacent-loads -finline-functions -finline-small-functions -findirect-inlining -fipa-bit-cp -fipa-cp -fipa-icf -fipa-ra -fipa-sra -fipa-vrp -fisolate-erroneous-paths-dereference -flra-remat -foptimize-crc -foptimize-sibling-calls -foptimize-strlen -fpartial-inlining -fpeephole2 -freorder-blocks-algorithm=stc -freorder-blocks-and-partition -freorder-functions -frerun-cse-after-loop -fschedule-insns -fschedule-insns2 -fsched-interblock -fsched-spec -fstore-merging -fstrict-aliasing -fthread-jumps -ftree-builtin-call-dce -ftree-loop-vectorize -ftree-pre -ftree-slp-vectorize -ftree-switch-conversion -ftree-tail-merge -ftree-vrp -fvect-cost-model=very-cheap
لطفاً به هشدار موجود در بخش مربوط به -fgcse دربارهٔ فراخوانی -O2 روی برنامههایی که از gotoهای محاسبهشده استفاده میکنند، توجه داشته باشید.
- -O3
- بهینهسازی
باز هم
بیشتر.
گزینهٔ -O3
تمام
بهینهسازیهای
مشخصشده
در -O2 را
فعال کرده و
همچنین
پرچمهای
بهینهسازی
زیر را نیز
فعال
میکند:
-fgcse-after-reload -fipa-cp-clone -floop-interchange -floop-unroll-and-jam -fpeel-loops -fpredictive-commoning -fsplit-loops -fsplit-paths -ftree-loop-distribution -ftree-partial-pre -funswitch-loops -fvect-cost-model=dynamic -fversion-loops-for-strides
- -O0
- کاهش زمان
کامپایل و
تولید
نتایج مورد
انتظار در
اشکالزدایی.
این حالت
پیشفرض
است.
در -O0، کامپایلر GCC بیشتر گذرهای بهینهسازی را بهطور کامل غیرفعال میکند؛ حتی اگر آنها را بهصراحت در خط فرمان فعال کنید، یا توسط -Q --help=optimizers بهعنوان پیشفرضِ فعال فهرست شده باشند، اجرا نمیشوند. بسیاری از بهینهسازیهای ارائهشده توسط GCC وابسته به تحلیل کد یا گذرهای استانداردسازی هستند که با -O فعال میشوند، و اجرای گذرهای بهینهسازی منفرد بهصورت مجزا سودمند نخواهد بود..IP -Os 4 بهینهسازی برای اندازه. -Os تمام بهینهسازیهای -O2 را فعال میکند، به جز مواردی که غالباً اندازه کد را افزایش میدهند:
-falign-functions -falign-jumps -falign-labels -falign-loops -fprefetch-loop-arrays -freorder-blocks-algorithm=stc
همچنین -finline-functions را فعال میکند، باعث میشود کامپایلر به جای سرعت اجرا برای اندازه کد تنظیم شود، و بهینهسازیهای بیشتری را که برای کاهش اندازه کد طراحی شدهاند انجام میدهد.
- -Ofast
- نادیده گرفتن انطباق دقیق با استانداردها. -Ofast تمام بهینهسازیهای -O3 را فعال میکند. همچنین بهینهسازیهایی را فعال میکند که برای همه برنامههای منطبق با استاندارد معتبر نیستند. این گزینه -ffast-math، -fallow-store-data-races و گزینه مخصوص Fortran یعنی -fstack-arrays (مگر اینکه -fmax-stack-var-size مشخص شده باشد) و -fno-protect-parens را روشن میکند. این گزینه -fsemantic-interposition را خاموش میکند.
- -Og
- بهینهسازی
تجربه
اشکالزدایی.
-Og باید سطح
بهینهسازی
انتخابی
برای چرخه
استاندارد
ویرایش-کامپایل-اشکالزدایی
باشد، که
سطح معقولی
از
بهینهسازی
را در حین
حفظ سرعت
بالای
کامپایل و
یک تجربه
اشکالزدایی
مناسب
فراهم
میکند. این
گزینه برای
تولید کد
قابل
اشکالزدایی
انتخاب
بهتری نسبت
به -O0 است،
زیرا برخی
از گامهای
کامپایلر
که اطلاعات
اشکالزدایی
را
جمعآوری
میکنند در
-O0 غیرفعال
میشوند.
مانند -O0، -Og تعدادی از گامهای بهینهسازی را به طور کامل غیرفعال میکند تا گزینههای منفرد کنترلکننده آنها هیچ اثری نداشته باشند. در غیر این صورت -Og تمام پرچمهای بهینهسازی -O1 را فعال میکند، به جز مواردی که ممکن است در اشکالزدایی اختلال ایجاد کنند:
-fbranch-count-reg -fdelayed-branch -fdse -fif-conversion -fif-conversion2 -finline-functions-called-once -fmove-loop-invariants -fmove-loop-stores -fssa-phiopt -ftree-bit-ccp -ftree-dse -ftree-pta -ftree-sra
- -Oz
- بهینهسازی تهاجمی برای اندازه به جای سرعت. این ممکن است تعداد دستورالعملهای اجرا شده را افزایش دهد اگر آن دستورالعملها برای کدگذاری به بایتهای کمتری نیاز داشته باشند. -Oz رفتاری مشابه با -Os دارد، از جمله فعالسازی بیشتر بهینهسازیهای -O2.
اگر از چند گزینه -O استفاده کنید، با یا بدون شماره سطح، آخرین گزینه از این دست گزینهای است که اعمال خواهد شد.
گزینههایی با قالب -fflag پرچمهای مستقل از ماشین را مشخص میکنند. بیشتر پرچمها هم شکل مثبت و هم منفی دارند؛ شکل منفی -ffoo به صورت -fno-foo است. در جدول زیر، تنها یکی از اشکال فهرست شده است---همان شکلی که معمولاً استفاده میکنید. میتوانید شکل دیگر را با حذف no- یا افزودن آن به دست آورید.
گزینههای زیر بهینهسازیهای خاصی را کنترل میکنند. آنها یا توسط گزینههای -O فعال میشوند یا به مواردی مربوط میشوند که فعال شدهاند. میتوانید از پرچمهای زیر در موارد نادری که «تنظیم دقیق» بهینهسازیهای مورد نظر لازم است، استفاده کنید.
- -fno-defer-pop
- برای ماشینهایی که باید پس از فراخوانی تابع، آرگومانها را از پشته خارج کنند، همیشه به محض بازگشت هر تابع، آرگومانها را خارج میکند. در سطوح -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
فشردهسازی
عبارتهای
ممیز شناور
را غیرفعال
میکند.
-ffp-contract=fast
فشردهسازی
عبارتهای
ممیز شناور
را فعال
میکند،
مانند
ایجاد
عملیات
ضرب-جمع
ترکیبشده
(fused multiply-add) در
صورتی که
معماری
مقصد
پشتیبانی
بومی از
آنها
داشته باشد.
-ffp-contract=on
فشردهسازی
عبارتهای
ممیز شناور
را در صورتی
که
استاندارد
زبان اجازه
دهد، فعال
میکند. این
قابلیت
برای C و ++C
پیادهسازی
شده است،
جایی که
فشردهسازی
را درون یک
عبارت فعال
میکند،
اما نه در
بین
دستورهای
مختلف.
پیشفرض برای C در حالت منطبق با استاندارد (-std=c11 یا مشابه آن) -ffp-contract=off است، در غیر این صورت -ffp-contract=fast میباشد.
- -fomit-frame-pointer
- اشارهگر
فریم (frame pointer) را
در توابعی
که به آن
نیاز
ندارند حذف
میکند. این
کار از
دستورالعملهای
ذخیره،
راهاندازی
و بازیابی
اشارهگر
فریم
جلوگیری
میکند؛ در
بسیاری از
معماریهای
مقصد، این
کار همچنین
یک ثبات
اضافی را در
دسترس قرار
میدهد.
در برخی از معماریهای مقصد این پرچم هیچ اثری ندارد زیرا دنباله فراخوانی استاندارد همیشه از یک اشارهگر فریم استفاده میکند، بنابراین نمیتوان آن را حذف کرد.
توجه داشته باشید که -fno-omit-frame-pointer تضمین نمیکند اشارهگر فریم در همه توابع استفاده شود. چندین معماری مقصد همیشه اشارهگر فریم را در توابع برگ (leaf functions) حذف میکنند.
به طور پیشفرض در -O1 و بالاتر فعال است.
- -foptimize-crc
- حلقههای
محاسبهکننده
CRC (انجام
تقسیم
طولانی
چندجملهای)
را شناسایی
کرده و
آنها را با
یک
پیادهسازی
سریعتر
جایگزین
میکند.
CRCهای ۸، ۱۶،
۳۲ و ۶۴
بیتی را با
یک
چندجملهای
ثابت بدون
بیت پیشروی
۱، هم برای
حالتهای
پیشرو (bit-forward) و
هم معکوس (bit-reversed)
شناسایی
میکند. اگر
مقصد از
دستورالعمل
CRC پشتیبانی
کند و
چندجملهای
استفادهشده
در کد منبع
با
چندجملهای
استفادهشده
در
دستورالعمل
CRC مطابقت
داشته
باشد، آن
دستورالعمل
CRC را تولید
میکند. در
غیر این
صورت، اگر
مقصد از
دستورالعمل
ضرب بدون
رقم نقلی
(carry-less-multiplication)
پشتیبانی
کند، CRC را با
استفاده از
آن تولید
میکند؛ در
غیر این
صورت CRC
مبتنی بر
جدول تولید
میکند.
به طور پیشفرض در -O2 و بالاتر فعال است.
- -foptimize-sibling-calls
- بهینهسازی
فراخوانیهای
همسطح (sibling) و
بازگشتی
انتهایی (tail recursive).
در سطوح -O2، -O3 و -Os فعال است.
- -foptimize-strlen
- توابع
مختلف
رشتهای
استاندارد C
(مانند
"strlen"،
"strchr" یا
"strcpy") و
معادلهای
"_FORTIFY_SOURCE"
آنها را به
گزینههای
جایگزین
سریعتر
بهینهسازی
میکند.
در سطوح -O2 و -O3 فعال است.
- -finline-stringops[=fn]
- عملیات
حافظه و
رشته (در
حال حاضر،
فقط "memset")
را به صورت
درونخطی
بسط
میدهد،
حتی زمانی
که طول
متغیر باشد
یا آنقدر
بزرگ باشد
که به حلقه
نیاز داشته
باشد. این
گزینه در
کنار -ffreestanding و
-fno-builtin
بیشترین
کاربرد را
دارد.
در برخی شرایط، این به کامپایلر امکان میدهد کدی تولید کند که از همترازی مشخص و مضارب طول بهره میبرد، اما حتی در این حالت نیز ممکن است کارایی کمتری نسبت به پیادهسازیهای بهینهشده زمان اجرا داشته باشد و اندازه کد را آنقدر افزایش دهد که حتی یک پیادهسازی با عملکرد پایینتر اما اشتراکی، به دلیل استفاده بهتر از حافظه نهان کد، سریعتر اجرا شود. این گزینه به طور پیشفرض غیرفعال است.
- -fno-inline
- هیچ تابعی
را به جز
آنهایی که
با مشخصه
"always_inline"
علامتگذاری
شدهاند،
به صورت
درونخطی
بسط
نمیدهد.
این حالت
پیشفرض
هنگام عدم
بهینهسازی
است.
میتوان توابع منفرد را با علامتگذاری آنها با مشخصه "noinline" از درونخطیسازی معاف کرد.
- -finline-small-functions
- توابع را در
صورتی که
بدنه آنها
از کد مورد
انتظار
فراخوانی
تابع
کوچکتر
باشد، در
فراخوانندههای
آنها
ادغام
میکند (به
طوری که
اندازه کلی
برنامه
کوچکتر
میشود).
کامپایلر
به طور
اکتشافی
تصمیم
میگیرد که
کدام توابع
به اندازه
کافی ساده
هستند تا
ادغام
آنها به
این روش
ارزشمند
باشد. این
درونخطیسازی
برای همه
توابع، حتی
آنهایی که
به صورت
درونخطی
تعریف
نشدهاند،
اعمال
میشود.
در سطوح -O2، -O3 و -Os فعال است.
- -findirect-inlining
- فراخوانیهای
غیرمستقیمی
را نیز که
به لطف
درونخطیسازی
قبلی مشخص
شده است در
زمان
کامپایل
شناخته شده
هستند،
درونخطی
میکند. این
گزینه تنها
زمانی اثر
دارد که
درونخطیسازی
توسط
گزینههای
-finline-functions یا -finline-small-functions
فعال شده
باشد.
در سطوح -O2، -O3 و -Os فعال است.
- -finline-functions
- همه توابع
را برای
درونخطیسازی
در نظر
میگیرد،
حتی اگر به
صورت
درونخطی
تعریف نشده
باشند.
کامپایلر
به طور
اکتشافی
تصمیم
میگیرد که
کدام توابع
ارزش ادغام
به این روش
را دارند.
اگر تمام فراخوانیها به یک تابع دادهشده ادغام شوند و تابع به صورت "static" تعریف شده باشد، معمولاً تابع به صورت مستقل به عنوان کد اسمبلی در خروجی قرار نمیگیرد.
در سطوح -O2، -O3 و -Os فعال است. همچنین توسط -fprofile-use و -fauto-profile فعال میشود..IP -finline-functions-called-once 4 همهٔ توابع "static" که تنها یکبار فراخوانی شدهاند را برای درونخطیسازی (inlining) در فراخوانندهٔ خود در نظر میگیرد، حتی اگر با "inline" نشانهگذاری نشده باشند. اگر فراخوانیِ یک تابعِ معین یکپارچهسازی شود، آن تابع دیگر بهطور مستقل بهعنوان کد اسمبلی در خروجی قرار نمیگیرد.
در سطوح -O1، -O2، -O3 و -Os فعال است، اما در -Og فعال نیست.
- -fearly-inlining
- توابع
نشانهگذاریشده
با "always_inline"
و توابعی که
بدنهٔ
آنها
کوچکتر از
سربار
فراخوانی
تابع به نظر
میرسد را
زودتر از
انجام
ابزارگذاری
(instrumentation) -fprofile-generate و
گذر واقعی
درونخطیسازی،
درونخطی
میکند.
انجام این
کار باعث
کاهش
چشمگیر
هزینهٔ
پروفایلبندی
و معمولاً
سرعت
بیشترِ
درونخطیسازی
در
برنامههایی
با
زنجیرههای
بزرگ از
توابع
پوششی (wrapper)
تودرتو
میشود.
بهطور پیشفرض فعال است.
- -fipa-sra
- جایگزینی
اسکالر
بینروالیِ
مجموعهها
(interprocedural scalar replacement of aggregates)،
حذف
پارامترهای
استفادهنشده
و جایگزینی
پارامترهای
ارجاعی با
پارامترهای
مقداری را
انجام
میدهد.
در سطوح -O2، -O3 و -Os فعال است.
- -finline-limit=n
- بهطور
پیشفرض، GCC
اندازهٔ
توابعی که
میتوانند
درونخطی
شوند را
محدود
میکند. این
پرچم امکان
کنترل کلی (coarse)
این حد را
فراهم
میکند. n
اندازهٔ
توابعی است
که
میتوانند
بر حسب
تعداد
شبهدستورالعملها
درونخطی
شوند.
درونخطیسازی در واقع توسط تعدادی پارامتر کنترل میشود که میتوانند بهطور مجزا با استفاده از --param name=value مشخص شوند. گزینهٔ -finline-limit=n برخی از این پارامترها را بهصورت زیر تنظیم میکند:
- max-inline-insns-single
- روی n/2 تنظیم میشود.
- max-inline-insns-auto
- روی n/2 تنظیم میشود.
برای مستندات پارامترهای مجزای کنترلکنندهٔ درونخطیسازی و مقادیر پیشفرض آنها به بخشهای بعدی مراجعه کنید.
نکته: ممکن است هیچ مقداری برای -finline-limit وجود نداشته باشد که منجر به رفتار پیشفرض شود.
نکته: شبهدستورالعمل (pseudo instruction) در این زمینهٔ خاص، یک معیار انتزاعی از اندازهٔ تابع است. این معیار بههیچوجه نشاندهندهٔ تعداد دستورالعملهای اسمبلی نیست و معنای دقیق آن ممکن است از یک نگارش به نگارش دیگر تغییر کند.
- -fno-keep-inline-dllexport
- این گزینه نسخهٔ دقیقتری از -fkeep-inline-functions است که فقط برای توابعی اعمال میشود که با استفاده از صفت (attribute) یا declspec با مقدار "dllexport" اعلان شدهاند.
- -fkeep-inline-functions
- در زبان C، توابع "static" که بهصورت "inline" اعلان شدهاند را حتی اگر در تمام فراخوانندههایشان درونخطی شده باشند، در فایل هدف (object file) درج میکند. این گزینه بر روی توابعی که از افزونهٔ "extern inline" در GNU C90 استفاده میکنند تأثیری ندارد. در زبان C++، هر تابع درونخطی را بدون استثنا در فایل هدف درج میکند.
- -fkeep-static-functions
- توابع "static" را در فایل هدف درج میکند، حتی اگر از تابع هرگز استفاده نشده باشد.
- -fkeep-static-consts
- متغیرهای
اعلانشده
بهصورت
"static const" را
زمانی که
بهینهسازی
روشن نیست
درج
میکند،
حتی اگر به
آن متغیرها
ارجاع داده
نشده باشد.
کامپایلر GCC این گزینه را بهطور پیشفرض فعال میکند. اگر میخواهید کامپایلر را وادار کنید که بدون توجه به روشن بودن یا نبودن بهینهسازی بررسی کند آیا به یک متغیر ارجاع شده است یا خیر، از گزینهٔ -fno-keep-static-consts استفاده کنید.
- -fmerge-constants
- تلاش
میکند
مقادیر
ثابت یکسان
(ثابتهای
رشتهای و
ثابتهای
ممیز شناور)
را در سراسر
واحدهای
کامپایل
ادغام کند.
این گزینه در کامپایل بهینهشده پیشفرض است، در صورتی که اسمبلر و لینکر از آن پشتیبانی کنند. از -fno-merge-constants برای جلوگیری از این رفتار استفاده کنید.
در سطوح -O1، -O2، -O3 و -Os فعال است.
- -fmerge-all-constants
- تلاش
میکند
ثوابت
یکسان و
متغیرهای
یکسان را
ادغام کند.
این گزینه متضمن -fmerge-constants است. علاوه بر موارد -fmerge-constants، این گزینه حتی مواردی مانند آرایههای مقداردهیشده با مقادیر ثابت یا متغیرهای ثابت مقداردهیشده از انواع عددی صحیح یا ممیز شناور را نیز در نظر میگیرد. زبانهایی مانند C یا C++ الزام میکنند که هر متغیر، از جمله نمونههای متعدد از همان متغیر در فراخوانیهای بازگشتی، مکانهای حافظهٔ مجزایی داشته باشند؛ بنابراین استفاده از این گزینه منجر به رفتاری ناسازگار با استاندارد میشود.
- -fmodulo-sched
- زمانبندی ماژولوی چرخشی (swing modulo scheduling) را بلافاصله پیش از اولین گذر زمانبندی انجام میدهد. این گذر درونیترین حلقهها را بررسی کرده و با همپوشانی تکرارهای مختلف، دستورالعملهای آنها را بازترتیب میکند.
- -fmodulo-sched-allow-regmoves
- زمانبندی ماژولوی مبتنی بر SMS تهاجمیتری را با مجاز دانستن جابهجایی ثباتها (register moves) انجام میدهد. با تنظیم این پرچم، برخی یالهای پادوابستگی (anti-dependences) حذف میشوند که موجب تولید انتقالهای ثبات بر اساس تحلیل بازهٔ حیات (life-range analysis) میگردد. این گزینه تنها زمانی کارآمد است که -fmodulo-sched فعال باشد.
- -fno-branch-count-reg
- گذر
بهینهسازی
را که به
دنبال
فرصتهایی
برای
استفاده از
دستورالعملهای
«کاهش و
پرش» (decrement and branch)
روی یک ثبات
شمارنده به
جای توالی
دستوراتی
است که یک
ثبات را
کاهش داده،
با صفر
مقایسه
کرده و سپس
بر اساس
نتیجه پرش
میکنند،
غیرفعال
میکند. این
گزینه فقط
در
معماریهایی
که از چنین
دستورالعملهایی
پشتیبانی
میکنند،
از جمله x86،
PowerPC، IA-64 و S/390،
معنا دارد.
توجه داشته
باشید که
گزینهٔ
-fno-branch-count-reg
دستورالعملهای
کاهش و پرشِ
اضافهشده
توسط سایر
گذرهای
بهینهسازی
را از جریان
دستورالعمل
خروجی حذف
نمیکند.
حالت پیشفرض در -O1 و بالاتر، به جز -Og، گزینهٔ -fbranch-count-reg است.
- -fno-function-cse
- آدرسهای
توابع را در
ثباتها
قرار نده؛
باعث
میشود هر
دستورالعملی
که یک تابع
ثابت را
فراخوانی
میکند،
آدرس تابع
را بهطور
صریح در بر
داشته باشد.
این گزینه منجر به کدی با کارایی کمتر میشود، اما برخی دستکاریهای نامتعارف که خروجی اسمبلی را تغییر میدهند، ممکن است به دلیل بهینهسازیهایی که در صورت عدم استفاده از این گزینه انجام میشوند، دچار اختلال شوند.
حالت پیشفرض -ffunction-cse است.
- -fno-zero-initialized-in-bss
- اگر معماری
مقصد از بخش
BSS پشتیبانی
کند، GCC
بهطور
پیشفرض
متغیرهایی
را که با
صفر
مقداردهی
اولیه
شدهاند در
BSS قرار
میدهد. این
کار
میتواند
در فضای کد
نهایی
صرفهجویی
کند.
این گزینه این رفتار را خاموش میکند؛ زیرا برخی برنامهها بهطور صریح به رفتن متغیرها به بخش داده (data section) متکی هستند—برای نمونه، تا فایل اجراییِ حاصل بتواند ابتدای آن بخش را پیدا کرده و/یا بر اساس آن فرضیاتی داشته باشد.
حالت پیشفرض، به جز در زبان Ada، گزینهٔ -fzero-initialized-in-bss است.
- -fthread-jumps
- بهینهسازیهایی
را انجام
میدهد که
بررسی
میکنند
آیا یک پرش
به مکانی
هدایت
میشود که
در آنجا
مقایسهٔ
دیگری که
پوششدادهشده
توسط
مقایسهٔ
اول است
یافت
میشود یا
خیر. اگر
چنین باشد،
انشعاب
اول، بسته
به اینکه
مشخص شود
شرط درست
است یا
نادرست، به
مقصد
انشعاب دوم
یا نقطهای
بلافاصله
پس از آن
بازهدایت
میشود.
در سطوح -O1، -O2، -O3 و -Os فعال است.
- -fsplit-wide-types
- هنگام
استفاده از
نوع
دادهای که
چندین ثبات
را اشغال
میکند،
مانند "long
long" در یک
سامانهٔ 32
بیتی،
ثباتها را
تفکیک کرده
و آنها را
بهطور
مستقل
تخصیص
میدهد. این
کار
معمولاً کد
بهتری برای
این نوعها
ایجاد
میکند،
اما ممکن
است
عیبیابی
(debugging) را
دشوارتر
سازد.
در سطوح -O1، -O2، -O3 و -Os فعال است.
- -fsplit-wide-types-early
- انواع عریض
را در مراحل
اولیه
بهطور
کامل تفکیک
میکند، به
جای اینکه
بسیار دیر
انجام شود.
این گزینه
هیچ اثری
ندارد مگر
اینکه -fsplit-wide-types
فعال باشد.
این حالت در برخی مقاصد بهطور پیشفرض فعال است.
- -fcse-follow-jumps
- در حذف
زیرعبارتهای
مشترک (CSE)، در
صورتی که به
مقصد پرش از
هیچ مسیر
دیگری
دسترسی
وجود
نداشته
باشد،
دستورالعملهای
پرش را پویش
میکند.
برای
نمونه،
هنگامی که CSE
با یک عبارت
"if"
همراه با
بند "else"
مواجه
میشود،
زمانی که
شرطِ
بررسیشده
نادرست
باشد پرش را
دنبال
میکند.
در سطوح -O2، -O3 و -Os فعال است..IP -fcse-skip-blocks 4 این گزینه مشابه -fcse-follow-jumps است، اما باعث میشود CSE پرشهایی را که بهطور شرطی از روی بلوکها رد میشوند دنبال کند. هنگامی که CSE با یک عبارت "if" ساده بدون بخش else مواجه میشود، -fcse-skip-blocks باعث میشود CSE پرش پیرامون بدنهٔ "if" را دنبال کند.
در سطوح -O2، -O3 و -Os فعال میشود.
- -frerun-cse-after-loop
- اجرای مجدد
حذف
زیرعبارتهای
مشترک (CSE) پس
از انجام
بهینهسازیهای
حلقه.
در سطوح -O2، -O3 و -Os فعال میشود.
- -fgcse
- اجرای یک
مرحلهٔ
سراسریِ
حذف
زیرعبارتهای
مشترک (GCSE). این
مرحله
همچنین
انتشار
سراسری
مقادیر
ثابت و
رونوشت (constant and copy
propagation) را انجام
میدهد.
نکته: هنگام کامپایل برنامهای که از computed gotos (یک افزونهٔ GCC) استفاده میکند، در صورت غیرفعال کردن مرحلهٔ سراسریِ حذف زیرعبارتهای مشترک با افزودن -fno-gcse به خط فرمان، ممکن است کارایی زمان اجرای بهتری به دست آورید.
در سطوح -O2، -O3 و -Os فعال میشود.
- -fgcse-lm
- هنگامی که
-fgcse-lm فعال
باشد، حذف
سراسری
زیرعبارتهای
مشترک تلاش
میکند
بارگذاریهایی
(loads) را که فقط
توسط
ذخیرهسازیها
(stores) در خودشان
باطل
میشوند،
منتقل کند.
این کار
اجازه
میدهد یک
حلقه شامل
دنبالهای
از
بارگذاری/ذخیرهسازی
به یک
بارگذاری
در بیرون از
حلقه و یک
رونوشت/ذخیرهسازی
درون حلقه
تبدیل شود.
بهطور پیشفرض زمانی که -fgcse فعال باشد، فعال است.
- -fgcse-sm
- هنگامی که
-fgcse-sm فعال
باشد، یک
مرحلهٔ
انتقال
ذخیرهسازی
(store motion) پس از حذف
سراسری
زیرعبارتهای
مشترک اجرا
میشود. این
مرحله تلاش
میکند
ذخیرهسازیها
را به بیرون
از حلقهها
منتقل کند.
هنگامی که
همراه با -fgcse-lm
استفاده
شود،
حلقههای
شامل
دنبالهای
از
بارگذاری/ذخیرهسازی
میتوانند
به یک
بارگذاری
پیش از حلقه
و یک
ذخیرهسازی
پس از حلقه
تبدیل شوند.
در هیچیک از سطوح بهینهسازی فعال نمیشود.
- -fgcse-las
- هنگامی که
-fgcse-las فعال
باشد،
مرحلهٔ حذف
سراسری
زیرعبارتهای
مشترک،
بارگذاریهای
زائد را که
پس از
ذخیرهسازیها
در همان
مکان حافظه
میآیند
حذف میکند
(هم
افزونگیهای
جزئی و هم
کامل).
در هیچیک از سطوح بهینهسازی فعال نمیشود.
- -fgcse-after-reload
- هنگامی که
-fgcse-after-reload فعال
باشد، یک
مرحلهٔ حذف
بارگذاریهای
زائد پس از reload
انجام
میشود. هدف
این مرحله
پاکسازی
سرریزهای
زائد به
حافظه (redundant spilling)
است.
توسط -O3، -fprofile-use و -fauto-profile فعال میشود.
- -faggressive-loop-optimizations
- این گزینه به بهینهساز حلقه میگوید که از محدودیتهای زبان برای استخراج کرانهای تعداد تکرارهای یک حلقه استفاده کند. این امر فرض میکند که کد حلقه رفتار تعریفنشده (undefined behavior) ایجاد نمیکند، برای مثال باعث سرریز اعداد صحیح علامتدار یا دسترسی به آرایه خارج از محدوده نمیشود. کرانهای تعداد تکرارهای یک حلقه برای هدایت باز کردن حلقه (loop unrolling)، لایهبرداری (peeling) و بهینهسازیهای آزمون خروج از حلقه استفاده میشوند. این گزینه بهطور پیشفرض فعال است.
- -funconstrained-commons
- این گزینه به کامپایلر اعلام میکند متغیرهایی که در بلوکهای عمومی (مانند common blocks در Fortran) تعریف شدهاند ممکن است بعداً با آرایههای انتهایی طولانیتر بازنویسی شوند. این امر مانع از بهینهسازیهای خاصی میشود که به دانستن کرانهای آرایه وابسته هستند.
- -fcrossjumping
- انجام
تبدیل جهش
متقاطع (cross-jumping).
این تبدیل
کدهای
یکسان را
یکپارچه
کرده و حجم
کد را کاهش
میدهد. کد
حاصل ممکن
است نسبت به
حالت بدون
جهش متقاطع
کارایی
بهتر یا
بدتری
داشته باشد.
در سطوح -O2، -O3 و -Os فعال میشود.
- -fauto-inc-dec
- ترکیب افزایش یا کاهش آدرسها با دسترسیهای حافظه. این مرحله در معماریهایی که دستورالعملهایی برای پشتیبانی از این کار ندارند، همواره نادیده گرفته میشود. در معماریهایی که از این ویژگی پشتیبانی میکنند، بهطور پیشفرض در -O1 و بالاتر فعال است.
- -fdce
- انجام حذف کد مرده (DCE) روی RTL. بهطور پیشفرض در -O1 و بالاتر فعال است.
- -fdse
- انجام حذف ذخیرهسازی مرده (DSE) روی RTL. بهطور پیشفرض در -O1 و بالاتر فعال است.
- -fif-conversion
- تلاش برای
تبدیل
پرشهای
شرطی به
معادلهای
بدون
انشعاب (branch-less).
این مورد
شامل
استفاده از
انتقالهای
شرطی،
دستورالعملهای
min ،max ،set flags و abs، و
ترفندهای
محاسباتی
استاندارد
است.
استفاده از
اجرای شرطی
در
پردازندههایی
که از آن
پشتیبانی
میکنند
توسط -fif-conversion2
کنترل
میشود.
در سطوح -O1، -O2، -O3 و -Os فعال است، اما نه همراه با -Og.
- -fif-conversion2
- استفاده از
اجرای شرطی
(در صورت در
دسترس بودن)
برای تبدیل
پرشهای
شرطی به
معادلهای
بدون
انشعاب.
در سطوح -O1، -O2، -O3 و -Os فعال است، اما نه همراه با -Og.
- -fdeclone-ctor-dtor
- در C++ ABI چندین
نقطهٔ ورود
برای
سازندهها
و
نابودکنندهها
الزامی است:
یکی برای
زیرشیء
پایه، یکی
برای یک شیء
کامل، و
دیگری برای
یک
نابودکنندهٔ
مجازی که پس
از آن عملگر
operator delete را
فراخوانی
میکند.
برای
سلسلهمراتبی
با
پایههای
مجازی،
انواع پایه
و کامل
همسان (clone)
هستند، که
به معنای
وجود دو
نسخه از
تابع است.
با این
گزینه،
انواع پایه
و کامل به
thunkهایی
تبدیل
میشوند که
یک
پیادهسازی
مشترک را
فراخوانی
میکنند.
توسط -Os فعال میشود.
- -fdelete-null-pointer-checks
- فرض میکند
برنامهها
نمیتوانند
با اطمینان
اشارهگرهای
null را
مبدأگشایی
(dereference) کنند و
هیچ کد یا
عنصری از
داده در
آدرس صفر
قرار ندارد.
این گزینه
بهینهسازیهای
سادهٔ
پایدارسازی
ثابتها (constant
folding) را در
تمام سطوح
بهینهسازی
فعال
میکند.
علاوه بر
این، سایر
مراحل
بهینهسازی
در GCC از این
پرچم برای
کنترل
تحلیلهای
سراسری
جریان داده
استفاده
میکنند که
بررسیهای
بیفایده
برای
اشارهگرهای
null را حذف
مینمایند؛
این
تحلیلها
فرض
میکنند که
دسترسی به
آدرس صفر
حافظه
همواره
منجر به یک
تله (trap)
میشود،
بنابراین
اگر
اشارهگری
پس از
مبدأگشایی
شدن بررسی
شود،
نمیتواند
null باشد.
با این حال توجه داشته باشید که در برخی محیطها این فرض صادق نیست. برای برنامههایی که به چنین رفتاری وابسته هستند از -fno-delete-null-pointer-checks برای غیرفعال کردن این بهینهسازی استفاده کنید.
این گزینه بهطور پیشفرض در اکثر معماریهای مقصد فعال است. روی AVR و MSP430، این گزینه کاملاً غیرفعال است.
مراحلی که از اطلاعات جریان داده استفاده میکنند، بهطور مستقل در سطوح بهینهسازی مختلف فعال میشوند.
- -fdevirtualize
- تلاش برای تبدیل فراخوانی توابع مجازی به فراخوانیهای مستقیم. این کار هم در درون یک رویه و هم بینرویهای بهعنوان بخشی از درونخطسازی غیرمستقیم (-findirect-inlining) و انتشار بینرویهای ثوابت (-fipa-cp) انجام میشود. در سطوح -O2، -O3 و -Os فعال میشود.
- -fdevirtualize-speculatively
- تلاش برای تبدیل فراخوانی توابع مجازی به فراخوانیهای مستقیم حدسی (speculative). بر اساس تحلیل گراف وراثت نوع، برای یک فراخوانی معین مجموعهای از مقصدهای محتمل تعیین میشود. اگر مجموعه کوچک باشد، ترجیحاً با اندازهٔ ۱، فراخوانی به یک عبارت شرطی تبدیل میشود که بین فراخوانی مستقیم و غیرمستقیم تصمیم میگیرد. فراخوانیهای حدسی بهینهسازیهای بیشتری مانند درونخطسازی (inlining) را ممکن میسازند. هنگامی که این فراخوانیها پس از بهینهسازی بیشتر بیفایده به نظر برسند، دوباره به شکل اولیه برگردانده میشوند.
- -fdevirtualize-at-ltrans
- ارسال اطلاعات اضافی مورد نیاز برای غیرمجازیسازی (devirtualization) تهاجمی هنگام اجرای بهینهساز زمان پیوند در حالت تبدیل محلی (local transformation mode). این گزینه امکان غیرمجازیسازی بیشتری را فراهم میکند اما حجم دادههای جاریشده (streamed) را بهطور چشمگیری افزایش میدهد. به همین دلیل بهطور پیشفرض غیرفعال است.
- -fexpensive-optimizations
- انجام
تعدادی
بهینهسازی
جزئی که از
نظر
محاسباتی
نسبتاً
پرهزینه
هستند.
در سطوح -O2، -O3 و -Os فعال میشود.
- -free
- تلاش برای
حذف
دستورالعملهای
گسترش (extension)
زائد. این
کار
بهویژه
برای
معماری x86-64
مفید است،
که پس از
نوشتن در
نیمهٔ
پایینی ۳۲
بیتی
ثباتهای
۶۴ بیتی،
بهطور
ضمنی گسترش
با صفر (zero-extend)
انجام
میدهد.
برای معماریهای Alpha، AArch64، LoongArch، PowerPC، RISC-V، SPARC، h83000 و x86 در سطوح -O2، -O3 و -Os فعال میشود.
- -fno-lifetime-dse
- در C++ مقدار یک شیء تنها تحت تأثیر تغییرات ایجادشده در طول دورهٔ حیات آن قرار میگیرد: هنگامی که سازنده آغاز میشود، شیء دارای مقداری نامشخص است و هر تغییری در طول چرخهٔ حیات شیء پس از نابودی آن مرده تلقی میشود. در حالت عادی حذف ذخیرهسازی مرده از این مزیت بهره میبرد؛ اگر کد شما به ماندگاری مقدار حافظهٔ شیء فراتر از چرخهٔ حیات آن وابسته است، میتوانید با این پرچم این بهینهسازی را غیرفعال کنید. برای حفظ ذخیرهسازیهای پیش از آغاز سازنده (مثلاً به این دلیل که عملگر operator new حافظهٔ شیء را پاکسازی میکند) اما همچنان مرده تلقی کردن شیء پس از نابودکننده، میتوانید از -flifetime-dse=1 استفاده کنید. رفتار پیشفرض را میتوان بهطور صریح با -flifetime-dse=2 تعیین کرد. -flifetime-dse=0 معادل -fno-lifetime-dse است..IP -flive-range-shrinkage 4 تلاش برای کاهش فشار ثباتها از طریق انقباض دامنه حیات ثبات (live range shrinkage). این گزینه برای پردازندههای سریع با مجموعه ثباتهای کوچک یا متوسط مفید است.
- -fira-algorithm=algorithm
- استفاده از الگوریتم رنگآمیزی مشخصشده برای تخصیصدهنده یکپارچه ثباتها (IRA). آرگومان algorithm میتواند priority باشد که رنگآمیزی اولویت Chow را مشخص میکند، یا CB باشد که رنگآمیزی Chaitin-Briggs را مشخص میکند. رنگآمیزی Chaitin-Briggs برای همه معماریها پیادهسازی نشده است، اما برای مقاصدی که از آن پشتیبانی میکنند، پیشفرض است زیرا کد بهتری تولید میکند.
- -fira-region=region
- استفاده از ناحیههای (regions) مشخصشده برای تخصیصدهنده یکپارچه ثباتها. آرگومان region باید یکی از موارد زیر باشد:
- all
- استفاده از تمام حلقهها بهعنوان ناحیههای تخصیص ثبات. این گزینه میتواند بهترین نتایج را برای ماشینهایی با مجموعه ثباتهای کوچک و/یا نامنظم ارائه دهد.
- mixed
- استفاده از تمام حلقهها به جز حلقههایی با فشار ثبات کم به عنوان ناحیه. این مقدار معمولاً در بیشتر موارد و برای اکثر معماریها بهترین نتایج را ارائه میدهد، و هنگام کامپایل با بهینهسازی برای سرعت (-O، -O2، ...) به طور پیشفرض فعال است.
- one
- استفاده از تمام توابع بهعنوان یک ناحیه واحد. این حالت معمولاً به کوچکترین اندازه کد منجر میشود، و به طور پیشفرض برای -Os یا -O0 فعال است.
- -fira-hoist-pressure
- استفاده از
IRA برای
ارزیابی
فشار ثبات
در گذر بالا
کشیدن کد (code hoisting
pass) جهت
تصمیمگیری
در مورد
بالا کشیدن
عبارتها.
این گزینه
معمولاً
منجر به کد
کوچکتری
میشود،
اما
میتواند
سرعت
کامپایلر
را کاهش
دهد.
این گزینه در سطح -Os برای همه مقاصد فعال است.
- -fira-loop-pressure
- استفاده از
IRA برای
ارزیابی
فشار ثبات
در حلقهها
جهت
تصمیمگیری
در
جابهجایی
مقادیر
ناوردا در
حلقه (loop invariants).
این گزینه
معمولاً
منجر به
تولید کد
سریعتر و
کوچکتر در
ماشینهایی
با
فایلهای
ثبات بزرگ (>=
32 ثبات)
میشود،
اما
میتواند
سرعت
کامپایلر
را کاهش
دهد.
این گزینه در سطح -O3 برای برخی از مقاصد فعال است.
- -fno-ira-share-save-slots
- غیرفعال کردن اشتراکگذاری اسلاتهای پشته مورد استفاده برای ذخیره ثباتهای سختافزاریِ استفادهشده در فراخوانی (call-used hard registers) که در طول یک فراخوانی حفظ میشوند. هر ثبات سختافزاری یک اسلات پشته جداگانه دریافت میکند و در نتیجه فریمهای پشته تابع بزرگتر میشوند.
- -fno-ira-share-spill-slots
- غیرفعال کردن اشتراکگذاری اسلاتهای پشته اختصاصیافته به شبهثباتها (pseudo-registers). هر شبهثباتی که یک ثبات سختافزاری دریافت نکند، یک اسلات پشته جداگانه دریافت میکند و در نتیجه فریمهای پشته تابع بزرگتر میشوند.
- -flra-remat
- فعال کردن
بازتولید
(rematerialization) حساس به CFG
در LRA. به جای
بارگذاری
مقادیر
شبهثباتهای
سرریز شده،
LRA سعی
میکند در
صورت
بهصرفه
بودن،
مقادیر را
مجدداً
بازتولید
(محاسبه
مجدد) کند.
در سطوح -O2، -O3 و -Os فعال است.
- -fdelayed-branch
- در صورت
پشتیبانی
ماشین
مقصد، تلاش
برای
بازآرایی
دستورالعملها
به منظور
بهرهبرداری
از
شکافهای
دستورالعمل
موجود پس از
دستورالعملهای
پرش با
تأخیر (delayed branch).
در سطوح -O1، -O2، -O3 و -Os فعال است، اما در -Og فعال نیست.
- -fschedule-insns
- در صورت
پشتیبانی
ماشین
مقصد، تلاش
برای
بازآرایی
دستورالعملها
جهت حذف
توقفهای
اجرایی (stalls)
ناشی از در
دسترس
نبودن
دادههای
مورد نیاز.
این امر با
صدور
دستورالعملهای
دیگر تا
زمان آماده
شدن نتیجه
دستور
بارگذاری
یا ممیز
شناور، به
ماشینهایی
که
دستورالعملهای
بارگذاری
حافظه یا
ممیز شناور
کند دارند
کمک میکند.
به طور معمول در سطوح بهینهسازی -O2 و -O3 فعال است. با این حال، بسیاری از مقاصد این رفتار را لغو میکنند. برای مثال، در x86 در تمام سطوح غیرفعال است، در حالی که در AArch64 تنها در -O3 فعال است.
- -fschedule-insns2
- مشابه -fschedule-insns
است، اما یک
گذر اضافی
برای
زمانبندی
دستورالعملها
پس از انجام
تخصیص ثبات
درخواست
میکند. این
گزینه
بهویژه در
ماشینهایی
با تعداد
نسبتاً کم
ثبات و جایی
که
دستورالعملهای
بارگذاری
حافظه بیش
از یک چرخه
زمان
میبرند،
مفید است.
در سطوح -O2، -O3 و -Os فعال است.
- -fno-sched-interblock
- غیرفعال کردن زمانبندی دستورالعملها در میان بلوکهای پایه (basic blocks)، که معمولاً هنگام زمانبندی قبل از تخصیص ثبات، یعنی با -fschedule-insns یا در -O2 یا بالاتر، فعال است.
- -fno-sched-spec
- غیرفعال کردن جابهجایی گمانهزنانه دستورالعملهای غیربارگذاری (non-load)، که به طور عادی هنگام زمانبندی قبل از تخصیص ثبات، یعنی با -fschedule-insns یا در -O2 یا بالاتر، فعال است.
- -fsched-pressure
- فعال کردن زمانبندی دستورالعملهای حساس به فشار ثبات پیش از تخصیص ثبات. این گزینه تنها زمانی کاربرد دارد که زمانبندی پیش از تخصیص ثبات فعال باشد، یعنی با -fschedule-insns یا در -O2 یا بالاتر. استفاده از این گزینه میتواند با جلوگیری از افزایش فشار ثبات فراتر از تعداد ثباتهای سختافزاری در دسترس و سرریزهای بعدی در تخصیص ثبات، کد تولیدشده را بهبود بخشیده و اندازه آن را کاهش دهد.
- -fsched-spec-load
- مجاز کردن جابهجایی گمانهزنانه برخی از دستورالعملهای بارگذاری. این گزینه تنها زمانی معنا دارد که زمانبندی پیش از تخصیص ثبات فعال باشد، یعنی با -fschedule-insns یا در -O2 یا بالاتر.
- -fsched-spec-load-dangerous
- مجاز کردن جابهجایی گمانهزنانه دستورالعملهای بارگذاری بیشتر. این گزینه تنها زمانی معنا دارد که زمانبندی پیش از تخصیص ثبات فعال باشد، یعنی با -fschedule-insns یا در -O2 یا بالاتر.
- -fsched-stalled-insns
- -fsched-stalled-insns=n
- تعیین اینکه چه تعداد دستورالعمل (در صورت وجود) میتوانند در طول دومین گذر زمانبندی پیش از موعد از صف دستورالعملهای متوقفشده به فهرست آماده (ready list) منتقل شوند. -fno-sched-stalled-insns به این معنی است که هیچ دستورالعملی پیش از موعد منتقل نمیشود، و -fsched-stalled-insns=0 به این معنی است که هیچ محدودیتی در تعداد دستورالعملهای در صف که میتوانند پیش از موعد منتقل شوند وجود ندارد. -fsched-stalled-insns بدون مقدار، معادل -fsched-stalled-insns=1 است.
- -fsched-stalled-insns-dep
- -fsched-stalled-insns-dep=n
- تعیین اینکه چه تعداد گروه از دستورالعملها (چرخهها) برای بررسی وابستگی به دستورالعمل متوقفشدهای که نامزد خروج زودهنگام از صف دستورالعملهای متوقفشده است، ارزیابی شوند. این گزینه تنها در طول دومین گذر زمانبندی و تنها در صورت استفاده از -fsched-stalled-insns اثرگذار است. -fno-sched-stalled-insns-dep معادل -fsched-stalled-insns-dep=0 است. -fsched-stalled-insns-dep بدون مقدار، معادل -fsched-stalled-insns-dep=1 است.
- -fsched2-use-superblocks
- استفاده از
زمانبندی
سوپربلاک
(superblock scheduling) هنگام
زمانبندی
پس از تخصیص
ثبات. این
کار امکان
جابهجایی
در میان
مرزهای
بلوک پایه
را فراهم
میکند که
منجر به
زمانبندیهای
سریعتری
میشود. این
گزینه
آزمایشی
است، چرا که
همه
توصیفات
ماشین
استفادهشده
توسط GCC
پردازنده
را به
اندازه
کافی دقیق
مدلسازی
نمیکنند
تا از نتایج
غیرقابل
اعتماد
الگوریتم
جلوگیری
شود.
این گزینه تنها زمانی معنا دارد که زمانبندی پس از تخصیص ثبات فعال باشد، یعنی با -fschedule-insns2 یا در -O2 یا بالاتر.
- -fsched-group-heuristic
- فعال کردن روش اکتشافی گروه (group heuristic) در زمانبند. این روش اکتشافی به دستورالعملی که متعلق به یک گروه زمانبندی است اولویت میدهد. این گزینه به طور پیشفرض زمانی که زمانبندی فعال باشد، یعنی با -fschedule-insns یا -fschedule-insns2 یا در -O2 یا بالاتر، فعال است.
- -fsched-critical-path-heuristic
- فعال کردن روش اکتشافی مسیر بحرانی (critical-path heuristic) در زمانبند. این روش اکتشافی به دستورالعملهای روی مسیر بحرانی اولویت میدهد. این گزینه به طور پیشفرض زمانی که زمانبندی فعال باشد، یعنی با -fschedule-insns یا -fschedule-insns2 یا در -O2 یا بالاتر، فعال است.
- -fsched-spec-insn-heuristic
- فعال کردن روش اکتشافی دستورالعمل گمانهزنانه (speculative instruction heuristic) در زمانبند. این روش اکتشافی به دستورالعملهای گمانهزنانه با ضعف وابستگی بیشتر اولویت میدهد. این گزینه به طور پیشفرض زمانی که زمانبندی فعال باشد، یعنی با -fschedule-insns یا -fschedule-insns2 یا در -O2 یا بالاتر، فعال است..IP -fsched-rank-heuristic 4 فعالسازی روش مکاشفهای رتبه (rank heuristic) در زمانبند. این روش مکاشفهای، دستورالعملی را ترجیح میدهد که متعلق به یک بلوک پایهای (basic block) با اندازه یا بسامد بزرگتر باشد. این گزینه بهطور پیشفرض هنگام فعال بودن زمانبندی، یعنی با -fschedule-insns یا -fschedule-insns2 یا در -O2 یا بالاتر، فعال است.
- -fsched-last-insn-heuristic
- فعالسازی روش مکاشفهای آخرین دستورالعمل (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 of symbols) را توسط پیونددهنده پویا میدهند. این بدان معناست که برای نمادهای صادرشده از DSO، کامپایلر نمیتواند با این پیشبینی که ممکن است تابع یا متغیر مورد نظر تغییر کند، انتشار بینرویهای (interprocedural propagation)، درونخطیسازی (inlining) و سایر بهینهسازیها را انجام دهد. گرچه این ویژگی، برای مثال جهت بازنویسی توابع تخصیص حافظه با یک پیادهسازی اشکالزدایی مفید است، اما از نظر کیفیت کد پرهزینه است. با -fno-semantic-interposition، کامپایلر فرض میکند که اگر مداخله برای توابع رخ دهد، تابع جایگزین دقیقاً همان معناشناسی (و اثرات جانبی) را خواهد داشت. به طور مشابه اگر مداخله برای متغیرها رخ دهد، سازنده متغیر یکسان خواهد بود. این پرچم روی توابعی که صراحتاً inline اعلان شدهاند (جایی که مداخله هرگز مجاز به تغییر معناشناسی نیست) و نمادهایی که صراحتاً weak اعلان شدهاند، اثری ندارد.
- -fshrink-wrap
- تولید پیشدرآمد تابع (function prologue) فقط قبل از بخشهایی از تابع که به آن نیاز دارند، به جای قرار دادن آن در ابتدای تابع. این پرچم بهطور پیشفرض در -O و بالاتر فعال است.
- -fshrink-wrap-separate
- جمعوجورسازی (Shrink-wrap) بخشهای مجزای پیشدرآمد و پسدرآمد (epilogue) بهطور جداگانه، تا آن بخشها تنها در صورت نیاز اجرا شوند. این گزینه بهطور پیشفرض روشن است، اما هیچ اثری ندارد مگر اینکه -fshrink-wrap نیز روشن باشد و معماری هدف از آن پشتیبانی کند.
- -fcaller-saves
- فعالسازی
تخصیص
مقادیر به
ثباتهایی
که با
فراخوانی
توابع
بازنویسی
(clobbered)
میشوند،
از طریق
صدور
دستورالعملهای
اضافه برای
ذخیره و
بازیابی
ثباتها در
اطراف این
فراخوانیها.
چنین
تخصیصی
تنها زمانی
انجام
میشود که
به نظر برسد
به تولید کد
بهتری
میانجامد.
این گزینه همیشه بهطور پیشفرض در ماشینهای خاصی فعال است؛ معمولاً ماشینهایی که هیچ ثبات حفظشده در فراخوانی (call-preserved) برای استفاده به عنوان جایگزین ندارند.
در سطوح -O2، -O3 و -Os فعال است.
- -fcombine-stack-adjustments
- تنظیمات
پشته (pushها و
popها) و
ارجاعات
حافظه پشته
را ردیابی
کرده و سپس
سعی میکند
راههایی
برای ترکیب
آنها پیدا
کند.
بهطور پیشفرض در -O1 و بالاتر فعال است.
- -fipa-ra
- استفاده از
ثباتهای caller
save برای
تخصیص، در
صورتی که آن
ثباتها
توسط هیچ
تابع
فراخوانیشدهای
استفاده
نشوند. در
این حالت
نیازی به
ذخیره و
بازیابی
آنها در
اطراف
فراخوانیها
نیست. این
کار تنها
زمانی ممکن
است که
توابع
فراخوانیشده
بخشی از
همان واحد
ترجمه تابع
جاری باشند
و قبل از آن
کامپایل
شوند.
در سطوح -O2، -O3 و -Os فعال است، با این حال اگر کد تولیدشده برای پروفایلسازی ابزارگذاری شود (-p یا -pg)، یا اگر نحوه استفاده callee's از ثبات نتواند دقیقاً مشخص شود (این اتفاق در مقصدهایی رخ میدهد که پیشدرآمدها و پسدرآمدها را در RTL فاش نمیکنند)، این گزینه غیرفعال میشود.
- -fconserve-stack
- تلاش برای به حداقل رساندن استفاده از پشته. کامپایلر تلاش میکند فضای پشته کمتری مصرف کند، حتی اگر این کار برنامه را کندتر کند. این گزینه به معنی تنظیم پارامتر large-stack-frame روی 100 و پارامتر large-stack-frame-growth روی 400 است.
- -ftree-reassoc
- انجام شرکتپذیری مجدد (reassociation) روی درختها. این پرچم بهطور پیشفرض در -O1 و بالاتر فعال است.
- -fcode-hoisting
- انجام ترفیع کد (code hoisting). ترفیع کد تلاش میکند ارزیابی عبارتهایی که در تمام مسیرهای منتهی به خروج تابع اجرا میشوند را تا حد امکان زودتر انجام دهد. این کار به ویژه به عنوان یک بهینهسازی اندازه کد مفید است، اما اغلب به سرعت کد نیز کمک میکند. این پرچم بهطور پیشفرض در -O2 و بالاتر فعال است.
- -ftree-pre
- انجام حذف حشو جزئی (PRE) روی درختها. این پرچم بهطور پیشفرض در -O2 و -O3 فعال است.
- -ftree-partial-pre
- تهاجمیتر کردن حذف حشو جزئی (PRE). این پرچم بهطور پیشفرض در -O3 فعال است.
- -ftree-forwprop
- انجام انتشار رو به جلو (forward propagation) روی درختها. این پرچم بهطور پیشفرض در -O1 و بالاتر فعال است.
- -ftree-fre
- انجام حذف حشو کامل (FRE) روی درختها. تفاوت بین FRE و PRE در این است که FRE تنها عباراتی را در نظر میگیرد که در تمام مسیرهای منتهی به محاسبات زائد محاسبه شده باشند. این تحلیل سریعتر از PRE است، اگرچه حشوهای کمتری را آشکار میکند. این پرچم بهطور پیشفرض در -O1 و بالاتر فعال است.
- -ftree-phiprop
- انجام ترفیع بارگذاریها از اشارهگرهای شرطی روی درختها. این گذر بهطور پیشفرض در -O1 و بالاتر فعال است.
- -fhoist-adjacent-loads
- ترفیع گمانهزنانهٔ بارگذاریها از هر دو شاخه یک if-then-else، در صورتی که بارگذاریها از مکانهای مجاور در یک ساختار باشند و معماری هدف دارای دستورالعمل انتقال شرطی باشد. این پرچم بهطور پیشفرض در -O2 و بالاتر فعال است.
- -ftree-copy-prop
- انجام انتشار رونوشت (copy propagation) روی درختها. این گذر عملیات رونوشت غیرضروری را حذف میکند. این پرچم بهطور پیشفرض در -O1 و بالاتر فعال است.
- -fipa-pure-const
- کشف اینکه کدام توابع خالص (pure) یا ثابت (constant) هستند. بهطور پیشفرض در -O1 و بالاتر فعال است.
- -fipa-reference
- کشف اینکه کدام متغیرهای ایستا از واحد ترجمه خارج نمیشوند. بهطور پیشفرض در -O1 و بالاتر فعال است.
- -fipa-reference-addressable
- کشف متغیرهای ایستای فقطخواندنی، فقطنوشتنی و غیرقابلآدرسدهی. بهطور پیشفرض در -O1 و بالاتر فعال است.
- -fipa-reorder-for-locality
- گروهبندی زنجیرههای فراخوانی در نزدیکی یکدیگر در چیدمان دودویی جهت بهبود محلی بودن کد (code locality) و به حداقل رساندن فواصل پرش بین توابعی که مکرراً فراخوانی میشوند. برخلاف -freorder-functions، این گذر زنجیرههای فراخوانی بین توابع را در نظر گرفته و آنها را با یکدیگر گروهبندی میکند، بهجای اینکه تمام توابع داغ/عادی/سرد/هرگز اجرا نشده را در بخشهای جداگانه قرار دهد. برخلاف -fprofile-reorder-functions، هدف آن بهبود محلی بودن کد در سرتاسر زمان اجرای برنامه است نه تمرکز صرف بر راهاندازی برنامه. این گزینه با گزینه صریح -flto-partition= ناسازگار است، چرا که طرح افرازبندی سفارشی را تحمیل میکند. در صورت استفاده از این گزینه، توصیه میشود از بازخورد پروفایل نیز استفاده کنید، اما در غیر این صورت این گزینه بهطور پیشفرض فعال نیست.
- -fipa-stack-alignment
- کاهش همترازی پشته در محل فراخوانیها (call sites) در صورت امکان. بهطور پیشفرض فعال است..IP -fipa-pta 4 تحلیل بینرویهای اشارهگرها و تحلیل بینرویهای تغییر و ارجاع را انجام میدهد. این گزینه میتواند در واحدهای ترجمه بزرگ باعث مصرف بیش از حد حافظه و زمان کامپایل شود. این گزینه بهطور پیشفرض در هیچ سطح بهینهسازی فعال نیست.
- -fipa-profile
- انتشار بینرویهای پروفایل را انجام میدهد. توابعی که فقط از توابع سرد (cold) فراخوانی میشوند به عنوان سرد علامتگذاری میشوند. همچنین توابعی که تنها یک بار اجرا میشوند (مانند "cold"، "noreturn"، سازندهها یا نابودکنندههای ایستا) شناسایی میشوند. سپس توابع سرد و بخشهای فاقد حلقه از توابعی که یک بار اجرا میشوند، برای اندازه کد بهینهسازی میگردند. بهطور پیشفرض در -O1 و بالاتر فعال است.
- -fipa-modref
- تحلیل بینرویهای mod/ref را انجام میدهد. این بهینهسازی عوارض جانبی توابع (مکانهای حافظهای که اصلاح یا ارجاع داده شدهاند) را تحلیل کرده و بهینهسازی بهتری را در مرزهای فراخوانی تابع ممکن میسازد. این پرچم بهطور پیشفرض در -O1 و بالاتر فعال است.
- -fipa-cp
- انتشار بینرویهای مقادیر ثابت را انجام میدهد. این بهینهسازی برنامه را تحلیل میکند تا مشخص شود چه زمانی مقادیر ارسالشده به توابع ثابت هستند و سپس بر اساس آن بهینهسازی میکند. اگر برنامه مقادیر ثابتی داشته باشد که به توابع ارسال میشوند، این بهینهسازی میتواند کارایی را به میزان قابلتوجهی افزایش دهد. این پرچم بهطور پیشفرض در -O2، -Os و -O3 فعال است. همچنین توسط -fprofile-use و -fauto-profile نیز فعال میشود.
- -fipa-cp-clone
- کلونسازی توابع را برای تقویت انتشار بینرویهای مقادیر ثابت انجام میدهد. در صورت فعال بودن، هرگاه تابعی که از بیرون قابل مشاهده است با آرگومانهای ثابت فراخوانیپذیر باشد، انتشار بینرویهای مقادیر ثابت کلونسازی تابع را انجام میدهد. از آنجا که این بهینهسازی میتواند چندین نسخه از توابع ایجاد کند، ممکن است اندازه کد را به طور چشمگیری افزایش دهد (نگاه کنید به --param ipa-cp-unit-growth=value). این پرچم بهطور پیشفرض در -O3 فعال است. همچنین توسط -fprofile-use و -fauto-profile نیز فعال میشود.
- -fipa-bit-cp
- در صورت فعال بودن، انتشار بینرویهای بیتیِ مقادیر ثابت را انجام میدهد. این پرچم بهطور پیشفرض در -O2 و توسط -fprofile-use و -fauto-profile فعال است. این گزینه نیازمند فعال بودن -fipa-cp است.
- -fipa-vrp
- در صورت فعال بودن، انتشار بینرویهای بازههای مقادیر را انجام میدهد. این پرچم بهطور پیشفرض در -O2 فعال است. این گزینه نیازمند فعال بودن -fipa-cp است.
- -fipa-icf
- تا کردن
کدهای
همسان (Identical Code Folding)
را برای
توابع و
متغیرهای
فقطخواندنی
انجام
میدهد. این
بهینهسازی
اندازه کد
را کاهش
میدهد و
ممکن است با
جایگزین
کردن یک
تابع با
تابع معادل
با نام
دیگر، پشته
unwind را مختل
کند. این
بهینهسازی
با فعال
بودن
بهینهسازی
زمان پیوند
مؤثرتر عمل
میکند.
اگرچه رفتار آن مشابه بهینهسازی ICF پیونددهنده Gold است، اما ICF در GCC در سطوح متفاوتی عمل میکند و بنابراین بهینهسازیها یکسان نیستند - معادلهایی وجود دارند که تنها توسط GCC یافت میشوند و معادلهایی که تنها توسط Gold یافت میشوند.
این پرچم بهطور پیشفرض در -O2 و -Os فعال است.
- -flate-combine-instructions
- دو گذر
ترکیب
دستورالعمل
را که
نسبتاً در
مراحل
پایانی
فرایند
کامپایل
اجرا
میشوند،
فعال
میکند. یکی
از گذرها
قبل از
تخصیص ثبات
و دیگری بعد
از تخصیص
ثبات اجرا
میشود. هدف
اصلی این
گذرها
جایگزینی
تعاریف در
تمام
استفادهها
است.
بیشتر معماریهای مقصد این پرچم را بهطور پیشفرض در -O2 و -Os فعال میکنند.
- -flive-patching=level
- بهینهسازیهای
GCC را برای
تولید
خروجی
مناسب
وصلهزدن
زنده (live-patching)
کنترل
میکند.
اگر بهینهسازی کامپایلر از بدنه یک تابع یا اطلاعات استخراجشده از بدنه آن برای بهینهسازی/تغییر تابع دیگری استفاده کند، تابع دوم را «تابع تحتتأثیر» تابع اول مینامند. اگر تابعی وصله شود، توابع تحتتأثیر آن نیز باید وصله شوند.
توابع تحتتأثیر توسط بهینهسازیهای بینرویهای کامپایلر تعیین میشوند. برای نمونه، فراخواننده تحتتأثیر قرار میگیرد هنگامی که تابعی درونخطیسازی (inline) شده در فراخوانندهاش باشد، تابعی کلون شده و فراخواننده برای فراخوانی این کلون جدید تغییر یابد، یا اطلاعات خلوص/ثابت بودن (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
- مسیرهایی را که به دلیل استفاده از یک مقدار تهی (null) به روشی که توسط ویژگیهای "returns_nonnull" یا "nonnull" ممنوع شده است موجب رفتار اشتباه یا تعریفنشده میشوند، شناسایی میکند. این مسیرها را از جریان اصلی کنترل تفکیک کرده و دستور دارای رفتار اشتباه یا تعریفنشده را به یک تله (trap) تبدیل میکند. این گزینه در حال حاضر فعال نیست، اما ممکن است در آینده توسط -O2 فعال شود.
- -ftree-sink
- جابهجایی رو به جلوی ذخیرهسازی (forward store motion) را روی درختها انجام میدهد. این پرچم بهطور پیشفرض در -O1 و بالاتر فعال است.
- -ftree-bit-ccp
- انتشار شرطی تنک مقادیر ثابت بیتی را روی درختها انجام داده و اطلاعات همترازی اشارهگرها را منتشر میکند. این گذر تنها بر روی متغیرهای محلی اسکالر عمل میکند و بهطور پیشفرض در -O1 و بالاتر، به جز -Og، فعال است. این گزینه نیازمند فعال بودن -ftree-ccp است.
- -ftree-ccp
- انتشار شرطی تنک مقادیر ثابت (CCP) را روی درختها انجام میدهد. این گذر تنها بر روی متغیرهای محلی اسکالر عمل میکند و بهطور پیشفرض در -O1 و بالاتر فعال است.
- -fssa-backprop
- اطلاعات مربوط به موارد استفاده از یک مقدار را در طول زنجیره تعاریف به سمت بالا منتشر میکند تا تعاریف سادهسازی شوند. برای مثال، اگر علامت یک مقدار هیچ اهمیتی نداشته باشد، این گذر عملیاتهای مربوط به علامت را حذف میکند. این پرچم بهطور پیشفرض در -O1 و بالاتر فعال است.
- -fssa-phiopt
- تطبیق الگو را روی گرههای PHI در SSA جهت بهینهسازی کدهای شرطی انجام میدهد. این گذر بهطور پیشفرض در -O1 و بالاتر، به جز -Og، فعال است.
- -ftree-switch-conversion
- تبدیل مقداردهیهای اولیه ساده در دستور switch را به مقداردهی اولیه از یک آرایه اسکالر انجام میدهد. این پرچم بهطور پیشفرض در -O2 و بالاتر فعال است.
- -ftree-tail-merge
- توالیهای کد همسان را جستجو میکند. در صورت یافتن، یکی را با یک پرش به دیگری جایگزین میکند. این بهینهسازی با نامهای ادغام انتهای کد (tail merging) یا cross jumping شناخته میشود. این پرچم بهطور پیشفرض در -O2 و بالاتر فعال است. زمان کامپایل در این گذر میتواند با استفاده از پارامتر max-tail-merge-comparisons و پارامتر max-tail-merge-iterations محدود شود..IP -ftree-cselim 4 حذف ذخیرهسازی شرطی (conditional store elimination) را روی درختها انجام میدهد. این پرچم بهطور پیشفرض در -O1 و بالاتر روی مقصدهایی که دارای دستورالعملهای انتقال شرطی هستند، فعال است.
- -ftree-dce
- حذف کد مرده (DCE) را روی درختها انجام میدهد. این پرچم بهطور پیشفرض در -O1 و بالاتر فعال است.
- -ftree-builtin-call-dce
- حذف شرطی کد مرده (DCE) را برای فراخوانی توابع داخلی (built-in) که ممکن است "errno" را مقداردهی کنند اما در غیر این صورت فاقد اثر جانبی هستند، انجام میدهد. این پرچم بهطور پیشفرض در -O2 و بالاتر، در صورتی که -Os نیز مشخص نشده باشد، فعال است.
- -ffinite-loops
- فرض میکند
حلقهای که
دارای خروج
است، در
نهایت از آن
خروج
استفاده
کرده و تا
ابد تکرار
نخواهد شد.
این به
کامپایلر
اجازه
میدهد
حلقههایی
را که در
غیر این
صورت هیچ
اثر جانبی
ندارند حذف
کند، بدون
اینکه
احتمال
اجرای
بیپایان
حلقه را به
عنوان اثر
جانبی در
نظر بگیرد.
این گزینه بهطور پیشفرض در -O2 برای زبان ++C با -std=c++11 یا بالاتر فعال است.
- -ftree-dominator-opts
- مجموعهای از پاکسازیهای اسکالر ساده (انتشار ثابت/رونوشت، حذف افزونگی، انتشار دامنه و سادهسازی عبارات) را بر پایه پیمایش درخت تسلط (dominator tree) انجام میدهد. این گزینه همچنین ریسهبندی پرشها (jump threading، برای کاهش پرشها به پرشهای دیگر) را انجام میدهد. این پرچم بهطور پیشفرض در -O1 و بالاتر فعال است.
- -ftree-dse
- حذف ذخیرهسازی مرده (DSE) را روی درختها انجام میدهد. یک ذخیرهسازی مرده، ذخیرهای در یک مکان حافظه است که بعداً بدون هیچ بارگذاری مداخلهگری، با یک ذخیرهسازی دیگر بازنویسی میشود. در این حالت، ذخیرهسازی اولیه میتواند حذف شود. این پرچم بهطور پیشفرض در -O1 و بالاتر فعال است.
- -ftree-ch
- رونوشتبرداری از سرآیند حلقه (loop header copying) را روی درختها انجام میدهد. این کار سودمند است چرا که کارایی بهینهسازیهای انتقال کد را افزایش میدهد. همچنین صرفهجویی در یک پرش را به همراه دارد. این پرچم بهطور پیشفرض در -O1 و بالاتر فعال است. این پرچم برای -Os فعال نیست، زیرا معمولاً اندازه کد را افزایش میدهد.
- -ftree-loop-optimize
- بهینهسازیهای حلقه را روی درختها انجام میدهد. این پرچم بهطور پیشفرض در -O1 و بالاتر فعال است.
- -ftree-loop-linear
- -floop-strip-mine
- -floop-block
- بهینهسازیهای حلقههای تودرتو را انجام میدهد. همانند -floop-nest-optimize است. برای استفاده از این تبدیل کد، GCC باید با --with-isl پیکربندی شده باشد تا زیرساخت تبدیل حلقه Graphite فعال شود.
- -fgraphite-identity
- تبدیل همانی (identity transformation) را برای 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
- تلاش میکند پرشهای شرطی در درونیترین حلقهها را به معادلهای بدون انشعاب (branch-less) تبدیل کند. هدف، حذف جریان کنترل از درونیترین حلقهها به منظور بهبود توانایی مرحله برداریسازی (vectorization pass) در مدیریت این حلقهها است. این گزینه در صورت فعال بودن برداریسازی، بهطور پیشفرض فعال است.
- -ftree-loop-distribution
- توزیع حلقه
(loop distribution) را
انجام
میدهد. این
پرچم
میتواند
کارایی
حافظه
پنهان (cache) را
روی
بدنههای
بزرگ حلقه
بهبود بخشد
و امکان
اجرای
بهینهسازیهای
بیشتر
حلقه،
مانند
موازیسازی
یا
برداریسازی
را فراهم
کند. برای
مثال، حلقه
DO I = 1, N A(I) = B(I) + C D(I) = E(I) * F ENDDO
به شکل زیر تبدیل میشود:
DO I = 1, N A(I) = B(I) + C ENDDO DO I = 1, N D(I) = E(I) * F ENDDO
این پرچم بهطور پیشفرض در -O3 فعال است. همچنین توسط -fprofile-use و -fauto-profile فعال میشود.
- -ftree-loop-distribute-patterns
- توزیع حلقه
الگوهایی
را که
میتوانند
با
فراخوانیهایی
به یک
کتابخانه
تولید کد
شوند،
انجام
میدهد. این
پرچم
بهطور
پیشفرض در
-O2 و
بالاتر، و
توسط -fprofile-use و
-fauto-profile فعال
است.
این مرحله، حلقههای مقداردهی اولیه را توزیع کرده و فراخوانی به memset صفر را تولید میکند. برای مثال، حلقه
DO I = 1, N A(I) = 0 B(I) = A(I) + I ENDDO
به شکل زیر تبدیل میشود:
DO I = 1, N A(I) = 0 ENDDO DO I = 1, N B(I) = A(I) + I ENDDO
و حلقه مقداردهی اولیه به فراخوانی memset صفر تبدیل میشود.
- -floop-interchange
- جابجایی
حلقه (loop interchange) را
در خارج از
Graphite انجام
میدهد. این
پرچم
میتواند
کارایی
حافظه
پنهان را
روی
حلقههای
تودرتو
بهبود بخشد
و امکان
اجرای
بهینهسازیهای
بیشتر
حلقه،
مانند
برداریسازی
را فراهم
کند. برای
مثال، حلقه
for (int i = 0; i < N; i++) for (int j = 0; j < N; j++) for (int k = 0; k < N; k++) c[i][j] = c[i][j] + a[i][k]*b[k][j];به شکل زیر تبدیل میشود:
for (int i = 0; i < N; i++) for (int k = 0; k < N; k++) for (int j = 0; j < N; j++) c[i][j] = c[i][j] + a[i][k]*b[k][j];این پرچم بهطور پیشفرض در -O3 فعال است. همچنین توسط -fprofile-use و -fauto-profile فعال میشود.
- -floop-unroll-and-jam
- تبدیلهای باز کردن و ادغام حلقه (unroll and jam) را روی حلقههای مناسب اعمال میکند. در یک حلقه تودرتو، این کار حلقه بیرونی را با ضریبی مشخص باز کرده و چندین حلقه درونی حاصل را ادغام میکند. این پرچم بهطور پیشفرض در -O3 فعال است. همچنین توسط -fprofile-use و -fauto-profile فعال میشود.
- -ftree-loop-im
- انتقال نامتغیرهای حلقه (loop invariant motion) را روی درختها انجام میدهد. این مرحله تنها نامتغیرهایی را جابجا میکند که مدیریت آنها در سطح RTL دشوار است (فراخوانی توابع، عملیاتی که به توالیهای غیربدیهی از دستورالعملها منبسط میشوند). همراه با -funswitch-loops، همچنین عملوندهای شرایطی را که نامتغیر هستند به بیرون حلقه منتقل میکند، به طوری که بتوانیم از تحلیل ساده نامتغیر بودن در جداسازی شرط حلقه (loop unswitching) استفاده کنیم. این مرحله انتقال ذخیرهسازی (store motion) را نیز شامل میشود..IP -ftree-loop-ivcanon 4 یک شمارنده کانونیکال (معیار) برای تعداد تکرارها در حلقههایی ایجاد میکند که تعیین تعداد تکرار در آنها نیازمند تحلیلهای پیچیده است. بهینهسازیهای بعدی سپس میتوانند این تعداد را بهآسانی مشخص کنند. این گزینه بهویژه در ارتباط با باز کردن حلقه (unrolling) مفید است.
- -ftree-scev-cprop
- جایگزینی مقدار نهایی را انجام میدهد. اگر متغیری در یک حلقه بهگونهای تغییر کند که مقدار آن هنگام خروج از حلقه تنها با استفاده از مقدار اولیه آن و تعداد تکرارهای حلقه قابل تعیین باشد، استفادهها از مقدار نهایی را با چنین محاسبهای جایگزین میکند، به شرطی که بهاندازه کافی کمهزینه باشد. این کار وابستگیهای دادهای را کاهش داده و ممکن است سادهسازیهای بیشتری را میسر کند. بهطور پیشفرض در -O1 و بالاتر فعال است.
- -fivopts
- بهینهسازیهای متغیر القایی (کاهش توان محاسباتی، ادغام متغیر القایی و حذف متغیر القایی) را روی درختها انجام میدهد. بهطور پیشفرض در -O1 و بالاتر فعال است.
- -ftree-parallelize-loops=n
- حلقهها را موازیسازی میکند، یعنی فضای تکرار آنها را برای اجرا در n رشته (thread) تقسیم میکند. این کار تنها برای حلقههایی امکانپذیر است که تکرارهای آنها مستقل از یکدیگر بوده و بتوان ترتیب آنها را بهصورت دلخواه تغییر داد. این بهینهسازی تنها روی ماشینهای چندپردازندهای و برای حلقههایی سودمند است که پردازندهمحور (CPU-intensive) هستند، نه حلقههایی که مثلاً توسط پهنای باند حافظه محدود شدهاند. این گزینه مستلزم -pthread است و بنابراین تنها روی مقصدهایی که از -pthread پشتیبانی میکنند قابل استفاده است.
- -ftree-pta
- تحلیل اشارهگری محلیِ تابع (points-to analysis) را روی درختها انجام میدهد. این پرچم بهطور پیشفرض در -O1 و بالاتر، بهجز -Og، فعال است.
- -ftree-sra
- جایگزینی اسکالر برای ساختارها/مجموعهها (aggregates) را انجام میدهد. این گذر، مراجع ساختار را با مقادیر اسکالر جایگزین میکند تا از ارسال زودهنگام ساختارها به حافظه جلوگیری شود. این پرچم بهطور پیشفرض در -O1 و بالاتر، بهجز -Og، فعال است.
- -fstore-merging
- ادغام ذخیرهسازیهای باریک در آدرسهای متوالی حافظه را انجام میدهد. این گذر، ذخیرهسازیهای پیوسته از مقادیر فوری که باریکتر از یک کلمه (word) هستند را در ذخیرهسازیهای عریضتر و کمتعدادتر ادغام میکند تا تعداد دستورالعملها کاهش یابد. این گزینه بهطور پیشفرض در -O2 و بالاتر و همچنین -Os فعال است.
- -ftree-ter
- جایگزینی عبارات موقت را در طول فاز SSA->normal انجام میدهد. متغیرهای موقت با یکبار تعریف/یکبار استفاده در محل استفادهشان با عبارت تعریفکنندهشان جایگزین میشوند. این کار به کدی غیر از GIMPLE منجر میشود، اما درختهای بسیار پیچیدهتری در اختیار expanderها قرار میدهد که حاصل آن تولید RTL بهتر است. این گزینه بهطور پیشفرض در -O1 و بالاتر فعال است.
- -ftree-slsr
- کاهش توان محاسباتی خط مستقیم (straight-line strength reduction) را روی درختها انجام میدهد. این گذر عبارتهای مرتبطِ شامل عمل ضرب را شناسایی کرده و در صورت امکان آنها را با محاسبات کمهزینهتر جایگزین میکند. این گزینه بهطور پیشفرض در -O1 و بالاتر فعال است.
- -ftree-vectorize
- برداریسازی را روی درختها انجام میدهد. این پرچم در صورت عدم تعیین صریح، گزینههای -ftree-loop-vectorize و -ftree-slp-vectorize را فعال میکند.
- -ftree-loop-vectorize
- برداریسازی حلقه را روی درختها انجام میدهد. این پرچم بهطور پیشفرض در -O2 و توسط -ftree-vectorize، -fprofile-use، و -fauto-profile فعال میشود.
- -ftree-slp-vectorize
- برداریسازی بلوک پایه (basic block) را روی درختها انجام میدهد. این پرچم بهطور پیشفرض در -O2 و توسط -ftree-vectorize، -fprofile-use، و -fauto-profile فعال میشود.
- -ftrivial-auto-var-init=choice
- متغیرهای
خودکار (automatic variables)
را با یک
الگو یا با
صفر
مقداردهی
اولیه
میکند تا
امنیت و
پیشبینیپذیری
برنامه با
جلوگیری از
افشا و
استفاده از
حافظه
مقداردهینشده
افزایش
یابد. GCC
همچنان
متغیر
خودکاری را
که
مقداردهی
اولیه صریح
ندارد،
مقداردهینشده
در نظر
میگیرد؛
پرچمهای
-Wuninitialized و
-Wanalyzer-use-of-uninitialized-value
همچنان
پیامهای
هشدار را
برای چنین
متغیرهای
خودکاری
گزارش
خواهند کرد
و کامپایلر
بهینهسازی
را طوری
انجام
میدهد که
گویی متغیر
مقداردهینشده
است. با این
گزینه، GCC
همچنین
هرگونه
لایهبندی/فاصلهگذاری
(padding) متغیرهای
خودکار با
نوع ساختار
یا union را با
صفر
مقداردهی
اولیه
میکند. با
این حال،
پیادهسازی
فعلی
نمیتواند
متغیرهای
خودکاری را
که بین
عبارت
کنترلی و
اولین case از
یک دستور
"switch"
اعلان
شدهاند
مقداردهی
اولیه کند.
از -Wtrivial-auto-var-init
برای گزارش
تمام چنین
مواردی
استفاده
کنید.
سه مقدار ممکن برای choice عبارتند از:
- uninitialized هیچ متغیر خودکاری را مقداردهی اولیه نمیکند. این رفتار پیشفرض زبانهای C و ++C است.
- pattern متغیرهای خودکار را با مقادیری مقداردهی اولیه میکند که احتمالاً باگهای منطقی را در ادامه اجرا به کرش تبدیل میکنند، در crash dump بهآسانی قابل تشخیص هستند و در عین حال مقادیری نیستند که برنامهنویسان بتوانند برای معناشناسی مفید برنامه به آنها تکیه کنند. مقدار فعلی یک الگوی تکرارشونده بایتی با بایت "0xFE" است. مقادیر استفادهشده برای مقداردهی اولیه الگو ممکن است در آینده تغییر کنند.
- zero متغیرهای خودکار را با صفر مقداردهی اولیه میکند.
مقدار پیشفرض uninitialized است.
توجه داشته باشید که مقادیر مقداردهی اولیه، چه zero و چه pattern، به بازنمایی داده (در حافظه یا ثباتهای ماشین) اشاره دارند، نه به تفسیر آنها بهعنوان مقادیر عددی. این تمایز ممکن است در زبانهایی که از انواع داده با bias یا ضریبهای ضمنی پشتیبانی میکنند و با افزونههایی نظیر hardbool مهم باشد. برای مثال، متغیری که از ۸ بیت برای بازنمایی مقادیر (با بایاس) در "range 160..400" استفاده میکند، بسته به choice، با الگوهای بیتی 0x00 یا 0xFE مقداردهی اولیه خواهد شد؛ صرفنظر از اینکه این بازنماییها نشاندهنده مقادیری در آن بازه باشند یا خیر، و حتی اگر باشند، تفسیر مقدار نگهداریشده توسط متغیر به بایاس بستگی خواهد داشت. یک متغیر hardbool که مثلاً از "0X5A" و 0xA5 به ترتیب برای "false" و "true" استفاده میکند، با هر choice از مقداردهندههای اولیه بدیهی دچار trap خواهد شد؛ یعنی مقداردهی zero به بازنمایی "false" تبدیل نمیشود، حتی اگر برای یک متغیر "static" از همان نوع چنین میشد. این بدان معناست که الگوی مقداردهی اولیه عموماً به نوع متغیر مقداردهیشده وابسته نیست. یک استثنای قابل توجه این است که متغیرهای بولی (سختنشده / non-hardened) که در ثباتها جای میگیرند، حتی زمانی که pattern درخواست شده باشد، با "false" (صفر) مقداردهی اولیه میشوند.
میتوانید این رفتار را برای یک متغیر خاص با استفاده از خصوصیت متغیر "uninitialized" کنترل کنید.
- -fvect-cost-model=model
- مدل هزینه
مورد
استفاده
برای
برداریسازی
را تغییر
میدهد.
آرگومان model
باید یکی از
unlimited، dynamic، cheap
یا very-cheap باشد.
با مدل unlimited
فرض میشود
که مسیر کد
برداریشده
همیشه
سودمند
است، در
حالی که در
مدل dynamic یک
بررسی زمان
اجرا (runtime check) از
مسیر کد
برداریشده
محافظت
میکند تا
آن را تنها
برای تعداد
تکرارهایی
فعال سازد
که
احتمالاً
سریعتر از
اجرای حلقه
اسکالر
اصلی اجرا
خواهند شد.
مدل 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) را روی درختها انجام میدهد. این شبیه به گذر انتشار مقدار ثابت (constant propagation) است، اما بهجای مقادیر، دامنههایی از مقادیر منتشر میشوند. این امر به بهینهسازها امکان میدهد بررسیهای غیرضروری دامنه مانند بررسی محدوده آرایه و بررسی اشارهگر تهی (null) را حذف کنند. این گزینه بهطور پیشفرض در -O2 و بالاتر فعال است. حذف بررسی اشارهگر تهی تنها در صورتی انجام میشود که -fdelete-null-pointer-checks فعال باشد.
- -fsplit-paths
- مسیرهای منتهی به یالهای بازگشتی حلقه (loop backedges) را تقسیم میکند. این میتواند حذف کد مرده (dead code elimination) و حذف عبارات فرعی مشترک (common subexpression elimination) را بهبود بخشد. این گزینه بهطور پیشفرض در -O3 و بالاتر فعال است.
- -fsplit-ivs-in-unroller
- بیان
مقادیر
متغیرهای
القایی را
در
تکرارهای
بعدیِ حلقه
بازشده با
استفاده از
مقدار در
اولین
تکرار فعال
میکند. این
کار
زنجیرههای
طولانی
وابستگی را
میشکند و
در نتیجه
کارایی
گذرهای
زمانبندی
را بهبود
میبخشد.
ترکیبی از -fweb و CSE معمولاً برای دستیابی به همین اثر کافی است. با این حال، در مواردی که بدنه حلقه پیچیدهتر از یک بلوک پایه تکی باشد، قابل اعتماد نیست. همچنین به دلیل محدودیتهای موجود در گذر CSE، روی برخی معماریها اصلاً کار نمیکند.
این بهینهسازی بهطور پیشفرض فعال است..IP -fvariable-expansion-in-unroller 4 با این گزینه، کامپایلر هنگام باز کردن حلقه (loop unrolling)، چندین رونوشت از برخی متغیرهای محلی ایجاد میکند که میتواند به تولید کدی کارآمدتر بیانجامد.
این بهینهسازی بهطور پیشفرض برای مقصدهای PowerPC فعال است، اما در غیر این صورت بهطور پیشفرض غیرفعال است.
- -fpartial-inlining
- درونخطسازی
بخشهایی
از توابع.
این گزینه
تنها زمانی
مؤثر است که
درونخطسازی
خود توسط
گزینههای
-finline-functions یا -finline-small-functions
فعال شده
باشد.
در سطوح -O2، -O3 و -Os فعال است.
- -fpredictive-commoning
- انجام
بهینهسازی
اشتراک
پیشگویانه
(predictive commoning)، یعنی
استفاده
مجدد از
محاسبات
(بهویژه
بارگذاریها
و
ذخیرهسازیهای
حافظه) که
در
تکرارهای
پیشین
حلقهها
انجام
شدهاند.
این گزینه در سطح -O3 فعال است. همچنین توسط گزینههای -fprofile-use و -fauto-profile فعال میشود.
- -fprefetch-loop-arrays
- در صورت
پشتیبانی
توسط ماشین
مقصد،
دستورالعملهایی
برای
پیشواکشی
(prefetch) حافظه
تولید
میکند تا
کارایی
حلقههایی
که به
آرایههای
بزرگ
دسترسی
دارند،
بهبود یابد.
این گزینه ممکن است کدی بهتر یا بدتر تولید کند؛ نتایج بهشدت به ساختار حلقهها در کد منبع بستگی دارد.
در سطح -Os غیرفعال است.
- -fno-printf-return-value
- مقادیر
ثابت را
جایگزین
مقادیر
بازگشتیِ
مشخص توابع
خروجی
قالببندیشده
نظیر
"sprintf"،
"snprintf"،
"vsprintf" و
"vsnprintf" (اما
نه "printf"
یا "fprintf")
نمیکند.
این تبدیل
به GCC امکان
میدهد تا
انشعابها
را بر اساس
مقدار
بازگشتی
مشخص این
توابع،
زمانی که با
آرگومانهای
ثابت یا
مقادیری
فراخوانی
میشوند که
در
محدودهای
معلوم قرار
دارند و
تعیین
مقدار
بازگشتی
دقیق را
ممکن
میسازند،
بهینهسازی
یا حتی حذف
کند. برای
مثال،
هنگامی که
-fprintf-return-value فعال
است، اگر
"i" یک
عدد صحیح ۳۲
بیتی یا
کوچکتر
باشد، هم
انشعاب و هم
بدنه دستور
"if" (به جز
فراخوانی
"snprint")
میتوانند
حذف شوند؛
زیرا تضمین
میشود
مقدار
بازگشتی
حداکثر ۸
خواهد بود.
char buf[9]; if (snprintf (buf, "%08x", i) >= sizeof buf) ...
گزینه -fprintf-return-value به بهینهسازیهای دیگر وابسته است و در سطح -O2 و بالاتر بهترین نتایج را به دست میدهد. این گزینه در هماهنگی با گزینههای -Wformat-overflow و -Wformat-truncation کار میکند. گزینه -fprintf-return-value بهطور پیشفرض فعال است.
- -fno-peephole
- -fno-peephole2
- غیرفعال
کردن
هرگونه
بهینهسازی
روزنهای
(peephole) وابسته
به ماشین.
تفاوت بین
-fno-peephole و -fno-peephole2 در
نحوه
پیادهسازی
آنها در
کامپایلر
است؛ برخی
مقصدها از
یکی
استفاده
میکنند،
برخی دیگر
از دیگری، و
اندکی از هر
دو.
گزینه -fpeephole بهطور پیشفرض فعال است. گزینه -fpeephole2 در سطوح -O2، -O3 و -Os فعال میشود.
- -fno-guess-branch-probability
- احتمالات
انشعاب را
با استفاده
از روشهای
مکاشفهای
(heuristics) حدس
نمیزند.
اگر احتمالات توسط بازخورد پروفایلسازی (-fprofile-arcs) ارائه نشده باشد، GCC از روشهای مکاشفهای برای حدس زدن احتمالات انشعاب استفاده میکند. این روشها بر پایه گراف جریان کنترل (control flow graph) هستند. اگر برخی از احتمالات انشعاب توسط "__builtin_expect" مشخص شده باشند، روشهای مکاشفهای با در نظر گرفتن اطلاعات "__builtin_expect" برای حدس زدن احتمالات انشعاب برای بقیه گراف جریان کنترل به کار گرفته میشوند. برهمکنش میان روشهای مکاشفهای و "__builtin_expect" میتواند پیچیده باشد، و در برخی موارد، ممکن است غیرفعال کردن روشهای مکاشفهای مفید باشد تا درک اثرات "__builtin_expect" آسانتر شود.
همچنین میتوان احتمال مورد انتظار عبارت را با استفاده از تابع توکار "__builtin_expect_with_probability" تعیین کرد.
پیشفرض در سطوح -O، -O2، -O3 و -Os گزینه -fguess-branch-probability است.
- -freorder-blocks
- بازتوالی
بلوکهای
پایه در
تابع
کامپایلشده
بهمنظور
کاهش تعداد
انشعابهای
طیشده و
بهبود
محلیسازی
کُد (code locality).
در سطوح -O1، -O2، -O3 و -Os فعال است.
- -freorder-blocks-algorithm=algorithm
- استفاده از
الگوریتم
مشخصشده
برای
بازتوالی
بلوکهای
پایه.
آرگومان algorithm
میتواند
simple باشد که
حجم کد را
افزایش
نمیدهد
(مگر گاهی
به دلیل
اثرات
ثانویه
مانند
همترازی)،
یا stc
(الگوریتم
"software trace cache") باشد
که میکوشد
تمام کدهای
مکرراً
اجراشده را
در کنار هم
قرار دهد، و
با ایجاد
رونوشتهای
اضافی از
کد، تعداد
انشعابهای
اجراشده را
به حداقل
برساند.
پیشفرض در سطوح -O1 و -Os مقدار simple است و در سطوح -O2 و -O3 مقدار stc است.
- -freorder-blocks-and-partition
- علاوه بر
بازتوالی
بلوکهای
پایه در
تابع
کامپایلشده
بهمنظور
کاهش تعداد
انشعابهای
طیشده،
بلوکهای
پایه داغ (hot) و
سرد (cold) را در
بخشهای
جداگانهای
از
فایلهای
اسمبلی و .o
افرازبندی
(پارتیشنبندی)
میکند تا
عملکرد
صفحهبندی
(paging) و
محلیسازی
حافظه نهان
(cache locality) بهبود
یابد.
این بهینهسازی در صورت وجود مدیریت استثنا یا جدولهای بازپیچی (unwind tables) (در مقصدهایی که از setjump/longjump یا طرح اختصاصی مقصد استفاده میکنند)، برای بخشهای linkonce، برای توابع دارای صفت section تعریفشده توسط کاربر، و روی هر معماری که از بخشهای نامگذاریشده پشتیبانی نمیکند، بهطور خودکار خاموش میشود. هنگامی که -fsplit-stack استفاده میشود این گزینه بهطور پیشفرض فعال نیست (برای جلوگیری از خطاهای پیونددهنده)، اما ممکن است بهصراحت فعال شود (در صورت استفاده از یک پیونددهنده کارآمد).
برای x86 در سطوح -O2، -O3 و -Os فعال است.
- -freorder-functions
- بازتوالی
توابع در
فایل شیء (object file)
بهمنظور
بهبود
محلیسازی
کُد. برخلاف
-fipa-reorder-for-locality، این
گزینه
گروهبندی
تمام توابع
درون یک
دسته
(داغ/عادی/سرد/هرگز
اجرانشده)
را در کنار
هم
اولویتبندی
میکند. این
سازوکار با
استفاده از
زیربخشهای
ویژه
".text.hot"
برای
پرکاربردترین
توابع
اجراشده و
".text.unlikely"
برای
توابعی که
بعید است
اجرا شوند
پیادهسازی
شده است.
بازتوالی
توسط
پیونددهنده
انجام
میشود،
بنابراین
ساختار
فایل شیء
باید از
بخشهای
نامگذاریشده
پشتیبانی
کند و
پیونددهنده
باید آنها
را
بهگونهای
معقول
جایگذاری
کند.
این گزینه اثرگذار نخواهد بود مگر اینکه بازخورد پروفایلسازی ارائه دهید (برای جزئیات به -fprofile-arcs مراجعه کنید) یا بهصورت دستی توابع را با ویژگیهای "hot" یا "cold" مشخص کنید.
در سطوح -O2، -O3 و -Os فعال است.
- -fstrict-aliasing
- به
کامپایلر
اجازه
میدهد
سختگیرانهترین
قوانین نام
مستعار (aliasing rules)
قابلاعمال
برای زبان
در حال
کامپایل را
فرض کند.
برای C (و ++C)،
این گزینه
بهینهسازیها
را بر اساس
نوع
عبارتها
فعال
میکند.
بهطور
خاص، فرض
میشود
شیئی از یک
نوع هرگز در
آدرسی
مشابه با
شیئی از نوع
دیگر قرار
نمیگیرد،
مگر اینکه
آن نوعها
تقریباً
یکسان
باشند. برای
نمونه، یک
"unsigned int"
میتواند
با یک "int"
نام مستعار
(alias) شود، اما
با یک
"void*" یا
"double"
نمیتواند.
یک نوع
کاراکتری
ممکن است با
هر نوع
دیگری alias شود.
به کدهایی مانند این توجه ویژهای داشته باشید:
union a_union { int i; double d; }; int f() { union a_union t; t.d = 3.0; return t.i; }رویکرد خواندن از عضوی از union متفاوت با عضوی که اخیراً درون آن نوشته شده است (که "type-punning" نامیده میشود) متداول است. حتی با -fstrict-aliasing نیز type-punning مجاز است، به شرطی که دسترسی به حافظه از طریق نوع union انجام شود. بنابراین، کد بالا همانطور که انتظار میرود عمل میکند. با این حال، کد زیر ممکن است درست کار نکند:
int f() { union a_union t; int* ip; t.d = 3.0; ip = &t.i; return *ip; }بهطور مشابه، دسترسی با گرفتن آدرس، تبدیل نوع (cast) اشارهگر حاصل و ارجاعزدایی (dereference) نتیجه، دارای رفتار تعریفنشده (undefined behavior) است، حتی اگر تبدیل نوع از یک نوع union استفاده کند؛ برای نمونه: int f() { double d = 3.0; return ((union a_union *) &d)->i; }
گزینهٔ -fstrict-aliasing در سطوح -O2، -O3 و -Os فعال میشود.
- -fipa-strict-aliasing
- کنترل
میکند که
آیا قواعد
-fstrict-aliasing در
مرزهای
توابع
اعمال شوند
یا خیر.
توجه داشته
باشید که
اگر چندین
تابع در یک
تابع
درونخطی (inline)
شوند،
دسترسیهای
حافظه دیگر
عبور از مرز
تابع در نظر
گرفته
نمیشوند.
گزینهٔ -fipa-strict-aliasing بهطور پیشفرض فعال است و تنها در ترکیب با -fstrict-aliasing مؤثر واقع میشود.
- -falign-functions
- -falign-functions=n
- -falign-functions=n:m
- -falign-functions=n:m:n2
- -falign-functions=n:m:n2:m2
- ابتدای
توابع را با
پرش از
حداکثر m-1
بایت، با
توان بعدی
دو که
بزرگتر یا
مساوی n است
تراز
میکند. این
کار تضمین
میکند که
حداقل m
بایت نخست
تابع بدون
عبور از مرز
تراز n
بایتی توسط
پردازنده
واکشی (fetch) شود.
این یک
بهینهسازی
برای
کارایی کد
است و
ترازسازی
برای
توابعی که
سرد (cold) در نظر
گرفته
میشوند
نادیده
گرفته
میشود. اگر
ترازسازی
برای تمام
توابع مورد
نیاز است،
از -fmin-function-alignment
استفاده
کنید.
اگر m مشخص نشده باشد، مقدار پیشفرض آن برابر با n خواهد بود.
مثالها: -falign-functions=32 توابع را با مرز ۳۲ بایتی بعدی تراز میکند؛ -falign-functions=24 تنها در صورتی با مرز ۳۲ بایتی بعدی تراز میکند که این کار با پرش از ۲۳ بایت یا کمتر امکانپذیر باشد؛ -falign-functions=32:7 تنها در صورتی با مرز ۳۲ بایتی بعدی تراز میکند که با پرش از ۶ بایت یا کمتر قابل انجام باشد.
جفت دوم مقادیر n2:m2 به شما امکان میدهد یک ترازسازی ثانویه مشخص کنید: -falign-functions=64:7:32:3 در صورتی که با پرش از ۶ بایت یا کمتر امکانپذیر باشد با مرز ۶۴ بایتی بعدی تراز میکند، در غیر این صورت اگر با پرش از ۲ بایت یا کمتر امکانپذیر باشد با مرز ۳۲ بایتی بعدی تراز میکند. اگر m2 مشخص نشود، مقدار پیشفرض آن n2 است.
برخی از اسمبلرها تنها زمانی از این پرچم پشتیبانی میکنند که n توانی از دو باشد؛ در آن حالت، به سمت بالا گرد میشود.
گزینههای -fno-align-functions و -falign-functions=1 معادل یکدیگرند و به این معنی هستند که توابع تراز نمیشوند.
اگر n مشخص نشده باشد یا صفر باشد، از یک مقدار پیشفرض وابسته به ماشین استفاده میشود. بیشترین مقدار مجاز برای گزینهٔ n برابر با 65536 است.
در سطوح -O2 و -O3 فعال میشود.
- -flimit-function-alignment
- اگر این گزینه فعال باشد، کامپایلر تلاش میکند از تراز بیشازحد و غیرضروری توابع خودداری کند. کامپایلر سعی میکند به اسمبلر دستور دهد به میزانی که توسط -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 برابر با 65536 است.
در سطوح -O2 و -O3 فعال میشود.
- -falign-loops
- -falign-loops=n
- -falign-loops=n:m
- -falign-loops=n:m:n2
- -falign-loops=n:m:n2:m2
- حلقهها را
با مرز
توانی از دو
تراز
میکند. اگر
حلقهها
بارها اجرا
شوند، این
کار هزینهٔ
اجرای
هرگونه
دستور
ساختگی
پرکننده (dummy padding)
را جبران
میکند. این
یک
بهینهسازی
کارایی کد
است و
ترازسازی
برای
حلقههایی
که سرد در
نظر گرفته
میشوند
نادیده
گرفته
میشود.
اگر -falign-labels از این مقدار بزرگتر باشد، مقدار آن بهجای این مقدار استفاده میشود.
پارامترهای این گزینه مشابه گزینهٔ -falign-functions هستند. گزینههای -fno-align-loops و -falign-loops=1 معادل یکدیگرند و به این معنی هستند که حلقهها تراز نمیشوند. بیشترین مقدار مجاز برای گزینهٔ n برابر با 65536 است.
اگر n مشخص نشده باشد یا صفر باشد، از پیشفرض وابسته به ماشین استفاده میشود.
در سطوح -O2 و -O3 فعال میشود.
- -falign-jumps
- -falign-jumps=n
- -falign-jumps=n:m
- -falign-jumps=n:m:n2
- -falign-jumps=n:m:n2:m2
- مقصدهای
پرش را برای
آن دسته از
مقصدهایی
که تنها از
طریق پرش
قابل
دسترسی
هستند، با
مرز توانی
از دو تراز
میکند. در
این حالت
نیازی به
اجرای هیچ
دستور
ساختگی
نیست. این
یک
بهینهسازی
برای
کارایی کد
است و
ترازسازی
برای
پرشهایی
که سرد در
نظر گرفته
میشوند
نادیده
گرفته
میشود.
اگر -falign-labels از این مقدار بزرگتر باشد، مقدار آن بهجای این مقدار استفاده میشود.
پارامترهای این گزینه مشابه گزینهٔ -falign-functions هستند. گزینههای -fno-align-jumps و -falign-jumps=1 معادل یکدیگرند و به این معنی هستند که پرشها تراز نمیشوند.
اگر n مشخص نشده باشد یا صفر باشد، از یک پیشفرض وابسته به ماشین استفاده میشود. بیشترین مقدار مجاز برای گزینهٔ n برابر با 65536 است.
در سطوح -O2 و -O3 فعال میشود.
- -fmin-function-alignment
- حداقل تراز توابع را با توان بعدی دو که بزرگتر یا مساوی n است مشخص میکند. برعکس -falign-functions، این تراز بر روی تمام توابع (حتی توابعی که سرد در نظر گرفته شدهاند) نیز اعمال میشود. این تراز همچنین تحت تأثیر -flimit-function-alignment قرار نمیگیرد.
- -fno-allocation-dce
- تخصیصهای
استفادهنشدهٔ
++C (با
استفاده از
عملگرهای
"new" و
عملگرهای
"delete") را
در فرآیند
حذف کدهای
مرده (dead code elimination)
حذف
نمیکند.
همچنین گزینهٔ -fmalloc-dce را ببینید.
- -fallow-store-data-races
- به
کامپایلر
اجازه
میدهد
بهینهسازیهایی
را انجام
دهد که ممکن
است باعث
ایجاد
رقابتهای
دادهای (data races)
جدید در
عملیاتهای
ذخیرهسازی
(stores) شوند،
بدون آنکه
اثبات کند
متغیر
نمیتواند
بهطور
همروند
توسط
ریسمانهای
دیگر مورد
دسترسی
قرار گیرد.
این گزینه
بر
بهینهسازی
دادههای
محلی
تأثیری
ندارد. در
صورتی که
مشخص باشد
دادههای
سراسری
توسط چندین
ریسمان
مورد
دسترسی
قرار
نخواهند
گرفت،
استفاده از
این گزینه
امن است.
نمونههایی از بهینهسازیهای فعالشده توسط -fallow-store-data-races شامل بالابردن کد (hoisting) یا تبدیلهای شرطی (if-conversions) است که ممکن است باعث شوند مقداری که از قبل در حافظه بوده مجدداً با همان مقدار بازنویسی شود. چنین بازنویسیای در بستر تکریسمانی امن است اما ممکن است در بستر چندریسمانی ناامن باشد. توجه داشته باشید که در برخی پردازندهها، ممکن است تبدیلهای شرطی برای فعالسازی برداریسازی (vectorization) الزامی باشند.
در سطح -Ofast فعال میشود..IP -funit-at-a-time 4 این گزینه تنها به دلایل سازگاری باقی مانده است. -funit-at-a-time هیچ اثری ندارد، در حالی که -fno-unit-at-a-time به معنای -fno-toplevel-reorder و -fno-section-anchors است.
بهطور پیشفرض فعال است.
- -fno-toplevel-reorder
- توابع،
متغیرها و
عبارات
"asm" سطح
بالا (top-level) را
مرتبسازی
مجدد
نمیکند.
آنها را به
همان
ترتیبی که
در فایل
ورودی
آمدهاند
در خروجی
قرار
میدهد.
هنگامی که
این گزینه
استفاده
شود،
متغیرهای
استاتیکِ
ارجاعدادهنشده
حذف
نمیشوند.
این گزینه
برای
پشتیبانی
از کدهای
موجود
طراحی شده
است که به
ترتیب خاصی
وابسته
هستند. برای
کدهای
جدید، بهتر
است در صورت
امکان از
مشخصهها
(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،
بهینهساز
حلقه و حذف
کدهای
بیاثر
بدیهی را
تقویت
میکند. با
این حال،
ممکن است
اشکالزدایی
(debugging) را
غیرممکن
کند، چرا که
متغیرها
دیگر در یک
«ثبات
اصلی» (home register)
باقی
نمیمانند.
بهطور پیشفرض همراه با -funroll-loops فعال است.
- -fwhole-program
- فرض میکند
که واحد
کامپایل
جاری
نشاندهندهٔ
کل برنامه
در حال
کامپایل
است. تمام
توابع و
متغیرهای
عمومی به
استثنای
"main" و
مواردی که
با ویژگی
"externally_visible"
مشخص
شدهاند،
به توابع
استاتیک
تبدیل
میشوند و
در نتیجه
توسط
بهینهسازهای
بینروالی
(interprocedural optimizers) با
تهاجم
بیشتری
بهینهسازی
میشوند.
همراه با -flto این گزینه کاربرد محدودی دارد. در اغلب موارد، فهرست دقیق نمادهای استفادهشده یا صادرشده از باینری از طریق اطلاعات تجزیه و حل (resolution) که توسط افزونهٔ پیونددهنده به بهینهساز زمان پیوند منتقل میشود، مشخص است. این گزینه همچنان در صورتی که از افزونه پیونددهنده استفاده نشود یا در حین گام پیوند افزایشی هنگامی که کد نهایی تولید میشود (با -flto -flinker-output=nolto-rel)، مفید است.
- -flto[=n]
- این گزینه
بهینهساز
استاندارد
زمان پیوند
(link-time optimizer) را اجرا
میکند.
هنگام
فراخوانی
با کد منبع،
نمایش GIMPLE (یکی
از
نمایشهای
داخلی GCC) را
تولید کرده
و آن را در
بخشهای
ویژهٔ ELF در
فایل شیء
مینویسد.
هنگامی که
فایلهای
شیء با
یکدیگر
پیوند داده
میشوند،
تمام
بدنههای
توابع از
این
بخشهای ELF
خوانده شده
و به
گونهای
نمونهسازی
میشوند که
گویی بخشی
از همان
واحد ترجمه
(translation unit) یکسان
بودهاند.
برای استفاده از بهینهساز زمان پیوند، -flto و گزینههای بهینهسازی باید در زمان کامپایل و در حین پیوند نهایی مشخص شوند. توصیه میشود که تمام فایلهای شرکتکننده در یک پیوند را با گزینههای یکسان کامپایل کرده و همان گزینهها را در زمان پیوند نیز مشخص کنید. برای مثال:
gcc -c -O2 -flto foo.c gcc -c -O2 -flto bar.c gcc -o myprog -flto -O2 foo.o bar.o
دو فراخوانی نخست GCC، یک نمایش بایتکدی از GIMPLE را در بخشهای ویژهٔ ELF در درون foo.o و bar.o ذخیره میکنند. فراخوانی نهایی بایتکد GIMPLE را از foo.o و bar.o خوانده، این دو فایل را در یک تصویر داخلی واحد ادغام میکند، و نتیجه را مطابق معمول کامپایل مینماید. از آنجا که هر دو فایل foo.o و bar.o در یک تصویر واحد ادغام شدهاند، این امر باعث میشود تمام تحلیلها و بهینهسازیهای بینروالی در GCC به گونهای روی هر دو فایل عمل کنند که گویی یک فایل واحد هستند. این بدان معناست که برای نمونه، درونیساز (inliner) میتواند توابع موجود در bar.o را در توابع موجود در foo.o و بالعکس بهصورت درونخطی قرار دهد.
یک روش دیگر (و سادهتر) برای فعال کردن بهینهسازی زمان پیوند عبارت است از:
gcc -o myprog -flto -O2 foo.c bar.c
دستور بالا بایتکد مربوط به foo.c و bar.c را تولید کرده، آنها را با هم در یک نمایش GIMPLE واحد ادغام میکند و آنها را مانند معمول بهینهسازی مینماید تا myprog تولید شود.
نکتهٔ مهمی که باید به یاد داشت این است که برای فعالسازی بهینهسازیهای زمان پیوند، باید از درایور GCC برای انجام مرحله پیوند استفاده کنید. اگر هر یک از اشیاءِ دخیل با گزینهٔ خط فرمان -flto کامپایل شده باشند، GCC به صورت خودکار بهینهسازی زمان پیوند را انجام میدهد. شما همیشه میتوانید با ارسال -fno-lto به فرمان پیوند، این تصمیم خودکار برای انجام بهینهسازی زمان پیوند را لغو کنید.
برای اینکه بهینهسازی کل برنامه اثربخش باشد، در نظر گرفتن برخی فرضیات دربارهٔ کل برنامه ضروری است. کامپایلر باید بداند چه توابع و متغیرهایی ممکن است توسط کتابخانهها و زمان اجرا در خارج از واحد بهینهسازیشده در زمان پیوند مورد دسترسی قرار گیرند. در صورت پشتیبانی پیونددهنده، افزونهٔ پیونددهنده (ببینید: -fuse-linker-plugin) اطلاعات مربوط به نمادهای استفادهشده و نمادهای قابل مشاهده از بیرون را به کامپایلر ارسال میکند. در صورت عدم دسترسی به افزونهٔ پیونددهنده، باید از -fwhole-program استفاده شود تا به کامپایلر اجازه اعمال این فرضیات داده شود، که منجر به اتخاذ تصمیمات تهاجمیتر در بهینهسازی خواهد شد.
هنگامی که یک فایل با -flto بدون -fuse-linker-plugin کامپایل شود، فایل شیء تولیدشده بزرگتر از یک فایل شیء معمولی خواهد بود زیرا شامل بایتکدهای GIMPLE و کد نهایی معمول است (ببینید: -ffat-lto-objects). این بدان معناست که فایلهای شیء دارای اطلاعات LTO را میتوان مانند فایلهای شیء معمولی پیوند داد؛ اگر -fno-lto به پیونددهنده ارسال شود، هیچ بهینهسازی بینروالی اعمال نمیشود. توجه داشته باشید که با فعال بودن -fno-fat-lto-objects، مرحلهٔ کامپایل سریعتر است اما نمیتوانید پیوند معمولی و غیر LTO را روی آنها انجام دهید.
هنگام تولید باینری نهایی، GCC بهینهسازیهای زمان پیوند را تنها روی فایلهایی اعمال میکند که حاوی بایتکد باشند. بنابراین، میتوانید فایلهای شیء و کتابخانهها را با بایتکدهای GIMPLE و کد شیء نهایی ترکیب کنید. GCC به طور خودکار تعیین میکند که کدام فایلها در حالت LTO بهینهسازی شوند و کدام فایلها بدون پردازش بیشتر پیوند یابند.
به طور کلی، گزینههای تعیینشده در زمان پیوند بر گزینههای تعیینشده در زمان کامپایل اولویت دارند، هرچند در برخی موارد GCC تلاش میکند گزینههای زمان پیوند را از تنظیمات استفادهشده برای کامپایل فایلهای ورودی استنتاج کند.
اگر گزینهٔ سطح بهینهسازی -O را در زمان پیوند مشخص نکنید، GCC از بالاترین سطح بهینهسازی استفادهشده در هنگام کامپایل فایلهای شیء استفاده میکند. توجه داشته باشید که مشخص کردن گزینهٔ سطح بهینهسازی تنها در زمان پیوند و نه در زمان کامپایل، به طور کلی بیاثر است و این موضوع دو دلیل دارد: اول اینکه کامپایل کردن بدون بهینهسازی، مراحلی از کامپایلر را متوقف میکند که اطلاعات لازم برای بهینهسازی مؤثر در زمان پیوند را جمعآوری میکنند. دوم اینکه برخی از مراحل آغازین بهینهسازی تنها در زمان کامپایل قابل اجرا هستند و در زمان پیوند قابل انجام نیستند.
برخی پرچمهای تولید کد وجود دارند که GCC هنگام تولید بایتکدها آنها را حفظ میکند، زیرا در طول پیوند نهایی باید استفاده شوند. در حال حاضر، گزینههای زیر و تنظیمات آنها از اولین فایل شیئی که صراحتاً آنها را مشخص کرده باشد دریافت میشوند: -fcommon، -fexceptions، -fnon-call-exceptions، -fgnu-tm و تمام پرچمهای هدف -m.
گزینههای زیر یعنی -fPIC، -fpic، -fpie و -fPIE بر اساس طرحوارهٔ زیر ترکیب میشوند:
B<-fPIC> + B<-fpic> = B<-fpic> B<-fPIC> + B<-fno-pic> = B<-fno-pic> B<-fpic/-fPIC> + (no option) = (no option) B<-fPIC> + B<-fPIE> = B<-fPIE> B<-fpic> + B<-fPIE> = B<-fpie> B<-fPIC/-fpic> + B<-fpie> = B<-fpie>
برخی از پرچمهای تغییردهندهٔ ABI باید در تمام واحدهای کامپایل یکسان باشند، و تلاش برای لغو این موارد در زمان پیوند با یک مقدار ناسازگار نادیده گرفته میشود. این شامل گزینههایی مانند -freg-struct-return و -fpcc-struct-return است.
سایر گزینهها مانند -ffp-contract، -fno-strict-overflow، -fwrapv، -fno-trapv یا -fno-strict-aliasing به مرحله پیوند منتقل شده و برای واحدهای ترجمهٔ ناسازگار به شیوهای محافظهکارانه ادغام میشوند. بهطور خاص، -fno-strict-overflow، -fwrapv و -fno-trapv اولویت دارند؛ و برای مثال -ffp-contract=off بر -ffp-contract=fast اولویت دارد. شما میتوانید آنها را در زمان پیوند بازنویسی کنید.
گزینههای تشخیصی مانند -Wstringop-overflow به مرحلهٔ پیوند منتقل میشوند و تنظیمات آنها با مرحلهٔ کامپایل در سطح دانهبندی تابع مطابقت دارد. توجه داشته باشید که این موضوع تنها برای خطاهایی که در طول بهینهسازی صادر میشوند اهمیت دارد. توجه داشته باشید که دگرگونیهای کد مانند درونخطی کردن (inlining) میتواند باعث فعال یا غیرفعال شدن هشدارها برای بخشهایی از کد شود که با تنظیمات زمان کامپایل سازگار نیستند.
هنگامی که نیاز دارید گزینههایی را از طریق -Wa یا -Xassembler به اسمبلر ارسال کنید، مطمئن شوید که یا چنین واحدهای ترجمهای را با -fno-lto کامپایل میکنید و یا بهطور یکنواخت از گزینههای یکسان اسمبلر در تمام واحدهای ترجمه استفاده مینمایید. همچنین میتوانید به عنوان گزینه جایگزین، گزینههای اسمبلر را در زمان پیوند LTO مشخص کنید.
برای فعالسازی تولید اطلاعات اشکالزدایی (debug info) باید -g را در زمان کامپایل ارائه دهید. اگر هر یک از فایلهای ورودی در زمان پیوند با قابلیت تولید اطلاعات اشکالزدایی ساخته شده باشند، عمل پیوند نیز تولید اطلاعات اشکالزدایی را فعال خواهد کرد. هرگونه تنظیمات دقیق اطلاعات اشکالزدایی مانند سطح dwarf در -gdwarf-5 باید صراحتاً در خط فرمان پیونددهنده تکرار شود و ترکیب تنظیمات متفاوت در واحدهای ترجمهٔ مختلف توصیه نمیشود.
اگر LTO با اشیایی با پیوند C (C linkage) مواجه شود که با انواع ناسازگار در واحدهای ترجمهٔ جداگانهای که قرار است با هم پیوند یابند اعلان شدهاند (رفتار تعریفنشده طبق ISO C99 6.2.7)، ممکن است یک پیام تشخیصی غیرمهلک صادر شود. این رفتار در زمان اجرا همچنان تعریفنشده خواهد بود. تشخیصها و هشدارهای مشابهی ممکن است برای سایر زبانها نیز صادر شود.
یکی دیگر از ویژگیهای LTO این است که میتوان بهینهسازیهای بینروالی را روی فایلهایی که به زبانهای مختلف نوشته شدهاند اعمال کرد: gcc -c -flto foo.c g++ -c -flto bar.cc gfortran -c -flto baz.f90 g++ -o myprog -flto -O3 foo.o bar.o baz.o -lgfortran
توجه داشته باشید که پیوند نهایی با g++ انجام میشود تا کتابخانههای زمان اجرای C++ تأمین شوند و -lgfortran نیز برای دریافت کتابخانههای زمان اجرای Fortran اضافه شده است. بهطور کلی، هنگام ترکیب زبانها در حالت LTO، باید از همان گزینههای دستور پیوند استفاده کنید که هنگام ترکیب زبانها در یک ترجمهٔ عادی (غیر-LTO) به کار میبرید.
اگر فایلهای شیء حاوی بایتکد GIMPLE در یک آرشیو کتابخانه، مثلاً libfoo.a ذخیره شده باشند، در صورتی که از پیونددهندهای با پشتیبانی از افزونه استفاده کنید، استخراج و استفاده از آنها در پیوند LTO امکانپذیر است. برای ایجاد کتابخانههای ایستا مناسب برای LTO، بهجای ar و ranlib از gcc-ar و gcc-ranlib استفاده کنید؛ برای نمایش نمادهای فایلهای شیء حاوی بایتکد GIMPLE، از gcc-nm استفاده نمایید. این دستورات نیازمند آن هستند که ar، ranlib و nm با پشتیبانی از افزونه کامپایل شده باشند. در زمان پیوند، از پرچم -fuse-linker-plugin استفاده کنید تا اطمینان حاصل شود که کتابخانه در فرآیند بهینهسازی LTO شرکت میکند:
gcc -o myprog -O2 -flto -fuse-linker-plugin a.o b.o -lfoo
با فعال بودن افزونهٔ پیونددهنده، پیونددهنده فایلهای GIMPLE مورد نیاز را از libfoo.a استخراج کرده و آنها را به GCC در حال اجرا تحویل میدهد تا بخشی از تصویر تجمیعشدهٔ GIMPLE برای بهینهسازی شوند.
اگر از پیونددهندهای با پشتیبانی از افزونه استفاده نمیکنید و/یا افزونهٔ پیونددهنده را فعال نکردهاید، شیءهای درون libfoo.a طبق معمول استخراج و پیوند داده میشوند، اما در فرآیند بهینهسازی LTO شرکت نخواهند کرد. به منظور مناسبسازی یک کتابخانهٔ ایستا هم برای بهینهسازی LTO و هم پیوند معمول، فایلهای شیء آن را با -flto -ffat-lto-objects کامپایل کنید.
بهینهسازیهای زمان پیوند برای عمل کردن نیازی به حضور کل برنامه ندارند. اگر برنامه نیازی به برونریزی هیچ نمادی نداشته باشد، میتوان -flto و -fwhole-program را ترکیب کرد تا به بهینهسازهای بینروالی اجازه داده شود از فرضیات تهاجمیتری استفاده کنند که ممکن است به فرصتهای بهینهسازی بهتری منجر شود. هنگامی که افزونهٔ پیونددهنده فعال است، نیازی به استفاده از -fwhole-program نیست (به -fuse-linker-plugin مراجعه کنید).
پیادهسازی فعلی LTO هیچ تلاشی برای تولید بایتکدی که بین انواع مختلف میزبانها قابل حمل باشد نمیکند. فایلهای بایتکد دارای نسخه هستند و بررسی نسخهٔ سختگیرانهای وجود دارد، بنابراین فایلهای بایتکد تولیدشده در یک نسخهٔ GCC با نسخهٔ قدیمیتر یا جدیدتر GCC کار نمیکنند.
بهینهسازی زمان پیوند با تولید اطلاعات اشکالزدایی روی سیستمهایی غیر از آنهایی که از ترکیب ELF و DWARF استفاده میکنند، بهخوبی کار نمیکند.
اگر مقدار اختیاری n را مشخص کنید، بهینهسازی و تولید کد انجامشده در زمان پیوند بهصورت موازی در قالب n کار موازی با بهرهگیری از برنامهٔ make نصبشده اجرا میشود. متغیر محیطی MAKE ممکن است برای بازنویسی برنامهٔ مورد استفاده به کار رود.
شما همچنین میتوانید -flto=jobserver را مشخص کنید تا از حالت job server مربوط به GNU make برای تعیین تعداد کارهای موازی استفاده شود. این گزینه زمانی که Makefile فراخوانندهٔ GCC از قبل بهصورت موازی در حال اجرا باشد مفید است. برای این کار، باید یک + به ابتدای دستور در Makefile والد اضافه کنید. این گزینه احتمالاً تنها زمانی کار میکند که MAKE همان GNU make باشد. حتی بدون مقدار این گزینه، GCC تلاش میکند تا بهطور خودکار یک job server فعال مربوط به GNU make را شناسایی کند.
از -flto=auto برای استفاده از job server مربوط به GNU make (در صورت در دسترس بودن) استفاده کنید، وگرنه سیستم به تشخیص خودکار تعداد رشتههای پردازنده موجود در سیستم شما بازمیگردد.
- -flto-partition=alg
- الگوریتم پارتیشنبندی مورد استفاده توسط بهینهساز زمان پیوند را مشخص میکند. مقدار آن میتواند 1to1 برای تعیین پارتیشنبندی منطبق بر فایلهای مبدأ اولیه، یا balanced برای پارتیشنبندی به تکههای هماندازه (در صورت امکان)، یا max برای ایجاد یک پارتیشن جدید به ازای هر نماد در صورت امکان، یا cache برای متعادلسازی اندازهٔ تکهها ضمن نگه داشتن نمادهای مرتبط کنار یکدیگر جهت کشکردن بهتر در LTO افزایشی باشد. تعیین none بهعنوان الگوریتم، پارتیشنبندی و جریانسازی را کاملاً غیرفعال میکند. مقدار پیشفرض balanced است. در حالی که 1to1 میتواند بهعنوان یک راهکار دورزدن برای مشکلات مختلف ترتیب کد استفاده شود، پارتیشنبندی max تنها برای آزمایشهای داخلی در نظر گرفته شده است. مقدار one مشخص میکند که دقیقاً باید از یک پارتیشن استفاده شود در حالی که مقدار none از پارتیشنبندی صرفنظر کرده و مرحلهٔ بهینهسازی زمان پیوند را مستقیماً از فاز WPA اجرا میکند.
- -flto-incremental=path
- فعالسازی
LTO افزایشی،
همراه با کش
آن در
دایرکتوری
موجودِ
ارائهشده.
میتواند
چرخههای
ویرایش-کامپایل
را با LTO
بهطور
چشمگیری
کوتاهتر
کند.
هنگامی که به همراه LTO (-flto) استفاده شود، خروجی واحدهای ترجمه در LTO کش میشود. واحدهای ترجمهٔ کششده احتمالاً در کامپایل مجدد با تغییرات کوچک کد دوباره مواجه میشوند که منجر به کاهش زمان کامپایل مجدد میگردد.
چندین نمونهٔ GCC میتوانند بهطور موازی از یک کش یکسان استفاده کنند.
- -flto-incremental-cache-size=n
- تعداد مدخلهای کش در LTO افزایشی را مشخص میکند که پس از آن مدخلهای قدیمی هرس میشوند. این یک حد نرم است و ممکن است موقتاً مدخلهای بیشتری وجود داشته باشد.
- -flto-compression-level=n
- این گزینه سطح فشردهسازی مورد استفاده برای زبان واسط نوشتهشده درون فایلهای شیء LTO را تعیین میکند، و تنها در ترکیب با حالت LTO (-flto) معنادار است. در حال حاضر GCC از دو الگوریتم فشردهسازی LTO پشتیبانی میکند. برای zstd، مقادیر معتبر از 0 (بدون فشردهسازی) تا 19 (حداکثر فشردهسازی) هستند، در حالی که zlib از مقادیر 0 تا 9 پشتیبانی میکند. مقادیر خارج از این بازه به حداقل یا حداکثر مقادیر پشتیبانیشده محدود میشوند. اگر این گزینه تعیین نشود، یک تنظیم فشردهسازی پیشفرض و متعادل استفاده میشود.
- -fuse-linker-plugin
- استفاده از
افزونهٔ
پیونددهنده
را در طول
بهینهسازی
زمان پیوند
فعال
میکند. این
گزینه متکی
به
پشتیبانی
از افزونه
در
پیونددهنده
است که در gold
یا GNU ld نسخهٔ 2.21
یا جدیدتر
موجود است.
این گزینه استخراج فایلهای شیء دارای بایتکد GIMPLE را از آرشیوهای کتابخانه ممکن میسازد. این کار با قرار دادن کدهای بیشتر در اختیار بهینهساز زمان پیوند، کیفیت بهینهسازی را بهبود میبخشد. این اطلاعات مشخص میکند که چه نمادهایی میتوانند از خارج (توسط یک شیء غیر-LTO یا در حین پیوند پویا) قابل دسترسی باشند. بهبودهای حاصل در کیفیت کد باینریها (و کتابخانههای اشتراکی که از نمایانی پنهان یا hidden visibility استفاده میکنند) مشابه -fwhole-program است. برای توضیحات مربوط به تأثیر این پرچم و نحوهٔ استفاده از آن، -flto را ببینید.
این گزینه بهطور پیشفرض زمانی فعال است که پشتیبانی از LTO در GCC فعال شده و GCC برای استفاده با یک پیونددهنده با پشتیبانی از افزونهها (GNU ld 2.21 یا جدیدتر یا gold) پیکربندی شده باشد.
- -ffat-lto-objects
- اشیای Fat LTO
فایلهای
شیئی هستند
که هم حاوی
زبان واسط و
هم حاوی کد
شیء
میباشند.
این امر
آنها را هم
برای پیوند
LTO و هم برای
پیوند عادی
قابل
استفاده
میسازد.
این گزینه
تنها هنگام
کامپایل با
-flto کارآمد
است و در
زمان پیوند
نادیده
گرفته
میشود.
گزینهٔ -fno-fat-lto-objects زمان کامپایل را نسبت به LTO ساده بهبود میبخشد، اما نیازمند آن است که تمام زنجیرهٔ ابزار از LTO آگاه باشد. این حالت برای کارکرد پایه نیازمند یک پیونددهنده با پشتیبانی از افزونه است. علاوه بر این، nm، ar و ranlib باید از افزونههای پیونددهنده پشتیبانی کنند تا یک محیط ساخت با امکانات کامل (با توانایی ساخت کتابخانههای ایستا و غیره) فراهم شود. GCC پوششهای gcc-ar، gcc-nm و gcc-ranlib را برای ارسال گزینههای صحیح به این ابزارها فراهم میکند. در LTO غیر-fat باید Makefileها را برای استفاده از آنها اصلاح کرد.
توجه داشته باشید که binutils مدرن سازوکار بارگذاری خودکار افزونه را ارائه میدهد. نصب افزونهٔ پیونددهنده در $libdir/bfd-plugins اثری مشابه استفاده از پوششهای دستوری (gcc-ar، gcc-nm و gcc-ranlib) دارد.
پیشفرض در مقصدهایی با پشتیبانی از افزونهٔ پیونددهنده، -fno-fat-lto-objects است.
- -fcompare-elim
- پس از تخصیص
ثبات و
تفکیک
دستورالعملهای
پس از تخصیص
ثبات،
دستورالعملهای
محاسباتیای
را که
پرچمهای
پردازنده
را مشابه یک
عملیات
مقایسهٔ
مبتنی بر آن
محاسبات
تنظیم
میکنند،
شناسایی
میکند. در
صورت
امکان،
عملیات
مقایسهٔ
صریح حذف
میشود.
این گذر فقط بر روی مقصدهای خاصی اعمال میشود که نمیتوانند پیش از اتمام تخصیص ثبات، عملیات مقایسه را بهصورت صریح نمایش دهند.
در سطوح -O1، -O2، -O3 و -Os فعال میشود.
- -ffold-mem-offsets
- -fno-fold-mem-offsets
- تلاش
میکند با
ادغام
دستورالعملهای
add درون
بارگذاریها/ذخیرهسازیهای
حافظه،
آنها را
حذف کند.
در سطوح -O2 و -O3 فعال میشود.
- -fcprop-registers
- پس از تخصیص
ثبات و
تفکیک
دستورالعملهای
پس از تخصیص
ثبات، یک
گذر انتشار
کپی (copy-propagation) را
اجرا
میکند تا
وابستگیهای
زمانبندی
را کاهش
داده و در
مواردی کپی
را حذف
نماید.
در سطوح -O1، -O2، -O3 و -Os فعال میشود..IP -fprofile-correction 4 پروفایلهای گردآوریشده با استفاده از باینری سازوارشده (instrumented) برای برنامههای چندنخی ممکن است به دلیل بهروزرسانیهای از دسترفتهٔ شمارندهها، ناسازگار باشند. هنگامی که این گزینه مشخص شود، GCC از روشهای مکاشفهای برای تصحیح یا هموارسازی چنین ناسازگاریهایی استفاده میکند. بهطور پیشفرض، GCC هنگام شناسایی یک پروفایل ناسازگار، یک پیام خطا صادر میکند.
این گزینه توسط -fauto-profile فعال میشود.
- -fprofile-partial-training
- با "-fprofile-use" تمامی بخشهایی از برنامه که در طول اجرای آزمایشی (train run) اجرا نشدهاند، به جای سرعت، بهشدت برای اندازه بهینهسازی میشوند. در برخی موارد، آزمودن و آموزش تمام مسیرهای داغِ ممکن در برنامه عملی نیست. (برای نمونه، برنامه ممکن است شامل توابعی مخصوص یک سختافزار مشخص باشد و آموزش نتواند تمام پیکربندیهای سختافزاری که برنامه روی آنها اجرا میشود را پوشش دهد.) با "-fprofile-partial-training" بازخورد پروفایل برای تمام توابعی که در طول اجرای آزمایشی اجرا نشدهاند نادیده گرفته میشود، و باعث میشود آنها طوری بهینهسازی شوند که گویی بدون بازخورد پروفایل کامپایل شدهاند. این امر هنگامی که اجرای آزمایشی نمایانگر رفتار واقعی نباشد، منجر به عملکرد بهتر میشود اما همچنین کدی بهطور قابلتوجه بزرگتر ایجاد میکند.
- -fprofile-use
- -fprofile-use=path
- بهینهسازیهای
هدایتشده
با بازخورد
پروفایل
(feedback-directed) و
بهینهسازیهای
زیر را فعال
میکند، که
بسیاری از
آنها
عموماً
تنها در
صورت در
دسترس بودن
بازخورد
پروفایل
سودمند
هستند:
-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
- بهینهسازیهای
مبتنی بر
بازخورد بر
پایهٔ
نمونهبرداری
(sampling-based feedback-directed) و
بهینهسازیهای
زیر را فعال
میکند، که
بسیاری از
آنها
عموماً
تنها در
صورت در
دسترس بودن
بازخورد
پروفایل
سودمند
هستند:
-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
گزینههای زیر رفتار کامپایلر را در رابطه با محاسبات ممیز شناور (floating-point arithmetic) کنترل میکنند. این گزینهها بین سرعت و درستی تعادل برقرار میکنند. همهٔ آنها باید بهطور صریح فعال شوند.
- -fexcess-precision=style
- این گزینه
امکان
کنترل دقت
اضافی (excess precision)
را روی
ماشینهایی
فراهم
میکند که
در آنها
محاسبات
ممیز شناور
در قالبی با
دقت یا
دامنهٔ
بیشتری
نسبت به
انواع
استاندارد
و تبادلی
ممیز شناور
IEEE انجام
میشود.
نمونهای
از چنین
مقصدی،
ممیز شناور
x87 در
پردازندههای
x86 است که در
داخل به جای
قالب ۶۴
بیتی IEEE، از
نمایش ۸۰
بیتی
استفاده
میکند.
برای بیشتر
برنامهها،
دقت اضافی
بیضرر
است، اما
برخی از
برنامهها
ممکن است به
الزامات
استانداردهای
زبان C یا C++
برای
مدیریت
مقادیر IEEE
متکی باشند.
بهطور پیشفرض، -fexcess-precision=fast برقرار است؛ این بدان معناست که اگر به کد سریعتری بینجامد، عملیات ممکن است در دقتی وسیعتر از انواع مشخصشده در کد منبع انجام شوند، و زمان انجام گرد کردن به انواع مشخصشده در منبع غیرقابلپیشبینی است. هنگام کامپایل C یا C++، در صورتی که -fexcess-precision=standard مشخص شود، دقت اضافی از قواعد تعیینشده در ISO C99 یا C++ پیروی میکند؛ بهویژه، هم تبدیل نوعها (casts) و هم انتسابها (assignments) باعث میشوند مقادیر به انواع معنایی (semantic types) خود گرد شوند (در حالی که -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
- متغیرهای ممیز شناور را در ثباتها (registers) ذخیره نمیکند و مانع سایر گزینههایی میشود که ممکن است نحوهٔ دریافت یک مقدار ممیز شناور از ثبات یا حافظه را تغییر دهند. این گزینه معمولاً جای خود را به -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__" میشود.
این گزینه به جز -Ofast با هیچ گزینهٔ -O دیگری روشن نمیشود، چرا که میتواند به خروجی نادرست برای برنامههایی منجر شود که به پیادهسازی دقیق قواعد یا مشخصات IEEE یا ISO برای توابع ریاضی وابسته هستند. با این وجود، ممکن است برای برنامههایی که به ضمانتهای این مشخصات نیاز ندارند، کدی سریعتر تولید کند.
- -fno-math-errno
- پس از
فراخوانی
توابع
ریاضی که با
یک
تکدستورالعمل
اجرا
میشوند،
مانند
"sqrt"،
مقدار
"errno" را
تنظیم
نمیکند.
برنامهای
که برای
مدیریت
خطاهای
ریاضی به
استثناهای
IEEE متکی است،
ممکن است
بخواهد
برای
افزایش
سرعت و در
عین حال حفظ
سازگاری
محاسباتی
IEEE، از این
پرچم
استفاده
کند.
این گزینه به جز -Ofast با هیچ گزینهٔ -O دیگری فعال نمیشود، زیرا میتواند به خروجی نادرست برای برنامههایی منجر شود که به پیادهسازی دقیق قواعد یا مشخصات IEEE یا ISO برای توابع ریاضی وابسته هستند. با این وجود، ممکن است برای برنامههایی که نیازی به ضمانتهای این مشخصات ندارند، کد سریعتری به همراه داشته باشد.
پیشفرض -fmath-errno است.
در سیستمهای Darwin، کتابخانهٔ ریاضی هرگز "errno" را تنظیم نمیکند. بنابراین دلیلی ندارد که کامپایلر این احتمال را در نظر بگیرد، و -fno-math-errno گزینهٔ پیشفرض است.
- -funsafe-math-optimizations
- بهینهسازیهایی
را برای
محاسبات
ممیز شناور
مجاز
میکند که
(الف) فرض
میکنند
آرگومانها
و نتایج
معتبر
هستند و (ب)
ممکن است
استانداردهای
IEEE یا ANSI را نقض
کنند.
هنگامی که
در زمان
پیوند (link time)
استفاده
شود، ممکن
است
کتابخانهها
یا
فایلهای
راهاندازیای
(startup files) را شامل
شود که
واژهٔ
کنترل FPU
پیشفرض یا
سایر
بهینهسازیهای
مشابه را
تغییر
میدهند.
این گزینه به جز -Ofast با هیچ گزینهٔ -O دیگری روشن نمیشود، چرا که میتواند به خروجی نادرست برای برنامههایی بینجامد که به پیادهسازی دقیق قواعد یا مشخصات IEEE یا ISO برای توابع ریاضی متکی هستند. با این وجود، ممکن است برای برنامههایی که به ضمانتهای این مشخصات نیاز ندارند، کدی سریعتر به دست دهد. گزینههای -fno-signed-zeros، -fno-trapping-math، -fassociative-math و -freciprocal-math را فعال میکند.
پیشفرض -fno-unsafe-math-optimizations است..IP -fassociative-math 4 اجازه دادن به شرکتپذیری مجدد عملوندها در زنجیرهای از عملیاتهای ممیز شناور. این کار با امکان تغییر نتیجهٔ محاسبات، استانداردهای زبان 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)"
برای حذف
زیرعبارتهای
مشترک (common subexpression
elimination) مفید است.
توجه داشته
باشید که
این کار دقت
را کاهش
داده و
تعداد
محاسبات
ممیز شناور
(flops) روی آن
مقدار را
افزایش
میدهد.
پیشفرض -fno-reciprocal-math است.
- -ffinite-math-only
- اجازه دادن
به
بهینهسازیهای
محاسبات
ممیز شناور
با این فرض
که
آرگومانها
و نتایج NaN یا
+-Inf نیستند.
این گزینه به جز -Ofast توسط هیچ گزینهٔ -O دیگری فعال نمیشود، زیرا میتواند برای برنامههایی که به پیادهسازی دقیق قوانین/مشخصات IEEE یا ISO برای توابع ریاضی وابسته هستند، خروجی نادرست تولید کند. با این حال، ممکن است برای برنامههایی که به تضمینهای این مشخصات نیازی ندارند، کد سریعتری ایجاد کند.
پیشفرض -fno-finite-math-only است.
- -fno-signed-zeros
- اجازه دادن
به
بهینهسازیهای
محاسبات
ممیز شناور
که
علامتدار
بودن صفر را
نادیده
میگیرند.
محاسبات IEEE
رفتار
مقادیر
متمایز +0.0 و -0.0
را مشخص
میکند، که
این امر
سادهسازی
عبارتهایی
مانند x+0.0 یا 0.0*x
را (حتی با
-ffinite-math-only)
ناممکن
میسازد.
این گزینه
دلالت بر
این دارد که
علامت یک
نتیجهٔ صفر
اهمیتی
ندارد.
پیشفرض -fsigned-zeros است.
- -fno-trapping-math
- کامپایل کد
با این فرض
که
عملیاتهای
ممیز شناور
نمیتوانند
تلههای (traps)
قابل رؤیت
برای کاربر
تولید کنند.
این تلهها
شامل تقسیم
بر صفر،
سرریز
مثبت،
سرریز
منفی،
نتیجهٔ
نادقیق (inexact result) و
عملیات
نامعتبر
میشوند.
این گزینه
نیازمند
این است که
-fno-signaling-nans
برقرار
باشد. تنظیم
این گزینه
ممکن است کد
سریعتری
تولید کند،
برای نمونه
در صورتی که
به محاسبات
«بدون
توقف» (non-stop) در IEEE
اتکا شده
باشد.
این گزینه به جز -Ofast توسط هیچ گزینهٔ -O دیگری فعال نمیشود، چرا که میتواند برای برنامههایی که به پیادهسازی دقیق قوانین/مشخصات IEEE یا ISO برای توابع ریاضی وابستهاند، نتایج نادرست به بار آورد.
پیشفرض -ftrapping-math است.
نسخههای آیندهٔ GCC ممکن است با استفاده از دستور عملیافت (pragma) مربوط به "FENV_ACCESS" در C99، کنترل دقیقتری روی این تنظیم ارائه دهند. این گزینهٔ خط فرمان همراه با -frounding-math برای مشخص کردن وضعیت پیشفرض "FENV_ACCESS" به کار خواهد رفت.
- -frounding-math
- غیرفعال
کردن
تبدیلها و
بهینهسازیهایی
که رفتار
گرد کردن
ممیز شناور
پیشفرض
(گرد کردن
به
نزدیکترین
یا round-to-nearest) را
فرض
میگیرند.
این گزینه
باید برای
برنامههایی
تعیین شود
که حالت گرد
کردن ممیز
شناور (FP) را
بهطور
پویا تغییر
میدهند،
یا ممکن است
با حالتی
غیر از حالت
پیشفرض
اجرا شوند.
این گزینه
ادغام
ثوابت (constant folding)
عبارتهای
ممیز شناور
را در زمان
کامپایل (که
ممکن است
تحت تأثیر
حالت گرد
کردن باشند)
و
تبدیلهای
حسابی را که
در حضور
حالتهای
گرد کردن
وابسته به
علامت
ناامن
هستند،
غیرفعال
میکند.
پیشفرض -fno-rounding-math است.
این گزینه آزمایشی است و در حال حاضر تضمین نمیکند که تمام بهینهسازیهای GCC که تحت تأثیر حالت گرد کردن هستند را غیرفعال کند. نسخههای آیندهٔ GCC ممکن است با استفاده از عملگر عملیافت (pragma) مربوط به "FENV_ACCESS" در C99 کنترل دقیقتری بر این تنظیم ارائه دهند. این گزینهٔ خط فرمان همراه با -ftrapping-math برای تعیین وضعیت پیشفرض "FENV_ACCESS" استفاده خواهد شد.
- -fsignaling-nans
- کامپایل کد
با این فرض
که مقادیر NaN
سیگنالدهندهٔ
IEEE ممکن است
حین عملیات
ممیز شناور
تلههای
قابل
مشاهده
برای کاربر
تولید کنند.
فعال کردن
این گزینه،
بهینهسازیهایی
را که ممکن
است تعداد
استثناهای
قابل رؤیت
با NaNهای
سیگنالدهنده
را تغییر
دهند،
غیرفعال
میکند. این
گزینه
مستلزم -ftrapping-math
است.
این گزینه باعث تعریف ماکروی پیشپردازندهٔ "__SUPPORT_SNAN__" میشود.
پیشفرض -fno-signaling-nans است.
این گزینه آزمایشی است و در حال حاضر تضمین نمیکند که تمام بهینهسازیهای GCC اثرگذار بر رفتار NaNهای سیگنالدهنده را غیرفعال سازد.
- -fno-fp-int-builtin-inexact
- اجازه
ندادن به
توابع
توکار
"ceil"،
"floor"،
"round" و
"trunc" و
گونههای
"float" و
"long double"
آنها، تا
کدی تولید
کنند که
برای
آرگومانهای
غیرصحیح
استثنای
ممیز شناور
«inexact» (نادقیق)
را ایجاد
کند.
استانداردهای
ISO C99 و C11 به این
توابع
اجازه
میدهند تا
استثنای
«inexact» را
برانگیزند،
اما ISO/IEC TS 18661-1:2014،
پیوندهای C
به IEEE 754-2008،
همانگونه
که در ISO C23
گنجانده
شده است،
اجازهٔ
چنین کاری
را به این
توابع
نمیدهد.
پیشفرض -ffp-int-builtin-inexact است که امکان ایجاد استثنا را فراهم میکند، مگر اینکه استاندارد C23 یا نسخهای بالاتر از آن انتخاب شده باشد. این گزینه هیچ اثری ندارد مگر اینکه -ftrapping-math فعال باشد.
حتی در صورت استفاده از -fno-fp-int-builtin-inexact، چنانچه توابع فراخوانی به یک تابع کتابخانهای تولید کنند و پیادهسازی آن کتابخانه از TS 18661 پیروی نکند، ممکن است استثنای «inexact» برانگیخته شود.
- -fsingle-precision-constant
- در نظر گرفتن ثوابت ممیز شناور به صورت دقت تکی (single precision) به جای تبدیل ضمنی آنها به ثوابت با دقت دوگانه (double precision).
- -fcx-limited-range
- در صورت
فعال بودن،
این گزینه
بیان
میکند که
هنگام
انجام
تقسیم
اعداد
مختلط
نیازی به
مرحلهٔ
کاهش بازه (range
reduction) نیست.
همچنین
بررسی
نمیشود که
آیا نتیجهٔ
ضرب یا
تقسیم
مختلط "NaN +
I*NaN" است یا
خیر، و
تلاشی برای
رفع این
وضعیت صورت
نمیگیرد.
پیشفرض
-fno-cx-limited-range است،
اما توسط
-ffast-math فعال
میشود.
این گزینه تنظیمات پیشفرض عملگر عملیافت (pragma) مربوط به "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
خاتمه
مییابد،
تعداد
دفعات
اجرای هر
کمان (arc) را در
فایلی به
نام 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، دادههای جمعآوریشده از اندازهگیری کارایی (profiling) مقادیر عبارتها را برای استفاده در بهینهسازیها بازخوانی میکند.
توسط -fprofile-generate، -fprofile-use و -fauto-profile فعال میشود.
- -fprofile-reorder-functions
- بازآرایی
توابع بر
اساس ابزار
دقیق
ارزیابی
عملکرد (profile
instrumentation)، اولین
زمان اجرای
یک تابع را
جمعآوری
کرده و این
توابع را به
ترتیب
صعودی مرتب
میکند؛ با
این هدف که
زمان
راهاندازی
برنامه از
طریق
بارگذاری
کارآمدتر
بخشهای
متنی (text segments)
بهینهسازی
شود.
با -fprofile-use فعال میشود..IP -fvpt 4 اگر با -fprofile-arcs ترکیب شود، این گزینه به کامپایلر دستور میدهد کدی را برای جمعآوری اطلاعات درباره مقادیر عبارتها اضافه کند.
همراه با -fbranch-probabilities، دادههای جمعآوریشده را بازخوانی کرده و عملاً بهینهسازیها را بر اساس آنها اعمال میکند. در حال حاضر، این بهینهسازیها شامل تخصصیسازی (specialization) عملیات تقسیم با استفاده از آگاهی از مقدار مخرج است.
با -fprofile-use و -fauto-profile فعال میشود.
- -frename-registers
- تلاش برای
جلوگیری از
وابستگیهای
کاذب در کد
زمانبندیشده
با استفاده
از
ثباتهای
باقیمانده
پس از تخصیص
ثبات. این
بهینهسازی
بیشترین
سود را برای
پردازندههایی
با
ثباتهای
زیاد دارد.
با این حال،
بسته به
قالب
اطلاعات
اشکالزداییِ
بهکاررفته
توسط
معماری
هدف، این
گزینه
میتواند
دیباگ کردن
را غیرممکن
کند؛ زیرا
متغیرها
دیگر در یک
«ثبات
مبنا» (home register)
باقی
نمیمانند.
بهطور پیشفرض با -funroll-loops فعال میشود.
- -fschedule-fusion
- یک گذر
وابسته به
معماری هدف
را روی
جریان
دستورالعملها
انجام
میدهد تا
دستورالعملهای
همنوع را
در کنار
یکدیگر
زمانبندی
کند؛ چرا که
ماشین هدف
در صورت
مجاورت این
دستورالعملها
با یکدیگر
در جریان
اجرا،
میتواند
آنها را
کارآمدتر
اجرا کند.
در سطوح -O2، -O3 و -Os فعال میشود.
- -ftracer
- تکرار
دنباله (tail duplication)
را برای
بزرگتر
کردن
اندازه
سوپربلاک
(superblock) انجام
میدهد. این
دگرگونی،
جریان
کنترل تابع
را ساده
کرده و به
سایر
بهینهسازیها
اجازه
میدهد
کارایی
بهتری
داشته
باشند.
توسط -fprofile-use و -fauto-profile فعال میشود.
- -funroll-loops
- حلقههایی
را که تعداد
تکرار
آنها در
زمان
کامپایل یا
هنگام ورود
به حلقه
قابل تعیین
است باز
میکند (loop unrolling).
گزینه -funroll-loops
مستلزم
فعالسازی
-frerun-cse-after-loop، -fweb و
-frename-registers است.
همچنین
لایهبرداری
کامل حلقه
(complete loop peeling، یعنی
حذف کامل
حلقههایی
با تعداد
تکرار اندک
و ثابت) را
فعال
میکند. این
گزینه حجم
کد را
بزرگتر
میکند و
ممکن است
سرعت اجرای
آن را
افزایش دهد
یا ندهد.
توسط -fprofile-use و -fauto-profile فعال میشود.
- -funroll-all-loops
- تمام حلقهها را باز میکند، حتی اگر تعداد تکرارهای آنها هنگام ورود به حلقه نامشخص باشد. این کار معمولاً اجرای برنامهها را کندتر میکند. -funroll-all-loops همان گزینههای -funroll-loops را در بر دارد.
- -fpeel-loops
- حلقههایی
را
لایهبرداری
(peel) میکند که
بر اساس
اطلاعات
کافی (حاصل
از بازخورد
پروفایل یا
تحلیل
ایستا)،
مشخص شده
تکرار
زیادی
ندارند.
همچنین
لایهبرداری
کامل حلقه
(یعنی حذف
کامل
حلقههایی
با تعداد
تکرار ثابت
و کم) را
فعال
میکند.
توسط -O3، -fprofile-use و -fauto-profile فعال میشود.
- -fmalloc-dce
- کنترل
میکند که
آیا "malloc"
(و انواع
دیگر آن
مانند
"calloc" یا
"strdup")، در
صورتی که
مقدار
بازگشتی
آنها فقط
به عنوان
پارامتر
فراخوانی
"free"
استفاده
شده یا با
"NULL"
مقایسه شده
باشد، قابل
بهینهسازی
و حذف شدن
هستند یا
خیر. اگر -fmalloc-dce=1
استفاده
شود، فقط
فراخوانیهای
"free" مجاز
شمرده
میشوند،
در حالی که
با -fmalloc-dce=2
مقایسهها
با
اشارهگر
"NULL" نیز
برای حذف،
ایمن در نظر
گرفته
میشوند.
پیشفرض -fmalloc-dce=2 است. همچنین نگاه کنید به -fallocation-dce.
- -fmove-loop-invariants
- گذر جابهجایی نامتغیرهای حلقه (loop invariant motion) را در بهینهساز حلقه RTL فعال میکند. در سطح -O1 و بالاتر، به جز -Og فعال است.
- -fmove-loop-stores
- گذر جابهجایی ذخیرهسازیهای حلقه (loop store motion) را در بهینهساز حلقه GIMPLE فعال میکند. این کار ذخیرهسازیهای نامتغیر را در ازای نگهداری مقدار ذخیرهشده در یک ثبات در طول تکرار، به بعد از پایان حلقه منتقل میکند. توجه داشته باشید که برای اثرگذاری این گزینه، -ftree-loop-im نیز باید فعال باشد. در سطح -O1 و بالاتر، به جز -Og فعال است.
- -fsplit-loops
- اگر یک حلقه
حاوی شرطی
باشد که
همواره
برای یک سمت
از فضای
تکرار درست
و برای سمت
دیگر
نادرست
است، آن را
به دو حلقه
تقسیم
میکند.
توسط -fprofile-use و -fauto-profile فعال میشود.
- -funswitch-loops
- شاخههای
دارای شروط
نامتغیر با
حلقه را به
بیرون حلقه
منتقل کرده
و
نسخههایی
از حلقه را
در هر دو
شاخه
(اصلاحشده
بر اساس
نتیجه شرط)
تکثیر
میکند.
توسط -fprofile-use و -fauto-profile فعال میشود.
- -fversion-loops-for-strides
- اگر
حلقهای
روی
آرایهای
با گام (stride)
متغیر
پیمایش
کند، نسخه
دیگری از
حلقه ایجاد
میکند که
فرض میکند
گام همیشه
یک است.
برای مثال:
for (int i = 0; i < n; ++i) x[i * stride] = ...;
تبدیل میشود به:
if (stride == 1) for (int i = 0; i < n; ++i) x[i] = ...; else for (int i = 0; i < n; ++i) x[i * stride] = ...;این ویژگی بهویژه برای آرایههای با شکل مفروض (assumed-shape) در Fortran سودمند است، جایی که (برای نمونه) با فرض دسترسیهای متوالی، برداریسازی (vectorization) بهتری را امکانپذیر میسازد. این پرچم بهطور پیشفرض در سطح -O3 فعال است. همچنین توسط -fprofile-use و -fauto-profile فعال میشود.
- -ffunction-sections
- -fdata-sections
- در صورتی که
معماری هدف
از بخشهای
(sections) دلخواه
پشتیبانی
کند، هر
تابع یا قلم
داده را در
بخش
اختصاصی
خود در فایل
خروجی قرار
میدهد. نام
تابع یا نام
قلم داده،
نام بخش
مربوطه را
در فایل
خروجی
تعیین
میکند.
از این گزینهها در سیستمهایی استفاده کنید که پیونددهنده (linker) میتواند بهینهسازیهایی را برای بهبود محلی بودن ارجاع (locality of reference) در فضای دستورالعمل انجام دهد. بیشتر سیستمهایی که از قالب شیء ELF استفاده میکنند پیونددهندههایی با چنین بهینهسازیهایی دارند. در AIX، پیونددهنده بخشها (CSECTها) را بر اساس گراف فراخوانی بازآرایی میکند. تأثیر عملکردی آن متغیر است.
این گزینهها همراه با جمعآوری زباله پیونددهنده (گزینه --gc-sections در linker) ممکن است به فایلهای اجراییِ با پیوند ایستا (statically-linked) کوچکتری (پس از سبکسازی/strip) منجر شوند.
در سیستمهای ELF/DWARF این گزینهها کیفیت اطلاعات اشکالزدایی را تنزل نمیدهند. البته ممکن است با سایر قالبهای فایلهای شیء یا اطلاعات اشکالزدایی مشکلاتی وجود داشته باشد.
تنها در صورتی از این گزینهها استفاده کنید که مزایای چشمگیری داشته باشند. هنگام استفاده از این گزینهها، اسمبلر و پیونددهنده فایلهای شیء و اجرایی بزرگتری تولید میکنند و عملکرد کندتری خواهند داشت. این گزینهها بر تولید کد تأثیر میگذارند و از بهینهسازیهایی توسط کامپایلر و اسمبلر که متکی بر موقعیتهای نسبی درون یک واحد ترجمه هستند جلوگیری میکنند؛ زیرا این موقعیتها تا زمان پیوند (link time) ناشناخته باقی میمانند. نمونهای از این بهینهسازیها، تعدیل فراخوانیها (relaxing calls) به دستورالعملهای فراخوانی کوتاهتر است.
- -fstdarg-opt
- بخش مقدمه (prologue) توابع با آرگومانهای متغیر (variadic) را با توجه به نحوه استفاده از آن آرگومانها بهینهسازی میکند.
- -fsection-anchors
- تلاش
میکند با
استفاده از
نمادهای
مشترک
«لنگر» (anchor)
برای
آدرسدهی
به اشیاء
همجوار،
تعداد
محاسبات
آدرس
نمادین را
کاهش دهد.
این تبدیل
میتواند
به کاهش
تعداد
مدخلهای GOT
و
دسترسیهای
GOT در برخی از
اهداف کمک
کند.
برای مثال، در پیادهسازی تابع زیر "foo":
static int a, b, c; int foo (void) { return a + b + c; }معمولاً آدرس هر سه متغیر محاسبه میشود، اما اگر آن را با -fsection-anchors کامپایل کنید، در عوض از یک نقطه لنگر مشترک به متغیرها دسترسی پیدا میکند. اثر آن مشابه این شبهکد است (که کد C معتبری نیست):
int foo (void) { register int *xr = &x; return xr[&a - &x] + xr[&b - &x] + xr[&c - &x]; }همه سیستمهای هدف از این گزینه پشتیبانی نمیکنند..IP -fzero-call-used-regs=choice 4 ثباتهای 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 برای تمامی مقصدها (targets) شناخته شدهاند:
- phiopt-factor-max-stmts-live
- هنگام فاکتورگیری گزارهها از if/then/else، این بیشینهٔ تعداد گزارههای پس از گزارهٔ تعریفکننده است که مجازند طول عمر یک نام را گسترش دهند.
- predictable-branch-outcome
- هنگامی که پیشبینی شود یک انشعاب با احتمالی کمتر از این آستانه (به درصد) پیموده میشود، به عنوان بهخوبی قابل پیشبینی در نظر گرفته میشود.
- max-rtl-if-conversion-insns
- بهینهسازی RTL if-conversion سعی میکند انشعابهای شرطی اطراف یک بلوک را حذف کرده و آنها را با دستورالعملهای شرطی اجراشونده جایگزین کند. این پارامتر بیشینهٔ تعداد دستورالعملها را در بلوکی که باید برای if-conversion در نظر گرفته شود مشخص میکند. کامپایلر همچنین از سایر روشهای اکتشافی (heuristics) استفاده میکند تا تصمیم بگیرد آیا if-conversion احتمالاً سودمند است یا خیر.
- file-cache-files
- بیشینهٔ تعداد فایلها در حافظهٔ نهان فایل (file cache). حافظهٔ نهان فایل برای چاپ خطوط کد منبع در پیامهای تشخیصی و انجام برخی بررسیهای منبع مانند -Wmisleading-indentation استفاده میشود.
- file-cache-lines
- بیشینهٔ تعداد خطوط برای نمایهسازی در حافظهٔ نهان فایل. وقتی مقدار 0 باشد، اندازه به صورت خودکار تعیین میشود. حافظهٔ نهان فایل برای چاپ خطوط کد منبع در پیامهای تشخیصی و انجام برخی بررسیهای منبع مانند -Wmisleading-indentation استفاده میشود.
- max-rtl-if-conversion-predictable-cost
- بهینهسازی RTL if-conversion تلاش خواهد کرد انشعابهای شرطی اطراف یک بلوک را حذف کرده و آنها را با دستورالعملهای شرطی اجراشونده جایگزین کند. این پارامترها بیشینهٔ هزینهٔ مجاز برای دنبالهای را که توسط if-conversion تولید خواهد شد، بسته به اینکه انشعاب به صورت ایستا قابل پیشبینی تعیین شده باشد یا خیر، مشخص میکنند. یکای این پارامتر همانند یکای معیار درونی seq_cost در GCC است. کامپایلر سعی خواهد کرد با استفاده از ماکروی مقصد BRANCH_COST یک پیشفرض معقول برای این پارامتر فراهم کند.
- max-crossjump-edges
- بیشینهٔ تعداد یالهای ورودی برای در نظر گرفتن در cross-jumping. الگوریتم مورد استفاده توسط -fcrossjumping بر حسب تعداد یالهای ورودی به هر بلوک از مرتبهٔ O(N^2) است. افزایش مقادیر به معنای بهینهسازی تهاجمیتر است که زمان کامپایل را با بهبود احتمالاً اندکی در اندازهٔ پروندهٔ اجرایی افزایش میدهد.
- min-crossjump-insns
- کمینهٔ تعداد دستورالعملهایی که باید در انتهای دو بلوک مطابقت داشته باشند تا cross-jumping روی آنها انجام شود. در صورتی که تمامی دستورالعملهای بلوکی که از آن cross-jump صورت میگیرد مطابقت داشته باشند، از این مقدار صرفنظر میشود.
- max-grow-copy-bb-insns
- بیشینهٔ ضریب گسترش اندازهٔ کد هنگام رونوشتبرداری از بلوکهای پایه (basic blocks) به جای پرش. این گسترش نسبت به یک دستور پرش سنجیده میشود.
- max-goto-duplication-insns
- بیشینهٔ تعداد دستورالعملها برای تکثیر در بلوکی که به یک goto محاسباتی پرش میکند. برای جلوگیری از رفتار O(N^2) در چندین گذر، GCC دستورات goto محاسباتی را در اوایل فرایند کامپایل فاکتورگیری کرده و آنها را تا حد امکان دیر وافاکتور میکند. تنها پرشهای محاسباتی در انتهای بلوکهای پایهای که بیش از max-goto-duplication-insns دستورالعمل ندارند، وافاکتور میشوند.
- max-delay-slot-insn-search
- بیشینهٔ تعداد دستورالعملها برای بررسی هنگام جستوجوی دستوری جهت پر کردن delay slot. اگر بیش از این تعداد دلخواه دستورالعمل جستوجو شود، صرفهجویی زمانی حاصل از پر کردن delay slot ناچیز خواهد بود، بنابراین جستوجو متوقف میشود. افزایش مقادیر به معنای بهینهسازی تهاجمیتر است که زمان کامپایل را با بهبود احتمالاً اندکی در زمان اجرا افزایش میدهد.
- max-delay-slot-live-search
- هنگام تلاش برای پر کردن delay slotها، بیشینهٔ تعداد دستورالعملها برای بررسی هنگام جستوجو به دنبال بلوکی با اطلاعات ثبات زندهٔ معتبر. افزایش این مقدار که به صورت دلخواه انتخاب شده است، به معنای بهینهسازی تهاجمیتر و در نتیجه افزایش زمان کامپایل است. این پارامتر هنگامی که کد delay slot برای نگهداری گراف جریان کنترل (control-flow graph) بازنویسی شود، باید برداشته شود.
- max-gcse-memory
- بیشینهٔ تقریبی مقدار حافظه بر حسب "kB" که میتوان به منظور انجام بهینهسازی حذف زیرعبارتهای مشترک سراسری (global common subexpression elimination) تخصیص داد. اگر حافظهای بیش از مقدار مشخصشده نیاز باشد، این بهینهسازی انجام نخواهد شد.
- max-gcse-insertion-ratio
- اگر نسبت درجهای یک عبارت به حذفهای آن برای هر عبارتی از این مقدار بیشتر باشد، آنگاه RTL PRE عبارت را درج یا حذف میکند و بدین ترتیب محاسبات تا حدی تکراری را در جریان دستورالعملها باقی میگذارد.
- max-pending-list-length
- بیشینهٔ تعداد وابستگیهای معلقی که زمانبندی قبل از تخلیهٔ وضعیت جاری و شروع دوباره مجاز میداند. توابع بزرگ با انشعابها یا فراخوانیهای اندک میتوانند فهرستهای بیش از حد بزرگی ایجاد کنند که بدون نیاز حافظه و منابع را هدر میدهند.
- max-modulo-backtrack-attempts
- بیشینهٔ تعداد تلاشهای بازگشت به عقب (backtrack) که زمانبند هنگام زمانبندی پیمانهای یک حلقه باید انجام دهد. مقادیر بزرگتر میتوانند زمان کامپایل را به صورت نمایی افزایش دهند.
- max-inline-functions-called-once-loop-depth
- بیشینهٔ عمق حلقه برای یک فراخوانی که توسط روشهای اکتشافی درونخطی در نظر گرفته میشود، روشهایی که تلاش میکنند تمام توابع فقط یکبار فراخوانیشده را درونخطی کنند.
- max-inline-functions-called-once-insns
- بیشینهٔ اندازهٔ تخمینی توابع تولیدشده هنگام درونخطی کردن توابعی که فقط یکبار فراخوانی شدهاند.
- max-inline-insns-single
- چندین پارامتر درخت درونخطیساز (tree inliner) به کار رفته در GCC را کنترل میکنند. این عدد بیشینهٔ تعداد دستورالعملها (شمارششده در نمایش درونی GCC) را در یک تابع مشخص میکند که درخت درونخطیساز برای درونخطی کردن در نظر میگیرد. این پارامتر تنها بر توابعی که با inline اعلان شدهاند و متدهایی که در اعلان یک کلاس پیادهسازی شدهاند (C++) اثر میگذارد.
- max-inline-insns-auto
- هنگامی که از -finline-functions (گنجاندهشده در -O3) استفاده میکنید، توابع زیادی که در غیر این صورت برای درونخطی شدن توسط کامپایلر بررسی نمیشدند، ارزیابی میشوند. برای این توابع، میتوان حد متفاوتی (محدودکنندهتر) در مقایسه با توابع اعلانشده به عنوان inline اعمال کرد (--param max-inline-insns-auto).
- max-inline-insns-small
- این کرانی است که برای فراخوانیهایی اعمال میشود که در -finline-small-functions مرتبط در نظر گرفته شدهاند.
- max-inline-insns-size
- این کرانی است که برای فراخوانیهای بهینهسازیشده برای اندازه اعمال میشود. رشد اندک ممکن است به منظور پیشبینی فرصتهای بهینهسازی که توسط درونخطیسازی پدیدار میشوند، مطلوب باشد.
- uninlined-function-insns
- تعداد دستورالعملهایی که درونخطیساز برای بار اضافی تابع مانند مقدمه (prologue) و مؤخره (epilogue) تابع محاسبه میکند.
- uninlined-function-time
- زمان اضافی محاسبهشده توسط درونخطیساز برای بار اضافی تابع، مانند زمان مورد نیاز برای اجرای مقدمه و مؤخره تابع.
- inline-heuristics-hint-percent
- مقیاسی (به درصد) که برای inline-insns-single، inline-insns-single-O2 و inline-insns-auto اعمال میشود، هنگامی که روشهای اکتشافی درونخطی اشاره میکنند که درونخطیسازی بسیار سودمند است (بهینهسازیهای بعدی را میسر میسازد).
- uninlined-thunk-insns
- uninlined-thunk-time
- همانند --param uninlined-function-insns و --param uninlined-function-time اما برای thunkهای تابع اعمال میشود..IP inline-min-speedup 4 هنگامی که بهبود تخمینی کارایی زمان اجرای فراخواننده (caller) + فراخوانده (callee) از این آستانه (به درصد) فراتر رود، تابع میتواند بدون توجه به محدودیت --param max-inline-insns-single و --param max-inline-insns-auto درونخطی (inline) شود.
- large-function-insns
- حد مشخصکننده توابع واقعاً بزرگ. برای توابعی که پس از درونخطیسازی بزرگتر از این حد باشند، درونخطیسازی توسط --param large-function-growth محدود میشود. این پارامتر عمدتاً برای جلوگیری از افزایش شدید زمان کامپایلِ ناشی از الگوریتمهای غیرخطی مورد استفاده در بخش پشتی (back end) مفید است.
- large-function-growth
- حداکثر رشد توابع بزرگ ناشی از درونخطیسازی را بر حسب درصد مشخص میکند. برای مثال، مقدار پارامتر 100 رشد تابع بزرگ را به 2.0 برابر اندازه اصلی محدود میکند.
- large-unit-insns
- حد مشخصکننده واحد ترجمه (translation unit) بزرگ. رشد ناشی از درونخطیسازی واحدهای بزرگتر از این حد توسط --param inline-unit-growth محدود میشود. برای واحدهای کوچک ممکن است این محدودیت بیش از حد سختگیرانه باشد. برای مثال، واحدی را در نظر بگیرید شامل تابع A که inline است و تابع B که فقط سه بار A را فراخوانی میکند. اگر B نسبت به A کوچک باشد، رشد واحد 300\% خواهد بود، اما با این وجود چنین درونخطیسازی بسیار معقول است. با این حال برای واحدهای بسیار بزرگ متشکل از توابع کوچکِ قابل درونخطی، محدودیت کلی رشد واحد جهت جلوگیری از انفجار نمایی اندازه کد ضروری است. بنابراین برای واحدهای کوچکتر، پیش از اعمال --param inline-unit-growth، اندازه تا --param large-unit-insns افزایش داده میشود.
- lazy-modules
- حداکثر تعداد فایلهای ماژول C++ که هنگام بارگذاری تنبل (lazy loading) به طور همزمان باز هستند.
- inline-unit-growth
- حداکثر رشد کلی واحد کامپایل (compilation unit) ناشی از درونخطیسازی را مشخص میکند. برای مثال، مقدار پارامتر 20 رشد واحد را به 1.2 برابر اندازه اصلی محدود میکند. توابع سرد (cold) (که از طریق مشخصه یا بازخورد پروفایل به عنوان سرد علامتگذاری شدهاند) در اندازه واحد محاسبه نمیشوند.
- ipa-cp-unit-growth
- حداکثر رشد کلی واحد کامپایل ناشی از انتشار ثابتهای بینروالی (interprocedural constant propagation) را مشخص میکند. برای مثال، مقدار پارامتر 10 رشد واحد را به 1.1 برابر اندازه اصلی محدود میکند.
- ipa-cp-large-unit-insns
- اندازه واحد ترجمهای که گذر IPA-CP آن را بزرگ در نظر میگیرد.
- large-stack-frame
- حد مشخصکننده فریمهای پشته (stack frames) بزرگ. هنگام درونخطیسازی، الگوریتم تلاش میکند تا اندازه فریم بیش از حد فراتر از این حد رشد نکند.
- 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
- حداکثر تعداد اشارهگرهای پایه (base pointers)، ارجاعها و دسترسیهای ذخیرهشده برای یک تابع منفرد را توسط تحلیل mod/ref مشخص میکند.
- modref-max-tests
- حداکثر تعداد آزمونهایی را که اوراکل نام مستعار (alias oracle) میتواند برای رفع ابهام مکانهای حافظه با استفاده از اطلاعات mod/ref انجام دهد، مشخص میکند. این پارامتر باید بزرگتر از --param modref-max-bases و --param modref-max-refs باشد.
- modref-max-depth
- حداکثر عمق پیمایش DFS مورد استفاده در تحلیل فرار (escape analysis) modref را مشخص میکند. تنظیم روی 0 این تحلیل را به طور کامل غیرفعال میکند.
- modref-max-escape-points
- حداکثر تعداد نقاط فرار ردیابیشده توسط modref به ازای هر SSA-name را مشخص میکند.
- modref-max-adjustments
- حداکثر مقداری را مشخص میکند که بازهٔ دسترسی در طول تحلیل جریان داده (dataflow analysis) modref میتواند بزرگتر شود.
- profile-func-internal-id
- پارامتری برای کنترل اینکه آیا در جستجوی پایگاه داده پروفایل از شناسه داخلی تابع استفاده شود یا خیر. اگر مقدار 0 باشد، کامپایلر از شناسهای بر پایه نام اسمبلی تابع و نام فایل استفاده میکند، که باعث میشود دادههای پروفایل قدیمی نسبت به تغییرات سورس مانند تغییر ترتیب توابع و غیره تحملپذیرتر باشند.
- min-vect-loop-bound
- حداقل تعداد تکرارهایی که در صورت کمتر بودن از آن، حلقهها هنگام استفاده از -ftree-vectorize برداری نمیشوند. تعداد تکرارها پس از برداریسازی باید بیشتر از مقدار مشخصشده توسط این گزینه باشد تا اجازه برداریسازی داده شود.
- gcse-cost-distance-ratio
- ضریب مقیاسبندی در محاسبه حداکثر مسافتی که یک عبارت میتواند توسط بهینهسازیهای GCSE جابهجا شود. این گزینه در حال حاضر تنها در گذر بالا بردن کد (code hoisting pass) پشتیبانی میشود. هرچه نسبت بزرگتر باشد، بالا بردن کد با عبارات ساده، یعنی عباراتی که هزینهای کمتر از gcse-unrestricted-cost دارند، تهاجمیتر خواهد بود. مشخص کردن 0، بالا بردن عبارات ساده را غیرفعال میکند.
- gcse-unrestricted-cost
- هزینهای که تقریباً به اندازه هزینه یک دستورالعمل ماشین معمول سنجیده میشود، و در آن بهینهسازیهای GCSE مسافتی را که یک عبارت میتواند طی کند محدود نمیکنند. این گزینه در حال حاضر تنها در گذر بالا بردن کد پشتیبانی میشود. هرچه هزینه کمتر باشد، بالا بردن کد تهاجمیتر خواهد بود. مشخص کردن 0 به همه عبارات اجازه میدهد تا مسافتهای نامحدودی را جابهجا شوند.
- max-hoist-depth
- عمق جستجو در درخت تسلط (dominator tree) برای عباراتی که قرار است بالا برده شوند. این پارامتر برای جلوگیری از رفتار درجه دوم در الگوریتم بالا بردن (hoisting) استفاده میشود. مقدار 0 محدودیتی برای جستجو قائل نمیشود، اما ممکن است کامپایل توابع بسیار بزرگ را کُند کند.
- max-tail-merge-comparisons
- حداکثر تعداد bbهای مشابه برای مقایسه یک bb با آنها. این پارامتر برای جلوگیری از رفتار درجه دوم در ادغام دنباله درخت (tree tail merging) استفاده میشود.
- max-tail-merge-iterations
- حداکثر تعداد تکرارهای گذر روی تابع. این پارامتر برای محدود کردن زمان کامپایل در ادغام دنباله درخت استفاده میشود.
- store-merging-allow-unaligned
- به گذر ادغام ذخیرهسازی (store merging pass) اجازه میدهد در صورت مجاز بودن، ذخیرهسازیهای ناتراز (unaligned stores) را ایجاد کند..IP max-stores-to-merge 4 حداکثر تعداد ذخیرهسازیهایی که در گذرگاه ادغام ذخیرهسازیها (store merging) تلاش میشود در ذخیرهسازیهای عریضتر ادغام شوند.
- max-store-chains-to-track
- حداکثر تعداد زنجیرههای ذخیرهسازی که بهطور همزمان در تلاش برای ادغام آنها در ذخیرهسازیهای عریضتر در گذرگاه store merging ردگیری میشوند.
- max-stores-to-track
- حداکثر تعداد ذخیرهسازیهایی که بهطور همزمان در تلاش برای ادغام آنها در ذخیرهسازیهای عریضتر در گذرگاه store merging ردگیری میشوند.
- max-unrolled-insns
- حداکثر تعداد دستورالعملهایی که یک حلقه برای باز شدن (unroll) میتواند داشته باشد. در صورت باز شدن یک حلقه، این پارامتر همچنین تعیین میکند که کد حلقه چند بار باز شود.
- max-average-unrolled-insns
- حداکثر تعداد دستورالعملها، وزندار شده بر اساس احتمال اجرای آنها، که یک حلقه برای باز شدن میتواند داشته باشد. در صورت باز شدن یک حلقه، این پارامتر همچنین تعیین میکند که کد حلقه چند بار باز شود.
- max-unroll-times
- حداکثر تعداد دفعات باز کردن (unrolling) یک حلقه منفرد.
- max-peeled-insns
- حداکثر تعداد دستورالعملهایی که یک حلقه برای پوستهگیری (peeling) میتواند داشته باشد. در صورت پوستهگیری حلقه، این پارامتر همچنین تعیین میکند که کد حلقه چند بار پوستهگیری شود.
- max-peel-times
- حداکثر دفعات پوستهگیری یک حلقه منفرد.
- max-peel-branches
- حداکثر تعداد انشعابها روی مسیر داغ (hot path) در امتداد توالی پوستهگیریشده.
- max-completely-peeled-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).
- min-loop-cond-split-prob
- هنگامی که اطلاعات پروفایلبندی FDO در دسترس باشد، min-loop-cond-split-prob حداقل آستانه احتمال یک گزاره شرطی نیمهناوردا را جهت برانگیختن تقسیم حلقه (loop split) تعیین میکند.
- iv-consider-all-candidates-bound
- حد آستانه تعداد نامزدهای متغیرهای القایی (induction variables) که پایینتر از آن، همه نامزدها برای هر مورد استفاده در بهینهسازیهای متغیرهای القایی در نظر گرفته میشوند. اگر تعداد نامزدها از این مقدار بیشتر باشد، تنها مرتبطترین آنها برای جلوگیری از پیچیدگی زمانی درجه دوم لحاظ میشوند.
- iv-max-considered-uses
- بهینهسازیهای متغیرهای القایی از پردازش حلقههایی که بیش از این مقدار مورد استفاده از متغیرهای القایی داشته باشند، صرفنظر میکنند.
- iv-always-prune-cand-set-bound
- اگر تعداد نامزدها در مجموعه کمتر از این مقدار باشد، هنگام افزودن یک مورد جدید، همیشه تلاش میشود متغیرهای القایی غیرضروری از مجموعه هرس شوند.
- 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) پشتیبانی میشود، مگر اینکه حلقه با عملگر عملیاخته (pragma) simd علامتگذاری شده باشد.
- vect-max-layout-candidates
- حداکثر تعداد چینشهای برداری ممکن (مانند جایگشتها) که هنگام بهینهسازی کدهای آماده برداریسازی در نظر گرفته میشوند.
- vect-max-version-for-alignment-checks
- حداکثر تعداد بررسیهای زمان اجرا که هنگام انجام نسخهبندی حلقه برای همترازی (alignment) در برداریساز (vectorizer) میتوان انجام داد.
- vect-max-version-for-alias-checks
- حداکثر تعداد بررسیهای زمان اجرا که هنگام نسخهبندی حلقه برای نامهای مستعار (alias) در برداریساز میتوان انجام داد.
- vect-max-peeling-for-alignment
- حداکثر دفعات پوستهگیری حلقه جهت بهبود همترازی دسترسی برای برداریساز. مقدار -1 به معنای نبود محدودیت است.
- max-iterations-to-track
- حداکثر تعداد تکرارهای یک حلقه که الگوریتم جامع (brute-force) برای تحلیل تعداد تکرارهای حلقه سعی در ارزیابی آن دارد.
- hot-bb-count-fraction
- مخرج n از کسر 1/n از حداکثر تعداد اجرای یک بلوک پایه در کل برنامه که یک بلوک پایه باید حداقل دارا باشد تا داغ (hot) در نظر گرفته شود. مقدار پیشفرض 10000 است، به این معنی که اگر تعداد اجرای یک بلوک پایه بیش از 1/10000 حداکثر تعداد اجرا باشد، داغ در نظر گرفته میشود. مقدار 0 به این معنی است که هرگز داغ در نظر گرفته نمیشود. در حالت non-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 از تعداد اجراهای پروفایلشده کل برنامه که اگر تعداد اجرای یک بلوک پایه کمتر از آن باشد، بلوک پایه کماحتمال برای اجرا در نظر گرفته میشود. مقدار پیشفرض 20 است، یعنی اگر یک بلوک پایه در کمتر از 1/20 یا 5٪ از اجراهای برنامه اجرا شود، کماحتمال تلقی میشود. مقدار 0 به این معنی است که همیشه کماحتمال در نظر گرفته میشود.
- max-predicted-iterations
- حداکثر تعداد تکرارهای حلقه که بهصورت ایستا پیشبینی میکنیم. این پارامتر در مواردی مفید است که یک تابع شامل یک حلقه با کران مشخص و یک حلقه دیگر با کران نامشخص باشد. تعداد تکرارهای حلقه مشخص بهدرستی پیشبینی میشود، در حالی که تکرارهای حلقه نامشخص بهطور میانگین نزدیک به 10 برآورد میشود. این امر باعث میشود که حلقه بدون کران بهطور مصنوعی نسبت به دیگری سرد (cold) به نظر برسد.
- builtin-expect-probability
- کنترل احتمال اینکه عبارت دارای مقدار مشخصشده باشد. این پارامتر یک درصد (یعنی بین 0 تا 100) را به عنوان ورودی دریافت میکند.
- builtin-string-cmp-inline-length
- حداکثر طول یک رشته ثابت برای یک فراخوانی توکار cmp رشته که واجد شرایط درونخطیسازی (inlining) است.
- align-threshold
- انتخاب کسری از حداکثر بسامد اجرای یک بلوک پایه در یک تابع جهت همترازسازی بلوک پایه.
- align-loop-iterations
- حلقهای که انتظار میرود حداقل به تعداد تکرار انتخابشده اجرا شود، همتراز میگردد.
- tracer-dynamic-coverage
- tracer-dynamic-coverage-feedback
- این مقدار
برای محدود
کردن تشکیل
ابربلوک (superblock)
پس از
پوششدهی
درصد
مشخصشدهای
از
دستورالعملهای
اجراشده به
کار میرود.
این کار از
افزایش
بیمورد
اندازه کد
جلوگیری
میکند.
پارامتر tracer-dynamic-coverage-feedback تنها زمانی استفاده میشود که بازخورد پروفایل (profile feedback) در دسترس باشد. پروفایلهای واقعی (برخلاف موارد تخمینزدهشده بهصورت ایستا) بسیار کمتر متوازن هستند که امکان میدهد این آستانه مقدار بزرگتری داشته باشد.
- tracer-max-code-growth
- هنگامی که رشد کد به درصد مشخصشده رسید، تکثیر دنباله (tail duplication) متوقف میشود. این یک محدودیت نسبتاً ساختگی است، چرا که اکثر موارد تکراری بعداً در جهش متقاطع (cross jumping) حذف میشوند، بنابراین میتوان آن را روی مقادیر بسیار بالاتری از رشد کد مد نظر تنظیم کرد.
- tracer-min-branch-ratio
- هنگامی که احتمال معکوسِ بهترین یال کمتر از این آستانه (به درصد) باشد، رشد معکوس متوقف میشود.
- tracer-min-branch-probability
- tracer-min-branch-probability-feedback
- اگر بهترین
یال،
احتمالی
کمتر از این
آستانه
داشته
باشد، رشد
روبهجلو
متوقف
میشود.
مشابه tracer-dynamic-coverage، دو پارامتر ارائه شده است. tracer-min-branch-probability-feedback برای کامپایل همراه با بازخورد پروفایل، و tracer-min-branch-probability برای کامپایل بدون آن استفاده میشود. مقدار مربوط به کامپایل با بازخورد پروفایل باید محتاطانهتر (بزرگتر) باشد تا tracer مؤثر واقع شود.
- stack-clash-protection-guard-size
- اندازه محافظ پشته ارائهشده توسط سیستمعامل را بهصورت ۲ به توان num بایت مشخص میکند. مقادیر بالاتر ممکن است تعداد کاوشهای صریح (explicit probes) را کاهش دهند، اما مقداری بزرگتر از محافظ ارائهشده توسط سیستمعامل، کد را در برابر حملات نوع برخورد پشته (stack clash) آسیبپذیر میکند.
- stack-clash-protection-probe-interval
- محافظت در برابر برخورد پشته، شامل کاوش فضای پشته در حین تخصیص آن است. این پارامتر بیشینه فاصله میان کاوشها در پشته را بهصورت ۲ به توان num بایت کنترل میکند. مقادیر بالاتر ممکن است تعداد کاوشهای صریح را کاهش دهند، اما مقداری بزرگتر از محافظ ارائهشده توسط سیستمعامل، کد را در برابر حملات نوع برخورد پشته آسیبپذیر باقی خواهد گذاشت.
- max-cse-path-length
- بیشینه تعداد بلوکهای پایهای در مسیری که CSE بررسی میکند.
- max-cse-insns
- بیشینه تعداد دستورالعملهایی که CSE پیش از تخلیه (flushing) پردازش میکند.
- ggc-min-expand
- کامپایلر GCC
از یک
زبالهروب
(garbage collector) برای
مدیریت
تخصیص
حافظه خود
استفاده
میکند. این
پارامتر
حداقل
درصدی را
مشخص
میکند که
هیپ (heap)
زبالهروب
مجاز است در
بین دفعات
جمعآوری
گسترش یابد.
تنظیم دقیق
این مقدار
ممکن است
سرعت
کامپایل را
بهبود
بخشد؛ این
گزینه هیچ
اثری روی
تولید کد
ندارد.
مقدار پیشفرض 30% + 70% * (RAM/1GB) با حد بالای 100% در صورت RAM >= 1GB است. اگر "getrlimit" موجود باشد، مفهوم «RAM» کوچکترین مقدار میان RAM واقعی و "RLIMIT_DATA" یا "RLIMIT_AS" خواهد بود. اگر GCC نتواند RAM را در یک پلتفرم خاص محاسبه کند، از حد پایین 30% استفاده میشود. تنظیم این پارامتر و ggc-min-heapsize روی صفر باعث میشود در هر فرصت ممکن یک جمعآوری کامل رخ دهد. این کار بهشدت کند است، اما میتواند برای اشکالزدایی مفید باشد.
- ggc-min-heapsize
- حداقل
اندازه هیپ
زبالهروب
پیش از آنکه
شروع به
جمعآوری
زباله کند.
نخستین
جمعآوری
پس از آن رخ
میدهد که
هیپ به
میزان ggc-min-expand%
فراتر از
ggc-min-heapsize گسترش
یابد. باز
هم، تنظیم
این مقدار
ممکن است
سرعت
کامپایل را
بهبود دهد و
هیچ اثری
روی تولید
کد ندارد.
مقدار پیشفرض، کوچکترین مقدار از میان RAM/8، RLIMIT_RSS یا حدی است که تلاش میکند اطمینان حاصل کند از RLIMIT_DATA یا RLIMIT_AS فراتر نرفته است، اما با حد پایین ۴۰۹۶ (چهار مگابایت) و حد بالای ۱۳۱۰۷۲ (۱۲۸ مگابایت). اگر GCC نتواند RAM را در یک پلتفرم خاص محاسبه کند، از حد پایین استفاده میشود. تنظیم بسیار بزرگ این پارامتر عملاً جمعآوری زباله را غیرفعال میکند. تنظیم این پارامتر و ggc-min-expand روی صفر باعث میشود در هر فرصت یک جمعآوری کامل رخ دهد.
- max-reload-search-insns
- بیشینه تعداد دستورالعملهایی که بازبارگذاری (reload) باید برای ثبات معادل رو به عقب جستجو کند. افزایش مقادیر به معنی بهینهسازی تهاجمیتر است که زمان کامپایل را با احتمال عملکرد اندکی بهتر، افزایش میدهد.
- max-cselib-memory-locations
- بیشینه تعداد مکانهای حافظه که cselib باید لحاظ کند. افزایش مقادیر به معنی بهینهسازی تهاجمیتر است که زمان کامپایل را با احتمال عملکرد اندکی بهتر افزایش میدهد.
- max-sched-ready-insns
- بیشینه تعداد دستورالعملهای آماده صدور که زمانبند در هر زمان مشخص در طول اولین گذر زمانبندی باید در نظر بگیرد. افزایش مقادیر به معنای جستجوهای دقیقتر است که زمان کامپایل را احتمالاً با فایدهای ناچیز افزایش میدهد.
- max-sched-region-blocks
- بیشینه تعداد بلوکها در یک ناحیه که برای زمانبندی بینبلوکی (interblock scheduling) در نظر گرفته میشوند.
- max-pipeline-region-blocks
- بیشینه تعداد بلوکها در یک ناحیه که برای خطلولهای کردن (pipelining) در زمانبند انتخابی در نظر گرفته میشوند.
- max-sched-region-insns
- بیشینه تعداد دستورالعملها (insn) در یک ناحیه که برای زمانبندی بینبلوکی در نظر گرفته میشوند.
- max-pipeline-region-insns
- بیشینه تعداد دستورالعملها (insn) در یک ناحیه که برای خطلولهای کردن در زمانبند انتخابی در نظر گرفته میشوند.
- min-spec-prob
- حداقل احتمال (به درصد) برای رسیدن به یک بلوک مبدا جهت زمانبندی حدسی بینبلوکی (interblock speculative scheduling).
- max-sched-extend-regions-iters
- بیشینه تعداد تکرارها در CFG برای گسترش نواحی. مقدار 0 گسترش نواحی را غیرفعال میکند.
- max-sched-insn-conflict-delay
- بیشینه تأخیر تداخل برای یک دستورالعمل، جهت در نظر گرفته شدن برای جابهجایی حدسی.
- sched-spec-prob-cutoff
- حداقل احتمال موفقیت حدس (به درصد)، بهطوری که دستورالعملهای حدسی زمانبندی شوند.
- sched-state-edge-prob-cutoff
- حداقل احتمالی که یک یال باید داشته باشد تا زمانبند وضعیت خود را از میان آن ذخیره کند.
- sched-mem-true-dep-cost
- حداقل فاصله (بر حسب چرخههای پردازنده) میان ذخیره (store) و بارگذاری (load) که مکانهای حافظه یکسانی را هدف قرار میدهند.
- selsched-max-lookahead
- بیشینه اندازه پنجره پیشنگری (lookahead window) در زمانبندی انتخابی. این مقدار، عمق جستجو برای دستورالعملهای دردسترس است.
- selsched-max-sched-times
- بیشینه دفعاتی که یک دستورالعمل در طول زمانبندی انتخابی زمانبندی میشود. این محدودیت روی تعداد تکرارهایی است که دستورالعمل ممکن است در طول آنها خطلولهای شود.
- selsched-insns-to-rename
- بیشینه تعداد بهترین دستورالعملها در فهرست آماده که برای تغییر نام در زمانبند انتخابی در نظر گرفته میشوند.
- 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) قرار میگیرند..IP min-size-for-stack-sharing 4 حداقل اندازهٔ متغیرهایی که در صورت عدم بهینهسازی، در بهاشتراکگذاری شکاف پشته (stack slot sharing) شرکت میکنند.
- max-jump-thread-duplication-stmts
- حداکثر تعداد دستورهای مجاز در بلوکی که هنگام ریسهبندی پرشها (jump threading) نیاز به تکثیر شدن دارد.
- max-jump-thread-paths
- حداکثر تعداد مسیرها برای بررسی هنگام جستجوی فرصتهای ریسهبندی پرش. هنگام رسیدن به یک بلوک، یالهای ورودی تنها در صورتی بررسی میشوند که حاصلضرب تعداد مسیرهای جستجوشده تا کنون در تعداد یالهای ورودی، از حداکثر تعداد مسیرهای مشخصشده برای بررسی فراتر نرود.
- max-fields-for-field-sensitive
- حداکثر تعداد فیلدها در ساختاری که هنگام تحلیل اشارهگر (pointer analysis) به شیوهای حساس به فیلد (field-sensitive) با آن برخورد میشود.
- prefetch-latency
- تخمین میانگین تعداد دستورالعملهایی که پیش از پایان پیشواکشی (prefetch) اجرا میشوند. فاصلهٔ پیشواکشی به سمت جلو، متناسب با این مقدار ثابت است. افزایش این عدد همچنین ممکن است منجر به پیشواکشی جریانهای کمتری شود (نگاه کنید به simultaneous-prefetches).
- simultaneous-prefetches
- حداکثر تعداد پیشواکشیهایی که میتوانند به طور همزمان اجرا شوند.
- l1-cache-line-size
- اندازهٔ خط حافظهٔ نهان در کَش دادهٔ L1، بر حسب بایت.
- l1-cache-size
- اندازهٔ کَش دادهٔ L1، بر حسب کیلوبایت.
- l2-cache-size
- اندازهٔ کَش دادهٔ L2، بر حسب کیلوبایت.
- prefetch-dynamic-strides
- مشخص
میکند که
آیا گام
پیشواکشی
آرایه در
حلقه باید
نشانههای
(hints)
پیشواکشی
نرمافزاری
را برای
گامهای (strides)
غیرثابت
صادر کند یا
خیر. در
برخی موارد
ممکن است
این کار
سودمند
باشد،
اگرچه
غیرثابت
بودن گام
ممکن است
پیشبینی
زمان
فایدهمندی
قطعی صدور
این
نشانهها
را دشوار
سازد.
اگر نشانههای پیشواکشی باید برای گامهای غیرثابت صادر شوند، این مقدار را 1 قرار دهید. اگر نشانهها فقط باید برای گامهایی که ثابت بوده و زیر prefetch-minimum-stride هستند صادر شوند، مقدار را 0 بگذارید.
- prefetch-minimum-stride
- حداقل گام
ثابت، بر
حسب بایت،
برای آغاز
استفاده از
نشانههای
پیشواکشی.
اگر گام
کمتر از این
آستانه
باشد،
نشانههای
پیشواکشی
صادر
نخواهند شد.
این تنظیم برای پردازندههایی سودمند است که دارای پیشواکشکنندههای سختافزاری هستند، چرا که در این حالت ممکن است تداخلهایی بین پیشواکشکنندههای سختافزاری و نرمافزاری به وجود آید. اگر پیشواکشکنندههای سختافزاری حداکثر گامی دارند که میتوانند مدیریت کنند، باید برای بهبود بهرهوری پیشواکشکنندههای نرمافزاری در اینجا استفاده شود.
مقدار -1 به این معناست که آستانهای وجود ندارد و بنابراین نشانههای پیشواکشی میتوانند برای هر گام ثابتی صادر شوند.
این تنظیم تنها برای گامهایی مفید است که مشخص و ثابت باشند.
- destructive-interference-size
- constructive-interference-size
- مقادیر
متغیرهای C++17
برای
"std::hardware_destructive_interference_size"
و
"std::hardware_constructive_interference_size".
اندازهٔ
تداخل
مخرب،
حداقل
فاصلهٔ (offset)
توصیهشده
میان دو شیء
مستقل است
که به طور
همروند
مورد
دسترسی
قرار
میگیرند؛
اندازهٔ
تداخل
سازنده،
حداکثر
اندازهٔ
توصیهشده
از حافظهٔ
پیوستهای
است که با
هم دسترسی
داده
میشوند.
معمولاً هر
دو برابر با
اندازهٔ یک
خط حافظهٔ
نهان L1 برای
هدف مورد
نظر، بر حسب
بایت
خواهند بود.
برای یک هدف
عمومی که
بازهای از
اندازههای
خط حافظهٔ
نهان L1 را
پوشش
میدهد،
معمولاً
اندازهٔ
تداخل
سازنده
کران پایین
بازه و
اندازهٔ
تداخل مخرب
کران بالای
آن خواهد
بود.
اندازهٔ تداخل مخرب برای چیدمان حافظه در نظر گرفته شده و بنابراین بر ABI اثرگذار است. انتظار نمیرود مقدار پیشفرض آن پایدار باشد و در برخی اهداف با -mtune تغییر میکند؛ بنابراین اکیداً توصیه میشود از این متغیر در محیطهایی که پایداری ABI در آنها مهم است، مانند رابط عمومی یک کتابخانه، استفاده نشود؛ در صورت استفاده در چنان شرایطی، کاربران میتوانند با بهرهگیری از این گزینه مقدار را تثبیت کنند.
اندازهٔ تداخل سازنده حساسیت کمتری دارد، زیرا معمولاً تنها در یک static_assert به کار میرود تا اطمینان حاصل شود که یک نوع داده درون یک خط حافظهٔ نهان جا میگیرد.
همچنین ببینید: -Winterference-size.
- loop-interchange-max-num-stmts
- حداکثر تعداد دستورها در حلقهای که قرار است جابهجا (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
- حداکثر تعداد حالتها (cases) برای استفاده از الگوریتمهای کند کاهش سطح (lowering) ساختار switch.
- max-partial-antic-length
- حداکثر طول مجموعهٔ پیشبینینشدهٔ جزئی (partial antic set) که در حین بهینهسازی حذف افزونگی جزئی درختی (-ftree-pre) در سطوح بهینهسازی -O3 و بالاتر محاسبه میشود. برای برخی انواع کدهای منبع، بهینهسازی پیشرفتهٔ حذف افزونگی جزئی ممکن است از مهار خارج شده و تمام حافظهٔ در دسترس در ماشین میزبان را مصرف کند. این پارامتر محدودیتی بر روی طول مجموعههای محاسبهشده قرار میدهد که از این رفتار لجامگسیخته جلوگیری میکند. تنظیم مقدار 0 برای این پارامتر، طول نامحدود برای مجموعه را مجاز میسازد.
- rpo-vn-max-loop-depth
- حداکثر عمق حلقهای که شمارهگذاری مقادیر (value numbering) در آن به صورت خوشبینانه انجام میشود. هنگامی که این محدودیت سر برسد، داخلیترین حلقهها به تعداد 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 از الگوریتمی پیچیده برای فشردهسازی جدول تداخل استفاده میکند، اما این جدول همچنان میتواند برای توابع بسیار بزرگ به مقادیر بیش از حدی از حافظه نیاز داشته باشد. اگر اندازهٔ جدول تداخل برای یک تابع بتواند بیش از اندازهٔ دادهشده بر حسب مگابایت توسط این پارامتر باشد، تخصیصدهندهٔ ثبات در عوض از الگوریتمی سریعتر، سادهتر و با کیفیت پایینتر استفاده میکند که نیازی به ساخت جدول تداخل شبهثباتها ندارد.
- ira-loop-reserved-regs
- میتوان از IRA برای ارزیابی دقیقتر فشار ثباتها (register pressure) در حلقهها به منظور تصمیمگیری در مورد جابهجایی مقادیر ناوردا در حلقه استفاده کرد (نگاه کنید به -O3). تعداد ثباتهای در دسترسی که برای مقاصد دیگر رزرو شدهاند با این پارامتر تعیین میشود. مقدار پیشفرض این پارامتر بهترین مقدار بهدستآمده از آزمایشهای پرشمار است.
- ira-consider-dup-in-all-alts
- باعث میشود IRA محدودیت تطابق (شماره عملوند تکراری) را در تمام حالتهای جایگزینِ (alternatives) در دسترس برای کلاس ثبات ترجیحی بهطور جدی لحاظ کند. اگر روی صفر تنظیم شود، به این معنی است که IRA فقط زمانی محدودیت تطابق را رعایت میکند که در تنها جایگزین در دسترس با یک کلاس ثبات مناسب قرار داشته باشد. در غیر این صورت، بدین معناست که IRA تمام جایگزینهای ممکن را برای کلاس ثبات ترجیحی بررسی خواهد کرد، حتی اگر انتخابی با کلاس ثبات مناسب پیدا کرده باشد، و محدودیت تطابق واجد شرایطِ یافتشده را محترم میشمارد.
- ira-simple-lra-insn-threshold
- تعداد تقریبی دستورالعملهای (insn) تابع در واحدهای هزارتایی (1K) که فعالکنندهٔ تخصیص محلی سادهٔ ثبات (simple local RA) است.
- lra-inheritance-ebb-probability-cutoff
- بخش LRA تلاش میکند مقادیر بازبارگذاریشده در ثباتها را در دستورالعملهای بعدی مجدداً استفاده کند. به این بهینهسازی، وراثت (inheritance) میگویند. بلوک پایهای توسعهیافته (EBB) به عنوان ناحیهای برای انجام این بهینهسازی به کار میرود. این پارامتر حداقل احتمال یال عبوری مستقیم (fall-through edge) را بر حسب درصد برای افزودن BB به EBB ارثبری در LRA تعیین میکند. مقدار پیشفرض از میان اجرای مکرر بنچمارک SPEC2000 روی x86-64 انتخاب شده است..IP loop-invariant-max-bbs-in-loop 4 انتقال ناوردای حلقه (Loop invariant motion) در حلقههای بسیار بزرگ میتواند هم از نظر زمان کامپایل و هم از نظر میزان حافظهٔ مورد نیاز در زمان کامپایل بسیار پرهزینه باشد. برای حلقههایی که تعداد بلوکهای پایهای (basic blocks) آنها بیشتر از این پارامتر باشد، بهینهسازی انتقال ناوردای حلقه انجام نخواهد شد.
- loop-max-datarefs-for-datadeps
- ایجاد وابستگیهای دادهای برای حلقههای بسیار بزرگ پرهزینه است. این پارامتر تعداد مراجع دادهای (data references) در حلقهها را که برای تحلیل وابستگی داده بررسی میشوند، محدود میکند. این حلقههای بزرگ توسط بهینهسازیهایی که از وابستگیهای دادهای حلقه استفاده میکنند، پردازش نمیشوند.
- max-vartrack-size
- حداکثر تعداد خانههای جدول درهمسازی (hash table) را برای استفاده در طول تحلیل شارش دادهٔ ردیابی متغیرها در هر تابع تعیین میکند. اگر این حد با فعال بودن ردیابی متغیر در انتسابها رد شود، تحلیل آن تابع بدون آن و پس از حذف تمام دستورالعملهای اشکالزدایی (debug insns) از تابع دوباره امتحان میشود. اگر حد مجاز حتی بدون دستورالعملهای اشکالزدایی نیز رد شود، تحلیل ردیابی متغیر بهطور کامل برای آن تابع غیرفعال میگردد. تنظیم این پارامتر روی صفر، آن را نامحدود میکند.
- max-vartrack-expr-depth
- حداکثر سطوح بازگشتی (recursion levels) را هنگام تلاش برای نگاشت نام متغیرها یا متغیرهای موقت اشکالزدایی به عبارتهای مقداری تعیین میکند. این کار زمان کامپایل را با اطلاعات اشکالزدایی کاملتر معاوضه میکند. اگر این مقدار بسیار کم تنظیم شود، عبارتهای مقداری که در دسترس هستند و میتوانند در اطلاعات اشکالزدایی نمایش داده شوند ممکن است استفاده نشوند؛ تنظیم مقدار بالاتر ممکن است کامپایلر را قادر سازد عبارتهای اشکالزدایی پیچیدهتری بیابد، اما زمان کامپایل و مصرف حافظه ممکن است افزایش یابد.
- max-debug-marker-count
- آستانهای برای تعداد نشانگرهای اشکالزدایی (مانند نشانگرهای شروع دستور یا begin stmt) تعیین میکند تا از انفجار پیچیدگی هنگام درونخطسازی (inlining) یا بسط به RTL جلوگیری شود. اگر یک تابع دستورهای gimple بیشتری از این حد تعیینشده داشته باشد، این دستورها از نسخهٔ درونخطشدهٔ تابع و از بسط RTL آن حذف خواهند شد.
- min-nondebug-insn-uid
- برای دستورالعملهای غیر اشکالزدایی (nondebug insns)، از uidهایی که از این پارامتر شروع میشوند استفاده میکند. محدودهٔ زیر این پارامتر منحصراً برای دستورالعملهای اشکالزدایی ایجادشده توسط -fvar-tracking-assignments رزرو شده است، اما در صورت اتمام محدودهٔ رزروشده، دستورالعملهای اشکالزدایی ممکن است uidهای (غیر همپوشان) بالاتر از آن را دریافت کنند.
- ipa-sra-deref-prob-threshold
- بخش IPA-SRA تنها زمانی یک اشارهگر را که مشخص است NULL نیست با یک یا چند پارامتر جدید جایگزین میکند که احتمال (به درصد، نسبت به ورودی تابع) ارجاعزدایی (dereference) آن از این پارامتر بیشتر باشد.
- ipa-sra-ptr-growth-factor
- بخش IPA-SRA تنها زمانی یک اشارهگر به یک ساختار تجمعی (aggregate) را با یک یا چند پارامتر جدید جایگزین میکند که اندازهٔ تجمیعی آنها کمتر یا مساوی با ipa-sra-ptr-growth-factor برابر اندازهٔ پارامتر اشارهگر اصلی باشد.
- ipa-sra-ptrwrap-growth-factor
- حداکثر رشد مجاز اضافی برای اندازهٔ کل پارامترهای جدیدی که ipa-sra با یک اشارهگر به ساختار تجمعی جایگزین میکند، در صورتی که به یک متغیر محلی اشاره کند که فراخواننده فقط در آن مینویسد و آن را به عنوان آرگومان به توابع دیگر ارسال میکند.
- ipa-sra-max-replacements
- حداکثر بخشهایی از یک ساختار تجمعی (aggregate) که IPA-SRA ردیابی میکند. در نتیجه، این مقدار همچنین حداکثر تعداد جایگزینیهای یک پارامتر صوری (formal parameter) است.
- sra-max-scalarization-size-Ospeed
- sra-max-scalarization-size-Osize
- دو گذر کاهش اسکالر ساختارهای تجمعی (SRA و IPA-SRA) با هدف جایگزینی بخشهای اسکالر تجمعیها با استفاده از متغیرهای اسکالر مستقل عمل میکنند. این پارامترها حداکثر اندازه (بر حسب واحدهای ذخیرهسازی) ساختار تجمعی را که هنگام کامپایل برای سرعت (sra-max-scalarization-size-Ospeed) یا برای اندازه (sra-max-scalarization-size-Osize) در نظر گرفته میشود، کنترل میکنند.
- sra-max-propagations
- حداکثر تعداد دسترسیهای ساختگی (artificial accesses) که جایگزینی اسکالر ساختارهای تجمعی (SRA) به ازای هر متغیر محلی ردیابی میکند تا انتشار کپی (copy propagation) را تسهیل نماید.
- tm-max-aggregate-size
- هنگام ساختن کپی از متغیرهای محلی ریسه (thread-local) در یک تراکنش، این پارامتر اندازه را بر حسب بایت مشخص میکند که پس از آن متغیرها به جای جفتهای توالی کد ذخیره/بازیابی، با توابع گزارشگیری (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 فعال میشوند، هر حلقه در آشیانهٔ حلقه را به تعداد مشخصی تکرار نواربندی (strip mine) میکنند. طول نوار را میتوان با استفاده از پارامتر loop-block-tile-size تغییر داد.
- ipa-jump-function-lookups
- تعداد دستورهای بررسیشده در طول کشف آفستِ تابعِ پرش (jump function offset discovery) را مشخص میکند.
- ipa-cp-value-list-size
- بخش IPA-CP تلاش میکند تمام مقادیر و نوعهای ممکن ارسالشده به پارامتر یک تابع را ردیابی کند تا آنها را انتشار دهد و مجازیزدایی (devirtualization) را انجام دهد. پارامتر ipa-cp-value-list-size حداکثر تعداد مقادیر و نوعهایی است که به ازای هر پارامتر صوریِ یک تابع ذخیره میکند.
- ipa-cp-eval-threshold
- بخش IPA-CP امتیاز خود را برای اکتشاف سودآوری شبیهسازی (cloning profitability heuristics) محاسبه کرده و آن دسته از فرصتهای شبیهسازی را که امتیازشان از ipa-cp-eval-threshold فراتر رود، اجرا میکند.
- ipa-cp-max-recursive-depth
- حداکثر عمق شبیهسازی بازگشتی برای یک تابع خودبازگشتی (self-recursive).
- ipa-cp-min-recursive-probability
- شبیهسازی بازگشتی تنها زمانی انجام میشود که احتمال اجرای فراخوانی از مقدار این پارامتر فراتر رود.
- ipa-cp-profile-count-base
- هنگام استفاده از گزینهٔ -fprofile-use، بخش IPA-CP تعداد اجرای اندازهگیریشدهٔ یک یال در گراف فراخوانی را در این موقعیت درصدی از هیستوگرام آنها به عنوان مبنای محاسبات اکتشافی خود در نظر میگیرد.
- ipa-cp-recursive-freq-factor
- تعداد دفعاتی که انتشار کپی میانروالی (interprocedural copy propagation) انتظار دارد توابع بازگشتی خودشان را فراخوانی کنند.
- ipa-cp-recursion-penalty
- درصد جریمهای که توابع بازگشتی هنگام ارزیابی برای شبیهسازی دریافت خواهند کرد.
- ipa-cp-single-call-penalty
- درصد جریمهای که توابع حاوی تنها یک فراخوانی به تابع دیگر، هنگام ارزیابی برای شبیهسازی دریافت خواهند کرد.
- ipa-max-agg-items
- بخش IPA-CP همچنین قادر است تعدادی از مقادیر اسکالر ارسالشده در یک ساختار تجمعی را انتشار دهد. ipa-max-agg-items حداکثر تعداد چنین مقادیری را به ازای هر پارامتر کنترل میکند.
- ipa-cp-loop-hint-bonus
- هنگامی که IPA-CP تشخیص دهد یک کاندید شبیهسازی باعث مشخص شدن تعداد تکرارهای یک حلقه میشود، پاداشی به اندازهٔ ipa-cp-loop-hint-bonus به امتیاز سودآوری آن کاندید اضافه میکند.
- ipa-max-loop-predicates
- حداکثر تعداد محمولهای (predicates) متفاوتی که IPA برای توصیف این که چه زمانی حلقهها در یک تابع ویژگیهای شناختهشده دارند، استفاده خواهد کرد.
- ipa-max-aa-steps
- در طول تحلیل بدنهٔ توابع، IPA-CP از تحلیل نام مستعار (alias analysis) به منظور ردیابی مقادیر اشارهشده توسط پارامترهای تابع استفاده میکند. برای جلوگیری از صرف زمان بیش از حد در تحلیل توابع بسیار بزرگ، پس از بررسی تعداد ipa-max-aa-steps دستور اصلاحکنندهٔ حافظه، صرفنظر کرده و تمام حافظه را بازنویسیشده (clobbered) در نظر میگیرد.
- ipa-max-switch-predicate-bounds
- حداکثر تعداد نقاط پایانی مرزی دامنههای case در دستور switch. برای دستورهای switch که از این حد فراتر روند، IPA-CP محمول هزینهٔ شبیهسازی را (که برای تخمین سود شبیهسازی استفاده میشود) برای حالت default دستور switch ایجاد نخواهد کرد..IP ipa-max-param-expr-ops 4 بخش IPA-CP گزارههای شرطی را که به پارامترهای تابع ارجاع دارند تحلیل میکند تا مزیت شبیهسازی (cloning) بر اساس مقادیر ثابت مشخص را برآورد کند. اما اگر تعداد عملگرها در عبارت پارامتر از ipa-max-param-expr-ops فراتر رود، آن عبارت به عنوان یک عبارت پیچیده در نظر گرفته شده و توسط تحلیل IPA پردازش نمیشود.
- lto-partitions
- تعداد افرازهای (partitions) مطلوبِ تولیدشده حین کامپایل WHOPR را مشخص میکند. تعداد افرازها باید بیشتر از تعداد پردازندههای (CPU) بهکاررفته برای کامپایل باشد.
- lto-min-partition
- اندازهٔ کمینهٔ افراز برای WHOPR (بر حسب دستورالعملهای تخمینزدهشده). این کار از هزینههای ناشی از تقسیم برنامههای بسیار کوچک به افرازهای بیش از حد جلوگیری میکند.
- lto-max-partition
- اندازهٔ بیشینهٔ افراز برای WHOPR (بر حسب دستورالعملهای تخمینزدهشده) برای فراهم کردن یک حد بالا برای اندازهٔ هر افراز. این پارامتر فقط باید همراه با افرازبندی متوازن (balanced partitioning) استفاده شود.
- lto-partition-locality-frequency-cutoff
- مخرج n از کسر 1/n بسامد اجرای فراخواندهشده (callee) که باید برای یک فراخوانندهٔ (caller) خاص شبیهسازی شود. مقدار ویژهٔ 0 تعیین میکند که شبیهسازی همواره و بدون هیچ نقطهٔ برشی انجام شود.
- lto-partition-locality-size-cutoff
- حد اندازه برای فراخواندهشده شامل فراخوانیهای درونخطیشده (inlined) جهت شبیهسازی برای یک فراخوانندهٔ خاص.
- lto-max-locality-partition
- بیشینهٔ اندازهٔ یک افراز محلی برای LTO (بر حسب دستورالعملهای تخمینزدهشده). مقدار 0 باعث استفاده از مقدار پیشفرض میشود.
- lto-max-streaming-parallelism
- حداکثر تعداد فرایندهای موازیِ مورد استفاده برای جاریسازی (streaming) در LTO.
- cxx-max-namespaces-for-diagnostic-help
- حداکثر تعداد فضاهای نام (namespaces) برای بررسی جهت ارائهٔ پیشنهاد هنگامی که جستجوی نام C++ برای یک شناسه با شکست مواجه میشود.
- sink-frequency-threshold
- بیشینهٔ بسامد نسبی اجرای بلوک مقصد نسبت به بلوک اولیهٔ دستور (به درصد) برای مجاز شمردن پایینکِشی دستور (statement sinking). مقادیر بزرگتر منجر به پایینکشی تهاجمیتر دستورات میشود. یک تعدیل مثبت کوچک برای دستوراتی که عملوندهای حافظه دارند اعمال میشود، زیرا پایینکِشی آنها سودمندتر است.
- max-stores-to-sink
- حداکثر تعداد جفتهای ذخیرهسازی شرطی که میتوان آنها را پایین کشید. اگر هر یک از برداریسازی (-ftree-vectorize) یا تبدیل شرطی (-ftree-loop-if-convert) غیرفعال باشد، این مقدار روی 0 تنظیم میشود.
- case-values-threshold
- کمترین تعداد مقادیر متفاوتی که برای آنها استفاده از جدول پرش (jump-table) به جای درخت شاخههای شرطی ترجیح داده میشود. اگر مقدار 0 باشد، از پیشفرض معماری استفاده میشود.
- jump-table-max-growth-ratio-for-size
- حداکثر نسبت رشد اندازهٔ کد هنگام بسط دادن به یک جدول پرش (به درصد). این پارامتر هنگام بهینهسازی برای اندازه استفاده میشود.
- jump-table-max-growth-ratio-for-speed
- حداکثر نسبت رشد اندازهٔ کد هنگام بسط دادن به یک جدول پرش (به درصد). این پارامتر هنگام بهینهسازی برای سرعت استفاده میشود.
- tree-reassoc-width
- حداکثر تعداد دستورالعملهای اجراشده به صورت موازی در درخت بازهمبستهشده (reassociated tree) را تعیین میکند. این پارامتر در صورت داشتن مقدار غیر صفر، قواعد تجربی (heuristics) وابسته به معماری مقصد را که به طور پیشفرض استفاده میشوند بازنویسی میکند.
- sched-pressure-algorithm
- انتخاب بین
دو
پیادهسازی
موجود برای
-fsched-pressure.
الگوریتم ۱
پیادهسازی
اولیه است و
احتمال
بیشتری
دارد که از
بازآرایی
دستورالعملها
جلوگیری
کند.
الگوریتم ۲
به عنوان
سازشی بین
رویکرد
نسبتاً
محافظهکارانهٔ
الگوریتم ۱
و رویکرد
تقریباً
تهاجمی
زمانبند
پیشفرض
طراحی شده
است. این
الگوریتم
اتکای
بیشتری بر
داشتن
مجموعهثبات
منظم (regular register file) و
ردههای
دقیق فشار
ثبات دارد.
برای
جزئیات
بیشتر به
haifa-sched.cc در
سورسهای GCC
مراجعه
کنید.
انتخاب پیشفرض به معماری مقصد بستگی دارد.
- max-slsr-cand-scan
- حداکثر تعداد کاندیداهای موجود را که هنگام جستجوی پایه برای یک کاندیدای کاهش توان خط مستقیم (straight-line strength reduction) جدید در نظر گرفته میشوند تعیین میکند.
- asan-globals
- تشخیص سرریز بافر برای شیءهای سراسری (global) را فعال میکند. اگر از گزینهٔ -fsanitize=address استفاده کنید، این نوع محافظت به طور پیشفرض فعال است. برای غیرفعال کردن محافظت از شیءهای سراسری از --param asan-globals=0 استفاده کنید.
- asan-stack
- تشخیص سرریز بافر برای شیءهای پشته (stack) را فعال میکند. این نوع محافظت هنگام استفاده از -fsanitize=address به طور پیشفرض فعال است. برای غیرفعال کردن محافظت از پشته از گزینهٔ --param asan-stack=0 استفاده کنید.
- asan-instrument-reads
- تشخیص سرریز بافر را برای خواندنهای حافظه فعال میکند. این نوع محافظت هنگام استفاده از -fsanitize=address به طور پیشفرض فعال است. برای غیرفعال کردن محافظت از خواندنهای حافظه از --param asan-instrument-reads=0 استفاده کنید.
- asan-instrument-writes
- تشخیص سرریز بافر را برای نوشتنهای حافظه فعال میکند. این نوع محافظت هنگام استفاده از -fsanitize=address به طور پیشفرض فعال است. برای غیرفعال کردن محافظت از نوشتنهای حافظه از گزینهٔ --param asan-instrument-writes=0 استفاده کنید.
- asan-memintrin
- تشخیص خطا برای توابع توکار (built-in) را فعال میکند. این نوع محافظت هنگام استفاده از -fsanitize=address به طور پیشفرض فعال است. برای غیرفعال کردن محافظت از توابع توکار از --param asan-memintrin=0 استفاده کنید.
- asan-use-after-return
- تشخیص
استفاده پس
از بازگشت
(use-after-return) را فعال
میکند. این
نوع محافظت
هنگام
استفاده از
گزینهٔ -fsanitize=address
به طور
پیشفرض
فعال است.
برای
غیرفعال
کردن آن از
--param asan-use-after-return=0
استفاده
کنید.
نکته: این بررسی به طور پیشفرض در زمان اجرا غیرفعال است. برای فعالسازی آن، عبارت "detect_stack_use_after_return=1" را به متغیر محیطی ASAN_OPTIONS اضافه کنید.
- asan-instrumentation-with-call-threshold
- اگر تعداد دسترسیها به حافظه در تابعی که ابزارگذاری میشود بزرگتر یا مساوی این عدد باشد، به جای بررسیهای درونخطی از فراخوانیهای بازگشتی (callbacks) استفاده میکند. به عنوان مثال، برای غیرفعال کردن کد درونخطی از --param asan-instrumentation-with-call-threshold=0 استفاده کنید.
- asan-kernel-mem-intrinsic-prefix
- اگر غیر صفر باشد، به ترتیب برای -fsanitize=kernel-address یا -fsanitize=kernel-hwaddress پیشوند فراخوانیهای "memcpy"، "memset" و "memmove" را با __asan_ یا __hwasan_ قرار میدهد.
- hwasan-instrument-stack
- ابزارگذاری hwasan برای متغیرهای تخصیصیافته در پشته با اندازهٔ ایستا را فعال میکند. این نوع ابزارگذاری به طور پیشفرض هنگام استفاده از -fsanitize=hwaddress فعال بوده و هنگام استفاده از -fsanitize=kernel-hwaddress به طور پیشفرض غیرفعال است. برای غیرفعال کردن ابزارگذاری پشته از --param hwasan-instrument-stack=0 و برای فعالسازی آن از --param hwasan-instrument-stack=1 استفاده کنید.
- hwasan-random-frame-tag
- هنگام استفاده از ابزارگذاری پشته، برچسبهای متغیرهای پشته را با استفاده از یک دنبالهٔ قطعی که از یک برچسب تصادفی برای هر فریم شروع میشود تعیین میکند. با تنظیم نبودن این پارامتر، برچسبها با استفاده از همان دنباله اما با شروع از 1 انتخاب میشوند. این ویژگی به طور پیشفرض برای -fsanitize=hwaddress فعال بوده و برای -fsanitize=kernel-hwaddress در دسترس نیست. برای غیرفعال کردن آن از --param hwasan-random-frame-tag=0 استفاده کنید.
- hwasan-instrument-allocas
- ابزارگذاری hwasan برای متغیرهای تخصیصیافته در پشته با اندازهٔ پویا را فعال میکند. این نوع ابزارگذاری به طور پیشفرض هنگام استفاده از -fsanitize=hwaddress فعال و هنگام استفاده از -fsanitize=kernel-hwaddress غیرفعال است. برای غیرفعال کردن ابزارگذاری این قبیل متغیرها از --param hwasan-instrument-allocas=0 و برای فعالسازی آن از --param hwasan-instrument-allocas=1 استفاده کنید.
- hwasan-instrument-reads
- بررسیهای hwasan روی خواندنهای حافظه را فعال میکند. ابزارگذاری خواندنها به طور پیشفرض هم برای -fsanitize=hwaddress و هم برای -fsanitize=kernel-hwaddress فعال است. برای غیرفعال کردن بررسی خواندنهای حافظه از --param hwasan-instrument-reads=0 استفاده کنید.
- hwasan-instrument-writes
- بررسیهای hwasan روی نوشتنهای حافظه را فعال میکند. ابزارگذاری نوشتنها به طور پیشفرض هم برای -fsanitize=hwaddress و هم برای -fsanitize=kernel-hwaddress فعال است. برای غیرفعال کردن بررسی نوشتنهای حافظه از --param hwasan-instrument-writes=0 استفاده کنید.
- hwasan-instrument-mem-intrinsics
- ابزارگذاری hwasan برای توابع توکار را فعال میکند. ابزارگذاری این توابع توکار به طور پیشفرض هم برای -fsanitize=hwaddress و هم برای -fsanitize=kernel-hwaddress فعال است. برای غیرفعال کردن ابزارگذاری توابع توکار از --param hwasan-instrument-mem-intrinsics=0 استفاده کنید..IP use-after-scope-direct-emission-threshold 4 اگر اندازهٔ یک متغیر محلی بر حسب بایت کوچکتر یا مساوی این عدد باشد، بهجای استفاده از فراخوانیهای بازگشتی زمان اجرا (run-time callbacks)، حافظهٔ سایه (shadow memory) مستقیماً مسموم (یا رفع مسمومیت) میشود.
- tsan-distinguish-volatile
- تولید کد سنجش (instrumentation) ویژه برای دسترسیها به متغیرهای فرار (volatile).
- tsan-instrument-func-entry-exit
- تولید فراخوانیهای سنجش به __tsan_func_entry() و __tsan_func_exit().
- max-fsm-thread-path-insns
- حداکثر تعداد دستورالعملها برای رونوشتبرداری هنگام تکثیر بلوکها در مسیر ریسهٔ پرش (jump thread) ماشین حالت متناهی.
- threader-debug
- threader-debug=[none|all] خروجی پرجزئیاتِ (verbose) حلکنندهٔ 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
- حداکثر عمق بازگشت هنگام پرسوجوی ویژگیهای نامهای SSA در مواردی مانند روالهای fold. یک سطح از بازگشت متناظر با دنبال کردن یک زنجیرهٔ use-def است.
- max-speculative-devirt-maydefs
- حداکثر تعداد may-defهایی که هنگام جستجو برای یک must-def تحلیل میشوند؛ این must-def نوع پویای شیئی را تعیین میکند که فراخوانی مجازیای را برمیانگیزد که ممکن است بتوانیم آن را بهطور حدسی غیرمجازی (devirtualize) کنیم.
- ranger-debug
- نوع خروجی اشکالزدایی صادر شده برای محدودهها (ranges) را مشخص میکند.
- unroll-jam-min-percent
- حداقل درصد ارجاعات به حافظه که باید در بهینهسازی حذف شوند تا تبدیل unroll-and-jam سودمند در نظر گرفته شود.
- unroll-jam-max-unroll
- حداکثر دفعاتی که حلقهٔ بیرونی باید توسط تبدیل unroll-and-jam باز شود (unroll شود).
- max-rtl-if-conversion-unpredictable-cost
- حداکثر هزینهٔ مجاز برای توالیای که توسط گذر if-conversion در سطح RTL برای یک انشعاب غیرقابلپیشبینی تولید میشود.
- max-variable-expansions-in-unroller
- در صورت استفاده از -fvariable-expansion-in-unroller، حداکثر دفعاتی که یک متغیر منفرد در حین باز کردن حلقه (loop unrolling) گسترش مییابد.
- partial-inlining-entry-probability
- حداکثر احتمال بلوک پایهٔ (BB) ورودیِ ناحیهٔ تقسیمشده (بر حسب درصد نسبت به BB ورودی تابع) برای وقوع دروننشانی جزئی (partial inlining).
- max-tracked-strlens
- حداکثر تعداد رشتههایی که گذر بهینهسازی strlen طول آنها را ردیابی خواهد کرد.
- gcse-after-reload-partial-fraction
- نسبت آستانه برای انجام حذف افزونگی جزئی (partial redundancy elimination) پس از مرحلهٔ reload.
- gcse-after-reload-critical-fraction
- نسبت آستانهٔ تعداد دفعات اجرای یالهای بحرانی که اجازهٔ انجام حذف افزونگی پس از مرحلهٔ reload را میدهد.
- max-loop-header-insns
- حداکثر تعداد دستورالعملها (insns) در سرآیند حلقه که توسط گذر کپی سرآیندهای حلقه (copy loop headers) تکثیر میشوند.
- vect-epilogues-nomask
- فعالسازی برداریسازی پسگفتار حلقه (loop epilogue) با استفاده از اندازهٔ بردار کوچکتر.
- vect-partial-vector-usage
- کنترل میکند که بردارساز حلقه چه زمانی بارگذاریها و ذخیرهسازیهای برداری جزئی را بهعنوان جایگزینی برای بازگشت به کد اسکالر در نظر بگیرد. مقدار 0 بردارساز را از استفاده از بارگذاریها و ذخیرهسازیهای برداری جزئی بازمیدارد. مقدار 1 در صورتی بارگذاریها و ذخیرهسازیهای برداری جزئی را مجاز میکند که برداریسازی نیاز به تکرار کد را برطرف کند. مقدار 2 بارگذاریها و ذخیرهسازیهای برداری جزئی را در همهٔ حلقهها مجاز میکند. این پارامتر فقط روی مقصدهایی تأثیر دارد که از بارگذاریها و ذخیرهسازیهای برداری جزئی پشتیبانی کنند.
- vect-inner-loop-cost-factor
- حداکثر ضریبی که بردارساز حلقه بر هزینهٔ دستورها در یک حلقهٔ درونی نسبت به حلقهٔ در حال برداریسازی اعمال میکند. ضریب اعمالشده برابر است با بیشینهٔ تعداد تخمینی تکرارهای حلقهٔ درونی و مقدار این پارامتر. مقدار پیشفرض این پارامتر 50 است.
- vect-induction-float
- فعالسازی برداریسازی حلقه برای متغیرهای القایی ممیز شناور (floating point inductions).
- vect-force-slp
- اجبار به استفاده از SLP هنگام برداریسازی، و شکست در صورت عدم امکان.
- vrp-block-limit
- حداکثر تعداد بلوکهای پایه پیش از اینکه VRP به الگوریتمی با مصرف حافظهٔ کمتر تغییر جهت دهد.
- vrp-sparse-threshold
- حداکثر تعداد بلوکهای پایه پیش از آنکه VRP از یک حافظهٔ پنهان نگاشتبیتی پراکنده (sparse bitmap cache) استفاده کند.
- vrp-switch-limit
- حداکثر تعداد یالهای خروجی در یک switch پیش از آنکه VRP از پردازش آن صرفنظر کند.
- vrp-vector-threshold
- حداکثر تعداد بلوکهای پایه برای اینکه VRP از یک بردار حافظهٔ پنهان پایه استفاده کند.
- avoid-fma-max-bits
- حداکثر تعداد بیتهایی که برای آنها از ایجاد FMAها اجتناب میشود.
- fully-pipelined-fma
- مشخص میکند که آیا مقصد بهطور کامل دستورالعملهای FMA را خطلولهای (pipeline) میکند یا خیر. اگر غیرصفر باشد، بازپیوندزدایی (reassociation) با فرض اینکه FMUL و FMA از همان واحدهایی استفاده میکنند که میتوانند FADD را نیز انجام دهند، مزیت موازیسازی بخشهای ضرب و جمع FMA را در نظر میگیرد.
- sms-loop-average-count-threshold
- آستانهای بر میانگین شمارش حلقه که توسط زمانبند پیمانهای نوسانی (swing modulo scheduler) در نظر گرفته میشود.
- sms-dfa-history
- تعداد چرخههایی که زمانبند پیمانهای نوسانی هنگام بررسی تداخلها با استفاده از DFA در نظر میگیرد.
- graphite-allow-codegen-errors
- مشخص میکند که آیا خطاهای codegen هنگام استفاده از -fchecking باید ICE (خطای داخلی کامپایلر) تلقی شوند یا خیر.
- sms-max-ii-factor
- ضریبی برای تنظیم کران بالایی که زمانبند پیمانهای نوسانی برای زمانبندی یک حلقه استفاده میکند.
- lra-max-considered-reload-pseudos
- حداکثر تعداد شبهرجیسترهای reload که هنگام بیرونریزی (spilling) یک شبهرجیستر غیر reload در نظر گرفته میشوند.
- max-pow-sqrt-depth
- حداکثر عمق زنجیرههای sqrt مورد استفاده هنگام ترکیب توانرسانی با یک ثابت حقیقی.
- max-dse-active-local-stores
- حداکثر تعداد ذخیرهسازیهای محلی فعال در حذف ذخیرهسازی مرده (dead store elimination) در سطح RTL.
- asan-instrument-allocas
- فعالسازی حفاظت 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) که باید برای آن عملیاتهای معکوس (reverse ops) اضافه شوند.
- fsm-scale-path-stmts
- ضریب مقیاسی که باید بر تعداد دستورهای موجود در یک مسیر ریسهبندی (threading path) که از یک یال بازگشتی حلقه (loop backedge) عبور میکند، هنگام مقایسه با --param=max-jump-thread-duplication-stmts اعمال شود.
- uninit-control-dep-attempts
- حداکثر تعداد فراخوانیهای تودرتو برای جستجوی وابستگیهای کنترلی در حین تحلیل متغیرهای مقداردهینشده.
- uninit-max-chain-len
- حداکثر تعداد گزارههای AND شده بهازای هر گزارهٔ OR شده در زنجیرهٔ نرمالشدهٔ گزارهها.
- uninit-max-num-chains
- حداکثر تعداد گزارههای OR شده در زنجیرهٔ نرمالشدهٔ گزارهها..IP uninit-max-prune-work 4 حداکثر میزان کاری که برای هرس کردن مسیرهایی که در آنها متغیر همواره مقداردهی اولیه شده است، انجام میشود.
- sched-autopref-queue-depth
- پرچم کنترلی مدل زمانبند autoprefetcher سختافزاری. تعداد چرخههای پیشنگری که مدل بررسی میکند؛ در ' ' تنها روش اکتشافی مرتبسازی دستورالعملها فعال میشود.
- loop-versioning-max-inner-insns
- حداکثر تعداد دستورالعملهایی که یک حلقهٔ درونی میتواند داشته باشد، پیش از آنکه گذر نسخهبندی حلقه (loop versioning pass) آن را برای رونوشتبرداری بیش از حد بزرگ در نظر بگیرد.
- 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
- حداکثر تعداد VALUEهایی که در طول یک فراخوانی 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
- حداکثر عمق یک مقدار نمادین (symbolic value)، پیش از تقریب زدن مقدار به عنوان ناشناخته.
- 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
- تعداد بایتهایی که در آن رشتههای لفظی (string literals) در نمودارهای هنر متنی تحلیلگر خلاصهسازی میشوند.
- 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
- حداکثر تعداد رابطههایی که پیشگو (oracle) در یک بلوک پایه ثبت میکند.
- 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 باید فرض کند که توصیف زمانبندی، در نبود خطاهای حافظهٔ نهان، اساساً یک مدل چرخهدقیق از پردازندهٔ مقصد است که کد برای اجرا روی آن در نظر گرفته شده است یا خیر. مقدار غیرصفر به این معنی است که مدل زمانبندی انتخابشده دقیق است و احتمالاً یک پردازندهٔ ترتیبی (in-order) را توصیف میکند، و زمانبندی باید با تهاجم به سرریز ثباتها بپردازد تا هرگونه حباب خط لوله را پر کند. این مقدار پیشفرض فعلی است. مقدار صفر به این معنی است که توصیف زمانبندی ممکن است در دسترس یا دقیق نباشد یا شاید اصلاً قابل اعمال نباشد، نظیر پردازندههای مدرن غیرترتیبی (out-of-order).
گزینههای زیر برای name در مقصدهای AArch64 در دسترس هستند:
- aarch64-vect-compare-costs
- هنگام برداریسازی، استفاده از چندین رویکرد مختلف را مد نظر قرار داده و از مدل هزینه برای انتخاب ارزانترین آنها استفاده میکند. این شامل موارد زیر است:
- آزمودن هر دو مورد SVE و Advanced SIMD، در صورت در دسترس بودن SVE.
- تلاش برای استفاده از بردارهای ۶۴-بیتی Advanced SIMD برای کوچکترین عناصر داده، به جای استفاده از بردارهای ۱۲۸-بیتی برای همه چیز.
- تلاش برای استفاده از بردارهای SVE «بازشده» (unpacked) برای عناصر کوچکتر. این شامل ذخیرهٔ عناصر کوچکتر در محفظههای بزرگتر و دسترسی به عناصر با بارگذاریهای گسترشدهنده و ذخیرهسازیهای کوتاهکننده است.
- aarch64-float-recp-precision
- تعداد تکرارهای نیوتن برای محاسبهٔ معکوس ضربی برای نوع float. دقت تقسیم هنگامی که تقریب تقسیم فعال باشد، با این پارامتر متناسب است. مقدار پیشفرض 1 است.
- aarch64-double-recp-precision
- تعداد تکرارهای نیوتن برای محاسبهٔ معکوس ضربی برای نوع double. دقت تقسیم هنگامی که تقریب تقسیم فعال باشد، با این پارامتر متناسب است. مقدار پیشفرض 2 است.
- aarch64-autovec-preference
- اجبار یک راهبرد انتخاب ISA برای برداریسازی خودکار.
- default
- استفاده از روشهای اکتشافی پیشفرض.
- asimd-only
- تنها استفاده از Advanced SIMD برای برداریسازی خودکار.
- sve-only
- تنها استفاده از SVE برای برداریسازی خودکار.
- prefer-asimd
- استفاده از هر دو مورد Advanced SIMD و SVE. ترجیح دادن Advanced SIMD هنگامی که هزینهها برابر در نظر گرفته شوند..IP prefer-sve 4 از هر دو Advanced SIMD و SVE استفاده میکند. هنگامی که هزینهها برابر در نظر گرفته شوند، SVE را ترجیح میدهد.
- aarch64-ldp-policy
- سیاست دقیق برای جفتهای بارگذاری (load pairs). با --param=aarch64-ldp-policy=default، از سیاست ساختار تنظیم (tuning structure) استفاده میکند. این مقدار پیشفرض فعلی است. با --param=aarch64-ldp-policy=always، صرفنظر از تراز بودن (alignment)، دستور ldp را صادر میکند. با --param=aarch64-ldp-policy=never، دستور ldp را صادر نمیکند. با --param=aarch64-ldp-policy=aligned، تنها در صورتی ldp صادر میشود که اشارهگر مبدأ حداقل به اندازهٔ دو برابر تراز نوع تراز شده باشد.
- aarch64-stp-policy
- سیاست دقیق برای جفتهای ذخیرهسازی (store pairs). با --param=aarch64-stp-policy=default، از سیاست ساختار تنظیم استفاده میکند. این مقدار پیشفرض فعلی است. با --param=aarch64-stp-policy=always، صرفنظر از تراز بودن، دستور stp را صادر میکند. با --param=aarch64-stp-policy=never، دستور stp را صادر نمیکند. با --param=aarch64-stp-policy=aligned، تنها در صورتی stp صادر میشود که اشارهگر مبدأ حداقل به اندازهٔ دو برابر تراز نوع تراز شده باشد.
- aarch64-ldp-alias-check-limit
- محدودیت تعداد بررسیهای نام مستعار (alias checks) که توسط گذر ادغام جفتهای load/store در AArch64 هنگام تلاش برای تشکیل یک ldp/stp انجام میشود. مقادیر بالاتر باعث تهاجمیتر شدن این گذر در مرتبسازی مجدد بارگذاریها روی ذخیرهسازیها میشود، به بهای افزایش زمان کامپایل.
- aarch64-ldp-writeback
- پارامتری برای کنترل اینکه در گذر ادغام جفتهای load/store در AArch64 کدام فرصتهای بازنویسی (writeback) مدیریت شوند. مقدار صفر، مدیریت writeback را غیرفعال میکند. مقدار یک به این معنی است که در صورت امکان، برای تشکیل جفتهایی شامل یک یا چند دسترسی بازنویسی مجزای موجود تلاش میشود. مقدار دو به این معنی است که علاوه بر آن، با تا کردن (folding) بهروزرسانیهای مخرب پایانی ثبات پایه (base register) مورد استفاده توسط یک جفت، برای تشکیل فرصتهای بازنویسی بهصورت فرصتطلبانه تلاش میشود.
- aarch64-loop-vect-issue-rate-niters
- تنظیمات مربوط به برخی پردازندههای AArch64 هنگام تصمیمگیری در مورد اینکه آیا یک حلقه باید با استفاده از SVE برداریسازی شود، با Advanced SIMD برداریسازی شود، یا اصلاً برداری نشود، هم تأخیرها (latencies) و هم نرخهای صدور (issue rates) را در نظر میگیرد. اگر این پارامتر روی n تنظیم شود، GCC برای حلقههایی که مشخص است در کمتر از n تکرار Advanced SIMD اجرا میشوند، از این روش ابتکاری (heuristic) استفاده نخواهد کرد.
- aarch64-vect-unroll-limit
- بخش برداریساز (vectorizer) از اطلاعات تنظیمات موجود برای تعیین اینکه آیا باز کردن (unroll) حلقهٔ برداریشدهٔ اصلی سودمند است و تا چه اندازه، استفاده میکند. این پارامتر کران بالای میزان باز کردن حلقهٔ اصلی توسط برداریساز را تعیین میکند. مقدار پیشفرض چهار است.
انتخابهای زیر برای name روی مقصدهای GCN در دسترس هستند:
- gcn-preferred-vectorization-factor
- ضریب برداریسازی ترجیحی: default، 32، 64.
انتخابهای زیر برای name روی مقصدهای i386 و x86_64 در دسترس هستند:
- x86-stlf-window-ninsns
- تعداد دستورالعملهایی که بالاتر از آن، جریمهٔ توقف (stall) STLF میتواند جبران شود.
- x86-stv-max-visits
- حداکثر تعداد بازدیدهای use و def هنگام کشف یک زنجیرهٔ STV پیش از متوقف شدن فرایند کشف.
گزینههای ابزارگذاری برنامه (Program Instrumentation Options)
کامپایلر GCC از چندین گزینهٔ خط فرمان پشتیبانی میکند که افزودن ابزارگذاری زمان اجرا (run-time instrumentation) را به کدی که معمولاً تولید میکند، کنترل مینمایند. به عنوان مثال، یک هدف از ابزارگذاری، جمعآوری آمار پروفایلسازی برای استفاده در یافتن نقاط داغ برنامه (hot spots)، تحلیل پوشش کد یا بهینهسازیهای هدایتشده با پروفایل است. دستهٔ دیگر ابزارگذاری برنامه، افزودن بررسیهای زمان اجرا برای شناسایی خطاهای برنامهنویسی مانند ارجاعگشاییهای نامعتبر اشارهگر یا دسترسیهای خارج از محدودهٔ آرایهها، و همچنین حملات عمدی و خصمانه مانند درهمشکستن پشته (stack smashing) یا ربودن جدول مجازی C++ (C++ vtable hijacking) است. همچنین یک قلاب (hook) عمومی وجود دارد که میتواند برای پیادهسازی سایر اشکال ردیابی یا ابزارگذاری در سطح توابع برای اهداف اشکالزدایی یا تحلیل برنامه استفاده شود.
- -p
- -pg
- تولید کد
اضافی برای
نوشتن
اطلاعات
پروفایلسازی
مناسب برای
برنامهٔ
تحلیلی prof
(برای -p) یا gprof
(برای -pg).
هنگام
کامپایل
فایلهای
مبدایی که
اطلاعات
آنها را
میخواهید
باید از این
گزینه
استفاده
کنید، و
همچنین
باید در
زمان پیوند
دادن (linking) نیز
از آن
استفاده
نمایید.
میتوانید از مشخصهٔ تابع "no_instrument_function" برای جلوگیری از پروفایلسازی توابع خاص هنگام کامپایل با این گزینهها استفاده کنید.
- -fprofile-arcs
- افزودن کد
به طوری که
کمانها (arcs)
در جریان
برنامه
ابزارگذاری
شوند. در
طول اجرا،
برنامه ثبت
میکند که
هر انشعاب و
فراخوانی
چند بار
اجرا شده و
چند بار طی
شده یا
بازگشته
است. در
مقصدهایی
که از
سازندهها
با
پشتیبانی
از اولویت
پشتیبانی
میکنند،
پروفایلسازی
بهدرستی
سازندهها،
مخربها، و
سازندهها
(و
مخربهای) C++
کلاسهایی
را که به
عنوان نوع
یک متغیر
سراسری
استفاده
میشوند،
مدیریت
میکند.
هنگامی که برنامهٔ کامپایلشده خارج میشود، این دادهها را برای هر فایل مبدأ در فایلی به نام auxname.gcda ذخیره میکند. این دادهها ممکن است برای بهینهسازیهای هدایتشده با پروفایل (-fbranch-probabilities) یا برای تحلیل پوشش آزمون (-ftest-coverage) استفاده شوند. نام auxname هر فایل شیء، در صورتی که صریحاً مشخص شده باشد و فایل اجرایی نهایی نباشد، از نام فایل خروجی تولید میشود؛ در غیر این صورت، نام پایهٔ فایل مبدأ است. در هر دو حالت، هرگونه پسوند حذف میشود (مثلاً foo.gcda برای فایل ورودی dir/foo.c، یا dir/foo.gcda برای فایل خروجی مشخصشده به صورت -o dir/foo.o).
توجه داشته باشید که اگر یک خط فرمان مستقیماً فایلهای مبدأ را پیوند دهد، نام فایلهای .gcda متناظر با پیشوند نام بدون پسوند فایل خروجی نامگذاری خواهند شد. مثلاً "gcc a.c b.c -o binary" فایلهای binary-a.gcda و binary-b.gcda را تولید میکند.
- -fcondition-coverage
- افزودن کد به طوری که شرایط برنامه ابزارگذاری شوند. در طول اجرا، برنامه ثبت میکند که کدام عبارتها در یک عبارت شرطی در یک تصمیمگیری سهیم هستند؛ این امر میتواند برای تأیید این موضوع به کار رود که آیا همهٔ عبارتها در یک تابع بولی آزمایش شدهاند و تأثیر مستقلی بر نتیجهٔ تصمیم دارند یا خیر. نتیجه را میتوان با "gcov --conditions" خواند.
- -fpath-coverage
- افزودن کد به طوری که مسیرهای پیمودهشده ردگیری شوند. در طول اجرا، برنامه مسیرهای اول (prime paths) پیمودهشده را ثبت میکند. تعداد مسیرها با افزایش پیچیدگی بسیار سریع رشد میکند، و برای جلوگیری از انفجار زمان کامپایل، اگر تعداد تقریبی مسیرها از حد کنترلشده توسط -fpath-coverage-limit فراتر رود، GCC از ابزارگذاری صرفنظر خواهد کرد. نتیجه را میتوان با "gcov --prime-paths --prime-paths-lines --prime-paths-source" خواند.
- -fpath-coverage-limit=limit
- آستانهای که در آن نقطه -fpath-coverage از ابزارگذاری یک تابع صرفنظر میکند. این حد تقریبی و محافظهکارانه است، زیرا GCC از یک روش ابتکاری بدبینانه استفاده میکند که تعداد مسیرهای در حال پردازش را کمی بیشتر برآورد میکند، و اگر پیش از یافتن همهٔ مسیرها به این آستانه برسد، کار را رها میکند. این گزینه برای کنترل دقیق روی اینکه کدام توابع ابزارگذاری شوند نیست - بلکه هدف آن محدود کردن اثر انفجار مسیرها و نگهداشتن زمان کامپایل در حد معقول است. مقدار پیشفرض 250000 است.
- --coverage
- این گزینه برای کامپایل و پیوند دادن کدهای ابزارگذاریشده جهت تحلیل پوشش استفاده میشود. این گزینه مترادفی برای -fprofile-arcs -ftest-coverage (هنگام کامپایل) و -lgcov (هنگام پیوند دادن) است. برای جزئیات بیشتر به مستندات آن گزینهها مراجعه کنید.
- فایلهای مبدأ را با -fprofile-arcs به همراه گزینههای بهینهسازی و تولید کد کامپایل کنید. برای تحلیل پوشش آزمون، از گزینهٔ اضافی -ftest-coverage استفاده نمایید. نیازی نیست همهٔ فایلهای مبدأ در یک برنامه پروفایلسازی شوند.
- فایلهای مبدأ را علاوه بر این با -fprofile-abs-path کامپایل کنید تا نام مسیرهای مطلق در فایلهای .gcno ایجاد شوند. این کار به gcov اجازه میدهد در پروژههایی که کامپایل با دایرکتوریهای کاری متفاوتی انجام میشود، مبداهای درست را پیدا کند.
- فایلهای شیء خود را با -lgcov یا -fprofile-arcs پیوند دهید (مورد دوم مستلزم مورد اول است).
- برنامه را
روی یک بار
کاری نمونه
(representative workload) اجرا
کنید تا
اطلاعات
پروفایل
کمانها
تولید شود.
این عمل را
میتوان به
هر تعداد
بار تکرار
کرد.
میتوانید
نمونههای
همروند از
برنامهٔ
خود را اجرا
کنید و
مشروط بر
اینکه
سیستم فایل
از
قفلگذاری
پشتیبانی
کند،
فایلهای
داده
بهدرستی
بهروزرسانی
خواهند شد.
مگر اینکه
یک گزینهٔ
گویش اکید ISO C
فعال باشد،
فراخوانیهای
"fork"
تشخیص داده
شده و بدون
شمارش
مضاعف،
بهدرستی
مدیریت
میشوند.
علاوه بر این، یک فایل شیء میتواند چندین بار بازکامپایل شود و فایل .gcda متناظر با آن تا زمانی که فایل مبدأ و گزینههای کامپایلر بدون تغییر باقی بمانند، ادغام میشود..IP * 4 برای بهینهسازیهای مبتنی بر پروفایل، فایلهای منبع را دوباره با همان گزینههای بهینهسازی و تولید کد، به همراه -fbranch-probabilities کامپایل کنید.
- برای تحلیل پوشش آزمون، از gcov جهت تولید اطلاعات خوانا برای انسان از فایلهای .gcno و .gcda استفاده کنید. برای اطلاعات بیشتر به مستندات gcov مراجعه کنید.
با گزینه -fprofile-arcs، برای هر تابع از برنامه شما، GCC یک گراف جریان برنامه ایجاد میکند و سپس درخت پوشای آن گراف را مییابد. فقط یالهایی که روی درخت پوشا نیستند باید ابزارگذاری شوند: کامپایلر کدی برای شمارش دفعات اجرای این یالها اضافه میکند. هنگامی که یک یال تنها خروجی یا تنها ورودی یک بلوک باشد، کد ابزارگذاری میتواند به همان بلوک افزوده شود؛ در غیر این صورت، برای نگهداری کد ابزارگذاری باید یک بلوک پایه جدید ایجاد شود.
با گزینه -fcondition-coverage، برای هر عبارت شرطی در برنامه شما، کامپایلر GCC یک بیتست ایجاد کرده و مقادیر بولیِ آزمودهشدهای را که تأثیر مستقلی بر نتیجه آن عبارت دارند ثبت میکند.
با گزینه -fpath-coverage، کامپایلر GCC مسیرهای اول (prime paths) پیمودهشده در هر تابع را یافته، شمارش و ثبت میکند، مگر اینکه تعداد مسیرها از حد کنترلشده توسط -fpath-coverage-limit فراتر رود. اگر از این حد فراتر رود، تابع به گونهای که انگار -fpath-coverage استفاده نشده است، ابزارگذاری نخواهد شد. یک مسیر اول، طولانیترین دنباله از بلوکهای یکتا (بهجز احتمالاً اولی و آخری) است که زیرمسیر هیچ مسیر دیگری نباشد.
- -ftest-coverage
- یک فایل یادداشت تولید میکند که ابزار پوشش کد gcov میتواند از آن برای نمایش پوشش برنامه استفاده کند. فایل یادداشت هر فایل منبع auxname.gcno نامیده میشود. برای توضیحات در مورد auxname و دستورالعملهای نحوه تولید دادههای پوشش آزمون، به گزینه -fprofile-arcs در بالا مراجعه کنید. اگر کد را بهینهسازی نکنید، دادههای پوشش تطابق دقیقتری با فایلهای منبع خواهند داشت.
- -fprofile-abs-path
- بهطور خودکار نامهای نسبی فایلهای منبع را در فایلهای .gcno به مسیرهای مطلق تبدیل میکند. این به gcov اجازه میدهد تا در پروژههایی که کامپایل با دایرکتوریهای کاری متفاوتی انجام میشود، فایلهای منبع درست را پیدا کند.
- -fprofile-dir=path
- دایرکتوری
جستجو برای
فایلهای
دادههای
پروفایل را
روی path
تنظیم
میکند. این
گزینه فقط
بر
دادههای
پروفایل
تولیدشده
توسط -fprofile-generate،
-ftest-coverage، -fprofile-arcs و
استفادهشده
توسط -fprofile-use و
-fbranch-probabilities و
گزینههای
مرتبط با آن
تأثیر
میگذارد.
هر دو مسیر
مطلق و نسبی
قابل
استفاده
هستند.
بهطور
پیشفرض، GCC
از
دایرکتوری
جاری به
عنوان path
استفاده
میکند،
بنابراین
فایل
دادههای
پروفایل در
همان
دایرکتوری
فایل شیء (object file)
قرار
میگیرد. به
منظور
جلوگیری از
تداخل نام
فایلها،
اگر نام
فایل شیء یک
مسیر مطلق
نباشد،
مسیر مطلق
فایل sourcename.gcda
درهمریزی
(mangle) شده و به
عنوان نام
فایل یک .gcda
استفاده
میشود.
جزئیات
مربوط به
نامگذاری
فایل را در
-fprofile-arcs ببینید.
گزینه
مشابه -fprofile-note
را نیز
ببینید.
هنگامی که یک فایل اجرایی در یک محیط بسیار موازی اجرا میشود، توصیه میشود که پروفایل در پوشههای متفاوتی ذخیره شود. این کار را میتوان با متغیرهایی در path که در زمان اجرا صادر (export) میشوند انجام داد:
- %p
- شناسه فرایند (process ID).
- %q{VAR}
- مقدار متغیر محیطی VAR
- -fprofile-generate
- -fprofile-generate=path
- گزینههایی
را فعال
میکند که
معمولاً
برای
ابزارگذاری
برنامه
بهمنظور
تولید
پروفایلِ
مفید جهت
کامپایل
مجدد بعدی
با
بهینهسازی
مبتنی بر
بازخورد
پروفایل
استفاده
میشوند.
شما باید از
-fprofile-generate هم
هنگام
کامپایل و
هم هنگام
پیوندزدن (linking)
برنامه خود
استفاده
کنید.
گزینههای زیر فعال میشوند: -fprofile-arcs، -fprofile-values، -finline-functions و -fipa-bit-cp.
اگر path مشخص شده باشد، GCC برای یافتن فایلهای داده بازخورد پروفایل، به path نگاه میکند. به -fprofile-dir مراجعه کنید.
برای بهینهسازی برنامه بر اساس اطلاعات پروفایل جمعآوریشده، از -fprofile-use استفاده کنید.
- -fprofile-info-section
- -fprofile-info-section=name
- اطلاعات
پروفایل را
به جای
استفاده از
یک
سازنده/ویرانگر
(constructor/destructor) در بخش
(section) مشخصشده
ثبت میکند.
نام بخش در
صورت مشخص
شدن name است،
در غیر این
صورت نام
بخش بهطور
پیشفرض به
".gcov_info"
درمیآید.
یک
اشارهگر
به اطلاعات
پروفایل
تولیدشده
توسط -fprofile-arcs در
بخش
مشخصشده
برای هر
واحد ترجمه
(translation unit) قرار
میگیرد.
این گزینه
ثبت
اطلاعات
پروفایل از
طریق
سازنده و
پردازش
اطلاعات
پروفایل از
طریق
ویرانگر را
غیرفعال
میکند. این
گزینه برای
استفاده در
محیطهای
میزبانیشده
(hosted) مانند GNU/Linux
در نظر
گرفته نشده
است. هدف آن
محیطهای
مستقل (freestanding
مانند
سیستمهای
نهفته) با
منابع
محدود است
که از
سازندهها/ویرانگرها
یا
ورودی/خروجی
فایل در
کتابخانه C
پشتیبانی
نمیکنند.
پیونددهنده (linker) میتواند بخشهای ورودی را در یک بلوک حافظه پیوسته جمعآوری کرده و نمادهای آغاز و پایان را تعریف کند. یک نمونه اسکریپت پیونددهنده گنو (GNU linker script) که یک بخش خروجی پیونددهنده را تعریف میکند در زیر آمده است:
.gcov_info : { PROVIDE (__gcov_info_start = .); KEEP (*(.gcov_info)) PROVIDE (__gcov_info_end = .); }برنامه میتواند اطلاعات پروفایل ثبتشده در این مجموعه پیونددهنده را برای نمونه به این صورت تخلیه (dump) کند:
#include <gcov.h> #include <stdio.h> #include <stdlib.h> extern const struct gcov_info *const __gcov_info_start[]; extern const struct gcov_info *const __gcov_info_end[]; static void dump (const void *d, unsigned n, void *arg) { const unsigned char *c = d; for (unsigned i = 0; i < n; ++i) printf ("%02x", c[i]); } static void filename (const char *f, void *arg) { __gcov_filename_to_gcfn (f, dump, arg ); } static void * allocate (unsigned length, void *arg) { return malloc (length); } static void dump_gcov_info (void) { const struct gcov_info *const *info = __gcov_info_start; const struct gcov_info *const *end = __gcov_info_end; /* Obfuscate variable to prevent compiler optimizations. */ __asm__ ("" : "+r" (info)); while (info != end) { void *arg = NULL; __gcov_info_to_gcda (*info, filename, dump, allocate, arg); putchar ('\n'); ++info; } } int main (void) { dump_gcov_info (); return 0; }زیرفرمان merge-stream از gcov-tool ممکن است برای واسازی (deserialize) جریان داده تولیدشده توسط توابع "__gcov_filename_to_gcfn" و "__gcov_info_to_gcda" و ادغام اطلاعات پروفایل در فایلهای .gcda روی سیستم فایل میزبان استفاده شود..IP -fprofile-note=path 4 اگر path مشخص شده باشد، GCC فایل .gcno را در مکان path ذخیره میکند. اگر این گزینه را با چندین فایل مبدأ ترکیب کنید، فایل .gcno رونویسی خواهد شد.
- -fprofile-prefix-path=path
- این گزینه میتواند در ترکیب با profile-generate=profile_dir و profile-use=profile_dir استفاده شود تا به GCC اطلاع دهد که دایرکتوری پایهٔ درخت مبدأ ساختهشده کجاست. بهطور پیشفرض، profile_dir حاوی فایلهایی با مسیرهای مطلق درهمریخته (mangled) از تمام فایلهای شیء در پروژهٔ ساختهشده خواهد بود. زمانی که دایرکتوری مورد استفاده برای ساخت باینری ابزار دقیقشده (instrumented) با دایرکتوری مورد استفاده برای ساخت باینری بهینهشده با بازخورد پروفایل تفاوت داشته باشد، این امر مطلوب نیست زیرا دادههای پروفایل در طول ساخت بهینهشده پیدا نخواهند شد. در چنین ساختارهایی، -fprofile-prefix-path=path که در آن path به دایرکتوری پایهٔ ساخت اشاره میکند، میتواند برای حذف بخش نامربوط مسیر و نگهداشتن تمام نامهای فایل بهصورت نسبی نسبت به دایرکتوری اصلی ساخت استفاده شود.
- -fprofile-prefix-map=old=new
- هنگام کامپایل فایلهای مستقر در دایرکتوری old، اطلاعات پروفایلسازی (با --coverage) را طوری ثبت میکند که گویی فایلها در دایرکتوری new قرار دارند. همچنین گزینههای -ffile-prefix-map و -fcanon-prefix-map را ببینید.
- -fprofile-update=method
- روش
بهروزرسانی
را برای
برنامهای
که جهت
بهینهسازی
مبتنی بر
بازخورد
پروفایل
ابزار دقیق
شده است
تغییر
میدهد.
آرگومان method
باید یکی از
single، atomic یا prefer-atomic
باشد. مقدار
اول برای
برنامههای
تکنخی (single-threaded)
مفید است،
در حالی که
مقدار دوم
با تولید کد
امن از نظر
نخ (thread-safe) از
خراب شدن
دادههای
پروفایل
جلوگیری
میکند.
هشدار: وقتی برنامهای تمام نخها را بهدرستی ملحق نکند (join) (یا یک نخ جداشده/detached ایجاد کند)، فایل پروفایل همچنان ممکن است مخدوش شود.
استفاده از prefer-atomic در صورت پشتیبانی توسط معماری مقصد به atomic، و در غیر این صورت به single تبدیل میشود. راهانداز GCC هنگامی که -pthread در خط فرمان وجود داشته باشد، بهطور خودکار prefer-atomic را انتخاب میکند؛ در غیر این صورت روش پیشفرض single است.
اگر atomic انتخاب شود، اطلاعات پروفایل بر پایهٔ بهترین تلاش ممکن با استفاده از عملیات اتمی بهروزرسانی میشود. در حالت ایدهآل، اطلاعات پروفایل از طریق عملیات اتمی در سختافزار بهروزرسانی میشود. با این حال، اگر پلتفرم مقصد از عملیات اتمی سختافزاری مورد نیاز پشتیبانی نکند، اما libatomic در دسترس باشد، اطلاعات پروفایل از طریق فراخوانیهای libatomic بهروزرسانی میشود. اگر پلتفرم مقصد نه از عملیات اتمی مورد نیاز در سختافزار پشتیبانی کند و نه libatomic موجود باشد، اطلاعات پروفایل بهصورت اتمی بهروزرسانی نشده و هشداری صادر میشود. در این حالت، اطلاعات پروفایل بهدستآمده برای برنامههای چندنخی ممکن است مخدوش باشد.
به دلایل کارایی، اگر از شمارندههای ۶۴ بیتی برای اطلاعات پروفایل استفاده شود و پلتفرم مقصد تنها از عملیات اتمی ۳۲ بیتی در سختافزار پشتیبانی کند، بهروزرسانیهای حساس به کارایی پروفایل با استفاده از دو عملیات اتمی ۳۲ بیتی برای هر بهروزرسانی شمارنده انجام میشود. اگر یک سیگنال این دو عملیات بهروزرسانی شمارنده را قطع کند، اطلاعات پروفایل ممکن است در وضعیتی ناپایدار قرار گیرد.
- -fprofile-filter-files=regex
- تنها
توابعی از
فایلهایی
را ابزار
دقیق
میکند که
نام آنها
با هر یک از
عبارتهای
منظم
(جداشده با
نقطهویرگول)
مطابقت
داشته باشد.
برای نمونه، -fprofile-filter-files=main\.c;module.*\.c تنها main.c و تمام فایلهای C که با 'module' آغاز میشوند را ابزار دقیق خواهد کرد.
- -fprofile-exclude-files=regex
- تنها
توابعی از
فایلهایی
را ابزار
دقیق
میکند که
نام آنها
با هیچیک
از
عبارتهای
منظم
(جداشده با
نقطهویرگول)
مطابقت
نداشته
باشد.
برای نمونه، -fprofile-exclude-files=/usr/.* از ابزار دقیق شدن تمام فایلهایی که در پوشهٔ /usr/ قرار دارند جلوگیری میکند.
- -fprofile-reproducible=[multithreaded|parallel-runs|serial]
- سطح
تکرارپذیری
(بازتولیدپذیری)
پروفایل
جمعآوریشده
توسط
"-fprofile-generate" را
کنترل
میکند. این
امر امکان
بازسازی
برنامه با
نتیجهٔ
یکسان را
فراهم
میکند که
بهعنوان
مثال برای
بستههای
توزیع مفید
است.
با گزینهٔ -fprofile-reproducible=serial، پروفایل جمعآوریشده توسط -fprofile-generate تکرارپذیر است، مشروط بر اینکه برنامهٔ آموزشدادهشده در هر فراخوانی اجرای آموزشی رفتار یکسانی داشته باشد، چندنخی نباشد و ارسال دادههای پروفایل همواره به همان ترتیب انجام شود. توجه داشته باشید که ارسال پروفایل در پایان اجرای برنامه و همچنین پیش از فراخوانی تابع "fork" رخ میدهد.
توجه داشته باشید که بسیار معمول است تعداد دفعات اجرای برخی از بخشهای برنامه برای مثال به طول نامهای فایل موقت یا تصادفیسازی فضای حافظه (که ممکن است بر نرخ برخورد در جدول درهمسازی اثر بگذارد) وابسته باشد. چنین بخشهای غیرتکرارپذیری از برنامهها را میتوان با مشخصهٔ تابع "no_instrument_function" نشانهگذاری کرد. ابزار gcov-dump با -l میتواند برای تخلیهٔ دادههای جمعآوریشده و بررسی اینکه آیا واقعاً تکرارپذیر هستند، استفاده شود.
با گزینهٔ -fprofile-reproducible=parallel-runs، پروفایل جمعآوریشده صرفنظر از ترتیب ارسال دادهها به فایلهای gcda تکرارپذیر باقی میماند. این تنظیم امکان اجرای چندین نمونه از برنامهٔ ابزار دقیقشده را بهصورت موازی (مانند دستور "make -j") فراهم میکند. این کار کیفیت دادههای جمعآوریشده، بهویژه در پروفایلسازی فراخوانیهای غیرمستقیم را کاهش میدهد.
- -fsanitize=address
- ابزار AddressSanitizer را
فعال
میکند که
یک
تشخیصدهندهٔ
سریع
خطاهای
حافظه است.
دستورالعملهای
دسترسی به
حافظه
ابزار دقیق
میشوند تا
باگهای
دسترسی
خارج از
محدوده (out-of-bounds) و
استفاده پس
از
آزادسازی
(use-after-free) شناسایی
شوند. این
گزینه
-fsanitize-address-use-after-scope را
نیز فعال
میکند.
برای
جزئیات
بیشتر به
https://github.com/google/sanitizers/wiki/AddressSanitizer
مراجعه
کنید. رفتار
زمان اجرا
را میتوان
با استفاده
از متغیر
محیطی ASAN_OPTIONS
تحت تأثیر
قرار داد.
هنگامی که
مقدار آن
روی "help=1"
تنظیم شود،
گزینههای
موجود
هنگام
راهاندازی
برنامهٔ
ابزار
دقیقشده
نمایش داده
میشوند.
برای
فهرستی از
گزینههای
پشتیبانیشده
به
https://github.com/google/sanitizers/wiki/AddressSanitizerFlags#run-time-flags
مراجعه
کنید. این
گزینه
نمیتواند
با -fsanitize=thread یا
-fsanitize=hwaddress ترکیب
شود. توجه
داشته
باشید که
تنها
اهدافی که
-fsanitize=hwaddress در حال
حاضر روی
آنها
پشتیبانی
میشود x86-64
(تنها با
گزینههای
"-mlam=u48" یا
"-mlam=u57") و AArch64
هستند، که
در هر دو
مورد فقط در
ABIهایی با
اشارهگرهای
۶۴ بیتی کار
میکند.
هنگام کامپایل با -fsanitize=address، باید از -g نیز برای تولید خروجی معنادارتر استفاده کنید. برای دریافت ردگیری پشتهٔ (stack traces) دقیقتر، میتوان از گزینههایی مانند -O0، -O1 یا -Og (که بهعنوان نمونه از بیشتر درونخطیسازیهای توابع جلوگیری میکنند)، -fno-optimize-sibling-calls (که از بهینهسازی فراخوانیهای همسطح و بازگشتی انتهایی جلوگیری میکند؛ این گزینه برای -O0، -O1 یا -Og ضمنی است)، یا -fno-ipa-icf (که ادغام کدهای یکسان یا Identical Code Folding را برای توابع غیرفعال میکند) استفاده کرد. استفاده از -fno-omit-frame-pointer نیز ردگیری پشته را بهبود میبخشد. از آنجا که چندین بار اجرای برنامه به دلیل ASLR (تصادفیسازی چیدمان فضای آدرس) ممکن است ردگیریهایی با نشانیهای متفاوت ارائه دهد، شاید خاموش کردن ASLR مطلوب باشد. در لینوکس، این کار با دستور setarch `uname -m` -R ./prog قابل انجام است.
- -fsanitize=kernel-address
- ابزار AddressSanitizer را برای هستهٔ لینوکس فعال میکند. برای جزئیات بیشتر به https://github.com/google/kernel-sanitizers مراجعه کنید.
- -fsanitize=hwaddress
- ابزار AddressSanitizer مبتنی بر سختافزار را فعال میکند، که از قابلیت سختافزاری نادیده گرفتن بایت بالایی اشارهگر برای شناسایی خطاهای حافظه با سربار حافظهٔ پایین بهره میبرد. دستورالعملهای دسترسی به حافظه برای تشخیص باگهای خارج از محدوده و استفاده پس از آزادسازی ابزار دقیق میشوند. این گزینه -fsanitize-address-use-after-scope را فعال میکند. برای جزئیات بیشتر به https://clang.llvm.org/docs/HardwareAssistedAddressSanitizerDesign.html مراجعه کنید. رفتار زمان اجرا را میتوان با استفاده از متغیر محیطی HWASAN_OPTIONS تنظیم کرد. هنگامی که روی "help=1" تنظیم شود، گزینههای موجود در زمان راهاندازی برنامهٔ ابزار دقیقشده نمایش داده میشوند. این گزینه نمیتواند با -fsanitize=thread یا -fsanitize=address ترکیب شود و در حال حاضر تنها روی AArch64 در دسترس است.
- -fsanitize=kernel-hwaddress
- ابزار AddressSanitizer
مبتنی بر
سختافزار
را برای
کامپایل
هستهٔ
لینوکس
فعال
میکند.
مشابه -fsanitize=kernel-address
اما با
استفاده از
روش ابزار
دقیقسازی
جایگزین، و
مشابه -fsanitize=hwaddress
اما با
تفاوتهای
ابزار
دقیقسازی
لازم برای
کامپایل
هستهٔ
لینوکس است.
این
تفاوتها
برای
اجتناب از
فراخوانیهای
راهاندازی
اولیهٔ
کتابخانهٔ
hwasan و لحاظ
کردن مقدار
متفاوت در
بایت
بالایی
اشارهگر
پشته است.
نکته: این گزینه پیشفرضهای متفاوتی نسبت به -fsanitize=hwaddress دارد. ابزار دقیقسازی پشته و فراخوانیهای alloca بهطور پیشفرض فعال نیستند اما همچنان با مشخص کردن گزینههای خط فرمان --param hwasan-instrument-stack=1 و --param hwasan-instrument-allocas=1 بهترتیب ممکن هستند. استفاده از برچسب فریم تصادفی برای ابزار دقیق هسته پیادهسازی نشده است.
- -fsanitize=pointer-compare
- عملیات مقایسه (<، <=، >، >=) با عملوندهای اشارهگر را ابزار دقیق میکند. این گزینه باید با یکی از گزینههای -fsanitize=kernel-address یا -fsanitize=address ترکیب شود. این گزینه نمیتواند با -fsanitize=thread ترکیب شود. نکته: بهطور پیشفرض این بررسی در زمان اجرا غیرفعال است. برای فعال کردن آن، مقدار "detect_invalid_pointer_pairs=2" را به متغیر محیطی ASAN_OPTIONS اضافه کنید. استفاده از "detect_invalid_pointer_pairs=1" تنها زمانی عملیات نامعتبر را تشخیص میدهد که هر دو اشارهگر غیرتهی باشند.
- -fsanitize=pointer-subtract
- عملیات
تفریق با
عملوندهای
اشارهگر
را ابزار
دقیق
میکند. این
گزینه باید
با یکی از
گزینههای
-fsanitize=kernel-address یا
-fsanitize=address ترکیب
شود. این
گزینه
نمیتواند
با -fsanitize=thread
ترکیب شود.
نکته:
بهطور
پیشفرض
این بررسی
در زمان
اجرا
غیرفعال
است. برای
فعال کردن
آن، مقدار
"detect_invalid_pointer_pairs=2"
را به متغیر
محیطی ASAN_OPTIONS
اضافه کنید.
استفاده از
"detect_invalid_pointer_pairs=1"
تنها زمانی
عملیات
نامعتبر را
تشخیص
میدهد که
هر دو
اشارهگر
غیرتهی
باشند..IP
-fsanitize=shadow-call-stack 4
فعالسازی
ShadowCallStack؛ یک
مکانیزم
بهبود
امنیت که
برای
محافظت از
برنامهها
در برابر
بازنویسی
آدرس
بازگشت
(مانند
سرریزهای
بافر پشته)
استفاده
میشود. این
سازوکار با
ذخیره آدرس
بازگشت یک
تابع در یک shadow
call stack به صورت
مجزا
تخصیصیافته
در مقدمه
تابع (prologue) و
بازیابی
آدرس
بازگشت از shadow
call stack در موخره
تابع (epilogue) کار
میکند.
سازورسازی
(Instrumentation) تنها در
توابعی رخ
میدهد که
نیاز به
ذخیره آدرس
بازگشت در
پشته دارند.
در حال حاضر این ویژگی تنها از پلتفرم 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 مراجعه کنید.
- -fsanitize=thread
- فعالسازی
ThreadSanitizer؛ یک
آشکارساز
سریع شرایط
رقابتی
دادهها (data race).
دستورالعملهای
دسترسی به
حافظه
سازورسازی
میشوند تا
باگهای
رقابت
دادهای را
شناسایی
کنند. برای
جزئیات
بیشتر به
https://github.com/google/sanitizers/wiki#threadsanitizer
مراجعه
کنید. رفتار
زمان اجرا
را میتوان
با استفاده
از متغیر
محیطی TSAN_OPTIONS
تحت تأثیر
قرار داد؛
برای
فهرستی از
گزینههای
پشتیبانیشده
به
https://github.com/google/sanitizers/wiki/ThreadSanitizerFlags
مراجعه
کنید. این
گزینه
نمیتواند
با -fsanitize=address و -fsanitize=leak
ترکیب شود.
هنگام کامپایل با -fsanitize=thread، بهتر است از -g نیز استفاده کنید تا خروجی معنادارتری تولید شود.
توجه داشته باشید که توابع توکار اتمیک سازورسازیشده، هنگام عمل روی آدرسهای نامعتبر حافظه همراه با استثناهای غیرفراخوانی (-fnon-call-exceptions)، نمیتوانند استثنا پرتاب کنند.
- -fsanitize=leak
- فعالسازی LeakSanitizer؛ یک آشکارساز نشت حافظه. این گزینه تنها برای پیوند دادن (linking) فایلهای اجرایی اهمیت دارد. فایل اجرایی در برابر کتابخانهای پیوند داده میشود که "malloc" و دیگر توابع تخصیصدهنده را بازنویسی (override) میکند. برای جزئیات بیشتر به https://github.com/google/sanitizers/wiki/AddressSanitizerLeakSanitizer مراجعه کنید. رفتار زمان اجرا را میتوان با استفاده از متغیر محیطی LSAN_OPTIONS تحت تأثیر قرار داد. این گزینه را نمیتوان با -fsanitize=thread ترکیب کرد.
- -fsanitize=undefined
- فعالسازی UndefinedBehaviorSanitizer؛ یک آشکارساز سریع رفتار تعریفنشده (undefined behavior). محاسبات گوناگون سازورسازی میشوند تا رفتارهای تعریفنشده را در زمان اجرا تشخیص دهند. برای جزئیات بیشتر به https://clang.llvm.org/docs/UndefinedBehaviorSanitizer.html مراجعه کنید. رفتار زمان اجرا را میتوان با استفاده از متغیر محیطی UBSAN_OPTIONS تحت تأثیر قرار داد. زیرگزینههای فعلی عبارتند از:
- -fsanitize=shift
- این گزینه بررسی تعریفنشده نبودن نتیجهٔ عملیات شیفت را فعال میکند. توجه داشته باشید آنچه دقیقاً تعریفنشده محسوب میشود، در C و ++C و همچنین بین ISO C90 و C99 و غیره اندکی تفاوت دارد. این گزینه دو زیرگزینه دارد: -fsanitize=shift-base و -fsanitize=shift-exponent.
- -fsanitize=shift-exponent
- این گزینه بررسی منفی نبودن آرگومان دوم عملیات شیفت و کوچکتر بودن آن از دقت آرگومان اول ارتقایافته (promoted) را فعال میکند.
- -fsanitize=shift-base
- اگر آرگومان دوم عملیات شیفت در محدوده مجاز باشد، بررسی میکند که نتیجهٔ عملیات شیفت تعریفنشده نباشد. توجه داشته باشید آنچه دقیقاً تعریفنشده تلقی میشود بین C و ++C و همچنین بین ISO C90 و C99 و غیره اندکی تفاوت دارد.
- -fsanitize=integer-divide-by-zero
- تشخیص تقسیم عدد صحیح بر صفر.
- -fsanitize=unreachable
- با این گزینه، کامپایلر فراخوانی "__builtin_unreachable" را در عوض به یک فراخوانی پیام عیبیابی تبدیل میکند. هنگام رسیدن به فراخوانی "__builtin_unreachable"، رفتار برنامه تعریفنشده است.
- -fsanitize=vla-bound
- این گزینه به کامپایلر دستور میدهد تا مثبت بودن اندازهٔ یک آرایه با طول متغیر (variable length array) را بررسی کند.
- -fsanitize=null
- این گزینه بررسی اشارهگرها را فعال میکند. بهویژه، برنامهای که با این گزینه ساخته شده باشد، در صورتی که برای ارجاعزدایی (dereference) از یک اشارهگر NULL تلاش کند، یا اگر یک ارجاع (احتمالاً یک ارجاع rvalue) به یک اشارهگر NULL مقید شود، یا اگر متدی روی شیئی که توسط یک اشارهگر NULL اشاره شده فراخوانی شود، یک پیام خطا صادر خواهد کرد.
- -fsanitize=return
- این گزینه بررسی دستور بازگشت را فعال میکند. برنامههایی که با فعال بودن این گزینه ساخته شوند، هنگامی که به پایان یک تابع غیر-void بدون بازگرداندن واقعی یک مقدار برسند، یک پیام خطا صادر میکنند. این گزینه تنها در ++C کار میکند.
- -fsanitize=signed-integer-overflow
- این گزینه
بررسی
سرریز
اعداد صحیح
علامتدار
را فعال
میکند.
بررسی
میشود که
نتیجهٔ
"+"،
"*"، و هر
دو عملگر
"-"
یکانی و
دودویی در
محاسبات
علامتدار
دچار سرریز
نشود. این
گزینه
همچنین
تقسیم
علامتدار
"INT_MIN / -1" را
نیز تشخیص
میدهد.
توجه داشته
باشید که
قواعد
ارتقای عدد
صحیح (integer promotion)
باید در نظر
گرفته
شوند؛ به
این معنا که
مورد زیر
سرریز
محسوب
نمیشود:
signed char a = SCHAR_MAX; a++;
- -fsanitize=bounds
- این گزینه سازورسازی مرزهای آرایه را فعال میکند. دسترسیهای خارج از محدودهٔ گوناگونی تشخیص داده میشوند. اعضای آرایه منعطف (flexible array members)، آرایههای شبه-عضو آرایه منعطف، و مقداردهندههای اولیهٔ متغیرها با حافظهٔ ایستا سازورسازی نمیشوند، به استثنای آرایههای شبه-عضو آرایه منعطف که گزینههای "-fstrict-flex-arrays" یا "-fstrict-flex-arrays=" یا ویژگیهای "strict_flex_array" مشخص میکنند که نباید مانند آرایههای شبه-عضو آرایه منعطف با آنها رفتار شود.
- -fsanitize=bounds-strict
- این گزینه سازورسازی سختگیرانهٔ مرزهای آرایه را فعال میکند. بیشتر دسترسیهای خارج از محدوده، از جمله آرایههای شبه-عضو آرایه منعطف، شناسایی میشوند. مقداردهندههای اولیهٔ متغیرها با حافظهٔ ایستا سازورسازی نمیشوند.
- -fsanitize=alignment
- این گزینه بررسی ترازسازی (alignment) اشارهگرها را هنگام ارجاعزدایی از آنها، یا زمانی که یک ارجاع به مقصدی با ترازسازی ناکافی مقید میشود، یا زمانی که یک متد یا سازنده روی شیئی با ترازسازی ناکافی فراخوانی میشود، فعال میکند.
- -fsanitize=object-size
- این گزینه سازورسازی ارجاعهای حافظه را با استفاده از تابع "__builtin_dynamic_object_size" فعال میکند. دسترسیهای خارج از محدودهٔ اشارهگر گوناگونی تشخیص داده میشوند.
- -fsanitize=float-divide-by-zero
- تشخیص تقسیم عدد ممیز شناور بر صفر. بر خلاف دیگر گزینههای مشابه، -fsanitize=float-divide-by-zero توسط -fsanitize=undefined فعال نمیشود، زیرا تقسیم ممیز شناور بر صفر میتواند روشی مجاز برای بهدست آوردن مقادیر بینهایت و NaN باشد.
- -fsanitize=float-cast-overflow
- این گزینه بررسی تبدیل نوع ممیز شناور به عدد صحیح را فعال میکند. بررسی میشود که نتیجهٔ تبدیل دچار سرریز نشود. برخلاف دیگر گزینههای مشابه، -fsanitize=float-cast-overflow توسط -fsanitize=undefined فعال نمیشود. این گزینه با فعال بودن استثناهای "FE_INVALID" به خوبی کار نمیکند.
- -fsanitize=nonnull-attribute
- این گزینه سازورسازی فراخوانیها را فعال میکند، و بررسی میکند که مقادیر null به آرگومانهایی که با ویژگی تابعی "nonnull" به عنوان نیازمند یک مقدار غیر-null نشانهگذاری شدهاند، ارسال نشوند.
- -fsanitize=returns-nonnull-attribute
- این گزینه سازورسازی دستورهای بازگشت را در توابعی که با ویژگی تابعی "returns_nonnull" نشانهگذاری شدهاند فعال میکند، تا بازگرداندن مقادیر null از چنین توابعی را تشخیص دهد.
- -fsanitize=bool
- این گزینه سازورسازی بارگذاریها از نوع bool را فعال میکند. اگر مقداری غیر از 0/1 بارگذاری شود، یک خطای زمان اجرا صادر میگردد.
- -fsanitize=enum
- این گزینه سازورسازی بارگذاریها از یک نوع enum را فعال میکند. اگر مقداری خارج از محدودهٔ مقادیر مجاز برای نوع enum بارگذاری شود، یک خطای زمان اجرا صادر میگردد.
- -fsanitize=vptr
- این گزینه سازورسازی فراخوانیهای توابع عضو ++C، دسترسی به اعضا و برخی تبدیلات بین اشارهگرها به کلاسهای پایه و مشتقشده را فعال میکند، تا بررسی شود که شیء ارجاعشده دارای نوع پویا (dynamic type) صحیح است..IP -fsanitize=pointer-overflow 4 این گزینه ابزارگذاری (instrumentation) محاسبات اشارهگر را فعال میکند. اگر محاسبات اشارهگر سرریز کند، یک خطای زمان اجرا صادر میشود.
- -fsanitize=builtin
- این گزینه ابزارگذاری آرگومانهای توابع توکار (builtin) منتخب را فعال میکند. اگر یک مقدار نامعتبر به چنین آرگومانهایی ارسال شود، یک خطای زمان اجرا صادر میشود. برای مثال، ارسال 0 به عنوان آرگومان به "__builtin_ctz" یا "__builtin_clz" رفتار تعریفنشده ایجاد میکند و با این گزینه تشخیص داده میشود.
توجه داشته باشید که وارسیکنندهها (sanitizers) معمولاً نرخ هشدارهای مثبت کاذب را افزایش میدهند، بهویژه مواردی که پیرامون -Wmaybe-uninitialized هستند. ما ترکیب -Werror و [استفاده از] وارسیکنندهها را توصیه نمیکنیم.
در حالی که -ftrapv باعث صدور تلهها (traps) برای سرریزهای علامتدار میشود، -fsanitize=undefined یک پیام تشخیصی ارائه میدهد. این ویژگی در حال حاضر تنها برای خانوادهٔ زبانهای C کار میکند.
- -fno-sanitize=all
- این گزینه تمام وارسیکنندههای فعالشدهٔ قبلی را غیرفعال میکند. استفاده از -fsanitize=all مجاز نیست، زیرا برخی از وارسیکنندهها را نمیتوان با هم استفاده کرد.
- -fasan-shadow-offset=number
- این گزینه GCC را وادار میکند تا از یک آفست سایهٔ (shadow offset) سفارشی در بررسیهای AddressSanitizer استفاده کند. این ویژگی برای آزمایش با طرحبندیهای مختلف حافظه سایه در Kernel AddressSanitizer مفید است.
- -fsanitize-sections=s1,s2,...
- وارسی متغیرهای سراسری در بخشهای منتخبِ تعریفشده توسط کاربر. si ممکن است حاوی نویسههای عام (wildcards) باشد.
- -fsanitize-recover[=opts]
- گزینهٔ
-fsanitize-recover= حالت
بازیابی
خطا را برای
وارسیکنندههای
ذکرشده در
فهرستِ
جداشده با
کامای opts
کنترل
میکند.
فعال کردن
این گزینه
برای یک جزء
وارسیکننده
باعث
میشود
تلاش کند
اجرای
برنامه را
به گونهای
ادامه دهد
که گویی هیچ
خطایی رخ
نداده است.
این بدان
معناست که
در یک بار
اجرای
برنامه
میتوان
چندین خطای
زمان اجرا
را گزارش
کرد، و
وضعیت خروج
برنامه
ممکن است
حتی با وجود
گزارش
خطاها،
موفقیت را
نشان دهد.
گزینهٔ
-fno-sanitize-recover=
میتواند
برای تغییر
این رفتار
به کار رود:
تنها
نخستین
خطای
شناساییشده
گزارش
میشود و
سپس برنامه
با یک کد
خروج
غیرصفر
خارج
میگردد.
در حال حاضر این ویژگی تنها برای -fsanitize=undefined (و زیرگزینههای آن بهجز -fsanitize=unreachable و -fsanitize=return)، -fsanitize=float-cast-overflow، -fsanitize=float-divide-by-zero، -fsanitize=bounds-strict، -fsanitize=kernel-address و -fsanitize=address کار میکند. برای این وارسیکنندهها بازیابی خطا بهطور پیشفرض فعال است، بهجز -fsanitize=address که این ویژگی برای آن آزمایشی است. -fsanitize-recover=all و -fno-sanitize-recover=all نیز پذیرفته میشوند؛ مورد اول، بازیابی را برای همهٔ وارسیکنندههای پشتیبانیکننده فعال، و مورد دوم، بازیابی را برای همهٔ وارسیکنندههای پشتیبانیکننده غیرفعال میکند.
حتی اگر حالت بازیابی در سمت کامپایلر فعال شده باشد، باید در سمت کتابخانهٔ زمان اجرا نیز فعال گردد، در غیر این صورت شکستها همچنان مهلک باقی میمانند. پیشفرض کتابخانه زمان اجرا برای ThreadSanitizer و UndefinedBehaviorSanitizer مقدار "halt_on_error=0" است، در حالی که مقدار پیشفرض برای AddressSanitizer برابر "halt_on_error=1" میباشد. این مقدار را میتوان از طریق تنظیم پرچم "halt_on_error" در متغیر محیطی مربوطه بازنویسی کرد.
نحوِ بدون پارامتر صریحِ opts منسوخ شده است. این نحو معادل مشخص کردن فهرست opts زیر است:
undefined,float-cast-overflow,float-divide-by-zero,bounds-strict
- -fsanitize-address-use-after-scope
- وارسی متغیرهای محلی برای تشخیص باگهای استفاده پس از پایان حوزه (use-after-scope) را فعال میکند. این گزینه -fstack-reuse را روی none تنظیم میکند.
- -fsanitize-trap[=opts]
- گزینهٔ -fsanitize-trap=
به
کامپایلر
دستور
میدهد
برای
وارسیکنندههای
ذکرشده در
فهرستِ
جداشده با
کامای opts،
رفتار
تعریفنشده
را به جای
روال
کتابخانهٔ
"libubsan" با
استفاده از
"__builtin_trap"
گزارش دهد.
اگر این
گزینه برای
وارسیکنندهٔ
خاصی فعال
شود، بر
-fsanitizer-recover= برای
آن
وارسیکننده
تقدم
مییابد؛
"__builtin_trap"
صادر خواهد
شد و
صرفنظر از
اینکه
بازیابی با
-fsanitize-recover= فعال
باشد یا
غیرفعال،
مهلک خواهد
بود.
مزیت این روش در این است که به کتابخانهٔ "libubsan" نیازی نبوده و پیوند داده نمیشود، بنابراین حتی در محیطهای مستقل (freestanding) نیز قابل استفاده است.
در حال حاضر این ویژگی با -fsanitize=undefined (و زیرگزینههای آن بهجز -fsanitize=vptr)، -fsanitize=float-cast-overflow، -fsanitize=float-divide-by-zero و -fsanitize=bounds-strict کار میکند. همچنین میتوان "-fsanitize-trap=all" را تعیین کرد که آن را برای زیرگزینههای "undefined"، -fsanitize=float-cast-overflow، -fsanitize=float-divide-by-zero و -fsanitize=bounds-strict فعال میکند. اگر "-fsanitize-trap=undefined" یا "-fsanitize-trap=all" استفاده شود و "-fsanitize=vptr" در خط فرمان فعال باشد، ابزارگذاری در سکوت نادیده گرفته میشود زیرا ابزارگذاری همیشه به پشتیبانی "libubsan" نیاز دارد؛ استفاده از -fsanitize-trap=vptr مجاز نیست.
- -fsanitize-undefined-trap-on-error
- گزینهٔ -fsanitize-undefined-trap-on-error معادلِ منسوخشدهٔ -fsanitize-trap=all است.
- -fsanitize-coverage=trace-pc
- ابزارگذاری کد برای فازینگ هدایتشده با پوشش (coverage-guided fuzzing) را فعال میکند. یک فراخوانی به "__sanitizer_cov_trace_pc" را در هر بلوک پایه درج میکند.
- -fsanitize-coverage=trace-cmp
- ابزارگذاری کد برای فازینگ هدایتشده با جریان داده (dataflow guided fuzzing) را فعال میکند. یک فراخوانی به "__sanitizer_cov_trace_cmp1"، "__sanitizer_cov_trace_cmp2"، "__sanitizer_cov_trace_cmp4" یا "__sanitizer_cov_trace_cmp8" را برای مقایسهٔ اعداد صحیح که در آن هر دو عملوند متغیر هستند، یا "__sanitizer_cov_trace_const_cmp1"، "__sanitizer_cov_trace_const_cmp2"، "__sanitizer_cov_trace_const_cmp4" یا "__sanitizer_cov_trace_const_cmp8" را برای مقایسهٔ اعداد صحیح با یک عملوند ثابت، "__sanitizer_cov_trace_cmpf" یا "__sanitizer_cov_trace_cmpd" را برای مقایسههای float یا double، و "__sanitizer_cov_trace_switch" را برای دستورات switch درج میکند.
- -fcf-protection=[full|branch|return|none|check]
- -fcf-protection
- ابزارگذاری
کد را برای
افزایش
امنیت
برنامه از
طریق بررسی
معتبر بودن
آدرسهای
مقصد در
دستورالعملهای
انتقال
جریان
کنترل
(مانند
فراخوانی
غیرمستقیم
تابع،
بازگشت از
تابع، پرش
غیرمستقیم)
فعال
میکند. این
کار از
انحراف
جریان
کنترل به یک
مقصد
غیرمنتظره
جلوگیری
مینماید.
این قابلیت
به منظور
حفاظت در
برابر
تهدیداتی
مانند
برنامهنویسی
مبتنی بر
بازگشت (ROP)، و
به همین
ترتیب
برنامهنویسی
مبتنی بر call/jmp
(یا COP/JOP) طراحی
شده است.
کلمات کلیدی -fcf-protection= به شرح زیر تفسیر میشوند.
مقدار "branch" به کامپایلر اعلام میکند که بررسی اعتبار انتقال جریان کنترل را در نقطهٔ دستورالعملهای انشعاب غیرمستقیم، یعنی دستورالعملهای call/jmp، پیادهسازی نماید.
مقدار "return" بررسی اعتبار را در نقطهٔ بازگشت از یک تابع پیادهسازی میکند.
مقدار "full" یک نام مستعار برای مشخص کردن همزمان هر دو مقدار "branch" و "return" است.
مقدار "check" برای پیوند نهایی با بهینهسازی زمان پیوند (LTO) به کار میرود. اگر فایلهای شیءِ LTO با مقادیر متفاوتی از -fcf-protection کامپایل شده باشند، یک خطا صادر میشود. مقدار "check" در زمان کامپایل نادیده گرفته میشود.
مقدار "none" ابزارگذاری را خاموش میکند.
گزینهٔ -fcf-protection نام مستعاری برای -fcf-protection=full است. برای بازنویسی گزینهٔ پیشین -fcf-protection در خط فرمان، ابتدا -fcf-protection=none و سپس -fcf-protection=kind را اضافه کنید.
ماکروی "__CET__" زمانی که -fcf-protection استفاده شود تعریف میگردد. نخستین بیت "__CET__" برای مقدار "branch" روی 1 و بیت دوم "__CET__" برای "return" روی 1 تنظیم میشود.
همچنین میتوانید از صفت "nocf_check" استفاده کنید تا مشخص نمایید کدام توابع و فراخوانیها باید از ابزارگذاری مستثنی شوند.
در حال حاضر مقصد x86 GNU/Linux پیادهسازی مبتنی بر فناوری ارتقای امنیت جریان کنترل اینتل (CET) را ارائه میدهد که برای پردازندههای i686 یا جدیدتر کار میکند.
- -fharden-compares
- برای هر آزمون منطقی که از بهینهسازیهای gimple باقی بماند و شرطی در یک انشعاب شرطی نباشد (برای مثال، شرایط آزمایششده برای انتقالهای شرطی، یا برای ذخیره در متغیرهای بولی)، کد اضافهای صادر میکند تا شرط وارونه را محاسبه و بررسی کند، و در صورت عدم تطابق نتایج، "__builtin_trap" را فراخوانی نماید. برای پوشش دادن همهٔ عبارات شرطی، همراه با -fharden-conditional-branches استفاده شود..IP -fharden-conditional-branches 4 برای هر انشعاب شرطی غیربرداریشده که پس از بهینهسازیهای gimple باقی میماند، کد اضافهای برای محاسبه و درستیسنجی شرط معکوس درج میکند و اگر نتیجه غیرمنتظره بود، "__builtin_trap" را فرامیخواند. همراه با -fharden-compares استفاده شود تا همهٔ شرطها پوشش داده شوند.
- -fharden-control-flow-redundancy
- کد
اضافهای
درج میکند
تا هنگام
ورود به
بلوکهای
پایه (basic blocks)
متغیرهای
بولی تنظیم
شوند، و
هنگام خروج
از تابع، در
صورتی که
این مقادیر
بولی مسیر
اجرایی
سازگاری با
گراف جریان
کنترل
تشکیل
ندهند،
درستیسنجی
کرده و تله (trap)
بگذارد.
درستیسنجی پیش از بازگشتها، پیش از فراخوانیهای دُم اجباری (زیر را ببینید) و بهصورت اختیاری، پیش از خروج استثناها با -fhardcfr-check-exceptions، پیش از فراخوانیهای بازگشتی با -fhardcfr-check-returning-calls، و پیش از فراخوانیهای noreturn با -fhardcfr-check-noreturn-calls انجام میشود. گزینههای تنظیمی --param hardcfr-max-blocks و --param hardcfr-max-inline-blocks در دسترس هستند.
بهینهسازی فراخوانی دُم (tail call optimization) بسیار دیرتر از آن رخ میدهد که بر افزونگی جریان کنترل تأثیر بگذارد، اما فراخوانیهایی که توسط پیشانیهای زبان (front-ends) بهعنوان فراخوانی دُم اجباری نشانهگذاری شدهاند، و هر فراخوانی که بهاندازهٔ کافی زود بهعنوان فراخوانی دُم بالقوه علامتگذاری شود نیز درستیسنجی پیش از فراخوانی خواهند داشت؛ هرچند این احتمالات صرفاً جنبهٔ نظری دارند، چرا که این شرایط تنها هنگام استفاده از افزونههای سفارشی کامپایلر محقق میشوند.
- -fhardcfr-skip-leaf
- گزینهٔ -fharden-control-flow-redundancy را در توابع برگ (leaf functions) غیرفعال میکند.
- -fhardcfr-check-exceptions
- هنگامی که -fharden-control-flow-redundancy فعال است، مسیر اجرایی ثبتشده را در نقاط فرار استثنا با گراف جریان کنترل بررسی میکند؛ گویی بدنهٔ تابع درون یک گردانندهٔ پاکسازی (cleanup handler) قرار گرفته که بررسی را انجام داده و استثنا را مجدداً پرتاب (reraise) میکند. این گزینه بهطور پیشفرض فعال است؛ برای غیرفعالسازی آن از -fno-hardcfr-check-exceptions استفاده کنید.
- -fhardcfr-check-returning-calls
- هنگامی که
-fharden-control-flow-redundancy فعال
است، مسیر
اجرایی
ثبتشده را
پیش از هر
فراخوانی
تابعی که
بلافاصله
با بازگشت
نتیجهٔ آن
(در صورت
وجود) دنبال
میشود با
گراف جریان
کنترل
بررسی
میکند تا
مانع از
بهینهسازی
فراخوانی
دُم نشود،
صرفنظر از
اینکه در
نهایت به یک
فراخوانی
دُم
بهینهسازی
شود یا خیر.
این گزینه هر زمان که بهینهسازی فراخوانیهای همسطح فعال باشد (به -foptimize-sibling-calls نگاه کنید) بهطور پیشفرض فعال است، اما صرفنظر از بهینهسازیها میتوان آن را بهطور صریح فعال (یا با استفاده از شکل منفی آن، غیرفعال) کرد.
- -fhardcfr-check-noreturn-calls=[always|no-xthrow|nothrow|never]
- هنگامی که
-fharden-control-flow-redundancy فعال
است، مسیر
اجرایی
ثبتشده را
پیش از
فراخوانیهای
"noreturn" با
گراف جریان
کنترل
بررسی
میکند؛ یا
برای همهٔ
آنها (always)،
یا آنهایی
که انتظار
نمیرود
کنترل را از
طریق یک
استثنا به
فراخواننده
بازگردانند
(no-xthrow،
پیشفرض)،
یا آنهایی
که ممکن
نیست حتی از
طریق یک
استثنا هم
کنترل را به
فراخواننده
بازگردانند
(nothrow)، یا
هیچکدام
از آنها (never).
بررسی پیش از یک تابع "noreturn" که ممکن است کنترل را از طریق یک استثنا به فراخواننده بازگرداند، در صورتی که استثنا در فراخواننده گرفته شود (چه توسط یک گرداننده یا یک بخش پاکسازی)، ممکن است باعث شود بررسی بیش از یک بار انجام گیرد. هنگامی که -fhardcfr-check-exceptions نیز فعال باشد، کامپایلر از پیوند دادن یک فراخوانی "noreturn" با گردانندهٔ پاکسازیِ بهطور ضمنی اضافهشده خودداری میکند، زیرا نسبت به بررسی انجامشده پیش از فراخوانی افزونه خواهد بود؛ اما سایر گردانندهها یا بخشهای پاکسازی در تابع، در صورت فعال شدن، مسیر اجرایی ثبتشده را تغییر داده و با رسیدن به یک نقطهٔ بررسی دیگر، مجدداً آن را بررسی میکنند. این نقطهٔ بررسی حتی ممکن است یک فراخوانی "noreturn" دیگر باشد، بنابراین ممکن است بررسی چندین بار انجام شود.
بهینهسازهای گوناگون ممکن است حتی در صورت عدم وجود صفتهای مربوطه، موجب شوند فراخوانیها بهعنوان "noreturn" و/یا "nothrow" نشانهگذاری شوند که این امر میتواند بر جایگذاری بررسیها پیش از فراخوانیها و همچنین افزودن گردانندههای پاکسازی ضمنی برای آنها اثر بگذارد. این غیرقابلپیشبینی بودن و این واقعیت که پرتاب و بازپرتاب مکرر استثناها عملاً به مثابه فراخوانی ضمنی توابع "noreturn" است، باعث شده no-xthrow تنظیم پیشفرض این گزینه باشد: این حالت از رفتار "noreturn" تنها توابع داخلیای را که برای پرتاب (مجدد) استثناها استفاده میشوند و تحت تأثیر این بهینهسازیها قرار نمیگیرند مستثنی میکند.
- -fhardened
- مجموعهای
از پرچمها
را برای C و C++
فعال
میکند که
امنیت کد
تولیدشده
را بدون
تأثیر بر ABI
آن بهبود
میبخشند.
پرچمهای
دقیق
فعالشده
ممکن است
میان
انتشارهای
اصلی GCC
تغییر کند،
اما در حال
حاضر
عبارتند از:
-D_FORTIFY_SOURCE=3 -D_GLIBCXX_ASSERTIONS -ftrivial-auto-var-init=zero -fPIE -pie -Wl,-z,relro,-z,now -fstack-protector-strong -fstack-clash-protection -fcf-protection=full (تنها در x86 GNU/Linux)
فهرست گزینههای فعالشده با -fhardened را میتوان با استفاده از گزینهٔ --help=hardened به دست آورد.
هنگامی که glibc سیستم قدیمیتر از 2.35 باشد، بهجای آن از -D_FORTIFY_SOURCE=2 استفاده میشود.
این گزینه برای استفاده در ساختهای نهایی (production) در نظر گرفته شده است، نه صرفاً ساختهای اشکالزدایی.
در حال حاضر، -fhardened تنها روی مقصدهای GNU/Linux پشتیبانی میشود.
-fhardened تنها در صورتی یک گزینهٔ خاص را فعال میکند که از پیش در جایی از خط فرمان مشخص نشده باشد. برای نمونه، -fhardened -fstack-protector تنها -fstack-protector را فعال خواهد کرد، نه -fstack-protector-strong را.
- -fstack-protector
- کد اضافهای برای بررسی سرریزهای بافر، مانند حملات تخریب پشته (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 ممکن است محافظت محدودی برای تخصیصهای ایستای پشته نیز ارائه دهد..IP -fstack-limit-register=reg 4
- -fstack-limit-symbol=sym
- -fno-stack-limit
- تولید کد
برای
اطمینان از
اینکه پشته
فراتر از یک
مقدار مشخص
رشد نکند؛
چه مقدار یک
ثبات باشد و
چه نشانی یک
نماد. اگر
پشتهٔ
بزرگتری
نیاز باشد،
یک سیگنال
در زمان
اجرا صادر
میشود.
برای بیشتر
مقاصد،
سیگنال پیش
از آنکه
پشته از مرز
فراتر رود
صادر
میشود، از
این رو
گرفتن
سیگنال
بدون نیاز
به اقدامات
احتیاطی
ویژه
امکانپذیر
است.
برای نمونه، اگر پشته از نشانی مطلق 0x80000000 آغاز شود و رو به پایین رشد کند، میتوانید از پرچمهای -fstack-limit-symbol=__stack_limit و -Wl,--defsym,__stack_limit=0x7ffe0000 برای اعمال محدودیت پشتهٔ ۱۲۸ کیلوبایتی استفاده کنید. توجه داشته باشید که این ویژگی ممکن است تنها با پیونددهندهٔ GNU کار کند.
میتوانید بررسی محدودیت پشته را بهصورت محلی با استفاده از صفت تابع "no_stack_limit" لغو (override) کنید.
- -fsplit-stack
- تولید کد
برای
قطعهبندی
خودکار
پشته پیش از
سرریز شدن
آن. برنامهٔ
حاصل دارای
پشتهای
ناپیوسته
خواهد بود
که تنها در
صورتی ممکن
است سرریز
شود که
برنامه
قادر به
تخصیص
حافظهٔ
بیشتری
نباشد. این
ویژگی بیش
از همه
هنگام
اجرای
برنامههای
چندنخی
مفید است،
زیرا دیگر
نیازی به
محاسبهٔ
اندازهٔ
مناسب پشته
برای هر نخ
نخواهد بود.
این قابلیت
در حال حاضر
تنها برای
مقاصد x86 که
روی GNU/Linux اجرا
میشوند
پیادهسازی
شده است.
هنگامی که کد کامپایلشده با -fsplit-stack کدی را فراخوانی میکند که بدون -fsplit-stack کامپایل شده است، ممکن است فضای پشتهٔ زیادی برای اجرای کد دوم در دسترس نباشد. اگر کامپایل همهٔ کدها، از جمله کدهای کتابخانهای، با -fsplit-stack مقدور نباشد، پیونددهنده میتواند این فراخوانیها را اصلاح کند تا کدی که بدون -fsplit-stack کامپایل شده همواره پشتهٔ بزرگی در اختیار داشته باشد. پشتیبانی از این قابلیت در پیونددهندهٔ gold در نگارش ۲.۲۱ و بالاتر GNU binutils پیادهسازی شده است.
- -fstrub=disable
- غیرفعالسازی کامل پاکسازی پشته (stack scrubbing)، با نادیده گرفتن تمام صفتهای "strub". ببینید
- -fstrub=strict
- توابع بهطور پیشفرض به حالت "strub" از نوع "disabled" درمیآیند، و این محدودیت بهصورت سختگیرانه (strict) اعمال میشود که تنها توابع مرتبط با حالتهای قابل فراخوانیِ "strub" ("strub"-"callable"، یعنی "at-calls"، "callable" و "always_inline" "internal") توسط توابعی با حالتهای فعالشده برای "strub" ("at-calls" و "internal") قابل فراخوانی ("callable") باشند.
- -fstrub=relaxed
- بازیابی تنظیمات پیشفرض پاکسازی پشته ("strub")؛ بدین معنا که "strub" تنها بنا بر نیاز صفتهای "strub" مرتبط با انواع تابع و داده فعال میشود. حالت "Relaxed" بدین معناست که زمینههای strub تنها از فراخوانی توابعی بازداشته میشوند که صراحتاً با حالت "strub" از نوع "disabled" مرتبط شدهاند. این گزینه تنها برای بازنویسی سایر گزینههای -fstrub=* که در خط فرمان قبل از آن آمدهاند مفید است.
- -fstrub=at-calls
- فعالسازی حالت "strub" از نوع "at-calls" در صورت امکانپذیر بودن. کاربرد اصلی این گزینه برای آزمایش است. این گزینه سازوکار "strub" را در سناریوهایی که کاملاً برای یک واحد ترجمه محلی هستند به کار میگیرد. این حالت "strub" رابطهای توابع را تغییر میدهد، بنابراین هر تابعی که برای سایر واحدهای ترجمه قابل مشاهده باشد، یا نشانی آن گرفته شده باشد، تحت تأثیر این گزینه قرار نخواهد گرفت. گزینههای بهینهسازی نیز ممکن است بر امکانپذیری تأثیر بگذارند. برای جزئیات مربوط به نیازمندیهای امکانپذیری و واجد شرایط بودن، مستندات صفت "strub" را ببینید.
- -fstrub=internal
- فعالسازی حالت "strub" از نوع "internal" در صورت امکانپذیر بودن. کاربرد اصلی این گزینه برای آزمایش است. این گزینه برای این در نظر گرفته شده که بخشهایی از سازوکار "strub" را که حالتِ کمبازدهتر اما نگهدارندهٔ رابط "strub" را پیادهسازی میکنند، بهطور دقیق بیازماید. توابعی که تحت تأثیر این گزینه قرار نگیرند، بسیار نادر هستند.
- -fstrub=all
- فعالسازی یکی از حالتهای "strub" در صورت امکانپذیر بودن. هنگامی که هر دو حالت strub امکانپذیر باشند، "at-calls" ترجیح داده میشود. گزینهٔ -fdump-ipa-strubm صفتهایی به توابع اضافه میکند که مشخص میسازد کدام حالت برای هر تابع انتخاب شده است. کاربرد اصلی این گزینه برای آزمایش، جهت آزمودن دقیق سازوکار "strub" است.
- -fvtable-verify=[std|preinit|none]
- این گزینه
تنها هنگام
کامپایل کد
++C در دسترس
است. این
گزینه
قابلیت
امنیتیای
را روشن (یا
در صورت
استفاده از
-fvtable-verify=none،
خاموش)
میکند که
در زمان
اجرا، برای
هر
فراخوانی
مجازی،
بررسی
میکند که
اشارهگر vtable
که
فراخوانی
از طریق آن
صورت
میگیرد
برای نوع
شیء معتبر
باشد و خراب
یا رونویسی
نشده باشد.
اگر
اشارهگر vtable
نامعتبری
در زمان
اجرا
شناسایی
شود، خطایی
گزارش شده و
اجرای
برنامه
بیدرنگ
متوقف
میشود.
این گزینه باعث میشود ساختارهای دادهٔ زمان اجرا هنگام راهاندازی برنامه ساخته شوند، که برای اعتبارسنجی اشارهگرهای vtable استفاده میشوند. گزینههای std و preinit زمان ساخته شدن این ساختارهای داده را کنترل میکنند. در هر دو حالت، ساختارهای داده پیش از آنکه اجرا به "main" برسد ساخته میشوند. استفاده از -fvtable-verify=std باعث میشود ساختارهای داده پس از بارگذاری و مقداردهی اولیهٔ کتابخانههای مشترک ساخته شوند. -fvtable-verify=preinit باعث میشود آنها پیش از بارگذاری و مقداردهی اولیهٔ کتابخانههای مشترک ساخته شوند.
اگر این گزینه چندین بار با مقادیر مختلف در خط فرمان ظاهر شود، none بالاترین اولویت را بر هر دو گزینهٔ std و preinit دارد؛ و preinit نسبت به std اولویت دارد.
- -fvtv-debug
- هنگامی که
همراه با
-fvtable-verify=std یا -fvtable-verify=preinit
استفاده
شود، باعث
فراخوانی
نگارشهای
اشکالزدایی
از توابع
زمان اجرا
برای
قابلیت
اعتبارسنجی
vtable میشود.
این پرچم
همچنین
باعث
میشود
کامپایلر
اطلاعات
مربوط به
اینکه چه
اشارهگرهای
vtableای برای هر
کلاس پیدا
میکند را
ثبت نماید.
این
اطلاعات در
فایلی به
نام vtv_set_ptr_data.log در
دایرکتوری
مشخصشده
توسط متغیر
محیطی VTV_LOGS_DIR
(در صورت
تعریف بودن)
یا
دایرکتوری
کاری فعلی
در غیر این
صورت،
نوشته
میشود.
نکته: این ویژگی دادهها را به انتهای فایل گزارش ضمیمه میکند. اگر یک فایل گزارش تازه میخواهید، حتماً هر فایل موجود را حذف کنید.
- -fvtv-counts
- این یک پرچم
اشکالزدایی
است. هنگامی
که همراه با
-fvtable-verify=std یا -fvtable-verify=preinit
به کار رود،
باعث
میشود
کامپایلر
تعداد کل
فراخوانیهای
مجازی که با
آنها
مواجه
میشود و
تعداد
اعتبارسنجیهایی
که درج
میکند را
پیگیری
نماید.
همچنین
تعداد
فراخوانیهای
درجشده به
توابع خاصی
از
کتابخانهٔ
زمان اجرا
را شمارش
کرده و این
اطلاعات را
برای هر
واحد
کامپایل
ثبت میکند.
کامپایلر
این
اطلاعات را
در فایلی به
نام vtv_count_data.log در
دایرکتوری
تعیینشده
توسط متغیر
محیطی VTV_LOGS_DIR
در صورت
تعریف
بودن، یا در
دایرکتوری
کاری فعلی
در غیر این
صورت
مینویسد.
همچنین
اندازهٔ
مجموعههای
اشارهگر vtable
را برای هر
کلاس
میشمارد و
این
اطلاعات را
در vtv_class_set_sizes.log در
همان
دایرکتوری
مینویسد.
نکته: این ویژگی دادهها را به انتهای فایلهای گزارش ضمیمه میکند. برای دریافت فایلهای گزارش تازه، حتماً فایلهای موجود قبلی را حذف کنید.
- -finstrument-functions
- تولید
فراخوانیهای
ابزاردقیقسازی
برای ورود
به توابع و
خروج از
آنها.
دقیقاً پس
از ورود به
تابع و درست
پیش از خروج
از تابع،
توابع
پروفایلینگ
زیر با
نشانی تابع
فعلی و محل
فراخوانی
آن (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) گسترش یافتهاند نیز انجام میشود. فراخوانیهای پروفایلینگ نشان میدهند که از نظر مفهومی در چه نقطهای به تابع برخط وارد یا از آن خارج شده است. این بدان معناست که نگارشهای نشانیپذیر از چنین توابعی باید موجود باشند. اگر همهٔ موارد استفادهٔ شما از یک تابع بهصورت برخط گسترش یابد، این امر ممکن است به افزایش اندازهٔ کد منجر شود. اگر از "extern inline" در کد C خود استفاده کنید، باید یک نسخهٔ نشانیپذیر از چنین توابعی ارائه گردد. (در هر صورت معمولاً وضعیت به همین شکل است، اما اگر خوششانس باشید و بهینهساز همواره توابع را بهصورت برخط گسترش دهد، ممکن است بدون ارائهٔ نسخههای ایستا کار پیش رفته باشد.)
میتوان به یک تابع صفت "no_instrument_function" داد که در این صورت این ابزاردقیقسازی انجام نمیشود. از این قابلیت میتوان برای نمونه برای توابع پروفایلینگ فهرستشده در بالا، روالهای وقفه با اولویت بالا و هر تابعی که فراخوانی توابع پروفایلینگ از داخل آن ایمن نباشد (احتمالاً گردانندههای سیگنال، در صورتی که روالهای پروفایلینگ خروجی تولید کنند یا حافظه تخصیص دهند) استفاده کرد.
- -finstrument-functions-once
- این گزینه
مشابه -finstrument-functions
است، اما
توابع
پروفایلینگ
تنها یک بار
به ازای هر
تابعِ
ابزاردقیقشده
فراخوانی
میشوند؛
یعنی تابع
پروفایلینگ
نخست پس از
اولین ورود
به تابعِ
ابزاردقیقشده،
و تابع
پروفایلینگ
دوم پیش از
خروج
متناظر با
این نخستین
ورود
فراخوانی
میشود.
تعریف "once" برای اهداف این گزینه اندکی مبهم است زیرا پیادهسازی در برابر رقابتهای دادهای (data races) محافظت نشده است. در نتیجه، پیادهسازی تنها تضمین میکند که توابع پروفایلینگ حداقل (least) یک بار به ازای هر فرایند و حداکثر (most) یک بار به ازای هر نخ فراخوانی شوند، اما فراخوانیها همیشه جفت هستند؛ یعنی اگر نخی تابع اول را فراخوانی کند، تابع دوم را نیز فراخوانی خواهد کرد، مگر اینکه هرگز به نقطهٔ خروج تابعِ ابزاردقیقشده نرسد..IP -finstrument-functions-exclude-file-list=file,file,... 4 فهرست توابعی را مشخص میکند که از ابزارگذاری مستثنی میشوند (توضیحات مربوط به -finstrument-functions را ببینید). اگر فایلی که حاوی تعریف یک تابع است با یکی از موارد file مطابقت داشته باشد، آن تابع ابزارگذاری نمیشود. این مطابقت روی زیررشتهها انجام میشود: اگر پارامتر file زیررشتهای از نام فایل باشد، یک تطابق به حساب میآید.
برای مثال:
-finstrument-functions-exclude-file-list=/bits/stl,include/sys
هر تابع درونخطی (inline) تعریفشده در فایلهایی را که مسیر آنها شامل /bits/stl یا include/sys است مستثنی میکند.
اگر بنا به هر دلیلی میخواهید نویسهٔ , را در یکی از symها قرار دهید، , را بنویسید. برای مثال، -finstrument-functions-exclude-file-list=',,tmp' (به علامت نقلقول تکی در اطراف گزینه دقت کنید).
- -finstrument-functions-exclude-function-list=sym,sym,...
- این گزینه شبیه به -finstrument-functions-exclude-file-list است، با این تفاوت که فهرست نام توابعی را تعیین میکند که باید از ابزارگذاری مستثنی شوند. نام تابعی که تطبیق داده میشود، نام قابلمشاهده برای کاربر است، مانند "vector<int> blah(const vector<int> &)"، نه نام درهمریختهٔ داخلی (mangled name) آن (مانند "_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 مورد
استفاده با
دستورالعمل
صادرشده
توسط رابط
پشتی (back-end)
داخلی GCC
یعنی
"gen_nop"
مطابقت
دارد. این
رفتار مختص
هدف (target-specific) است
و ممکن است
به گونهٔ
معماری و/یا
سایر
گزینههای
کامپایل
نیز وابسته
باشد.
برای شناسایی در زمان اجرا، نشانیهای آغازین این نواحی (که معادل ورودیهای تابع مربوطه منهای M است) علاوه بر این در بخش "__patchable_function_entries" از باینری حاصل گردآوری میشوند.
توجه داشته باشید که مقدار "__attribute__ ((patchable_function_entry (N,M)))" بر گزینهٔ خط فرمان -fpatchable-function-entry=N,M اولویت دارد. از این ویژگی میتوان برای افزایش اندازهٔ ناحیه یا حذف کامل آن در یک تابع مجزا استفاده کرد. اگر "N=0" باشد، هیچ مکانی برای فاصلهگذاری ثبت نمیشود.
دستورالعملهای NOP در نشانی ورود تابع ‐ و بسته به M، شاید پیش از آن ‐، حتی پیش از دیباچه (prologue) درج میشوند. در PowerPC با ELFv2 ABI، برای تابعی با نقاط ورود دوگانه، نقطهٔ ورود محلی بهطور پیشفرض همان نشانی ورود تابع است. برای تغییر این مورد به گزینهٔ -msplit-patch-nops مراجعه کنید.
بیشینهٔ مقدار N و M برابر 65535 است. در PowerPC با ELFv2 ABI، برای تابعی با نقاط ورود دوگانه، مقادیر پشتیبانیشده برای M در صورت عدم استفاده از -msplit-patch-nops برابر با 0، 2، 6 و 14 هستند.
گزینههای واپایش پیشپردازنده (Options Controlling the Preprocessor)
این گزینهها پیشپردازندهٔ C را که پیش از کامپایل واقعی روی هر فایل مبدأ C اجرا میشود، کنترل میکنند.
اگر از گزینهٔ -E استفاده کنید، هیچ کاری جز پیشپردازش انجام نمیشود. برخی از این گزینهها تنها در کنار -E معنادار هستند چرا که باعث میشوند خروجی پیشپردازنده برای کامپایل واقعی نامناسب باشد.
علاوه بر گزینههای فهرستشده در اینجا، تعدادی گزینه برای مدیریت مسیرهای جستجوی فایلهای include وجود دارد که در Directory Options مستند شدهاند. گزینههای مربوط به کنترل پیامهای خطایابی (diagnostics) پیشپردازنده نیز در Warning Options فهرست شدهاند.
- -D name
- شناسهٔ name را بهعنوان یک ماکرو، با تعریف 1 از پیش تعریف میکند.
- -D name=definition
- محتوای definition
نشانهگذاری
(tokenize) شده و
بهگونهای
پردازش
میشود که
گویی در فاز
سوم ترجمه
درون یک
دستورالعمل
#define آمده است.
بهویژه،
تعریف با
نویسههای
خطجدیدِ
درونمتنی
بریده (قطع)
میشود.
اگر پیشپردازنده را از یک شل یا برنامهای شبیه به شل اجرا میکنید، ممکن است لازم باشد از قواعد نقلقول (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 داده شود، فایلها به ترتیبی که در خط فرمان آمدهاند گنجانده میشوند.
- -imacros file
- دقیقاً
شبیه به -include
است، با این
تفاوت که
هرگونه
خروجی
تولیدشده
از پیمایش
file دور
ریخته
میشود.
ماکروهایی
که تعریف
میکند
همچنان
تعریفشده
باقی
میمانند.
این قابلیت
به شما
امکان
میدهد
تمام
ماکروها را
از یک
سرآیند به
دست آورید
بدون آنکه
اعلانهای
آن پردازش
شوند.
تمامی فایلهای تعیینشده با -imacros پیش از تمامی فایلهای تعیینشده با -include پردازش میشوند.
- -undef
- از تعریف پیشفرض هرگونه ماکروی ویژهٔ سیستم یا ویژهٔ GCC جلوگیری میکند. ماکروهای استاندارد از پیش تعریفشده همچنان تعریفشده باقی میمانند.
- -pthread
- ماکروهای اضافی مورد نیاز برای استفاده از کتابخانهٔ ریسههای پازیکس (POSIX threads) را تعریف میکند. باید از این گزینه بهطور یکنواخت هم برای کامپایل و هم برای پیونددهی استفاده کنید. این گزینه در مقصدهای GNU/Linux، بیشتر مشتقات دیگر یونیکس، و همچنین در مقصدهای x86 در Cygwin و MinGW پشتیبانی میشود.
- -M
- بهجای
ارائهٔ
نتیجهٔ
پیشپردازش،
قاعدهای
مناسب برای
make در خروجی
تولید
میکند که
وابستگیهای
فایل منبع
اصلی را
توصیف
میکند.
پیشپردازنده
یک قاعدهٔ
make شامل نام
فایل شیء (object file)
برای آن
فایل منبع،
یک علامت
دونقطه، و
نام تمامی
فایلهای
گنجاندهشده
(شامل
فایلهایی
که از
گزینههای
خط فرمان -include
یا -imacros
آمدهاند)
صادر
میکند.
مگر اینکه بهطور صریح مشخص شده باشد (با -MT یا -MQ)، نام فایل شیء متشکل از نام فایل منبع است که پسوند آن با پسوند فایل شیء جایگزین شده و تمامی بخشهای دایرکتوری آغازین آن حذف شده است. اگر فایلهای گنجاندهشده زیادی وجود داشته باشند، قاعده با استفاده از \-خطجدید به چند خط تقسیم میشود. این قاعده هیچ فرمانی ندارد.
این گزینه خروجی اشکالزدایی پیشپردازنده مانند -dM را سرکوب نمیکند. برای جلوگیری از تداخل چنین خروجی اشکالزدایی با قواعد وابستگی، باید صریحاً فایل خروجی وابستگی را با -MF مشخص کنید، یا از یک متغیر محیط مانند DEPENDENCIES_OUTPUT استفاده نمایید. خروجی اشکالزدایی همچنان طبق معمول به جریان خروجی استاندارد ارسال میشود.
ارسال -M به گرداننده به منزلهٔ فعال بودن -E است، و هشدارها را با یک -w ضمنی سرکوب میکند.
- -MM
- مشابه -M
عمل میکند
اما به
فایلهای
سرآیندی که
در
دایرکتوریهای
سرآیند
سیستمی
قرار
دارند، و
نیز
فایلهای
سرآیندی که
بهطور
مستقیم یا
غیرمستقیم
از چنین
سرآیندی
گنجانده
شدهاند،
اشارهای
نمیکند.
این بدان معناست که انتخاب قلابهای زاویهدار (< >) یا نقلقولهای دوتایی در دستورالعمل #include بهخودیخود تعیین نمیکند که آیا آن سرآیند در خروجی وابستگی -MM ظاهر شود یا خیر.
- -MF file
- هنگامی که
همراه با -M
یا -MM
استفاده
شود، فایلی
را مشخص
میکند که
وابستگیها
در آن نوشته
شوند. اگر
هیچ سوئیچ
-MF داده
نشود،
پیشپردازنده
قواعد را به
همان مقصدی
ارسال
میکند که
خروجی
پیشپردازششده
را ارسال
میکرد.
هنگامی که همراه با گزینههای گردانندهٔ -MD یا -MMD استفاده شود، گزینهٔ -MF بر فایل خروجی وابستگی پیشفرض اولویت یافته و آن را بازنویسی میکند.
اگر مقدار file برابر با - باشد، وابستگیها در stdout نوشته میشوند..IP -MG 4 همراه با گزینهای مانند -M که درخواست تولید وابستگیها را دارد، -MG فایلهای سرآیند ناموجود را فایلهای تولیدشده فرض کرده و بدون ایجاد خطا آنها را به فهرست وابستگیها اضافه میکند. نام فایل وابستگی مستقیماً از دستورالعمل "#include" بدون افزودن هیچ مسیری به ابتدای آن گرفته میشود. -MG همچنین خروجی پیشپردازششده را متوقف میکند، زیرا یک فایل سرآیند ناموجود آن را بیفایده میسازد.
این ویژگی در بهروزرسانی خودکار makefileها استفاده میشود.
- -Mno-modules
- تولید وابستگی را برای رابطهای ماژول کامپایلشده غیرفعال میکند.
- -MP
- این گزینه
به CPP دستور
میدهد تا
یک هدف
ساختگی (phony target)
برای هر
وابستگی به
جز فایل
اصلی اضافه
کند، که
باعث
میشود هر
کدام به
چیزی
وابسته
نباشند. این
قواعد صوری
خطاهایی را
که make در
صورت حذف
فایلهای
سرآیند
بدون
بهروزرسانی
متناظر در
Makefile صادر
میکند،
دور
میزنند.
این یک خروجی نمونه است:
test.o: test.c test.h test.h:
- -MT target
- هدف
قاعدهای
را که با
تولید
وابستگی
صادر
میشود
تغییر
میدهد. به
طور
پیشفرض، CPP
نام فایل
ورودی اصلی
را گرفته،
تمام
بخشهای
دایرکتوری
و هرگونه
پسوند فایل
مانند .c را
حذف کرده، و
پسوند
معمول شیء (object)
پلتفرم را
اضافه
میکند.
نتیجه،
همان هدف
است.
یک گزینهٔ -MT هدف را دقیقاً همان رشتهای که مشخص میکنید قرار میدهد. اگر چند هدف میخواهید، میتوانید آنها را به عنوان یک آرگومان واحد به -MT مشخص کنید، یا از چندین گزینهٔ -MT استفاده نمایید.
برای مثال، -MT '$(objpfx)foo.o' ممکن است خروجی زیر را بدهد:
$(objpfx)foo.o: foo.c
- -MQ target
- مشابه -MT
است، اما
نویسههایی
را که برای Make
خاص هستند
نقلقول (quote)
میکند.
-MQ '$(objpfx)foo.o' این
خروجی را
میدهد:
$$(objpfx)foo.o: foo.c
هدف پیشفرض به طور خودکار نقلقول میشود، گویی با -MQ مشخص شده است.
- -MD
- گزینهٔ -MD
معادل -M -MF file
است، به جز
اینکه -E به
صورت ضمنی
اعمال
نمیشود.
راهانداز
(driver) مقدار file
را بر اساس
اینکه
گزینهٔ -o
داده شده
است یا خیر
تعیین
میکند. اگر
داده شده
باشد،
راهانداز
از آرگومان
آن اما با
پسوند .d
استفاده
میکند؛ در
غیر این
صورت نام
فایل ورودی
را گرفته،
تمام
بخشهای
دایرکتوری
و پسوند را
حذف کرده، و
پسوند .d را
اعمال
میکند.
اگر -MD همراه با -E استفاده شود، هر سوئیچ -o به عنوان مشخصکنندهٔ فایل خروجی وابستگی تلقی میشود، اما اگر بدون -E استفاده شود، هر -o مشخصکنندهٔ فایل شیء هدف خواهد بود.
از آنجا که -E به صورت ضمنی اعمال نمیشود، میتوان از -MD برای تولید فایل خروجی وابستگی به عنوان یک اثر جانبی از فرایند کامپایل استفاده کرد.
- -MMD
- مانند -MD است به جز اینکه تنها فایلهای سرآیند کاربر را ذکر میکند، نه فایلهای سرآیند سیستمی را.
- -fpreprocessed
- به
پیشپردازنده
نشان
میدهد که
فایل ورودی
از قبل
پیشپردازش
شده است.
این امر
مواردی
مانند بسط
ماکرو (macro expansion)،
تبدیل
سهنویسهها
(trigraph conversion)، پیوند
دادن
خطهای
جدید
گریزخورده
(escaped newline splicing)، و
پردازش
بیشتر
دستورالعملها
را متوقف
میکند.
پیشپردازنده
همچنان
توضیحها
(کامنتها)
را تشخیص
داده و حذف
میکند،
بنابراین
میتوانید
فایلی را که
با -C
پیشپردازش
شده است
بدون مشکل
به
کامپایلر
ارسال کنید.
در این
حالت،
پیشپردازندهٔ
یکپارچه
چیزی بیش از
یک
نشانهگذار
(tokenizer) برای
فرانتاندها
نخواهد بود.
اگر فایل ورودی یکی از پسوندهای .i، .ii یا .mi را داشته باشد، -fpreprocessed به صورت ضمنی فعال است. اینها پسوندهایی هستند که GCC برای فایلهای پیشپردازششدهٔ ایجادشده توسط -save-temps استفاده میکند.
- -fdirectives-only
- هنگام
پیشپردازش،
دستورالعملها
را پردازش
میکند اما
ماکروها را
بسط
نمیدهد.
رفتار این گزینه به گزینههای -E و -fpreprocessed بستگی دارد.
همراه با -E، پیشپردازش به رسیدگی به دستورالعملهایی مانند "#define"، "#ifdef" و "#error" محدود میشود. سایر عملیات پیشپردازنده مانند بسط ماکرو و تبدیل سهنویسهها انجام نمیشوند. علاوه بر این، گزینهٔ -dD به صورت ضمنی فعال میشود.
همراه با -fpreprocessed، تعریف پیشفرض ماکروهای خط فرمان و بیشتر ماکروهای توکار غیرفعال میشود. ماکروهایی مانند "__LINE__" که وابسته به زمینه هستند، به طور عادی پردازش میشوند. این امر امکان کامپایل فایلهایی را فراهم میکند که قبلاً با "-E -fdirectives-only" پیشپردازش شدهاند.
در صورت استفاده از هر دو گزینهٔ -E و -fpreprocessed، قواعد مربوط به -fpreprocessed تقدم دارند. این امر امکان پیشپردازش کامل فایلهایی را فراهم میسازد که قبلاً با "-E -fdirectives-only" پیشپردازش شدهاند.
- -fdollars-in-identifiers
- پذیرش نویسهٔ $ در شناسهها.
- -fextended-identifiers
- پذیرش نامهای نویسهٔ فراگیر (universal character names) و نویسههای گسترشیافته در شناسهها. این گزینه به طور پیشفرض برای C99 (و نسخههای بعدی استاندارد C) و C++ فعال است.
- -fno-canonical-system-headers
- هنگام پیشپردازش، مسیرهای سرآیند سیستمی را با متعارفسازی (canonicalization) کوتاه نمیکند.
- -fmax-include-depth=depth
- حداکثر عمق دستورهای #include تودرتو را تعیین میکند. مقدار پیشفرض ۲۰۰ است.
- -fsearch-include-path[=kind]
- جستجوی
فایلهای
ورودی در
مسیر #include، نه
فقط در
دایرکتوری
جاری. این
گزینه
بهویژه با
ماژولهای
C++20 کاربرد
دارد که در
آنها هم
واحدهای
سرآیند (header units) و
هم واحدهای
رابط ماژول
(module interface units) باید
مستقیماً
کامپایل
شوند:
g++ -c -std=c++20 -fmodules -fsearch-include-path bits/stdc++.h bits/std.cc
مقدار kind به طور پیشفرض user است که در مسیر جستجوی #include "..." به جستجو میپردازد؛ همچنین میتوانید برای مسیر جستجوی "#include <...>" به صورت صریح system را مشخص کنید.
- -ftabstop=width
- فاصلهٔ بین توقفهای تب (tab stops) را تعیین میکند. این امر به پیشپردازنده کمک میکند تا شماره ستونهای درستی را در هشدارها یا خطاها گزارش کند، حتی اگر تبها در خط وجود داشته باشند. اگر مقدار کمتر از ۱ یا بیشتر از ۱۰۰ باشد، گزینه نادیده گرفته میشود. مقدار پیشفرض ۸ است.
- -ftrack-macro-expansion[=level]
- موقعیت
نشانهها (tokens)
را در میان
بسطهای
ماکرو
ردیابی
میکند. این
قابلیت به
کامپایلر
اجازه
میدهد تا
هنگام وقوع
خطای
کامپایل در
بسط ماکرو،
اطلاعات
تشخیصی
دربارهٔ
پشتهٔ بسط
ماکروی
فعلی صادر
کند.
استفاده از
این گزینه
باعث مصرف
حافظهٔ
بیشتر توسط
پیشپردازنده
و کامپایلر
میشود.
پارامتر level
میتواند
برای تعیین
سطح دقت در
ردیابی
موقعیت
نشانهها و
در نتیجه
کاهش مصرف
حافظه در
صورت لزوم
استفاده
شود. مقدار
0 برای level
این گزینه
را غیرفعال
میکند.
مقدار 1
موقعیت
نشانهها
را به صورت
تنزلیافته
و به جهت
حداقل بار
اضافی
حافظه
ردیابی
میکند. در
این حالت،
تمامی
نشانههای
حاصل از بسط
یک آرگومان
ماکروی
تابعگونه
موقعیت
یکسانی
خواهند
داشت. مقدار
2 موقعیت
نشانهها
را به طور
کامل
ردیابی
میکند. این
مقدار
بیشترین
میزان
حافظه را
مصرف
میکند.
هنگامی که
این گزینه
بدون
آرگومان
مشخص شود،
مقدار
پیشفرض
پارامتر 2
خواهد بود.
توجه داشته باشید که "-ftrack-macro-expansion=2" به طور پیشفرض فعال است.
- -fmacro-prefix-map=old=new
- هنگام پیشپردازش فایلهای مستقر در دایرکتوری old، ماکروهای "__FILE__" و "__BASE_FILE__" را طوری بسط میدهد که گویی فایلها در دایرکتوری new قرار دارند. این گزینه میتواند با استفاده از . برای new جهت تغییر یک مسیر مطلق به یک مسیر نسبی به کار رود، که میتواند به ساختهای بازتولیدپذیرتر و مستقل از مکان منجر شود. این گزینه همچنین بر "__builtin_FILE()" در حین کامپایل اثر میگذارد. همچنین نگاه کنید به -ffile-prefix-map و -fcanon-prefix-map.
- -fexec-charset=charset
- مجموعه نویسهٔ اجرایی مورد استفاده برای ثابتهای رشتهای و نویسهای را تعیین میکند. مقدار پیشفرض UTF-8 است. charset میتواند هر کدگذاری پشتیبانیشده توسط روتین کتابخانهای "iconv" در سیستم باشد.
- -fwide-exec-charset=charset
- مجموعه نویسهٔ اجرایی عریض مورد استفاده برای ثابتهای رشتهای و نویسهای عریض را تعیین میکند. مقدار پیشفرض یکی از گزینههای UTF-32BE، UTF-32LE، UTF-16BE یا UTF-16LE است، بسته به اینکه کدامیک با عرض "wchar_t" و ترتیب بایت بزرگاندیان (big-endian) یا کوچکاندیان (little-endian) مورد استفاده برای تولید کد مطابقت دارد. همانند -fexec-charset، مقدار charset میتواند هر کدگذاری پشتیبانیشده توسط روتین کتابخانهای "iconv" در سیستم باشد؛ با این حال، با کدگذاریهایی که دقیقاً در "wchar_t" جای نمیگیرند، با مشکل مواجه خواهید شد..IP -finput-charset=charset 4 مجموعه نویسههای ورودی را تعیین میکند که برای تبدیل از مجموعه نویسههای فایل ورودی به مجموعه نویسههای مبدأ مورد استفاده توسط GCC به کار میرود. اگر محلیسازی (locale) آن را مشخص نکند، یا GCC نتواند این اطلاعات را از محلیسازی دریافت کند، مقدار پیشفرض UTF-8 است. این مقدار میتواند توسط محلیسازی یا این گزینه خط فرمان لغو شود. در حال حاضر در صورت بروز تداخل، اولویت با این گزینه خط فرمان است. charset میتواند هر کدگذاری پشتیبانیشده توسط روال کتابخانهای "iconv" سیستم باشد.
- -fpch-deps
- هنگام استفاده از سرآیندهای ازپیشکامپایلشده، این پرچم باعث میشود که پرچمهای خروجی وابستگی، فایلهای برگرفته از وابستگیهای سرآیند ازپیشکامپایلشده را نیز فهرست کنند. اگر مشخص نشود، تنها خود سرآیند ازپیشکامپایلشده فهرست میشود و نه فایلهایی که برای ایجاد آن استفاده شدهاند، زیرا هنگام استفاده از یک سرآیند ازپیشکامپایلشده به آن فایلها رجوع نمیشود.
- -fpch-preprocess
- این گزینه
امکان
استفاده از
یک سرآیند
ازپیشکامپایلشده
را همراه با
-E فراهم
میکند. این
گزینه یک
"#pragma"
خاص، به
صورت "#pragma GCC
pch_preprocess
"filename""
را در خروجی
درج میکند
تا مکانی که
سرآیند
ازپیشکامپایلشده
در آن یافت
شد و filename آن
را
علامتگذاری
کند. هنگامی
که -fpreprocessed در
حال
استفاده
باشد، GCC این
"#pragma" را
تشخیص داده
و PCH را
بارگذاری
میکند.
این گزینه به طور پیشفرض غیرفعال است، زیرا خروجی پیشپردازششده حاصل تنها به عنوان ورودی برای GCC واقعاً مناسب است. این گزینه توسط -save-temps فعال میشود.
نباید این "#pragma" را در کد خود بنویسید، اما در صورتی که فایل PCH در مکان دیگری در دسترس باشد، ویرایش نام فایل بیخطر است. نام فایل ممکن است مطلق باشد یا نسبت به دایرکتوری جاری GCC به صورت نسبی تعیین شود.
- -fworking-directory
- تولید نشانگرهای خط (linemarkers) را در خروجی پیشپردازنده فعال میکند تا کامپایلر از دایرکتوری کاری جاری در زمان پیشپردازش آگاه شود. هنگامی که این گزینه فعال باشد، پیشپردازنده پس از نشانگر خط اولیه، نشانگر خط دومی را همراه با دایرکتوری کاری جاری و به دنبال آن دو اسلش صادر میکند. در صورت وجود این دایرکتوری در ورودی پیشپردازششده، GCC از آن به عنوان دایرکتوری صادرشده تحت عنوان دایرکتوری کاری جاری در برخی از قالبهای اطلاعات اشکالزدایی استفاده میکند. این گزینه در صورت فعال بودن اطلاعات اشکالزدایی به صورت ضمنی فعال میشود، اما میتوان با شکل نقیض -fno-working-directory از آن جلوگیری کرد. اگر پرچم -P در خط فرمان وجود داشته باشد، این گزینه هیچ اثری ندارد، زیرا اصلاً هیچ دستورالعمل "#line" صادر نمیشود.
- -A predicate=answer
- یک تصدیق (assertion) با گزاره predicate و پاسخ answer ایجاد میکند. این فرم نسبت به فرم قدیمیتر -A predicate(answer)، که هنوز پشتیبانی میشود، ترجیح داده میشود زیرا از نویسههای خاص شل استفاده نمیکند.
- -A -predicate=answer
- یک تصدیق را با گزاره predicate و پاسخ answer لغو میکند.
- -C
- کامنتها
را دور
نمیاندازد.
تمام
کامنتها
به فایل
خروجی
منتقل
میشوند،
به جز
کامنتهای
درون
دستورالعملهای
پردازششده
که همراه با
خود
دستورالعمل
حذف
میشوند.
هنگام استفاده از -C باید برای عوارض جانبی آماده باشید؛ این گزینه باعث میشود که پیشپردازنده با کامنتها به عنوان نشانهها (tokens) مستقل رفتار کند. برای مثال، کامنتهایی که در ابتدای یک خط دستورالعمل ظاهر میشوند، باعث تبدیل آن خط به یک خط کد مبدأ معمولی میشوند، زیرا اولین نشانه در خط دیگر # نیست.
- -CC
- کامنتها
را دور
نمیاندازد،
از جمله در
حین بسط
ماکرو. این
گزینه
مانند -C
است، با این
تفاوت که
کامنتهای
درون
ماکروها
نیز در جایی
که ماکرو
بسط
مییابد به
فایل خروجی
منتقل
میشوند.
علاوه بر عوارض جانبی گزینه -C، گزینه -CC باعث میشود تمام کامنتهای به سبک ++C درون یک ماکرو به کامنتهای به سبک C تبدیل شوند. این کار برای جلوگیری از آن است که استفادههای بعدی از آن ماکرو ناخواسته باقیمانده خط مبدأ را به کامنت تبدیل کند.
گزینه -CC عموماً برای پشتیبانی از کامنتهای lint استفاده میشود.
- -P
- مانع تولید نشانگرهای خط در خروجی پیشپردازنده میشود. این ویژگی ممکن است زمانی مفید باشد که پیشپردازنده روی چیزی غیر از کد C اجرا میشود و خروجی قرار است به برنامهای ارسال شود که ممکن است توسط نشانگرهای خط دچار سردرگمی شود.
- -traditional
- -traditional-cpp
- سعی میکند
رفتار
پیشپردازندههای
C پیش از
استاندارد
را، برخلاف
پیشپردازندههای
ISO C، تقلید
کند. برای
جزئیات به
دفترچه
راهنمای GNU CPP
مراجعه
کنید.
توجه داشته باشید که GCC در غیر این صورت تلاشی برای شبیهسازی یک کامپایلر C پیش از استاندارد نمیکند، و این گزینهها تنها همراه با سوییچ -E یا هنگام فراخوانی صریح CPP پشتیبانی میشوند.
- -trigraphs
- از
سهنگارههای
(trigraphs)
استاندارد
ISO C پشتیبانی
میکند.
اینها
توالیهای
سه
نویسهای
هستند که
همگی با ??
آغاز شده و
توسط ISO C برای
نشان دادن
نویسههای
تکی تعریف
شدهاند.
برای مثال،
??/
نشاندهنده
\ است،
بنابراین
'??/n' یک ثابت
نویسهای
برای خط
جدید است.
نه سهنگاره و جایگزینهای آنها عبارتند از:
Trigraph: ??( ??) ??< ??> ??= ??/ ??' ??! ??- Replacement: [ ] { } # \ ^ | ~به طور پیشفرض، GCC سهنگارهها را نادیده میگیرد، اما در حالتهای منطبق بر استاندارد آنها را تبدیل میکند. گزینههای -std و -ansi را ببینید.
- -remap
- کد ویژهای را برای دور زدن محدودیت سیستمفایلهایی فعال میکند که تنها نام فایلهای بسیار کوتاه را مجاز میدانند، مانند MS-DOS.
- -H
- علاوه بر فعالیتهای معمول دیگر، نام هر فایل سرآیند استفادهشده را چاپ میکند. هر نام دندانهدار میشود تا مشخص شود در چه عمقی از پشته #include قرار دارد. فایلهای سرآیند ازپیشکامپایلشده نیز چاپ میشوند، حتی اگر نامعتبر تشخیص داده شوند؛ یک فایل سرآیند ازپیشکامپایلشده نامعتبر با ...x و یک فایل معتبر با ...! چاپ میشود.
- -dletters
- مشخص میکند که در حین کامپایل، دامپهای اشکالزدایی مطابق با موارد تعیینشده در letters ایجاد شوند. پرچمهای مستندشده در اینجا مواردی هستند که به پیشپردازنده مربوط میشوند. سایر letters توسط خود کامپایلر تفسیر شده، یا برای نسخههای آینده GCC رزرو شدهاند، و بنابراین بدون اخطار نادیده گرفته میشوند. اگر حروفی (letters) را مشخص کنید که رفتاری متناقض دارند، نتیجه تعریفنشده خواهد بود.
- -dM
- به جای
خروجی
معمول،
فهرستی از
دستورالعملهای
#define را برای
تمام
ماکروهای
تعریفشده
در طول
اجرای
پیشپردازنده،
از جمله
ماکروهای
ازپیشتعریفشده،
تولید
میکند. این
امکان به
شما اجازه
میدهد تا
دریابید چه
مواردی در
نسخه
پیشپردازنده
شما از پیش
تعریف
شدهاند. با
فرض اینکه
فایلی به
نام foo.h
ندارید،
دستور
touch foo.h; cpp -dM foo.h
تمام ماکروهای ازپیشتعریفشده را نشان میدهد.
اگر از -dM بدون گزینه -E استفاده کنید، -dM به عنوان مترادفی برای -fdump-rtl-mach تفسیر میشود.
- -dD
- مانند -dM است با این تفاوت که هم دستورالعملهای #define و هم نتیجه پیشپردازش را در خروجی درج میکند. هر دو نوع خروجی به فایل خروجی استاندارد ارسال میشوند.
- -dN
- مانند -dD است، اما تنها نام ماکروها را صادر میکند و نه بسطیافتههای آنها را.
- -dI
- دستورالعملهای #include را علاوه بر نتیجه پیشپردازش در خروجی میآورد.
- -dU
- مانند -dD است، با این تفاوت که تنها ماکروهایی خروجی داده میشوند که بسط داده شده باشند، یا تعریفشدن آنها در دستورالعملهای پیشپردازنده بررسی شده باشد؛ خروجی تا زمان استفاده یا بررسی ماکرو به تعویق میافتد؛ و دستورالعملهای #undef نیز برای ماکروهایی که بررسی شده اما در آن زمان تعریف نشدهاند، در خروجی صادر میشوند.
- -fdebug-cpp
- این گزینه
تنها برای
اشکالزدایی
GCC مفید است.
هنگامی که
از طریق CPP یا
همراه با -E
استفاده
شود،
اطلاعات
اشکالزدایی
مربوط به
نگاشتهای
مکان (location maps) را
دامپ
میکند. در
خروجی، پیش
از هر
نشانه،
دامپ
نگاشتی که
مکان آن
نشانه به آن
تعلق دارد
درج میشود.
هنگامی که این گزینه از طریق GCC بدون -E استفاده شود، هیچ اثری ندارد..IP -Wp,option 4 میتوانید از -Wp,option برای دور زدن گرداننده کامپایلر و ارسال مستقیم option به پیشپردازنده استفاده کنید. اگر option حاوی کاما باشد، در محل کاماها به چند گزینه تفکیک میشود. با این حال، بسیاری از گزینهها پیش از ارسال به پیشپردازنده توسط گرداننده کامپایلر اصلاح، ترجمه یا تفسیر میشوند و -Wp این مرحله را بهاجبار دور میزند. رابط کاربری مستقیم پیشپردازنده مستند نشده و در معرض تغییر است، بنابراین در صورت امکان باید از بهکارگیری -Wp خودداری کنید و اجازه دهید خود گرداننده گزینهها را مدیریت کند.
- -Xpreprocessor option
- ارسال option
بهعنوان
گزینهای
به
پیشپردازنده.
میتوانید
از این
گزینه برای
تعیین
گزینههای
پیشپردازندهٔ
مختص
سیستمی که GCC
آنها را
شناسایی
نمیکند
استفاده
کنید.
اگر میخواهید گزینهای را ارسال کنید که آرگومان میپذیرد، باید از -Xpreprocessor دو بار استفاده کنید؛ یکبار برای گزینه و یکبار برای آرگومان.
- -no-integrated-cpp
- انجام پیشپردازش بهعنوان یک گذر جداگانه پیش از کامپایل. بهطور پیشفرض، GCC پیشپردازش را بهعنوان بخشی یکپارچه از توکنبندی و تجزیهٔ ورودی انجام میدهد. اگر این گزینه مشخص شود، فرانتاند زبان مربوطه (cc1، cc1plus یا cc1obj بهترتیب برای C، C++ و Objective-C) در عوض دو بار فراخوانی میشود؛ یکبار فقط برای پیشپردازش و یکبار برای کامپایل واقعی ورودیِ پیشپردازششده. این گزینه ممکن است همراه با گزینههای -B یا -wrapper برای تعیین یک پیشپردازندهٔ جایگزین یا انجام پردازش بیشتر روی کد منبع برنامه بین پیشپردازش عادی و کامپایل مفید باشد.
ارسال گزینهها به اسمبلر (Passing Options to the Assembler)
میتوانید گزینهها را به اسمبلر ارسال کنید.
- -Wa,option
- ارسال option بهعنوان گزینهای به اسمبلر. اگر option حاوی کاما باشد، در محل کاماها به چندین گزینه تفکیک میشود.
- -Xassembler option
- ارسال option
بهعنوان
گزینهای
به اسمبلر.
میتوانید
از این
گزینه برای
تعیین
گزینههای
اسمبلرِ
مختص
سیستمی که GCC
آنها را
شناسایی
نمیکند
استفاده
کنید.
اگر میخواهید گزینهای را ارسال کنید که آرگومان میپذیرد، باید از -Xassembler دو بار استفاده کنید؛ یکبار برای گزینه و یکبار برای آرگومان.
گزینههای پیوند دادن (Options for Linking)
این گزینهها زمانی به کار میآیند که کامپایلر فایلهای شیء را به یک فایل خروجی اجرایی پیوند میدهد. اگر کامپایلر مرحلهٔ پیوند را انجام ندهد، این گزینهها بیمعنی هستند.
- object-file-name
- نام فایلی که به پسوند شناختهشدهٔ خاصی ختم نشود، بهعنوان نام یک فایل شیء یا کتابخانه در نظر گرفته میشود. (پیونددهنده فایلهای شیء را بر اساس محتوای فایل از کتابخانهها متمایز میکند.) در صورت انجام پیوند، این فایلهای شیء بهعنوان ورودی پیونددهنده استفاده میشوند.
- -c
- -S
- -E
- اگر از هر یک از این گزینهها استفاده شود، پیونددهنده اجرا نمیشود و نباید از نام فایلهای شیء بهعنوان آرگومان استفاده کرد.
- -flinker-output=type
- این گزینه
تولید کدِ
بهینهساز
زمان پیوند
را کنترل
میکند.
بهطور
پیشفرض
خروجی
پیونددهنده
بهطور
خودکار
توسط
پلاگین
پیونددهنده
تعیین
میشود.
برای
اشکالزدایی
کامپایلر و
در صورتی که
پیوند
افزایشی با
یک فایل شیء
غیر LTO مورد
نیاز باشد،
ممکن است
کنترل دستی
این نوع
مفید باشد.
اگر type مقدار exec باشد، تولید کد یک باینری ایستا ایجاد میکند. در این حالت -fpic و -fpie هر دو غیرفعال میشوند.
اگر type مقدار dyn باشد، تولید کد یک کتابخانهٔ اشتراکی ایجاد میکند. در این حالت -fpic یا -fPIC حفظ میشود، اما بهطور خودکار فعال نمیگردد. این امر امکان ساخت کتابخانههای اشتراکی را بدون کد مستقل از موقعیت در معماریهایی که این کار امکانپذیر است (مانند x86) فراهم میسازد.
اگر type مقدار pie باشد، تولید کد یک فایل اجرایی -fpie ایجاد میکند. این حالت منجر به بهینهسازیهای مشابهی با exec میشود، به جز اینکه اگر -fpie در زمان کامپایل مشخص شده باشد، غیرفعال نمیشود.
اگر type مقدار rel باشد، کامپایلر فرض میکند که پیوند افزایشی انجام میشود. بخشهای حاوی کد میانی برای بهینهسازی زمان پیوند ادغام و از پیش بهینهسازی شده و در فایل شیء حاصل خروجی داده میشوند. علاوه بر این، در صورت مشخص بودن -ffat-lto-objects، کد باینری برای پیوندهای غیر LTO آینده تولید میشود. فایل شیء حاصل از پیوند افزایشی، کوچکتر از یک کتابخانهٔ ایستا است که از همان فایلهای شیء ساخته شده باشد. در زمان پیوند، با فرض اینکه اکثر اشیاء کتابخانه استفاده شوند، نتیجهٔ پیوند افزایشی سریعتر از یک کتابخانهٔ ایستا بارگذاری میشود.
در نهایت nolto-rel کامپایلر را برای پیوند افزایشی بهگونهای پیکربندی میکند که تولید کد اجباری میشود، یک باینری نهایی تولید شده و کد میانی برای بهینهسازی زمان پیوند بعدی حذف میگردد. هنگامی که چندین فایل شیء با یکدیگر پیوند داده میشوند، کد حاصل در مقایسه با زمانی که بهینهسازیهای زمان پیوند غیرفعال است بهتر بهینهسازی میشود (برای مثال، درونریزی میانماژولی رخ میدهد)، اما بیشتر مزایای بهینهسازی کل برنامه از بین میرود.
در حین پیوند افزایشی (با -r) پلاگین پیونددهنده بهطور پیشفرض از rel استفاده میکند. با این حال، با رابطهای فعلی GNU Binutils، پیوند افزایشی اشیاء LTO و اشیاء غیر LTO در یک فایل شیء ترکیبیِ واحد امکانپذیر نیست. اگر هر یک از فایلهای شیء در پیوند افزایشی نتواند برای بهینهسازی زمان پیوند استفاده شود، پلاگین پیونددهنده هشداری صادر کرده و از nolto-rel استفاده میکند. برای حفظ بهینهسازی کل برنامه، توصیه میشود در عوض چنین اشیایی به یک کتابخانهٔ ایستا پیوند داده شوند. روش جایگزین این است که از binutils مربوط به H.J. Lu با پشتیبانی از اشیاء ترکیبی استفاده شود.
- -fuse-ld=bfd
- استفاده از پیونددهندهٔ bfd به جای پیونددهندهٔ پیشفرض.
- -fuse-ld=gold
- استفاده از پیونددهندهٔ gold به جای پیونددهندهٔ پیشفرض.
- -fuse-ld=lld
- استفاده از پیونددهندهٔ 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 ارجاع داده باشد، ممکن است آن توابع بارگذاری نشوند.
- -lobjc
- برای پیوند دادن یک برنامهٔ Objective-C یا Objective-C++ به این حالت خاص از گزینهٔ -l نیاز دارید.
- -nostartfiles
- عدم استفاده از فایلهای راهاندازی استاندارد سیستم هنگام پیوند دادن. کتابخانههای استاندارد سیستم بهصورت عادی استفاده میشوند، مگر اینکه از -nostdlib، -nolibc یا -nodefaultlibs استفاده شود.
- -nodefaultlibs
- عدم
استفاده از
کتابخانههای
استاندارد
سیستم
هنگام
پیوند دادن.
تنها
کتابخانههایی
که مشخص
میکنید به
پیونددهنده
ارسال
میشوند، و
گزینههای
تعیینکنندهٔ
پیوند
کتابخانههای
سیستم،
مانند -static-libgcc
یا -shared-libgcc
نادیده
گرفته
میشوند.
فایلهای
راهاندازی
استاندارد
بهصورت
عادی
استفاده
میشوند،
مگر اینکه
از -nostartfiles
استفاده
شود.
کامپایلر ممکن است فراخوانیهایی به "memcmp"، "memset"، "memcpy" و "memmove" تولید کند. این شناسهها معمولاً توسط موارد موجود در libc حل میشوند. هنگام تعیین این گزینه، این نقاط ورود باید از طریق سازوکار دیگری فراهم گردند..IP -nolibc 4 هنگام پیوند دادن، از کتابخانهٔ C یا کتابخانههای سیستمی که پیوند نزدیکی با آن دارند استفاده نکن. همچنان به فایلهای راهاندازی، libgcc یا کتابخانههای پشتیبانی زبان ارائهشده توسط زنجیره ابزار مانند libgnat، libgfortran یا libstdc++ پیوند بده، مگر اینکه گزینههایی که از گنجاندن آنها جلوگیری میکنند نیز استفاده شده باشند. این گزینه معمولاً -lc و همچنین کتابخانههای سیستمی را که معمولاً با آن همراه هستند و در صورت فرض نبود کتابخانهٔ C بیمعنی میشوند (برای مثال -lpthread یا -lm در برخی پیکربندیها) از خط فرمان پیوند حذف میکند. این گزینه برای اهداف bare-board که در واقع هیچ کتابخانهٔ C برای آنها در دسترس نیست در نظر گرفته شده است.
- -nostdlib
- هنگام
پیوند
دادن، از
فایلهای
راهاندازی
یا
کتابخانههای
استاندارد
سیستم
استفاده
نکن. هیچ
فایل
راهاندازی
به
پیونددهنده
ارسال
نمیشود و
تنها
کتابخانههایی
که مشخص
میکنید
ارسال
میگردند،
و
گزینههایی
که پیوند
کتابخانههای
سیستم را
تعیین
میکنند،
مانند -static-libgcc
یا -shared-libgcc،
نادیده
گرفته
میشوند.
کامپایلر ممکن است فراخوانیهایی به "memcmp"، "memset"، "memcpy" و "memmove" تولید کند. این مدخلها معمولاً توسط مدخلهای موجود در libc رفع وابستگی میشوند. هنگامی که این گزینه مشخص میشود، این نقاط ورودی باید از طریق سازوکار دیگری فراهم شوند.
یکی از کتابخانههای استانداردی که توسط -nostdlib و -nodefaultlibs نادیده گرفته میشود libgcc.a است؛ کتابخانهای از زیرروالهای داخلی که GCC برای غلبه بر محدودیتهای ماشینهای خاص یا نیازهای ویژهٔ برخی زبانها استفاده میکند.
در بیشتر موارد، حتی زمانی که میخواهید از سایر کتابخانههای استاندارد اجتناب کنید، به libgcc.a نیاز دارید. به عبارت دیگر، هنگامی که -nostdlib یا -nodefaultlibs را مشخص میکنید، معمولاً باید -lgcc را نیز تعیین نمایید. این کار تضمین میکند که هیچ ارجاع رفعنشدهای به زیرروالهای داخلی کتابخانهٔ GCC نخواهید داشت. (یک نمونه از چنین زیرروال داخلی "__main" است که برای اطمینان از فراخوانی سازندههای C++ استفاده میشود.)
- -nostdlib++
- به صورت ضمنی با کتابخانههای استاندارد C++ پیوند برقرار نکن.
- -e entry
- --entry=entry
- مشخص میکند که نقطهٔ ورود برنامه entry است. این آرگومان توسط پیونددهنده تفسیر میشود؛ پیونددهندهٔ GNU یک نام نماد یا یک نشانی را میپذیرد.
- -pie
- در اهدافی که از آن پشتیبانی میکنند، یک فایل اجرایی مستقل از موقعیت با پیوند پویا تولید کن. برای نتایج قابل پیشبینی، هنگام مشخص کردن این گزینهٔ پیونددهنده، باید همان مجموعه گزینههایی را که برای کامپایل استفاده شدهاند (-fpie، -fPIE، یا زیرگزینههای مربوط به مدل) نیز مشخص کنید.
- -no-pie
- یک فایل اجرایی مستقل از موقعیت با پیوند پویا تولید نکن.
- -static-pie
- در اهدافی که از آن پشتیبانی میکنند، یک فایل اجرایی مستقل از موقعیت ایستا تولید کن. یک فایل اجرایی مستقل از موقعیت ایستا مشابه یک فایل اجرایی ایستا است، اما میتواند بدون یک پیونددهندهٔ پویا در هر نشانی بارگذاری شود. برای نتایج قابل پیشبینی، هنگام مشخص کردن این گزینهٔ پیونددهنده، باید همان مجموعه گزینههایی را که برای کامپایل استفاده شدهاند (-fpie، -fPIE، یا زیرگزینههای مربوط به مدل) نیز مشخص کنید.
- -pthread
- با کتابخانهٔ ریسههای POSIX پیوند بده. این گزینه روی اهداف GNU/Linux، بیشتر مشتقات دیگر Unix، و همچنین روی اهداف x86 Cygwin و MinGW پشتیبانی میشود. در برخی اهداف، این گزینه همچنین پرچمهایی را برای پیشپردازنده تنظیم میکند، بنابراین باید به طور هماهنگ هم برای کامپایل و هم برای پیوند استفاده شود.
- -r
- یک شیء با قابلیت جابهجایی به عنوان خروجی تولید کن. این عمل به عنوان پیوند جزئی نیز شناخته میشود.
- -rdynamic
- روی اهدافی که از آن پشتیبانی میکنند، پرچم -export-dynamic را به پیونددهندهٔ ELF ارسال کن. این دستور به پیونددهنده میگوید که تمام نمادها، و نه فقط نمادهای استفادهشده، را به جدول نمادهای پویا اضافه کند. این گزینه برای برخی از کاربردهای "dlopen" یا برای امکان دریافت backtrace از درون یک برنامه مورد نیاز است.
- -s
- تمام اطلاعات جدول نمادها و جابهجایی را از فایل اجرایی حذف کن.
- -static
- در سیستمهایی که از پیوند پویا پشتیبانی میکنند، این گزینه بر -pie اولویت دارد و از پیوند با کتابخانههای مشترک جلوگیری میکند. در سایر سیستمها، این گزینه تاثیری ندارد.
- یک شیء مشترک تولید کن که سپس میتواند با اشیاء دیگر برای تشکیل یک فایل اجرایی پیوند داده شود. همهٔ سیستمها از این گزینه پشتیبانی نمیکنند. برای نتایج قابل پیشبینی، هنگام مشخص کردن این گزینهٔ پیونددهنده، باید همان مجموعه گزینههایی را که برای کامپایل استفاده شدهاند (-fpic، -fPIC، یا زیرگزینههای مربوط به مدل) نیز مشخص کنید.[1]
- -static-libgcc
- در
سیستمهایی
که libgcc را به
عنوان یک
کتابخانهٔ
مشترک
ارائه
میدهند،
این
گزینهها
به ترتیب
استفاده از
نسخهٔ
مشترک یا
ایستا را
اجباری
میکنند.
اگر هنگام
پیکربندی
کامپایلر
هیچ نسخهٔ
مشترکی از
libgcc ساخته
نشده باشد،
این
گزینهها
بیتاثیر
خواهند بود.
موقعیتهای متعددی وجود دارد که در آنها یک برنامه باید به جای نسخهٔ ایستا، از نسخهٔ مشترک libgcc استفاده کند. رایجترین مورد زمانی است که برنامه میخواهد استثناها را در بین کتابخانههای مشترک مختلف پرتاب و دریافت کند. در آن صورت، هر یک از کتابخانهها و همچنین خود برنامه باید از libgcc مشترک استفاده کنند.
بنابراین، راهانداز G++ هر زمان که یک کتابخانهٔ مشترک یا یک فایل اجرایی اصلی بسازید، به طور خودکار -shared-libgcc را اضافه میکند؛ زیرا برنامههای C++ معمولاً از استثناها استفاده میکنند، و در نتیجه این کارِ درستی است.
اگر در عوض، از راهانداز GCC برای ایجاد کتابخانههای مشترک استفاده کنید، ممکن است متوجه شوید که آنها همیشه با libgcc مشترک پیوند داده نمیشوند. اگر GCC در زمان پیکربندی خود تشخیص دهد که شما یک پیونددهندهٔ غیر GNU دارید، یا پیونددهندهٔ GNU دارید که از گزینهٔ --eh-frame-hdr پشتیبانی نمیکند، به طور پیشفرض نسخهٔ مشترک libgcc را در کتابخانههای مشترک پیوند میدهد. در غیر این صورت، از قابلیتهای پیونددهنده بهره برده و پیوند با نسخهٔ مشترک libgcc را بهینهسازی و حذف میکند، و به طور پیشفرض با نسخهٔ ایستای libgcc پیوند میدهد. این امر اجازه میدهد تا استثناها بدون تحمیل هزینههای جابهجایی در زمان بارگذاری کتابخانه، در چنین کتابخانههای مشترکی منتشر شوند.
با این حال، اگر قرار است یک کتابخانه یا فایل اجرایی اصلی استثناها را پرتاب یا دریافت کند، باید آن را با استفاده از راهانداز G++ یا با استفاده از گزینهٔ -shared-libgcc پیوند دهید تا با libgcc مشترک پیوند داده شود.
- -static-libasan
- هنگامی که گزینهٔ -fsanitize=address برای پیوند یک برنامه استفاده میشود، راهانداز GCC به طور خودکار با libasan پیوند برقرار میکند. اگر libasan به صورت یک کتابخانهٔ مشترک در دسترس باشد و از گزینهٔ -static استفاده نشده باشد، آنگاه این پیوند با نسخهٔ مشترک libasan برقرار میشود. گزینهٔ -static-libasan راهانداز GCC را هدایت میکند تا libasan را به صورت ایستا پیوند دهد، بدون اینکه لزوماً سایر کتابخانهها را به صورت ایستا پیوند دهد.
- -static-libtsan
- هنگامی که گزینهٔ -fsanitize=thread برای پیوند یک برنامه استفاده میشود، راهانداز GCC به طور خودکار با libtsan پیوند برقرار میکند. اگر libtsan به صورت یک کتابخانهٔ مشترک در دسترس باشد و از گزینهٔ -static استفاده نشده باشد، آنگاه این پیوند با نسخهٔ مشترک libtsan برقرار میشود. گزینهٔ -static-libtsan راهانداز GCC را هدایت میکند تا libtsan را به صورت ایستا پیوند دهد، بدون اینکه لزوماً سایر کتابخانهها را به صورت ایستا پیوند دهد.
- -static-liblsan
- هنگامی که گزینهٔ -fsanitize=leak برای پیوند یک برنامه استفاده میشود، راهانداز GCC به طور خودکار با liblsan پیوند برقرار میکند. اگر liblsan به صورت یک کتابخانهٔ مشترک در دسترس باشد و از گزینهٔ -static استفاده نشده باشد، آنگاه این پیوند با نسخهٔ مشترک liblsan برقرار میشود. گزینهٔ -static-liblsan راهانداز GCC را هدایت میکند تا liblsan را به صورت ایستا پیوند دهد، بدون اینکه لزوماً سایر کتابخانهها را به صورت ایستا پیوند دهد.
- -static-libubsan
- هنگامی که گزینهٔ -fsanitize=undefined برای پیوند یک برنامه استفاده میشود، راهانداز GCC به طور خودکار با libubsan پیوند برقرار میکند. اگر libubsan به صورت یک کتابخانهٔ مشترک در دسترس باشد و از گزینهٔ -static استفاده نشده باشد، آنگاه این پیوند با نسخهٔ مشترک libubsan برقرار میشود. گزینهٔ -static-libubsan راهانداز GCC را هدایت میکند تا libubsan را به صورت ایستا پیوند دهد، بدون اینکه لزوماً سایر کتابخانهها را به صورت ایستا پیوند دهد.
- -static-libstdc++
- هنگامی که برنامهٔ g++ برای پیوند دادن یک برنامهٔ C++ استفاده میشود، معمولاً به طور خودکار با libstdc++ پیوند میخورد. اگر libstdc++ به عنوان یک کتابخانهٔ مشترک در دسترس باشد و از گزینهٔ -static استفاده نشده باشد، آنگاه این پیوند با نسخهٔ مشترک libstdc++ برقرار میشود. این مورد در حالت عادی مشکلی ندارد. با این حال، گاهی اوقات مفید است که نسخهٔ libstdc++ استفادهشده توسط برنامه را بدون نیاز به یک پیوند کاملاً ایستا، تثبیت کنید. گزینهٔ -static-libstdc++ راهانداز g++ را هدایت میکند تا libstdc++ را به صورت ایستا پیوند دهد، بدون اینکه لزوماً سایر کتابخانهها را به صورت ایستا پیوند دهد..IP -symbolic 4 هنگام ساخت یک شیء اشتراکی (shared object)، ارجاعات را به نمادهای سراسری (global symbols) مقید میکند. درباره هرگونه ارجاع حلنشده هشدار میدهد (مگر اینکه توسط گزینه ویرایشگر پیوند -Xlinker -z -Xlinker defs لغو شود). تنها تعداد کمی از سیستمها از این گزینه پشتیبانی میکنند.
- -T script
- از script به عنوان اسکریپت پیونددهنده (linker script) استفاده میکند. این گزینه توسط بیشتر سیستمهایی که از پیونددهنده GNU استفاده میکنند پشتیبانی میشود. در برخی مقاصد (targets)، مانند مقاصد 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-supplied) استفاده کنید؛ برای این منظور از -isystem استفاده نمایید.
گزینههای -isystem و -idirafter همچنین دایرکتوری را به عنوان یک دایرکتوری سیستمی علامتگذاری میکنند، به طوری که از همان رفتار ویژهای بهرهمند میشود که برای دایرکتوریهای استاندارد سیستم اعمال میگردد.
اگر یک دایرکتوری include استاندارد سیستم یا دایرکتوری مشخصشده با -isystem، همزمان با -I نیز مشخص شود، گزینه -I نادیده گرفته میشود. دایرکتوری همچنان جستجو میشود اما به عنوان یک دایرکتوری سیستمی در جایگاه عادی خود در زنجیره include سیستم قرار میگیرد. این امر برای اطمینان از این است که روال GCC برای رفع اشکال سرآیندهای سیستمی معیوب و نیز ترتیب دستورالعمل "#include_next" به طور ناخواسته تغییر نکند. اگر واقعاً نیاز به تغییر ترتیب جستجوی دایرکتوریهای سیستم دارید، از گزینههای -nostdinc و/یا -isystem استفاده کنید.
- -I-
- مسیر include را
تفکیک
میکند. این
گزینه
منسوخ شده
است (deprecated).
لطفاً به
جای آن،
برای
دایرکتوریهای
-I پیش از -I-
از -iquote
استفاده
کنید و
گزینه -I- را
حذف نمایید.
هر دایرکتوری مشخصشده با گزینههای -I پیش از -I- فقط برای سرآیندهای درخواستی با "#include "file"" جستجو میشود؛ آنها برای "#include <file>" جستجو نمیشوند. اگر دایرکتوریهای بیشتری با گزینههای -I پس از -I- مشخص شوند، آن دایرکتوریها برای تمام دستورالعملهای #include جستجو میگردند.
علاوه بر این، -I- مانع استفاده از دایرکتوریِ فایل فعلی به عنوان نخستین دایرکتوری جستجو برای "#include "file"" میشود. هیچ راهی برای لغو این اثر -I- وجود ندارد.
- -iprefix prefix
- عبارت prefix را به عنوان پیشوند برای گزینههای بعدیِ -iwithprefix مشخص میکند. اگر پیشوند نمایانگر یک دایرکتوری است، باید / انتهایی را نیز لحاظ کنید.
- -iwithprefix dir
- -iwithprefixbefore dir
- دایرکتوری dir را به پیشوند مشخصشده قبلی با -iprefix پیوست کرده و دایرکتوری حاصل را به مسیر جستجوی include اضافه میکند. گزینه -iwithprefixbefore آن را در همان جایی قرار میدهد که -I قرار میداد؛ و -iwithprefix آن را در جایی قرار میدهد که -idirafter میگذاشت.
- -isysroot dir
- این گزینه شبیه گزینه --sysroot است، اما تنها برای فایلهای سرآیند اعمال میشود (به جز برای مقاصد Darwin، که در آن هم برای فایلهای سرآیند و هم برای کتابخانهها اعمال میگردد). برای اطلاعات بیشتر گزینه --sysroot را ببینید.
- -imultilib dir
- از dir به عنوان یک زیردایرکتوری از دایرکتوری حاوی سرآیندهای C++ مختص مقصد استفاده میکند.
- -nostdinc
- دایرکتوریهای استاندارد سیستم را برای فایلهای سرآیند جستجو نمیکند. تنها دایرکتوریهایی که صراحتاً با گزینههای -I، -iquote، -isystem، و/یا -idirafter مشخص شدهاند (و در صورت لزوم، دایرکتوری فایل فعلی) جستجو میشوند.
- -nostdinc++
- فایلهای
سرآیند را
در
دایرکتوریهای
استاندارد
مختص C++
جستجو
نمیکند،
اما همچنان
سایر
دایرکتوریهای
استاندارد
را جستجو
مینماید.
(این گزینه
هنگام ساخت
کتابخانه C++
استفاده
میشود.).IP
--embed-dir=dir 4
دایرکتوری
dir را به
فهرست
دایرکتوریهای
مورد جستجو
برای دستور
پیشپردازندهٔ
"#embed" یا
ماکروی
"__has_embed"
اضافه
میکند. هیچ
دایرکتوری
پیشفرضی
برای
"#embed"
وجود ندارد.
اگر dir با = یا $SYSROOT آغاز شود، آنگاه = یا $SYSROOT با پیشوند sysroot جایگزین میشود؛ گزینههای --sysroot و -isysroot را ببینید.
- -iplugindir=dir
- دایرکتوری جستجو برای پلاگینهایی را مشخص میکند که به جای -fplugin=path/name.so، از طریق -fplugin=name ارسال شدهاند. این گزینه برای استفاده توسط کاربر در نظر گرفته نشده است و فقط از طرف درایور کامپایلر ارسال میشود.
- -Ldir
- دایرکتوری dir را به فهرست دایرکتوریهای مورد جستجو برای -l اضافه میکند.
- -Bprefix
- این گزینه
مشخص
میکند
فایلهای
اجرایی،
کتابخانهها،
فایلهای include
و فایلهای
دادهای
خودِ
کامپایلر
در کجا پیدا
شوند.
برنامهٔ درایور کامپایلر یک یا چند مورد از زیربرنامههای cpp، cc1، as و ld را اجرا میکند. این برنامه برای هر برنامهای که قصد اجرای آن را دارد، prefix را هم با و هم بدون machine/version/ مربوط به معماری مقصد و نگارش کامپایلر، به عنوان پیشوند امتحان میکند.
برای اجرای هر زیربرنامه، درایور کامپایلر ابتدا پیشوند -B را (در صورت وجود) امتحان میکند. اگر آن نام پیدا نشود، یا اگر -B مشخص نشده باشد، درایور دو پیشوند استاندارد /usr/lib/gcc/ و /usr/local/lib/gcc/ را امتحان میکند. اگر هیچیک از آنها به فایلی منجر نشود که یافت شود، نام دستنخوردهٔ برنامه با استفاده از دایرکتوریهای مشخصشده در متغیر محیطی PATH شما جستجو میشود.
کامپایلر بررسی میکند که آیا مسیر ارائهشده توسط -B به یک دایرکتوری اشاره دارد یا خیر، و در صورت نیاز یک نویسهٔ جداکنندهٔ دایرکتوری به انتهای مسیر اضافه میکند.
پیشوندهای -B که عملاً نام دایرکتوریها را مشخص میکنند، بر کتابخانهها در پیونددهنده (linker) نیز اعمال میشوند، زیرا کامپایلر این گزینهها را برای پیونددهنده به گزینههای -L ترجمه میکند. آنها همچنین بر فایلهای include در پیشپردازنده اعمال میشوند، زیرا کامپایلر این گزینهها را برای پیشپردازنده به گزینههای -isystem ترجمه میکند. در این حالت، کامپایلر include را به انتهای پیشوند میافزاید.
فایل پشتیبانی زمان اجرای libgcc.a نیز در صورت نیاز میتواند با استفاده از پیشوند -B جستجو شود. اگر در آنجا پیدا نشود، دو پیشوند استاندارد فوق امتحان میشوند و بس. اگر فایل از این راهها پیدا نشود، از فرایند پیوند کنار گذاشته میشود.
روش دیگر برای تعیین پیشوندی شبیه به پیشوند -B، استفاده از متغیر محیطی GCC_EXEC_PREFIX است.
به عنوان یک راهکار موقت و خاص (kludge)، اگر مسیر مشخصشده با -B به صورت [dir/]stageN/ باشد (که در آن N عددی در محدودهٔ 0 تا 9 است)، آنگاه با [dir/]include جایگزین میشود. این ترفند برای کمک به خودراهاندازی (bootstrapping) کامپایلر است.
- -no-canonical-prefixes
- هنگام تولید یک پیشوند نسبی، هیچ پیوند نمادینی را بازگشایی نکنید، ارجاعات به /../ یا /./ را حل نکنید و مسیر را مطلق نسازید.
- --sysroot=dir
- از dir به
عنوان
دایرکتوری
ریشهٔ
منطقی برای
سرآیندها (headers)
و
کتابخانهها
استفاده
میکند.
برای
نمونه، اگر
کامپایلر
در حالت
عادی برای
یافتن
سرآیندها
در /usr/include و
برای
کتابخانهها
در /usr/lib جستجو
میکند، در
عوض dir/usr/include و
dir/usr/lib را
جستجو
خواهد کرد.
اگر هم از این گزینه و هم از گزینهٔ -isysroot استفاده کنید، آنگاه گزینهٔ --sysroot بر کتابخانهها اعمال میشود، اما گزینهٔ -isysroot بر فایلهای سرآیند اعمال خواهد شد.
پیونددهندهٔ گنو (GNU linker - از نگارش 2.16 به بعد) پشتیبانی لازم را از این گزینه دارد. اگر پیونددهندهٔ شما از این گزینه پشتیبانی نکند، جنبهٔ مربوط به فایلهای سرآیند در --sysroot همچنان کار میکند، اما بخش مربوط به کتابخانهها کار نخواهد کرد.
- --no-sysroot-suffix
- برای برخی مقصدها، بسته به سایر گزینههای مورد استفاده، پسوندی به دایرکتوری ریشهٔ مشخصشده با --sysroot اضافه میشود تا سرآیندها به عنوان مثال به جای dir/usr/include در dir/suffix/usr/include یافت شوند. این گزینه، افزودن چنین پسوندی را غیرفعال میکند..SS "گزینههای قراردادهای تولید کد (Options for Code Generation Conventions)" این گزینههای مستقل از ماشین، قراردادهای رابط مورد استفاده در تولید کد را کنترل میکنند.
بیشتر آنها هم حالت مثبت و هم حالت منفی دارند؛ حالت منفی -ffoo به صورت -fno-foo است. در جدول زیر، تنها یکی از حالتها فهرست شده است---حالتی که پیشفرض نیست. شما میتوانید با حذف یا افزودن no- به حالت دیگر برسید.
- -fstack-reuse=reuse-level
- این گزینه
استفاده
مجدد از
فضای پشته (stack)
را برای
متغیرهای
محلی/خودکار
(local/auto)
اعلانشده
توسط کاربر
و مقادیر
موقت
تولیدشده
توسط
کامپایلر
کنترل
میکند.
مقدار 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
- این گزینه برای سرریز علامتدار (signed overflow) در عملیاتهای جمع، تفریق و ضرب تلهها (traps) تولید میکند. گزینههای -ftrapv و -fwrapv یکدیگر را بازنویسی (override) میکنند، بنابراین استفاده همزمان از -ftrapv -fwrapv در خط فرمان منجر به موثر بودن -fwrapv خواهد شد. توجه داشته باشید که تنها گزینههای فعال بازنویسی میکنند، بنابراین استفاده از -ftrapv -fwrapv -fno-wrapv در خط فرمان، منجر به اعمال شدن -ftrapv میگردد.
- -fwrapv
- این گزینه به کامپایلر دستور میدهد تا فرض کند سرریز محاسباتی علامتدار در جمع، تفریق و ضرب با استفاده از نمایش مکمل دو (twos-complement) چرخش (wrap around) پیدا میکند. این پرچم برخی بهینهسازیها را فعال و برخی دیگر را غیرفعال میکند. گزینههای -ftrapv و -fwrapv یکدیگر را بازنویسی میکنند، بنابراین استفاده از -ftrapv -fwrapv در خط فرمان منجر به اعمال -fwrapv میشود. توجه داشته باشید که تنها گزینههای فعال بازنویسی میکنند، بنابراین استفاده از -ftrapv -fwrapv -fno-wrapv در خط فرمان منجر به موثر بودن -ftrapv خواهد شد.
- -fwrapv-pointer
- این گزینه به کامپایلر دستور میدهد فرض کند که سرریز محاسبات اشارهگر در جمع و تفریق با استفاده از نمایش مکمل دو دچار چرخش میشود. این پرچم برخی از بهینهسازیهایی را که سرریز اشارهگر را نامعتبر فرض میکنند، غیرفعال میسازد.
- -fstrict-overflow
- این گزینه در بر دارنده -fno-wrapv -fno-wrapv-pointer است و در صورت منفی شدن، دلالت بر -fwrapv -fwrapv-pointer دارد.
- -fexceptions
- مدیریت استثناها (exception handling) را فعال میکند. کدهای اضافی مورد نیاز برای انتشار (propagate) استثناها را تولید میکند. برای برخی اهداف (targets)، این به این معنی است که GCC اطلاعات بازگشایی فریم (frame unwind) را برای تمام توابع تولید میکند که میتواند سربار اندازه داده قابل توجهی ایجاد کند، اگرچه بر اجرای برنامه تأثیری ندارد. اگر این گزینه را مشخص نکنید، GCC آن را به طور پیشفرض برای زبانهایی مانند C++ که معمولاً به مدیریت استثنا نیاز دارند فعال، و برای زبانهایی مانند C که معمولاً به آن نیازی ندارند غیرفعال میکند. با این حال، ممکن است هنگام کامپایل کد C که نیاز دارد با گردانندههای استثنای نوشتهشده در C++ همکاری و تعامل درست داشته باشد، نیاز به فعال کردن این گزینه داشته باشید. همچنین ممکن است بخواهید در صورت کامپایل برنامههای قدیمیتر C++ که از مدیریت استثنا استفاده نمیکنند، این گزینه را غیرفعال کنید.
- -fnon-call-exceptions
- کدی تولید میکند که به دستورالعملهای تلهگذار (trapping) اجازه پرتاب استثناها را میدهد. توجه داشته باشید که این به پشتیبانی زمان اجرای وابسته به پلتفرم نیاز دارد که در همه جا وجود ندارد. علاوه بر این، تنها به دستورالعملهای تلهگذار اجازه پرتاب استثنا میدهد، مانند مراجع حافظه یا دستورالعملهای ممیز شناور (floating-point). این گزینه اجازه نمیدهد که استثناها از مدیریتکنندههای سیگنال دلخواه مانند "SIGALRM" پرتاب شوند. این گزینه -fexceptions را نیز فعال میکند.
- -fdelete-dead-exceptions
- دستورالعملهایی را که ممکن است استثنا پرتاب کنند اما در غیر این صورت نقشی در اجرای برنامه ندارند، قابل بهینهسازی و حذف در نظر میگیرد. این گزینه بر فراخوانی توابع، به جز توابعی که دارای مشخصههای "pure" یا "const" هستند، تأثیری ندارد. این گزینه به طور پیشفرض برای کامپایلرهای Ada و C++، همانطور که مشخصات زبان اجازه میدهد، فعال است. مراحل بهینهسازی که باعث حذف استثناهای مرده میشوند، بهطور مستقل در سطوح مختلف بهینهسازی فعال میگردند.
- -funwind-tables
- مشابه -fexceptions است، با این تفاوت که تنها دادههای ایستا (static) مورد نیاز را تولید میکند، اما به هیچ شیوه دیگری روی کد تولیدشده تأثیر نمیگذارد. معمولاً نیازی به فعال کردن این گزینه ندارید؛ در عوض، پردازنده زبانی که به این سازوکار نیاز دارد، آن را از طرف شما فعال میکند.
- -fasynchronous-unwind-tables
- جدول بازگشایی (unwind table) را در قالب DWARF تولید میکند، البته در صورتی که ماشین هدف از آن پشتیبانی کند. این جدول در هر مرز دستورالعمل دقیق است، بنابراین میتواند برای بازگشایی پشته در رویدادهای ناهمگام (مانند دیباگر یا زبالهروب) استفاده شود.
- -fno-gnu-unique
- در سیستمهای دارای اسمبلر GNU و کتابخانه C جدید، کامپایلر C++ از پیوند "STB_GNU_UNIQUE" استفاده میکند تا اطمینان حاصل کند که تعاریف اعضای دادهای ایستای قالبها و متغیرهای محلی ایستا در توابع درونخطی (inline) حتی در حضور "RTLD_LOCAL" نیز یکتا هستند؛ این برای جلوگیری از بروز مشکل در کتابخانهای که توسط دو افزونه مختلف "RTLD_LOCAL" استفاده میشود و به تعریفی در یکی از آنها وابسته است و در نتیجه با دیگری در مورد پیوند نماد اختلاف نظر دارد، ضروری است. اما این باعث میشود "dlclose" برای اشیاء اشتراکی پویای (DSO) آسیبدیده نادیده گرفته شود؛ اگر برنامه شما به بازنشانی اولیه یک DSO از طریق "dlclose" و "dlopen" متکی است، میتوانید از -fno-gnu-unique استفاده کنید.
- -fpcc-struct-return
- مقادیر
«کوتاه»
"struct" و
"union" را
مانند
مقادیر
طولانیتر،
به جای
ثباتها (registers)
در حافظه
بازمیگرداند.
این
قرارداد
کارایی
کمتری
دارد، اما
این مزیت را
دارد که
امکان
فراخوانی
متقابل
میان
فایلهای
کامپایلشده
با GCC و
فایلهای
کامپایلشده
با
کامپایلرهای
دیگر،
بهویژه Portable C
Compiler (pcc) را فراهم
میآورد.
قرارداد دقیق بازگرداندن ساختارها در حافظه به ماکروهای پیکربندی هدف بستگی دارد.
ساختارها و اجتماعات (unions) کوتاه مواردی هستند که اندازه و تراز آنها با اندازه و تراز یکی از انواع عدد صحیح مطابقت دارد.
هشدار: کدی که با سوئیچ -fpcc-struct-return کامپایل شده است با کدی که با سوئیچ -freg-struct-return کامپایل شده، سازگاری باینری ندارد. از آن برای مطابقت با یک رابط باینری کاربردی (ABI) غیرپیشفرض استفاده کنید..IP -freg-struct-return 4 مقادیر "struct" و "union" را در صورت امکان در ثباتها (registers) برمیگرداند. این روش برای ساختارهای کوچک کارآمدتر از -fpcc-struct-return است.
اگر نه -fpcc-struct-return و نه -freg-struct-return را مشخص کنید، GCC بهطور پیشفرض از هر قراردادی که برای هدف (target) استاندارد باشد استفاده میکند. اگر قرارداد استانداردی وجود نداشته باشد، GCC بهطور پیشفرض از -fpcc-struct-return استفاده میکند، به جز در اهدافی که GCC کامپایلر اصلی است. در این موارد، ما میتوانیم استاندارد را تعیین کنیم و گزینهٔ کارآمدتر بازگشت از طریق ثبات را برگزیدهایم.
هشدار: کدی که با سوییچ -freg-struct-return کامپایل شده است با کدی که با سوییچ -fpcc-struct-return کامپایل شده سازگاری دودویی (binary compatible) ندارد. از آن برای سازگاری با یک رابط دودویی کاربردی (ABI) غیرپیشفرض استفاده کنید.
- -fshort-enums
- برای یک نوع
"enum" تنها
به همان
تعداد بایت
که برای
محدودهٔ
اعلامشدهٔ
مقادیر
ممکن نیاز
است فضا
تخصیص
میدهد.
بهطور
مشخص، نوع
"enum"
معادل
کوچکترین
نوع عدد
صحیحی است
که فضای
کافی دارد.
این گزینه
برای یک نوع
شمارشی با
نوع
پایهای
ثابت هیچ
اثری ندارد.
هشدار: سوییچ -fshort-enums باعث میشود GCC کدی تولید کند که با کد تولیدشده بدون این سوییچ سازگاری دودویی ندارد. از آن برای سازگاری با یک رابط دودویی کاربردی (ABI) غیرپیشفرض استفاده کنید.
- -fshort-wchar
- نوع
پایهای
برای
"wchar_t" را
بازنویسی
کرده و آن
را به جای
حالت
پیشفرضِ
هدف، برابر
با "short
unsigned int"
قرار
میدهد. این
گزینه برای
ساخت
برنامههایی
که تحت WINE
اجرا
میشوند
مفید است.
هشدار: سوییچ -fshort-wchar باعث میشود GCC کدی تولید کند که با کد تولیدشده بدون این سوییچ سازگاری دودویی ندارد. از آن برای سازگاری با یک رابط دودویی کاربردی (ABI) غیرپیشفرض استفاده کنید.
- -fcommon
- در کد C، این
گزینه
جایگذاری
متغیرهای
سراسری (global variables)
تعریفشده
بدون
مقداردهی
اولیه را
کنترل
میکند که
در
استاندارد C
با عنوان tentative
definitions
(تعریفهای
موقت)
شناخته
میشوند.
تعریفهای
موقت از
اعلانهای
متغیر
همراه با
کلیدواژهٔ
"extern"
متمایز
هستند، چرا
که
اعلانها
فضایی برای
ذخیرهسازی
تخصیص
نمیدهند.
حالت پیشفرض -fno-common است که مشخص میکند کامپایلر متغیرهای سراسری بدون مقدار اولیه را در بخش BSS فایل شیء (object file) قرار دهد. این ویژگی مانع از ادغام تعریفهای موقت توسط پیونددهنده (linker) میشود، بنابراین اگر متغیر یکسانی به طور تصادفی در بیش از یک واحد کامپایل (compilation unit) تعریف شود، با خطای چندباره تعریف شدن (multiple-definition error) مواجه میشوید.
گزینهٔ -fcommon متغیرهای سراسری بدون مقدار اولیه را در یک بلوک مشترک (common block) قرار میدهد. این به پیونددهنده اجازه میدهد تمام تعریفهای موقت یک متغیر یکسان در واحدهای کامپایل مختلف را به یک شیء یکسان، یا به یک تعریف غیرموقت ارجاع دهد و حل کند. این رفتار با C++ ناسازگار است و در بسیاری از اهداف، جریمهای در سرعت و اندازهٔ کد برای ارجاع به متغیرهای سراسری به همراه دارد. کاربرد اصلی آن این است که کدهای قدیمی (legacy) بتوانند بدون خطا پیوند داده شوند.
- -fno-ident
- دستورالعمل "#ident" را نادیده میگیرد.
- -finhibit-size-directive
- دستورالعمل اسمبلر ".size" یا هر چیز دیگری را که در صورت دو نیم شدن تابع از وسط و قرار گرفتن دو نیمه در مکانهایی دور از هم در حافظه مشکلساز شود، در خروجی تولید نمیکند. این گزینه هنگام کامپایل crtstuff.c استفاده میشود؛ نباید نیازی باشد که از آن برای هیچ کار دیگری استفاده کنید.
- -fverbose-asm
- اطلاعات
توضیحی (comment)
اضافی در کد
اسمبلی
تولیدشده
قرار
میدهد تا
خوانایی آن
بیشتر شود.
این گزینه
عموماً فقط
برای کسانی
مفید است که
واقعاً
نیاز به
خواندن کد
اسمبلی
تولیدشده
دارند (شاید
هنگام
اشکالزدایی
خود
کامپایلر).
گزینهٔ -fno-verbose-asm، که حالت پیشفرض است، باعث حذف اطلاعات اضافی میشود و هنگام مقایسهٔ دو فایل اسمبلی کاربرد دارد.
توضیحات اضافهشده شامل موارد زیر است:
- اطلاعات مربوط به نسخهٔ کامپایلر و گزینههای خط فرمان،
- خطوط کد مبدأ مرتبط با دستورالعملهای اسمبلی، به شکل FILENAME:LINENUMBER:CONTENT OF LINE،
- راهنماییهایی دربارهٔ اینکه کدام عبارات سطح بالا با عملوندهای گوناگون دستورالعملهای اسمبلی مطابقت دارند.
برای مثال، با در نظر گرفتن این فایل مبدأ C:
int test (int n)
{
int i;
int total = 0;
for (i = 0; i < n; i++)
total += i * i;
return total;
}
کامپایل به کد اسمبلی (x86_64) با -S و ارسال مستقیم نتیجه به stdout با -o -
gcc -S test.c -fverbose-asm -Os -o -
خروجی مشابه این تولید میکند:
.file "test.c"
# GNU C11 (GCC) version 7.0.0 20160809 (experimental) (x86_64-pc-linux-gnu)
[...snip...]
# options passed:
[...snip...]
.text
.globl test
.type test, @function
test:
.LFB0:
.cfi_startproc
# test.c:4: int total = 0;
xorl %eax, %eax # <retval>
# test.c:6: for (i = 0; i < n; i++)
xorl %edx, %edx # i
.L2:
# test.c:6: for (i = 0; i < n; i++)
cmpl %edi, %edx # n, i
jge .L5 #,
# test.c:7: total += i * i;
movl %edx, %ecx # i, tmp92
imull %edx, %ecx # i, tmp92
# test.c:6: for (i = 0; i < n; i++)
incl %edx # i
# test.c:7: total += i * i;
addl %ecx, %eax # tmp92, <retval>
jmp .L2 #
.L5:
# test.c:10: }
ret
.cfi_endproc
.LFE0:
.size test, .-test
.ident "GCC: (GNU) 7.0.0 20160809 (experimental)"
.section .note.GNU-stack,"",@progbits
این توضیحات برای انسانها در نظر گرفته شدهاند نه ماشینها، و از این رو قالب دقیق این توضیحات ممکن است تغییر کند.
- -frecord-gcc-switches
- این سوییچ باعث میشود خط فرمانی که برای فراخوانی کامپایلر استفاده شده است، درون فایل شیء در حال ایجاد ثبت شود. این سوییچ تنها در برخی اهداف پیادهسازی شده است و قالب دقیق ثبت به هدف و قالب فایل دودویی بستگی دارد، اما معمولاً به شکل بخشی حاوی متن ASCII است. این سوییچ با سوییچ -fverbose-asm مرتبط است، اما آن سوییچ اطلاعات را فقط به صورت توضیحات در فایل خروجی اسمبلر ثبت میکند، بنابراین هرگز به فایل شیء راه نمییابد. برای روش دیگری از ذخیرهسازی گزینههای کامپایلر در فایل شیء، همچنین -grecord-gcc-switches را ببینید.
- -fpic
- در صورت
پشتیبانی
در ماشین
هدف، کد
مستقل از
موقعیت (PIC)
مناسب برای
استفاده در
یک
کتابخانهٔ
مشترک (shared library)
تولید
میکند.
چنین کدی از
طریق یک
جدول آفست
سراسری (GOT) به
تمامی
آدرسهای
ثابت
دسترسی
پیدا
میکند.
بارگذار
پویا (dynamic loader)
مدخلهای GOT
را هنگام
شروع
برنامه
تحلیل و حل
میکند
(بارگذار
پویا بخشی
از GCC نیست؛
بلکه بخشی
از
سیستمعامل
است). اگر
اندازهٔ GOT
برای فایل
اجرایی
پیوند داده
شده از
حداکثر
اندازهٔ
مخصوص آن
ماشین
فراتر رود،
پیام خطایی
از
پیونددهنده
دریافت
میکنید که
نشان
میدهد -fpic
کار
نمیکند؛
در این
حالت، به
جای آن
مجدداً با
-fPIC کامپایل
کنید. (این
مقادیر
بیشینه در SPARC
برابر با 8k،
در AArch64 برابر
با 28k و در m68k و RS/6000
برابر با 32k
است. معماری
x86 چنین
محدودیتی
ندارد.)
کد مستقل از موقعیت نیازمند پشتیبانی ویژهای است، بنابراین تنها بر روی ماشینهای خاصی کار میکند. برای x86، کامپایلر GCC از PIC برای System V پشتیبانی میکند اما برای Sun 386i پشتیبانی نمیکند. کد تولیدشده برای IBM RS/6000 همواره مستقل از موقعیت است.
هنگامی که این پرچم تنظیم شود، ماکروهای "__pic__" و "__PIC__" با مقدار 1 تعریف میشوند..IP -fPIC 4 در صورت پشتیبانی توسط ماشین مقصد، کد مستقل از موقعیت مناسب برای پیوند پویا و بدون محدودیت در اندازهٔ جدول آفست سراسری (GOT) تولید میکند. این گزینه در AArch64، m68k، PowerPC و SPARC تفاوت ایجاد میکند.
کد مستقل از موقعیت نیازمند پشتیبانی ویژهای است و بنابراین فقط روی ماشینهای خاصی کار میکند.
هنگامی که این پرچم تنظیم شود، ماکروهای "__pic__" و "__PIC__" برابر با ۲ تعریف میشوند.
- -fpie
- -fPIE
- این
گزینهها
مشابه -fpic و
-fPIC هستند،
اما کد
مستقل از
موقعیتِ
تولیدشده
فقط
میتواند
در
فایلهای
اجرایی
پیوند داده
شود.
معمولاً
این
گزینهها
برای
کامپایل
کدهایی به
کار
میروند که
با استفاده
از گزینهٔ
-pie در GCC پیوند
خواهند
خورد.
گزینههای -fpie و -fPIE هر دو ماکروهای "__pie__" و "__PIE__" را تعریف میکنند. این ماکروها برای -fpie مقدار ۱ و برای -fPIE مقدار ۲ دارند.
- -fno-plt
- از PLT برای
فراخوانی
توابع
خارجی در کد
مستقل از
موقعیت
استفاده
نکن. در
عوض، آدرس
تابع
فراخوانیشده
را در محل
فراخوانی
از GOT
بارگذاری
کرده و به
آن انشعاب
بده. این
امر با حذف
stubهای PLT و قرار
دادن
بارگذاریهای
GOT در معرض
بهینهسازی،
منجر به کدی
کارآمدتر
میشود. در
معماریهایی
مانند x86
۳۲-بیتی که
در آنها
stubهای 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]
- بدون تعیین
مقدار،
تمام اعضای
ساختار را
بدون فضای
خالی در
کنار هم
بستهبندی
کن. هنگامی
که مقداری
مشخص شود
(که باید
توان کوچکی
از ۲ باشد)،
اعضای
ساختار را
مطابق با
این مقدار
بستهبندی
کن که
بیانگر
حداکثر
تراز (alignment) است
(یعنی
اشیائی با
الزامات
تراز
پیشفرض
بزرگتر از
این مقدار،
احتمالاً
بهصورت
ترازنشده
در
نزدیکترین
مکان مناسب
بعدی قرار
میگیرند).
هشدار: سوئیچ -fpack-struct باعث میشود GCC کدی تولید کند که با کدهای تولیدشده بدون این سوئیچ سازگاری باینری ندارد. علاوه بر این، کد حاصل غیراپتیمال خواهد بود. از آن تنها برای تطابق با یک رابط باینری کاربردی (ABI) غیرپیشفرض استفاده کنید.
- -fleading-underscore
- این گزینه و
نقطهٔ
مقابل آن،
-fno-leading-underscore،
نحوهٔ
نمایش
نمادهای
زبان C در
فایل شیء (object file)
را اجباراً
تغییر
میدهند. یک
کاربرد آن،
کمک به
پیوند با
کدهای
اسمبلی
قدیمی است.
هشدار: سوئیچ -fleading-underscore باعث میشود GCC کدی تولید کند که با کدهای تولیدشده بدون این سوئیچ سازگاری باینری ندارد. از آن برای تطابق با یک رابط باینری کاربردی غیرپیشفرض استفاده کنید. همهٔ معماریهای مقصد پشتیبانی کاملی از این سوئیچ ارائه نمیدهند.
- -ftls-model=model
- مدل
ذخیرهسازی
محلی رشته (TLS)
مورد
استفاده را
تغییر
میدهد.
آرگومان model
باید یکی از
مقادیر
global-dynamic، local-dynamic،
initial-exec یا local-exec
باشد. توجه
داشته
باشید که
این انتخاب
مشمول
بهینهسازی
است:
کامپایلر
ممکن است
برای
نمادهایی
که در خارج
از واحد
ترجمه قابل
رویت
نیستند، یا
در صورتی که
-fpic در خط
فرمان داده
نشده باشد،
از مدل
کارآمدتری
استفاده
کند.
مقدار پیشفرض بدون -fpic برابر با initial-exec است؛ به همراه -fpic مقدار پیشفرض global-dynamic خواهد بود.
- -ftrampolines
- برای
مقصدهایی
که معمولاً
برای توابع
تودرتو به
ترامپولین
(trampoline) نیاز
دارند،
همیشه به
جای
استفاده از
توصیفکنندهها
(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 لینوکس. لطفاً توجه داشته باشید: در صورتی که از "setjmp" استفاده کنید، توابع تودرتو را نمونهسازی کنید و سپس با "longjmp" به وضعیتی قبل از تخصیص آن توابع تودرتو بازگردید، آزادسازی صحیح ترامپولینهای هیپ تضمین نمیشود.
- -fvisibility=[default|internal|hidden|protected]
- رویتپذیری
پیشفرض
نمادهای
تصویر ELF را
روی گزینهٔ
مشخصشده
تنظیم
میکند---تمام
نمادها با
این ویژگی
نشانهگذاری
میشوند
مگر آنکه
درون کد لغو
شوند.
استفاده از
این ویژگی
میتواند
زمان پیوند
و بارگذاری
کتابخانههای
شیء مشترک
را به میزان
چشمگیری
بهبود
بخشد، کد
بهینهتری
تولید کند،
صادرات API
تقریباً
بینقصی
فراهم سازد
و از تداخل
نمادها
جلوگیری به
عمل آورد.
اکیداً
توصیه
میشود که
در هر شیء
مشترکی که
توزیع
میکنید از
این گزینه
استفاده
نمایید.
برخلاف نامگذاری آن، default همیشه به معنای عمومی (public) است؛ یعنی نماد برای پیوند از خارجِ شیء مشترک در دسترس است. گزینههای protected و internal در کاربردهای واقعی عملاً کاربردی ندارند، بنابراین تنها گزینهٔ پرکاربرد دیگر hidden است. اگر -fvisibility مشخص نشود، حالت پیشفرض default خواهد بود، یعنی تمام نمادها عمومی میشوند.
توضیح خوبی از مزایای ناشی از اطمینان از رویتپذیری صحیح نمادهای ELF در مقالهٔ «How To Write Shared Libraries» نوشتهٔ Ulrich Drepper ارائه شده است (که در https://www.akkadia.org/drepper در دسترس است)---با این حال، یک راهکار برتر که به کمک این گزینه نسبت به مخفی کردن موارد در حالت پیشفرض عمومی فراهم شده، این است که حالت پیشفرض را hidden قرار داده و موارد لازم را عمومی اعلان کنید. این روند در DLLهای ویندوز استاندارد است و با -fvisibility=hidden و "__attribute__ ((visibility("default")))" به جای "__declspec(dllexport)"، معنایی تقریباً یکسان با ساختار نگارشی مشابه به دست میآورید. این امر کمکی بزرگ برای افرادی است که با پروژههای چندسکویی کار میکنند.
برای کسانی که پشتیبانی از رویتپذیری را به کدهای موجود اضافه میکنند، دستور "#pragma GCC visibility" میتواند مفید باشد. این سازوکار با احاطه کردن اعلانهایی که مایل به تنظیم رویتپذیری آنها هستید با (برای مثال) "#pragma GCC visibility push(hidden)" و "#pragma GCC visibility pop" عمل میکند. به یاد داشته باشید که رویتپذیری نمادها باید به عنوان بخشی از قرارداد رابط API نگریسته شود و بنابراین تمام کدهای جدید در صورتی که رویتپذیری آنها با حالت پیشفرض متفاوت است، همیشه باید آن را صراحتاً تعیین کنند؛ یعنی اعلانهایی که صرفاً برای استفاده درون DSO محلی هستند، همیشه باید بهطور صریح به صورت hidden نشانهگذاری شوند تا از سربار غیرمستقیم PLT جلوگیری شود---شفافسازی کامل این موضوع به خوانایی و خودسندسازی کد نیز کمک شایانی میکند. توجه داشته باشید که طبق الزامات استاندارد ISO C++، عملگرهای "operator new" و "operator delete" همیشه باید دارای رویتپذیری default باشند.
آگاه باشید که سربرگهای خارج از پروژهٔ شما، بهویژه سربرگهای سیستمی و سربرگهای هر کتابخانهٔ دیگری که استفاده میکنید، ممکن است انتظار نداشته باشند با رویتپذیری به غیر از پیشفرض کامپایل شوند. شاید لازم باشد قبل از گنجاندن چنین سربرگهایی، صراحتاً از "#pragma GCC visibility push(default)" استفاده کنید.
اعلانهای "extern" تحت تأثیر -fvisibility قرار نمیگیرند، بنابراین بخش اعظم کدها را میتوان بدون نیاز به تغییر با -fvisibility=hidden دوباره کامپایل کرد. با این حال، این بدان معناست که فراخوانی توابع "extern" بدون رویتپذیری صریح، از PLT استفاده میکند؛ بنابراین مؤثرتر است که از "__attribute ((visibility))" و/یا "#pragma GCC visibility" برای اعلام اینکه کدام اعلانهای "extern" باید به صورت hidden تلقی شوند به کامپایلر استفاده شود.
توجه داشته باشید که -fvisibility بر موجودیتهای دارای پیوند مبهم (vague linkage) در ++C تأثیر میگذارد. این بدان معناست که برای نمونه، یک کلاس استثنا (exception class) که میان DSOها پرتاب میشود، باید صراحتاً با رویتپذیری default نشانهگذاری شود تا گرههای type_info میان آن DSOها یکپارچه گردند.
نمای کلی این روشها، مزایای آنها و نحوهٔ بهکارگیری آنها در https://gcc.gnu.org/wiki/Visibility در دسترس است..IP -fstrict-volatile-bitfields 4 این گزینه باید زمانی استفاده شود که دسترسیها به فیلدهای بیتی volatile (یا دیگر فیلدهای ساختار، هرچند کامپایلر معمولاً به هر حال آن نوعها را رعایت میکند) باید از یک دسترسی واحد به پهنای نوع فیلد، همتراز با یک تراز طبیعی در صورت امکان، استفاده کنند. برای مثال، مقصدهایی با ثباتهای جانبی نگاشتشده در حافظه ممکن است نیازمند این باشند که تمام این دسترسیها ۱۶ بیتی باشند؛ با این پرچم میتوانید تمام فیلدهای بیتی جانبی را به صورت "unsigned short" تعریف کنید (با فرض اینکه short روی این مقصدها ۱۶ بیتی است) تا GCC را وادار کنید به جای یک دسترسی احتمالاً کارآمدترِ ۳۲ بیتی، از دسترسیهای ۱۶ بیتی استفاده کند.
اگر این گزینه غیرفعال باشد، کامپایلر از کارآمدترین دستورالعمل استفاده میکند. در مثال قبلی، این ممکن است یک دستورالعمل بارگذاری (load) ۳۲ بیتی باشد، حتی اگر به بایتهایی دسترسی پیدا کند که شامل هیچ بخشی از فیلد بیتی نیستند، یا به ثباتهای نگاشتشده در حافظهای که به ثبات در حال بهروزرسانی ارتباطی ندارند دسترسی یابد.
در برخی موارد، مانند زمانی که صفت "packed" روی یک فیلد ساختار اعمال میشود، ممکن است دسترسی به فیلد با یک خواندن یا نوشتن واحد که برای ماشین مقصد به درستی تراز شده باشد ممکن نباشد. در این حالت، GCC به جای تولید کدی که در زمان اجرا دچار خطا شده یا نتیجه را ناقص (truncate) کند، به تولید چندین دسترسی متوسل میشود.
نکته: به دلیل محدودیتهای مدل حافظه C/C++11، دسترسیهای نوشتن مجاز به دست زدن به اعضای غیر فیلد بیتی نیستند. بنابراین توصیه میشود تمام بیتهای نوع فیلد را به عنوان اعضای فیلد بیتی تعریف کنید.
مقدار پیشفرض این گزینه توسط واسط دودویی برنامه (ABI) برای پردازنده مقصد تعیین میشود.
- -fsync-libcalls
- این گزینه
کنترل
میکند که
آیا
نمونههای
برونخط (out-of-line)
از خانواده
توابع
"__sync"
میتوانند
برای
پیادهسازی
خانواده
توابع
"__atomic" در C++11
استفاده
شوند یا
خیر.
مقدار پیشفرض این گزینه فعال است، بنابراین تنها شکل مفید این گزینه -fno-sync-libcalls است. این گزینه در پیادهسازی کتابخانه زمان اجرای libatomic استفاده میشود.
- -fzero-init-padding-bits=value
- مقداردهی
اولیه
بیتهای
فاصلهساز
(padding bits) با صفر را
در
مقداردهندههای
متغیرهای
خودکار (automatic)
تضمین
میکند.
برخی
زبانها
مقداردهی
اولیه
بیتهای
فاصلهساز
با صفر را
در موارد
خاصی تضمین
میکنند؛
برای مثال C23
هنگام
استفاده از
مقداردهندههای
خالی
("{}")، یا C++
هنگام
استفاده از
مقداردهی
با صفر (zero-initialization)،
یا C تضمین
میکند
فیلدهایی
که در یک
مقداردهنده
مشخص
نشدهاند،
بیتهای
فاصلهساز
آنها با
صفر
مقداردهی
اولیه شوند.
این گزینه
اجازه
میدهد
زمان تضمین
مقداردهی
اولیه
بیتهای
فاصلهساز
با صفر در
مقداردهندهها
تغییر کند.
مقدار
پیشفرض
"-fzero-init-padding-bits=standard"
است که هیچ
تضمینی
فراتر از
استاندارد
مربوطه
ارائه
نمیدهد. به
عنوان مثال:
struct A { char a; unsigned long long b; char c; }; union B { char a; unsigned long long b; }; struct A a = {}; // C23 guarantees padding bits are zero. struct A b = { 1, 2, 3 }; // No guarantees. union B c = {}; // C23 guarantees padding bits are zero. union B d = { 1 }; // No guarantees.گزینه "-fzero-init-padding-bits=unions" علاوه بر آنچه استانداردها تضمین میکنند، مقداردهی اولیه با صفر بیتهای فاصلهساز در unionها را تضمین میکند، اگر مقداردهنده یک union خالی باشد (در این صورت تمام بیتهای union با صفر مقداردهی میشوند) یا اگر عضو مقداردهیشدهی union کوچکتر از اندازه union باشد (در این حالت، مقداردهی با صفر بیتهای فاصلهساز خارج از عضو مقداردهیشده تضمین میشود). این رفتار GCC پیش از نسخه GCC 15 بود و در مثال بالا مقداردهی اولیه با صفرِ "sizeof (unsigned long long) - 1" بایت پایانی در union را تضمین میکند.
گزینه "-fzero-init-padding-bits=all" علاوه بر این، مقداردهی اولیه با صفر بیتهای فاصلهساز سایر دادههای ترکیبی (aggregates) را تضمین میکند، از جمله فاصلهگذاری بین "b.a" و "b.b" (در صورت وجود) و فاصلهگذاری انتهایی (tail padding) در ساختار (در صورت وجود).
گزینههای توسعهدهنده GCC (GCC Developer Options)
این بخش گزینههای خط فرمانی را شرح میدهد که در وهله اول مورد توجه توسعهدهندگان GCC است، از جمله گزینههایی برای پشتیبانی از آزمودن کامپایلر، بررسی باگهای کامپایلر و مشکلات کارایی در زمان کامپایل. این موارد شامل گزینههایی است که در نقاط مختلف فرایند کامپایل رونوشتهای اشکالزدایی (debug dumps) تولید میکنند؛ گزینههایی که آمارهایی مانند مصرف حافظه و زمان اجرا را چاپ میکنند؛ و گزینههایی که اطلاعاتی درباره پیکربندی GCC، مانند مسیرهای جستجوی کتابخانهها، نمایش میدهند. به ندرت پیش میآید که برای کارهای عادی کامپایل و پیوند دادن به استفاده از هر یک از این گزینهها نیاز داشته باشید.
بسیاری از گزینههای توسعهدهنده که باعث میشوند GCC خروجی را در یک فایل رونوشت ذخیره کند، یک پسوند اختیاری =filename میپذیرند. میتوانید stdout یا - را برای ارسال به خروجی استاندارد، و stderr را برای خطای استاندارد مشخص کنید.
اگر =filename حذف شود، یک نام پیشفرض برای فایل رونوشت از الحاق نام پایه فایل رونوشت، یک شماره گذر (pass number)، حرف فاز (phase letter) و نام گذر ساخته میشود. نام پایه فایل رونوشت در صورتی که به صراحت مشخص شده باشد و فایل اجرایی نباشد، نام فایل خروجی تولیدشده توسط کامپایلر است؛ در غیر این صورت نام فایل منبع خواهد بود. شماره گذر بر اساس ترتیبی که گذرها در مدیر گذر (pass manager) کامپایلر ثبت شدهاند تعیین میشود. این ترتیب معمولاً با ترتیب اجرا یکسان است، اما گذرهایی که توسط افزایهها (plugins) ثبت میشوند، گذرهای ویژهی پردازنده مقصد، یا گذرهایی که به دلایل دیگر دیر ثبت میشوند، شمارهای بالاتر از گذر موسوم به final دریافت میکنند، حتی اگر زودتر اجرا شوند. حرف فاز یکی از حروف i (تحلیل بینرویهای - inter-procedural analysis)، l (مختص به زبان - language-specific)، 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). این گذر تنها روی معماریهایی اجرا میشود که دستورالعملهای auto inc یا auto dec دارند.
- -fdump-rtl-barriers
- رونوشت پس از پاکسازی دستورالعملهای سد (barrier instructions).
- -fdump-rtl-bbpart
- رونوشت پس از افرازش بلوکهای پایهای داغ و سرد.
- -fdump-rtl-bbro
- رونوشت پس از بازآرایی بلوکها.
- -fdump-rtl-btl1
- -fdump-rtl-btl2
- گزینههای -fdump-rtl-btl1 و -fdump-rtl-btl2 رونوشتگیری پس از دو گذر بهینهسازی بارگذاری مقصد انشعاب را فعال میکنند.
- -fdump-rtl-bypass
- رونوشت پس از کنارگذاری پرش (jump bypassing) و بهینهسازیهای جریان کنترل.
- -fdump-rtl-combine
- رونوشت پس از گذر ترکیب دستورالعملهای RTL.
- -fdump-rtl-compgotos
- رونوشت پس از تکثیر gotoهای محاسبهشده..IP -fdump-rtl-ce1 4
- -fdump-rtl-ce2
- -fdump-rtl-ce3
- -fdump-rtl-ce1، -fdump-rtl-ce2 و -fdump-rtl-ce3 تخلیه اطلاعات را پس از سه گذر تبدیل if فعال میکنند.
- -fdump-rtl-cprop_hardreg
- تخلیه اطلاعات پس از انتشار رونوشت ثبات سختافزاری (hard register copy propagation).
- -fdump-rtl-csa
- تخلیه اطلاعات پس از ترکیب تنظیمات پشته.
- -fdump-rtl-cse1
- -fdump-rtl-cse2
- -fdump-rtl-cse1 و -fdump-rtl-cse2 تخلیه اطلاعات را پس از دو گذر حذف زیرعبارتهای مشترک فعال میکنند.
- -fdump-rtl-dce
- تخلیه اطلاعات پس از گذرهای مستقل حذف کدهای مرده (dead code elimination).
- -fdump-rtl-dbr
- تخلیه اطلاعات پس از زمانبندی پرش با تأخیر (delayed branch scheduling).
- -fdump-rtl-dce1
- -fdump-rtl-dce2
- -fdump-rtl-dce1 و -fdump-rtl-dce2 تخلیه اطلاعات را پس از دو گذر حذف ذخیرهسازیهای مرده (dead store elimination) فعال میکنند.
- -fdump-rtl-eh
- تخلیه اطلاعات پس از نهاییسازی کد مدیریت EH.
- -fdump-rtl-eh_ranges
- تخلیه اطلاعات پس از تبدیل نواحی دامنهای مدیریت EH.
- -fdump-rtl-expand
- تخلیه اطلاعات پس از تولید RTL.
- -fdump-rtl-fwprop1
- -fdump-rtl-fwprop2
- -fdump-rtl-fwprop1 و -fdump-rtl-fwprop2 تخلیه اطلاعات را پس از دو گذر انتشار روبهجلو (forward propagation) فعال میکنند.
- -fdump-rtl-gcse1
- -fdump-rtl-gcse2
- -fdump-rtl-gcse1 و -fdump-rtl-gcse2 تخلیه اطلاعات را پس از حذف سراسری زیرعبارتهای مشترک فعال میکنند.
- -fdump-rtl-init-regs
- تخلیه اطلاعات پس از مقداردهی اولیهٔ ثباتها.
- -fdump-rtl-initvals
- تخلیه اطلاعات پس از محاسبهٔ مجموعههای مقادیر اولیه.
- -fdump-rtl-into_cfglayout
- تخلیه اطلاعات پس از تبدیل به حالت cfglayout.
- -fdump-rtl-ira
- تخلیه اطلاعات پس از تخصیص مکرر ثباتها (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
- تخلیه اطلاعات پس از تولید مقدمه (prologue) و مؤخرهٔ (epilogue) توابع.
- -fdump-rtl-sched1
- -fdump-rtl-sched2
- -fdump-rtl-sched1 و -fdump-rtl-sched2 تخلیه اطلاعات را پس از گذرهای زمانبندی بلوک پایه فعال میکنند.
- -fdump-rtl-ree
- تخلیه اطلاعات پس از حذف گسترش علامت/صفر (sign/zero extension).
- -fdump-rtl-seqabstr
- تخلیه اطلاعات پس از شناسایی توالیهای مشترک.
- -fdump-rtl-shorten
- تخلیه اطلاعات پس از کوتاهسازی شاخهها.
- -fdump-rtl-split1
- -fdump-rtl-split2
- -fdump-rtl-split3
- -fdump-rtl-split4
- -fdump-rtl-split5
- این گزینهها تخلیه اطلاعات را پس از پنج مرحله تفکیک دستورالعملها فعال میکنند.
- -fdump-rtl-sms
- تخلیه اطلاعات پس از زمانبندی مدولو (modulo scheduling). این گذر فقط روی برخی معماریها اجرا میشود.
- -fdump-rtl-stack
- تخلیه اطلاعات پس از تبدیل از ثباتهای «flat register file» در GCC به ثباتهای پشتهمانند x87. این گذر تنها روی گونههای x86 اجرا میشود.
- -fdump-rtl-subreg1
- -fdump-rtl-subreg2
- -fdump-rtl-subreg1 و -fdump-rtl-subreg2 تخلیه اطلاعات را پس از دو گذر گسترش subreg فعال میکنند.
- -fdump-rtl-vartrack
- تخلیه اطلاعات پس از ردیابی متغیرها.
- -fdump-rtl-vregs
- تخلیه اطلاعات پس از تبدیل ثباتهای مجازی به ثباتهای سختافزاری.
- -fdump-rtl-web
- تخلیه اطلاعات پس از تفکیک بازه حیات (live range splitting).
- -fdump-rtl-regclass
- -fdump-rtl-subregs_of_mode_init
- -fdump-rtl-subregs_of_mode_finish
- -fdump-rtl-dfinit
- -fdump-rtl-dfinish
- این تخلیهها تعریف شدهاند اما همواره فایلهای خالی تولید میکنند.
- -da
- -fdump-rtl-all
- تمام تخلیههای فهرستشده در بالا را تولید میکند..IP -dA 4 خروجی اسمبلر را با اطلاعات اشکالزدایی متفرقه حاشیهنویسی میکند.
- -dD
- در پایان پیشپردازش، علاوه بر خروجی عادی، تمام تعاریف ماکرو را تخلیه (dump) میکند.
- -dH
- هر زمان که خطایی رخ دهد، یک core dump تولید میکند.
- -dp
- خروجی اسمبلر را با توضیحی که مشخص میکند از کدام الگو و جایگزین استفاده شده، حاشیهنویسی میکند. همچنین طول و هزینهٔ هر دستورالعمل نیز چاپ میشود.
- -dP
- کد RTL را در خروجی اسمبلر به صورت یک توضیح قبل از هر دستورالعمل تخلیه میکند. همچنین حاشیهنویسی -dp را فعال میکند.
- -dx
- تنها برای یک تابع RTL تولید میکند به جای اینکه آن را کامپایل کند. معمولاً همراه با -fdump-rtl-expand استفاده میشود.
- -fdump-debug
- اطلاعات اشکالزدایی تولید شده در طول مرحلهٔ تولید اشکالزدایی را تخلیه میکند.
- -fdump-earlydebug
- اطلاعات اشکالزدایی تولید شده در طول مرحلهٔ اولیهٔ تولید اشکالزدایی را تخلیه میکند.
- -fdump-noaddr
- هنگام انجام تخلیههای اشکالزدایی، از چاپ آدرسها جلوگیری میکند. این کار مقایسه با diff را در تخلیههای اشکالزدایی برای فراخوانیهای کامپایلر با باینریهای کامپایلر مختلف و/یا مکانهای شروع متفاوت text / bss / data / heap / stack / dso آسانتر میسازد.
- -freport-bug
- در صورت وقوع خطای داخلی کامپایلر (ICE)، اطلاعات اشکالزدایی را جمعآوری کرده و در یک فایل موقت تخلیه میکند.
- -fdump-unnumbered
- هنگام انجام تخلیههای اشکالزدایی، شماره دستورالعملها و خروجی آدرس را حذف میکند. این کار مقایسه با diff را در تخلیههای اشکالزدایی برای فراخوانیهای کامپایلر با گزینههای مختلف، بهویژه با و بدون -g، عملیتر میکند.
- -fdump-unnumbered-links
- هنگام انجام تخلیههای اشکالزدایی (گزینهٔ -d در بالا را ببینید)، شمارهٔ دستورالعملها را برای پیوندها به دستورالعملهای قبلی و بعدی در یک دنباله حذف میکند.
- -fdump-ipa-switch
- -fdump-ipa-switch-options
- تخلیهٔ درخت زبان در مراحل مختلف تحلیل میانروالی (inter-procedural analysis) به یک فایل را کنترل میکند. نام فایل با افزودن یک پسوند وابسته به سوییچ به نام فایل مبدأ تولید میشود و فایل در همان دایرکتوری فایل خروجی ایجاد میگردد. تخلیههای زیر امکانپذیر هستند:
- all
- تمام تخلیههای تحلیل میانروالی را فعال میکند.
- cgraph
- اطلاعات مربوط به بهینهسازی گراف فراخوانی، حذف توابع استفادهنشده و تصمیمات درونخطیسازی (inlining) را تخلیه میکند.
- inline
- تخلیه پس از درونخطیسازی تابع.
- strubm
- تخلیه پس از انتخاب حالتهای "strub" و ثبت انتخابها به عنوان مشخصههای تابع.
- strub
- تخلیه تبدیلهای "strub": تغییرات واسط، بستهبندی توابع (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.
- عددی که به طور یکتا تابع در حال کلون شدن را در گراف فراخوانی مشخص میکند. توجه داشته باشید که این عدد فقط در یک واحد کامپایل یا در طول تحلیل کل برنامه یکتا است، اما احتمالاً در این دو فاز متفاوت خواهد بود.
- 4.
- نام فایل مبدأ که در آن تابع تعریف شده است.
- 5.
- شماره خطی که تعریف تابع در آن قرار دارد.
- 6.
- شماره ستونی که تعریف تابع در آن قرار دارد.
- 7.
- نام کلون جدید تابع، به همان صورتی که به اسمبلر ارائه شده است.
- 8.
- عددی که به طور یکتا کلون جدید تابع را در گراف فراخوانی مشخص میکند. توجه داشته باشید که این عدد فقط در یک واحد کامپایل یا در طول تحلیل کل برنامه یکتا است، اما احتمالاً در این دو فاز متفاوت خواهد بود.
- 9.
- نام فایل مبدأ که مکان کد مبدأ کلون جدید به آن اشاره دارد.
- 10.
- شماره خطی که مکان کد مبدأ کلون جدید به آن اشاره دارد.
- 11.
- شماره ستونی که مکان کد مبدأ کلون جدید به آن اشاره دارد.
- 12.
- رشتهای که دلیل کلونسازی را مشخص میکند.
در صورت حذف کلون گراف فراخوانی، فیلدهای مجزا عبارتند از:
- 1.
- رشتهٔ "Callgraph removal".
- 2.
- نام تابعی که در حال حذف است، به همان صورتی که به اسمبلر ارائه میشد.
- 3.
- عددی که به طور یکتا تابع در حال کلون شدن را در گراف فراخوانی مشخص میکند. توجه داشته باشید که این عدد فقط در یک واحد کامپایل یا در طول تحلیل کل برنامه یکتا است، اما احتمالاً در این دو فاز متفاوت خواهد بود.
- 4.
- نام فایل مبدأ که در آن تابع تعریف شده است.
- 5.
- شماره خطی که تعریف تابع در آن قرار دارد.
- 6.
- شماره ستونی که تعریف تابع در آن قرار دارد.
- -fdump-lang-all
- -fdump-lang-switch
- -fdump-lang-switch-options
- -fdump-lang-switch-options=filename
- کنترل تخلیهٔ اطلاعات مختص زبان. بخشهای options و filename همانگونه عمل میکنند که در گزینهٔ -fdump-tree شرح داده شده است. مقادیر switch زیر پذیرفته میشوند:
- all
- فعالسازی تمام تخلیههای مختص زبان.
- class
- تخلیهٔ اطلاعات سلسلهمراتب کلاسها. اطلاعات جدول مجازی (virtual table) تولید میشود مگر آنکه 'slim' مشخص شده باشد. این گزینه فقط برای C++ قابل استفاده است.
- module
- تخلیهٔ اطلاعات پودمان (ماژول). گزینههای lineno (موقعیتها)، graph (دسترسپذیری)، blocks (خوشهها)، uid (سریالسازی)، alias (قابل ادغام)، asmname (Elrond)، eh (نگاشتار) و vops (ماکروها) ممکن است اطلاعات تکمیلی ارائه دهند. این گزینه فقط برای C++ قابل استفاده است.
- raw
- تخلیهٔ دادههای خام درخت داخلی. این گزینه فقط برای C++ قابل استفاده است.
- -fdump-passes
- چاپ فهرست گذرگاههای بهینهسازی که توسط گزینههای خط فرمان فعلی فعال و غیرفعال شدهاند در stderr.
- -fdump-statistics-option
- فعالسازی و کنترل تخلیهٔ آمار گذرگاهها در یک فایل مجزا. نام فایل با افزودن پسوندی که به .statistics ختم میشود به نام فایل منبع ساخته شده و فایل در همان دایرکتوریِ فایل خروجی ایجاد میشود. اگر از قالب -option استفاده شود، -stats باعث میشود شمارندهها برای کل واحد ترجمه (compilation unit) جمع بسته شوند، در حالی که -details هر رویداد را به محض تولید شدن توسط گذرگاهها تخلیه میکند. حالت پیشفرض در صورت عدم تعیین گزینه، جمع بستن شمارندهها برای هر تابع کامپایلشده است.
- -fdump-tree-all
- -fdump-tree-switch
- -fdump-tree-switch-options
- -fdump-tree-switch-options=filename
- کنترل تخلیهٔ درخت زبان میانی در مراحل مختلف پردازش در یک فایل. اگر از قالب -options استفاده شود، options فهرستی از گزینههای جداشده با - است که جزئیات تخلیه را کنترل میکنند. همهٔ گزینهها برای همهٔ تخلیهها قابل استفاده نیستند؛ مواردی که کاربردی ندارند نادیده گرفته میشوند. گزینههای زیر در دسترس هستند:
- address
- چاپ آدرس هر گره. معمولاً این مورد معنای خاصی ندارد زیرا با توجه به محیط و فایل منبع تغییر میکند. کاربرد اصلی آن برای پیوند دادن یک فایل تخلیه با یک محیط اشکالزدایی است.
- asmname
- اگر "DECL_ASSEMBLER_NAME" برای یک اعلان مشخص تنظیم شده باشد، بهجای "DECL_NAME" از آن در تخلیه استفاده میشود. کاربرد اصلی آن، سهولت استفاده در ردیابی معکوس از نامهای درهمریخته (mangled names) در فایل اسمبلی است.
- slim
- هنگام
تخلیهٔ
نمایشهای
میانی بخش
فرانتاند
(front-end)، صرفاً
به دلیل
دسترسی به
یک حوزه، از
تخلیهٔ
اعضای آن
حوزه یا
بدنهٔ یک
تابع
جلوگیری
میکند. این
موارد تنها
زمانی
تخلیه
میشوند که
از طریقی
دیگر
مستقیماً
قابل
دسترسی
باشند.
هنگام تخلیهٔ درختها با فرمت خوانا (pretty-printed)، این گزینه از تخلیهٔ بدنهٔ ساختارهای کنترلی جلوگیری میکند.
هنگام تخلیهٔ RTL، نمایش RTL را بهجای نمایش پیشفرض شبیه LISP، در قالبی جمعوجور (slim) چاپ میکند.
- raw
- چاپ نمایشی خام از درخت. بهطور پیشفرض، درختها با فرمت خوانا (pretty-printed) در قالبی شبیه به C چاپ میشوند.
- details
- فعالسازی تخلیههای پرجزئیاتتر (توسط همهٔ گزینههای تخلیه رعایت نمیشود). همچنین اطلاعاتی از گذرگاههای بهینهسازی را شامل میشود.
- stats
- فعالسازی تخلیهٔ آمارهای مختلف دربارهٔ گذرگاه (توسط همهٔ گزینههای تخلیه رعایت نمیشود).
- blocks
- فعالسازی نمایش مرزهای بلوک پایه (basic block) (در تخلیههای خام غیرفعال است).
- graph
- برای هر یک
از
فایلهای
تخلیهٔ
مشخصشدهٔ
دیگر (-fdump-rtl-pass)،
نمایشی از
گراف جریان
کنترل
مناسب برای
مشاهده با GraphViz
را در file.passid.pass.dot
تخلیه
میکند. هر
تابع در
فایل
بهعنوان
یک زیرگراف
چاپ میشود
تا GraphViz بتواند
همهٔ آنها
را در یک
نمودار
واحد رسم
کند.
این گزینه در حال حاضر فقط برای تخلیههای RTL کار میکند، و RTL همیشه در قالبی جمعوجور (slim) تخلیه میشود.
- vops
- فعالسازی نمایش عملوندهای مجازی برای هر عبارت.
- lineno
- فعالسازی نمایش شماره خطوط برای عبارات.
- uid
- فعالسازی نمایش شناسهٔ یکتا ("DECL_UID") برای هر متغیر.
- verbose
- فعالسازی نمایش تخلیهٔ درخت برای هر عبارت.
- eh
- فعالسازی نمایش شمارهٔ ناحیهٔ EH (مدیریت استثنا) حاوی هر عبارت.
- scev
- فعالسازی نمایش جزئیات تحلیل تکامل اسکالر (scalar evolution).
- optimized
- فعالسازی نمایش اطلاعات بهینهسازی (تنها در گذرگاههای خاصی موجود است).
- missed
- فعالسازی نمایش اطلاعات بهینهسازیهای از دست رفته (تنها در گذرگاههای خاصی موجود است).
- note
- فعالسازی سایر اطلاعات تفصیلی بهینهسازی (تنها در گذرگاههای خاصی موجود است).
- all
- فعالسازی تمام گزینهها، بهجز raw، slim، verbose و lineno.
- optall
- فعالسازی تمام گزینههای بهینهسازی، یعنی optimized، missed و note.
برای تعیین اینکه چه تخلیههای درختی در دسترس هستند یا یافتن تخلیهٔ مربوط به گذرگاه مورد نظر، مراحل زیر را دنبال کنید:
- 1.
- دستور GCC را با -fdump-passes فراخوانی کنید و در خروجی stderr به دنبال کدی بگردید که با گذرگاه مورد نظرتان مطابقت دارد. برای نمونه، کدهای "tree-evrp"، "tree-vrp1" و "tree-vrp2" متناظر با سه گذرگاه انتشار محدودهٔ مقدار (Value Range Propagation) هستند. عدد انتهایی، فراخوانیهای متمایز از یک گذرگاه مشابه را مشخص میکند.
- 2.
- برای فعالسازی ایجاد فایل تخلیه، کد گذرگاه را به پیشوند گزینهٔ -fdump- الحاق کرده و GCC را با آن اجرا کنید. برای نمونه، جهت فعالسازی تخلیه از گذرگاه Early Value Range Propagation، دستور GCC را با گزینهٔ -fdump-tree-evrp فراخوانی کنید. در صورت تمایل، میتوانید نام فایل تخلیه را مشخص نمایید. چنانچه نامی مشخص نکنید، GCC آن را همانگونه که در ادامه شرح داده شده ایجاد میکند.
- 3.
- تخلیهٔ گذرگاه را در فایلی بیابید که نام آن از سه بخش جداشده با نقطه تشکیل شده است: نام فایل منبعی که GCC برای کامپایل آن فراخوانی شده، یک پسوند عددی نشاندهندهٔ شمارهٔ گذرگاه به همراه حرف t برای گذرگاههای درخت (و حرف r برای گذرگاههای RTL)، و در نهایت کد گذرگاه. برای نمونه، تخلیهٔ گذرگاه Early VRP ممکن است در فایلی با نام myfile.c.038t.evrp در دایرکتوری کاری فعلی قرار گیرد. توجه داشته باشید که کدهای عددی پایدار نیستند و ممکن است از نسخهای از GCC به نسخهٔ دیگر تغییر کنند.
- -fopt-info-options
- -fopt-info-options=filename
- خروجیهای
تخلیه (dump)
بهینهسازی
از گذرهای
مختلف
بهینهسازی
را کنترل
میکند. اگر
قالب -options به
کار رود، options
فهرستی از
کلیدواژههای
گزینهها
است که با -
از یکدیگر
جدا
شدهاند تا
جزئیات
خروجی
تخلیه و
بهینهسازیها
را تعیین
کنند.
مقدارهای options را میتوان به سه گروه تقسیم کرد:
- 1.
- گزینههایی که نوع پیامهای ارسالی را مشخص میکنند،
- 2.
- گزینههایی که میزان پرگویی (verbosity) خروجی تخلیه را تعیین میکنند، و
- 3.
- گزینههایی که تعیین میکنند کدام بهینهسازیها باید گنجانده شوند.
گزینههای هر گروه را میتوان آزادانه با یکدیگر ترکیب کرد چرا که با هم همپوشانی ندارند. با این حال، در صورت بروز هرگونه تداخل، گزینههای بعدی در خط فرمان بر گزینههای قبلی برتری خواهند داشت (override میکنند).
گزینههای زیر کنترل میکنند که چه نوع پیامهایی باید صادر شوند:
- optimized
- چاپ اطلاعات هنگام اعمال موفقیتآمیز یک بهینهسازی. تعیین اینکه کدام اطلاعات مرتبط هستند بر عهدهٔ گذر است. برای نمونه، گذرهای بردارساز (vectorizer) مکان مبدأ حلقههایی را که با موفقیت برداری شدهاند چاپ میکنند.
- missed
- چاپ اطلاعات دربارهٔ بهینهسازیهای از دست رفته. گذرهای منفرد کنترل میکنند که چه اطلاعاتی در خروجی گنجانده شود.
- note
- چاپ اطلاعات تفصیلی دربارهٔ بهینهسازیها، مانند تبدیلهای خاص، پیامهای با جزئیات بیشتر دربارهٔ تصمیمگیریها و غیره.
- all
- چاپ اطلاعات تفصیلی بهینهسازی. این گزینه شامل optimized، missed و note میشود.
گزینهٔ زیر میزان پرگویی خروجی تخلیه را کنترل میکند:
- internals
- بهطور پیشفرض، تنها پیامهای “سطح بالا” صادر میشوند. این گزینه پیامهای اضافی و با جزئیات بیشتری را فعال میکند که احتمالاً فقط برای توسعهدهندگان GCC جالب توجه خواهد بود.
یک یا چند مورد از کلیدواژههای گزینههای زیر را میتوان برای توصیف یک گروه از بهینهسازیها استفاده کرد:
- ipa
- فعالسازی خروجیهای تخلیه از تمام بهینهسازیهای بینروالی (interprocedural).
- loop
- فعالسازی خروجیهای تخلیه از تمام بهینهسازیهای حلقه (loop).
- inline
- فعالسازی خروجیهای تخلیه از تمام بهینهسازیهای درونخطیسازی (inlining).
- omp
- فعالسازی خروجیهای تخلیه از تمام بهینهسازیهای OMP (تخلیه بار محاسباتی و چندپردازشی).
- vec
- فعالسازی خروجیهای تخلیه از تمام بهینهسازیهای بردارسازی (vectorization).
- optall
- فعالسازی خروجیهای تخلیه از تمام بهینهسازیها. این یک ابرمجموعه از گروههای بهینهسازی فهرستشده در بالا است.
اگر options حذف شود، مقدار پیشفرض آن optimized-optall خواهد بود؛ به این معنی که پیامهای مربوط به بهینهسازیهای موفقیتآمیز از تمام گذرها تخلیه میشوند و از پیامهایی که به عنوان “internals” در نظر گرفته میشوند صرفنظر خواهد شد.
اگر filename مشخص شده باشد، خروجیهای تخلیه از تمام بهینهسازیهای مربوطه در filename الحاق میشوند. در غیر این صورت، خروجی تخلیه روی stderr فرستاده میشود. اگرچه چندین گزینهٔ -fopt-info پذیرفته میشوند، اما تنها یکی از آنها میتواند شامل یک filename باشد. اگر نامهای فایل دیگری مشخص شوند، تمام آنها به جز اولین گزینه نادیده گرفته میشوند.
توجه داشته باشید که در صورت وجود چندین واحد ترجمه (translation unit)، فایل خروجی filename بازنویسی میشود. اگر خروجیِ تجمیعشده از چندین واحد ترجمه مورد نیاز است، باید به جای آن از stderr استفاده شود.
در مثال زیر، اطلاعات بهینهسازی به stderr فرستاده میشود:
gcc -O3 -fopt-info
این مثال:
gcc -O3 -fopt-info-missed=missed.all
گزارش بهینهسازیهای از دست رفته از تمام گذرها را در missed.all خروجی میدهد، و این دستور:
gcc -O2 -ftree-vectorize -fopt-info-vec-missed
اطلاعات مربوط به فرصتهای بهینهسازی از دست رفته از گذرهای بردارسازی را در stderr چاپ میکند. توجه داشته باشید که -fopt-info-vec-missed معادل -fopt-info-missed-vec است. ترتیب نامهای گروه بهینهسازی و انواع پیامهای ذکرشده پس از -fopt-info اهمیتی ندارد.
به عنوان مثالی دیگر:
gcc -O3 -fopt-info-inline-optimized-missed=inline.txt
اطلاعات مربوط به بهینهسازیهای از دست رفته و همچنین مکانهای بهینهشده از تمام گذرهای درونخطیسازی را در 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 که پیام را صادر کرده است، و.IP * 4 محل در خودِ کد GCC که پیام از آنجا صادر شده است
علاوه بر این، برخی پیامها به لحاظ منطقی درون پیامهای دیگر تودرتو شدهاند که بازتابدهندهٔ جزئیات پیادهسازی گذرهای بهینهسازی است.
- -fsched-verbose=n
- در اهدافی
که از
زمانبندی
دستورالعملها
استفاده
میکنند،
این گزینه
میزان
خروجی
اشکالزدایی
چاپشده
توسط
زمانبند
در
فایلهای
تخلیه (dump) را
کنترل
میکند.
به ازای n بزرگتر از صفر، -fsched-verbose همان اطلاعات -fdump-rtl-sched1 و -fdump-rtl-sched2 را خروجی میدهد. به ازای n بزرگتر از یک، احتمالهای بلوک پایه، اطلاعات تفصیلی فهرست آماده و اطلاعات unit/insn را نیز خروجی میدهد. به ازای n بزرگتر از دو، شامل RTL در نقطهٔ لغو (abort)، جریان کنترل و اطلاعات ناحیهها میشود. و برای n بیشتر از چهار، -fsched-verbose شامل اطلاعات وابستگی نیز خواهد بود.
- -fenable-kind-pass
- -fdisable-kind-pass=range-list
- این مجموعهای از گزینهها است که برای غیرفعالسازی یا فعالسازی صریح گذرهای بهینهسازی به کار میروند. این گزینهها برای استفاده در اشکالزدایی GCC در نظر گرفته شدهاند. کاربران کامپایلر در عوض باید از گزینههای معمولی برای فعالسازی/غیرفعالسازی گذرها استفاده کنند.
- -fdisable-ipa-pass
- گذر IPA با نام pass را غیرفعال میکند. pass نام گذر است. اگر همان گذر به صورت ایستا چندین بار در کامپایلر فراخوانی شود، یک شمارهٔ ترتیبی که از ۱ شروع میشود باید به انتهای نام گذر اضافه شود.
- -fdisable-rtl-pass
- -fdisable-rtl-pass=range-list
- گذر RTL با نام pass را غیرفعال میکند. pass نام گذر است. اگر همان گذر به صورت ایستا چندین بار در کامپایلر فراخوانی شود، یک شمارهٔ ترتیبی که از ۱ شروع میشود باید به انتهای نام گذر الحاق شود. range-list فهرستی از محدودههای توابع یا نامهای اسمبلر است که با کاما از هم جدا شدهاند. هر محدوده یک جفت عدد است که با دو نقطه از هم جدا شدهاند. محدوده در هر دو انتها مشمول بازه است. اگر محدوده بدیهی باشد، جفت عدد میتواند به یک عدد منفرد ساده شود. اگر uid گرهٔ گراف فراخوانی تابع درون یکی از محدودههای مشخصشده قرار گیرد، pass برای آن تابع غیرفعال میشود. مقدار uid در سرآیند تابع در یک فایل تخلیه (dump file) نمایش داده میشود و نامهای گذر را میتوان با استفاده از گزینهٔ -fdump-passes استخراج کرد.
- -fdisable-tree-pass
- -fdisable-tree-pass=range-list
- گذر درختی pass را غیرفعال میکند. برای شرح آرگومانهای گزینه به -fdisable-rtl مراجعه کنید.
- -fenable-ipa-pass
- گذر IPA با نام pass را فعال میکند. pass نام گذر است. اگر همان گذر به صورت ایستا چندین بار در کامپایلر فراخوانی شود، یک شمارهٔ ترتیبی که از ۱ شروع میشود باید به انتهای نام گذر اضافه شود.
- -fenable-rtl-pass
- -fenable-rtl-pass=range-list
- گذر RTL با نام pass را فعال میکند. برای شرح آرگومانهای گزینه و مثالها به -fdisable-rtl مراجعه کنید.
- -fenable-tree-pass
- -fenable-tree-pass=range-list
- گذر درختی pass را فعال میکند. برای شرح آرگومانهای گزینه به -fdisable-rtl مراجعه کنید.
در اینجا مثالهایی آورده شده است که نحوهٔ استفاده از این گزینهها را نشان میدهند.
# disable ccp1 for all functions -fdisable-tree-ccp1 # disable complete unroll for function whose cgraph node uid is 1 -fenable-tree-cunroll=1 # disable gcse2 for functions at the following ranges [1,1], # [300,400], and [400,1000] # disable gcse2 for functions foo and foo2 -fdisable-rtl-gcse2=foo,foo2 # disable early inlining -fdisable-tree-einline # disable ipa inlining -fdisable-ipa-inline # enable tree full unroll -fenable-tree-unroll
- -fchecking
- -fchecking=n
- بررسی سازگاری درونی را فعال میکند. مقدار پیشفرض به پیکربندی کامپایلر بستگی دارد. -fchecking=2 بررسیهای سازگاری درونی بیشتری را فعال میکند که ممکن است بر تولید کد تأثیر بگذارند.
- -frandom-seed=string
- این گزینه
بذری (seed) را
فراهم
میکند که GCC
به جای
اعداد
تصادفی، در
تولید
نامهای
نمادهای
خاصی که
باید در هر
فایل
کامپایلشده
متفاوت
باشند، از
آن استفاده
میکند.
همچنین
برای قرار
دادن
مُهرهای
یکتا در
فایلهای
دادههای
پوشش (coverage data) و
فایلهای
شیئی (object files) که
آنها را
تولید
میکنند،
استفاده
میشود.
میتوانید
از گزینهٔ
-frandom-seed برای
تولید
فایلهای
شیءِ
دقیقاً
یکسان به
شیوهٔ
بازتولیدپذیر
استفاده
کنید.
مقدار string میتواند یک عدد (دهدهی، هشتهشتی، یا شانزدهشانزدهی) یا یک رشتهٔ دلخواه باشد (که در این حالت با محاسبهٔ CRC32 به یک عدد تبدیل میشود).
مقدار string باید برای هر فایلی که کامپایل میکنید متفاوت باشد.
- -save-temps
- فایلهای
واسط
معمولاً
«موقت» را
به طور
دائمی
ذخیره
میکند؛
نامگذاری
آنها
مطابق با
آنچه در
توضیحات -dumpbase
و -dumpdir آمده
است، به
عنوان
فایلهای
خروجی کمکی
انجام
میشود.
هنگامی که در ترکیب با گزینهٔ خط فرمان -x استفاده شود، -save-temps به اندازهٔ کافی هوشمند است تا از رونویسی روی فایل منبع ورودی با پسوندی مشابه با یک فایل واسط جلوگیری کند. فایل واسط متناظر را میتوان با تغییر نام فایل منبع قبل از استفاده از -save-temps به دست آورد.
- -save-temps=cwd
- معادل با -save-temps -dumpdir ./ است.
- -save-temps=obj
- معادل با -save-temps -dumpdir outdir/ است، که در آن outdir/ دایرکتوری فایل خروجیِ مشخصشده پس از گزینهٔ -o است، شامل هرگونه جداکنندهٔ دایرکتوری. اگر از گزینهٔ -o استفاده نشود، سوئیچ -save-temps=obj مانند -save-temps=cwd عمل میکند.
- -time[=file]
- زمان
پردازنده (CPU)
صرفشده
توسط هر
زیرپردازه
در توالی
کامپایل را
گزارش
میدهد.
برای
فایلهای
منبع C، این
شامل خودِ
کامپایلر
اصلی و
اسمبلر است
(به علاوهٔ
پیونددهنده
در صورتی که
پیوند
انجام شود).
بدون مشخص کردن یک فایل خروجی، خروجی به این صورت خواهد بود:
# cc1 0.12 0.01 # as 0.00 0.01
اولین عدد در هر خط «زمان کاربر» (user time) است، یعنی زمانی که صرف اجرای خود برنامه شده است. عدد دوم «زمان سیستم» (system time) است، یعنی زمانی که صرف اجرای روالهای سیستمعامل به نیابت از برنامه شده است. هر دو عدد بر حسب ثانیه هستند.
با مشخص کردن یک فایل خروجی، خروجی به فایل نامبرده الحاق میشود و به این صورت خواهد بود:
0.12 0.01 cc1 <options> 0.00 0.01 as <options>
«زمان کاربر» و «زمان سیستم» به پیش از نام برنامه منتقل میشوند و گزینههای ارسالی به برنامه نمایش داده میشوند تا بعداً بتوان تشخیص داد چه فایلی و با چه گزینههایی در حال کامپایل بوده است.
- -fdump-final-insns[=file]
- نمایش
درونی
نهایی (RTL) را
در file تخلیه
میکند. اگر
آرگومان
اختیاری
حذف شود (یا
اگر file
برابر با
"."
باشد)، نام
فایل تخلیه
با الحاق
".gkd" به
نام پایهٔ
تخلیه
تعیین
میشود؛ به
-dumpbase مراجعه
کنید..IP
-fcompare-debug[=opts] 4 اگر
خطایی در
حین
کامپایل رخ
ندهد،
کامپایلر
را برای بار
دوم اجرا
میکند و opts
و -fcompare-debug-second را به
آرگومانهای
ارسالشده
به کامپایل
دوم
میافزاید.
نمایش
داخلی
نهایی را در
هر دو
کامپایل
ذخیره (dump)
کرده و در
صورت وجود
تفاوت میان
آنها،
خطایی چاپ
میکند.
اگر علامت مساوی حذف شود، مقدار پیشفرض -gtoggle استفاده میشود.
متغیر محیطی GCC_COMPARE_DEBUG در صورت تعریف شدن، خالی نبودن و ناصفر بودن، بهطور ضمنی -fcompare-debug را فعال میکند. اگر GCC_COMPARE_DEBUG به رشتهای مقداردهی شود که با خط تیره آغاز میشود، از آن برای opts استفاده خواهد شد؛ در غیر این صورت پیشفرض -gtoggle به کار میرود.
گزینهٔ -fcompare-debug= همراه با علامت مساوی اما بدون opts، معادل -fno-compare-debug است که ذخیرهسازی نمایش نهایی و کامپایل دوم را غیرفعال کرده و حتی از اثرگذاری GCC_COMPARE_DEBUG نیز جلوگیری میکند.
برای بررسی پوشش کامل در حین آزمون -fcompare-debug، مقدار GCC_COMPARE_DEBUG را مثلاً روی -fcompare-debug-not-overridden تنظیم کنید که GCC آن را به عنوان یک گزینهٔ نامعتبر در هر کامپایل واقعی (به جز پیشپردازش، اسمبلی یا پیوند) رد میکند. برای دریافت صرفاً یک هشدار، تنظیم GCC_COMPARE_DEBUG روی -w%n-fcompare-debug not overridden کافی خواهد بود.
- -fcompare-debug-second
- این گزینه
بهطور
ضمنی به
همراه
گزینههایی
برای خاموش
کردن
هشدارها و
حذف سایر
گزینههایی
که باعث
میشوند
کامپایلر
به عنوان
اثر جانبی
در فایلها
یا خروجی
استاندارد
چیزی
بنویسد،
برای
کامپایل
دومی که
توسط -fcompare-debug
درخواست
شده به
کامپایلر
فرستاده
میشود.
فایلهای
تخلیه (dump) و
فایلهای
موقت
نگهداریشده
به گونهای
تغییر نام
مییابند
که در حین
کامپایل
دوم حاوی
پسوند
اضافی
".gk"
باشند تا از
رونویسی
موارد
ایجادشده
توسط
کامپایل
اول
جلوگیری
شود.
هنگامی که این گزینه به درایور کامپایلر ارسال میشود، باعث میگردد از کامپایل اول صرفنظر شود که این امر کاربرد چندانی به جز اشکالزدایی خود کامپایلر ندارد.
- -gtoggle
- تولید اطلاعات اشکالزدایی را در صورتی که بدون این گزینه تولید میشد خاموش میکند، یا در غیر این صورت آن را در سطح ۲ روشن مینماید. جایگاه این آرگومان در خط فرمان اهمیتی ندارد؛ این گزینه پس از پردازش سایر گزینهها اعمال میشود و صرفنظر از اینکه چند بار مشخص شده باشد، تنها یک بار عمل میکند. کاربرد اصلی این گزینه همراه با -fcompare-debug است.
- -fvar-tracking-assignments-toggle
- گزینهٔ -fvar-tracking-assignments را تغییر وضعیت میدهد (toggle)، درست به همان روشی که -gtoggle گزینهٔ -g را تغییر میدهد.
- -Q
- هنگامی که
در خط فرمان
پیش از --help=
استفاده
شود، -Q به
عنوان
تغییردهندهٔ
خروجی
راهنما عمل
میکند.
در غیر این صورت، این گزینه باعث میشود کامپایلر نام هر تابع را هنگام کامپایل شدن چاپ کرده و پس از پایان هر گذر (pass)، آمارهایی دربارهٔ آن ارائه دهد.
- -ftime-report
- باعث
میشود
کامپایلر
پس از پایان
هر گذر،
آمارهایی
دربارهٔ
زمان
صرفشده
توسط آن گذر
در stderr چاپ کند.
اگر خروجی SARIF برای اعلانهای تشخیصی از طریق -fdiagnostics-format=sarif-file یا -fdiagnostics-format=sarif-stderr درخواست شده باشد، اطلاعات -ftime-report در قالب JSON به عنوان بخشی از خروجی SARIF منتشر میشود. قالب دقیق این دادههای JSON ممکن است تغییر کند و مقادیر به دلیل ثبت شدن در مکانی کمی متفاوت درون کامپایلر، ممکن است دقیقاً با مقادیر ارسالشده به stderr یکسان نباشند.
- -ftime-report-details
- زمان صرفشده توسط بخشهای زیرساختی را برای هر گذر به صورت جداگانه ثبت میکند.
- -fira-verbose=n
- میزان پرگویی (verbosity) فایل تخلیه را برای تخصیصدهندهٔ یکپارچهٔ ثباتها (IRA) کنترل میکند. مقدار پیشفرض ۵ است. اگر مقدار n بزرگتر یا مساوی ۱۰ باشد، خروجی با قالبی معادل n منهای ۱۰ به stderr فرستاده میشود.
- -flto-report
- گزارشی با
جزئیات
درونی
دربارهٔ
نحوهٔ
کارکرد
بهینهساز
زمان پیوند
(LTO) چاپ
میکند.
محتوای این
گزارش از
نسخهای به
نسخهٔ دیگر
متفاوت است.
هدف آن
ارائهٔ
اطلاعات
کاربردی به
توسعهدهندگان
GCC در زمان
پردازش
فایلهای
شیء در حالت
LTO (از طریق -flto)
است.
بهطور پیشفرض غیرفعال است.
- -flto-report-wpa
- مشابه -flto-report، اما فقط اطلاعات فاز WPA در بهینهسازی زمان پیوند را چاپ میکند.
- -fmem-report
- باعث میشود کامپایلر پس از اتمام کار، آمارهایی دربارهٔ تخصیص حافظهٔ دائمی چاپ کند.
- -fmem-report-wpa
- باعث میشود کامپایلر آمارهایی دربارهٔ تخصیص حافظهٔ دائمی تنها برای فاز WPA چاپ کند.
- -fpre-ipa-mem-report
- -fpost-ipa-mem-report
- باعث میشود کامپایلر آمارهایی دربارهٔ تخصیص حافظهٔ دائمی قبل یا بعد از بهینهسازی میانروالی (IPA) چاپ کند.
- -fmultiflags
- این گزینه
امکان
استفاده از
"TFLAGS"
آگاه از multilib
را برای
ساخت
کتابخانههای
مقصد با
گزینههایی
متفاوت از
آنچه
کامپایلر
بهطور
پیشفرض
برای
استفاده
پیکربندی
شده است، از
طریق
مشخصات (specs)
تنظیمشده
توسط اجزای
درونی
کامپایلر،
معماری
مقصد، یا
سازندگان
در زمان
پیکربندی
فراهم
میکند.
مانند "TFLAGS"، این گزینه اجازه میدهد کتابخانههای مقصد برای محیطهای پایهٔ قابلحمل ساخته شوند، در حالی که کامپایلر بهطور پیشفرض محیطهای پیشرفتهتر را هدف قرار میدهد. این ویژگی مفید است زیرا کاربران در صورتی که پیشفرضها برای محیط مقصدشان ایدهآل نباشد، میتوانند بهسادگی پیشفرضهای پیکربندیشده کامپایلر را برای ساخت برنامههای خود لغو کنند، در حالی که ساخت مجدد کتابخانههای زمان اجرا معمولاً به این آسانی یا خوشایندی نیست.
برخلاف "TFLAGS"، استفاده از مشخصات امکان انتخاب پرچمهای متفاوتی را برای multilibهای مختلف فراهم میکند. راه دستیابی به این هدف، ساخت با دستور make TFLAGS=-fmultiflags پس از پیکربندی با --with-specs=%{fmultiflags:...} است.
این گزینه پس از اتمام پردازش مشخصات خود درایور (driver self spec)، توسط درایور کنار گذاشته میشود.
همچنین بررسی اینکه آیا "TFLAGS" برای ساخت همهٔ کتابخانههای مقصد استفاده میشوند یا خیر مفید است، که با پیکربندی یک کامپایلر غیر خودراهانداز (non-bootstrap) با --with-specs='%{!fmultiflags:%emissing TFLAGS}' و سپس ساخت کامپایلر و کتابخانههای مقصد انجام میشود.
- -fprofile-report
- باعث میشود کامپایلر آمارهایی دربارهٔ سازگاری پروفایل (تخمینی) و اثر گذرهای جداگانه چاپ کند.
- -fstack-usage
- کامپایلر را وادار میکند تا اطلاعات میزان مصرف پشته (stack usage) را برای برنامه، بر مبنای هر تابع خروجی دهد. نام فایل تخلیه با افزودن .su به auxname ساخته میشود. مقدار auxname در صورتی که فایل خروجی بهطور صریح مشخص شده باشد و یک فایل اجرایی نباشد، از نام آن فایل تولید میشود، در غیر این صورت نام پایهٔ (basename) فایل منبع خواهد بود. هر مدخل از سه فیلد تشکیل شده است:
- نام تابع.
- تعداد بایتها.
- یک یا چند توصیفکننده: "static"، "dynamic"، "bounded".
توصیفکنندهٔ "static" بدین معناست که تابع پشته را بهطور ایستا مدیریت میکند: تعداد مشخص و ثابتی از بایتها در هنگام ورود به تابع برای فریم تخصیص مییابد و هنگام خروج از تابع آزاد میشود؛ هیچ تغییر یا تنظیم دیگری در پشته در طول تابع انجام نمیشود. فیلد دوم همین تعداد بایت ثابت است.
توصیفکنندهٔ "dynamic" بدین معناست که تابع پشته را بهطور پویا مدیریت میکند: علاوه بر تخصیص ایستای شرحدادهشده در بالا، تنظیماتی روی پشته در بدنهٔ تابع انجام میگیرد، برای مثال برای push/pop کردن آرگومانها در زمان فراخوانی توابع. اگر توصیفکنندهٔ "bounded" نیز وجود داشته باشد، مقدار این تنظیمات در زمان کامپایل محدود است و فیلد دوم کران بالای کل پشتهٔ استفادهشده توسط تابع را نشان میدهد. اگر این توصیفکننده وجود نداشته باشد، مقدار این تنظیمات در زمان کامپایل نامحدود است و فیلد دوم تنها نشاندهندهٔ بخش محدود خواهد بود.
- -fstats
- در پایان کامپایل، آمارهایی دربارهٔ پردازش فرانتاند (front-end) منتشر میکند. این گزینه تنها توسط فرانتاند C++ پشتیبانی میشود و اطلاعات آن عموماً فقط برای تیم توسعهٔ G++ کاربرد دارد.
- -fdbg-cnt-list
- نام و کران بالای شمارنده را برای تمام شمارندههای اشکالزدایی چاپ میکند.
- -fdbg-cnt=counter-value-list
- کران پایین و کران بالای شمارندهٔ اشکالزدایی داخلی را تعیین میکند. آرگومان counter-value-list فهرستی جداشده با کاما از چندتاییهای name:lower_bound1-upper_bound1 [:lower_bound2-upper_bound2...] است که نام شمارنده و فهرستی از بازههای بسته را مشخص میکند. مقدار lower_bound اختیاری است و اگر تنظیم نشود با صفر مقداردهی اولیه میشود. برای مثال، با گزینهٔ -fdbg-cnt=dce:2-4:10-11,tail_call:10، عبارت dbg_cnt(dce) تنها برای فراخوانیهای دوم، سوم، چهارم، دهم و یازدهم مقدار true برمیگرداند. برای dbg_cnt(tail_call)، برای ۱۰ فراخوانی اول مقدار true بازگردانده میشود..IP -print-file-name=library 4 نام کامل و مطلق فایل کتابخانهٔ library را که هنگام پیوند زدن استفاده میشود، چاپ میکند---و کار دیگری انجام نمیدهد. با این گزینه، GCC هیچ چیزی را کامپایل یا پیوند نمیزند؛ بلکه فقط نام فایل را چاپ میکند.
- -print-multi-directory
- نام دایرکتوری متناظر با multilib انتخابشده توسط هر سوییچ دیگری که در خط فرمان وجود دارد را چاپ میکند. فرض بر این است که این دایرکتوری در GCC_EXEC_PREFIX وجود دارد.
- -print-multi-lib
- نگاشت نام دایرکتوریهای multilib به سوییچهای کامپایلری که آنها را فعال میکنند را چاپ میکند. نام دایرکتوری با یک ; از سوییچها جدا میشود و هر سوییچ بهجای - با یک @ شروع میشود، بدون هیچ فاصلهای بین سوییچهای چندگانه. این ساختار برای تسهیل پردازش در شل در نظر گرفته شده است.
- -print-multi-os-directory
- مسیر کتابخانههای سیستمعامل را برای multilib انتخابشده، به صورت نسبی نسبت به برخی زیردایرکتوریهای lib چاپ میکند. اگر کتابخانههای سیستمعامل در زیردایرکتوری lib موجود باشند و از هیچ multilib دیگری استفاده نشود، این مسیر معمولاً فقط . است؛ اگر کتابخانههای سیستمعامل در دایرکتوریهای همسطحِ libsuffix قرار داشته باشند، برای مثال ../lib64، ../lib یا ../lib32 چاپ میشود؛ یا اگر کتابخانههای سیستمعامل در زیردایرکتوریهای lib/subdir قرار داشته باشند، برای مثال amd64، sparcv9 یا ev6 چاپ میشود.
- -print-multiarch
- مسیر کتابخانههای سیستمعامل را برای multiarch انتخابشده، به صورت نسبی نسبت به برخی زیردایرکتوریهای lib چاپ میکند.
- -print-prog-name=program
- مشابه -print-file-name عمل میکند، اما به دنبال یک برنامه مانند cpp میگردد.
- -print-libgcc-file-name
- مشابه -print-file-name=libgcc.a
است.
این گزینه زمانی مفید است که از -nostdlib یا -nodefaultlibs استفاده میکنید اما میخواهید با libgcc.a پیوند ایجاد کنید. میتوانید این دستور را اجرا کنید:
gcc -nostdlib <files>... `gcc -print-libgcc-file-name`
- -print-search-dirs
- نام
دایرکتوری
نصب
پیکربندیشده
و فهرستی از
دایرکتوریهای
برنامه و
کتابخانه
را که gcc
جستجو
میکند چاپ
میکند---و
کار دیگری
انجام
نمیدهد.
این گزینه زمانی کاربرد دارد که gcc پیام خطای installation problem, cannot exec cpp0: No such file or directory را چاپ میکند. برای برطرف کردن این مشکل، یا باید cpp0 و سایر اجزای کامپایلر را در جایی که gcc انتظار دارد قرار دهید، یا متغیر محیطی GCC_EXEC_PREFIX را روی دایرکتوری محل نصب آنها تنظیم کنید. اسلش پایانی / را فراموش نکنید.
- -print-sysroot
- دایرکتوری sysroot مقصد را که در طول کامپایل استفاده میشود، چاپ میکند. این همان sysroot مقصدی است که یا در زمان پیکربندی یا با استفاده از گزینهٔ --sysroot مشخص شده است؛ احتمالاً همراه با یک پسوند اضافی که به گزینههای کامپایل بستگی دارد. اگر هیچ sysroot مقصدی مشخص نشده باشد، این گزینه چیزی چاپ نمیکند.
- -print-sysroot-headers-suffix
- پسوندی را که هنگام جستجو برای سرآیندها به sysroot مقصد اضافه میشود چاپ میکند، یا در صورتی که کامپایلر با چنین پسوندی پیکربندی نشده باشد خطایی صادر میکند---و کار دیگری انجام نمیدهد.
- -dumpmachine
- ماشین مقصد کامپایلر را (برای مثال، i686-pc-linux-gnu) چاپ میکند---و کار دیگری انجام نمیدهد.
- -dumpversion
- نسخهٔ کامپایلر را (برای مثال، 3.0، 6.3.0 یا 7) چاپ میکند---و کار دیگری انجام نمیدهد. این همان نسخهٔ کامپایلری است که در مسیرهای سیستم فایل و specs استفاده میشود. بسته به نحوهٔ پیکربندی کامپایلر، این مقدار میتواند فقط یک عدد منفرد (نسخه اصلی)، دو عدد جداشده با نقطه (نسخه اصلی و فرعی)، یا سه عدد جداشده با نقطه (نسخه اصلی، فرعی و patchlevel) باشد.
- -dumpfullversion
- نسخهٔ کامل کامپایلر را چاپ میکند---و کار دیگری انجام نمیدهد. خروجی همیشه سه عدد جداشده با نقطه است: نسخهٔ اصلی، فرعی و patchlevel.
- -dumpspecs
- مشخصات توکار (built-in specs) کامپایلر را چاپ میکند---و کار دیگری انجام نمیدهد. (این گزینه هنگام بیلد شدن خود GCC استفاده میشود.).SS "گزینههای وابسته به ماشین (Machine-Dependent Options)" هر ماشین مقصدی که توسط GCC پشتیبانی میشود میتواند گزینههای خاص خود را داشته باشد---برای نمونه، جهت امکانپذیر ساختن کامپایل برای نوع خاصی از پردازنده یا ABI، یا برای کنترل بهینهسازیهای مختص آن ماشین. طبق قرارداد، نام گزینههای مختص ماشین با -m آغاز میشود.
برخی از پیکربندیهای کامپایلر همچنین از گزینههای مختص ماشین مقصد اضافی پشتیبانی میکنند، که معمولاً برای سازگاری با سایر کامپایلرها در همان پلتفرم است.
گزینههای AArch64
این گزینهها برای پیادهسازیهای AArch64 تعریف شدهاند:
- -mabi=name
- تولید کد
برای مدل
داده
مشخصشده.
مقادیر
مجاز
عبارتند از
ilp32 برای مدل
داده شبیه
به SysV که در آن
int ،long int و
اشارهگرها
۳۲ بیتی
هستند، و lp64
برای مدل
داده شبیه
به SysV که در آن
int برابر ۳۲
بیت است اما
long int و
اشارهگرها
۶۴ بیتی
هستند.
مقدار پیشفرض به پیکربندی مشخص مقصد بستگی دارد. توجه داشته باشید که ABIهای LP64 و ILP32 از نظر پیوند سازگار نیستند (link-compatible)؛ شما باید کل برنامه خود را با همان 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. برنامه و نمادهای تعریفشده بهصورت ایستای آن باید در فاصله حداکثر ۱ مگابایت از یکدیگر قرار گیرند. برنامهها میتوانند بهصورت ایستا یا پویا پیوند داده شوند.
- -mcmodel=small
- تولید کد برای مدل کد small. برنامه و نمادهای تعریفشده بهصورت ایستای آن باید در فاصله حداکثر ۴ گیگابایت از یکدیگر قرار گیرند. برنامهها میتوانند بهصورت ایستا یا پویا پیوند داده شوند. این مدل کد پیشفرض است.
- -mcmodel=large
- تولید کد برای مدل کد large. این مدل هیچ فرضی درباره آدرسها و اندازه بخشها (sections) نمیکند. برنامهها تنها میتوانند بهصورت ایستا پیوند داده شوند. گزینه -mcmodel=large با گزینههای -mabi=ilp32، -fpic و -fPIC ناسازگار است.
- -mtp=name
- مشخص کردن ثبات سیستمی مورد استفاده به عنوان اشارهگر ریسه (thread pointer). مقادیر معتبر عبارتند از tpidr_el0، tpidrro_el0، tpidr_el1، tpidr_el2 و tpidr_el3. برای سازگاری عقبروی، نامهای مستعار el0، el1، el2 و el3 نیز پذیرفته میشوند. تنظیم پیشفرض tpidr_el0 است. توصیه میشود تمام کدهایی که قرار است با یکدیگر همکاری داشته باشند را با همان مقدار این گزینه کامپایل کنید تا از دسترسی به یک اشارهگر ریسه متفاوت از سطح استثنای (exception level) نادرست جلوگیری شود.
- -mstrict-align
- -mno-strict-align
- اجتناب از یا مجاز دانستن تولید دسترسیهای حافظهای که ممکن است بر روی مرز طبیعی شیء (آنگونه که در مشخصات معماری شرح داده شده است) تراز نشده باشند.
- -momit-leaf-frame-pointer
- -mno-omit-leaf-frame-pointer
- حذف کردن یا نگهداشتن اشارهگر فریم (frame pointer) در توابع برگ (leaf functions). رفتار نخست، پیشفرض است.
- -mstack-protector-guard=guard
- -mstack-protector-guard-reg=reg
- -mstack-protector-guard-offset=offset
- تولید کد
محافظت از
پشته با
استفاده از
قناری (canary) در
guard.
مکانهای
پشتیبانیشده
عبارتند از
global برای یک
قناری
سراسری یا
sysreg برای
قناری در یک
ثبات
سیستمی
مناسب.
با انتخاب گزینه دوم، گزینههای -mstack-protector-guard-reg=reg و -mstack-protector-guard-offset=offset علاوه بر این مشخص میکنند که کدام ثبات سیستمی به عنوان ثبات پایه برای خواندن قناری استفاده شود و از چه آفستی نسبت به آن ثبات پایه باشد. هیچ ثبات یا آفست پیشفرضی وجود ندارد چرا که این قابلیت تماماً برای استفاده درون کرنل لینوکس است.
- -mtls-dialect=desc
- استفاده از توصیفگرهای TLS به عنوان سازوکار حافظه محلی ریسه (thread-local storage) برای دسترسیهای پویای متغیرهای TLS. این حالت پیشفرض است.
- -mtls-dialect=traditional
- استفاده از TLS سنتی به عنوان سازوکار حافظه محلی ریسه برای دسترسیهای پویای متغیرهای TLS.
- -mtls-size=size
- مشخص کردن اندازه بیتی آفستهای بیواسطه در TLS. مقادیر معتبر عبارتند از 12، 24، 32، 48. این گزینه نیازمند binutils نسخه 2.26 یا جدیدتر است.
- -mfix-cortex-a53-835769
- -mno-fix-cortex-a53-835769
- فعال یا غیرفعال کردن راهکار دورزدن برای نقص فنی (erratum) شماره 835769 در ARM Cortex-A53. این کار شامل درج دستور NOP میان دستورالعملهای حافظه و دستورالعملهای ضرب و جمع انباشتی (multiply-accumulate) عدد صحیح ۶۴ بیتی است. در صورتی که معماری یا پردازندهای در خط فرمان مشخص شده باشد که به این راهکار نیاز نداشته باشد، این پرچم نادیده گرفته خواهد شد.
- -mfix-cortex-a53-843419
- -mno-fix-cortex-a53-843419
- فعال یا غیرفعال کردن راهکار دورزدن برای نقص فنی (erratum) شماره 843419 در ARM Cortex-A53. این راهکار در زمان پیوند (link time) اعمال میشود و تنها پرچم متناظر را به پیونددهنده ارسال خواهد کرد. در صورتی که معماری یا پردازندهای در خط فرمان مشخص شده باشد که به این راهکار نیاز نداشته باشد، این پرچم نادیده گرفته خواهد شد.
- -mlow-precision-recip-sqrt
- -mno-low-precision-recip-sqrt
- فعال یا غیرفعال کردن تقریب معکوس جذر. این گزینه تنها در صورتی اثرگذار است که -ffast-math یا -funsafe-math-optimizations نیز استفاده شده باشد. فعال کردن این گزینه، دقت نتایج معکوس ریشه دوم را برای دقت یگانه (single precision) به حدود ۱۶ بیت و برای دقت مضاعف (double precision) به ۳۲ بیت کاهش میدهد.
- -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" استفاده شود تا امکان تولید توالی کد کارآمدتری فراهم گردد..IP -moutline-atomics 4
- -mno-outline-atomics
- فراخوانی
توابع کمکی
برونخطی
(out-of-line helpers) را برای
پیادهسازی
عملیات
اتمیک فعال
یا غیرفعال
میکند. این
توابع کمکی
در زمان
اجرا مشخص
میکنند که
آیا
میتوان از
دستورالعملهای
LSE مربوط به ARMv8.1-A
استفاده
کرد یا خیر؛
در غیر این
صورت، از
دستورالعملهای
انحصاری
بارگذاری/ذخیرهسازی
(load/store-exclusive) موجود
در معماری
پایه ARMv8.0 ISA
استفاده
خواهند کرد.
این گزینه تنها هنگام کامپایل برای مجموعهدستورالعملهای پایه ARMv8.0 کاربرد دارد. در صورت استفاده از نگارشهای جدیدتر، مانند -march=armv8.1-a یا -march=armv8-a+lse، دستورالعملهای ARMv8.1-Atomics بهطور مستقیم استفاده خواهند شد. همین موضوع هنگام استفاده از -mcpu= در صورتی که پردازندهٔ انتخابشده از ویژگی lse پشتیبانی کند نیز صدق میکند. این گزینه بهطور پیشفرض فعال است.
- -march=name
- نام معماری
هدف و در
صورت
تمایل، یک
یا چند
اصلاحکنندهٔ
ویژگی را
مشخص
میکند. این
گزینه
قالبی به
صورت
-march=arch{+[no]feature}*
دارد.
جدول زیر مقادیر مجاز برای arch و ویژگیهایی که بهطور پیشفرض فعال میکنند را خلاصه میکند:
- مقدار arch : معماری : بهطور پیشفرض شامل
- armv8-a : Armv8-A : +fp, +simd
- armv8.1-a : Armv8.1-A : armv8-a, +crc, +lse, +rdma
- armv8.2-a : Armv8.2-A : armv8.1-a
- armv8.3-a : Armv8.3-A : armv8.2-a, +pauth, +fcma, +jscvt
- armv8.4-a : Armv8.4-A : armv8.3-a, +flagm, +fp16fml, +dotprod, +rcpc2
- armv8.5-a : Armv8.5-A : armv8.4-a, +sb, +ssbs, +predres, +frintts, +flagm2
- armv8.6-a : Armv8.6-A : armv8.5-a, +bf16, +i8mm
- armv8.7-a : Armv8.7-A : armv8.6-a, +wfxt, +xs
- armv8.8-a : Armv8.8-a : armv8.7-a, +mops
- armv8.9-a : Armv8.9-a : armv8.8-a
- armv9-a : Armv9-A : armv8.5-a, +sve, +sve2
- armv9.1-a : Armv9.1-A : armv9-a, +bf16, +i8mm
- armv9.2-a : Armv9.2-A : armv9.1-a, +wfxt, +xs
- armv9.3-a : Armv9.3-A : armv9.2-a, +mops
- armv9.4-a : Armv9.4-A : armv9.3-a, +sve2p1
- armv9.5-a : Armv9.4-A : armv9.4-a, cpa, +faminmax, +lut
- armv8-r : Armv8-R : armv8-r
مقدار native بر روی سامانههای بومی AArch64 GNU/Linux در دسترس است و باعث میشود کامپایلر معماری سیستم میزبان را انتخاب کند. این گزینه در صورتی که کامپایلر قادر به شناسایی معماری سیستم میزبان نباشد هیچ اثری نخواهد داشت. هنگامی که -march=native مشخص شود و هیچ گزینهٔ دیگر -mcpu یا -mtune داده نشده باشد، GCC پردازندهٔ میزبان را هم بهعنوان پردازنده برای بهینهسازی و هم برای انتخاب ویژگیهای معماری برمیگزیند؛ به عبارت دیگر، با -march=native مانند -mcpu=native رفتار میشود.
مقادیر مجاز برای feature در زیربخش aarch64-feature-modifiers,,-march and -mcpu Feature Modifiers فهرست شدهاند. در صورت تعیین اصلاحکنندههای ویژگی متناقض، ویژگی سمت راستتر اعمال خواهد شد.
کامپایلر GCC از name برای تعیین نوع دستورالعملهایی که میتواند هنگام تولید کد اسمبلی صادر کند، استفاده میکند. اگر -march بدون تعیین هیچیک از گزینههای -mtune یا -mcpu مشخص شود، کد بهگونهای بهینهسازی میشود که در میان طیفی از پردازندههای هدفی که معماری هدف را پیادهسازی کردهاند عملکرد خوبی داشته باشد.
- -mtune=name
- نام
پردازندهٔ
هدفی را
مشخص
میکند که GCC
باید
عملکرد کد
را برای آن
بهینهسازی
کند. مقادیر
مجاز برای
این گزینه
عبارتند از:
generic، cortex-a35، cortex-a53،
cortex-a55، cortex-a57،
cortex-a72، cortex-a73،
cortex-a75، cortex-a76،
cortex-a76ae، cortex-a77،
cortex-a65، cortex-a65ae،
cortex-a34، cortex-a78،
cortex-a78ae، cortex-a78c، ares،
exynos-m1، emag، falkor،
oryon-1، neoverse-512tvb،
neoverse-e1، neoverse-n1،
neoverse-n2، neoverse-v1،
neoverse-v2، grace، neoverse-v3،
neoverse-v3ae، neoverse-n3،
olympus، cortex-a725،
cortex-x925، qdf24xx، saphira،
phecda، xgene1، vulcan،
octeontx، octeontx81،
octeontx83، octeontx2،
octeontx2t98، octeontx2t96
octeontx2t93، octeontx2f95،
octeontx2f95n، octeontx2f95mm،
a64fx، fujitsu-monaka، thunderx،
thunderxt88، thunderxt88p1،
thunderxt81، tsv110،
thunderxt83، thunderx2t99،
thunderx3t110، zeus،
cortex-a57.cortex-a53، cortex-a72.cortex-a53،
cortex-a73.cortex-a35، cortex-a73.cortex-a53،
cortex-a75.cortex-a55، cortex-a76.cortex-a55،
cortex-r82، cortex-r82ae،
cortex-x1، cortex-x1c،
cortex-x2، cortex-x3، cortex-x4،
cortex-a510، cortex-a520،
cortex-a520ae، cortex-a710،
cortex-a715، cortex-a720،
cortex-a720ae، ampere1،
ampere1a، ampere1b، cobalt-100،
apple-m1، apple-m2، apple-m3 و
native.
مقادیر cortex-a57.cortex-a53، cortex-a72.cortex-a53، cortex-a73.cortex-a35، cortex-a73.cortex-a53، cortex-a75.cortex-a55، cortex-a76.cortex-a55، apple-m1، apple-m2، apple-m3 و gb10 مشخص میکنند که GCC باید برای یک سامانهٔ big.LITTLE بهینهسازی کند.
مقدار neoverse-512tvb مشخص میکند که GCC باید برای هستههای Neoverse بهینهسازی انجام دهد که (الف) ویژگی SVE را پیادهسازی کرده باشند و (ب) مجموع پهنای باند برداری آنها ۵۱۲ بیت در چرخه باشد. به عبارت دیگر، این گزینه به GCC میگوید برای هستههای Neoverse بهینهسازی کند که میتوانند در هر چرخه ۴ دستورالعمل محاسباتی ۱۲۸ بیتی Advanced SIMD و تعداد معادل آن از دستورالعملهای محاسباتی SVE در هر چرخه را اجرا نمایند (۲ دستور برای SVE ۲۵۶ بیتی، ۴ دستور برای SVE ۱۲۸ بیتی). این حالت نسبت به بهینهسازی برای یک هستهٔ خاص مانند Neoverse V1 کلیتر است، اما نسبت به بهینهسازی پیشفرضی که در ادامه شرح داده شده خاصتر میباشد.
علاوه بر این، در سامانههای بومی AArch64 GNU/Linux مقدار native عملکرد را برای سیستم میزبان بهینهسازی میکند. در صورتی که کامپایلر قادر به شناسایی پردازندهٔ سیستم میزبان نباشد، این گزینه هیچ اثری نخواهد داشت.
چنانچه هیچکدام از -mtune=، -mcpu= یا -march= مشخص نشده باشند، کد بهگونهای بهینهسازی میشود که در میان طیفی از پردازندههای هدف عملکرد مطلوبی داشته باشد.
این گزینه نمیتواند دارای پسوند اصلاحکنندههای ویژگی باشد.
- -mcpu=name
- نام
پردازندهٔ
هدف را مشخص
میکند که
میتواند
به صورت
اختیاری
دارای یک یا
چند
اصلاحکنندهٔ
ویژگی به
عنوان
پسوند باشد.
این گزینه
قالبی به
شکل
-mcpu=cpu{+[no]feature}*
دارد، که در
آن مقادیر
مجاز برای
cpu همان
مقادیر
موجود برای
-mtune هستند.
مقادیر
مجاز برای
feature در
زیربخش
مربوط به
aarch64-feature-modifiers,,-march and -mcpu
Feature Modifiers مستند
شدهاند. در
صورت تعیین
اصلاحکنندههای
ویژگی
متناقض،
ویژگی سمت
راستتر
استفاده
میشود.
کامپایلر GCC از name برای تعیین نوع دستورالعملهایی که میتواند هنگام تولید کد اسمبلی صادر کند (همانند -march) و تعیین پردازندهٔ هدفی که عملکرد برای آن بهینهسازی میشود (همانند -mtune) استفاده میکند. در مواردی که این گزینه در کنار -march یا -mtune استفاده شود، آن گزینهها نسبت به بخش مربوطه از این گزینه اولویت خواهند داشت.
گزینهٔ -mcpu=neoverse-512tvb خاص است، چرا که به یک هستهٔ مشخص اشاره نمیکند، بلکه به تمام هستههای Neoverse اشاره دارد که (الف) SVE را پیادهسازی کردهاند و (ب) مجموع پهنای باند برداری آنها ۵۱۲ بیت در چرخه است. مگر در صورتی که توسط -march لغو شود، -mcpu=neoverse-512tvb کدی تولید میکند که میتواند بر روی یک هستهٔ Neoverse V1 اجرا شود، زیرا Neoverse V1 نخستین هستهٔ Neoverse دارای این ویژگیها است. مگر در صورتی که توسط -mtune لغو شود، -mcpu=neoverse-512tvb کد را به همان شیوهای بهینهسازی میکند که -mtune=neoverse-512tvb عمل مینماید.
- -moverride=string
- تصمیمات
بهینهسازی
گرفتهشده
توسط بخش
پشتی (back-end) در
پاسخ به
گزینهٔ -mtune=
را لغو (override)
میکند. نحو
(syntax)، معانی (semantics)
و مقادیر
پذیرفتهشده
برای string در
این گزینه
در میان
نسخههای
مختلف
تضمینشده
نیستند و
ممکن است
سازگار
نباشند.
این گزینه تنها برای استفاده در هنگام توسعهٔ GCC در نظر گرفته شده است..IP -mverbose-cost-dump 4 فعالسازی تخلیه پرجزئیات مدل هزینه در فایلهای تخلیه اشکالزدایی. این گزینه برای استفاده در اشکالزدایی کامپایلر ارائه شده است.
- -mpc-relative-literal-loads
- -mno-pc-relative-literal-loads
- فعال یا غیرفعال کردن بارگذاری مقادیر صریح وابسته به PC. با این گزینه، مخازن مقادیر صریح با استفاده از یک دستورالعمل واحد مورد دسترسی قرار گرفته و پس از هر تابع درج میشوند. این کار بیشینه اندازه توابع را به 1MB محدود میکند. این گزینه بهطور پیشفرض برای -mcmodel=tiny فعال است.
- -msign-return-address=scope
- انتخاب دامنه تابعی که امضای نشانی بازگشت روی آن اعمال خواهد شد. مقادیر مجاز عبارتند از: none که امضای نشانی بازگشت را غیرفعال میکند، non-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-key به جای A-key به کار رود. bti سازوکار شناسایی هدف انشعاب را فعال میکند. gcs تولید کد سازگار با پشته کنترلی حفاظتشده (GCS) را فعال میکند.
- -mharden-sls=opts
- فعالسازی مقاومسازی کامپایلر در برابر حدس و گمان مستقیم (SLS). opts فهرستی از گزینههای زیر است که با کاما از هم جدا شدهاند:
علاوه بر این، -mharden-sls=all تمامی مقاومسازیهای SLS را فعال کرده و -mharden-sls=none تمام آنها را غیرفعال میسازد.
- -mearly-ra=scope
- تعیین زمان
فعالسازی
گذر
زودهنگام
تخصیص ثبات.
این گذر پیش
از
زمانبندی
دستورالعملها
اجرا شده و
تلاش
میکند
تخصیصی
بدون ریزش
(spill-free) برای
کدهای ممیز
شناور و
برداری
بیابد.
همچنین
تلاش
میکند از
دستورالعملهای
چندثباتی
گامدار،
مانند LD1 و ST1
گامدار در
SME2 استفاده
کند.
مقادیر ممکن برای scope عبارتند از: all که گذر را روی تمام توابع اجرا میکند؛ strided که گذر را روی توابعی که به دستورالعملهای چندثباتی گامدار دسترسی دارند اجرا میکند؛ و none که گذر را غیرفعال میسازد.
گزینه -mearly-ra=all برای -O2 و بالاتر، و همچنین برای -Os پیشفرض است. در غیر این صورت، پیشفرض -mearly-ra=none خواهد بود.
- -mearly-ldp-fusion
- فعالسازی نسخه گذر ادغام جفت بارگذاری/ذخیرهسازی در AArch64 که پیش از تخصیص ثبات اجرا میشود. بهطور پیشفرض در -O و بالاتر فعال است.
- -mlate-ldp-fusion
- فعالسازی نسخه گذر ادغام جفت بارگذاری/ذخیرهسازی در AArch64 که پس از تخصیص ثبات اجرا میشود. بهطور پیشفرض در -O و بالاتر فعال است.
- -msve-vector-bits=bits
- مشخص کردن
تعداد
بیتها در
یک ثبات
برداری SVE.
این گزینه
تنها زمانی
تأثیر دارد
که SVE فعال
باشد.
کامپایلر GCC از دو شیوه تولید کد SVE پشتیبانی میکند: خروجی «مستقل از طول بردار» که با هر اندازهای از ثبات برداری کار میکند، و خروجی «وابسته به طول بردار» که به GCC اجازه میدهد در صورت سودمند بودن برای بهینهسازی، فرضیاتی در رابطه با طول بردار داشته باشد. مقادیر ممکن برای bits عبارتند از: scalable، 128، 256، 512، 1024 و 2048. مشخص کردن scalable خروجی مستقل از طول بردار را انتخاب میکند. در حال حاضر -msve-vector-bits=128 نیز برای اهداف big-endian خروجی مستقل از طول بردار تولید میکند. تمامی مقادیر دیگر کدهای وابسته به طول بردار تولید مینمایند. رفتار این مقادیر ممکن است در انتشارهای آینده تغییر کند و برای تولید کدی که بین طولهای مختلف سختافزاری بردار SVE قابل حمل باشد، به هیچ مقداری جز scalable نباید اتکا کرد.
پیشفرض -msve-vector-bits=scalable است که کدهای مستقل از طول بردار تولید میکند.
- -Wexperimental-fmv-target
- هشدار درباره استفاده از قابلیت آزمایشی چندنسخهای بودن تابع (FMV). مشخصات الحاقی زبان C برای Arm مربوط به قابلیت چندنسخهای بودن تابع در مرحله بتا بوده و ممکن است تغییر کند. هرگونه استفاده از 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
- فعالسازی دستورالعملهای افزونه برداری مقیاسپذیر (SVE). این گزینه همچنین دستورالعملهای Advanced SIMD و ممیز شناور را فعال میسازد.
- lse
- فعالسازی دستورالعملهای افزونه سامانه بزرگ (LSE). این گزینه بهطور پیشفرض برای -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 را برای معناشناسی اتمیک بارگذاری-اکتساب فراهم کرده و آن را به اسمبلر منتقل میکند، که به دستورهای inline asm اجازه میدهد از دستورالعملهای افزونه RCpc استفاده کنند.
- dotprod
- فعالسازی افزونه ضرب داخلی (Dot Product). این گزینه همچنین دستورالعملهای Advanced SIMD را فعال میکند.
- aes
- فعالسازی افزونه رمزنگاری aes و pmull در Armv8-a. این گزینه همچنین دستورالعملهای Advanced SIMD را فعال میسازد.
- sha2
- فعالسازی افزونه رمزنگاری sha2 در Armv8-a. این گزینه همچنین دستورالعملهای Advanced SIMD را فعال میکند.
- sha3
- فعالسازی افزونه رمزنگاری sha512 و sha3. این گزینه همچنین دستورالعملهای Advanced SIMD را فعال میسازد. استفاده از این گزینه همراه با معماریهای پیش از Armv8.2-A پشتیبانی نمیشود.
- sm4
- فعالسازی افزونه رمزنگاری sm3 و sm4. این گزینه همچنین دستورالعملهای Advanced SIMD را فعال میکند. استفاده از این گزینه همراه با معماریهای پیش از Armv8.2-A پشتیبانی نمیشود.
- profile
- فعالسازی افزونه ارزیابی آماری کارایی (Statistical Profiling). این گزینه صرفاً برای فعالسازی افزونه در سطح اسمبلر است و بر تولید کد تأثیری نمیگذارد.
- rng
- فعالسازی دستورالعملهای تولید اعداد تصادفی در Armv8.5-a. این گزینه صرفاً برای فعالسازی افزونه در سطح اسمبلر است و بر تولید کد تأثیری نمیگذارد.
- memtag
- فعالسازی افزونههای نشانهگذاری حافظه (Memory Tagging Extensions) در Armv8.5-a. استفاده از این گزینه همراه با معماریهای پیش از Armv8.5-A پشتیبانی نمیشود..IP sb 4 دستور Speculation Barrier در Armv8-a را فعال میکند. این گزینه فقط برای فعالسازی افزونه در سطح اسمبلی است و روی تولید کد تأثیری نمیگذارد. این گزینه بهطور پیشفرض برای -march=armv8.5-a فعال است.
- ssbs
- دستور Speculative Store Bypass Safe در Armv8-a را فعال میکند. این گزینه فقط برای فعالسازی افزونه در سطح اسمبلی است و روی تولید کد تأثیری نمیگذارد. این گزینه بهطور پیشفرض برای -march=armv8.5-a فعال است.
- predres
- دستورهای Execution and Data Prediction Restriction در Armv8-a را فعال میکند. این گزینه فقط برای فعالسازی افزونه در سطح اسمبلی است و روی تولید کد تأثیری نمیگذارد. این گزینه بهطور پیشفرض برای -march=armv8.5-a فعال است.
- sve2
- افزونهٔ Armv8-a Scalable Vector Extension 2 را فعال میکند. این کار همچنین دستورهای SVE را نیز فعال میکند.
- sve2-bitperm
- دستورهای bitperm مربوط به SVE2 را فعال میکند. این کار همچنین دستورهای SVE2 را نیز فعال میکند.
- sve2-sm4
- دستورهای sm4 مربوط به SVE2 را فعال میکند. این کار همچنین دستورهای SVE2 را نیز فعال میکند.
- sve2-aes
- دستورهای aes مربوط به SVE2 را فعال میکند. این کار همچنین دستورهای SVE2 را نیز فعال میکند.
- sve2-sha3
- دستورهای sha3 مربوط به SVE2 را فعال میکند. این کار همچنین دستورهای SVE2 را نیز فعال میکند.
- sve2p1
- دستورهای SVE2.1 را فعال میکند. این کار همچنین دستورهای SVE2 را نیز فعال میکند.
- tme
- افزونهٔ Transactional Memory Extension را فعال میکند.
- i8mm
- دستورهای ضرب ماتریسی اعداد صحیح ۸ بیتی (8-bit Integer Matrix Multiply) را فعال میکند. این کار همچنین دستورهای ممیز شناور و Advanced SIMD را فعال میکند. این گزینه بهطور پیشفرض برای -march=armv8.6-a فعال است. استفاده از این گزینه در معماریهای پیش از Armv8.2-A پشتیبانی نمیشود.
- f32mm
- دستورهای ضرب ماتریسی ممیز شناور ۳۲ بیتی را فعال میکند. این کار همچنین دستورهای SVE را فعال میکند. استفاده از این گزینه در معماریهای پیش از Armv8.2-A پشتیبانی نمیشود.
- f64mm
- دستورهای ضرب ماتریسی ممیز شناور ۶۴ بیتی را فعال میکند. این کار همچنین دستورهای SVE را فعال میکند. استفاده از این گزینه در معماریهای پیش از Armv8.2-A پشتیبانی نمیشود.
- bf16
- دستورهای ممیز شناور با دقت نیمه brain floating-point را فعال میکند. این کار همچنین دستورهای ممیز شناور و Advanced SIMD را فعال میکند. این گزینه بهطور پیشفرض برای -march=armv8.6-a فعال است. استفاده از این گزینه در معماریهای پیش از Armv8.2-A پشتیبانی نمیشود.
- ls64
- دستورهای اتمیکِ بارگذاری و ذخیرهسازی ۶۴ بایتی را برای شتابدهندهها فعال میکند.
- mops
- دستورهای تسریع عملیات حافظه مانند "memcpy"، "memmove" و "memset" را فعال میکند. این گزینه بهطور پیشفرض برای -march=armv8.8-a فعال است.
- flagm
- افزونهٔ دستورهای Flag Manipulation را فعال میکند.
- flagm2
- دستورهای تبدیل پرچم FlagM2 را فعال میکند.
- pauth
- افزونهٔ Pointer Authentication را فعال میکند.
- 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
- افزونهٔ ضرب-جمع (multiply accumulate) در 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
- افزونهٔ ممیز شناور brain با اندازهٔ ثابت (non-widening) برای SVE ("bf16") را فعال میکند. این گزینه فقط زمانی تأثیر دارد که "sve2" یا "sme2" نیز فعال باشند..PP ویژگی crypto مستلزم aes، sha2 و simd است، که خود مستلزم fp میباشد. برعکس، nofp مستلزم nosimd است، که مستلزم nocrypto، noaes و nosha2 میباشد.
گزینههای Adapteva Epiphany
این گزینههای -m برای Adapteva Epiphany تعریف شدهاند:
- -mhalf-reg-file
- هیچ ثباتی را در محدودهٔ "r32"..."r63" تخصیص ندهد. این کار به کد اجازه میدهد روی گونههای سختافزاری فاقد این ثباتها اجرا شود.
- -mprefer-short-insn-regs
- ترجیحاً ثباتهایی را تخصیص میدهد که اجازهٔ تولید دستورالعملهای کوتاه را میدهند. این میتواند منجر به افزایش تعداد دستورالعملها شود، بنابراین ممکن است اندازهٔ کلی کد را کاهش یا افزایش دهد.
- -mbranch-cost=num
- هزینهٔ پرشها (branches) را تقریباً روی num دستورالعمل «ساده» تنظیم میکند. این هزینه صرفاً یک تقریب اکتشافی (heuristic) است و تضمینی نیست که نتایج یکسانی در نگارشهای مختلف ایجاد کند.
- -mcmove
- تولید انتقالهای شرطی (conditional moves) را فعال میکند.
- -mnops=num
- پیش از هر دستورالعمل تولیدشدهٔ دیگر، تعداد num دستور NOP درج میکند.
- -mno-soft-cmpsf
- برای مقایسههای ممیز شناور با دقت یگانه (single-precision)، یک دستورالعمل "fsub" درج کرده و پرچمها را بررسی میکند. این کار سریعتر از مقایسهٔ نرمافزاری است، اما ممکن است در حضور NaNها، یا زمانی که دو عدد کوچک متمایز طوری مقایسه شوند که تفاضل آنها صفر محاسبه شود، به نتایج نادرستی منجر شود. پیشفرض -msoft-cmpsf است که از مقایسههای نرمافزاری کندتر، ولی سازگار با استاندارد IEEE استفاده میکند.
- -mstack-offset=num
- آفست میان بالای پشته و اشارهگر پشته (stack pointer) را تنظیم میکند. برای نمونه، مقدار 8 بدان معناست که هشت بایت در محدودهٔ "sp+0...sp+7" میتواند توسط توابع برگ (leaf functions) بدون تخصیص پشته استفاده شود. مقادیر به جز 8 یا 16 آزمایشنشده هستند و بعید است کار کنند. همچنین توجه داشته باشید که این گزینه ABI را تغییر میدهد؛ همگردانی برنامهای با آفست پشتهای متفاوت از کتابخانههایی که با آنها همگردانی شده است، عموماً کار نخواهد کرد. این گزینه میتواند در صورتی که بخواهید بررسی کنید آیا آفست پشتهٔ متفاوتی کد بهتری تولید میکند یا خیر مفید باشد، اما برای استفادهٔ عملی از یک آفست پشتهٔ متفاوت جهت ساخت برنامههای کاربردی، توصیه میشود زنجیرهٔ ابزار (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
- این حالتی است که برای محاسبات ممیز شناور با حالت گرد کردن به سمت صفر (truncating) استفاده میشود. این مورد شامل تبدیل از ممیز شناور به عدد صحیح نیز میگردد.
- round-nearest
- این حالتی است که برای محاسبات ممیز شناور با حالت گرد کردن به نزدیکترین یا زوج (round-to-nearest-or-even) استفاده میشود.
- int
- این حالتی است که برای انجام محاسبات اعداد صحیح در FPU به کار میرود، مانند ضرب عدد صحیح، یا ضرب و انباشت (multiply-and-accumulate) عدد صحیح.
پیشفرض -mfp-mode=caller است.
- -mno-split-lohi
- -mno-postinc
- -mno-postmodify
- تنظیمات جزئیِ تولید کد که به ترتیب تقسیم بارگذاریهای ۳۲ بیتی، تولید نشانیهای پسافزایشی (post-increment)، و تولید نشانیهای پساصلاحی (post-modify) را غیرفعال میکنند. پیشفرضها عبارتند از msplit-lohi، -mpost-inc و -mpost-modify.
- -mnovect-double
- حالت SIMD ترجیحی را به SImode تغییر میدهد. پیشفرض -mvect-double است که از DImode به عنوان حالت ترجیحی SIMD استفاده میکند.
- -max-vect-align=num
- بیشینهٔ همترازی برای انواع حالت برداری SIMD. num میتواند ۴ یا ۸ باشد. پیشفرض ۸ است. توجه داشته باشید که این یک تغییر در ABI است، اگرچه رابطهای بسیاری از توابع کتابخانه در صورتی که از حالتهای برداری SIMD در مواردی که اندازه و/یا همترازی انواع مربوطه را تغییر دهد استفاده نکنند، تحت تأثیر قرار نمیگیرند.
- -msplit-vecmove-early
- انتقالهای برداری را پیش از reload به انتقالهای تککلمهای تقسیم میکند. در تئوری این کار میتواند تخصیص ثبات بهتری ارائه دهد، اما تاکنون به نظر میرسد که عموماً حالت برعکس صادق است.
- -m1reg-reg
- یک ثبات را برای نگهداری مقدار ثابت -1 مشخص میکند که بارگذاری مقادیر منفی کوچک و برخی ماسکهای بیتی را سریعتر میسازد. مقادیر مجاز برای reg عبارتند از r43 و r63، که استفاده از آن ثبات را به عنوان یک ثبات ثابت مشخص میکنند، و none، که بدان معناست هیچ ثباتی برای این منظور استفاده نمیشود. پیشفرض -m1reg-none است.
گزینههای AMD GCN
این گزینهها بهطور ویژه برای پورت AMD GCN تعریف شدهاند.
- -march=gpu
- -mtune=gpu
- نوع معماری یا تنظیم دقیق را برای gpu مشخص میکند. مقادیر پشتیبانیشده برای gpu عبارتند از:
- gfx900
- همگردانی برای دستگاههای GCN5 Vega 10 (gfx900).
- gfx902
- همگردانی برای دستگاههای GCN5 Vega gfx902. (آزمایشی)
- gfx904
- همگردانی برای دستگاههای GCN5 Vega gfx904. (آزمایشی)
- gfx906
- همگردانی برای دستگاههای GCN5 Vega 20 (gfx906).
- gfx908
- همگردانی برای دستگاههای سری CDNA1 Instinct MI100 (gfx908).
- gfx909
- همگردانی برای دستگاههای GCN5 Vega gfx909. (آزمایشی)
- gfx90a
- همگردانی برای دستگاههای سری CDNA2 Instinct MI200 (gfx90a)..IP gfx90c 4 کامپایل برای دستگاههای GCN5 Vega 7 (gfx90c).
- gfx9-generic
- کامپایل کد عمومی برای دستگاههای Vega، قابل اجرا بر روی زیرمجموعهٔ زیر از دستگاههای GFX9: gfx900، gfx902، gfx904، gfx906، gfx909 و gfx90c. (آزمایشی)
- gfx1030
- کامپایل برای دستگاههای RDNA2 gfx1030 (سری GFX10).
- gfx1031
- کامپایل برای دستگاههای RDNA2 gfx1031 (سری GFX10). (آزمایشی)
- gfx1032
- کامپایل برای دستگاههای RDNA2 gfx1032 (سری GFX10). (آزمایشی)
- gfx1033
- کامپایل برای دستگاههای RDNA2 gfx1033 (سری GFX10). (آزمایشی)
- gfx1034
- کامپایل برای دستگاههای RDNA2 gfx1034 (سری GFX10). (آزمایشی)
- gfx1035
- کامپایل برای دستگاههای RDNA2 gfx1035 (سری GFX10). (آزمایشی)
- gfx1036
- کامپایل برای دستگاههای RDNA2 gfx1036 (سری GFX10).
- gfx10-3-generic
- کامپایل کد عمومی برای دستگاههای GFX10-3، قابل اجرا بر روی gfx1030، gfx1031، gfx1032، gfx1033، gfx1034، gfx1035 و gfx1036. (آزمایشی)
- gfx1100
- کامپایل برای دستگاههای RDNA3 gfx1100 (سری GFX11).
- gfx1101
- کامپایل برای دستگاههای RDNA3 gfx1101 (سری GFX11). (آزمایشی)
- gfx1102
- کامپایل برای دستگاههای RDNA3 gfx1102 (سری GFX11). (آزمایشی)
- gfx1103
- کامپایل برای دستگاههای RDNA3 gfx1103 (سری GFX11).
- gfx1150
- کامپایل برای دستگاههای RDNA3 gfx1150 (سری GFX11). (آزمایشی)
- gfx1151
- کامپایل برای دستگاههای RDNA3 gfx1151 (سری GFX11). (آزمایشی)
- gfx1152
- کامپایل برای دستگاههای RDNA3 gfx1152 (سری GFX11). (آزمایشی)
- gfx1153
- کامپایل برای دستگاههای RDNA3 gfx1153 (سری GFX11). (آزمایشی)
- gfx11-generic
- کامپایل کد عمومی برای دستگاههای GFX11، قابل اجرا بر روی gfx1100، gfx1101، gfx1102، gfx1103، gfx1150، gfx1151، gfx1152 و gfx1153. (آزمایشی)
- -msram-ecc=on
- -msram-ecc=off
- -msram-ecc=any
- کامپایل فایلهای باینری مناسب برای دستگاههایی با ویژگی SRAM-ECC فعال، غیرفعال یا در هر یک از این دو حالت. این ویژگی میتواند در برخی دستگاهها بهازای هر پروسه فعال شود. کد کامپایلشده باید با حالت دستگاه مطابقت داشته باشد. پیشفرض برای دستگاههایی که از آن پشتیبانی میکنند، any است.
- -mstack-size=bytes
- مشخص میکند چه تعداد بایت (bytes) از فضای پشته برای هر ریسهٔ GPU (wave-front) درخواست شود. توجه داشته باشید که ممکن است ریسههای بسیار زیاد و حافظهٔ دردسترس محدودی وجود داشته باشد. اندازهٔ تخصیص پشته همچنین ممکن است بر عملکرد زمان اجرا تأثیرگذار باشد. مقدار پیشفرض هنگام استفاده از OpenACC یا OpenMP برابر 32KB و در غیر این صورت 1MB است.
- -mxnack=on
- -mxnack=off
- -mxnack=any
- کامپایل فایلهای باینری مناسب برای دستگاههایی با ویژگی XNACK فعال، غیرفعال یا هر یک از این دو حالت. برخی دستگاهها همیشه نیازمند XNACK هستند و برخی به کاربر اجازهٔ پیکربندی XNACK را میدهند. کد کامپایلشده باید با حالت دستگاه مطابقت داشته باشد. پیشفرض در دستگاههایی که از حافظه اشتراکی یکپارچه (Unified Shared Memory) پشتیبانی میکنند -mxnack=any و در غیر این صورت -mxnack=no است.
گزینههای ARC (ARC Options)
گزینههای زیر نگارش معماریای را که کد برای آن کامپایل میشود، کنترل میکنند:
- -mbarrel-shifter
- تولید دستورالعملهای پشتیبانیشده توسط barrel shifter. این مقدار پیشفرض است مگر اینکه -mcpu=ARC601 یا -mcpu=ARCEM اعمال شده باشد.
- -mjli-always
- اجبار به فراخوانی یک تابع با استفاده از دستورالعمل jli_s. این گزینه تنها برای معماری ARCv2 معتبر است.
- -mcpu=cpu
- تنظیم نوع معماری، نحوهٔ استفاده از ثباتها (registers) و پارامترهای زمانبندی دستورالعمل برای cpu. همچنین گزینههای نام مستعار (alias) میانبری برای سازگاری با نسخههای پیشین و راحتی در دسترس هستند. مقادیر پشتیبانیشده برای cpu عبارتاند از:
- arc600
- کامپایل برای ARC600. نامهای مستعار: -mA6، -mARC600.
- arc601
- کامپایل برای ARC601. نام مستعار: -mARC601.
- arc700
- کامپایل برای ARC700. نامهای مستعار: -mA7، -mARC700. این مقدار هنگام پیکربندی با --with-cpu=arc700 پیشفرض است.
- arcem
- کامپایل برای ARC EM.
- archs
- کامپایل برای ARC HS.
- em
- کامپایل برای پردازندهٔ ARC EM بدون افزونههای سختافزاری.
- em4
- کامپایل برای پردازندهٔ ARC EM4.
- em4_dmips
- کامپایل برای پردازندهٔ ARC EM4 DMIPS.
- em4_fpus
- کامپایل برای پردازندهٔ ARC EM4 DMIPS با افزونهٔ ممیز شناور با دقت یگانه (single-precision floating-point).
- 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"..IP arc601_norm 4 کامپایل برای پردازندهٔ ARC 601 با فعالبودن دستورالعملهای "norm".
- arc601_mul32x16
- کامپایل برای پردازندهٔ ARC 601 با فعالبودن دستورالعملهای "norm" و ضرب 32x16 بیتی.
- arc601_mul64
- کامپایل برای پردازندهٔ ARC 601 با فعالبودن دستورالعملهای "norm" و خانوادهٔ "mul64".
- nps400
- کامپایل برای ARC 700 روی تراشهٔ NPS400.
- em_mini
- کامپایل برای پیکربندی کمینهگرای ARC EM به همراه مجموعهٔ ثباتهای کاهشیافته.
- -mdpfp
- -mdpfp-compact
- تولید دستورالعملهای FPX با دقت مضاعف (double-precision)، تنظیمشده برای پیادهسازی فشرده (compact).
- -mdpfp-fast
- تولید دستورالعملهای FPX با دقت مضاعف، تنظیمشده برای پیادهسازی سریع (fast).
- -mno-dpfp-lrsr
- غیرفعالسازی استفادهٔ دستورالعملهای "lr" و "sr" از ثباتهای کمکی افزونهٔ FPX.
- -mea
- تولید دستورالعملهای محاسباتی گسترشیافته. در حال حاضر فقط "divaw"، "adds"، "subs" و "sat16" پشتیبانی میشوند. تنها برای -mcpu=ARC700 معتبر است.
- -mno-mpy
- عدم تولید دستورالعملهای خانوادهٔ "mpy" برای ARC700. این گزینه منسوخ شده است.
- -mmul32x16
- تولید دستورالعملهای ضرب و ضرب-انباشت (multiply-accumulate) ۳۲در۱۶ بیتی.
- -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
- این گزینه استفاده از افزونهٔ شرطی قفل بارگذاری/ذخیره را جهت پیادهسازی توابع درونی حافظهٔ اتمیک فعال میکند. برای هستههای 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
- ضربکنندهٔ 16x16، کاملاً خطلولهای (pipelined). دستورالعملهای روبرو فعال میشوند: "mpyw" و "mpyuw".
- 2
- wlh1
- ضربکنندهٔ 32x32، کاملاً خطلولهای (۱ مرحلهای). این دستورالعملها نیز بهعلاوه فعال میشوند: "mpy"، "mpyu"، "mpym"، "mpymu" و "mpy_s".
- 3
- wlh2
- ضربکنندهٔ 32x32، کاملاً خطلولهای (۲ مرحلهای). این دستورالعملها نیز بهعلاوه فعال میشوند: "mpy"، "mpyu"، "mpym"، "mpymu" و "mpy_s".
- 4
- wlh3
- دو ضربکنندهٔ 16x16، مسدودکننده (blocking)، ترتیبی (sequential). این دستورالعملها نیز بهعلاوه فعال میشوند: "mpy"، "mpyu"، "mpym"، "mpymu" و "mpy_s".
- 5
- wlh4
- یک ضربکنندهٔ 16x16، مسدودکننده، ترتیبی. این دستورالعملها نیز بهعلاوه فعال میشوند: "mpy"، "mpyu"، "mpym"، "mpymu" و "mpy_s".
- 6
- wlh5
- یک ضربکنندهٔ 32x4، مسدودکننده، ترتیبی. این دستورالعملها نیز بهعلاوه فعال میشوند: "mpy"، "mpyu"، "mpym"، "mpymu" و "mpy_s".
- 7
- plus_dmpy
- پشتیبانی از ARC HS SIMD.
- 8
- plus_macd
- پشتیبانی از ARC HS SIMD..IP 9 4
- plus_qmacw
- پشتیبانی از SIMD پردازنده ARC HS.
این گزینه فقط برای هستههای ARCv2 در دسترس است.
- -mfpu=fpu
- پشتیبانی از افزونههای سختافزاری ممیز شناور خاص را برای هستههای ARCv2 فعال میکند. مقادیر پشتیبانیشده برای fpu عبارتند از:
- fpus
- پشتیبانی از افزونههای سختافزاری ممیز شناور با دقت یگانه را فعال میکند.
- fpud
- پشتیبانی از افزونههای سختافزاری ممیز شناور با دقت دوگانه را فعال میکند. افزونهٔ ممیز شناور با دقت یگانه نیز فعال میشود. برای ARC EM در دسترس نیست.
- fpuda
- پشتیبانی از افزونههای سختافزاری ممیز شناور با دقت دوگانه با استفاده از دستورالعملهای کمکی دقت دوگانه را فعال میکند. افزونهٔ ممیز شناور با دقت یگانه نیز فعال میشود. این گزینه فقط برای ARC EM در دسترس است.
- fpuda_div
- پشتیبانی از افزونههای سختافزاری ممیز شناور با دقت دوگانه با استفاده از دستورالعملهای کمکی دقت دوگانه را فعال میکند. افزونههای ممیز شناور با دقت یگانه، ریشهٔ دوم و تقسیم نیز فعال میشوند. این گزینه فقط برای ARC EM در دسترس است.
- fpuda_fma
- پشتیبانی از افزونههای سختافزاری ممیز شناور با دقت دوگانه با استفاده از دستورالعملهای کمکی دقت دوگانه را فعال میکند. افزونههای سختافزاری ممیز شناور با دقت یگانه و ضرب و جمع ادغامشده (fused multiply and add) نیز فعال میشوند. این گزینه فقط برای ARC EM در دسترس است.
- fpuda_all
- پشتیبانی از افزونههای سختافزاری ممیز شناور با دقت دوگانه با استفاده از دستورالعملهای کمکی دقت دوگانه را فعال میکند. تمامی افزونههای سختافزاری ممیز شناور با دقت یگانه نیز فعال میشوند. این گزینه فقط برای ARC EM در دسترس است.
- fpus_div
- پشتیبانی از افزونههای سختافزاری ممیز شناور با دقت یگانه، ریشهٔ دوم و تقسیم را فعال میکند.
- fpud_div
- پشتیبانی از افزونههای سختافزاری ممیز شناور با دقت دوگانه، ریشهٔ دوم و تقسیم را فعال میکند. این گزینه شامل گزینهٔ fpus_div نیز میشود. برای ARC EM در دسترس نیست.
- fpus_fma
- پشتیبانی از افزونههای سختافزاری ممیز شناور با دقت یگانه و ضرب و جمع ادغامشده را فعال میکند.
- fpud_fma
- پشتیبانی از افزونههای سختافزاری ممیز شناور با دقت دوگانه و ضرب و جمع ادغامشده را فعال میکند. این گزینه شامل گزینهٔ fpus_fma نیز میشود. برای ARC EM در دسترس نیست.
- fpus_all
- پشتیبانی از تمامی افزونههای سختافزاری ممیز شناور با دقت یگانه را فعال میکند.
- fpud_all
- پشتیبانی از تمامی افزونههای سختافزاری ممیز شناور با دقت یگانه و دوگانه را فعال میکند. برای ARC EM در دسترس نیست.
- -mirq-ctrl-saved=register-range, blink, lp_count
- ثباتهای همهمنظورهای را مشخص میکند که پردازنده هنگام ورود و خروج وقفه بهطور خودکار ذخیره/بازیابی میکند. register-range بهصورت دو ثبات جداشده با یک خط پیوند مشخص میشود. محدودهٔ ثباتها همیشه با "r0" آغاز میشود و حد بالای آن ثبات "fp" است. blink و lp_count اختیاری هستند. این گزینه فقط برای هستههای ARC EM و ARC HS معتبر است.
- -mrgf-banked-regs=number
- تعداد ثباتهای تکثیرشده در بانک ثبات دوم را هنگام ورود به وقفهٔ سریع مشخص میکند. وقفههای سریع، وقفههایی با بالاترین سطح اولویت P0 هستند. این وقفهها برای جلوگیری از تبادلات حافظه در طول توالیهای ورود و خروج وقفه، فقط ثباتهای PC و STATUS32 را ذخیره میکنند. هنگامی که از وقفههای سریع در پردازندههای خانوادهٔ ARC V2 استفاده میکنید، این گزینه را به کار ببرید. مقادیر مجاز عبارتند از 4، 8، 16 و 32.
- -mlpc-width=width
- عرض ثبات "lp_count" را مشخص میکند. مقادیر معتبر برای width عبارتند از 8، 16، 20، 24، 28 و 32 بیت. عرض پیشفرض روی 32 بیت ثابت است. اگر عرض کمتر از 32 باشد، کامپایلر برای تبدیل حلقههای برنامهٔ شما جهت استفاده از سازوکار حلقهٔ بدون تأخیر (zero-delay loop) تلاشی نمیکند، مگر آنکه مشخص باشد ثبات "lp_count" میتواند مقدار شمارندهٔ حلقهٔ مورد نیاز را نگهداری کند. بسته به عرض مشخصشده، کامپایلر و کتابخانهٔ زمان اجرا ممکن است همچنان برای نیازهای گوناگون از سازوکار حلقه استفاده کنند. این گزینه ماکروی "__ARC_LPC_WIDTH__" را با مقدار width تعریف میکند.
- -mrf16
- این گزینه به کامپایلر دستور میدهد برای یک فایل ثبات (register file) با 16 مدخل، کد تولید کند. این گزینه ماکروی پیشپردازندهٔ "__ARC_RF16__" را تعریف میکند.
- -mbranch-index
- استفاده از دستورالعملهای "bi" یا "bih" را برای پیادهسازی جدولهای پرش فعال میکند.
گزینههای زیر به اسمبلر ارسال میشوند و همچنین نمادهای ماکروی پیشپردازنده را تعریف میکنند.
- -mdsp-packa
- برای فعالسازی افزونههای DSP Pack A به اسمبلر منتقل میشود. همچنین نماد پیشپردازندهٔ "__Xdsp_packa" را تنظیم میکند. این گزینه منسوخ شده است.
- -mdvbf
- برای فعالسازی افزونهٔ پروانهای دوگانهٔ ویتربی (dual Viterbi butterfly) به اسمبلر منتقل میشود. همچنین نماد پیشپردازندهٔ "__Xdvbf" را تنظیم میکند. این گزینه منسوخ شده است.
- -mlock
- برای فعالسازی افزونهٔ شرطی بارگذاری/ذخیرهسازی قفلشده به اسمبلر منتقل میشود. همچنین نماد پیشپردازندهٔ "__Xlock" را تنظیم میکند.
- -mmac-d16
- به اسمبلر منتقل میشود. همچنین نماد پیشپردازندهٔ "__Xxmac_d16" را تنظیم میکند. این گزینه منسوخ شده است.
- -mmac-24
- به اسمبلر منتقل میشود. همچنین نماد پیشپردازندهٔ "__Xxmac_24" را تنظیم میکند. این گزینه منسوخ شده است.
- -mrtsc
- برای فعالسازی دستورالعمل افزونهٔ شمارندهٔ برچسب زمانی ۶۴ بیتی به اسمبلر منتقل میشود. همچنین نماد پیشپردازندهٔ "__Xrtsc" را تنظیم میکند. این گزینه منسوخ شده است.
- -mswape
- برای فعالسازی دستورالعمل افزونهٔ جابهجایی ترتیب بایتها به اسمبلر منتقل میشود. همچنین نماد پیشپردازندهٔ "__Xswape" را تنظیم میکند.
- -mtelephony
- برای فعالسازی دستورالعملهای تکعملوندی و دوعملوندی برای تلفنی به اسمبلر منتقل میشود. همچنین نماد پیشپردازندهٔ "__Xtelephony" را تنظیم میکند. این گزینه منسوخ شده است.
- -mxy
- برای فعالسازی افزونهٔ حافظهٔ XY به اسمبلر منتقل میشود. همچنین نماد پیشپردازندهٔ "__Xxy" را تنظیم میکند.
گزینههای زیر نحوهٔ حاشیهنویسی کد اسمبلی را کنترل میکنند:
- -misize
- دستورالعملهای اسمبلی را با آدرسهای تخمینی حاشیهنویسی میکند.
- -mannotate-align
- هیچ کاری انجام نمیدهد. برای سازگاری با نسخههای پیشین حفظ شده است.
گزینههای زیر به پیونددهنده منتقل میشوند:
- -marclinux
- به پیونددهنده منتقل میشود تا استفاده از شبیهسازی "arclinux" را مشخص کند. این گزینه بهطور پیشفرض در زنجیرههای ابزاری که برای هدفهای "arc-linux-uclibc" و "arceb-linux-uclibc" ساخته شدهاند، در صورتی که پروفایلسازی درخواست نشده باشد فعال است.
- -marclinux_prof
- به پیونددهنده منتقل میشود تا استفاده از شبیهسازی "arclinux_prof" را مشخص کند. این گزینه بهطور پیشفرض در زنجیرههای ابزاری که برای هدفهای "arc-linux-uclibc" و "arceb-linux-uclibc" ساخته شدهاند، در صورتی که پروفایلسازی درخواست شده باشد فعال است..PP گزینههای زیر معناشناسی کد تولیدشده را کنترل میکنند:
- -mlong-calls
- فراخوانیها را به عنوان فراخوانیهای غیرمستقیم ثبات تولید میکند و بدین ترتیب دسترسی به کل محدودهٔ آدرسدهی ۳۲ بیتی را فراهم میسازد.
- -mmedium-calls
- برای فراخوانیها از محدودهٔ آدرسدهی کمتر از ۲۵ بیت استفاده نمیکند؛ این مقدار، آفست در دسترس برای یک دستور بدونشرط branch-and-link است. اجرای شرطی فراخوانیهای توابع متوقف میشود تا امکان استفاده از محدودهٔ ۲۵ بیتی، بهجای محدودهٔ ۲۱ بیتی با branch-and-link شرطی، فراهم شود. این مقدار پیشفرض برای زنجیرههای ابزاری است که برای مقصدهای "arc-linux-uclibc" و "arceb-linux-uclibc" ساخته شدهاند.
- -G num
- تعاریف دادههای با دید خارجی (externally-visible) را در صورتی که آن دادهها بزرگتر از num بایت نباشند، در بخش دادههای کوچک (small data section) قرار میدهد. مقدار پیشفرض num برای هر پیکربندی ARC برابر با ۴ است، یا هنگامی که عملیات بارگذاری/ذخیره مضاعف (double load/store) وجود داشته باشد، برابر با ۸ خواهد بود.
- -mno-sdata
- ارجاعات sdata را تولید نمیکند. این مقدار پیشفرض برای زنجیرههای ابزاری ساختهشده برای مقصدهای "arc-linux-uclibc" و "arceb-linux-uclibc" است.
- -mvolatile-cache
- برای ارجاعات فرار (volatile references)، از دسترسیهای معمولی به حافظهٔ دارای حافظهنهان (cached) استفاده میکند. این مقدار پیشفرض است.
- -mno-volatile-cache
- دور زدن حافظهٔ نهان (cache bypass) را برای ارجاعات فرار فعال میکند.
گزینههای زیر تولید کد را دقیقتر تنظیم میکنند:
- -malign-call
- کاری انجام نمیدهد. برای سازگاری عقبرو حفظ شده است.
- -mauto-modify-reg
- استفاده از اصلاح پیش/پس (pre/post modify) با جابهجایی ثبات را فعال میکند.
- -mbbit-peephole
- کاری انجام نمیدهد. برای سازگاری عقبرو حفظ شده است.
- -mno-brcc
- این گزینه یک گذر (pass) ویژهٔ مقصد را در arc_reorg برای تولید دستورهای مقایسه-و-انشعاب ("brcc") غیرفعال میکند. این گزینه هیچ اثری بر تولید این دستورها که توسط گذر combiner هدایت میشوند ندارد.
- -mcase-vector-pcrel
- برای فعالسازی کوتاهسازی جدول case، از جدولهای switch case وابسته به شمارندهٔ برنامه (PC-relative) استفاده میکند. این مقدار پیشفرض برای -Os است.
- -mcompact-casesi
- الگوی فشردهٔ "casesi" را فعال میکند. این مقدار پیشفرض برای -Os است و تنها برای هستههای ARCv1 در دسترس است. این گزینه منسوخ شده است.
- -mno-cond-exec
- گذر ویژهٔ
ARCompact را برای
تولید
دستورهای
اجرای شرطی
غیرفعال
میکند.
به دلیل زمانبندی شکاف تاخیر (delay slot) و تعاملات میان تعداد عملوندها، اندازههای لفظی، طول دستورها و پشتیبانی از اجرای شرطی، گذر مستقل از مقصد برای تولید اجرای شرطی اغلب ناکافی است، از این رو پورت ARC یک گذر ویژه را حفظ کرده است که تلاش میکند پس از انجام تخصیص ثبات، کوتاهسازی انشعاب، و زمانبندی delay slot، فرصتهای بیشتری برای تولید اجرای شرطی بیابد. این گذر بهطور کلی، اما نه همیشه، کارایی و اندازهٔ کد را به بهای زمان کامپایل اضافی بهبود میبخشد، که به همین دلیل گزینهای برای غیرفعال کردن آن وجود دارد. اگر با مشکل فراتر رفتن دستورهای فراخوانی از محدودهٔ آفست مجازشان به دلیل شرطی شدن آنها مواجه هستید، باید استفاده از -mmedium-calls را بهجای آن مد نظر قرار دهید.
- -mearly-cbranchsi
- استفادهٔ پیش از بارگذاری مجدد (pre-reload) از الگوی "cbranchsi" را فعال میکند.
- -mexpand-adddi
- الگوهای "adddi3" و "subdi3" را در زمان تولید RTL به "add.f"، "adc" و غیره بسط میدهد. این گزینه منسوخ شده است.
- -mindexed-loads
- استفاده از بارگذاریهای نمایهشده (indexed loads) را فعال میکند. این کار میتواند مشکلساز باشد زیرا برخی از بهینهسازها در ادامه فرض میکنند که ذخیرهسازیهای نمایهشده وجود دارند، در حالی که اینگونه نیست.
- -mlra
- کاری انجام نمیدهد. برای سازگاری عقبرو حفظ شده است.
- -mlra-priority-none
- هیچ اولویتی را برای ثباتهای مقصد مشخص نمیکند.
- -mlra-priority-compact
- اولویت ثبات مقصد را برای r0..r3 / r12..r15 مشخص میکند.
- -mlra-priority-noncompact
- اولویت ثبات مقصد را برای r0..r3 / r12..r15 کاهش میدهد.
- -mmillicode
- هنگام بهینهسازی برای اندازه (با استفاده از -Os)، دیباچهها و خاتمهها (prologues و epilogues) که باید تعداد زیادی از ثباتها را ذخیره یا بازیابی کنند، اغلب با استفاده از فراخوانی تابعی ویژه در libgcc کوتاه میشوند؛ این فراخوانی به عنوان فراخوانی millicode شناخته میشود. از آنجا که این فراخوانیها میتوانند مسائلی را در زمینهٔ کارایی ایجاد کنند، و/یا هنگام پیوند دادن به شیوهای غیر استاندارد باعث ایجاد مشکلات پیوند شوند، این گزینه برای فعال یا غیرفعال کردن تولید فراخوانی millicode فراهم شده است.
- -mcode-density-frame
- این گزینه به کامپایلر امکان میدهد تا دستورهای "enter" و "leave" را صادر کند. این دستورها تنها برای پردازندههای دارای قابلیت code-density معتبر هستند.
- -mmixed-code
- کاری انجام نمیدهد. برای سازگاری عقبرو حفظ شده است.
- -mq-class
- این گزینه منسوخ شده است. جایگزینهای دستور q را فعال میکند. این مقدار پیشفرض برای -Os است.
- -mRcq
- کاری انجام نمیدهد. برای سازگاری عقبرو حفظ شده است.
- -mRcw
- کاری انجام نمیدهد. برای سازگاری عقبرو حفظ شده است.
- -msize-level=level
- بهینهسازی اندازه را با توجه به طول دستورها و همترازی بهدقت تنظیم میکند. مقادیر شناختهشده برای level عبارتند از:
- 0
- بدون بهینهسازی اندازه. این سطح منسوخ شده و مانند 1 با آن رفتار میشود.
- 1
- دستورهای کوتاه بهصورت فرصتطلبانه استفاده میشوند.
- 2
- علاوه بر این، همترازی حلقهها و کدهای پس از موانع (barriers) حذف میشوند.
- 3
- علاوه بر این، همترازی اختیاری دادهها حذف شده و گزینهٔ Os فعال میشود.
هنگامی که -Os فعال باشد، این گزینه بهطور پیشفرض برابر با 3 است. در غیر این صورت، رفتار در هنگام تنظیم نشدن معادل سطح 1 است.
- -mtune=cpu
- پارامترهای
زمانبندی
دستور را
برای cpu
تعیین کرده
و مقادیر
تعیینشده
بهصورت
ضمنی توسط
-mcpu= را
بازنویسی
میکند.
مقادیر پشتیبانیشده برای cpu عبارتند از:
- ARC600
- تنظیم برای پردازندهٔ ARC600.
- ARC601
- تنظیم برای پردازندهٔ ARC601.
- ARC700
- تنظیم برای پردازندهٔ ARC700 با بلوک ضربکنندهٔ استاندارد.
- ARC700-xmac
- تنظیم برای پردازندهٔ ARC700 با بلوک XMAC.
- ARC725D
- تنظیم برای پردازندهٔ ARC725D.
- ARC750D
- تنظیم برای پردازندهٔ ARC750D.
- core3
- تنظیم برای پردازندهٔ نوع core3 از معماری ARCv2. این گزینه استفاده از دستور "dbnz" را فعال میکند.
- release31a
- تنظیم برای ARC4x نگارش 3.10a.
- -munalign-prob-threshold=probability
- کاری انجام نمیدهد. برای سازگاری با نسخههای پیشین حفظ شده است.
گزینههای زیر برای سازگاری با نسخههای پیشین نگهداری میشوند، اما اکنون منسوخ شدهاند و در انتشارهای آینده حذف خواهند شد:
- -margonaut
- واحد FPX منسوخشده.
- -mbig-endian
- -EB
- کامپایل کد برای مقصدهای big-endian. استفاده از این گزینهها اکنون منسوخ شده است. کد big-endian از طریق پیکربندی GCC برای ساخت مقصدهای "arceb-elf32" و "arceb-linux-uclibc" که در آنها big endian پیشفرض است، پشتیبانی میشود.
- -mlittle-endian
- -EL
- کامپایل کد برای مقصدهای little-endian. استفاده از این گزینهها اکنون منسوخ شده است. کد little-endian از طریق پیکربندی GCC برای ساخت مقصدهای "arc-elf32" و "arc-linux-uclibc" که در آنها little endian پیشفرض است، پشتیبانی میشود.
- -mbarrel_shifter
- با -mbarrel-shifter جایگزین شده است.
- -mdpfp_compact
- با -mdpfp-compact جایگزین شده است.
- -mdpfp_fast
- با -mdpfp-fast جایگزین شده است.
- -mdsp_packa
- با -mdsp-packa جایگزین شده است.
- -mEA
- با -mea جایگزین شده است.
- -mmac_24
- با -mmac-24 جایگزین شده است.
- -mmac_d16
- با -mmac-d16 جایگزین شده است.
- -mspfp_compact
- با -mspfp-compact جایگزین شده است.
- -mspfp_fast
- با -mspfp-fast جایگزین شده است.
- -mtune=cpu
- مقادیر arc600، arc601، arc700 و arc700-xmac برای cpu به ترتیب با ARC600، ARC601، ARC700 و ARC700-xmac جایگزین شدهاند.
- -multcost=num
- با -mmultcost جایگزین شده است.
گزینههای ARM
این گزینههای -m برای پورت ARM تعریف شدهاند:
- -mabi=name
- تولید کد برای ABI مشخصشده. مقادیر مجاز عبارتند از: apcs-gnu، atpcs، aapcs، aapcs-linux و iwmmxt.
- -mapcs-frame
- تولید یک فریم پشته (stack frame) سازگار با «استاندارد فراخوانی رویه ARM» برای همه توابع، حتی اگر این کار برای اجرای صحیح کد اکیداً ضروری نباشد. تعیین -fomit-frame-pointer همراه با این گزینه باعث میشود که فریم پشته برای توابع برگ (leaf) تولید نشود. پیشفرض -mno-apcs-frame است. این گزینه منسوخ شده است.
- -mapcs
- این گزینه مترادفی برای -mapcs-frame است و منسوخ شده است.
- -mthumb-interwork
- تولید کدی که از فراخوانی متقابل میان مجموعههای دستورالعمل ARM و Thumb پشتیبانی میکند. بدون این گزینه، در معماریهای پیش از نسخه ۵ (pre-v5)، این دو مجموعه دستورالعمل را نمیتوان بهطور قابل اعتماد در یک برنامه استفاده کرد. پیشفرض -mno-thumb-interwork است، چرا که با تعیین -mthumb-interwork کدی کمی بزرگتر تولید میشود. در پیکربندیهای AAPCS این گزینه بیمعنی است.
- -mno-sched-prolog
- جلوگیری از بازآرایی دستورالعملها در پیشدرآمد تابع (prologue)، یا ادغام آن دستورالعملها با دستورالعملهای بدنه تابع. این امر بدین معناست که همه توابع با مجموعهای قابل تشخیص از دستورالعملها (یا در واقع انتخابی از میان مجموعه کوچکی از پیشدرآمدهای مختلف توابع) آغاز میشوند، و این اطلاعات میتواند برای یافتن نقطه شروع توابع در یک قطعه کد اجرایی به کار رود. پیشفرض -msched-prolog است.
- -mfloat-abi=name
- مشخص
میکند که
از کدام ABI
ممیز شناور
استفاده
شود. مقادیر
مجاز
عبارتند از:
soft، softfp و hard.
تعیین soft باعث میشود GCC خروجی حاوی فراخوانیهای کتابخانهای برای عملیات ممیز شناور تولید کند. softfp اجازه تولید کد با استفاده از دستورالعملهای سختافزاری ممیز شناور را میدهد، اما همچنان از قراردادهای فراخوانی soft-float بهره میبرد. hard امکان تولید دستورالعملهای سختافزاری ممیز شناور را فراهم کرده و از قراردادهای فراخوانی ویژه FPU استفاده میکند.
پیشفرض به پیکربندی مقصد مورد نظر بستگی دارد. توجه داشته باشید که ABIهای hard-float و soft-float از نظر پیونددهی با یکدیگر سازگار نیستند؛ شما باید تمام برنامه خود را با یک ABI کامپایل کرده و آن را با مجموعهای سازگار از کتابخانهها پیوند دهید.
- -mgeneral-regs-only
- تولید کدی که صرفاً از ثباتهای عمومی (general-purpose registers) استفاده میکند. این گزینه مانع از استفاده کامپایلر از ثباتهای ممیز شناور و Advanced SIMD میشود، اما هیچ محدودیتی بر اسمبلر اعمال نخواهد کرد.
- -mlittle-endian
- تولید کد برای پردازندهای که در حالت little-endian اجرا میشود. این حالت برای همه پیکربندیهای استاندارد، پیشفرض است.
- -mbig-endian
- تولید کد برای پردازندهای که در حالت big-endian اجرا میشود؛ پیشفرض کامپایل کد برای پردازنده little-endian است.
- -mbe8
- -mbe32
- هنگام پیوند دادن یک تصویر (image) big-endian، قالب خروجی را بین BE8 و BE32 انتخاب میکند. این گزینه روی تصاویر little-endian هیچ اثری ندارد و نادیده گرفته میشود. پیشفرض به معماری مقصد انتخابشده بستگی دارد. برای معماری ARMv6 و جدیدتر، مقدار پیشفرض BE8 است، و برای معماریهای قدیمیتر پیشفرض BE32 است. قالب BE32 توسط ARM منسوخ شده است.
- -march=name[+extension...]
- نام معماری
ARM مقصد را
مشخص
میکند. GCC از
این نام
برای تعیین
اینکه چه
نوع
دستورالعملهایی
را
میتواند
هنگام
تولید کد
اسمبلی
استفاده
کند، بهره
میگیرد.
این گزینه
میتواند
در کنار یا
بهجای
گزینه -mcpu=
استفاده
شود.
نامهای مجاز عبارتند از: armv4t، armv5t، armv5te، armv6، armv6j، armv6k، armv6kz، armv6t2، armv6z، armv6zk، armv7، armv7-a، armv7ve، armv8-a، armv8.1-a، armv8.2-a، armv8.3-a، armv8.4-a، armv8.5-a، armv8.6-a، armv9-a، armv7-r، armv8-r، armv6-m، armv6s-m، armv7-m، armv7e-m، armv8-m.base، armv8-m.main، armv8.1-m.main، iwmmxt و iwmmxt2.
علاوه بر این، معماریهای زیر که فاقد پشتیبانی از حالت اجرای Thumb هستند شناسایی میشوند، اما پشتیبانی از آنها منسوخ شده است: armv4.
بسیاری از معماریها از افزونهها (extensions) پشتیبانی میکنند. این افزونهها را میتوان با الحاق +extension به نام معماری اضافه کرد. گزینههای افزونه به ترتیب پردازش میشوند و قابلیتها انباشته میگردند. یک افزونه همچنین هرگونه افزونه پایه ضروری را که به آن وابسته است فعال میکند. برای مثال، افزونه +crypto همیشه افزونه +simd را فعال خواهد کرد. استثنای این ساختار افزایشی برای افزونههایی است که پیشوند +no... دارند: این افزونهها گزینه مشخصشده و هر افزونه دیگری را که ممکن است به حضور آن وابسته باشد غیرفعال میکنند.
برای مثال، -march=armv7-a+simd+nofp+vfpv4 معادل نوشتن -march=armv7-a+vfpv4 است، زیرا گزینه +simd به طور کامل توسط گزینه +nofp که در ادامه آن میآید غیرفعال میشود.
بسیاری از نامهای افزونهها نامهایی عمومی هستند، اما اثری دارند که به معماری اعمالشده بر آن وابسته است. برای مثال، گزینه +simd میتواند برای هر دو معماری armv7-a و armv8-a اعمال شود، اما افزونههای اصلی ARMv7-A Advanced SIMD (Neon) را برای armv7-a و گونه متناظر ARMv8-A را برای armv8-a فعال میکند.
جدول زیر افزونههای پشتیبانیشده را برای هر معماری فهرست میکند. معماریهایی که نام برده نشدهاند از هیچ افزونهای پشتیبانی نمیکنند.
- +fp
- دستورالعملهای ممیز شناور VFPv2. افزونهٔ +vfpv2 میتواند به عنوان یک نام مستعار برای این افزونه استفاده شود.
- +nofp
- غیرفعال کردن دستورالعملهای ممیز شناور.
- armv7
- زیرمجموعهٔ مشترک معماریهای ARMv7-A، ARMv7-R و ARMv7-M.
- +fp
- دستورالعملهای ممیز شناور VFPv3، با 16 ثبات با دقت مضاعف (double-precision). افزونهٔ +vfpv3-d16 میتواند به عنوان یک نام مستعار برای این افزونه استفاده شود. توجه داشته باشید که ممیز شناور توسط معماری پایهٔ ARMv7-M پشتیبانی نمیشود، اما با هر دو معماری ARMv7-A و ARMv7-R سازگار است.
- +nofp
- غیرفعال کردن دستورالعملهای ممیز شناور.
- +mp
- افزونهٔ چندپردازشی (multiprocessing).
- +sec
- افزونهٔ امنیتی (security).
- +fp
- دستورالعملهای ممیز شناور VFPv3، با 16 ثبات با دقت مضاعف. افزونهٔ +vfpv3-d16 میتواند به عنوان یک نام مستعار برای این افزونه استفاده شود.
- +simd
- دستورالعملهای Advanced SIMD (Neon) v1 و ممیز شناور VFPv3. افزونههای +neon و +neon-vfpv3 میتوانند به عنوان نامهای مستعار برای این افزونه استفاده شوند.
- +vfpv3
- دستورالعملهای ممیز شناور VFPv3، با 32 ثبات با دقت مضاعف.
- +vfpv3-d16-fp16
- دستورالعملهای ممیز شناور VFPv3، با 16 ثبات با دقت مضاعف و عملیات تبدیل ممیز شناور با دقت نیمه (half-precision).
- +vfpv3-fp16
- دستورالعملهای ممیز شناور VFPv3، با 32 ثبات با دقت مضاعف و عملیات تبدیل ممیز شناور با دقت نیمه.
- +vfpv4-d16
- دستورالعملهای ممیز شناور VFPv4، با 16 ثبات با دقت مضاعف.
- +vfpv4
- دستورالعملهای ممیز شناور VFPv4، با 32 ثبات با دقت مضاعف.
- +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، با 16 ثبات با دقت مضاعف. افزونهٔ +vfpv4-d16 میتواند به عنوان یک نام مستعار برای این افزونه استفاده شود.
- +simd
- دستورالعملهای Advanced SIMD (Neon) v2 و ممیز شناور VFPv4. افزونهٔ +neon-vfpv4 میتواند به عنوان یک نام مستعار برای این افزونه استفاده شود.
- +vfpv3-d16
- دستورالعملهای ممیز شناور VFPv3، با 16 ثبات با دقت مضاعف.
- +vfpv3
- دستورالعملهای ممیز شناور VFPv3، با 32 ثبات با دقت مضاعف.
- +vfpv3-d16-fp16
- دستورالعملهای ممیز شناور VFPv3، با 16 ثبات با دقت مضاعف و عملیات تبدیل ممیز شناور با دقت نیمه.
- +vfpv3-fp16
- دستورالعملهای ممیز شناور VFPv3، با 32 ثبات با دقت مضاعف و عملیات تبدیل ممیز شناور با دقت نیمه.
- +vfpv4-d16
- دستورالعملهای ممیز شناور VFPv4، با 16 ثبات با دقت مضاعف.
- +vfpv4
- دستورالعملهای ممیز شناور VFPv4، با 32 ثبات با دقت مضاعف.
- +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)..IP +predres 4 دستورالعملهای محدودسازی پیشبینی اجرا و داده.
- +simd
- دستورالعملهای ممیز شناور و Advanced SIMD در ARMv8.1-A.
- +crypto
- دستورالعملهای رمزنگاری. این گزینه همچنین دستورالعملهای ممیز شناور و Advanced SIMD را فعال میکند.
- +nocrypto
- غیرفعالسازی دستورالعملهای رمزنگاری.
- +nofp
- غیرفعالسازی دستورالعملهای ممیز شناور، 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 (bfloat16). این گزینه همچنین دستورالعملهای ممیز شناور و 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 (bfloat16). این گزینه همچنین دستورالعملهای ممیز شناور و 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 (bfloat16). این گزینه همچنین دستورالعملهای ممیز شناور و Advanced SIMD را فعال میکند.
- +fp16
- دستورالعملهای پردازش دادههای ممیز شناور با دقت نیمه. این گزینه همچنین دستورالعملهای ممیز شناور و Advanced SIMD و همچنین افزونهٔ Dot Product و افزونهٔ fmla ممیز شناور با دقت نیمه را فعال میکند.
- +simd
- دستورالعملهای ممیز شناور و Advanced SIMD در ARMv8.3-A و همچنین افزونهٔ Dot Product.
- +crypto
- دستورالعملهای رمزنگاری. این گزینه همچنین دستورالعملهای ممیز شناور و Advanced SIMD و افزونهٔ Dot Product را فعال میکند.
- +nocrypto
- غیرفعالسازی افزونهٔ رمزنگاری..IP +nofp 4 دستورالعملهای ممیز شناور، Advanced SIMD و رمزنگاری را غیرفعال میکند.
- +i8mm
- دستورالعملهای ضرب ماتریسی اعداد صحیح ۸ بیتی (8-bit Integer Matrix Multiply). این گزینه همچنین دستورالعملهای Advanced SIMD و ممیز شناور را فعال میکند.
- +bf16
- دستورالعملهای ممیز شناور با دقت نیمه Brain (Brain half-precision floating-point). این گزینه همچنین دستورالعملهای Advanced SIMD و ممیز شناور را فعال میکند.
- +fp.sp
- دستورالعملهای ممیز شناور VFPv3 با دقت تکی. افزونهٔ +vfpv3xd میتواند به عنوان یک نام مستعار برای این افزونه استفاده شود.
- +fp
- دستورالعملهای ممیز شناور VFPv3 با ۱۶ ثبات با دقت مضاعف. افزونهٔ +vfpv3-d16 میتواند به عنوان یک نام مستعار برای این افزونه استفاده شود.
- +vfpv3xd-d16-fp16
- دستورالعملهای ممیز شناور VFPv3 با دقت تکی همراه با ۱۶ ثبات با دقت مضاعف و عملیات تبدیل ممیز شناور با دقت نیمه.
- +vfpv3-d16-fp16
- دستورالعملهای ممیز شناور VFPv3 همراه با ۱۶ ثبات با دقت مضاعف و عملیات تبدیل ممیز شناور با دقت نیمه.
- +nofp
- افزونهٔ ممیز شناور را غیرفعال میکند.
- +idiv
- دستورالعملهای تقسیم اعداد صحیح در حالت ARM.
- +noidiv
- افزونهٔ تقسیم اعداد صحیح در حالت ARM را غیرفعال میکند.
- +fp
- دستورالعملهای ممیز شناور VFPv4 با دقت تکی.
- +fpv5
- دستورالعملهای ممیز شناور FPv5 با دقت تکی.
- +fp.dp
- دستورالعملهای ممیز شناور FPv5 با دقتهای تکی و مضاعف.
- +nofp
- افزونههای ممیز شناور را غیرفعال میکند.
- +dsp
- دستورالعملهای DSP.
- +mve
- دستورالعملهای اعداد صحیح M-Profile Vector Extension (MVE).
- +mve.fp
- دستورالعملهای اعداد صحیح و ممیز شناور با دقت تکی M-Profile Vector Extension (MVE).
- +fp
- دستورالعملهای ممیز شناور با دقت تکی.
- +fp.dp
- دستورالعملهای ممیز شناور با دقتهای تکی و مضاعف.
- +nofp
- افزونهٔ ممیز شناور را غیرفعال میکند.
- +cdecp0, +cdecp1, ... , +cdecp7
- فعال کردن Custom Datapath Extension (CDE) روی کمکپردازندههای انتخابشده بر اساس شمارههای دادهشده در گزینهها در بازهٔ ۰ تا ۷.
- +pacbti
- فعال کردن افزونهٔ Pointer Authentication and Branch Target Identification.
- +dsp
- دستورالعملهای DSP.
- +nodsp
- افزونهٔ DSP را غیرفعال میکند.
- +fp
- دستورالعملهای ممیز شناور با دقت تکی.
- +fp.dp
- دستورالعملهای ممیز شناور با دقتهای تکی و مضاعف.
- +nofp
- افزونهٔ ممیز شناور را غیرفعال میکند.
- +cdecp0, +cdecp1, ... , +cdecp7
- فعال کردن Custom Datapath Extension (CDE) روی کمکپردازندههای انتخابشده بر اساس شمارههای دادهشده در گزینهها در بازهٔ ۰ تا ۷.
- +crc
- دستورالعملهای Cyclic Redundancy Check (CRC).
- +fp.sp
- دستورالعملهای ممیز شناور FPv5 با دقت تکی.
- +simd
- دستورالعملهای Advanced SIMD و ممیز شناور ARMv8-A.
- +crypto
- دستورالعملهای رمزنگاری.
- +nocrypto
- دستورالعملهای رمزنگاری را غیرفعال میکند.
- +nofp
- دستورالعملهای ممیز شناور، Advanced SIMD و رمزنگاری را غیرفعال میکند.
گزینهٔ -march=native باعث میشود کامپایلر معماری رایانهٔ ساخت را بهطور خودکار شناسایی کند. در حال حاضر، این ویژگی فقط در GNU/Linux پشتیبانی میشود و همهٔ معماریها شناسایی نمیشوند. اگر تشخیص خودکار ناموفق باشد، این گزینه هیچ اثری نخواهد داشت.
گزینهٔ -march=unset باعث میشود کامپایلر هر گزینهٔ -march=... را که پیشتر در خط فرمان آمده نادیده بگیرد و طوری رفتار کند که گویی این گزینه اصلاً ارسال نشده است. این ویژگی برای جلوگیری از هشدارهای مربوط به تداخل گزینههای CPU و معماری زمانی که این دو مشخصات متفاوتی از معماری را تولید میکنند، مفید است.
- -mtune=name
- این گزینه
نام
پردازندهٔ
ARM مقصد را
مشخص
میکند که GCC
باید
کارایی کد
را برای آن
تنظیم کند.
برای برخی
از
پیادهسازیهای
ARM میتوان
با استفاده
از این
گزینه به
کارایی
بهتری دست
یافت.
نامهای
مجاز
عبارتند از:
arm7tdmi, arm7tdmi-s, arm710t, arm720t,
arm740t, strongarm, strongarm110,
strongarm1100, strongarm1110, arm8, arm810,
arm9, arm9e, arm920, arm920t, arm922t,
arm946e-s, arm966e-s, arm968e-s, arm926ej-s,
arm940t, arm9tdmi, arm10tdmi, arm1020t,
arm1026ej-s, arm10e, arm1020e, arm1022e,
arm1136j-s, arm1136jf-s, mpcore, mpcorenovfp,
arm1156t2-s, arm1156t2f-s, arm1176jz-s,
arm1176jzf-s, generic-armv7-a, cortex-a5,
cortex-a7, cortex-a8, cortex-a9, cortex-a12,
cortex-a15, cortex-a17, cortex-a32,
cortex-a35, cortex-a53, cortex-a55,
cortex-a57, cortex-a72, cortex-a73,
cortex-a75, cortex-a76, cortex-a76ae,
cortex-a77, cortex-a78, cortex-a78ae,
cortex-a78c, cortex-a710, ares, cortex-r4,
cortex-r4f, cortex-r5, cortex-r7, cortex-r8,
cortex-r52, cortex-r52plus, cortex-m0,
cortex-m0plus, cortex-m1, cortex-m3,
cortex-m4, cortex-m7, cortex-m23, cortex-m33,
cortex-m35p, cortex-m52, cortex-m55,
cortex-m85, cortex-x1, cortex-x1c,
cortex-m1.small-multiply, cortex-m0.small-multiply,
cortex-m0plus.small-multiply, exynos-m1, marvell-pj4,
neoverse-n1, neoverse-n2, neoverse-v1, xscale,
iwmmxt, iwmmxt2, ep9312, fa526, fa626,
fa606te, fa626te, fmp626, fa726te,
star-mc1, xgene1.
علاوه بر این، این گزینه میتواند مشخص کند که GCC باید کارایی کد را برای یک سامانهٔ big.LITTLE تنظیم کند. نامهای مجاز عبارتند از: cortex-a15.cortex-a7, cortex-a17.cortex-a7, cortex-a57.cortex-a53, cortex-a72.cortex-a53, cortex-a72.cortex-a35, cortex-a73.cortex-a53, cortex-a75.cortex-a55, cortex-a76.cortex-a55.
گزینهٔ -mtune=generic-arch مشخص میکند که GCC باید کارایی را برای ترکیبی از پردازندههای درون معماری arch تنظیم کند. هدف، تولید کدی است که به خوبی روی محبوبترین پردازندههای کنونی اجرا شود، با ایجاد تعادل بین بهینهسازیهایی که به نفع برخی پردازندهها در این محدوده است، و پرهیز از افت کارایی در سایر پردازندهها. اثرات این گزینه ممکن است با آمدن و رفتن مدلهای CPU، در نسخههای بعدی GCC تغییر کند.
گزینهٔ -mtune همان گزینههای افزونهٔ مشابه -mcpu را میپذیرد، اما گزینههای افزونه بر تنظیم کارایی کد تولیدشده اثری ندارند.
گزینهٔ -mtune=native باعث میشود کامپایلر CPU رایانهٔ ساخت را بهطور خودکار شناسایی کند. در حال حاضر، این ویژگی فقط در GNU/Linux پشتیبانی میشود و همهٔ معماریها شناسایی نمیشوند. اگر تشخیص خودکار ناموفق باشد، این گزینه هیچ اثری نخواهد داشت..IP -mcpu=name[+extension...] 4 این گزینه نام پردازندهٔ ARM مقصد را مشخص میکند. GCC از این نام برای استخراج نام معماری ARM مقصد (گویی با -march مشخص شده باشد) و نوع پردازندهٔ ARM جهت بهینهسازی کارایی (گویی با -mtune مشخص شده باشد) استفاده میکند. در صورتی که این گزینه به همراه -march یا -mtune استفاده شود، آن گزینهها بر بخش متناظر از این گزینه اولویت خواهند داشت.
بسیاری از پردازندههای پشتیبانیشده، افزونههای اختیاری معماری را پیادهسازی میکنند. در چنین مواردی، افزونههای معماری معمولاً بهطور پیشفرض فعال هستند. اگر پیادهسازیهایی وجود داشته باشند که فاقد افزونه هستند، میتوان از نحو افزونهها برای غیرفعال کردن مواردی که تعبیه نشدهاند استفاده کرد. برای دستورالعملهای ممیز شناور و Advanced SIMD (Neon)، تنظیمات گزینههای -mfloat-abi و -mfpu نیز باید در نظر گرفته شوند: دستورالعملهای ممیز شناور و Advanced SIMD تنها در صورتی استفاده خواهند شد که -mfloat-abi روی soft تنظیم نشده باشد؛ و هر تنظیمی از -mfpu بهجز auto، بر دستورالعملهای افزونهٔ ممیز شناور و SIMD موجود اولویت خواهد داشت و آنها را بازنویسی میکند.
برای نمونه، cortex-a9 در سه پیکربندی اصلی یافت میشود: فقط عدد صحیح، تنها با یک واحد ممیز شناور، یا با ممیز شناور و Advanced SIMD. حالت پیشفرض فعالسازی همهٔ دستورالعملها است، اما افزونههای +nosimd و +nofp میتوانند بهترتیب برای غیرفعال کردن فقط SIMD یا هر دو دستورالعملهای SIMD و ممیز شناور استفاده شوند.
نامهای مجاز برای این گزینه مشابه مقادیر مجاز برای -mtune است.
گزینههای افزونهٔ زیر میان پردازندههای فهرستشده مشترک هستند:
- +nodsp
- دستورالعملهای DSP را روی cortex-m33، cortex-m35p، cortex-m52، cortex-m55 و cortex-m85 غیرفعال میکند. همچنین دستورالعملهای عدد صحیح و ممیز شناور با دقت تکی M-Profile Vector Extension (MVE) را روی cortex-m52، cortex-m55 و cortex-m85 غیرفعال میکند.
- +nopacbti
- افزونهٔ Pointer Authentication and Branch Target Identification را روی cortex-m52 و cortex-m85 غیرفعال میکند.
- +nomve
- دستورالعملهای عدد صحیح و ممیز شناور با دقت تکی M-Profile Vector Extension (MVE) را روی cortex-m52، cortex-m55 و cortex-m85 غیرفعال میکند.
- +nomve.fp
- دستورالعملهای ممیز شناور با دقت تکی M-Profile Vector Extension (MVE) را روی cortex-m52، cortex-m55 و cortex-m85 غیرفعال میکند.
- +cdecp0, +cdecp1, ... , +cdecp7
- افزونهٔ Custom Datapath Extension (CDE) را روی کمکپردازندههای انتخابشده بر پایهٔ شمارههای دادهشده در گزینهها در بازهٔ 0 تا 7 روی cortex-m52، cortex-m55 و star-mc1 فعال میکند.
- +nofp
- دستورالعملهای ممیز شناور را روی arm9e، arm946e-s، arm966e-s، arm968e-s، arm10e، arm1020e، arm1022e، arm926ej-s، arm1026ej-s، cortex-r5، cortex-r7، cortex-r8، cortex-m4، cortex-m7، cortex-m33، cortex-m35p، cortex-m52، cortex-m55 و cortex-m85 غیرفعال میکند. دستورالعملهای ممیز شناور و SIMD را روی generic-armv7-a، cortex-a5، cortex-a7، cortex-a8، cortex-a9، cortex-a12، cortex-a15، cortex-a17، cortex-a15.cortex-a7، cortex-a17.cortex-a7، cortex-a32، cortex-a35، cortex-a53 و cortex-a55 غیرفعال میکند.
- +nofp.dp
- بخش دقت مضاعف (double-precision) دستورالعملهای ممیز شناور را روی cortex-r5، cortex-r7، cortex-r8، cortex-r52، cortex-r52plus و cortex-m7 غیرفعال میکند.
- +nosimd
- دستورالعملهای SIMD (اما نه ممیز شناور) را روی generic-armv7-a، cortex-a5، cortex-a7 و cortex-a9 غیرفعال میکند.
- +crypto
- دستورالعملهای رمزنگاری را روی cortex-a32، cortex-a35، cortex-a53، cortex-a55، cortex-a57، cortex-a72، cortex-a73، cortex-a75، exynos-m1، xgene1، cortex-a57.cortex-a53، cortex-a72.cortex-a53، cortex-a73.cortex-a35، cortex-a73.cortex-a53 و cortex-a75.cortex-a55 فعال میکند.
علاوه بر این، شبهمقصد generic-armv7-a بهطور پیشفرض از VFPv3 با 16 ثبات دقت مضاعف استفاده میکند. این مقصد از گزینههای افزونهٔ زیر پشتیبانی میکند: mp، sec، vfpv3-d16، vfpv3، vfpv3-d16-fp16، vfpv3-fp16، vfpv4-d16، vfpv4، neon، neon-vfpv3، neon-fp16، neon-vfpv4. معانی آنها همانند افزونههای مربوط به -march=armv7-a است.
استفاده از -mcpu=generic-arch نیز مجاز است و با -march=arch -mtune=generic-arch برابری میکند. برای اطلاعات بیشتر -mtune را ببینید.
گزینهٔ -mcpu=native باعث میشود کامپایلر پردازندهٔ رایانهٔ ساخت را بهطور خودکار شناسایی کند. در حال حاضر، این قابلیت تنها روی GNU/Linux پشتیبانی میشود و همهٔ معماریها نیز شناسایی نمیشوند. در صورتی که شناسایی خودکار ناموفق باشد، این گزینه هیچ اثری ندارد.
گزینهٔ -mcpu=unset باعث میشود کامپایلر هرگونه گزینهٔ -mcpu=... را که پیشتر در خط فرمان ظاهر شده باشد نادیده بگیرد و بهگونهای عمل کند که گویی این گزینه هرگز داده نشده است. این ویژگی برای جلوگیری از هشدارهای مربوط به تداخل گزینههای پردازنده و معماری، در حالتی که این دو مشخصات متفاوتی برای معماری ایجاد میکنند، مفید است.
- -mfpu=name
- این گزینه
سختافزار
ممیز شناور
(یا
شبیهسازی
سختافزاری)
موجود در
مقصد را
مشخص
میکند.
نامهای
مجاز
عبارتند از:
auto، vfpv2، vfpv3،
vfpv3-fp16، vfpv3-d16،
vfpv3-d16-fp16، vfpv3xd،
vfpv3xd-fp16، neon-vfpv3،
neon-fp16، vfpv4، vfpv4-d16،
fpv4-sp-d16، neon-vfpv4،
fpv5-d16، fpv5-sp-d16، fp-armv8،
neon-fp-armv8 و crypto-neon-fp-armv8.
توجه داشته
باشید که neon
یک نام
مستعار
برای neon-vfpv3 و vfp
یک نام
مستعار
برای vfpv2 است.
تنظیم auto حالت پیشفرض و ویژه است. این مقدار موجب میشود کامپایلر دستورالعملهای ممیز شناور و Advanced SIMD را بر اساس تنظیمات -mcpu و -march برگزیند.
اگر سختافزار ممیز شناور انتخابشده شامل افزونهٔ NEON باشد (مانند -mfpu=neon)، توجه داشته باشید که عملیات ممیز شناور توسط مرحلهٔ بردارسازی خودکار در GCC تولید نمیشوند مگر اینکه -funsafe-math-optimizations نیز مشخص شده باشد. دلیل این امر آن است که سختافزار NEON استاندارد IEEE 754 را برای محاسبات ممیز شناور بهطور کامل پیادهسازی نمیکند (بهویژه با مقادیر غیرعادی [denormal] همانند صفر برخورد میشود)، بنابراین استفاده از دستورالعملهای NEON ممکن است منجر به کاهش دقت شود.
همچنین میتوانید نام fpu را در سطح تابع با استفاده از ویژگیهای تابع یا عملگرهای عملیاخته (pragmas) از نوع target("fpu=") تنظیم کنید.
- -mfp16-format=name
- قالب نوع ممیز شناور با نیمدقت (half-precision) "__fp16" را مشخص میکند. نامهای مجاز عبارتند از none، ieee و alternative؛ حالت پیشفرض none است که در این حالت نوع "__fp16" تعریف نشده است.
- -mstructure-size-boundary=n
- اندازهٔ
همهٔ
ساختارها
(structures) و
اجتماعها
(unions) به مضربی
از تعداد
بیتهای
تعیینشده
توسط این
گزینه رو به
بالا گرد
میشود.
مقادیر
مجاز
عبارتند از
8، 32 و 64. مقدار
پیشفرض
برای
زنجیرهابزارهای
گوناگون
متفاوت است.
برای
زنجیرهابزار
با مقصد COFF
مقدار
پیشفرض 8
است. مقدار 64
تنها زمانی
مجاز است که
ABI زیرین از
آن
پشتیبانی
کند.
مشخص کردن یک عدد بزرگتر میتواند کدی سریعتر و کارآمدتر تولید کند، اما ممکن است اندازهٔ برنامه را نیز افزایش دهد. مقادیر مختلف احتمالاً ناسازگار هستند. اگر اطلاعات با استفاده از ساختارها یا اجتماعها مبادله شود، کدی که با یک مقدار کامپایل شده است لزوماً نمیتواند با کد یا کتابخانههای کامپایلشده با مقداری دیگر کار کند.
این گزینه منسوخ شده است.
- -mabort-on-noreturn
- در انتهای یک تابع "noreturn"، یک فراخوانی به تابع "abort" تولید میکند. این فراخوانی در صورتی که تابع تلاش کند بازگردد، اجرا میشود.
- -mlong-calls
- -mno-long-calls
- به
کامپایلر
میگوید که
فراخوانی
توابع را
ابتدا با
بارگذاری
نشانی تابع
درون یک
ثبات و سپس
انجام
فراخوانی
زیرروال
روی این
ثبات انجام
دهد. این
سوییچ
زمانی مورد
نیاز است که
تابع مقصد
خارج از
محدودهٔ
آدرسدهی 64
مگابایتی
نسخهٔ
مبتنی بر
آفست دستور
فراخوانی
زیرروال
قرار داشته
باشد.
حتی اگر این سوییچ فعال باشد، تمام فراخوانیهای تابع به فراخوانی دور (long call) تبدیل نمیشوند. روش ابتکاری (heuristic) بدین گونه است که توابع ایستا (static)، توابعی که دارای صفت "short_call" هستند، توابعی که در دامنهٔ یک رهنمود "#pragma no_long_calls" قرار دارند، و توابعی که تعریف آنها پیشتر در همان واحد ترجمهٔ جاری کامپایل شده است، به فراخوانی دور تبدیل نمیشوند. استثناهای این قاعده عبارتند از تعاریف توابع ضعیف (weak)، توابع دارای صفت "long_call" یا صفت "section"، و توابعی که در دامنهٔ رهنمود "#pragma long_calls" قرار دارند؛ این موارد همواره به فراخوانی دور تبدیل میشوند.
این قابلیت بهطور پیشفرض فعال نیست. مشخص کردن -mno-long-calls رفتار پیشفرض را بازمیگرداند؛ همچنین قرار دادن فراخوانی توابع در دامنهٔ یک رهنمود "#pragma long_calls_off" اثر مشابهی دارد. توجه داشته باشید این سوییچها هیچ اثری بر نحوهٔ تولید کد توسط کامپایلر برای مدیریت فراخوانی توابع از طریق اشارهگرهای تابع ندارند..IP -msingle-pic-base 4 ثبات مورد استفاده برای آدرسدهی PIC را به جای بارگذاری آن در پیشدرآمد (prologue) هر تابع، به عنوان فقطخواندنی در نظر میگیرد. سامانهٔ زمان اجرا مسئول مقداردهی اولیهٔ این ثبات با یک مقدار مناسب قبل از شروع اجرا است.
- -mpic-register=reg
- ثباتی را که باید برای آدرسدهی PIC استفاده شود مشخص میکند. برای حالت پایهٔ استاندارد PIC، مقدار پیشفرض هر ثبات مناسبی است که توسط کامپایلر تعیین شود. برای حالت پایهٔ تکی PIC، در صورتی که مقصد مبتنی بر EABI باشد یا بررسی پشته فعال باشد، مقدار پیشفرض R9 است؛ در غیر این صورت مقدار پیشفرض R10 خواهد بود.
- -mpic-data-is-text-relative
- فرض میکند که جابهجایی میان بخشهای text و data در زمان پیوند ایستا ثابت است. این امر اجازه میدهد تا از عملیاتهای آدرسدهی وابسته به PC برای دسترسی به دادههایی که مشخص است در بخش data قرار دارند، استفاده شود. برای مقصدهای غیر VxWorks RTP، این گزینه به طور پیشفرض فعال است. هنگام غیرفعال شدن در چنین مقصدهایی، گزینهٔ -msingle-pic-base به طور پیشفرض فعال خواهد شد.
- -mpoke-function-name
- نام هر تابع
را
مستقیماً
پیش از
پیشدرآمد
تابع، درون
بخش text
مینویسد.
کد
تولیدشده
شبیه به این
است:
t0 .ascii "arm_poke_function_name", 0 .align t1 .word 0xff000000 + (t1 - t0) arm_poke_function_name mov ip, sp stmfd sp!, {fp, ip, lr, pc} sub fp, ip, #4هنگام اجرای ردگیری به عقب پشته (stack backtrace)، کد میتواند مقدار "pc" ذخیرهشده در "fp + 0" را بررسی کند. اگر تابع ردگیری سپس به مکان "pc - 12" نگاه کند و ۸ بیت بالایی تنظیم شده باشند، متوجه میشویم که نام تابع بلافاصله پیش از این مکان جاسازی شده و طولی برابر با "((pc[-3]) & 0xff000000)" دارد.
- -mthumb
- -marm
- بین تولید
کدی که در
وضعیتهای
ARM و Thumb اجرا
میشود،
انتخاب
میکند.
پیشفرض در
بیشتر
پیکربندیها
تولید کدی
است که در
وضعیت ARM
اجرا
میشود،
اما
میتوان
این
پیشفرض را
با
پیکربندی GCC
از طریق
گزینهٔ
پیکربندی
--with-mode=state تغییر
داد.
همچنین میتوانید حالت ARM و Thumb را برای هر تابع با استفاده از ویژگیهای تابع یا عملگرهای عملگری (pragmas) با نامهای target("thumb") و target("arm") لغو و جایگزین کنید.
- -mflip-thumb
- حالتهای ARM/Thumb را به صورت متناوب بین توابع تعویض میکند. این گزینه برای آزمون پسرفت (regression testing) تولید کد ترکیبی Thumb/ARM فراهم شده است و برای استفادهٔ معمول در کامپایل کد در نظر گرفته نشده است.
- -mtpcs-frame
- برای همهٔ توابع غیربرگ (non-leaf)، یک چارچوب پشته سازگار با استاندارد فراخوانی رویهٔ Thumb تولید میکند. (تابع برگ تابعی است که هیچ تابع دیگری را فراخوانی نمیکند.) پیشفرض -mno-tpcs-frame است.
- -mtpcs-leaf-frame
- برای تمام توابع برگ، یک چارچوب پشته سازگار با استاندارد فراخوانی رویهٔ Thumb تولید میکند. (تابع برگ تابعی است که هیچ تابع دیگری را فراخوانی نمیکند.) پیشفرض -mno-apcs-leaf-frame است.
- -mcallee-super-interworking
- به تمام توابع دارای دید بیرونی در فایل در حال کامپایل، یک سرآیند مجموعه دستورالعمل ARM اختصاص میدهد که پیش از اجرای بقیه تابع، به حالت Thumb تغییر وضعیت میدهد. این امر اجازه میدهد تا این توابع از طریق کدهای غیرتعاملی (non-interworking) فراخوانی شوند. این گزینه در پیکربندیهای AAPCS معتبر نیست، چرا که interworking به صورت پیشفرض فعال است.
- -mcaller-super-interworking
- امکان اجرای صحیح فراخوانیها از طریق اشارهگرهای تابع (از جمله توابع مجازی) را بدون در نظر گرفتن اینکه کد مقصد برای interworking کامپایل شده است یا خیر، فراهم میکند. در صورت فعال بودن این گزینه، هزینهٔ اجرای اشارهگر تابع دارای سربار اندکی خواهد بود. این گزینه در پیکربندیهای AAPCS معتبر نیست، چرا که interworking به صورت پیشفرض فعال است.
- -mtp=name
- مدل دسترسی برای اشارهگر حافظه محلی نخ (thread local storage pointer) را تعیین میکند. مدل 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 اجرایی اولیه و محلی تحت تأثیر این گزینه قرار نمیگیرند و همواره از طرح اصلی استفاده میکنند.
- -mword-relocations
- تنها بازنشانیهای مطلق را روی مقادیر به اندازه کلمه (یعنی R_ARM_ABS32) تولید میکند. این گزینه در مقصدهایی (uClinux، SymbianOS) که بارگذار زمان اجرا چنین محدودیتی را اعمال میکند، و همچنین هنگامی که -fpic یا -fPIC مشخص شده باشد، به طور پیشفرض فعال است. این گزینه با -mslow-flash-data تداخل دارد.
- -mfix-cortex-m3-ldrd
- برخی از هستههای Cortex-M3 میتوانند هنگام استفاده از دستورالعملهای "ldrd" با ثباتهای مبنا و مقصد همپوشان، موجب خرابی داده شوند. این گزینه از تولید این دستورالعملها جلوگیری میکند. این گزینه به طور پیشفرض هنگام مشخص شدن -mcpu=cortex-m3 فعال میشود.
- -mfix-cortex-a57-aes-1742098
- -mno-fix-cortex-a57-aes-1742098
- -mfix-cortex-a72-aes-1655431
- -mno-fix-cortex-a72-aes-1655431
- کاهش اثر (یا عدم کاهش اثر) برای یک نقص سختافزاری در 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
- فرض میکند که بارگذاری دادهها از حافظه فلش کندتر از واکشی دستورالعمل است. بنابراین، بارگذاری مقادیر تحتاللفظی برای کارایی بهتر به حداقل میرسد. این گزینه تنها هنگام کامپایل برای ARMv7 M-profile پشتیبانی میشود و به طور پیشفرض خاموش است. این گزینه با -mword-relocations تداخل دارد.
- -masm-syntax-unified
- فرض میکند که اسمبلر درونخطی از نحو یکپارچهٔ اسمبلی (unified asm syntax) استفاده میکند. پیشفرض در حال حاضر غیرفعال است که به معنای نحو تفکیکشده (divided syntax) است. این گزینه تأثیری بر Thumb2 ندارد؛ با این حال، ممکن است در نسخههای بعدی GCC این وضعیت تغییر کند. نحو تفکیکشده باید منسوخ در نظر گرفته شود.
- -mrestrict-it
- تولید بلوکهای IT را محدود میکند تا با قوانین ARMv8-A مطابقت داشته باشند. بلوکهای IT تنها میتوانند شامل یک تکدستورالعمل ۱۶ بیتی از یک مجموعه دستورالعمل برگزیده باشند. این گزینه برای حالت Thumb در ARMv8-A به طور پیشفرض فعال است.
- -mprint-tune-info
- اطلاعات تنظیم پردازنده را به صورت یادداشت (comment) در فایل اسمبلی چاپ میکند. این گزینه صرفاً برای آزمون پسرفت کامپایلر استفاده میشود و برای کاربرد معمول در کامپایل کد در نظر گرفته نشده است. این گزینه به طور پیشفرض غیرفعال است.
- -mverbose-cost-dump
- تخلیهٔ پرحجم مدل هزینه را در فایلهای تخلیهٔ اشکالزدایی فعال میکند. این گزینه برای استفاده در اشکالزدایی کامپایلر ارائه شده است..IP -mpure-code 4 اجازه ندهید دادههای ثابت در بخشهای کد قرار گیرند. علاوهبر این، هنگام کامپایل برای قالب شیء ELF، به تمامی بخشهای text ویژگی بخش ویژهٔ پردازنده ELF یعنی "SHF_ARM_PURECODE" را اختصاص دهید. این گزینه تنها هنگام تولید کد non-pic برای اهداف M-profile در دسترس است.
- -mcmse
- تولید کد امن مطابق با "ARMv8-M Security Extensions: Requirements on Development Tools Engineering Specification" که در https://developer.arm.com/documentation/ecm0359818/latest در دسترس است.
- -mfix-cmse-cve-2021-35465
- کاهش اثر یک مشکل امنیتی بالقوه در دستور "VLLDM" در برخی از دستگاههای M-profile هنگام استفاده از CMSE (CVE-2021-365465). این گزینه بهطور پیشفرض زمانی که گزینهٔ -mcpu= همراه با "cortex-m33"، "cortex-m35p"، "cortex-m52"، "cortex-m55"، "cortex-m85" یا "star-mc1" استفاده شود، فعال است. گزینهٔ -mno-fix-cmse-cve-2021-35465 میتواند برای غیرفعالسازی این کاهش اثر به کار رود.
- -mstack-protector-guard=guard
- -mstack-protector-guard-offset=offset
- تولید کد محافظت از پشته با استفاده از قناری (canary) در guard. مکانهای پشتیبانیشده عبارتند از global برای یک قناری سراسری یا tls برای یک قناری قابل دسترسی از طریق ثبات TLS. گزینهٔ -mstack-protector-guard-offset= برای استفاده همراه با -fstack-protector-guard=tls است و نباید در کدهای فضای کاربری استفاده شود.
- -mfdpic
- -mno-fdpic
- انتخاب FDPIC ABI،
که از
توصیفکنندههای
تابع ۶۴
بیتی برای
نمایش
اشارهگرها
به توابع
استفاده
میکند.
هنگامی که
کامپایلر
برای اهداف
"arm-*-uclinuxfdpiceabi"
پیکربندی
شده باشد،
این گزینه
بهطور
پیشفرض
فعال است و
در صورتی که
هیچیک از
گزینههای
مرتبط با PIC/PIE
مشخص نشده
باشند، -fPIE
را اعمال
میکند. در
سایر
اهداف، این
گزینه تنها
ویژگیهای
تولید کد
ویژهٔ FDPIC را
فعال
میکند و
کاربر باید
در صورت
نیاز،
گزینههای
مرتبط با PIC/PIE
را صراحتاً
ارائه دهد.
توجه داشته باشید که پیوند ایستا پشتیبانی نمیشود، زیرا هنگام جابهجایی خودکار برنامه، همچنان به پیونددهندهٔ پویا نیاز خواهد داشت. اگر چنین رفتاری قابل قبول است، از گزینههای -static و -Wl,-dynamic-linker استفاده کنید.
گزینهٔ معکوس -mno-fdpic برای ساخت هستهٔ لینوکس با استفاده از همان زنجیره ابزار ("arm-*-uclinuxfdpiceabi") که برای ساخت برنامههای فضای کاربری به کار رفته، مفید (و ضروری) است.
- -mbranch-protection=none|standard|pac-ret[+leaf][+bti]|bti[+pac-ret[+leaf]]
- فعال کردن
ویژگیهای
محافظت از
انشعاب
(تنها در armv8.1-m.main).
none تولید کد
بدون
محافظت از
انشعاب یا
امضای
نشانی
بازگشت.
standard[+leaf]
تولید کد با
فعال بودن
تمامی
ویژگیهای
محافظت از
انشعاب در
سطح
استاندارد
آنها. pac-ret[+leaf]
تولید کد با
امضای
نشانی
بازگشت
تنظیمشده
روی سطح
استاندارد،
که عبارت
است از
امضای تمام
توابعی که
نشانی
بازگشت را
در حافظه
ذخیره
میکنند. leaf
هنگامی که
امضای
نشانی
بازگشت
فعال است،
توابع برگ
را حتی در
صورتی که
نشانی
بازگشت را
در حافظه
ننویسند،
امضا
میکند. +bti
افزودن
دستورهای
landing-pad در اهداف
مجاز
دستورهای
انشعاب
غیرمستقیم.
اگر افزونهٔ معماری +pacbti فعال نباشد، تمامی عملیات محافظت از انشعاب و امضای نشانی بازگشت محدود به استفاده از دستورهایی میشوند که در فضای NOP معماری تعریف شدهاند. کد تولیدشده همچنان با نسخههای پیشین معماری سازگار خواهد ماند، اما امنیت افزوده را میتوان در زمان اجرا روی پردازندههایی که از افزونهٔ PACBTI پشتیبانی میکنند فعال کرد.
اجرای اعمال هدف انشعاب با استفاده از BTI تنها در زمان اجرا قابل فعالسازی است، مشروط بر اینکه تمام کد برنامه دستکم با -mbranch-protection=bti کامپایل شده باشد.
هر تنظیمی غیر از none تنها در armv8-m.main یا جدیدتر پشتیبانی میشود.
حالت پیشفرض، تولید کد بدون محافظت از انشعاب یا امضای نشانی بازگشت است.
گزینههای AVR
این گزینهها برای پیادهسازیهای AVR تعریف شدهاند:
- -mmcu=mcu
- مشخص کردن
معماری
مجموعه
دستورالعمل
(ISA) یا نوع
دستگاه AVR.
مقدار
پیشفرض
برای این
گزینه
"avr2" است.
دستگاهها و ISAهای AVR زیر پشتیبانی میشوند. نکته: پشتیبانی کامل از دستگاه شامل کد راهاندازی "crtmcu.o"، یک سرآیند دستگاه "avr/io*.h"، یک کتابخانهٔ دستگاه "libmcu.a" و یک فایل مشخصات دستگاه ("https://gcc.gnu.org/wiki/avr-gcc#spec-files") به نام "specs-mcu" است. کامپایلر بر اساس "mcu"های پشتیبانیشده در زیر، فقط فایل اخیر را ارائه میدهد. بقیه موارد توسط AVR-LibC ("https://github.com/avrdudes/avr-libc")، یا با استفاده از فایلهای "atpack" ("https://gcc.gnu.org/wiki/avr-gcc#atpack") از سازندهٔ سختافزار پشتیبانی میشوند.
- "avr2"
- دستگاههای «کلاسیک» با حداکثر ۸ کیبیبایت حافظهٔ برنامه. mcu = "attiny22", "attiny26", "at90s2313", "at90s2323", "at90s2333", "at90s2343", "at90s4414", "at90s4433", "at90s4434", "at90c8534", "at90s8515", "at90s8535".
- "avr25"
- دستگاههای «کلاسیک» با حداکثر ۸ کیبیبایت حافظهٔ برنامه و دارای دستور "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"
- دستگاههای «کلاسیک» با ۱۶ کیبیبایت تا ۶۴ کیبیبایت حافظهٔ برنامه. mcu = "at76c711", "at43usb355".
- "avr31"
- دستگاههای «کلاسیک» با ۱۲۸ کیبیبایت حافظهٔ برنامه. mcu = "atmega103", "at43usb320".
- "avr35"
- دستگاههای «کلاسیک» با ۱۶ کیبیبایت تا ۶۴ کیبیبایت حافظهٔ برنامه و دارای دستور "MOVW". mcu = "attiny167", "attiny1634", "atmega8u2", "atmega16u2", "atmega32u2", "ata5505", "ata6617c", "ata664251", "at90usb82", "at90usb162".
- "avr4"
- دستگاههای «بهبودیافته» با حداکثر ۸ کیبیبایت حافظهٔ برنامه. 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"
- دستگاههای «بهبودیافته» با ۱۶ کیبیبایت تا ۶۴ کیبیبایت حافظهٔ برنامه. 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"
- دستگاههای «بهبودیافته» با ۱۲۸ کیبیبایت حافظهٔ برنامه. mcu = "atmega128", "atmega128a", "atmega128rfa1", "atmega128rfr2", "atmega1280", "atmega1281", "atmega1284", "atmega1284p", "atmega1284rfr2", "at90can128", "at90usb1286", "at90usb1287".
- "avr6"
- دستگاههای «بهبودیافته» با شمارندهٔ برنامه (PC) ۳ بایتی، یعنی با بیش از ۱۲۸ کیبیبایت حافظهٔ برنامه. mcu = "atmega256rfr2", "atmega2560", "atmega2561", "atmega2564rfr2".
- "avrxmega2"
- دستگاههای «XMEGA» با بیش از ۸ کیبیبایت و حداکثر ۶۴ کیبیبایت حافظهٔ برنامه. 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» با حداکثر ۶۴ کیبیبایت مجموع حافظهٔ برنامه و 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» با بیش از ۶۴ کیبیبایت و حداکثر ۱۲۸ کیبیبایت حافظهٔ برنامه. mcu = "atxmega64a3", "atxmega64a3u", "atxmega64a4u", "atxmega64b1", "atxmega64b3", "atxmega64c3", "atxmega64d3", "atxmega64d4", "avr128da28", "avr128da28s", "avr128da32", "avr128da32s", "avr128da48", "avr128da48s", "avr128da64", "avr128da64s", "avr128db28", "avr128db32", "avr128db48", "avr128db64".
- "avrxmega5"
- دستگاههای «XMEGA» با بیش از ۶۴ کیبیبایت و حداکثر ۱۲۸ کیبیبایت حافظهٔ برنامه و بیش از ۶۴ کیبیبایت RAM. mcu = "atxmega64a1", "atxmega64a1u".
- "avrxmega6"
- دستگاههای «XMEGA» با بیش از ۱۲۸ کیبیبایت حافظهٔ برنامه. mcu = "atxmega128a3", "atxmega128a3u", "atxmega128b1", "atxmega128b3", "atxmega128c3", "atxmega128d3", "atxmega128d4", "atxmega192a3", "atxmega192a3u", "atxmega192c3", "atxmega192d3", "atxmega256a3", "atxmega256a3b", "atxmega256a3bu", "atxmega256a3u", "atxmega256c3", "atxmega256d3", "atxmega384c3", "atxmega384d3".
- "avrxmega7"
- دستگاههای «XMEGA» با بیش از ۱۲۸ کیبیبایت حافظهٔ برنامه و بیش از ۶۴ کیبیبایت RAM. mcu = "atxmega128a1", "atxmega128a1u", "atxmega128a4u".
- "avrtiny"
- دستگاههای هستهٔ Tiny از نوع «Reduced Tiny» تنها با ۱۶ ثبات همهمنظوره و ۵۱۲ بایت تا ۴ کیبیبایت حافظهٔ برنامه. mcu = "attiny4", "attiny5", "attiny9", "attiny10", "attiny102", "attiny104", "attiny20", "attiny40".
- "avr1"
- این ISA توسط کمینهٔ هستهٔ AVR پیادهسازی شده و تنها برای اسمبلر پشتیبانی میشود. mcu = "attiny11", "attiny12", "attiny15", "attiny28", "at90s1200".
- -mcvt
- از یک جدول
بردار
فشرده (compact vector table)
استفاده
میکند.
برخی از
دستگاهها
از CVT تنها با
چهار ورودی
پشتیبانی
میکنند: 0=Reset،
1=NMI، 2=Prio1 IRQ و 3=Prio0 IRQs. این
گزینه کد
راهاندازی
(startup code) را
بهجای
فایل معمول
"crtmcu.o"
از
"crtmcu-cvt.o"
پیوند
میدهد.
علاوه بر
ارائهٔ یک
جدول بردار
فشرده، کد
راهاندازی
بیت
"CPUINT_CTRLA.CPUINT_CVT"
را تنظیم
خواهد کرد
که CVT را روی
دستگاه
فعال
میکند.
هنگامی که نمیخواهید کد راهاندازی بیت "CPUINT_CTRLA.CPUINT_CVT" را تنظیم کند، میتوانید نماد "__init_cvt" را مقداردهی و ارضا کنید تا کد مربوطه دیگر از "libmcu.a" فراخوانی نشود. برای نمونه، میتوانید با "-Wl,--defsym,__init_cvt=0" پیوند را انجام دهید.
کد راهاندازی CVT از نسخهٔ AVR-LibC v2.3 ("https://github.com/avrdudes/avr-libc/issues/1010") در دسترس است.
- -mdouble=bits
- -mlong-double=bits
- اندازه (برحسب بیت) نوعهای "double" یا "long double" را بهترتیب تعیین میکند. مقادیر ممکن برای bits شامل ۳۲ و ۶۴ است. مجاز بودن یا نبودن یک مقدار مشخص برای bits، به گزینههای پیکربندی "--with-double=" و "--with-long-double=" ("https://gcc.gnu.org/install/configure.html#avr") بستگی دارد، و همین امر برای مقادیر پیشفرض گزینهها نیز صدق میکند.
- -mgas-isr-prologues
- روالهای سرویس وقفه (ISRها) میتوانند از شبهدستور "__gcc_isr" پشتیبانیشده توسط GNU Binutils استفاده کنند. اگر این گزینه روشن باشد، این قابلیت همچنان میتواند برای تکتک ISRها بهوسیلهٔ صفت تابع AVR 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") قرار میدهد تا نیازی به فراخوانی (call) نباشد. با تنظیم این گزینه، کاربر تعهد میدهد که "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) توسط پیونددهنده انجام میشود زیرا آفستهای جهش قبل از استقرار نهایی کد مشخص نیستند. بنابراین، کد اسمبلی تولیدشده توسط کامپایلر یکسان است، اما دستورالعملهای موجود در فایل اجرایی ممکن است با دستورالعملهای کد اسمبلی تفاوت داشته باشند.
اگر به stubهای پیونددهنده نیاز باشد، قابلیت Relaxing باید فعال شود؛ بخش مربوط به "EIND" و linker stubها را در زیر ببینید.
- -mrodata-in-ram
- -mno-rodata-in-ram
- بخشهای
".rodata" را
برای
دادههای
فقطخواندنی،
بهترتیب
در RAM یا در
حافظهٔ
برنامه
قرار
میدهد.
برای بیشتر
دستگاهها،
انتخابی
وجود ندارد
و این گزینه
بیشتر شبیه
به یک
تأییدیه (assertion)
عمل میکند.
از نسخهٔ ۱۴ و برای دستگاههای AVR64* و AVR128*، بخش ".rodata" بهطور پیشفرض در حافظهٔ فلش جایگذاری میشود، به شرطی که پشتیبانی لازم در GNU Binutils (PR31124 ("https://sourceware.org/PR31124")) موجود باشد. در آن حالت، میتوان از -mrodata-in-ram برای بازگشت به ساختار قبلی با ".rodata" در RAM استفاده کرد.
- -mtiny-stack
- تنها ۸ بیت پایینی اشارهگر پشته را تغییر میدهد.
- -mfract-convert-truncate
- اجازه میدهد برای انواع ممیز ثابت کسری (fractional fixed-point)، بهجای گرد کردن بهسمت صفر از برش و قطع رقم (truncation) استفاده شود.
- -nodevicelib
- با
کتابخانهٔ
اختصاصی
دستگاه در
AVR-LibC، یعنی
"libmcu.a"
پیوند
برقرار
نمیکند.
توجه داشته باشید که از AVR-LibC v2.3 به بعد، این کتابخانه شامل کدهایی است که برای عملکرد درست برنامه حیاتی هستند. بهویژه، بخشهایی از کد راهاندازی مانند موارد زیر را شامل میشود: "__init_sp" ("https://github.com/avrdudes/avr-libc/issues/1011") برای مقداردهی اولیه به اشارهگر پشته با نماد "__stack"، "__init_cvt" ("https://github.com/avrdudes/avr-libc/issues/1010") برای تنظیم سختافزار جهت استفاده از یک جدول بردار فشرده با -mcvt، "__call_main" ("https://github.com/avrdudes/avr-libc/issues/1012") برای فراخوانی "main" و "exit"، و "__do_flmap_init" ("https://github.com/avrdudes/avr-libc/issues/931") برای راهاندازی FLMAP مطابق با نماد "__flmap".
- -nodevicespecs
- گزینهٔ
-specs=device-specs/specs-mcu را
به خط فرمان
راهانداز
کامپایلر (compiler
driver) اضافه
نمیکند.
کاربر
مسئولیت
تأمین
گزینههای
مناسب خط
فرمان برای
زیرفرآیندها
مانند
کامپایلر
اصلی،
اسمبلر و
پیونددهنده
را بر عهده
میگیرد.
این بدان
معناست که
کاربر باید
فایل
مشخصات
دستگاه
خصوصی خود
را با
استفاده از
-specs=path-to-specs-file
ارائه دهد.
دیگر نیازی
به گزینهٔ
-mmcu=mcu نخواهد
بود.
این گزینه همچنین میتواند بهعنوان جایگزینی برای شیوهٔ قدیمیتر تعیین فایلهای device-specs سفارشی عمل کند که نیازمند استفاده از -B some-path برای اشاره به دایرکتوریای بود که پوشهای به نام "device-specs" را در بر داشت و آن پوشه حاوی یک فایل specs به نام "specs-mcu" بود، جایی که mcu توسط -mmcu=mcu مشخص میشد.
- -Waddr-space-convert
- در مورد تبدیلهای بین فضاهای آدرس (address spaces) در شرایطی که فضای آدرس حاصل در فضای آدرس ورودی جای نگرفته باشد، هشدار میدهد.
- -Wmisspelled-isr
- اگر نام ISR بهصورت نادرست نوشته شده باشد (یعنی بدون پیشوند __vector)، هشدار میدهد. بهطور پیشفرض فعال است.
گزینههای بهینهسازی AVR (AVR Optimization Options)
گزینههای زیر گزینههای بهینهسازی محض هستند. گزینههای -mgas-isr-prologues، -mmain-is-OS_task، -mno-call-main و -mrelax که در بالا آمدند، تنها تقریباً گزینههای بهینهسازی هستند، زیرا در شرایط نادری تولید کد متفاوت آنها حائز اهمیت خواهد بود.
- -maccumulate-args
- آرگومانهای
خروجی تابع
را تجمیع
میکند و
فضای پشتهٔ
مورد نیاز
برای
آرگومانهای
خروجی تابع
را یکبار
در
مقدمه/مؤخرهٔ
(prologue/epilogue) تابع
تخصیص داده
و آزاد
میکند.
بدون این
گزینه،
آرگومانهای
خروجی پیش
از
فراخوانی
تابع در
پشته قرار
گرفته (push شده)
و پس از آن
برداشته (pop)
میشوند.
همچنین
گزینهٔ
بهینهسازی
-fdefer-pop را در Optimize
Options,,optimization option
ببینید.
برداشتن آرگومانها از پشته پس از فراخوانی تابع میتواند در AVR هزینهبر باشد، بنابراین تجمیع فضای پشته ممکن است به فایلهای اجرایی کوچکتری منجر شود، زیرا پس از فراخوانی تابع نیازی به حذف آرگومانها از پشته نیست.
این گزینه میتواند برای توابعی که چندین بار توابعی با آرگومانهای قرارگرفته در پشته را فراخوانی میکنند (مانند فراخوانی توابع شبیه printf)، به کاهش حجم کد بیانجامد.
- -mbranch-cost=cost
- هزینهٔ انشعاب را برای دستورهای انشعاب شرطی روی cost تنظیم میکند. مقادیر معقول برای cost اعداد صحیح کوچک و غیرمنفی هستند. هزینهٔ انشعاب پیشفرض 0 است..IP -mcall-prologues 4 مقدمه و موخره توابع (prologues/epilogues) بهصورت فراخوانی زیربرنامههای مناسب بسط داده میشوند. اندازه کد کوچکتری حاصل میشود.
- -mfuse-add
- -mno-fuse-add
- -mfuse-add=level
- دسترسیهای غیرمستقیم به حافظه را در دستگاههای تقلیلیافته Tiny بهینهسازی میکند. مقدار پیشفرض برای بهینهسازیهای -Og و -O1 برابر با "level=1" و برای بهینهسازیهای بالاتر برابر با "level=2" است. مقادیر معتبر برای level عبارتند از 0، 1 و 2.
- -mfuse-move
- -mno-fuse-move
- -mfuse-move=level
- یک مرحله بهینهسازی پس از بارگذاری مجدد (post reload) را اجرا میکند که تلاش مینماید دستورهای انتقال (move) را ادغام کرده و دستورهای چندبایتی را به عملیاتهای ۸ بیتی تقسیم کند. مقدار پیشفرض برای بهینهسازی -O1 برابر با "level=3" و برای بهینهسازیهای بالاتر "level=23" است. مقادیر معتبر برای level در محدوده 0 ... 23 هستند که مقداری در مبنای مختلط 3:2:2:2 است. هر رقم جنبهای از بهینهسازی را کنترل میکند.
- -mfuse-move2
- یک مرحله بهینهسازی پس از ترکیب (post combine) را اجرا میکند که تلاش مینماید دستورهای انتقال (move) را ادغام کند.
- -mstrict-X
- از ثبات
آدرسدهی
"X" به
روشی که
توسط
سختافزار
پیشنهاد
شده
استفاده
میکند. این
بدان
معناست که
"X" تنها
در
آدرسدهی
غیرمستقیم،
پسافزایشی
(post-increment) یا
پیشکاهشی
(pre-decrement) به کار
میرود.
بدون این گزینه، ثبات "X" ممکن است به همان روش ثباتهای "Y" یا "Z" استفاده شود که در این صورت با استفاده از دستورهای اضافی شبیهسازی خواهد شد. برای نمونه، بارگذاری یک مقدار در ثبات Rn با آدرسدهی "X+const" و با مقدار ثابت غیرمنفی کوچک "const < 64" به صورت زیر انجام میشود:
adiw r26, const ; X += const ld <Rn>, X ; <Rn> = *X sbiw r26, const ; X -= const
- -msplit-bit-shift
- شیفتهای چندبایتی با آفست ثابت را به یک شیفت با آفست بایتی و یک شیفت باقیمانده با آفست غیربایتی تقسیم میکند. این بهینهسازی بهطور پیشفرض برای -O2 و بالاتر، شامل -Os اما بهجز -Oz فعال است. تقسیم شیفتها با آفست ثابتی که مضربی از ۸ باشد توسط -mfuse-move کنترل میشود.
- -msplit-ldst
- عملیاتهای بارگذاری و ذخیرهسازی چندبایتی را به چند بارگذاری و ذخیرهسازی بایتی تقسیم میکند. این بهینهسازی بهطور پیشفرض برای -O2 و بالاتر فعال است.
- -muse-nonzero-bits
- بهینهسازیهایی را فعال میکند که تنها در صورت صفر بودن همیشگی برخی بیتها در یک ثبات امکانپذیر هستند. این بهینهسازی بهطور پیشفرض برای -O2 و بالاتر فعال است.
"EIND" و دستگاههایی با بیش از ۱۲۸ کیبیبایت حافظه فلش
اشارهگرها در پیادهسازی دارای عرض ۱۶ بیت هستند. نشانی یک تابع یا برچسب به عنوان نشانی کلمه (word address) نشان داده میشود تا پرشها و فراخوانیهای غیرمستقیم بتوانند به هر نشانی کدی در محدوده ۶۴ کیلوکلمه (Ki words) هدفگیری شوند.
برای تسهیل پرشهای غیرمستقیم در دستگاههایی با بیش از ۱۲۸ کیبیبایت فضای حافظه برنامه، یک ثبات تابع خاص (SFR) به نام "EIND" وجود دارد که هنگام استفاده از دستورهای "EICALL" یا "EIJMP"، به عنوان باارزشترین بخش نشانی هدف عمل میکند.
پرشها و فراخوانیهای غیرمستقیم در این دستگاهها به شکل زیر توسط کامپایلر مدیریت میشوند و مشمول محدودیتهایی هستند:
- کامپایلر هرگز "EIND" را تنظیم نمیکند.
- کامپایلر از "EIND" بهطور ضمنی در دستورهای "EICALL"/"EIJMP" استفاده میکند، یا ممکن است "EIND" را مستقیماً بخواند تا یک فراخوانی/پرش غیرمستقیم را با استفاده از دستور "RET" شبیهسازی کند.
- کامپایلر فرض میکند که "EIND" هرگز در طول کد راهاندازی (startup) یا در طول اجرای برنامه تغییر نمیکند. بهویژه، "EIND" در مقدمه/موخره توابع یا روتینهای مدیریت وقفه (ISR) ذخیره/بازیابی نمیشود.
- برای فراخوانیهای غیرمستقیم توابع و goto محاسباتی، پیونددهنده (linker) قطعهکدهای واسط (stubs) تولید میکند. این stubها سکوهای پرشی هستند که گاهی trampoline نیز نامیده میشوند. بنابراین، فراخوانی/پرش غیرمستقیم به چنین stubای منتقل میشود. این stub حاوی یک پرش مستقیم به نشانی مورد نظر است.
- بهینهسازی relaxation پیونددهنده باید فعال باشد تا پیونددهنده بتواند stubها را در همه شرایط بهدرستی تولید کند. گزینه کامپایلر -mrelax و گزینه پیونددهنده --relax را ببینید. موارد خاصی وجود دارد که پیونددهنده باید stub تولید کند اما بدون فعال بودن relaxation، بدون ارائه هیچ پیام خطای مفیدی متوقف میشود.
- اسکریپت پیشفرض پیونددهنده برای کدهایی با "EIND = 0" تنظیم شده است. اگر قرار است کد برای وضعیتی با "EIND != 0" کار کند، باید از یک اسکریپت پیونددهنده سفارشی استفاده شود تا بخشهایی (sections) که نام آنها با ".trampolines" آغاز میشود، در قطعهای (segment) قرار گیرند که "EIND" به آن اشاره میکند.
- کد راهاندازی libgcc هرگز "EIND" را تنظیم نمیکند. توجه داشته باشید که کد راهاندازی ترکیبی از کدهای libgcc و AVR-LibC است. برای بررسی تأثیر AVR-LibC بر "EIND"، راهنمای کاربر AVR-LibC را در ("https://avrdudes.github.io/avr-libc/avr-libc-user-manual") ببینید.
- برای کدهای
راهاندازی
اختصاصی
کاربر مجاز
است که
"EIND" را در
مراحل
اولیه
مقداردهی
کنند؛ برای
نمونه از
طریق کد
راهاندازی
واقع در بخش
".init3".
چنین کدی
پیش از کد
عمومی
راهاندازی
که RAM را
مقداردهی
اولیه کرده
و
سازندهها
را
فراخوانی
میکند،
اما پس از
بخشی از کد
راهاندازی
AVR-LibC که "EIND"
را روی قطعه
حاوی جدول
بردارها
تنظیم
میکند،
اجرا
میشود.
#include <avr/io.h> static void __attribute__((section(".init3"),naked,used,no_instrument_function)) init3_set_eind (void) { __asm volatile ("ldi r24,pm_hh8(__trampolines_start)\n\t" "out %i0,r24" :: "n" (&EIND) : "r24","memory"); }نماد "__trampolines_start" در اسکریپت پیونددهنده تعریف شده است.
- قطعهکدهای واسط (stubها) بهصورت خودکار توسط پیونددهنده تولید میشوند اگر دو شرط زیر برقرار باشد:
- -<نشانی یک برچسب با استفاده از اصلاحگر "gs" گرفته شده باشد>
- (مخفف generate stubs)
مانند زیر:
LDI r24, lo8(gs(<func>)) LDI r25, hi8(gs(<func>))
- -<مکان نهایی آن برچسب در یک قطعه کد باشد>
- خارج از قطعهای که stubها در آن قرار دارند.
- *
- کامپایلر چنین اصلاحگرهای "gs" را برای برچسبهای کد در موقعیتهای زیر صادر میکند:
- -<گرفتن نشانی یک تابع یا برچسب کد.>
- -<دستور goto محاسباتی (Computed goto).>
- -<اگر از تابع ذخیره مقدمه استفاده شود، گزینه خط فرمان -mcall-prologues>
- را ببینید.
- -<جدولهای توزیع switch/case. اگر چنین جدولهای توزیعی را نمیخواهید،>
- میتوانید گزینه خط فرمان -fno-jump-tables را مشخص کنید.
- -<سازندهها/ویرانگرهای C و ++C که هنگام راهاندازی/خاموشسازی فراخوانی میشوند.>
- -<اگر ابزارها با یک اصلاحگر ()gs که در بالا توضیح داده شد مواجه شوند.>
- *
- پرش به
نشانیهای
غیرنمادین
بدین صورت
پشتیبانی
نمیشود:
int main (void) { /* Call function at word address 0x2 */ return ((int(*)(void)) 0x2)(); }در عوض، باید یک استاب (stub) ایجاد شود، یعنی تابع باید از طریق یک نماد فراخوانی شود ("func_4" در این مثال):
int main (void) { extern int func_4 (void); /* Call function at byte address 0x4 */ return func_4(); }و برنامه با -Wl,--defsym,func_4=0x4 پیوند داده شود. به عنوان روشی جایگزین، "func_4" میتواند در اسکریپت پیونددهنده تعریف شود.
مدیریت ثباتهای عملکرد ویژه "RAMPD"، "RAMPX"، "RAMPY" و "RAMPZ"
برخی از دستگاههای AVR از حافظههایی بزرگتر از محدوده ۶۴ کیبیبایت (64 KiB) که با اشارهگرهای ۱۶ بیتی قابل دسترسی هستند پشتیبانی میکنند. برای دسترسی به مکانهای حافظه در خارج از این محدوده ۶۴ کیبیبایتی، محتوای یک ثبات "RAMP" به عنوان بخش بالایی نشانی استفاده میشود: ثباتهای نشانی "X"، "Y" و "Z" به ترتیب با ثباتهای عملکرد ویژه "RAMPX"، "RAMPY" و "RAMPZ" الحاق میشوند تا یک نشانی عریض حاصل شود. به طور مشابه، "RAMPD" همراه با آدرسدهی مستقیم به کار میرود.
- کد راهاندازی (startup code) ثباتهای عملکرد ویژه "RAMP" را با صفر مقداردهی اولیه میکند.
- اگر از یک AVR Named Address Spaces,named address space غیر از generic یا "__flash" استفاده شود، آنگاه "RAMPZ" پیش از عملیات بر حسب نیاز تنظیم میشود.
- اگر دستگاه از RAM بزرگتر از ۶۴ کیبیبایت پشتیبانی کند و کامپایلر برای انجام یک عملیات نیاز به تغییر "RAMPZ" داشته باشد، "RAMPZ" پس از عملیات مجدداً به صفر بازنشانی میشود.
- اگر دستگاه دارای یک ثبات مشخص "RAMP" باشد، پرولوگ/اپیلوگِ ISR آن SFR را ذخیره/بازیابی کرده و آن را با صفر مقداردهی اولیه میکند تا در صورتی که کد ISR (به طور ضمنی) از آن استفاده کند مشکلی پیش نیاید.
- میزان RAM بزرگتر از ۶۴ کیبیبایت توسط GCC برای اهداف AVR پشتیبانی نمیشود. اگر از اسمبلی درونخطی (inline assembler) برای خواندن از مکانهای خارج از محدوده نشانی ۱۶ بیتی استفاده میکنید و یکی از ثباتهای "RAMP" را تغییر میدهید، باید آن را پس از دسترسی به صفر بازنشانی کنید.
ماکروهای توکار AVR
کامپایلر GCC چندین ماکروی توکار را تعریف میکند تا کد کاربر بتواند وجود یا عدم وجود ویژگیها را بررسی کند. تقریباً تمام ماکروهای توکار زیر از قابلیتهای دستگاه استنتاج شده و بنابراین با گزینه خط فرمان -mmcu= فعال میشوند.
برای ماکروهای توکار بیشتر و ویژهتر AVR، به AVR Named Address Spaces و AVR Built-in Functions مراجعه کنید.
- "__AVR_ARCH__"
- ماکروی
توکاری که
به یک عدد
دهدهی جهت
شناسایی
معماری باز
میشود و به
گزینه -mmcu=mcu
وابسته است.
مقادیر
ممکن
عبارتند از:
2، 25، 3، 31، 35، 4، 5، 51، 6
به ترتیب برای mcu="avr2"، "avr25"، "avr3"، "avr31"، "avr35"، "avr4"، "avr5"، "avr51"، "avr6"،
و
100، 102، 103، 104، 105، 106، 107
به ترتیب برای mcu="avrtiny"، "avrxmega2"، "avrxmega3"، "avrxmega4"، "avrxmega5"، "avrxmega6"، "avrxmega7". اگر mcu دستگاهی را مشخص کند، این ماکروی توکار بر همان اساس تنظیم میشود. برای نمونه، با -mmcu=atmega8 این ماکرو برابر با 4 تعریف میشود.
- "__AVR_Device__"
- تنظیم -mmcu=device
این ماکروی
توکار را
تعریف
میکند که
بازتابدهنده
نام دستگاه
است. برای
نمونه، -mmcu=atmega8
ماکروی
توکار
"__AVR_ATmega8__" را
تعریف
میکند،
-mmcu=attiny261a ماکروی
"__AVR_ATtiny261A__" را
تعریف
میکند و
غیره.
نامهای ماکروهای توکار از الگوی "__AVR_Device__" پیروی میکنند که در آن Device نام دستگاه برگرفته از دفترچه راهنمای کاربر AVR است. تفاوت بین Device در ماکروی توکار و device در -mmcu=device این است که دومی همیشه با حروف کوچک نوشته میشود.
اگر device یک دستگاه نبوده و صرفاً یک معماری هسته مانند avr51 باشد، این ماکرو تعریف نخواهد شد.
- "__AVR_DEVICE_NAME__"
- تنظیم -mmcu=device
این ماکروی
توکار را
برابر با
نام دستگاه
تعریف
میکند.
برای
نمونه، با
-mmcu=atmega8 ماکرو
برابر با
"atmega8"
تعریف
میشود.
اگر device یک دستگاه نبوده و صرفاً یک معماری هسته مانند avr51 باشد، این ماکرو تعریف نخواهد شد.
- "__AVR_CVT__"
- کد با گزینه "-mcvt" جهت استفاده از یک جدول بردار فشرده (compact vector table) کامپایل شده است.
- "__AVR_XMEGA__"
- دستگاه / معماری متعلق به خانواده دستگاههای XMEGA است.
- "__AVR_HAVE_ADIW__"
- دستگاه دارای دستورالعملهای "ADIW" و "SBIW" است.
- "__AVR_HAVE_ELPM__"
- دستگاه دارای دستورالعمل "ELPM" است.
- "__AVR_HAVE_ELPMX__"
- دستگاه دارای دستورالعملهای "ELPM Rn,Z" و "ELPM Rn,Z+" است.
- "__AVR_HAVE_LPMX__"
- دستگاه دارای دستورالعملهای "LPM Rn,Z" و "LPM Rn,Z+" است.
- "__AVR_HAVE_MOVW__"
- دستگاه دارای دستورالعمل "MOVW" برای انجام انتقالهای ۱۶ بیتی ثباتبهثبات است.
- "__AVR_HAVE_MUL__"
- دستگاه دارای ضربکننده سختافزاری است.
- "__AVR_HAVE_JMP_CALL__"
- دستگاه دارای دستورالعملهای "JMP" و "CALL" است. این مورد برای دستگاههایی با بیش از ۸ کیبیبایت حافظه برنامه صدق میکند.
- "__AVR_HAVE_EIJMP_EICALL__"
- "__AVR_3_BYTE_PC__"
- دستگاه دارای دستورالعملهای "EIJMP" و "EICALL" است. این مورد برای دستگاههایی با بیش از ۱۲۸ کیبیبایت حافظه برنامه صدق میکند. این امر همچنین بدان معناست که شمارنده برنامه (PC) دارای پهنای ۳ بایت است.
- "__AVR_2_BYTE_PC__"
- شمارنده برنامه (PC) دارای پهنای ۲ بایت است. این مورد برای دستگاههایی با حداکثر ۱۲۸ کیبیبایت حافظه برنامه صدق میکند.
- "__AVR_HAVE_8BIT_SP__"
- "__AVR_HAVE_16BIT_SP__"
- ثبات اشارهگر پشته (SP) توسط کامپایلر بهترتیب بهعنوان یک ثبات ۸ بیتی یا ۱۶ بیتی در نظر گرفته میشود. تعریف این ماکروها تحت تأثیر -mtiny-stack است.
- "__AVR_HAVE_SPH__"
- "__AVR_SP8__"
- دستگاه بهترتیب دارای ثبات با عملکرد خاص SPH (بخش بالایی اشارهگر پشته) است یا یک اشارهگر پشتهٔ ۸ بیتی دارد. تعریف این ماکروها تحت تأثیر -mmcu= و در موارد -mmcu=avr2 و -mmcu=avr25 همچنین تحت تأثیر -msp8 قرار دارد.
- "__AVR_HAVE_RAMPD__"
- "__AVR_HAVE_RAMPX__"
- "__AVR_HAVE_RAMPY__"
- "__AVR_HAVE_RAMPZ__"
- دستگاه بهترتیب دارای ثبات با عملکرد خاص "RAMPD"، "RAMPX"، "RAMPY"، "RAMPZ" است.
- "__NO_INTERRUPTS__"
- این ماکرو بازتابدهندهٔ گزینهٔ خط فرمان -mno-interrupts است.
- "__AVR_ERRATA_SKIP__"
- "__AVR_ERRATA_SKIP_JMP_CALL__"
- برخی از دستگاههای AVR (مانند AT90S8515 و ATmega103) به دلیل یک نقص سختافزاری (erratum) نباید دستورالعملهای ۳۲ بیتی را رد کنند. دستورالعملهای رد کردن عبارتاند از: "SBRS"، "SBRC"، "SBIS"، "SBIC" و "CPSE". ماکروی دوم تنها زمانی تعریف میشود که "__AVR_HAVE_JMP_CALL__" نیز تنظیم شده باشد.
- "__AVR_ISA_RMW__"
- دستگاه دارای دستورالعملهای خواندن-تغییر-نوشتن (XCH، LAC، LAS و LAT) است.
- "__AVR_SFR_OFFSET__=offset"
- دستورالعملهایی که میتوانند مستقیماً ثباتهای با عملکرد خاص I/O را آدرسدهی کنند، مانند "IN"، "OUT"، "SBI" و غیره، ممکن است از آدرس متفاوتی نسبت به زمانی که با یک دستورالعمل دسترسی به RAM مانند "LD" یا "STS" آدرسدهی میشوند، استفاده کنند. این آفست به معماری دستگاه بستگی دارد و برای به دست آوردن آدرس I/O متناظر، باید از آدرس RAM کم شود.
- "__AVR_SHORT_CALLS__"
- گزینهٔ خط فرمان -mshort-calls تنظیم شده است.
- "__AVR_PM_BASE_ADDRESS__=addr"
- برخی از دستگاهها از خواندن حافظهٔ فلش با استفاده از دستورالعملهای "LD*" پشتیبانی میکنند. حافظهٔ فلش در فضای آدرسدهی داده در آفست "__AVR_PM_BASE_ADDRESS__" دیده میشود. اگر این ماکرو تعریف نشده باشد، این ویژگی در دسترس نیست. در صورت تعریف شدن، فضای آدرسدهی خطی است و نیازی به قرار دادن ".rodata" در RAM وجود ندارد. این کار توسط پروندهٔ توصیف پیونددهندهٔ پیشفرض مدیریت میشود و در حال حاضر برای "avrtiny" و "avrxmega3" در دسترس است. حتی راحتتر از آن، نیازی به استفاده از فضاهای آدرسدهی مانند "__flash" یا ویژگیهایی مانند صفت "progmem" و توابع "pgm_read_*" نیست.
- "__AVR_HAVE_FLMAP__"
- این ماکرو در صورتی تعریف میشود که شرایط زیر برقرار باشد:
- *<دستگاه دارای فیلد بیتی "NVMCTRL_CTRLB.FLMAP" باشد.>
- این مورد برای دستگاههای *AVR64 و *AVR128 صدق میکند.
- *<در زمان اسمبل مشخص نباشد که از کدام شبیهسازی استفاده خواهد شد.>
این به این معناست که کامپایلر با GNU Binutils که PR31124 را پیادهسازی کرده است، پیکربندی شده باشد ("https://sourceware.org/PR31124").
- "__AVR_RODATA_IN_RAM__"
- هنگامی که
کد برای یک
معماری
پایه (core architecture)
کامپایل
میشود،
این ماکرو
تعریفنشده
است.
هنگامی که کد برای یک دستگاه کامپایل میشود، در صورتی که بخشهای ".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 ۳۲ بیتی یا ۶۴ بیتی پشتیبانی کند. طرحبندی واقعی توسط گزینهٔ -mdouble= مشخص میشود.
- "__DEFAULT_DOUBLE__"
- اندازهٔ "double" بر حسب بیت در صورتی که -mdouble= تنظیم نشده باشد. جهت بررسی طرحبندی "double" در یک برنامه، از ماکروی توکار "__SIZEOF_DOUBLE__" استفاده کنید.
- "__HAVE_LONG_DOUBLE32__"
- "__HAVE_LONG_DOUBLE64__"
- "__HAVE_LONG_DOUBLE_MULTILIB__"
- "__DEFAULT_LONG_DOUBLE__"
- مشابه مورد بالا، اما برای "long double" به جای "double".
- "__WITH_DOUBLE_COMPARISON__"
- بازتابدهندهٔ گزینهٔ پیکربندی "--with-double-comparison={tristate|bool|libf7}" ("https://gcc.gnu.org/install/configure.html#avr") بوده و برابر با 2 یا 3 تعریف میشود.
- "__WITH_LIBF7_LIBGCC__"
- "__WITH_LIBF7_MATH__"
- "__WITH_LIBF7_MATH_SYMBOLS__"
- بازتابدهندهٔ گزینهٔ پیکربندی "--with-libf7={libgcc|math|math-symbols}" ("https://gcc.gnu.org/install/configure.html#avr") است.
گزینههای داخلی AVR
گزینههای زیر به صورت داخلی توسط کامپایلر و برای برقراری ارتباط بین پروندههای specs دستگاه و خود کامپایلر استفاده میشوند. نیازی نیست این گزینهها را به صورت دستی تنظیم کنید؛ به ویژه اینکه اینها گزینههای بهینهسازی نیستند. استفاده از این گزینهها به روش نادرست ممکن است به تولید کدهای غیربهینه یا نادرست منجر شود. این گزینهها برای کامل بودن مستندات و به منظور دستیابی به درک بهتری از پروندههای specs دستگاه ("https://gcc.gnu.org/wiki/avr-gcc#spec-files") مستند شدهاند..IP -mn-flash=num 4 فرض میکند که حافظه فلش اندازهای برابر با num برابر ۶۴ KiB دارد. این گزینه مشخص میکند کدام فضاهای آدرسدهی "__flashN" در دسترس هستند.
- -mflmap
- دستگاه دارای میدان بیتی "FLMAP" واقع در ثبات عملکرد ویژه "NVMCTRL_CTRLB" است.
- -mrmw
- فرض میکند که دستگاه از دستورالعملهای خواندن-تغییر-نوشتن (Read-Modify-Write) شامل "XCH"، "LAC"، "LAS" و "LAT" پشتیبانی میکند.
- -mshort-calls
- فرض میکند که "RJMP" و "RCALL" میتوانند کل حافظه برنامه را هدف قرار دهند. این گزینه برای تولید و انتخاب کتابخانههای چندگانه (multilib) برای دستگاههای متعلق به معماری "avrxmega3" استفاده میشود.
- -mskip-bug
- کد را بدون دستورهای جهش ("CPSE"، "SBRS"، "SBRC"، "SBIS"، "SBIC") روی دستورالعملهای ۳۲ بیتی تولید میکند.
- -msp8
- با ثبات اشارهگر پشته به عنوان یک ثبات ۸ بیتی رفتار میکند، یعنی فرض میکند بایت بالایی اشارهگر پشته صفر است. این گزینه توسط کامپایلر برای انتخاب و ساخت کتابخانههای چندگانه (multilib) برای معماریهای "avr2" و "avr25" استفاده میشود. این معماریها دستگاههای دارای "SPH" و فاقد آن را ترکیب میکنند.
گزینههای Blackfin
- -mcpu=cpu[-sirevision]
- نام
پردازنده
هدف Blackfin را
مشخص
میکند. در
حال حاضر،
cpu
میتواند
یکی از
موارد bf512،
bf514، bf516، bf518،
bf522، bf523، bf524،
bf525، bf526، bf527،
bf531، bf532، bf533،
bf534، bf536، bf537،
bf538، bf539، bf542،
bf544، bf547، bf548،
bf549، bf542m، bf544m،
bf547m، bf548m، bf549m،
bf561، bf592 باشد.
بخش اختیاری sirevision بازبینی سیلیکونی (silicon revision) پردازنده هدف Blackfin را مشخص میکند. تمام راهحلهای ترمیمی موجود برای نسخه سیلیکونی هدف فعال میشوند. اگر sirevision برابر با none باشد، هیچ ترمیمی فعال نمیشود. اگر sirevision برابر با any باشد، تمام ترمیمهای مربوط به پردازنده هدف فعال خواهند شد. ماکروی "__SILICON_REVISION__" به صورت دو رقم هگزادسیمال که نشاندهنده شمارههای اصلی و فرعی در نسخه سیلیکونی هستند تعریف میشود. اگر sirevision برابر با none باشد، "__SILICON_REVISION__" تعریف نمیشود. اگر sirevision برابر با any باشد، "__SILICON_REVISION__" به مقدار 0xffff تعریف میشود. اگر این sirevision اختیاری استفاده نشود، GCC جدیدترین نسخه سیلیکونی شناختهشده از پردازنده Blackfin هدف را در نظر میگیرد.
کامپایلر GCC یک ماکروی پیشپردازنده برای cpu مشخصشده تعریف میکند. برای زنجیره ابزار bfin-elf، اگر -msim مشخص نشده باشد، این گزینه باعث پیوند خوردن BSP سختافزاری ارائهشده توسط libgloss میشود.
بدون این گزینه، بهطور پیشفرض bf532 به عنوان پردازنده استفاده میشود.
توجه داشته باشید که پشتیبانی از bf561 ناقص است. برای bf561، تنها ماکروی پیشپردازنده تعریف شده است.
- -msim
- مشخص میکند که برنامه بر روی شبیهساز اجرا خواهد شد. این کار باعث پیوند خوردن BSP شبیهساز ارائهشده توسط libgloss میشود. این گزینه فقط برای زنجیره ابزار bfin-elf اثرگذار است. برخی گزینههای دیگر مانند -mid-shared-library و -mfdpic، مستلزم -msim هستند.
- -momit-leaf-frame-pointer
- اشارهگر چارچوب (frame pointer) را در توابع برگ (leaf functions) در یک ثبات نگه نمیدارد. این کار از دستورالعملهای ذخیره، راهاندازی و بازیابی اشارهگرهای چارچوب جلوگیری کرده و یک ثبات اضافی در توابع برگ آزاد میسازد.
- -mspecld-anomaly
- در صورت فعال بودن، کامپایلر اطمینان حاصل میکند که کد تولیدشده شامل بارگذاریهای حدسی (speculative loads) پس از دستورالعملهای پرش نباشد. اگر از این گزینه استفاده شود، "__WORKAROUND_SPECULATIVE_LOADS" تعریف میشود.
- -mno-specld-anomaly
- کد اضافی برای جلوگیری از وقوع بارگذاریهای حدسی تولید نمیکند.
- -mcsync-anomaly
- در صورت فعال بودن، کامپایلر اطمینان حاصل میکند که کد تولیدشده بلافاصله پس از شاخههای شرطی، حاوی دستورالعملهای CSYNC یا SSYNC نباشد. در صورت استفاده از این گزینه، "__WORKAROUND_SPECULATIVE_SYNCS" تعریف میشود.
- -mno-csync-anomaly
- کد اضافی برای جلوگیری از اجرای دستورالعملهای CSYNC یا SSYNC بلافاصله پس از یک انشعاب شرطی تولید نمیکند.
- -mlow64k
- در صورت فعال بودن، کامپایلر مجاز است از این نکته که تمام برنامه در 64k پایین حافظه جای میگیرد برای بهینهسازی بهره ببرد.
- -mno-low64k
- فرض میکند که برنامه به اندازه دلخواه بزرگ است. این مقدار پیشفرض است.
- -mstack-check-l1
- بررسی پشته را با استفاده از اطلاعات قرارگرفته در حافظه موقت (scratchpad) سطح L1 توسط هسته uClinux انجام میدهد.
- -mid-shared-library
- کدی تولید میکند که از کتابخانههای مشترک به روش شناسه کتابخانه (library ID) پشتیبانی میکند. این کار امکان اجرای درجا (execute in place) و کتابخانههای مشترک را در محیطی بدون مدیریت حافظه مجازی فراهم میسازد. این گزینه مستلزم -fPIC است. با هدف bfin-elf، این گزینه مستلزم -msim است.
- -mno-id-shared-library
- کدی تولید میکند که استفاده از کتابخانههای مشترک مبتنی بر ID را فرض نمیگیرد. این مقدار پیشفرض است.
- -mleaf-id-shared-library
- کدی تولید میکند که از کتابخانههای مشترک از طریق روش شناسه کتابخانه پشتیبانی میکند، اما فرض میکند که این کتابخانه یا فایل اجرایی با هیچ کتابخانه مشترک مبتنی بر شناسه دیگری پیوند نخواهد خورد. این امر به کامپایلر امکان میدهد از کدهای سریعتری برای پرشها و فراخوانیها استفاده کند.
- -mno-leaf-id-shared-library
- عدم پیوند کد در حال کامپایل با دیگر کتابخانههای مشترک مبتنی بر شناسه را فرض نمیکند. کدهای کندتری برای دستورالعملهای پرش و فراخوانی تولید میشود.
- شماره شناسایی کتابخانه مشترک مبتنی بر شناسهای را که در حال کامپایل است مشخص میکند. تعیین مقدار 0 کد فشردهتری ایجاد میکند؛ تعیین مقادیر دیگر تخصیص اجباری آن شماره به کتابخانه فعلی را موجب میشود اما از نظر فضا یا زمان بهینهتر از حذف این گزینه نیست.
- -msep-data
- کدی تولید میکند که امکان قرارگیری قطعه داده (data segment) در ناحیهای متفاوت از حافظه نسبت به قطعه کد (text segment) را فراهم میسازد. این امر با حذف جابهجاییها نسبت به بخش متن، امکان اجرای درجا را در محیطهای بدون مدیریت حافظه مجازی مهیا میکند.
- -mno-sep-data
- کدی تولید میکند که فرض میکند قطعه داده بلافاصله پس از قطعه کد قرار دارد. این مقدار پیشفرض است.
- -mlong-calls
- -mno-long-calls
- به
کامپایلر
دستور
میدهد تا
فراخوانیهای
تابع را
ابتدا با
بارگذاری
آدرس تابع
در یک ثبات
و سپس اجرای
فراخوانی
زیرروال از
طریق آن
ثبات انجام
دهد. این
سوییچ در
صورتی لازم
است که تابع
هدف خارج از
محدوده
آدرسدهی
۲۴ بیتی در
نسخه مبتنی
بر آفست
دستورالعمل
فراخوانی
زیرروال
قرار داشته
باشد.
این ویژگی بهطور پیشفرض فعال نیست. تعیین -mno-long-calls رفتار پیشفرض را بازمیگرداند. توجه داشته باشید که این گزینهها هیچ اثری بر نحوه تولید کد توسط کامپایلر برای مدیریت فراخوانی توابع از طریق اشارهگرهای تابع ندارند.
- -mfast-fp
- پیوند دادن با کتابخانه ممیز شناور سریع. این کتابخانه به جهت بهبود کارایی، برخی از قوانین استاندارد ممیز شناور IEEE را برای بررسی ورودیها در برابر «ناعدد» (NAN) نادیده میگیرد.
- -minline-plt
- درونخطیسازی مدخلهای PLT را در فراخوانی توابعی که وضعیت اتصال محلی آنها مشخص نیست، فعال میکند. این گزینه بدون -mfdpic اثری ندارد.
- -mmulticore
- یک برنامه
مستقل برای
پردازندههای
چندهستهای
Blackfin میسازد.
این گزینه
باعث
میشود
فایلهای
راهاندازی
و
اسکریپتهای
پیوند
مناسب با
پشتیبانی
از
چندهستهای
استفاده
شوند، و
ماکروی
"__BFIN_MULTICORE"
تعریف گردد.
این گزینه
فقط با
-mcpu=bf561[-sirevision]
قابل
استفاده
است.
این گزینه میتواند همراه با -mcorea یا -mcoreb استفاده شود که مدل برنامهنویسی یک-برنامه-برای-هر-هسته را انتخاب میکند. بدون -mcorea یا -mcoreb، مدل برنامهنویسی تک-برنامه/دو-هستهای استفاده میشود. در این مدل، تابع اصلی Core B باید با نام "coreb_main" تعریف شود.
اگر این گزینه استفاده نشود، مدل برنامهنویسی برنامه تکهستهای استفاده خواهد شد.
- -mcorea
- هنگام استفاده از مدل برنامهنویسی یک-برنامه-برای-هر-هسته، یک برنامه مستقل برای Core A پردازنده BF561 میسازد. فایلهای راهاندازی و اسکریپتهای پیوند مناسب برای پشتیبانی از Core A استفاده میشوند و ماکروی "__BFIN_COREA" تعریف میگردد. این گزینه فقط در ترکیب با -mmulticore قابل استفاده است..IP -mcoreb 4 هنگام استفاده از مدل برنامهنویسی یک-برنامه-برای-هر-هسته (one-application-per-core)، یک برنامه مستقل برای Core B پردازنده BF561 بساز. فایلهای راهاندازی و اسکریپتهای پیوند مناسب برای پشتیبانی از Core B به کار گرفته میشوند و ماکروی "__BFIN_COREB" تعریف میشود. هنگامی که این گزینه استفاده میشود، باید به جای "main" از "coreb_main" استفاده شود. این گزینه تنها همراه با -mmulticore قابل استفاده است.
- -msdram
- یک برنامه مستقل برای SDRAM بساز. فایلهای راهاندازی و اسکریپتهای پیوند مناسب برای قرار دادن برنامه در SDRAM استفاده میشوند و ماکروی "__BFIN_SDRAM" تعریف میشود. لودر باید پیش از بارگذاری برنامه، SDRAM را مقداردهی اولیه کند.
- -micplb
- فرض کن که ICPLBها در زمان اجرا فعال هستند. این بر راهکارهای دور زدن برخی ناهنجاریها اثر میگذارد. برای مقصدهای Linux، پیشفرض این است که ICPLBها فعال فرض شوند؛ برای برنامههای مستقل پیشفرض غیرفعال است.
گزینههای C6X
- -march=name
- این گزینه نام معماری مقصد را مشخص میکند. GCC از این نام برای تعیین اینکه در زمان تولید کد اسمبلی چه نوع دستورالعملهایی میتواند صادر کند استفاده میکند. نامهای مجاز عبارتند از: c62x، c64x، c64x+، c67x، c67x+، c674x.
- -mbig-endian
- تولید کد برای یک مقصد big-endian.
- -mlittle-endian
- تولید کد برای یک مقصد little-endian. این مقدار پیشفرض است.
- -msim
- فایلهای راهاندازی و اسکریپت پیونددهنده مناسب برای شبیهساز را انتخاب کن.
- -msdata=default
- دادههای سراسری و ایستای کوچک را در بخش ".neardata" قرار بده، که توسط ثبات "B14" به آن اشاره میشود. دادههای سراسری و ایستای مقداردهینشده کوچک را در بخش ".bss" که همجوار بخش ".neardata" است قرار بده. دادههای فقطخواندنی کوچک را در بخش ".rodata" قرار بده. بخشهای متناظر مورد استفاده برای قطعات بزرگ داده ".fardata"، ".far" و ".const" هستند.
- -msdata=all
- همه دادهها، و نه فقط اشیاء کوچک را در بخشهای رزرو شده برای دادههای کوچک قرار بده، و از آدرسدهی نسبی به ثبات "B14" برای دسترسی به آنها استفاده کن.
- -msdata=none
- از بخشهای رزرو شده برای دادههای کوچک هیچ استفادهای نکن، و از آدرسهای مطلق برای دسترسی به همه دادهها استفاده کن. همه دادههای سراسری و ایستای مقداردهیشده را در بخش ".fardata" و همه دادههای مقداردهینشده را در بخش ".far" قرار بده. همه دادههای ثابت را در بخش ".const" قرار بده.
گزینههای CRIS
این گزینهها بهطور ویژه برای پورتهای CRIS تعریف شدهاند.
- -march=architecture-type
- -mcpu=architecture-type
- کد را برای معماری مشخصشده تولید کن. گزینههای انتخابی برای architecture-type به ترتیب عبارتند از v3، v8 و v10 برای ETRAX 4، ETRAX 100 و ETRAX 100 LX. پیشفرض v0 است.
- -mtune=architecture-type
- همه موارد قابل اعمال درباره کد تولیدشده را، به جز ABI و مجموعه دستورالعملهای در دسترس، برای architecture-type بهینهسازی کن. گزینههای انتخابی برای 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-) ترتیب میدهند (ترتیبات را لغو میکنند) تا فریم پشته، تکتک دادهها و مقادیر ثابت برای حداکثر اندازه دسترسی به یک داده واحد برای مدل پردازنده انتخابشده همتراز شوند. پیشفرض، برقراری همترازی ۳۲ بیتی است. جزئیات ABI از قبیل چیدمان ساختار، تحت تأثیر این گزینهها قرار نمیگیرند.
- -m32-bit
- -m16-bit
- -m8-bit
- مشابه گزینههای stack-، data- و const-align در بالا، این گزینهها ترتیب میدهند که فریم پشته، دادههای قابل نوشتن و ثابتها همگی همترازی ۳۲ بیتی، ۱۶ بیتی یا ۸ بیتی داشته باشند. پیشفرض همترازی ۳۲ بیتی است.
- -mno-prologue-epilogue
- -mprologue-epilogue
- با گزینه -mno-prologue-epilogue، پیشدرآمد و پسدرآمد عادی تابع که فریم پشته را برپا میکنند حذف میشوند و هیچ دستورالعمل بازگشت یا توالی بازگشتی در کد تولید نمیشود. از این گزینه تنها در کنار بررسی دیداریِ کد کامپایلشده استفاده کنید: هنگامی که ثباتهای محافظتشده در فراخوانی (call-saved) باید ذخیره شوند یا فضای ذخیرهسازی برای متغیرهای محلی باید تخصیص یابد، هیچ هشدار یا خطایی صادر نمیشود.
- -melf
- گزینه قدیمی بدون اثر (no-op).
- -sim
- این گزینه پیوند دادن با توابع ورودی-خروجیِ یک کتابخانه شبیهساز را ترتیب میدهد. کد، دادههای مقداردهیشده و دادههای مقداردهیشده با صفر بهطور متوالی تخصیص مییابند.
- -sim2
- مشابه -sim است، اما گزینههای پیونددهنده را برای استقرار دادههای مقداردهیشده در آدرس 0x40000000 و دادههای مقداردهیشده با صفر در آدرس 0x80000000 ارسال میکند.
گزینههای C-SKY
کامپایلر GCC از این گزینهها هنگام کامپایل برای پردازندههای C-SKY V2 پشتیبانی میکند.
- -march=arch
- معماری مقصد C-SKY را مشخص میکند. مقادیر معتبر برای arch عبارتند از: ck801، ck802، ck803، ck807 و ck810. پیشفرض ck810 است.
- -mcpu=cpu
- پردازنده مقصد C-SKY را مشخص میکند. مقادیر معتبر برای cpu عبارتند از: ck801، ck801t، ck802، ck802t، ck802j، ck803، ck803h، ck803t، ck803ht، ck803f، ck803fh، ck803e، ck803eh، ck803et، ck803eht، ck803ef، ck803efh، ck803ft، ck803eft، ck803efht، ck803r1، ck803hr1، ck803tr1، ck803htr1، ck803fr1، ck803fhr1، ck803er1، ck803ehr1، ck803etr1، ck803ehtr1، ck803efr1، ck803efhr1، ck803ftr1، ck803eftr1، ck803efhtr1، ck803s، ck803st، ck803se، ck803sf، ck803sef، ck803seft، ck807e، ck807ef، ck807، ck807f، ck810e، ck810et، ck810ef، ck810eft، ck810، ck810v، ck810f، ck810t، ck810fv، ck810tv، ck810ft و ck810ftv..IP -mbig-endian 4
- -EB
- -mlittle-endian
- -EL
- انتخاب کد با ترتیب بایت big-endian یا little-endian. پیشفرض little-endian است.
- -mfloat-abi=name
- مشخص
میکند که
از کدام ABI
ممیز شناور
استفاده
شود. مقادیر
مجاز
عبارتاند
از: soft، softfp و hard.
مشخص کردن soft باعث میشود GCC خروجی حاوی فراخوانیهای کتابخانهای برای عملیات ممیز شناور تولید کند. softfp امکان تولید کد با استفاده از دستورالعملهای سختافزاری ممیز شناور را فراهم میکند، اما همچنان از قراردادهای فراخوانی soft-float استفاده مینماید. hard اجازه تولید دستورالعملهای ممیز شناور را میدهد و از قراردادهای فراخوانی ویژه FPU استفاده میکند.
پیشفرض به پیکربندی مقصد خاص بستگی دارد. توجه داشته باشید که ABIهای hard-float و soft-float از نظر پیوند (link) با یکدیگر سازگار نیستند؛ شما باید تمام برنامه خود را با همان ABI کامپایل کرده و با مجموعهای از کتابخانههای سازگار پیوند دهید.
- -mhard-float
- -msoft-float
- انتخاب پیادهسازیهای سختافزاری یا نرمافزاری ممیز شناور. پیشفرض soft float است.
- -mdouble-float
- -mno-double-float
- هنگامی که -mhard-float برقرار باشد، تولید دستورالعملهای ممیز شناور با دقت مضاعف (double-precision) فعال میشود. این گزینه در همهجا بهجز هنگام کامپایل برای CK803 پیشفرض است.
- -mfdivdu
- -mno-fdivdu
- هنگامی که -mhard-float برقرار باشد، تولید دستورالعملهای "frecipd"، "fsqrtd" و "fdivd" را فعال میکند. این گزینه بهجز هنگام کامپایل برای CK803 پیشفرض است.
- -mfpu=fpu
- پردازنده ممیز شناور را انتخاب میکند. این گزینه فقط همراه با -mhard-float قابل استفاده است. مقادیر مجاز برای fpu عبارتاند از: fpv2_sf (معادل -mno-double-float -mno-fdivdu)، fpv2 (-mdouble-float -mno-divdu)، و fpv2_divd (-mdouble-float -mdivdu).
- -melrw
- -mno-elrw
- دستورالعمل گسترشیافتهی "lrw" را فعال میکند. پیشفرض این گزینه برای CK801 روشن (on) و در غیر این صورت خاموش (off) است.
- -mistack
- -mno-istack
- دستورالعملهای
پشته وقفه
را فعال
میکند؛
پیشفرض
خاموش است.
گزینه -mistack برای رسیدگی به صفتهای تابعی "interrupt" و "isr" الزامی است.
- -mmp
- دستورالعملهای چندپردازندهای را فعال میکند؛ پیشفرض خاموش است.
- -mcp
- دستورالعملهای کمکپردازنده را فعال میکند؛ پیشفرض خاموش است.
- -mcache
- دستورالعملهای کمکپردازنده را فعال میکند؛ پیشفرض خاموش است.
- -msecurity
- دستورالعملهای امنیتی C-SKY را فعال میکند؛ پیشفرض خاموش است.
- -mtrust
- دستورالعملهای اعتماد (trust) مربوط به C-SKY را فعال میکند؛ پیشفرض خاموش است.
- -mdsp
- -medsp
- -mvdsp
- دستورالعملهای C-SKY DSP، Enhanced DSP یا Vector DSP را به ترتیب فعال میکند. پیشفرض همه این گزینهها خاموش است.
- -mdiv
- -mno-div
- تولید دستورالعملهای تقسیم. پیشفرض خاموش است.
- -msmart
- -mno-smart
- تولید کد برای حالت هوشمند (Smart Mode)، تنها با استفاده از ثباتهای شماره 0-7 جهت امکان استفاده از دستورالعملهای 16 بیتی. این گزینه برای CK801 که این رفتار در آن الزامی است نادیده گرفته میشود و برای CK802 بهطور پیشفرض روشن است. برای سایر اهداف، پیشفرض خاموش است.
- -mhigh-registers
- -mno-high-registers
- تولید کد با استفاده از ثباتهای بالا (high registers) با شمارههای 16-31. این گزینه در CK801، CK802 یا CK803 پشتیبانی نمیشود و برای سایر پردازندهها بهطور پیشفرض فعال است.
- -manchor
- -mno-anchor
- تولید کد با استفاده از آدرسهای نماد لنگر سراسری (global anchor symbol addresses).
- -mpushpop
- -mno-pushpop
- تولید کد با استفاده از دستورالعملهای "push" و "pop". پیشفرض این گزینه روشن است.
- -mmultiple-stld
- -mstm
- -mno-multiple-stld
- -mno-stm
- تولید کد با استفاده از دستورالعملهای "stm" و "ldm". این گزینه در CK801 پشتیبانی نمیشود اما در سایر پردازندهها بهطور پیشفرض فعال است.
- -mconstpool
- -mno-constpool
- ایجاد استخرهای ثابت (constant pools) در کامپایلر به جای واگذاری آن به اسمبلر. این گزینه برای تولید کد صحیح در CK801 و CK802 پیشفرض و الزامی است و برای سایر پردازندهها اختیاری است.
- -mstack-size
- -mno-stack-size
- درج هدایتکنندههای ".stack_size" برای هر تابع در خروجی اسمبلی. پیشفرض این گزینه خاموش است.
- -mccrt
- -mno-ccrt
- تولید کد برای زماناجرای (runtime) کامپایلر C-SKY به جای libgcc. این گزینه بهطور پیشفرض خاموش است..IP -mbranch-cost=n 4 هزینه پرشها را تقریباً معادل با "n" دستورالعمل تنظیم میکند. مقدار پیشفرض ۱ است.
- -msched-prolog
- -mno-sched-prolog
- زمانبندی توالیهای مقدمه (prologue) و موخره (epilogue) توابع را مجاز میسازد. استفاده از این گزینه میتواند به کدی منجر شود که با نیازمندیهای مقدمهٔ C-SKY V2 ABI سازگار نبوده و امکان اشکالزدایی یا ردگیری به عقب (backtrace) را نداشته باشد. این گزینه بهطور پیشفرض غیرفعال است.
- -msim
- کتابخانه libsemi.a را پیوند میدهد که با شبیهساز سازگار است. فقط برای کامپایلر ELF قابل استفاده است.
گزینههای Cygwin و MinGW
این گزینههای اضافی برای مقصدهای Microsoft Windows در دسترس هستند:
- -mconsole
- این گزینه مشخص میکند که یک برنامه کنسولی باید تولید شود؛ این کار با دستور دادن به پیونددهنده برای تنظیم نوع زیرسیستم در سرایند PE که برای برنامههای کنسولی لازم است، صورت میگیرد. این گزینه برای مقصدهای Cygwin و MinGW در دسترس بوده و بهطور پیشفرض روی این مقصدها فعال است.
- -mcrtdll=library
- پیشپردازش، کامپایل یا پیوند با library سی رانتایم (C RunTime DLL) مشخصشده. این گزینه ماکروهای از پیش تعریفشدهٔ "__CRTDLL__"، "__MSVCRT__"، "_UCRT" و "__MSVCRT_VERSION__" را برای library رانتایم CRT مشخصشده تنظیم میکند، فایل آغازین را برای CRT library انتخاب نموده و با CRT library پیوند میزند. نامهای شناختهشده برای کتابخانه CRT جهت پیشپردازنده عبارتند از: "crtdll*"، "msvcrt10*"، "msvcrt20*"، "msvcrt40*"، "msvcr40*"، "msvcrtd*"، "msvcrt-os*"، "msvcr70*"، "msvcr71*"، "msvcr80*"، "msvcr90*"، "msvcr100*"، "msvcr110*"، "msvcr120*" و "ucrt*". اگر این گزینه مشخص نشود، کتابخانه واردات پیشفرض MinGW یعنی "msvcrt" برای پیوند دادن استفاده میشود و هیچ تنظیم دیگری برای پیشپردازنده انجام نخواهد شد. کتابخانه واردات MinGW با نام "msvcrt" صرفاً یک پیوند نمادین (یا رونوشتی) از یک کتابخانه واردات CRT دیگر MinGW است که هنگام کامپایل MinGW انتخاب شده است. کتابخانه واردات MinGW با نام "msvcrt-os" برای کتابخانه CRT DLL سیستم ویندوز یعنی "msvcrt.dll" است و در بیشتر موارد کتابخانه واردات پیشفرض MinGW محسوب میشود. بهطور کلی، تغییر DLL رانتایم CRT نیازمند کامپایل مجدد کل MinGW CRT است. این گزینه صرفاً برای مقاصد آزمایشی و تستی در نظر گرفته شده است. این گزینه برای مقصدهای MinGW در دسترس است.
- -mdll
- این گزینه برای مقصدهای Cygwin و MinGW در دسترس است. مشخص میکند که یک DLL – یک کتابخانه پیوند پویا (dynamic link library) – باید تولید شود، و امکان انتخاب شیء آغازین زمان اجرا و نقطه ورود لازم را فراهم میکند.
- -mnop-fun-dllimport
- این گزینه برای مقصدهای Cygwin و MinGW در دسترس است. مشخص میکند که ویژگی "dllimport" باید نادیده گرفته شود.
- -mthreads
- این گزینه برای مقصدهای MinGW در دسترس است. مشخص میکند که پشتیبانی از ریسههای مختص MinGW باید استفاده شود.
- -municode
- این گزینه برای مقصدهای MinGW-w64 در دسترس است. این گزینه باعث میشود ماکروی پیشپردازندهٔ "UNICODE" از پیش تعریف شده و کد آغازین زمان اجرای سازگار با یونیکد انتخاب شود.
- -mwin32
- این گزینه برای مقصدهای Cygwin و MinGW در دسترس است. این گزینه مشخص میکند که ماکروهای از پیش تعریفشدهٔ معمول Microsoft Windows در پیشپردازنده تنظیم شوند، اما بر انتخاب کتابخانه زمان اجرا یا کد آغازین تأثیری نمیگذارد.
- -mwindows
- این گزینه برای مقصدهای Cygwin و MinGW در دسترس است. مشخص میکند که با هدایت پیونددهنده به تنظیم مناسب نوع زیرسیستم سرایند PE، یک برنامه گرافیکی (GUI) تولید شود.
- -fno-set-stack-executable
- این گزینه برای مقصدهای MinGW در دسترس است. مشخص میکند که پرچم قابل اجرا بودن (executable flag) برای پشتهای که توسط توابع تو در تو استفاده میشود، تنظیم نگردد. این ویژگی برای باینریهایی که در حالت هسته (kernel mode) ویندوز اجرا میشوند ضروری است، زیرا در آنجا رابط User32 API که برای تنظیم امتیازات اجرایی به کار میرود در دسترس نیست.
- -fwritable-relocated-rdata
- این گزینه برای مقصدهای MinGW و Cygwin در دسترس است. مشخص میکند که دادههای بازنشانیشده (relocated-data) در بخش فقطخواندنی، درون بخش ".data" قرار گیرند. این ویژگی برای زمانهای اجرای قدیمیتری که از اصلاح بخشهای ".rdata" برای شبهبازنشانی (pseudo-relocation) پشتیبانی نمیکنند، الزامی است.
- -mpe-aligned-commons
- این گزینه برای مقصدهای Cygwin و MinGW در دسترس است. مشخص میکند که هنگام تولید کد، از افزونه گنو برای ساختار پرونده PE که ترازسازی صحیح متغیرهای COMMON را ممکن میسازد استفاده شود. اگر GCC تشخیص دهد که اسمبلر مقصد یافتشده در حین پیکربندی از این قابلیت پشتیبانی میکند، این گزینه بهطور پیشفرض فعال است.
برای گزینههای استاندارد، بخش x86 Options را نیز ببینید.
گزینههای 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
- پوشه
فریمورک
dir را به
ابتدای
فهرست
پوشههای
جستجو برای
پروندههای
سرایند
اضافه
میکند. این
پوشهها با
پوشههای
تعیینشده
توسط
گزینههای
-I
درهمآمیخته
شده و به
ترتیب از چپ
به راست
پیمایش
میشوند.
یک پوشه فریمورک، پوشهای حاوی فریمورکها است. یک فریمورک پوشهای است با پسوند .framework که مستقیماً شامل پوشههای Headers و/یا PrivateHeaders میباشد. نام یک فریمورک برابر است با نام این پوشه بدون پسوند .framework. سرایندهای مرتبط با فریمورک در یکی از این دو پوشه قرار دارند، که در این میان ابتدا پوشهٔ Headers جستجو میشود. یک زیرفریمورک (subframework) پوشه فریمورکی است که درون پوشهٔ Frameworks یک فریمورک قرار گرفته باشد. گنجاندن (#include) سرایندهای زیرفریمورک فقط میتواند درون سرایند فریمورکی رخ دهد که حاوی آن زیرفریمورک است، یا در سرایند یک زیرفریمورک همردیف (sibling). دو زیرفریمورک در صورتی همردیف تلقی میشوند که درون یک فریمورک یکسان قرار داشته باشند. یک زیرفریمورک نباید همنام با یک فریمورک باشد؛ در صورت نقض این مورد هشداری صادر میشود. در حال حاضر یک زیرفریمورک نمیتواند خود شامل زیرفریمورکهای دیگری باشد؛ در آینده ممکن است این سازوکار برای پشتیبانی از این امکان ارتقا یابد. فریمورکهای استاندارد را میتوان در پوشههای /System/Library/Frameworks و /Library/Frameworks یافت. یک نمونه include به شکل "#include <Framework/header.h>" است، که در آن Framework نام فریمورک را مشخص میکند و پروندهٔ header.h در یکی از پوشههای PrivateHeaders یا Headers یافت میشود.
- -iframeworkdir
- مشابه با -F عمل میکند با این تفاوت که با این پوشه مانند یک پوشهٔ سیستمی رفتار میشود. تفاوت اصلی بین -iframework و -F در این است که با -iframework کامپایلر هیچ هشداری در مورد ساختارهای موجود در پروندههای سرایندی که از طریق dir پیدا شدهاند صادر نمیکند. این گزینه فقط برای خانواده زبانهای C معتبر است.
- -gused
- اطلاعات اشکالزدایی را فقط برای نمادهایی که استفاده شدهاند صادر میکند. برای قالب اشکالزدایی stabs، این گزینه -feliminate-unused-debug-symbols را فعال میکند. این گزینه بهطور پیشفرض روشن (ON) است.
- -gfull
- اطلاعات اشکالزدایی را برای تمامی نمادها و نوعها صادر میکند.
- -fconstant-cfstrings
- گزینهٔ -fconstant-cfstrings یک نام مستعار برای -mconstant-cfstrings است..IP -mconstant-cfstrings 4 هنگامی که زمان اجرای NeXT استفاده میشود (حالت پیشفرض در این سیستمها)، هرگونه تنظیمات -fconstant-string-class را بازنویسی کرده و باعث میشود لیترالهای "@"..."" بهصورت رشتههای ثابت CoreFoundation چیدمان شوند.
- -mmacosx-version-min=version
- قدیمیترین
نسخه از MacOS X که
این فایل
اجرایی بر
روی آن اجرا
خواهد شد،
version است.
مقادیر
معمولِ
پشتیبانیشده
برای version
شامل 12،
10.12 و 10.5.8
است.
اگر کامپایلر طوری ساخته شده باشد که بهطور پیشفرض از هدرهای سیستم استفاده کند، مقدار پیشفرض این گزینه برابر با نسخه سیستمی است که کامپایلر روی آن اجرا میشود؛ در غیر این صورت، حالت پیشفرض انجام انتخابهایی است که تا جای ممکن با بیشترین سیستمها و پایگاههای کد سازگار باشند.
- -mkernel
- حالت توسعه هسته (kernel) را فعال میکند. گزینه -mkernel در صورت امکان، گزینههای -static، -fno-common، -fno-use-cxa-atexit، -fno-exceptions، -fno-non-call-exceptions، -fapple-kext، -fno-weak و -fno-rtti را تنظیم میکند. این حالت همچنین گزینههای -mno-altivec، -msoft-float، -fno-builtin و -mlong-branch را برای مقاصد PowerPC تنظیم میکند.
- -mone-byte-bool
- پیشفرضهای
مربوط به
"bool" را
بازنویسی
میکند تا
"sizeof(bool)==1"
برقرار شود.
بهطور
پیشفرض،
هنگام
کامپایل
برای Darwin/PowerPC
مقدار
sizeof(bool)
برابر 4
و هنگام
کامپایل
برای Darwin/x86
برابر 1
است،
بنابراین
این گزینه
بر روی x86
تأثیری
ندارد.
هشدار: سوئیچ -mone-byte-bool باعث میشود GCC کدی تولید کند که با کد تولیدشده بدون این سوئیچ سازگاری باینری ندارد. استفاده از این سوئیچ ممکن است نیازمند کامپایل مجدد تمامی ماژولهای دیگر برنامه، از جمله کتابخانههای سیستم باشد. از این سوئیچ برای انطباق با یک مدل داده غیرپیشفرض استفاده کنید.
- -mfix-and-continue
- -ffix-and-continue
- -findirect-data
- کدی مناسب برای توسعه سریع و چابک تولید میکند، مانند فراهم آوردن امکان بارگذاری پویای فایلهای .o توسط GDB در برنامههایی که از قبل در حال اجرا هستند. گزینههای -findirect-data و -ffix-and-continue برای سازگاری با نسخههای پیشین ارائه شدهاند.
- -all_load
- تمام اعضای کتابخانههای آرشیو ایستا (static archive) را بارگذاری میکند. برای اطلاعات بیشتر به کتابچه راهنمای ld(1) مراجعه کنید.
- -arch_errors_fatal
- باعث میشود خطاهای مربوط به فایلهایی با معماری نادرست، مهلک تلقی شوند.
- -bind_at_load
- باعث میشود فایل خروجی به گونهای علامتگذاری شود که پیونددهنده پویا هنگام بارگذاری یا اجرای فایل، تمام ارجاعات تعریفنشده را متصل (bind) کند.
- -bundle
- یک فایل با قالب Mach-o bundle تولید میکند. برای اطلاعات بیشتر به کتابچه راهنمای ld(1) مراجعه کنید.
- -bundle_loader executable
- این گزینه executable (فایل اجرایی) را مشخص میکند که فایل خروجی ساختِ در حال پیوند را بارگذاری خواهد کرد. برای اطلاعات بیشتر به کتابچه راهنمای ld(1) مراجعه کنید.
- -dynamiclib
- هنگامی که این گزینه ارسال شود، GCC هنگام پیوند، با استفاده از دستور libtool در Darwin به جای یک فایل اجرایی یک کتابخانه پویا تولید میکند.
- -force_cpusubtype_ALL
- این گزینه باعث میشود که فایل خروجی GCC زیرنوع ALL داشته باشد، به جای زیرنوعی که توسط گزینه -mcpu یا -march کنترل میشود.
- -nodefaultrpaths
- مسیرهای اجرای پیشفرض (run paths) برای دایرکتوریهای کتابخانه کامپایلر را به فایلهای اجرایی، ماژولها یا کتابخانههای پویا اضافه نمیکند. در macOS 10.5 و جدیدتر، runpath تعبیهشده بهطور پیشفرض اضافه میشود مگر اینکه کاربر -nodefaultrpaths را به خط پیوند اضافه کند. مسیرهای اجرا برای ساخت روی macOS نسخه 10.11 یا جدیدتر لازم هستند (و از این رو اعمال اجباری میشوند).
- -allowable_client client_name
- -client_name
- -compatibility_version
- -current_version
- -dead_strip
- -dependency-file
- -dylib_file
- -dylinker_install_name
- -dynamic
- -exported_symbols_list
- -filelist
- -flat_namespace
- -force_flat_namespace
- -headerpad_max_install_names
- -image_base
- -init
- -install_name
- -keep_private_externs
- -multi_module
- -multiply_defined
- -multiply_defined_unused
- -noall_load
- -no_dead_strip_inits_and_terms
- -nofixprebinding
- -nomultidefs
- -noprebind
- -noseglinkedit
- -pagezero_size
- -prebind
- -prebind_all_twolevel_modules
- -private_bundle
- -read_only_relocs
- -sectalign
- -sectobjectsymbols
- -whyload
- -seg1addr
- -sectcreate
- -sectobjectsymbols
- -sectorder
- -segaddr
- -segs_read_only_addr
- -segs_read_write_addr
- -seg_addr_table
- -seg_addr_table_filename
- -seglinkedit
- -segprot
- -segs_read_only_addr
- -segs_read_write_addr
- -static
- -sub_library
- -sub_umbrella
- -twolevel_namespace
- -umbrella
- -undefined
- -unexported_symbols_list
- -weak_reference_mismatches
- -whatsloaded
- این گزینهها به پیونددهندهٔ Darwin ارسال میشوند. صفحهٔ راهنمای پیونددهندهٔ Darwin آنها را با جزئیات شرح داده است.
گزینههای DEC Alpha
این گزینههای -m برای پیادهسازیهای DEC Alpha تعریف شدهاند:
- -mno-soft-float
- -msoft-float
- استفاده
(عدم
استفاده) از
دستورالعملهای
سختافزاری
ممیز شناور
برای
محاسبات
ممیز شناور.
هنگامی که
-msoft-float مشخص
شود، از
توابع
موجود در libgcc.a
برای انجام
عملیاتهای
ممیز شناور
استفاده
میشود. مگر
اینکه
آنها با
روتینهایی
جایگزین
شوند که
عملیاتهای
ممیز شناور
را
شبیهسازی
میکنند،
یا به
گونهای
کامپایل
شوند که
چنین
روتینهای
شبیهسازی
را
فراخوانی
کنند، این
روتینها
دستورالعملهای
ممیز شناور
صادر
میکنند.
اگر برای یک
Alpha بدون
عملیاتهای
ممیز شناور
کامپایل
میکنید،
باید مطمئن
شوید که
کتابخانه
به گونهای
ساخته شده
است که
آنها را
فراخوانی
نکند.
توجه داشته باشید که پیادهسازیهای Alpha بدون عملیاتهای ممیز شناور، ملزم به داشتن ثباتهای ممیز شناور هستند.
- -mfp-reg
- -mno-fp-regs
- تولید کدی
که از
مجموعه
ثباتهای
ممیز شناور
استفاده
کند
(استفاده
نکند). -mno-fp-regs
مستلزم -msoft-float
است. اگر از
مجموعه
ثباتهای
ممیز شناور
استفاده
نشود،
عملوندهای
ممیز شناور
مانند
اعداد صحیح
در
ثباتهای
عدد صحیح
ارسال
میشوند و
نتایج ممیز
شناور به
جای $f0 در
$0
بازگردانده
میشوند.
این یک
توالی
فراخوانی
غیراستاندارد
است،
بنابراین
هر تابعی با
آرگومان یا
مقدار
بازگشتی
ممیز شناور
که توسط
کدهای
کامپایلشده
با -mno-fp-regs
فراخوانی
میشود نیز
باید با این
گزینه
کامپایل
شود.
یک کاربرد رایج این گزینه در ساخت هستهای است که از هیچ ثبات ممیز شناوری استفاده نمیکند و در نتیجه نیازی به ذخیره و بازیابی آنها ندارد.
- -mieee
- معماری Alpha سختافزار ممیز شناور را بهینهشده برای بیشینه کارایی پیادهسازی میکند. این معماری تا حد زیادی با استاندارد ممیز شناور IEEE سازگار است. با این حال، برای سازگاری کامل، کمکهای نرمافزاری الزامی است. این گزینه کدی کاملاً منطبق بر IEEE تولید میکند مگر اینکه پرچم inexact-flag نگهداری نمیشود (پایین را ببینید). اگر این گزینه فعال باشد، ماکروی پیشپردازندهٔ "_IEEE_FP" در حین کامپایل تعریف میشود. کد حاصل کارایی کمتری دارد اما قادر است اعداد غیرعادی (denormalized) و مقادیر استثنایی IEEE مانند ناعدد (NaN) و مثبت/منفی بینهایت را به درستی پشتیبانی کند. کامپایلرهای دیگر Alpha این گزینه را -ieee_with_no_inexact مینامند.
- -mieee-with-inexact
- این گزینه مانند -mieee است با این تفاوت که کد تولیدشده پرچم inexact-flag استاندارد IEEE را نیز حفظ میکند. فعال کردن این گزینه موجب میشود کد تولیدشده محاسبات ریاضیاتی کاملاً منطبق بر IEEE را پیادهسازی کند. علاوه بر "_IEEE_FP"، ماکروی پیشپردازندهٔ "_IEEE_FP_EXACT" نیز تعریف میشود. در برخی پیادهسازیهای Alpha، کد حاصل ممکن است به طور چشمگیری کندتر از کدی که به صورت پیشفرض تولید میشود اجرا گردد. از آنجا که کدهای اندکی به inexact-flag وابسته هستند، معمولاً نباید این گزینه را تعیین کنید. سایر کامپایلرهای Alpha این گزینه را -ieee_with_inexact مینامند.
- -mfp-trap-mode=trap-mode
- این گزینه کنترل میکند که چه تلههای (traps) مرتبط با ممیز شناور فعال باشند. کامپایلرهای دیگر Alpha این گزینه را -fptm trap-mode مینامند. حالت تله را میتوان روی یکی از چهار مقدار زیر تنظیم کرد:
- n
- این حالت پیشفرض (عادی) است. تنها تلههایی فعال میشوند که در نرمافزار نمیتوان آنها را غیرفعال کرد (مانند تلهٔ تقسیم بر صفر).
- u
- علاوه بر تلههای فعالشده توسط n، تلههای زیرریز (underflow) نیز فعال میشوند.
- su
- مانند u، اما دستورالعملها به عنوان ایمن برای تکمیل نرمافزاری نشانهگذاری میشوند (برای جزئیات به راهنمای معماری Alpha مراجعه کنید).
- sui
- مانند su، اما تلههای نادقیق (inexact) نیز فعال میشوند.
- -mfp-rounding-mode=rounding-mode
- حالت گرد کردن IEEE را انتخاب میکند. کامپایلرهای دیگر Alpha این گزینه را -fprm rounding-mode مینامند. مقدار rounding-mode میتواند یکی از موارد زیر باشد:
- n
- حالت گرد کردن عادی IEEE. اعداد ممیز شناور به سمت نزدیکترین عدد ماشین یا در صورت برابری فاصله، به سمت عدد زوج ماشین گرد میشوند.
- m
- گرد کردن به سمت منفی بینهایت.
- c
- حالت گرد کردن بریدهشده (chopped). اعداد ممیز شناور به سمت صفر گرد میشوند.
- d
- حالت گرد کردن پویا (dynamic). یک فیلد در ثبات کنترلی ممیز شناور (fpcr، راهنمای مرجع معماری Alpha را ببینید) حالت گرد کردن فعال را کنترل میکند. کتابخانهٔ C این ثبات را برای گرد کردن به سمت مثبت بینهایت مقداردهی اولیه میکند. بنابراین، مگر اینکه برنامهٔ شما fpcr را تغییر دهد، d متناظر با گرد کردن به سمت مثبت بینهایت خواهد بود.
- -mtrap-precision=trap-precision
- در معماری Alpha، تلههای ممیز شناور نادقیق (imprecise) هستند. این بدان معناست که بدون کمک نرمافزاری بازیابی از یک تلهٔ ممیز شناور غیرممکن است و اجرای برنامه معمولاً باید خاتمه یابد. GCC میتواند کدی تولید کند که به گردانندههای تله در سیستمعامل در تعیین مکان دقیقی که باعث ایجاد تلهٔ ممیز شناور شده است کمک کند. بسته به نیازمندیهای برنامه، سطوح مختلفی از دقت را میتوان انتخاب کرد:
- p
- دقت برنامه (Program precision). این گزینه پیشفرض است و به این معنی است که گردانندهٔ تله فقط میتواند تشخیص دهد کدام برنامه باعث بروز استثنای ممیز شناور شده است.
- f
- دقت تابع (Function precision). گردانندهٔ تله میتواند تابعی را که باعث بروز استثنای ممیز شناور شده است تعیین کند.
- i
- دقت دستورالعمل (Instruction precision). گردانندهٔ تله میتواند دستورالعمل دقیقی را که باعث بروز استثنای ممیز شناور شده است تعیین کند.
سایر کامپایلرهای Alpha گزینههای معادلی به نامهای -scope_safe و -resumption_safe را ارائه میدهند.
- -mieee-conformant
- این گزینه کد تولیدشده را به عنوان منطبق بر IEEE نشانهگذاری میکند. شما نباید از این گزینه استفاده کنید مگر اینکه -mtrap-precision=i و یکی از گزینههای -mfp-trap-mode=su یا -mfp-trap-mode=sui را نیز تعیین کرده باشید. تنها اثر آن درج خط .eflag 48 در دیباچهٔ تابع (prologue) در فایل اسمبلی تولیدشده است.
- -mbuild-constants
- به طور
معمول GCC یک
مقدار ثابت
عدد صحیح ۳۲
یا ۶۴ بیتی
را بررسی
میکند تا
ببیند آیا
میتواند
آن را در دو
یا سه
دستورالعمل
از
ثابتهای
کوچکتر
بسازد یا
خیر. اگر
نتواند،
ثابت را به
عنوان یک
لیترال (literal)
خروجی داده
و کدی برای
بارگذاری
آن از بخش
داده (data segment) در
زمان اجرا
تولید
میکند.
از این گزینه برای ملزم ساختن GCC به ساختن تمام ثابتهای عدد صحیح با استفاده از کد استفاده کنید، حتی اگر به دستورالعملهای بیشتری نیاز داشته باشد (حداکثر شش دستورالعمل).
شما معمولاً از این گزینه برای ساخت بارگذار پویای کتابخانهٔ مشترک (dynamic loader) استفاده میکنید. این بارگذار که خود یک کتابخانهٔ مشترک است، باید قبل از اینکه بتواند متغیرها و مقادیر ثابت را در بخش دادههای خود پیدا کند، آدرسهای خود را در حافظه بازنشانی (relocate) کند..IP -mbwx 4
- -mno-bwx
- -mcix
- -mno-cix
- -mfix
- -mno-fix
- -mmax
- -mno-max
- مشخص میکند که آیا GCC باید کدی تولید کند که از مجموعهدستورالعملهای اختیاری BWX، CIX، FIX و MAX استفاده کند یا خیر. حالت پیشفرض، استفاده از مجموعهدستورالعملهای پشتیبانیشده توسط نوع پردازندهای است که از طریق گزینهٔ -mcpu= مشخص شده باشد، و در صورت مشخص نشدن، پردازندهای که GCC روی آن ساخته شده است مورد استفاده قرار میگیرد.
- -msafe-bwa
- -mno-safe-bwa
- مشخص میکند که در صورت نبود مجموعهدستورالعمل اختیاری BWX، آیا GCC باید کدی ایمن در برابر چندریسمانی (multi-thread) و سیگنالهای ناهمگام (async-signal) برای دسترسیهای حافظه به بایتها و کلمات تراز شده تولید کند یا خیر.
- -msafe-partial
- -mno-safe-partial
- مشخص میکند که آیا GCC باید کدی ایمن در برابر چندریسمانی و سیگنالهای ناهمگام برای دسترسیهای جزئی به حافظه تولید کند یا خیر؛ از جمله دسترسیهای تکهتکه به دادههای ترازنشده، و همچنین دسترسیهای بلوکی به بخشهای ابتدایی و انتهایی نوعهای تجمیعی (aggregate) یا اشیاء دیگر در حافظه که به ترتیب در مرز دادهای تراز شدهٔ ۶۴ بیتی آغاز نشده و پایان نمییابند.
- -mfloat-vax
- -mfloat-ieee
- کدی تولید میکند که به جای ممیز شناور تکدقت و دودقت IEEE، از محاسبات ممیز شناور VAX F و G استفاده کند (یا استفاده نکند).
- -mexplicit-relocs
- -mno-explicit-relocs
- اسمبلرهای قدیمیتر Alpha راهی برای تولید بازنشانی نمادها به جز از طریق ماکروهای اسمبلر ارائه نمیدادند. استفاده از این ماکروها اجازهٔ زمانبندی بهینهٔ دستورالعملها را نمیدهد. بستهٔ GNU binutils از نسخهٔ ۲.۱۲ از نحو جدیدی پشتیبانی میکند که به کامپایلر اجازه میدهد بهطور صریح مشخص کند کدام بازنشانیها باید بر روی کدام دستورالعملها اعمال شوند. این گزینه بیشتر برای اشکالزدایی مفید است، زیرا GCC در هنگام ساخته شدنش قابلیتهای اسمبلر را تشخیص داده و پیشفرض را بر همان اساس تنظیم میکند.
- -msmall-data
- -mlarge-data
- هنگامی که
-mexplicit-relocs فعال
باشد،
دادههای
ایستا از
طریق
بازنشانیهای
مرتبط با gp
(gp-relative) مورد
دسترسی
قرار
میگیرند.
هنگامی که
-msmall-data
استفاده
شود،
اشیایی به
طول ۸ بایت
یا کمتر در
«ناحیهٔ
دادههای
کوچک»
(بخشهای
".sdata" و
".sbss")
قرار
میگیرند و
از طریق
بازنشانیهای
۱۶ بیتی از
ثبات $gp
در دسترس
قرار
میگیرند.
این امر
اندازهٔ
ناحیهٔ
دادههای
کوچک را به
۶۴
کیلوبایت
محدود
میکند،
اما به
متغیرها
اجازه
میدهد
مستقیماً
از طریق یک
دستورالعمل
واحد مورد
دسترسی
قرار گیرند.
پیشفرض -mlarge-data است. با این گزینه ناحیهٔ داده به کمی کمتر از ۲ گیگابایت محدود میشود. برنامههایی که به بیش از ۲ گیگابایت داده نیاز دارند باید به جای بخش دادهٔ برنامه، از "malloc" یا "mmap" برای تخصیص داده در هیپ استفاده کنند.
هنگام تولید کد برای کتابخانههای اشتراکی، -fpic متضمن -msmall-data و -fPIC متضمن -mlarge-data است.
- -msmall-text
- -mlarge-text
- هنگامی که
-msmall-text
استفاده
میشود،
کامپایلر
فرض میکند
که کد کل
برنامه (یا
کتابخانهٔ
اشتراکی) در
۴ مگابایت
جا میشود،
و بنابراین
با یک
دستورالعمل
انشعاب (branch)
قابل
دسترسی است.
هنگامی که
-msmall-data
استفاده
شود،
کامپایلر
میتواند
فرض کند که
تمام
نمادهای
محلی مقدار
$gp
یکسانی
دارند، و
بنابراین
تعداد
دستورالعملهای
مورد نیاز
برای
فراخوانی
تابع را از
۴ به ۱ کاهش
دهد.
پیشفرض -mlarge-text است.
- -mcpu=cpu_type
- مجموعهدستورالعمل
و
پارامترهای
زمانبندی
دستورالعمل
را برای نوع
ماشین cpu_type
تنظیم
میکند.
میتوانید
نام به سبک
EV یا
شمارهٔ
تراشهٔ
مربوطه را
مشخص کنید.
کامپایلر GCC
از
پارامترهای
زمانبندی
برای
خانواده
پردازندههای
EV4، EV5 و EV6
پشتیبانی
میکند و
مقادیر
پیشفرض
مجموعهدستورالعمل
را از روی
پردازندهای
که مشخص
کردهاید
انتخاب
مینماید.
اگر نوع
پردازنده
را مشخص
نکنید، GCC
بهطور
پیشفرض از
پردازندهای
استفاده
میکند که
کامپایلر
بر روی آن
ساخته شده
است.
مقادیر پشتیبانیشده برای cpu_type عبارتاند از:
- ev4
- ev45
- 21064
- زمانبندی همانند EV4 است و هیچ افزونهٔ مجموعهدستورالعملی ندارد.
- ev5
- 21164
- زمانبندی همانند EV5 است و هیچ افزونهٔ مجموعهدستورالعملی ندارد.
- ev56
- 21164a
- زمانبندی همانند EV5 است و از افزونهٔ BWX پشتیبانی میکند.
- pca56
- 21164pc
- 21164PC
- زمانبندی همانند EV5 است و از افزونههای BWX و MAX پشتیبانی میکند.
- ev6
- 21264
- زمانبندی همانند EV6 است و از افزونههای BWX، FIX و MAX پشتیبانی میکند.
- ev67
- 21264a
- زمانبندی همانند EV6 است و از افزونههای BWX، CIX، FIX و MAX پشتیبانی میکند.
زنجیرهابزارهای بومی نیز از مقدار native پشتیبانی میکنند، که بهترین گزینهٔ معماری را برای پردازندهٔ میزبان انتخاب میکند. اگر GCC پردازنده را تشخیص ندهد، -mcpu=native هیچ تأثیری نخواهد داشت.
- -mtune=cpu_type
- تنها
پارامترهای
زمانبندی
دستورالعمل
را برای نوع
ماشین cpu_type
تنظیم
میکند.
مجموعهدستورالعمل
تغییر
نمیکند.
زنجیرهابزارهای بومی نیز از مقدار native پشتیبانی میکنند، که بهترین گزینهٔ معماری را برای پردازندهٔ میزبان انتخاب میکند. اگر GCC پردازنده را تشخیص ندهد، -mtune=native هیچ تأثیری نخواهد داشت.
- -mmemory-latency=time
- میزان
تأخیری (latency)
را تنظیم
میکند که
زمانبند
باید برای
ارجاعات
معمول به
حافظه،
همانطور
که از دید
برنامه
دیده
میشود، در
نظر بگیرد.
این عدد به
شدت به
الگوهای
دسترسی به
حافظه که
برنامه
استفاده
میکند و
اندازهٔ
حافظهٔ
نهان خارجی
(external cache) دستگاه
وابسته است.
گزینههای معتبر برای time عبارتاند از:
گزینههای eBPF
- -mframe-limit=bytes
- این گزینه سقف قطعی (hard limit) را برای اندازه فریمها، بر حسب بایت، مشخص میکند. در حال حاضر، مقداری که میتوان تعیین کرد باید کوچکتر یا مساوی با 32767 باشد. مقدار پیشفرض برابر با هر محدودیتی است که توسط نسخه هسته لینوکس هدف اعمال شده باشد.
- -mbig-endian
- تولید کد برای یک هدف big-endian (بزرگپایان).
- -mlittle-endian
- تولید کد برای یک هدف little-endian (کوچکپایان). این حالت پیشفرض است.
- -mjmpext
- -mno-jmpext
- فعال یا غیرفعال کردن تولید دستورالعملهای پرش شرطی (conditional-branch) اضافی. برای CPU v2 و بالاتر فعال است.
- -mjmp32
- -mno-jmp32
- فعال یا غیرفعال کردن تولید دستورالعملهای پرش ۳۲ بیتی. برای CPU v3 و بالاتر فعال است.
- -malu32
- -mno-alu32
- فعال یا غیرفعال کردن تولید دستورالعملهای ۳۲ بیتی ALU. برای CPU v3 و بالاتر فعال است.
- -mv3-atomics
- -mno-v3-atomics
- فعال یا غیرفعال کردن دستورالعملهای مربوط به عملیاتهای اتمیک عمومی معرفیشده در CPU v3. برای CPU v3 و بالاتر فعال است.
- -mbswap
- -mno-bswap
- فعال یا غیرفعال کردن دستورالعملهای تعویض بایت (byte swap). برای CPU v4 و بالاتر فعال است.
- -msdiv
- -mno-sdiv
- فعال یا غیرفعال کردن دستورالعملهای تقسیم علامتدار و باقیمانده (modulus). برای CPU v4 و بالاتر فعال است.
- -msmov
- -mno-smov
- فعال یا غیرفعال کردن دستورالعملهای انتقال با بسط علامت (sign-extending) و بارگذاری حافظه. برای CPU v4 و بالاتر فعال است.
- -mcpu=version
- مشخص
میکند
کدام نسخه
از ISA معماری eBPF
هدف قرار
گیرد. ممکن
است
نسخههای
جدیدتر
توسط همه
هستهها
پشتیبانی
نشوند.
مقدار
پیشفرض v4
است.
مقادیر پشتیبانیشده برای version عبارتند از:
- v1
- نخستین ISA پایدار eBPF بدون هیچ ویژگی خاص یا افزونهای.
- v2
- پشتیبانی از افزونههای پرش، همانند -mjmpext.
- v3
- تمام ویژگیهای v2، بهعلاوه:
- -<عملیاتهای پرش ۳۲ بیتی، همانند -mjmp32>
- -<عملیاتهای ۳۲ بیتی ALU، همانند -malu32>
- -<عملیاتهای اتمیک عمومی، همانند -mv3-atomics>
- v4
- تمام ویژگیهای v3، بهعلاوه:
- -<دستورالعملهای تعویض بایت، همانند -mbswap>
- -<دستورالعملهای تقسیم علامتدار و باقیمانده، همانند -msdiv>
- -<دستورالعملهای انتقال با بسط علامت و بارگذاری حافظه، همانند -msmov>
- -mco-re
- فعال کردن پشتیبانی از «یکبار کامپایل، همهجا اجرا» (Compile Once - Run Everywhere یا CO-RE) در BPF. به -gbtf نیاز دارد و توسط آن نیز به طور ضمنی فعال میشود.
- -mno-co-re
- غیرفعال کردن پشتیبانی از «یکبار کامپایل، همهجا اجرا» (CO-RE) در BPF. هنگام تولید اطلاعات اشکالزدایی BTF برای هدف BPF، پشتیبانی از BPF CO-RE به طور پیشفرض فعال است.
- -mxbpf
- تولید کد برای یک نسخه گسترشیافته از BPF، که برخی از محدودیتهای اعمالشده توسط معماری BPF را کاهش میدهد:
- -<ذخیره و بازیابی ثباتهای callee-saved در هنگام ورود و>
- خروج تابع، بهترتیب.
- -masm=dialect
- دستورالعملهای
اسمبلی را
با استفاده
از dialect
انتخابشده
برای eBPF
خروجی
میدهد.
مقدار
پیشفرض pseudoc
است.
مقادیر پشتیبانیشده برای dialect عبارتند از:
- -minline-memops-threshold=bytes
- آستانه اندازهای را بر حسب بایت مشخص میکند که در آن یا کمتر از آن، توابع memmove ،memcpy و memset همواره باید بهصورت درونخطی (inline) بسط داده شوند. عملیاتهایی که با اندازههای بزرگتر از این آستانه سروکار دارند، باید به جای بسط درونخطی با استفاده از فراخوانی کتابخانهای پیادهسازی شوند؛ اما از آنجا که BPF اجازه فراخوانی کتابخانهای (libcall) را نمیدهد، فراتر رفتن از این آستانه منجر به خطای زمان کامپایل خواهد شد. مقدار پیشفرض 1024 بایت است..PP گزینههای FR30
این گزینهها بهطور خاص برای پورت FR30 تعریف شدهاند.
- -msmall-model
- استفاده از مدل فضای آدرس کوچک. این گزینه میتواند کد کوچکتری تولید کند، اما فرض میکند که تمامی مقادیر نمادین و آدرسها در یک محدودهٔ ۲۰ بیتی جای میگیرند.
- -mno-lsim
- فرض میکند که پشتیبانی زمان اجرا فراهم شده است و بنابراین نیازی به گنجاندن کتابخانه شبیهساز (libsim.a) در خط فرمان پیونددهنده نیست.
گزینههای FT32
این گزینهها بهطور خاص برای پورت FT32 تعریف شدهاند.
- -msim
- مشخص میکند که برنامه روی شبیهساز اجرا خواهد شد. این گزینه باعث میشود که یک راهانداز زمان اجرا و کتابخانهٔ جایگزین پیوند داده شوند. نباید از این گزینه هنگام تولید برنامههایی که روی سختافزار واقعی اجرا میشوند استفاده کنید؛ شما باید کتابخانه زمان اجرای خود را برای هرگونه توابع I/O مورد نیاز فراهم کنید.
- -mlra
- کاری انجام نمیدهد. برای سازگاری با نسخههای پیشین حفظ شده است.
- -mnodiv
- عدم استفاده از دستورالعملهای div و mod.
- -mft32b
- فعالسازی استفاده از دستورالعملهای گسترشیافتهٔ پردازنده FT32B.
- -mcompress
- فشردهسازی تمام کد با استفاده از طرح فشردهسازی کد Ft32B.
- -mnopm
- عدم تولید کدی که حافظهٔ برنامه را میخواند.
گزینههای FRV
- -mgpr-32
- تنها از ۳۲ ثبات اول با کاربرد عمومی استفاده میکند.
- -mgpr-64
- استفاده از تمام ۶۴ ثبات با کاربرد عمومی.
- -mfpr-32
- تنها از ۳۲ ثبات اول ممیز شناور استفاده میکند.
- -mfpr-64
- استفاده از تمام ۶۴ ثبات ممیز شناور.
- -mhard-float
- استفاده از دستورالعملهای سختافزاری برای عملیات ممیز شناور.
- -msoft-float
- استفاده از توابع کتابخانهای برای عملیات ممیز شناور.
- -malloc-cc
- تخصیص پویای ثباتهای کد وضعیت (condition code).
- -mfixed-cc
- عدم تلاش برای تخصیص پویای ثباتهای کد وضعیت، و فقط استفاده از "icc0" و "fcc0".
- -mdword
- تغییر ABI برای استفاده از دستورالعملهای کلمه مضاعف (double word).
- -mno-dword
- عدم استفاده از دستورالعملهای کلمه مضاعف.
- -mdouble
- استفاده از دستورالعملهای ممیز شناور با دقت مضاعف (double).
- -mno-double
- عدم استفاده از دستورالعملهای ممیز شناور با دقت مضاعف.
- -mmedia
- استفاده از دستورالعملهای چندرسانهای (media).
- -mno-media
- عدم استفاده از دستورالعملهای چندرسانهای.
- -mmuladd
- استفاده از دستورالعملهای ضرب و جمع/تفریق.
- -mno-muladd
- عدم استفاده از دستورالعملهای ضرب و جمع/تفریق.
- -mfdpic
- انتخاب ABI مربوط به FDPIC، که از توصیفکنندههای تابع برای نمایش اشارهگرها به توابع استفاده میکند. بدون هیچیک از گزینههای مرتبط با PIC/PIE، مستلزم -fPIE است. همراه با -fpic یا -fpie، فرض میکند که مدخلهای GOT و دادههای کوچک در محدودهٔ ۱۲ بیتی از آدرس پایهٔ GOT قرار دارند؛ همراه با -fPIC یا -fPIE، آفستهای GOT بهصورت ۳۲ بیتی محاسبه میشوند. همراه با هدف bfin-elf، این گزینه مستلزم -msim است.
- -minline-plt
- فعالسازی درونخطیسازی مدخلهای PLT در فراخوانی توابعی که انتساب محلی آنها مشخص نیست. این گزینه بدون -mfdpic اثری ندارد. در صورت بهینهسازی برای سرعت و کامپایل برای کتابخانههای اشتراکی (یعنی -fPIC یا -fpic)، یا هنگامی که یک گزینهٔ بهینهسازی مانند -O3 یا بالاتر در خط فرمان وجود داشته باشد، بهطور پیشفرض فعال است.
- -mTLS
- هنگام تولید کد محلی رشته (thread-local)، یک بخش TLS بزرگ را فرض میکند.
- -mtls
- هنگام تولید کد محلی رشته (thread-local)، بخش TLS بزرگ را فرض نمیکند.
- -mgprel-ro
- فعالسازی استفاده از بازنشانیهای "GPREL" در ABI مربوط به FDPIC برای دادههایی که مشخصاً در بخشهای فقطخواندنی قرار دارند. این گزینه بهطور پیشفرض فعال است، بهجز برای -fpic یا -fpie: حتی با اینکه ممکن است به کوچکتر شدن جدول آفست سراسری (GOT) کمک کند، اما ۱ دستورالعمل را با ۴ دستورالعمل معاوضه میکند. همراه با -fPIC یا -fPIE، ۳ دستورالعمل را با ۴ دستورالعمل معاوضه میکند که یکی از آنها ممکن است بین چندین نماد به اشتراک گذاشته شود و از نیاز به یک مدخل GOT برای نماد ارجاعشده جلوگیری میکند؛ بنابراین به احتمال زیاد سودمندتر خواهد بود. در غیر این صورت، میتوان از -mno-gprel-ro برای غیرفعال کردن آن استفاده کرد.
- -multilib-library-pic
- پیوند دادن با کتابخانههای pic (کتابخانه، نه FD). این گزینه بهطور ضمنی توسط -mlibrary-pic و همچنین توسط -fPIC و -fpic بدون -mfdpic اعمال میشود. شما هرگز نباید نیازی به استفادهٔ صریح از آن داشته باشید.
- -mlinked-fp
- پیروی از الزام EABI مبنی بر ایجاد همیشگی اشارهگر فریم (frame pointer) در زمان تخصیص فریم پشته. این گزینه بهطور پیشفرض فعال است و میتواند با -mno-linked-fp غیرفعال شود.
- -mlong-calls
- استفاده از آدرسدهی غیرمستقیم برای فراخوانی توابع خارج از واحد کامپایل فعلی. این امکان را فراهم میسازد که توابع در هر کجای فضای آدرس ۳۲ بیتی قرار گیرند.
- -malign-labels
- تلاش برای همتراز کردن برچسبها روی مرز ۸ بایتی با درج NOPها در بستهٔ قبلی. این گزینه تنها زمانی اثر دارد که بستهبندی VLIW فعال باشد. این گزینه بستههای جدیدی ایجاد نمیکند؛ صرفاً NOPها را به بستههای موجود اضافه میکند.
- -mlibrary-pic
- تولید کد EABI مستقل از موقعیت (position-independent).
- -macc-4
- تنها از چهار ثبات انباشتگر چندرسانهای اول استفاده میکند.
- -macc-8
- استفاده از تمام هشت ثبات انباشتگر چندرسانهای.
- -mpack
- بستهبندی دستورالعملهای VLIW.
- -mno-pack
- عدم بستهبندی دستورالعملهای VLIW.
- -mno-eflags
- عدم علامتگذاری سوئیچهای ABI در e_flags.
- -mcond-move
- فعالسازی
استفاده از
دستورالعملهای
انتقال
شرطی
(پیشفرض).
این سوئیچ عمدتاً برای اشکالزدایی کامپایلر است و احتمالاً در نسخههای آینده حذف خواهد شد.
- -mno-cond-move
- غیرفعالسازی
استفاده از
دستورالعملهای
انتقال
شرطی.
این سوئیچ عمدتاً برای اشکالزدایی کامپایلر است و احتمالاً در نسخههای آینده حذف خواهد شد.
- -mscc
- فعالسازی
استفاده از
دستورالعملهای
تنظیم شرطی
(پیشفرض).
این سوئیچ عمدتاً برای اشکالزدایی کامپایلر است و احتمالاً در نسخههای آینده حذف خواهد شد..IP -mno-scc 4 استفاده از دستورالعملهای مقداردهی شرطی (conditional set) را غیرفعال میکند.
این سوییچ عمدتاً برای اشکالزدایی کامپایلر است و احتمالاً در نسخههای آینده حذف خواهد شد.
- -mcond-exec
- استفاده از
اجرای شرطی
(conditional execution) را فعال
میکند
(پیشفرض).
این سوییچ عمدتاً برای اشکالزدایی کامپایلر است و احتمالاً در نسخههای آینده حذف خواهد شد.
- -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*.
- -muclibc
- از کتابخانهٔ C موسوم به uClibc استفاده میکند. این حالت در مقصدهای *-*-linux-*uclibc* پیشفرض است.
- -mmusl
- از کتابخانهٔ C موسوم به musl استفاده میکند. این حالت در مقصدهای *-*-linux-*musl* پیشفرض است.
- -mbionic
- از کتابخانهٔ C موسوم به Bionic استفاده میکند. این حالت در مقصدهای *-*-linux-*android* پیشفرض است.
- -mandroid
- کد را
سازگار با
پلتفرم Android
کامپایل
میکند. این
حالت در
مقصدهای
*-*-linux-*android*
پیشفرض
است.
هنگام کامپایل، این گزینه بهطور پیشفرض -mbionic، -fPIC، -fno-exceptions و -fno-rtti را فعال میکند. هنگام پیوند دادن، این گزینه باعث میشود که گردانندهٔ GCC گزینههای مخصوص به Android را به پیونددهنده ارسال کند. در نهایت، این گزینه باعث تعریف ماکروی پیشپردازندهٔ "__ANDROID__" میشود.
- -tno-android-cc
- اثرات کامپایل -mandroid را غیرفعال میکند؛ یعنی بهطور پیشفرض -mbionic، -fPIC، -fno-exceptions و -fno-rtti را فعال نمیکند.
- -tno-android-ld
- اثرات پیوند دادنِ -mandroid را غیرفعال میکند؛ یعنی گزینههای استاندارد پیوند لینوکس را به پیونددهنده ارسال میکند.
گزینههای H8/300
این گزینههای -m برای پیادهسازیهای H8/300 تعریف شدهاند:
- -mrelax
- در صورت امکان، برخی از ارجاعات آدرس را در زمان پیوند کوتاه میکند؛ از گزینهٔ پیونددهندهٔ -relax استفاده میکند.
- -mh
- برای H8/300H کد تولید میکند.
- -ms
- برای H8S کد تولید میکند.
- -mn
- برای H8S و H8/300H در حالت عادی (normal mode) کد تولید میکند. این سوییچ باید یا همراه با -mh و یا با -ms استفاده شود.
- -ms2600
- برای H8S/2600 کد تولید میکند. این سوییچ باید همراه با -ms استفاده شود.
- -mexr
- رجیسترهای گسترشیافته قبل از اجرای تابعی با ویژگی monitor روی پشته ذخیره میشوند. گزینهٔ پیشفرض -mexr است. این گزینه فقط برای مقصدهای H8S معتبر است.
- -mno-exr
- رجیسترهای گسترشیافته قبل از اجرای تابعی با ویژگی monitor روی پشته ذخیره نمیشوند. گزینهٔ پیشفرض -mno-exr است. این گزینه فقط برای مقصدهای H8S معتبر است.
- -mint32
- دادههای نوع "int" را بهطور پیشفرض ۳۲ بیتی میکند.
- -malign-300
- در H8/300H و H8S، از همان قواعد ترازسازی مربوط به H8/300 استفاده میکند. حالت پیشفرض برای H8/300H و H8S تراز کردن متغیرهای long و float روی مرزهای ۴ بایتی است. -malign-300 باعث تراز شدن آنها روی مرزهای ۲ بایتی میشود. این گزینه بر روی H8/300 هیچ تأثیری ندارد.
گزینههای HPPA
این گزینههای -m برای خانوادهٔ رایانههای HPPA تعریف شدهاند:
- -march=architecture-type
- برای معماری مشخصشده کد تولید میکند. مقادیر ممکن برای architecture-type عبارتند از 1.0 برای پردازندههای PA 1.0، 1.1 برای PA 1.1 و 2.0 برای پردازندههای PA 2.0. برای تعیین گزینهٔ معماری مناسب برای ماشین خود، به /usr/lib/sched.models در سامانهٔ HP-UX مراجعه کنید. کد کامپایلشده برای معماریهای با شمارهٔ پایینتر روی معماریهای با شمارهٔ بالاتر اجرا میشود، اما عکس آن امکانپذیر نیست.
- -mpa-risc-1-0
- -mpa-risc-1-1
- -mpa-risc-2-0
- بهترتیب نامهای مستعاری برای -march=1.0، -march=1.1 و -march=2.0 هستند.
- -matomic-libcalls
- هنگامی که
فراخوانیهای
کتابخانهای
sync غیرفعال
هستند،
فراخوانیهای
کتابخانهای
برای
بارگذاریها
و
ذخیرهسازیهای
اتمیک
تولید
میکند. این
گزینه
بهطور
پیشفرض
فعال است.
این گزینه
فقط بر
تولید
فراخوانیهای
کتابخانهای
اتمیک توسط
backend معماری HPPA
تأثیر
میگذارد.
هر دو پیادهسازی فراخوانی کتابخانهای sync و libatomic از قفلگذاری استفاده میکنند. در نتیجه، ذخیرهسازیهای پردازنده نسبت به سایر عملیات اتمیک، بهصورت اتمیک نخواهند بود. بارگذاریهای پردازنده تا سقف DImode نسبت به سایر عملیات اتمیک، اتمیک هستند، به شرط آنکه بهعنوان یک دسترسی منفرد پیادهسازی شده باشند.
معماری PA-RISC به جز دستورالعمل "ldcw"، از هیچ عملیات اتمیکی در سختافزار پشتیبانی نمیکند. بنابراین، تمام پشتیبانی اتمیک با استفاده از فراخوانیهای کتابخانهای sync و atomic پیادهسازی میشود. پشتیبانی فراخوانی کتابخانهای sync در libgcc.a و پشتیبانی فراخوانی کتابخانهای atomic در libatomic قرار دارد.
این گزینه فراخوانیهای "__atomic_exchange" را برای ذخیرهسازیهای اتمیک تولید میکند. همچنین مدیریت ویژهای برای دسترسیهای اتمیک DImode در مقصدهای ۳۲ بیتی فراهم میآورد..IP -mbig-switch 4 کاری انجام نمیدهد. برای سازگاری با نسخههای پیشین حفظ شده است.
- -mcaller-copies
- فراخواننده (caller) آرگومانهای تابعی را که از طریق ارجاع پنهان ارسال شدهاند کپی میکند. این گزینه باید با احتیاط استفاده شود چرا که با زماناجرای (runtime) ۳۲ بیتی پیشفرض سازگار نیست. با این حال، تنها دادههای تجمیعی بزرگتر از هشت بایت از طریق ارجاع پنهان ارسال میشوند و این گزینه سازگاری بهتری را با 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 ارسال میشوند تغییر میدهد. برنامهٔ ld فراخوانیشده توسط گزینهٔ پیکربندی --with-ld، مسیر جستجوی برنامههای GCC، و در نهایت توسط PATH کاربر تعیین میشود. پیونددهندهٔ مورد استفاده توسط GCC را میتوان با استفاده از which `gcc -print-prog-name=ld` چاپ کرد. این گزینه تنها در GCC نسخهٔ ۶۴ بیتی HP-UX در دسترس است، یعنی زمانی که با hppa*64*-*-hpux* پیکربندی شده باشد.
- -mhp-ld
- استفاده از گزینههای مخصوص به HP ld. این گزینه هنگام ساخت یک کتابخانهٔ اشتراکی، -b را به ld ارسال کرده و در تمامی پیوندها +Accept TypeMismatch را به ld میفرستد. این رفتار پیشفرض است زمانی که GCC بهطور صریح یا ضمنی با پیونددهندهٔ HP پیکربندی شده باشد. این گزینه بر اینکه کدام ld فراخوانی شود تأثیری ندارد؛ تنها پارامترهایی را که به آن ld ارسال میشوند تغییر میدهد. برنامهٔ ld فراخوانیشده بر اساس گزینهٔ پیکربندی --with-ld، مسیر جستجوی برنامههای GCC، و در نهایت بر اساس PATH کاربر تعیین میشود. پیونددهندهٔ مورد استفاده توسط GCC را میتوان با استفاده از which `gcc -print-prog-name=ld` چاپ کرد. این گزینه تنها در GCC نسخهٔ ۶۴ بیتی HP-UX در دسترس است، یعنی زمانی که با hppa*64*-*-hpux* پیکربندی شده باشد.
- -mlinker-opt
- فعالسازی مرحلهٔ بهینهسازی در پیونددهندهٔ HP-UX. توجه داشته باشید که این کار اشکالزدایی نمادین (symbolic debugging) را غیرممکن میسازد.
- -mlong-calls
- تولید کدی
که از
توالیهای
فراخوانی
طولانی (long call)
استفاده
میکند. این
امر تضمین
میکند که
یک
فراخوانی
همیشه قادر
است به
تکهکدهای
تولیدشده
توسط
پیونددهنده
(stubs) برسد. حالت
پیشفرض
این است که
فراخوانیهای
طولانی
تنها زمانی
تولید شوند
که فاصله از
محل
فراخوانی
تا آغاز
تابع یا
واحد ترجمه
(بسته به
مورد)، از
محدودهٔ از
پیش
تعریفشدهای
که توسط نوع
انشعابِ
مورد
استفاده
تعیین شده
فراتر رود.
محدودیتها
برای
فراخوانیهای
عادی به
ترتیب برای
معماریهای
PA 2.0 و PA 1.X برابر
با
۷٬۶۰۰٬۰۰۰
و ۲۴۰٬۰۰۰
بایت است.
فراخوانیهای
برادر (sibcalls)
همواره به
۲۴۰٬۰۰۰
بایت محدود
هستند.
فاصلهها هنگام استفاده از گزینهٔ -ffunction-sections، یا هنگام استفاده از گزینههای -mgas و -mno-portable-runtime همراه با یکدیگر تحت HP-UX با پیونددهندهٔ SOM، از آغاز توابع اندازهگیری میشوند.
معمولاً استفاده از این گزینه مطلوب نیست چرا که کارایی را کاهش میدهد. با این حال، ممکن است در برنامههای بزرگ، بهویژه زمانی که پیوند جزئی (partial linking) برای ساخت برنامه استفاده میشود، مفید باشد.
انواع فراخوانیهای طولانی مورد استفاده به قابلیتهای اسمبلر و پیونددهنده، و نوع کد در حال تولید بستگی دارد. تأثیر آن روی سیستمهایی که از فراخوانیهای مطلق طولانی، و فراخوانیهای طولانی تفاضل نماد pic یا وابسته به شمارندهٔ برنامه (pc-relative) پشتیبانی میکنند باید نسبتاً کم باشد. با این حال، در سیستمهای ۳۲ بیتی ELF در کد pic از یک فراخوانی غیرمستقیم استفاده میشود و این فراخوانی بسیار طولانی است.
- -mlong-load-store
- تولید توالیهای بارگذاری و ذخیرهٔ ۳دستوری، همانطور که گاهی توسط پیونددهندهٔ HP-UX 10 مورد نیاز است. این گزینه معادل با گزینهٔ +k در کامپایلرهای HP است.
- -mjump-in-delay
- این گزینه نادیده گرفته میشود و صرفاً برای اهداف سازگاری ارائه شده است.
- -mno-space-regs
- تولید کدی
که فرض
میکند
مقصد فاقد
ثباتهای
فضا (space registers) است.
این کار به GCC
اجازه
میدهد
فراخوانیهای
غیرمستقیم
سریعتری
تولید کرده
و از
حالتهای
آدرسدهی
نمایهایِ
مقیاسبندینشده
استفاده
کند.
چنین کدی برای هستهها و سیستمهای PA سطح ۰ مناسب است.
- -mordered
- فرض میکند که ارجاعات حافظه مرتب هستند و نیازی به سدها (barriers) نیست.
- -mportable-runtime
- استفاده از قراردادهای فراخوانی پرتابل (قابلحمل) پیشنهاد شده توسط HP برای سیستمهای ELF.
- -mschedule=cpu-type
- زمانبندی کد طبق محدودیتهای تعیینشده برای نوع ماشین cpu-type. گزینههای انتخابی برای cpu-type عبارتند از 700، 7100، 7100LC، 7200، 7300 و 8000. برای تعیین گزینهٔ زمانبندی مناسب برای ماشین خود، به فایل /usr/lib/sched.models در یک سیستم HP-UX مراجعه کنید. زمانبندی پیشفرض 8000 است.
- -msio
- تولید پیشتعریف "_SIO" برای ورودی/خروجی (IO) سرور. پیشفرض -mwsio است. این گزینه پیشتعریفهای "__hp9000s700"، "__hp9000s700__" و "_WSIO" را برای ورودی/خروجی ایستگاه کاری (workstation) تولید میکند. این گزینهها تحت HP-UX و HI-UX در دسترس هستند.
- -msoft-float
- تولید
خروجی حاوی
فراخوانیهای
کتابخانهای
برای
محاسبات
ممیز شناور.
هشدار:
کتابخانههای
مورد نیاز
برای تمام
مقصدهای HPPA
در دسترس
نیستند.
معمولاً از
امکانات
کامپایلر C
مرسوم
ماشین
استفاده
میشود،
اما این کار
را
نمیتوان
مستقیماً
در کامپایل
متقاطع (cross-compilation)
انجام داد.
باید
تمهیدات
لازم را
برای فراهم
کردن توابع
کتابخانهای
مناسب برای
کامپایل
متقاطع در
نظر بگیرید.
گزینهٔ -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"، و فایل راهانداز unix95.o را فراهم میآورد. -munix=98 پیشتعریفهای اضافی برای "_XOPEN_UNIX"، "_XOPEN_SOURCE_EXTENDED"، "_INCLUDE__STDC_A1_SOURCE" و "_INCLUDE_XOPEN_SOURCE_500"، و فایل راهانداز unix98.o را ارائه میدهد.
مهم است بدانید که این گزینه رابطهای روتینهای مختلف کتابخانه را تغییر میدهد. همچنین بر رفتار عملیاتی کتابخانهٔ C تأثیر میگذارد. از این رو، در استفاده از این گزینه به دقت و احتیاط فراوان نیاز است.
کد کتابخانهای که قصد دارد با بیش از یک استاندارد UNIX کار کند باید متغیر "__xpg4_extended_mask" را بر حسب نیاز بررسی، مقداردهی و بازیابی کند. بیشتر نرمافزارهای GNU چنین قابلیتی را ارائه نمیدهند.
- -nolibdld
- جلوگیری از تولید گزینههای پیوند برای جستجوی libdld.sl هنگامی که گزینهٔ -static در HP-UX 10 و جدیدتر مشخص شده باشد.
- -static
- پیادهسازی
setlocale در libc روی HP-UX
به libdld.sl
وابسته است.
نسخهٔ
آرشیوی از
libdld.sl وجود
ندارد.
بنابراین،
هنگامی که
گزینهٔ -static
مشخص
میشود،
گزینههای
پیوند خاصی
برای رفع
این
وابستگی
مورد نیاز
است.
در HP-UX 10 و جدیدتر، در صورت مشخص بودن گزینهٔ -static، گردانندهٔ GCC گزینههای لازم برای پیوند با libdld.sl را اضافه میکند. این امر موجب میشود باینری حاصل پویا (dynamic) باشد. در پورت ۶۴ بیتی، پیونددهندهها در هر صورت بهطور پیشفرض باینریهای پویا تولید میکنند. از گزینهٔ -nolibdld میتوان برای جلوگیری از اضافه کردن این گزینههای پیوند توسط گردانندهٔ GCC استفاده کرد..IP -threads 4 پشتیبانی از چندنخی (multithreading) با کتابخانهٔ dce thread در HP-UX را اضافه میکند. این گزینه پرچمهایی را هم برای پیشپردازنده و هم برای پیونددهنده تنظیم میکند.
گزینههای IA-64
اینها گزینههای -m هستند که برای معماری Intel IA-64 تعریف شدهاند.
- -mbig-endian
- تولید کد برای یک مقصد big-endian. این حالت پیشفرض برای HP-UX است.
- -mlittle-endian
- تولید کد برای یک مقصد little-endian. این حالت پیشفرض برای AIX5 و GNU/Linux است.
- -mgnu-as
- -mno-gnu-as
- تولید (یا عدم تولید) کد برای اسمبلر گنو (GNU assembler). این حالت پیشفرض است.
- -mgnu-ld
- -mno-gnu-ld
- تولید (یا عدم تولید) کد برای پیونددهندهٔ گنو (GNU linker). این حالت پیشفرض است.
- -mno-pic
- تولید کدی که از ثبات اشارهگر سراسری (global pointer register) استفاده نمیکند. خروجی کدی مستقل از موقعیت نبوده و با ABI در IA-64 مغایرت دارد.
- -mvolatile-asm-stop
- -mno-volatile-asm-stop
- تولید (یا عدم تولید) یک بیت توقف (stop bit) بلافاصله پیش و پس از دستورات volatile asm.
- -mregister-names
- -mno-register-names
- تولید (یا عدم تولید) نامهای ثبات in، loc و out برای ثباتهای پشتهای (stacked registers). این کار ممکن است خروجی اسمبلر را خواناتر کند.
- -mno-sdata
- -msdata
- غیرفعال (یا فعال) کردن بهینهسازیهایی که از بخش دادههای کوچک (small data section) استفاده میکنند. این گزینه ممکن است برای دور زدن اشکالات بهینهساز کارآمد باشد.
- -mconstant-gp
- تولید کدی که از یک مقدار ثابت منفرد برای اشارهگر سراسری استفاده میکند. این گزینه هنگام کامپایل کردن کد هسته مفید است.
- -mauto-pic
- تولید کدی که خودمکانیاب (self-relocatable) باشد. این گزینه مستلزم -mconstant-gp است و هنگام کامپایل کد سفتافزار (firmware) کاربرد دارد.
- -minline-float-divide-min-latency
- تولید کد برای تقسیمهای درونخطی (inline) مقادیر ممیز شناور با استفاده از الگوریتم کمترین تأخیر.
- -minline-float-divide-max-throughput
- تولید کد برای تقسیمهای درونخطی مقادیر ممیز شناور با استفاده از الگوریتم بیشترین توان عملیاتی.
- -mno-inline-float-divide
- عدم تولید کد درونخطی برای تقسیمهای مقادیر ممیز شناور.
- -minline-int-divide-min-latency
- تولید کد برای تقسیمهای درونخطی مقادیر عدد صحیح با استفاده از الگوریتم کمترین تأخیر.
- -minline-int-divide-max-throughput
- تولید کد برای تقسیمهای درونخطی مقادیر عدد صحیح با استفاده از الگوریتم بیشترین توان عملیاتی.
- -mno-inline-int-divide
- عدم تولید کد درونخطی برای تقسیم مقادیر عدد صحیح.
- -minline-sqrt-min-latency
- تولید کد برای ریشهٔ دوم (جذر) درونخطی با استفاده از الگوریتم کمترین تأخیر.
- -minline-sqrt-max-throughput
- تولید کد برای ریشهٔ دوم (جذر) درونخطی با استفاده از الگوریتم بیشترین توان عملیاتی.
- -mno-inline-sqrt
- عدم تولید کد درونخطی برای "sqrt".
- -mfused-madd
- -mno-fused-madd
- تولید (یا عدم تولید) کدی که از دستورالعملهای ادغامشدهٔ ضرب/جمع یا ضرب/تفریق استفاده میکند. پیشفرض، استفاده از این دستورالعملها است.
- -mno-dwarf2-asm
- -mdwarf2-asm
- عدم تولید (یا تولید) کد اسمبلی برای اطلاعات اشکالزدایی شماره خط DWARF. این گزینه ممکن است هنگام استفاده نکردن از اسمبلر گنو مفید باشد.
- -mearly-stop-bits
- -mno-early-stop-bits
- اجازه میدهد بیتهای توقف زودتر از موقعیت بلافاصله پیش از دستورالعملی که بیت توقف را فعال کرده، قرار گیرند. این ویژگی میتواند زمانبندی دستورالعملها را بهبود بخشد، اما همواره اینطور نیست.
- -mfixed-range=register-range
- تولید کد با در نظر گرفتن بازهٔ ثباتهای دادهشده به عنوان ثباتهای ثابت (fixed). ثبات ثابت ثباتی است که تخصیصدهندهٔ ثبات (register allocator) نمیتواند از آن استفاده کند. این ویژگی هنگام کامپایل کد هسته کاربرد دارد. بازهٔ ثبات به صورت دو ثبات که با یک خط پیوند از یکدیگر جدا شدهاند تعیین میشود. میتوان چندین بازهٔ ثبات را با کاما جدا کرد.
- -mtls-size=tls-size
- تعیین اندازهٔ بیت آفستهای بیواسطهٔ TLS. مقادیر معتبر 14، 22 و 64 هستند.
- -mtune=cpu-type
- تنظیم دقیق زمانبندی دستورالعملها برای یک پردازندهٔ خاص. مقادیر معتبر عبارتند از: itanium، itanium1، merced، itanium2 و mckinley.
- -milp32
- -mlp64
- تولید کد برای یک محیط ۳۲بیتی یا ۶۴بیتی. محیط ۳۲بیتی، int، long و pointer را روی ۳۲ بیت تنظیم میکند. محیط ۶۴بیتی، int را روی ۳۲ بیت و long و pointer را روی ۶۴ بیت تنظیم میکند. این پرچمها مختص HP-UX هستند.
- -mno-sched-br-data-spec
- -msched-br-data-spec
- (غیر)فعالسازی زمانبندی حدسی دادهها پیش از reload. این امر منجر به تولید دستورالعملهای "ld.a" و دستورالعملهای بررسی متناظر ("ld.c" / "chk.a") میشود. تنظیم پیشفرض غیرفعال است.
- -msched-ar-data-spec
- -mno-sched-ar-data-spec
- (فعال/غیرفعال)سازی زمانبندی حدسی دادهها پس از reload. این امر منجر به تولید دستورالعملهای "ld.a" و دستورالعملهای بررسی متناظر ("ld.c" / "chk.a") میشود. تنظیم پیشفرض فعال است.
- -mno-sched-control-spec
- -msched-control-spec
- (غیر)فعالسازی زمانبندی حدسی کنترلی. این قابلیت فقط در حین زمانبندی ناحیهای (یعنی پیش از reload) در دسترس است. این امر منجر به تولید دستورالعملهای "ld.s" و دستورالعملهای بررسی متناظر "chk.s" میشود. تنظیم پیشفرض غیرفعال است..IP -msched-br-in-data-spec 4
- -mno-sched-br-in-data-spec
- فعال یا غیرفعال کردن زمانبندی حدسی دستورالعملهایی که پیش از بارگذاری مجدد (reload) به بارگذاریهای حدسی داده وابستهاند. این گزینه تنها در صورت فعال بودن -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
- تولید بررسیها برای حدس کنترلی در زمانبندی گزینشی (selective scheduling). این پرچم بهطور پیشفرض غیرفعال است.
- -msched-max-memory-insns=max-insns
- محدود کردن تعداد دستورالعملهای حافظه در هر گروه دستورالعمل، و اختصاص اولویت پایینتر به دستورالعملهای حافظه بعدی که تلاش میکنند در همان گروه دستورالعمل زمانبندی شوند. این گزینه معمولاً برای جلوگیری از تداخل درگاههای حافظهٔ نهان (cache bank conflicts) کاربرد دارد. مقدار پیشفرض 1 است.
- -msched-max-memory-insns-hard-limit
- محدودیت تعیینشده توسط msched-max-memory-insns را به یک محدودیت سخت (hard limit) تبدیل میکند، و اجازهٔ قرارگیری بیش از آن تعداد را در یک گروه دستورالعمل نمیدهد. در غیر این صورت، محدودیت «نرم» (soft) خواهد بود، به این معنی که با رسیدن به حد تعیینشده، عملیات غیرحافظهای ترجیح داده میشوند، اما عملیات حافظهای همچنان ممکن است زمانبندی شوند.
گزینههای 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
- نوع پردازندهٔ محلی شناساییشده توسط کامپایلر بومی.
- loongarch64
- پردازندهٔ عمومی ۶۴ بیتی LoongArch.
- la464
- پردازندهٔ مبتنی بر LA464 در LoongArch به همراه LSX و LASX.
- la664
- پردازندهٔ مبتنی بر LA664 در LoongArch به همراه LSX، LASX و تمام دستورالعملهای LoongArch v1.1.
- la64v1.0
- معماری LoongArch64 ISA نسخهٔ 1.0.
- la64v1.1
- معماری LoongArch64 ISA نسخهٔ 1.1.
اطلاعات بیشتر دربارهٔ نسخههای LoongArch ISA را میتوان در https://github.com/loongson/la-toolchain-conventions یافت.
- -mtune=tune-type
- بهینهسازی
کد
تولیدشده
برای مقصد
پردازندهٔ
مشخصشده.
گزینههای انتخابی برای tune-type عبارتاند از:
- native
- نوع پردازندهٔ محلی شناساییشده توسط کامپایلر بومی.
- generic
- پردازندهٔ عمومی LoongArch.
- loongarch64
- پردازندهٔ عمومی ۶۴ بیتی LoongArch.
- la464
- هستهٔ LA464 در LoongArch.
- la664
- هستهٔ LA664 در LoongArch.
- -mabi=base-abi-type
- تولید کد برای قرارداد فراخوانی (calling convention) مشخصشده. base-abi-type میتواند یکی از موارد زیر باشد:
- lp64d
- برای ارسال پارامترها از ثباتهای همهمنظورهٔ ۶۴ بیتی و ثباتهای ممیز شناور ۳۲/۶۴ بیتی استفاده میکند. مدل داده LP64 است، که در آن int برابر ۳۲ بیت و long int و اشارهگرها ۶۴ بیت هستند..IP lp64f 4 استفاده از ثباتهای همهمنظورهٔ ۶۴ بیتی و ثباتهای ممیز شناور ۳۲ بیتی برای ارسال پارامترها. مدل داده LP64 است، که در آن int برابر ۳۲ بیت، و long int و اشارهگرها ۶۴ بیت هستند.
- lp64s
- استفاده از ثباتهای همهمنظورهٔ ۶۴ بیتی و بدون ثباتهای ممیز شناور برای ارسال پارامترها. مدل داده LP64 است، که در آن int برابر ۳۲ بیت، و long int و اشارهگرها ۶۴ بیت هستند.
- -mfpu=fpu-type
- تولید کد برای نوع FPU مشخصشده، که میتواند یکی از موارد زیر باشد:
- 64
- اجازه به استفاده از دستورالعملهای سختافزاری ممیز شناور برای عملیات ۳۲ بیتی و ۶۴ بیتی.
- 32
- اجازه به استفاده از دستورالعملهای سختافزاری ممیز شناور برای عملیات ۳۲ بیتی.
- none
- 0
- جلوگیری از استفاده از دستورالعملهای سختافزاری ممیز شناور.
- -msimd=simd-type
- فعالسازی تولید دستورالعملهای LoongArch SIMD برای برداریسازی (vectorization) و از طریق توابع توکار (builtin). مقدار میتواند یکی از موارد زیر باشد:
- -msoft-float
- گزینهٔ -mfpu=none را اجبار کرده و از استفاده از ثباتهای ممیز شناور برای ارسال پارامترها جلوگیری میکند. این گزینه ممکن است ABI هدف را تغییر دهد.
- -msingle-float
- گزینهٔ -mfpu=32 را اجبار کرده و اجازهٔ استفاده از ثباتهای ممیز شناور ۳۲ بیتی را برای ارسال پارامترها میدهد. این گزینه ممکن است ABI هدف را تغییر دهد.
- -mdouble-float
- گزینهٔ -mfpu=64 را اجبار کرده و اجازهٔ استفاده از ثباتهای ممیز شناور ۳۲/۶۴ بیتی را برای ارسال پارامترها میدهد. این گزینه ممکن است ABI هدف را تغییر دهد.
- -mlasx
- -mno-lasx
- -mlsx
- -mno-lsx
- تنظیم فزایندهٔ دامنهٔ افزونههای SIMD (شامل none / LSX / LASX) که میتوانند توسط کامپایلر برای تولید کد استفاده شوند. فعالسازی LASX با mlasx بهطور خودکار LSX را فعال میکند، و غیرفعالسازی LSX با mno-lsx بهطور خودکار LASX را غیرفعال میسازد. این گزینههای ویژهٔ راهانداز (driver-only) بر وضعیت نهایی پیکربندی msimd اثر گذاشته و تغییرات را به همان ترتیبی که در خط فرمان راهانداز GCC ظاهر میشوند اعمال میکنند، و در نتیجه گزینهٔ نهایی و استانداردشدهٔ msimd را که به خود کامپایلر ارسال میشود به دست میآورند.
- -mbranch-cost=n
- هزینهٔ انشعابها را تقریباً برابر با n دستورالعمل تعیین میکند.
- -maddr-reg-reg-cost=n
- هزینهٔ ADDRESS_REG_REG را روی مقدار محاسبهشده توسط n تنظیم میکند.
- -mcheck-zero-division
- -mno-check-zero-divison
- ایجاد تله (عدم ایجاد تله) در صورت تقسیم عدد صحیح بر صفر. پیشفرض برای -O0 یا -Og برابر -mcheck-zero-division و برای سایر سطوح بهینهسازی -mno-check-zero-division است.
- -mcond-move-int
- -mno-cond-move-int
- انتقالهای شرطی برای دادههای صحیح در ثباتهای همهمنظوره فعال (غیرفعال) میشوند. پیشفرض -mcond-move-int است.
- -mcond-move-float
- -mno-cond-move-float
- انتقالهای شرطی برای ثباتهای ممیز شناور فعال (غیرفعال) میشوند. پیشفرض -mcond-move-float است.
- -mmemcpy
- -mno-memcpy
- اجبار کردن (عدم اجبار) به استفاده از "memcpy" برای انتقالهای بلوکی غیربدیهی. مقدار پیشفرض -mno-memcpy است که به GCC اجازه میدهد اکثر رونوشتهای با اندازهٔ ثابت را درونخطی کند. تنظیم سطح بهینهسازی روی -Os نیز استفاده از "memcpy" را اجبار میکند، اما در صورت تصریح صریح، -mno-memcpy میتواند این رفتار را صرفنظر از ترتیب این گزینهها در خط فرمان بازنویسی کند.
- -mstrict-align
- -mno-strict-align
- اجتناب یا اجازه به تولید دسترسیهای حافظهای که ممکن است بر اساس توضیحات مشخصات معماری، روی مرز طبیعی شیء تراز نشده باشند. پیشفرض -mno-strict-align است.
- -G num
- دادههای سراسری و ایستا با اندازهٔ کوچکتر از num بایت را در یک بخش دادههای کوچک (small data section) قرار میدهد. مقدار پیشفرض 0 است.
- -mmax-inline-memcpy-size=n
- درونخطی کردن تمام انتقالهای بلوکی (مانند فراخوانیهای "memcpy" یا رونوشتهای ساختار) که کوچکتر یا مساوی با n بایت هستند. مقدار پیشفرض n برابر 1024 است.
- -mcmodel=code-model
- تنظیم مدل کد به یکی از موارد زیر:
- tiny-static (هنوز پیادهسازی نشده)
- tiny (هنوز پیادهسازی نشده)
- normal
- بخش کد (text segment) باید در فضای آدرسدهی 128MB باشد. بخش داده (data segment) باید در فضای آدرسدهی 2GB باشد.
- medium
- بخش کد و بخش داده باید در فضای آدرسدهی 2GB باشند.
- large (هنوز پیادهسازی نشده)
- extreme
- این حالت اندازهٔ بخش کد و بخش داده را محدود نمیکند. گزینهٔ -mcmodel=extreme با -fplt و/یا -mexplicit-relocs=none ناسازگار است.
مدل کد پیشفرض "normal" است.
- -mexplicit-relocs=style
- تعیین زمان استفاده از عملگرهای بازآرایی (relocation operators) اسمبلر هنگام سروکار داشتن با آدرسهای نمادین. راهکار جایگزین استفاده از ماکروهای اسمبلر است، که ممکن است زمانبندی دستورالعملها را محدود کند اما امکان بهینهسازی پیونددهنده (linker relaxation) را فراهم میسازد. با -mexplicit-relocs=none همیشه از ماکروهای اسمبلر استفاده میشود، با -mexplicit-relocs=always همیشه از عملگرهای بازآرایی اسمبلر استفاده میشود، و با -mexplicit-relocs=auto کامپایلر برای بهبود کیفیت کد در جاهایی که linker relaxation غیرممکن باشد از عملگرهای بازآرایی و در سایر نقاط از ماکروها استفاده میکند. مقدار پیشفرض این گزینه بر اساس قابلیتهای اسمبلر شناساییشده در زمان ساخت GCC و تنظیمات -mrelax تعیین میشود: -mexplicit-relocs=none اگر اسمبلر اصلاً از عملگرهای بازآرایی پشتیبانی نکند، -mexplicit-relocs=always اگر اسمبلر از عملگرهای بازآرایی پشتیبانی کند اما -mrelax فعال نباشد، و -mexplicit-relocs=auto اگر اسمبلر از عملگرهای بازآرایی پشتیبانی کند و -mrelax فعال باشد..IP -mexplicit-relocs 4 نام مستعاری برای -mexplicit-relocs=always جهت سازگاری با نسخههای پیشین.
- -mno-explicit-relocs
- نام مستعاری برای -mexplicit-relocs=none جهت سازگاری با نسخههای پیشین.
- -mdirect-extern-access
- -mno-direct-extern-access
- عدم
استفاده یا
استفاده از
GOT برای
دسترسی به
نمادهای
خارجی.
پیشفرض
-mno-direct-extern-access است: GOT
برای
نمادهای
خارجی با
نمایانی
پیشفرض
استفاده
میشود،
ولی برای
سایر
نمادهای
خارجی به
کار
نمیرود.
با -mdirect-extern-access، از GOT استفاده نمیشود و همهٔ نمادهای خارجی بهصورت PC-relative آدرسدهی میشوند. این گزینه تنها برای محیطهایی مناسب است که در آنها هیچ پیوند پویایی انجام نمیشود، مانند سفتافزارها، هستههای سیستمعامل، و فایلهای اجرایی پیوند دادهشده با -static یا -static-pie. گزینهٔ -mdirect-extern-access با -fPIC یا -fpic سازگار نیست.
- -mrelax
- -mno-relax
- بهرهگیری از (یا عدم بهرهگیری از) بهینهسازیهای تطبیقی پیونددهنده (linker relaxations). اگر -mpass-mrelax-to-as فعال باشد، این گزینه به اسمبلر نیز ارسال میشود. حالت پیشفرض در زمان ساخت GCC با تشخیص پشتیبانی اسمبلر مربوطه تعیین میشود: اگر اسمبلر هم از گزینهٔ -mrelax و هم از بهینهسازی تطبیقی شاخههای شرطی پشتیبانی کند، -mrelax (این مورد لازم است، زیرا در غیر این صورت دستورالعملهای ".align" و دستورهای شاخه شرطی در کد اسمبلی خروجی GCC ممکن است به دلیل سرریز بازنشانی (relocation overflow) توسط اسمبلر رد شوند)، و در غیر این صورت -mno-relax خواهد بود.
- -mpass-mrelax-to-as
- -mno-pass-mrelax-to-as
- ارسال (یا عدم ارسال) گزینهٔ -mrelax یا -mno-relax به اسمبلر. حالت پیشفرض در زمان ساخت GCC با بررسی پشتیبانی اسمبلر مربوطه تعیین میشود: اگر اسمبلر از گزینهٔ -mrelax پشتیبانی کند، -mpass-mrelax-to-as و در غیر این صورت -mno-pass-mrelax-to-as خواهد بود. این گزینه بیشتر برای اشکالزدایی یا تعامل با اسمبلرهایی متفاوت با اسمبلر زمان ساخت کاربرد دارد.
- -mrecip
- این گزینه استفاده از دستورالعملهای برآورد معکوس و برآورد ریشهٔ دوم معکوس را با گامهای افزودهٔ نیوتن-رافسون جهت افزایش دقت به جای انجام تقسیم یا جذر و تقسیم برای آرگومانهای ممیز شناور فعال میکند. این دستورالعملها تنها زمانی تولید میشوند که -funsafe-math-optimizations همراه با -ffinite-math-only و -fno-trapping-math فعال باشد. این گزینه بهطور پیشفرض غیرفعال است. پیش از استفاده از این گزینه، باید مطمئن شوید که پردازندهٔ مقصد از دستورهای frecipe و frsqrte پشتیبانی میکند. توجه داشته باشید اگرچه توان عملیاتی (throughput) این توالی بالاتر از توان عملیاتی دستور غیرمعکوس است، اما دقت توالی میتواند تا ۲ ulp کاهش یابد (به عنوان مثال، معکوس 1.0 برابر با 0.99999994 میشود).
- -mrecip=opt
- این گزینه کنترل میکند کدام دستورالعملهای برآورد معکوس مجاز به استفاده هستند. opt فهرستی از گزینهها است که با کاما از هم جدا شدهاند، و میتواند با علامت ! برای نقیض کردن گزینه همراه باشد:
- all
- فعالسازی همهٔ دستورالعملهای برآورد.
- default
- فعالسازی دستورالعملهای پیشفرض، معادل با -mrecip.
- none
- غیرفعالسازی همهٔ دستورالعملهای برآورد، معادل با -mno-recip.
- div
- فعالسازی تقریب برای تقسیم اسکالر.
- vec-div
- فعالسازی تقریب برای تقسیم برداری.
- sqrt
- فعالسازی تقریب برای ریشهٔ دوم اسکالر.
- vec-sqrt
- فعالسازی تقریب برای ریشهٔ دوم برداری.
- rsqrt
- فعالسازی تقریب برای ریشهٔ دوم معکوس اسکالر.
- vec-rsqrt
- فعالسازی تقریب برای ریشهٔ دوم معکوس برداری.
بنابراین، برای مثال، -mrecip=all,!sqrt همهٔ تقریبهای معکوس را به جز ریشهٔ دوم اسکالر فعال میکند.
- -mfrecipe
- -mno-frecipe
- استفاده از (یا عدم استفاده از) دستورالعملهای "frecipe.{s/d}" و "frsqrte.{s/d}". هنگام ساخت با -march=la664، بهطور پیشفرض فعال است. حالت پیشفرض -mno-frecipe است.
- -mdiv32
- -mno-div32
- استفاده از (یا عدم استفاده از) دستورالعملهای "div.w[u]" و "mod.w[u]" با ورودیهایی که گسترش علامت نیافتهاند. هنگام ساخت با -march=la664، بهطور پیشفرض فعال است. حالت پیشفرض -mno-div32 است.
- -mlam-bh
- -mno-lam-bh
- استفاده از (یا عدم استفاده از) دستورالعملهای "am{swap/add}[_db].{b/h}". هنگام ساخت با -march=la664، بهطور پیشفرض فعال است. حالت پیشفرض -mno-lam-bh است.
- -mlamcas
- -mno-lamcas
- استفاده از (یا عدم استفاده از) دستورالعملهای "amcas[_db].{b/h/w/d}". هنگام ساخت با -march=la664، بهطور پیشفرض فعال است. حالت پیشفرض -mno-lamcas است.
- -mld-seq-sa
- -mno-ld-seq-sa
- تعیین اینکه آیا به یک سد بارگذاری-بارگذاری همآدرس ("dbar 0x700") نیاز است یا خیر. هنگام ساخت با -march=la664، بهطور پیشفرض فعال است. حالت پیشفرض -mno-ld-seq-sa است، که یعنی به سد بارگذاری-بارگذاری نیاز است.
- -mtls-dialect=opt
- این گزینه مشخص میکند کدام گویش TLS برای مدلهای TLS پویا عمومی (general dynamic) و پویا محلی (local dynamic) مجاز به استفاده است.
- -mannotate-tablejump
- -mno-annotate-tablejump
- ایجاد یک بخش حاشیهنویسی ".discard.tablejump_annotate" جهت مرتبط ساختن دستورالعمل "jirl" و جدول پرش، زمانی که از یک جدول پرش برای بهینهسازی عبارت "switch" استفاده میشود. برخی از ابزارهای خارجی، برای نمونه objtool در سیستم ساخت هسته لینوکس، برای تحلیل جریان کنترل به این حاشیهنویسی نیاز دارند. حالت پیشفرض -mno-annotate-tablejump است.
- --param loongarch-vect-unroll-limit=n
- بردارساز (vectorizer) از اطلاعات بهینهسازی موجود برای تشخیص اینکه آیا باز کردن حلقهٔ برداری اصلی سودمند است و تا چه میزان، استفاده خواهد کرد. این پارامتر کران بالای میزان باز کردن حلقهٔ اصلی توسط بردارساز را تعیین میکند. مقدار پیشفرض شش است..PP گزینههای M32C
- -mcpu=name
- پردازندهای را که کد برای آن تولید میشود انتخاب میکند. name میتواند یکی از مقادیر r8c برای سری R8C/Tiny، m16c برای سری M16C (تا /60)، m32cm برای سری M16C/80، یا m32c برای سری M32C/80 باشد.
- -msim
- مشخص میکند که برنامه روی شبیهساز اجرا خواهد شد. این گزینه باعث پیوند خوردن یک کتابخانهٔ زمان اجرای جایگزین میشود که برای مثال از I/O فایل پشتیبانی میکند. هنگام تولید برنامههایی که قرار است روی سختافزار واقعی اجرا شوند نباید از این گزینه استفاده کنید؛ باید برای هر تابع I/O که نیاز است، کتابخانهٔ زمان اجرای اختصاصی خودتان را ارائه دهید.
- -memregs=number
- تعداد شبهثباتهای مبتنی بر حافظه را که GCC هنگام تولید کد استفاده میکند مشخص میسازد. این شبهثباتها مانند ثباتهای واقعی به کار میروند، بنابراین تعادلی میان توانایی GCC در جا دادن کد در ثباتهای موجود و افت کاراییِ ناشی از بهکارگیری حافظه به جای ثباتها برقرار است. توجه داشته باشید که تمام ماژولها در یک برنامه باید با مقداری یکسان برای این گزینه کامپایل شوند. به همین دلیل، نباید از این گزینه همراه با کتابخانههای زمان اجرای پیشفرض GCC استفاده کنید.
گزینههای M32R/D
این گزینههای -m برای معماریهای Renesas M32R/D تعریف شدهاند:
- -m32r2
- تولید کد برای M32R/2.
- -m32rx
- تولید کد برای M32R/X.
- -m32r
- تولید کد برای M32R. این حالت پیشفرض است.
- -mmodel=small
- فرض میکند
تمام اشیاء
در ۱۶
مگابایت
پایینی
حافظه قرار
دارند (به
طوری که
آدرس آنها
بتواند با
دستورالعمل
"ld24"
بارگذاری
شود)، و فرض
میکند
تمام
زیرروالها
با
دستورالعمل
"bl" در
دسترس
هستند. این
حالت
پیشفرض
است.
قابلیت آدرسدهی یک شیء خاص را میتوان با مشخصهٔ "model" تعیین کرد.
- -mmodel=medium
- فرض میکند اشیاء ممکن است در هر کجای فضای آدرسدهی ۳۲ بیتی باشند (کامپایلر دستورالعملهای "seth/add3" را برای بارگذاری آدرس آنها تولید میکند)، و فرض میکند تمام زیرروالها با دستورالعمل "bl" در دسترس هستند.
- -mmodel=large
- فرض میکند اشیاء ممکن است در هر کجای فضای آدرسدهی ۳۲ بیتی باشند (کامپایلر دستورالعملهای "seth/add3" را برای بارگذاری آدرس آنها تولید میکند)، و فرض میکند ممکن است زیرروالها با دستورالعمل "bl" در دسترس نباشند (کامپایلر توالی دستورالعملهای بسیار کُندتر "seth/add3/jl" را تولید میکند).
- -msdata=none
- استفاده از
ناحیهٔ
دادههای
کوچک (small data area) را
غیرفعال
میکند.
متغیرها در
یکی از
بخشهای
".data"،
".bss"، یا
".rodata"
قرار
میگیرند
(مگر اینکه
مشخصهٔ
"section"
تعیین شده
باشد). این
حالت
پیشفرض
است.
ناحیهٔ دادههای کوچک شامل بخشهای ".sdata" و ".sbss" است. اشیاء را میتوان با استفاده از مشخصهٔ "section" با بهکارگیری یکی از این بخشها، بهطور صریح در ناحیهٔ دادههای کوچک قرار داد.
- -msdata=sdata
- دادههای سراسری و ایستای (static) کوچک را در ناحیهٔ دادههای کوچک قرار میدهد، اما کد خاصی برای ارجاع به آنها تولید نمیکند.
- -msdata=use
- دادههای سراسری و ایستای کوچک را در ناحیهٔ دادههای کوچک قرار میدهد، و دستورالعملهای خاصی برای ارجاع به آنها تولید میکند.
- -G num
- اشیاء
سراسری و
ایستایی را
که کمتر یا
مساوی با num
بایت
هستند، به
جای
بخشهای
عادی data یا BSS،
در بخشهای
دادههای
کوچک یا BSS
قرار
میدهد.
مقدار
پیشفرض num
برابر ۸
است. گزینهٔ
-msdata باید روی
یکی از
مقادیر sdata
یا use تنظیم
شده باشد تا
این گزینه
هیچ اثری
داشته باشد.
تمام ماژولها باید با مقدار یکسان -G num کامپایل شوند. کامپایل با مقادیر متفاوت num ممکن است کار کند یا نکند؛ اگر کار نکند، پیونددهنده یک پیام خطا میدهد---کد نادرست تولید نمیشود.
- -mdebug
- باعث میشود کد مخصوص M32R در کامپایلر، آمارهایی را نمایش دهد که ممکن است در اشکالزدایی برنامهها مفید باشد.
- -malign-loops
- تمام حلقهها را در مرز ۳۲ بایتی تراز میکند.
- -mno-align-loops
- تراز ۳۲ بایتی را برای حلقهها اجباری نمیکند. این حالت پیشفرض است.
- -missue-rate=number
- در هر چرخه number دستورالعمل صادر میکند. number تنها میتواند ۱ یا ۲ باشد.
- -mbranch-cost=number
- number تنها میتواند ۱ یا ۲ باشد. اگر ۱ باشد، پرشها (branches) بر کدهای شرطی ترجیح داده میشوند؛ اگر ۲ باشد، عکس آن اعمال میشود.
- -mflush-trap=number
- شمارهٔ تلهای (trap) را که برای تخلیهٔ کَش استفاده میشود مشخص میکند. مقدار پیشفرض ۱۲ است. اعداد معتبر بین ۰ و ۱۵ (شامل خود آنها) هستند.
- -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 عبارتند از: 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
- 52235 : 52230 52231 52232 52233 52234 52235
- 5225 : 5224 5225
- 52259 : 52252 52254 52255 52256 52258 52259
- 5235 : 5232 5233 5234 5235 523x
- 5250 : 5250
- 5271 : 5270 5271
- 5272 : 5272
- 5275 : 5274 5275
- 5282 : 5280 5281 5282 528x
- 53017 : 53011 53012 53013 53014 53015 53016 53017
- 5307 : 5307
- 5329 : 5327 5328 5329 532x
- 5373 : 5372 5373 537x
- 5407 : 5407
- 5475 : 5470 5471 5472 5473 5474 5475 547x 5480 5481 5482 5483 5484 5485
-mcpu=cpu در صورتی که arch با cpu سازگار باشد، -march=arch را بازنویسی میکند. سایر ترکیبهای -mcpu و -march رد میشوند.
کامپایلر GCC هنگامی که مقصد ColdFire با عنوان cpu انتخاب شده باشد، ماکروی "__mcf_cpu_cpu" را تعریف میکند. همچنین "__mcf_family_family" را تعریف میکند، که در آن مقدار family با جدول بالا مشخص میشود.
- -mtune=tune
- کد را برای
یک
ریزمعماری
خاص، در
چارچوب
محدودیتهای
تعیینشده
توسط -march و -mcpu
بهینهسازی
میکند.
ریزمعماریهای
M680x0 عبارتند
از: 68000، 68010،
68020، 68030، 68040،
68060 و cpu32.
ریزمعماریهای
ColdFire عبارتند
از: cfv1، cfv2،
cfv3، cfv4 و cfv4e.
همچنین میتوانید از -mtune=68020-40 برای کدی که باید بهطور نسبتاً مطلوب روی مقصدهای 68020، 68030 و 68040 اجرا شود استفاده کنید. -mtune=68020-60 مشابه است اما مقصدهای 68060 را نیز شامل میشود. این دو گزینه به ترتیب همان تصمیمات بهینهسازی -m68020-40 و -m68020-60 را انتخاب میکنند.
هنگام بهینهسازی برای معماری 680x0 با عنوان arch، کامپایلر GCC ماکروهای "__mcarch" و "__mcarch__" را تعریف میکند. همچنین "mcarch" را تعریف میکند مگر اینکه گزینهٔ -ansi یا یک گزینهٔ غیر گنو -std استفاده شده باشد. اگر GCC در حال بهینهسازی برای محدودهای از معماریها باشد، همانطور که توسط -mtune=68020-40 یا -mtune=68020-60 انتخاب میشود، ماکروها را برای تکتک معماریهای موجود در آن محدوده تعریف میکند.
کامپایلر GCC همچنین ماکروی "__muarch__" را هنگام بهینهسازی برای ریزمعماری ColdFire با عنوان uarch تعریف میکند، که در آن uarch یکی از آرگومانهای ذکرشده در بالا است.
- -m68000
- -mc68000
- تولید
خروجی برای
68000. این حالت
پیشفرض
است هنگامی
که
کامپایلر
برای
سیستمهای
مبتنی بر 68000
پیکربندی
شده باشد.
این گزینه
معادل -march=68000
است.
از این گزینه برای میکروکنترلرهای دارای یک هستهٔ 68000 یا EC000 استفاده کنید، از جمله 68008، 68302، 68306، 68307، 68322، 68328 و 68356.
- -m68010
- تولید خروجی برای 68010. این حالت پیشفرض است هنگامی که کامپایلر برای سیستمهای مبتنی بر 68010 پیکربندی شده باشد. این گزینه معادل -march=68010 است.
- -m68020
- -mc68020
- تولید خروجی برای 68020. این حالت پیشفرض است هنگامی که کامپایلر برای سیستمهای مبتنی بر 68020 پیکربندی شده باشد. این گزینه معادل -march=68020 است.
- -m68030
- تولید خروجی برای 68030. این حالت پیشفرض است هنگامی که کامپایلر برای سیستمهای مبتنی بر 68030 پیکربندی شده باشد. این گزینه معادل -march=68030 است.
- -m68040
- تولید
خروجی برای
68040. این حالت
پیشفرض
است هنگامی
که
کامپایلر
برای
سیستمهای
مبتنی بر 68040
پیکربندی
شده باشد.
این گزینه
معادل -march=68040
است.
این گزینه از بهکارگیری دستورالعملهای 68881/68882 که باید روی 68040 بهصورت نرمافزاری شبیهسازی شوند جلوگیری میکند. اگر 68040 شما کدی برای شبیهسازی آن دستورالعملها ندارد، از این گزینه استفاده کنید.
- -m68060
- تولید
خروجی برای
68060. این حالت
پیشفرض
است هنگامی
که
کامپایلر
برای
سیستمهای
مبتنی بر 68060
پیکربندی
شده باشد.
این گزینه
معادل -march=68060
است.
این گزینه از بهکارگیری دستورالعملهای 68020 و 68881/68882 که باید روی 68060 بهصورت نرمافزاری شبیهسازی شوند جلوگیری میکند. اگر 68060 شما کدی برای شبیهسازی آن دستورالعملها ندارد، از این گزینه استفاده کنید.
- -mcpu32
- تولید
خروجی برای
یک CPU32. این
پیشفرض
است هنگامی
که
کامپایلر
برای
سیستمهای
مبتنی بر CPU32
پیکربندی
شده باشد.
این معادل
-march=cpu32 است.
از این گزینه برای میکروکنترلرهای دارای هستهٔ CPU32 یا CPU32+ استفاده کنید، از جمله 68330، 68331، 68332، 68333، 68334، 68336، 68340، 68341، 68349 و 68360.
- -m5200
- تولید
خروجی برای
یک
پردازندهٔ
ColdFire 520X. این حالت
پیشفرض
است هنگامی
که
کامپایلر
برای
سیستمهای
مبتنی بر 520X
پیکربندی
شده باشد.
این گزینه
معادل -mcpu=5206
است و اکنون
به نفع آن
گزینه
منسوخ شده
است.
از این گزینه برای میکروکنترلرهای دارای هستهٔ 5200 استفاده کنید، از جمله MCF5202، MCF5203، MCF5204 و MCF5206.
- -m5206e
- تولید خروجی برای یک پردازندهٔ ColdFire 5206e. این گزینه اکنون به نفع گزینهٔ معادل -mcpu=5206e منسوخ شده است.
- -m528x
- تولید خروجی برای یکی از اعضای خانوادهٔ ColdFire 528X. این گزینه اکنون به نفع گزینهٔ معادل -mcpu=528x منسوخ شده است.
- -m5307
- تولید خروجی برای یک پردازندهٔ ColdFire 5307. این گزینه اکنون به نفع گزینهٔ معادل -mcpu=5307 منسوخ شده است.
- -m5407
- تولید خروجی برای یک پردازندهٔ ColdFire 5407. این گزینه اکنون به نفع گزینهٔ معادل -mcpu=5407 منسوخ شده است.
- -mcfv4e
- تولید خروجی برای یک پردازنده از خانوادهٔ ColdFire V4e (مانند 547x/548x). این مورد شامل استفاده از دستورالعملهای سختافزاری ممیز شناور است. این گزینه معادل -mcpu=547x بوده و اکنون به نفع آن گزینه منسوخ شده است.
- -m68020-40
- تولید
خروجی برای
یک 68040، بدون
استفاده از
هیچیک از
دستورالعملهای
جدید. این
کار منجر به
کدی میشود
که
میتواند
با کارایی
نسبتاً
مناسبی روی
یک 68020/68881 یا 68030 یا 68040
اجرا شود.
کد
تولیدشده
از
دستورالعملهای
68881 که روی 68040
شبیهسازی
میشوند
استفاده
میکند.
این گزینه معادل -march=68020 -mtune=68020-40 است.
- -m68020-60
- تولید
خروجی برای
یک 68060، بدون
استفاده از
هیچیک از
دستورالعملهای
جدید. این
کار منجر به
کدی میشود
که
میتواند
با کارایی
نسبتاً
مناسبی روی
یک 68020/68881 یا 68030 یا 68040
اجرا شود.
کد
تولیدشده
از
دستورالعملهای
68881 که روی 68060
شبیهسازی
میشوند
استفاده
میکند.
این گزینه معادل -march=68020 -mtune=68020-60 است.
- -mhard-float
- -m68881
- تولید دستورالعملهای ممیز شناور. این حالت پیشفرض برای 68020 و بالاتر، و برای دستگاههای ColdFire دارای FPU است. این گزینه ماکروی "__HAVE_68881__" را روی مقصدهای M680x0 و "__mcffpu__" را روی مقصدهای ColdFire تعریف میکند.
- -msoft-float
- دستورالعملهای ممیز شناور تولید نمیکند؛ در عوض از فراخوانیهای کتابخانهای استفاده میکند. این حالت پیشفرض برای مقصدهای 68000، 68010 و 68832 است. همچنین برای دستگاههای ColdFire فاقد FPU نیز پیشفرض است..IP -mdiv 4
- -mno-div
- دستورالعملهای
سختافزاری
تقسیم و
باقیمانده
ColdFire را تولید
میکند
(تولید
نمیکند).
اگر -march بدون
-mcpu استفاده
شود، مقدار
پیشفرض
برای
معماریهای
ColdFire فعال («on») و
برای
معماریهای
M680x0 غیرفعال
(«off») است. در
غیر این
صورت،
مقدار
پیشفرض از
پردازندهٔ
مقصد گرفته
میشود
(خواه
پردازندهٔ
پیشفرض
باشد، یا
پردازندهای
که با -mcpu
مشخص شده
است). برای
مثال،
مقدار
پیشفرض
برای -mcpu=5206
غیرفعال
(«off») و برای
-mcpu=5206e فعال («on»)
است.
کامپایلر GCC هنگامی که این گزینه فعال باشد، ماکروی "__mcfhwdiv__" را تعریف میکند.
- -mshort
- نوع دادهٔ "int" را مانند "short int"، با پهنای ۱۶ بیت در نظر میگیرد. علاوه بر این، پارامترهای ارسالشده در پشته (stack) نیز روی یک مرز ۱۶ بیتی تراز میشوند، حتی در مقصدهایی که API آنها ارتقا به ۳۲ بیت را الزامی کرده باشد.
- -mno-short
- نوع دادهٔ "int" را ۱۶ بیتی در نظر نمیگیرد. این حالت پیشفرض است.
- -mnobitfield
- -mno-bitfield
- از دستورالعملهای میدان بیتی (bit-field) استفاده نمیکند. گزینههای -m68000، -mcpu32 و -m5200 مستلزم -mnobitfield هستند.
- -mbitfield
- از دستورالعملهای میدان بیتی استفاده میکند. گزینهٔ -m68020 مستلزم -mbitfield است. اگر از پیکربندی طراحیشده برای 68020 استفاده کنید، این حالت پیشفرض است.
- -mrtd
- از یک
قرارداد
فراخوانی
تابع (calling convention)
متفاوت
استفاده
میکند، که
در آن
توابعی با
تعداد
مشخصی از
آرگومانها
با
دستورالعمل
"rtd"
بازمیگردند؛
این
دستورالعمل
آرگومانهای
آنها را
هنگام
بازگشت از
پشته خارج (pop)
میکند. این
کار یک
دستورالعمل
در
فراخواننده
(caller)
صرفهجویی
میکند،
زیرا در
آنجا نیازی
به خارج
کردن
آرگومانها
نیست.
این قرارداد فراخوانی با قراردادی که بهطور معمول در 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 بهجای استفاده از جدول آفست سراسری (GOT) استفاده میکند. در حال حاضر، این گزینه مستلزم -fpic است که حداکثر یک آفست ۱۶ بیتی را برای آدرسدهی وابسته به pc مجاز میداند. در حال حاضر -fPIC به همراه -mpcrel پشتیبانی نمیشود، هرچند که این امکان میتواند برای پردازندههای 68020 و بالاتر پشتیبانی شود.
- -mno-strict-align
- -mstrict-align
- فرض نمیکند (میکند) که ارجاعات حافظهٔ ترازنشده توسط سیستم مدیریت میشوند.
- -msep-data
- کدی تولید میکند که امکان قرارگیری بخش داده (data segment) در ناحیهای از حافظه متفاوت با بخش کد (text segment) را فراهم میسازد. این کار امکان اجرای درجا (execute-in-place) را در محیطی بدون مدیریت حافظهٔ مجازی میسر میکند. این گزینه مستلزم -fPIC است.
- -mno-sep-data
- کدی تولید میکند که فرض میکند بخش داده در امتداد بخش کد قرار دارد. این حالت پیشفرض است.
- -mid-shared-library
- کدی تولید میکند که از کتابخانههای مشترک از طریق روش شناسهٔ کتابخانه (library ID) پشتیبانی میکند. این قابلیت امکان اجرای درجا و کتابخانههای مشترک را در محیطی بدون مدیریت حافظهٔ مجازی فراهم میآورد. این گزینه مستلزم -fPIC است.
- -mno-id-shared-library
- کدی تولید میکند که فرض نمیکند کتابخانههای مشترک مبتنی بر ID در حال استفاده هستند. این حالت پیشفرض است.
- شمارهٔ شناسایی کتابخانهٔ مشترک مبتنی بر ID را که کامپایل میشود مشخص میکند. تعیین مقدار 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 خواهید داشت که یک تکفایل شیء (object file) را کامپایل کنید که به بیش از ۸۱۹۲ مدخل GOT دسترسی دارد. فایلهای بسیار کمی چنین هستند.
این گزینهها هیچ اثری ندارند مگر اینکه GCC در حال تولید کد مستقل از موقعیت باشد.
- -mlong-jump-table-offsets
- از آفستهای ۳۲ بیتی در جدولهای "switch" استفاده میکند. پیشفرض، استفاده از آفستهای ۱۶ بیتی است.
گزینههای MCore
اینها گزینههای -m تعریفشده برای پردازندههای Motorola M*Core هستند.
- -mhardlit
- -mno-hardlit
- اگر بتوان مقادیر ثابت را در دو دستورالعمل یا کمتر در جریان کد جای داد، آنها را بهصورت درونخطی (inline) قرار میدهد.
- -mdiv
- -mno-div
- از دستورالعمل تقسیم استفاده میکند. (بهطور پیشفرض فعال است).
- -mrelax-immediate
- -mno-relax-immediate
- اجازهٔ استفاده از مقادیر بیدرنگ (immediate) با اندازهٔ دلخواه را در عملیات بیتی میدهد.
- -mwide-bitfields
- -mno-wide-bitfields
- همواره با فیلدهای بیتی بهاندازه "int" رفتار شود.
- -m4byte-functions
- -mno-4byte-functions
- اجبار تمام توابع به تراز شدن روی یک مرز ۴ بایتی.
- -mcallgraph-data
- -mno-callgraph-data
- تولید اطلاعات گراف فراخوانی (callgraph).
- -mslow-bytes
- -mno-slow-bytes
- ترجیح دادن دسترسی کلمهای (word) هنگام خواندن مقادیر بایتی.
- -mlittle-endian
- -mbig-endian
- تولید کد برای یک مقصد little-endian.
- -m210
- -m340
- تولید کد برای پردازنده 210.
- -mno-lsim
- فرض بر این گذاشته شود که پشتیبانی زمان اجرا فراهم شده است و بنابراین کتابخانه شبیهساز (libsim.a) از خط فرمان پیونددهنده حذف شود.
- -mstack-increment=size
- تنظیم بیشینه مقدار برای یک عملیات افزایش پشته منفرد. مقادیر بزرگ میتوانند سرعت برنامههایی را که شامل توابعی با نیاز به فضای زیاد در پشته هستند افزایش دهند، اما اگر پشته بیش از حد گسترش یابد، میتوانند خطای حافظه (segmentation fault) نیز ایجاد کنند. مقدار پیشفرض 0x1000 است.
گزینههای MicroBlaze
- -msoft-float
- استفاده از شبیهسازی نرمافزاری برای ممیز شناور (پیشفرض).
- -mhard-float
- استفاده از دستورالعملهای سختافزاری ممیز شناور.
- -mmemcpy
- جابهجاییهای بلوکی بهینهسازی نشوند، از "memcpy" استفاده شود.
- -mno-clearbss
- این گزینه منسوخ شده است. بهجای آن از -fno-zero-initialized-in-bss استفاده کنید.
- -mcpu=cpu-type
- استفاده از ویژگیها و زمانبندی کد برای CPU مشخصشده. مقادیر پشتیبانیشده در قالب vX.YY.Z هستند، که در آن X نسخه اصلی، YY نسخه فرعی و Z کد سازگاری است. نمونه مقادیر عبارتند از v3.00.a، v4.00.b، v5.00.a، v5.00.b، v6.00.a.
- -mxl-soft-mul
- استفاده از شبیهسازی نرمافزاری ضرب (پیشفرض).
- -mxl-soft-div
- استفاده از شبیهسازی نرمافزاری برای تقسیم (پیشفرض).
- -mxl-barrel-shift
- استفاده از شیفتدهنده بشکهای (barrel shifter) سختافزاری.
- -mxl-pattern-compare
- استفاده از دستورالعملهای مقایسه الگو.
- -msmall-divides
- استفاده از بهینهسازی جدول جستجو برای تقسیم اعداد صحیح علامتدار کوچک.
- -mxl-stack-check
- این گزینه منسوخ شده است. بهجای آن از -fstack-check استفاده کنید.
- -mxl-gp-opt
- استفاده از بخشهای ".sdata"/".sbss" نسبی به GP.
- -mxl-multiply-high
- استفاده از دستورالعملهای ضرب بالا برای بخش بالاییِ ضرب 32x32.
- -mxl-float-convert
- استفاده از دستورالعملهای سختافزاری تبدیل ممیز شناور.
- -mxl-float-sqrt
- استفاده از دستورالعمل سختافزاری جذر ممیز شناور.
- -mbig-endian
- تولید کد برای یک مقصد big-endian.
- -mlittle-endian
- تولید کد برای یک مقصد little-endian.
- -mxl-reorder
- استفاده از دستورالعملهای بازآرایی (جابهجایی swap و بارگذاری/ذخیرهسازی با بایتهای معکوس).
- -mxl-mode-app-model
- انتخاب مدل برنامه کاربردی app-model. مدلهای معتبر عبارتند از:
- executable
- اجرایی معمولی (پیشفرض)، از کد راهاندازی crt0.o استفاده میکند.
- xmdstub
- برای استفاده با عامل اشکالزدایی نرمافزاری مداخلهگر بر پایه اشکالزدای ریزپردازنده زایلینکس (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 پشتیبانی نمیشود، این گزینه امکان ارجاع به دادهها با آفست از ابتدای آدرس text را بهجای GOT فراهم میکند.
گزینههای MIPS
- -EB
- تولید کد big-endian.
- -EL
- تولید کد little-endian. این مقدار پیشفرض برای پیکربندیهای mips*el-*-* است.
- -march=arch
- تولید کد
برای اجرا
روی arch، که
میتواند
نام یک ISA
عمومی MIPS یا
نام یک
پردازنده
خاص باشد.
نامهای ISA
عبارتند از:
mips1، mips2، mips3،
mips4، mips32، mips32r2،
mips32r3، mips32r5، mips32r6،
mips64، mips64r2، mips64r3،
mips64r5 و mips64r6.
نامهای
پردازنده
عبارتند از:
4kc، 4km، 4kp،
4ksc، 4kec، 4kem،
4kep، 4ksd، 5kc،
5kf، 20kc، 24kc،
24kf2_1، 24kf1_1، 24kec،
24kef2_1، 24kef1_1، 34kc،
34kf2_1، 34kf1_1، 34kn،
74kc، 74kf2_1، 74kf1_1،
74kf3_2، 1004kc، 1004kf2_1،
1004kf1_1، i6400، i6500،
interaptiv، loongson2e،
loongson2f، loongson3a، gs464،
gs464e، gs264e، m4k،
m14k، m14kc، m14ke،
m14kec، m5100، m5101،
octeon، octeon+، octeon2،
octeon3، orion، p5600،
p6600، r2000، r3000،
r3900، r4000، r4400،
r4600، r4650، r4700،
r5900، r6000، r8000،
rm7000، rm9000، r10000،
r12000، r14000، r16000،
sb1، sr71000، vr4100،
vr4111، vr4120، vr4130،
vr4300، vr5000، vr5400،
vr5500، xlr و xlp.
مقدار ویژه
from-abi
سازگارترین
معماری را
برای ABI
انتخابی
برمیگزیند
(یعنی mips1
برای ABIهای
۳۲ بیتی و mips3
برای ABIهای
۶۴ بیتی).
زنجیرهابزار بومی Linux/GNU همچنین از مقدار native پشتیبانی میکند که بهترین گزینه معماری را برای پردازنده میزبان انتخاب میکند. اگر GCC پردازنده را شناسایی نکند، -march=native هیچ تأثیری ندارد.
در نامهای پردازنده، سه رقم صفر پایانی (000) را میتوان به صورت k مخفف کرد (برای نمونه، -march=r2k). پیشوندها اختیاری هستند و vr ممکن است به صورت r نوشته شود.
نامهایی به شکل nf2_1 به پردازندههایی با FPUهایی اشاره دارند که با نصف فرکانس هسته کار میکنند، نامهایی به شکل nf1_1 به پردازندههایی با FPUهایی اشاره دارند که همفرکانس با هسته کار میکنند، و نامهایی به شکل nf3_2 به پردازندههایی با FPUهایی با نسبت فرکانس ۳:۲ نسبت به هسته اشاره میکنند. به دلایل سازگاری، nf به عنوان مترادفی برای nf2_1 پذیرفته میشود، در حالی که nx و bfx به عنوان مترادفهایی برای nf1_1 پذیرفته شدهاند.
کامپایلر GCC بر اساس مقدار این گزینه، دو ماکرو تعریف میکند. ماکروی اول "_MIPS_ARCH" است که نام معماری هدف را به صورت یک رشته ارائه میدهد. ماکروی دوم قالبی به شکل "_MIPS_ARCH_foo" دارد، که در آن foo مقدار با حروف بزرگ "_MIPS_ARCH" است. برای نمونه، -march=r2000 مقدار "_MIPS_ARCH" را برابر با "r2000" تنظیم کرده و ماکروی "_MIPS_ARCH_R2000" را تعریف میکند.
توجه داشته باشید که ماکروی "_MIPS_ARCH" از نامهای پردازندههای ذکرشده در بالا استفاده میکند. به عبارت دیگر، دارای پیشوند کامل است و 000 را به k مخفف نمیکند. در مورد from-abi، این ماکرو نام معماری حلشده (یا "mips1" یا "mips3") را تعیین میکند. هنگامی که هیچ گزینه -march مشخص نشده باشد، این ماکرو نام معماری پیشفرض را تعیین مینماید..IP -mtune=arch 4 برای arch بهینهسازی میکند. از جمله موارد دیگر، این گزینه نحوه زمانبندی دستورالعملها و هزینه برآوردشده عملیات حسابی را کنترل میکند. فهرست مقادیر arch همانند مقادیر -march است.
هنگامی که این گزینه استفاده نشود، GCC برای پردازندهای که با -march مشخص شده است بهینهسازی میکند. با استفاده همزمان از -march و -mtune، میتوان کدی تولید کرد که روی یک خانواده از پردازندهها اجرا شود، اما کد را برای یک عضو خاص از آن خانواده بهینهسازی کرد.
گزینه -mtune ماکروهای "_MIPS_TUNE" و "_MIPS_TUNE_foo" را تعریف میکند، که عملکردی مشابه موارد توضیحدادهشده در بالا برای -march دارند.
- -mips1
- معادل با -march=mips1 است.
- -mips2
- معادل با -march=mips2 است.
- -mips3
- معادل با -march=mips3 است.
- -mips4
- معادل با -march=mips4 است.
- -mips32
- معادل با -march=mips32 است.
- -mips32r3
- معادل با -march=mips32r3 است.
- -mips32r5
- معادل با -march=mips32r5 است.
- -mips32r6
- معادل با -march=mips32r6 است.
- -mips64
- معادل با -march=mips64 است.
- -mips64r2
- معادل با -march=mips64r2 است.
- -mips64r3
- معادل با -march=mips64r3 است.
- -mips64r5
- معادل با -march=mips64r5 است.
- -mips64r6
- معادل با -march=mips64r6 است.
- -mips16
- -mno-mips16
- کد MIPS16 تولید
میکند
(تولید
نمیکند).
اگر GCC
معماری MIPS32 یا
MIPS64 را هدف
قرار داده
باشد، از MIPS16e ASE
استفاده
میکند.
تولید کد MIPS16 را میتوان بر اساس هر تابع با استفاده از ویژگیهای "mips16" و "nomips16" نیز کنترل کرد.
- -mmips16e2
- -mno-mips16e2
- از MIPS16e2 ASE استفاده میکند (استفاده نمیکند). این گزینه رفتار گزینه -mips16 را به گونهای تغییر میدهد که MIPS16e2 ASE را هدف قرار دهد.
- -mflip-mips16
- بهصورت یکی در میان برای توابع کد MIPS16 تولید میکند. این گزینه برای آزمونهای پسرفت (regression testing) تولید کد ترکیبی MIPS16/غیر-MIPS16 فراهم شده است و برای استفاده معمولی در کامپایل کد کاربر در نظر گرفته نشده است.
- -minterlink-compressed
- -mno-interlink-compressed
- الزام
میکند
(الزام
نمیکند) که
کد
استفادهکننده
از ISA
استاندارد
(فشردهنشده)
MIPS با کدهای MIPS16
و microMIPS سازگار
با پیوند
باشد، و
برعکس.
برای مثال، کدی که از کدگذاری استاندار ISA استفاده میکند نمیتواند مستقیماً به کد MIPS16 یا microMIPS پرش کند؛ بلکه باید از یک فراخوانی یا پرش غیرمستقیم استفاده کند. بنابراین -minterlink-compressed پرشهای مستقیم را غیرفعال میکند مگر اینکه GCC بداند مقصد پرش فشرده نیست.
- -minterlink-mips16
- -mno-interlink-mips16
- نامهای مستعار برای -minterlink-compressed و -mno-interlink-compressed هستند. این گزینهها پیش از microMIPS ASE وجود داشتهاند و برای سازگاری عقبرو حفظ شدهاند.
- -mabi=32
- -mabi=o64
- -mabi=n32
- -mabi=64
- -mabi=eabi
- برای ABI
دادهشده
کد تولید
میکند.
توجه داشته باشید که EABI دارای یک گونه ۳۲-بیتی و یک گونه ۶۴-بیتی است. GCC معمولاً هنگام انتخاب یک معماری ۶۴-بیتی کد ۶۴-بیتی تولید میکند، اما میتوانید برای دریافت کد ۳۲-بیتی از -mgp32 استفاده کنید.
برای اطلاعات بیشتر درباره O64 ABI، به https://gcc.gnu.org/projects/mipso64-abi.html مراجعه کنید.
کامپایلر GCC از گونهای از ABI o32 پشتیبانی میکند که در آن ثباتهای ممیز شناور به جای ۳۲ بیت، ۶۴ بیتی هستند. میتوانید این ترکیب را با -mabi=32 -mfp64 انتخاب کنید. این ABI به دستورالعملهای "mthc1" و "mfhc1" متکی است و بنابراین تنها برای پردازندههای MIPS32R2، MIPS32R3 و MIPS32R5 پشتیبانی میشود.
تخصیص ثباتها برای آرگومانها و مقادیر بازگشتی یکسان باقی میماند، اما هر مقدار اسکالر به جای یک جفت ثبات ۳۲-بیتی، در یک تکثبات ۶۴-بیتی ارسال میشود. برای مثال، مقادیر اسکالر ممیز شناور فقط در $f0 بازگردانده میشوند، نه در یک جفت $f0/$f1. مجموعه ثباتهای حفظشونده در فراخوانی (call-saved) نیز از این نظر که ثباتهای دقت مضاعف زوجشماره ذخیره میشوند، یکسان باقی میماند.
دو گونه دیگر از o32 ABI برای فراهم کردن امکان گذار از ثباتهای ۳۲-بیتی به ۶۴-بیتی پشتیبانی میشوند. اینها FPXX (-mfpxx) و FP64A (-mfp64 -mno-odd-spreg) هستند. افزونه FPXX الزام میکند که تمامی کدها هنگام اجرا با ثباتهای ۳۲-بیتی یا ۶۴-بیتی بهدرستی اجرا شوند. این کد میتواند با FP32 یا FP64 پیوند متقابل داشته باشد، اما نه با هر دو. افزونه FP64A مشابه افزونه FP64 است اما استفاده از ثباتهای دقت تکی فردشماره را منع میکند. این افزونه میتواند همراه با حالت "FRE" در FPUهای پردازندههای MIPS32R5 استفاده شود و به هر دو کد FP32 و FP64A اجازه میدهد تا بدون تغییر حالتهای FPU در یک فرایند پیوند متقابل داشته و اجرا شوند.
- -mabicalls
- -mno-abicalls
- کدی تولید میکند (تولید نمیکند) که برای اشیای پویا به سبک SVR4 مناسب باشد. گزینه -mabicalls حالت پیشفرض برای سیستمهای مبتنی بر SVR4 است.
- -mno-shared
- کدی تولید
میکند
(تولید
نمیکند) که
کاملاً
مستقل از
موقعیت
باشد و
بنابراین
بتواند
درون
کتابخانههای
اشتراکی
پیوند داده
شود. این
گزینه فقط
بر -mabicalls اثر
میگذارد.
بهطور سنتی تمامی کدهای -mabicalls صرفنظر از گزینههایی چون -fPIC و -fpic مستقل از موقعیت بودهاند. با این حال، به عنوان یک افزونه، زنجیره ابزار GNU به فایلهای اجرایی امکان میدهد برای نمادهایی که بهصورت محلی پیوند میخورند، از دسترسیهای مطلق استفاده کنند. همچنین میتواند از توالیهای مقداردهی اولیه کوتاهتر GP استفاده کرده و فراخوانیهای مستقیم به توابع تعریفشده بهصورت محلی ایجاد کند. این حالت با -mno-shared انتخاب میشود.
گزینه -mno-shared به binutils نسخه 2.16 یا بالاتر نیازمند است و اشیایی تولید میکند که تنها توسط پیونددهنده GNU قابل پیوند هستند. با این حال، این گزینه بر ABI فایل اجرایی نهایی تأثیری ندارد؛ بلکه تنها بر ABI اشیای جابهجاپذیر تأثیر میگذارد. استفاده از -mno-shared عموماً فایلهای اجرایی را هم کوچکتر و هم سریعتر میکند.
گزینه -mshared حالت پیشفرض است..IP -mplt 4
- -mno-plt
- فرض میکند
(فرض
نمیکند) که
پیونددهندههای
ایستا و
پویا از PLTها
و
بازآراییهای
رونوشت (copy relocations)
پشتیبانی
میکنند.
این گزینه
تنها بر -mno-shared
-mabicalls تأثیر
میگذارد.
برای ABI نوع n64،
این گزینه
بدون -msym32 هیچ
اثری ندارد.
میتوانید با پیکربندی GCC با --with-mips-plt، گزینهٔ -mplt را به عنوان پیشفرض قرار دهید. در غیر این صورت، پیشفرض -mno-plt است.
- -mxgot
- -mno-xgot
- محدودیتهای
معمول بر
روی
اندازهٔ
جدول آفست
سراسری (GOT) را
برمیدارد
(برنمیدارد).
کامپایلر GCC به طور معمول از یک دستور منفرد برای بارگذاری مقادیر از GOT استفاده میکند. اگرچه این کار نسبتاً کارآمد است، اما تنها در صورتی عمل میکند که GOT کوچکتر از حدود 64k باشد. هر اندازهٔ بزرگتری باعث میشود پیونددهنده خطایی مانند زیر را گزارش کند:
relocation truncated to fit: R_MIPS_GOT16 foobar
در صورت بروز این مشکل، باید کد خود را با -mxgot بازکامپایل کنید. این کار با GOTهای بسیار بزرگ عمل میکند، اگرچه کد کارایی کمتری خواهد داشت، چرا که واکشی مقدار یک نماد سراسری نیازمند سه دستور خواهد بود.
توجه داشته باشید که برخی پیونددهندهها میتوانند چندین GOT ایجاد کنند. اگر چنین پیونددهندهای دارید، تنها زمانی باید از -mxgot استفاده کنید که یک فایل شیء (object file) منفرد به بیش از 64k ورودی GOT دسترسی پیدا کند. موارد بسیار کمی اینگونه هستند.
این گزینهها هیچ اثری ندارند مگر اینکه GCC در حال تولید کد مستقل از موقعیت (position independent code) باشد.
- -mgp32
- فرض میکند که ثباتهای همهمنظوره ۳۲ بیتی هستند.
- -mgp64
- فرض میکند که ثباتهای همهمنظوره ۶۴ بیتی هستند.
- -mfp32
- فرض میکند که ثباتهای ممیز شناور ۳۲ بیتی هستند.
- -mfp64
- فرض میکند که ثباتهای ممیز شناور ۶۴ بیتی هستند.
- -mfpxx
- فرضی دربارهٔ پهنای ثباتهای ممیز شناور در نظر نمیگیرد.
- -mhard-float
- از دستورهای کمکپردازندهٔ ممیز شناور استفاده میکند.
- -msoft-float
- از دستورهای کمکپردازندهٔ ممیز شناور استفاده نمیکند. در عوض محاسبات ممیز شناور را با استفاده از فراخوانیهای کتابخانهای پیادهسازی میکند.
- -mno-float
- معادل با -msoft-float است، اما علاوه بر آن تصریح میکند که برنامهٔ در حال کامپایل هیچ عملیات ممیز شناوری را انجام نمیدهد. این گزینه در حال حاضر تنها توسط برخی پیکربندیهای bare-metal در MIPS پشتیبانی میشود، جایی که ممکن است مجموعهٔ خاصی از کتابخانهها را انتخاب کند که فاقد هرگونه پشتیبانی از ممیز شناور هستند (برای نمونه، شامل قالبهای ممیز شناور در "printf"). اگر کدی که با -mno-float کامپایل شده به طور اتفاقی شامل عملیات ممیز شناور باشد، احتمالاً با شکست در زمان پیوند یا زمان اجرا مواجه خواهد شد.
- -msingle-float
- فرض میکند که کمکپردازندهٔ ممیز شناور تنها از عملیات با دقت یگانه پشتیبانی میکند.
- -mdouble-float
- فرض میکند که کمکپردازندهٔ ممیز شناور از عملیات با دقت مضاعف پشتیبانی میکند. این پیشفرض است.
- -modd-spreg
- -mno-odd-spreg
- استفاده از ثباتهای فردِ ممیز شناور با دقت یگانه را برای ABI نوع o32 فعال میکند. این مقدار برای پردازندههایی که مشخصاً از این ثباتها پشتیبانی میکنند، پیشفرض است. هنگام استفاده از o32 FPXX ABI، گزینهٔ -mno-odd-spreg به صورت پیشفرض فعال میشود.
- -mabs=2008
- -mabs=legacy
- این
گزینهها
نحوهٔ
برخورد با
دادههای
ویژهٔ «عدد
نیست» (NaN)
ممیز شناور
IEEE 754 را با
استفاده از
دستورهای
ماشین
"abs.fmt"
و
"neg.fmt"
کنترل
میکنند.
به طور پیشفرض یا هنگامی که -mabs=legacy استفاده میشود، برخورد موروثی (legacy) انتخاب میگردد. در این حالت، این دستورها حسابی تلقی میشوند و در جایی که عملکرد صحیح لازم است و ممکن است عملوند ورودی NaN باشد، از آنها اجتناب میشود. در عوض، دنبالهٔ طولانیتری از دستورها به کار گرفته میشود که بیت علامت دادهٔ ممیز شناور را به طور دستی دستکاری میکنند، مگر اینکه گزینهٔ -ffinite-math-only نیز مشخص شده باشد.
گزینهٔ -mabs=2008 برخورد مطابق با IEEE 754-2008 را برمیگزیند. در این حالت، این دستورها غیرحسابی تلقی شده و بنابراین در تمام موارد، از جمله بهویژه زمانی که عملوند ورودی NaN باشد، عملکرد درستی دارند. بنابراین این دستورها همواره برای عملیات مربوطه به کار میروند.
- -mnan=2008
- -mnan=legacy
- این
گزینهها
کدگذاری
دادههای
ویژهٔ «عدد
نیست» (NaN)
ممیز شناور
IEEE 754 را کنترل
میکنند.
گزینهٔ -mnan=legacy کدگذاری موروثی را برمیگزیند. در این حالت، NaNهای بیصدا (qNaNs) با ۰ بودن بیت اول فیلد مانتیس انتهایی (trailing significand) مشخص میشوند، در حالی که NaNهای علامتی (sNaNs) با ۱ بودن بیت اول فیلد مانتیس انتهاییشان مشخص میگردند.
گزینهٔ -mnan=2008 کدگذاری IEEE 754-2008 را برمیگزیند. در این حالت، qNaNها با ۱ بودن بیت اول فیلد مانتیس انتهاییشان مشخص میشوند، در حالی که sNaNها با ۰ بودن بیت اول فیلد مانتیس انتهاییشان نشان داده میشوند.
پیشفرض -mnan=legacy است، مگر اینکه GCC با --with-nan=2008 پیکربندی شده باشد.
- -mllsc
- -mno-llsc
- برای
پیادهسازی
توابع
درونیِ (built-in)
حافظهٔ
اتمی، از
دستورهای
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 Multithreading.
- -mmcu
- -mno-mcu
- استفاده (یا عدم استفاده) از دستورالعملهای MIPS MCU ASE.
- -meva
- -mno-eva
- استفاده (یا عدم استفاده) از دستورالعملهای MIPS Enhanced Virtual Addressing.
- -mvirt
- -mno-virt
- استفاده (یا عدم استفاده) از دستورالعملهای مجازیسازی MIPS Virtualization (VZ).
- -mxpa
- -mno-xpa
- استفاده (یا عدم استفاده) از دستورالعملهای MIPS eXtended Physical Address (XPA).
- -mcrc
- -mno-crc
- استفاده (یا عدم استفاده) از دستورالعملهای MIPS Cyclic Redundancy Check (CRC).
- -mginv
- -mno-ginv
- استفاده (یا عدم استفاده) از دستورالعملهای MIPS Global INValidate (GINV).
- -mloongson-mmi
- -mno-loongson-mmi
- استفاده (یا عدم استفاده) از دستورالعملهای چندرسانهای MIPS Loongson MultiMedia extensions Instructions (MMI).
- -mloongson-ext
- -mno-loongson-ext
- استفاده (یا عدم استفاده) از دستورالعملهای MIPS Loongson EXTensions (EXT).
- -mloongson-ext2
- -mno-loongson-ext2
- استفاده (یا عدم استفاده) از دستورالعملهای MIPS Loongson EXTensions r2 (EXT2).
- -mlong64
- وادار کردن نوعهای "long" به ۶۴-بیتی بودن. برای توضیحات در مورد حالت پیشفرض و نحوهٔ تعیین اندازهٔ اشارهگر، -mlong32 را ببینید.
- -mlong32
- وادار کردن
نوعهای
"long"،
"int" و
اشارهگر
به ۳۲-بیتی
بودن.
اندازهٔ پیشفرض نوعهای "int"، "long" و اشارهگرها به ABI وابسته است. تمامی ABIهای پشتیبانیشده از "int"های ۳۲-بیتی استفاده میکنند. ABI نوع n64 مانند EABI شصت و چهار بیتی از "long"های ۶۴-بیتی استفاده میکند؛ سایرین از "long"های ۳۲-بیتی استفاده میکنند. اشارهگرها هماندازه با "long"ها یا هماندازه با ثباتهای عدد صحیح هستند، هر کدام که کوچکتر باشد.
- -msym32
- -mno-sym32
- فرض کردن (یا نکردن) اینکه تمامی نمادها صرفنظر از ABI انتخابشده، مقادیر ۳۲-بیتی دارند. این گزینه در ترکیب با -mabi=64 و -mno-abicalls سودمند است چرا که به GCC امکان میدهد ارجاعات کوتاهتر و سریعتری به آدرسهای نمادین تولید کند.
- -G num
- قرار دادن
تعاریف
دادههای
با دسترسی
خارجی (externally-visible)
در یک بخش
دادههای
کوچک (small data section)،
در صورتی که
اندازهٔ آن
داده
بزرگتر از
num بایت
نباشد. در
این صورت GCC
میتواند
دسترسیهای
کارآمدتری
به دادهها
تولید کند؛
برای
جزئیات -mgpopt
را ببینید.
گزینهٔ پیشفرض -G به پیکربندی بستگی دارد.
- -mlocal-sdata
- -mno-local-sdata
- تعمیم دادن
(یا ندادن)
رفتار -G به
دادههای
محلی نیز،
مانند
متغیرهای static
در C. گزینهٔ
-mlocal-sdata برای
تمام
پیکربندیها
پیشفرض
است.
اگر پیونددهنده (linker) هشدار دهد که یک برنامه بیش از حد از دادههای کوچک استفاده میکند، ممکن است بخواهید کامپایل مجدد بخشهای کماهمیتتر از نظر کارایی را با -mno-local-sdata امتحان کنید. همچنین ممکن است بخواهید کتابخانههای بزرگ را با -mno-local-sdata بسازید تا کتابخانهها فضای بیشتری برای برنامهٔ اصلی باقی بگذارند.
- -mextern-sdata
- -mno-extern-sdata
- فرض کردن
(یا نکردن)
اینکه
دادههای
تعریفشده
در خارج (externally-defined)
در صورتی که
اندازهٔ
آنها در
محدودهٔ -G
باشد، در یک
بخش
دادههای
کوچک قرار
دارند.
گزینهٔ -mextern-sdata
برای تمام
پیکربندیها
پیشفرض
است.
اگر یک ماژول Mod را با -mextern-sdata -G num -mgpopt کامپایل کنید و Mod به متغیر Var ارجاع دهد که بزرگتر از num بایت نیست، باید اطمینان حاصل کنید که Var در یک بخش دادههای کوچک قرار گرفته است. اگر Var توسط ماژول دیگری تعریف شده باشد، باید یا آن ماژول را با تنظیم -G به اندازهٔ کافی بزرگ کامپایل کنید یا مشخصهٔ "section" را به تعریف Var ضمیمه کنید. اگر Var مشترک (common) است، باید برنامه را با تنظیم -G به اندازهٔ کافی بزرگ پیوند دهید.
سادهترین راه برای برآورده کردن این محدودیتها، کامپایل و پیوند دادن تمام ماژولها با گزینهٔ یکسان -G است. با این حال، ممکن است بخواهید کتابخانهای بسازید که از چندین حد مختلف دادههای کوچک پشتیبانی کند. میتوانید این کار را با کامپایل کتابخانه با بالاترین مقدار پشتیبانیشدهٔ -G و علاوه بر آن استفاده از -mno-extern-sdata انجام دهید تا کتابخانه فرضیاتی دربارهٔ دادههای تعریفشده در خارج در نظر نگیرد..IP -mgpopt 4
- -mno-gpopt
- استفاده از
(عدم
استفاده از)
دسترسیهای
وابسته به GP
برای
نمادهایی
که مشخص است
در بخش
دادههای
کوچک (small data)
قرار
دارند؛
گزینههای
-G، -mlocal-sdata و -mextern-sdata
را ببینید.
گزینهٔ -mgpopt
در تمام
پیکربندیها
پیشفرض
است.
گزینهٔ -mno-gpopt برای مواردی مفید است که ثبات $gp ممکن است حاوی مقدار "_gp" نباشد. برای مثال، اگر کد بخشی از کتابخانهای باشد که ممکن است در یک مانیتور بوت (boot monitor) استفاده شود، برنامههایی که روالهای مانیتور بوت را فرامیخوانند مقداری نامشخص در $gp ارسال میکنند. (در چنین شرایطی، خود مانیتور بوت معمولاً با -G0 کامپایل میشود.)
گزینهٔ -mno-gpopt مستلزم گزینههای -mno-local-sdata و -mno-extern-sdata است.
- -membedded-data
- -mno-embedded-data
- تخصیص متغیرها در صورت امکان ابتدا به بخش دادههای فقطخواندنی، سپس در صورت امکان در بخش دادههای کوچک، و در غیر این صورت در بخش داده (data). این گزینه کدی تولید میکند که اندکی از حالت پیشفرض کندتر است، اما مقدار RAM مورد نیاز هنگام اجرا را کاهش میدهد و بنابراین ممکن است برای برخی سامانههای نهفته ترجیح داده شود.
- -muninit-const-in-rodata
- -mno-uninit-const-in-rodata
- قرار دادن متغیرهای "const" مقداردهینشده در بخش دادههای فقطخواندنی. این گزینه تنها در ترکیب با -membedded-data معنادار است.
- -mcode-readable=setting
- مشخص میکند که آیا GCC مجاز به تولید کدی است که از بخشهای اجرایی میخواند یا خیر. سه مقدار ممکن برای این تنظیم وجود دارد:
- -mcode-readable=yes
- دستورالعملها آزادانه میتوانند به بخشهای اجرایی دسترسی داشته باشند. این تنظیم پیشفرض است.
- -mcode-readable=pcrel
- دستورالعملهای بارگذاری وابسته به PC در MIPS16 میتوانند به بخشهای اجرایی دسترسی داشته باشند، اما سایر دستورالعملها نباید چنین کنند. این گزینه روی پردازندههای 4KSc و 4KSd زمانی که بیت Read Inhibit در TLBهای کد تنظیم شده باشد مفید است. همچنین روی پردازندههایی که میتوان آنها را برای داشتن رابط دوگانه دستورالعمل/داده SRAM پیکربندی کرد و مانند M4K بارگذاریهای وابسته به PC را به طور خودکار به RAM دستورالعمل هدایت میکنند، کاربرد دارد.
- -mcode-readable=no
- دستورالعملها نباید به بخشهای اجرایی دسترسی داشته باشند. این گزینه میتواند در مقصدهایی مفید باشد که برای داشتن رابط دوگانه دستورالعمل/داده SRAM پیکربندی شدهاند اما (برخلاف M4K) بارگذاریهای وابسته به PC را به طور خودکار به RAM دستورالعمل هدایت نمیکنند.
- -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" در سال ۲۰۱۴ معرفی گردید، که از %pcrel_hi و %pcrel_lo پشتیبانی میکند.
- -mcheck-zero-division
- -mno-check-zero-division
- تلهگذاری
(عدم
تلهگذاری)
هنگام
تقسیم صحیح
بر صفر.
پیشفرض -mcheck-zero-division است.
- -mdivide-traps
- -mdivide-breaks
- سامانههای
MIPS تقسیم بر
صفر را با
تولید یک
تله شرطی (conditional
trap) یا یک
دستورالعمل
break بررسی
میکنند.
استفاده از
تلهها
باعث ایجاد
کد
کوچکتری
میشود،
اما تنها در
MIPS II و پس از آن
پشتیبانی
میشود.
همچنین،
برخی
نگارشهای
هسته
لینوکس
اشکالی
دارند که
مانع از
تولید
سیگنال
مناسب
("SIGFPE")
توسط تله
میشود.
برای مجاز
کردن
تلههای
شرطی روی
معماریهایی
که از آنها
پشتیبانی
میکنند از
-mdivide-traps و برای
اجبار به
استفاده از
break از -mdivide-breaks
استفاده
کنید.
پیشفرض معمولاً -mdivide-traps است، اما میتوان در زمان پیکربندی با استفاده از --with-divide=breaks آن را نادیده گرفت. بررسیهای تقسیم بر صفر را میتوان با استفاده از -mno-check-zero-division به طور کامل غیرفعال کرد.
- -mload-store-pairs
- -mno-load-store-pairs
- فعالسازی (غیرفعالسازی) بهینهسازیای که دستورالعملهای بارگذاری یا ذخیرهسازی متوالی را برای فعالسازی پیوند بارگذاری/ذخیرهسازی (load/store bonding) جفت میکند. این گزینه بهطور پیشفرض فعال است اما تنها زمانی اعمال میشود که معماری انتخابشده از پیوند (bonding) پشتیبانی کند.
- -mstrict-align
- -mno-strict-align
- -munaligned-access
- -mno-unaligned-access
- غیرفعالسازی (فعالسازی) دسترسی مستقیم ناتراز (unaligned access) برای MIPS Release 6. معماری MIPSr6 به پشتیبانی دسترسی ناتراز بارگذاری/ذخیرهسازی از طریق سختافزار یا trap&emulate نیاز دارد. بنابراین ممکن است هسته به -mstrict-align نیاز داشته باشد. گزینههای -munaligned-access و -mno-unaligned-access منسوخ شدهاند و صرفاً برای سازگاری با گذشته هستند.
- -mmemcpy
- -mno-memcpy
- اجبار کردن (عدم اجبار) به استفاده از "memcpy" برای جابهجاییهای غیربدیهی بلوکها. پیشفرض -mno-memcpy است، که به GCC اجازه میدهد بیشتر رونوشتهای با اندازهٔ ثابت را درونخطی (inline) کند.
- -mlong-calls
- -mno-long-calls
- غیرفعالسازی
(عدم
غیرفعالسازی)
استفاده از
دستورالعمل
"jal".
فراخوانی
توابع با
استفاده از
"jal"
کارآمدتر
است اما
نیاز دارد
که
فراخواننده
و
فراخواندهشده
در یک بخش
حافظهٔ ۲۵۶
مگابایتی
یکسان
باشند.
این گزینه هیچ تأثیری روی کد abicalls ندارد. پیشفرض -mno-long-calls است.
- -mmad
- -mno-mad
- فعالسازی (غیرفعالسازی) استفاده از دستورالعملهای "mad"، "madu" و "mul"، همانطور که توسط ISA پردازندهٔ R4650 ارائه شده است.
- -mimadd
- -mno-imadd
- فعالسازی (غیرفعالسازی) استفاده از دستورالعملهای عدد صحیح "madd" و "msub". پیشفرض در معماریهایی که از "madd" و "msub" پشتیبانی میکنند -mimadd است، به جز معماری 74k که مشخص شد در آن کد کندتری تولید میکند..IP -mfused-madd 4
- -mno-fused-madd
- فعالسازی
(غیرفعالسازی)
استفاده از
دستورالعملهای
ضرب-تجمع
(multiply-accumulate) ممیز
شناور، در
صورت در
دسترس بودن
آنها.
مقدار
پیشفرض
-mfused-madd است.
در پردازنده R8000 هنگام استفاده از دستورالعملهای ضرب-تجمع، حاصلضرب میانی با دقت نامحدود محاسبه میشود و مشمول بیت FCSR Flush to Zero نمیگردد. این حالت ممکن است در برخی شرایط نامطلوب باشد. در سایر پردازندهها، نتیجه از نظر عددی با محاسبه معادل با استفاده از دستورالعملهای جداگانه ضرب، جمع، تفریق و منفیسازی یکسان است.
- -nocpp
- به اسمبلر MIPS اعلام میکند که هنگام اسمبل کردن فایلهای اسمبلی کاربر (با پسوند .s)، پیشپردازنده خود را روی آنها اجرا نکند.
- -mfix-24k
- -mno-fix-24k
- اعمال راهکار رفع ایراد سختافزاری 24K E48 (از دست رفتن دادهها در عملیات ذخیرهسازی حین بازنشانی یا refill). این راهکارها به جای GCC توسط اسمبلر پیادهسازی میشوند.
- -mfix-r4000
- -mno-fix-r4000
- اعمال راهکار برای برخی ایرادات سختافزاری پردازنده R4000:
- یک شیفت متغیر یا دابل-ورد (double-word) در صورتی که بلافاصله پس از شروع یک تقسیم عدد صحیح اجرا شود ممکن است نتیجه نادرستی تولید کند.
- یک شیفت متغیر یا دابل-ورد در صورتی که در حین انجام یک ضرب عدد صحیح اجرا شود ممکن است نتیجه نادرستی تولید کند.
- یک تقسیم عدد صحیح در صورتی که در شکاف تاخیر (delay slot) یک انشعاب محققشده یا یک پرش آغاز شود ممکن است نتیجه نادرستی تولید کند.
- -mfix-r4400
- -mno-fix-r4400
- اعمال راهکار برای برخی ایرادات سختافزاری پردازنده R4400:
- -
- یک شیفت متغیر یا دابل-ورد در صورتی که بلافاصله پس از شروع یک تقسیم عدد صحیح اجرا شود ممکن است نتیجه نادرستی تولید کند.
- -mfix-r10000
- -mno-fix-r10000
- اعمال راهکار برای برخی ایرادات سختافزاری R10000:
- -
- توالیهای "ll"/"sc" ممکن است در نسخههای پیش از 3.0 رفتاری اتمیک (atomic) نداشته باشند. آنها ممکن است در نسخههای 2.6 و قدیمیتر دچار بنبست (deadlock) شوند.
این گزینه تنها زمانی قابل استفاده است که معماری مقصد از دستورالعملهای branch-likely پشتیبانی کند. هنگام استفاده از -march=r10000، گزینه -mfix-r10000 پیشفرض است؛ در غیر این صورت پیشفرض -mno-fix-r10000 میباشد.
- -mfix-r5900
- -mno-fix-r5900
- تلاشی برای زمانبندی دستورالعمل قبلی در شکاف تاخیر (delay slot) دستورالعمل انشعابی که در انتهای یک حلقه کوتاه با شش دستورالعمل یا کمتر قرار دارد انجام نده و همیشه به جای آن یک دستورالعمل "nop" را در آنجا زمانبندی کن. ایراد حلقه کوتاه تحت شرایط خاصی به دلیل یک نقص سختافزاری در تراشه R5900 باعث میشود حلقهها تنها یک یا دو بار اجرا شوند. این راهکار به جای GCC توسط اسمبلر پیادهسازی میشود.
- -mfix-rm7000
- -mno-fix-rm7000
- اعمال راهکار برای ایراد سختافزاری "dmult"/"dmultu" در RM7000. این راهکارها به جای GCC توسط اسمبلر پیادهسازی میشوند.
- -mfix-vr4120
- -mno-fix-vr4120
- اعمال راهکار برای برخی ایرادات سختافزاری VR4120:
- دستورالعمل "dmultu" همیشه نتیجه درستی تولید نمیکند.
- اگر یکی از عملوندها منفی باشد، دستورالعملهای "div" و "ddiv" همیشه نتیجه درستی تولید نمیکنند.
راهکارهای مربوط به ایرادات سختافزاری تقسیم به توابع ویژهای در libgcc.a متکی هستند. در حال حاضر، این توابع تنها توسط پیکربندیهای "mips64vr*-elf" ارائه میشوند.
سایر ایرادات سختافزاری VR4120 نیازمند درج یک NOP بین جفت دستورالعملهای خاصی هستند. این ایرادات به جای خود GCC، توسط اسمبلر مدیریت میشوند.
- -mfix-vr4130
- اعمال راهکار برای ایراد سختافزاری "mflo"/"mfhi" در VR4130. این راهکارها به جای GCC توسط اسمبلر پیادهسازی میشوند، هرچند اگر دستورالعملهای "macc"، "macchi"، "dmacc" و "dmacchi" پردازنده VR4130 در دسترس باشند، GCC از بهکارگیری "mflo" و "mfhi" خودداری میکند.
- -mfix-sb1
- -mno-fix-sb1
- اعمال راهکار برای برخی ایرادات سختافزاری هسته پردازنده SB-1. (این پرچم در حال حاضر ایرادات ممیز شناور "F1" و "F2" نسخه ۲ پردازنده SB-1 را دور میزند.)
- -mr10k-cache-barrier=setting
- مشخص
میکند که
آیا GCC باید
برای
جلوگیری از
اثرات
جانبی
اجرای حدسی
(speculation) در
پردازندههای
R10K، موانع
حافظه نهان
(cache barriers) درج کند
یا خیر.
مشابه بسیاری از پردازندهها، R10K تلاش میکند نتیجه یک انشعاب شرطی را پیشبینی کرده و دستورالعملهای شاخه «برداشتهشده» (taken) را به صورت حدسی اجرا نماید. در صورتی که نتیجه پیشبینی نادرست باشد، این دستورالعملها را بعداً لغو میکند. با این حال، در R10K حتی دستورالعملهای لغوشده نیز میتوانند اثرات جانبی داشته باشند.
این مشکل فقط بر عملیات ذخیره (stores) هسته و، بسته به سیستم، بارگذاریهای (loads) هسته اثر میگذارد. به عنوان مثال، یک ذخیرهسازی که به صورت حدسی اجرا شده است ممکن است حافظه مقصد را در حافظه نهان بارگذاری کرده و خط حافظه نهان (cache line) را به عنوان dirty نشانهگذاری کند، حتی اگر خود عملیات ذخیره بعداً لغو شود. اگر یک عملیات DMA پیش از تخلیه (flush) خط «dirty» در همان ناحیه از حافظه بنویسد، دادههای کَششده بر روی دادههای منتقلشده با DMA بازنویسی میشوند. برای توضیحات کامل، از جمله سایر مشکلات بالقوه، به دفترچه راهنمای پردازنده R10K مراجعه کنید.
یک راهکار این است که دستورالعملهای مانع حافظه نهان (cache barrier) پیش از هر دسترسی به حافظهای که ممکن است به صورت حدسی اجرا شود و حتی در صورت لغو شدن اثرات جانبی به جا بگذارد، درج گردند. گزینه -mr10k-cache-barrier=setting پیادهسازی این راهکار در GCC را کنترل میکند. این گزینه فرض میکند که دسترسیهای لغوشده به هر بایتی در نواحی زیر، اثرات جانبی ندارند:
- 1.
- حافظه اشغالشده توسط فریم پشته (stack frame) تابع فعلی؛
- 2.
- حافظه اشغالشده توسط یک آرگومان ورودی پشته؛
- 3.
- حافظه اشغالشده توسط شیئی با آدرس ثابت در زمان پیوند (link-time-constant).
این مسئولیت هسته سیستمعامل (kernel) است که تضمین کند دسترسیهای حدسی به این نواحی واقعاً ایمن هستند.
اگر
برنامه
ورودی شامل
یک اعلان
تابع مانند
زیر باشد: void foo (void);
آنگاه پیادهسازی "foo" باید اجازه دهد "j foo" و "jal foo" بهطور حدسی (speculatively) اجرا شوند. GCC این محدودیت را برای توابعی که خودش کامپایل میکند رعایت مینماید. GCC انتظار دارد توابع غیر GCC (مانند کدهای اسمبلی دستنویس) نیز همین کار را انجام دهند.
این گزینه دارای سه حالت است:
- -mr10k-cache-barrier=load-store
- یک سد حافظه موقت (cache barrier) پیش از عملیات بارگذاری یا ذخیرهسازی درج میکند که ممکن است بهصورت حدسی اجرا شود و حتی در صورت لغو شدن، عوارض جانبی داشته باشد.
- -mr10k-cache-barrier=store
- یک سد حافظه موقت پیش از عملیات ذخیرهسازی درج میکند که ممکن است بهصورت حدسی اجرا شود و حتی در صورت لغو شدن، عوارض جانبی داشته باشد.
- -mr10k-cache-barrier=none
- درج سدهای حافظه موقت را غیرفعال میکند. این تنظیم پیشفرض است.
- -mflush-func=func
- -mno-flush-func
- تابعی را که باید برای پاکسازی (flush) حافظههای موقت دستورالعمل (I) و داده (D) فراخوانی شود مشخص میکند، یا عدم فراخوانی هیچ تابعی را تعیین مینماید. در صورت فراخوانی، تابع باید همان آرگومانهای تابع رایج "_flush_func" را دریافت کند؛ یعنی آدرس محدوده حافظهای که حافظه موقت آن در حال پاکسازی است، اندازه محدوده حافظه، و عدد ۳ (برای پاکسازی هر دو حافظه موقت). مقدار پیشفرض به مقصدی بستگی دارد که GCC برای آن پیکربندی شده است، اما معمولاً یکی از "_flush_func" یا "__cpu_flush" است.
- -mbranch-cost=num
- هزینه پرشها را تقریباً برابر با num دستورالعمل «ساده» تعیین میکند. این هزینه صرفاً یک روش اکتشافی (heuristic) است و تضمینی وجود ندارد که در نگارشهای مختلف نتایج یکسانی ایجاد کند. مقدار صفر بهطور زاید پیشفرض را انتخاب میکند که بر اساس تنظیم -mtune است.
- -mbranch-likely
- -mno-branch-likely
- استفاده از دستورالعملهای Branch Likely را بدون توجه به پیشفرض معماری انتخابشده، فعال یا غیرفعال میکند. بهطور پیشفرض، اگر معماری انتخابی از دستورالعملهای Branch Likely پشتیبانی کند، این دستورالعملها ممکن است تولید شوند. یک استثنا برای معماریهای MIPS32 و MIPS64 و پردازندههایی است که این معماریها را پیادهسازی میکنند؛ برای آنها، دستورالعملهای Branch Likely بهطور پیشفرض تولید نمیشوند، زیرا معماریهای MIPS32 و MIPS64 صراحتاً استفاده از آنها را منسوخ اعلام کردهاند.
- -mcompact-branches=never
- -mcompact-branches=optimal
- -mcompact-branches=always
- این
گزینهها
تعیین
میکنند که
کدام شکل از
پرشها
تولید شوند.
حالت
پیشفرض
-mcompact-branches=optimal است.
گزینه -mcompact-branches=never تضمین میکند که دستورالعملهای پرش فشرده (compact branch) هرگز تولید نخواهند شد.
گزینه -mcompact-branches=always تضمین میکند در صورتی که برای MIPS Release 6 به بعد موجود باشد، یک دستور پرش فشرده تولید شود. اگر دستور پرش فشرده موجود نباشد (یا در معماریهای پیش از R6)، بهجای آن از نوع پرش دارای شکاف تأخیر (delay slot) استفاده خواهد شد.
در صورتی که برای اهداف MIPS16/microMIPS استفاده شود، در حال حاضر نادیده گرفته میشود. رفتار MIPS16/microMIPS ممکن است در آینده تغییر کند، زیرا آنها برخی دستورالعملهای پرش فشرده را دارند.
گزینه -mcompact-branches=optimal باعث میشود در صورتی که در ISA فعلی در دسترس باشد و شکاف تأخیر با موفقیت پر شود، پرش دارای شکاف تأخیر به کار رود. اگر شکاف تأخیر پر نشود، در صورت موجود بودن، یک پرش فشرده انتخاب خواهد شد.
- -mfp-exceptions
- -mno-fp-exceptions
- مشخص
میکند که
آیا
استثناهای
ممیز شناور
(FP exceptions) فعال
هستند یا
خیر. این
امر بر نحوه
زمانبندی
دستورالعملهای
FP در برخی
پردازندهها
تأثیر
میگذارد.
حالت
پیشفرض
این است که
استثناهای
FP فعال
هستند.
برای مثال، در SB-1، اگر استثناهای FP غیرفعال باشند و در حال تولید کد ۶۴ بیتی باشیم، میتوانیم از هر دو خطلوله (pipe) ممیز شناور استفاده کنیم. در غیر این صورت، تنها میتوان از یک خطلوله FP استفاده کرد.
- -mvr4130-align
- -mno-vr4130-align
- خطلوله VR4130
از نوع
سوپراسکالر
دوگانه (two-way superscalar)
است، اما
تنها در
صورتی
میتواند
دو
دستورالعمل
را با هم
صادر (issue) کند
که اولی
تراز ۸
بایتی
داشته باشد.
هنگامی که
این گزینه
فعال باشد،
GCC
جفتدستورالعملهایی
را که به
نظرش باید
بهصورت
موازی اجرا
شوند تراز
میکند.
این گزینه تنها هنگام بهینهسازی برای VR4130 اثر دارد. این کار معمولاً کد را سریعتر میکند، اما به قیمت بزرگتر شدن حجم آن تمام میشود. این گزینه بهطور پیشفرض در سطح بهینهسازی -O3 فعال است.
- -msynci
- -mno-synci
- تولید
دستورالعملهای
"synci" را
در
معماریهایی
که از آن
پشتیبانی
میکنند،
فعال
(غیرفعال)
میکند.
دستورالعملهای
"synci" (در
صورت فعال
بودن) هنگام
کامپایل
"__builtin___clear_cache"
تولید
میشوند.
این گزینه بهطور پیشفرض روی -mno-synci تنظیم شده است، اما میتوان با پیکربندی GCC با --with-synci مقدار پیشفرض را تغییر داد.
هنگام کامپایل کد برای سیستمهای تکپردازندهای، استفاده از "synci" عموماً ایمن است. با این حال، در بسیاری از سیستمهای چندهستهای (SMP)، این دستور حافظههای موقت دستورالعمل را در همه هستهها باطل نمیکند و ممکن است به رفتار تعریفنشده منجر شود.
- -mrelax-pic-calls
- -mno-relax-pic-calls
- تلاش
میکند
فراخوانیهای
PIC را که
معمولاً از
طریق ثبات
$25 ارسال
(dispatch) میشوند
به
فراخوانیهای
مستقیم
تبدیل کند.
این کار
تنها در
صورتی
امکانپذیر
است که
پیونددهنده
بتواند
مقصد را در
زمان پیوند
حل کند و
مقصد در
محدوده
مجاز برای
یک
فراخوانی
مستقیم
باشد.
در صورتی که 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) را
در ABI o32 فعال
(غیرفعال)
میکند.
هنگام
استفاده از
ABI o32، توابع
فراخواننده
۱۶ بایت را
در پشته
تخصیص
میدهند تا
تابع
فراخواندهشده
بتواند
آرگومانهای
ثبات را در
آن بنویسد.
هنگامی که
فعال باشد،
این
بهینهسازی
در صورتی که
مشخص شود
سرآیند
فریم
بلااستفاده
است، از
تخصیص آن
جلوگیری
میکند.
این بهینهسازی بهطور پیشفرض در تمام سطوح بهینهسازی غیرفعال است..IP -mlxc1-sxc1 4
- -mno-lxc1-sxc1
- در صورت امکان، تولید دستورالعملهای "lwxc1"، "swxc1"، "ldxc1" و "sdxc1" را فعال (غیرفعال) میکند. این گزینه بهطور پیشفرض فعال است.
- -mmadd4
- -mno-madd4
- در صورت امکان، تولید دستورالعملهای ۴-عملوندی "madd.s"، "madd.d" و دستورالعملهای مرتبط را فعال (غیرفعال) میکند. این گزینه بهطور پیشفرض فعال است.
گزینههای MMIX
این گزینهها برای MMIX تعریف شدهاند:
- -mlibfuncs
- -mno-libfuncs
- مشخص میکند که توابع درونی کتابخانه کامپایل میشوند، بهطوری که تمام مقادیر بدون توجه به اندازه، در ثباتها منتقل شوند.
- -mepsilon
- -mno-epsilon
- دستورالعملهای مقایسه ممیز شناور را تولید میکند که نسبت به ثبات اپسیلون "rE" مقایسه انجام میدهند.
- -mabi=mmixware
- -mabi=gnu
- کدی تولید میکند که پارامترهای تابع و مقادیر بازگشتی را بهگونهای منتقل میکند که (در تابع فراخوانیشده) به عنوان ثباتهای $0 به بالا دیده شوند، بر خلاف GNU ABI که از ثباتهای سراسری $231 به بالا استفاده میکند.
- -mzero-extend
- -mno-zero-extend
- هنگام خواندن دادهها از حافظه در اندازههای کوتاهتر از ۶۴ بیت، بهطور پیشفرض به جای دستورالعملهای گسترش علامت، از دستورالعملهای بارگذاری با گسترش صفر استفاده میکند (یا نمیکند).
- -mknuthdiv
- -mno-knuthdiv
- باعث میشود نتیجه تقسیمی که باقیمانده دارد، با مقسومعلیه همعلامت باشد. در حالت پیشفرض، یعنی -mno-knuthdiv، علامت باقیمانده از علامت مقسوم پیروی میکند. هر دو روش از نظر حسابی معتبر هستند، اما روش دوم تقریباً بهطور انحصاری استفاده میشود.
- -mtoplevel-symbols
- -mno-toplevel-symbols
- یک علامت : را به ابتدای تمام نمادهای سراسری اضافه میکند (یا اضافه نمیکند)، تا کد اسمبلی بتواند با دستور اسمبلی "PREFIX" استفاده شود.
- -melf
- یک فایل اجرایی در قالب ELF تولید میکند، به جای قالب پیشفرض mmo که توسط شبیهساز mmix استفاده میشود.
- -mbranch-predict
- -mno-branch-predict
- هنگامی که پیشبینی ایستای شاخه نشاندهنده یک شاخه محتمل باشد، از دستورالعملهای شاخه محتمل استفاده میکند (یا نمیکند).
- -mbase-addresses
- -mno-base-addresses
- کدی تولید میکند (یا نمیکند) که از آدرسهای پایه استفاده میکند. استفاده از یک آدرس پایه بهطور خودکار درخواستی (که توسط اسمبلر و پیونددهنده مدیریت میشود) برای برپایی یک مقدار ثابت در یک ثبات سراسری تولید میکند. این ثبات برای یک یا چند درخواست آدرس پایه در محدوده ۰ تا ۲۵۵ از مقدار نگهداریشده در ثبات به کار میرود. این امر معمولاً به کدی کوتاهتر و سریعتر منجر میشود، اما تعداد اقلام داده مختلف قابل آدرسدهی محدود است. این یعنی برنامهای که از دادههای ایستای فراوانی استفاده میکند ممکن است به -mno-base-addresses نیاز داشته باشد.
- -msingle-exit
- -mno-single-exit
- کد تولیدشده را مجبور میکند (یا نمیکند) که در هر تابع تنها یک نقطه خروج واحد داشته باشد.
گزینههای MN10300
این گزینههای -m برای معماریهای Matsushita MN10300 تعریف شدهاند:
- -mmult-bug
- کدی تولید میکند که از باگهای موجود در دستورالعملهای ضرب برای پردازندههای MN10300 اجتناب کند. این حالت پیشفرض است.
- -mno-mult-bug
- کدی برای اجتناب از باگهای موجود در دستورالعملهای ضرب برای پردازندههای MN10300 تولید نمیکند.
- -mam33
- کدی با استفاده از ویژگیهای مختص پردازنده AM33 تولید میکند.
- -mno-am33
- کدی با استفاده از ویژگیهای مختص پردازنده AM33 تولید نمیکند. این حالت پیشفرض است.
- -mam33-2
- کدی با استفاده از ویژگیهای مختص پردازنده AM33/2.0 تولید میکند.
- -mam34
- کدی با استفاده از ویژگیهای مختص پردازنده AM34 تولید میکند.
- -mtune=cpu-type
- هنگام زمانبندی دستورالعملها، از مشخصههای زمانی نوع CPU مشخصشده استفاده میکند. این گزینه نوع پردازنده هدف را تغییر نمیدهد. نوع CPU باید یکی از mn10300، am33، am33-2 یا am34 باشد.
- -mreturn-pointer-on-d0
- هنگام تولید تابعی که یک اشارهگر را برمیگرداند، اشارهگر را در هر دو ثبات "a0" و "d0" بازمیگرداند. در غیر این صورت، اشارهگر تنها در "a0" بازگردانده میشود و تلاش برای فراخوانی چنین توابعی بدون پیشنمونه منجر به خطا میشود. توجه داشته باشید که این گزینه بهطور پیشفرض روشن است؛ برای غیرفعال کردن آن از -mno-return-pointer-on-d0 استفاده کنید.
- -mno-crt0
- فایل شیء راهاندازی زمان اجرای C را پیوند نمیزند.
- -mrelax
- به
پیونددهنده
اعلام
میکند که
باید یک گام
بهینهسازی
ریلکسیشن
را برای
کوتاه کردن
انشعابها،
فراخوانیها
و آدرسهای
مطلق حافظه
انجام دهد.
این گزینه
تنها زمانی
اثر دارد که
در خط فرمان
برای مرحله
نهایی
پیوند
استفاده
شود.
این گزینه اشکالزدایی نمادین را غیرممکن میسازد.
- -mliw
- در صورتی که هدف AM33 یا جدیدتر باشد، به کامپایلر اجازه میدهد دستورالعملهای Long Instruction Word را تولید کند. این حالت پیشفرض است. این گزینه ماکروی پیشپردازنده "__LIW__" را تعریف میکند.
- -mno-liw
- به کامپایلر اجازه تولید دستورالعملهای Long Instruction Word را نمیدهد. این گزینه ماکروی پیشپردازنده "__NO_LIW__" را تعریف میکند.
- -msetlb
- در صورتی که هدف AM33 یا جدیدتر باشد، به کامپایلر اجازه میدهد دستورالعملهای SETLB و Lcc را تولید کند. این حالت پیشفرض است. این گزینه ماکروی پیشپردازنده "__SETLB__" را تعریف میکند.
- -mno-setlb
- به کامپایلر اجازه تولید دستورالعملهای SETLB یا Lcc را نمیدهد. این گزینه ماکروی پیشپردازنده "__NO_SETLB__" را تعریف میکند.
گزینههای Moxie
- -meb
- کد بزرگپایان (big-endian) تولید میکند. این حالت پیشفرض برای پیکربندیهای moxie-*-* است..IP -mel 4 تولید کد با پایانپذیری ریز (little-endian).
- -mmul.x
- تولید دستورالعملهای mul.x و umul.x. این مقدار پیشفرض برای پیکربندیهای moxiebox-*-* است.
- -mno-crt0
- عدم پیوند فایل شیء مقداردهی اولیه زمان اجرای C (C run-time initialization).
گزینههای MSP430
این گزینهها برای MSP430 تعریف شدهاند:
- -masm-hex
- وادار کردن خروجی اسمبلی به استفاده همیشگی از مقادیر ثابت هگزادسیمال. بهطور معمول چنین ثوابتی دهدهی علامتدار هستند، اما این گزینه برای اهداف مجموعه آزمون (testsuite) و/یا زیباییشناختی در دسترس است.
- -mmcu=
- انتخاب MCU
هدف. از این
گزینه برای
ایجاد یک
نماد
پیشپردازنده
C بر اساس
نام MCU
استفاده
میشود که
به حروف
بزرگ تبدیل
شده و
پیشوند و
پسوند __ به
آن اضافه
شده است.
این نماد به
نوبه خود
توسط فایل
سرایند msp430.h
برای
انتخاب یک
فایل
سرایند
تکمیلی
ویژه MCU
استفاده
میشود.
این گزینه همچنین ISA مورد استفاده را تعیین میکند. اگر نام MCU از نوعی باشد که مشخصاً تنها از 430 ISA پشتیبانی میکند، همان انتخاب میشود، در غیر این صورت 430X ISA انتخاب خواهد شد. نام MCU عمومی msp430 نیز میتواند برای انتخاب 430 ISA استفاده شود. به طور مشابه، نام عمومی msp430x برای MCU، مقدار 430X ISA را انتخاب میکند.
علاوه بر این، یک اسکریپت پیونددهنده ویژه MCU به خط فرمان پیونددهنده اضافه میشود. نام اسکریپت، نام MCU به همراه پسوند .ld است. بنابراین، مشخص کردن -mmcu=xxx در خط فرمان gcc، نماد پیشپردازنده C "__XXX__" را تعریف کرده و باعث میشود پیونددهنده به دنبال اسکریپتی به نام xxx.ld بگردد.
پشتیبانی از ISA و ضرب سختافزاری برای MCUهای مختلف بهطور ثابت درون GCC کدنویسی (hard-code) شده است. با این حال، یک فایل خارجی devices.csv میتواند برای گسترش پشتیبانی از دستگاهها فراتر از موارد کدنویسیشده استفاده شود.
دستور GCC با استفاده از روشهای زیر و بر اساس اولویت ذکر شده، به دنبال فایل devices.csv میگردد؛ به طوری که روش نخست بر روش دوم، و روش دوم بر روش سوم اولویت دارد.
- مسیر include مشخصشده با "-I" و "-L"
- فایل devices.csv در هر یک از دایرکتوریهای مشخصشده توسط مسیرهای include و مسیرهای جستجوی کتابخانه پیونددهنده جستجو میشود.
- مسیر مشخصشده توسط متغیر محیطی MSP430_GCC_INCLUDE_DIR
- مقدار متغیر محیطی سراسری MSP430_GCC_INCLUDE_DIR را برابر با مسیر کامل دایرکتوری حاوی devices.csv تنظیم کنید تا GCC این دایرکتوری را برای devices.csv جستجو کند. اگر devices.csv پیدا شود، این دایرکتوری همچنین به عنوان مسیر include و مسیر کتابخانه پیونددهنده ثبت میشود. بنابراین فایلهای سرایند و اسکریپتهای پیونددهنده موجود در این دایرکتوری میتوانند بدون نیاز به مشخص کردن دستی "-I" و "-L" در خط فرمان استفاده شوند.
- دایرکتوری msp430-elf{,bare}/include/devices
- در نهایت، GCC دایرکتوری msp430-elf{,bare}/include/devices را از دایرکتوری ریشه زنجیره ابزار بررسی میکند. این دایرکتوری در یک نصب پیشفرض وجود ندارد، اما اگر کاربر آن را ایجاد کرده و devices.csv را در آنجا کپی کرده باشد، دادههای MCU خوانده میشوند. مشابه بالا، این دایرکتوری نیز به عنوان مسیر include و مسیر کتابخانه پیونددهنده ثبت میشود.
اگر هیچکدام از روشهای جستجوی بالا devices.csv را پیدا نکنند، دادههای کدنویسیشده ثابت MCU استفاده میشوند.
- -mwarn-mcu
- -mno-warn-mcu
- این گزینه هشدارهای مربوط به تداخل میان نام MCU مشخصشده با گزینه -mmcu و ISA تعیینشده توسط گزینه -mcpu و/یا پشتیبانی ضرب سختافزاری تعیینشده توسط گزینه -mhwmult را فعال یا غیرفعال میکند. این گزینه همچنین هشدارهای مربوط به نامهای ناشناخته MCU را تغییر وضعیت میدهد. این گزینه بهطور پیشفرض فعال است.
- -mcpu=
- معماری مجموعه دستورالعمل (ISA) مورد استفاده را مشخص میکند. مقادیر پذیرفتهشده عبارتند از msp430، msp430x و msp430xv2. این گزینه منسوخ شده است. برای انتخاب ISA باید از گزینه -mmcu= استفاده شود.
- -msim
- پیوند به کتابخانههای زمان اجرای شبیهساز و اسکریپت پیونددهنده. این گزینه بر هر اسکریپتی که توسط گزینه -mmcu= انتخاب شود ارجحیت دارد.
- -mlarge
- استفاده از آدرسدهی مدل بزرگ (اشارهگرهای ۲۰ بیتی، "size_t" ۲۰ بیتی).
- -msmall
- استفاده از آدرسدهی مدل کوچک (اشارهگرهای ۱۶ بیتی، "size_t" ۱۶ بیتی).
- -mrelax
- این گزینه به اسمبلر و پیونددهنده ارسال میشود، و به پیونددهنده اجازه میدهد بهینهسازیهای خاصی را انجام دهد که تا زمان پیوند نهایی قابل انجام نیستند.
- mhwmult=
- نوع ضرب
سختافزاری
پشتیبانیشده
توسط هدف را
شرح میدهد.
مقادیر
پذیرفتهشده
عبارتند از
none برای عدم
وجود ضرب
سختافزاری،
16bit برای ضرب
اولیه
منحصراً ۱۶
بیتی
پشتیبانیشده
در MCUهای
اولیه، 32bit
برای ضرب
۱۶/۳۲ بیتی
پشتیبانیشده
در MCUهای
بعدی و f5series
برای ضرب
۱۶/۳۲ بیتی
پشتیبانیشده
در MCUهای سری F5.
مقدار auto
نیز
میتواند
داده شود.
این به GCC
اعلام
میکند که
پشتیبانی
ضرب
سختافزاری
را بر اساس
نام MCU
ارائهشده
توسط گزینه
-mmcu استنتاج
کند. اگر
هیچ گزینه
-mmcu مشخص
نشده باشد
یا نام MCU
شناسایی
نشود، هیچ
پشتیبانی
ضرب
سختافزاری
در نظر
گرفته
نمیشود.
"auto"
تنظیمات
پیشفرض
است.
ضربهای سختافزاری معمولاً با فراخوانی یک روال کتابخانهای انجام میشوند. این کار در کد تولیدشده فضا ذخیره میکند. با این حال هنگام کامپایل با -O3 یا بالاتر، ضربکننده سختافزاری به صورت درونخطی (inline) فراخوانی میشود. این امر کدی حجیمتر اما سریعتر تولید میکند.
روالهای ضرب سختافزاری در حین اجرا وقفهها را غیرفعال کرده و پس از اتمام، وضعیت وقفه قبلی را بازیابی میکنند. این امر استفاده از آنها را در داخل گردانندههای وقفه و همچنین در کدهای معمولی ایمن میسازد.
- -minrt
- فعالسازی استفاده از یک محیط زمان اجرای کمینه - بدون مقداردهندههای اولیه یا سازندههای ایستا (static). این گزینه برای دستگاههای با حافظه محدود در نظر گرفته شده است. کامپایلر نمادهای خاصی را در برخی اشیاء میگنجاند که به پیونددهنده و زمان اجرا اعلام میکنند کدام قطعه کدها مورد نیاز هستند.
- -mtiny-printf
- فعالسازی
توابع
کتابخانهای
"printf" و
"puts" با
اندازه کد
کاهشیافته.
پیادهسازیهای
tiny این
توابع
بازگشتپذیر
(reentrant) نیستند،
بنابراین
باید در
برنامههای
چندنخی با
احتیاط
استفاده
شوند.
پشتیبانی از جریانها (streams) حذف شده و رشتهای که باید چاپ شود همیشه از طریق فراخوان سیستمی "write" به stdout ارسال خواهد شد. این رشته قبل از ارسال به write بافر نمیشود.
این گزینه به Newlib Nano IO نیاز دارد، بنابراین GCC باید با --enable-newlib-nano-formatted-io پیکربندی شده باشد.
- -mmax-inline-shift=
- این گزینه
یک عدد صحیح
بین ۰ تا ۶۴
(شامل هر دو)
میگیرد و
حداکثر
تعداد
دستورالعملهای
شیفت
درونخطی
را تعیین
میکند که
باید برای
انجام یک
عملیات
شیفت با
مقداری
ثابت صادر
شوند.
هنگامی که
نیاز باشد
از این
مقدار
فراتر رفته
شود، به جای
آن از یک
تابع کمکی mspabi
استفاده
میشود.
مقدار
پیشفرض ۴
است.
این گزینه فقط مواردی را تحت تأثیر قرار میدهد که در آنها شیفت به چندین موقعیت نتواند با یک دستورالعمل واحد انجام شود (مثلاً تمام شیفتهای بیشتر از ۱ در 430 ISA).
شیفتهای یک مقدار ۳۲ بیتی حداقل دو برابر هزینهبر هستند، بنابراین مقدار ارائهشده برای این گزینه بر ۲ تقسیم شده و مقدار حاصل به جای آن استفاده میشود.
- -mcode-region=
- -mdata-region=
- این گزینهها به کامپایلر اعلام میکنند توابع و دادههایی را که فاقد یکی از ویژگیهای "lower"، "upper"، "either" یا "section" هستند، در کجا قرار دهد. مقادیر ممکن عبارتند از "lower"، "upper"، "either" یا "any". سه مقدار اول مشابه ویژگی متناظر خود عمل میکنند. چهارمین مقدار ممکن - یعنی "any" - پیشفرض است. این مقدار، جایگذاری را کاملاً به اسکریپت پیونددهنده و نحوه تخصیص بخشهای استاندارد (".text"، ".data" و غیره) به نواحی حافظه توسط آن واگذار میکند.
- -msilicon-errata=
- این گزینه درخواستی را به اسمبلر ارسال میکند تا اصلاحات مربوط به اشکالات سختافزاری تراشه (silicon errata) نامبردهشده را فعال کند.
- -msilicon-errata-warn=
- این گزینه درخواستی را به اسمبلر ارسال میکند تا هنگام نیاز احتمالی به اعمال یک اشکال سختافزاری تراشه، پیامهای هشدار را فعال کند.
- -mwarn-devices-csv
- -mno-warn-devices-csv
- در صورت پیدا نشدن devices.csv یا وجود مشکل در تجزیهٔ آن، هشدار میدهد (پیشفرض: فعال).
گزینههای NDS32
این گزینهها برای پیادهسازیهای NDS32 تعریف شدهاند:
- -mbig-endian
- تولید کد در حالت big-endian.
- -mlittle-endian
- تولید کد در حالت little-endian.
- -mreduced-regs
- استفاده از مجموعهٔ ثباتهای کاهشیافته برای تخصیص ثبات.
- -mfull-regs
- استفاده از مجموعه کامل ثباتها برای تخصیص ثبات.
- -mcmov
- تولید دستورالعملهای انتقال شرطی.
- -mno-cmov
- عدم تولید دستورالعملهای انتقال شرطی.
- -mext-perf
- تولید دستورالعملهای افزونهٔ کارایی.
- -mno-ext-perf
- عدم تولید دستورالعملهای افزونهٔ کارایی.
- -mext-perf2
- تولید دستورالعملهای افزونهٔ کارایی ۲.
- -mno-ext-perf2
- عدم تولید دستورالعملهای افزونهٔ کارایی ۲.
- -mext-string
- تولید دستورالعملهای افزونهٔ رشته.
- -mno-ext-string
- عدم تولید دستورالعملهای افزونهٔ رشته.
- -mv3push
- تولید دستورالعملهای v3 push25/pop25.
- -mno-v3push
- عدم تولید دستورالعملهای v3 push25/pop25.
- -m16-bit
- تولید دستورالعملهای ۱۶ بیتی.
- -mno-16-bit
- عدم تولید دستورالعملهای ۱۶ بیتی.
- -misr-vector-size=num
- تعیین اندازهٔ هر بردار وقفه، که باید ۴ یا ۱۶ باشد.
- -mcache-block-size=num
- تعیین اندازهٔ هر بلوک کَش، که باید توانی از ۲ بین ۴ و ۵۱۲ باشد.
- -march=arch
- تعیین نام معماری هدف.
- -mcmodel=code-model
- تنظیم مدل کد روی یکی از موارد:
- small
- تمام سگمنتهای داده و دادههای فقطخواندنی باید درون فضای آدرسدهی 512KB باشند. سگمنت text باید درون فضای آدرسدهی 16MB باشد.
- medium
- سگمنت داده باید درون 512KB باشد در حالی که سگمنت دادههای فقطخواندنی میتواند درون فضای آدرسدهی 4GB باشد. سگمنت text همچنان باید درون فضای آدرسدهی 16MB باشد.
- large
- تمام سگمنتهای text و داده میتوانند درون فضای آدرسدهی 4GB باشند.
- -mctor-dtor
- فعالسازی ویژگی سازنده/نابودکننده (constructor/destructor).
- -mrelax
- هدایت پیونددهنده برای تعدیل و بهینهسازی دستورالعملها (relax instructions).
گزینههای Nvidia PTX
این گزینهها برای Nvidia PTX تعریف شدهاند:
- -m64
- نادیده گرفته میشود، اما برای سازگاری با نسخههای پیشین حفظ شده است. تنها ABI ۶۴ بیتی پشتیبانی میشود.
- -march=architecture-string
- تولید کد
برای
معماری هدف
PTX ISA مشخصشده.
رشتههای
معماری
معتبر
عبارتند از:
sm_30، sm_35، sm_37،
sm_52، sm_53، sm_61،
sm_70، sm_75، sm_80 و
sm_89. مقدار
پیشفرض به
نحوهٔ
پیکربندی
کامپایلر
بستگی
دارد، --with-arch
را ببینید.
این گزینه مقدار ماکروی پیشپردازندهٔ "__PTX_SM__" را تنظیم میکند؛ به عنوان مثال، برای sm_35، دارای مقدار 350 است.
- -misa=architecture-string
- نام مستعار -march=.
- -march-map=architecture-string
- نزدیکترین مقدار دردسترسِ -march= را انتخاب میکند که قابلیتهای بیشتری نداشته باشد. برای نمونه، برای -march-map=sm_50 مقدار -march=sm_37، و برای -march-map=sm_53 مقدار -march=sm_53 انتخاب میشود.
- -mptx=version-string
- تولید کد
برای نسخهٔ
PTX ISA مشخصشده.
رشتههای
نسخهٔ
معتبر
عبارتند از:
3.1، 4.1، 4.2،
5.0، 6.0، 6.3،
7.0، 7.3 و 7.8.
نسخهٔ
پیشفرض PTX ISA
نسخهای
است که
پشتیبانی
از معماری
هدف PTX ISA
انتخابشده
را افزوده
است، -march= را
ببینید،
اما دستکم
6.3، یا برای
-march=sm_52 و
بالاتر، 7.3
است.
این گزینه مقادیر ماکروهای پیشپردازندهٔ "__PTX_ISA_VERSION_MAJOR__" و "__PTX_ISA_VERSION_MINOR__" را تنظیم میکند؛ برای مثال، برای 3.1 این ماکروها به ترتیب دارای مقادیر 3 و 1 هستند.
- -mmainkernel
- پیوند زدن کد برای یک کرنل __main. این گزینه برای اجرای مستقل به جای اجرای باراندازیشده (offloading) است.
- -moptimize
- اعمال بهینهسازیهای اجرای بخشبندیشده (partitioned execution). این مقدار پیشفرض است هنگامی که هر سطحی از بهینهسازی انتخاب شده باشد.
- -msoft-stack
- -mno-soft-stack
- برای -mno-soft-stack
(حالت
پیشفرض،
مگر اینکه
-mgomp مشخص شده
باشد)، از
پشتههای
«بومی» PTX
استفاده
میشود،
یعنی کدی
تولید
میکند که
مستقیماً
از حافظهٔ
".local" یا
"alloca" در PTX
برای فضای
پشته
استفاده
میکند. مگر
در حالتی که
-mptx=7.3 یا
بالاتر و
-march=sm_52 یا
بالاتر
فعال
باشند،
آرایههای
با طول
متغیر و
تخصیص
پویای
حافظه روی
پشته با
"alloca"
پشتیبانی
نمیشوند.
برای -msoft-stack (که توسط -mgomp به صورت تلویحی اعمال میشود)، کدی تولید میشود که مستقیماً از حافظهٔ ".local" یا "alloca" در PTX برای فضای پشته استفاده نمیکند. در عوض، یک اشارهگر پشته به ازای هر warp بهطور صریح نگهداری میشود. این کار تخصیص پشته با طول متغیر (با آرایههای با طول متغیر یا "alloca") را ممکن میسازد، و هنگامی که از حافظهٔ سراسری برای فضای ذخیرهسازی زیرین استفاده شود، دسترسی به متغیرهای خودکار را از سایر ریسهها یا با دستورالعملهای اتمیک میسر میسازد. این روش تولید کد برای باراندازی (offloading) در OpenMP استفاده میشود، اما این گزینه به تنهایی نیز به منظور آزمایش کامپایلر ارائه شده است؛ برای تولید کد مناسب جهت پیوند در برنامههایی که از باراندازی OpenMP استفاده میکنند، از گزینهٔ -mgomp استفاده کنید.
- -muniform-simt
- تغییر حالت به شیوهٔ تولید کدی که به تمام ریسهها در هر warp اجازهٔ اجرا میدهد، در حالی که وضعیت حافظه و اثرات جانبی را بهگونهای حفظ میکند که گویی خارج از نواحی SIMD در OpenMP تنها یک ریسه در هر warp فعال بوده است. تمام عملیاتهای اتمیک و فراخوانیهای زمان اجرا (malloc، free، vprintf) بهصورت شرطی اجرا میشوند (اگر و تنها اگر شاخص lane جاری با شاخص lane اصلی برابر باشد)، و ثباتی که مقداردهی میشود، از طریق یک دستورالعمل shuffle از lane اصلی کپی میگردد. در خارج از نواحی SIMD، مسیر lane 0 به عنوان اصلی (master) است؛ درون آنها، هر ریسه خود را به عنوان اصلی میبیند. آرایهٔ حافظهٔ اشتراکی "int __nvptx_uni[]" ماسکهای بیتیِ تمامصفر یا تمامیک را برای هر warp ذخیره میکند که نشاندهندهٔ حالت جاری است (۰ در خارج از نواحی SIMD). هر ریسه میتواند ماسک بیتی در موقعیت "tid.y" را با شاخص lane جاری AND بیتی کند تا شاخص lane اصلی را محاسبه نماید..IP -mgomp 4 تولید کد برای استفاده در برونسپاری پردازش (offloading) در OpenMP: گزینههای -msoft-stack و -muniform-simt را فعال کرده و گونه multilib متناظر را انتخاب میکند.
گزینههای OpenRISC
این گزینهها برای OpenRISC تعریف شدهاند:
- -mboard=name
- پیکربندی محیط زمان اجرای مخصوص یک برد مشخص. این مقدار برای پیوند با کتابخانه برد newlib به پیونددهنده ارسال میشود. مقدار پیشفرض "or1ksim" است.
- -mnewlib
- این گزینه نادیده گرفته میشود؛ کاربرد آن صرفاً برای سازگاری است. پیشتر برای انتخاب گزینههای پیونددهنده و پیشپردازنده جهت استفاده با newlib به کار میرفت.
- -msoft-div
- -mhard-div
- انتخاب دستورهای تقسیم نرمافزاری یا سختافزاری ("l.div"، "l.divu"). پیشفرض، تقسیم سختافزاری است.
- -msoft-mul
- -mhard-mul
- انتخاب دستورهای ضرب نرمافزاری یا سختافزاری ("l.mul"، "l.muli"). پیشفرض، ضرب سختافزاری است.
- -msoft-float
- -mhard-float
- انتخاب حالت نرمافزاری یا سختافزاری برای محاسبات ممیز شناور. پیشفرض، نرمافزاری است.
- -mdouble-float
- در صورت انتخاب -mhard-float، تولید دستورهای ممیز شناور با دقت مضاعف را فعال میکند. بهطور پیشفرض، برای انجام محاسبات ممیز شناور با دقت مضاعف از توابع 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).
- -mno-ac0
- بازگرداندن نتایج ممیز شناور در حافظه. این رفتار پیشفرض است.
- -m40
- تولید کد برای یک PDP-11/40. مستلزم -msoft-float و -mno-split است.
- -m45
- تولید کد برای یک PDP-11/45. این حالت پیشفرض است.
- -m10
- تولید کد برای یک PDP-11/10. مستلزم -msoft-float و -mno-split است.
- -mint16
- -mno-int32
- استفاده از "int" ۱۶-بیتی. این حالت پیشفرض است.
- -mint32
- -mno-int16
- استفاده از "int" ۳۲-بیتی.
- -msplit
- فضای دستورالعمل و داده در هدف تفکیک شده است. مستلزم -m45 است.
- -munix-asm
- استفاده از نحو اسمبلر Unix.
- -mdec-asm
- استفاده از نحو اسمبلر DEC.
- -mgnu-asm
- استفاده از نحو اسمبلر GNU. این گزینه پیشفرض است.
- -mlra
- استفاده از تخصیصدهنده ثبات جدید LRA. بهطور پیشفرض، از تخصیصدهنده قدیمی «reload» استفاده میشود.
گزینههای PowerPC
این موارد در زیر فهرست شدهاند:
گزینههای PRU
این گزینههای خط فرمان برای هدف PRU تعریف شدهاند:
- -minrt
- پیوند دادن
با حداقل
محیط زمان
اجرا. این
کار
میتواند
اندازه
باینری
نهایی ELF را
بهمیزان
قابلتوجهی
کاهش دهد،
اما برخی از
ویژگیهای
استاندارد
زمان اجرای
C حذف
میشوند.
این گزینه پشتیبانی از مقداردهندههای اولیه و سازندههای استاتیک را غیرفعال میکند. توجه داشته باشید که کامپایلر همچنان ممکن است کدی همراه با مقداردهندههای اولیه و سازندههای استاتیک تولید کند. این بر عهده برنامهنویس است که اطمینان حاصل کند برنامه مبدأ از این ویژگیها استفاده نخواهد کرد.
کد راهاندازی حداقلی، آرگومانهای "argc" و "argv" را به "main" ارسال نمیکند، بنابراین تابع اصلی باید بهصورت "int main (void)" تعریف شود. این موضوع در بیشتر پروژههای سفتافزار (firmware) یک استاندارد رایج است.
- -mmcu=mcu
- مشخص کردن
گونه
سختافزاری
PRU مورد
استفاده. یک
فایل
مشخصات (spec file)
با نام
متناظر
بارگذاری
خواهد شد که
اندازههای
ناحیه
حافظه را به
پیونددهنده
ارسال کرده
و ماکروهای
C مخصوص
سختافزار
را تعریف
میکند.
محیط Newlib تنها مشخصات "sim" را ارائه میدهد که برای اجرای آزمونهای رگرسیون با استفاده از شبیهساز در نظر گرفته شده است. مشخصات مربوط به سختافزار واقعی را میتوان با نصب بسته GnuPruMcu ("https://github.com/dinuxbg/gnuprumcu") بهدست آورد.
- -mno-relax
- تنظیم GCC برای ارسال گزینه خط فرمان --no-relax به پیونددهنده به جای گزینه --relax..IP -mloop 4 به GCC اجازه میدهد (یا اجازه نمیدهد) از دستورالعمل LOOP استفاده کند.
- -mabi=variant
- گونهٔ ABI مورد نظر برای تولید کد را مشخص میکند. -mabi=ti گونهٔ دستنخوردهٔ TI ABI را انتخاب میکند، در حالی که -mabi=gnu گونهای از GNU را انتخاب میکند که با فرضیات خاص GCC سازگاری طبیعیتری دارد. تفاوتها از این قرارند:
- اندازهٔ اشارهگر تابع
- در TI ABI مشخص شده است که اشارهگرهای تابع (کد) ۱۶ بیتی هستند، در حالی که GNU تنها از اشارهگرهای داده و کد ۳۲ بیتی پشتیبانی میکند.
- اشارهگر اختیاری مقدار بازگشتی
- مقادیر بازگشتی توابع که بزرگتر از ۶۴ بیت هستند با استفاده از یک اشارهگر پنهان به عنوان نخستین آرگومان تابع ارسال میشوند. با این حال، TI ABI الزام میکند که در صورت عدم استفادهٔ فراخواننده از مقدار بازگشتی، این اشارهگر میتواند NULL باشد. GNU همیشه یک اشارهگر معتبر برای مقدار بازگشتی ارسال کرده و انتظار دارد.
پیادهسازی فعلی -mabi=ti در هنگام شناسایی هر یک از ساختارهای کدی بالا، صرفاً یک خطای کامپایل ایجاد میکند. در نتیجه، کتابخانهٔ استاندارد C قابل ساخت نبوده و هنگام پیوند دادن با -mabi=ti حذف میشود.
قابلیت Relaxation یک ویژگی GNU است و به دلایل ایمنی در هنگام استفاده از -mabi=ti غیرفعال میشود. زنجیرهابزار TI اطلاعات بازنشانی (relocation) را برای دستورالعملهای 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
- نسخهٔ مشخصات RISC-V Unprivileged (پیشتر سطح کاربر یا User-Level) را برای انطباق کدهای تولیدی با آن مشخص میکند. مقادیر ممکن برای ISA-spec-string عبارتند از:
- 2.2
- تولید کد منطبق با نسخهٔ 2.2.
- 20190608
- تولید کد منطبق با نسخهٔ 20190608.
- 20191213
- تولید کد منطبق با نسخهٔ 20191213.
پیشفرض -misa-spec=20191213 است مگر اینکه GCC با --with-isa-spec= برای مشخص کردن نسخهٔ پیشفرض متفاوتی پیکربندی شده باشد.
- -march=ISA-string
- برای ISA
دادهشده
از RISC-V کد
تولید
میکند
(مانند rv64im).
رشتههای ISA
باید با
حروف کوچک
باشند.
نمونهها
شامل rv64i، rv32g،
rv32e و rv32imaf
هستند.
علاوه بر
این، مقدار
ویژهٔ help (-march=help)
برای فهرست
کردن تمام
افزونههای
پشتیبانیشده
پذیرفته
میشود.
نحو رشتهٔ ISA به صورت زیر تعریف میشود:
- "رشته باید با rv32 یا rv64 آغاز شود و در پی آن"
- i، e یا g قرار گیرد که بهعنوان ISA پایه شناخته میشوند.
- "بخش بعدی رشته فهرستی از نامهای افزونه است. نامهای"
- افزونه میتوانند به چندحرفی (مانند zba) و تکحرفی (مانند v) دستهبندی شوند. افزونههای تکحرفی میتوانند بهصورت متوالی ظاهر شوند، اما افزونههای چندحرفی باید با زیرخط (underscore) از هم جدا شوند.
- "یک زیرخط میتواند در هر کجای پس از ISA پایه قرار گیرد. این کار هیچ اثر"
- خاصی ندارد اما برای بهبود خوانایی استفاده میشود و میتواند به عنوان یک جداکننده عمل کند.
- "نامهای افزونه ممکن است شامل یک شماره نسخهٔ اختیاری باشند، که از نحو"
- <major>p<minor> یا <major> پیروی میکند (مانند m2p1 یا m2).
افزونههای پشتیبانیشده در زیر فهرست شدهاند:
- نام افزونه : نسخهٔ پشتیبانیشده : توضیحات
- i
- @tab 2.0, 2.1 @tab افزونهٔ پایهٔ عدد صحیح.
- e
- @tab 2.0 @tab افزونهٔ پایهٔ عدد صحیح کاهشیافته.
- g
- @tab - @tab افزونهٔ پایهٔ محاسبات همهمنظوره، g به i، m، a، f، d، zicsr و zifencei بسط مییابد.
- m
- @tab 2.0 @tab افزونهٔ ضرب و تقسیم اعداد صحیح.
- a
- @tab 2.0, 2.1 @tab افزونهٔ اتمیک (Atomic)..IP f 4 @tab 2.0, 2.2 @tab افزونهٔ ممیز شناور با دقت تکی.
- d
- @tab 2.0, 2.2 @tab افزونهٔ ممیز شناور با دقت مضاعف.
- c
- @tab 2.0 @tab افزونهٔ فشرده.
- h
- @tab 1.0 @tab افزونهٔ هایپروایزر.
- v
- @tab 1.0 @tab افزونهٔ برداری.
- zicsr
- @tab 2.0 @tab افزونهٔ دسترسی به ثباتهای کنترل و وضعیت.
- zifencei
- @tab 2.0 @tab افزونهٔ سد واکشی دستورالعمل (Instruction-fetch fence).
- zicond
- @tab 1.0 @tab افزونهٔ عملیات شرطی اعداد صحیح.
- za64rs
- @tab 1.0 @tab اندازهٔ مجموعهٔ رزرو ۶۴ بایت.
- za128rs
- @tab 1.0 @tab اندازهٔ مجموعهٔ رزرو ۱۲۸ بایت.
- zawrs
- @tab 1.0 @tab افزونهٔ انتظار روی مجموعهٔ رزرو.
- zba
- @tab 1.0 @tab افزونهٔ محاسبات آدرس.
- zbb
- @tab 1.0 @tab افزونهٔ پایهای دستکاری بیت.
- zbc
- @tab 1.0 @tab افزونهٔ ضرب بدون رقم نقلی.
- zbs
- @tab 1.0 @tab افزونهٔ عملیات تکبیتی.
- zfinx
- @tab 1.0 @tab افزونهٔ ممیز شناور با دقت تکی در ثباتهای عدد صحیح.
- zdinx
- @tab 1.0 @tab افزونهٔ ممیز شناور با دقت مضاعف در ثباتهای عدد صحیح.
- zhinx
- @tab 1.0 @tab افزونهٔ ممیز شناور با نیمدقت در ثباتهای عدد صحیح.
- zhinxmin
- @tab 1.0 @tab افزونهٔ کمینهٔ ممیز شناور با نیمدقت در ثباتهای عدد صحیح.
- zbkb
- @tab 1.0 @tab افزونهٔ دستکاری بیت برای رمزنگاری.
- zbkc
- @tab 1.0 @tab افزونهٔ ضرب بدون رقم نقلی برای رمزنگاری.
- zbkx
- @tab 1.0 @tab افزونهٔ جایگشت کراسبار برای رمزنگاری.
- zkne
- @tab 1.0 @tab افزونهٔ رمزگذاری AES.
- zknd
- @tab 1.0 @tab افزونهٔ رمزگشایی AES.
- zknh
- @tab 1.0 @tab افزونهٔ توابع درهمسازی.
- zkr
- @tab 1.0 @tab افزونهٔ منبع آنتروپی.
- zksed
- @tab 1.0 @tab افزونهٔ رمز قالبی SM4.
- zksh
- @tab 1.0 @tab افزونهٔ تابع درهمسازی SM3.
- zkt
- @tab 1.0 @tab افزونهٔ تأخیر اجرای ناوابسته به داده.
- zk
- @tab 1.0 @tab افزونهٔ استاندارد رمزنگاری نردهای (اسکالر).
- zkn
- @tab 1.0 @tab افزونهٔ مجموعه الگوریتمهای NIST.
- zks
- @tab 1.0 @tab افزونهٔ مجموعه الگوریتمهای ShangMi.
- zihintntl
- @tab 1.0 @tab افزونهٔ راهنماهای محلیبودن غیرزمانی.
- zihintpause
- @tab 1.0 @tab افزونهٔ راهنمای توقف (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)..IP zve32x 4 @tab 1.0 @tab افزونههای برداری برای پردازندههای تعبیهشده.
- zve32f
- @tab 1.0 @tab افزونههای برداری برای پردازندههای تعبیهشده.
- zve64x
- @tab 1.0 @tab افزونههای برداری برای پردازندههای تعبیهشده.
- zve64f
- @tab 1.0 @tab افزونههای برداری برای پردازندههای تعبیهشده.
- zve64d
- @tab 1.0 @tab افزونههای برداری برای پردازندههای تعبیهشده.
- zvl32b
- @tab 1.0 @tab افزونههای استاندارد کمینهٔ طول بردار.
- zvl64b
- @tab 1.0 @tab افزونههای استاندارد کمینهٔ طول بردار.
- zvl128b
- @tab 1.0 @tab افزونههای استاندارد کمینهٔ طول بردار.
- zvl256b
- @tab 1.0 @tab افزونههای استاندارد کمینهٔ طول بردار.
- zvl512b
- @tab 1.0 @tab افزونههای استاندارد کمینهٔ طول بردار.
- zvl1024b
- @tab 1.0 @tab افزونههای استاندارد کمینهٔ طول بردار.
- zvl2048b
- @tab 1.0 @tab افزونههای استاندارد کمینهٔ طول بردار.
- zvl4096b
- @tab 1.0 @tab افزونههای استاندارد کمینهٔ طول بردار.
- zvbb
- @tab 1.0 @tab افزونهٔ برداری دستکاری بیتی پایه.
- zvbc
- @tab 1.0 @tab افزونهٔ برداری ضرب بدون رقمانتقال.
- zvkb
- @tab 1.0 @tab افزونهٔ برداری دستکاری بیتی رمزنگاری.
- zvkg
- @tab 1.0 @tab افزونهٔ برداری GCM/GMAC.
- zvkned
- @tab 1.0 @tab افزونهٔ برداری رمز قالبی AES.
- zvknha
- @tab 1.0 @tab افزونهٔ برداری درهمساز امن SHA-2.
- zvknhb
- @tab 1.0 @tab افزونهٔ برداری درهمساز امن SHA-2.
- zvksed
- @tab 1.0 @tab افزونهٔ برداری رمز قالبی SM4.
- zvksh
- @tab 1.0 @tab افزونهٔ برداری درهمساز امن SM3.
- zvkn
- @tab 1.0 @tab افزونهٔ مجموعه الگوریتمهای برداری NIST؛ zvkn به zvkned، zvknhb، zvkb و zvkt بسط مییابد.
- zvknc
- @tab 1.0 @tab افزونهٔ مجموعه الگوریتمهای برداری NIST همراه با ضرب بدون رقمانتقال؛ zvknc به zvkn و zvbc بسط مییابد.
- zvkng
- @tab 1.0 @tab افزونهٔ مجموعه الگوریتمهای برداری NIST همراه با GCM؛ zvkng به zvkn و zvkg بسط مییابد.
- zvks
- @tab 1.0 @tab افزونهٔ مجموعه الگوریتمهای برداری ShangMi؛ zvks به zvksed، zvksh، zvkb و zvkt بسط مییابد.
- zvksc
- @tab 1.0 @tab افزونهٔ مجموعه الگوریتمهای برداری ShangMi همراه با ضرب بدون رقمانتقال؛ zvksc به zvks و zvbc بسط مییابد.
- zvksg
- @tab 1.0 @tab افزونهٔ مجموعه الگوریتمهای برداری ShangMi همراه با GCM؛ zvksg به zvks و zvkg بسط مییابد.
- zvkt
- @tab 1.0 @tab افزونهٔ برداری تأخیر اجرای مستقل از داده.
- zfh
- @tab 1.0 @tab افزونهٔ ممیز شناور با دقت نیمه.
- zfhmin
- @tab 1.0 @tab افزونهٔ کمینهٔ ممیز شناور با دقت نیمه.
- zvfh
- @tab 1.0 @tab افزونهٔ برداری ممیز شناور با دقت نیمه.
- zvfhmin
- @tab 1.0 @tab افزونهٔ کمینهٔ برداری ممیز شناور با دقت نیمه.
- zvfbfmin
- @tab 1.0 @tab افزونهٔ برداری تبدیلهای BF16.
- zfa
- @tab 1.0 @tab افزونهٔ ممیز شناور تکمیلی.
- zmmul
- @tab 1.0 @tab افزونهٔ ضرب اعداد صحیح.
- zca
- @tab 1.0 @tab افزونهٔ دستورهای فشردهٔ اعداد صحیح.
- zcf
- @tab 1.0 @tab افزونهٔ فشردهٔ بارگذاری و ذخیرهٔ ممیز شناور با دقت یگانه.
- zcd
- @tab 1.0 @tab افزونهٔ فشردهٔ بارگذاری و ذخیرهٔ ممیز شناور با دقت مضاعف.
- zcb
- @tab 1.0 @tab افزونهٔ دستورهای فشردهٔ ساده.
- zce
- @tab 1.0 @tab افزونههای دستورهای فشرده برای پردازندههای تعبیهشده.
- zcmp
- @tab 1.0 @tab افزونهٔ فشردهٔ push و pop.
- zcmt
- @tab 1.0 @tab افزونهٔ دستور پرش جدولی.
- smaia
- @tab 1.0 @tab افزونهٔ معماری پیشرفتهٔ وقفه..IP smepmp 4 @tab 1.0 @tab بهبودهای PMP برای دسترسی به حافظه و جلوگیری از اجرا در Machine mode.
- smstateen
- @tab 1.0 @tab افزونهٔ فعالسازی وضعیت (State enable).
- ssaia
- @tab 1.0 @tab افزونهٔ معماری پیشرفتهٔ وقفه برای supervisor-mode.
- sscofpmf
- @tab 1.0 @tab افزونهٔ پالایش و سرریز شمارش.
- ssstateen
- @tab 1.0 @tab افزونهٔ فعالسازی وضعیت برای supervisor-mode.
- sstc
- @tab 1.0 @tab افزونهٔ وقفههای زمانسنج برای supervisor-mode.
- svinval
- @tab 1.0 @tab افزونهٔ باطلسازی ریزدانهٔ کَش ترجمهٔ آدرس.
- svnapot
- @tab 1.0 @tab افزونهٔ پیوستگی ترجمهٔ NAPOT.
- svpbmt
- @tab 1.0 @tab افزونهٔ انواع حافظهٔ مبتنی بر صفحه.
- xcvmac
- @tab 1.0 @tab افزونهٔ ضرب-انباشت Core-V.
- xcvalu
- @tab 1.0 @tab افزونهٔ ALU متفرقهٔ Core-V.
- xcvelw
- @tab 1.0 @tab افزونهٔ بارگذاری کلمهٔ رویداد در Core-V.
- xtheadba
- @tab 1.0 @tab افزونهٔ محاسبهٔ آدرس T-head.
- xtheadbb
- @tab 1.0 @tab افزونهٔ دستکاری پایهای بیت T-head.
- xtheadbs
- @tab 1.0 @tab افزونهٔ دستورهای تکبیتی T-head.
- xtheadcmo
- @tab 1.0 @tab افزونهٔ عملیاتهای مدیریت کَش T-head.
- xtheadcondmov
- @tab 1.0 @tab افزونهٔ انتقال شرطی T-head.
- xtheadfmemidx
- @tab 1.0 @tab افزونهٔ عملیاتهای حافظهٔ نمایهشده برای ثباتهای ممیز شناور T-head.
- xtheadfmv
- @tab 1.0 @tab افزونهٔ انتقال دادههای بیتهای بالایی ممیز شناور با دقت مضاعف در T-head.
- xtheadint
- @tab 1.0 @tab افزونهٔ شتاببخشی وقفهٔ T-head.
- xtheadmac
- @tab 1.0 @tab افزونهٔ ضرب-انباشت T-head.
- xtheadmemidx
- @tab 1.0 @tab افزونهٔ عملیات حافظهٔ نمایهشدهٔ T-head.
- xtheadmempair
- @tab 1.0 @tab افزونهٔ عملیات حافظهٔ دو GPR در T-head.
- xtheadsync
- @tab 1.0 @tab افزونهٔ همگامسازی چندهستهای T-head.
- xventanacondops
- @tab 1.0 @tab افزونهٔ عملیاتهای شرطی عدد صحیح Ventana.
هنگامی که -march= مشخص نشده باشد، از تنظیمات -mcpu استفاده میشود.
اگر هر دوی -march و -mcpu= مشخص نشده باشند، مقدار پیشفرض این آرگومان وابسته به سیستم است؛ کاربرانی که افزونههای معماری خاصی را میخواهند باید آن را صراحتاً مشخص کنند.
هنگامی که مشخصات RISC-V یک افزونه را وابسته به افزونههای دیگر تعریف کرده باشد، GCC در صورتی که آن افزونههای وابسته بهطور صریح اضافه نشده باشند، آنها را بهطور ضمنی به مجموعهٔ افزونههای فعالشده اضافه خواهد کرد.
- -mcpu=processor-string
- از معماری
پردازندهٔ
دادهشده
استفاده
کرده و
خروجی را
برای آن، که
با نام خاص CPU
مشخص
میشود،
بهینهسازی
میکند.
مقادیر
مجاز برای
این گزینه
عبارتند از:
sifive-e20، sifive-e21،
sifive-e24، sifive-e31،
sifive-e34، sifive-e76،
sifive-s21، sifive-s51،
sifive-s54، sifive-s76،
sifive-u54، sifive-u74،
sifive-x280، sifive-xp450،
sifive-x670، thead-c906،
tt-ascalon-d8، xiangshan-nanhu.
توجه داشته باشید که -mcpu تنظیمات -march یا -mtune را بازنویسی نمیکند.
- -mtune=processor-string
- خروجی را
برای
پردازندهٔ
دادهشده،
که بر اساس
ریزمعماری
یا نام خاص CPU
تعیین
میشود،
بهینهسازی
میکند.
مقادیر
مجاز برای
این گزینه
عبارتند از:
generic-ooo، rocket،
sifive-3-series، sifive-5-series،
sifive-7-series، size،
sifive-p400-series، sifive-p600-series و
تمامی
گزینههای
معتبر برای
-mcpu=.
هنگامی که -mtune= مشخص نشده باشد، از تنظیمات -mcpu استفاده میشود؛ در صورتی که هیچکدام مشخص نشده باشند، پیشفرض rocket است.
انتخاب size برای استفاده توسط کاربران نهایی در نظر گرفته نشده است. این مقدار زمانی استفاده میشود که -Os مشخص شده باشد. این انتخاب اطلاعات هزینهٔ دستورالعمل ارائهشده توسط -mtune= را لغو میکند، اما اطلاعات خط لوله (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 استفاده میکنند. حالت پیشفرض، استفاده از اتمیکهای زیرکلمهایِ درونخطی (inline) و سریعی است که به libatomic نیاز ندارند..IP -minline-strlen 4
- -mno-inline-strlen
- تلاش کردن یا نکردن برای درونخطیسازی فراخوانیهای strlen در صورت امکان. درونخطیسازی تنها در صورتی انجام میشود که رشته بهدرستی تراز شده باشد و دستورالعملهای پردازش شتابیافته در دسترس باشند. حالت پیشفرض، درونخطی نکردن فراخوانیهای strlen است.
- -minline-strcmp
- -mno-inline-strcmp
- تلاش کردن
یا نکردن
برای
درونخطیسازی
فراخوانیهای
strcmp در صورت
امکان.
درونخطیسازی
تنها در
صورتی
انجام
میشود که
رشتهها
بهدرستی
تراز شده
باشند و
دستورالعملهای
پردازش
شتابیافته
در دسترس
باشند. حالت
پیشفرض،
درونخطی
نکردن
فراخوانیهای
strcmp است.
پارامتر --param riscv-strcmp-inline-limit=n حداکثر تعداد بایتهای مقایسهشده توسط کد درونخطیشده را کنترل میکند. مقدار پیشفرض 64 است.
- -minline-strncmp
- -mno-inline-strncmp
- تلاش کردن
یا نکردن
برای
درونخطیسازی
فراخوانیهای
strncmp در صورت
امکان.
درونخطیسازی
تنها در
صورتی
انجام
میشود که
رشتهها
بهدرستی
تراز شده
باشند و
دستورالعملهای
پردازش
شتابیافته
در دسترس
باشند. حالت
پیشفرض،
درونخطی
نکردن
فراخوانیهای
strncmp است.
پارامتر --param riscv-strcmp-inline-limit=n حداکثر تعداد بایتهای مقایسهشده توسط کد درونخطیشده را کنترل میکند. مقدار پیشفرض 64 است.
- -mshorten-memrefs
- -mno-shorten-memrefs
- تلاش کردن یا نکردن برای بهرهگیری بیشتر از دستورالعملهای فشردهٔ load/store با جایگزین کردن یک بارگذاری/ذخیرهسازی از 'base register + large offset' با یک بارگذاری/ذخیرهسازی جدید از 'new base + small offset'. اگر مبنای جدید در یک ثبات فشرده ذخیره شود، آنگاه load/store جدید میتواند فشرده گردد. در حال حاضر فقط load/storeهای صحیح ۳۲-بیتی را هدف قرار میدهد.
- -mstrict-align
- -mno-strict-align
- تولید نکردن یا تولید کردن دسترسیهای حافظهٔ ترازنشده. مقدار پیشفرض بسته به اینکه آیا پردازندهای که برای آن بهینهسازی میکنیم از دسترسی ترازنشدهٔ سریع پشتیبانی میکند یا خیر، تعیین میشود.
- -mscalar-strict-align
- -mno-scalar-strict-align
- تولید نکردن یا تولید کردن دسترسیهای حافظهٔ ترازنشده. مقدار پیشفرض بسته به اینکه آیا پردازندهای که برای آن بهینهسازی میکنیم از دسترسی ترازنشدهٔ سریع پشتیبانی میکند یا خیر، تعیین میشود. این گزینه نام مستعاری برای -mstrict-align است.
- -mvector-strict-align
- -mno-vector-strict-align
- تولید نکردن یا تولید کردن دسترسیهای حافظهٔ برداری ترازنشده. مقدار پیشفرض خاموش است مگر اینکه پردازندهای که برای آن بهینهسازی میکنیم، صراحتاً از دسترسی به حافظهٔ برداری با عناصر ناتراز (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) به منظور کاهش تعداد دستورالعملهای مورد نیاز برای محققسازی آدرسهای نماد. حالت پیشفرض، بهرهگیری از سادهسازیهای پیونددهنده است.
- -mriscv-attribute
- -mno-riscv-attribute
- درج کردن (درج نکردن) مشخصهٔ RISC-V برای ثبت اطلاعات اضافی درون شیءهای ELF. این ویژگی حداقل به binutils 2.32 نیاز دارد.
- -mcsr-check
- -mno-csr-check
- بررسی CSR را فعال یا غیرفعال میکند.
- -malign-data=type
- کنترل نحوهٔ تراز کردن متغیرها و ثابتهای آرایهای، ساختاری (structure)، یا اجتماعی (union) توسط GCC. مقادیر پشتیبانیشده برای type عبارتند از xlen که از عرض ثبات x به عنوان مقدار تراز استفاده میکند، و natural که از تراز طبیعی بهره میبرد. مقدار پیشفرض xlen است.
- -mbig-endian
- تولید کد با ترتیب بایت بزرگانتها (big-endian). زمانی که GCC برای یک هدف riscv64be-*-* یا riscv32be-*-* پیکربندی شده باشد، این مقدار پیشفرض است.
- -mlittle-endian
- تولید کد با ترتیب بایت کوچکانتها (little-endian). زمانی که GCC برای یک هدف riscv64-*-* یا riscv32-*-* (به جز هدف riscv64be-*-* یا riscv32be-*-*) پیکربندی شده باشد، این مقدار پیشفرض است.
- -mstack-protector-guard=guard
- -mstack-protector-guard-reg=reg
- -mstack-protector-guard-offset=offset
- تولید کد
محافظ پشته
با استفاده
از قناری (canary)
در guard.
مکانهای
پشتیبانیشده
عبارتند از
global برای یک
قناری
سراسری یا
tls برای
قناری به
ازای هر
ریسه در
بلوک TLS.
با انتخاب حالت دوم، گزینههای -mstack-protector-guard-reg=reg و -mstack-protector-guard-offset=offset علاوه بر این مشخص میکنند که چه ثباتی به عنوان ثبات مبنا برای خواندن قناری استفاده شود، و از چه آفستی نسبت به آن ثبات مبنا قرار گیرد. هیچ ثبات یا آفست پیشفرضی وجود ندارد چرا که این موارد تماماً برای استفاده درون هستهٔ لینوکس در نظر گرفته شدهاند.
- -mtls-dialect=desc
- استفاده از توصیفکنندههای TLS به عنوان سازوکار حافظهٔ محلی ریسه (thread-local storage) برای دسترسیهای پویای متغیرهای TLS.
- -mtls-dialect=trad
- استفاده از TLS سنتی به عنوان سازوکار حافظهٔ محلی ریسه برای دسترسیهای پویای متغیرهای TLS. این مقدار پیشفرض است.
گزینههای RL78
- -msim
- کتابخانههای هدف اضافی را جهت پشتیبانی از اجرا درون یک شبیهساز پیوند میدهد.
- -mmul=none
- -mmul=g10
- -mmul=g13
- -mmul=g14
- -mmul=rl78
- نوع
پشتیبانی
سختافزاری
از ضرب و
تقسیم مورد
استفاده را
مشخص
میکند.
سادهترین
حالت "none"
است که برای
هر دوی ضرب
و تقسیم از
نرمافزار
استفاده
میکند. این
مقدار
پیشفرض
است. مقدار
"g13" برای
دستگاه
جانبی
سختافزاری
ضرب/تقسیم
موجود در
اهداف RL78/G13
(هستهٔ S2) است.
مقدار
"g14"
استفاده از
دستورالعملهای
ضرب و تقسیم
پشتیبانیشده
توسط قطعات
RL78/G14 (هستهٔ S3) را
انتخاب
میکند.
مقدار
"rl78" یک
نام مستعار
برای "g14"
و مقدار
"mg10" یک
نام مستعار
برای "none"
است.
علاوه بر این، یک ماکروی پیشپردازندهٔ C بر اساس تنظیم این گزینه تعریف میشود. مقادیر ممکن عبارتاند از: "__RL78_MUL_NONE__"، "__RL78_MUL_G13__" یا "__RL78_MUL_G14__".
- -mcpu=g10
- -mcpu=g13
- -mcpu=g14
- -mcpu=rl78
- هستهٔ RL78 هدف
را مشخص
میکند.
پیشفرض
هستهٔ G14 است
که با نام
هستهٔ S3 یا
صرفاً RL78 نیز
شناخته
میشود.
هستهٔ G13 یا S2
فاقد
دستورالعملهای
ضرب یا
تقسیم است و
در عوض برای
این عملیات
از یک
دستگاه
جانبی
سختافزاری
استفاده
میکند.
هستهٔ G10 یا S1
فاقد
بانکهای
ثبات است،
بنابراین
از یک
قرارداد
فراخوانی
متفاوت
استفاده
میکند.
اگر این گزینه تنظیم شود، نوع پشتیبانی ضرب سختافزاری مورد استفاده را نیز مشخص میکند، مگر اینکه با یک گزینهٔ صریح -mmul=none در خط فرمان بازنویسی شود. بنابراین مشخص کردن -mcpu=g13 استفاده از دستگاه جانبی ضرب سختافزاری G13 را فعال میکند و مشخص کردن -mcpu=g10 استفاده از ضرب سختافزاری را بهطور کامل غیرفعال میکند.
توجه داشته باشید که هرچند هستهٔ RL78/G14 هدف پیشفرض است، مشخص کردن -mcpu=g14 یا -mcpu=rl78 در خط فرمان، رفتار زنجیره ابزار را تغییر میدهد زیرا پشتیبانی ضرب سختافزاری G14 را نیز فعال میسازد. اگر این گزینهها در خط فرمان مشخص نشوند، حتی اگر کد هستهٔ RL78 را هدف قرار داده باشد، از روالهای ضرب نرمافزاری استفاده خواهد شد. این رفتار برای حفظ سازگاری رو به عقب با زنجیرههای ابزار قدیمیتری است که از ضرب و تقسیم سختافزاری پشتیبانی نمیکردند.
علاوه بر این، یک ماکروی پیشپردازندهٔ C بر اساس تنظیم این گزینه تعریف میشود. مقادیر ممکن عبارتاند از: "__RL78_G10__"، "__RL78_G13__" یا "__RL78_G14__".
- -mg10
- -mg13
- -mg14
- -mrl78
- اینها نامهای مستعاری برای گزینهٔ متناظر -mcpu= هستند. این گزینهها برای سازگاری رو به عقب ارائه شدهاند.
- -mallregs
- به کامپایلر اجازه میدهد از تمام ثباتهای دردسترس استفاده کند. بهطور پیشفرض، ثباتهای "r24..r31" برای استفاده در گردانندههای وقفه رزرو شدهاند. با فعال بودن این گزینه، این ثباتها میتوانند در توابع معمولی نیز مورد استفاده قرار گیرند.
- -m64bit-doubles
- -m32bit-doubles
- اندازهٔ نوع دادهٔ "double" را ۶۴ بیت (-m64bit-doubles) یا ۳۲ بیت (-m32bit-doubles) تعیین میکند. مقدار پیشفرض -m32bit-doubles است.
- -msave-mduc-in-interrupts
- -mno-save-mduc-in-interrupts
- مشخص میکند که توابع گردانندهٔ وقفه باید ثباتهای MDUC را حفظ کنند. این کار تنها در صورتی لازم است که کد عادی ممکن باشد از ثباتهای MDUC استفاده کند؛ برای مثال به این دلیل که عملیات ضرب و تقسیم انجام میدهد. پیشفرض بر نادیده گرفتن ثباتهای MDUC است زیرا این امر گردانندههای وقفه را سریعتر میکند. برای کارکرد این قابلیت باید گزینهٔ هدف -mg13 ارسال شود، چرا که این ویژگی فقط روی هدف G13 (هستهٔ S2) دردسترس است. ثباتهای MDUC تنها در صورتی ذخیره خواهند شد که گردانندهٔ وقفه عملیات ضرب یا تقسیم انجام دهد یا تابع دیگری را فراخوانی کند.
گزینههای IBM RS/6000 و PowerPC
این گزینههای -m برای IBM RS/6000 و PowerPC تعریف شدهاند:
- -mpowerpc-gpopt
- -mno-powerpc-gpopt
- -mpowerpc-gfxopt
- -mno-powerpc-gfxopt
- -mpowerpc64
- -mno-powerpc64
- -mmfcrf
- -mno-mfcrf
- -mpopcntb
- -mno-popcntb
- -mpopcntd
- -mno-popcntd
- -mfprnd
- -mno-fprnd
- -mcmpb
- -mno-cmpb
- -mhard-dfp
- -mno-hard-dfp
- شما از این
گزینهها
برای مشخص
کردن
اینکه
کدام
دستورالعملها
روی
پردازندهٔ
مورد
استفادهتان
دردسترس
هستند
استفاده
میکنید.
مقدار
پیشفرض
این
گزینهها
هنگام
پیکربندی GCC
تعیین
میشود.
مشخص کردن
-mcpu=cpu_type
تنظیمات
این
گزینهها
را لغو
میکند.
توصیه
میکنیم
بهجای
گزینههای
فهرستشده
در بالا، از
گزینهٔ
-mcpu=cpu_type
استفاده
کنید.
مشخص کردن -mpowerpc-gpopt به GCC اجازه میدهد از دستورالعملهای اختیاری معماری PowerPC در گروه کاربرد عمومی (General Purpose)، از جمله جذر ممیز شناور، استفاده کند. مشخص کردن -mpowerpc-gfxopt به GCC اجازه میدهد از دستورالعملهای اختیاری معماری PowerPC در گروه گرافیک، از جمله گزینش ممیز شناور، استفاده کند.
گزینهٔ -mmfcrf به GCC اجازه میدهد دستورالعمل انتقال از فیلد ثبات وضعیت (move from condition register field) را که در پردازندهٔ POWER4 و پردازندههای دیگری که از معماری PowerPC V2.01 پشتیبانی میکنند پیادهسازی شده است، تولید کند. گزینهٔ -mpopcntb به GCC اجازه میدهد دستورالعمل popcount و تخمین معکوس ممیز شناور دقتمضاعف را که در پردازندهٔ POWER5 و سایر پردازندههای پشتیبانیکننده از معماری PowerPC V2.02 پیادهسازی شده است، تولید کند. گزینهٔ -mpopcntd به GCC اجازه میدهد دستورالعمل popcount پیادهسازیشده در پردازندهٔ POWER7 و سایر پردازندههای پشتیبانیکننده از معماری PowerPC V2.06 را تولید کند. گزینهٔ -mfprnd به GCC اجازه میدهد دستورالعملهای گرد کردن ممیز شناور به عدد صحیح را که در پردازندهٔ POWER5+ و دیگر پردازندههای پشتیبانیکننده از معماری PowerPC V2.03 پیادهسازی شده است، تولید کند. گزینهٔ -mcmpb به GCC اجازه میدهد دستورالعمل مقایسهٔ بایتها را که در پردازندهٔ POWER6 و سایر پردازندههای پشتیبانیکننده از معماری PowerPC V2.05 پیادهسازی شده است، تولید کند. گزینهٔ -mhard-dfp به GCC اجازه میدهد دستورالعملهای ممیز شناور دهدهی پیادهسازیشده در برخی پردازندههای POWER را تولید کند.
گزینهٔ -mpowerpc64 به GCC اجازه میدهد دستورالعملهای ۶۴ بیتی اضافی موجود در معماری کامل PowerPC64 را تولید کرده و با GPRها بهصورت مقادیر ۶۴ بیتی دوکلمهای (doubleword) رفتار کند. مقدار پیشفرض GCC، گزینهٔ -mno-powerpc64 است..IP -mcpu=cpu_type 4 تعیین نوع معماری، نحوهٔ استفاده از ثباتها، و پارامترهای زمانبندی دستورالعملها برای نوع ماشین cpu_type. مقادیر پشتیبانیشده برای cpu_type عبارتند از: 401، 403، 405، 405fp، 440، 440fp، 464، 464fp، 476، 476fp، 505، 601، 602، 603، 603e، 604، 604e، 620، 630، 740، 7400، 7450، 750، 801، 821، 823، 860، 970، 8540، a2، e300c2، e300c3، e500mc، e500mc64، e5500، e6500، ec603e، G3، G4، G5، titan، power3، power4، power5، power5+، power6، power6x، power7، power8، power9، power10، power11، powerpc، powerpc64، powerpc64le، rs64 و native.
گزینههای -mcpu=powerpc، -mcpu=powerpc64 و -mcpu=powerpc64le به ترتیب نوع ماشین معماری PowerPC خالص ۳۲-بیتی (هر دو ترتیب بایت)، PowerPC ۶۴-بیتی big-endian و PowerPC ۶۴-بیتی little-endian را با فرض یک مدل پردازنده عمومی و مناسب برای اهداف زمانبندی مشخص میکنند.
مشخص کردن native به عنوان نوع پردازنده، گزینهٔ معماری متناظر با پردازندهٔ میزبان سیستمی که کامپایل را انجام میدهد شناسایی و انتخاب میکند. اگر GCC پردازنده را شناسایی نکند، -mcpu=native هیچ تأثیری نخواهد داشت.
سایر گزینهها یک پردازنده خاص را مشخص میکنند. کدی که تحت این گزینهها تولید میشود روی آن پردازنده به بهترین نحو اجرا شده و ممکن است روی پردازندههای دیگر اصلاً اجرا نشود.
گزینههای -mcpu به طور خودکار گزینههای زیر را فعال یا غیرفعال میکنند:
-maltivec -mfprnd -mhard-float -mmfcrf -mmultiple -mpopcntb -mpopcntd -mpowerpc64 -mpowerpc-gpopt -mpowerpc-gfxopt -mmulhw -mdlmzb -mmfpgpr -mvsx -mcrypto -mhtm -mpower8-fusion -mquad-memory -mquad-memory-atomic -mfloat128 -mfloat128-hardware -mprefixed -mpcrel -mmma -mrop-protect
گزینههای خاص تنظیمشده برای هر CPU خاص، بر اساس اینکه چه تنظیمی کد بهینهتری را برای آن CPU تولید میکند، بین نسخههای مختلف کامپایلر متفاوت است؛ این لزوماً نشاندهندهٔ قابلیتهای واقعی سختافزار نیست. اگر مایلید یک گزینهٔ منفرد را روی مقدار خاصی تنظیم کنید، میتوانید آن را پس از گزینهٔ -mcpu مشخص کنید، مانند -mcpu=970 -mno-altivec.
در AIX، گزینههای -maltivec و -mpowerpc64 در حال حاضر توسط گزینهٔ -mcpu فعال یا غیرفعال نمیشوند، زیرا AIX پشتیبانی کاملی از این گزینهها ندارد. اگر مطمئن هستید که در محیط شما کار میکنند، همچنان میتوانید آنها را به صورت جداگانه فعال یا غیرفعال کنید.
- -mtune=cpu_type
- تنظیم پارامترهای زمانبندی دستورالعملها برای نوع ماشین cpu_type، بدون تنظیم نوع معماری یا نحوهٔ استفاده از ثباتها، بر خلاف کاری که -mcpu=cpu_type انجام میدهد. همان مقادیر cpu_type که برای -mcpu استفاده میشوند برای -mtune نیز به کار میروند. اگر هر دو مشخص شوند، کد تولیدشده از معماری و ثباتهای تعیینشده توسط -mcpu، اما از پارامترهای زمانبندی تعیینشده توسط -mtune استفاده خواهد کرد.
- -mcmodel=small
- تولید کد PowerPC64 برای مدل کوچک (small): اندازه جدول TOC به 64k محدود میشود.
- -mcmodel=medium
- تولید کد PowerPC64 برای مدل متوسط (medium): اندازه جدول TOC و سایر دادههای ایستا در مجموع میتواند تا 4G باشد. این حالت پیشفرض برای لینوکس ۶۴-بیتی است.
- -mcmodel=large
- تولید کد PowerPC64 برای مدل بزرگ (large): اندازه جدول TOC میتواند تا 4G باشد. سایر دادهها و کد تنها توسط فضای آدرس ۶۴-بیتی محدود میشوند.
- -maltivec
- -mno-altivec
- تولید کدی
که از
دستورالعملهای
AltiVec استفاده
میکند
(نمیکند)،
و همچنین
فعال کردن
استفاده از
توابع
توکار که
امکان
دسترسی
مستقیمتر
به مجموعه
دستورالعملهای
AltiVec را فراهم
میآورند.
همچنین
ممکن است
برای
هماهنگسازی
ABI فعلی با
بهبودهای ABI
مربوط به AltiVec،
نیاز به
تنظیم -mabi=altivec
داشته
باشید.
هنگامی که -maltivec استفاده میشود، ترتیب عناصر برای توابع درونی (intrinsics) مربوط به AltiVec مانند "vec_splat"، "vec_extract" و "vec_insert" با ترتیب عناصر آرایه متناظر با ترتیب بایت (endianness) مقصد مطابقت دارد. بدین معنا که در هدفگیری یک بستر big-endian، عنصر صفر نشاندهندهٔ چپترین عنصر در ثبات برداری است، و در هدفگیری یک بستر little-endian، نشاندهندهٔ راستترین عنصر در ثبات برداری میباشد.
- -mvrsave
- -mno-vrsave
- تولید دستورالعملهای VRSAVE هنگام تولید کد AltiVec.
- -msecure-plt
- تولید کدی که به ld و ld.so اجازه میدهد فایلهای اجرایی و کتابخانههای اشتراکی را با بخشهای غیرقابلاجرای ".plt" و ".got" بسازند. این یک گزینهٔ PowerPC 32-bit SYSV ABI است.
- -mbss-plt
- تولید کدی که از یک بخش BSS ".plt" استفاده میکند که توسط ld.so پر میشود، و نیازمند بخشهای ".plt" و ".got" است که هم قابل نوشتن و هم قابل اجرا باشند. این یک گزینهٔ PowerPC 32-bit SYSV ABI است.
- -msplit-patch-nops
- هنگام افزودن NOPها برای یک ناحیهٔ قابل وصله (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 را فراهم میکنند.
- -mhtm
- -mno-htm
- فعال کردن (غیرفعال کردن) استفاده از توابع توکاری که امکان دسترسی مستقیم به دستورالعملهای حافظه تراکنشی سختافزاری (HTM) اضافهشده در نسخهٔ 2.07 معماری PowerPC ISA را فراهم میکنند.
- -mpower8-fusion
- -mno-power8-fusion
- تولید کدی که برخی عملیاتهای عدد صحیح را مجاور یکدیگر نگه میدارد (نگه نمیدارد) تا این دستورالعملها بتوانند در پردازندههای power8 و پس از آن با یکدیگر ادغام (fuse) شوند.
- -mquad-memory
- -mno-quad-memory
- تولید کدی که از دستورالعملهای غیراتمیک حافظه چهارکلمهای (quad word) استفاده میکند (نمیکند). گزینهٔ -mquad-memory مستلزم استفاده از حالت ۶۴-بیتی است..IP -mquad-memory-atomic 4
- -mno-quad-memory-atomic
- تولید کدی که از دستورالعملهای حافظهای چهارکلمهای اتمیک (atomic quad word) استفاده میکند (یا نمیکند). گزینهٔ -mquad-memory-atomic نیازمند استفاده از حالت 64-بیتی است.
- -mfloat128
- -mno-float128
- فعال/غیرفعال
کردن
کلیدواژهٔ
__float128 برای
ممیز شناور
128-بیتی IEEE و
استفاده از
شبیهسازی
نرمافزاری
یا
دستورالعملهای
سختافزاری
برای ممیز
شناور
128-بیتی IEEE.
برای استفاده از پشتیبانی ممیز شناور 128-بیتی IEEE، مجموعه دستورالعملهای VSX (-mvsx) باید فعال باشد. ممیز شناور 128-بیتی IEEE تنها روی Linux پشتیبانی میشود.
مقدار پیشفرض -mfloat128 روی سیستمهای PowerPC Linux که از مجموعه دستورالعملهای VSX استفاده میکنند فعال، و روی سایر سیستمها غیرفعال است.
اگر از مجموعه دستورالعملهای ISA 3.0 (-mcpu=power9) روی یک سیستم 64-بیتی استفاده کنید، پشتیبانی از ممیز شناور 128-بیتی IEEE همچنین تولید دستورالعملهای سختافزاری ممیز شناور 128-بیتی IEEE در ISA 3.0 را فعال خواهد کرد. در غیر این صورت، اگر تولید دستورالعملهای ISA 3.0 را مشخص نکنید یا یک سیستم 32-بیتی big endian را هدف قرار دهید، ممیز شناور 128-بیتی IEEE با شبیهسازی نرمافزاری انجام خواهد شد.
- -mfloat128-hardware
- -mno-float128-hardware
- فعال/غیرفعال
کردن
استفاده از
دستورالعملهای
سختافزاری
ISA 3.0 برای
پشتیبانی
از نوع
دادهٔ __float128.
مقدار پیشفرض -mfloat128-hardware روی سیستمهای PowerPC Linux که از مجموعه دستورالعملهای ISA 3.0 استفاده میکنند فعال، و روی سایر سیستمها غیرفعال است.
- -m32
- -m64
- تولید کد برای محیطهای 32-بیتی یا 64-بیتی اهداف Darwin و SVR4 (شامل GNU/Linux). محیط 32-بیتی نوعهای int، long و اشارهگرها را 32 بیت تنظیم کرده و کدی تولید میکند که روی هر گونهای از PowerPC اجرا میشود. محیط 64-بیتی نوع int را 32 بیت و long و اشارهگرها را 64 بیت تنظیم کرده، و کدی برای PowerPC64 مشابه -mpowerpc64 تولید میکند.
- -mfull-toc
- -mno-fp-in-toc
- -mno-sum-in-toc
- -mminimal-toc
- اصلاح
نحوهٔ
تولید TOC
(جدول
محتویات)،
که برای هر
فایل
اجرایی
ایجاد
میشود.
گزینهٔ -mfull-toc
بهطور
پیشفرض
انتخاب شده
است. در این
حالت، GCC
دستکم یک
مدخل TOC برای
هر ارجاع
یکتا به
متغیر
غیرخودکار
در برنامهٔ
شما اختصاص
میدهد. GCC
همچنین
ثابتهای
ممیز شناور
را در TOC قرار
میدهد. با
این حال،
تنها 16,384 مدخل
در TOC موجود
است.
اگر پیام خطایی از پیونددهنده دریافت کردید مبنی بر اینکه از فضای در دسترس TOC سرریز کردهاید، میتوانید میزان فضای استفادهشدهٔ TOC را با گزینههای -mno-fp-in-toc و -mno-sum-in-toc کاهش دهید. گزینهٔ -mno-fp-in-toc مانع از قرار دادن ثابتهای ممیز شناور در TOC توسط GCC میشود و -mno-sum-in-toc باعث میشود GCC بهجای قرار دادن مجموع یک آدرس و یک ثابت در TOC، کدی تولید کند که این مجموع را در زمان اجرا محاسبه نماید. میتوانید یک یا هر دوی این گزینهها را مشخص کنید. هر کدام از آنها باعث میشود GCC به بهای صرفهجویی در فضای TOC، کدی اندکی کندتر و بزرگتر تولید کند.
اگر حتی با مشخص کردن هر دوی این گزینهها، باز هم فضای TOC تمام شد، بهجای آن -mminimal-toc را مشخص کنید. این گزینه باعث میشود GCC برای هر فایل تنها یک مدخل TOC ایجاد کند. با مشخص کردن این گزینه، GCC کدی تولید میکند که کندتر و بزرگتر است اما فضای بسیار ناچیزی از TOC را مصرف میکند. ممکن است بخواهید از این گزینه تنها برای فایلهایی استفاده کنید که شامل کدهایی با دفعات اجرای کمتر هستند.
- -maix64
- -maix32
- فعالسازی ABI و قرارداد فراخوانی 64-بیتی AIX: اشارهگرهای 64-بیتی، نوع "long" شصت و چهار بیتی، و زیرساخت مورد نیاز برای پشتیبانی از آنها. مشخص کردن -maix64 متضمن -mpowerpc64 است، در حالی که -maix32 ساختار ABI شصت و چهار بیتی را غیرفعال کرده و متضمن -mno-powerpc64 است. پیشفرض GCC گزینهٔ -maix32 است.
- -mxl-compat
- -mno-xl-compat
- تولید کدی
که هنگام
استفاده از
ABI سازگار با
AIX، تطابق
بیشتری با
معناشناسی
کامپایلر IBM XL
داشته باشد.
ارسال
آرگومانهای
ممیز شناور
به توابع
دارای الگو
(prototyped) فراتر از
ناحیهٔ
ذخیرهٔ
ثبات (RSA) روی
پشته،
علاوه بر
FPRهای
آرگومان.
عدم فرض بر
اینکه
پرارزشترین
double در یک
مقدار long double صد
و بیست و
هشت بیتی،
هنگام
مقایسهٔ
مقادیر و
تبدیل به double
به درستی
گرد شده
است.
استفاده از
نامهای
نماد XL برای
روتینهای
پشتیبانی long
double.
قرارداد فراخوانی AIX بدون اینکه در ابتدا مستند شود، برای مدیریت یک حالت مبهم K&R C گسترش یافت: فراخوانی تابعی که آدرس آرگومانهای خود را با تعداد آرگومانهای کمتری نسبت به آنچه اعلان شده دریافت میکند. کامپایلرهای IBM XL هنگامی که یک زیرروال بدون بهینهسازی کامپایل شده باشد، به آرگومانهای ممیز شناوری که در RSA جا نمیشوند از طریق پشته دسترسی پیدا میکنند. از آنجا که ذخیرهسازی همیشگی آرگومانهای ممیز شناور روی پشته ناکارآمد بوده و بهندرت مورد نیاز است، این گزینه بهطور پیشفرض فعال نیست و تنها هنگام فراخوانی زیرروالهای کامپایلشده توسط کامپایلرهای IBM XL بدون بهینهسازی ضرورت دارد.
- -mpe
- پشتیبانی از IBM RS/6000 SP Parallel Environment (PE). پیوند دادن برنامهای که برای استفاده از ردوبدل پیام با کد راهاندازی ویژهای نوشته شده است، تا برنامه بتواند اجرا شود. سیستم باید PE را در مکان استاندارد (/usr/lpp/ppe.poe/) نصب داشته باشد، یا فایل specs باید با گزینهٔ -specs= جهت مشخص کردن مکان دایرکتوری مناسب جایگزین شود. محیط Parallel Environment از رشتهها (threads) پشتیبانی نمیکند، بنابراین گزینهٔ -mpe و گزینهٔ -pthread با یکدیگر ناسازگارند.
- -malign-natural
- -malign-power
- در AIX،
سیستمهای
32-بیتی Darwin، و
سیستمهای
64-بیتی PowerPC GNU/Linux،
گزینهٔ -malign-natural
همترازی
تعریفشده
توسط ABI را
برای انواع
بزرگتر،
مانند doubleهای
ممیز
شناور، لغو
کرده و
آنها را
روی مرز
طبیعی
مبتنی بر
اندازهشان
تراز
میکند.
گزینهٔ -malign-power
به GCC دستور
میدهد از
قواعد
همترازی
مشخصشده
در ABI پیروی
کند.
پیشفرض GCC
همترازی
استاندارد
تعریفشده
در ABI است.
روی Darwin شصت و چهار بیتی، همترازی طبیعی پیشفرض است و -malign-power پشتیبانی نمیشود.
- -msoft-float
- -mhard-float
- تولید کدی که از مجموعه ثباتهای ممیز شناور استفاده نمیکند (استفاده میکند). در صورت استفاده از گزینهٔ -msoft-float و ارسال آن به GCC هنگام پیوند، شبیهسازی نرمافزاری ممیز شناور فراهم میشود.
- -mmultiple
- -mno-multiple
- تولید کدی که از دستورالعملهای بارگذاری چندکلمهای (load multiple word) و ذخیرهسازی چندکلمهای (store multiple word) استفاده میکند (یا نمیکند). این دستورالعملها بهطور پیشفرض در سیستمهای POWER تولید میشوند، و در سیستمهای PowerPC تولید نمیشوند. از -mmultiple در سیستمهای little-endian مبتنی بر PowerPC استفاده نکنید، زیرا این دستورالعملها زمانی که پردازنده در حالت little-endian قرار دارد کار نمیکنند. استثناها PPC740 و PPC750 هستند که این دستورالعملها را در حالت little-endian مجاز میدانند.
- -mupdate
- -mno-update
- تولید کدی که از دستورالعملهای بارگذاری یا ذخیرهسازی که ثبات پایه را با آدرس مکان محاسبهشدهٔ حافظه بهروزرسانی میکنند، استفاده میکند (استفاده نمیکند). این دستورالعملها بهطور پیشفرض تولید میشوند. اگر از -mno-update استفاده کنید، بازهٔ زمانی کوتاهی بین زمان بهروزرسانی اشارهگر پشته و ذخیره شدن آدرس فریم قبلی وجود دارد، که این بدان معناست کدی که در هنگام وقفه یا سیگنال فریم پشته را پیمایش میکند ممکن است دادههای مخدوش دریافت نماید..IP -mavoid-indexed-addresses 4
- -mno-avoid-indexed-addresses
- تولید کدی که تلاش میکند از دستورالعملهای بارگذاری (load) یا ذخیرهسازی (store) نمایهشده پرهیز کند (یا پرهیز نکند). این دستورالعملها ممکن است در پردازندههای Power6 در شرایط خاصی، مانند پیمایش آرایههای بزرگی که از یک مرز 16M عبور میکنند، با افت کارایی مواجه شوند. این گزینه هنگام هدف قرار دادن Power6 بهطور پیشفرض فعال و در غیر این صورت غیرفعال است.
- -mfused-madd
- -mno-fused-madd
- تولید کدی که از دستورالعملهای ضرب و تجمیع (multiply and accumulate) ممیز شناور استفاده میکند (یا استفاده نمیکند). در صورت استفاده از ممیز شناور سختافزاری، این دستورالعملها بهطور پیشفرض تولید میشوند. گزینهٔ وابسته به ماشین -mfused-madd اکنون به گزینهٔ مستقل از ماشین -ffp-contract=fast نگاشت شده است، و -mno-fused-madd به -ffp-contract=off نگاشت میشود.
- -mmulhw
- -mno-mulhw
- تولید کدی که از دستورالعملهای ضرب نیمکلمه (half-word) و ضرب-تجمیع در پردازندههای IBM 405، 440، 464 و 476 استفاده میکند (یا استفاده نمیکند). هنگام هدف قرار دادن این پردازندهها، این دستورالعملها بهطور پیشفرض تولید میشوند.
- -mdlmzb
- -mno-dlmzb
- تولید کدی که از دستورالعمل جستجوی رشتهٔ dlmzb در پردازندههای IBM 405، 440، 464 و 476 استفاده میکند (یا استفاده نمیکند). هنگام هدف قرار دادن این پردازندهها، این دستورالعمل بهطور پیشفرض تولید میشود.
- -mno-bit-align
- -mbit-align
- در
سامانههای
System V.4 و
سامانههای
توکار PowerPC،
ساختارها و
اجتماعهایی
که شامل
میدانهای
بیتی (bit-fields)
هستند را
برای تراز
شدن با نوع
پایهٔ
میدان بیتی
اجبار
نمیکند (یا
میکند).
برای مثال، بهطور پیشفرض ساختاری که تنها شامل ۸ میدان بیتی "unsigned" به طول ۱ است، در یک مرز ۴ بایتی تراز شده و اندازهای برابر با ۴ بایت دارد. با استفاده از -mno-bit-align، ساختار در یک مرز ۱ بایتی تراز شده و اندازهٔ آن ۱ بایت خواهد بود.
- -mno-strict-align
- -mstrict-align
- در سامانههای System V.4 و سامانههای توکار PowerPC، فرض نمیکند (یا فرض میکند) که ارجاعات حافظهٔ ترازنشده توسط سامانه مدیریت میشوند.
- -mrelocatable
- -mno-relocatable
- تولید کدی که اجازه میدهد (یا اجازه نمیدهد) یک فایل اجرایی ایستا در زمان اجرا به آدرس دیگری بازنشانی (relocate) شود. یک بارگذار سادهٔ سامانهٔ توکار PowerPC باید کل محتویات ".got2" و مکانهای ۴ بایتی فهرستشده در بخش ".fixup" (جدولی از آدرسهای ۳۲ بیتی که توسط این گزینه تولید میشود) را بازنشانی کند. برای عملکرد صحیح این قابلیت، تمام اشیای پیوندخورده به هم باید با -mrelocatable یا -mrelocatable-lib کامپایل شده باشند. کد -mrelocatable پشته را در یک مرز ۸ بایتی تراز میکند.
- -mrelocatable-lib
- -mno-relocatable-lib
- همانند -mrelocatable، گزینهٔ -mrelocatable-lib نیز یک بخش ".fixup" تولید میکند تا امکان بازنشانی فایلهای اجرایی ایستا در زمان اجرا فراهم شود، اما -mrelocatable-lib از تراز پشتهٔ کوچکتر -mrelocatable استفاده نمیکند. اشیای کامپایلشده با -mrelocatable-lib میتوانند با اشیای کامپایلشده با هر ترکیبی از گزینههای -mrelocatable پیوند داده شوند.
- -mno-toc
- -mtoc
- در سامانههای System V.4 و سامانههای توکار PowerPC، فرض نمیکند (یا فرض میکند) که ثبات ۲ حاوی اشارهگری به یک ناحیهٔ سراسری است که به آدرسهای مورداستفاده در برنامه اشاره دارد.
- -mlittle
- -mlittle-endian
- در سامانههای System V.4 و سامانههای توکار PowerPC، کد را برای پردازنده در حالت کوچکپایان (little-endian) کامپایل میکند. گزینهٔ -mlittle-endian همانند -mlittle است.
- -mbig
- -mbig-endian
- در سامانههای System V.4 و سامانههای توکار PowerPC، کد را برای پردازنده در حالت بزرگپایان (big-endian) کامپایل میکند. گزینهٔ -mbig-endian همانند -mbig است.
- -mdynamic-no-pic
- در سامانههای Darwin / macOS، کد را به گونهای کامپایل میکند که خودش غیرقابلبازنشانی باشد، اما ارجاعات خارجی آن قابلبازنشانی باشند. کد حاصل برای برنامههای کاربردی مناسب است، اما برای کتابخانههای اشتراکی مناسب نیست.
- -msingle-pic-base
- با ثبات مورداستفاده برای آدرسدهی PIC به عنوان فقطخواندنی رفتار میکند، به جای اینکه در پیشدرآمد (prologue) هر تابع بارگذاری شود. سامانهٔ زمان اجرا مسئول مقداردهی اولیهٔ این ثبات با یک مقدار مناسب پیش از آغاز اجرا است.
- -mprioritize-restricted-insns=priority
- این گزینه اولویتی را که در دومین گذر زمانبندی به دستورالعملهای محدود به شیار اعزام (dispatch-slot restricted) اختصاص مییابد، کنترل میکند. آرگومان priority مقادیر 0، 1 یا 2 را میگیرد تا (به ترتیب) بدون اولویت، بالاترین اولویت، یا دومین اولویت بالاتر را به دستورالعملهای محدود به شیار اعزام اختصاص دهد.
- -msched-costly-dep=dependence_type
- این گزینه کنترل میکند که مقصد در طول زمانبندی دستورالعملها، کدام وابستگیها را هزینهبر در نظر بگیرد. آرگومان dependence_type یکی از مقادیر زیر را میپذیرد:
- no
- هیچ وابستگیای هزینهبر نیست.
- all
- همهٔ وابستگیها هزینهبر هستند.
- true_store_to_load
- وابستگی واقعی از ذخیرهسازی به بارگذاری (store به load) هزینهبر است.
- store_to_load
- هر نوع وابستگی از ذخیرهسازی به بارگذاری هزینهبر است.
- number
- هر وابستگی که تأخیر (latency) آن بزرگتر یا مساوی number باشد هزینهبر است.
- -minsert-sched-nops=scheme
- این گزینه کنترل میکند که کدام طرح درج NOP در دومین گذر زمانبندی استفاده شود. آرگومان scheme یکی از مقادیر زیر را میپذیرد:
- no
- دستورالعمل NOP درج نشود.
- pad
- پر کردن هر گروه اعزامی که طبق گروهبندی زمانبند دارای شیارهای صدور خالی است با NOP.
- regroup_exact
- درج NOPها برای اجبار دستورالعملهای وابستهٔ هزینهبر به رفتن به گروههای مجزا. دقیقاً به تعداد لازم NOP درج میشود تا یک دستورالعمل، بر اساس گروهبندی تخمینی پردازنده، به یک گروه جدید منتقل شود..IP number 4 دستورهای NOP را برای انتقال اجباری دستورالعملهای وابستهٔ پرهزینه به گروههای جداگانه درج میکند. به تعداد number دستور NOP درج میکند تا یک دستورالعمل به اجبار به یک گروه جدید برود.
- -mcall-sysv
- در سامانههای System V.4 و PowerPC تعبیهشده (embedded)، کد را با استفاده از قراردادهای فراخوانی منطبق با پیشنویس مارس ۱۹۹۵ از رابط باینری کاربردی (ABI) سامانهٔ System V، مکمل پردازندهٔ PowerPC، کامپایل میکند. این حالت پیشفرض است مگر اینکه GCC را با powerpc-*-eabiaix پیکربندی کرده باشید.
- -mcall-sysv-eabi
- -mcall-eabi
- هردو گزینهٔ -mcall-sysv و -meabi را مشخص میکند.
- -mcall-sysv-noeabi
- هردو گزینهٔ -mcall-sysv و -mno-eabi را مشخص میکند.
- -mcall-aixdesc
- در سامانههای System V.4 و PowerPC تعبیهشده، کد را برای سیستمعامل AIX کامپایل میکند.
- -mcall-linux
- در سامانههای System V.4 و PowerPC تعبیهشده، کد را برای سامانهٔ گنو بر پایهٔ لینوکس کامپایل میکند.
- -mcall-freebsd
- در سامانههای System V.4 و PowerPC تعبیهشده، کد را برای سیستمعامل FreeBSD کامپایل میکند.
- -mcall-netbsd
- در سامانههای System V.4 و PowerPC تعبیهشده، کد را برای سیستمعامل NetBSD کامپایل میکند.
- -mcall-openbsd
- در سامانههای System V.4 و PowerPC تعبیهشده، کد را برای سیستمعامل OpenBSD کامپایل میکند.
- -mtraceback=traceback_type
- نوع جدول traceback را انتخاب میکند. مقادیر معتبر برای traceback_type عبارتند از full، part و no.
- -maix-struct-return
- تمام ساختارها (struct) را در حافظه بازمیگرداند (همانگونه که توسط AIX ABI مشخص شده است).
- -msvr4-struct-return
- ساختارهای کوچکتر از ۸ بایت را در ثباتها بازمیگرداند (همانگونه که توسط SVR4 ABI مشخص شده است).
- -mabi=abi-type
- رابط باینری کاربردی (ABI) فعلی را با یک افزونهٔ خاص گسترش میدهد یا چنین افزونهای را حذف میکند. مقادیر معتبر عبارتند از: altivec، no-altivec، ibmlongdouble، ieeelongdouble، elfv1، elfv2، و برای AIX: vec-extabi، vec-default.
- -mabi=ibmlongdouble
- رابط ABI فعلی را برای استفاده از نوع long double با دقت گسترشیافتهٔ IBM تغییر میدهد. اگر پیشفرض سامانهٔ شما استفاده از long double با دقت گسترشیافتهٔ IEEE باشد، به احتمال زیاد این گزینه کار نخواهد کرد. اگر نوع long double را از دقت گسترشیافتهٔ IEEE تغییر دهید، کامپایلر هشداری صادر میکند مگر اینکه از گزینهٔ -Wno-psabi استفاده کنید. نیازمند فعال بودن -mlong-double-128 است.
- -mabi=ieeelongdouble
- رابط ABI فعلی را برای استفاده از نوع long double با دقت گسترشیافتهٔ IEEE تغییر میدهد. اگر پیشفرض سامانهٔ شما استفاده از long double با دقت گسترشیافتهٔ IBM باشد، به احتمال زیاد این گزینه کار نخواهد کرد. اگر نوع long double را از دقت گسترشیافتهٔ IBM تغییر دهید، کامپایلر هشداری صادر میکند مگر اینکه از گزینهٔ -Wno-psabi استفاده کنید. نیازمند فعال بودن -mlong-double-128 است.
- -mabi=elfv1
- رابط ABI فعلی را برای استفاده از رابط کاربردی باینری ELFv1 تغییر میدهد. این ABI پیشفرض برای لینوکس ۶۴بیتی PowerPC بزرگانتها (big-endian) است. تغییر ABI پیشفرض نیازمند پشتیبانی ویژهٔ سامانه است و احتمال بسیار زیادی دارد که با شکستهای چشمگیری مواجه شود.
- -mabi=elfv2
- رابط ABI فعلی را برای استفاده از رابط کاربردی باینری ELFv2 تغییر میدهد. این ABI پیشفرض برای لینوکس ۶۴بیتی PowerPC کوچکانتها (little-endian) است. تغییر ABI پیشفرض نیازمند پشتیبانی ویژهٔ سامانه است و احتمال بسیار زیادی دارد که با شکستهای چشمگیری مواجه شود.
- -mgnu-attribute
- -mno-gnu-attribute
- دستورالعملهای اسمبلی .gnu_attribute را برای تنظیم جفتهای برچسب/مقدار در یک بخش .gnu.attributes صادر میکند که دگرگونیهای ABI را در پارامترهای توابع یا مقادیر بازگشتی مشخص میکنند.
- -mprototype
- -mno-prototype
- در سامانههای System V.4 و PowerPC تعبیهشده، فرض میکند که همهٔ فراخوانیهای توابع با تعداد متغیر آرگومان دارای پیشنمونه (prototype) هستند. در غیر این صورت، کامپایلر باید پیش از هر فراخوانیِ فاقد پیشنمونه، یک دستورالعمل درج کند تا بیت ۶ ثبات کد شرط ("CR") را تنظیم یا پاک کند تا مشخص شود آیا در صورت پذیرش آرگومانهای متغیر، مقادیر ممیز شناور در ثباتهای ممیز شناور ارسال میشوند یا خیر. با -mprototype، تنها فراخوانیهای توابع با آرگومان متغیرِ دارای پیشنمونه این بیت را تنظیم یا پاک میکنند.
- -msim
- در سامانههای PowerPC تعبیهشده، فرض میکند که نام ماژول راهانداز sim-crt0.o است و کتابخانههای استاندارد C عبارتند از libsim.a و libc.a. این مقدار پیشفرض برای پیکربندیهای powerpc-*-eabisim است.
- -mmvme
- در سامانههای PowerPC تعبیهشده، فرض میکند که نام ماژول راهانداز crt0.o است و کتابخانههای استاندارد C عبارتند از libmvme.a و libc.a.
- -mads
- در سامانههای PowerPC تعبیهشده، فرض میکند که نام ماژول راهانداز crt0.o است و کتابخانههای استاندارد C عبارتند از libads.a و libc.a.
- -myellowknife
- در سامانههای PowerPC تعبیهشده، فرض میکند که نام ماژول راهانداز crt0.o است و کتابخانههای استاندارد C عبارتند از libyk.a و libc.a.
- -mvxworks
- در سامانههای System V.4 و PowerPC تعبیهشده، مشخص میکند که شما برای یک سامانهٔ VxWorks کامپایل میکنید.
- -memb
- در سامانههای PowerPC تعبیهشده، بیت "PPC_EMB" را در هدر پرچمهای ELF تنظیم میکند تا نشان دهد که از بازآراییهای (relocations) گسترشیافتهٔ eabi استفاده میشود.
- -meabi
- -mno-eabi
- در سامانههای System V.4 و PowerPC تعبیهشده، از رابط باینری کاربردی تعبیهشده (EABI) پیروی میکند (یا نمیکند)، که مجموعهای از تغییرات بر مشخصات System V.4 است. انتخاب -meabi به این معنی است که پشته در مرز ۸ بایتی همتراز میشود، تابع "__eabi" از "main" برای راهاندازی محیط EABI فراخوانی میشود و گزینهٔ -msdata میتواند از هر دو ثبات "r2" و "r13" برای اشاره به دو ناحیهٔ دادههای کوچک مجزا استفاده کند. انتخاب -mno-eabi به این معنی است که پشته در مرز ۱۶ بایتی همتراز میشود، هیچ تابع راهانداز EABI از "main" فراخوانی نمیشود و گزینهٔ -msdata تنها از "r13" برای اشاره به یک ناحیهٔ دادههای کوچک منفرد استفاده میکند. اگر GCC را با استفاده از یکی از گزینههای powerpc*-*-eabi* پیکربندی کرده باشید، گزینهٔ -meabi بهطور پیشفرض فعال است.
- -msdata=eabi
- در سامانههای System V.4 و PowerPC تعبیهشده، دادههای کوچک سراسری و ایستای (static) مقداردهیشده از نوع "const" را در بخش ".sdata2" قرار میدهد که ثبات "r2" به آن اشاره میکند. دادههای کوچک سراسری و ایستای مقداردهیشدهٔ غیر-"const" را در بخش ".sdata" قرار میدهد که ثبات "r13" به آن اشاره میکند. دادههای کوچک سراسری و ایستای مقداردهینشده را در بخش ".sbss" قرار میدهد که مجاور بخش ".sdata" است. گزینهٔ -msdata=eabi با گزینهٔ -mrelocatable ناسازگار است. گزینهٔ -msdata=eabi همچنین گزینهٔ -memb را فعال میکند.
- -msdata=sysv
- در سامانههای System V.4 و PowerPC تعبیهشده، دادههای کوچک سراسری و ایستا را در بخش ".sdata" قرار میدهد که ثبات "r13" به آن اشاره میکند. دادههای کوچک سراسری و ایستای مقداردهینشده را در بخش ".sbss" قرار میدهد که مجاور بخش ".sdata" است. گزینهٔ -msdata=sysv با گزینهٔ -mrelocatable ناسازگار است.
- -msdata=default
- -msdata
- روی سامانههای System V.4 و PowerPC تعبیهشده (embedded)، اگر -meabi استفاده شود، کد همانند -msdata=eabi کامپایل میشود؛ در غیر این صورت کد همانند -msdata=sysv کامپایل خواهد شد.
- -msdata=data
- روی سامانههای System V.4 و PowerPC تعبیهشده، دادههای سراسری کوچک را در بخش ".sdata" قرار میدهد. دادههای سراسری مقداردهینشدهٔ کوچک را در بخش ".sbss" قرار میدهد. با این حال، از ثبات "r13" برای آدرسدهی دادههای کوچک استفاده نمیکند. این رفتار پیشفرض است مگر اینکه از سایر گزینههای -msdata استفاده شود.
- -msdata=none
- -mno-sdata
- روی سامانههای PowerPC تعبیهشده، تمام دادههای سراسری و ایستا (static) مقداردهیشده را در بخش ".data" و تمام دادههای مقداردهینشده را در بخش ".bss" قرار میدهد.
- -mreadonly-in-sdata
- اشیاء فقطخواندنی را نیز در بخش ".sdata" قرار میدهد. این حالت پیشفرض است.
- -mblock-move-inline-limit=num
- تمام انتقالهای بلوکی (مانند فراخوانیهای "memcpy" یا رونوشت ساختارها) را که اندازهٔ آنها کوچکتر یا مساوی با num بایت است، بهصورت درونخطی (inline) درمیآورد. حداقل مقدار برای num روی اهداف ۳۲ بیتی ۳۲ بایت و روی اهداف ۶۴ بیتی ۶۴ بایت است. مقدار پیشفرض به هدف بستگی دارد.
- -mblock-compare-inline-limit=num
- برای تمام مقایسههای بلوکی (مانند فراخوانیهای "memcmp" یا مقایسهٔ ساختارها) که کوچکتر یا مساوی با num بایت هستند، کد درونخطی بدون حلقه تولید میکند. اگر num برابر ۰ باشد، تمام گسترشهای درونخطی (بدون حلقه و با حلقه) برای مقایسهٔ بلوکی غیرفعال میشوند. مقدار پیشفرض به هدف بستگی دارد.
- -mblock-compare-inline-loop-limit=num
- یک گسترش درونخطی با استفاده از کد حلقهای برای تمام مقایسههای بلوکی که کوچکتر یا مساوی با num بایت اما بزرگتر از حد مجاز گسترش مقایسهٔ بلوکی درونخطی بدون حلقه هستند، تولید میکند. اگر طول بلوک ثابت نباشد، حداکثر num بایت پیش از فراخوانی "memcmp" برای مقایسهٔ باقیماندهٔ بلوک مقایسه خواهد شد. مقدار پیشفرض به هدف بستگی دارد.
- -mstring-compare-inline-limit=num
- حداکثر num بایت از رشته را با کد درونخطی مقایسه میکند. اگر تفاوت یا انتهای رشته در پایان مقایسهٔ درونخطی پیدا نشود، فراخوانی به "strcmp" یا "strncmp" ادامهٔ مقایسه را انجام خواهد داد. پیشفرض ۶۴ بایت است.
- -G num
- روی سامانههای PowerPC تعبیهشده، مؤلفههای سراسری و ایستا را که کوچکتر یا مساوی با num بایت هستند، به جای بخشهای داده یا BSS عادی، در بخشهای دادهٔ کوچک یا BSS قرار میدهد. بهطور پیشفرض، مقدار num برابر ۸ است. سوییچ -G num به پیونددهنده نیز ارسال میشود. تمام پودمانها باید با مقدار یکسان -G num کامپایل شوند.
- -mregnames
- -mno-regnames
- روی سامانههای System V.4 و PowerPC تعبیهشده، نام ثباتها را در خروجی زبان اسمبلی با استفاده از اشکال نمادین درج میکند (یا درج نمیکند).
- -mlongcall
- -mno-longcall
- بهطور
پیشفرض
فرض میکند
که تمام
فراخوانیها
دوردست
هستند،
بهطوری که
به یک توالی
فراخوانی
طولانیتر
و
پرهزینهتر
نیاز است.
این امر
برای
فراخوانیهایی
با فاصلهٔ
بیشتر از ۳۲
مگابایت
(۳۳٬۵۵۴٬۴۳۲
بایت) از
مکان فعلی
ضروری است.
اگر
کامپایلر
بداند که
فراخوانی
نمیتواند
تا این حد
دور باشد،
یک
فراخوانی
کوتاه
ایجاد
میکند. این
تنظیم را
میتوان با
صفت تابع
"shortcall" یا
با دستور
#pragma longcall(0) لغو
کرد.
برخی پیونددهندهها قادر به تشخیص فراخوانیهای خارج از محدوده و تولید بیدرنگ کدهای واسط (glue code) هستند. در این سامانهها، فراخوانیهای دور غیرضروری بوده و کد کندتری تولید میکنند. تا زمان نگارش این متن، پیونددهندهٔ AIX و همچنین پیونددهندهٔ GNU برای PowerPC/64 قادر به انجام این کار هستند. برنامهریزی شده است تا این قابلیت به پیونددهندهٔ GNU برای سامانههای PowerPC ۳۲ بیتی نیز اضافه شود.
روی سامانههای PowerPC64 ELFv2 و سامانههای PowerPC ۳۲ بیتی با پیونددهندههای GNU جدیدتر، GCC میتواند فراخوانیهای دور را با استفاده از یک توالی فراخوانی درونخطی PLT تولید کند (نگاه کنید به -mpltseq). معماری PowerPC با -mbss-plt و PowerPC64 ELFv1 (موتورلا یا big-endian) از فراخوانیهای درونخطی PLT پشتیبانی نمیکنند.
روی سامانههای Darwin/PPC، دستور "#pragma longcall" عبارت "jbsr callee, L42" را بههمراه یک branch island (کد واسط) تولید میکند. دو آدرس مقصد نشاندهندهٔ تابع فراخوانیشده و branch island هستند. پیونددهندهٔ Darwin/PPC آدرس اول را ترجیح میدهد و اگر دستور PPC "bl" مستقیماً به تابع فراخوانیشده برسد، یک "bl callee" تولید میکند؛ در غیر این صورت، پیونددهنده برای فراخوانی branch island دستور "bl L42" را تولید مینماید. جزیرهٔ انشعاب (branch island) به انتهای بدنهٔ تابع فراخوان پیوست میشود؛ این بخش آدرس کامل ۳۲ بیتی تابع فراخوانیشده را محاسبه کرده و به آن پرش میکند.
روی سامانههای Mach-O (Darwin)، این گزینه کامپایلر را هدایت میکند تا برای هر فراخوانی مستقیم، کد واسط تولید کند، و پیونددهندهٔ Darwin تصمیم میگیرد که از آن استفاده کند یا آن را دور بیندازد.
در آینده، زمانی که مشخص باشد پیونددهنده کد واسط را تولید میکند، ممکن است GCC تمام مشخصات longcall را نادیده بگیرد.
- -mpltseq
- -mno-pltseq
- گزینهٔ -fno-plt و فراخوانیهای دور را با استفاده از یک توالی فراخوانی درونخطی PLT پیادهسازی میکند (یا پیادهسازی نمیکند) که از پیوند تنبل (lazy linking) و فراخوانیهای دور به توابع در کتابخانههای مشترک بارگذاریشده توسط dlopen پشتیبانی مینماید. فراخوانیهای درونخطی PLT فقط روی سامانههای PowerPC64 ELFv2 و PowerPC ۳۲ بیتی با پیونددهندههای GNU جدیدتر پشتیبانی میشوند، و در صورتی که این پشتیبانی هنگام پیکربندی GCC شناسایی شود بهطور پیشفرض فعال هستند؛ همچنین در مورد PowerPC ۳۲ بیتی، در صورتی که GCC با --enable-secureplt پیکربندی شده باشد، فعال میگردد. کدهای -mpltseq و اشیاء بازآدرسپذیر (relocatable) گزینهٔ -mbss-plt در PowerPC ۳۲ بیتی نباید با یکدیگر پیوند داده شوند.
- -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
- دستورالعملهای تقریب معکوس را هم برای دقت تکی (single) و هم دقت مضاعف (double) فعال میکند.
- divf
- دستورالعملهای تقریب معکوس با دقت تکی را فعال میکند.
- divd
- دستورالعملهای تقریب معکوس با دقت مضاعف را فعال میکند.
- rsqrt
- دستورالعملهای تقریب ریشهٔ دوم معکوس را هم برای دقت تکی و هم دقت مضاعف فعال میکند..IP rsqrtf 4 فعالسازی دستورالعملهای تقریب معکوس جذر با دقت یگانه.
- rsqrtd
- فعالسازی دستورالعملهای تقریب معکوس جذر با دقت دوگانه.
بنابراین، به عنوان مثال، -mrecip=all,!rsqrtd تمام دستورالعملهای برآورد معکوس را فعال میکند، به جز دستورالعملهای "FRSQRTE"، "XSRSQRTEDP" و "XVRSQRTEDP" که محاسبات معکوس جذر با دقت دوگانه را مدیریت میکنند.
- -mrecip-precision
- -mno-recip-precision
- فرض کردن (فرض نکردن) اینکه دستورالعملهای برآورد معکوس، برآوردهایی با دقت بالاتر از آنچه توسط ABI مربوط به PowerPC تعیین شده ارائه میدهند. انتخاب -mcpu=power6، -mcpu=power7 یا -mcpu=power8 به طور خودکار -mrecip-precision را انتخاب میکند. دستورالعملهای برآورد جذر با دقت دوگانه به طور پیشفرض روی ماشینهای با دقت پایین تولید نمیشوند، زیرا برآوردی که پس از سه مرحله همگرا شود ارائه نمیدهند.
- -mveclibabi=type
- نوع ABI مورد استفاده برای برداریسازی توابع درونی با استفاده از یک کتابخانه خارجی را مشخص میکند. تنها نوع پشتیبانیشده در حال حاضر mass است، که استفاده از کتابخانههای Mathematical Acceleration Subsystem (MASS) متعلق به IBM را برای برداریسازی توابع درونی با استفاده از کتابخانههای خارجی تعیین میکند. در حال حاضر GCC هنگام تولید کد برای power7، فراخوانیهایی به "acosd2"، "acosf4"، "acoshd2"، "acoshf4"، "asind2"، "asinf4"، "asinhd2"، "asinhf4"، "atan2d2"، "atan2f4"، "atand2"، "atanf4"، "atanhd2"، "atanhf4"، "cbrtd2"، "cbrtf4"، "cosd2"، "cosf4"، "coshd2"، "coshf4"، "erfcd2"، "erfcf4"، "erfd2"، "erff4"، "exp2d2"، "exp2f4"، "expd2"، "expf4"، "expm1d2"، "expm1f4"، "hypotd2"، "hypotf4"، "lgammad2"، "lgammaf4"، "log10d2"، "log10f4"، "log1pd2"، "log1pf4"، "log2d2"، "log2f4"، "logd2"، "logf4"، "powd2"، "powf4"، "sind2"، "sinf4"، "sinhd2"، "sinhf4"، "sqrtd2"، "sqrtf4"، "tand2"، "tanf4"، "tanhd2" و "tanhf4" صادر میکند. هر دو گزینه -ftree-vectorize و -funsafe-math-optimizations نیز باید فعال باشند. کتابخانههای MASS باید در زمان پیوند مشخص شوند.
- -mfriz
- -mno-friz
- تولید کردن (تولید نکردن) دستورالعمل "friz" هنگامی که گزینه -funsafe-math-optimizations برای بهینهسازی گرد کردن مقادیر ممیز شناور به عدد صحیح ۶۴ بیتی و بازگشت به ممیز شناور استفاده میشود. اگر عدد ممیز شناور بزرگتر از آن باشد که در یک عدد صحیح جا شود، دستورالعمل "friz" مقدار یکسانی برنمیگرداند.
- -mpointers-to-nested-functions
- -mno-pointers-to-nested-functions
- تولید کردن (تولید نکردن) کد برای بارگذاری ثبات زنجیره ایستا ("r11") هنگام فراخوانی از طریق یک اشارهگر در سیستمهای AIX و لینوکس ۶۴ بیتی، جایی که اشارهگر تابع به یک توصیفگر ۳ کلمهای اشاره میکند که آدرس تابع، مقدار TOC جهت بارگذاری در ثبات "r2"، و مقدار زنجیره ایستا جهت بارگذاری در ثبات "r11" را در بر دارد. گزینه -mpointers-to-nested-functions به طور پیشفرض فعال است. در صورت استفاده از -mno-pointers-to-nested-functions نمیتوانید از طریق اشارهگرها، توابع تودرتو یا توابع کامپایلشده در سایر زبانهایی که از زنجیره ایستا استفاده میکنند را فراخوانی کنید.
- -msave-toc-indirect
- -mno-save-toc-indirect
- تولید کردن (تولید نکردن) کد برای ذخیره مقدار TOC در مکان رزروشده پشته در مقدمه تابع (function prologue)، اگر تابع در سیستمهای AIX و لینوکس ۶۴ بیتی از طریق اشارهگر فراخوانی شود. اگر مقدار TOC در مقدمه ذخیره نشود، دقیقاً قبل از فراخوانی از طریق اشارهگر ذخیره میشود. گزینه -mno-save-toc-indirect پیشفرض است.
- -mcompat-align-parm
- -mno-compat-align-parm
- تولید کردن
(تولید
نکردن) کد
جهت ارسال
پارامترهای
ساختار با
حداکثر
تراز ۶۴
بیت، برای
سازگاری با
نسخههای
قدیمیتر GCC.
نسخههای قدیمیتر GCC (قبل از 4.9.0) به اشتباه پارامترهای ساختار را در صورتی که ساختار حاوی عضوی نیازمند تراز ۱۲۸ بیتی بود، بر روی مرز ۱۲۸ بیتی تراز نمیکردند. این مورد در نسخههای جدیدتر GCC اصلاح شده است. از این گزینه میتوان برای تولید کدی استفاده کرد که با توابع کامپایلشده با نسخههای قدیمیتر GCC سازگار باشد.
گزینه -mno-compat-align-parm پیشفرض است.
- -mstack-protector-guard=guard
- -mstack-protector-guard-reg=reg
- -mstack-protector-guard-offset=offset
- تولید کد
محافظت از
پشته با
استفاده از
قناری در guard.
مکانهای
پشتیبانیشده
عبارتند از
global برای
قناری
سراسری یا
tls برای
قناری به
ازای هر
رشته در
بلوک TLS
(پیشفرض با
نسخه GNU libc 2.4 یا
بالاتر).
با انتخاب گزینه دوم، گزینههای -mstack-protector-guard-reg=reg و -mstack-protector-guard-offset=offset علاوه بر این مشخص میکنند که از کدام ثبات به عنوان ثبات پایه برای خواندن قناری و با چه آفستی از آن ثبات پایه استفاده شود. پیشفرض این مقادیر همان است که در ABI مربوطه مشخص شده است.
- -mpcrel
- -mno-pcrel
- تولید کردن (تولید نکردن) آدرسدهی وابسته به شمارنده برنامه (pc-relative). گزینه -mpcrel نیازمند فعال بودن گزینههای مدل کد متوسط (-mcmodel=medium) و آدرسدهی پیشوندی (-mprefixed) است.
- -mprefixed
- -mno-prefixed
- تولید کردن (تولید نکردن) حالتهای آدرسدهی با استفاده از دستورالعملهای بارگذاری و ذخیرهسازی پیشوندی. گزینه -mprefixed نیازمند فعال بودن گزینه -mcpu=power10 (یا بالاتر) است.
- -mmma
- -mno-mma
- تولید کردن (تولید نکردن) دستورالعملهای MMA. گزینه -mma نیازمند فعال بودن گزینه -mcpu=power10 (یا بالاتر) است.
- -mrop-protect
- -mno-rop-protect
- تولید کردن (تولید نکردن) دستورالعملهای محافظت در برابر ROP هنگامی که پردازنده مقصد از آنها پشتیبانی میکند. در حال حاضر این گزینه بهینهسازی shrink-wrap (-fshrink-wrap) را غیرفعال میکند.
- -mprivileged
- -mno-privileged
- تولید کردن (تولید نکردن) کدی که در وضعیت ممتاز (privileged) اجرا خواهد شد.
- -mblock-ops-unaligned-vsx
- -mno-block-ops-unaligned-vsx
- تولید کردن (تولید نکردن) بارگذاریها و ذخیرهسازیهای ترازنشده VSX برای بسط درونخطی توابع "memcpy" و "memmove".
- --param rs6000-vect-unroll-limit=
- بخش برداریساز با بررسی اطلاعات پردازنده مقصد تعیین میکند که آیا باز کردن حلقه اصلی برداریشده سودمند خواهد بود و تا چه اندازه. این پارامتر کران بالای میزان باز کردن حلقه اصلی توسط برداریساز را تعیین میکند. مقدار پیشفرض چهار است..PP گزینههای RX
این گزینههای خط فرمان برای مقصدهای RX تعریف شدهاند:
- -m64bit-doubles
- -m32bit-doubles
- اندازه نوع داده "double" را ۶۴ بیت (-m64bit-doubles) یا ۳۲ بیت (-m32bit-doubles) تعیین میکند. پیشفرض -m32bit-doubles است. نکته: سختافزار ممیز شناور RX تنها روی مقادیر ۳۲ بیتی کار میکند، به همین دلیل پیشفرض -m32bit-doubles است.
- -fpu
- -nofpu
- استفاده از
سختافزار
ممیز شناور
RX را فعال (-fpu)
یا غیرفعال
(-nofpu) میکند.
مقدار
پیشفرض
برای سری RX600
فعال و برای
سری RX200
غیرفعال
است.
با این حال، دستورالعملهای ممیز شناور تنها برای مقادیر ممیز شناور ۳۲ بیتی تولید میشوند، بنابراین در صورت استفاده از گزینه -m64bit-doubles، سختافزار FPU برای مقادیر double استفاده نمیشود.
نکته: اگر گزینه -fpu فعال باشد، آنگاه -funsafe-math-optimizations نیز بهطور خودکار فعال میشود. این بدان دلیل است که خود دستورالعملهای FPU در RX ناامن هستند.
- -mcpu=name
- نوع
پردازنده RX
مقصد را
انتخاب
میکند. در
حال حاضر سه
نوع
پشتیبانی
میشوند:
سختافزار
عمومی
سریهای RX600
و RX200، و
پردازنده
خاص RX610.
مقدار
پیشفرض RX600
است.
تنها تفاوت میان RX600 و RX610 این است که RX610 از دستورالعمل "MVTIPL" پشتیبانی نمیکند.
سری RX200 فاقد واحد ممیز شناور سختافزاری است و بنابراین هنگام انتخاب این نوع، -nofpu بهطور پیشفرض فعال است.
- -mbig-endian-data
- -mlittle-endian-data
- دادهها (اما نه کد) را در قالب big-endian ذخیره میکند. پیشفرض -mlittle-endian-data است، یعنی ذخیره دادهها در قالب little-endian.
- -msmall-data-limit=N
- حداکثر
اندازه بر
حسب بایت را
برای
متغیرهای
سراسری و
ایستا که
میتوانند
در ناحیه
دادههای
کوچک (small data area)
قرار
گیرند،
مشخص
میکند.
استفاده از
ناحیه
دادههای
کوچک
میتواند
به کدی
کوچکتر و
سریعتر
بیانجامد،
اما اندازه
این ناحیه
محدود است و
بر عهده
برنامهنویس
است که
اطمینان
یابد این
ناحیه
سرریز
نمیشود.
همچنین
هنگامی که
از ناحیه
دادههای
کوچک
استفاده
میشود،
یکی از
ثباتهای RX
(معمولاً
"r13") برای
اشاره به
این ناحیه
رزرو
میشود،
بنابراین
دیگر برای
استفاده
توسط
کامپایلر
در دسترس
نیست. این
امر در
صورتی که
متغیرها به
جای
نگهداری در
این ثبات به
درون پشته
رانده شوند
(push شوند)،
میتواند
منجر به کدی
کندتر و/یا
بزرگتر
شود.
توجه داشته باشید، متغیرهای عمومی (متغیرهایی که مقداردهی اولیه نشدهاند) و ثوابت در ناحیه دادههای کوچک قرار نمیگیرند، چرا که به بخشهای دیگری در فایل اجرایی خروجی اختصاص مییابند.
مقدار پیشفرض صفر است که این ویژگی را غیرفعال میکند. توجه داشته باشید، این ویژگی به دلیل اثرات بالقوه زیانبار رزرو یک ثبات، در سطوح بهینهسازی بالاتر (-O2 و غیره) بهطور پیشفرض فعال نمیشود. این بر عهده برنامهنویس است که آزمایش کند و دریابد آیا این ویژگی به نفع برنامه است یا خیر. برای توضیحات مربوط به نحوه انتخاب ثبات واقعی برای نگهداری اشارهگر ناحیه دادههای کوچک، شرح گزینه -mpid را ببینید.
- -msim
- -mno-sim
- از زمان اجرای شبیهساز (simulator runtime) استفاده میکند. پیشفرض استفاده از زمان اجرای وابسته به برد libgloss است.
- -mas100-syntax
- -mno-as100-syntax
- هنگام تولید خروجی اسمبلر، از ساختاری استفاده میکند که با اسمبلر AS100 متعلق به Renesas سازگار باشد. این ساختار دستوری توسط اسمبلر GAS نیز قابل پردازش است، اما محدودیتهایی دارد، بنابراین بهطور پیشفرض تولید نمیشود.
- -mmax-constant-size=N
- حداکثر
اندازه بر
حسب بایت را
برای ثابتی
که
میتواند
به عنوان یک
عملوند در
دستورالعمل
RX استفاده
شود مشخص
میکند.
اگرچه
مجموعه
دستورالعملهای
RX اجازه
میدهد
ثوابتی تا
طول ۴ بایت
در
دستورالعملها
استفاده
شوند،
مقدار
طولانیتر
به منزله یک
دستورالعمل
طولانیتر
است.
بنابراین
در برخی
شرایط
میتواند
محدود کردن
اندازه
ثوابت مورد
استفاده در
دستورالعملها
سودمند
باشد.
ثوابتی که
بیش از حد
بزرگ
باشند، در
عوض در یک
استخر
مقادیر
ثابت قرار
گرفته و از
طریق ارجاع
غیرمستقیم
ثبات
فراخوانی
میشوند.
مقدار N میتواند بین 0 تا 4 باشد. مقدار 0 (پیشفرض) یا 4 بدین معناست که ثوابت با هر اندازهای مجاز هستند.
- -mrelax
- بهینهسازی پیونددهنده (linker relaxation) را فعال میکند. بهینهسازی پیونددهنده فرایندی است که طی آن پیونددهنده تلاش میکند با یافتن نگارشهای کوتاهتر از دستورالعملهای گوناگون، اندازه برنامه را کاهش دهد. بهطور پیشفرض غیرفعال است.
- -mint-register=N
- تعداد ثباتهای رزروشده برای توابع گرداننده وقفه سریع را مشخص میکند. مقدار N میتواند بین 0 تا 4 باشد. مقدار 1 بدین معناست که ثبات "r13" به صورت انحصاری برای گردانندههای وقفه سریع رزرو میشود. مقدار 2 ثباتهای "r13" و "r12" را رزرو میکند. مقدار 3 ثباتهای "r13"، "r12" و "r11" را رزرو کرده و مقدار 4 ثباتهای "r13" تا "r10" را رزرو مینماید. مقدار 0 (پیشفرض) هیچ ثباتی را رزرو نمیکند.
- -msave-acc-in-interrupts
- مشخص میکند که توابع گرداننده وقفه باید ثبات انباره (accumulator register) را حفظ کنند. این کار تنها زمانی ضروری است که کد معمولی ممکن است از ثبات انباره استفاده کند، به عنوان مثال به این دلیل که ضربهای ۶۴ بیتی انجام میدهد. حالت پیشفرض نادیده گرفتن ثبات انباره است چرا که این امر گردانندههای وقفه را سریعتر میکند.
- -mpid
- -mno-pid
- تولید
دادههای
مستقل از
موقعیت (position independent
data) را فعال
میکند. در
هنگام فعال
بودن،
هرگونه
دسترسی به
دادههای
ثابت از
طریق یک
آفست از یک
آدرس پایه
نگهداریشده
در یک ثبات
انجام
میشود. این
امر اجازه
میدهد
موقعیت
دادههای
ثابت در
زمان اجرا
بدون نیاز
به
بازآرایی
فایل
اجرایی
تعیین شود،
که مزیتی
برای
برنامههای
توکار با
محدودیت
شدید حافظه
به شمار
میرود.
دادههایی
که قابل
تغییر
هستند تحت
تأثیر این
گزینه قرار
نمیگیرند.
توجه داشته باشید، استفاده از این ویژگی یک ثبات (معمولاً "r13") را برای آدرس پایه دادههای ثابت رزرو میکند. این میتواند به کدی کندتر و/یا بزرگتر بیانجامد، بهویژه در توابع پیچیده.
ثبات واقعی انتخابشده برای نگهداری آدرس پایه دادههای ثابت به این بستگی دارد که آیا گزینههای خط فرمان -msmall-data-limit و/یا -mint-register فعال باشند یا خیر. با شروع از ثبات "r13" و حرکت رو به پایین، ثباتها ابتدا برای برآورده کردن نیازهای -mint-register، سپس -mpid و در نهایت -msmall-data-limit تخصیص مییابند. بنابراین این امکان وجود دارد که اگر هر دو گزینه -mint-register=4 و -mpid در خط فرمان مشخص شده باشند، ثبات ناحیه دادههای کوچک "r8" باشد.
بهطور پیشفرض این ویژگی فعال نیست. حالت پیشفرض را میتوان از طریق گزینه خط فرمان -mno-pid بازیابی کرد.
- -mno-warn-multiple-fast-interrupts
- -mwarn-multiple-fast-interrupts
- از صدور پیام هشدار توسط GCC در صورتی که هنگام کامپایل یک فایل بیش از یک گرداننده وقفه سریع پیدا کند جلوگیری میکند. پیشفرض صدور یک هشدار به ازای هر گرداننده وقفه سریعِ اضافی پیدا شده است، چرا که RX تنها از یک وقفه از این دست پشتیبانی میکند.
- -mallow-string-insns
- -mno-allow-string-insns
- استفاده از
دستورالعملهای
دستکاری
رشته
"SMOVF"،
"SCMPU"،
"SMOVB"،
"SMOVU"،
"SUNTIL"،
"SWHILE" و
همچنین
دستورالعمل
"RMPA" را
فعال یا
غیرفعال
میکند. این
دستورالعملها
ممکن است
دادهها را
پیشواکشی
کنند، که در
صورت
دسترسی به
یک ثبات
ورودی/خروجی
(I/O) کاری
ناامن است.
(برای
اطلاعات
بیشتر به
بخش 12.2.7 در RX62N Group User's Manual
مراجعه
کنید).
حالت پیشفرض مجاز دانستن این دستورالعملها است، اما برای GCC ممکن نیست تمام شرایطی را که در آنها ممکن است یک دستورالعمل رشتهای برای دسترسی به یک ثبات I/O استفاده شود بهطور مطمئن تشخیص دهد، بنابراین استفاده از آنها نمیتواند بهطور خودکار غیرفعال شود. در عوض، بر عهده برنامهنویس گذاشته شده است که در صورت دسترسی برنامه به فضای I/O، از گزینه -mno-allow-string-insns استفاده کند.
هنگامی که این دستورالعملها فعال باشند GCC نماد پیشپردازنده C یعنی "__RX_ALLOW_STRING_INSNS__" را تعریف میکند، و در غیر این صورت نماد "__RX_DISALLOW_STRING_INSNS__" را تعریف مینماید..IP -mjsr 4
- -mno-jsr
- تنها (یا نه فقط) از دستورالعملهای "JSR" برای دسترسی به توابع استفاده میکند. این گزینه زمانی میتواند استفاده شود که اندازهٔ کد از محدودهٔ دستورالعملهای "BSR" فراتر رود. توجه داشته باشید که -mno-jsr به معنای عدم استفاده از "JSR" نیست، بلکه به این معناست که هر نوع پرشی ممکن است استفاده شود.
نکته: گزینهٔ عمومی خط فرمان GCC یعنی -ffixed-reg، هنگامی که با مشخصهٔ تابع "interrupt" به کار رود، اهمیت ویژهای برای پورت RX دارد. این مشخصه نشاندهندهٔ تابعی است که برای پردازش وقفههای سریع در نظر گرفته شده است. GCC تضمین میکند که تنها از ثباتهای "r10"، "r11"، "r12" و/یا "r13" استفاده کند، و این نیز مشروط بر آن است که استفادهٔ عادی از ثباتهای متناظر از طریق گزینههای خط فرمان -ffixed-reg یا -mint-register محدود شده باشد.
گزینههای S/390 و zSeries
اینها گزینههای -m هستند که برای معماری S/390 و zSeries تعریف شدهاند.
- -mhard-float
- -msoft-float
- از دستورالعملها و ثباتهای سختافزاری ممیز شناور برای عملیات ممیز شناور استفاده میکند (یا استفاده نمیکند). هنگامی که -msoft-float مشخص شود، از توابع موجود در libgcc.a برای انجام عملیات ممیز شناور استفاده میشود. هنگامی که -mhard-float مشخص شود، کامپایلر دستورالعملهای ممیز شناور IEEE را تولید میکند. این حالت پیشفرض است.
- -mhard-dfp
- -mno-hard-dfp
- از دستورالعملهای سختافزاری ممیز شناور دهدهی برای عملیات ممیز شناور دهدهی استفاده میکند (یا استفاده نمیکند). هنگامی که -mno-hard-dfp مشخص شود، از توابع موجود در libgcc.a برای انجام عملیات ممیز شناور دهدهی استفاده میشود. هنگامی که -mhard-dfp مشخص شود، کامپایلر دستورالعملهای سختافزاری ممیز شناور دهدهی را تولید میکند. این حالت برای -march=z9-ec یا بالاتر پیشفرض است.
- -mlong-double-64
- -mlong-double-128
- این سوئیچها اندازهٔ نوع "long double" را کنترل میکنند. اندازهٔ ۶۴ بیتی، نوع "long double" را معادل با نوع "double" میسازد. این حالت پیشفرض است.
- -mbackchain
- -mno-backchain
- آدرس فریم
فراخواننده
را به عنوان
اشارهگر backchain
در فریم
پشتهٔ
فراخوانیشده
ذخیره
میکند (یا
ذخیره
نمیکند).
یک backchain ممکن
است برای
امکانپذیر
ساختن
اشکالزدایی
با استفاده
از
ابزارهایی
که اطلاعات
فریم
فراخوانی DWARF
را متوجه
نمیشوند،
نیاز باشد.
هنگامی که
-mno-packed-stack فعال
باشد،
اشارهگر backchain
در انتهای
فریم پشته
ذخیره
میشود؛
هنگامی که
-mpacked-stack فعال
باشد، backchain در
بالاترین
کلمه از
ناحیهٔ
ذخیرهٔ
ثبات ۹۶/۱۶۰
بایتی قرار
میگیرد.
به طور کلی، کدی که با -mbackchain کامپایل شده باشد با کدی که با -mno-backchain کامپایل شده سازگاری فراخوانی دارد؛ با این حال، استفاده از backchain برای مقاصد اشکالزدایی معمولاً نیازمند آن است که کل باینری با -mbackchain ساخته شود. توجه داشته باشید که ترکیب -mbackchain، -mpacked-stack و -mhard-float پشتیبانی نمیشود. برای ساخت هستهٔ لینوکس از -msoft-float استفاده کنید.
پیشفرض این است که backchain نگهداری نشود.
- -mpacked-stack
- -mno-packed-stack
- از چیدمان
پشتهٔ
فشرده (packed stack layout)
استفاده
میکند (یا
استفاده
نمیکند).
هنگامی که
-mno-packed-stack مشخص
شود،
کامپایلر
تمام
فیلدهای
ناحیهٔ
ذخیرهٔ
ثبات ۹۶/۱۶۰
بایتی را
تنها برای
اهداف
پیشفرضشان
استفاده
میکند؛
فیلدهای
بلااستفاده
همچنان
فضای پشته
را اشغال
میکنند.
هنگامی که
-mpacked-stack مشخص
شود،
شیارهای
ذخیرهٔ
ثبات به
صورت فشرده
در بالای
ناحیهٔ
ذخیرهٔ
ثبات قرار
میگیرند؛
از فضای
بلااستفاده
برای مقاصد
دیگر
استفاده
میشود، که
امکان
استفادهٔ
بهینهتر
از فضای
پشتهٔ
موجود را
فراهم
میکند. با
این وجود،
هنگامی که
-mbackchain نیز
فعال باشد،
بالاترین
کلمه از
ناحیهٔ
ذخیره
همیشه برای
ذخیرهٔ backchain
استفاده
میشود، و
ثبات آدرس
بازگشت
همیشه دو
کلمه
پایینتر
از backchain ذخیره
میشود.
تا زمانی که از backchain فریم پشته استفاده نشود، کدی که با -mpacked-stack تولید شده با کدی که با -mno-packed-stack تولید شده سازگاری فراخوانی دارد. توجه داشته باشید که برخی از نسخههای غیر FSF از GCC 2.95 برای S/390 یا zSeries کدی تولید میکردند که از backchain فریم پشته در زمان اجرا استفاده میکرد، نه صرفاً برای مقاصد اشکالزدایی. چنین کدی با کدی که با -mpacked-stack کامپایل شده باشد سازگاری فراخوانی ندارد. همچنین، توجه داشته باشید که ترکیب -mbackchain، -mpacked-stack و -mhard-float پشتیبانی نمیشود. برای ساخت هستهٔ لینوکس از -msoft-float استفاده کنید.
پیشفرض عدم استفاده از چیدمان پشتهٔ فشرده است.
- -msmall-exec
- -mno-small-exec
- کدی تولید میکند (یا تولید نمیکند) که از دستورالعمل "bras" برای فراخوانی زیربرنامهها استفاده میکند. این قابلیت تنها در صورتی با اطمینان کار میکند که اندازهٔ کل فایل اجرایی از 64k فراتر نرود. حالت پیشفرض استفاده از دستورالعمل "basr" است، که این محدودیت را ندارد.
- -m64
- -m31
- هنگامی که -m31 مشخص شود، کدی سازگار با ABI مربوط به GNU/Linux برای S/390 تولید میکند. هنگامی که -m64 مشخص شود، کدی سازگار با ABI مربوط به GNU/Linux برای zSeries تولید میکند. این امر به ویژه به GCC اجازه میدهد دستورالعملهای ۶۴ بیتی تولید کند. برای مقاصد s390، حالت پیشفرض -m31 است، در حالی که مقاصد s390x به طور پیشفرض روی -m64 تنظیم شدهاند.
- -mzarch
- -mesa
- هنگامی که -mzarch مشخص شود، کدی با استفاده از دستورالعملهای موجود در z/Architecture تولید میکند. هنگامی که -mesa مشخص شود، کدی با استفاده از دستورالعملهای موجود در ESA/390 تولید میکند. توجه داشته باشید که -mesa همراه با -m64 امکانپذیر نیست. هنگام تولید کد سازگار با ABI مربوط به GNU/Linux برای S/390، حالت پیشفرض -mesa است. هنگام تولید کد سازگار با ABI مربوط به GNU/Linux برای zSeries، حالت پیشفرض -mzarch است.
- -mhtm
- -mno-htm
- گزینهٔ -mhtm مجموعهای از توابع درونی (builtins) را فعال میکند که از دستورالعملهای موجود در امکان اجرای تراکنشی (transactional execution facility) معرفیشده با نسل ماشینهای IBM zEnterprise EC12 استفاده میکنند S/390 System z Built-in Functions. هنگام استفاده از -march=zEC12، گزینهٔ -mhtm به طور پیشفرض فعال است.
- -mvx
- -mno-vx
- هنگامی که -mvx مشخص شود، کدی با استفاده از دستورالعملهای موجود در امکان افزونههای برداری (vector extension facility) معرفیشده با نسل ماشینهای IBM z13 تولید میکند. این گزینه، ABI را برای برخی از مقادیر نوع برداری با توجه به همترازی (alignment) و قراردادهای فراخوانی تغییر میدهد. در صورتی که مقادیر نوع برداری در زمینهای مرتبط با ABI استفاده شوند، دستور .gnu_attribute در GAS اضافه خواهد شد تا باینری حاصل را با ABI استفادهشده نشانهگذاری کند. هنگام استفاده از -march=z13، گزینهٔ -mvx به طور پیشفرض فعال است.
- -mzvector
- -mno-zvector
- گزینهٔ -mzvector افزونههای زبان برداری و توابع درونی را با استفاده از دستورالعملهای موجود در امکان افزونههای برداری معرفیشده با نسل ماشینهای IBM z13 فعال میکند. این گزینه پشتیبانی از کلمهٔ کلیدی vector را برای تعریف متغیرها و آرگومانهای نوع برداری اضافه میکند. vector تنها زمانی در دسترس است که افزونههای GNU فعال باشند. در صورت درخواست سازگاری دقیق با استاندارد مانند -std=c99، این کلمه باز (expand) نخواهد شد. علاوه بر توابع درونی سطح پایین GCC، گزینهٔ -mzvector مجموعهای از توابع درونی را فعال میکند که برای سازگاری با پیادهسازیهای سبک AltiVec مانند Power و Cell اضافه شدهاند. به منظور استفاده از این توابع درونی، فایل سرآیند vecintrin.h باید اضافه شود. -mzvector به طور پیشفرض غیرفعال است..IP -mmvcle 4
- -mno-mvcle
- تولید (یا عدم تولید) کد با استفاده از دستورالعمل "mvcle" جهت انجام انتقالهای بلوکی. هنگام مشخص شدن -mno-mvcle، به جای آن از یک حلقهٔ "mvc" استفاده میشود. این حالت پیشفرض است مگر آنکه بهینهسازی برای اندازه انجام گیرد.
- -mdebug
- -mno-debug
- چاپ (یا عدم چاپ) اطلاعات اشکالزدایی اضافی هنگام کامپایل. حالت پیشفرض چاپ نکردن اطلاعات اشکالزدایی است.
- -march=cpu-type
- تولید کدی
که بر روی cpu-type
اجرا شود،
که نام
سامانهای
نشاندهندهٔ
نوع خاصی از
پردازنده
است. مقادیر
ممکن برای
cpu-type عبارتند
از z900/arch5،
z990/arch6، z9-109،
z9-ec/arch7، z10/arch8،
z196/arch9، zEC12،
z13/arch11، z14/arch12،
z15/arch13، z16/arch14،
z17/arch15، و native.
پیشفرض -march=z900 است.
مشخص کردن native به عنوان نوع پردازنده میتواند برای انتخاب بهترین گزینهٔ معماری برای پردازندهٔ میزبان استفاده شود. اگر GCC پردازنده را شناسایی نکند، -march=native هیچ تأثیری نخواهد داشت.
- -mtune=cpu-type
- میزانسازی تمام جنبههای ممکن در کد تولیدشده برای cpu-type، به استثنای ABI و مجموعهٔ دستورالعملهای در دسترس. فهرست مقادیر cpu-type همانند -march است. پیشفرض، همان مقدار استفادهشده برای -march است.
- -mtpf-trace
- -mno-tpf-trace
- تولید کدی که انشعابهای مختص TPF OS را به زیرروالهای ردیابی در سیستمعامل اضافه کند (یا نکند). این گزینه به طور پیشفرض غیرفعال است، حتی هنگام کامپایل برای TPF OS.
- -mtpf-trace-skip
- -mno-tpf-trace-skip
- تولید کدی که مقصدهای پرش پیشفرضِ فعالشده توسط -mtpf-trace را تغییر دهد (یا ندهد) تا به روالهای ردیابی تخصصی اشاره کنند و امکان رد کردن انتخابی مدخلهای ردیابی تابع را برای TPF OS فراهم سازند. این گزینه به طور پیشفرض غیرفعال است، حتی هنگام کامپایل برای TPF OS و مشخص کردن -mtpf-trace.
- -mfused-madd
- -mno-fused-madd
- تولید کدی که از دستورالعملهای ضرب و انباشت ممیز شناور استفاده کند (یا نکند). در صورت استفاده از ممیز شناور سختافزاری، این دستورالعملها به صورت پیشفرض تولید میشوند.
- -mwarn-framesize=framesize
- صدور یک هشدار اگر اندازهٔ قاب (frame size) تابع فعلی از مقدار دادهشده فراتر رود. از آنجا که این بررسی در زمان کامپایل انجام میشود، لزوماً به این معنا نیست که در زمان اجرای برنامه مشکلی واقعی ایجاد شود. هدف آن شناسایی توابعی است که با احتمال زیاد باعث سرریز پشته (stack overflow) میشوند. استفاده از این گزینه در محیطهایی با اندازهٔ پشتهٔ محدود، مانند هستهٔ لینوکس، مفید است.
- -mwarn-dynamicstack
- صدور یک هشدار اگر تابع "alloca" را فراخوانی کند یا از آرایههای با اندازهٔ پویا بهره ببرد. این کار در شرایطی با اندازهٔ پشتهٔ محدود عموماً ایدهٔ بدی است.
- -mstack-guard=stack-guard
- -mstack-size=stack-size
- در صورت ارائهٔ این گزینهها، پسانهٔ S/390 دستورالعملهای اضافهای را در مقدمهٔ تابع قرار میدهد که اگر اندازهٔ پشته به میزان stack-guard بایت فراتر از stack-size برود، یک تله (trap) را فعال میکنند (به یاد داشته باشید که در S/390 رشد پشته رو به پایین است). اگر گزینهٔ stack-guard نادیده گرفته شود، کوچکترین توان ۲ بزرگتر از اندازهٔ قاب تابع کامپایلشده انتخاب میشود. این گزینهها برای کمک به اشکالزدایی مشکلات سرریز پشته در نظر گرفته شدهاند. کد اضافهٔ تولیدشده سربار ناچیزی به همراه دارد و از این رو میتوان آن را در سیستمهای مشابه محیط عملیاتی (production-like) نیز بدون افت محسوس کارایی به کار برد. مقادیر دادهشده باید دقیقاً توانهایی از ۲ باشند و stack-size باید بدون تجاوز از 64k، بزرگتر از stack-guard باشد. برای افزایش کارایی، کد اضافه این فرض را در نظر میگیرد که پشته از آدرسی همتراز با مقدار ارائهشده توسط stack-size آغاز میشود. گزینهٔ stack-guard را فقط میتوان در همراهی با stack-size به کار گرفت.
- -mhotpatch=pre-halfwords,post-halfwords
- اگر گزینهٔ
hotpatch فعال
باشد، یک
مقدمهٔ
تابع برای
«وصلهزدن
درجا» (hot-patching)
برای تمام
توابع
موجود در
واحد
کامپایل
تولید
میشود. پیش
از برچسب
تابع،
تعداد
مشخصشده
از
دستورالعملهای
دو بایتی NOP
قرار
میگیرد
(pre-halfwords،
حداکثر 1000000).
پس از
برچسب، 2 * post-halfwords
بایت با
استفاده از
بزرگترین
دستورالعملهای
شبه NOP که
معماری
اجازه
میدهد،
الحاق
میگردد
(حداکثر 1000000).
اگر هر دو آرگومان صفر باشند، امکان hotpatching غیرفعال میشود.
این گزینه را میتوان برای توابع منفرد با استفاده از مشخصهٔ "hotpatch" لغو و جایگزین کرد.
گزینههای SH
این گزینههای -m برای پیادهسازیهای SH تعریف شدهاند:
- -m1
- تولید کد برای SH1.
- -m2
- تولید کد برای SH2.
- -m2e
- تولید کد برای SH2e.
- -m2a-nofpu
- تولید کد برای SH2a بدون FPU، یا برای SH2a-FPU به گونهای که از واحد ممیز شناور استفاده نشود.
- -m2a-single-only
- تولید کد برای SH2a-FPU به گونهای که هیچ عملیات ممیز شناور با دقت مضاعف استفاده نشود.
- -m2a-single
- تولید کد برای SH2a-FPU با این فرض که واحد ممیز شناور به صورت پیشفرض در حالت دقت منفرد باشد.
- -m2a
- تولید کد برای SH2a-FPU با این فرض که واحد ممیز شناور به صورت پیشفرض در حالت دقت مضاعف باشد.
- -m3
- تولید کد برای SH3.
- -m3e
- تولید کد برای SH3e.
- -m4-nofpu
- تولید کد برای SH4 بدون واحد ممیز شناور.
- -m4-single-only
- تولید کد برای SH4 همراه با واحد ممیز شناوری که صرفاً از محاسبات با دقت منفرد پشتیبانی میکند.
- -m4-single
- تولید کد برای SH4 با این فرض که واحد ممیز شناور به صورت پیشفرض در حالت دقت منفرد باشد.
- -m4
- تولید کد برای SH4.
- -m4-100
- تولید کد برای SH4-100.
- -m4-100-nofpu
- تولید کد برای SH4-100 به گونهای که از واحد ممیز شناور استفاده نشود.
- -m4-100-single
- تولید کد برای SH4-100 با این فرض که واحد ممیز شناور به صورت پیشفرض در حالت دقت منفرد باشد.
- -m4-100-single-only
- تولید کد برای SH4-100 به گونهای که هیچ عملیات ممیز شناور با دقت مضاعف استفاده نشود.
- -m4-200
- تولید کد برای SH4-200..IP -m4-200-nofpu 4 تولید کد برای SH4-200 به گونهای که واحد ممیز شناور استفاده نشود.
- -m4-200-single
- تولید کد برای SH4-200 با این فرض که واحد ممیز شناور بهطور پیشفرض در حالت دقت یگانه است.
- -m4-200-single-only
- تولید کد برای SH4-200 به گونهای که هیچ عملیات ممیز شناور با دقت مضاعف استفاده نشود.
- -m4-300
- تولید کد برای SH4-300.
- -m4-300-nofpu
- تولید کد برای SH4-300 به گونهای که واحد ممیز شناور استفاده نشود.
- -m4-300-single
- تولید کد برای SH4-300 به گونهای که هیچ عملیات ممیز شناور با دقت مضاعف استفاده نشود.
- -m4-300-single-only
- تولید کد برای SH4-300 به گونهای که هیچ عملیات ممیز شناور با دقت مضاعف استفاده نشود.
- -m4-340
- تولید کد برای SH4-340 (بدون MMU، بدون FPU).
- -m4-500
- تولید کد برای SH4-500 (بدون FPU). گزینهٔ -isa=sh4-nofpu را به اسمبلر پاس میدهد.
- -m4a-nofpu
- تولید کد برای SH4al-dsp، یا برای یک SH4a به گونهای که واحد ممیز شناور استفاده نشود.
- -m4a-single-only
- تولید کد برای SH4a، به گونهای که هیچ عملیات ممیز شناور با دقت مضاعف استفاده نشود.
- -m4a-single
- تولید کد برای SH4a با این فرض که واحد ممیز شناور بهطور پیشفرض در حالت دقت یگانه است.
- -m4a
- تولید کد برای SH4a.
- -m4al
- همانند -m4a-nofpu، با این تفاوت که بهطور ضمنی -dsp را به اسمبلر پاس میدهد. در حال حاضر GCC هیچ دستور DSP تولید نمیکند.
- -mb
- کامپایل کد برای پردازنده در حالت بزرگپایان (big-endian).
- -ml
- کامپایل کد برای پردازنده در حالت کوچکپایان (little-endian).
- -mdalign
- تراز کردن نوعهای double در مرزهای ۶۴ بیتی. توجه داشته باشید که این کار قراردادهای فراخوانی را تغییر میدهد، و در نتیجه برخی از توابع کتابخانهٔ استاندارد C کار نخواهند کرد مگر اینکه ابتدا آن را با -mdalign دوباره کامپایل کنید.
- -mrelax
- کوتاه کردن برخی از ارجاعات آدرس در زمان پیوند، در صورت امکان؛ از گزینهٔ پیونددهندهٔ -relax استفاده میکند.
- -mbigtable
- استفاده از آفستهای ۳۲ بیتی در جدولهای "switch". حالت پیشفرض استفاده از آفستهای ۱۶ بیتی است.
- -mbitops
- فعالسازی استفاده از دستورالعملهای دستکاری بیتی در SH2A.
- -mfmovd
- فعالسازی استفاده از دستورالعمل "fmovd". برای محدودیتهای تراز، -mdalign را بررسی کنید.
- -mrenesas
- سازگاری با قراردادهای فراخوانی تعریفشده توسط Renesas.
- -mno-renesas
- سازگاری با قراردادهای فراخوانی تعریفشده برای GCC، پیش از دردسترس قرار گرفتن قراردادهای Renesas. این گزینه برای همهٔ اهداف زنجیرهابزار SH پیشفرض است.
- -mnomacsave
- علامتگذاری ثبات "MAC" به عنوان call-clobbered، حتی اگر -mrenesas داده شده باشد.
- -mieee
- -mno-ieee
- کنترل سازگاری با استاندارد IEEE در مقایسههای ممیز شناور، که بر نحوهٔ مدیریت مواردی که نتیجهٔ مقایسه نامرتب (unordered) است اثر میگذارد. بهطور پیشفرض، -mieee بهصورت ضمنی فعال است. اگر -ffinite-math-only فعال باشد، -mno-ieee بهطور ضمنی تنظیم میشود که منجر به مقایسههای ممیز شناور بزرگتر مساوی و کوچکتر مساوی سریعتر میگردد. تنظیمات ضمنی را میتوان با مشخص کردن -mieee یا -mno-ieee بازنویسی کرد.
- -minline-ic_invalidate
- درونخطی کردن کد برای بیاعتبار کردن ورودیهای حافظهٔ نهان دستورالعمل پس از راهاندازی ترامپولینهای توابع تودرتو. این گزینه اگر -musermode اعمال شده باشد و گزینهٔ تولید کدِ انتخابشده (مانند -m4) اجازهٔ استفاده از دستورالعمل "icbi" را ندهد، هیچ تأثیری ندارد. اگر گزینهٔ تولید کدِ انتخابشده اجازهٔ استفاده از دستورالعمل "icbi" را ندهد و -musermode اعمال نشده باشد، کد درونخطیشده آرایهٔ آدرس حافظهٔ نهان دستورالعمل را مستقیماً با یک نوشتن انجمنی (associative write) دستکاری میکند. این کار نه تنها نیازمند حالت ممتاز در زمان اجرا است، بلکه اگر خط حافظهٔ نهان از طریق TLB نگاشت شده و سپس نگاشت آن حذف شده باشد، با شکست مواجه میشود.
- -misize
- تخلیهٔ اندازه و مکان دستورالعمل در کد اسمبلی.
- -mpadstruct
- این گزینه منسوخ شده است. این گزینه ساختارها را تا مضربی از ۴ بایت تراز و پد میکند، که با ABI معماری SH ناسازگار است.
- -matomic-model=model
- مدل عملیات اتمی و پارامترهای اضافی را به صورت فهرستی جداشده با کاما تعیین میکند. برای جزئیات در مورد توابع درونی اتمی، بخش __atomic Builtins را ببینید. مدلها و پارامترهای زیر پشتیبانی میشوند:
- none
- غیرفعال کردن توالیهای اتمی تولیدشده توسط کامپایلر و صدور فراخوانیهای کتابخانهای برای عملیات اتمی. این حالت در صورتی که هدف "sh*-*-linux*" نباشد، پیشفرض است.
- soft-gusa
- تولید توالیهای اتمی نرمافزاری gUSA سازگار با GNU/Linux برای توابع درونی اتمی. توالیهای اتمی تولیدشده نیازمند پشتیبانی اضافی از کد مدیریت وقفه/استثنای سیستم هستند و تنها برای سیستمهای تکهستهای SH3* و SH4* مناسب میباشند. این گزینه هنگامی که هدف "sh*-*-linux*" و SH3* یا SH4* باشد بهطور پیشفرض فعال است. هنگامی که هدف SH4A باشد، این گزینه همچنین تا حدی از دستورالعملهای اتمی سختافزاری "movli.l" و "movco.l" برای تولید کد کارآمدتر استفاده میکند، مگر اینکه strict مشخص شده باشد.
- soft-tcb
- تولید توالیهای اتمی نرمافزاری که از یک متغیر در بلوک کنترل رشته (TCB) استفاده میکنند. این یک گونه از توالیهای gUSA است که میتواند روی اهداف SH1* و SH2* نیز استفاده شود. توالیهای اتمی تولیدشده نیازمند پشتیبانی اضافی از کد مدیریت وقفه/استثنای سیستم هستند و تنها برای سیستمهای تکهستهای مناسب میباشند. هنگام استفاده از این مدل، پارامتر gbr-offset= نیز باید مشخص شود.
- soft-imask
- تولید توالیهای اتمی نرمافزاری که وقفهها را با تنظیم "SR.IMASK = 1111" موقتاً غیرفعال میکنند. این مدل تنها زمانی کار میکند که برنامه در حالت ممتاز اجرا شود و فقط برای سیستمهای تکهستهای مناسب است. نیازی به پشتیبانی اضافی از کد مدیریت وقفه/استثنای سیستم نیست. این مدل در صورتی که هدف "sh*-*-linux*" و SH1* یا SH2* باشد بهطور پیشفرض فعال است.
- hard-llcs
- تولید توالیهای اتمی سختافزاری تنها با استفاده از دستورالعملهای "movli.l" و "movco.l". این گزینه تنها روی SH4A در دسترس است و برای سیستمهای چندهستهای مناسب میباشد. از آنجا که دستورالعملهای سختافزاری تنها از متغیرهای اتمی ۳۲ بیتی پشتیبانی میکنند، دسترسی به متغیرهای ۸ یا ۱۶ بیتی با دسترسیهای ۳۲ بیتی شبیهسازی میشود. کدی که با این گزینه کامپایل شده باشد، در صورت اجرا روی یک سیستم SH4A با سایر سیستمهای مدیریت وقفه/استثنای مدل اتمی نرمافزاری نیز سازگار است. برای این مدل نیازی به پشتیبانی اضافی از کد مدیریت وقفه/استثنای سیستم نیست.
- gbr-offset=
- این پارامتر آفست متغیر بر حسب بایت را در ساختار بلوک کنترل رشته مشخص میکند که باید هنگام انتخاب مدل soft-tcb توسط توالیهای اتمیِ تولیدشده استفاده شود. برای سایر مدلها این پارامتر نادیده گرفته میشود. مقدار مشخصشده باید مضرب صحیحی از چهار و در محدودهٔ 0-1020 باشد.
- strict
- این پارامتر از استفادهٔ ترکیبی چندین مدل اتمی، حتی در صورت سازگاری، جلوگیری میکند و کامپایلر را وادار میسازد که تنها توالیهای اتمی مدل مشخصشده را تولید کند.
- -mprefergot
- هنگام تولید کد مستقل از موقعیت (position-independent code)، فراخوانیهای توابع با استفاده از Global Offset Table به جای Procedure Linkage Table منتشر میشوند.
- -musermode
- -mno-usermode
- به کامپایلر اجازه تولید (یا عدم اجازه تولید) کد حالت ممتاز (privileged mode) را میدهد (یا نمیدهد). تعیین -musermode همچنین در صورتی که کد درونخطی در حالت کاربر (user mode) کار نکند، به معنای -mno-inline-ic_invalidate نیز خواهد بود. زمانی که هدف "sh*-*-linux*" باشد، -musermode پیشفرض است. اگر هدف SH1* یا SH2* باشد، -musermode هیچ تأثیری ندارد، زیرا حالت کاربر وجود ندارد.
- -multcost=number
- تنظیم هزینه فرضی برای یک دستور ضرب (multiply insn).
- -mdiv=strategy
- تنظیم راهبرد تقسیم برای استفاده در عملیات تقسیم اعداد صحیح. strategy میتواند یکی از موارد زیر باشد:
- call-div1
- تابعی از کتابخانه را فراخوانی میکند که از دستور تقسیم تکمرحلهای "div1" برای انجام عملیات استفاده میکند. تقسیم بر صفر نتیجهای نامشخص محاسبه کرده و ایجاد تله (trap) نمیکند. این حالت به جز برای SH4، SH2A و SHcompact پیشفرض است.
- call-fp
- تابعی از کتابخانه را فراخوانی میکند که عملیات را با ممیز شناور با دقت مضاعف (double precision) انجام میدهد. تقسیم بر صفر موجب بروز یک استثنای ممیز شناور میشود. این حالت برای SHcompact دارای FPU پیشفرض است. مشخص کردن این گزینه برای اهدافی که FPU با دقت مضاعف ندارند، به طور پیشفرض به "call-div1" تغییر مییابد.
- call-table
- تابعی از کتابخانه را فراخوانی میکند که برای مقسومعلیههای کوچک از یک جدول جستجو (lookup table) و برای مقسومعلیههای بزرگتر از دستور "div1" به همراه تمایز حالتها استفاده میکند. تقسیم بر صفر نتیجهای نامشخص محاسبه کرده و ایجاد تله نمیکند. این حالت برای SH4 پیشفرض است. مشخص کردن این گزینه برای اهدافی که فاقد دستورهای تغییر مکان پویا (dynamic shift) هستند، به طور پیشفرض به "call-div1" بازمیگردد.
هنگامی که راهبرد تقسیم مشخص نشده باشد، راهبرد پیشفرض بر اساس هدف فعلی انتخاب میشود. برای SH2A راهبرد پیشفرض استفاده از دستورهای "divs" و "divu" به جای فراخوانیهای توابع کتابخانه است.
- -maccumulate-outgoing-args
- رزرو فضا به صورت یکباره برای آرگومانهای خروجی در دیباچه تابع (function prologue) به جای اختصاص فضا در اطراف هر فراخوانی. این کار معمولاً برای کارایی و اندازه کد سودمند است. همچنین برای باز کردن پشته (unwinding) جهت جلوگیری از تغییر فریم پشته پیرامون کدهای شرطی مورد نیاز است.
- -mdivsi3_libfunc=name
- تنظیم نام تابع کتابخانه مورد استفاده برای تقسیم علامتدار ۳۲ بیتی روی name. این گزینه فقط روی نام استفادهشده در راهبردهای تقسیم call تأثیر میگذارد، و کامپایلر همچنان انتظار دارد همان مجموعههای ثباتهای ورودی/خروجی/تخریبشده (clobbered) مانند حالتی باشند که این گزینه وجود نداشت.
- -mfixed-range=register-range
- تولید کد با در نظر گرفتن محدوده ثباتهای ارائهشده به عنوان ثباتهای ثابت (fixed registers). ثبات ثابت ثباتی است که تخصیصدهنده ثبات (register allocator) نمیتواند از آن استفاده کند. این ویژگی هنگام کامپایل کد هسته (kernel) مفید است. یک محدوده ثبات به صورت دو ثبات جدا شده با خط تیره مشخص میشود. چند محدوده ثبات را میتوان با ویرگول جدا کرد.
- -mbranch-cost=num
- فرض کردن مقدار num به عنوان هزینه یک دستور انشعاب (branch). مقادیر بالاتر باعث میشوند کامپایلر در صورت امکان برای تولید کدهای بیشترِ بدون انشعاب تلاش کند. اگر مشخص نشود، این مقدار بسته به نوع پردازندهای که کد برای آن کامپایل میشود، انتخاب خواهد شد.
- -mzdcbranch
- -mno-zdcbranch
- فرض میکند (فرض نمیکند) که دستورهای انشعاب شرطی بدون جابهجایی (zero displacement) "bt" و "bf" سریع هستند. اگر -mzdcbranch تعیین شود، کامپایلر توالیهای کد انشعاب با جابهجایی صفر را ترجیح میدهد. این حالت به طور پیشفرض هنگام تولید کد برای SH4 و SH4A فعال است. میتوان آن را با تعیین صریح -mno-zdcbranch غیرفعال کرد.
- -mcbranch-force-delay-slot
- اجبار به استفاده از شکافهای تاخیر (delay slots) برای انشعابهای شرطی، که در صورت نیافتن دستور مناسب، شکاف تاخیر را با یک "nop" پر میکند. این گزینه به طور پیشفرض غیرفعال است. میتواند برای دور زدن اشکالات سختافزاری موجود در SH7055 اصلی فعال شود.
- -mfused-madd
- -mno-fused-madd
- تولید کدی که از دستورهای ضرب و جمع ممیز شناور (multiply and accumulate) استفاده میکند (یا نمیکند). در صورت استفاده از ممیز شناور سختافزاری، این دستورها به صورت پیشفرض تولید میشوند. گزینه وابسته به ماشین -mfused-madd اکنون به گزینه مستقل از ماشین -ffp-contract=fast، و -mno-fused-madd به -ffp-contract=off نگاشت شده است.
- -mfsca
- -mno-fsca
- مجاز یا غیرمجاز کردن کامپایلر برای صدور دستور "fsca" برای تقریبهای سینوس و کسینوس. گزینه -mfsca باید در ترکیب با -funsafe-math-optimizations استفاده شود. هنگام تولید کد برای SH4A این گزینه به طور پیشفرض فعال است. استفاده از -mno-fsca تقریبهای سینوس و کسینوس را حتی در صورت فعال بودن -funsafe-math-optimizations غیرفعال میکند.
- -mfsrra
- -mno-fsrra
- مجاز یا غیرمجاز کردن کامپایلر برای صدور دستور "fsrra" برای تقریبهای معکوس ریشه دوم (reciprocal square root). گزینه -mfsrra باید در ترکیب با -funsafe-math-optimizations و -ffinite-math-only استفاده شود. این گزینه به طور پیشفرض هنگام تولید کد برای SH4A فعال است. استفاده از -mno-fsrra تقریبهای معکوس ریشه دوم را حتی در صورت فعال بودن -funsafe-math-optimizations و -ffinite-math-only غیرفعال میکند.
- -mpretend-cmove
- ترجیح دادن انشعابهای شرطی بدون جابهجایی برای الگوهای دستور انتقال شرطی (conditional move). این کار میتواند منجر به تولید کدهای سریعتر روی پردازنده SH4 شود.
- -mfdpic
- تولید کد با استفاده از ABI مربوط به FDPIC.
گزینههای Solaris 2
این گزینههای -m در Solaris 2 پشتیبانی میشوند:
- -mclear-hwcap
- گزینه -mclear-hwcap به کامپایلر میگوید قابلیتهای سختافزاری تولید شده توسط اسمبلر Solaris را حذف کند. این امر فقط زمانی لازم است که فایلهای شیء از افزونههای ISA استفاده کنند که توسط ماشین فعلی پشتیبانی نمیشود، اما در زمان اجرا بررسی میکنند که آیا باید از آنها استفاده شود یا خیر.
- -mimpure-text
- گزینه -mimpure-text،
که علاوه بر
-shared استفاده
میشود، به
کامپایلر
میگوید
هنگام
پیوند یک
شیء
اشتراکی (shared
object)، گزینه -z text
را به
پیونددهنده
ارسال نکند.
با استفاده
از این
گزینه،
میتوانید
کد وابسته
به موقعیت
را به یک
شیء
اشتراکی
پیوند دهید.
گزینه -mimpure-text پیام خطای پیونددهنده مبنی بر "relocations remain against allocatable but non-writable sections" را نادیده میگیرد. با این حال، بازآراییهای لازم باعث راهاندازی رونوشت هنگام نوشتن (copy-on-write) میشوند، و شیء اشتراکی عملاً بین فرآیندها به اشتراک گذاشته نمیشود. به جای استفاده از -mimpure-text، باید تمام کد منبع را با -fpic یا -fPIC کامپایل کنید.
علاوه بر موارد بالا، این گزینهها در Solaris 2 پشتیبانی میشوند:
- -pthreads
- این یک مترادف برای -pthread است.
گزینههای SPARC
این گزینههای -m در SPARC پشتیبانی میشوند:
- -mno-app-regs
- گزینهٔ -mapp-regs
را مشخص
کنید تا
خروجی با
استفاده از
ثباتهای
سراسری ۲ تا
۴ تولید
شود؛
ثباتهایی
که SPARC SVR4 ABI برای
برنامههای
کاربردی
رزرو کرده
است. مشابه
ثبات
سراسری ۱،
هر یک از
ثباتهای
سراسری ۲ تا
۴ به عنوان
یک ثبات
قابلتخصیص
در نظر
گرفته
میشوند که
با
فراخوانی
توابع
بازنویسی
(clobbered) میشوند.
این حالت
پیشفرض
است.
برای سازگاری کامل با SVR4 ABI به بهای کاهش اندکی از کارایی، -mno-app-regs را مشخص کنید. شما باید کتابخانهها و نرمافزارهای سیستمی را با این گزینه کامپایل کنید.
- -mflat
- -mno-flat
- با -mflat،
کامپایلر
دستورالعملهای
save/restore را تولید
نمیکند و
از یک مدل
پنجرهٔ
ثبات
«مسطح» (flat) یا
یکتا
استفاده
میکند. این
مدل با مدل
پنجرهٔ
ثبات
معمولی
سازگار است.
ثباتهای
محلی و
ثباتهای
ورودی (۰--۵)
همچنان به
عنوان
ثباتهای
«call-saved» در نظر
گرفته شده و
در صورت
نیاز روی
پشته ذخیره
میشوند.
با -mno-flat (پیشفرض)، کامپایلر دستورالعملهای save/restore را تولید میکند (بهجز برای توابع برگ یا leaf). این حالت عملیاتیِ عادی است.
- -mfpu
- -mhard-float
- خروجیِ حاوی دستورالعملهای ممیز شناور (floating-point) تولید میکند. این پیشفرض است.
- -mno-fpu
- -msoft-float
- خروجیِ
حاوی
فراخوانیهای
کتابخانهای
برای ممیز
شناور
تولید
میکند.
هشدار:
کتابخانههای
مورد نیاز
برای همهٔ
مقصدهای SPARC
موجود
نیستند. به
طور معمول
از امکانات
کامپایلر C
عادیِ
دستگاه
استفاده
میشود،
اما این کار
را
نمیتوان
مستقیماً
در کامپایل
متقابل (cross-compilation)
انجام داد.
باید
تمهیدات
لازم را
برای فراهم
کردن توابع
کتابخانهای
مناسب جهت
کامپایل
متقابل در
نظر بگیرید.
مقصدهای
توکار sparc-*-aout و
sparclite-*-*
پشتیبانی
ممیز شناور
نرمافزاری
را ارائه
میدهند.
گزینهٔ -msoft-float شیوهٔ فراخوانی (calling convention) را در فایل خروجی تغییر میدهد؛ بنابراین تنها زمانی مفید است که تمام بخشهای برنامه را با این گزینه کامپایل کنید. بهویژه، برای اینکه این مورد کار کند، باید libgcc.a (کتابخانهای که همراه با GCC ارائه میشود) را با -msoft-float کامپایل کنید.
- -mhard-quad-float
- خروجیِ حاوی دستورالعملهای ممیز شناور با کلمهٔ چهارگانه (long double یا quad-word) تولید میکند.
- -msoft-quad-float
- خروجیِ
حاوی
فراخوانیهای
کتابخانهای
برای
دستورالعملهای
ممیز شناور
با کلمهٔ
چهارگانه (long
double) تولید
میکند.
توابع
فراخوانیشده
همانهایی
هستند که در
SPARC ABI مشخص
شدهاند.
این
پیشفرض
است.
تا زمان نگارش این مستند، هیچ پیادهسازی SPARC وجود ندارد که پشتیبانی سختافزاری برای دستورالعملهای ممیز شناور با کلمهٔ چهارگانه داشته باشد. همهٔ آنها برای یکی از این دستورالعملها یک گردانندهٔ تله (trap handler) را فراخوانی میکنند، و سپس trap handler اثر دستورالعمل را شبیهسازی میکند. به دلیل سربار گردانندهٔ تله، این روش بسیار کندتر از فراخوانی توابع کتابخانهای ABI است. بنابراین گزینهٔ -msoft-quad-float حالت پیشفرض است.
- -mno-unaligned-doubles
- -munaligned-doubles
- فرض میکند
که
متغیرهای double
دارای
همترازی
(alignment) ۸ بایتی
هستند. این
حالت
پیشفرض
است.
با -munaligned-doubles، کامپایلر GCC تنها در صورتی فرض میکند doubleها دارای همترازی ۸ بایتی هستند که درون نوع دیگری قرار گرفته باشند، یا دارای آدرس مطلق باشند. در غیر این صورت، فرض میکند که همترازی ۴ بایتی دارند. تعیین این گزینه از برخی مشکلات نادرِ ناسازگاری با کدهای تولیدشده توسط دیگر کامپایلرها جلوگیری میکند. این حالت پیشفرض نیست زیرا منجر به افت کارایی، بهویژه برای کدهای ممیز شناور، میشود.
- -muser-mode
- -mno-user-mode
- کدی که فقط بتواند در حالت سرپرست (supervisor mode) اجرا شود تولید نمیکند. این موضوع تنها مربوط به دستورالعمل "casa" است که برای پردازندهٔ LEON3 صادر میشود. این حالت پیشفرض است.
- -mfaster-structs
- -mno-faster-structs
- با -mfaster-structs، کامپایلر فرض میکند ساختارها (structures) باید دارای همترازی ۸ بایتی باشند. این کار استفاده از جفتدستورالعملهای "ldd" و "std" را برای کپیها در انتساب ساختار، به جای دو برابر جفتدستورالعملهای "ld" و "st" ممکن میسازد. با این حال، استفاده از این همترازی تغییریافته مستقیماً SPARC ABI را نقض میکند. از این رو، این گزینه فقط برای استفاده در مقاصدی در نظر گرفته شده که توسعهدهنده اذعان دارد کد حاصل مستقیماً با قواعد ABI مطابقت ندارد.
- -mstd-struct-return
- -mno-std-struct-return
- با -mstd-struct-return،
کامپایلر
در توابعی
که
ساختارها
(structures) یا
اجتماعها
(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 در این است که کامپایلر دستورالعملهای ضرب عدد صحیح (integer multiply) و تقسیم عدد صحیح (integer divide) را صادر میکند که در 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 تولید میکند. این گزینه دستورالعملهای انتقال (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 این است که ثباتهای سراسری (global) و خروجی (out) به صورت ۶۴ بیتی در نظر گرفته میشوند. این گزینه بهطور پیشفرض در حالت ۳۲ بیتی 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 کدی تولید میکند که از دستورالعملهای UltraSPARC Compare-and-Branch-on-Condition بهره میبرد. هنگام هدف قرار دادن پردازندهای که از چنین دستورالعملهایی پشتیبانی میکند (مانند 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) بهره میبرد. هنگام هدف قرار دادن پردازندهای با واحد FPU که از معماریهای نسخهٔ V8 یا V9 پشتیبانی میکند (بهجز -mcpu=leon)، پیشفرض -mfsmuld است.
- -mpopc
- -mno-popc
- با -mpopc، کامپایلر GCC کدی تولید میکند که از دستورالعمل UltraSPARC Population Count بهره میبرد. هنگام هدف قرار دادن پردازندهای که از این دستورالعمل پشتیبانی میکند (مانند Niagara-2 و بعد از آن)، پیشفرض -mpopc است.
- -msubxc
- -mno-subxc
- با -msubxc، کامپایلر GCC کدی تولید میکند که از دستورالعمل UltraSPARC Subtract-Extended-with-Carry بهره میبرد. هنگام هدف قرار دادن پردازندهای که از چنین دستورالعملی پشتیبانی میکند (مانند Niagara-7 و بعد از آن)، پیشفرض -msubxc است.
- -mfix-at697f
- راهکار مستندشده (workaround) را برای تکخطای سختافزاری (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
- مدل کد (code model) را روی یکی از موارد زیر تنظیم میکند:
- medlow
- مدل کد Medium/Low: آدرسهای ۶۴ بیتی، برنامهها باید در ۳۲ بیت پایینی حافظه پیوند (link) داده شوند. برنامهها میتوانند بهصورت ایستا یا پویا پیوند یابند..IP medmid 4 مدل کد Medium/Middle: آدرسهای ۶۴-بیتی، برنامهها باید در ۴۴ بیت پایینی حافظه پیوند داده شوند، قطعههای متن (text) و داده (data) باید اندازهای کمتر از 2GB داشته باشند و قطعه داده باید در فاصله 2GB از قطعه متن قرار گیرد.
- medany
- مدل کد Medium/Anywhere: آدرسهای ۶۴-بیتی، برنامهها ممکن است در هر کجای حافظه پیوند داده شوند، قطعههای متن و داده باید اندازهای کمتر از 2GB داشته باشند و قطعه داده باید در فاصله 2GB از قطعه متن قرار گیرد.
- embmedany
- مدل کد Medium/Anywhere برای سیستمهای تعبیهشده (embedded): آدرسهای ۶۴-بیتی، قطعههای متن و داده باید اندازهای کمتر از 2GB داشته باشند و هر دو میتوانند از هر کجای حافظه شروع شوند (تعیینشده در زمان پیوند). ثبات عمومی %g4 به مبنای قطعه داده اشاره میکند. برنامهها بهصورت ایستا (statically) پیوند داده میشوند و PIC پشتیبانی نمیشود.
- -mmemory-model=mem-model
- تنظیم مدل حافظه فعال روی پردازنده به یکی از موارد:
این مدلهای حافظه بهطور رسمی در پیوست D راهنمای معماری SPARC-V9 تعریف شدهاند، همانگونه که در فیلد "PSTATE.MM" پردازنده تنظیم میشود.
- -mstack-bias
- -mno-stack-bias
- با فعال بودن -mstack-bias، کامپایلر GCC فرض میکند که اشارهگر پشته (stack pointer) و اشارهگر فریم (در صورت وجود)، دارای آفست -2047 هستند که هنگام ارجاع به فریم پشته باید دوباره اضافه شود. این مقدار در حالت ۶۴-بیتی پیشفرض است. در غیر این صورت، فرض میشود چنین آفستی وجود ندارد.
گزینههای 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" تولید شوند، نماد پیشپردازندهٔ سی "__V850_CALLT__" تعریف میشود.
- -mrelax
- -mno-relax
- گزینهٔ خط فرمان -mrelax را به اسمبلر ارسال میکند (یا ارسال نمیکند).
- -mlong-jumps
- -mno-long-jumps
- تولید دستورالعملهای پرش وابسته به PC را غیرفعال (یا دوباره فعال) میکند.
- -msoft-float
- -mhard-float
- تولید دستورالعملهای ممیز شناور سختافزاری را غیرفعال (یا دوباره فعال) میکند. این گزینه تنها زمانی اهمیت دارد که معماری مقصد V850E2V3 یا بالاتر باشد. اگر دستورالعملهای ممیز شناور سختافزاری تولید شوند، نماد پیشپردازندهٔ سی "__FPU_OK__" تعریف میشود، در غیر این صورت نماد "__NO_FPU__" تعریف خواهد شد.
- -mloop
- استفاده از دستورالعمل LOOP در e3v5 را فعال میکند. هنگام انتخاب معماری e3v5، استفاده از این دستورالعمل بهطور پیشفرض فعال نیست زیرا استفاده از آن هنوز در مرحلهٔ آزمایشی قرار دارد.
- -mrh850-abi
- -mghs
- پشتیبانی از نسخهٔ RH850 از V850 ABI را فعال میکند. این حالت پیشفرض است. با این نسخه از ABI، قوانین زیر اعمال میشوند:
- ساختارها و اجتماعها با اندازهٔ عدد صحیح، بهجای ثبات، از طریق یک اشارهگر حافظه بازگردانده میشوند.
- ساختارها و اجتماعهای بزرگ (با اندازهٔ بیش از ۸ بایت) از طریق مقدار ارسال میشوند.
- توابع روی مرزهای ۱۶-بیتی تراز میشوند.
- گزینهٔ خط فرمان -m8byte-align پشتیبانی میشود.
- گزینهٔ خط فرمان -mdisable-callt بهطور پیشفرض فعال است. گزینهٔ خط فرمان -mno-disable-callt پشتیبانی نمیشود.
هنگامی که این نسخه از ABI فعال باشد، نماد پیشپردازندهٔ سی "__V850_RH850_ABI__" تعریف میشود.
- -mgcc-abi
- پشتیبانی از نسخهٔ قدیمی GCC از V850 ABI را فعال میکند. با این نسخه از ABI، قوانین زیر اعمال میشوند:
- ساختارها و اجتماعها با اندازهٔ عدد صحیح در ثبات "r10" بازگردانده میشوند.
- ساختارها و اجتماعهای بزرگ (با اندازهٔ بیش از ۸ بایت) از طریق ارجاع ارسال میشوند.
- توابع روی مرزهای ۳۲-بیتی تراز میشوند، مگر آنکه بهینهسازی برای اندازه انجام شود.
- گزینهٔ خط فرمان -m8byte-align پشتیبانی نمیشود.
- گزینهٔ خط فرمان -mdisable-callt پشتیبانی میشود اما بهطور پیشفرض فعال نیست.
هنگامی که این نسخه از ABI فعال باشد، نماد پیشپردازندهٔ سی "__V850_GCC_ABI__" تعریف میشود.
- -m8byte-align
- -mno-8byte-align
- پشتیبانی از تراز شدن نوعهای دادهٔ "double" و "long long" روی مرزهای ۸-بایتی را فعال میکند. حالت پیشفرض این است که تراز تمام شیءها حداکثر به ۴-بایت محدود شود. هنگامی که -m8byte-align فعال باشد، نماد پیشپردازندهٔ سی "__V850_8BYTE_ALIGN__" تعریف میشود.
- -mbig-switch
- کد مناسب برای جدولهای سوئیچ بزرگ تولید میکند. تنها زمانی از این گزینه استفاده کنید که اسمبلر/پیونددهنده در مورد انشعابهای خارج از محدوده در یک جدول switch هشدار یا خطا دهد.
- -mapp-regs
- این گزینه باعث میشود که از r2 و r5 در کدهای تولیدشده توسط کامپایلر استفاده شود. این تنظیم پیشفرض است.
- -mno-app-regs
- این گزینه باعث میشود که با r2 و r5 به عنوان ثباتهای ثابت برخورد شود.
گزینههای VAX
این گزینههای -m برای VAX تعریف شدهاند:
- -munix
- از تولید برخی دستورالعملهای پرش معین ("aobleq" و نظایر آن) که اسمبلر Unix برای VAX نمیتواند آنها را در فاصلههای دور مدیریت کند، خودداری میکند.
- -mgnu
- با این فرض که اسمبلر GNU در حال استفاده است، آن دستورالعملهای پرش را تولید میکند.
- -md
- -md-float
- برای اعداد ممیز شناور با دقت مضاعف بهجای G_floating از قالب دادهای D_floating استفاده میکند.
- -mg
- -mg-float
- برای اعداد ممیز شناور با دقت مضاعف بهجای D_floating از قالب دادهای G_floating استفاده میکند.
- -mlra
- -mno-lra
- تخصیص محلی ثباتها (Local Register Allocation) را فعال میکند. این قابلیت برای VAX همچنان در مرحلهٔ آزمایشی است، بنابراین کامپایلر بهطور پیشفرض از بارگذاری مجدد (reload) استاندارد استفاده میکند.
گزینههای Visium
- -mdebug
- برنامهای که ورودی/خروجی فایل انجام میدهد و قرار است روی یک مقصد MCM اجرا شود، باید با این گزینه پیوند داده شود. این کار باعث پیوند خوردن کتابخانههای libc.a و libdebug.a میشود. این برنامه باید روی مقصد، تحت کنترل رابط اشکالزدایی راه دور GDB اجرا شود.
- -msim
- برنامهای که ورودی/خروجی فایل انجام میدهد و قرار است روی شبیهساز اجرا شود، باید با این گزینه پیوند داده شود. این کار باعث پیوند خوردن کتابخانههای libc.a و libsim.a میشود.
- -mfpu
- -mhard-float
- کدی حاوی دستورالعملهای ممیز شناور تولید میکند. این حالت پیشفرض است.
- -mno-fpu
- تولید کدی
شامل
فراخوانیهای
کتابخانهای
برای ممیز
شناور (floating-point).
گزینهٔ -msoft-float قرارداد فراخوانی (calling convention) را در فایل خروجی تغییر میدهد؛ بنابراین تنها زمانی مفید است که تمام برنامه را با این گزینه کامپایل کنید. بهویژه، برای اینکه این قابلیت کار کند، باید libgcc.a (کتابخانهای که همراه GCC ارائه میشود) را با -msoft-float کامپایل کنید.
- -mcpu=cpu_type
- تنظیم
مجموعه
دستورالعملها،
مجموعه
ثباتها و
پارامترهای
زمانبندی
دستورالعملها
برای نوع
ماشین cpu_type.
مقادیر
پشتیبانیشده
برای cpu_type
عبارتند از
mcm، gr5 و gr6.
mcm مترادفی برای gr5 است که جهت سازگاری رو به عقب وجود دارد.
بهطور پیشفرض (مگر اینکه جور دیگری پیکربندی شده باشد)، GCC کدی برای گونهٔ GR5 از معماری Visium تولید میکند.
با -mcpu=gr6، کامپایلر GCC برای گونهٔ GR6 از معماری Visium کد تولید میکند. تنها تفاوت با کد GR5 این است که کامپایلر دستورالعملهای انتقال بلوکی (block move) تولید خواهد کرد.
- -mtune=cpu_type
- تنظیم پارامترهای زمانبندی دستورالعمل برای نوع ماشین cpu_type، اما بدون تنظیم مجموعه دستورالعملها یا مجموعه ثباتهایی که گزینهٔ -mcpu=cpu_type اعمال میکند.
- -msv-mode
- تولید کد برای حالت ناظر (supervisor mode)، جایی که هیچ محدودیتی در دسترسی به ثباتهای عمومی وجود ندارد. این حالت پیشفرض است.
- -muser-mode
- تولید کد برای حالت کاربر (user mode)، جایی که دسترسی به برخی از ثباتهای عمومی ممنوع است: در GR5، ثباتهای r24 تا r31 در این حالت قابل دسترسی نیستند؛ در GR6، تنها ثباتهای r29 تا r31 تحت تأثیر قرار میگیرند.
گزینههای VMS
این گزینههای -m برای پیادهسازیهای VMS تعریف شدهاند:
- -mvms-return-codes
- بازگرداندن کدهای وضعیت VMS از تابع "main". پیشفرض بازگرداندن کدهای وضعیت سبک POSIX (مانند کدهای خطا) است.
- -mdebug-main=prefix
- علامتگذاری نخستین روالی که نامش با prefix آغاز میشود بهعنوان روال اصلی برای دیباگر.
- -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
- این گزینهها به پیونددهنده (linker) فرستاده میشوند. آنها برای سازگاری با Diab تعریف شدهاند.
- -Xbind-lazy
- فعالسازی مقیدسازی تنبل (lazy binding) فراخوانیهای توابع. این گزینه معادل -Wl,-z,now است و برای سازگاری با Diab تعریف شده است.
- -Xbind-now
- غیرفعالسازی مقیدسازی تنبل فراخوانیهای توابع. این گزینه پیشفرض است و برای سازگاری با Diab تعریف شده است.
گزینههای x86
این گزینههای -m برای خانوادهٔ رایانههای x86 تعریف شدهاند.
- -march=cpu-type
- تولید
دستورالعملها
برای نوع
ماشین cpu-type.
برخلاف
-mtune=cpu-type، که
صرفاً کد
تولیدشده
را برای cpu-type
مشخصشده
بهینهسازی
میکند،
-march=cpu-type به GCC
امکان
میدهد کدی
تولید کند
که ممکن است
روی
پردازندههایی
غیر از
پردازندهٔ
مشخصشده
اصلاً اجرا
نشود. مشخص
کردن -march=cpu-type
مستلزم
فعال شدن
ضمنی -mtune=cpu-type
نیز هست،
مگر مواردی
که خلاف آن
ذکر شده
باشد.
گزینههای موجود برای cpu-type عبارتند از:
- native
- این گزینه پردازندهای را که باید کد در زمان کامپایل برای آن تولید شود، با تشخیص نوع پردازندهٔ ماشین کامپایلکننده تعیین میکند. استفاده از -march=native تمام زیرمجموعههای دستورالعمل پشتیبانیشده توسط ماشین محلی را فعال میکند (بنابراین ممکن است نتیجه روی ماشینهای دیگر اجرا نشود). استفاده از -mtune=native کدی تولید میکند که تحت محدودیتهای مجموعه دستورالعملهای انتخابشده، برای ماشین محلی بهینهسازی شده است.
- x86-64
- یک پردازندهٔ عمومی با افزونههای ۶۴ بیتی و پشتیبانی از مجموعه دستورالعملهای MMX، SSE، SSE2 و FXSR.
- x86-64-v2
- x86-64-v3
- x86-64-v4
- این
گزینهها
برای cpu-type،
سطح
ریزمعماری
متناظر را
از psABI مربوط
به x86-64 انتخاب
میکنند. در
ABIهایی غیر
از psABI برای x86-64،
همان
قابلیتهای
پردازندهای
را انتخاب
میکنند که
مستندات 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
- پردازنده Intel Pentium III، بر پایه هسته Pentium Pro با پشتیبانی از مجموعه دستورالعملهای MMX، FXSR و SSE.
- pentium-m
- پردازنده Intel Pentium M؛ نسخه کممصرف پردازنده Intel Pentium III با پشتیبانی از مجموعه دستورالعملهای MMX، SSE، SSE2 و FXSR. مورد استفاده در نوتبوکهای Centrino.
- pentium4
- pentium4m
- پردازنده Intel Pentium 4 با پشتیبانی از مجموعه دستورالعملهای MMX، SSE، SSE2 و FXSR.
- prescott
- نسخه بهبودیافته پردازنده Intel Pentium 4 با پشتیبانی از مجموعه دستورالعملهای MMX، SSE، SSE2، SSE3 و FXSR.
- nocona
- نسخه بهبودیافته پردازنده Intel Pentium 4 با افزونههای 64-bit و پشتیبانی از مجموعه دستورالعملهای MMX، SSE، SSE2، SSE3 و FXSR.
- core2
- پردازنده Intel Core 2 با افزونههای 64-bit و پشتیبانی از مجموعه دستورالعملهای MMX، SSE، SSE2، SSE3، SSSE3، CX16، SAHF و FXSR.
- nehalem
- corei7
- پردازنده Intel Nehalem با افزونههای 64-bit و پشتیبانی از مجموعه دستورالعملهای MMX، SSE، SSE2، SSE3، SSSE3، SSE4.1، SSE4.2، POPCNT، CX16، SAHF و FXSR.
- westmere
- پردازنده Intel Westmere با افزونههای 64-bit و پشتیبانی از مجموعه دستورالعملهای MMX، SSE، SSE2، SSE3، SSSE3، SSE4.1، SSE4.2، POPCNT، CX16، SAHF، FXSR و PCLMUL.
- sandybridge
- corei7-avx
- پردازنده Intel Sandy Bridge با افزونههای 64-bit و پشتیبانی از مجموعه دستورالعملهای MMX، SSE، SSE2، SSE3، SSSE3، SSE4.1، SSE4.2، POPCNT، CX16، SAHF، FXSR، AVX، XSAVE و PCLMUL.
- ivybridge
- core-avx-i
- پردازنده Intel Ivy Bridge با افزونههای 64-bit و پشتیبانی از مجموعه دستورالعملهای MMX، SSE، SSE2، SSE3، SSSE3، SSE4.1، SSE4.2، POPCNT، CX16، SAHF، FXSR، AVX، XSAVE، PCLMUL، FSGSBASE، RDRND و F16C.
- haswell
- core-avx2
- پردازنده Intel Haswell با افزونههای 64-bit و پشتیبانی از مجموعه دستورالعملهای MMX، SSE، SSE2، SSE3، SSSE3، SSE4.1، SSE4.2، POPCNT، CX16، SAHF، FXSR، AVX، XSAVE، PCLMUL، FSGSBASE، RDRND، F16C، AVX2، BMI، BMI2، LZCNT، FMA، MOVBE و HLE.
- broadwell
- پردازنده Intel Broadwell با افزونههای 64-bit و پشتیبانی از مجموعه دستورالعملهای MMX، SSE، SSE2، SSE3، SSSE3، SSE4.1، SSE4.2، POPCNT، CX16، SAHF، FXSR، AVX، XSAVE، PCLMUL، FSGSBASE، RDRND، F16C، AVX2، BMI، BMI2، LZCNT، FMA، MOVBE، HLE، RDSEED، ADCX و PREFETCHW.
- skylake
- پردازنده Intel Skylake با افزونههای 64-bit و پشتیبانی از مجموعه دستورالعملهای MMX، SSE، SSE2، SSE3، SSSE3، SSE4.1، SSE4.2، POPCNT، CX16، SAHF، FXSR، AVX، XSAVE، PCLMUL، FSGSBASE، RDRND، F16C، AVX2، BMI، BMI2، LZCNT، FMA، MOVBE، HLE، RDSEED، ADCX، PREFETCHW، AES، CLFLUSHOPT، XSAVEC، XSAVES و SGX.
- skylake-avx512
- پردازنده سرور Intel Skylake با افزونههای 64-bit و پشتیبانی از مجموعه دستورالعملهای MMX، SSE، SSE2، SSE3، SSSE3، SSE4.1، SSE4.2، POPCNT، CX16، SAHF، FXSR، AVX، XSAVE، PCLMUL، FSGSBASE، RDRND، F16C، AVX2، BMI، BMI2، LZCNT، FMA، MOVBE، HLE، RDSEED، ADCX، PREFETCHW، AES، CLFLUSHOPT، XSAVEC، XSAVES، SGX، AVX512F، CLWB، AVX512VL، AVX512BW، AVX512DQ و AVX512CD.
- cascadelake
- پردازنده Intel Cascade Lake با افزونههای 64-bit و پشتیبانی از مجموعه دستورالعملهای MMX، SSE، SSE2، SSE3، SSSE3، SSE4.1، SSE4.2، POPCNT، CX16، SAHF، FXSR، AVX، XSAVE، PCLMUL، FSGSBASE، RDRND، F16C، AVX2، BMI، BMI2، LZCNT، FMA، MOVBE، HLE، RDSEED، ADCX، PREFETCHW، AES، CLFLUSHOPT، XSAVEC، XSAVES، SGX، AVX512F، CLWB، AVX512VL، AVX512BW، AVX512DQ، AVX512CD و AVX512VNNI.
- cannonlake
- پردازنده سرور Intel Cannon Lake با افزونههای 64-bit و پشتیبانی از مجموعه دستورالعملهای MMX، SSE، SSE2، SSE3، SSSE3، SSE4.1، SSE4.2، POPCNT، CX16، SAHF، FXSR، AVX، XSAVE، PCLMUL، FSGSBASE، RDRND، F16C، AVX2، BMI، BMI2، LZCNT، FMA، MOVBE، HLE، RDSEED، ADCX، PREFETCHW، AES، CLFLUSHOPT، XSAVEC، XSAVES، SGX، AVX512F، AVX512VL، AVX512BW، AVX512DQ، AVX512CD، PKU، AVX512VBMI، AVX512IFMA و SHA.
- cooperlake
- پردازنده Intel Cooper Lake با افزونههای 64-bit و پشتیبانی از مجموعه دستورالعملهای MMX، SSE، SSE2، SSE3، SSSE3، SSE4.1، SSE4.2، POPCNT، CX16، SAHF، FXSR، AVX، XSAVE، PCLMUL، FSGSBASE، RDRND، F16C، AVX2، BMI، BMI2، LZCNT، FMA، MOVBE، HLE، RDSEED، ADCX، PREFETCHW، AES، CLFLUSHOPT، XSAVEC، XSAVES، SGX، AVX512F، CLWB، AVX512VL، AVX512BW، AVX512DQ، AVX512CD، AVX512VNNI و AVX512BF16.
- icelake-client
- پردازنده کلاینت Intel Ice Lake با افزونههای 64-bit و پشتیبانی از مجموعه دستورالعملهای MMX، SSE، SSE2، SSE3، SSSE3، SSE4.1، SSE4.2، POPCNT، CX16، SAHF، FXSR، AVX، XSAVE، PCLMUL، FSGSBASE، RDRND، F16C، AVX2، BMI، BMI2، LZCNT، FMA، MOVBE، HLE، RDSEED، ADCX، PREFETCHW، AES، CLFLUSHOPT، XSAVEC، XSAVES، SGX، AVX512F، AVX512VL، AVX512BW، AVX512DQ، AVX512CD، PKU، AVX512VBMI، AVX512IFMA، SHA، AVX512VNNI، GFNI، VAES، AVX512VBMI2، VPCLMULQDQ، AVX512BITALG، RDPID و AVX512VPOPCNTDQ.
- icelake-server
- پردازنده سرور Intel Ice Lake با افزونههای 64-bit و پشتیبانی از مجموعه دستورالعملهای MMX، SSE، SSE2، SSE3، SSSE3، SSE4.1، SSE4.2، POPCNT، CX16، SAHF، FXSR، AVX، XSAVE، PCLMUL، FSGSBASE، RDRND، F16C، AVX2، BMI، BMI2، LZCNT، FMA، MOVBE، HLE، RDSEED، ADCX، PREFETCHW، AES، CLFLUSHOPT، XSAVEC، XSAVES، SGX، AVX512F، AVX512VL، AVX512BW، AVX512DQ، AVX512CD، PKU، AVX512VBMI، AVX512IFMA، SHA، AVX512VNNI، GFNI، VAES، AVX512VBMI2، VPCLMULQDQ، AVX512BITALG، RDPID، AVX512VPOPCNTDQ، PCONFIG، WBNOINVD و CLWB.
- tigerlake
- پردازنده Intel Tiger Lake با افزونههای 64-bit و پشتیبانی از مجموعه دستورالعملهای MMX، SSE، SSE2، SSE3، SSSE3، SSE4.1، SSE4.2، POPCNT، CX16، SAHF، FXSR، AVX، XSAVE، PCLMUL، FSGSBASE، RDRND، F16C، AVX2، BMI، BMI2، LZCNT، FMA، MOVBE، HLE، RDSEED، ADCX، PREFETCHW، AES، CLFLUSHOPT، XSAVEC، XSAVES، SGX، AVX512F، AVX512VL، AVX512BW، AVX512DQ، AVX512CD، PKU، AVX512VBMI، AVX512IFMA، SHA، AVX512VNNI، GFNI، VAES، AVX512VBMI2، VPCLMULQDQ، AVX512BITALG، RDPID، AVX512VPOPCNTDQ، MOVDIRI، MOVDIR64B، CLWB، AVX512VP2INTERSECT و KEYLOCKER.
- rocketlake
- پردازنده Intel Rocket Lake با افزونههای 64-bit و پشتیبانی از مجموعه دستورالعملهای MMX، SSE، SSE2، SSE3، SSSE3، SSE4.1، SSE4.2، POPCNT، CX16، SAHF، FXSR، AVX، XSAVE، PCLMUL، FSGSBASE، RDRND، F16C، AVX2، BMI، BMI2، LZCNT، FMA، MOVBE، HLE، RDSEED، ADCX، PREFETCHW، AES، CLFLUSHOPT، XSAVEC، XSAVES، AVX512F، AVX512VL، AVX512BW، AVX512DQ، AVX512CD، PKU، AVX512VBMI، AVX512IFMA، SHA، AVX512VNNI، GFNI، VAES، AVX512VBMI2، VPCLMULQDQ، AVX512BITALG، RDPID و AVX512VPOPCNTDQ.
- alderlake
- raptorlake
- meteorlake
- gracemont
- پردازنده Intel Alder Lake/Raptor Lake/Meteor Lake/Gracemont با افزونههای 64-bit و پشتیبانی از مجموعه دستورالعملهای MOVBE، MMX، SSE، SSE2، SSE3، SSSE3، SSE4.1، SSE4.2، POPCNT، AES، PREFETCHW، PCLMUL، RDRND، XSAVE، XSAVEC، XSAVES، XSAVEOPT، FSGSBASE، PTWRITE، RDPID، SGX، GFNI-SSE، CLWB، MOVDIRI، MOVDIR64B، WAITPKG، ADCX، AVX، AVX2، BMI، BMI2، F16C، FMA، LZCNT، PCONFIG، PKU، VAES، VPCLMULQDQ، SERIALIZE، HRESET، KL، WIDEKL و AVX-VNNI.
- arrowlake
- پردازنده Intel Arrow Lake با افزونههای 64-bit و پشتیبانی از مجموعه دستورالعملهای MOVBE، MMX، SSE، SSE2، SSE3، SSSE3، SSE4.1، SSE4.2، POPCNT، AES، PREFETCHW، PCLMUL، RDRND، XSAVE، XSAVEC، XSAVES، XSAVEOPT، FSGSBASE، PTWRITE، RDPID، SGX، GFNI-SSE، CLWB، MOVDIRI، MOVDIR64B، WAITPKG، ADCX، AVX، AVX2، BMI، BMI2، F16C، FMA، LZCNT، PCONFIG، PKU، VAES، VPCLMULQDQ، SERIALIZE، HRESET، KL، WIDEKL، AVX-VNNI، UINTR، AVXIFMA، AVXVNNIINT8، AVXNECONVERT و CMPCCXADD.
- arrowlake-s
- lunarlake
- پردازنده Intel Arrow Lake S/Lunar Lake با افزونههای 64-bit و پشتیبانی از مجموعه دستورالعملهای MOVBE، MMX، SSE، SSE2، SSE3، SSSE3، SSE4.1، SSE4.2، POPCNT، AES، PREFETCHW، PCLMUL، RDRND، XSAVE، XSAVEC، XSAVES، XSAVEOPT، FSGSBASE، PTWRITE، RDPID، SGX، GFNI-SSE، CLWB، MOVDIRI، MOVDIR64B، WAITPKG، ADCX، AVX، AVX2، BMI، BMI2، F16C، FMA، LZCNT، PCONFIG، PKU، VAES، VPCLMULQDQ، SERIALIZE، HRESET، KL، WIDEKL، AVX-VNNI، UINTR، AVXIFMA، AVXVNNIINT8، AVXNECONVERT، CMPCCXADD، AVXVNNIINT16، SHA512، SM3 و SM4..IP pantherlake 4 پردازنده Intel Panther Lake همراه با پشتیبانی از افزونههای 64-bit و مجموعهدستورهای MOVBE، MMX، SSE، SSE2، SSE3، SSSE3، SSE4.1، SSE4.2، POPCNT، AES، PREFETCHW، PCLMUL، RDRND، XSAVE، XSAVEC، XSAVES، XSAVEOPT، FSGSBASE، PTWRITE، RDPID، SGX، GFNI-SSE، CLWB، MOVDIRI، MOVDIR64B، WAITPKG، ADCX، AVX، AVX2، BMI، BMI2، F16C، FMA، LZCNT، PCONFIG، PKU، VAES، VPCLMULQDQ، SERIALIZE، HRESET، AVX-VNNI، UINTR، AVXIFMA، AVXVNNIINT8، AVXNECONVERT، CMPCCXADD، AVXVNNIINT16، SHA512، SM3، SM4 و PREFETCHI.
- sapphirerapids
- emeraldrapids
- پردازنده Intel Sapphire Rapids/Emerald Rapids همراه با پشتیبانی از افزونههای 64-bit و مجموعهدستورهای MMX، SSE، SSE2، SSE3، SSSE3، SSE4.1، SSE4.2، POPCNT، CX16، SAHF، FXSR، AVX، XSAVE، PCLMUL، FSGSBASE، RDRND، F16C، AVX2، BMI، BMI2، LZCNT، FMA، MOVBE، HLE، RDSEED، ADCX، PREFETCHW، AES، CLFLUSHOPT، XSAVEC، XSAVES، SGX، AVX512F، AVX512VL، AVX512BW، AVX512DQ، AVX512CD، PKU، AVX512VBMI، AVX512IFMA، SHA، AVX512VNNI، GFNI، VAES، AVX512VBMI2، VPCLMULQDQ، AVX512BITALG، RDPID، AVX512VPOPCNTDQ، PCONFIG، WBNOINVD، CLWB، MOVDIRI، MOVDIR64B، ENQCMD، CLDEMOTE، PTWRITE، WAITPKG، SERIALIZE، TSXLDTRK، UINTR، AMX-BF16، AMX-TILE، AMX-INT8، AVX-VNNI، AVX512-FP16 و AVX512BF16.
- graniterapids
- پردازنده Intel Granite Rapids همراه با پشتیبانی از افزونههای 64-bit و مجموعهدستورهای MMX، SSE، SSE2، SSE3، SSSE3، SSE4.1، SSE4.2، POPCNT، CX16، SAHF، FXSR، AVX، XSAVE، PCLMUL، FSGSBASE، RDRND، F16C، AVX2، BMI، BMI2، LZCNT، FMA، MOVBE، HLE، RDSEED، ADCX، PREFETCHW، AES، CLFLUSHOPT، XSAVEC، XSAVES، SGX، AVX512F، AVX512VL، AVX512BW، AVX512DQ، AVX512CD، PKU، AVX512VBMI، AVX512IFMA، SHA، AVX512VNNI، GFNI، VAES، AVX512VBMI2، VPCLMULQDQ، AVX512BITALG، RDPID، AVX512VPOPCNTDQ، PCONFIG، WBNOINVD، CLWB، MOVDIRI، MOVDIR64B، ENQCMD، CLDEMOTE، PTWRITE، WAITPKG، SERIALIZE، TSXLDTRK، UINTR، AMX-BF16، AMX-TILE، AMX-INT8، AVX-VNNI، AVX512-FP16، AVX512BF16، AMX-FP16 و PREFETCHI.
- graniterapids-d
- پردازنده Intel Granite Rapids D همراه با پشتیبانی از افزونههای 64-bit و مجموعهدستورهای MMX، SSE، SSE2، SSE3، SSSE3، SSE4.1، SSE4.2، POPCNT، CX16، SAHF، FXSR، AVX، XSAVE، PCLMUL، FSGSBASE، RDRND، F16C، AVX2، BMI، BMI2، LZCNT، FMA، MOVBE، HLE، RDSEED، ADCX، PREFETCHW، AES، CLFLUSHOPT، XSAVEC، XSAVES، SGX، AVX512F، AVX512VL، AVX512BW، AVX512DQ، AVX512CD، PKU، AVX512VBMI، AVX512IFMA، SHA، AVX512VNNI، GFNI، VAES، AVX512VBMI2، VPCLMULQDQ، AVX512BITALG، RDPID، AVX512VPOPCNTDQ، PCONFIG، WBNOINVD، CLWB، MOVDIRI، MOVDIR64B، ENQCMD، CLDEMOTE، PTWRITE، WAITPKG، SERIALIZE، TSXLDTRK، UINTR، AMX-BF16، AMX-TILE، AMX-INT8، AVX-VNNI، AVX512FP16، AVX512BF16، AMX-FP16، PREFETCHI و AMX-COMPLEX.
- diamondrapids
- پردازنده Intel Diamond Rapids همراه با پشتیبانی از افزونههای 64-bit و مجموعهدستورهای MOVBE، MMX، SSE، SSE2، SSE3، SSSE3، SSE4.1، SSE4.2، POPCNT، CX16، SAHF، FXSR، AVX، XSAVE، PCLMUL، FSGSBASE، RDRND، F16C، AVX2، BMI، BMI2، LZCNT، FMA، MOVBE، HLE، RDSEED، ADCX، PREFETCHW، AES، CLFLUSHOPT، XSAVEC، XSAVES، SGX، AVX512F، AVX512VL، AVX512BW، AVX512DQ، AVX512CD، PKU، AVX512VBMI، AVX512IFMA، SHA، AVX512VNNI، GFNI، VAES، AVX512VBMI2، VPCLMULQDQ، AVX512BITALG، RDPID، AVX512VPOPCNTDQ، PCONFIG، WBNOINVD، CLWB، MOVDIRI، MOVDIR64B، ENQCMD، CLDEMOTE، PTWRITE، WAITPKG، SERIALIZE، TSXLDTRK، UINTR، AMX-BF16، AMX-TILE، AMX-INT8، AVX-VNNI، AVX512FP16، AVX512BF16، AMX-FP16، PREFETCHI، AMX-COMPLEX، AVX10.1-512، AVX-IFMA، AVX-NE-CONVERT، AVX-VNNI-INT16، AVX-VNNI-INT8، CMPccXADD، SHA512، SM3، SM4، AVX10.2-512، APX_F، AMX-AVX512، AMX-FP8، AMX-TF32، AMX-TRANSPOSE، MOVRS، AMX-MOVRS و USER_MSR.
- bonnell
- atom
- پردازنده Intel Bonnell همراه با پشتیبانی از افزونههای 64-bit و مجموعهدستورهای MOVBE، MMX، SSE، SSE2، SSE3 و SSSE3.
- silvermont
- slm
- پردازنده Intel Silvermont همراه با پشتیبانی از افزونههای 64-bit و مجموعهدستورهای MOVBE، MMX، SSE، SSE2، SSE3، SSSE3، SSE4.1، SSE4.2، POPCNT، CX16، SAHF، FXSR، PCLMUL، PREFETCHW و RDRND.
- goldmont
- پردازنده Intel Goldmont همراه با پشتیبانی از افزونههای 64-bit و مجموعهدستورهای MOVBE، MMX، SSE، SSE2، SSE3، SSSE3، SSE4.1، SSE4.2، POPCNT، CX16، SAHF، FXSR، PCLMUL، PREFETCHW، RDRND، AES، SHA، RDSEED، XSAVE، XSAVEC، XSAVES، XSAVEOPT، CLFLUSHOPT و FSGSBASE.
- goldmont-plus
- پردازنده Intel Goldmont Plus همراه با پشتیبانی از افزونههای 64-bit و مجموعهدستورهای MOVBE، MMX، SSE، SSE2، SSE3، SSSE3، SSE4.1، SSE4.2، POPCNT، CX16، SAHF، FXSR، PCLMUL، PREFETCHW، RDRND، AES، SHA، RDSEED، XSAVE، XSAVEC، XSAVES، XSAVEOPT، CLFLUSHOPT، FSGSBASE، PTWRITE، RDPID و SGX.
- tremont
- پردازنده Intel Tremont همراه با پشتیبانی از افزونههای 64-bit و مجموعهدستورهای MOVBE، MMX، SSE، SSE2، SSE3، SSSE3، SSE4.1، SSE4.2، POPCNT، CX16، SAHF، FXSR، PCLMUL، PREFETCHW، RDRND، AES، SHA، RDSEED، XSAVE، XSAVEC، XSAVES، XSAVEOPT، CLFLUSHOPT، FSGSBASE، PTWRITE، RDPID، SGX، CLWB، GFNI-SSE، MOVDIRI، MOVDIR64B، CLDEMOTE و WAITPKG.
- sierraforest
- پردازنده Intel Sierra Forest همراه با پشتیبانی از افزونههای 64-bit و مجموعهدستورهای MOVBE، MMX، SSE، SSE2، SSE3، SSSE3، SSE4.1، SSE4.2، POPCNT، AES، PREFETCHW، PCLMUL، RDRND، XSAVE، XSAVEC، XSAVES، XSAVEOPT، FSGSBASE، PTWRITE، RDPID، SGX، GFNI-SSE، CLWB، MOVDIRI، MOVDIR64B، CLDEMOTE، WAITPKG، ADCX، AVX، AVX2، BMI، BMI2، F16C، FMA، LZCNT، PCONFIG، PKU، VAES، VPCLMULQDQ، SERIALIZE، HRESET، KL، WIDEKL، AVX-VNNI، AVXIFMA، AVXVNNIINT8، AVXNECONVERT، CMPCCXADD، ENQCMD و UINTR.
- grandridge
- پردازنده Intel Grand Ridge همراه با پشتیبانی از افزونههای 64-bit و مجموعهدستورهای MOVBE، MMX، SSE، SSE2، SSE3، SSSE3، SSE4.1، SSE4.2، POPCNT، AES، PREFETCHW، PCLMUL، RDRND، XSAVE، XSAVEC، XSAVES، XSAVEOPT، FSGSBASE، PTWRITE، RDPID، SGX، GFNI-SSE، CLWB، MOVDIRI، MOVDIR64B، CLDEMOTE، WAITPKG، ADCX، AVX، AVX2، BMI، BMI2، F16C، FMA، LZCNT، PCONFIG، PKU، VAES، VPCLMULQDQ، SERIALIZE، HRESET، KL، WIDEKL، AVX-VNNI، AVXIFMA، AVXVNNIINT8، AVXNECONVERT، CMPCCXADD، ENQCMD و UINTR.
- clearwaterforest
- پردازنده Intel Clearwater Forest همراه با پشتیبانی از افزونههای 64-bit و مجموعهدستورهای MOVBE، MMX، SSE، SSE2، SSE3، SSSE3، SSE4.1، SSE4.2، POPCNT، AES، PREFETCHW، PCLMUL، RDRND، XSAVE، XSAVEC، XSAVES، XSAVEOPT، FSGSBASE، PTWRITE، RDPID، SGX، GFNI-SSE، CLWB، MOVDIRI، MOVDIR64B، CLDEMOTE، WAITPKG، ADCX، AVX، AVX2، BMI، BMI2، F16C، FMA، LZCNT، PCONFIG، PKU، VAES، VPCLMULQDQ، SERIALIZE، HRESET، AVX-VNNI، ENQCMD، UINTR، AVXIFMA، AVXVNNIINT8، AVXNECONVERT، CMPCCXADD، AVXVNNIINT16، SHA512، SM3، SM4، USER_MSR و PREFETCHI.
- k6
- پردازنده AMD K6 با پشتیبانی از مجموعهدستور MMX.
- k6-2
- k6-3
- نسخههای بهبودیافته پردازنده AMD K6 با پشتیبانی از مجموعهدستورهای MMX و !3DNow.
- athlon
- athlon-tbird
- پردازنده AMD Athlon با پشتیبانی از MMX، !3dNOW، !enhanced 3DNow و دستورهای پیشواکشی SSE.
- athlon-4
- athlon-xp
- athlon-mp
- پردازنده بهبودیافته AMD Athlon با پشتیبانی از مجموعهدستورهای MMX، !3DNow، !enhanced 3DNow و پشتیبانی کامل از مجموعهدستور SSE.
- k8
- opteron
- athlon64
- athlon-fx
- پردازندههای مبتنی بر هسته AMD K8 با پشتیبانی از مجموعهدستور x86-64، شامل پردازندههای AMD Opteron، Athlon 64 و Athlon 64 FX. (این شامل ابرمجموعهای از افزونههای مجموعهدستور MMX، SSE، SSE2، !3DNow، !enhanced 3DNow و 64-bit است.)
- k8-sse3
- opteron-sse3
- athlon64-sse3
- نسخههای بهبودیافته از هستههای AMD K8 با پشتیبانی از مجموعهدستور SSE3.
- amdfam10
- barcelona
- پردازندههای مبتنی بر هستههای AMD Family 10h با پشتیبانی از مجموعهدستور x86-64. (این شامل ابرمجموعهای از افزونههای مجموعهدستور MMX، SSE، SSE2، SSE3، SSE4A، !3DNow، !enhanced 3DNow، ABM و 64-bit است.).IP bdver1 4 پردازندههای مبتنی بر هستههای AMD Family 15h با پشتیبانی از مجموعه دستورالعملهای x86-64. (این گزینه دربرگیرندهٔ توسعههای مجموعه دستورالعملهای FMA4، AVX، XOP، LWP، AES، PCLMUL، CX16، MMX، SSE، SSE2، SSE3، SSE4A، SSSE3، SSE4.1، SSE4.2، ABM و 64-bit است.)
- bdver2
- پردازندههای مبتنی بر هستهٔ AMD Family 15h با پشتیبانی از مجموعه دستورالعملهای x86-64. (این گزینه دربرگیرندهٔ توسعههای مجموعه دستورالعملهای BMI، TBM، F16C، FMA، FMA4، AVX، XOP، LWP، AES، PCLMUL، CX16، MMX، SSE، SSE2، SSE3، SSE4A، SSSE3، SSE4.1، SSE4.2، ABM و 64-bit است.)
- bdver3
- پردازندههای مبتنی بر هستهٔ AMD Family 15h با پشتیبانی از مجموعه دستورالعملهای x86-64. (این گزینه دربرگیرندهٔ توسعههای مجموعه دستورالعملهای BMI، TBM، F16C، FMA، FMA4، FSGSBASE، AVX، XOP، LWP، AES، PCLMUL، CX16، MMX، SSE، SSE2، SSE3، SSE4A، SSSE3، SSE4.1، SSE4.2، ABM و 64-bit است.)
- bdver4
- پردازندههای مبتنی بر هستهٔ AMD Family 15h با پشتیبانی از مجموعه دستورالعملهای x86-64. (این گزینه دربرگیرندهٔ توسعههای مجموعه دستورالعملهای BMI، BMI2، TBM، F16C، FMA، FMA4، FSGSBASE، AVX، AVX2، XOP، LWP، AES، PCLMUL، CX16، MOVBE، MMX، SSE، SSE2، SSE3، SSE4A، SSSE3، SSE4.1، SSE4.2، ABM و 64-bit است.)
- znver1
- پردازندههای مبتنی بر هستهٔ AMD Family 17h با پشتیبانی از مجموعه دستورالعملهای x86-64. (این گزینه دربرگیرندهٔ توسعههای مجموعه دستورالعملهای BMI، BMI2، F16C، FMA، FSGSBASE، AVX، AVX2، ADCX، RDSEED، MWAITX، SHA، CLZERO، AES، PCLMUL، CX16، MOVBE، MMX، SSE، SSE2، SSE3، SSE4A، SSSE3، SSE4.1، SSE4.2، ABM، XSAVEC، XSAVES، CLFLUSHOPT، POPCNT و 64-bit است.)
- znver2
- پردازندههای مبتنی بر هستهٔ AMD Family 17h با پشتیبانی از مجموعه دستورالعملهای x86-64. (این گزینه دربرگیرندهٔ توسعههای مجموعه دستورالعملهای BMI، BMI2، CLWB، F16C، FMA، FSGSBASE، AVX، AVX2، ADCX، RDSEED، MWAITX، SHA، CLZERO، AES، PCLMUL، CX16، MOVBE، MMX، SSE، SSE2، SSE3، SSE4A، SSSE3، SSE4.1، SSE4.2، ABM، XSAVEC، XSAVES، CLFLUSHOPT، POPCNT، RDPID، WBNOINVD و 64-bit است.)
- znver3
- پردازندههای مبتنی بر هستهٔ AMD Family 19h با پشتیبانی از مجموعه دستورالعملهای x86-64. (این گزینه دربرگیرندهٔ توسعههای مجموعه دستورالعملهای BMI، BMI2، CLWB، F16C، FMA، FSGSBASE، AVX، AVX2، ADCX، RDSEED، MWAITX، SHA، CLZERO، AES، PCLMUL، CX16، MOVBE، MMX، SSE، SSE2، SSE3، SSE4A، SSSE3، SSE4.1، SSE4.2، ABM، XSAVEC، XSAVES، CLFLUSHOPT، POPCNT، RDPID، WBNOINVD، PKU، VPCLMULQDQ، VAES و 64-bit است.)
- znver4
- پردازندههای مبتنی بر هستهٔ AMD Family 19h با پشتیبانی از مجموعه دستورالعملهای x86-64. (این گزینه دربرگیرندهٔ توسعههای مجموعه دستورالعملهای BMI، BMI2، CLWB، F16C، FMA، FSGSBASE، AVX، AVX2، ADCX، RDSEED، MWAITX، SHA، CLZERO، AES، PCLMUL، CX16، MOVBE، MMX، SSE، SSE2، SSE3، SSE4A، SSSE3، SSE4.1، SSE4.2، ABM، XSAVEC، XSAVES، CLFLUSHOPT، POPCNT، RDPID، WBNOINVD، PKU، VPCLMULQDQ، VAES، AVX512F، AVX512DQ، AVX512IFMA، AVX512CD، AVX512BW، AVX512VL، AVX512BF16، AVX512VBMI، AVX512VBMI2، AVX512VNNI، AVX512BITALG، AVX512VPOPCNTDQ، GFNI و 64-bit است.)
- znver5
- پردازندههای مبتنی بر هستهٔ AMD Family 1ah با پشتیبانی از مجموعه دستورالعملهای x86-64. (این گزینه دربرگیرندهٔ توسعههای مجموعه دستورالعملهای BMI، BMI2، CLWB، F16C، FMA، FSGSBASE، AVX، AVX2، ADCX، RDSEED، MWAITX، SHA، CLZERO، AES، PCLMUL، CX16، MOVBE، MMX، SSE، SSE2، SSE3، SSE4A، SSSE3، SSE4.1، SSE4.2، ABM، XSAVEC، XSAVES، CLFLUSHOPT، POPCNT، RDPID، WBNOINVD، PKU، VPCLMULQDQ، VAES، AVX512F، AVX512DQ، AVX512IFMA، AVX512CD، AVX512BW، AVX512VL، AVX512BF16، AVX512VBMI، AVX512VBMI2، AVX512VNNI، AVX512BITALG، AVX512VPOPCNTDQ، GFNI، AVXVNNI، MOVDIRI، MOVDIR64B، AVX512VP2INTERSECT، PREFETCHI و 64-bit است.)
- btver1
- پردازندههای مبتنی بر هستههای AMD Family 14h با پشتیبانی از مجموعه دستورالعملهای x86-64. (این گزینه دربرگیرندهٔ توسعههای مجموعه دستورالعملهای MMX، SSE، SSE2، SSE3، SSSE3، SSE4A، CX16، ABM و 64-bit است.)
- btver2
- پردازندههای مبتنی بر هستههای AMD Family 16h با پشتیبانی از مجموعه دستورالعملهای x86-64. این گزینه شامل توسعههای مجموعه دستورالعملهای MOVBE، F16C، BMI، AVX، PCLMUL، AES، SSE4.2، SSE4.1، CX16، ABM، SSE4A، SSSE3، SSE3، SSE2، SSE، MMX و 64-bit است.
- winchip-c6
- پردازندهٔ IDT WinChip C6؛ همانند i486 با آن رفتار میشود، به همراه پشتیبانی بیشتر از مجموعه دستورالعملهای MMX.
- winchip2
- پردازندهٔ IDT WinChip 2؛ همانند i486 با آن رفتار میشود، به همراه پشتیبانی بیشتر از مجموعه دستورالعملهای MMX و 3DNow!.
- c3
- پردازندهٔ VIA C3 با پشتیبانی از مجموعه دستورالعملهای MMX و 3DNow!. (هیچ زمانبندیای برای این تراشه پیادهسازی نشده است.)
- c3-2
- پردازندهٔ VIA C3-2 (Nehemiah/C5XL) با پشتیبانی از مجموعه دستورالعملهای MMX و SSE. (هیچ زمانبندیای برای این تراشه پیادهسازی نشده است.)
- c7
- پردازندهٔ VIA C7 (Esther) با پشتیبانی از مجموعه دستورالعملهای MMX، SSE، SSE2 و SSE3. (هیچ زمانبندیای برای این تراشه پیادهسازی نشده است.)
- samuel-2
- پردازندهٔ VIA Eden Samuel 2 با پشتیبانی از مجموعه دستورالعملهای MMX و 3DNow!. (هیچ زمانبندیای برای این تراشه پیادهسازی نشده است.)
- nehemiah
- پردازندهٔ VIA Eden Nehemiah با پشتیبانی از مجموعه دستورالعملهای MMX و SSE. (هیچ زمانبندیای برای این تراشه پیادهسازی نشده است.)
- esther
- پردازندهٔ VIA Eden Esther با پشتیبانی از مجموعه دستورالعملهای MMX، SSE، SSE2 و SSE3. (هیچ زمانبندیای برای این تراشه پیادهسازی نشده است.)
- eden-x2
- پردازندهٔ VIA Eden X2 با پشتیبانی از مجموعه دستورالعملهای x86-64، MMX، SSE، SSE2 و SSE3. (هیچ زمانبندیای برای این تراشه پیادهسازی نشده است.)
- eden-x4
- پردازندهٔ VIA Eden X4 با پشتیبانی از مجموعه دستورالعملهای x86-64، MMX، SSE، SSE2، SSE3، SSSE3، SSE4.1، SSE4.2، AVX و AVX2. (هیچ زمانبندیای برای این تراشه پیادهسازی نشده است.)
- nano
- پردازندهٔ عمومی VIA Nano با پشتیبانی از مجموعه دستورالعملهای x86-64، MMX، SSE، SSE2، SSE3 و SSSE3. (هیچ زمانبندیای برای این تراشه پیادهسازی نشده است.)
- nano-1000
- پردازندهٔ VIA Nano 1xxx با پشتیبانی از مجموعه دستورالعملهای x86-64، MMX، SSE، SSE2، SSE3 و SSSE3. (هیچ زمانبندیای برای این تراشه پیادهسازی نشده است.)
- nano-2000
- پردازندهٔ VIA Nano 2xxx با پشتیبانی از مجموعه دستورالعملهای x86-64، MMX، SSE، SSE2، SSE3 و SSSE3. (هیچ زمانبندیای برای این تراشه پیادهسازی نشده است.)
- nano-3000
- پردازندهٔ VIA Nano 3xxx با پشتیبانی از مجموعه دستورالعملهای x86-64، MMX، SSE، SSE2، SSE3، SSSE3 و SSE4.1. (هیچ زمانبندیای برای این تراشه پیادهسازی نشده است.)
- nano-x2
- پردازندهٔ دوهستهای VIA Nano Dual Core با پشتیبانی از مجموعه دستورالعملهای x86-64، MMX، SSE، SSE2، SSE3، SSSE3 و SSE4.1. (هیچ زمانبندیای برای این تراشه پیادهسازی نشده است.)
- nano-x4
- پردازندهٔ چهارهستهای VIA Nano Quad Core با پشتیبانی از مجموعه دستورالعملهای x86-64، MMX، SSE، SSE2، SSE3، SSSE3 و SSE4.1. (هیچ زمانبندیای برای این تراشه پیادهسازی نشده است.)
- lujiazui
- پردازندهٔ ZHAOXIN lujiazui با پشتیبانی از مجموعه دستورالعملهای x86-64، MOVBE، MMX، SSE، SSE2، SSE3، SSSE3، SSE4.1، SSE4.2، POPCNT، AES، PCLMUL، RDRND، XSAVE، XSAVEOPT، FSGSBASE، CX16، ABM، BMI، BMI2، FXSR و RDSEED. گرچه این پردازندهها از AVX و F16C پشتیبانی میکنند، اما به دلایل کارایی توسط "-march=lujiazui" فعال نمیشوند.
- yongfeng
- پردازندهٔ ZHAOXIN yongfeng با پشتیبانی از مجموعه دستورالعملهای x86-64، MOVBE، MMX، SSE، SSE2، SSE3، SSSE3، SSE4.1، SSE4.2، AVX، POPCNT، AES، PCLMUL، RDRND، XSAVE، XSAVEOPT، FSGSBASE، CX16، ABM، BMI، BMI2، F16C، FXSR، RDSEED، AVX2، FMA، SHA و LZCNT.
- shijidadao
- پردازندهٔ ZHAOXIN shijidadao با پشتیبانی از مجموعه دستورالعملهای x86-64، MOVBE، MMX، SSE، SSE2، SSE3، SSSE3، SSE4.1، SSE4.2، AVX، POPCNT، AES، PCLMUL، RDRND، XSAVE، XSAVEOPT، FSGSBASE، CX16، ABM، BMI، BMI2، F16C، FXSR، RDSEED، AVX2، FMA، SHA و LZCNT.
- geode
- پردازندهٔ تعبیهشدهٔ AMD Geode با پشتیبانی از مجموعه دستورالعملهای MMX و 3DNow!.
- -mtune=cpu-type
- تمام
جنبههای
قابل اعمال
در کد
تولیدشده،
به استثنای
ABI و مجموعهٔ
دستورالعملهای
در دسترس،
برای cpu-type
بهینهسازی
(tune) میشود. در
حالی که
انتخاب یک
cpu-type خاص،
زمانبندی
دستورات را
به شکل
مناسبی
برای آن
تراشهٔ
مشخص تنظیم
میکند،
کامپایلر
هیچ کدی
تولید
نمیکند که
نتواند روی
نوع
پیشفرض
ماشین اجرا
شود، مگر
اینکه از
گزینهٔ
-march=cpu-type
استفاده
کنید. به
عنوان
مثال، اگر GCC
برای i686-pc-linux-gnu
پیکربندی
شده باشد،
آنگاه -mtune=pentium4
کدی تولید
میکند که
برای Pentium 4
بهینهسازی
شده است اما
همچنان روی
ماشینهای
i686 اجرا
میشود.
گزینههای انتخابی برای cpu-type همانند گزینههای -march هستند. علاوه بر این، -mtune از ۲ گزینهٔ دیگر برای cpu-type پشتیبانی میکند:
با ورود پردازندههای جدید به بازار، رفتار این گزینه تغییر خواهد کرد. بنابراین، اگر به نسخه جدیدتری از GCC ارتقا دهید، تولید کد تحت کنترل این گزینه تغییر میکند تا منعکسکننده رایجترین پردازندهها در زمان انتشار آن نسخه از GCC باشد.
گزینهای بهنام -march=generic وجود ندارد، زیرا -march مجموعه دستورالعملهایی را مشخص میکند که کامپایلر میتواند استفاده کند، و هیچ مجموعه دستورالعمل عمومیای وجود ندارد که برای همه پردازندهها قابلاعمال باشد. در مقابل، -mtune پردازنده (یا در این مورد، مجموعهای از پردازندهها) را مشخص میکند که کد برای آن بهینهسازی میشود.
- intel
- تولید کد
بهینهسازیشده
برای
جدیدترین
پردازندههای
Intel، که در این
نسخه از GCC
شامل Haswell و Silvermont
هستند. اگر
میدانید
کُد شما روی
چه
پردازندهای
اجرا خواهد
شد، باید
بهجای -mtune=intel
از گزینه
متناظر -mtune
یا -march
استفاده
کنید. اما
اگر
میخواهید
برنامهتان
روی هر دوی Haswell
و Silvermont عملکرد
بهتری
داشته
باشد، باید
از این
گزینه
استفاده
کنید.
با ورود پردازندههای جدید Intel به بازار، رفتار این گزینه تغییر خواهد کرد. بنابراین، اگر به نسخه جدیدتری از GCC ارتقا دهید، تولید کد تحت کنترل این گزینه تغییر میکند تا جدیدترین پردازندههای Intel در زمان انتشار آن نسخه از GCC را منعکس کند.
گزینهای بهنام -march=intel وجود ندارد، زیرا -march مجموعه دستورالعملهایی را مشخص میکند که کامپایلر میتواند استفاده کند، و هیچ مجموعه دستورالعمل مشترکی وجود ندارد که برای همه پردازندهها قابلاعمال باشد. در مقابل، -mtune پردازنده (یا در این مورد، مجموعهای از پردازندهها) را مشخص میکند که کد برای آن بهینهسازی میشود.
- -mcpu=cpu-type
- مترادفی منسوخشده برای -mtune.
- -mfpmath=unit
- تولید محاسبات ممیز شناور برای واحد انتخابشده unit. گزینههای انتخاب برای unit عبارتند از:
- 387
- استفاده از
کمکپردازنده
ممیز شناور
استاندارد
387 که در اکثر
تراشهها
وجود دارد و
در غیر این
صورت
شبیهسازی
میشود. کدی
که با این
گزینه
کامپایل
شود
تقریباً در
همهجا
اجرا
میشود.
نتایج موقت
بهجای دقت
مشخصشده
توسط نوع،
با دقت ۸۰
بیتی
محاسبه
میشوند که
منجر به
نتایج کمی
متفاوت در
مقایسه با
اکثر
تراشههای
دیگر
میگردد.
برای
توضیحات
مفصلتر به
-ffloat-store مراجعه
کنید.
این گزینه پیشفرض برای مقصدهای x86-32 غیر از Darwin است.
- sse
- استفاده از
دستورالعملهای
نردهای
ممیز شناور
موجود در
مجموعه
دستورالعمل
SSE. این
مجموعه
دستورالعمل
توسط
تراشههای
Pentium III و
جدیدتر، و
در خط تولید
AMD توسط
تراشههای
Athlon-4، Athlon XP و Athlon MP
پشتیبانی
میشود.
نسخه
اولیهی
مجموعه
دستورالعمل
SSE فقط از
محاسبات با
دقت یگانه
پشتیبانی
میکند،
بنابراین
محاسبات با
دقت مضاعف و
دقت
گسترشیافته
همچنان با
استفاده از
387 انجام
میشوند.
نسخه بعدی
که تنها در
تراشههای
Pentium 4 و AMD x86-64 وجود
دارد، از
محاسبات
دقت مضاعف
نیز
پشتیبانی
میکند.
برای کامپایلر x86-32، باید از سوییچهای -march=cpu-type، -msse یا -msse2 برای فعالسازی افزونههای SSE و اثرگذار کردن این گزینه استفاده کنید. برای کامپایلر x86-64، این افزونهها بهطور پیشفرض فعال هستند.
کد حاصل باید در بیشتر موارد بهطور چشمگیری سریعتر باشد و از مشکلات ناپایداری عددی کد 387 جلوگیری کند، اما ممکن است کدهای موجودی را که انتظار دارند مقادیر موقت ۸۰ بیتی باشند، دچار اختلال کند.
این انتخاب پیشفرض برای کامپایلر x86-64، مقصدهای Darwin x86-32، و انتخاب پیشفرض برای مقصدهای x86-32 دارای مجموعه دستورالعمل SSE2 در هنگام فعال بودن -ffast-math است.
- sse,387
- sse+387
- both
- تلاش برای استفاده همزمان از هر دو مجموعه دستورالعمل. این کار عملاً تعداد ثباتهای در دسترس را دو برابر میکند، و در تراشههای دارای واحدهای اجرایی جداگانه برای 387 و SSE، منابع اجرایی را نیز دو برابر میسازد. از این گزینه با احتیاط استفاده کنید زیرا هنوز آزمایشی است، چرا که تخصیصدهنده ثبات GCC واحدهای عملکردی جداگانه را بهخوبی مدلسازی نمیکند که منجر به عملکردی ناپایدار میشود.
- -masm=dialect
- خروجی دادن دستورالعملهای اسمبلی با استفاده از dialect انتخابشده. همچنین بر اینکه کدام گویش برای "asm" پایه و "asm" گسترشیافته استفاده شود اثر میگذارد. گزینههای پشتیبانیشده (به ترتیب گویش) عبارتند از att یا intel. مقدار پیشفرض att است. Darwin از intel پشتیبانی نمیکند.
- -mieee-fp
- -mno-ieee-fp
- کنترل اینکه آیا کامپایلر از مقایسههای ممیز شناور IEEE استفاده کند یا خیر. اینها حالتی را که در آن نتیجه یک مقایسه نامرتب است، بهدرستی مدیریت میکنند.
- -m80387
- -mhard-float
- تولید خروجی حاوی دستورالعملهای 80387 برای ممیز شناور.
- -mno-80387
- -msoft-float
- تولید
خروجی حاوی
فراخوانیهای
کتابخانهای
برای ممیز
شناور.
هشدار: کتابخانههای مورد نیاز جزئی از GCC نیستند. بهطور معمول از امکانات کامپایلر C مرسومِ ماشین استفاده میشود، اما در کامپایل چندسکویی نمیتوان این کار را بهطور مستقیم انجام داد. شما باید تمهیدات لازم را برای فراهم کردن توابع کتابخانهای مناسب جهت کامپایل چندسکویی شخصاً اتخاذ کنید.
در ماشینهایی که یک تابع مقادیر بازگشتی ممیز شناور را در پشته ثبات 80387 قرار میدهد، حتی اگر از -msoft-float استفاده شود، ممکن است برخی از کدهای عملیاتی ممیز شناور صادر شوند.
- -mno-fp-ret-in-387
- از
ثباتهای FPU
برای
مقادیر
بازگشتی
توابع
استفاده
نکن.
قرارداد فراخوانی معمول بهگونهای است که توابع مقادیر با انواع "float" و "double" را در یک ثبات FPU بازمیگردانند، حتی اگر FPU وجود نداشته باشد. ایده این است که سیستمعامل باید یک FPU را شبیهسازی کند.
گزینه -mno-fp-ret-in-387 موجب میشود چنین مقادیری بهجای آن در ثباتهای معمولی CPU بازگردانده شوند.
- -mno-fancy-math-387
- برخی از شبیهسازهای 387 از دستورالعملهای "sin"، "cos" و "sqrt" برای 387 پشتیبانی نمیکنند. این گزینه را مشخص کنید تا از تولید این دستورالعملها جلوگیری شود. زمانی که -march مشخص کند که پردازنده هدف همیشه FPU دارد و بنابراین دستورالعمل نیازی به شبیهسازی ندارد، این گزینه باطل میشود. این دستورالعملها تولید نمیشوند مگر اینکه از سوییچ -funsafe-math-optimizations نیز استفاده کنید.
- -malign-double
- -mno-align-double
- کنترل
اینکه آیا
GCC متغیرهای
"double"،
"long double" و
"long long" را
روی مرز دو
کلمهای
تراز کند یا
یک کلمهای.
تراز کردن
متغیرهای
"double" روی
مرز دو
کلمهای
کدی تولید
میکند که
با هزینه
مصرف حافظه
بیشتر، روی
Pentium تا حدی
سریعتر
اجرا
میشود.
روی x86-64، گزینه -malign-double بهطور پیشفرض فعال است.
هشدار: اگر از سوییچ -malign-double استفاده کنید، ساختارهای حاوی انواع فوق متفاوت از مشخصات منتشرشده رابط باینری کاربردی برای x86-32 تراز میشوند و از نظر باینری با ساختارها در کدهای کامپایلشده بدون آن سوییچ سازگار نخواهند بود.
- -m96bit-long-double
- این
گزینهها
اندازه نوع
داده "long
double" را
کنترل
میکنند.
رابط
باینری
کاربردی (ABI)
در x86-32 اندازه
را ۹۶ بیت
مشخص
میکند،
بنابراین
-m96bit-long-double در
حالت ۳۲
بیتی
پیشفرض
است.
معماریهای مدرن (Pentium و جدیدتر) ترجیح میدهند که "long double" روی یک مرز ۸ یا ۱۶ بایتی تراز شود. در آرایهها یا ساختارهایی که با ABI مطابقت دارند، این امر امکانپذیر نیست. بنابراین تعیین -m128bit-long-double، نوع "long double" را با افزودن ۳۲ بیت صفر اضافی (پدینگ)، روی یک مرز ۱۶ بایتی تراز میکند.
در کامپایلر x86-64، گزینه -m128bit-long-double انتخاب پیشفرض است زیرا ABI آن مشخص میکند که "long double" روی مرز ۱۶ بایتی تراز شود.
توجه داشته باشید که هیچیک از این گزینهها دقت بیشتری نسبت به استاندارد ۸۰ بیتی x87 برای "long double" فراهم نمیکنند.
هشدار: اگر مقدار پیشفرض را برای ABI مقصد خود بازنویسی کنید، این کار اندازه ساختارها و آرایههای حاوی متغیرهای "long double" را تغییر میدهد، و همچنین قرارداد فراخوانی تابع را برای توابعی که "long double" میگیرند اصلاح میکند. از این رو آنها با کدی که بدون این گزینه کامپایل شده است سازگاری باینری نخواهند داشت.
- -mlong-double-64
- -mlong-double-80
- -mlong-double-128
- این
گزینهها
اندازه نوع
داده "long
double" را
کنترل
میکنند.
اندازه ۶۴
بیت باعث
میشود نوع
"long double"
معادل نوع
"double" شود.
این حالت
برای
کتابخانه
۳۲ بیتی Bionic C
پیشفرض
است. اندازه
۱۲۸ بیت
باعث
میشود نوع
"long double"
معادل نوع
"__float128" شود.
این حالت
برای
کتابخانه
۶۴ بیتی Bionic C
پیشفرض
است.
هشدار: اگر مقدار پیشفرض را برای ABI مقصد خود بازنویسی کنید، این کار اندازه ساختارها و آرایههای حاوی متغیرهای "long double" را تغییر میدهد، و همچنین قرارداد فراخوانی تابع را برای توابعی که "long double" میگیرند اصلاح میکند. از این رو آنها با کدی که بدون این گزینه کامپایل شده است سازگاری باینری نخواهند داشت.
- -malign-data=type
- نحوه تراز کردن متغیرها توسط GCC را کنترل میکند. مقادیر پشتیبانیشده برای type عبارتند از: compat از مقدار تراز افزایشیافته سازگار با GCC 4.8 و نسخههای پیشین استفاده میکند، abi از مقدار تراز تعیینشده توسط psABI استفاده میکند، و cacheline از مقدار تراز افزایشیافته برای تطابق با اندازه خط حافظه نهان (cache line) استفاده میکند. مقدار پیشفرض compat است.
- -mlarge-data-threshold=threshold
- هنگامی که -mcmodel=medium یا -mcmodel=large مشخص شود، اشیاء دادهای بزرگتر از threshold در بخشهای داده بزرگ (large data sections) قرار میگیرند. مقدار پیشفرض ۶۵۵۳۵ است.
- -mrtd
- از یک
قرارداد
فراخوانی
تابع
متفاوت
استفاده
میکند که
در آن،
توابعی با
تعداد
ثابتی از
آرگومانها
با دستور
"ret
num"
بازمیگردند،
که
آرگومانهای
آنها را در
هنگام
بازگشت از
پشته
برمیدارد.
این کار
باعث
صرفهجویی
یک دستور در
فراخواننده
میشود
زیرا نیازی
به برداشتن
آرگومانها
در آنجا
نیست.
میتوانید مشخص کنید که یک تابع منفرد با این توالی فراخوانی صدا زده شود، که این کار با صفت تابع "stdcall" انجام میگیرد. همچنین میتوانید با استفاده از صفت تابع "cdecl" گزینه -mrtd را لغو و بازنویسی کنید.
هشدار: این قرارداد فراخوانی با قراردادی که معمولاً در Unix استفاده میشود ناسازگار است، بنابراین اگر نیاز به فراخوانی کتابخانههای کامپایلشده با کامپایلر Unix دارید، نمیتوانید از آن استفاده کنید.
همچنین، باید پیشنمونه تابع را برای همه توابعی که تعداد متغیری از آرگومانها را دریافت میکنند (از جمله "printf") فراهم کنید؛ در غیر این صورت کدهای نادرستی برای فراخوانی آن توابع تولید میشود.
علاوه بر این، اگر تابعی را با آرگومانهای بیش از حد فراخوانی کنید، کد به شدت نادرستی تولید خواهد شد. (به طور معمول، آرگومانهای اضافی بدون ایجاد مشکل نادیده گرفته میشوند.)
- -mregparm=num
- تعداد
ثباتهایی
را که برای
ارسال
آرگومانهای
عدد صحیح
استفاده
میشوند
کنترل
میکند. به
طور
پیشفرض،
هیچ ثباتی
برای ارسال
آرگومانها
استفاده
نمیشود و
حداکثر
میتوان از
۳ ثبات
استفاده
کرد.
میتوانید
این رفتار
را برای یک
تابع خاص با
استفاده از
صفت تابع
"regparm"
کنترل کنید.
هشدار: اگر از این گزینه استفاده کنید و num غیرصفر باشد، باید تمام پودمانها از جمله هرگونه کتابخانه را با همان مقدار بسازید. این امر شامل کتابخانههای سیستم و پودمانهای راهاندازی (startup modules) نیز میشود.
- -msseregparm
- از
قراردادهای
ارسال ثبات
SSE برای
آرگومانها
و مقادیر
بازگشتی float و
double استفاده
میکند.
میتوانید
این رفتار
را برای یک
تابع خاص با
استفاده از
صفت تابع
"sseregparm"
کنترل کنید.
هشدار: اگر از این گزینه استفاده کنید، باید تمام پودمانها را با همان مقدار بسازید، از جمله هرگونه کتابخانه. این امر شامل کتابخانههای سیستم و پودمانهای راهاندازی نیز میشود.
- -mvect8-ret-in-mem
- بردارهای ۸ بایتی را به جای ثباتهای MMX در حافظه بازمیگرداند. این مورد در VxWorks پیشفرض است تا با ABI کامپایلرهای Sun Studio تا نسخه ۱۲ مطابقت داشته باشد. تنها در صورتی از این گزینه استفاده کنید که نیاز به حفظ سازگاری با کدهای موجودِ تولیدشده توسط آن نسخههای قبلی کامپایلر یا نسخههای قدیمیتر GCC داشته باشید.
- -mpc32
- -mpc64
- -mpc80
- دقت ممیز
شناور 80387 را
روی ۳۲، ۶۴
یا ۸۰ بیت
تنظیم
میکند.
هنگامی که
-mpc32 مشخص
شود، بخش
معنادار (significand)
نتایج
محاسبات
ممیز شناور
به ۲۴ بیت
گرد
میشوند
(دقت یگانه
یا single precision)؛ -mpc64
بخش
معنادار
نتایج
محاسبات
ممیز شناور
را به ۵۳
بیت گرد
میکند (دقت
دوگانه یا double
precision) و -mpc80 بخش
معنادار
نتایج
محاسبات
ممیز شناور
را به ۶۴
بیت گرد
میکند (دقت
دوگانه
گسترشیافته
یا extended double precision) که
حالت
پیشفرض
است. هنگامی
که از این
گزینه
استفاده
میشود،
محاسبات
ممیز شناور
در دقتهای
بالاتر
بدون تنظیم
صریح کلمه
کنترلی FPU در
دسترس
برنامهنویس
نخواهد بود.
تنظیم گرد کردن محاسبات ممیز شناور روی مقداری کمتر از مقدار پیشفرضِ ۸۰ بیت میتواند سرعت برخی برنامهها را ۲٪ یا بیشتر افزایش دهد. توجه داشته باشید که برخی کتابخانههای ریاضی فرض میکنند که محاسبات ممیز شناور با دقت گسترشیافته (۸۰ بیتی) به طور پیشفرض فعال است؛ روتینهای چنین کتابخانههایی ممکن است دچار افت محسوس دقت شوند (معمولاً از طریق پدیدهای موسوم به “حذف فاجعهبار” یا catastrophic cancellation)، هنگامی که از این گزینه برای تنظیم دقت روی مقداری کمتر از دقت گسترشیافته استفاده شود.
- -mdaz-ftz
- پرچمهای flush-to-zero (FTZ) و denormals-are-zero (DAZ) در ثبات MXCSR برای کنترل محاسبات ممیز شناور استفاده میشوند. هنگامی که -mdaz-ftz مشخص شود، دستورالعملهای SSE و AVX از جمله دستورالعملهای اسکالر و برداری میتوانند از فعالسازی پرچمهای FTZ و DAZ بهرهمند شوند. هنگامی که -mno-daz-ftz یا -shared مشخص شده باشد پرچمهای FTZ/DAZ تنظیم نمیشوند، اما گزینه -mdaz-ftz حتی در صورت استفاده از -shared نیز پرچمهای FTZ/DAZ را تنظیم خواهد کرد.
- -mstackrealign
- تراز مجدد پشته در بدو ورود. در معماری x86، گزینه -mstackrealign یک دیباچه و مؤخره (prologue و epilogue) جایگزین تولید میکند که در صورت لزوم پشته زمان اجرا را دوباره تراز میکند. این قابلیت از ترکیب کدهای قدیمی که تراز ۴ بایتی پشته را حفظ میکنند با کدهای مدرنی که تراز ۱۶ بایتی پشته را برای سازگاری با SSE حفظ میکنند پشتیبانی میکند. همچنین صفت "force_align_arg_pointer" را ببینید که برای توابع منفرد قابل اعمال است.
- -mpreferred-stack-boundary=num
- تلاش برای
نگه داشتن
مرز پشته،
تراز شده با
یک مرز ۲ به
توان num
بایت. اگر
-mpreferred-stack-boundary مشخص
نشود،
مقدار
پیشفرض ۴
است (۱۶
بایت یا ۱۲۸
بیت).
هشدار: هنگام تولید کد برای معماری x86-64 با افزونههای غیرفعالشده SSE، میتوان از -mpreferred-stack-boundary=3 برای نگه داشتن مرز پشته تراز شده روی مرز ۸ بایتی استفاده کرد. از آنجا که ABI در x86-64 به تراز پشته ۱۶ بایتی نیاز دارد، این کار با ABI ناسازگار بوده و برای استفاده در محیطهای کنترلشدهای در نظر گرفته شده است که فضای پشته در آنها محدودیت مهمی به شمار میرود. این گزینه زمانی که توابع کامپایلشده با تراز پشته ۱۶ بایتی (مانند توابع یک کتابخانه استاندارد) با پشتهای ناتراز فراخوانی شوند، منجر به تولید کد نادرست میشود. در این حالت، دستورالعملهای SSE ممکن است منجر به بروز تلههای دسترسی ناتراز به حافظه شوند. علاوه بر این، آرگومانهای متغیر برای اشیاء با تراز ۱۶ بایتی (از جمله 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) استفاده میکنند همیشه از تنظیمات پیشفرض بهره ببرند.
این تراز اضافی، فضای بیشتری از پشته را مصرف میکند و عموماً باعث افزایش اندازه کد میشود. کدهایی که به مصرف فضای پشته حساس هستند، مانند سیستمهای تعبیهشده و هستههای سیستمعامل، ممکن است بخواهند تراز ترجیحی را به -mpreferred-stack-boundary=2 کاهش دهند..IP -mmmx 4
- -msse
- -msse2
- -msse3
- -mssse3
- -msse4
- -msse4a
- -msse4.1
- -msse4.2
- -mavx
- -mavx2
- -mavx512f
- -mavx512cd
- -mavx512vl
- -mavx512bw
- -mavx512dq
- -mavx512ifma
- -mavx512vbmi
- -msha
- -maes
- -mpclmul
- -mclflushopt
- -mclwb
- -mfsgsbase
- -mptwrite
- -mrdrnd
- -mf16c
- -mfma
- -mpconfig
- -mwbnoinvd
- -mfma4
- -mprfchw
- -mrdpid
- -mrdseed
- -msgx
- -mxop
- -mlwp
- -m3dnow
- -m3dnowa
- -mpopcnt
- -mabm
- -madx
- -mbmi
- -mbmi2
- -mlzcnt
- -mfxsr
- -mxsave
- -mxsaveopt
- -mxsavec
- -mxsaves
- -mrtm
- -mhle
- -mtbm
- -mmwaitx
- -mclzero
- -mpku
- -mavx512vbmi2
- -mavx512bf16
- -mavx512fp16
- -mgfni
- -mvaes
- -mwaitpkg
- -mvpclmulqdq
- -mavx512bitalg
- -mmovdiri
- -mmovdir64b
- -menqcmd
- -muintr
- -mtsxldtrk
- -mavx512vpopcntdq
- -mavx512vp2intersect
- -mavx512vnni
- -mavxvnni
- -mcldemote
- -mserialize
- -mamx-tile
- -mamx-int8
- -mamx-bf16
- -mhreset
- -mkl
- -mwidekl
- -mavxifma
- -mavxvnniint8
- -mavxneconvert
- -mcmpccxadd
- -mamx-fp16
- -mprefetchi
- -mraoint
- -mamx-complex
- -mavxvnniint16
- -msha512
- -msm4
- -mapxf
- -musermsr
- -mavx10.1
- -mavx10.1-256
- -mavx10.1-512
- -mavx10.2
- -mamx-avx512
- -mamx-tf32
- -mamx-transpose
- -mamx-fp8
- -mmovrs
- -mamx-movrs
- این
سوئیچها
استفاده از
دستورالعملها
را در
مجموعهدستورالعملهای
توسعهیافتهٔ
MMX، SSE، AVX512CD، AVX512VL، AVX512BW،
AVX512DQ، AVX512IFMA، AVX512VBMI، SHA،
AES، PCLMUL، CLFLUSHOPT، CLWB،
FSGSBASE، PTWRITE، RDRND، F16C، FMA،
PCONFIG، WBNOINVD، FMA4، PREFETCHW،
RDPID، RDSEED، SGX، XOP، LWP،
3DNow!، enhanced 3DNow!، POPCNT، ABM،
ADX، BMI، BMI2، LZCNT، FXSR،
XSAVE، XSAVEOPT، XSAVEC، XSAVES، RTM،
HLE، TBM، MWAITX، CLZERO، PKU،
AVX512VBMI2، GFNI، VAES، WAITPKG،
VPCLMULQDQ، AVX512BITALG، MOVDIRI، MOVDIR64B،
AVX512BF16، ENQCMD، AVX512VPOPCNTDQ،
AVX512VNNI، SERIALIZE، UINTR، HRESET،
AMXTILE، AMXINT8، AMXBF16، KL، WIDEKL،
AVXVNNI، AVX512-FP16، AVXIFMA، AVXVNNIINT8،
AVXNECONVERT، CMPCCXADD، AMX-FP16، PREFETCHI،
RAOINT، AMX-COMPLEX، AVXVNNIINT16، SM3،
SHA512، SM4، APX_F، USER_MSR، AVX10.1،
AVX10.2، AMX-AVX512، AMX-TF32، AMX-TRANSPOSE،
AMX-FP8، MOVRS، AMX-MOVRS یا CLDEMOTE
فعال
میکنند. هر
کدام دارای
یک گزینهٔ
متناظر -mno-
برای
غیرفعال
کردن
استفاده از
این
دستورالعملها
هستند.
این افزونهها همچنین به عنوان توابع توکار (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 از این دستورالعملهای توسعهیافته در کد تولیدی استفاده کند. برنامههایی که شناسایی پردازنده (CPU) را در زمان اجرا انجام میدهند باید فایلهای جداگانهای را برای هر معماریِ پشتیبانیشده با استفاده از پرچمهای مناسب کامپایل کنند. بهویژه، فایلی که حاوی کد شناسایی CPU است باید بدون این گزینهها کامپایل شود.
- -mdump-tune-features
- این گزینه به GCC دستور میدهد نامهای ویژگیهای تنظیم عملکرد x86 و تنظیمات پیشفرض را تخلیه کند (dump کند). این نامها میتوانند در -mtune-ctrl=feature-list استفاده شوند.
- -mtune-ctrl=feature-list
- این گزینه برای کنترل دقیق و ریزدانهٔ ویژگیهای تولید کد x86 استفاده میشود. feature-list فهرستی از نامهای feature است که با کاما از هم جدا شدهاند. همچنین -mdump-tune-features را ببینید. در صورت تعیین، اگر پیش از feature علامت ^ نیامده باشد فعال میشود، وگرنه غیرفعال میگردد. -mtune-ctrl=feature-list برای استفادهٔ توسعهدهندگان GCC در نظر گرفته شده است. استفاده از آن ممکن است به مسیرهای کدی منجر شود که با آزمایشها پوشش داده نشدهاند و میتواند بهطور بالقوه به خطاهای داخلی کامپایلر (ICE) یا خطاهای زمان اجرا بیانجامد.
- -mno-default
- این گزینه به GCC دستور میدهد تمام ویژگیهای قابل تنظیم را خاموش کند. همچنین -mtune-ctrl=feature-list و -mdump-tune-features را ببینید.
- -mcld
- این گزینه به GCC دستور میدهد یک دستورالعمل "cld" در پیشدرآمد (prologue) توابعی که از دستورالعملهای رشتهای استفاده میکنند، صادر کند. دستورالعملهای رشتهای برای انتخاب بین حالت افزایش خودکار یا کاهش خودکار به پرچم DF وابستهاند. در حالی که ABI مشخص میکند پرچم DF باید در بدو ورود به تابع پاک شود، برخی از سیستمعاملها با پاک نکردن پرچم DF در توزیعکنندههای استثنای خود این مشخصات را نقض میکنند. گردانندهٔ استثنا ممکن است با پرچم DF تنظیمشده فراخوانی شود، که در صورت استفاده از دستورالعملهای رشتهای منجر به جهتیابی نادرست میشود. این گزینه را میتوان بهطور پیشفرض در اهداف ۳۲ بیتی x86 با پیکربندی GCC از طریق گزینهٔ پیکربندی --enable-cld فعال کرد. در این حالت، تولید دستورالعملهای "cld" را میتوان با گزینهٔ کامپایلر -mno-cld مهار کرد.
- -mvzeroupper
- این گزینه به GCC دستور میدهد پیش از انتقال جریان کنترل به بیرون از تابع، یک دستورالعمل "vzeroupper" صادر کند تا جریمهٔ انتقال از AVX به SSE به حداقل برسد و همچنین توابع ذاتی (intrinsics) غیرضروری "zeroupper" حذف شوند.
- -mprefer-avx128
- این گزینه به GCC دستور میدهد در بردارساز خودکار از دستورالعملهای ۱۲۸ بیتی AVX به جای دستورالعملهای ۲۵۶ بیتی AVX استفاده کند.
- -mprefer-vector-width=opt
- این گزینه به GCC دستور میدهد در دستورالعملها به جای مقدار پیشفرض روی بستر انتخابشده، از عرض بردار opt بیتی استفاده کند.
- -mpartial-vector-fp-math
- این گزینه GCC
را قادر
میسازد تا
عملیات
ممیز
شناوری
تولید کند
که ممکن است
بر مجموعهٔ
پرچمهای
وضعیت ممیز
شناور در
بردارهای
جزئی، که در
آنها
عناصر
بردار در
بخش پایینی
ثبات ۱۲۸
بیتی SSE قرار
دارند،
تأثیر
بگذارد. مگر
اینکه -fno-trapping-math
مشخص شده
باشد،
کامپایلر
رفتار درست
را با
پاکسازی
تمام
عملوندهای
ورودی برای
داشتن صفر
در بخش
بالاییِ
استفادهنشدهٔ
ثبات بردار
تضمین
میکند.
توجه داشته
باشید که با
استفاده از
توابع
توکار یا
اسمبلی
درونخطی
با
آرگومانهای
بردار
جزئی،
مقادیر NaN،
غیرعادی (denormal)
یا نامعتبر
میتوانند
به بخش
بالایی
بردار نشت
کنند و در
صورت فعال
بودن -fno-trapping-math
باعث
مشکلات
احتمالی در
عملکرد
شوند. این
مشکلات را
میتوان با
پاکسازی
دستی بخش
بالایی
ثبات
آرگومان
بردار جزئی
یا با
استفاده از
-mdaz-ftz برای
تنظیم پرچم
denormals-are-zero (DAZ) در ثبات
MXCSR کاهش داد.
این گزینه بهطور پیشفرض فعال است.
- -mmove-max=bits
- این گزینه به GCC دستور میدهد حداکثر تعداد بیتهایی را که میتوان بهطور کارآمد از حافظه به حافظه منتقل کرد روی bits تنظیم کند. مقادیر معتبر bits برابر ۱۲۸، ۲۵۶ و ۵۱۲ هستند.
- -mstore-max=bits
- این گزینه به GCC دستور میدهد حداکثر تعداد بیتهایی را که میتوان بهطور کارآمد در حافظه ذخیره کرد روی bits تنظیم کند. مقادیر معتبر bits برابر ۱۲۸، ۲۵۶ و ۵۱۲ هستند.
- none
- هیچ محدودیت اضافی فراتر از آنچه توسط بستر انتخابشده تعریف شده است برای GCC اعمال نمیشود.
- 128
- ترجیح عرض بردار ۱۲۸ بیتی برای دستورالعملها.
- 256
- ترجیح عرض بردار ۲۵۶ بیتی برای دستورالعملها.
- 512
- ترجیح عرض بردار ۵۱۲ بیتی برای دستورالعملها.
- -mnoreturn-no-callee-saved-registers
- این گزینه توابع دارای ویژگی "noreturn" یا مشخصهگر "_Noreturn" را با ذخیره نکردن ثباتهای ذخیرهشده توسط فراخواندهشونده (callee-saved) که در تابع استفاده شدهاند در پیشدرآمد تابع (بهجز ثبات "BP") بهینهسازی میکند. این گزینه میتواند در اشکالزدایی فراخوانندهٔ تابع "noreturn" یا هر تابع بالاتر در پشتهٔ فراخوانی تداخل ایجاد کند، بنابراین بهطور پیشفرض فعال نیست.
- -mcx16
- این گزینه GCC را قادر میسازد تا دستورالعملهای "CMPXCHG16B" را در کد ۶۴ بیتی جهت پیادهسازی عملیات مقایسه-و-تبادل روی اشیای ۱۲۸ بیتی ترازشده با ۱۶ بایت تولید کند. این برای بهروزرسانیهای اتمیک ساختارهای دادهای که اندازهٔ آنها بیش از یک کلمهٔ ماشین است سودمند است. کامپایلر از این دستورالعمل برای پیادهسازی __sync Builtins استفاده میکند. با این حال، برای __atomic Builtins که روی اعداد صحیح ۱۲۸ بیتی کار میکنند، همواره از یک فراخوانی کتابخانهای استفاده میشود.
- -msahf
- این گزینه تولید دستورالعملهای "SAHF" را در کد ۶۴ بیتی فعال میکند. پردازندههای اولیه Intel Pentium 4 با پشتیبانی Intel 64، پیش از عرضهٔ گام Pentium 4 G1 در دسامبر ۲۰۰۵، فاقد دستورالعملهای "LAHF" و "SAHF" بودند که توسط AMD64 پشتیبانی میشوند. اینها بهترتیب دستورالعملهای بارگذاری و ذخیرهسازی برای برخی پرچمهای وضعیت هستند. در حالت ۶۴ بیتی، دستورالعمل "SAHF" برای بهینهسازی توابع توکار "fmod"، "drem" و "remainder" استفاده میشود؛ برای جزئیات Other Builtins را ببینید..IP -mmovbe 4 این گزینه استفاده از دستورالعمل "movbe" را برای بهینهسازی جابهجایی بایتهای دادههای چهار و هشت بایتی فعال میکند.
- -mshstk
- گزینهٔ -mshstk توابع داخلی (built-in) پشتهٔ سایه (shadow stack) برگرفته از فناوری x86 Control-flow Enforcement Technology (CET) را فعال میکند.
- -mcrc32
- این گزینه توابع داخلی "__builtin_ia32_crc32qi"، "__builtin_ia32_crc32hi"، "__builtin_ia32_crc32si" و "__builtin_ia32_crc32di" را برای تولید دستورالعمل ماشین "crc32" فعال میکند.
- -mmwait
- این گزینه توابع داخلی "__builtin_ia32_monitor" و "__builtin_ia32_mwait" را برای تولید دستورالعملهای ماشین "monitor" و "mwait" فعال میکند.
- -mrecip
- این گزینه
به جای
"DIVSS" و
"SQRTSS" (و
گونههای
برداری
آنها)،
استفاده از
دستورالعملهای
"RCPSS" و
"RSQRTSS" (و
گونههای
برداری
آنها "RCPPS"
و "RSQRTPS") را
همراه با یک
گام اضافی
Newton-Raphson جهت
افزایش دقت
برای
آرگومانهای
ممیز شناور
با دقت
یگانه (single-precision)
فعال
میکند. این
دستورالعملها
تنها زمانی
تولید
میشوند که
-funsafe-math-optimizations
همراه با
-ffinite-math-only و -fno-trapping-math
فعال باشد.
توجه داشته
باشید که
اگرچه توان
عملیاتی (throughput)
این توالی
بالاتر از
دستورالعمل
غیرمعکوس
است، اما
دقت توالی
میتواند
تا ۲ ulp کاهش
یابد (یعنی
معکوس 1.0
برابر با 0.99999994
میشود).
توجه داشته باشید که GCC حتی بدون -mrecip و تنها با -ffast-math (یا ترکیب گزینههای فوق)، "1.0f/sqrtf(x)" را بر حسب "RSQRTSS" (یا "RSQRTPS") پیادهسازی میکند.
همچنین توجه داشته باشید که GCC توالی فوق را همراه با گام اضافی Newton-Raphson برای تقسیم برداری اعشاری با دقت یگانه و sqrtf(x) برداری، تنها با -ffast-math (یا ترکیب گزینههای فوق) صادر میکند و نیازی به -mrecip ندارد.
- -mrecip=opt
- این گزینه تعیین میکند کدامیک از دستورالعملهای برآورد معکوس مجاز به استفاده هستند. opt فهرستی از گزینههاست که با کاما از هم جدا شدهاند، و میتواند با یک ! برای معکوس کردن گزینه پیشوند شود:
- all
- تمام دستورالعملهای تخمینی را فعال میکند.
- default
- دستورالعملهای پیشفرض را فعال میکند که معادل -mrecip است.
- none
- تمام دستورالعملهای تخمینی را غیرفعال میکند که معادل -mno-recip است.
- div
- تقریب را برای تقسیم اسکالر فعال میکند.
- vec-div
- تقریب را برای تقسیم برداری فعال میکند.
- sqrt
- تقریب را برای ریشه دوم اسکالر فعال میکند.
- vec-sqrt
- تقریب را برای ریشه دوم برداری فعال میکند.
بنابراین، به عنوان مثال، -mrecip=all,!sqrt تمامی تقریبهای معکوس را به جز ریشه دوم فعال میکند.
- -mveclibabi=type
- نوع ABI مورد
استفاده
برای
برداریسازی
توابع
درونی (intrinsics) با
استفاده از
یک
کتابخانهٔ
خارجی را
مشخص
میکند.
مقادیر
پشتیبانیشده
برای type
عبارتند از
svml برای
کتابخانهٔ
ریاضی
بردارهای
کوتاه
اینتل، aocl
برای
کتابخانهٔ
ریاضی (LibM) از AMD
Optimizing CPU Libraries (AOCL) و acml
برای
کتابخانهٔ
ریاضی
بازنشستهشدهٔ
AMD core math library (که AOCL-LibM
جانشین آن
است). برای
استفاده از
این گزینه،
هر دو
گزینهٔ -ftree-vectorize
و -funsafe-math-optimizations
باید فعال
باشند، و یک
کتابخانهٔ
سازگار با SVML
یا ACML ABI باید
در زمان
پیوند مشخص
شود.
در حال حاضر GCC فراخوانیهایی به "vmldExp2"، "vmldLn2"، "vmldLog102"، "vmldPow2"، "vmldTanh2"، "vmldTan2"، "vmldAtan2"، "vmldAtanh2"، "vmldCbrt2"، "vmldSinh2"، "vmldSin2"، "vmldAsinh2"، "vmldAsin2"، "vmldCosh2"، "vmldCos2"، "vmldAcosh2"، "vmldAcos2"، "vmlsExp4"، "vmlsLn4"، "vmlsLog104"، "vmlsPow4"، "vmlsTanh4"، "vmlsTan4"، "vmlsAtan4"، "vmlsAtanh4"، "vmlsCbrt4"، "vmlsSinh4"، "vmlsSin4"، "vmlsAsinh4"، "vmlsAsin4"، "vmlsCosh4"، "vmlsCos4"، "vmlsAcosh4" و "vmlsAcos4" برای نوع تابع متناظر در صورت استفاده از -mveclibabi=svml صادر میکند؛ "amd_vrs4_acosf"، "amd_vrs16_acosf"، "amd_vrd8_asin"، "amd_vrs4_asinf"، "amd_vrs8_asinf"، "amd_vrs16_asinf"، "amd_vrd2_atan"، "amd_vrd8_atan"، "amd_vrs4_atanf"، "amd_vrs8_atanf"، "amd_vrs16_atanf"، "amd_vrd2_cos"، "amd_vrd4_cos"، "amd_vrd8_cos"، "amd_vrs4_cosf"، "amd_vrs8_cosf"، "amd_vrs16_cosf"، "amd_vrs4_coshf"، "amd_vrs8_coshf"، "amd_vrd2_erf"، "amd_vrd4_erf"، "amd_vrd8_erf"، "amd_vrs4_erff"، "amd_vrs8_erff"، "amd_vrs16_erff"، "amd_vrd2_exp"، "amd_vrd4_exp"، "amd_vrd8_exp"، "amd_vrs4_expf"، "amd_vrs8_expf"، "amd_vrs16_expf"، "amd_vrd2_exp10"، "amd_vrs4_exp10f"، "amd_vrd2_exp2"، "amd_vrd4_exp2"، "amd_vrd8_exp2"، "amd_vrs4_exp2f"، "amd_vrs8_exp2f"، "amd_vrs16_exp2f"، "amd_vrs4_expm1f"، "amd_vrd2_log"، "amd_vrd4_log"، "amd_vrd8_log"، "amd_vrs4_logf"، "amd_vrs8_logf"، "amd_vrs16_logf"، "amd_vrd2_log10"، "amd_vrs4_log10f"، "amd_vrs8_log10f"، "amd_vrs16_log10f"، "amd_vrd2_log1p"، "amd_vrs4_log1pf"، "amd_vrd2_log2"، "amd_vrd4_log2"، "amd_vrd8_log2"، "amd_vrs4_log2f"، "amd_vrs8_log2f"، "amd_vrs16_log2f"، "amd_vrd2_pow"، "amd_vrd4_pow"، "amd_vrd8_pow"، "amd_vrs4_powf"، "amd_vrs8_powf"، "amd_vrs16_powf"، "amd_vrd2_sin"، "amd_vrd4_sin"، "amd_vrd8_sin"، "amd_vrs4_sinf"، "amd_vrs8_sinf"، "amd_vrs16_sinf"، "amd_vrd2_tan"، "amd_vrd4_tan"، "amd_vrd8_tan"، "amd_vrs16_tanf"، "amd_vrs4_tanhf"، "amd_vrs8_tanhf"، "amd_vrs16_tanhf" را برای نوع تابع متناظر در صورت استفاده از -mveclibabi=aocl؛ و "__vrd2_sin"، "__vrd2_cos"، "__vrd2_exp"، "__vrd2_log"، "__vrd2_log2"، "__vrd2_log10"، "__vrs4_sinf"، "__vrs4_cosf"، "__vrs4_expf"، "__vrs4_logf"، "__vrs4_log2f"، "__vrs4_log10f" و "__vrs4_powf" را برای نوع تابع متناظر در صورت استفاده از -mveclibabi=acml صادر میکند.
- -mabi=name
- تولید کد برای قرارداد فراخوانی (calling convention) مشخصشده. مقادیر مجاز عبارتند از sysv برای ABI استفادهشده در GNU/Linux و سایر سیستمها، و ms برای Microsoft ABI. حالت پیشفرض استفاده از Microsoft ABI هنگام هدف قرار دادن Microsoft Windows و استفاده از SysV ABI روی سایر سیستمهاست. میتوانید این رفتار را برای توابع خاص با استفاده از ویژگیهای تابع "ms_abi" و "sysv_abi" کنترل کنید.
- -mforce-indirect-call
- تمام فراخوانیهای توابع را مجبور به غیرمستقیم بودن میکند. این گزینه هنگام استفاده از Intel Processor Trace سودمند است چرا که اطلاعات زمانبندی دقیقتری برای فراخوانیهای توابع تولید میکند.
- -mmanual-endbr
- دستورالعمل ENDBR را در ابتدای تابع تنها از طریق ویژگی تابع "cf_check" درج میکند. این گزینه زمانی که همراه با گزینهٔ -fcf-protection=branch استفاده شود، برای کنترل درج ENDBR در ابتدای تابع سودمند است.
- -mcet-switch
- بهطور پیشفرض، ابزار دقیق CET روی عبارتهای switch که از یک جدول پرش استفاده میکنند خاموش است و ردیابی شاخههای غیرمستقیم غیرفعال است. از آنجا که جدولهای پرش در حافظهٔ فقطخواندنی نگهداری میشوند، این امر منجر به از دست رفتن مستقیم سختسازی امنیتی نمیشود. اما اگر اندیس جدول پرش در کنترل مهاجم باشد، پرش غیرمستقیم ممکن است توسط CET محدود نشود. این گزینه ابزار دقیق CET را روشن میکند تا ردیابی شاخههای غیرمستقیم برای عبارتهای switch دارای جدول پرش فعال شود که باعث میشود اهداف پرش از طریق هر پرش غیرمستقیمی قابل دسترس باشند.
- -mcall-ms2sysv-xlogues
- به دلیل تفاوتهای موجود در ABIهای ۶۴ بیتی، هر تابع با Microsoft ABI که یک تابع با System V ABI را فراخوانی میکند باید ثباتهای RSI، RDI و XMM6-15 را به عنوان مخدوششده (clobbered) در نظر بگیرد. بهطور پیشفرض، کد ذخیره و بازیابی این ثباتها به صورت درونخطی صادر میشود، که منجر به پیشدرآمدها و پسدرآمدهای نسبتاً طولانی میشود. استفاده از -mcall-ms2sysv-xlogues پیشدرآمدها و پسدرآمدهایی تولید میکند که از تکهکدهای رابط (stubs) در بخش ایستای libgcc برای انجام این ذخیره و بازیابیها استفاده میکنند، در نتیجه اندازهٔ تابع را به بهای چند دستورالعمل اضافی کاهش میدهد.
- -mtls-dialect=type
- تولید کد برای دسترسی به حافظهٔ محلی نخ (thread-local storage) با استفاده از قراردادهای gnu یا gnu2. مقدار gnu پیشفرض محافظهکارانه است؛ gnu2 کارآمدتر است، اما ممکن است نیازمندیهای زمان ترجمه و زمان اجرایی اضافه کند که روی همهٔ سیستمها قابل برآورده شدن نباشد.
- -mpush-args
- -mno-push-args
- از عملیاتهای PUSH برای ذخیرهٔ پارامترهای خروجی استفاده میکند. این روش کوتاهتر و معمولاً به همان سرعت روش مبتنی بر عملیاتهای SUB/MOV است و بهطور پیشفرض فعال میباشد. در برخی موارد غیرفعال کردن آن ممکن است به دلیل بهبود زمانبندی و کاهش وابستگیها، کارایی را بهبود بخشد..IP -maccumulate-outgoing-args 4 در صورت فعال بودن، بیشترین فضای مورد نیاز برای آرگومانهای خروجی در دیباچهٔ تابع (prologue) محاسبه میشود. این کار در اکثر پردازندههای مدرن به دلیل کاهش وابستگیها، زمانبندی بهبودیافته و کاهش استفاده از پشته در حالتی که مرز ترجیحی پشته برابر با ۲ نباشد، سریعتر است. عیب آن افزایش قابل توجه اندازه کد است. این گزینه -mno-push-args را نیز در بر دارد.
- -mthreads
- پشتیبانی از مدیریت استثنای امن در برابر ریسه (thread-safe) در MinGW. برنامههایی که به مدیریت استثنای thread-safe متکی هستند باید تمام کدها را با گزینهٔ -mthreads کامپایل و پیوند دهند. هنگام کامپایل، -mthreads ماکروی -D_MT را تعریف میکند؛ هنگام پیوند دادن، یک کتابخانه کمکی ویژه ریسه به نام -lmingwthrd را پیوند میدهد که دادههای مدیریت استثنا به ازای هر ریسه را پاکسازی میکند.
- -mms-bitfields
- -mno-ms-bitfields
- فعال/غیرفعال
کردن
چیدمان
میدانبیتی
(bit-field) سازگار
با
کامپایلر
بومی Microsoft Windows.
اگر "packed" روی یک ساختار به کار رود، یا اگر از میدانهای بیتی استفاده شود، ممکن است ABI مایکروسافت ساختار را متفاوت از روش معمول GCC بچیند. بهویژه هنگام جابهجایی دادههای فشرده (packed) میان توابع کامپایلشده با GCC و کامپایلر بومی مایکروسافت (چه از طریق فراخوانی تابع یا به صورت داده در یک فایل)، ممکن است دسترسی به هر یک از قالبها لازم باشد.
این گزینه به صورت پیشفرض برای مقصدهای Microsoft Windows فعال است. این رفتار همچنین میتواند به صورت محلی با استفاده از ویژگیهای متغیر یا نوع کنترل شود. برای اطلاعات بیشتر، x86 Variable Attributes و x86 Type Attributes را ببینید.
الگوریتم چیدمان ساختار در مایکروسافت، به استثنای بستهبندی میدانهای بیتی، نسبتاً ساده است. فاصلهگذاری (padding) و همترازی اعضای ساختارها و اینکه آیا یک میدانبیتی میتواند از مرز یک واحد ذخیرهسازی عبور کند یا خیر، با این قوانین تعیین میشود:
- ۱. اعضای ساختار به صورت متوالی و به همان ترتیبی که
- اعلان شدهاند ذخیره میشوند: اولین عضو کمترین نشانی حافظه و آخرین عضو بیشترین نشانی را دارد.
- ۲. هر شیء داده نیازمندی همترازی دارد. نیازمندی همترازی
- برای تمام
دادهها به
جز
ساختارها،
اجتماعها
و
آرایهها،
اندازه شیء
یا اندازه
بستهبندی
فعلی است
(که با
ویژگی
"aligned" یا
عملیافت
"pack" مشخص
میشود)، هر
کدام که
کمتر باشد.
برای
ساختارها،
اجتماعها
و
آرایهها،
نیازمندی
همترازی
بزرگترین
نیازمندی
همترازی
اعضای آن
است. به هر
شیء یک آفست
اختصاص
مییابد
بهطوریکه:
offset % alignment_requirement == 0
- ۳. میدانهای بیتی مجاور در یک واحد تخصیص ۱، ۲ یا ۴ بایتی
- بستهبندی میشوند در صورتی که انواع عدد صحیح دارای اندازه یکسان باشند و میدانبیتی بعدی بدون عبور از مرز تحمیلشده توسط نیازمندیهای همترازی مشترک میدانهای بیتی، در واحد تخصیص فعلی جا شود.
کامپایلر MSVC میدانهای بیتی با طول صفر را به روشهای زیر تفسیر میکند:
- ۱. اگر یک میدانبیتی با طول صفر میان دو میدانبیتی که
- به طور عادی
ادغام
میشوند
درج شود، آن
میدانهای
بیتی ادغام
نخواهند شد.
برای نمونه:
struct { unsigned long bf_1 : 12; unsigned long : 0; unsigned long bf_2 : 12; } t1;اندازه "t1" با وجود میدانبیتی با طول صفر، ۸ بایت است. اگر این میدانبیتی با طول صفر حذف میشد، اندازه "t1" برابر با ۴ بایت میبود.
- ۲. اگر یک میدانبیتی با طول صفر پس از یک میدانبیتی، "foo"، درج شود و
- همترازی
میدانبیتی
با طول صفر
بزرگتر از
عضوی باشد
که پس از آن
میآید،
"bar"،
آنگاه
"bar"
مطابق نوع
میدانبیتی
با طول صفر
همتراز
میشود.
برای نمونه:
struct { char foo : 4; short : 0; char bar; } t2; struct { char foo : 4; short : 0; double bar; } t3;برای "t2"، عضو "bar" به جای آفست ۱، در آفست ۲ قرار میگیرد. بر همین اساس، اندازه "t2" برابر ۴ است. برای "t3"، میدانبیتی با طول صفر تأثیری بر همترازی "bar" و در نتیجه بر اندازه ساختار نمیگذارد.
با در نظر گرفتن این نکته، توجه به موارد زیر اهمیت دارد:
- ۱. اگر یک میدانبیتی با طول صفر پس از یک میدانبیتی عادی بیاید، نوع
- میدانبیتی با طول صفر ممکن است بر همترازی کل ساختار تأثیر بگذارد. برای نمونه، "t2" اندازهای برابر با ۴ بایت دارد، زیرا میدانبیتی با طول صفر پس از یک میدانبیتی عادی آمده و از نوع short است.
- ۲. حتی اگر به دنبال میدانبیتی با طول صفر یک میدانبیتی عادی نیامده باشد، همچنان
- ممکن است بر
همترازی
ساختار
تأثیر
بگذارد:
struct { char foo : 6; long : 0; } t4;در اینجا، "t4" معادل ۴ بایت فضا اشغال میکند.
- ۳. میدانهای بیتی با طول صفر که پس از اعضای غیر میدانبیتی میآیند نادیده گرفته میشوند:
-
struct { char foo; long : 0; char bar; } t5;در اینجا، "t5" معادل ۲ بایت فضا اشغال میکند.
- -mno-align-stringops
- مقصد عملیاتهای رشتهای درونخطیشده را همتراز نمیکند. این سوئیچ اندازه کد را کاهش داده و در صورتی که مقصد از قبل همتراز شده باشد اما GCC از آن مطلع نباشد، کارایی را بهبود میبخشد.
- -minline-all-stringops
- به صورت پیشفرض، GCC عملیاتهای رشتهای را تنها زمانی درونخطی میکند که مشخص باشد مقصد دستکم روی یک مرز ۴ بایتی همتراز است. این گزینه درونخطیسازی بیشتری را ممکن ساخته و اندازه کد را افزایش میدهد، اما ممکن است کارایی کدهایی را که برای طولهای کوتاه به سرعت بالای "memcpy" و "memset" وابستهاند، بهبود بخشد. این گزینه بسط درونخطی "strlen" را برای تمامی همترازیهای اشارهگر فعال میکند.
- -minline-stringops-dynamically
- برای عملیاتهای رشتهای با اندازه نامشخص، از بررسیهای زمان اجرا همراه با کد درونخطی برای بلوکهای کوچک و فراخوانی کتابخانه برای بلوکهای بزرگ استفاده میکند.
- -mstringop-strategy=alg
- روش ابتکاری (heuristic) تصمیمگیری داخلی را برای الگوریتم خاص مورد استفاده جهت درونخطیسازی عملیاتهای رشتهای بازنویسی (override) میکند. مقادیر مجاز برای alg عبارتند از:
- -mmemcpy-strategy=strategy
- قواعد اکتشافی تصمیمگیری داخلی را برای تعیین اینکه آیا "__builtin_memcpy" باید به صورت درونخطی جایگذاری شود یا خیر، و اینکه هنگام مشخص بودن اندازه مورد انتظار عملیات کپی از چه الگوریتم درونخطیای استفاده شود، بازنویسی میکند. strategy فهرستی از سهگانههای alg:max_size:dest_align است که با کاما از یکدیگر جدا شدهاند. alg در -mstringop-strategy مشخص میشود، و max_size حداکثر اندازه بر حسب بایت را مشخص میکند که الگوریتم درونخطی alg مجاز به استفاده برای آن است. برای آخرین سهگانه، مقدار max_size باید -1 باشد. مقادیر max_size در سهگانههای این فهرست باید به ترتیب صعودی مشخص شوند. حداقل اندازه بر حسب بایت برای alg برای اولین سهگانه برابر با 0 و برای بازههای بعدی برابر با "max_size + 1" از بازه قبلی است.
- -mmemset-strategy=strategy
- این گزینه مشابه -mmemcpy-strategy= است، با این تفاوت که برای کنترل بسط یافتن "__builtin_memset" به کار میرود.
- -momit-leaf-frame-pointer
- اشارهگر چارچوب (frame pointer) را در یک ثبات برای توابع برگ (leaf functions) نگه نمیدارد. این کار از دستورالعملهای ذخیره، راهاندازی و بازیابی اشارهگرهای چارچوب جلوگیری میکند و یک ثبات اضافی را در توابع برگ در دسترس قرار میدهد. گزینهٔ -fomit-leaf-frame-pointer اشارهگر چارچوب را برای توابع برگ حذف میکند، که ممکن است اشکالزدایی را دشوارتر سازد.
- -mtls-direct-seg-refs
- -mno-tls-direct-seg-refs
- کنترل
میکند که
آیا
متغیرهای TLS
با آفستها
از ثبات
سگمنت TLS (%gs
برای ۳۲
بیتی، %fs
برای ۶۴
بیتی) قابل
دسترس
باشند یا
باید
اشارهگر
پایه رشته (thread
base pointer) اضافه
شود. معتبر
بودن یا
نبودن این
مورد بستگی
به
سیستمعامل
و اینکه آیا
سگمنت را
طوری نگاشت
میکند که
کل ناحیه TLS
را پوشش دهد
دارد.
برای سیستمهایی که از GNU C Library استفاده میکنند، حالت پیشفرض روشن است.
- -msse2avx
- -mno-sse2avx
- مشخص میکند که اسمبلر باید دستورالعملهای SSE را با پیشوند VEX کدگذاری کند. گزینه -mavx این ویژگی را به طور پیشفرض فعال میکند.
- -mfentry
- -mno-fentry
- اگر پروفایلسازی (profiling) فعال باشد (-pg)، فراخوانی شمارنده پروفایلسازی را قبل از مقدمه تابع (prologue) قرار میدهد. نکته: در معماریهای x86، صفت "ms_hook_prologue" در حال حاضر برای -mfentry و -pg امکانپذیر نیست.
- -mrecord-mcount
- -mno-record-mcount
- اگر پروفایلسازی فعال باشد (-pg)، یک بخش __mcount_loc تولید میکند که حاوی اشارهگرهایی به هر فراخوانی پروفایلسازی است. این گزینه برای وصلهکردن خودکار فراخوانیها به درون و بیرون مفید است.
- -mnop-mcount
- -mno-nop-mcount
- اگر پروفایلسازی فعال باشد (-pg)، فراخوانیها به توابع پروفایلسازی را به صورت NOP تولید میکند. این ویژگی زمانی مفید است که بخواهید بعداً آنها را به صورت پویا وصله کنید. این گزینه احتمالاً فقط همراه با -mrecord-mcount کاربرد دارد.
- -minstrument-return=type
- خروج از تابع را در توابع ابزاردقیقشده با -pg -mfentry با یک فراخوانی به تابع مشخصشده ابزاردقیق (instrument) میکند. این کار فقط بازگشتهای واقعی منتهی به ret را ابزاردقیق میکند، نه فراخوانیهای همسطح منتهی به jump. انواع معتبر عبارتند از: none برای عدم ابزاردقیق، call برای ایجاد فراخوانی به __return__، یا nop5 برای ایجاد یک nop پنج بایتی.
- -mrecord-return
- -mno-record-return
- یک بخش __return_loc ایجاد میکند که به تمام کدهای ابزاردقیق بازگشت اشاره دارد.
- -mfentry-name=name
- نام نماد __fentry__ را که در ورودی تابع برای توابع -pg -mfentry فراخوانی میشود تنظیم میکند.
- -mfentry-section=name
- نام بخش برای ثبت فراخوانیهای -mrecord-mcount را تنظیم میکند (پیشفرض __mcount_loc).
- -mskip-rax-setup
- -mno-skip-rax-setup
- هنگام
تولید کد
برای
معماری x86-64 با
افزونههای
SSE غیرفعال،
میتوان از
-mskip-rax-setup
استفاده
کرد تا در
صورتی که
هیچ
آرگومان
متغیری در
ثباتهای
برداری
منتقل
نشود، از
راهاندازی
ثبات RAX
صرفنظر
شود.
هشدار: از آنجا که ثبات RAX برای جلوگیری از ذخیره غیرضروری ثباتهای برداری روی پشته هنگام ارسال آرگومانهای متغیر استفاده میشود، پیامدهای این گزینه این است که توابع فراخوانیشده ممکن است مقداری از فضای پشته را هدر دهند، عملکرد نادرست داشته باشند یا به یک مکان تصادفی پرش کنند. کامپایلر GCC 4.4 یا جدیدتر صرفنظر از مقدار ثبات RAX این مشکلات را ندارند.
- -m8bit-idiv
- -mno-8bit-idiv
- در برخی پردازندهها، مانند Intel Atom، تقسیم عدد صحیح بدون علامت ۸ بیتی بسیار سریعتر از تقسیم عدد صحیح ۳۲ بیتی یا ۶۴ بیتی است. این گزینه یک بررسی زمان اجرا تولید میکند. اگر مقسوم و مقسومعلیه هر دو در محدوده 0 تا 255 باشند، تقسیم عدد صحیح بدون علامت ۸ بیتی به جای تقسیم ۳۲ بیتی یا ۶۴ بیتی استفاده میشود.
- -mavx256-split-unaligned-load
- -mavx256-split-unaligned-store
- بارگذاری و ذخیرهسازی غیرتراز ۳۲ بایتی AVX را تقسیم میکند.
- -mstack-protector-guard=guard
- -mstack-protector-guard-reg=reg
- -mstack-protector-guard-offset=offset
- -mstack-protector-guard-symbol=symbol
- کد محافظت
از پشته را
با استفاده
از قناری (canary)
در guard تولید
میکند.
مکانهای
پشتیبانیشده
عبارتند از
global برای
قناری
سراسری یا
tls برای
قناری به
ازای هر
رشته در
بلوک TLS
(پیشفرض).
این گزینه
فقط زمانی
تأثیر دارد
که -fstack-protector یا
-fstack-protector-all مشخص
شده باشد.
با انتخاب حالت دوم، گزینههای -mstack-protector-guard-reg=reg و -mstack-protector-guard-offset=offset علاوهبراین مشخص میکنند که از کدام ثبات سگمنت (%fs یا %gs) به عنوان ثبات پایه برای خواندن قناری استفاده شود، و با چه آفستی از آن ثبات پایه. مقدار پیشفرض این موارد مطابق با آنچه در ABI مربوطه آمده تعیین میشود.
-mstack-protector-guard-symbol=symbol آفست را با یک ارجاع نمادین به یک قناری در بلوک TLS بازنویسی میکند.
- -mgeneral-regs-only
- کدی تولید میکند که فقط از ثباتهای همهمنظوره استفاده میکند. این کار از استفاده کامپایلر از ثباتهای ممیز شناور، برداری، ماسک و کران جلوگیری میکند.
- -mrelax-cmpxchg-loop
- هنگام ایجاد یک حلقه compare-and-swap برای توابع درونی __sync Builtins و __atomic Builtins که فاقد یک دستورالعمل بومی هستند، از طریق صدور یک بارگذاری اتمیک پیش از دستورالعمل "CMPXCHG" و استفاده از دستورالعمل "PAUSE" برای صرفهجویی در مصرف پردازنده هنگام شروع مجدد حلقه، کد را برای شرایط پررقابت بهینهسازی میکند.
- -mindirect-branch=choice
- فراخوانی و
پرش
غیرمستقیم
را با choice
تبدیل
میکند.
پیشفرض keep
است که
فراخوانی و
پرش
غیرمستقیم
را بدون
تغییر نگه
میدارد. thunk
فراخوانی و
پرش
غیرمستقیم
را به
فراخوانی و
بازگشت thunk
تبدیل
میکند. thunk-inline
فراخوانی و
پرش
غیرمستقیم
را به
فراخوانی و
بازگشت thunk
درونخطی
تبدیل
میکند. thunk-extern
فراخوانی و
پرش
غیرمستقیم
را به
فراخوانی و
بازگشت thunk
خارجی
ارائهشده
در یک فایل
شیء
جداگانه
تبدیل
میکند.
میتوانید
این رفتار
را برای یک
تابع خاص با
استفاده از
صفت تابع
"indirect_branch"
کنترل کنید.
توجه داشته باشید که -mcmodel=large با -mindirect-branch=thunk و -mindirect-branch=thunk-extern ناسازگار است زیرا تابع thunk ممکن است در مدل کد بزرگ قابل دسترس نباشد.
توجه داشته باشید که -mindirect-branch=thunk-extern با -fcf-protection=branch سازگار است زیرا میتوان thunk خارجی را طوری تنظیم کرد که بررسی جریان کنترل را فعال کند..IP -mfunction-return=choice 4 بازگشت از تابع (function return) را با choice تبدیل میکند. پیشفرض keep است که بازگشت تابع را بدون تغییر نگه میدارد. thunk بازگشت تابع را به فراخوانی و بازگشت thunk تبدیل میکند. thunk-inline بازگشت تابع را به یک فراخوانی و بازگشت thunk درونخطی تبدیل مینماید. thunk-extern بازگشت تابع را به فراخوانی و بازگشت خارجی thunk ارائهشده در یک فایل شیء (object file) جداگانه تبدیل میکند. میتوانید این رفتار را برای یک تابع خاص با استفاده از ویژگی تابع "function_return" کنترل کنید.
توجه داشته باشید که -mindirect-return=thunk-extern با -fcf-protection=branch سازگار است، زیرا thunk خارجی را میتوان بهگونهای ساخت که بررسی جریان کنترل (control-flow check) را فعال کند.
توجه داشته باشید که -mcmodel=large با -mfunction-return=thunk و -mfunction-return=thunk-extern ناسازگار است، چرا که ممکن است تابع thunk در مدل کد بزرگ (large code model) در دسترس نباشد.
- -mindirect-branch-register
- فراخوانی و پرش غیرمستقیم را از طریق ثبات (register) اجبار میکند.
- -mharden-sls=choice
- کدی برای کاهش خطرات گمانهزنی خط مستقیم (SLS) با مقدار choice تولید میکند. پیشفرض none است که تمام مقاومسازیهای SLS را غیرفعال میکند. مقدار return مقاومسازی SLS را برای بازگشت توابع فعال میکند. مقدار indirect-jmp مقاومسازی SLS را برای پرشهای غیرمستقیم فعال میسازد. مقدار all تمام مقاومسازیهای SLS را فعال میکند.
- -mindirect-branch-cs-prefix
- پیشوند CS را به call و jmp به سمت thunk غیرمستقیم با هدف انشعاب در ثباتهای r8-r15 اضافه میکند تا طول دستورات call و jmp به ۶ بایت برسد و امکان جایگزینی آنها با lfence; call *%r8-r15 یا lfence; jmp *%r8-r15 در زمان اجرا فراهم شود.
- -mapx-inline-asm-use-gpr32
- برای پشتیبانی از inline asm با APX، بهطور پیشفرض قابلیت EGPR غیرفعال شده است تا از بروز دستورهای غیرمجاز احتمالی با EGPR جلوگیری شود. برای بهکارگیری egpr در inline asm، از گزینهٔ جدید کامپایلر -mapx-inline-asm-use-gpr32 استفاده کنید؛ کاربر باید اطمینان حاصل کند که دستور مربوطه از EGPR پشتیبانی میکند.
- -mevex512
- -mno-evex512
- بردار ۵۱۲ بیتی را فعال/غیرفعال میکند. در صورت فعال بودن AVX512F، بهطور پیشفرض فعال خواهد بود.
این سوئیچهای -m علاوهبر موارد بالا، روی پردازندههای x86-64 در محیطهای ۶۴ بیتی پشتیبانی میشوند.
- -m32
- -m64
- -mx32
- -m16
- -miamcu
- کد را برای
یک محیط ۱۶
بیتی، ۳۲
بیتی یا ۶۴
بیتی تولید
میکند.
گزینهٔ -m32
انواع
"int"،
"long" و
اشارهگر
را روی ۳۲
بیت تنظیم
میکند و
کدی تولید
مینماید
که در حالت
۳۲ بیتی
اجرا
میشود.
گزینهٔ -m64 نوع "int" را روی ۳۲ بیت و انواع "long" و اشارهگر را روی ۶۴ بیت تنظیم میکند، و برای معماری x86-64 کد تولید مینماید. تنها برای Darwin، گزینهٔ -m64 همچنین گزینههای -fno-pic و -mdynamic-no-pic را غیرفعال میکند.
گزینهٔ -mx32 انواع "int"، "long" و اشارهگر را روی ۳۲ بیت تنظیم میکند و برای معماری x86-64 کد تولید مینماید.
گزینهٔ -m16 همانند -m32 است، بهجز اینکه دستورالعمل اسمبلی ".code16gcc" را در ابتدای خروجی اسمبلی درج میکند تا فایل باینری بتواند در حالت ۱۶ بیتی اجرا شود.
گزینهٔ -miamcu کدی مطابق با Intel MCU psABI تولید میکند. این گزینه مستلزم فعال بودن گزینهٔ -m32 است.
- -mno-red-zone
- از اصطلاحاً «منطقه سرخ» (red zone) برای کد x86-64 استفاده نمیکند. منطقه سرخ توسط ABI معماری x86-64 الزامی شده است؛ این ناحیه فضایی ۱۲۸ بایتی فراتر از مکان اشارهگر پشته (stack pointer) است که توسط گردانندههای سیگنال یا وقفه تغییر نمیکند و بنابراین میتواند برای دادههای موقت بدون نیاز به تنظیم اشارهگر پشته استفاده شود. پرچم -mno-red-zone این منطقه سرخ را غیرفعال میکند.
- -mcmodel=small
- برای مدل کد کوچک (small code model) کد تولید میکند: برنامه و نمادهای آن باید در ۲ گیگابایت پایینی فضای آدرس پیوند (link) داده شوند. اشارهگرها ۶۴ بیتی هستند. برنامهها میتوانند بهصورت ایستا یا پویا پیوند داده شوند. این مدل کد پیشفرض است.
- -mcmodel=kernel
- برای مدل کد هسته (kernel code model) کد تولید میکند. هسته در ۲ گیگابایت منفی فضای آدرس اجرا میشود. این مدل باید برای کد هستهٔ Linux استفاده شود.
- -mcmodel=medium
- برای مدل متوسط (medium model) کد تولید میکند: برنامه در ۲ گیگابایت پایینی فضای آدرس پیوند میخورد. نمادهای کوچک نیز در آنجا قرار میگیرند. نمادهایی با اندازههای بزرگتر از -mlarge-data-threshold در بخشهای داده بزرگ یا BSS قرار داده میشوند و میتوانند بالای ۲ گیگابایت قرار گیرند. برنامهها میتوانند بهصورت ایستا یا پویا پیوند داده شوند.
- -mcmodel=large
- برای مدل بزرگ (large model) کد تولید میکند. این مدل هیچ فرضی دربارهٔ آدرسها و اندازههای بخشها در نظر نمیگیرد.
- -maddress-mode=long
- برای حالت آدرسدهی بلند (long address mode) کد تولید میکند. این گزینه فقط برای محیطهای ۶۴ بیتی و x32 پشتیبانی میشود. این حالت، حالت آدرسدهی پیشفرض برای محیطهای ۶۴ بیتی است.
- -maddress-mode=short
- برای حالت آدرسدهی کوتاه (short address mode) کد تولید میکند. این گزینه فقط برای محیطهای ۳۲ بیتی و x32 پشتیبانی میشود. این حالت، حالت آدرسدهی پیشفرض برای محیطهای ۳۲ بیتی و x32 است.
- -mneeded
- -mno-needed
- مشخصهٔ GNU_PROPERTY_X86_ISA_1_NEEDED را برای هدف Linux منتشر میکند تا سطح ریزمعماری 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 (ماسکگذاری آدرس خطی) امکان استفاده از بیتهای خاصی در اشارهگر را برای فراداده (metadata) فراهم میسازد. مقدار پیشفرض none است. با u48، بیتهای موقعیتهای ۶۲:۴۸ اشارهگر میتوانند برای فراداده استفاده شوند؛ با u57، بیتهای موقعیتهای ۶۲:۵۷ اشارهگر میتوانند برای فراداده بهکار روند.
گزینههای x86 ویندوز (x86 Windows Options)
گزینههای Xstormy16 (Xstormy16 Options)
این گزینهها برای Xstormy16 تعریف شدهاند:
- -msim
- فایلهای راهاندازی (startup files) و اسکریپت پیونددهندهٔ مناسب برای شبیهساز را انتخاب میکند.
گزینههای Xtensa (Xtensa Options)
این گزینهها برای اهداف Xtensa پشتیبانی میشوند:
- -mconst16
- -mno-const16
- استفاده از دستورهای "CONST16" را برای بارگذاری مقادیر ثابت فعال یا غیرفعال میکند. دستور "CONST16" در حال حاضر یک گزینهٔ استاندارد از سوی Tensilica نیست. در صورت فعال بودن، دستورهای "CONST16" همواره بهجای دستورهای استاندارد "L32R" استفاده میشوند. استفاده از "CONST16" تنها در صورتی بهطور پیشفرض فعال است که دستور "L32R" در دسترس نباشد..IP -mfused-madd 4
- -mno-fused-madd
- فعال یا غیرفعال کردن استفاده از دستورالعملهای ضرب/جمع و ضرب/تفریق ادغامشده در گزینهٔ ممیز شناور. اگر گزینهٔ ممیز شناور نیز فعال نباشد، این گزینه اثری ندارد. غیرفعال کردن دستورالعملهای ضرب/جمع و ضرب/تفریق ادغامشده، کامپایلر را ملزم به استفاده از دستورالعملهای جداگانه برای عملیاتهای ضرب و جمع/تفریق میکند. این کار ممکن است در مواردی که نتایج کاملاً منطبق بر استاندارد IEEE 754 مورد نیاز است، مطلوب باشد: دستورالعملهای ضرب و جمع/تفریق ادغامشده نتیجهٔ میانی را گرد نمیکنند، بنابراین نتایجی با بیتهای دقت بیشتر از آنچه استاندارد IEEE تعیین کرده تولید میکنند. همچنین غیرفعال کردن دستورالعملهای ادغامشدهٔ ضرب و جمع/تفریق تضمین میکند که خروجی برنامه به توانایی کامپایلر در ادغام عملیاتهای ضرب و جمع/تفریق وابسته نباشد.
- -mserialize-volatile
- -mno-serialize-volatile
- هنگامی که این گزینه فعال باشد، GCC دستورالعملهای "MEMW" را پیش از ارجاعات حافظهٔ "volatile" درج میکند تا سازگاری ترتیبی را تضمین کند. مقدار پیشفرض -mserialize-volatile است. برای حذف دستورالعملهای "MEMW" از -mno-serialize-volatile استفاده کنید.
- -mforce-no-pic
- برای مقصدهایی مانند GNU/Linux که در آنها تمام کدهای حالت کاربری (user-mode) در Xtensa باید کد مستقل از موقعیت (PIC) باشند، این گزینه PIC را برای کامپایل کد کرنل غیرفعال میکند.
- -mtext-section-literals
- -mno-text-section-literals
- این گزینهها نحوهٔ مدیریت استخرهای لیترال (literal pools) را کنترل میکنند. مقدار پیشفرض -mno-text-section-literals است که لیترالها را در یک بخش جداگانه در فایل خروجی قرار میدهد. این کار اجازه میدهد استخر لیترال در RAM/ROM داده قرار گیرد و همچنین به پیونددهنده اجازه میدهد تا استخرهای لیترال را از فایلهای شیءِ (object) مجزا ترکیب کند تا لیترالهای تکراری حذف شوند و اندازهٔ کد بهبود یابد. با -mtext-section-literals، لیترالها در بخش text پراکنده میشوند تا در نزدیکترین حالت ممکن به ارجاعات خود قرار گیرند. این امر ممکن است برای فایلهای اسمبلی بزرگ ضروری باشد. لیترالهای هر تابع دقیقاً پیش از همان تابع قرار میگیرند.
- -mauto-litpools
- -mno-auto-litpools
- این گزینهها نحوهٔ مدیریت استخرهای لیترال را کنترل میکنند. مقدار پیشفرض -mno-auto-litpools است که لیترالها را در یک بخش مجزا در فایل خروجی قرار میدهد، مگر آنکه از -mtext-section-literals استفاده شود. با -mauto-litpools، لیترالها توسط اسمبلر در بخش text پراکنده میشوند. کامپایلر دستورهای صریح ".literal" تولید نمیکند و لیترالها را به جای "L32R" با دستورالعملهای "MOVI" در ثباتها بارگذاری میکند تا به اسمبلر اجازه دهد تنظیم مجدد (relaxation) را انجام داده و لیترالها را در صورت نیاز جایگذاری کند. این گزینه به اسمبلر امکان میدهد چندین استخر لیترال به ازای هر تابع ایجاد کند و توابع بسیار بزرگ را اسمبل نماید، چیزی که ممکن است با -mtext-section-literals امکانپذیر نباشد.
- -mtarget-align
- -mno-target-align
- هنگامی که این گزینه فعال باشد، GCC به اسمبلر دستور میدهد تا دستورالعملها را بهطور خودکار تراز کند تا جریمههای انشعاب به بهای از دست رفتن مقداری از تراکم کد کاهش یابد. اسمبلر تلاش میکند دستورالعملهای تراکم (density instructions) را تعریض کند تا مقصدهای انشعاب و دستورالعملهای پس از دستورهای فراخوانی تراز شوند. اگر دستورالعملهای تراکم امن پیشینِ کافی برای تراز کردن یک مقصد وجود نداشته باشد، هیچ تعریضی انجام نمیشود. مقدار پیشفرض -mtarget-align است. این گزینهها بر نحوهٔ برخورد با دستورالعملهای خودتراز مانند "LOOP" تأثیری ندارند؛ اسمبلر همیشه آنها را چه با تعریض دستورالعملهای تراکم و چه با درج دستورالعملهای NOP تراز میکند.
- -mlongcalls
- -mno-longcalls
- هنگامی که این گزینه فعال باشد، GCC به اسمبلر دستور میدهد تا فراخوانیهای مستقیم را به فراخوانیهای غیرمستقیم تبدیل کند، مگر آنکه بتواند تعیین کند که مقصد فراخوانی مستقیم در محدودهٔ مجاز دستور فراخوانی است. این تبدیل معمولاً برای فراخوانی توابع در فایلهای منبع دیگر رخ میدهد. بهطور مشخص، اسمبلر یک دستور مستقیم "CALL" را به یک دستور "L32R" و به دنبال آن یک دستور "CALLX" ترجمه میکند. مقدار پیشفرض -mno-longcalls است. این گزینه باید در برنامههایی استفاده شود که مقصد فراخوانی بالقوه میتواند خارج از محدوده باشد. این گزینه در اسمبلر پیادهسازی شده است، نه در کامپایلر؛ بنابراین کد اسمبلی تولیدشده توسط GCC همچنان دستورالعملهای فراخوانی مستقیم را نشان میدهد---برای دیدن دستورالعملهای واقعی به کد شیء دیساسمبلشده نگاه کنید. توجه داشته باشید که اسمبلر برای هر فراخوانی بینفایلی از یک فراخوانی غیرمستقیم استفاده میکند، نه فقط آنهایی که واقعاً خارج از محدوده هستند.
- -mabi=name
- تولید کد برای ABI مشخصشده. مقادیر مجاز عبارتند از: call0 و windowed. مقدار پیشفرض ABI بر اساس پیکربندی هستهٔ Xtensa انتخاب میشود.
- -mabi=call0
- هنگامی که این گزینه فعال باشد، پارامترهای تابع در ثباتهای "a2" تا "a7" ارسال میشوند، ثباتهای "a12" تا "a15" توسط فراخواننده ذخیره میشوند (caller-saved)، و ثبات "a15" ممکن است به عنوان اشارهگر فریم استفاده شود. هنگامی که این نسخه از ABI فعال باشد، نماد پیشپردازندهٔ C با نام "__XTENSA_CALL0_ABI__" تعریف میشود.
- -mabi=windowed
- هنگامی که این گزینه فعال باشد، پارامترهای تابع در ثباتهای "a10" تا "a15" ارسال میشوند و تابع فراخواندهشده در بدو ورود پنجرهٔ ثبات را ۸ ثبات میچرخاند تا آرگومانهای آن در ثباتهای "a2" تا "a7" قرار گیرند. ثبات "a7" ممکن است به عنوان اشارهگر فریم استفاده شود. پنجرهٔ ثبات هنگام بازگشت، ۸ ثبات به عقب بازگردانده میشود. هنگامی که این نسخه از ABI فعال باشد، نماد پیشپردازندهٔ C با نام "__XTENSA_WINDOWED_ABI__" تعریف میشود.
- -mextra-l32r-costs=n
- هزینهٔ اضافی دسترسی به RAM/ROM دستورالعمل برای دستورالعملهای "L32R" را بر حسب چرخههای ساعت مشخص میکند. این گزینه هنگام بهینهسازی برای سرعت، بر این موضوع تأثیر میگذارد که آیا یک مقدار ثابت از استخر لیترال با استفاده از "L32R" بارگذاری شود یا اینکه آن مقدار ثابت با چند دستورالعمل حسابی از یک مقدار کوچک ساخته شود. مقدار پیشفرض 0 است.
- -mstrict-align
- -mno-strict-align
- جلوگیری یا اجازه دادن به تولید دسترسیهای حافظهای که ممکن است طبق آنچه در مشخصات معماری آمده، روی مرز طبیعی شیء تراز نشده باشند. مقدار پیشفرض برای هستههایی که در سختافزار از هر دو بارگذاری و ذخیرهسازی ترازنشده پشتیبانی میکنند -mno-strict-align و برای تمام هستههای دیگر -mstrict-align است.
گزینههای zSeries
این موارد در ذیل فهرست شدهاند.SH "محیط (ENVIRONMENT)" این بخش چندین متغیر محیطی را توصیف میکند که بر نحوه کارکرد GCC تأثیر میگذارند. برخی از آنها با مشخص کردن دایرکتوریها یا پیشوندهایی که هنگام جستجو برای انواع مختلف فایلها استفاده میشوند، عمل میکنند. برخی دیگر برای تعیین جنبههای دیگر محیط کامپایل به کار میروند.
توجه داشته باشید که میتوانید مکانهای جستجو را با استفاده از گزینههایی مانند -B، -I و -L نیز مشخص کنید. این گزینهها بر مکانهای مشخصشده با متغیرهای محیطی اولویت دارند، و متغیرهای محیطی نیز به نوبه خود بر مکانهای تعیینشده در پیکربندی GCC تقدم دارند.
- LANG
- LC_CTYPE
- LC_MESSAGES
- LC_ALL
- این
متغیرهای
محیطی نحوه
استفاده GCC
از اطلاعات
بومیسازی
را کنترل
میکنند که
به GCC امکان
میدهد با
رسوم و
قواعد محلی
کشورهای
مختلف کار
کند. GCC در
صورتی که
برای این
کار
پیکربندی
شده باشد،
دستههای
محلی LC_CTYPE و
LC_MESSAGES را
بررسی
میکند. این
دستههای
محلی
میتوانند
روی هر
مقداری که
توسط سیستم
نصبشده
شما
پشتیبانی
میشود
تنظیم شوند.
یک مقدار
معمول en_GB.UTF-8
برای زبان
انگلیسی
بریتانیا
با کدگذاری
UTF-8 است.
متغیر محیطی LC_CTYPE ردهبندی نویسهها را مشخص میکند. GCC از آن برای تعیین مرزهای نویسه در یک رشته استفاده میکند؛ این امر برای برخی کدگذاریهای چندبایتی نیاز است که حاوی نویسههای نقلقول و گریز (escape) هستند که در غیر این صورت به عنوان پایان رشته یا گریز تفسیر میشوند.
متغیر محیطی LC_MESSAGES زبانی را مشخص میکند که باید در پیامهای تشخیصی استفاده شود.
اگر متغیر محیطی LC_ALL تنظیم شده باشد، مقدار LC_CTYPE و LC_MESSAGES را بازنویسی میکند؛ در غیر این صورت، LC_CTYPE و LC_MESSAGES به مقدار متغیر محیطی LANG پیشفرض میشوند. اگر هیچیک از این متغیرها تنظیم نشده باشند، GCC به رفتار سنتی انگلیسی C پیشفرض میشود.
- TMPDIR
- اگر TMPDIR تنظیم شده باشد، دایرکتوری مورد استفاده برای فایلهای موقت را مشخص میکند. GCC از فایلهای موقت برای نگهداری خروجی یک مرحله از کامپایل که قرار است به عنوان ورودی مرحله بعدی استفاده شود، بهره میبرد: برای مثال، خروجی پیشپردازنده، که ورودی کامپایلر اصلی است.
- GCC_COMPARE_DEBUG
- تنظیم GCC_COMPARE_DEBUG تقریباً معادل ارسال -fcompare-debug به گرداننده کامپایلر است. برای جزئیات بیشتر به مستندات این گزینه مراجعه کنید.
- GCC_EXEC_PREFIX
- اگر GCC_EXEC_PREFIX
تنظیم شده
باشد،
پیشوندی را
مشخص
میکند که
باید در نام
برنامههای
فرعی
اجراشده
توسط
کامپایلر
استفاده
شود. هنگام
ترکیب این
پیشوند با
نام یک
برنامه
فرعی هیچ
اسلشی
اضافه
نمیشود،
اما در صورت
تمایل
میتوانید
پیشوندی را
مشخص کنید
که با یک
اسلش پایان
مییابد.
اگر GCC_EXEC_PREFIX تنظیم نشده باشد، GCC تلاش میکند تا بر اساس نام مسیری که با آن فراخوانی شده است، پیشوند مناسبی را برای استفاده بیابد.
اگر GCC نتواند برنامه فرعی را با استفاده از پیشوند مشخصشده پیدا کند، مکانهای معمول را برای آن برنامه فرعی جستجو میکند.
مقدار پیشفرض GCC_EXEC_PREFIX برابر prefix/lib/gcc/ است که در آن prefix پیشوند کامپایلر نصبشده است. در بسیاری از موارد prefix همان مقدار "prefix" در زمان اجرای اسکریپت configure است.
سایر پیشوندهای مشخصشده با -B بر این پیشوند اولویت دارند.
این پیشوند همچنین برای یافتن فایلهایی مانند crt0.o که برای پیوند دادن استفاده میشوند به کار میرود.
علاوه بر این، پیشوند به روشی غیرمعمول در یافتن دایرکتوریها برای جستجوی فایلهای سرآیند استفاده میشود. به ازای هر یک از دایرکتوریهای استانداردی که نام آنها به طور معمول با /usr/local/lib/gcc آغاز میشود (دقیقتر، با مقدار GCC_INCLUDE_DIR)، GCC سعی میکند آن آغاز را با پیشوند مشخصشده جایگزین کند تا نام دایرکتوری جایگزینی ایجاد شود. بنابراین، با -Bfoo/، GCC درست قبل از جستجوی دایرکتوری استاندارد /usr/local/lib/bar، دایرکتوری foo/bar را جستجو میکند. اگر یک دایرکتوری استاندارد با prefix پیکربندیشده آغاز شود، مقدار prefix هنگام جستجوی فایلهای سرآیند با GCC_EXEC_PREFIX جایگزین میشود.
- COMPILER_PATH
- مقدار COMPILER_PATH فهرستی از دایرکتوریها است که با دو نقطه (colon) از هم جدا شدهاند، بسیار شبیه به PATH. اگر GCC نتواند برنامههای فرعی را با استفاده از GCC_EXEC_PREFIX پیدا کند، دایرکتوریهای مشخصشده به این ترتیب را هنگام جستجو برای برنامههای فرعی امتحان میکند.
- LIBRARY_PATH
- مقدار LIBRARY_PATH فهرستی از دایرکتوریها است که با دو نقطه از هم جدا شدهاند، بسیار شبیه به PATH. هنگام پیکربندی به عنوان یک کامپایلر بومی، اگر GCC نتواند فایلهای پیونددهنده ویژه را با استفاده از GCC_EXEC_PREFIX پیدا کند، دایرکتوریهای مشخصشده به این ترتیب را امتحان میکند. پیوند زدن با استفاده از GCC همچنین از این دایرکتوریها هنگام جستجو برای کتابخانههای معمولی برای گزینه -l استفاده میکند (اما دایرکتوریهای مشخصشده با -L اولویت دارند).
- LANG
- این متغیر برای ارسال اطلاعات محلی به کامپایلر استفاده میشود. یکی از کاربردهای این اطلاعات تعیین مجموعهنویسهای است که باید هنگام تجزیه لیترالهای نویسهای، لیترالهای رشتهای و کامنتها در 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 باشد که در این حالت قواعد با استفاده از target به عنوان نام هدف، در فایل file نوشته میشوند.
به بیان دیگر، این متغیر محیطی معادل ترکیب گزینههای -MM و -MF به همراه سوییچ اختیاری -MT است.
- SUNPRO_DEPENDENCIES
- این متغیر مشابه DEPENDENCIES_OUTPUT است (بالا را ببینید)، با این تفاوت که فایلهای سرآیند سیستمی نادیده گرفته نمیشوند؛ بنابراین به جای -MM بر -M دلالت دارد. با این وجود، وابستگی به فایل ورودی اصلی نادیده گرفته میشود.
- 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/kgname/-/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)
کپیرایت (c) 1988-2025 Free Software Foundation, Inc.
اجازه کپی، توزیع و/یا تغییر این سند تحت شرایط مجوز مستندات آزاد گنو (GNU Free Documentation License)، نگارش 1.3 یا هر نگارش بعدی منتشرشده توسط Free Software Foundation صادر شده است؛ با بخشهای تغییرناپذیر «GNU General Public License» و «Funding Free Software»، متنهای روی جلد (a) (پایین را ببینید) و متنهای پشت جلد (b) (پایین را ببینید). رونوشتی از این مجوز در صفحه راهنمای gfdl(7) گنجانده شده است.
(a) متن روی جلد FSF عبارت است از:
A GNU Manual
(b) متن پشت جلد FSF عبارت است از:
You have freedom to copy and modify this GNU Manual, like GNU software. Copies published by the Free Software Foundation raise funds for GNU development.
| 2025-08-08 | gcc-15.2.0 |