| GCC(1) | GNU | GCC(1) |
نام (NAME)
gcc - کامپایلر C و ++C پروژه گنو
خلاصه دستور (SYNOPSIS)
gcc [-c|-S|-E] [-std=standard]
[-g] [-pg] [-Olevel]
[-Wwarn...] [-Wpedantic]
[-Idir...] [-Ldir...]
[-Dmacro[=defn]...] [-Umacro]
[-foption...] [-mmachine-option...]
[-o outfile] [@file] infile...
در اینجا تنها کاربردیترین گزینهها فهرست شدهاند؛ برای سایر موارد به ادامه متن مراجعه کنید. g++ بیشتر همان گزینههای gcc را میپذیرد.
توضیحات (DESCRIPTION)
هنگامی که GCC را فراخوانی میکنید، معمولاً مراحل پیشپردازش، کامپایل، اسمبل و پیوندزدن (linking) را انجام میدهد. «گزینههای کلی» به شما این امکان را میدهند که این فرآیند را در یک مرحله میانی متوقف کنید. برای نمونه، گزینه -c مشخص میکند که پیوندزن (linker) اجرا نشود. در این حالت خروجی شامل فایلهای شیء (object files) حاصل از اسمبلر خواهد بود.
سایر گزینهها به یک یا چند مرحله پردازش ارسال میشوند. برخی گزینهها پیشپردازنده و برخی دیگر خود کامپایلر را کنترل میکنند. گزینههای دیگری نیز اسمبلر و پیوندزن را کنترل میکنند؛ بیشتر این موارد در اینجا مستند نشدهاند، چرا که به ندرت به استفاده از آنها نیاز پیدا خواهید کرد.
بیشتر گزینههای خط فرمانی که میتوانید با GCC استفاده کنید برای برنامههای C کاربرد دارند؛ هنگامی که یک گزینه تنها برای زبان دیگری (معمولاً ++C) مفید باشد، در توضیحات صراحتاً به آن اشاره شده است. اگر در توضیحات یک گزینه خاص به زبان مبدأ اشارهای نشده باشد، میتوانید آن گزینه را برای تمام زبانهای پشتیبانیشده به کار ببرید.
روش معمول برای اجرای GCC، اجرای فایل اجرایی با نام gcc، یا machine-gcc هنگام کامپایل متقاطع (cross-compiling)، یا machine-gcc-version برای اجرای یک نگارش مشخص از GCC است. هنگامی که برنامههای ++C را کامپایل میکنید، باید به جای آن GCC را به صورت g++ فراخوانی کنید.
برنامه gcc گزینهها و نامهای فایل را به عنوان عملوند میپذیرد. بسیاری از گزینهها نامهای چندحرفی دارند؛ بنابراین چندین گزینه تکحرفی ممکن است قابل ادغام با یکدیگر نباشند: گزینه -dv با -d -v بسیار متفاوت است.
میتوانید گزینهها و سایر آرگومانها را با هم ترکیب کنید. در بیشتر موارد، ترتیبی که استفاده میکنید اهمیتی ندارد. ترتیب زمانی اهمیت پیدا میکند که از چندین گزینه همنوع استفاده کنید؛ برای مثال، اگر -L را بیش از یک بار مشخص کنید، دایرکتوریها به همان ترتیبی که تعیین شدهاند جستجو میشوند. همچنین، محل قرارگیری گزینه -l مهم و تأثیرگذار است.
بسیاری از گزینهها نامهای بلندی دارند که با -f یا با -W آغاز میشوند؛ برای نمونه، -fmove-loop-invariants، -Wformat و مواردی از این دست. بیشتر این گزینهها هم فرم مثبت دارند و هم منفی؛ فرم منفیِ -ffoo به صورت -fno-foo است. این راهنما تنها یکی از این دو فرم را مستند میکند، یعنی هر کدام را که حالت پیشفرض نباشد.
برخی گزینهها یک یا چند آرگومان میگیرند که معمولاً با یک فاصله یا با علامت مساوی (=) از نام گزینه جدا میشوند. مگر اینکه طور دیگری ذکر شده باشد، یک آرگومان میتواند عددی یا یک رشته باشد. آرگومانهای عددی معمولاً باید اعداد صحیح دهدهی یا هگزادسیمال بدون علامت و کوچک باشند. آرگومانهای هگزادسیمال باید با پیشوند 0x آغاز شوند. آرگومانهای مربوط به گزینههایی که نوعی آستانه اندازه را مشخص میکنند، میتوانند اعداد صحیح دهدهی یا هگزادسیمال به هر اندازه بزرگی باشند که پسوندی برای اندازه بایت به دنبال آنها میآید و مضربی از بایتها را نشان میدهد؛ مانند "kB" و "KiB" به ترتیب برای کیلوبایت و کیبیبایت، "MB" و "MiB" برای مگابایت و مبیبایت، "GB" و "GiB" برای گیگابایت و گیبیبایت و به همین ترتیب. این آرگومانها در ادامه متن با byte-size مشخص شدهاند. برای فهرست کامل و شرح پیشوندهای دهدهی و دودویی اندازه بایت، به استانداردهای NIST، IEC و سایر استانداردهای ملی و بینالمللی مرتبط مراجعه کنید..SH "گزینهها (OPTIONS)"
خلاصه گزینهها (Option Summary)
در اینجا خلاصهای از تمام گزینهها، دستهبندیشده بر پایه نوع آمده است. توضیحات مربوطه در بخشهای بعدی ارائه شدهاند.
- گزینههای کلی (Overall Options)
- -c -S -E -o file -dumpbase dumpbase -dumpbase-ext auxdropsuf -dumpdir dumppfx -x language -v -### --help[=class[,...]] --target-help --version -pass-exit-codes -pipe -wrapper @file -ffile-prefix-map=old=new -fcanon-prefix-map -fplugin=file -fplugin-arg-name=arg -fdump-ada-spec[-slim] -fada-spec-parent=unit -fdump-go-spec=file --assemble --compile --dumpbase dumpbase --dumpbase-ext auxdropsuf --dumpdir dumppfx --language=language --output=file --pass-exit-codes --pipe --preprocess --verbose
- گزینههای زبان C (C Language Options)
- -ansi -std=standard -aux-info filename -fno-asm -fno-builtin -fno-builtin-function -fcond-mismatch -ffreestanding -fgimple -fgnu-tm -fgnu89-inline -fhosted -flax-vector-conversions -fms-extensions -fpermitted-flt-eval-methods=standard -fplan9-extensions -fsigned-bitfields -funsigned-bitfields -fsigned-char -funsigned-char -fstrict-flex-arrays[=n] -fsso-struct=endianness --ansi
- گزینههای زبان C++ (C++ Language Options)
- --compile-std-module -fabi-compat-version=n -fabi-version=n -fno-access-control -faligned-new=[n] -fno-assume-sane-operators-new-delete -fchar8_t -fcheck-new -fconcepts -fconcepts-diagnostics-depth=n -fconstexpr-depth=n -fconstexpr-cache-depth=n -fconstexpr-loop-limit=n -fconstexpr-ops-limit=n -fcontracts -fcontract-evaluation-semantic=[ignore|observe|enforce|quick_enforce] -fcontracts-conservative-ipa -fcontract-checks-outlined -fcontract-disable-optimized-checks -fcontracts-client-check=[none|pre|all] -fcontracts-definition-check=[on|off] -fcoroutines -fdiagnostics-all-candidates -fno-elide-constructors -fno-enforce-eh-specs -fext-numeric-literals -fno-gnu-keywords -fno-immediate-escalation -fno-implement-inlines -fimplicit-constexpr -fno-implicit-inline-templates -fno-implicit-templates -fmodule-header[=kind] -fmodule-implicit-inline -fno-module-lazy -fmodule-mapper=specification -fmodule-only -fmodules -fms-extensions -fnew-inheriting-ctors -fnew-ttp-matching -fno-nonansi-builtins -fnothrow-opt -fno-operator-names -fno-optional-diags -fno-pretty-templates -frange-for-ext-temps -freflection -fno-rtti -fsized-deallocation -fstrict-enums -fstrong-eval-order[=kind] -ftemplate-backtrace-limit=n -ftemplate-depth=n -fno-threadsafe-statics -fuse-cxa-atexit -fno-use-cxa-get-exception-ptr -fno-weak -nostdinc++ -fvisibility-inlines-hidden -fvisibility-ms-compat -flang-info-include-translate[=header] -flang-info-include-translate-not -flang-info-module-cmi[=module] -stdlib=libstdc++,libc++ -Wabbreviated-auto-in-template-arg -Wabi-tag -Waligned-new[=kind] -Wcatch-value -Wcatch-value=n -Wno-class-conversion -Wclass-memaccess -Wcomma-subscript -Wconditionally-supported -Wno-conversion-null -Wctad-maybe-unsupported -Wctor-dtor-privacy -Wdangling-reference -Wno-defaulted-function-deleted -Wno-delete-incomplete -Wdelete-non-virtual-dtor -Wno-deprecated-array-compare -Wdeprecated-copy -Wdeprecated-copy-dtor -Wno-deprecated-enum-enum-conversion -Wno-deprecated-enum-float-conversion -Wno-deprecated-literal-operator -Wdeprecated-variadic-comma-omission -Weffc++ -Wno-elaborated-enum-base -Wno-exceptions -Wno-expose-global-module-tu-local -Wno-external-tu-local -Wextra-semi -Wno-global-module -Wno-inaccessible-base -Wno-inherited-variadic-ctor -Wno-init-list-lifetime -Winvalid-constexpr -Winvalid-imported-macros -Wno-invalid-offsetof -Wno-literal-suffix -Wmismatched-new-delete -Wmismatched-tags -Wmultiple-inheritance -Wnamespaces -Wnarrowing -Wnoexcept -Wnoexcept-type -Wnon-virtual-dtor -Wpessimizing-move -Wno-placement-new -Wplacement-new=n -Wrange-loop-construct -Wredundant-move -Wredundant-tags -Wreorder -Wregister -Wno-sfinae-incomplete -Wstrict-null-sentinel -Wno-subobject-linkage -Wtemplates -Wno-non-c-typedef-for-linkage -Wno-non-template-friend -Wold-style-cast -Woverloaded-virtual -Wno-pmf-conversions -Wself-move -Wsign-promo -Wsized-deallocation -Wsuggest-final-methods -Wsuggest-final-types -Wsuggest-override -Wno-template-body -Wno-template-id-cdtor -Wtemplate-names-tu-local -Wno-terminate -Wno-vexing-parse -Wvirtual-inheritance -Wno-virtual-move-assign -Wvolatile
- گزینههای زبانهای Objective-C و Objective-C++ (Objective-C and Objective-C++ Language Options)
- -fconstant-string-class=class-name -fgnu-runtime -fnext-runtime -fno-nil-receivers -fobjc-abi-version=n -fobjc-call-cxx-cdtors -fobjc-direct-dispatch -fobjc-exceptions -fobjc-gc -fobjc-nilcheck -fobjc-std=objc1 -fno-local-ivars -fivar-visibility=[public|protected|private|package] -freplace-objc-classes -fzero-link -gen-decls -Wassign-intercept -Wno-property-assign-default -Wno-protocol -Wobjc-root-class -Wselector -Wstrict-selector-match -Wundeclared-selector
- گزینههای OpenMP و OpenACC (OpenMP and OpenACC Options)
- -foffload=arg -foffload-options=arg -fopenacc -fopenacc-dim=geom -fopenmp -fopenmp-simd -fopenmp-target-simd-clone[=device-type]
- گزینههای قالببندی پیامهای تشخیصی (Diagnostic Message Formatting Options)
- -fmessage-length=n -fdiagnostics-plain-output -fdiagnostics-show-location=[once|every-line] -fdiagnostics-color=[auto|never|always] -fdiagnostics-urls=[auto|never|always] -fdiagnostics-format=[text|sarif-stderr|sarif-file] -fdiagnostics-add-output=DIAGNOSTICS-OUTPUT-SPEC -fdiagnostics-set-output=DIAGNOSTICS-OUTPUT-SPEC -fno-diagnostics-json-formatting -fno-diagnostics-show-option -fno-diagnostics-show-caret -fno-diagnostics-show-event-links -fno-diagnostics-show-labels -fno-diagnostics-show-line-numbers -fno-diagnostics-show-cwe -fno-diagnostics-show-rules -fno-diagnostics-show-highlight-colors -fno-diagnostics-show-nesting -fno-diagnostics-show-nesting-locations -fdiagnostics-show-nesting-levels -fdiagnostics-minimum-margin-width=width -fdiagnostics-parseable-fixits -fdiagnostics-generate-patch -fdiagnostics-show-template-tree -fno-elide-type -fdiagnostics-path-format=[none|separate-events|inline-events] -fdiagnostics-show-path-depths -fno-show-column -fdiagnostics-column-unit=[display|byte] -fdiagnostics-column-origin=origin -fdiagnostics-escape-format=[unicode|bytes] -fdiagnostics-text-art-charset=[none|ascii|unicode|emoji] -fdiagnostics-show-context[=depth]
- گزینههای هشدار (Warning Options)
- -fsyntax-only -fmax-errors=n -Wpedantic -pedantic-errors -fpermissive -w -Wextra -Wall -Wabi=n -Waddress -Wno-address-of-packed-member -Waggregate-return -Walloc-size -Walloc-size-larger-than=byte-size -Walloc-zero -Walloca -Walloca-larger-than=byte-size -Wauto-profile -Wno-aggressive-loop-optimizations -Warith-conversion -Warray-bounds -Warray-bounds=n -Warray-compare -Warray-parameter -Warray-parameter=n -Wno-attributes -Wattribute-alias=n -Wno-attribute-alias -Wno-attribute-warning -Wbidi-chars=[none|unpaired|any|ucn] -Wbool-compare -Wbool-operation -Wno-builtin-declaration-mismatch -Wno-builtin-macro-redefined -Wc90-c99-compat -Wc99-c11-compat -Wc11-c23-compat -Wc23-c2y-compat -Wc++-compat -Wc++11-compat -Wc++14-compat -Wc++17-compat -Wc++20-compat -Wc++26-compat -Wno-c++11-extensions -Wno-c++14-extensions -Wno-c++17-extensions -Wno-c++20-extensions -Wno-c++23-extensions -Wcalloc-transposed-args -Wcannot-profile -Wcast-align -Wcast-align=strict -Wcast-function-type -Wcast-qual -Wchar-subscripts -Wclobbered -Wcomment -Wcompare-distinct-pointer-types -Wno-complain-wrong-lang -Wconversion -Wno-coverage-mismatch -Wno-cpp -Wdangling-else -Wdangling-pointer -Wdangling-pointer=n -Wdate-time -Wno-deprecated -Wno-deprecated-declarations -Wno-designated-init -Wno-deprecated-openmp -Wdisabled-optimization -Wno-discarded-array-qualifiers -Wno-discarded-qualifiers -Wno-div-by-zero -Wdouble-promotion -Wduplicated-branches -Wduplicated-cond -Wempty-body -Wno-endif-labels -Wenum-compare -Wenum-conversion -Wenum-int-mismatch -Werror -Werror=* -Wexpansion-to-defined -Wfatal-errors -Wflex-array-member-not-at-end -Wfloat-conversion -Wfloat-equal -Wformat -Wformat=2 -Wno-format-contains-nul -Wno-format-diag -Wno-format-extra-args -Wformat-nonliteral -Wformat-overflow=n -Wformat-security -Wformat-signedness -Wformat-truncation=n -Wformat-y2k -Wframe-address -Wframe-larger-than=byte-size -Wno-free-nonheap-object -Wheader-guard -Wno-if-not-aligned -Wno-ignored-attributes -Wignored-qualifiers -Wno-incompatible-pointer-types -Whardened -Wimplicit -Wimplicit-fallthrough -Wimplicit-fallthrough=n -Wno-implicit-function-declaration -Wno-implicit-int -Winfinite-recursion -Winit-self -Winline -Wno-int-conversion -Wint-in-bool-context -Wno-int-to-pointer-cast -Wno-invalid-memory-model -Winvalid-pch -Winvalid-utf8 -Wno-unicode -Wjump-misses-init -Wkeyword-macro -Wlarger-than=byte-size -Wleading-whitespace=kind -Wlogical-not-parentheses -Wlogical-op -Wlong-long -Wno-lto-type-mismatch -Wmain -Wmaybe-uninitialized -Wmemset-elt-size -Wmemset-transposed-args -Wmisleading-indentation -Wmissing-attributes -Wmissing-braces -Wmissing-field-initializers -Wmissing-format-attribute -Wmissing-include-dirs -Wmissing-noreturn -Wmusttail-local-addr -Wmaybe-musttail-local-addr -Wno-missing-profile -Wno-multichar -Wmultistatement-macros -Wnonnull -Wnonnull-compare -Wnormalized=[none|id|nfc|nfkc] -Wnull-dereference -Wno-odr -Wopenacc-parallelism -Wopenmp -Wopenmp-simd -Wno-overflow -Woverlength-strings -Wno-override-init-side-effects -Wpacked -Wno-packed-bitfield-compat -Wpacked-not-aligned -Wpadded -Wparentheses -Wno-pedantic-ms-format -Wpointer-arith -Wno-pointer-compare -Wno-pointer-to-int-cast -Wno-pragmas -Wno-pragma-once-outside-header -Wno-prio-ctor-dtor -Wno-psabi -Wredundant-decls -Wrestrict -Wno-return-local-addr -Wreturn-type -Wno-scalar-storage-order -Wsequence-point -Wshadow -Wshadow=global -Wshadow=local -Wshadow=compatible-local -Wno-shadow-ivar -Wno-shift-count-negative -Wno-shift-count-overflow -Wshift-negative-value -Wno-shift-overflow -Wshift-overflow=n -Wsign-compare -Wsign-conversion -Wno-sizeof-array-argument -Wsizeof-array-div -Wsizeof-pointer-div -Wsizeof-pointer-memaccess -Wstack-protector -Wstack-usage=byte-size -Wstrict-aliasing -Wstrict-aliasing=n -Wstrict-overflow -Wstrict-overflow=n -Wstring-compare -Wno-stringop-overflow -Wno-stringop-overread -Wno-stringop-truncation -Wstrict-flex-arrays -Wsuggest-attribute=attribute-name -Wswitch -Wno-switch-bool -Wswitch-default -Wswitch-enum -Wno-switch-outside-range -Wno-switch-unreachable -Wsync-nand -Wsystem-headers -Wtautological-compare -Wtrailing-whitespace -Wtrailing-whitespace=kind -Wtrampolines -Wtrigraphs -Wtrivial-auto-var-init -Wno-tsan -Wtype-limits -Wundef -Wuninitialized -Wunknown-pragmas -Wunsuffixed-float-constants -Wunterminated-string-initialization -Wunused -Wunused-but-set-parameter -Wunused-but-set-parameter=n -Wunused-but-set-variable -Wunused-but-set-variable=n -Wunused-const-variable -Wunused-const-variable=n -Wunused-function -Wunused-label -Wunused-local-typedefs -Wunused-macros -Wunused-parameter -Wno-unused-result -Wunused-value -Wunused-variable -Wuse-after-free -Wuse-after-free=n -Wuseless-cast -Wno-varargs -Wvariadic-macros -Wvector-operation-performance -Wvla -Wvla-larger-than=byte-size -Wno-vla-larger-than -Wvolatile-register-var -Wwrite-strings -Wno-xor-used-as-pow -Wzero-as-null-pointer-constant -Wzero-length-bounds --all-warnings --extra-warnings --no-warnings --pedantic --pedantic-errors.IP "گزینههای تحلیلگر ایستا" 4 -fanalyzer -fanalyzer-assume-nothrow -fanalyzer-call-summaries -fanalyzer-checker=name -fno-analyzer-feasibility -fanalyzer-show-events-in-system-headers -fno-analyzer-state-merge -fno-analyzer-state-purge -fno-analyzer-suppress-followups -fanalyzer-transitivity -fno-analyzer-undo-inlining -fanalyzer-verbose-edges -fanalyzer-verbose-state-changes -fanalyzer-verbosity=level -fdump-analyzer -fdump-analyzer-callgraph -fdump-analyzer-exploded-graph -fdump-analyzer-exploded-nodes -fdump-analyzer-exploded-nodes-2 -fdump-analyzer-exploded-nodes-3 -fdump-analyzer-exploded-paths -fdump-analyzer-feasibility -fdump-analyzer-infinite-loop -fdump-analyzer-json -fdump-analyzer-state-purge -fdump-analyzer-stderr -fdump-analyzer-supergraph -fdump-analyzer-untracked -Wno-analyzer-double-fclose -Wno-analyzer-double-free -Wno-analyzer-exposure-through-output-file -Wno-analyzer-exposure-through-uninit-copy -Wno-analyzer-fd-access-mode-mismatch -Wno-analyzer-fd-double-close -Wno-analyzer-fd-leak -Wno-analyzer-fd-phase-mismatch -Wno-analyzer-fd-type-mismatch -Wno-analyzer-fd-use-after-close -Wno-analyzer-fd-use-without-check -Wno-analyzer-file-leak -Wno-analyzer-free-of-non-heap -Wno-analyzer-imprecise-fp-arithmetic -Wno-analyzer-infinite-loop -Wno-analyzer-infinite-recursion -Wno-analyzer-jump-through-null -Wno-analyzer-malloc-leak -Wno-analyzer-mismatching-deallocation -Wno-analyzer-null-argument -Wno-analyzer-null-dereference -Wno-analyzer-out-of-bounds -Wno-analyzer-overlapping-buffers -Wno-analyzer-possible-null-argument -Wno-analyzer-possible-null-dereference -Wno-analyzer-putenv-of-auto-var -Wno-analyzer-shift-count-negative -Wno-analyzer-shift-count-overflow -Wno-analyzer-stale-setjmp-buffer -Wno-analyzer-tainted-allocation-size -Wno-analyzer-tainted-assertion -Wno-analyzer-tainted-array-index -Wno-analyzer-tainted-divisor -Wno-analyzer-tainted-offset -Wno-analyzer-tainted-size -Wno-analyzer-throw-of-unexpected-type -Wanalyzer-symbol-too-complex -Wanalyzer-too-complex -Wno-analyzer-undefined-behavior-ptrdiff -Wno-analyzer-undefined-behavior-strtok -Wno-analyzer-unsafe-call-within-signal-handler -Wno-analyzer-use-after-free -Wno-analyzer-use-of-pointer-in-stale-stack-frame -Wno-analyzer-use-of-uninitialized-value -Wno-analyzer-va-arg-type-mismatch -Wno-analyzer-va-list-exhausted -Wno-analyzer-va-list-leak -Wno-analyzer-va-list-use-after-va-end -Wno-analyzer-write-to-const -Wno-analyzer-write-to-string-literal
- گزینههای هشدار ویژهٔ C و Objective-C
- -Wbad-function-cast -Wdeprecated-non-prototype -Wfree-labels -Wmissing-declarations -Wmissing-parameter-name -Wmissing-parameter-type -Wdeclaration-missing-parameter-type -Wmissing-prototypes -Wmissing-variable-declarations -Wmultiple-parameter-fwd-decl-lists -Wnested-externs -Wold-style-declaration -Wold-style-definition -Wstrict-prototypes -Wtraditional -Wtraditional-conversion -Wdeclaration-after-statement -Wpointer-sign
- گزینههای اشکالزدایی
- -g -glevel -gdwarf -gdwarf-version -gbtf -gctf -gctflevel -gno-prune-btf -ggdb -gno-record-gcc-switches -gstrict-dwarf -gas-loc-support -gas-locview-support -gcodeview -gcolumn-info -gdwarf32 -gdwarf64 -gno-statement-frontiers -gno-variable-location-views -gvariable-location-views=incompat5 -ginternal-reset-location-views -ginline-points -gvms -gz[=type] -gsplit-dwarf -gdescribe-dies -fdebug-prefix-map=old=new -fdebug-types-section -fno-eliminate-unused-debug-types -femit-struct-debug-baseonly -femit-struct-debug-reduced -femit-struct-debug-detailed[=spec-list] -fno-eliminate-unused-debug-symbols -femit-class-debug-always -fno-merge-debug-strings -fno-dwarf2-cfi-asm -fvar-tracking -fvar-tracking-assignments -fvar-tracking-uninit --debug
- گزینههای بهینهسازی
- -faggressive-loop-optimizations -falign-functions[=n[:m:[n2[:m2]]]] -falign-jumps[=n[:m:[n2[:m2]]]] -falign-labels[=n[:m:[n2[:m2]]]] -falign-loops[=n[:m:[n2[:m2]]]] -fmin-function-alignment=[n] -fno-allocation-dce -fallow-store-data-races -fassociative-math -fauto-profile -fauto-profile[=path] -fauto-profile-inlining -fauto-inc-dec -fbranch-probabilities -fcaller-saves -fcombine-stack-adjustments -fconserve-stack -ffold-mem-offsets -fcompare-elim -fcprop-registers -fcrossjumping -fcse-follow-jumps -fcse-skip-blocks -fcx-fortran-rules -fcx-limited-range -fcx-method -fdata-sections -fdce -fdelayed-branch -fdelete-null-pointer-checks -fdep-fusion -fdevirtualize -fdevirtualize-speculatively -fdevirtualize-at-ltrans -fdse -fearly-inlining -fexcess-precision=style -fexpensive-optimizations -fext-dce -ffast-math -ffat-lto-objects -ffinite-loops -ffinite-math-only -ffloat-store -fforward-propagate -ffp-contract=style -ffp-int-builtin-inexact -ffunction-sections -ffuse-ops-with-volatile-access -fgcse -fgcse-after-reload -fgcse-las -fgcse-lm -fgraphite-identity -fgcse-sm -fhoist-adjacent-loads -fif-conversion -fif-conversion2 -findirect-inlining -finline-atomics -finline-functions -finline-functions-called-once -finline-limit=n -finline-small-functions -finline-stringops[=fn] -fipa-modref -fipa-cp -fipa-cp-clone -fipa-bit-cp -fipa-vrp -fipa-pta -fipa-profile -fipa-pure-const -fipa-reference -fipa-reference-addressable -fipa-reorder-for-locality -fipa-sra -fipa-stack-alignment -fipa-icf -fipa-icf-functions -fipa-icf-variables -fira-algorithm=algorithm -flate-combine-instructions -flifetime-dse -flive-patching=level -fira-region=region -fira-hoist-pressure -fira-loop-pressure -fno-ira-share-save-slots -fno-ira-share-spill-slots -fisolate-erroneous-paths-dereference -fisolate-erroneous-paths-attribute -fivopts -fkeep-inline-functions -fkeep-static-functions -fkeep-static-consts -flimit-function-alignment -flive-range-shrinkage -floop-block -floop-interchange -floop-strip-mine -floop-unroll-and-jam -floop-nest-optimize -floop-parallelize-all -flra-remat -flto -flto-compression-level=n -flto-toplevel-asm-heuristics -flto-partition=alg -flto-incremental=path -flto-incremental-cache-size=n -fmalloc-dce -fmerge-all-constants -fmerge-constants -fmodulo-sched -fmodulo-sched-allow-regmoves -fmove-loop-invariants -fmove-loop-stores -fno-branch-count-reg -fno-defer-pop -fno-function-cse -fno-guess-branch-probability -fno-inline -fno-math-errno -fno-peephole -fno-peephole2 -fno-printf-return-value -fno-sched-interblock -fno-sched-spec -fno-signed-zeros -fno-toplevel-reorder -fno-trapping-math -fno-zero-initialized-in-bss -fomit-frame-pointer -foptimize-crc -foptimize-sibling-calls -fpartial-inlining -fpeel-loops -fpredictive-commoning -fprefetch-loop-arrays -fprofile-correction -fprofile-use -fprofile-use=path -fprofile-partial-training -fprofile-values -fprofile-reorder-functions -freciprocal-math -free -frename-registers -freorder-blocks -freorder-blocks-algorithm=algorithm -freorder-blocks-and-partition -freorder-functions -frerun-cse-after-loop -freschedule-modulo-scheduled-loops -frounding-math -fsave-optimization-record -fsched2-use-superblocks -fsched-pressure -fsched-spec-load -fsched-spec-load-dangerous -fsched-stalled-insns-dep[=n] -fsched-stalled-insns[=n] -fsched-group-heuristic -fsched-critical-path-heuristic -fsched-spec-insn-heuristic -fsched-rank-heuristic -fsched-last-insn-heuristic -fsched-dep-count-heuristic -fschedule-fusion -fschedule-insns -fschedule-insns2 -fsection-anchors -fselective-scheduling -fselective-scheduling2 -fsel-sched-pipelining -fsel-sched-pipelining-outer-loops -fsemantic-interposition -fshrink-wrap -fshrink-wrap-separate -fsignaling-nans -fsingle-precision-constant -fsplit-ivs-in-unroller -fsplit-loops -fspeculatively-call-stored-functions -fsplit-paths -fsplit-wide-types -fsplit-wide-types-early -fssa-backprop -fssa-phiopt -fstdarg-opt -fstore-merging -fstrict-aliasing -fipa-strict-aliasing -fthread-jumps -ftracer -ftree-bit-ccp -ftree-builtin-call-dce -ftree-ccp -ftree-ch -ftree-coalesce-vars -ftree-copy-prop -ftree-cselim -ftree-dce -ftree-dominator-opts -ftree-dse -ftree-forwprop -ftree-fre -fcode-hoisting -ftree-loop-if-convert -ftree-loop-im -ftree-phiprop -ftree-loop-distribution -ftree-loop-distribute-patterns -ftree-loop-ivcanon -ftree-loop-linear -ftree-loop-optimize -ftree-loop-vectorize -ftree-parallelize-loops[=n] -ftree-pre -ftree-partial-pre -ftree-pta -ftree-reassoc -ftree-scev-cprop -ftree-sink -ftree-slsr -ftree-sra -ftree-switch-conversion -ftree-tail-merge -ftree-ter -ftree-vectorize -ftree-vrp -ftrivial-auto-var-init -funconstrained-commons -funit-at-a-time -funroll-all-loops -funroll-loops -funsafe-math-optimizations -funswitch-loops -fipa-ra -fvariable-expansion-in-unroller -fvect-cost-model -fvpt -fweb -fwhole-program -fwpa -fuse-linker-plugin -fzero-call-used-regs -O -O0 -O1 -O2 -O3 -Os -Ofast -Og -Oz --optimize.IP "گزینههای ابزارگذاری برنامه (Program Instrumentation Options)" 4 -p -pg -fprofile-arcs -coverage -ftest-coverage -fcondition-coverage -fpath-coverage -fprofile -fprofile-abs-path -fprofile-dir=path -fprofile-generate -fprofile-generate=path -fprofile-info-section -fprofile-info-section=name -fprofile-note=path -fprofile-prefix-path=path -fprofile-update=method -fprofile-filter-files=regex -fprofile-exclude-files=regex -fprofile-reproducible=[multithreaded|parallel-runs|serial] -fsanitize=style -fsanitize-recover -fsanitize-recover=style -fsanitize-trap -fsanitize-trap=style -fasan-shadow-offset=number -fsanitize-sections=s1,s2,... -fsanitize-undefined-trap-on-error -fcf-protection -fcf-protection=[full|branch|return|none|check] -fharden-compares -fharden-conditional-branches -fhardened -fharden-control-flow-redundancy -fhardcfr-skip-leaf -fhardcfr-check-exceptions -fhardcfr-check-returning-calls -fhardcfr-check-noreturn-calls=[always|no-xthrow|nothrow|never] -fstack-protector -fstack-protector-all -fstack-protector-strong -fstack-protector-explicit -fstack-check -fstack-limit-register=reg -fstack-limit-symbol=sym -fno-stack-limit -fsplit-stack -fstrub=disable -fstrub=strict -fstrub=relaxed -fstrub=all -fstrub=at-calls -fstrub=internal -fvtable-verify=[std|preinit|none] -fvtv-counts -fvtv-debug -finstrument-functions -finstrument-functions-once -finstrument-functions-exclude-function-list=sym,sym,... -finstrument-functions-exclude-file-list=file,file,... -fprofile-prefix-map=old=new -fpatchable-function-entry=N[,M] --coverage --profile
- گزینههای پیشپردازنده (Preprocessor Options)
- -C -CC -Dmacro[=defn] -dD -dI -dM -dN -dU -fdebug-cpp -fdirectives-only -fdollars-in-identifiers -fexec-charset=charset -fextended-identifiers -finput-charset=charset -fmacro-prefix-map=old=new -fmax-include-depth=depth -fno-canonical-system-headers -fpch-deps -fpch-preprocess -fpreprocessed -ftabstop=width -ftrack-macro-expansion -fwide-exec-charset=charset -fworking-directory -H -imacros file -include file -M -MD -MF -MG -MM -MMD -MP -MQ -MT -Mno-modules -no-integrated-cpp -P -pthread -remap -traditional -traditional-cpp -trigraphs -Umacro -undef -Wp,option -Xpreprocessor option --comments --comments-in-macros --define-macro=macro[=defn] --dependencies --dump=letters --imacros=file --include=file --no-integrated-cpp --no-line-commands --print-missing-file-dependencies --traditional --traditional-cpp --trigraphs --trace-includes --undefine-macro=macro --user-dependencies --write-dependencies --write-user-dependencies
- گزینههای اسمبلر (Assembler Options)
- -Wa,option -Xassembler option --for-assembler=option
- گزینههای پیونددهنده (Linker Options)
- object-file-name -flink-libatomic -fuse-ld=linker -llibrary -nostartfiles -nodefaultlibs -nolibc -nostdlib -nostdlib++ -e entry -pie -pthread -r -rdynamic -s -static -static-pie -static-libgcc -static-libstdc++ -static-libasan -static-libhwasan -static-liblsan -static-libtsan -static-libubsan -shared -shared-libgcc -symbolic -T script -Wl,option -Xlinker option -u symbol -Tbss=addr -Tdata=addr -Ttext=addr -N -n -t -Z -z keyword --entry=entry --for-linker=option --force-link=symbol --no-standard-library --pie --static --static-pie --symbolic
- گزینههای دایرکتوری (Directory Options)
- -Bprefix -Idir -I- -idirafter dir -imacros file -imultilib dir -imultiarch dir -iplugindir=dir -iprefix file -iquote dir -isysroot dir -isystem dir -iwithprefix dir -iwithprefixbefore dir -Ldir -no-canonical-prefixes --no-sysroot-suffix -nostdinc -nostdinc++ --embed-dir=dir --embed-directory=dir --include-barrier --include-directory=dir --include-directory-after=dir --include-prefix=prefix --include-with-prefix=prefix --include-with-prefix-after=prefix --include-with-prefix-before=prefix --no-canonical-prefixes --no-standard-includes --prefix=prefix --sysroot=dir
- گزینههای تولید کد (Code Generation Options)
- -fcall-saved-reg -fcall-used-reg -ffixed-reg -fexceptions -fnon-call-exceptions -fdelete-dead-exceptions -funwind-tables -fasynchronous-unwind-tables -fno-gnu-unique -finhibit-size-directive -fcommon -fno-ident -fpcc-struct-return -fpic -fPIC -fpie -fPIE -fno-plt -fno-jump-tables -fno-bit-tests -frecord-gcc-switches -freg-struct-return -fshort-enums -fshort-wchar -fverbose-asm -fpack-struct[=n] -fleading-underscore -ftls-model=model -fstack-reuse=reuse_level -ftrampolines -ftrampoline-impl=[stack|heap] -ftrapv -fwrapv -fwrapv-pointer -fvisibility=[default|internal|hidden|protected] -fstrict-volatile-bitfields -fsync-libcalls -fzero-init-padding-bits=value -Qy -Qn
- گزینههای توسعهدهنده (Developer Options)
- -dletters -dumpspecs -dumpmachine -dumpversion -dumpfullversion -fcallgraph-info[=su,da] -fchecking -fchecking=n -fdbg-cnt-list -fdbg-cnt=counter-value-list -fdisable-ipa-pass_name -fdisable-rtl-pass_name -fdisable-rtl-pass-name=range-list -fdisable-tree-pass_name -fdisable-tree-pass-name=range-list -fdump-debug -fdump-earlydebug -fdump-noaddr -fdump-unnumbered -fdump-unnumbered-links -fdump-final-insns[=file] -fdump-internal-locations -fdump-ipa-all -fdump-ipa-cgraph -fdump-ipa-inline -fdump-lang-all -fdump-lang-switch -fdump-lang-switch-options -fdump-lang-switch-options=filename -fdump-passes -fdump-rtl-pass -fdump-rtl-pass=filename -fdump-statistics -fdump-tree-all -fdump-tree-switch -fdump-tree-switch-options -fdump-tree-switch-options=filename -fcompare-debug[=opts] -fcompare-debug-second -fenable-kind-pass -fenable-kind-pass=range-list -fira-verbose=n -flto-report -flto-report-wpa -fmem-report-wpa -fmem-report -fpre-ipa-mem-report -fpost-ipa-mem-report -fopt-info -fopt-info-options[=file] -fmultiflags -fprofile-report -frandom-seed=string -fsched-verbose=n -fsel-sched-verbose -fsel-sched-dump-cfg -fsel-sched-pipelining-verbose -fstats -fstack-usage -ftime-report -ftime-report-details -fvar-tracking-assignments-toggle -gtoggle -print-autofdo-gcov-version -print-file-name=library -print-libgcc-file-name -print-multi-directory -print-multi-lib -print-multi-os-directory -print-multiarch -print-prog-name=program -print-search-dirs -Q -print-sysroot -print-sysroot-headers-suffix -save-temps -save-temps=cwd -save-temps=obj -specs=file -time[=file] --dump=letters --print-autofdo-gcov-version --print-file-name=library --print-libgcc-file-file-name --print-multi-directory --print-multi-lib --print-multi-os-directory --print-multiarch --print-prog-name=program --print-search-dirs --print-sysroot --print-sysroot-headers-suffix --save-temps --specs=file --param name=value
- گزینههای وابسته به مقصد (Target-Specific Options)
- گزینههای
AArch64 (AArch64 Options) -mabi=name
-mbig-endian -mlittle-endian -menable-sysreg-checking
-mgeneral-regs-only -mcmodel=tiny -mcmodel=small
-mcmodel=large -mstrict-align -momit-leaf-frame-pointer
-mtls-dialect=desc -mtls-dialect=traditional
-mtls-size=size -mtp=name
-mfix-cortex-a53-835769 -mfix-cortex-a53-843419
-mlow-precision-recip-sqrt -mlow-precision-sqrt -mlow-precision-div
-mmax-vectorization -mautovec-preference=name
-mpc-relative-literal-loads
-msign-return-address=scope
-mbranch-protection=features -mharden-sls=opts
-march=name -mcpu=name
-mtune=name -moverride=string
-mstack-protector-guard=guard
-mstack-protector-guard-reg=sysreg
-mstack-protector-guard-offset=offset
-mtrack-speculation -moutline-atomics -mearly-ra
-mearly-ldp-fusion -mlate-ldp-fusion -mnarrow-gp-writes
-msve-vector-bits=bits
گزینههای Adapteva Epiphany (Adapteva Epiphany Options) -mhalf-reg-file -mprefer-short-insn-regs -mbranch-cost=num -mcmove -mnops=num -msoft-cmpsf -msplit-lohi -mpost-inc -mpost-modify -mstack-offset=num -mround-nearest -mlong-calls -mshort-calls -msmall16 -mfp-mode=mode -mmay-round-for-trunc -mfp-iarith -mvect-double -max-vect-align=num -msplit-vecmove-early -m1reg-reg
گزینههای AMD GCN (AMD GCN Options) -march=gpu -mtune=gpu -mgang-private-size=bytes -msram-ecc=[on|off|any] -mxnack=[on|off|any] -Wopenacc-dims
گزینههای ARC (ARC Options) -mbarrel-shifter -mjli-always -mcpu=cpu -mA6 -mARC600 -mA7 -mARC700 -mdpfp -mdpfp-compact -mdpfp-fast -mno-dpfp-lrsr -mea -mmul32x16 -mmul64 -matomic -mnorm -mspfp -mspfp-compact -mspfp-fast -msimd -msoft-float -mswap -mlock -mswape -mxy -misize -marclinux -marclinux_prof -mlong-calls -mmedium-calls -msdata -mirq-ctrl-saved -mrgf-banked-regs -mlpc-width=width -G num -mvolatile-cache -mtp-regno=regno -mbitops -mcmem -munaligned-access -mauto-modify-reg -mno-brcc -mcase-vector-pcrel -mno-cond-exec -mearly-cbranchsi -mindexed-loads -mlra-priority-none -mlra-priority-compact -mlra-priority-noncompact -mmillicode -msize-level=level -mtune=cpu -mmultcost=num -mcode-density-frame -mmpy-option=multo -mdiv-rem -mcode-density -mll64 -mfpu=fpu -mrf16 -mbranch-index
گزینههای ARM (ARM Options) -mapcs-frame -mapcs -mabi=name -mgeneral-regs-only -mno-sched-prolog -mlittle-endian -mbig-endian -mbe8 -mbe32 -mfloat-abi=name -mfp16-format=name -mthumb-interwork -mcpu=name -march=name -mfpu=name -mtune=name -mstructure-size-boundary=n -mabort-on-noreturn -mlong-calls -msingle-pic-base -mpic-register=reg -mpic-data-is-text-relative -mnop-fun-dllimport -mpoke-function-name -mthumb -marm -mtpcs-frame -mtpcs-leaf-frame -mcaller-super-interworking -mcallee-super-interworking -mtp=name -mtls-dialect=dialect -mword-relocations -mfix-cortex-m3-ldrd -mfix-cortex-a57-aes-1742098 -mfix-cortex-a72-aes-1655431 -munaligned-access -mslow-flash-data -masm-syntax-unified -mrestrict-it -mpure-code -mcmse -mfix-cmse-cve-2021-35465 -mstack-protector-guard=guard -mstack-protector-guard-offset=offset -mfdpic -mbranch-protection=features -mvectorize-with-neon-quad -mvectorize-with-neon-double.Sp گزینههای AVR (AVR Options) -mmcu=mcu -mabsdata -maccumulate-args -mcvt -mbranch-cost=cost -mfuse-add=level -mfuse-move=level -mfuse-move2 -mcall-prologues -mgas-isr-prologues -mint8 -mflmap -mdouble=bits -mlong-double=bits -mno-call-main -mn_flash=size -mfract-convert-truncate -mno-interrupts -mmain-is-OS_task -mrelax -mpmem-wrap-around -mrmw -mstrict-X -mtiny-stack -mrodata-in-ram -msplit-bit-shift -msplit-ldst -mshort-calls -mskip-bug -muse-nonzero-bits -nodevicelib -nodevicespecs -Waddr-space-convert -Wmisspelled-isr
گزینههای Blackfin (Blackfin Options) -mcpu=cpu[-sirevision] -msim -momit-leaf-frame-pointer -mspecld-anomaly -mcsync-anomaly -mlow-64k -mstack-check-l1 -mid-shared-library -mleaf-id-shared-library -mshared-library-id=n -msep-data -mlong-calls -mfast-fp -minline-plt -mmulticore -mcorea -mcoreb -msdram -micplb
گزینههای C6X (C6X Options) -mbig-endian -mlittle-endian -march=cpu -msim -msdata=sdata-type -mdsbt -mlong-calls
گزینههای CRIS (CRIS Options) -mcpu=cpu -march=cpu -mtune=cpu -mmax-stackframe=n -metrax4 -metrax100 -mpdebug -mcc-init -mno-side-effects -mstack-align -mdata-align -mconst-align -m32-bit -m16-bit -m8-bit -mno-prologue-epilogue -mbest-lib-options -moverride-best-lib-options -mtrap-using-break8 -mtrap-unaligned-atomic -munaligned-atomic-may-use-library -sim -sim2 -mmul-bug-workaround
گزینههای C-SKY (C-SKY Options) -march=arch -mcpu=cpu -mbig-endian -mlittle-endian -mfpu=fpu -mdouble-float -mfdivdu -mfloat-abi=name -melrw -mistack -mmp -mcp -mcache -msecurity -mtrust -mdsp -medsp -mvdsp -mdiv -msmart -mhigh-registers -manchor -mpushpop -mmultiple-stld -mconstpool -mstack-size -mccrt -mbranch-cost=n -msched-prolog -msim
گزینههای Cygwin و MinGW (Cygwin and MinGW Options) -mconsole -mcrtdll=library -mdll -mnop-fun-dllimport -mthreads -municode -mwin32 -mwindows -fno-set-stack-executable -fwritable-relocated-rdata -mpe-aligned-commons -muse-libstdc-wrappers
گزینههای Darwin (Darwin Options) -all_load -allowable_client -arch name -arch_errors_fatal -asm_macosx_version_min=version -bind_at_load -bundle -bundle_loader -client_name -compatibility_version -current_version -dead_strip -dependency-file -dylib_file -dylinker -dylinker_install_name -dynamic -dynamiclib -exported_symbols_list -fapple-kext -fconstant-cfstrings -ffix-and-continue -filelist -findirect-data -flat_namespace -force_cpusubtype_ALL -force_flat_namespace -framework name -gfull -gused -headerpad_max_install_names -iframework -image_base -init symbol-name -install_name -keep_private_externs -matt-stubs -mconstant-cfstrings -mdynamic-no-pic -mfix-and-continue -mkernel -mmacosx-version-min=version -mone-byte-bool -msymbol-stubs -mtarget-linker[=]version -nodefaultexport -nodefaultrpaths -pagezero_size -preload -read_only_relocs -sectalign -sectcreate -seg_addr_table -seg1addr -segaddr -segprot -segs_read_only_addr -segs_read_write_addr -sub_library -sub_umbrella -twolevel_namespace -twolevel_namespace_hints -umbrella -undefined -unexported_symbols_list -weak_framework name -weak_reference_mismatches -whatsloaded -whyload -F -ObjC -ObjC++ -Wnonportable-cfstrings
گزینههای DEC Alpha (DEC Alpha Options) -mno-fp-regs -msoft-float -mieee -mieee-with-inexact -mieee-conformant -mfp-trap-mode=mode -mfp-rounding-mode=mode -mtrap-precision=mode -mbuild-constants -mcpu=cpu-type -mtune=cpu-type -mbwx -mmax -mfix -mcix -msafe-bwa -msafe-partial -mfloat-vax -mfloat-ieee -mexplicit-relocs -msmall-data -mlarge-data -msmall-text -mlarge-text -mmemory-latency=time -mtls-kernel -mtls-size=bitsize -mlong-double-128 -mlong-double-64
گزینههای eBPF (eBPF Options) -mbig-endian -mlittle-endian -mframe-limit=bytes -mxbpf -mco-re -mjmpext -mjmp32 -malu32 -mv3-atomics -mbswap -msdiv -msmov -mcpu=version -masm=dialect -minline-memops-threshold=bytes -Wco-re
گزینههای FR30 (FR30 Options) -msmall-model -mno-lsim
گزینههای FRV (FRV Options) -mgpr-32 -mgpr-64 -mfpr-32 -mfpr-64 -mhard-float -msoft-float -malloc-cc -mfixed-cc -mdword -mdouble -mmedia -mmuladd -mfdpic -minline-plt -mgprel-ro -multilib-library-pic -mlinked-fp -mlong-calls -malign-labels -mlibrary-pic -macc-4 -macc-8 -mpack -mno-eflags -mno-cond-move -mno-optimize-membar -mno-scc -mno-cond-exec -mno-vliw-branch -mno-multi-cond-exec -mno-nested-cond-exec -mtomcat-stats -mTLS -mtls -mcpu=cpu
گزینههای FT32 (FT32 Options) -msim -mnodiv -mft32b -mcompress -mnopm
گزینههای GNU/Linux (GNU/Linux Options) -mglibc -muclibc -mmusl -mbionic -mandroid -tno-android-cc -tno-android-ld
گزینههای H8/300 (H8/300 Options) -mrelax -mh -ms -mn -msx -ms2600 -mquickcall -mslowbyte -mexr -mint32 -malign-300
گزینههای HPPA (HPPA Options) -march=architecture-type -mno-atomic-libcalls -mcaller-copies -mdisable-fpregs -mdisable-indexing -mordered -mfast-indirect-calls -mgas -mgnu-ld -mhp-ld -mfixed-range=register-range -mcoherent-ldcw -mlinker-opt -mlong-calls -mlong-load-store -mno-space-regs -msoft-float -mpa-risc-1-0 -mpa-risc-1-1 -mpa-risc-2-0 -mportable-runtime -mschedule=cpu-type -msoft-mult -msio -mwsio -munix=unix-std -nolibdld -static -threads
گزینههای IA-64 (IA-64 Options) -mbig-endian -mlittle-endian -mgnu-as -mgnu-ld -mno-pic -mvolatile-asm-stop -mregister-names -msdata -mconstant-gp -mauto-pic -minline-float-divide-min-latency -minline-float-divide-max-throughput -mno-inline-float-divide -minline-int-divide-min-latency -minline-int-divide-max-throughput -mno-inline-int-divide -minline-sqrt-min-latency -minline-sqrt-max-throughput -mno-inline-sqrt -mdwarf2-asm -mearly-stop-bits -mfixed-range=register-range -mtls-size=tls-size -mtune=cpu-type -milp32 -mlp64 -msched-br-data-spec -msched-ar-data-spec -msched-control-spec -msched-br-in-data-spec -msched-ar-in-data-spec -msched-in-control-spec -msched-spec-ldc -msched-spec-control-ldc -msched-stop-bits-after-every-cycle -msched-count-spec-in-critical-path -msel-sched-dont-check-control-spec -msched-fp-mem-deps-zero-cost -msched-max-memory-insns-hard-limit -msched-max-memory-insns=max-insns
گزینههای LM32 (LM32 Options) -mbarrel-shift-enabled -mdivide-enabled -mmultiply-enabled -msign-extend-enabled -muser-enabled
گزینههای LoongArch (LoongArch Options) -march=arch-type -mtune=tune-type -mabi=base-abi-type -mfpu=fpu-type -msimd=simd-type -msoft-float -msingle-float -mdouble-float -mlsx -mlasx -mbranch-cost=n -maddr-reg-reg-cost=n -mcheck-zero-division -mbreak-code=code -mcond-move-int -mcond-move-float -memcpy -mstrict-align -G num -mmax-inline-memcpy-size=n -mexplicit-relocs=style -mexplicit-relocs -mno-explicit-relocs -mdirect-extern-access -mcmodel=code-model -mrelax -mpass-mrelax-to-as -mrecip -mrecip=opt -mfrecipe -mdiv32 -mlam-bh -mlamcas -mld-seq-sa -mscq -mtls-dialect=opt -mannotate-tablejump
گزینههای LynxOS (LynxOS Options) -mshared -mthreads -mlegacy-threads
گزینههای M32C (M32C Options) -mcpu=cpu -msim -memregs=number
گزینههای M32R/D (M32R/D Options) -m32r2 -m32rx -m32r -mdebug -malign-loops -missue-rate=number -mbranch-cost=number -mmodel=code-size-model-type -msdata=sdata-type -mno-flush-func -mflush-func=name -mno-flush-trap -mflush-trap=number -G num
گزینههای M680x0 (M680x0 Options) -march=arch -mcpu=cpu -mtune=tune -m68000 -m68020 -m68020-40 -m68020-60 -m68030 -m68040 -m68060 -m68302 -m68332 -m68851 -mcpu32 -mfidoa -m5200 -m5206e -m528x -m5307 -m5407 -mcfv4e -mbitfield -mc68000 -mc68020 -mrtd -mdiv -mshort -mhard-float -m68881 -msoft-float -mpcrel -malign-int -mstrict-align -msep-data -mshared-library-id=n -mid-shared-library -mxgot -mxtls -mlong-jump-table-offsets
گزینههای MCore (MCore Options) -mhardlit -mdiv -mrelax-immediates -mwide-bitfields -m4byte-functions -mcallgraph-data -mslow-bytes -mno-lsim -mlittle-endian -mbig-endian -m210 -m340 -mstack-increment
گزینههای MicroBlaze (MicroBlaze Options) -msoft-float -mhard-float -msmall-divides -mcpu=cpu -mmemcpy -mxl-soft-mul -mxl-soft-div -mxl-barrel-shift -mxl-pattern-compare -mxl-gp-opt -mxl-multiply-high -mxl-float-convert -mxl-float-sqrt -mbig-endian -mlittle-endian -mxl-reorder -mxl-mode-app-model -mxl-prefetch -mpic-data-is-text-relative
گزینههای MIPS (MIPS Options) -EL -EB -mel -meb -march=arch -mtune=arch -mips1 -mips2 -mips3 -mips4 -mips32 -mips32r2 -mips32r3 -mips32r5 -mips32r6 -mips64 -mips64r2 -mips64r3 -mips64r5 -mips64r6 -mips16 -mmips16e2 -mflip-mips16 -minterlink-compressed -minterlink-mips16 -mabi=abi -mabicalls -mshared -mplt -mxgot -mgp32 -mgp64 -mfp32 -mfpxx -mfp64 -mhard-float -msoft-float -mno-float -msingle-float -mdouble-float -modd-spreg -mabs=mode -mnan=encoding -mdsp -mdspr2 -mmcu -meva -mvirt -mxpa -mcrc -mginv -mmicromips -mmsa -mloongson-mmi -mloongson-ext -mloongson-ext2 -mfpu=fpu-type -msmartmips -mpaired-single -mdmx -mips3d -mmt -mllsc -mlong64 -mlong32 -msym32 -Gnum -mno-local-sdata -mno-extern-sdata -mno-gopt -membedded-data -muninit-const-in-rodata -mcode-readable=setting -mno-data-in-code -mcode-xonly -msplit-addresses -mexplicit-relocs -mexplicit-relocs=release -mno-check-zero-division -mdivide-traps -mdivide-breaks -mno-load-store-pairs -mstrict-align -mno-unaligned-access -mmemcpy -mlong-calls -mmad -mimadd -mno-fused-madd -nocpp -mfix-24k -mfix-r4000 -mfix-r4400 -mfix-r5900 -mfix-r10000 -mfix-rm7000 -mfix-vr4120 -mfix-vr4130 -mfix-sb1 -mfix4300 -mr10k-cache-barrier=setting -mflush-func=func -mno-flush-func -mbranch-cost=num -mbranch-likely -mcompact-branches=policy -mno-fp-exceptions -mvr4130-align -msynci -mno-lxc1-sxc1 -mno-madd4 -mno-relax-pic-calls -mmcount-ra-address -mframe-header-opt.Sp گزینههای MMIX (MMIX Options) -mlibfuncs -mepsilon -mabi=gnu -mabi=mmixware -mzero-extend -mknuthdiv -mtoplevel-symbols -melf -mbranch-predict -mbase-addresses -msingle-exit -mset-data-start=address -mset-program-start=address -mno-set-program-start
گزینههای MN10300 (MN10300 Options) -mmult-bug -mno-mult-bug -mam33 -mam33-2 -mam34 -mtune=cpu-type -mno-return-pointer-on-d0 -mno-crt0 -mrelax -mno-liw -mno-setlb
گزینههای Moxie (Moxie Options) -meb -mel -mmul.x -mno-crt0
گزینههای MSP430 (MSP430 Options) -msim -masm-hex -mmcu=name -mlarge -msmall -mrelax -mwarn-mcu -mwarn-devices-csv -mcode-region=where -mdata-region=where -muse-lower-region-prefix -msilicon-errata=name[,name...] -msilicon-errata-warn=name[,name...] -mhwmult=type -minrt -mtiny-printf -mmax-inline-shift=n
گزینههای NDS32 (NDS32 Options) -mbig-endian -mlittle-endian -EB -EL -mabi=name -mfloat-abi=name -mreduced-regs -mfull-regs -malways-align -malign-functions -mfp-as-gp -mcmov -mhw-abs -mext-perf -mext-perf2 -mext-string -mext-dsp -mext-fpu-fma -mext-fpu-sp -mext-fpu-dp -mv3push -m16-bit -mvh -misr-vector-size=num -misr-secure=num -mcache-block-size=num -march=arch -mcpu=cpu -mconfig-fpu=num -mconfig-mul=type -mconfig-register-ports=kind -mcmodel=code-model -mctor-dtor -mrelax -mrelax-hint -msched-prolog-epilog -mno-ret-in-naked-func -malways-save-lp -munaligned-access -minline-asm-r15
گزینههای Nvidia PTX (Nvidia PTX Options) -m64 -march=arch -misa=arch -march-map=arch -mptx=version -mmainkernel -moptimize -msoft-stack -msoft-stack-reserve-local=size -muniform-simt -mgomp
گزینههای OpenRISC (OpenRISC Options) -mboard=name -mhard-mul -mhard-div -msoft-mul -msoft-div -msoft-float -mhard-float -mdouble-float -munordered-float -mcmov -mror -mrori -msext -msfimm -mshftimm -mcmodel=code-model
گزینههای PDP-11 (PDP-11 Options) -mfpu -msoft-float -mac0 -m40 -m45 -m10 -mint32 -mint16 -msplit -munix-asm -mdec-asm -mgnu-asm -mlra
گزینههای Picolibc (Picolibc Options) --oslib=library --crt0=[none|minimal|hosted|semihost] --printf=[d|f|l|i|m] --scanf=[d|f|l|i|m]
گزینههای PowerPC نگاه کنید به گزینههای RS/6000 و PowerPC.
گزینههای PRU (PRU Options) -mmcu=mcu -minrt -mno-relax -mloop -mmul -mfillzero -mabi=variant
گزینههای RISC-V (RISC-V Options) -mbranch-cost=N-instruction -mabi=ABI-string -mfdiv -mdiv -mno-fence-tso -misa-spec=ISA-spec-string -march=[ISA|Profile|Profile_ISA|processor-string] -mcpu=processor-string -mtune=processor-string -mpreferred-stack-boundary=num -msmall-data-limit=N-bytes -msave-restore -mno-shorten-memrefs -mstrict-align -mscalar-strict-align -mno-vector-strict-align -mcmodel=medlow -mcmodel=medany -mcmodel=large -mexplicit-relocs -mrelax -mriscv-attribute -malign-data=type -mbig-endian -mlittle-endian -mstack-protector-guard=guard -mstack-protector-guard-reg=reg -mstack-protector-guard-offset=offset -mcsr-check -momit-leaf-frame-pointer -mmovcc -mno-inline-atomics -mno-inline-strlen -mno-inline-strcmp -mno-inline-strncmp -mstringop-strategy=strategy -mtls-dialect=desc -mtls-dialect=trad -mrvv-vector-bits=value -mrvv-max-lmul=value -madjust-lmul-cost -mmax-vectorization -mno-autovec-segment
گزینههای RL78 (RL78 Options) -msim -mallregs -mrelax -mes0 -mmul=none -mmul=g13 -mmul=g14 -mmul=rl78 -mcpu=g10 -mcpu=g13 -mcpu=g14 -mcpu=rl78 -mg10 -mg13 -mg14 -mrl78 -msave-mduc-in-interrupts
گزینههای RS/6000 و PowerPC (RS/6000 and PowerPC Options) -mcpu=cpu-type -mtune=cpu-type -mcmodel=code-model -mprofile-kernel -mpowerpc64 -maltivec -mpowerpc-gpopt -mpowerpc-gfxopt -mmfcrf -mpopcntb -mpopcntd -mfprnd -mcmpb -mhard-dfp -mfull-toc -mminimal-toc -mno-fp-in-toc -mno-sum-in-toc -maix64 -maix32 -m64 -m32 -mxl-compat -mpe -malign-power -malign-natural -msoft-float -mhard-float -mmultiple -mupdate -mavoid-indexed-addresses -mfused-madd -mbit-align -mbit-word -mstrict-align -mrelocatable -mrelocatable-lib -mlittle -mlittle-endian -mbig -mbig-endian -mdynamic-no-pic -msingle-pic-base -mprioritize-restricted-insns=priority -msched-costly-dep=dependence_type -minsert-sched-nops=scheme -mcall-aixdesc -mcall-eabi -mcall-freebsd -mcall-linux -mcall-netbsd -mcall-openbsd -mcall-sysv -mcall-sysv-eabi -mcall-sysv-noeabi -mtraceback=traceback_type -maix-struct-return -msvr4-struct-return -mabi=abi-type -msecure-plt -mbss-plt -msplit-patch-nops -mregnames -mlongcall -mpltseq -mtls-markers -mblock-move-inline-limit=num -mblock-compare-inline-limit=num -mblock-compare-inline-loop-limit=num -mblock-ops-unaligned-vsx -mstring-compare-inline-limit=num -misel -mvsx -mvrsave -mmulhw -mdlmzb -mprototype -msim -mmvme -mads -myellowknife -memb -meabi -msdata -msdata=opt -mreadonly-in-sdata -mvxworks -G num -mrecip -mrecip=opt -mno-recip -mrecip-precision -mveclibabi=type -mfriz -mpointers-to-nested-functions -msave-toc-indirect -mpower8-fusion -mcrypto -mhtm -mquad-memory -mquad-memory-atomic -mcompat-align-parm -mfloat128 -mfloat128-hardware -mgnu-attribute -mstack-protector-guard=guard -mstack-protector-guard-reg=reg -mstack-protector-guard-offset=offset -mprefixed -mpcrel -mmma -mdense-math -mrop-protect -mprivileged -mno-splat-word-constant -mno-splat-float-constant -mno-ieee128-constant -mno-warn-altivec-long
گزینههای RX (RX Options) -m64bit-doubles -m32bit-doubles -fpu -nofpu -mcpu=name -mbig-endian-data -mlittle-endian-data -msmall-data-limit=N -msim -mas100-syntax -mrelax -mmax-constant-size=N -mint-register=N -mpid -mno-allow-string-insns -mjsr -mno-warn-multiple-fast-interrupts -msave-acc-in-interrupts -mlra
گزینههای S/390 و zSeries (S/390 and zSeries Options) -mtune=cpu-type -march=cpu-type -mhard-float -msoft-float -mhard-dfp -mlong-double-64 -mlong-double-128 -mbackchain -mpacked-stack -msmall-exec -mmvcle -m64 -m31 -mdebug -mesa -mzarch -mhtm -mvx -mzvector -mtpf-trace -mtpf-trace-skip -mmain -mfused-madd -mno-fused-madd -mwarn-framesize=framesize -mwarn-dynamicstack -mstack-size=stack-size -mno-stack-size -mstack-guard=stack-guard -mno-stack-guard -mstack-protector-guard=guard -mstack-protector-guard-record -mhotpatch=pre-halfwords,post-halfwords -mno-pic-data-is-text-relative -mindirect-branch=choice -mindirect-branch-jump=choice -mindirect-branch-call=choice -mfunction-return=choice -mfunction-return-mem=choice -mfunction-return-reg=choice -mindirect-branch-table -mfentry -mrecord-mcount -mnop-mcount -mpreserve-args -munaliged-symbols
گزینههای SH (SH Options) -m1 -m2 -m2e -m2a -m2a-nofpu -m2a-single -m2a-single-only -m3 -m3e -m4 -m4-nofpu -m4-single -m4-single-only -m4-100 -m4-100-nofpu -m4-100-single -m4-100-single-only -m4-200 -m4-200-nofpu -m4-200-single -m4-200-single-only -m4-300 -m4-300-nofpu -m4-300-single -m4-300-single-only -m4-340 -m4-400 -m4-500 -m4a -m4al -m4a-nofpu -m4a-single -m4a-single-only -mb -ml -mdalign -mrelax -mbigtable -mbitops -mfmovd -mrenesas -mnomacsave -mieee -misize -minline-ic_invalidate -mprefergot -musermode -multcost=number -mdiv=strategy -mdivsi3_libfunc=name -mfixed-range=register-range -maccumulate-outgoing-args -matomic-model=atomic-model -mbranch-cost=num -mzdcbranch -mcbranch-force-delay-slot -mfsca -mfsrra -mpretend-cmove -mfdpic -mtas -mlra
گزینههای Solaris 2 (Solaris 2 Options) -mclear-hwcap -mno-clear-hwcap -mimpure-text -mno-impure-text -gsctf
گزینههای SPARC (SPARC Options) -mcpu=cpu-type -mtune=cpu-type -mcmodel=code-model -mmemory-model=mem-model -m32 -m64 -mptr32 -mptr64 -mapp-regs -mfaster-structs -mflat -mfpu -mhard-float -msoft-float -mhard-quad-float -msoft-quad-float -mstack-bias -mstd-struct-return -munaligned-doubles -muser-mode -mv8plus -mvis -mvis2 -mvis3 -mvis3b -mvis4 -mvis4b -mcbcond -mfmaf -mfsmuld -mpopc -msubxc -mfix-at697f -mfix-ut699 -mfix-ut700 -mfix-gr712rc
گزینههای System V (System V Options) -YP,paths -Ym,dir
گزینههای V850 (V850 Options) -mlong-calls -mep -mprolog-function -mspace -mtda=n -msda=n -mzda=n -mv850 -mv850e3v5 -m850e2v4 -mv850e2v3 -mv850e2 -mv850e1 -mv850es -mv850e -mdisable-callt -mrelax -mlong-jumps -msoft-float -mhard-float -mloop -mrh850-abi -mghs -mgcc-abi -m8byte-align -mbig-switch -mapp-regs -msmall-sld -mno-strict-align -mjump-tables-in-data-section
گزینههای VAX (VAX Options) -munix -mgnu -md -md-float -mg -mg-float -mlra -mvaxc-alignment -mqmath.Sp گزینههای Visium (Visium Options) -mdebug -msim -mfpu -mhard-float -msoft-float -mcpu=cpu-type -mtune=cpu-type -msv-mode -muser-mode
گزینههای VMS (VMS Options) -mvms-return-codes -mdebug-main=prefix -mmalloc64 -mpointer-size=size
گزینههای VxWorks (VxWorks Options) -mrtp -msmp -mvthreads -non-static -Bstatic -Bdynamic -Xbind-lazy -Xbind-now
گزینههای x86 (x86 Options) -mtune=cpu-type -march=cpu-type -mtune-ctrl=feature-list -mdump-tune-features -mno-default -mfpmath=unit -masm=dialect -mno-fancy-math-387 -mno-fp-ret-in-387 -m80387 -mhard-float -msoft-float -mieee-fp -mrtd -malign-double -mpreferred-stack-boundary=num -mincoming-stack-boundary=num -mcld -mcx16 -msahf -mmovbe -mcrc32 -mmwait -mrecip -mrecip=opt -mvzeroupper -mstv -mprefer-avx128 -mprefer-vector-width=opt -mpartial-vector-fp-math -mmove-max=bits -mstore-max=bits -mnoreturn-no-callee-saved-registers -mmmx -msse -msse2 -msse3 -mssse3 -msse4.1 -msse4.2 -msse4 -mavx -mavx2 -mavx512f -mavx512cd -mavx512vl -mavx512bw -mavx512dq -mavx512ifma -mavx512vbmi -msha -maes -mpclmul -mfsgsbase -mrdrnd -mf16c -mfma -mpconfig -mwbnoinvd -mptwrite -mclflushopt -mclwb -mxsavec -mxsaves -msse4a -m3dnow -m3dnowa -mpopcnt -mabm -mbmi -mtbm -mfma4 -mxop -madx -mlzcnt -mbmi2 -mfxsr -mxsave -mxsaveopt -mrtm -mhle -mlwp -mmwaitx -mclzero -mpku -mgfni -mvaes -mwaitpkg -mshstk -mmanual-endbr -mcet-switch -mforce-indirect-call -mavx512vbmi2 -mavx512bf16 -menqcmd -mvpclmulqdq -mavx512bitalg -mmovdiri -mmovdir64b -mavx512vpopcntdq -mavx512vnni -mprfchw -mrdpid -mrdseed -msgx -mavx512vp2intersect -mserialize -mtsxldtrk -mamx-tile -mamx-int8 -mamx-bf16 -muintr -mhreset -mavxvnni -mamx-fp8 -mavx512fp16 -mavxifma -mavxvnniint8 -mavxneconvert -mcmpccxadd -mamx-fp16 -mprefetchi -mraoint -mamx-complex -mavxvnniint16 -msm3 -msha512 -msm4 -mapxf -musermsr -mavx10.1 -mavx10.2 -mamx-avx512 -mamx-tf32 -mmovrs -mamx-movrs -mavx512bmm -mcldemote -mms-bitfields -mno-align-stringops -minline-all-stringops -minline-stringops-dynamically -mstringop-strategy=alg -mkl -mwidekl -mmemcpy-strategy=strategy -mmemset-strategy=strategy -mpush-args -maccumulate-outgoing-args -m128bit-long-double -m96bit-long-double -mlong-double-64 -mlong-double-80 -mlong-double-128 -mregparm=num -msseregparm -mveclibabi=type -mvect8-ret-in-mem -mpc32 -mpc64 -mpc80 -mdaz-ftz -mstackrealign -mstack-arg-probe -momit-leaf-frame-pointer -mno-red-zone -mno-tls-direct-seg-refs -mcmodel=code-model -mabi=name -maddress-mode=mode -m32 -m64 -mx32 -m16 -miamcu -mlarge-data-threshold=num -msse2avx -mfentry -mrecord-mcount -mnop-mcount -m8bit-idiv -minstrument-return=type -mrecord-return -mfentry-name=name -mfentry-section=name -mskip-rax-setup -mavx256-split-unaligned-load -mavx256-split-unaligned-store -malign-data=type -mstack-protector-guard=guard -mstack-protector-guard-reg=reg -mstack-protector-guard-offset=offset -mstack-protector-guard-symbol=symbol -mgeneral-regs-only -mcall-ms2sysv-xlogues -mtls-dialect=type -mrelax-cmpxchg-loop -mindirect-branch=choice -mfunction-return=choice -mindirect-branch-register -mharden-sls=choice -mindirect-branch-cs-prefix -mapx-inline-asm-use-gpr32 -mgather -mscatter -mneeded -mno-direct-extern-access -munroll-only-small-loops -mdispatch-scheduler -mlam=choice
گزینههای x86 Windows گزینههای Cygwin و MinGW را ببینید.
گزینههای Xstormy16 (Xstormy16 Options) -msim
گزینههای Xtensa (Xtensa Options) -mconst16 -mforce-no-pic -mno-serialize-volatile -mtext-section-literals -mauto-litpools -mno-target-align -mlongcalls -mabi=abi-type -mextra-l32r-costs=cycles -mstrict-align
گزینههای zSeries گزینههای S/390 و zSeries را ببینید..SS "گزینههای کنترل نوع خروجی (Options Controlling the Kind of Output)" فرایند کامپایل میتواند شامل حداکثر چهار مرحله باشد: پیشپردازش، کامپایل اصلی، اسمبلی و پیونددهی، که همواره به همین ترتیب انجام میشوند. کامپایلر GCC میتواند چند فایل را پیشپردازش و کامپایل کرده و آنها را به چند فایل ورودی اسمبلر، یا به یک فایل ورودی اسمبلر تبدیل کند؛ سپس هر فایل ورودی اسمبلر یک فایل شیء (object file) تولید میکند و پیونددهی تمامی فایلهای شیء (چه مواردی که تازه کامپایل شدهاند و چه مواردی که به عنوان ورودی مشخص شدهاند) را در قالب یک فایل اجرایی با یکدیگر ترکیب میکند.
برای هر فایل ورودی مشخص، پسوند نام فایل تعیین میکند که چه نوع کامپایلی انجام شود:
- file.c
- کد منبع C که باید پیشپردازش شود.
- file.i
- کد منبع C که نباید پیشپردازش شود.
- file.ii
- کد منبع C++ که نباید پیشپردازش شود.
- file.m
- کد منبع Objective-C. توجه داشته باشید که برای کارکرد یک برنامهٔ Objective-C باید آن را با کتابخانهٔ libobjc پیوند دهید.
- file.mi
- کد منبع Objective-C که نباید پیشپردازش شود.
- file.mm
- file.M
- کد منبع Objective-C++. توجه داشته باشید که برای کارکرد یک برنامهٔ Objective-C++ باید آن را با کتابخانهٔ libobjc پیوند دهید. توجه کنید که .M دقیقاً به یک حرف بزرگ M اشاره دارد.
- file.mii
- کد منبع Objective-C++ که نباید پیشپردازش شود.
- file.h
- فایل سرآیند C، C++، Objective-C یا Objective-C++ که باید به یک سرآیند پیشکامپایلشده (پیشفرض) تبدیل شود، یا فایل سرآیند C و C++ که باید به یک Ada spec (از طریق گزینهٔ -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 spec تبدیل شود.
- file.f
- file.for
- file.ftn
- file.fi
- کد منبع فرترن با قالب ثابت (Fixed form) که نباید پیشپردازش شود.
- file.F
- file.FOR
- file.fpp
- file.FPP
- file.FTN
- کد منبع فرترن با قالب ثابت (Fixed form) که باید پیشپردازش شود (با پیشپردازندهٔ سنتی).
- file.f90
- file.f95
- file.f03
- file.f08
- file.fii
- کد منبع فرترن با قالب آزاد (Free form) که نباید پیشپردازش شود.
- file.F90
- file.F95
- file.F03
- file.F08
- کد منبع فرترن با قالب آزاد (Free form) که باید پیشپردازش شود (با پیشپردازندهٔ سنتی).
- file.cob
- file.COB
- file.cbl
- file.CBL
- کد منبع COBOL.
- file.go
- کد منبع Go.
- file.d
- کد منبع D.
- file.di
- فایل رابط (interface) دی.
- file.dd
- کد مستندات D (موسوم به Ddoc).
- file.ads
- فایل کد منبع Ada که حاوی اعلان یک واحد کتابخانهای (اعلان یک بسته، زیربرنامه، یا جنریک، یا نمونهسازی از جنریک)، یا اعلان تغییر نام یک واحد کتابخانهای (اعلان تغییر نام یک بسته، جنریک، یا زیربرنامه) است. به چنین فایلهایی specs نیز میگویند.
- file.adb
- فایل کد منبع Ada شامل بدنهٔ یک واحد کتابخانهای (بدنهٔ یک زیربرنامه یا بسته). به چنین فایلهایی bodies نیز گفته میشود.
- file.s
- کد اسمبلی (Assembler code)..IP file.S 4
- file.sx
- کد اسمبلی که باید پیشپردازش شود.
- other
- یک فایل شیء که مستقیماً به مرحلهٔ پیونددهی فرستاده میشود. هر نام فایلی بدون پسوند شناختهشده به همین صورت مدیریت میشود.
میتوانید زبان ورودی را صریحاً با گزینهٔ -x مشخص کنید:
- -x language
- --language=language
- --language language
- زبان (language) را
بهطور
صریح برای
فایلهای
ورودی پس از
آن مشخص
میکند
(بهجای
اینکه
کامپایلر
بر اساس
پسوند نام
فایل، یک
پیشفرض را
انتخاب
کند). این
گزینه بر
تمام
فایلهای
ورودی بعدی
تا گزینهٔ
بعدی -x
اعمال
میشود.
مقادیر
ممکن برای
language عبارتند
از:
c c-header cpp-output c++ c++-header c++-system-header c++-user-header c++-cpp-output c++-system-module objective-c objective-c-header objective-c-cpp-output objc-cpp-output objective-c++ objective-c++-header objective-c++-cpp-output objc++-cpp-output assembler assembler-with-cpp ada adascil adawhy cobol d f77 f77-cpp-input f95 f95-cpp-input go modula-2 modula-2-cpp-output rust algol68 lto
توجه داشته باشید که -x بر یک استاندارد زبانی خاص دلالت نمیکند. برای نمونه، ممکن است -x f77 برای برخی از کدهای مبدأ قدیمیتر، به گزینهٔ -std=legacy نیز نیاز داشته باشد.
- -x none
- هرگونه تعیین زبان را غیرفعال میکند، بهطوری که فایلهای پس از آن بر اساس پسوند نام فایلهایشان پردازش میشوند (گویی اصلاً از -x استفاده نشده است).
اگر تنها بخشهایی از مراحل کامپایل را میخواهید، میتوانید از -x (یا پسوندهای نام فایل) استفاده کنید تا به gcc بگویید از کجا شروع کند، و یکی از گزینههای -c، -S، یا -E را به کار ببرید تا مشخص کنید gcc کجا باید متوقف شود. توجه داشته باشید که برخی از ترکیبها (برای نمونه، -x cpp-output -E) به gcc دستور میدهند که اصلاً هیچ کاری انجام ندهد.
- -c
- --compile
- فایلهای
مبدأ را
کامپایل یا
اسمبلی
میکند،
اما آنها
را پیوند
نمیدهد.
مرحلهٔ
پیونددهی
انجام
نمیشود.
خروجی
نهایی
بهصورت یک
فایل شیء (object file)
بهازای هر
فایل مبدأ
خواهد بود.
بهطور پیشفرض، نام فایل شیء برای یک فایل مبدأ با جایگزین کردن پسوندهای .c، .i، .s و غیره با .o ساخته میشود.
فایلهای ورودی ناشناخته که نیازی به کامپایل یا اسمبلی ندارند، نادیده گرفته میشوند.
- -S
- --assemble
- پس از
مرحلهٔ
کامپایل
واقعی
متوقف
میشود؛
عملیات
اسمبلی را
انجام
نمیدهد.
خروجی
بهصورت یک
فایل کد
اسمبلی
برای هر
فایل
ورودیِ غیر
اسمبلیِ
مشخصشده
است.
بهطور پیشفرض، نام فایل اسمبلی برای یک فایل مبدأ با جایگزین کردن پسوندهای .c، .i و غیره با .s ساخته میشود.
فایلهای ورودی که نیازی به کامپایل ندارند نادیده گرفته میشوند.
- -E
- --preprocess
- پس از
مرحلهٔ
پیشپردازش
متوقف
میشود؛
کامپایلر
واقعی را
اجرا
نمیکند.
خروجی
بهصورت کد
مبدأ
پیشپردازششده
است که به
خروجی
استاندارد
فرستاده
میشود.
فایلهای ورودی که نیازی به پیشپردازش ندارند نادیده گرفته میشوند.
- -o file
- --output=file
- --output file
- خروجی اصلی
را در فایل
file قرار
میدهد. این
گزینه برای
هر نوع
خروجیِ
تولیدشده
اعمال
میشود، چه
یک فایل
اجرایی
باشد، چه یک
فایل شیء،
یک فایل
اسمبلی، یا
کد C
پیشپردازششده.
اگر -o مشخص نشود، پیشفرض این است که فایل اجرایی در a.out، فایل شیءِ مربوط به source.suffix در source.o، فایل اسمبلی آن در source.s، فایل سرآیند پیشکامپایلشده در source.suffix.gch، و تمام کدهای C پیشپردازششده در خروجی استاندارد قرار گیرند.
اگرچه -o تنها خروجی اصلی را نامگذاری میکند، اما بر نامگذاری خروجیهای کمکی (auxiliary) و خروجیهای رونوشت (dump) نیز اثر میگذارد. مثالهای زیر را ببینید. مگر در صورت بازنویسی، هر دو خروجی کمکی و رونوشت در همان دایرکتوری خروجی اصلی قرار میگیرند. در خروجیهای کمکی، پسوند فایل ورودی با پسوند نوع فایل خروجی کمکی جایگزین میشود؛ در خروجیهای رونوشت، پسوند فایل رونوشت به انتهای پسوند فایل ورودی اضافه میشود. در دستورات کامپایل، نام پایهٔ (base name) هر دو خروجی کمکی و رونوشت همان نام خروجی اصلی است؛ در دستورات کامپایل و پیوند، نام خروجی اصلی منهای پسوند اجرایی با نام فایل ورودی ترکیب میشود. اگر هر دو، بدون در نظر گرفتن پسوند، نام پایهٔ یکسانی داشته باشند، نتیجهٔ ترکیب همان نام پایه خواهد بود؛ در غیر این صورت، با یک خط تیره (-) به یکدیگر متصل میشوند.
gcc -c foo.c ...
از foo.o بهعنوان خروجی اصلی استفاده میکند و خروجیهای کمکی و رونوشت را در کنار آن قرار میدهد؛ مثلاً فایل کمکی foo.dwo برای -gsplit-dwarf، و فایل رونوشت foo.c.???r.final برای -fdump-rtl-final.
اگر یک فایل خروجیِ غیر پیونددهنده صریحاً مشخص شده باشد، فایلهای کمکی و رونوشت بهطور پیشفرض همان نام پایه را میگیرند:
gcc -c foo.c -o dir/foobar.o ...
خروجیهای کمکی را به نام dir/foobar.* و خروجیهای رونوشت را به نام dir/foobar.c.* نامگذاری خواهد کرد.
در عوض، یک خروجی پیونددهنده به خروجیهای کمکی و رونوشت پیشوند میزند:
gcc foo.c bar.c -o dir/foobar ...
عموماً خروجیهای کمکی را به نام dir/foobar-foo.* و dir/foobar-bar.*، و خروجیهای رونوشت را به نام dir/foobar-foo.c.* و dir/foobar-bar.c.* نامگذاری خواهد کرد.
تنها استثنا در موارد بالا زمانی است که فایل اجرایی نام پایهای یکسان با تک ورودی داشته باشد:
gcc foo.c -o dir/foo ...
در این حالت، خروجیهای کمکی با نام dir/foo.* و خروجیهای رونوشت با نام dir/foo.c.* نامگذاری میشوند.
مکان و نامهای خروجیهای کمکی و رونوشت را میتوان با گزینههای -dumpbase، -dumpbase-ext، -dumpdir، -save-temps=cwd و -save-temps=obj تنظیم کرد.
- -dumpbase dumpbase
- --dumpbase dumpbase
- این گزینه
نام پایه را
برای
فایلهای
خروجی کمکی
و رونوشت (dump)
تنظیم
میکند. این
گزینه بر
نام فایل
خروجی اصلی
تأثیری
ندارد.
خروجیهای
میانی، در
صورت
نگهداری،
بهعنوان
خروجیهای
اصلی محسوب
نمیشوند،
بلکه
خروجیهای
کمکی در نظر
گرفته
میشوند: gcc -save-temps
-S foo.c
فایل پیشپردازششدهٔ (دیگر غیر) موقت را در foo.i ذخیره کرده و سپس به فایل خروجی (ضمنی) foo.s کامپایل میکند، در حالی که:
gcc -save-temps -dumpbase save-foo -c foo.c
پیشپردازش را در save-foo.i انجام میدهد، به save-foo.s (که اکنون یک خروجی میانی و در نتیجه کمکی است) کامپایل میکند، و سپس به فایل خروجی (ضمنی) foo.o اسمبلی میکند.
در نبود این گزینه، فایلهای dump و aux نام خود را از فایل ورودی یا در صورت تعیین صریح، از فایل خروجی (غیر پیونددهنده) میگیرند: فایلهای خروجی dump (برای نمونه مواردی که با گزینههای -fdump-* درخواست شدهاند) همراه با پسوند نام ورودی، و فایلهای خروجی aux (مواردی که با سایر گزینههای غیر dump درخواست شدهاند، مانند "-save-temps"، "-gsplit-dwarf" و "-fcallgraph-info") بدون آن.
تفکیک مشابه پسوند برای خروجیهای dump و aux را میتوان برای -dumpbase 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 " ...
خروجیهای aux را dir/foo.* و خروجیهای dump را dir/foo.c.* نامگذاری خواهد کرد. توجه کنید که چگونه نامهای پایهٔ آنها از نام ورودی گرفته شده است، اما دایرکتوری همچنان بهطور پیشفرض همان دایرکتوری خروجی است.
رشتهٔ خالی dumpbase مانع استفاده از نام پایهٔ خروجی برای خروجیهای مرحلهٔ پیونددهی نمیشود:
gcc foo.c bar.c -o dir/foobar -dumpbase " -flto ...
کامپایل فایلهای مبدأ خروجیهای کمکی را به نامهای dir/foo.* و dir/bar.*، و خروجیهای dump را به نامهای dir/foo.c.* و dir/bar.c.* نامگذاری خواهد کرد. کامپایل مجدد LTO در طول پیونددهی از dir/foobar. به عنوان پیشوند برای فایلهای dump و کمکی استفاده خواهد کرد.
- -dumpbase-ext auxdropsuf
- --dumpbase-ext auxdropsuf
- هنگام
شکلدهی به
نام فایل
خروجی کمکی
(و نه خروجی
dump)، پسوند
انتهایی auxdropsuf
را قبل از
افزودن
هرگونه
پسوندی از
dumpbase حذف
میکند. در
صورت عدم
تعیین، این
گزینه
بهطور
پیشفرض به
پسوند یک dumpbase
پیشفرض
تبدیل
میشود،
یعنی پسوند
فایل ورودی
هنگامی که
-dumpbase در خط
فرمان وجود
ندارد، یا
زمانی که dumpbase
با dumppfx ترکیب
شده باشد.
gcc foo.c -c -o dir/foo.o -dumpbase x-foo.c -dumpbase-ext .c ...
dir/foo.o را به عنوان خروجی اصلی ایجاد میکند، و با استفاده از مکان خروجی اصلی و حذف پسوند .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
- --dumpdir dumppfx
- هنگام
شکلدهی به
نام فایل
خروجی کمکی
یا dump، از dumppfx
به عنوان
پیشوند
استفاده
میکند:
gcc -dumpdir pfx- -c foo.c ...
foo.o را به عنوان خروجی اصلی، و خروجیهای کمکی را به نام pfx-foo.* ایجاد میکند، که dumppfx دادهشده را با dumpbase پیشفرض مشتقشده از خروجی اصلی پیشفرض (که آن هم به نوبهٔ خود از نام ورودی مشتق شده است) ترکیب مینماید. خروجیهای dump پسوند نام ورودی را نیز دریافت میکنند: pfx-foo.c.*.
اگر قرار است از dumppfx به عنوان نام دایرکتوری استفاده شود، باید به یک جداکنندهٔ دایرکتوری ختم گردد:
gcc -dumpdir dir/ -c foo.c -o obj/bar.o ...
obj/bar.o را به عنوان خروجی اصلی، و خروجیهای کمکی را به نام dir/bar.* ایجاد میکند، که dumppfx دادهشده را با dumpbase پیشفرض مشتقشده از نام خروجی اصلی ترکیب مینماید. خروجیهای dump پسوند نام ورودی را نیز دریافت میکنند: dir/bar.c.*.
مقدار پیشفرض آن مکان فایل خروجی است، مگر اینکه فایل خروجی یک فایل ویژه مانند "/dev/null" باشد. گزینههای -save-temps=cwd و -save-temps=obj این پیشفرض را نادیده گرفته و بازنویسی میکنند، درست مانند گزینهٔ صریح -dumpdir. در صورتی که چندین گزینه از این دست داده شود، آخرین گزینه اولویت خواهد داشت:
gcc -dumpdir pfx- -c foo.c -save-temps=obj ...
foo.o را خروجی میدهد، با خروجیهای کمکی به نام foo.* زیرا -save-temps=* جایگزین dumppfx دادهشده توسط گزینهٔ پیشین -dumpdir میشود. فرقی نمیکند که =obj مقدار پیشفرض برای -save-temps باشد، یا دایرکتوری خروجی بهطور ضمنی همان دایرکتوری جاری باشد. خروجیهای dump به صورت foo.c.* نامگذاری میشوند.
هنگام کامپایل از چندین فایل ورودی، اگر -dumpbase مشخص شده باشد، dumpbase منهای پسوند auxdropsuf و یک خط تیره، به یک dumppfx صریح یا پیشفرض الحاق میشوند (یا در صورت داشتن هرگونه مؤلفهٔ دایرکتوری، کاملاً جایگزین آن میگردند)، به گونهای که هر یک از کامپایلهای چندگانه، خروجیهای aux و dump با نامهای متفاوتی دریافت کنند.
gcc foo.c bar.c -c -dumpdir dir/pfx- -dumpbase main ...
خروجیهای کمکی dump را به صورت dir/pfx-main-foo.* و dir/pfx-main-bar.* تولید میکند که dumpbase- را به dumppfx الحاق کرده است. خروجیهای dump به ترتیب پسوند فایل ورودی را حفظ میکنند: dir/pfx-main-foo.c.* و dir/pfx-main-bar.c.*. این مورد را با کامپایل تکورودی مقایسه کنید: gcc foo.c -c -dumpdir dir/pfx- -dumpbase main ...
که با اعمال -dumpbase روی یک فایل مبدأ منفرد، یک dumpbase جداگانه را به ازای هر فایل ورودی محاسبه و الحاق نمیکند. خروجیهای کمکی و رونوشت (dump) آن در dir/pfx-main.* قرار میگیرند.
هنگام کامپایل و سپس پیوند دادن چند فایل ورودی، یک dumppfx پیشفرض یا صریحاً مشخصشده نیز تحت تبدیل dumpbase فوق قرار میگیرد (مانند کامپایل foo.c و bar.c در بالا، ولی بدون -c). اگر نه -dumpdir و نه -dumpbase مشخص نشده باشند، نام پایه خروجی پیونددهنده منهای auxdropsuf (در صورت مشخص بودن) یا پسوند اجرایی (در غیر این صورت)، به همراه یک خط پیوند به جای آن به dumppfx پیشفرض اضافه میشود. با این حال توجه داشته باشید که بر خلاف حالتهای پیشین پیوند دادن:
gcc foo.c bar.c -dumpdir dir/pfx- -o main ...
نام خروجی main را به dumppfx الحاق نمیکند، زیرا -dumpdir صریحاً مشخص شده است. هدف این است که dumppfx صریحاً مشخصشده بتواند در صورت تمایل، نام خروجی تعیینشده را به عنوان بخشی از پیشوند داشته باشد؛ تنها یک -dumpbase صریحاً مشخصشده با آن ترکیب خواهد شد تا از نادیده گرفتن ساده یک گزینه معنادار جلوگیری شود.
هنگام کامپایل و سپس پیوند دادن از یک فایل ورودی منفرد، نام پایه خروجی پیونددهنده تنها در صورتی همانند بالا به dumppfx پیشفرض اضافه خواهد شد که نام پایه مشترکی با نام فایل ورودی منفرد نداشته باشد. این مورد در حالتهای پیوند تکورودی بالا پوشش داده شد، اما نه با یک -dumpdir صریح که مانع این ترکیب میشود، حتی اگر توسط -save-temps=* لغو شده باشد:
gcc foo.c -dumpdir alt/pfx- -o dir/main.exe -save-temps=cwd ...
خروجیهای کمکی با نام foo.* و خروجیهای رونوشت با نام foo.c.* در پوشه کاری جاری نامگذاری میشوند، همانطور که در نهایت توسط -save-temps=cwd درخواست شده است.
برای جمعبندی همه این موارد در یک جریان داده شهودی اگرچه کمی غیردقیق: نام خروجی اولیه به یک بخش پوشه و یک بخش نام پایه شکسته میشود؛ dumppfx بر روی اولی تنظیم میشود، مگر اینکه توسط -dumpdir یا -save-temps=* لغو شود، و dumpbase بر روی دومی تنظیم میگردد، مگر اینکه توسط -dumpbase بازنویسی شود. چنانچه چندین ورودی وجود داشته باشد یا پیوند انجام گیرد، این dumpbase ممکن است با dumppfx ترکیب شده و از هر فایل ورودی گرفته شود. نامهای خروجی کمکی برای هر ورودی با ترکیب dumppfx، dumpbase منهای پسوند، و پسوند خروجی کمکی شکل میگیرند؛ نامهای خروجی رونوشت تنها از این جهت متفاوتند که پسوند dumpbase در آنها حفظ میشود.
هنگامی که صحبت از خروجیهای کمکی و رونوشت ایجادشده در طی کامپایل مجدد LTO به میان میآید، ترکیبی از dumppfx و dumpbase، همانگونه که داده شده یا همانطور که از نام خروجی پیونددهنده (و نه ورودیها) مشتق شده است، حتی در مواردی که این ترکیب در غیر این صورت بدین شکل به کار نمیرفت، به همراه یک نقطه انتهایی که جایگزین خط تیره اضافهشده توسط کامپایلر (در صورت وجود) میشود، به عنوان یک گزینه -dumpdir به lto-wrapper ارسال میشود؛ از آنجا که این برنامه در پیوند دادن درگیر است، معمولاً هیچ -dumpbase و -dumpbase-ext دریافت نمیکند و آنها را نادیده میگیرد.
هنگام اجرای زیرکامپایلرها، lto-wrapper نام مراحل LTO را به dumppfx دریافتی اضافه میکند، اطمینان حاصل میکند که شامل یک مؤلفه پوشه باشد تا بر هر -dumpdir ارجحیت یابد، و آن را به عنوان -dumpbase به زیرکامپایلرها ارسال مینماید.
- -v
- --verbose
- دستورهای اجراشده برای اجرای مراحل کامپایل را (در خروجی استاندارد خطا) چاپ میکند. همچنین شماره نگارش برنامه راهانداز کامپایلر، پیشپردازنده و خود کامپایلر را چاپ میکند.
- -###
- مانند -v است، با این تفاوت که دستورها اجرا نمیشوند و آرگومانها درون نقلقول قرار میگیرند، مگر اینکه فقط شامل نویسههای الفباییعددی یا "./-_" باشند. این گزینه برای اسکریپتهای شل جهت دریافت خطوط فرمان تولیدشده توسط راهانداز مفید است.
- --help
- توضیحی از گزینههای خط فرمان قابل درک برای gcc را (در خروجی استاندارد) چاپ میکند. اگر گزینه -v نیز مشخص شده باشد، آنگاه --help به فرایندهای گوناگون فراخوانیشده توسط gcc نیز ارسال میشود تا بتوانند گزینههای خط فرمانی را که میپذیرند نمایش دهند. چنانچه گزینه -Wextra نیز (پیش از گزینه --help) مشخص شده باشد، گزینههای خط فرمانی که هیچ مستنداتی ندارند نیز نمایش داده میشوند.
- --target-help
- توضیحی از گزینههای خط فرمان مختص مقصد (target) را برای هر ابزار (در خروجی استاندارد) چاپ میکند. برای برخی مقصدها ممکن است اطلاعات مختص مقصد بیشتری نیز چاپ شود.
- --help={class|[^]qualifier}[,...]
- توضیحی از گزینههای خط فرمان قابل فهم برای کامپایلر را (در خروجی استاندارد) چاپ میکند که در تمام ردهها و توصیفکنندههای مشخصشده میگنجند. ردههای پشتیبانیشده عبارتند از:
- optimizers
- تمام گزینههای بهینهسازی پشتیبانیشده توسط کامپایلر را نمایش میدهد.
- warnings
- تمام گزینههای کنترلکننده پیامهای هشدار تولیدشده توسط کامپایلر را نمایش میدهد.
- target
- گزینههای مختص مقصد را نمایش میدهد. با این حال بر خلاف گزینه --target-help، گزینههای مختص مقصد پیونددهنده و اسمبلر نمایش داده نمیشوند. زیرا آن ابزارها در حال حاضر از نحو گسترشیافته --help= پشتیبانی نمیکنند.
- params
- مقدارهای شناختهشده توسط گزینه --param را نمایش میدهد.
- language
- گزینههای پشتیبانیشده برای language را نمایش میدهد، که در آن language نام یکی از زبانهای پشتیبانیشده در این نگارش GCC است. اگر گزینهای توسط همه زبانها پشتیبانی شود، باید رده common انتخاب گردد.
- common
- گزینههایی را که بین تمام زبانها مشترک هستند نمایش میدهد.
توصیفکنندههای پشتیبانیشده عبارتند از:
- undocumented
- تنها گزینههایی را نمایش میدهد که فاقد مستندات هستند.
- joined
- گزینههایی را نمایش میدهد که آرگومانی میپذیرند که پس از یک علامت مساوی در همان قطعه متن پیوسته میآید، مانند: --help=target.
- separate
- گزینههایی را نمایش میدهد که آرگومانی میپذیرند که به صورت یک واژه جداگانه به دنبال گزینه اصلی میآید، مانند: -o output-file.
بنابراین برای نمونه جهت نمایش تمام سوییچهای مختص مقصد فاقد مستندات که توسط کامپایلر پشتیبانی میشوند، از این دستور استفاده کنید:
--help=target,undocumented
معنای یک توصیفکننده میتواند با افزودن نویسه ^ به ابتدای آن معکوس شود؛ بنابراین برای نمونه جهت نمایش تمام گزینههای هشدار دودویی (یعنی مواردی که یا روشن یا خاموش هستند و آرگومانی نمیپذیرند) که دارای توضیحات هستند، استفاده کنید از:
--help=warnings,^joined,^undocumented
آرگومان --help= نباید صرفاً از توصیفکنندههای معکوسشده تشکیل شود.
ترکیب چند رده ممکن است، هرچند که این کار معمولاً خروجی را آنقدر محدود میکند که چیزی برای نمایش باقی نمیماند. با این حال، یک حالت که در آن جواب میدهد، زمانی است که یکی از ردهها target باشد. برای نمونه، جهت نمایش تمام گزینههای بهینهسازی مختص مقصد، استفاده کنید از:
--help=target,optimizers
گزینه --help= میتواند در خط فرمان تکرار شود. هر بار استفاده متوالی، رده درخواستی گزینههای خود را نمایش میدهد و از مواردی که قبلاً نمایش داده شدهاند صرفنظر میکند. اگر --help نیز در هر کجای خط فرمان مشخص شده باشد، آنگاه نسبت به هر گزینه --help= اولویت خواهد داشت.
اگر گزینه -Q در خط فرمان قبل از گزینه --help= ظاهر شود، متن توصیفی نمایشدادهشده توسط --help= تغییر میکند. به جای شرح گزینههای نمایشیافته، نشان داده میشود که آیا گزینه فعال، غیرفعال یا روی یک مقدار معین تنظیم شده است (با این فرض که کامپایلر در نقطهای که گزینه --help= استفاده شده، از این موضوع آگاه باشد).
در اینجا
یک مثال
خلاصهشده
از پورت ARM
برای gcc
آورده شده
است: % gcc -Q -mabi=2 --help=target -c The following
options are target specific: -mabi= 2 -mabort-on-noreturn [disabled] -mapcs
[disabled]
خروجی نسبت به اثرات گزینههای پیشین خط فرمان حساس است، بنابراین به عنوان مثال میتوان با استفاده از دستور زیر دریافت که کدام بهینهسازیها در -O2 فعال هستند:
-Q -O2 --help=optimizers
همچنین میتوانید با استفاده از دستور زیر متوجه شوید که کدام بهینهسازیهای دودویی توسط -O3 فعال میشوند:
gcc -c -Q -O3 --help=optimizers > /tmp/O3-opts gcc -c -Q -O2 --help=optimizers > /tmp/O2-opts diff /tmp/O2-opts /tmp/O3-opts | grep enabled
- --version
- شماره نسخه و کپیرایتهای GCC فراخوانیشده را نمایش میدهد.
- -pass-exit-codes
- --pass-exit-codes
- در حالت عادی، اگر هر فازی از کامپایلر یک کد بازگشتی ناموفق برگرداند، برنامه gcc با کد ۱ خارج میشود. اگر -pass-exit-codes را مشخص کنید، برنامه gcc در عوض با بزرگترین کد خطای عددی ایجادشده توسط فازی که وضعیت خطا را اعلام کرده است، خارج میشود. فرانتاندهای C، C++ و Fortran در صورت مواجهه با خطای داخلی کامپایلر، کد ۴ را بازمیگردانند.
- -pipe
- --pipe
- برای برقراری ارتباط میان مراحل مختلف کامپایل، به جای فایلهای موقت از لولهها (pipes) استفاده میکند. این گزینه روی برخی سیستمها که در آنها اسمبلر قادر به خواندن از لوله نیست با شکست مواجه میشود؛ اما اسمبلر GNU مشکلی در این زمینه ندارد.
- -wrapper
- تمام
زیردستورها
را تحت یک
برنامه
پوششدهنده
(wrapper) فراخوانی
میکند. نام
برنامه
پوششدهنده
و
پارامترهای
آن به صورت
یک فهرست
جداشده با
کاما ارسال
میشوند.
gcc -c t.c -wrapper gdb,--args
این کار تمام زیربرنامههای gcc را تحت gdb --args فراخوانی میکند، بنابراین فراخوانی cc1 به صورت gdb --args cc1 ... خواهد بود.
- -ffile-prefix-map=old=new
- هنگام کامپایل فایلهای واقع در دایرکتوری old، هرگونه ارجاع به آنها را در نتیجه کامپایل به گونهای ثبت میکند که گویی فایلها در دایرکتوری new قرار دارند. مشخص کردن این گزینه معادل مشخص کردن تمام گزینههای تکی -f*-prefix-map است. از این گزینه میتوان برای ساختهای بازتولیدپذیر (reproducible builds) که مستقل از مکان هستند استفاده کرد. دایرکتوریهایی که توسط رهنمودها (directives) ارجاع داده میشوند تحت تأثیر این گزینهها قرار نمیگیرند. همچنین گزینههای -fmacro-prefix-map، -fdebug-prefix-map، -fprofile-prefix-map و -fcanon-prefix-map را ببینید.
- -fcanon-prefix-map
- برای گزینههای -f*-prefix-map، در حالت عادی مقایسه پیشوند old با نام فایلی که معمولاً در نتیجه کامپایل به آن ارجاع داده میشود، با مقایسه متنی پیشوندها یا بدون در نظر گرفتن بزرگی و کوچکی حروف در سیستمهای فایلی حساس نبودن به حروف بزرگ و کوچک، و یکسان دانستن اسلش و بکاسلش در سیستمهای فایلی مبتنی بر DOS انجام میشود. گزینه -fcanon-prefix-map باعث میشود این مقایسهها روی مسیرهای استانداردشده (canonicalized) مربوط به old و نام فایل ارجاعدادهشده انجام گیرد.
- -fplugin=name.so
- کد افزونه (plugin) موجود در فایل name.so را بارگذاری میکند، با این فرض که یک شیء مشترک (shared object) است که باید توسط کامپایلر dlopen' شود. نام پایه فایل شیء مشترک برای شناسایی افزونه به منظور تجزیه آرگومانها استفاده میشود (به -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 بیشتری باشد؛ هرکدام از این گزینهها به صورت بازگشتی پردازش خواهند شد..SS "کامپایل برنامههای C++ (Compiling C++ Programs)" فایلهای منبع C++ به طور مرسوم از یکی از پسوندهای .C، .cc، .cpp، .CPP، .c++، .cp یا .cxx استفاده میکنند؛ فایلهای سرآیند (header) C++ اغلب از .hh، .hpp، .H یا (برای کدهای قالب اشتراکی) .tcc استفاده میکنند؛ فایلهای پیشپردازششده C++ از پسوند .ii استفاده میکنند؛ و واحدهای رابط ماژول C++20 گاهی از .ixx، .cppm، .cxxm، .c++m یا .ccm بهره میبرند.
کامپایلر GCC فایلهایی با این نامها را تشخیص داده و آنها را به عنوان برنامههای C++ کامپایل میکند، حتی اگر کامپایلر را به همان شیوهای که برای کامپایل برنامههای C به کار میبرید فراخوانی کنید (معمولاً با نام gcc).
با این حال، استفاده از gcc کتابخانه C++ را اضافه نمیکند. g++ برنامهای است که GCC را فراخوانی کرده و به طور خودکار پیوند دادن (linking) با کتابخانه C++ را مشخص میکند. این برنامه با فایلهای .c، .h و .i مانند فایلهای منبع C++ به جای فایلهای منبع C رفتار میکند، مگر اینکه گزینه -x استفاده شده باشد. این برنامه همچنین هنگام پیشکامپایل کردن یک فایل سرآیند C با پسوند .h برای استفاده در کامپایلهای C++ مفید است. در بسیاری از سیستمها، g++ با نام c++ نیز نصب میشود.
هنگامی که برنامههای C++ را کامپایل میکنید، میتوانید بسیاری از همان گزینههای خط فرمانی را که برای کامپایل برنامهها در هر زبان دیگری به کار میبرید، مشخص کنید؛ یا گزینههای خط فرمانی که برای C و زبانهای مرتبط معنا دارند؛ یا گزینههایی که منحصراً برای برنامههای C++ معنادار هستند.
گزینههای کنترلکننده گویش C (Options Controlling C Dialect)
گزینههای زیر گویش زبان C (یا زبانهای مشتقشده از C مانند C++، Objective-C و Objective-C++) را که کامپایلر میپذیرد، کنترل میکنند:
- -ansi
- --ansi
- در حالت C، این گزینه معادل -std=c90 است. در حالت C++، معادل -std=c++98 است.
- -std=
- استاندارد
زبان را
تعیین
میکند. این
گزینه در
حال حاضر
فقط هنگام
کامپایل C
یا C++
پشتیبانی
میشود.
کامپایلر میتواند چندین استاندارد پایه، مانند c90 یا c++98، و گویشهای GNU از آن استانداردها مانند gnu90 یا gnu++98 را بپذیرد. هنگامی که یک استاندارد پایه مشخص میشود، کامپایلر تمام برنامههای منطبق با آن استاندارد به علاوه برنامههایی را که از افزونههای GNU استفاده میکنند و با آن در تناقض نیستند، میپذیرد. برای مثال، -std=c90 قابلیتهای خاصی از GCC را که با استاندارد ISO C90 ناسازگار هستند خاموش میکند، مانند کلمات کلیدی "asm" و "typeof"، اما سایر افزونههای GNU را که در ISO C90 معنایی ندارند غیرفعال نمیکند، مانند حذف عبارت میانی در یک عبارت شرطی "?:". از سوی دیگر، هنگامی که یک گویش GNU از یک استاندارد مشخص میشود، تمام قابلیتهای پشتیبانیشده توسط کامپایلر فعال میشوند، حتی زمانی که این قابلیتها معنای استاندارد پایه را تغییر دهند. در نتیجه، ممکن است برخی از برنامههایی که انطباق سختگیرانه دارند رد شوند. این استاندارد خاص توسط -Wpedantic برای شناسایی این که کدام قابلیتها بر اساس آن نسخه از استاندارد افزونههای GNU محسوب میشوند، استفاده میگردد. برای مثال، -std=gnu90 -Wpedantic درباره کامنتهای سبک C++ با // هشدار میدهد، در حالی که -std=gnu99 -Wpedantic هشداری نمیدهد.
باید مقداری برای این گزینه مشخص شود؛ مقادیر ممکن عبارتند از:
- c90
- c89
- iso9899:1990
- پشتیبانی از تمام برنامههای ISO C90 (برخی افزونههای GNU که با ISO C90 در تضاد هستند غیرفعال میشوند). همانند -ansi برای کد C.
- iso9899:199409
- استاندارد ISO C90 همانگونه که در اصلاحیه ۱ (amendment 1) اصلاح شده است.
- c99
- c9x
- iso9899:1999
- iso9899:199x
- استاندارد ISO C99. این استاندارد اساساً به طور کامل پشتیبانی میشود، به جز باگها و مسائل مربوط به ممیز شناور (floating-point) (عمدتاً، اما نه کاملاً، مرتبط با قابلیتهای اختیاری C99 از پیوستهای F و G). برای اطلاعات بیشتر https://gcc.gnu.org/projects/c-status.html را ببینید. نامهای c9x و iso9899:199x منسوخ شدهاند.
- c11
- c1x
- iso9899:2011
- استاندارد ISO C11، بازبینی سال ۲۰۱۱ استاندارد ISO C. این استاندارد اساساً به طور کامل پشتیبانی میشود، به جز باگها، مسائل ممیز شناور (عمدتاً، اما نه کاملاً، مرتبط با قابلیتهای اختیاری C11 از پیوستهای F و G) و پیوستهای اختیاری K (رابطهای بررسی حدود - Bounds-checking interfaces) و L (تحلیلپذیری - Analyzability). نام c1x منسوخ شده است.
- c17
- c18
- iso9899:2017
- iso9899:2018
- استاندارد ISO C17، بازبینی سال ۲۰۱۷ استاندارد ISO C (منتشر شده در سال ۲۰۱۸). این استاندارد به جز اصلاح نقایص (که همگی با -std=c11 نیز اعمال میشوند) و یک مقدار جدید برای "__STDC_VERSION__"، همانند C11 است و بنابراین به همان میزان C11 پشتیبانی میشود.
- c23
- c2x
- iso9899:2024
- استاندارد ISO C23، بازبینی سال ۲۰۲۳ استاندارد ISO C (منتشر شده در سال ۲۰۲۴). نام c2x منسوخ شده است.
- c2y
- نسخه بعدی استاندارد ISO C که همچنان در حال توسعه است. پشتیبانی از این نسخه آزمایشی و ناقص است.
- gnu90
- gnu89
- گویش GNU از ISO C90 (شامل برخی از قابلیتهای C99).
- gnu99
- gnu9x
- گویش GNU از ISO C99. نام gnu9x منسوخ شده است.
- gnu11
- gnu1x
- گویش GNU از ISO C11. نام gnu1x منسوخ شده است.
- gnu17
- gnu18
- گویش GNU از ISO C17.
- gnu23
- gnu2x
- گویش GNU از ISO C23. این مقدار پیشفرض برای کد C است. نام gnu2x منسوخ شده است.
- gnu2y
- نسخه بعدی استاندارد ISO C که هنوز در حال توسعه است، به همراه افزونههای GNU. پشتیبانی از این نسخه آزمایشی و ناقص است. نام gnu2x منسوخ شده است.
- c++98
- c++03
- استاندارد ISO C++ سال ۱۹۹۸ بههمراه اصلاحیه فنی سال ۲۰۰۳ و برخی گزارشهای نقص (defect reports) تکمیلی. مشابه -ansi برای کد C++.
- gnu++98
- gnu++03
- گویش GNU از -std=c++98.
- c++11
- c++0x
- استاندارد ISO C++ سال ۲۰۱۱ بههمراه اصلاحیهها. نام c++0x منسوخ شده است.
- gnu++11
- gnu++0x
- گویش GNU از -std=c++11. نام gnu++0x منسوخ شده است.
- c++14
- c++1y
- استاندارد ISO C++ سال ۲۰۱۴ بههمراه اصلاحیهها. نام c++1y منسوخ شده است.
- gnu++14
- gnu++1y
- گویش GNU از -std=c++14. نام gnu++1y منسوخ شده است.
- c++17
- c++1z
- استاندارد ISO C++ سال ۲۰۱۷ بههمراه اصلاحیهها. نام c++1z منسوخ شده است.
- gnu++17
- gnu++1z
- گویش GNU از -std=c++17. نام gnu++1z منسوخ شده است.
- c++20
- c++2a
- استاندارد ISO C++ سال ۲۰۲۰ بههمراه اصلاحیهها. پشتیبانی از ماژولهای C++20 هنوز آزمایشی است و باید با گزینهٔ -fmodules فعال شود. نام c++2a منسوخ شده است.
- gnu++20
- gnu++2a
- گویش GNU از -std=c++20. این مقدار پیشفرض برای کد C++ است. پشتیبانی از ماژولهای C++20 هنوز آزمایشی است و باید با گزینهٔ -fmodules فعال شود. نام gnu++2a منسوخ شده است.
- c++23
- c++2b
- استاندارد ISO C++ سال ۲۰۲۳ بههمراه اصلاحیهها (منتشر شده در سال ۲۰۲۴). پشتیبانی آزمایشی است و ممکن است در نگارشهای آینده به شیوههایی ناسازگار تغییر کند. نام c++2b منسوخ شده است.
- gnu++23
- gnu++2b
- گویش GNU از -std=c++23. پشتیبانی آزمایشی است و ممکن است در نگارشهای آینده به شیوههایی ناسازگار تغییر کند. نام gnu++2b منسوخ شده است.
- c++2c
- c++26
- بازنگری بعدی استاندارد ISO C++ که برای سال ۲۰۲۶ برنامهریزی شده است. پشتیبانی بسیار آزمایشی است و تقریباً بهطور قطع در نگارشهای آینده به شیوههایی ناسازگار تغییر خواهد کرد.
- gnu++2c
- gnu++26
- گویش GNU از -std=c++2c. پشتیبانی بسیار آزمایشی است و تقریباً بهطور قطع در نگارشهای آینده به شیوههایی ناسازگار تغییر خواهد کرد.
- -aux-info filename
- اعلانهای
دارای
پیشنمونه
(prototyped declarations) برای
تمامی
توابع
اعلامشده
و/یا
تعریفشده
در یک واحد
ترجمه (translation unit)،
از جمله
توابع
موجود در
فایلهای
سرایند را
در
نامفایل
ارائهشده
مینویسد.
این گزینه
برای هر
زبانی جز C
بدون هیچ
هشداری
نادیده
گرفته
میشود.
علاوه بر اعلانها، این فایل در قالب توضیح (comment) مبدأ هر اعلان (فایل مبدأ و خط)، اینکه اعلان ضمنی، دارای پیشنمونه یا بدون پیشنمونه بوده است (I، N برای جدید یا O برای قدیمی، بهترتیب، در نخستین نویسه پس از شماره خط و دونقطه)، و اینکه آیا از یک اعلان ناشی شده یا یک تعریف (C یا F، بهترتیب، در نویسهٔ بعدی) را مشخص میکند. در مورد تعریف توابع، فهرستی از آرگومانها به سبک K&R که اعلانهایشان در پی آن میآید نیز در داخل توضیحات، پس از اعلان ارائه میشود.
- -fno-asm
- کلمات
"asm"،
"inline" یا
"typeof" را
به عنوان
کلیدواژه
شناسایی
نمیکند تا
کد بتواند
از این
واژهها به
عنوان
شناسه
استفاده
کند. در عوض
میتوانید
از
کلیدواژههای
"__asm__"،
"__inline__" و
"__typeof__"
استفاده
کنید. در C،
گزینهٔ -ansi
مستلزم -fno-asm
است.
در C++، کلیدواژهٔ "inline" یک کلیدواژهٔ استاندارد است و تحت تأثیر این کلید قرار نمیگیرد. ممکن است بخواهید در عوض از پرچم -fno-gnu-keywords استفاده کنید که "typeof" را غیرفعال میکند اما نه "asm" و "inline" را. در حالت C99 (-std=c99 یا -std=gnu99)، این گزینه فقط بر کلیدواژههای "asm" و "typeof" اثر میگذارد، زیرا "inline" یک کلیدواژهٔ استاندارد در ISO C99 است. در حالت C23 (-std=c23 یا -std=gnu23)، این گزینه فقط کلیدواژهٔ "asm" را تحت تأثیر قرار میدهد، زیرا "typeof" یک کلیدواژهٔ استاندارد در ISO C23 است.
- -fno-builtin
- -fno-builtin-function
- توابع
توکار (built-in) را
که با
پیشوند __builtin_
شروع
نمیشوند
شناسایی
نمیکند.
GCC معمولاً کدهای ویژهای تولید میکند تا برخی توابع توکار را کارآمدتر مدیریت کند؛ به عنوان مثال، فراخوانیهای "alloca" ممکن است تبدیل به تکدستوراتی شوند که مستقیماً پشته را تنظیم میکنند، و فراخوانیهای "memcpy" ممکن است تبدیل به حلقههای رونوشت درونخطی شوند. کد حاصل اغلب هم کوچکتر و هم سریعتر است، اما از آنجا که فراخوانیهای تابع دیگر به همان صورت در کد ظاهر نمیشوند، نمیتوانید روی آن فراخوانیها نقطه توقف (breakpoint) بگذارید، و همچنین نمیتوانید رفتار توابع را با پیوند دادن به کتابخانهای دیگر تغییر دهید. علاوه بر این، هنگامی که تابعی به عنوان تابع توکار شناخته میشود، GCC ممکن است از اطلاعات مربوط به آن تابع برای هشدار دادن درباره مشکلات فراخوانی آن، یا تولید کد کارآمدتر بهره ببرد، حتی اگر کد حاصل هنوز حاوی فراخوانیهای آن تابع باشد. به عنوان مثال، هشدارهایی با -Wformat برای فراخوانیهای نادرست "printf" داده میشود هنگامی که "printf" توکار است و مشخص است که "strlen" حافظهٔ سراسری را تغییر نمیدهد.
با گزینهٔ -fno-builtin-function تنها تابع توکار function غیرفعال میشود. function نباید با __builtin_ شروع شود. اگر تابعی نام برده شود که در این نسخه از GCC توکار نباشد، این گزینه نادیده گرفته میشود. هیچ گزینهٔ معادل -fbuiltin-function وجود ندارد؛ چنانچه مایلید توابع توکار را هنگام استفاده از -fno-builtin یا -ffreestanding بهصورت انتخابی فعال کنید، میتوانید ماکروهایی مانند زیر تعریف نمایید: #define abs(n) __builtin_abs ((n)) #define strcpy(d, s) __builtin_strcpy ((d), (s))
- -fcond-mismatch
- عبارتهای شرطی با انواع ناهماهنگ در آرگومانهای دوم و سوم را مجاز میداند. مقدار چنین عبارتی void است. این گزینه برای C++ پشتیبانی نمیشود.
- -ffreestanding
- تصریح میکند که کامپایل یک محیط مستقل (freestanding) را هدف قرار میدهد. این گزینه مستلزم -fno-builtin است. محیط مستقل محیطی است که در آن ممکن است کتابخانهٔ استاندارد وجود نداشته باشد و نقطهٔ شروع برنامه لزوماً تابع "main" نباشد. واضحترین مثال آن، کرنل یک سیستمعامل است. این گزینه معادل -fno-hosted است.
- -fgimple
- تجزیهٔ تعاریف توابعی که با "__GIMPLE" علامتگذاری شدهاند را فعال میکند. این یک ویژگی آزمایشی است که امکان آزمایش واحد (unit testing) برای گذرگاههای GIMPLE را فراهم میسازد.
- -fgnu-tm
- هنگامی که
گزینهٔ -fgnu-tm
مشخص شود،
کامپایلر
کدی برای
نگارش
لینوکسی
سند مشخصات
فعلی ABI
حافظهٔ
تراکنشی Intel
(ویرایش
۱.۱، ۶ مه
۲۰۰۹) تولید
میکند. این
یک ویژگی
آزمایشی
است که رابط
آن ممکن است
در
نگارشهای
آیندهٔ GCC
همگام با
تغییر
مشخصات
رسمی،
دستخوش
تغییر شود.
لطفاً توجه
داشته
باشید که
این ویژگی
در همهٔ
معماریها
پشتیبانی
نمیشود.
برای اطلاعات بیشتر دربارهٔ پشتیبانی GCC از حافظهٔ تراکنشی،
توجه داشته باشید که ویژگی حافظهٔ تراکنشی با استثناهای غیرفراخوانی (-fnon-call-exceptions) پشتیبانی نمیشود.
- -fgnu89-inline
- گزینهٔ -fgnu89-inline
به GCC اعلام
میکند که
هنگام قرار
داشتن در
حالت C99، از
معناشناسی
سنتی GNU برای
توابع
"inline"
استفاده
کند.
استفاده از این گزینه تقریباً معادل افزودن مشخصهٔ تابعی "gnu_inline" به تمامی توابع درونخطی است.
گزینهٔ -fno-gnu89-inline صراحتاً به GCC میگوید که در حالت C99 یا gnu99 از معناشناسی C99 برای "inline" استفاده کند (یعنی رفتار پیشفرض را تعیین میکند). این گزینه در حالتهای -std=c90 یا -std=gnu90 پشتیبانی نمیشود.
از ماکروهای پیشپردازندهٔ "__GNUC_GNU_INLINE__" و "__GNUC_STDC_INLINE__" میتوان برای بررسی اینکه کدام معناشناسی برای توابع "inline" فعال است، استفاده کرد.
- -fhosted
- تصریح میکند که کامپایل یک محیط میزبانیشده (hosted) را هدف قرار میدهد. این گزینه مستلزم -fbuiltin است. محیط میزبانیشده محیطی است که در آن تمام کتابخانهٔ استاندارد در دسترس است و در آن نوع بازگشتی "main" برابر با "int" است. تقریباً همه چیز به جز یک کرنل مثالهایی از آن هستند. این گزینه معادل -fno-freestanding است.
- -flax-vector-conversions
- تبدیلهای ضمنی بین بردارهایی با تعداد عناصر متفاوت و/یا انواع عناصر ناسازگار را مجاز میداند. از این گزینه نباید برای کدهای جدید استفاده شود.
- -fms-extensions
- برخی از
ساختارهای
غیراستاندارد
بهکاررفته
در
فایلهای
سرایند
مایکروسافت
را
میپذیرد.
در کد C++، این گزینه اجازه میدهد نام اعضا در ساختارها مشابه اعلانهای قبلی نوعها باشد.
typedef int UOW; struct ABC { UOW UOW; };برخی موارد فیلدهای بدوننام در ساختارها و اجتماعها (unions) تنها با این گزینه پذیرفته میشوند.
توجه داشته باشید که این گزینه برای تمام هدفها خاموش است، به جز هدفهای x86 که از ms-abi استفاده میکنند.
- -fpermitted-flt-eval-methods=style
- استاندارد
ISO/IEC TS 18661-3 مقادیر
مجاز جدیدی
برای
"FLT_EVAL_METHOD"
تعریف
میکند که
نشان
میدهند
عملیات و
مقادیر
ثابتی که
دارای یک
نوع معنایی
با قالب
مبادله (interchange)
یا
توسعهیافته
(extended) هستند،
باید با دقت
و دامنهٔ آن
نوع
ارزیابی
شوند. این
مقادیر
جدید
اَبَرمجموعهای
از مقادیر
مجاز تحت C99/C11
هستند که
معنای سایر
مقادیر
مثبت
"FLT_EVAL_METHOD" را
مشخص
نکردهاند.
به این
ترتیب،
کدهای
منطبق بر C11
ممکن است با
انتظار
احتمال
وجود
مقادیر
جدید نوشته
نشده باشند.
-fpermitted-flt-eval-methods مشخص میکند که آیا کامپایلر تنها باید مقادیر "FLT_EVAL_METHOD" مشخصشده در C99/C11 را مجاز بداند، یا مجموعهٔ توسعهیافته مقادیر مشخصشده در ISO/IEC TS 18661-3 را.
style بسته به مورد، "c11" یا "ts-18661-3" است.
مقدار پیشفرض در حالت سازگار با استاندارد (-std=c11 یا مشابه آن)، -fpermitted-flt-eval-methods=c11 است. پیشفرض در یک گویش GNU (-std=gnu11 یا مشابه آن)، -fpermitted-flt-eval-methods=ts-18661-3 است.
گزینههای -fdeps-* برای استخراج اطلاعات ساختاریافتهٔ وابستگیها برای یک مبدأ بهکار میروند. این امر شامل تعیین این است که چه منابع ارائهشده توسط سایر فایلهای مبدأ برای کامپایل این مبدأ نیاز خواهد بود و همچنین چه منابعی توسط این مبدأ ارائه میشود. این اطلاعات میتواند برای افزودن وابستگیهای مورد نیاز میان قواعد کامپایل مبداهای وابسته بر اساس محتوای آنها استفاده شود، بهجای آنکه لازم باشد این اطلاعات در ابزارهای ساخت نیز بازتاب یابد.
- -fdeps-file=file
- محل نوشتن اطلاعات ساختاریافتهٔ وابستگیها.
- -fdeps-format=format
- قالب مورد استفاده برای اطلاعات ساختاریافتهٔ وابستگیها. در حال حاضر p1689r5 تنها قالب پشتیبانیشده است. توجه داشته باشید هنگامی که این آرگومان مشخص شود، خروجی -MF از برخی اطلاعات (بهویژه ماژولهای C++) تهی میشود تا از نحو توسعهیافتهٔ makefile که برای بیشتر ابزارها قابل فهم نیست استفاده نکند.
- -fdeps-target=file
- مشابه -MT است اما برای اطلاعات ساختاریافتهٔ وابستگیها. این گزینه مقصدی را مشخص میکند که در نهایت به هر یک از منابع مورد نیاز احتیاج خواهد داشت و هر منبع استخراجشده از مبدأ را که ممکن است مورد نیاز سایر منابع باشد فراهم میکند.
- -fplan9-extensions
- برخی از
ساختارهای
غیراستاندارد
بهکاررفته
در کد Plan 9 را
میپذیرد.
این گزینه -fms-extensions را فعال میکند، اجازه میدهد اشارهگرها به ساختارهای با فیلدهای بینام به توابعی که انتظار اشارهگر به عناصر از نوع فیلد را دارند ارسال شوند، و امکان ارجاع به فیلدهای بینامِ اعلانشده با typedef را فراهم میکند. این گزینه تنها برای C پشتیبانی میشود، نه C++.
- -fsigned-bitfields
- -funsigned-bitfields
- -fno-signed-bitfields
- -fno-unsigned-bitfields
- این گزینهها تعیین میکنند که آیا یک میدانبیتی (bit-field) در حالتی که در اعلان آن از هیچیک از "signed" یا "unsigned" استفاده نشده باشد، علامتدار باشد یا بیعلامت. بهطور پیشفرض، چنین میدانبیتی علامتدار است، زیرا سازگارتر است: انواع عدد صحیح پایه مانند "int" از انواع علامتدار هستند.
- -fsigned-char
- -funsigned-char
- -fsigned-char اجازه
میدهد نوع
"char"
مانند "signed
char"
علامتدار
باشد، در
حالی که -funsigned-char
اجازه
میدهد نوع
"char"
مانند "unsigned
char"
بیعلامت
باشد.
توجه داشته باشید که -fsigned-char معادل -fno-unsigned-char است که صورت نفیشدهٔ -funsigned-char میباشد. به همین ترتیب، گزینهٔ -fno-signed-char معادل -funsigned-char است.
هر مقصدی که توسط GCC پشتیبانی میشود دارای یک پیشفرض برای نوع "char" است، که معمولاً در سند ABI ویژهٔ پردازنده برای آن مقصد مشخص میشود. این نوع در حالت پیشفرض یا مانند "unsigned char" است یا مانند "signed char".
در حالت ایدهآل، یک برنامهٔ پایاپذیر (portable) وقتی به علامتدار بودن یک شیء وابسته است، باید همیشه از "signed char" یا "unsigned char" استفاده کند. اما برنامههای بسیاری نوشته شدهاند که از "char" ساده استفاده میکنند و بسته به ماشینهایی که برای آنها نوشته شدهاند، انتظار دارند علامتدار یا بیعلامت باشد. این گزینهها به شما اجازه میدهند چنین برنامهای را با رفتار پیشفرض برعکس بهکار بگیرید.
نوع "char" همیشه نوعی متمایز از هر یک از "signed char" یا "unsigned char" است، هرچند که رفتار آن همواره دقیقاً شبیه یکی از این دو میباشد.
- -fstrict-flex-arrays (تنها C و C++)
- -fstrict-flex-arrays=level (فقط C و C++)
- کنترل
اینکه چه
زمانی با
آرایه
انتهایی یک
ساختار به
منظور
دسترسی به
عناصر آن،
به عنوان یک
عضو آرایه
انعطافپذیر
رفتار شود.
مقدار 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 کدی تولید کند که با کد تولیدشده بدون این گزینه از نظر باینری سازگار نیست.
گزینههای کنترل گویش C++ (Options Controlling C++ Dialect)
این بخش گزینههای خط فرمانی را شرح میدهد که تنها برای برنامههای C++ معنیدار هستند. شما همچنین میتوانید بیشتر گزینههای کامپایلر GNU را فارغ از زبانی که برنامهتان به آن نوشته شده است، به کار ببرید. برای مثال، ممکن است فایلی مانند firstClass.C را به این صورت کامپایل کنید:
g++ -g -fstrict-enums -O -c firstClass.C
در این مثال، تنها -fstrict-enums گزینهای است که منحصراً برای برنامههای C++ در نظر گرفته شده است؛ شما میتوانید سایر گزینهها را با هر زبانی که توسط GCC پشتیبانی میشود استفاده کنید.
برخی گزینهها برای کامپایل برنامههای C، مانند -std، برای برنامههای C++ نیز کاربرد دارند.
در ادامه فهرستی از گزینههایی آمده است که تنها برای کامپایل برنامههای C++ هستند:
- --compile-std-module
- پیش از کامپایل هر فایل منبعی که صراحتاً در خط فرمان مشخص شده است، رابطهای ماژول کامپایلشده را برای واحد سرآیند <bits/stdc++.h> و ماژولهای std و std.compat میسازد. این گزینه برای ساخت برنامههای سادهای که از import std; با یک دستور منفرد استفاده میکنند، مفید است.
- -fabi-version=n
- از نسخه n
از ABI مربوط
به C++
استفاده
میکند.
مقدار
پیشفرض
نسخه 0 است.
نسخه 0 به نسخهای اشاره دارد که بیشترین انطباق را با مشخصات ABI در C++ دارد. بنابراین، ABI بهدستآمده با استفاده از نسخه 0 با برطرف شدن باگهای ABI در نسخههای مختلف G++ تغییر خواهد کرد.
نسخه 1، نسخهای از ABI مربوط به C++ است که نخستین بار در G++ 3.2 ظاهر شد.
نسخه 2، نسخهای از ABI مربوط به C++ است که نخستین بار در G++ 3.4 ظاهر شد و تا G++ 4.9 نسخه پیشفرض بود.
نسخه 3، خطایی را در نامگردانی (mangling) یک آدرس ثابت به عنوان آرگومان قالب اصلاح میکند.
نسخه 4، که نخستین بار در G++ 4.5 ظاهر شد، نامگردانی استانداردی را برای انواع برداری پیادهسازی میکند.
نسخه 5، که نخستین بار در G++ 4.6 ظاهر شد، نامگردانی صفت const/volatile را روی انواع اشارهگر به تابع، decltype یک اعلان ساده، و استفاده از یک پارامتر تابع در اعلان پارامتری دیگر را اصلاح میکند.
نسخه 6، که نخستین بار در G++ 4.7 ظاهر شد، رفتار ارتقای نوع برای شمارشهای محدودهدار (scoped enums) در C++11 و نامگردانی بستههای آرگومان قالب، const/static_cast، پیشوندهای ++ و --، و تابع در محدوده کلاس استفادهشده به عنوان آرگومان قالب را اصلاح میکند.
نسخه 7، که نخستین بار در G++ 4.8 ظاهر شد، با nullptr_t به عنوان یک نوع توکار رفتار کرده و نامگردانی لامبداها را در محدوده آرگومانهای پیشفرض اصلاح میکند.
نسخه 8، که نخستین بار در G++ 4.9 ظاهر شد، رفتار جایگزینی انواع توابع با توصیفکنندههای cv تابع (function-cv-qualifiers) را اصلاح میکند.
نسخه 9، که نخستین بار در G++ 5.2 ظاهر شد، همترازی "nullptr_t" را اصلاح میکند.
نسخه 10، که نخستین بار در G++ 6.1 ظاهر شد، نامگردانی صفتهایی را که بر هویت نوع تأثیر میگذارند (مانند صفتهای قرارداد فراخوانی ia32، نظیر stdcall) اضافه میکند.
نسخه 11، که نخستین بار در G++ 7 ظاهر شد، نامگردانی عبارتهای ...sizeof و نامهای عملگر را اصلاح میکند. برای موجودیتهای چندگانه با نام یکسان درون یک تابع که در محدودههای متفاوتی اعلان شدهاند، نامگردانی از دوازدهمین رخداد به بعد تغییر میکند. همچنین این نسخه متضمن -fnew-inheriting-ctors است.
نسخه 12، که نخستین بار در G++ 8 ظاهر شد، قراردادهای فراخوانی را برای کلاسهای خالی روی معماری مقصد x86_64 و برای کلاسهایی که فقط سازندههای کپی/انتقال حذفشده دارند، اصلاح میکند. این نسخه به طور ناخواسته قرارداد فراخوانی را برای کلاسهایی با سازنده کپی حذفشده و سازنده انتقال بدیهی تغییر میدهد.
نسخه 13، که نخستین بار در G++ 8.2 ظاهر شد، تغییر ناخواسته در نسخه 12 را برطرف میکند.
نسخه 14، که نخستین بار در G++ 10 ظاهر شد، نامگردانی عبارت nullptr را اصلاح میکند.
نسخه 15، که نخستین بار در G++ 10.3 ظاهر شد، پسرفت برچسب ABI در G++ 10 را اصلاح میکند.
نسخه 16، که نخستین بار در G++ 11 ظاهر شد، نامگردانی "__alignof__" را بهگونهای تغییر میدهد که از "alignof" و نامهای عملگر وابسته متمایز باشد.
نسخه 17، که نخستین بار در G++ 12 ظاهر شد، چینش کلاسهایی را که از کلاسهای تجمیعی دارای مقداردهندههای اولیه عضو پیشفرض در C++14 به بالا ارثبری میکنند، تصحیح میکند.
نسخه 18، که نخستین بار در G++ 13 ظاهر شد، نامگردانیهای لامبداهایی را که زمینه اضافی دارند تصحیح میکند.
نسخه 19، که نخستین بار در G++ 14 ظاهر شد، نامگردانیهای مقیدسازیهای ساختاریافته را جهت دربرگرفتن برچسبهای ABI و مدیریت اعضای دارای توصیفکننده cv از [[no_unique_address]] تصحیح کرده و نامگردانی قیدهای C++20 را روی الگوهای توابع اضافه میکند.
نسخه 20، که نخستین بار در G++ 15 ظاهر شد، نامگردانیهای لامبداها را در مقداردهندههای اولیه اعضای دادهای ایستا تصحیح میکند.
نسخه 21، که نخستین بار در G++ 16 ظاهر شد، تسخیرهای غیرضروری در لامبداهای noexcept (c++/119764)، چینش کلاس پایهای با تمامی سازندههای صراحتاً پیشفرضشده (c++/120012)، و نامگردانی اشیاء کلاس و آرایه با زیراشیای غیرانتهایی دارای مقداردهی اولیه ضمنی صفر (c++/121231) را تصحیح میکند.
همچنین ببینید: -Wabi.
- -fabi-compat-version=n
- در
مقصدهایی
که از
نامهای
مستعار قوی
(strong aliases)
پشتیبانی
میکنند، G++
با ایجاد یک
نام مستعار
با نام
نامگردانیشده
صحیح هنگام
تعریف
نمادی با
نام
نامگردانیشده
نادرست،
تغییرات
نامگردانی
را دور
میزند. این
سوییچ مشخص
میکند که
از کدام
نسخه ABI برای
این نام
مستعار
استفاده
شود.
با -fabi-version=0 (پیشفرض)، این مقدار به طور پیشفرض 13 (سازگاری با GCC 8.2) است. اگر نسخه دیگری از ABI به صورت صریح انتخاب شود، این مقدار به طور پیشفرض 0 خواهد بود. برای سازگاری با نسخههای 3.2 تا 4.9 کامپایلر GCC، از -fabi-compat-version=2 استفاده کنید.
اگر این گزینه مشخص نشود ولی -Wabi=n مشخص گردد، از آن نسخه برای نامهای مستعار سازگاری استفاده میشود. اگر این گزینه همراه با -Wabi (بدون تعیین نسخه) مشخص شود، نسخه تعیینشده در این گزینه برای هشدار به کار میرود.
- -fno-access-control
- تمام بررسیهای کنترل دسترسی را غیرفعال میکند. این سوییچ عمدتاً برای دور زدن باگها در کد کنترل دسترسی کاربرد دارد.
- -faligned-new
- فعالسازی
پشتیبانی
از "new" در
C++17 برای
انواعی که
به
همترازی
بیشتری
نسبت به
آنچه "void* ::operator
new(std::size_t)" فراهم
میکند
نیاز دارند.
یک آرگومان
عددی مانند
"-faligned-new=32"
میتواند
برای تعیین
میزان
همترازی
(به بایت)
ارائهشده
توسط آن
تابع
استفاده
شود، اما
کاربران
اندکی نیاز
خواهند
داشت مقدار
پیشفرض
alignof(std::max_align_t) را
بازنویسی
کنند.
این پرچم بهطور پیشفرض برای -std=c++17 فعال است.
- -fno-assume-sane-operators-new
- استاندارد C++ اجازه میدهد عملگرهای سراسری "new"، "new[]"، "delete" و "delete[]" جایگزین شوند، اگرچه بسیاری از برنامههای C++ آنها را جایگزین نکرده و فقط از نسخه ارائهشده توسط پیادهسازی استفاده میکنند. علاوهبر این، استاندارد C++ اجازه میدهد این فراخوانیها در صورتی که از عبارات new یا delete انجام شده باشند، حذف شوند (و به همین ترتیب، در صورت استفاده از توابع "__builtin_operator_new" یا "__builtin_operator_delete" نیز همین فرض در نظر گرفته میشود). این گزینه امکان کنترل روی برخی بهینهسازیها پیرامون فراخوانی این عملگرها را فراهم میکند. با گزینه "-fassume-sane-operators-new-delete" ممکن است GCC فرض کند که فراخوانی عملگرهای سراسری قابلجایگزینی از عبارات new یا delete یا از فراخوانیهای "__builtin_operator_new" یا "__builtin_operator_delete" هیچ متغیر سراسری یا متغیرهایی را که آدرس آنها میتواند به عملگرها سرایت کند (وضعیت سراسری یا global state؛ بهجز "errno" برای عملگرهای "new" و "new[]") نمیخوانند یا تغییر نمیدهند. این امر اکثر بهینهسازیها را در طول این فراخوانیها ممکن میسازد و چیزی است که عملگرهای ارائهشده توسط پیادهسازی آن را برآورده میکنند مگر اینکه جزئیات پیادهسازی "malloc" در کد قابلمشاهده باشد یا قلابهای (hooks) "malloc" استفاده شوند، اما اگر برنامهای این عملگرها را جایگزین کند ممکن است برقرار نباشد. این رفتار بهطور پیشفرض فعال است. با گزینه "-fno-assume-sane-operators-new-delete"، کامپایلر GCC باید فرض کند تمامی این فراخوانیها (چه از عبارات new یا delete و چه فراخوانی مستقیم) ممکن است وضعیت سراسری را بخوانند و بنویسند مگر خلاف آن ثابت شود (مثلاً هنگامی که GCC پیادهسازی آنها را کامپایل میکند). اگر آن عملگرها جایگزین شدهاند یا ممکن است جایگزین شوند و کد باید انتظار چنین رفتاری را داشته باشد، از این گزینه استفاده کنید.
- -fchar8_t
- -fno-char8_t
- فعالسازی
پشتیبانی
از "char8_t"
همانطور
که برای C++20
تصویب شده
است. این
شامل
افزودن نوع
پایهای
جدید
"char8_t"،
تغییراتی
در انواع
لیترالهای
نویسه و
رشتهای UTF-8،
امضاهای
جدید برای
لیترالهای
تعریفشده
توسط کاربر
(user-defined literals)،
بهروزرسانیهای
کتابخانه
استاندارد
مرتبط، و
ماکروهای
آزمون
ویژگی جدید
"__cpp_char8_t" و
"__cpp_lib_char8_t"
است.
این گزینه امکان سربارگذاری (overload) توابع را برای رشتههای معمولی و UTF-8 فراهم میکند:
int f(const char *); // #1 int f(const char8_t *); // #2 int v1 = f("text"); // Calls #1 int v2 = f(u8"text"); // Calls #2و امضاهای جدیدی را برای لیترالهای تعریفشده توسط کاربر معرفی میکند:
int operator""_udl1(char8_t); int v3 = u8'x'_udl1; int operator""_udl2(const char8_t*, std::size_t); int v4 = u8"text"_udl2; template<typename T, T...> int operator""_udl3(); int v5 = u8"text"_udl3;
تغییر انواع لیترالهای رشتهای و نویسهای UTF-8 ناسازگاریهایی با ISO C++11 و استانداردهای پس از آن ایجاد میکند. به عنوان مثال، کد زیر بر اساس ISO C++11 خوشساخت (well-formed) است، اما هنگام مشخص کردن -fchar8_t بدساخت (ill-formed) محسوب میشود.
const char *cp = u8"xx";// error: invalid conversion from // `const char8_t*' to `const char*' int f(const char*); auto v = f(u8"xx"); // error: invalid conversion from // `const char8_t*' to `const char*' std::string s{u8"xx"}; // error: no matching function for call to // `std::basic_string<char>::basic_string()' using namespace std::literals; s = u8"xx"s; // error: conversion from // `basic_string<char8_t>' to non-scalar // type `basic_string<char>' requested - -fcheck-new
- بررسی اینکه اشارهگر بازگردانده شده توسط "operator new" قبل از تلاش برای تغییر حافظه اختصاصیافته، غیرتهی (non-null) باشد. این بررسی معمولاً غیرضروری است زیرا استاندارد C++ مشخص میکند که "operator new" تنها در صورتی 0 را برمیگرداند که بهصورت throw() اعلان شده باشد، که در این حالت کامپایلر حتی بدون این گزینه نیز همیشه مقدار بازگشتی را بررسی میکند. در تمام موارد دیگر، زمانی که "operator new" دارای مشخصات استثنای غیرخالی باشد، اتمام حافظه با پرتاب "std::bad_alloc" اعلام میشود. همچنین ببینید: new (nothrow).
- -fconcepts
- فعالسازی
پشتیبانی
از ویژگی
مفاهیم (Concepts)
در C++ برای
مقیدسازی
آرگومانهای
الگو. با -std=c++20
و بالاتر،
ویژگی Concepts
بخشی از
استاندارد
زبان است،
بنابراین
-fconcepts بهطور
پیشفرض
فعال است.
برخی از ساختارهایی که توسط مشخصات فنی پیشین «پسوندهای C++ برای مفاهیم» (ISO 19217 (2015)) مجاز بودند اما به استاندارد راه نیافتند، پیشتر میتوانستند توسط -fconcepts-ts فعال شوند. گزینه -fconcepts-ts در GCC 14 منسوخ و در GCC 15 حذف شد؛ از کاربران انتظار میرود کدهای خود را به مفاهیم C++20 تبدیل کنند.
- -fconcepts-diagnostics-depth=n
- تعیین حداکثر عمق بازپخش خطا در طول عیبیابی بازگشتیِ شکست در برآورده شدن قید. پیشفرض 1 است.
- -fconstexpr-depth=n
- تنظیم حداکثر عمق ارزیابی تو در تو برای توابع constexpr در C++11 به n. تعیین یک محدودیت برای تشخیص بازگشت بیپایان در حین ارزیابی عبارات ثابت لازم است. حداقل مقدار مشخصشده توسط استاندارد 512 است.
- -fconstexpr-cache-depth=n
- تنظیم حداکثر سطح عمق ارزیابی تو در تو برای توابع constexpr در C++11 که حافظه نهان (کَش) میشوند به n. این یک روش مکاشفهای (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
- فعالسازی
پشتیبانی
از ویژگی
قراردادها
(Contracts) در C++،
همانطور
که در
پیشنویس
کاری C++26 (سند N5003)
مشخص شده
است.
در صورت نقض یک قرارداد اعمالشده (enforced) یا مشاهدهشده (observed) (به -fcontract-evaluation-semantic در زیر مراجعه کنید)، یک گرداننده نقض (violation handler) فراخوانی میشود؛ کتابخانه استاندارد یک گرداننده پیشفرض ارائه میدهد که اطلاعات مربوط به قراردادی که ناموفق بوده است را منتشر میکند.
کاربران میتوانند با تعریف تابع زیر، گرداننده نقض پیشفرض را جایگزین کنند:
void handle_contract_violation (const std::contracts::contract_violation&);
- -fcontract-evaluation-semantic=semantic
- تنظیم
معنایی (semantic)
که
قراردادها
با آن
ارزیابی
میشوند به
semantic.
مقادیر موجود برای حالت ارزیابی عبارتند از:
'"ignored"' بررسیهای قرارداد نادیده گرفته میشوند، و هیچ بررسیای در زمان کامپایل یا زمان اجرا اضافه نخواهد شد.
'"observed"' بررسیهای قرارداد (در زمان اجرا) انجام میشوند و در صورت شکست، یک گرداننده فراخوانی میشود که امکان اقداماتی مانند ثبت وقایع (logging) یا صدور هشدارهای زمان اجرا را فراهم میکند. هنگامی که گرداننده بازمیگردد، اجرای کد ادامه خواهد یافت. در زمان کامپایل، بررسیها برای ارزیابیهای "constexpr" انجام میشوند، که در این حالت در صورت شکست بررسی، یک پیام تشخیصی صادر میشود.
'"enforce"' بررسیهای قرارداد انجام میشوند و در صورت شکست، گرداننده فراخوانی میشود. با بازگشت گرداننده، اجرای کد خاتمه مییابد و از ادامه اجرای آن پس از مورد ناموفق جلوگیری میشود. در زمان کامپایل، بررسیها بر روی "constexpr" اعمال میشوند و در صورت شکست، برنامه بدساخت (ill-formed) تلقی شده و یک خطا صادر خواهد شد.
'"quick_enforce"' بررسیهای قرارداد (در زمان اجرا) انجام میشوند و در صورت شکست، اجرا بلافاصله (بدون فراخوانی هیچ گردانندهای) خاتمه مییابد. در زمان کامپایل، هیچ تفاوتی در رفتار بین این گزینه و حالت "enforce" وجود ندارد، زیرا در زمان کامپایل هیچ گردانندهای فراخوانی نمیشود..IP -fcontracts-conservative-ipa 4 این گزینه مانع از اقدام تحلیل میانرویهای (inter-procedural analysis) در زمانی میشود که بدنه یک تابع درونخطی (inline) در یک TU مشخص قابل مشاهده است. این امر شرایطی را پوشش میدهد که در آن ارزیابی شرایط قرارداد (contract) مجاز به تفاوت بین TUها باشد؛ بدین معنا که چنین اقداماتی بالقوه نادرست خواهند بود.
- -fcontract-checks-outlined
- بهطور پیشفرض، بررسیهای قرارداد برای شرایط "pre" و "post" بهصورت درونخطی در بدنه توابع بسط مییابند. این گزینه باعث میشود در عوض یک تابع کوچک (حاوی بررسیها) ایجاد شود که در موقعیت مربوطه فراخوانی میگردد. این کار اجازه میدهد معیارهای متفاوتی برای کامپایل بخش بررسی و باقیمانده بدنه تابع اعمال شود.
- -fcontract-disable-optimized-checks
- هنگامی که بررسیهای شرایط "pre" و "post" برونخط (outlined) میشوند (با استفاده از -fcontract-checks-outlined)، این گزینه مراحل بهینهسازی را برای آن توابع غیرفعال میکند که میتواند از حذف (elision) ناخواسته مراحل بررسی جلوگیری کند.
- -fcontracts-client-check=mode
- این گزینه
درج
بررسیها
را در
محلهای
فراخوانی
(بررسی سمت
فراخواننده
/ caller-side) فعال
میکند.
مقدار mode مشخص میکند که کدام بررسیهای قرارداد انجام شوند: '"none"' بدون بررسی در سمت فراخواننده/کلاینت (پیشفرض)
'"pre"' پیششرطها در سمت فراخواننده/کلاینت بررسی میشوند.
'"all"' هم پیششرطها و هم پسشرطها در سمت فراخواننده/کلاینت بررسی میشوند.
- -fcontracts-definition-check=mode
- این گزینه
امکان
غیرفعال
کردن
بررسیهای
سمت
فراخوانده/تعریف
(callee/definition-side) را
فراهم
میکند، که
در صورت
فعال بودن
ویژگی
قراردادها،
در حالت
عادی
بهطور
پیشفرض
فعال هستند.
متغیر mode دارای مقادیر '"on"' و '"off"' است.
- -fcoroutines
- پشتیبانی از افزونه کوروتینهای C++ را فعال میکند. با -std=c++20 و بالاتر، کوروتینها بخشی از استاندارد زبان هستند، بنابراین -fcoroutines بهطور پیشفرض فعال است.
- -fdiagnostics-all-candidates
- به فرانتاند C++ اجازه میدهد هنگام شکست در تفکیک سربارگذاری (overload resolution)، همه نامزدها را گزارش کند، از جمله زمانی که یک تابع حذفشده (deleted function) انتخاب شده باشد.
- -fdump-lang-
- -fdump-lang-switch
- -fdump-lang-switch-options
- -fdump-lang-switch-options=filename
- تخلیه (dump) اطلاعات مختص به C++ را کنترل میکند. بخشهای options و filename همانطور که در گزینهٔ -fdump-tree شرح داده شده است رفتار میکنند. مقادیر switch زیر پذیرفته میشوند:
- all
- تمام موارد زیر را فعال میکند.
- class
- اطلاعات سلسلهمراتب کلاس را تخلیه میکند. اطلاعات جدول مجازی (virtual table) صادر میشود مگر اینکه 'slim' مشخص شده باشد.
- module
- اطلاعات ماژول را تخلیه میکند. گزینههای lineno (مکانها)، graph (دسترسپذیری)، blocks (خوشهها)، uid (سریالسازی)، alias (قابل ادغام)، asmname (مربوط به Elrond)، eh (نگاشتکننده) و vops (ماکروها) ممکن است اطلاعات تکمیلی ارائه دهند.
- raw
- دادههای خام درخت (tree) داخلی را تخلیه میکند.
- tinst
- دنباله
نمونهسازیهای
قالب (template instantiations)
را بهصورت
تورفته
برای نمایش
عمق بازگشت
تخلیه
میکند.
گزینه lineno
مکان منبعی
را که
نمونهسازی
در آن رخ
داده اضافه
میکند، و
گزینه details
همچنین
جایگزینیهای
پیش از
نمونهسازی،
مانند
موارد
انجامشده
در حین
استنتاج
آرگومان
قالب را
تخلیه
میکند.
خطوط در خروجی تخلیه tinst. با I برای یک نمونهسازی، S برای یک جایگزینی دیگر، و R[IS] برای بافت بازگشاییشدهٔ یک نمونهسازی بهتعویقافتاده شروع میشوند.
- -fno-elide-constructors
- استاندارد
C++ به یک
پیادهسازی
اجازه
میدهد از
ایجاد شیء
موقتی که
تنها برای
مقداردهی
اولیه شیء
دیگری از
همان نوع
استفاده
میشود،
صرفنظر
کند. تعیین
این گزینه
آن
بهینهسازی
را غیرفعال
کرده و G++ را
مجبور
میکند
سازنده کپی
(copy constructor) را در
تمام موارد
فراخوانی
کند. این
گزینه
همچنین
باعث
میشود G++
توابع عضو
بدیهی (trivial member functions)
را که در
غیر این
صورت
بهصورت
درونخطی
بسط
مییافتند،
فراخوانی
کند.
در C++17، کامپایلر ملزم به صرفنظر کردن از این اشیاء موقت است، اما این گزینه همچنان بر توابع عضو بدیهی تأثیر میگذارد.
- -fno-enforce-eh-specs
- کدی برای بررسی نقض مشخصات استثنا (exception specifications) در زمان اجرا تولید نمیکند. این گزینه استاندارد C++ را نقض میکند، اما ممکن است برای کاهش اندازه کد در ساختهای نهایی مفید باشد، بسیار شبیه به تعریف کردن "NDEBUG". این امر به کد کاربر اجازه پرتاب استثنا در نقض مشخصات استثنا را نمیدهد؛ کامپایلر همچنان بر اساس مشخصات بهینهسازی میکند، بنابراین پرتاب یک استثنای غیرمنتظره منجر به رفتار تعریفنشده (undefined behavior) در زمان اجرا میشود.
- -fextern-tls-init
- -fno-extern-tls-init
- استانداردهای
C++11 و OpenMP به
متغیرهای
"thread_local" و
"threadprivate"
اجازه
مقداردهی
اولیه پویا
(زمان اجرا)
را میدهند.
برای
پشتیبانی
از این
ویژگی،
هرگونه
استفاده از
چنین
متغیری از
طریق یک
تابع پوششی
(wrapper function) انجام
میشود که
هرگونه
مقداردهی
اولیه لازم
را اجرا
میکند.
هنگامی که
استفاده و
تعریف
متغیر در یک
واحد ترجمه
(translation unit) یکسان
باشد، این
بار اضافه
(overhead)
میتواند
با
بهینهسازی
حذف شود،
اما زمانی
که استفاده
در یک واحد
ترجمه دیگر
باشد، بار
اضافه قابل
توجهی وجود
دارد حتی
اگر متغیر
واقعاً
نیازی به
مقداردهی
اولیه پویا
نداشته
باشد. اگر
برنامهنویس
بتواند
مطمئن باشد
که هیچ
استفادهای
از متغیر در
یک TU
غیرتعریفکننده
نیازی به
راهاندازی
مقداردهی
اولیه پویا
ندارد (خواه
به این دلیل
که متغیر
بهصورت
ایستا
مقداردهی
شده است، یا
اینکه
استفاده از
متغیر در TU
تعریفکننده
پیش از هر
استفادهای
در TU دیگر
اجرا خواهد
شد)،
میتواند
با استفاده
از گزینهٔ
-fno-extern-tls-init از این
بار اضافه
جلوگیری
کند.
در مقصدهایی که از نامهای مستعار نماد (symbol aliases) پشتیبانی میکنند، پیشفرض -fextern-tls-init است. در مقصدهایی که از نامهای مستعار نماد پشتیبانی نمیکنند، پیشفرض -fno-extern-tls-init است.
- -ffold-simple-inlines
- -fno-fold-simple-inlines
- به فرانتاند C++ اجازه میدهد فراخوانیهای "std::move"، "std::forward"، "std::addressof"، "std::to_underlying" و "std::as_const" را سادهسازی (fold) کند. برخلاف درونخطیسازی (inlining)، این بدان معناست که هیچ اطلاعات اشکالزدایی برای چنین فراخوانیهایی تولید نخواهد شد. از آنجا که این توابع بهندرت برای اشکالزدایی اهمیت دارند، این پرچم بهطور پیشفرض فعال است مگر اینکه -fno-inline فعال باشد.
- -fno-gnu-keywords
- کلمه "typeof" را بهعنوان کلمه کلیدی شناسایی نمیکند تا کد بتواند از این کلمه بهعنوان یک شناسه استفاده کند. میتوانید در عوض از کلمه کلیدی "__typeof__" استفاده کنید. این گزینه توسط گویشهای دقیق ISO C++ مانند -ansi، -std=c++98، -std=c++11 و غیره بهطور ضمنی فعال میشود.
- -fno-immediate-escalation
- ارتقای
تابع فوری
(immediate function escalation) را که
به موجب آن
توابع خاصی
میتوانند
مطابق با
مشخصات P2564R3 به
consteval ارتقا
یابند،
فعال
نمیکند.
برای مثال:
consteval int id(int i) { return i; } constexpr int f(auto t) { return t + id(t); // id causes f<int> to be promoted to consteval } void g(int i) { f (3); }در C++20 کامپایل میشود: تابع "f" یک تابع با ارتقای فوری است (به دلیل "auto" یک قالب تابع بوده و بهصورت "constexpr" اعلان شده است) و id(t) یک عبارت با ارتقای فوری است، بنابراین "f" به "consteval" ارتقا مییابد. در نتیجه، فراخوانی id(t) در یک زمینه فوری (immediate context) قرار دارد، بنابراین مجبور نیست یک مقدار ثابت تولید کند (این سازوکاری است که امکان ترکیب توابع consteval را فراهم میآورد). با این حال، با -fno-immediate-escalation، تابع "f" به "consteval" ارتقا نمییابد، و از آنجا که فراخوانی تابع consteval یعنی id(t) یک عبارت ثابت نیست، کامپایلر کد را رد میکند.
این گزینه بهطور پیشفرض فعال است؛ تنها در حالت C++20 یا بالاتر مؤثر است..IP -fimplicit-constexpr 4 توابع inline را در صورتی که نیازمندیهای یک تابع constexpr را برآورده کنند، بهطور ضمنی constexpr در نظر میگیرد. این گزینه میتواند در حالت C++14 یا بالاتر استفاده شود. این امر میتواند منجر به تغییر مقداردهی اولیه از پویا (dynamic) به ایستا (static) و سایر بهینهسازیها گردد.
- -fno-implicit-templates
- هرگز کدی برای الگوهای (templates) غیر inline که بهطور ضمنی (یعنی بر اثر استفاده) نمونهسازی شدهاند تولید نمیکند؛ تنها کدهایی را برای نمونهسازیهای صریح تولید میکند. اگر از این گزینه استفاده میکنید، باید مراقب باشید که کد خود را بهگونهای ساختاربندی کنید که شامل تمام نمونهسازیهای صریح لازم باشد تا در زمان پیوند با خطای نمادهای تعریفنشده مواجه نشوید.
- -fno-implicit-inline-templates
- برای نمونهسازیهای ضمنی الگوهای inline نیز هیچ کدی تولید نمیکند. رفتار پیشفرض این است که با توابع inline بهگونه متفاوتی رفتار شود تا کامپایلها با بهینهسازی و بدون آن، به مجموعه یکسانی از نمونهسازیهای صریح نیاز داشته باشند.
- -fno-implement-inlines
- برای صرفهجویی در فضا، نسخههای برونخط (out-of-line) توابع inline کنترلشده توسط "#pragma implementation" را تولید نمیکند. اگر این توابع در تمام جاهایی که فراخوانی شدهاند درونخط نشوند، این کار باعث خطاهای پیونددهنده خواهد شد.
- -fmodules
- -fno-modules
- پشتیبانی از ماژولهای C++20 را فعال میکند. گزینه -fno-modules معمولاً مورد نیاز نیست، زیرا حالت پیشفرض است. با وجود اینکه این یک ویژگی C++20 است، در حال حاضر با انتخاب آن نسخه استاندارد بهطور ضمنی فعال نمیشود.
- -fmodule-header
- -fmodule-header=user
- -fmodule-header=system
- یک فایل سرآیند را برای ایجاد یک واحد سرآیند قابل وارد کردن (importable header unit) کامپایل میکند.
- -fmodule-implicit-inline
- توابع عضوی که درون تعریف کلاس خود تعریف شدهاند، برای کدهای ماژولار بهطور ضمنی inline نیستند. این تفاوت با رفتار سنتی C++، به دلایل موجهی است. با این حال، ممکن است در طول انتقال کد (code porting) مشکلاتی ایجاد کند. این گزینه چنین تعاریف تابعی را بهطور ضمنی inline میکند. البته این کار ناسازگاری ABI ایجاد میکند، بنابراین باید از آن در همهجا یا هیچکجا استفاده کنید. (چنین تعاریفی در خارج از یک ماژول نامگذاریشده، در هر حال بهطور ضمنی inline باقی میمانند.)
- -fno-module-lazy
- وارد کردن تنبل ماژول (lazy module importing) و ایجاد نگاشتگر ماژول (module mapper) را غیرفعال میکند.
- -fmodule-mapper=[hostname]:port[?ident]
- -fmodule-mapper=|program[?ident] args...
- -fmodule-mapper==socket[?ident]
- -fmodule-mapper=<>[inout][?ident]
- -fmodule-mapper=<in>out[?ident]
- -fmodule-mapper=file[?ident]
- یک مرجع استعلام برای نگاشت نام ماژول به نام فایل. در صورت عدم تعیین، متغیر محیطی CXX_MODULE_MAPPER استفاده میشود، و اگر آن هم تنظیم نشده باشد، یک پیشفرض درونپردازشی ارائه میگردد.
- -fmodule-only
- تنها رابط ماژول کامپایلشده (Compiled Module Interface) را تولید میکند و از ایجاد هرگونه فایل شیء جلوگیری مینماید.
- -fms-extensions
- هشدارهای Wpedantic را درباره سازههای مورد استفاده در MFC، مانند int ضمنی و دریافت اشارهگر به تابع عضو از طریق نحو غیر استاندارد، غیرفعال میکند.
- -fnew-inheriting-ctors
- تعدیل P0136 در معناشناسی وراثت سازندههای C++11 را فعال میکند. این بخشی از C++17 است اما همچنین یک گزارش نقص (Defect Report) برای C++11 و C++14 در نظر گرفته میشود. این پرچم بهطور پیشفرض فعال است مگر اینکه -fabi-version=10 یا پایینتر مشخص شده باشد.
- -fnew-ttp-matching
- مصوبه P0522 برای مسئله ۱۵۰ هسته زبان (Core issue 150)، یعنی پارامترهای قالب-قالب (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) غیربدیهی باشد، مشخصه استثنا در عمل تابع را کوچکتر میکند زیرا پاکسازیهای مدیریت استثنا (EH) برای آن متغیرها میتوانند با بهینهسازی حذف شوند. اثر معنایی این است که پرتاب استثنا از تابعی با چنین مشخصه استثنایی، بهجای فراخوانی "unexpected"، منجر به فراخوانی "terminate" میشود.
- -fno-operator-names
- با کلمات کلیدی نام عملگرها مانند "and"، "bitand"، "bitor"، "compl"، "not"، "or" و "xor" به عنوان کلمات کلیدی مترادف رفتار نمیکند.
- -fno-optional-diags
- پیامهای تشخیصی که استاندارد میگوید نیازی به صدور آنها توسط کامپایلر نیست را غیرفعال میکند. در حال حاضر، تنها پیام تشخیصی از این نوع که توسط G++ صادر میشود، مربوط به نامی است که در یک کلاس دارای چندین معنا باشد.
- -fno-pretty-templates
- هنگامی که یک پیام خطا به تخصیص (specialization) یک الگوی تابع اشاره دارد، کامپایلر معمولاً امضای الگو و به دنبال آن آرگومانهای الگو و هرگونه typedef یا typename موجود در امضا را چاپ میکند (برای مثال "void f(T) [with T = int]" بهجای "void f(int)") تا مشخص باشد کدام الگو درگیر است. هنگامی که یک پیام خطا به تخصیص یک الگوی کلاس اشاره دارد، کامپایلر آرگومانهای الگویی را که با آرگومانهای پیشفرض آن الگو مطابقت دارند حذف میکند. اگر هر یک از این رفتارها بهجای آسانتر کردن فهم پیام خطا، درک آن را دشوارتر میکنند، میتوانید از -fno-pretty-templates برای غیرفعال کردن آنها استفاده کنید.
- -frange-for-ext-temps
- تمدید طول عمر اشیاء موقت را در حلقههای range-based for زبان C++ فعال میکند. در -std=c++23 و بالاتر، این مورد بخشی از استاندارد زبان است، بنابراین طول عمر اشیاء موقت بهطور پیشفرض تا پایان حلقه تمدید میشود. این گزینه امکان فعالسازی این رفتار را در نسخههای پیشین استاندارد نیز فراهم میکند.
- -freflection
- ویژگی آزمایشی بازتاب (Reflection) در C++26 را فعال میکند.
- -fno-rtti
- تولید
اطلاعات
مربوط به هر
کلاس دارای
توابع
مجازی را
برای
استفاده
توسط
ویژگیهای
شناسایی
نوع در زمان
اجرا (RTTI) در C++
("dynamic_cast" و
"typeid")
غیرفعال
میکند. اگر
از این
بخشهای
زبان
استفاده
نمیکنید،
میتوانید
با استفاده
از این پرچم
در فضا
صرفهجویی
کنید. توجه
داشته
باشید که
مدیریت
استثناها
از همین
اطلاعات
استفاده
میکند،
اما G++ آن را
در صورت
نیاز تولید
مینماید.
عملگر
"dynamic_cast"
همچنان
میتواند
برای
تبدیلهایی
که نیازی به
اطلاعات
نوع در زمان
اجرا
ندارند،
یعنی تبدیل
به "void *"
یا به
کلاسهای
پایه بدون
ابهام،
استفاده
شود.
ترکیب کدهای کامپایلشده با -frtti با کدهای کامپایلشده با -fno-rtti ممکن است کار نکند. برای مثال، اگر کلاسی که با -fno-rtti کامپایل شده به عنوان پایه برای کلاسی که با -frtti کامپایل شده استفاده شود، ممکن است پیوند برنامهها با شکست مواجه گردد.
- -fsized-deallocation
- اعلانهای
عمومی
توکار را
void operator delete (void *, std::size_t) noexcept; void operator delete[] (void *, std::size_t) noexcept;
همانطور که در C++14 معرفی شدند، فعال میکند. این قابلیت برای توابع آزادسازی حافظه (deallocation) جایگزین تعریفشده توسط کاربر که مثلاً از اندازه شیء برای تسریع آزادسازی استفاده میکنند، مفید است. این گزینه بهطور پیشفرض تحت -std=c++14 و بالاتر فعال است. پرچم -Wsized-deallocation درباره مکانهایی که ممکن است نیاز به افزودن یک تعریف داشته باشند، هشدار میدهد.
- -fstrict-enums
- به کامپایلر اجازه میدهد تا با این فرض بهینهسازی کند که مقدار یک نوع شمارشی (enumerated type) فقط میتواند یکی از مقادیر شمارش باشد (همانطور که در استاندارد C++ تعریف شده است؛ اساساً مقداری که میتواند در حداقل تعداد بیتهای مورد نیاز برای نمایش تمام شناسههای شمارش نمایش یابد). این فرض در صورتی که برنامه از یک تبدیل صریح (cast) برای تبدیل یک مقدار صحیح دلخواه به نوع شمارشی استفاده کند، ممکن است معتبر نباشد. این گزینه برای نوعهای شمارشی با نوع زیربنایی مشخص هیچ تأثیری ندارد.
- -fstrong-eval-order
- -fstrong-eval-order=kind
- ارزیابی
دسترسی به
اعضا،
اندیسگذاری
آرایه و
عبارات
شیفت به
ترتیب از چپ
به راست، و
ارزیابی
انتساب به
ترتیب از
راست به چپ،
همانگونه
که برای C++17
تصویب شده
است. -fstrong-eval-order
معادل -fstrong-eval-order=all
است و به
طور
پیشفرض با
-std=c++17 یا
بالاتر
فعال
میشود.
-fstrong-eval-order=some تنها ترتیب ارزیابی دسترسی به اعضا و عبارات شیفت را فعال میکند و برای گویشهای C++ پیش از C++17 پیشفرض است.
-fstrong-eval-order=none معادل -fno-strong-eval-order است.
- -ftemplate-backtrace-limit=n
- حداکثر تعداد یادداشتهای نمونهسازی قالب (template instantiation notes) را برای یک هشدار یا خطای واحد روی n تنظیم میکند. مقدار پیشفرض ۱۰ است.
- -ftemplate-depth=n
- حداکثر عمق نمونهسازی را برای کلاسهای قالب روی n تنظیم میکند. وجود محدودیت در عمق نمونهسازی قالب جهت تشخیص بازگشتهای بیپایان در حین نمونهسازی کلاسهای قالب ضروری است. برنامههای منطبق بر ANSI/ISO C++ نباید به حداکثر عمق بیشتر از ۱۷ (در C++11 به ۱۰۲۴ تغییر یافت) متکی باشند. مقدار پیشفرض ۹۰۰ است، زیرا در برخی شرایط ممکن است حافظهٔ پشتهٔ کامپایلر پیش از رسیدن به ۱۰۲۴ به پایان برسد.
- -fno-threadsafe-statics
- کد اضافی را برای استفاده از روتینهای مشخصشده در C++ ABI جهت مقداردهی اولیهٔ امن در برابر ریسهها (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)
یا متدها در
شرایطی که
نشانیهای
دو تابع در
اشیاء
مشترک (shared objects)
متفاوتی
گرفته
شدهاند،
انجام
نمیدهد.
اثر این گزینه این است که GCC میتواند در عمل متدهای درونخطی را با "__attribute__ ((visibility ("hidden")))" علامتگذاری کند تا در جدول صدور یک DSO ظاهر نشوند و هنگام استفاده در داخل DSO نیازی به ارجاع غیرمستقیم PLT نداشته باشند. فعال کردن این گزینه میتواند تأثیر چشمگیری بر زمان بارگذاری و پیوند یک DSO بگذارد، زیرا حجم جدول صدور پویا را در حالتی که کتابخانه استفادهٔ گستردهای از قالبها دارد به شدت کاهش میدهد.
رفتار این سوییچ دقیقاً مشابه علامتگذاری مستقیم متدها به عنوان hidden نیست، زیرا بر متغیرهای ایستای محلی تابع تأثیری نمیگذارد و باعث نمیشود که کامپایلر استنباط کند تابع تنها در یک شیء مشترک تعریف شده است.
میتوانید یک متد را به صورت صریح با یک وضعیت دیداری مشخص علامتگذاری کنید تا اثر این سوییچ برای آن متد خنثی شود. به عنوان مثال، اگر قصد مقایسهٔ اشارهگرها به یک متد درونخطی خاص را دارید، میتوانید آن را با دیداری پیشفرض (default) علامتگذاری کنید. مشخص کردن دیداری صریح برای کلاس دربرگیرنده هیچ اثری ندارد.
متدهای درونخطی با نمونهسازی صریح (explicitly instantiated) تحت تأثیر این گزینه قرار نمیگیرند، چرا که پیونددهی آنها در غیر این صورت ممکن است از مرز کتابخانهٔ مشترک عبور کند.
- -fvisibility-ms-compat
- این پرچم
تلاش
میکند با
استفاده از
تنظیمات
دیداری (visibility)،
مدل
پیونددهی C++
در GCC را با Microsoft Visual
Studio سازگار
سازد.
این پرچم تغییرات زیر را در مدل پیونددهی GCC اعمال میکند:
- 1.
- دیداری پیشفرض را مانند -fvisibility=hidden روی "hidden" تنظیم میکند.
- 2.
- نوعها (types)، به استثنای اعضای آنها، به طور پیشفرض پنهان نمیشوند.
- 3.
- قاعدهٔ تعریف واحد (One Definition Rule یا ODR) برای نوعهای فاقد مشخصات دیداری صریح که در بیش از یک شیء مشترک تعریف شدهاند تسهیل میشود: این اعلانها در صورتی مجاز هستند که در زمان عدم استفاده از این گزینه نیز مجاز باشند.
در کدهای جدید بهتر است از -fvisibility=hidden استفاده شود و کلاسهایی که قرار است از خارج قابل مشاهده باشند، صادر (export) شوند. متأسفانه این احتمال وجود دارد که کدها، شاید به طور تصادفی، به رفتار Visual Studio وابسته باشند.
از جمله پیامدهای این تغییرات این است که اعضای دادهای ایستای یک نوع یکسان با نام یکسان اما تعریفشده در اشیاء مشترک متفاوت، از یکدیگر متمایز خواهند بود؛ بنابراین تغییر یکی باعث تغییر دیگری نمیشود؛ همچنین ممکن است مقایسهٔ برابری برای اشارهگرها به توابع عضوِ تعریفشده در اشیاء مشترک متفاوت، برابر ارزیابی نشود. هنگامی که این پرچم داده میشود، تعریف متفاوت نوعهای همنام نقض ODR محسوب میشود.
- -fno-weak
- حتی در صورت پشتیبانی توسط پیونددهنده (linker)، از نمادهای ضعیف (weak symbols) استفاده نکن. به طور پیشفرض، G++ در صورت در دسترس بودن از نمادهای ضعیف استفاده میکند. این گزینه صرفاً برای آزمایش وجود دارد و نباید توسط کاربران نهایی استفاده شود؛ این کار منجر به تولید کدی ضعیفتر شده و هیچ مزیتی ندارد. این گزینه ممکن است در نسخههای بعدی G++ حذف شود.
- -fext-numeric-literals (C++ and Objective-C++ only)
- پسوندهای لفظی عددی موهومی، ممیز ثابت یا تعریفشده توسط ماشین را به عنوان افزونههای 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) اطلاعرسانی کن. شکل اول تمام نام مسیرهای 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++ and Objective-C++ only)
- هنگامی که یک نوع دارای برچسب ABI (ABI tag) در زمینهای استفاده میشود که فاقد آن برچسب ABI است، هشدار بده. برای اطلاعات بیشتر دربارهٔ برچسبهای ABI به C++ Attributes مراجعه کنید.
- -Wno-abbreviated-auto-in-template-arg
- خطای مربوط
به نوع
جاینگهدار
"auto" که
درون یک
فهرست
آرگومان
قالب برای
اعلان یک
الگوی تابع
مختصرشدهٔ
(abbreviated function template) C++20
استفاده
شده است را
غیرفعال
کن، مانند:
void f(S<auto>);
این ویژگی در Concepts TS پیشنهاد شده بود، اما در C++20 تصویب نشد؛ در استاندارد، یک جاینگهدار در اعلان پارامتر باید به عنوان یک decl-specifier ظاهر شود. این خطا را میتوان با استفاده از -fpermissive یا -Wno-error=abbreviated-auto-in-template-arg به یک هشدار نیز تقلیل داد..IP "-Wcomma-subscript (فقط C++ و Objective-C++)" 4 دربارهٔ استفاده از عبارت کاما در داخل یک عبارت اندیسگذاری هشدار میدهد. این کاربرد در C++20 منسوخ شده و در C++23 حذف خواهد شد. با این حال، عبارت کامایی که در "( )" قرار گرفته باشد منسوخ نیست. مثال:
void f(int *a, int b, int c) { a[b,c]; // deprecated in C++20, invalid in C++23 a[(b,c)]; // OK }در C++23 قرار دادن عبارتهای جداشده با کاما درون اندیس در صورتی معتبر است که یک عملگر اندیس سربارگذاریشده یافت شود و از تعداد و انواع درست آرگومانها پشتیبانی کند. کامپایلر G++ نحو قبلاً معتبری را برای کدهایی که در C++23 معتبر نیستند اما در C++20 معتبر ولی منسوخ بودند، با یک هشدار دقیق (pedantic) میپذیرد؛ این هشدار را میتوان با -Wno-comma-subscript غیرفعال کرد.
بهطور پیشفرض با -std=c++20 فعال است مگر آنکه -Wno-deprecated داده شود، و پس از -std=c++23 بدون در نظر گرفتن -Wno-deprecated فعال است. پیش از -std=c++20، با -Wdeprecated صریح فعال میشود.
این هشدار با -pedantic-errors در حالت C++23 یا بالاتر به یک خطا ارتقا مییابد.
- -Wctad-maybe-unsupported (فقط C++ و Objective-C++)
- هنگام
انجام
استنتاج
آرگومان
الگوی کلاس
(CTAD) روی نوعی
که هیچ
راهنمای
استنتاجِ
صریحاً
نوشتهشدهای
ندارد
هشدار
میدهد. این
هشدار
مواردی را
مشخص
میکند که CTAD
تنها به این
دلیل موفق
شده است که
کامپایلر
راهنماهای
استنتاج
ضمنی را
تولید کرده
است، که
ممکن است
مقصود
برنامهنویس
نبوده باشد.
برخی
راهنماهای
سبک
کدنویسی CTAD
را فقط برای
انواعی
مجاز
میدانند
که مشخصاً
«opt-in» کرده
باشند؛
یعنی
انواعی که
برای
پشتیبانی
از CTAD طراحی
شدهاند.
این هشدار
را میتوان
با الگوی
زیر
فرونشاند:
struct allow_ctad_t; // any name works template <typename T> struct S { S(T) { } }; // Guide with incomplete parameter type will never be considered. S(allow_ctad_t) -> S<void>; - -Wctor-dtor-privacy (فقط C++ و Objective-C++)
- هنگامی که یک کلاس غیرقابلاستفاده به نظر میرسد چون تمام سازندهها یا مخربهای آن کلاس خصوصی هستند و کلاس فاقد توابع دوست (friend) یا توابع عضو استاتیک عمومی است، هشدار میدهد. همچنین اگر هیچ متد غیرخصوصی وجود نداشته باشد و حداقل یک تابع عضو خصوصی وجود داشته باشد که سازنده یا مخرب نباشد نیز هشدار میدهد.
- -Wdangling-reference (فقط C++ و Objective-C++)
- هنگامی که
یک ارجاع به
یک شیء موقت
که طول عمر
آن به پایان
رسیده متصل
شود، هشدار
میدهد.
برای مثال:
int n = 1; const int& r = std::max(n - 1, n + 1); // r is dangling
در مثال بالا، دو شیء موقت ایجاد میشود (یکی برای هر آرگومان) و ارجاعی به یکی از این اشیاء موقت بازگردانده میشود. با این حال، هر دو شیء موقت در پایان عبارت کامل تخریب میشوند، بنابراین ارجاع "r" معلق است. این هشدار همچنین ارجاعهای معلق را در فهرستهای مقداردهی اولیهٔ اعضا تشخیص میدهد:
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 که دارای یک عضو دادهای اشارهگر و یک مخرب بدیهی باشد.
این هشدار را میتوان با استفاده از ویژگی "gnu::no_dangling" غیرفعال کرد.
این هشدار با -Wextra فعال میشود.
- -Wdelete-non-virtual-dtor (فقط C++ و Objective-C++)
- هنگامی که از "delete" برای تخریب نمونهای از یک کلاس استفاده میشود که دارای توابع مجازی و مخرب غیرمجازی است، هشدار میدهد. در صورتی که کلاس پایه فاقد مخرب مجازی باشد، حذف نمونهای از کلاس مشتقشده از طریق اشارهگری به کلاس پایه ناامن است. این هشدار با -Wall فعال میشود.
- -Wdeprecated-copy (فقط C++ و Objective-C++)
- هشدار میدهد که در C++11 به بالا، در صورتی که کلاس دارای یک سازنده رونوشت یا عملگر انتساب رونوشت ارائهشده توسط کاربر باشد، اعلان ضمنی یک سازنده رونوشت یا عملگر انتساب رونوشت منسوخ است. این هشدار با -Wextra فعال میشود.
- -Wdeprecated-copy-dtor (فقط C++ و Objective-C++)
- مشابه -Wdeprecated-copy است، اما در صورتی که کلاس دارای یک مخرب ارائهشده توسط کاربر نیز باشد، آن را منسوخ در نظر میگیرد.
- -Wno-deprecated-enum-enum-conversion (فقط C++ و Objective-C++)
- غیرفعال
کردن هشدار
دربارهٔ
حالتی که در
آن
تبدیلهای
حسابی
معمول روی
عملوندهایی
اعمال
میشوند که
یکی از نوع
شمارشی و
دیگری از یک
نوع شمارشی
متفاوت است.
این تبدیل
در C++20 منسوخ
شد. برای
مثال:
enum E1 { e }; enum E2 { f }; int k = f - e;گزینهٔ -Wdeprecated-enum-enum-conversion بهطور پیشفرض با -std=c++20 فعال است. در گویشهای پیش از C++20، این هشدار میتواند با -Wenum-conversion یا -Wdeprecated فعال شود.
- -Wno-deprecated-enum-float-conversion (فقط C++ و Objective-C++)
- غیرفعال
کردن هشدار
دربارهٔ
حالتی که در
آن
تبدیلهای
حسابی
معمول روی
عملوندهایی
اعمال
میشوند که
یکی از نوع
شمارشی و
دیگری از
نوع ممیز
شناور است.
این تبدیل
در C++20 منسوخ
شد. برای
مثال:
enum E1 { e }; enum E2 { f }; bool b = e <= 3.7;گزینهٔ -Wdeprecated-enum-float-conversion بهطور پیشفرض با -std=c++20 فعال است. در گویشهای پیش از C++20، این هشدار میتواند با -Wenum-conversion یا -Wdeprecated فعال شود.
- -Wdeprecated-literal-operator (فقط C++ و Objective-C++)
- هشدار
میدهد که
اعلان یک
عملگر
لفظیِ
تعریفشده
توسط کاربر
با یک فاصله
پیش از
پسوند
منسوخ است.
این هشدار
بهطور
پیشفرض در
C++23، یا با -Wdeprecated
صریح فعال
میشود. string operator
"" _i18n(const char*, std::size_t); // deprecated string
operator ""_i18n(const char*, std::size_t); // preferred
- -Wdeprecated-variadic-comma-omission (فقط C++ و Objective-C++)
- هشدار
میدهد که
حذف کاما
(ویرگول)
قبل از
آرگومانهای
متغیر
"..." در
انتهای
فهرست
پارامترهای
تابع منسوخ
شده است.
این هشدار
بهطور
پیشفرض در
C++26 یا با مشخص
کردن صریح
-Wdeprecated فعال
میشود.
void f1(int...); // deprecated void f1(int, ...); // preferred template <typename ...T> void f2(T...); // ok template <typename ...T> void f3(T......); // deprecated
- -Wno-elaborated-enum-base
- برای C++11 و بالاتر، در صورتی که یک enum-base اضافی (نامعتبر) در یک elaborated-type-specifier استفاده شود، هشدار میدهد. به این معنا که اگر یک enum با نوع پایهای مشخص و بدون فهرست شمارندهها در اعلانی به غیر از یک اعلان مستقل از آن 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" از
یک فهرست
مقداردهی
درون
آکوالاد
مقدار
اختصاص
داده
میشود،
آرایه موقت
ایجادشده
برای سمت
راست
انتساب فقط
تا پایان full-expression
زنده
میماند،
بنابراین
در دستور
بعدی متغیر
"initializer_list"
دارای یک
اشارهگر
معلق خواهد
بود.
// li's initial underlying array lives as long as li std::initializer_list<int> li = { 1,2,3 }; // assignment changes li to point to a temporary array li = { 4, 5 }; // now the temporary is gone and li has a dangling pointer int i = li.begin()[0] // undefined behavior - هنگامی که یک سازنده فهرست (list constructor) اشارهگر "begin" را از آرگومان "initializer_list" ذخیره میکند، این کار طول عمر آرایه را افزایش نمیدهد؛ بنابراین اگر متغیر یک کلاس از یک "initializer_list" موقت ساخته شود، اشارهگر در پایان دستور اعلان متغیر معلق باقی میماند.
- -Winvalid-constexpr
- هنگامی که
یک تابع
هرگز یک
عبارت ثابت
(constant expression) تولید
نمیکند،
هشدار
میدهد. در C++20
و نسخههای
پیشین،
برای هر
تابع و
الگوی تابع
"constexpr"،
باید حداقل
یک مجموعه
از
آرگومانهای
تابع در
دستکم یک
نمونهسازی
وجود داشته
باشد به
طوری که
فراخوانی
تابع یا
سازنده
بتواند یک
زیرعبارت
ارزیابیشده
از یک core constant expression
باشد. C++23 این
محدودیت را
حذف کرده
است،
بنابراین
میتوان
تابع یا
الگوی
تابعی با
برچسب
"constexpr"
داشت که هیچ
فراخوانی
از آن شرایط
یک core constant expression را
برآورده
نکند.
این هشدار بهطور پیشفرض در C++20 و نسخههای پیشین به عنوان یک هشدار سختگیرانه (pedantic) فعال است. در C++23، گزینه -Winvalid-constexpr را میتوان فعال کرد که در این صورت یک هشدار معمولی خواهد بود. برای مثال:
void f (int& i); constexpr void g (int& i) { // Warns by default in C++20, in C++23 only with -Winvalid-constexpr. f(i); } - -Winvalid-imported-macros
- معتبر بودن تمام تعاریف ماکروهای واردشده (imported) را در پایان کامپایل بررسی میکند. این گزینه بهطور پیشفرض فعال نیست، زیرا بررسی آن نیازمند پردازش اضافی است. این گزینه ممکن است هنگام آمادهسازی مجموعههایی از header-unitها برای اطمینان از سازگاری ماکروها مفید باشد.
- -Wno-literal-suffix (فقط C++ و Objective-C++)
- هنگامی که
پس از یک
لیترال
رشتهای یا
نویسهای
یک ud-suffix قرار
گیرد که با
زیرخط (underscore)
شروع
نمیشود،
هشدار
نمیدهد. به
عنوان یک
افزونه
منطبق بر
استاندارد،
GCC با چنین
پسوندهایی
به عنوان
توکنهای
پیشپردازش
جداگانه
رفتار
میکند تا
سازگاری
عقبرو با
کدهایی که
از
ماکروهای
قالببندی
"<inttypes.h>"
استفاده
میکنند
حفظ شود.
برای مثال:
#define __STDC_FORMAT_MACROS #include <inttypes.h> #include <stdio.h> int main() { int64_t i64 = 123; printf("My int64: %" PRId64"\n", i64); }در این مورد، با "PRId64" به عنوان یک توکن پیشپردازش جداگانه رفتار میشود.
این گزینه همچنین هشدارهایی را کنترل میکند که هنگام اعلان عملگر لیترال تعریفشده توسط کاربر با یک شناسه پسوند لیترال که با زیرخط شروع نمیشود، صادر میشوند. شناسههای پسوند لیترالی که با زیرخط شروع نمیشوند برای استانداردسازیهای آینده رزرو شدهاند.
این هشدارها بهطور پیشفرض فعال هستند.
- -Wno-narrowing (فقط C++ و Objective-C++)
- برای
استانداردهای
C++11 و بالاتر،
تبدیلهای
باریککننده
(narrowing conversions)
همانطور
که
استاندارد
الزامی
کرده،
بهطور
پیشفرض
تشخیص داده
میشوند. یک
تبدیل
باریککننده
از یک مقدار
ثابت منجر
به خطا و
تبدیل
باریککننده
از یک مقدار
غیرثابت
منجر به
هشدار
میشود،
اما گزینه
-Wno-narrowing این
پیامهای
تشخیصی را
فرومینشاند.
توجه داشته
باشید که
این گزینه
بر معنای
کدهای
خوشساخت
(well-formed) تأثیری
ندارد؛
تبدیلهای
باریککننده
همچنان در
زمینههای
SFINAE بدساخت (ill-formed)
تلقی
میشوند.
با گزینه -Wnarrowing در C++98، هرگاه تبدیل باریککنندهای که در C++11 ممنوع شده درون { } رخ دهد، هشدار داده میشود؛ به عنوان مثال:
int i = { 2.2 }; // error: narrowing from double to intاین پرچم در -Wall و -Wc++11-compat گنجانده شده است.
- -Wnoexcept (فقط C++ و Objective-C++)
- هنگامی که یک noexcept-expression به دلیل فراخوانی تابعی که فاقد مشخصه استثنای غیرپرتابی (یعنی throw() یا "noexcept") است اما برای کامپایلر مشخص است که هرگز استثنا پرتاب نمیکند به false ارزیابی میشود، هشدار میدهد.
- -Wnoexcept-type (فقط C++ و Objective-C++)
- اگر قابلیت
C++17 که "noexcept"
را بخشی از
نوع تابع
قرار
میدهد،
نام
درهمریخته
(mangled name) یک نماد
را نسبت به C++14
تغییر دهد،
هشدار
میدهد.
فعالشده
توسط -Wabi و
-Wc++17-compat.
به عنوان یک مثال:
template <class T> void f(T t) { t(); }; void g() noexcept; void h() { f(g); }در C++14، تابع "f" تابع "f<void(*)()>" را فراخوانی میکند، اما در C++17 تابع "f<void(*)()noexcept>" را فرامیخواند.
- -Wclass-memaccess (فقط C++ و Objective-C++)
- هنگامی که
مقصد
فراخوانی
یک تابع
حافظه خام
مانند
"memset" یا
"memcpy" یک
شیء از نوع
کلاس باشد،
و نوشتن در
چنین شیئی
ممکن است
سازنده یا
انتساب
رونوشت (copy assignment)
غیرساده (non-trivial)
یا حذفشده
(deleted) کلاس را
دور بزند،
درستیِ
ثبات (const-correctness) یا
کپسولهسازی
را نقض کند،
یا
اشارهگرهای
جدول مجازی
را مخدوش
سازد،
هشدار
میدهد.
اصلاح
بازنمایی
چنین
اشیایی
ممکن است
ناورداهای
(invariants) حفظشده
توسط توابع
عضو کلاس را
نقض کند.
برای مثال،
فراخوانی
"memset" در
زیر رفتار
تعریفنشده
(undefined) دارد
زیرا یک شیء
کلاس
غیرساده را
تغییر
میدهد و
بنابراین
پیام
تشخیصی
صادر
میشود. روش
ایمن برای
مقداردهی
اولیه یا
پاکسازی
حافظه
اشیایی از
این دست،
استفاده از
سازنده یا
عملگر
انتساب
مناسب در
صورت وجود
است.
std::string str = "abc"; memset (&str, 0, sizeof str);
گزینه -Wclass-memaccess توسط -Wall فعال میشود. تبدیل صریح (cast) اشارهگر به شیء کلاس به "void *" یا به نوعی که بتواند با امنیت توسط تابع حافظه خام مورد دسترسی قرار گیرد، این هشدار را فرومینشاند..IP "-Wnon-virtual-dtor (تنها C++ و Objective-C++)" 4 زمانی هشدار میدهد که یک کلاس دارای توابع مجازی و یک مخرب (destructor) غیرمجازیِ در دسترس در خود یا در یک کلاس پایهٔ چندریختیِ در دسترس باشد؛ در این حالت، حذف (delete کردن) یک نمونه از کلاس مشتقشده از طریق اشارهگری به خود کلاس یا کلاس پایه امکانپذیر ولی ناامن است. این هشدار در صورت تعیین -Weffc++ بهطور خودکار فعال میشود. گزینهٔ -Wdelete-non-virtual-dtor (فعالشده با -Wall) به دلیل هشدار دربارهٔ موارد ناامن بدون هشدارهای مثبت کاذب، باید ترجیح داده شود.
- -Wregister (تنها C++ و Objective-C++)
- در مورد استفاده از مشخصکنندهٔ کلاس حافظهٔ "register" هشدار میدهد، مگر زمانی که بخشی از افزونهٔ Explicit Register Variables گنو باشد. استفاده از کلیدواژهٔ "register" به عنوان مشخصکنندهٔ کلاس حافظه در C++11 منسوخ شده و در C++17 حذف شده است. بهطور پیشفرض با -std=c++17 فعال است.
- -Wreorder (تنها C++ و Objective-C++)
- زمانی
هشدار
میدهد که
ترتیب
مقداردهندههای
اولیهٔ
اعضا که در
کد آمده است
با ترتیبی
که باید
اجرا شوند
مطابقت
نداشته
باشد. برای
نمونه:
struct A { int i; int j; A(): j (0), i (1) { } };کامپایلر مقداردهندههای اعضا را برای "i" و "j" بازآرایی میکند تا با ترتیب اعلان اعضا مطابقت پیدا کند و هشداری مبنی بر این موضوع صادر میکند. این هشدار با -Wall فعال میشود.
- -Wno-pessimizing-move (تنها C++ و Objective-C++)
- این هشدار
زمانی
اعلام
میشود که
فراخوانی
"std::move"
مانع از حذف
کپی (copy elision) شود.
سناریوی
متداول
برای رخ
دادن حذف
کپی، زمان
بازگشت از
تابعی با
نوع
بازگشتی از
نوع کلاس
است؛ در
صورتی که
عبارت
بازگرداندهشده
نام یک شیء
خودکار (automatic object)
غیر-volatile بوده،
پارامتر
تابع نباشد
و نوع آن با
نوع
بازگشتی
تابع یکسان
باشد.
struct T { ... }; T fn() { T t; ... return std::move (t); }اما در این مثال، فراخوانی "std::move" مانع از حذف کپی میشود.
این هشدار با -Wall فعال میشود.
- -Wno-redundant-move (تنها C++ و Objective-C++)
- این هشدار
دربارهٔ
فراخوانیهای
زائد
"std::move"
هشدار
میدهد؛
یعنی زمانی
که حتی بدون
فراخوانی
"std::move" نیز
عملیات
انتقال
انجام
میشد. این
وضعیت به
این دلیل رخ
میدهد که
کامپایلر
در شرایط
خاصی مانند
بازگرداندن
یک متغیر
محلی که در
آن حذف کپی
ممکن نیست،
مجبور است
با شیء
بهگونهای
رفتار کند
که گویی یک rvalue
است. مثال
زیر را در
نظر بگیرید:
struct T { ... }; T fn(T t) { ... return std::move (t); }در اینجا، فراخوانی "std::move" زائد است. از آنجا که G++ مسئلهٔ بنیادین ۱۵۷۹ (Core Issue 1579) را پیادهسازی میکند، مثال دیگر به این صورت است:
struct T { // convertible to U ... }; struct U { ... }; U fn() { T t; ... return std::move (t); }در این مثال، حذف کپی قابل اعمال نیست زیرا نوع عبارت بازگرداندهشده و نوع بازگشتی تابع متفاوت هستند، با این حال G++ با مقدار بازگشتی طوری رفتار میکند که گویی توسط یک rvalue مشخص شده است.
این هشدار با -Wextra فعال میشود.
- -Wrange-loop-construct (تنها C++ و Objective-C++)
- این هشدار
زمانی
اعلان
میشود که
یک حلقهٔ for
بر پایهٔ
بازه (range-based for-loop) در
C++ یک کپی
غیرضروری
ایجاد کند.
این حالت
زمانی
میتواند
رخ دهد که
اعلان بازه
یک مرجع (reference)
نباشد، در
حالی که
احتمالاً
باید باشد.
برای نمونه:
struct S { char arr[128]; }; void fn () { S arr[5]; for (const auto x : arr) { ... } }هنگامی که نوع کپیشده یک نوع با کپیبرداری ساده (trivially-copyable) باشد که اندازهٔ آن کمتر از ۶۴ بایت است، هشداری داده نمیشود.
این هشدار همچنین زمانی که یک متغیر حلقه در یک حلقهٔ for مبتنی بر بازه با مقداری از نوع متفاوت مقداردهی اولیه شود که به کپی شدن بینجامد، هشدار میدهد. برای نمونه:
void fn() { int arr[10]; for (const double &x : arr) { ... } }در مثال بالا، در هر تکرار حلقه یک مقدار موقت از نوع "double" ایجاد و نابود میشود که مرجع "const double &" به آن متصل میگردد.
این هشدار با -Wall فعال میشود.
- -Wredundant-tags (تنها C++ و Objective-C++)
- دربارهٔ class-key
و enum-key زائد در
ارجاع به
نوعهای
کلاس و
نوعهای
شمارشی در
زمینههایی
که این کلید
میتواند
بدون ایجاد
ابهام حذف
شود، هشدار
میدهد.
برای نمونه:
struct foo; struct foo *p; // warn that keyword struct can be eliminated
از سوی دیگر، در این مثال هیچ هشداری داده نمیشود:
struct foo; void foo (); // "hides" struct foo void bar (struct foo&); // no warning, keyword struct is necessary
- -Wno-subobject-linkage (تنها C++ و Objective-C++)
- اگر یک نوع کلاس دارای یک پایه یا فیلدی باشد که نوع آن از فضای نام ناشناس (anonymous namespace) استفاده میکند یا به نوعی بدون پیوند (no linkage) وابسته است، هشدار ندهد. اگر یک نوع A به یک نوع B بدون پیوند یا با پیوند درونی (internal linkage) وابسته باشد، تعریف آن در چندین واحد ترجمه (translation unit) نقض ODR (قاعدهٔ یکبار تعریف) خواهد بود، زیرا معنای B در هر واحد ترجمه متفاوت است. اگر A تنها در یک واحد ترجمه ظاهر شود، بهترین راه برای بیصدا کردن هشدار این است که با قرار دادن آن در یک فضای نام ناشناس، به آن نیز پیوند درونی داده شود. کامپایلر این هشدار را برای نوعهای تعریفشده در فایل اصلی .C صادر نمیکند، زیرا بعید است که آنها دارای تعاریف چندگانه باشند. -Wsubobject-linkage بهطور پیشفرض فعال است.
- -Weffc++ (تنها C++ و Objective-C++)
- دربارهٔ نقض رهنمودهای سبک زیر از مجموعه کتابهای Effective C++ اثر اسکات مایرز (Scott Meyers) هشدار میدهد:
- برای کلاسهایی با حافظهٔ تخصیصیافته بهطور پویا، یک سازندهٔ رونوشت (copy constructor) و یک عملگر انتساب (assignment operator) تعریف کنید.
- در سازندهها، مقداردهی اولیه را به انتساب ترجیح دهید.
- کاری کنید که "operator=" مرجعی به *this بازگرداند.
- هنگامی که باید یک شیء را بازگردانید، سعی نکنید یک مرجع بازگردانید.
- بین شکلهای پیشوندی و پسوندی عملگرهای افزایش و کاهش تمایز قائل شوید.
- هرگز "&&"، "||"، یا "," را سربارگذاری نکنید.
این گزینه همچنین -Wnon-virtual-dtor را فعال میکند که آن هم یکی از توصیههای Effective C++ است. با این حال، این بررسی گسترش یافته است تا در مورد عدم وجود مخرب مجازی در کلاسهای پایهٔ غیرچندریختیِ در دسترس نیز هشدار دهد.
هنگام انتخاب این گزینه، توجه داشته باشید که سرآیندهای کتابخانهٔ استاندارد از همهٔ این رهنمودها پیروی نمیکنند؛ برای فیلتر کردن این هشدارها از grep -v استفاده کنید. هشدار مربوط به حالتی که در آن یک گردانندهٔ استثنا (exception handler) توسط گردانندهٔ دیگری پوشانده (shadow) میشود را غیرفعال میکند؛ حالتی که میتواند نشاندهندهٔ ترتیب نادرست گردانندههای استثنا باشد.
- -Wsfinae-incomplete (تنها C++ و Objective-C++)
- دربارهٔ
کلاسی که
ناقص (incomplete)
تشخیص داده
شده است، یا
تابعی با
نوع
بازگشتی auto
که نوع آن
هنوز
استنتاج
نشده، در
زمینهای
که به جای
خطا موجب
شکست در
جایگزینی
(substitution failure) میشود
و سپس کلاس
یا تابع
بعداً در
واحد ترجمه
تعریف
میگردد،
هشدار
میدهد. این
مسئله
مشکلساز
است چرا که
نمونهسازیهای
الگو (template instantiations)
یا
بررسیهای
مفهوم (concept checks) در
صورتی که
قبل یا بعد
از تعریف رخ
دهند، ممکن
است نتایج
متفاوتی در
بر داشته
باشند.
این هشدار به صورت پیشفرض فعال است. -Wsfinae-incomplete=2 هشداری را در نقطهٔ شکست در جایگزینی اضافه میکند تا ردگیری مشکلات مشخصشده توسط حالت پیشفرض آسانتر شود.
- -Wstrict-null-sentinel (تنها C++ و Objective-C++)
- دربارهٔ استفاده از "NULL" بدون تبدیل صریح نوع (uncasted) به عنوان نشانگر پایان (sentinel) هشدار میدهد. هنگام کامپایل تنها با GCC این یک نشانگر معتبر است، زیرا "NULL" به صورت "__null" تعریف شده است. اگرچه این یک ثابت اشارهگر تهی است و نه یک اشارهگر تهی، اما تضمین میشود که اندازهای برابر با یک اشارهگر داشته باشد. با این حال این استفاده در میان کامپایلرهای مختلف قابلحمل (portable) نیست.
- -Wno-non-c-typedef-for-linkage (تنها C++ و Objective-C++)
- هشدار
سختگیرانه
(pedwarn) را برای
کلاسهای
بینام
دارای نام typedef
با هدف
پیونددهی (linkage)
که حاوی
اعضای خاص
C++،
کلاسهای
پایه،
مقدارهای
اولیهٔ
پیشفرض
عضو یا
عبارتهای
لامبدا
هستند (شامل
موارد
موجود در
کلاسهای
عضو
تودرتو)،
غیرفعال
میکند.
typedef struct { int a; // non-static data members are ok struct T { int b; }; // member classes too enum E { E1, E2, E3 }; // member enumerations as well int c = 42; // default member initializers are not ok struct U : A { int c; }; // classes with base classes are not ok typedef int V; // typedef is not ok using W = int; // using declaration is not ok decltype([](){}) x; // lambda expressions not ok } S;در تمام این موارد، نام برچسب S باید پس از کلمهٔ کلیدی struct اضافه شود.
- -Wno-non-template-friend (تنها C++ و Objective-C++)
- هشدارهای مربوط به زمانی را که توابع دوست (friend) غیرالگویی در داخل یک الگو اعلان میشوند غیرفعال میکند. در نسخههای بسیار قدیمی GCC که پیش از پیادهسازی استاندارد ISO بودند، اعلانهایی مانند friend int foo(int) که در آنها نام دوست یک شناسهٔ بدون پیشوند و شرط (unqualified-id) است، میتوانستند به عنوان یک تخصیص خاص از یک تابع الگو تفسیر شوند؛ این هشدار برای تشخیص مشکلات سازگاری وجود دارد و به صورت پیشفرض فعال است.
- -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
- زمانی که
اعلان یک
تابع موجب
پنهان شدن
توابع
مجازی (virtual) یک
کلاس پایه
شود هشدار
میدهد.
برای نمونه
در:
struct A { virtual void f(); }; struct B: public A { void f(int); // does not override };نسخهٔ کلاس "A" از تابع "f" در "B" پنهان میشود، و کدی مانند:
B* b; b->f();
در کامپایل با خطا مواجه میشود.
در مواردی که تفاوت امضاها تصادفی نیست، سادهترین راهحل افزودن یک اعلان using (using-declaration) به کلاس مشتقشده است تا تابع کلاس پایه از حالت پنهان خارج شود؛ برای نمونه، افزودن "using A::f;" به "B".
پسوند سطح اختیاری، رفتار را زمانی کنترل میکند که همهٔ اعلانها در کلاس مشتقشده توابع مجازی کلاس پایه را بازنویسی (override) میکنند، حتی اگر همهٔ توابع پایه بازنویسی نشده باشند:
struct C { virtual void f(); virtual void f(int); }; struct D: public C { void f(int); // does override }احتمال اینکه این الگو ناشی از یک اشتباه باشد کمتر است؛ اگر از D تنها به صورت مجازی استفاده شود، کاربر ممکن است تشخیص داده باشد که معناشناسی کلاس پایه برای برخی از سربارگذاریها مناسب است.
در سطح ۱، این حالت هشداری تولید نمیکند؛ در سطح ۲ هشدار میدهد. گزینهٔ -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 بهره برد. همچنین میتوان الگوها را نمونهسازی یا تخصیص (specialize) کرد.
- -Wmismatched-new-delete (تنها C++ و Objective-C++)
- دربارهٔ
عدم تطابق
میان
فراخوانیهای
"operator new" یا
"operator
delete" و
فراخوانی
متناظر
آنها با
تابع تخصیص
یا
آزادسازی
حافظه
هشدار
میدهد. این
موضوع شامل
فراخوانیهای
"operator delete" در C++
با
اشارهگرهای
بازگرداندهشده
از فرمهای
ناسازگار
"operator new"، یا
از سایر
توابع
تخصیصدهندهٔ
شیءهایی
است که "operator
delete" برای
آنها
آزادکنندهٔ
مناسبی
نیست، و
همچنین
فراخوانی
سایر توابع
آزادسازی
با
اشارهگرهای
بازگرداندهشده
از "operator new"
که تابع
آزادسازی
برای آنها
نامناسب
است.
برای نمونه، عبارت "delete" در تابع زیر گزارش میشود زیرا با فرم آرایهای عبارت "new" که آرگومان اشارهگر از آن بازگردانده شده تطابق ندارد. به طور مشابه، فراخوانی "free" نیز گزارش میشود.
void f () { int *a = new int[n]; delete a; // warning: mismatch in array forms of expressions char *p = new char[n]; free (p); // warning: mismatch between new and free }گزینهٔ مرتبط -Wmismatched-dealloc عدم تطابقهای مربوط به توابع تخصیص و آزادسازی حافظه به غیر از "operator new" و "operator delete" را گزارش میدهد.
-Wmismatched-new-delete در -Wall گنجانده شده است.
- -Wmismatched-tags (تنها C++ و Objective-C++)
- برای
اعلانهای
structها، classها، و
الگوهای
کلاس و
تخصیصهای
آنها با یک
class-key که با
تعریف، یا
با اولین
اعلان (در
صورت عدم
ارائهٔ
تعریف)
مطابقت
ندارد
هشدار
میدهد.
برای نمونه، اعلان "struct Object" در فهرست آرگومانهای "draw" موجب تحریک هشدار میشود. برای جلوگیری از آن، یا class-key زائد "struct" را حذف کنید یا آن را با "class" جایگزین نمایید تا با تعریف آن مطابقت داشته باشد.
class Object { public: virtual ~Object () = 0; }; void draw (struct Object*);اعلان یک کلاس با class-key به صورت "struct" همانطور که مثال بالا نشان میدهد اشتباه نیست. گزینهٔ -Wmismatched-tags به منظور کمک به دستیابی به سبکی یکدست در اعلان کلاسها در نظر گرفته شده است. در کدهایی که قرار است به کامپایلرهای مبتنی بر Windows منتقل شوند، این هشدار به جلوگیری از خطاهای ارجاع حلنشده (unresolved references) ناشی از تفاوت در مغشوشسازی نامها (mangling) برای نمادهای اعلانشده با class-keyهای متفاوت کمک میکند. این گزینه میتواند به تنهایی یا همراه با -Wredundant-tags به کار رود..IP "-Wmultiple-inheritance (تنها C++ و Objective-C++)" 4 هنگامی که کلاسی با چندین کلاس پایه مستقیم تعریف شود هشدار میدهد. برخی قوانین کدنویسی وراثت چندگانه را منع میکنند، و میتوان از این گزینه برای اعمال آن قانون استفاده کرد. این هشدار در فایلهای سرآیند سیستمی، مانند STL، غیرفعال است؛ بنابراین همچنان میتوان از STL استفاده کرد. همچنین میتوان کلاسهایی را تعریف کرد که به طور غیرمستقیم از وراثت چندگانه استفاده میکنند.
- -Wvirtual-inheritance
- هنگامی که کلاسی با یک کلاس پایه مستقیم مجازی تعریف شود هشدار میدهد. برخی قوانین کدنویسی وراثت چندگانه را منع میکنند، و میتوان از این گزینه برای اعمال آن قانون استفاده کرد. این هشدار در فایلهای سرآیند سیستمی، مانند STL، غیرفعال است؛ بنابراین همچنان میتوان از STL استفاده کرد. همچنین میتوان کلاسهایی را تعریف کرد که به طور غیرمستقیم از وراثت مجازی استفاده میکنند.
- -Wno-virtual-move-assign
- هشدارهای مربوط به ارثبری از یک پایهٔ مجازی با عملگر انتساب انتقال غیربدیهی در C++11 را نادیده میگیرد. این وضعیت خطرناک است زیرا اگر پایهٔ مجازی از بیش از یک مسیر در دسترس باشد، چندین بار منتقل (move) میشود که میتواند به این معنی باشد که هر دو شیء در وضعیت منتقلشده (moved-from) قرار گیرند. اگر عملگر انتساب انتقال به گونهای نوشته شده باشد که از انتقال یک شیءِ از پیش منتقلشده جلوگیری کند، میتوان این هشدار را غیرفعال کرد.
- -Wnamespaces
- هنگامی که یک تعریف فضای نام (namespace) باز شود هشدار میدهد. برخی قوانین کدنویسی فضاهای نام را منع میکنند، و میتوان از این گزینه برای اعمال آن قانون استفاده کرد. این هشدار در فایلهای سرآیند سیستمی مانند STL غیرفعال است، بنابراین همچنان میتوان از STL استفاده کرد. همچنین میتوان از دستورالعملهای using و نامهای واجد شرایط (qualified names) استفاده نمود.
- -Wno-template-body (تنها C++ و Objective-C++)
- تشخیص خطاها را هنگام تجزیهٔ یک قالب (template) غیرفعال میکند و در عوض خطا را تنها در زمان نمونهسازی (instantiation) قالب صادر میکند. این پرچم همچنین میتواند برای تنزل دادن چنین خطاهایی به هشدار با Wno-error= یا -fpermissive به کار رود.
- -Wno-template-id-cdtor (تنها C++ و Objective-C++)
- هشدار
دربارهٔ
استفاده از
simple-template-id به
عنوان declarator-id یک
سازنده یا
مخرب را که
در C++20 از طریق
DR 2237 نامعتبر
شد،
غیرفعال
میکند.
برای نمونه:
template<typename T> struct S { S<T>(); // should be S(); ~S<T>(); // should be ~S(); };گزینهٔ -Wtemplate-id-cdtor به طور پیشفرض با -std=c++20 فعال است؛ همچنین توسط -Wc++20-compat فعال میشود.
- -Wtemplate-names-tu-local
- هنگامی که
بدنهٔ یک
قالب،
افشای یک
موجودیت
محلی واحد
ترجمه (translation-unit-local)
را پنهان
میکند
هشدار
میدهد. در
بیشتر
موارد،
ارجاع به یک
موجودیت
محلیِ واحد
ترجمه
(مانند
اعلانی با
پیوند
درونی / internal linkage)
درون
موجودیتی
که به CMI یک
ماژول صادر
میشود خطا
است. با این
حال، درون
مقداردهندهٔ
اولیهٔ یک
متغیر، یا
در بدنهٔ یک
تابع
غیربرخط
(non-inline)، این یک
افشا به
شمار
نمیرود و
هیچ خطایی
صادر
نمیگردد.
این امر میتواند باعث شود قالبهای متغیر یا تابع در صورت ارجاع به چنین موجودیتی به طور تصادفی غیرقابل استفاده شوند، زیرا سایر واحدهای ترجمهای که این قالب را درونریزی (import) میکنند هرگز قادر به نمونهسازی آن نخواهند بود. این هشدار تلاش میکند مواردی را که این مسئله ممکن است رخ دهد شناسایی کند. وجود یک نمونهسازی صریح (explicit instantiation) این هشدار را بیاثر میکند.
این پرچم توسط -Wextra فعال میشود.
- -Wno-expose-global-module-tu-local
- افشای یک
موجودیت
محلیِ واحد
ترجمه از
طریق یک
رابط ماژول
نامعتبر
است، چرا که
ممکن است
موجب نقض ODR
شده و به
صورت
خطاهای
پیونددهی
یا
رفتارهای
غیرمنتظرهٔ
دیگر
نمایان شود.
با این حال،
بسیاری از
کتابخانههای
موجود
موجودیتهای
TU-local را در
رابط خود
اعلان
میکنند و
اجتناب از
افشای این
موجودیتها
در برخی
موارد
میتواند
دشوار باشد.
به عنوان یک افزونه، GCC افشای متغیرها و توابع درونی را که در قطعهماژول سراسری (global module fragment) اعلان شدهاند مجاز میداند. این هشدار وقوع چنین افشای نامعتبری را نشان میدهد، و میتواند با استفاده از عملگرهای راهنمای تشخیص (diagnostic pragmas) چه در محل افشا و چه در نقطهٔ اعلان آن اعلان درونی بیاثر شود. این موضوع همچنین برای اعلانهای "export using" که چنین موجودیتهایی را نام میبرند اعمال میگردد.
هنگامی که این گزینه با -Wtemplate-names-tu-local ترکیب شود، GCC همچنین دربارهٔ ارجاعات غیر افشاگرانه به موجودیتهای TU-local در بدنهٔ قالبها هشدار خواهد داد. چنین قالبهایی همچنان میتوانند در سایر TUها نمونهسازی شوند، اما خطرات بالا در رابطه با افشای موجودیتهای محلی واحد ترجمه همچنان صادق است.
این هشدار به طور پیشفرض فعال است و توسط -pedantic-errors به یک خطا ارتقا مییابد.
- -Wno-external-tu-local
- هنگام نام
بردن از یک
موجودیت TU-local
در خارج از
واحد
ترجمهای
که در آن
اعلان شده
است هشدار
میدهد.
چنین
اعلانهایی
در طول
جستجوی نام
(name lookup) نادیده
گرفته
خواهند شد.
این امر
میتواند
هنگام
انجام ADL از
قالبی
اعلانشده
در همان TU
تابع درونی
رخ دهد:
export module M; template <typename T> void foo(T t) { bar(t); } struct S {} s; static void bar(S) {} // internal linkage // instantiating foo(s) from outside this TU can see ::bar, // but naming it there is ill-formed.میتوان این مشکل را با وابسته کردن "bar" به ماژول سراسری، با استفاده از "extern "C++"" برطرف کرد.
این هشدار به طور پیشفرض فعال است و توسط -pedantic-errors به یک خطا ارتقا مییابد.
- -Wno-terminate (تنها C++ و Objective-C++)
- هشدار دربارهٔ عبارت پرتابی (throw-expression) را که فوراً منجر به فراخوانی "terminate" میشود غیرفعال میکند.
- -Wno-vexing-parse (تنها C++ و Objective-C++)
- دربارهٔ
ابهام نحوی
آزاردهندهترین
تجزیه (most vexing parse)
هشدار
میدهد. این
گزینه
دربارهٔ
مواردی
هشدار
میدهد که
در آنها یک
اعلان
مانند
تعریف یک
متغیر به
نظر
میرسد،
اما زبان C++
ایجاب
میکند که
به عنوان
اعلان تابع
تفسیر شود.
برای نمونه:
void f(double a) { int i(); // extern int i (void); int n(int(a)); // extern int n (int); }نمونهای دیگر:
struct S { S(int); }; void f(double a) { S x(int(a)); // extern struct S x (int); S y(int()); // extern struct S y (int (*) (void)); S z(); // extern struct S z (void); }این هشدار گزینههایی را برای چگونگی برخورد با چنین ابهامی پیشنهاد میکند؛ برای نمونه، میتواند حذف پرانتزها یا استفاده از آکولاها به جای آن را پیشنهاد دهد.
این هشدار به طور پیشفرض فعال است.
- -Wno-class-conversion (تنها C++ و Objective-C++)
- هنگامی که یک تابع تبدیل شیئی را به همان نوع، به یک کلاس پایه از آن نوع، یا به void تبدیل میکند هشدار نمیدهد؛ چنین تابع تبدیلی هرگز فراخوانی نخواهد شد.
- -Wvolatile (تنها C++ و Objective-C++)
- دربارهٔ
کاربردهای
منسوخشدهٔ
توصیفگر
"volatile"
هشدار
میدهد. این
شامل
عبارتهای
پسوندی و
پیشوندی
"++" و
"--" از
انواع
توصیفشده
با "volatile"،
استفاده از
انتسابهای
ساده در
جایی که
عملوند سمت
چپ یک نوع
غیرکلاسیِ
توصیفشده
با "volatile"
برای مقدار
آنها است،
انتسابهای
مرکب که در
آنها
عملوند سمت
چپ یک نوع
غیرکلاسیِ
توصیفشده
با "volatile"
است، نوع
بازگشتی
تابع
توصیفشده
با "volatile"،
نوع
پارامتر
توصیفشده
با "volatile"،
و اتصالات
ساختاریافته
(structured bindings) از یک
نوع
توصیفشده
با "volatile"
میشود. این
کاربردها
در C++20 منسوخ
شدهاند.
به طور پیشفرض با -std=c++20 فعال میشود. پیش از -std=c++20، به صورت صریح با -Wdeprecated فعال میگردد.
- -Waligned-new
- -Waligned-new=[none|global|all]
- دربارهٔ
عبارت new از
نوعی که به
ترازبندی
(alignment)
بزرگتری
نسبت به
alignof(std::max_align_t)
نیاز دارد
اما از یک
تابع تخصیص
بدون
پارامتر
ترازبندی
صریح
استفاده
میکند،
هشدار
میدهد. این
گزینه توسط
-Wall فعال
میشود.
به طور معمول این گزینه تنها دربارهٔ توابع تخصیص سراسری هشدار میدهد، اما -Waligned-new=all دربارهٔ توابع تخصیص عضو کلاس نیز هشدار میدهد.
- -Wno-placement-new
- -Wplacement-new=n
- هشدار
درباره
عبارتهای
placement new با رفتار
تعریفنشده،
مانند ساخت
یک شیء در
بافری که از
نوع آن شیء
کوچکتر
است. برای
مثال،
عبارت placement new
زیر تشخیص
داده شده و
هشدار
دریافت
میکند
زیرا تلاش
میکند
آرایهای
از ۶۴ عدد
صحیح را در
بافری با
اندازه
تنها ۶۴
بایت بسازد.
char buf [64]; new (buf) int[64];
این هشدار بهطور پیشفرض فعال است.
- -Wplacement-new=1
- این سطح
هشدار
پیشفرض
-Wplacement-new است. در
این سطح،
هشدار برای
برخی
ساختارهای
اکیداً
تعریفنشده
که GCC آنها
را به عنوان
افزونه جهت
سازگاری با
کدهای
قدیمی مجاز
میداند،
صادر
نمیشود.
برای مثال،
عبارت
"new" زیر
در این سطح
تشخیص داده
نمیشود
حتی اگر طبق
استاندارد
C++ رفتار
تعریفنشده
داشته
باشد، چرا
که فراتر از
انتهای
آرایه
تکعنصری
مینویسد.
struct S { int n, a[1]; }; S *s = (S *)malloc (sizeof *s + 31 * sizeof s->a[0]); new (s->a)int [32](); - -Wplacement-new=2
- در این سطح،
علاوه بر
تشخیص تمام
ساختارهای
مشابه سطح
۱، هشداری
نیز برای
عبارتهای
placement new صادر
میشود که
شیئی را در
آخرین عضو
ساختار
میسازند،
در حالی که
نوع آن
آرایهای
تکعنصری
بوده و
اندازه آن
کمتر از
اندازه شیء
در حال ساخت
است. در
حالی که
مثال قبلی
تشخیص داده
میشود،
ساختار زیر
از افزونه
آرایه با
عضو
انعطافپذیر
(flexible member array) برای
جلوگیری از
هشدار در
سطح ۲
استفاده
میکند.
struct S { int n, a[]; }; S *s = (S *)malloc (sizeof *s + 32 * sizeof s->a[0]); new (s->a)int [32]();
- -Wcatch-value
- -Wcatch-value=n (فقط C++ و Objective-C++)
- هشدار درباره گردانندههای catch که از طریق ارجاع (reference) مقدار را دریافت نمیکنند. با -Wcatch-value=1 (یا بهطور خلاصه -Wcatch-value)، درباره انواع کلاسهای چندریختی که با مقدار (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++)
- هشدار
درباره
نقطهویرگولهای
اضافه.
زمینههای
گوناگونی
وجود دارد
که یک
نقطهویرگول
اضافی ممکن
است در
آنها رخ
دهد. یکی از
آنها
نقطهویرگول
پس از
تعاریف
تابع
درونکلاسی
است که در
همه
گویشهای C++
معتبر است
(و هرگز یک pedwarn
محسوب
نمیشود):
struct S { void foo () {}; };دیگری نقطهویرگول اضافی در محدوده فضای نام (namespace) است که از C++11 مجاز دانسته شده است (بنابراین در C++98 یک pedwarn است):
struct S { }; ;و دیگری نقطهویرگول اضافی درون تعاریف کلاس است که از C++11 مجاز دانسته شده است (بنابراین در C++98 یک pedwarn است):
struct S { int a; ; }; - -Wno-global-module (فقط C++ و Objective-C++)
- غیرفعال کردن پیام تشخیصی در صورتی که قطعه ماژول سراسری (global module fragment) یک واحد ماژول، تنها متشکل از دستورات پیشپردازنده نباشد.
- -Wno-inaccessible-base (فقط C++ و Objective-C++)
- این گزینه
هشدارهایی
را کنترل
میکند که
هنگام
غیرقابلدسترس
بودن یک
کلاس پایه
در کلاسی که
به دلیل
ابهام از آن
مشتق شده
است، صادر
میشوند.
این هشدار
بهطور
پیشفرض
فعال است.
توجه داشته
باشید که
هشدار برای
کلاسهای
پایه مجازی
مبهم توسط
گزینه -Wextra
فعال
میشود.
struct A { int a; }; struct B : A { }; struct C : B, A { }; - -Wno-inherited-variadic-ctor
- فرونشاندن هشدارها درباره استفاده از سازندههای ارثبریشده C++11 هنگامی که کلاس پایه به ارث بردهشده دارای سازنده با تعداد آرگومان متغیرِ نوع C (C variadic) باشد؛ این هشدار بهطور پیشفرض روشن است زیرا علامت بیضی (...) به ارث برده نمیشود.
- -Wno-invalid-offsetof (فقط C++ و Objective-C++)
- فرونشاندن
هشدارها در
هنگام
اعمال
ماکروی
"offsetof" بر
روی نوع غیر
POD. مطابق
استاندارد
۲۰۱۴ ISO C++،
اعمال
"offsetof" بر
روی نوعی که
چیدمان
غیراستاندارد
دارد (non-standard-layout)
تعریفنشده
است. با این
حال، در
پیادهسازیهای
موجود C++،
معمولاً
"offsetof"
نتایج
معناداری
ارائه
میدهد. این
فلگ برای
کاربرانی
است که
آگاهند کدی
غیرقابلحمل
مینویسند
و عمداً
تصمیم
گرفتهاند
هشدار
مربوط به آن
را نادیده
بگیرند.
محدودیتهای مربوط به "offsetof" ممکن است در نسخههای آینده استاندارد C++ کاهش یابد.
- -Wsized-deallocation (فقط C++ و Objective-C++)
- هشدار
درباره
تعریف یک
تابع
آزادسازی
حافظه بدون
اندازه (unsized deallocation)
void operator delete (void *) noexcept; void operator delete[] (void *) noexcept;
بدون تعریف تابع آزادسازی متناظر دارای اندازه (sized deallocation)
void operator delete (void *, std::size_t) noexcept; void operator delete[] (void *, std::size_t) noexcept;
یا برعکس. توسط -Wextra به همراه -fsized-deallocation فعال میشود.
- -Wsuggest-final-types
- هشدار درباره انواعی با متدهای مجازی که اگر نوع با مشخصکننده "final" در C++11، یا در صورت امکان در یک فضای نام ناشناس (anonymous namespace) اعلان میشد، کیفیت کد بهبود مییافت. این به GCC اجازه میدهد تا فراخوانیهای چندریختی را با تهاجم بیشتری مجازیزدایی (devirtualize) کند. این هشدار در هنگام بهینهسازی زمان پیوند (link-time optimization) که اطلاعات مربوط به گراف سلسلهمراتب کلاسها کاملتر است، اثربخشی بیشتری دارد.
- -Wsuggest-final-methods
- هشدار درباره متدهای مجازی که اگر متد با مشخصکننده "final" در C++11 اعلان میشد، یا در صورت امکان، نوع آن در یک فضای نام ناشناس یا با مشخصکننده "final" اعلان میگردید، کیفیت کد بهبود مییافت. این هشدار در هنگام بهینهسازی زمان پیوند که اطلاعات مربوط به گراف سلسلهمراتب کلاسها کاملتر است، اثربخشی بیشتری دارد. توصیه میشود ابتدا پیشنهادهای -Wsuggest-final-types را بررسی کرده و سپس با نشانهگذاریهای جدید، برنامه را مجدداً بسازید.
- -Wsuggest-override
- هشدار درباره بازنویسی (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) مشخصشده با نحو "@"..."" نمونهسازی شود، استفاده میکند. در صورت استفاده از زمان اجرای GNU، نام کلاس پیشفرض "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
- فرض میکند که تمامی ارسالهای پیام در Objective-C ("[receiver message:arg]") در این واحد ترجمه، تضمین میکنند که گیرنده "nil" نیست. این کار اجازه میدهد نقاط ورود کارآمدتری در زمان اجرا مورد استفاده قرار گیرند. این گزینه تنها در ترکیب با زمان اجرای NeXT و نسخهٔ 0 یا 1 از ABI در دسترس است.
- -fobjc-abi-version=n
- استفاده از نسخهٔ n از ABI مربوط به Objective-C برای زمان اجرای انتخابشده. این گزینه در حال حاضر تنها برای زمان اجرای NeXT پشتیبانی میشود. در آن حالت، نسخهٔ 0 همان ABI سنتی (۳۲ بیتی) بدون پشتیبانی از خصوصیات (properties) و دیگر افزودههای Objective-C 2.0 است. نسخهٔ 1 همان ABI سنتی (۳۲ بیتی) به همراه پشتیبانی از خصوصیات و دیگر افزودههای Objective-C 2.0 است. نسخهٔ 2 همان ABI مدرن (۶۴ بیتی) است. اگر چیزی مشخص نشده باشد، پیشفرض روی ماشینهای هدف ۳۲ بیتی، نسخهٔ 0 و روی ماشینهای هدف ۶۴ بیتی، نسخهٔ 2 است.
- -fobjc-call-cxx-cdtors
- برای هر
کلاس Objective-C،
بررسی
میکند که
آیا
متغیرهای
نمونهٔ آن
یک شیء C++ با
سازندهٔ
پیشفرض
غیربدیهی
(non-trivial) هستند یا
خیر. در این
صورت، یک
متد نمونهٔ
ویژه به نام
"- (id) .cxx_construct"
ایجاد
میکند که
سازندههای
پیشفرض
غیربدیهی
را روی هر
یک از این
متغیرهای
نمونه، به
ترتیب،
اجرا کرده و
سپس "self"
را
بازمیگرداند.
به همین
ترتیب،
بررسی
میکند که
آیا متغیر
نمونهای
یک شیء C++ با
یک مخرب
غیربدیهی
است یا خیر،
و در این
صورت، متد
ویژهٔ "- (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++ ارائه میشود. این گزینه برای استفاده از کلیدواژههای @try، @throw، @catch، @finally و @synchronized در Objective-C ضروری است. این گزینه هم با زمان اجرای GNU و هم با زمان اجرای NeXT قابل استفاده است (اما در ترکیب با زمان اجرای NeXT روی Mac OS X 10.2 و قبلتر در دسترس نیست).
- -fobjc-gc
- فعال کردن زبالهروبی (GC) در برنامههای Objective-C و Objective-C++. این گزینه تنها با زمان اجرای NeXT در دسترس است؛ زمان اجرای GNU پیادهسازی زبالهروبی متفاوتی دارد که نیازی به پرچمهای خاص کامپایلر ندارد.
- -fobjc-nilcheck
- برای زمان اجرای NeXT با نسخهٔ 2 از ABI، قبل از انجام فراخوانی واقعی متد، بررسی میکند که آیا گیرنده در فراخوانیهای متد nil است یا خیر. این حالت پیشفرض است و میتوان آن را با استفاده از -fno-objc-nilcheck غیرفعال کرد. متدهای کلاس و فراخوانیهای super، صرفنظر از مقدار این پرچم، هرگز برای nil بدین صورت بررسی نمیشوند. در حال حاضر هنگام استفاده از زمان اجرای GNU یا نسخهٔ قدیمیتر ABI زمان اجرای NeXT، این پرچم هیچ اثری ندارد.
- -fobjc-std=objc1
- پیروی از نحو زبان Objective-C 1.0، زبانی که توسط GCC 4.0 شناسایی میشد. این مورد تنها بر الحاقات Objective-C به زبان C/C++ اثر میگذارد؛ این گزینه تأثیری بر انطباق با استانداردهای C/C++، که توسط پرچمهای جداگانهٔ گزینههای گویش C/C++ کنترل میشوند، ندارد. هنگامی که از این گزینه با کامپایلر Objective-C یا Objective-C++ استفاده شود، هرگونه نحو Objective-C که توسط GCC 4.0 شناخته نشود رد میشود. این امر زمانی مفید است که بخواهید اطمینان حاصل کنید کد Objective-C شما با نسخههای قدیمیتر GCC قابل کامپایل است.
- -freplace-objc-classes
- صدور یک نشانگر ویژه که به ld(1) دستور میدهد فایل شیء حاصل را به طور ایستا پیوند نزند و به جای آن به dyld(1) اجازه دهد آن را در زمان اجرا بارگذاری کند. این گزینه در ترکیب با حالت اشکالزدایی Fix-and-Continue به کار میرود، که در آن فایل شیء مورد نظر ممکن است در جریان اجرای برنامه، بدون نیاز به راهاندازی دوبارهٔ خود برنامه، بازکامپایل شده و به طور پویا بازبارگذاری شود. در حال حاضر، کارکرد Fix-and-Continue تنها در ترکیب با زمان اجرای NeXT روی Mac OS X 10.3 و جدیدتر در دسترس است.
- -fzero-link
- هنگام کامپایل برای زمان اجرای NeXT، کامپایلر به طور معمول فراخوانیهای objc_getClass("...") را (در حالتی که نام کلاس در زمان کامپایل معلوم است) با ارجاعات ایستای کلاسی که در زمان بارگذاری مقداردهی اولیه میشوند جایگزین میکند، که این امر کارایی زمان اجرا را بهبود میبخشد. مشخص کردن پرچم -fzero-link این رفتار را لغو کرده و سبب میشود فراخوانیهای objc_getClass("...") حفظ شوند. این قابلیت در حالت اشکالزدایی Zero-Link مفید است، زیرا اجازه میدهد پیادهسازیهای کلاسهای مجزا در طول اجرای برنامه تغییر داده شوند. زمان اجرای GNU در حال حاضر همیشه و بدون در نظر گرفتن گزینههای خط فرمان، فراخوانیهای objc_get_class("...") را حفظ میکند.
- -fno-local-ivars
- بهطور پیشفرض، متغیرهای نمونه در Objective-C را میتوان بهگونهای که گویی متغیرهای محلی هستند از درون متدهای کلاسی که در آن اعلان شدهاند در دسترس قرار داد. این امر میتواند منجر به سایهاندازی بین متغیرهای نمونه و متغیرهای دیگری شود که یا بهطور محلی درون یک متد کلاس، یا بهطور سراسری با همان نام اعلان شدهاند. مشخص کردن پرچم -fno-local-ivars این رفتار را غیرفعال کرده و بنابراین از مشکلات سایهاندازی متغیرها جلوگیری میکند.
- -fivar-visibility=[public|protected|private|package]
- تنظیم میزان پدیداریِ پیشفرض متغیر نمونه روی گزینهٔ مشخصشده، بهطوری که متغیرهای نمونهٔ اعلانشده در خارج از حوزهٔ هر دستورِ اصلاحگر دسترسی، به طور پیشفرض دارای پدیداریِ مشخصشده باشند.
- -gen-decls
- تخلیهٔ اعلانهای واسط برای تمام کلاسهای دیدهشده در فایل منبع، در فایلی به نام sourcename.decl.
- -Wassign-intercept (فقط Objective-C و Objective-C++)
- هشدار در زمانی که یک انتساب Objective-C توسط زبالهروب رهگیری میشود.
- -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 که بزرگترین ساختار پاسدادهشده با مقدار را (در صورت وجود) توصیف میکند، تولید میکند.
گزینههای کنترل OpenMP و OpenACC (Options Controlling OpenMP and 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::decl(...)]]، [[omp::directive(...)]] و
[[omp::sequence(...)]] در C/C++
را فعال
میکند. در
Fortran، گزینه !$omp
و نشانگر
همگردانی
شرطی !$ را
فعال
میکند. در
کد مبدأ با
قالب ثابت
Fortran،
نشانگرها
همچنین
میتوانند
با c یا *
آغاز شوند.
این گزینه متضمن -pthread است، بنابراین فقط روی مقصدهایی که از -pthread پشتیبانی دارند، کار میکند. همچنین -fopenmp متضمن -fopenmp-simd است.
- -fopenmp-simd
- پردازش دستورالعملهای "simd"، "declare simd"، "declare reduction"، "assume"، "ordered"، "scan" و "loop" از OpenMP، و دستورالعملهای ترکیبی یا چندگانه با جزء "simd" را با "#pragma omp"، "[[omp::directive(...)]]"، "[[omp::sequence(...)]]" و "[[omp::decl(...)]]" در C/C++ و "!$omp" در Fortran فعال میکند. همچنین نشانگر همگردانی شرطی !$ را در Fortran فعال میسازد. در کد مبدأ با قالب ثابت Fortran، نشانگرها میتوانند با c یا * نیز شروع شوند. سایر دستورالعملهای OpenMP نادیده گرفته میشوند. مگر اینکه -fopenmp نیز افزون بر آن مشخص شده باشد، ناحیه "loop" بدون توجه به بند "bind" تعیینشده، به ناحیه وظیفه جاری پیوند میخورد.
- -fopenmp-target-simd-clone
- -fopenmp-target-simd-clone=device-type
- علاوه بر
ایجاد
کلونهای 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 -fno-diagnostics-show-nesting در آینده، اگر 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 برای آغاز قطعهها (hunkها) درون وصلههای تولیدشده.
- "diff-delete="
- زیررشتهٔ SGR برای خطوط حذفشده درون وصلههای تولیدشده.
- "diff-insert="
- زیررشتهٔ SGR برای خطوط درجشده درون وصلههای تولیدشده.
- "type-diff="
- زیررشتهٔ SGR برای برجستهسازی انواع ناهمخوان درون آرگومانهای الگو در فرانتاند ++C.
- "valid="
- زیررشتهٔ SGR برای برجستهسازی عناصر معتبر درون دیاگرامهای هنر متنی (text art).
- "invalid="
- زیررشتهٔ SGR برای برجستهسازی عناصر نامعتبر درون دیاگرامهای هنر متنی.
- "highlight-a="
- "highlight-b="
- زیررشتههای SGR برای ایجاد تمایز میان دو چیز متفاوت درون پیامهای تشخیصی، مانند یک جفت از نوعهای ناهماهنگ. بخش -fdiagnostics-show-highlight-colors را ببینید.
- -fdiagnostics-urls[=WHEN]
- استفاده از
توالیهای
گریز (escape sequences)
برای
جاسازی
پیوندها
(URLها) در
پیامهای
تشخیصی.
برای
نمونه،
هنگامی که
-fdiagnostics-show-option متنی
را منتشر
میکند که
گزینه خط
فرمانی
کنترلکننده
پیام
تشخیصی را
نشان
میدهد، یک
پیوند برای
مستندات آن
گزینه
جاسازی
میشود.
مقدار WHEN برابر با never، always یا auto است. مقدار auto باعث میشود GCC تنها زمانی از توالیهای گریز URL استفاده کند که خروجی خطای استاندارد یک ترمینال باشد، و در یک پوسته emacs یا هر ترمینال گرافیکی که ناسازگاری آن با این قابلیت شناخته شده است اجرا نشود؛ توضیحات زیر را ببینید.
مقدار پیشفرض بستگی به نحوه پیکربندی کامپایلر دارد. میتواند هر یک از مقدارهای WHEN در بالا باشد.
همچنین میتوان GCC را (از طریق گزینه زمان پیکربندی --with-diagnostics-urls=auto-if-env) بهگونهای پیکربندی کرد که مقدار پیشفرض تحت تأثیر متغیرهای محیطی قرار گیرد. تحت چنین پیکربندی، چنانچه هر یک از متغیرهای محیطی GCC_URLS یا TERM_URLS در محیط کامپایلر وجود داشته و غیرخالی باشند، مقدار پیشفرض GCC به auto تغییر میکند، یا در صورتی که هیچکدام وجود نداشته باشند به never تبدیل میشود.
با این حال، حتی با -fdiagnostics-urls=always نیز این رفتار وابسته به متغیرهای محیطی یادشده است: اگر GCC_URLS روی مقدار خالی یا no تنظیم شده باشد، پیوندهای URL در پیامهای تشخیصی جاسازی نمیشوند. اگر روی st تنظیم شود، پیوندها از توالیهای گریز ST استفاده میکنند. اگر روی bel (پیشفرض) تنظیم شود، پیوندها از توالیهای گریز BEL استفاده میکنند. هر مقدار غیرخالی دیگری این قابلیت را فعال میکند. اگر GCC_URLS تنظیم نشده باشد، از TERM_URLS بهعنوان جایگزین استفاده میشود. نکته: ST یک توالی گریز ANSI، یعنی پایاندهنده رشته ESC \ است؛ BEL یک نویسه ASCII یعنی CTRL-G است که معمولاً صدایی مانند بوق (beep) ایجاد میکند.
در حال حاضر GCC تلاش میکند چند ترمینال را نیز شناسایی کند که مشخص شده قابلیت URL را پیادهسازی نکردهاند و دارای باگ هستند یا دستکم در برخی نسخههایی که هنوز استفاده میشوند باگ داشتهاند؛ بهگونهای که احتمال میرود توالیهای گریز URL در آنها رفتار نادرستی نشان دهند، یعنی نویسههای نامفهوم روی صفحه نمایش چاپ کنند. این فهرست در حال حاضر شامل xfce4-terminal، برخی نسخههای gnome-terminal که باگ آنها شناخته شده است، کنسول لینوکس (linux console) و mingw است. این بررسی را میتوان با -fdiagnostics-urls=always نادیده گرفت.
- -fno-diagnostics-show-option
- بهطور پیشفرض، هر پیام تشخیصی منتشرشده شامل متنی است که گزینه خط فرمانی کنترلکننده مستقیم آن پیام تشخیصی را نشان میدهد (در صورتی که چنین گزینهای برای سازوکار تشخیص خطا شناخته شده باشد). مشخص کردن پرچم -fno-diagnostics-show-option این رفتار را متوقف میکند.
- -fno-diagnostics-show-caret
- بهطور پیشفرض، هر پیام تشخیصی منتشرشده شامل خط اصلی سورسکد و یک علامت هشتک (caret) ^ برای نشان دادن ستون است. این گزینه این اطلاعات را حذف میکند. چنانچه گزینه -fmessage-length=n مشخص شده باشد، خط منبع به n نویسه بریده میشود. هنگامی که خروجی به ترمینال فرستاده میشود، عرض خط به عرض دادهشده توسط متغیر محیطی COLUMNS، یا در صورت تنظیم نشدن، به عرض ترمینال محدود میشود.
- -fno-diagnostics-show-labels
- بهطور
پیشفرض،
هنگام چاپ
سورسکد (از
طریق -fdiagnostics-show-caret)،
پیامهای
تشخیصی
میتوانند
محدودههایی
از کد منبع
را با
اطلاعات
مرتبط
برچسبگذاری
کنند،
مانند نوع
عبارتها:
printf ("foo %s bar", long_i + long_j); ~^ ~~~~~~~~~~~~~~~ | | char * long intاین گزینه از چاپ این برچسبها جلوگیری میکند (در مثال بالا، خطهای عمودی و متنهای "char *" و "long int").
- -fno-diagnostics-show-event-links
- بهطور
پیشفرض،
هنگام چاپ
مسیرهای
اجرا (از
طریق
-fdiagnostics-path-format=inline-events)، GCC
خطوطی را
برای متصل
کردن
رویدادهای
مرتبط چاپ
میکند،
مانند خطی
که
رویدادهای
۱ و ۲ را در
نمونه زیر
به هم پیوند
میدهد:
3 | if (p) | ^ | | | (1) following `false' branch (when `p' is NULL)... ->-+ | | | | |+------------------------------------------------------------+ 4 || return 0; 5 || return *p; || ~ || | |+-------->(2) ...to here | (3) dereference of NULL `p'
این گزینه چاپ چنین خطوط اتصالدهندهای را متوقف میکند.
- -fno-diagnostics-show-cwe
- پیامهای تشخیصی میتوانند به صورت اختیاری یک شناسه مرتبط با CWE ("https://cwe.mitre.org/index.html") داشته باشند. خود GCC این فراداده را تنها برای برخی از پیامهای تشخیصی -fanalyzer ارائه میدهد. همچنین افزایههای GCC نیز ممکن است پیامهای تشخیصی همراه با چنین فرادادهای ارائه دهند. بهطور پیشفرض، اگر این اطلاعات موجود باشد، همراه با پیام تشخیصی چاپ خواهد شد. این گزینه از چاپ این فراداده جلوگیری میکند.
- -fno-diagnostics-show-rules
- پیامهای تشخیصی میتوانند بهطور اختیاری قواعدی وابسته به خود داشته باشند، مانند قواعدی برگرفته از یک استاندارد کدنویسی یا یک مشخصات فنی. خود GCC این کار را برای هیچیک از پیامهای تشخیصی خود انجام نمیدهد، اما افزایهها ممکن است چنین کنند. بهطور پیشفرض، چنانچه این اطلاعات موجود باشد، همراه با پیام تشخیصی چاپ خواهد شد. این گزینه چاپ این فراداده را متوقف میکند.
- -fno-diagnostics-show-highlight-colors
- کامپایلر GCC
میتواند
هنگام چاپ
پیامهای
تشخیصی و
نقل کد منبع
کاربر، از
رنگها
برای تأکید
و ایجاد
تمایز
استفاده
کند.
برای نمونه، در:
demo.c: In function `test_bad_format_string_args': ../../src/demo.c:25:18: warning: format `%i' expects argument of type `int', but argument 2 has type `const char *' [-Wformat=] 25 | printf("hello %i", msg); | ~^ ~~~ | | | | int const char * | %s
- عبارتهای %i و "int" در پیام و "int" در کد منبع نقلشده، با استفاده از "highlight-a" (بهطور پیشفرض سبز برجسته) رنگآمیزی میشوند، و
- عبارتهای "const char *" در پیام و در کد منبع نقلشده، هر دو با استفاده از "highlight-b" (بهطور پیشفرض آبی برجسته) رنگآمیزی میشوند.
هدف از این کار جلب نگاه خواننده به روابط میان جنبههای مختلف پیام تشخیصی و کد منبع است، با بهرهگیری از رنگ برای گروهبندی عناصر مرتبط و متمایز ساختن موارد ناهمخوان.
این رنگآمیزی اضافی در صورتی که چاپ رنگی فعال باشد (مطابق با -fdiagnostics-color=) بهطور پیشفرض فعال است، اما میتوان آن را بهطور جداگانه از طریق -fno-diagnostics-show-highlight-colors غیرفعال کرد.
- -fno-diagnostics-show-line-numbers
- بهطور پیشفرض، هنگام چاپ سورسکد (از طریق -fdiagnostics-show-caret)، حاشیه سمت چپی چاپ میشود که شماره خطوط را نشان میدهد. این گزینه این حاشیه سمت چپ را حذف میکند.
- -fdiagnostics-minimum-margin-width=width
- این گزینه کمینه عرض حاشیه سمت چپ چاپشده توسط -fdiagnostics-show-line-numbers را کنترل میکند. مقدار پیشفرض آن 6 است.
- -fdiagnostics-show-context[=depth]
- -fno-diagnostics-show-context
- با این
گزینه،
کامپایلر
ممکن است
زنجیره
جریان
کنترل مهمی
را که محافظ
بلوک پایه
دستور
دارای
هشدار است،
چاپ کند. depth
حداکثر عمق
زنجیره
جریان
کنترل است.
در حال
حاضر،
فهرست
گزینههای
هشدار
متأثر شامل
این موارد
است: -Warray-bounds،
-Wstringop-overflow، -Wstringop-overread،
-Wstringop-truncation و -Wrestrict.
ممکن است
گزینههای
هشدار
بیشتری در
نگارشهای
آینده به
این فهرست
افزوده
شوند.
شکلهای
-fdiagnostics-show-context و
-fno-diagnostics-show-context به
ترتیب
نامهای
مستعار
برای -fdiagnostics-show-context=1
و -fdiagnostics-show-context=0
هستند..IP
-fdiagnostics-parseable-fixits 4
راهنماهای
اصلاح (fix-it hints) را
در قالبی با
قابلیت
تجزیه توسط
ماشین که
برای
استفاده در
محیطهای
توسعه (IDE)
مناسب است
صادر
میکند.
برای هر
اصلاح، خطی
پس از پیام
تشخیصِ
مربوطه چاپ
خواهد شد که
با رشتهی
"fix-it:" آغاز
میشود.
برای مثال:
fix-it:"test.c":{45:3-45:21}:"gtk_widget_show_all"موقعیت به صورت یک بازهی نیمهباز بر حسب تعداد بایتها مشخص میشود که از بایت ۱ برای ستون ابتدایی شروع میگردد. در مثال فوق، بایتهای ۳ تا ۲۰ از خط ۴۵ فایل "test.c" باید با رشتهی دادهشده جایگزین شوند:
00000000011111111112222222222 12345678901234567890123456789 gtk_widget_showall (dlg); ^^^^^^^^^^^^^^^^^^ gtk_widget_show_all
نام فایل و رشتهی جایگزین، نویسهی بکاسلش را با "\\"، نویسهی تب را با "\t"، خط جدید را با "\n"، نقلقول دوگانه را با "\""، و نویسههای غیرقابلچاپ را با مبنای هشت (مثلاً تب عمودی با "\013") گریز میدهند (escape میکنند).
یک رشتهی جایگزینِ خالی نشان میدهد که بازهی مشخصشده باید حذف گردد. یک بازهی خالی (مانند "45:3-45:3") نشان میدهد که رشته باید در موقعیت دادهشده درج شود.
- -fdiagnostics-generate-patch
- راهنماهای
اصلاح را پس
از چاپ هر
پیام
تشخیصی، در
قالب تفاضل
یکپارچه (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
- نحوهی چاپ
مسیرهای
رویدادهای
جریان
کنترل را
برای
پیامهای
تشخیصی که
دارای چنین
مسیری
هستند،
مشخص
میکند.
مقدار 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-path-format=inline-events چاپ خواهد شد. اگر همراه با -fdiagnostics-path-format=separate-events مشخص شود، عمق پشته و اعلان تابع هنگام چاپ هر رویداد ضمیمه خواهد شد. این گزینه برای استفادهٔ توسعهدهندگان GCC و توسعهدهندگان افزونهها هنگام اشکالزدایی پیامهای تشخیصی که جریان کنترل بینروالی را گزارش میدهند در نظر گرفته شده است. - -fno-show-column
-
از چاپ شمارههای ستون در پیامهای تشخیصی خودداری میکند. این امر ممکن است در مواردی که پیامهای تشخیصی توسط برنامهای پیمایش میشوند که شمارههای ستون را درک نمیکند، مانند dejagnu، ضروری باشد.
- -fdiagnostics-column-unit=UNIT
-
واحدهای مربوط به شمارهٔ ستون را مشخص میکند. این گزینه بر پیامهای تشخیصی سنتی (در نبود -fno-show-column) اثر میگذارد. مقدار پیشفرض UNIT، یعنی display، تعداد ستونهای نمایشی اشغالشده توسط هر نویسه را در نظر میگیرد. این مقدار در مورد نویسههای برگه (tab) میتواند بزرگتر از تعداد بایتهای موردنیاز برای کدگذاری نویسه باشد، یا در مورد نویسههای چندبایتی کوچکتر باشد. برای مثال، نویسهٔ «GREEK SMALL LETTER PI (U+03C0)» یک ستون نمایش را اشغال میکند و کدگذاری UTF-8 آن به دو بایت نیاز دارد؛ نویسهٔ «SLIGHTLY SMILING FACE (U+1F642)» دو ستون نمایش را اشغال کرده و کدگذاری UTF-8 آن به چهار بایت احتیاج دارد. تنظیم UNIT روی byte، شمارهٔ ستون را در همهٔ موارد به تعداد بایتهای خام تغییر میدهد، همانگونه که در GCC پیش از نگارش 11.1.0 بهصورت سنتی چاپ میشد.
- -fdiagnostics-column-origin=ORIGIN
-
مبدأ شمارههای ستون، یعنی شمارهٔ ستون اختصاصیافته به ستون نخست را تعیین میکند. مقدار پیشفرض 1 با رفتار سنتی GCC و راهنمای نگارش GNU مطابقت دارد. برخی ابزارها ممکن است با مبدأ 0 عملکرد بهتری داشته باشند؛ هر مقدار غیرمنفی را میتوان مشخص کرد.
- -fdiagnostics-escape-format=FORMAT
-
هنگامی که GCC خطوط مبدأ مربوط به یک پیام تشخیصی را چاپ میکند، معمولاً سعی میکند بایتهای مبدأ را مستقیماً چاپ کند. با این حال، برخی از پیامهای تشخیصی به مشکلات کدگذاری در فایل مبدأ مربوط میشوند، مانند UTF-8 ناصحیح (malformed)، یا مشکلات مربوط به نرمالسازی Unicode. این پیامهای تشخیصی علامتگذاری میشوند تا GCC هنگام چاپ خطوط مبدأ مرتبط، بایتهایی را که نویسههای ASCII قابلچاپ نیستند، نویسهگردانی (escape) کند. این گزینه نحوهٔ نویسهگردانی چنین بایتهایی را واپایش میکند. مقدار پیشفرض FORMAT، یعنی unicode، نویسههای Unicode غیرقابلچاپ در ASCII را به شکل <U+XXXX> نمایش میدهد، و بایتهایی که با یک نویسهٔ Unicode با کدگذاری معتبر در UTF-8 تطابق ندارند بهصورت شانزدهشانزدهی و به شکل <XX> نمایش داده خواهند شد. برای مثال، یک خط مبدأ شامل رشتهٔ before و به دنبال آن نویسهٔ Unicode با شناسهٔ U+03C0 («GREEK SMALL LETTER PI» با کدگذاری UTF-8 بهصورت 0xCF 0x80) و به دنبال آن بایت 0xBF (یک بایت پایانی سرگردان در UTF-8)، و سپس رشتهٔ after، برای چنین پیام تشخیصیای به صورت زیر چاپ خواهد شد: before<U+03C0><BF>afterتنظیم FORMAT روی bytes تمامی بایتهای غیرقابلچاپ ASCII را به شکل <XX> نمایش میدهد، و بدین ترتیب کدگذاری زیرین نویسههای یونیکد غیر-ASCII را نشان میدهد. برای مثال بالا، خروجی زیر چاپ خواهد شد:
before<CF><80><BF>after
- -fdiagnostics-text-art-charset=CHARSET
- برخی
پیامهای
تشخیصی
میتوانند
شامل
نمودارهای
«هنر متنی»
(text art) باشند:
مصورسازیهایی
که از متن
ساخته
شدهاند و
هدف آنها
نمایش در
قلمهایی
با عرض ثابت
(monospaced) است.
این گزینه مشخص میکند که در صورت وجود، چه نویسههایی باید برای چاپ چنین نمودارهایی استفاده شوند. مقدار CHARSET برابر با none، ascii، unicode، یا emoji است.
مقدار none چاپ چنین نمودارهایی را متوقف میکند. مقدار ascii تضمین میکند که این نمودارها صرفاً از ASCII تشکیل شوند («هنر ASCII»). مقدار unicode امکان استفادهٔ محافظهکارانه از نویسههای ترسیمی یونیکد (مانند نویسههای رسم جعبه) را فراهم میکند. مقدار emoji امکان افزودن ایموجی به خروجی را نیز مهیا میسازد (مانند درج U+26A0 WARNING SIGN و به دنبال آن U+FE0F VARIATION SELECTOR-16 جهت انتخاب نگارش ایموجی آن نویسه).
مقدار پیشفرض emoji است، مگر زمانی که متغیر محیطی LANG روی C تنظیم شده باشد، که در این صورت پیشفرض ascii خواهد بود.
- -fno-diagnostics-show-nesting
- برخی از
پیامهای
تشخیصی GCC
ساختار
درونی
درختمانندی
از
پیامهای
تشخیصی
فرعی
تودرتو
دارند،
مانند
مواردی که
در هنگام
نمونهسازی
الگوهای ++C
رخ میدهند.
بهطور پیشفرض، GCC از تورفتگی و نشانههای نقطهای (bullet points) در خروجی متنی خود برای نمایش ساختار تودرتوی این پیامهای تشخیصی استفاده میکند، اطلاعات مکان را به خطوط جداگانه منتقل میکند تا ساختار خواناتر شود، و اطلاعات تکراری و زائد را حذف میکند.
انتخاب -fno-diagnostics-show-nesting این تورفتگی، تغییر قالببندی و حذف اطلاعات زائد را متوقف کرده و «نمای» قدیمیتر پیامهای تشخیصی را بازیابی میکند.
- -fno-diagnostics-show-nesting-locations
- هنگامی که fdiagnostics-show-nesting فعال باشد، نام فایلها و شمارههای خط و ستون در خطوطی جدا از متن پیامها نمایش داده میشوند. این اطلاعات مکانی را میتوان بهطور کامل با -fno-diagnostics-show-nesting-locations غیرفعال کرد. این گزینه برای استفادهٔ توسعهدهندگان GCC هنگام نگارش موارد آزمون DejaGnu در نظر گرفته شده است.
- -fdiagnostics-show-nesting-levels
- هنگامی که fdiagnostics-show-nesting فعال باشد، از fdiagnostics-show-nesting-levels برای نمایش شمارههایی که عمق تودرتویی را نشان میدهند نیز استفاده کنید. این گزینه برای استفادهٔ توسعهدهندگان GCC جهت اشکالزدایی پیامهای تشخیصی تودرتو ایجاد شده است، اما ممکن است برای توسعهدهندگان افزونهها نیز سودمند باشد.
- -fdiagnostics-format=FORMAT
- قالب دیگری
را برای چاپ
پیامهای
تشخیصی
انتخاب
میکند.
مقدار FORMAT
یکی از
موارد text،
sarif-stderr یا sarif-file
است.
استفاده از این گزینه، هر «مقصد خروجی» اضافی اضافه شده با -fdiagnostics-add-output= یا مقدار تنظیم شده با -fdiagnostics-set-output= را جایگزین میکند.
مقدار پیشفرض text است.
قالبهای sarif-stderr و sarif-file هر دو پیامهای تشخیصی را در قالب SARIF Version 2.1.0، به ترتیب در stderr یا در فایلی به نام source.sarif ارسال میکنند.
- -fdiagnostics-add-output=DIAGNOSTICS-OUTPUT-SPEC
- یک «مقصد
خروجی»
اضافی برای
ارسال
پیامهای
تشخیصی
اضافه
میکند.
مقدار DIAGNOSTICS-OUTPUT-SPEC باید یک طرحواره (scheme) را مشخص کند که بهصورت اختیاری با ":" و یک یا چند جفت KEY=VALUE دنبال میشود، به این صورت:
<SCHEME> <SCHEME>:<KEY>=<VALUE> <SCHEME>:<KEY>=<VALUE>,<KEY2>=<VALUE2>
و غیره.
طرحوارهها، کلیدها یا مقادیری که نام آنها با پیشوند «experimental» آغاز میشود ممکن است بدون اعلان قبلی تغییر یابند یا حذف شوند. کلیدها میتوانند مختص هر طرحواره باشند یا به کل GCC ارتباط داشته باشند.
مقدار SCHEME میتواند موارد زیر باشد:
- text
- ارسال
پیامهای
تشخیصی به stderr
با استفاده
از قالب
خروجی متنی
کلاسیک GCC.
کلیدهای پشتیبانیشده برای طرحوارهٔ "text" عبارتند از:
- color=[yes|no]
- تنظیمات رنگآمیزی حاصل از -fdiagnostics-color را برای این خروجی متنی لغو (override) میکند.
- show-nesting=[yes|no]
- حالتی را فعال میکند که روابط سلسلهمراتبی درون پیامهای تشخیصی را مطابق با -fdiagnostics-show-nesting برجسته میسازد. مقدار پیشفرض "yes" است.
- show-nesting-locations=[yes|no]
- اگر "show-nesting=yes" باشد، مکانها بهطور پیشفرض نمایش داده میشوند؛ این کلید را روی "no" تنظیم کنید تا چاپ این مکانها غیرفعال گردد. این ویژگی برای استفادهٔ توسعهدهندگان GCC هنگام نگارش موارد آزمون DejaGnu وجود دارد.
- show-nesting-levels=[yes|no]
- این یک گزینهٔ اشکالزدایی برای استفاده به همراه "show-nesting=yes" است. این کلید را روی "yes" تنظیم کنید تا سطوح تودرتویی صریح در خروجی چاپ شود. این ویژگی برای استفادهٔ توسعهدهندگان GCC در نظر گرفته شده است.
کلیدهای پشتیبانیشده برای طرحوارهٔ "sarif" عبارتاند از:
- file=FILENAME
- تعیین نام فایلی که خروجی SARIF در آن نوشته میشود، که میتواند با یک مسیر مطلق یا نسبی در ابتدا همراه باشد. در صورت عدم تعیین، مقدار پیشفرض source.sarif خواهد بود.
- serialization=[json]
- تعیین قالب سریالسازی برای استفاده هنگام نوشتن SARIF. در حال حاضر این مقدار تنها میتواند "json" باشد، اما به عنوان یک نقطهٔ گسترش برای آزمایش سایر روشهای سریالسازی تعبیه شده است.
- version=[2.1|2.2-prerelease]
- تعیین نگارش SARIF برای استفاده در خروجی. در صورت عدم تعیین، مقدار پیشفرض 2.1 است. "2.2-prerelease" از یک پیشنویس غیررسمی مشخصات آیندهٔ SARIF 2.2 استفاده میکند و در این انتشار تنها باید برای امور آزمایشی استفاده شود.
همچنین این کلید برای استفادهٔ توسعهدهندگان GCC به جای کاربران نهایی در نظر گرفته شده است و ممکن است بدون اطلاع قبلی تغییر کند یا حذف شود:
- state-graphs=[yes|no]
- این یک ویژگی اشکالزدایی است و مقدار پیشفرض آن "no" است. اگر "state-graphs=yes" باشد، تلاش میشود اطلاعات تفصیلی وضعیت از -fanalyzer در SARIF تولیدشده ثبت شود.
- experimental-html
- ارسال
اطلاعات
عیبیابی
به یک فایل
در قالب HTML.
این
طرحواره
آزمایشی
است و ممکن
است در
نگارشهای
آیندهٔ GCC
حذف شود.
کلیدها و
جزئیات
خروجی نیز
ممکن است
تغییر کنند.
کلیدهای پشتیبانیشده برای طرحوارهٔ "experimental-html" عبارتاند از:
- css=[yes|no]
- افزودن یک <style> درونریزیشده به HTML تولیدشده. مقدار پیشفرض yes است.
- file=FILENAME
- تعیین نام فایلی که خروجی HTML در آن نوشته میشود، که میتواند با یک مسیر مطلق یا نسبی در ابتدا همراه باشد. در صورت عدم تعیین، مقدار پیشفرض source.html خواهد بود.
- javascript=[yes|no]
- افزودن یک <script> درونریزیشده به HTML تولیدشده که یک واسط کاربری (UI) ساده و ابتدایی را برای مشاهدهٔ نتایج فراهم میکند. مقدار پیشفرض yes است.
همچنین این کلیدها برای استفادهٔ توسعهدهندگان GCC به جای کاربران نهایی در نظر گرفته شدهاند و ممکن است بدون اطلاع قبلی تغییر کنند یا حذف شوند:
- show-state-diagrams=[yes|no]
- این یک ویژگی اشکالزدایی است و مقدار پیشفرض آن "no" است. اگر "show-state-diagrams=yes" باشد، تلاش میشود با استفاده از dot نمودارهای SVG در HTML تولیدشده ایجاد شوند تا وضعیت را در هر رویداد از مسیر عیبیابی به تصویر بکشند. این نمودارها با فشردن «j» و «k» برای حرکت گامبهگام به جلو و عقب در میان رویدادها قابل مشاهده هستند. فعالسازی این گزینه روند تولید HTML را کُند خواهد کرد.
- show-graph-dot-src=[yes|no]
- این یک ویژگی اشکالزدایی است و مقدار پیشفرض آن "no" است. اگر "show-graph-dot-src=yes" باشد و "show-state-diagrams=yes" برقرار باشد، نمودارهای وضعیت تولیدشده همچنین ورودی سورس .dot به GraphViz را که برای تولید نمودار استفاده شده نشان خواهند داد.
- show-graph-sarif=[yes|no]
- این یک ویژگی اشکالزدایی است و مقدار پیشفرض آن "no" است. اگر "show-graph-sarif=yes" باشد و "show-state-diagrams=yes" برقرار باشد، نمودارهای وضعیت تولیدشده همچنین بازنمایی SARIF از وضعیت را نشان خواهند داد.
علاوه بر کلیدهای ویژهٔ هر طرحواره، کلید مرتبط با GCC زیر بر روی مقصدهای خروجی (sinks) متعلق به هر طرحوارهای قابل استفاده است:
- cfgs=[yes|no]
- اگر برای یک مقصد خروجی مقدار "cfgs=yes" تنظیم شده باشد، GCC تلاش خواهد کرد اطلاعات مربوط به گرافهای جریان کنترل را برای توابعی که در حال کامپایل آنهاست به آن مقصد ارسال کند. مقصدهای متنی این اطلاعات را نادیده میگیرند. مقصدهای SARIF این گرافها را در "theRun.graphs" اضافه خواهند کرد. مقصدهای HTML تصاویری در قالب SVG برای نمایش گرافها تولید خواهند کرد. شکل دقیق این اطلاعات ممکن است بدون اطلاع قبلی تغییر کند.
برای مثال،
-fdiagnostics-add-output=sarif:version=2.1,file=foo.2.1.sarif -fdiagnostics-add-output=sarif:version=2.2-prerelease,file=foo.2.2.sarif
یک جفت خروجی اضافه میکند که هر کدام در فایلی متفاوت نوشته شده و به ترتیب از نگارشهای 2.1 و 2.2 استاندارد SARIF استفاده میکنند.
به صورت EBNF:
<diagnostics-output-specifier> = <diagnostics-output-name>
| <diagnostics-output-name>, ":", <key-value-pairs>;
<diagnostics-output-name> = "text" | "sarif" | "experimental-html";
<key-value-pairs> = <key-value-pair>
| <key-value-pair> "," <key-value-pairs>;
<key-value-pair> = <key> "=" <value>;
<key> = ? string without a '=' ? ;
<value> = ? string without a ',' ? ;
- -fdiagnostics-set-output=DIAGNOSTICS-OUTPUT-SPEC
- این گزینه مشابه -fdiagnostics-add-output= عمل میکند، با این تفاوت که به جای افزودن یک «مقصد خروجی» اضافی برای عیبیابیها، تمام مقصدهای خروجی موجود، مانند مقصدهای ناشی از -fdiagnostics-format=، -fdiagnostics-add-output=، یا فراخوانی پیشین -fdiagnostics-set-output= را جایگزین میکند.
- -fno-diagnostics-json-formatting
- به طور
پیشفرض،
هنگامی که JSON
برای
عیبیابیها
منتشر
میشود (از
طریق -fdiagnostics-format=sarif-stderr
یا -fdiagnostics-format=sarif-file)، GCC
خطوط جدید و
تورفتگیهایی
اضافه
میکند تا
ساختار
سلسلهمراتبی
JSON را به صورت
بصری
برجسته
سازد.
از -fno-diagnostics-json-formatting برای حذف این فاصلههای خالی استفاده کنید. این گزینه باید پیش از گزینهای که قرار است بر آن تأثیر بگذارد مشخص شود.
این قابلیت برای سازگاری با ابزارهایی طراحی شده است که انتظار ندارند خروجی شامل خطوط جدید باشد، همانند خروجیهای منتشرشده توسط نگارشهای قدیمیتر GCC..SS "گزینههای درخواست یا مهار هشدارها (Options to Request or Suppress Warnings)" هشدارها پیامهای تشخیصی هستند که ساختارهایی را گزارش میکنند که ذاتاً نادرست نیستند، اما مخاطرهآمیز بوده یا حاکی از احتمال وقوع یک خطا هستند.
گزینههای مستقل از زبان زیر، هشدارهای خاصی را فعال نمیکنند، بلکه انواع پیامهای تشخیصی تولیدشده توسط GCC را کنترل میکنند.
- -fsyntax-only
- کد را تنها از نظر خطاهای نحوی بررسی میکند، اما کاری فراتر از آن انجام نمیدهد.
- -fmax-errors=n
- حداکثر تعداد پیامهای خطا را به n محدود میکند؛ در این نقطه GCC بهجای تلاش برای ادامهٔ پردازش کد منبع، کار را متوقف میکند. اگر n برابر با 0 باشد (پیشفرض)، محدودیتی در تعداد پیامهای خطای تولیدشده وجود نخواهد داشت. اگر -Wfatal-errors نیز مشخص شده باشد، آنگاه -Wfatal-errors نسبت به این گزینه اولویت دارد.
- -w
- --no-warnings
- تمام پیامهای هشدار را مهار (غیرفعال) میکند.
- -Werror
- تمام هشدارها را به خطا تبدیل میکند.
- -Werror=
- هشدار
مشخصشده
را به خطا
تبدیل
میکند.
مشخصکنندهٔ
هشدار به
انتها
پیوست
میشود؛
برای نمونه
-Werror=switch
هشدارهای
کنترلشده
توسط -Wswitch را
به خطا
تبدیل
میکند. این
گزینه شکلی
منفی نیز
میپذیرد
که برای نفی
-Werror برای
هشدارهای
خاص به کار
میرود؛
برای نمونه
-Wno-error=switch باعث
میشود
هشدارهای
-Wswitch حتی در
صورت فعال
بودن -Werror خطا
نباشند.
پیام هشدار برای هر هشدارِ قابل کنترل، شامل گزینهای است که آن هشدار را کنترل میکند. آن گزینه را میتوان طبق توضیحات بالا با -Werror= و -Wno-error= به کار برد. (چاپ شدن گزینه در پیام هشدار را میتوان با استفاده از پرچم -fno-diagnostics-show-option غیرفعال کرد.)
توجه داشته باشید که مشخص کردن -Werror=foo بهطور خودکار مستلزم -Wfoo است. با این حال، -Wno-error=foo هیچ مفهوم ضمنی دیگری در بر ندارد.
- -Wfatal-errors
- این گزینه باعث میشود کامپایلر با وقوع اولین خطا، بهجای تلاش برای ادامه و چاپ پیامهای خطای بیشتر، کامپایل را متوقف سازد.
میتوانید هشدارهای خاص بسیاری را با گزینههایی که با -W آغاز میشوند درخواست کنید؛ برای نمونه -Wunused-variable برای درخواست هشدار در مورد اعلان متغیرهایی که هرگز استفاده نمیشوند. هر یک از این گزینههای هشدار خاص دارای یک حالت منفی نیز هست که با -Wno- شروع میشود تا هشدارها را غیرفعال کند؛ برای نمونه، -Wno-unused-variable. این راهنما تنها یکی از این دو حالت را فهرست میکند، هر کدام که پیشفرض نباشد. برای گزینههای خاص زبانهای دیگر، به بخشهای C++ Dialect Options و Objective-C and Objective-C++ Dialect Options نیز مراجعه کنید. هشدارهای تکمیلی را میتوان با فعال کردن تحلیلگر ایستای کد تولید کرد؛
برخی گزینهها، مانند -Wall و -Wextra، گزینههای دیگر نظیر -Wunused را فعال میکنند که ممکن است خود گزینههای بیشتری مانند -Wunused-variable را فعال سازد. اثر ترکیبی حالتهای مثبت و منفی این است که گزینههای خاصتر، بدون در نظر گرفتن موقعیتشان در خط فرمان، نسبت به گزینههای با عمومیت بیشتر اولویت دارند. برای گزینههایی با درجهٔ اختصاصی یکسان، آخرین گزینه اعمال میشود. گزینههای فعال یا غیرفعالشده از طریق pragmaها، بهگونهای اعمال میشوند که گویی در انتهای خط فرمان درج شدهاند.
هنگامی که یک گزینهٔ هشدار ناشناخته درخواست شود (مانند -Wunknown-warning)، GCC خطایی صادر کرده و بیان میکند که گزینه شناختهشده نیست. با این حال، اگر حالت -Wno- استفاده شود، رفتار اندکی متفاوت است: برای -Wno-unknown-warning هیچ پیام تشخیصی صادر نمیشود مگر اینکه پیامهای تشخیصی دیگری نیز در حال تولید باشند. این ویژگی امکان استفاده از گزینههای جدید -Wno- را در کامپایلرهای قدیمیتر فراهم میآورد، اما در صورتی که مشکلی رخ دهد، کامپایلر هشدار میدهد که یک گزینهٔ ناشناخته وجود دارد.
اثربخشی برخی هشدارها به فعال بودن بهینهسازیها بستگی دارد. برای نمونه، -Wsuggest-final-types با بهینهسازی زمان پیوند مؤثرتر است. برخی هشدارهای دیگر ممکن است تا زمانی که بهینهسازی فعال نباشد اصلاً صادر نشوند. در حالی که بهینهسازی بهطور کلی کارایی هشدارها را در مورد مشکلات جریان کنترل و داده بهبود میبخشد، در برخی موارد ممکن است موجب هشدارهای مثبت کاذب نیز بشود.
- -Wpedantic
- -pedantic
- --pedantic
- تمام
هشدارهای
خواستهشده
توسط
استانداردهای
سختگیرانهٔ
ISO C و ISO C++ را صادر
میکند؛
تمام
برنامههایی
را که از
افزونههای
ممنوع
استفاده
میکنند و
برخی
برنامههای
دیگر را که
از ISO C و ISO C++
پیروی
نمیکنند،
تشخیص داده
و گزارش
میدهد. این
رفتار از
نسخهٔ
استاندارد
ISO C یا C++ که
توسط هر
گزینهٔ -std
به کار رفته
مشخص شده،
پیروی
میکند.
برنامههای معتبر ISO C و ISO C++ باید بدون توجه به وجود یا عدم وجود این گزینه بهدرستی کامپایل شوند (هرچند تعداد نادری به -ansi یا یک گزینهٔ -std برای تعیین نسخهٔ استاندارد نیاز دارند). با این حال، بدون این گزینه، برخی از افزونههای GNU و قابلیتهای سنتی C و C++ نیز پشتیبانی میشوند. با فعال بودن این گزینه، آنها گزارش میشوند (یا با -pedantic-errors رد میشوند).
گزینهٔ -Wpedantic برای استفاده از کلمات کلیدی جایگزینی که نام آنها با __ آغاز و پایان مییابد، پیام هشداری صادر نمیکند. این قالب جایگزین همچنین میتواند برای غیرفعال کردن هشدارها برای انواع غیر استاندارد ISO یعنی __intN (به صورت __intN__) استفاده شود. هشدارهای وسواسگونه (pedantic) در عبارتی که پس از "__extension__" میآید نیز غیرفعال میشوند. با این حال، فقط فایلهای سرآیند سیستمی باید از این راههای فرار استفاده کنند؛ برنامههای کاربردی باید از آنها اجتناب ورزند.
برخی هشدارها در مورد برنامههای ناسازگار با استاندارد، توسط گزینههایی غیر از -Wpedantic کنترل میشوند؛ در بسیاری از موارد آنها بهصورت ضمنی با -Wpedantic فعال میشوند، اما میتوان آنها را بهطور جداگانه با گزینهٔ خاص خودشان غیرفعال کرد، مانند -Wpedantic -Wno-pointer-sign.
در جایی که استاندارد مشخصشده با -std بیانگر یک گویش گسترشیافتهٔ GNU از C باشد، مانند gnu90 یا gnu99، یک استاندارد پایه متناظر وجود دارد، یعنی نسخهٔ ISO C که گویش گسترشیافتهٔ GNU بر پایهٔ آن استوار است. هشدارهای ناشی از -Wpedantic در مواردی صادر میشوند که توسط استاندارد پایه الزامی شده باشند. (منطقی نیست که چنین هشدارهایی فقط برای قابلیتهایی صادر شوند که در گویش GNU C مشخصشده نیستند، چرا که بنا به تعریف، گویشهای GNU C شامل تمام قابلیتهایی هستند که کامپایلر با گزینهٔ دادهشده پشتیبانی میکند و چیزی برای هشدار دادن وجود نخواهد داشت.)
- -pedantic-errors
- --pedantic-errors
- هرگاه
استاندارد
پایه (نگاه
کنید به -Wpedantic)
به پیامی
تشخیصی
نیاز داشته
باشد، در
برخی موارد
که رفتار
تعریفنشده
در زمان
کامپایل
وجود دارد،
و در برخی
موارد دیگر
که مانع
کامپایل
برنامههای
معتبر طبق
استاندارد
نمیشوند،
یک خطا صادر
میکند. این
معادل -Werror=pedantic
نیست:
گزینهٔ
اخیر بعید
است مفید
واقع شود،
زیرا تنها
پیامهای
تشخیصی
کنترلشده
توسط -Wpedantic را
به خطا
تبدیل
میکند، در
حالی که این
گزینه بر
پیامهای
تشخیصی
الزامی که
همیشه فعال
هستند یا
توسط
گزینههایی
غیر از -Wpedantic
کنترل
میشوند
نیز تأثیر
میگذارد.
اگر میخواهید پیامهای تشخیصی الزامی که بهطور پیشفرض هشدار هستند تبدیل به خطا شوند، اما مایل نیستید هشدارهای -Wpedantic نیز فعال گردند، میتوانید -pedantic-errors -Wno-pedantic را مشخص کنید (یا -pedantic-errors -Wno-error=pedantic برای فعال کردن آنها اما فقط در قالب هشدار).
برخی از پیامهای تشخیصی الزامی بهطور پیشفرض خطا هستند، اما میتوان با استفاده از -fpermissive یا گزینهٔ هشدار اختصاصی آنها، مثلاً -Wno-error=narrowing، آنها را به هشدار تقلیل داد.
برخی پیامهای تشخیصی برای رویکردهای غیر استاندارد ISO توسط گزینههای هشدار خاصی غیر از -Wpedantic کنترل میشوند، اما با -pedantic-errors نیز تبدیل به خطا میگردند. برای نمونه:
-Wattributes (برای ویژگیهای استاندارد) -Wchanges-meaning (در C++) -Wcomma-subscript (در C++23 یا بالاتر) -Wdeclaration-after-statement (در C90 یا قبلتر) -Welaborated-enum-base (در C++11 یا بالاتر) -Wimplicit-int (در C99 یا بالاتر) -Wimplicit-function-declaration (در C99 یا بالاتر) -Wincompatible-pointer-types -Wint-conversion -Wlong-long (در C90 یا قبلتر) -Wmain -Wnarrowing (در C++11 یا بالاتر) -Wpointer-arith -Wpointer-sign -Wincompatible-pointer-types -Wregister (در C++17 یا بالاتر) -Wvla (در C90 یا قبلتر) -Wwrite-strings (در C++11 یا بالاتر)
- -fpermissive
- برخی از
پیامهای
تشخیصی
الزامی در
مورد کدهای
ناسازگار
با
استاندارد
را از خطا
به هشدار
تنزل
میدهد.
بدین
ترتیب،
استفاده از
-fpermissive اجازه
میدهد
برخی از
کدهای
ناسازگار
کامپایل
شوند. برخی
پیامهای
تشخیصی C++
تنها توسط
این پرچم
کنترل
میشوند،
اما این
گزینه
همچنین
برخی
پیامهای
تشخیصی C و C++
را که پرچم
اختصاصی
خود را
دارند تنزل
میدهد:
-Wabbreviated-auto-in-template-arg (تنها C++ و Objective-C++) -Wdeclaration-missing-parameter-type (تنها C و Objective-C) -Wimplicit-function-declaration (تنها C و Objective-C) -Wimplicit-int (تنها C و Objective-C) -Wincompatible-pointer-types (تنها C و Objective-C) -Wint-conversion (تنها C و Objective-C) -Wnarrowing (تنها C++ و Objective-C++) -Wreturn-mismatch (تنها C و Objective-C) -Wtemplate-body (تنها C++ و Objective-C++)
گزینهٔ -fpermissive برای حالتهای تاریخی زبان C حالت پیشفرض است (-std=c89، -std=gnu89، -std=c90، -std=gnu90)..IP -Wall 4
- --all-warnings
- این گزینه
تمام
هشدارهایی
را درباره
ساختارهایی
که برخی
کاربران
مشکوک
میدانند و
اجتناب از
آنها (یا
اصلاح کد
برای
جلوگیری از
هشدار) حتی
در صورت
استفاده
همراه با
ماکروها
آسان است،
فعال
میکند. این
گزینه
همچنین
برخی
هشدارهای
مختص زبان
را که در C++ Dialect
Options و Objective-C and Objective-C++ Dialect Options
شرح داده
شدهاند،
فعال
میسازد.
-Wall پرچمهای هشدار زیر را روشن میکند:
-Waddress -Waligned-new (تنها C++ و Objective-C++) -Warray-bounds=1 (تنها با -O2) -Warray-compare -Warray-parameter=2 -Wbool-compare -Wbool-operation -Wc++11-compat -Wc++14-compat -Wc++17compat -Wc++20compat -Wcatch-value (تنها C++ و Objective-C++) -Wchar-subscripts -Wclass-memaccess (تنها C++ و Objective-C++) -Wcomment -Wdangling-else -Wdangling-pointer=2 -Wdelete-non-virtual-dtor (تنها C++ و Objective-C++) -Wduplicate-decl-specifier (تنها C و Objective-C) -Wenum-compare (در C/ObjC؛ این مورد بهطور پیشفرض در C++ فعال است) -Wenum-int-mismatch (تنها C و Objective-C) -Wformat=1 -Wformat-contains-nul -Wformat-diag -Wformat-extra-args -Wformat-overflow=1 -Wformat-truncation=1 -Wformat-zero-length -Wframe-address -Wimplicit (تنها C و Objective-C) -Wimplicit-function-declaration (تنها C و Objective-C) -Wimplicit-int (تنها C و Objective-C) -Winfinite-recursion -Winit-self (تنها C++ و Objective-C++) -Wint-in-bool-context -Wlogical-not-parentheses -Wmain (تنها برای C/ObjC و مگر در صورت استفاده از -ffreestanding) -Wmaybe-uninitialized -Wmemset-elt-size -Wmemset-transposed-args -Wmisleading-indentation (تنها برای C/C++) -Wmismatched-dealloc -Wmismatched-new-delete (تنها C++ و Objective-C++) -Wmissing-attributes -Wmissing-braces (تنها برای C/ObjC) -Wmultistatement-macros -Wnarrowing (تنها C++ و Objective-C++) -Wnonnull -Wnonnull-compare -Wopenmp-simd (تنها C و C++) -Woverloaded-virtual=1 (تنها C++ و Objective-C++) -Wpacked-not-aligned -Wparentheses -Wpessimizing-move (تنها C++ و Objective-C++) -Wpointer-sign (تنها برای C/ObjC) -Wrange-loop-construct (تنها C++ و Objective-C++) -Wreorder (تنها C++ و Objective-C++) -Wrestrict -Wreturn-type -Wself-move (تنها C++ و Objective-C++) -Wsequence-point -Wsign-compare (تنها C++ و Objective-C++) -Wsizeof-array-div -Wsizeof-pointer-div -Wsizeof-pointer-memaccess -Wstrict-aliasing -Wstrict-overflow=1 -Wswitch -Wtautological-compare -Wtrigraphs -Wuninitialized -Wunknown-pragmas -Wunused -Wunused-but-set-variable -Wunused-const-variable=1 (تنها برای C/ObjC) -Wunused-function -Wunused-label -Wunused-local-typedefs -Wunused-value -Wunused-variable -Wuse-after-free=2 -Wvla-parameter -Wvolatile-register-var -Wzero-length-bounds
توجه داشته باشید که برخی از پرچمهای هشدار توسط -Wall فعال نمیشوند. برخی از آنها در مورد ساختارهایی هشدار میدهند که کاربران عموماً آنها را مشکوک تلقی نمیکنند، اما ممکن است گاهی تمایل به بررسی آنها داشته باشید؛ برخی دیگر در مورد ساختارهایی هشدار میدهند که در بعضی شرایط ضروری هستند یا اجتناب از آنها دشوار است، و هیچ راه سادهای برای اصلاح کد جهت نادیده گرفتن هشدار وجود ندارد. بعضی از آنها با -Wextra فعال میشوند، اما بسیاری از آنها باید به صورت جداگانه فعال گردند.
- -Wextra
- --extra-warnings
- این گزینه
برخی
پرچمهای
هشدار
اضافی را که
توسط -Wall
فعال
نشدهاند،
فعال
میکند.
(این گزینه
در گذشته -W
نامیده
میشد. نام
قدیمیتر
همچنان
پشتیبانی
میشود،
اما نام
جدید
توصیفیتر
و گویاتر
است.)
-Wabsolute-value (تنها برای C/ObjC) -Walloc-size -Wcalloc-transposed-args -Wcast-function-type -Wclobbered -Wdangling-reference (تنها C++) -Wdeprecated-copy (تنها C++ و Objective-C++) -Wempty-body -Wenum-conversion (تنها برای C/ObjC) -Wexpansion-to-defined -Wignored-qualifiers (تنها برای C/C++) -Wimplicit-fallthrough=3 -Wmaybe-uninitialized -Wmissing-field-initializers -Wmissing-parameter-name (تنها C/ObjC) -Wmissing-parameter-type (تنها C/ObjC) -Wold-style-declaration (تنها C/ObjC) -Wmultiple-parameter-fwd-decl-lists (تنها C/ObjC) -Woverride-init (تنها C/ObjC) -Wredundant-move (تنها C++ و Objective-C++) -Wshift-negative-value (در C++11 تا C++17 و در C99 و جدیدتر) -Wsign-compare (تنها C++ و Objective-C++) -Wsized-deallocation (تنها C++ و Objective-C++) -Wstring-compare -Wtype-limits -Wuninitialized -Wunterminated-string-initialization (تنها C/ObjC) -Wunused-parameter (تنها با -Wunused یا -Wall) -Wunused-but-set-parameter (تنها با -Wunused یا -Wall)
گزینه -Wextra همچنین برای موارد زیر پیام هشدار چاپ میکند:
- یک اشارهگر با استفاده از "<"، "<="، ">" یا ">=" با عدد صحیح صفر مقایسه شود.
- (تنها C++) یک شمارششونده (enumerator) و یک غیرشمارششونده هر دو در یک عبارت شرطی ظاهر شوند.
- (تنها C++) کلاسهای پایه مجازی مبهم.
- (تنها C++) اندیسگذاری آرایهای که با "register" اعلان شده است.
- (تنها C++) گرفتن آدرس متغیری که با "register" اعلان شده است.
- (تنها C++) یک کلاس پایه در سازنده رونوشت یک کلاس مشتقشده مقداردهی اولیه نشود.
- -Wabi (تنها در C، Objective-C، C++ و Objective-C++)
- در مورد
کدهایی که
تحت تأثیر
تغییرات ABI
قرار
گرفتهاند
هشدار
میدهد. این
شامل
کدهایی
میشود که
ممکن است با
C++ ABI بیطرف از
فروشنده (vendor-neutral)
و همچنین psABI
برای
معماری
مقصد خاص
سازگار
نباشد.
هشدارهای
مورد دوم
همچنین
بهصورت
جداگانه
توسط -Wpsabi
کنترل
میشوند که
توسط -Wabi نیز
بهطور
ضمنی فعال
میگردد.
از آنجا که اکنون G++ بهطور پیشفرض در هر انتشار عمده اقدام به بهروزرسانی ABI میکند، معمولاً -Wabi فقط در صورتی در مورد مشکلات سازگاری C++ ABI هشدار میدهد که در یک سری از انتشارها، پس از کشف مشکل ABI از زمان انتشار اولیه، بررسی جدیدی اضافه شده باشد. اگر یک نسخه قدیمیتر ABI (با -fabi-version=n) انتخاب شود، -Wabi درباره موارد بیشتری هشدار میدهد.
-Wabi همچنین میتواند با یک شماره نسخه صریح استفاده شود تا درباره سازگاری C++ ABI با سطح خاصی از -fabi-version هشدار دهد؛ به عنوان مثال -Wabi=2 برای هشدار درباره تغییرات نسبت به -fabi-version=2.
اگر یک شماره نسخه صریح ارائه شده باشد و -fabi-compat-version مشخص نشده باشد، از شماره نسخه این گزینه برای نامهای مستعار سازگاری استفاده میشود. اگر هیچ شماره نسخه صریحی با این گزینه ارائه نشده باشد، اما -fabi-compat-version مشخص شده باشد، از آن شماره نسخه برای هشدارهای C++ ABI استفاده میشود.
اگرچه تلاش شده است تا درباره تمام این موارد هشدار داده شود، اما احتمالاً مواردی وجود دارد که با وجود تولید کد ناسازگار توسط G++، هشداری برای آنها داده نمیشود. همچنین ممکن است مواردی وجود داشته باشد که با وجود سازگار بودن کد تولید شده، هشدار صادر شود.
اگر نگران این موضوع هستید که کد تولیدشده توسط G++ ممکن است از نظر باینری با کد تولیدشده توسط کامپایلرهای دیگر سازگار نباشد، باید کد خود را برای اجتناب از این هشدارها بازنویسی کنید.
ناسازگاریهای شناختهشده در -fabi-version=2 (که از GCC 3.4 تا 4.9 پیشفرض بود) عبارتند از:
extern int N;
template <int &> struct S {};
void n (S<N>) {2}
این مورد در -fabi-version=3 برطرف شد.
- نوعهای
برداری SIMD که
با استفاده
از "__attribute
((vector_size))" اعلان
شده بودند،
به روشی
غیراستاندارد
درهمسازی
میشدند که
اجازهٔ
سربارگذاری
توابعی که
بردارهایی
با
اندازههای
مختلف
میگیرند
را نمیداد.
نحوهٔ درهمسازی در -fabi-version=4 تغییر داده شد.
- "__attribute ((const))" و
"noreturn"
بهصورت
توصیفکنندههای
نوع
درهمسازی
میشدند، و
"decltype"
مربوط به یک
اعلان ساده
حذف میشد.
این مشکلات درهمسازی در -fabi-version=5 برطرف شدند.
- شمارندههای
دامنهدار
(Scoped enumerators) که
بهعنوان
آرگومان به
یک تابع با
تعداد
متغیر
آرگومان (variadic)
ارسال
میشوند،
همانند
شمارندههای
بدون دامنه
ارتقا
مییابند و
موجب خطای
"va_arg"
میشوند. در
بیشتر
معماریهای
هدف، این
امر عملاً
تأثیری بر ABI
ارسال
پارامتر
ندارد،
زیرا راهی
برای ارسال
یک آرگومان
کوچکتر از
"int" وجود
ندارد.
همچنین، ABI نحوهٔ درهمسازی بستههای آرگومان الگو (template argument packs)، "const_cast"، "static_cast"، افزایش/کاهش پیشوندی، و یک تابع در حوزهٔ کلاس را که بهعنوان آرگومان الگو استفاده شده بود، تغییر داد.
این مسائل در -fabi-version=6 اصلاح شدند.
- توابع
لامبدا در
حوزهٔ
آرگومان
پیشفرض به
نادرستی
درهمسازی
میشدند، و
ABI نحوهٔ
درهمسازی
"nullptr_t" را
تغییر داد.
این مسائل در -fabi-version=7 اصلاح شدند.
- هنگام
درهمسازی
یک نوع تابع
با
توصیفکنندههای
cv تابع (function-cv-qualifiers)،
نوع تابعِ
بدون
توصیفکننده
به نادرستی
بهعنوان
یک نامزد
جایگزینی
در نظر
گرفته
میشد.
این مورد در -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"
باشد،
هشدار
میدهد. این
یک علت شایع
خطا است،
زیرا
برنامهنویسان
اغلب
فراموش
میکنند که
این نوع روی
برخی
ماشینها
علامتدار
(signed) است. به
@xref{Characters implementation} و
"char" type signedness
مراجعه
کنید.
این هشدار توسط -Wall فعال میشود. در صورت فعال بودن، این هشدار صرفنظر از اینکه "char" بهطور پیشفرض روی سیستم مقصد بدون علامت است یا خیر صادر میشود، و همچنین تحت تأثیر گزینههای -fsigned-char یا -funsigned-char قرار نمیگیرد.
- -Wno-coverage-mismatch
- چنانچه هنگام استفاده از گزینهٔ -fprofile-use، پروفایلهای بازخورد تطابق نداشته باشند، هشدار میدهد. اگر یک فایل منبع در فاصلهٔ بین کامپایل با -fprofile-generate و کامپایل با -fprofile-use تغییر کند، فایلهای حاوی بازخورد پروفایل ممکن است با فایل منبع همخوانی نداشته باشند و GCC نتواند از اطلاعات بازخورد پروفایل استفاده کند. بهطور پیشفرض، این هشدار فعال است و بهصورت یک خطا در نظر گرفته میشود. از -Wno-coverage-mismatch میتوان برای غیرفعال کردن هشدار، یا از -Wno-error=coverage-mismatch برای غیرفعال کردن خطا استفاده کرد. غیرفعال کردن خطا برای این هشدار میتواند منجر به تولید کدهای ضعیف بهینهسازیشده شود و تنها در مواردی با تغییرات بسیار جزئی مانند رفع باگها در یک پایهکد موجود کاربرد دارد. غیرفعالسازی کامل این هشدار توصیه نمیشود.
- -Wno-coverage-too-many-conditions
- چنانچه از -fcondition-coverage استفاده شود و یک عبارت دارای جملات بیش از حد باشد و GCC از پوشش (coverage) صرفنظر کند، هشدار میدهد. صرفنظر کردن از پوشش زمانی رخ میدهد که تعداد عبارات شرطی بیشتر از تعداد بیتهای موجود در یک "gcov_type_unsigned" باشد. این هشدار بهطور پیشفرض فعال است.
- -Wno-coverage-too-many-paths
- چنانچه از -fpath-coverage استفاده شود و یک تابع دارای مسیرهای بیش از حد باشد و GCC از پوشش صرفنظر کند، هشدار میدهد. صرفنظر کردن توسط -fpath-coverage-limit کنترل میشود. این هشدار بهطور پیشفرض فعال است.
- -Wno-coverage-invalid-line-number
- در صورتی که
یک تابع به
دلیل
ماکروهای
نامعتبر
شماره خط (linenum)
زودتر از
زمان شروع
خود به
پایان
برسد،
هشدار
میدهد. این
هشدار تنها
در صورت
فعال بودن
--coverage صادر
میشود.
بهطور پیشفرض، این هشدار فعال است و بهصورت یک خطا در نظر گرفته میشود. از -Wno-coverage-invalid-line-number میتوان برای غیرفعال کردن هشدار، یا از -Wno-error=coverage-invalid-line-number برای غیرفعال کردن خطا استفاده کرد.
- -Wno-cpp (تنها C، Objective-C، C++، Objective-C++ و Fortran)
- پیامهای هشدار صادرشده توسط دستورالعملهای "#warning" را فرونشانی میکند.
- -Wdouble-promotion (تنها C، C++، Objective-C و Objective-C++)
- هنگامی که
مقداری از
نوع "float"
بهطور
ضمنی به
"double"
ارتقا
مییابد،
یک هشدار
صادر
میکند.
پردازندههای
دارای واحد
ممیز شناور
۳۲ بیتی
«دقت
یگانه»
(single-precision)، نوع
"float" را
بهصورت
سختافزاری
پیادهسازی
میکنند،
اما "double"
را بهصورت
نرمافزاری
شبیهسازی
مینمایند.
در چنین
ماشینهایی،
انجام
محاسبات با
استفاده از
مقادیر
"double" به
دلیل بار
پردازشی
ناشی از
شبیهسازی
نرمافزاری،
بسیار
پرهزینهتر
است.
انجام تصادفی محاسبات با "double" بسیار آسان است، زیرا مقادیر لفظی ممیز شناور بهطور ضمنی از نوع "double" هستند. بهعنوان مثال در:
float area(float radius) { return 3.14159 * radius * radius; }کامپایلر کل محاسبات را با "double" انجام میدهد زیرا مقدار لفظی ممیز شناور از نوع "double" است.
- -Wduplicate-decl-specifier (تنها C و Objective-C)
- چنانچه یک اعلان دارای مشخصکنندهٔ تکراریِ "const"، "volatile"، "restrict" یا "_Atomic" باشد، هشدار میدهد. این هشدار توسط -Wall فعال میشود.
- -Wformat
- -Wformat=n
- فراخوانیهای
"printf"،
"scanf" و
غیره را
بررسی
میکند تا
اطمینان
حاصل شود که
آرگومانهای
ارائهشده
دارای
انواعی
متناسب با
رشتهٔ
قالببندی
مشخصشده
هستند، و
تبدیلهای
مشخصشده
در رشتهٔ
قالببندی
معنادار
میباشند.
این بررسی
شامل توابع
استاندارد
و سایر
توابع
مشخصشده
توسط
ویژگیهای
format، در
خانوادههای
"printf"،
"scanf"،
"strftime" و
"strfmon" (یک
افزونهٔ X/Open،
که در
استاندارد C
وجود ندارد)
(یا سایر
خانوادههای
مختص به
معماری هدف)
میشود.
اینکه کدام
توابع بدون
مشخص شدن
ویژگیهای
format بررسی
شوند،
بستگی به
نسخهٔ
استاندارد
انتخابشده
دارد، و
اینگونه
بررسیهای
توابع بدون
ویژگی
مشخصشده
با
گزینههای
-ffreestanding یا -fno-builtin
غیرفعال
میشوند.
قالبها بر اساس قابلیتهای قالببندی پشتیبانیشده توسط نسخهٔ 2.2 از GNU libc بررسی میشوند. این قابلیتها شامل تمام ویژگیهای ISO C90 و C99 و همچنین ویژگیهایی از مشخصات Single Unix و برخی افزونههای BSD و GNU است. سایر پیادهسازیهای کتابخانه ممکن است از تمام این قابلیتها پشتیبانی نکنند؛ GCC از هشدار دادن دربارهٔ قابلیتهایی که فراتر از محدودیتهای یک کتابخانهٔ خاص هستند پشتیبانی نمیکند. با این حال، اگر -Wpedantic به همراه -Wformat استفاده شود، دربارهٔ قابلیتهای قالببندی که در نسخهٔ استاندارد انتخابشده نیستند هشدار داده میشود (اما نه برای قالبهای "strfmon"، زیرا آنها در هیچ نسخهای از استاندارد C قرار ندارند).
- -Wformat
- گزینهٔ -Wformat معادل -Wformat=1، و -Wno-format معادل -Wformat=0 است. از آنجا که -Wformat همچنین آرگومانهای قالب تهی (null) را برای چندین تابع بررسی میکند، -Wformat بهطور ضمنی -Wnonnull را نیز در بر دارد. برخی جنبههای این سطح از بررسی قالب را میتوان با این گزینهها غیرفعال کرد: -Wno-format-contains-nul، -Wno-format-diag، -Wno-format-extra-args و -Wno-format-zero-length. -Wformat توسط -Wall فعال میشود.
- -Wformat=2
- -Wformat را بهعلاوهٔ بررسیهای قالب اضافی فعال میکند. در حال حاضر معادل -Wformat -Wformat-nonliteral -Wformat-security -Wformat-y2k است.
- -Wno-format-contains-nul
- در صورت مشخص شدن -Wformat، دربارهٔ رشتههای قالبی که حاوی بایتهای NUL هستند هشدار نده.
- -Wno-format-diag
- در صورت مشخص شدن -Wformat، دربارهٔ رشتههای قالبی که برای پیامهای تشخیصی GCC نامناسب هستند هشدار نده.
- -Wno-format-extra-args
- در صورت
مشخص شدن
-Wformat،
دربارهٔ
آرگومانهای
اضافی یک
تابع قالب
"printf" یا
"scanf"
هشدار نده.
استاندارد C
مشخص
میکند که
چنین
آرگومانهایی
نادیده
گرفته
میشوند.
در جایی که آرگومانهای استفادهنشده میان آرگومانهای استفادهشدهای قرار دارند که با مشخصکنندههای شماره عملوند $ مشخص شدهاند، معمولاً همچنان هشدار داده میشود، زیرا پیادهسازی نمیتواند بداند چه نوعی را باید به "va_arg" فرستاد تا از آرگومانهای استفادهنشده رد شود. با این حال، در مورد قالبهای "scanf"، این گزینه در صورتی که همهٔ آرگومانهای استفادهنشده اشارهگر باشند، هشدار را فرومینشاند، چرا که استاندارد Single Unix مشخص میکند که چنین آرگومانهای استفادهنشدهای مجاز هستند.
- -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، همچنین اگر رشتهٔ قالب نیازمند یک آرگومان بدون علامت باشد و آرگومان علامتدار باشد، یا برعکس، هشدار بده.
- -Wformat-truncation
- -Wformat-truncation=level
- دربارهٔ فراخوانیهای توابع ورودی/خروجی قالببندیشده مانند "snprintf" و "vsnprintf" که ممکن است به بریده شدن خروجی منجر شوند هشدار میدهد. هنگامی که تعداد دقیق بایتهای نوشتهشده توسط یک راهنمای قالب را نتوان در زمان کامپایل تعیین کرد، بر اساس روشهای اکتشافی وابسته به آرگومان level و بهینهسازی تخمین زده میشود. در حالی که فعالسازی بهینهسازی در بیشتر موارد دقت هشدار را بهبود میبخشد، ممکن است به موارد مثبت کاذب نیز منجر شود. به جز مواردی که خلاف آن ذکر شده باشد، این گزینه از همان منطق -Wformat-overflow استفاده میکند.
- -Wformat-truncation
- -Wformat-truncation=1
- سطح 1 از -Wformat-truncation که توسط -Wformat فعال میشود، رویکردی محتاطانه در پیش میگیرد که تنها دربارهٔ فراخوانیهای توابع کرانداری هشدار میدهد که مقدار بازگشتی آنها استفاده نشده است و به احتمال بسیار زیاد منجر به بریده شدن خروجی خواهند شد.
- -Wformat-truncation=2
- سطح 2 همچنین دربارهٔ فراخوانیهای توابع کرانداری هشدار میدهد که مقدار بازگشتی آنها استفاده شده است و در صورت وجود آرگومانی با طول یا بزرگی کافی ممکن است به بریده شدن خروجی بیانجامند.
- -Wnonnull
- دربارهٔ
ارسال یک
اشارهگر
تهی (null pointer) برای
آرگومانهایی
که با
مشخصهٔ
تابعی
"nonnull"
نیازمند
مقداری
غیرتهی
تعیین
شدهاند،
هشدار
میدهد.
-Wnonnull در -Wall و -Wformat گنجانده شده است. این گزینه میتواند با گزینهٔ -Wno-nonnull غیرفعال شود.
- -Wnonnull-compare
- هنگامی که
درون تابع،
آرگومان
علامتگذاریشده
با مشخصهٔ
تابعی
"nonnull" با null
مقایسه
شود، هشدار
میدهد.
-Wnonnull-compare در -Wall گنجانده شده است. این گزینه میتواند با گزینهٔ -Wno-nonnull-compare غیرفعال شود.
- -Wnull-dereference
- اگر کامپایلر مسیرهایی را شناسایی کند که به دلیل ارجاعزدایی از یک اشارهگر تهی (null)، موجب بروز خطا یا رفتار تعریفنشده (undefined behavior) میشوند، هشدار میدهد. این گزینه تنها زمانی فعال است که -fdelete-null-pointer-checks فعال باشد، که در بیشتر هدفها با فعالسازی بهینهسازیها فعال میشود. دقت این هشدارها به گزینههای بهینهسازی استفادهشده بستگی دارد.
- -Wno-musttail-local-addr
- دربارهٔ ارسال اشارهگر (یا در C++، یک ارجاع) به متغیر محلی یا برچسب به عنوان آرگومان یک فراخوانی "musttail" هشدار نمیدهد. این متغیرها قبل از دستور فراخوانی دم (tail call) از حوزهٔ دید (scope) خارج میشوند.
- -Wmaybe-musttail-local-addr
- هنگامی که
آدرس یک
متغیر محلی
بتواند به
یک
فراخوانی
"musttail" نشت
پیدا کند (escape)،
هشدار
میدهد،
مگر آنکه
پیش از
فراخوانی
"musttail" از
حوزه خارج
شده باشد.
int foo (int *); int bar (int *x) { if (x[0] == 1) { int a = 42; foo (&a); /* Without the C<musttail> attribute this call would not be tail called, because address of the C<a> variable escapes and the second foo call could dereference it. With the attribute the local variables are assumed to go out of scope immediately before the tail call instruction and the compiler warns about this. */ [[gnu::musttail]] return foo (nullptr); } else { { int a = 42; foo (&a); } /* The C<a> variable isn't already in scope, so even when it escaped, even without C<musttail> attribute it would be undefined behavior to dereference it and the compiler could turn this into a tail call. No warning is diagnosed here. */ [[gnu::musttail]] return foo (nullptr); } }این هشدار با -Wextra فعال میشود.
- -Wnrvo (تنها C++ و Objective-C++)
- اگر
کامپایلر
رونوشت از
یک متغیر
محلی به
مقدار
بازگشتی
تابع را در
شرایطی که
طبق [class.copy.elision]
مجاز است
حذف نکند (elide)،
هشدار
میدهد. این
حذف رونوشت
معمولاً با
عنوان
بهینهسازی
مقدار
بازگشتی
نامگذاریشده
(Named Return Value Optimization)
شناخته
میشود.
برای
نمونه، در
مثال زیر
کامپایلر
نمیتواند
رونوشت را
از هر دو v1 و v2
حذف کند،
بنابراین
هیچکدام
را حذف
نمیکند.
std::vector<int> f() { std::vector<int> v1, v2; // ... if (cond) return v1; else return v2; // warning: not eliding copy } - -Winfinite-recursion
- دربارهٔ
فراخوانیهای
بازگشتی
بینهایت
هشدار
میدهد. این
هشدار در
تمام سطوح
بهینهسازی
کارایی
دارد، اما
برای تشخیص
بازگشت
بینهایت
در
فراخوانیهای
میان دو یا
چند تابع،
به
بهینهسازی
نیاز دارد.
-Winfinite-recursion در -Wall
گنجانده
شده است.
این گزینه را با -Wanalyzer-infinite-recursion مقایسه کنید که تشخیصی مشابه ارائه میدهد، اما به شیوهای متفاوت (به عنوان بخشی از -fanalyzer) پیادهسازی شده است.
- -Winit-self (تنها C، C++، Objective-C و Objective-C++)
- دربارهٔ
متغیرهای
مقداردهینشدهای
که با
خودشان
مقداردهی
اولیه
میشوند
هشدار
میدهد.
توجه داشته
باشید که
این گزینه
تنها
میتواند
همراه با
گزینهٔ -Wuninitialized
استفاده
شود.
برای مثال، GCC در قطعهکد زیر تنها زمانی دربارهٔ مقداردهینشده بودن "i" هشدار میدهد که -Winit-self مشخص شده باشد:
int f() { int i = i; return i; }این هشدار در C++ توسط -Wall فعال میشود.
- -Wno-implicit-int (تنها C و Objective-C)
- این گزینه
هشدارهای
مربوط به
مواردی را
که یک اعلان
نوعی را
مشخص
نمیکند،
کنترل
میکند. این
هشدار به
طور
پیشفرض،
به صورت یک
خطا، در 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
- هنگامی که
یک case در
عبارت switch به
مورد بعدی
سرریز کند (fall
through)، هشدار
میدهد.
برای نمونه:
switch (cond) { case 1: a = 1; break; case 2: a = 2; case 3: a = 3; break; }این گزینه زمانی که آخرین دستور یک case نتواند سرریز کند، مثلاً زمانی که یک عبارت return یا فراخوانی تابعی با صفت noreturn وجود داشته باشد، هشدار نمیدهد. همچنین -Wimplicit-fallthrough= دستورهای کنترل جریان، مانند ifها، را در نظر میگیرد و تنها در موارد مقتضی هشدار میدهد. برای نمونه:
switch (cond) { case 1: if (i > 3) { bar (5); break; } else if (i < 1) { bar (0); } else return; default: ... }از آنجا که مواردی وجود دارد که در آنها سرریز شدن case در switch مطلوب است، GCC مشخصهای با نام "__attribute__ ((fallthrough))" فراهم کرده است که باید همراه با یک عبارت تهی (null statement) استفاده شود تا از هشداری که در حالت عادی رخ میداد، جلوگیری کند: switch (cond) { case 1: bar (0); __attribute__ ((fallthrough)); default: ... }
استانداردهای C++17 و C23 یک روش استاندارد برای فرونشانی هشدار -Wimplicit-fallthrough با استفاده از "[[fallthrough]];" بهجای صفت GNU ارائه میدهند. در C++11 یا C++14، کاربران میتوانند از "[[gnu::fallthrough]];" استفاده کنند که یک افزونهٔ GNU است. بهجای این صفتها، همچنین امکان افزودن یک کامنت fallthrough برای فرونشاندن هشدار وجود دارد. کل بدنهٔ کامنت به سبک C یا C++ باید با عبارتهای منظم فهرستشده در زیر مطابقت داشته باشد. آرگومان گزینهٔ n مشخص میکند چه نوع کامنتهایی پذیرفته میشوند:
- *<-Wimplicit-fallthrough=0 هشدار را بهکلی غیرفعال میکند.>
- *<-Wimplicit-fallthrough=1 با عبارت منظم ".*" تطابق مییابد>
- و هر کامنتی بهعنوان کامنت fallthrough استفاده میشود.
- *<-Wimplicit-fallthrough=2 بدون حساسیت به حروف کوچک و بزرگ با>
- عبارت منظم ".*falls?[ \t-]*thr(ough|u).*" تطابق دارد.
- *<-Wimplicit-fallthrough=3 با حساسیت به حروف کوچک و بزرگ با یکی از>
- عبارتهای منظم زیر تطابق مییابد:
- *<"-fallthrough">
- *<"@fallthrough@">
- *<"lint -fallthrough[ \t]*">
- *<"[ \t.!]*(ELSE,? |INTENTIONAL(LY)? )?FALL(S | |-)?THR(OUGH|U)[ \t.!]*(-[^\n\r]*)?">
- *<"[ \t.!]*(Else,? |Intentional(ly)? )?Fall((s | |-)[Tt]|t)hr(ough|u)[ \t.!]*(-[^\n\r]*)?">
- *<"[ \t.!]*([Ee]lse,? |[Ii]ntentional(ly)? )?fall(s | |-)?thr(ough|u)[ \t.!]*(-[^\n\r]*)?">
- *<-Wimplicit-fallthrough=4 با حساسیت به حروف کوچک و بزرگ با یکی از>
- عبارتهای منظم زیر تطابق مییابد:
- *<"-fallthrough">
- *<"@fallthrough@">
- *<"lint -fallthrough[ \t]*">
- *<"[ \t]*FALLTHR(OUGH|U)[ \t]*">
- *<-Wimplicit-fallthrough=5 هیچ کامنتی را بهعنوان کامنت fallthrough>
- تشخیص نمیدهد؛ تنها صفتها هشدار را غیرفعال میکنند.
کامنت باید پس از فاصلههای خالی و کامنتهای دیگر اختیاری، با کلیدواژههای "case" یا "default"، یا با یک برچسب کاربر (user label) که پیش از یک برچسب "case" یا "default" قرار دارد دنبال شود.
switch (cond)
{
case 1:
bar (0);
/* FALLTHRU */
default:
...
}
هشدار -Wimplicit-fallthrough=3 با -Wextra فعال میشود.
- -Wno-if-not-aligned (فقط C، C++، Objective-C و Objective-C++)
- تعیین میکند که آیا هشدارهای صادرشده توسط صفت "warn_if_not_aligned" باید ایجاد شوند یا خیر. این هشدارها بهطور پیشفرض فعال هستند.
- -Wignored-qualifiers (فقط C و C++)
- هشدار
میدهد اگر
نوع
بازگشتی یک
تابع دارای
توصیفگر
نوع (type qualifier)
مانند
"const"
باشد. برای
استاندارد
ISO C چنین
توصیفگری
هیچ اثری
ندارد،
زیرا مقدار
بازگرداندهشده
توسط یک
تابع یک lvalue
نیست. برای
C++، این
هشدار تنها
برای انواع
اسکالر یا
"void" صادر
میشود.
استاندارد
ISO C انواع
بازگشتی
مقیدشدهٔ
"void" را در
تعاریف
توابع
ممنوع کرده
است،
بنابراین
چنین انواع
بازگشتی
حتی بدون
این گزینه
نیز همیشه
یک هشدار
دریافت
میکنند.
این هشدار همچنین با -Wextra فعال میشود.
- -Wno-ignored-attributes (فقط C و C++)
- این گزینه هشدارهای مربوط به زمان نادیده گرفته شدن یک صفت را کنترل میکند. تفاوت این گزینه با گزینهٔ -Wattributes در این است که هر زمان کامپایلر تصمیم به نادیده گرفتن (حذف) یک صفت بگیرد هشدار میدهد، نه زمانی که صفت ناشناخته باشد، در جای نادرست استفاده شده باشد و غیره. این هشدار بهطور پیشفرض فعال است.
- -Wmain
- هشدار
میدهد اگر
نوع "main"
مشکوک باشد.
"main" باید
تابعی با
پیوند
خارجی (external linkage)
باشد که int
بازمیگرداند
و صفر، دو
یا سه
آرگومان با
نوعهای
مناسب
میگیرد.
این هشدار
در C++ بهطور
پیشفرض
فعال است و
توسط -Wall یا
-Wpedantic فعال
میشود.
این هشدار با -pedantic-errors به یک خطا ارتقا مییابد.
- -Wmisleading-indentation (فقط C و C++)
- هنگامی که
تورفتگی کد
ساختار
بلوکی آن را
منعکس
نمیکند
هشدار
میدهد.
بهطور
مشخص، برای
عبارتهای
"if"،
"else"،
"while" و
"for" با
دستور
محافظتشدهای
که از
آکوالاد
استفاده
نمیکند و
به دنبال آن
یک دستور
محافظتنشده
با همان
تورفتگی
آمده است،
هشدار صادر
میشود.
در مثال زیر، فراخوانی «bar» بهطور گمراهکنندهای تورفتگی دارد، گویی که تحت شرط «if» محافظت شده است.
if (some_condition ()) foo (); bar (); /* Gotcha: this is not guarded by the "if". */
در صورت ترکیب تبها و فاصلهها، این هشدار از گزینهٔ -ftabstop= برای تعیین همتراز بودن دستورها استفاده میکند (مقدار پیشفرض 8 است).
این هشدار برای کدهایی که شامل منطق چندخطی پیشپردازنده هستند، مانند مثال زیر، صادر نمیشود.
if (flagA) foo (0); #if SOME_CONDITION_THAT_DOES_NOT_HOLD if (flagB) #endif foo (1);این هشدار پس از یک دستورالعمل "#line" صادر نمیشود، زیرا معمولاً نشاندهندهٔ کد خودکار تولیدشده است و نمیتوان فرضی دربارهٔ چیدمان فایلی که این دستورالعمل به آن ارجاع میدهد داشت.
این هشدار با -Wall در C و C++ فعال میشود.
- -Wmissing-attributes
- هشدار
میدهد
هنگامی که
در اعلان یک
تابع، یک یا
چند صفت که
یک تابع
مرتبط با
آنها
اعلان شده
است وجود
نداشته
باشد و غیاب
آنها ممکن
است بر
درستی یا
کارایی کد
تولیدشده
تأثیر
نامطلوب
بگذارد.
برای مثال،
این هشدار
برای اعلان
نامهای
مستعاری (alias)
صادر
میشود که
از صفتها
برای مشخص
کردن
الزامات
کممحدودکنندهتر
نسبت به
اهداف خود
استفاده
میکنند.
این امر
معمولاً
نشاندهندهٔ
یک فرصت
بهینهسازی
بالقوه است.
در مقابل،
گزینهٔ
-Wattribute-alias=2
هشدارهای
صادرشده در
هنگامی که
نام مستعار
محدودکنندهتر
از هدف باشد
را کنترل
میکند، که
میتواند
به تولید کد
نادرست
منجر شود.
صفتهای
مورد بررسی
شامل
"alloc_align"،
"alloc_size"،
"cold"،
"const"،
"hot"،
"leaf"،
"malloc"،
"nonnull"،
"noreturn"،
"nothrow"،
"pure"،
"returns_nonnull" و
"returns_twice"
هستند.
در C++، این هشدار زمانی صادر میشود که یک تخصیص صریح (explicit specialization) از یک الگوی اصلی که با صفتهای "alloc_align"، "alloc_size"، "assume_aligned"، "format"، "format_arg"، "malloc" یا "nonnull" اعلان شده، بدون آن صفت اعلان شود. صفتهای "deprecated"، "error" و "warning" این هشدار را فرونشانی میکنند.
میتوانید از صفت "copy" برای اعمال همان مجموعه صفتها روی یک اعلان مشابه اعلان دیگر بدون شمارش صریح صفتها استفاده کنید. این صفت را میتوان برای اعلانهای توابع، متغیرها یا انواع اعمال کرد. Common Attributes.
گزینهٔ -Wmissing-attributes با -Wall فعال میشود.
برای مثال، از آنجا که اعلان الگوی تابع اصلی زیر از هر دو صفت "malloc" و "alloc_size" استفاده میکند، اعلان تخصیص صریح الگو به دلیل نداشتن یکی از صفتها مشمول هشدار میشود. template <class T> T* __attribute__ ((malloc, alloc_size (1))) allocate (size_t); template <> void* __attribute__ ((malloc)) // missing alloc_size allocate<void> (size_t);
- -Wmissing-braces
- اگر
مقداردهندهٔ
اولیهٔ یک
دادهٔ
تجمیعی (aggregate)
یا union بهطور
کامل درون
آکولاد
قرار
نگرفته
باشد،
هشدار
میدهد. در
مثال زیر،
مقداردهندهٔ
اولیه برای
"a"
بهطور
کامل درون
آکولاد
قرار
نگرفته
است، اما
برای "b"
کاملاً
درون
آکولاد است.
int a[2][2] = { 0, 1, 2, 3 }; int b[2][2] = { { 0, 1 }, { 2, 3 } };این هشدار توسط -Wall فعال میشود.
- -Wmissing-include-dirs (فقط C، C++، Objective-C، Objective-C++ و Fortran)
- اگر یک دایرکتوری include ارائهشده توسط کاربر وجود نداشته باشد، هشدار میدهد. این گزینه بهطور پیشفرض برای C، C++، Objective-C و Objective-C++ غیرفعال است. برای Fortran، بهطور پیشفرض تا حدی فعال است و فقط برای -I و -J هشدار میدهد.
- -Wno-missing-profile
- این گزینه هشدارهای مربوط به در دسترس نبودن پروفایلهای بازخورد را هنگام استفاده از گزینهٔ -fprofile-use کنترل میکند. این گزینه مواردی را شناسایی میکند که بین کامپایل با -fprofile-generate و -fprofile-use، یک تابع جدید یا فایل جدید اضافه شده باشد، بدون اینکه پروفایلها مجدداً تولید شوند. در این موارد، فایلهای دادهٔ بازخورد پروفایل به ترتیب هیچ اطلاعات بازخورد پروفایلی برای تابع یا فایل تازه اضافه شده ندارند. همچنین در صورتی که فایلهای دادههای شمارش پروفایل (.gcda) حذف شوند، GCC نمیتواند از هیچگونه اطلاعات بازخورد پروفایل استفاده کند. در تمام این موارد، هشدارهایی صادر میشود تا اطلاع دهد که زمان انجام مرحلهٔ تولید پروفایل فرارسیده است. نادیده گرفتن این هشدار میتواند به تولید کدی با بهینهسازی ضعیف منجر شود. میتوان از -Wno-missing-profile برای غیرفعال کردن هشدار استفاده کرد، اما این کار توصیه نمیشود و تنها در صورتی باید انجام شود که نبودِ دادههای پروفایل توجیهپذیر باشد.
- -Wmismatched-dealloc
- برای
فراخوانی
توابع
آزادسازی
حافظه با
آرگومانهای
اشارهگری
که از توابع
تخصیصی
برگردانده
شدهاند که
تابع اولی
آزادساز
مناسبی
برای آنها
نیست،
هشدار
میدهد. یک
جفت تابع را
میتوان با
استفاده از
مشخصهٔ
"malloc" به
عنوان
تخصیصدهنده
و آزادساز
متناظر با
یکدیگر
پیوند داد.
به جز در
مواردی که
با گزینهٔ
-fno-builtin
غیرفعال
شده باشد،
توابع
استاندارد
"calloc"،
"malloc"،
"realloc" و
"free"، و
همچنین
شکلهای
متناظر
"operator new" و
"operator delete" در C++
بهطور
ضمنی به
عنوان
تخصیصدهنده
و آزادساز
منطبق با
یکدیگر در
نظر گرفته
میشوند. در
مثال زیر
"mydealloc"
تابع
آزادساز
برای
اشارهگرهای
بازگردانده
شده از
"myalloc" است.
void mydealloc (void*); __attribute__ ((malloc (mydealloc, 1))) void* myalloc (size_t); void f (void) { void *p = myalloc (32); // ...use p... free (p); // warning: not a matching deallocator for myalloc mydealloc (p); // ok }در C++، گزینهٔ مرتبط -Wmismatched-new-delete عدم تطابقهای مربوط به "operator new" یا "operator delete" را شناسایی میکند.
گزینهٔ -Wmismatched-dealloc در -Wall گنجانده شده است.
- -Wmultistatement-macros
- دربارهٔ
ماکروهای
چنددستوری
ناامن که به
نظر میرسد
توسط بندی
مانند
"if"،
"else"،
"for"،
"switch" یا
"while"
محافظت
شدهاند،
اما در عمل
پس از باز
شدن ماکرو
تنها دستور
اول محافظت
میشود،
هشدار
میدهد.
برای مثال:
#define DOIT x++; y++ if (c) DOIT;
مقدار "y" را بدون قیدوشرط افزایش خواهد داد، نه فقط زمانی که شرط "c" برقرار باشد. این مشکل معمولاً با قرار دادن ماکرو درون یک حلقهٔ do-while برطرف میشود:
#define DOIT do { x++; y++; } while (0) if (c) DOIT;این هشدار در C و C++ توسط -Wall فعال میشود.
- -Wparentheses
- اگر
پرانتزها
در
زمینههای
خاصی حذف
شده باشند
هشدار
میدهد؛
مانند
زمانی که در
جایی که یک
مقدار
درستی (truth value)
انتظار
میرود یک
انتساب
قرار گیرد،
یا زمانی که
عملگرهایی
که تقدم
آنها اغلب
باعث
سردرگمی
افراد
میشود به
صورت تو در
تو به کار
روند.
همچنین در صورت ظاهر شدن مقایسهای مانند "x<=y<=z" هشدار میدهد؛ این عبارت معادل "(x<=y ? 1 : 0) <= z" است که با برداشت معمول از نمادگذاری ریاضی تفاوت دارد.
همچنین دربارهٔ استفادههای خطرناک از افزونهٔ GNU برای عملگر "?:" با عملوند میانی حذفشده هشدار میدهد. هنگامی که شرط در عملگر "?:" یک عبارت بولی باشد، مقدار حذفشده همواره 1 است. در اغلب موارد برنامهنویسان انتظار دارند مقداری باشد که درون عبارت شرطی محاسبه شده است.
برای C++ این گزینه همچنین برای برخی موارد وجود پرانتزهای غیرضروری در اعلانها، که میتواند نشاندهندهٔ تلاش برای فراخوانی تابع به جای یک اعلان باشد، هشدار میدهد:
{ // Declares a local variable called mymutex. std::unique_lock<std::mutex> (mymutex); // User meant std::unique_lock<std::mutex> lock (mymutex); }این هشدار توسط -Wall فعال میشود.
- -Wno-self-move (فقط C++ و Objective-C++)
- این گزینه
زمانی که
مقداری با
استفاده از
"std::move" به
خودش
انتقال
داده (move)
میشود،
هشدار
میدهد.
چنین عمل
"std::move"
معمولاً
هیچ اثری
ندارد.
struct T { ... }; void fn() { T t; ... t = std::move (t); }این هشدار توسط -Wall فعال میشود.
- -Wsequence-point
- دربارهٔ
کدهایی که
ممکن است به
دلیل نقض
قواعد نقاط
توالی (sequence point) در
استانداردهای
C و C++ معنای
تعریفنشده
داشته
باشند،
هشدار
میدهد.
استانداردهای C و C++ ترتیب ارزیابی عبارات در یک برنامه را بر حسب نقاط توالی تعریف میکنند که نشاندهندهٔ یک ترتیب جزئی بین اجرای بخشهای برنامه است: بخشهایی که قبل از نقطهٔ توالی اجرا میشوند و بخشهایی که پس از آن اجرا میشوند. این نقاط پس از ارزیابی یک عبارت کامل (عبارتی که بخشی از یک عبارت بزرگتر نیست)، پس از ارزیابی عملوند اولِ عملگرهای "&&"، "||"، "? :" یا "," (کاما)، پیش از فراخوانی یک تابع (اما پس از ارزیابی آرگومانهای آن و عبارتی که تابع فراخوانیشده را مشخص میکند)، و در برخی نقاط دیگر رخ میدهند. به غیر از آنچه توسط قواعد نقاط توالی بیان شده است، ترتیب ارزیابی زیرعبارتهای یک عبارت مشخص نشده است. همهٔ این قواعد تنها یک ترتیب جزئی را توصیف میکنند نه یک ترتیب کامل، چرا که به عنوان مثال اگر دو تابع درون یک عبارت فراخوانی شوند بدون اینکه هیچ نقطهٔ توالی بین آنها باشد، ترتیب فراخوانی توابع نامشخص است. با این حال، کمیتهٔ استانداردها تصویب کردهاند که فراخوانی توابع نباید همپوشانی داشته باشد.
مشخص نشده است که در فاصلهٔ بین نقاط توالی، اعمال تغییرات روی مقادیر اشیاء دقیقاً چه زمانی اثرگذار میشود. برنامههایی که رفتار آنها به این موضوع وابسته است، رفتار تعریفنشده دارند؛ استانداردهای C و C++ تصریح میکنند که: «بین نقطهٔ توالی قبلی و بعدی، مقدار ذخیرهشدهٔ یک شیء در اثر ارزیابی یک عبارت باید حداکثر یک بار تغییر کند. علاوه بر این، مقدار قبلی تنها باید برای تعیین مقداری که قرار است ذخیره شود خوانده شود.» اگر برنامهای این قواعد را نقض کند، نتایج در هر پیادهسازی خاص کاملاً غیرقابلپیشبینی است.
نمونههایی از کدهایی با رفتار تعریفنشده عبارتند از "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++، مرجع) به متغیری که پس از بازگشت تابع از دامنه خارج میشود، هشدار نده.
- -Wreturn-mismatch
- درباره
دستورهای return
بدون عبارت
در توابعی
که مقدار
"void"
بازنمیگردانند
هشدار
میدهد.
همچنین
درباره
دستور
"return"
همراه با یک
عبارت در
تابعی که
نوع
بازگشتی آن
"void" است،
هشدار
میدهد،
مگر اینکه
نوع عبارت
نیز "void"
باشد. به
عنوان یک
افزونه گنو
(GNU extension)، مورد
دوم بدون
هشدار
پذیرفته
میشود مگر
اینکه -Wpedantic
به کار رود.
تلاش برای استفاده از مقدار بازگشتی یک تابع غیر "void" بهجز "main" که با رسیدن به آکولاد پایانی تابع، اجرای آن به پایان میرسد، رفتاری تعریفنشده است.
این هشدار مخصوص C بوده و به طور پیشفرض فعال است. در گویشهای زبان C99 و جدیدتر، به عنوان یک خطا در نظر گرفته میشود. میتوان آن را با استفاده از -fpermissive (همراه با هشدارهای دیگر)، یا تنها برای این هشدار با -Wno-error=return-mismatch به یک هشدار تنزل داد.
- -Wreturn-type
- هرگاه
تابعی با
نوع
بازگشتی
تعریف شود
که به طور
پیشفرض
"int" باشد
هشدار
میدهد (مگر
اینکه -Wimplicit-int
فعال باشد
که اولویت
دارد).
همچنین در
صورتی که
اجرای
برنامه به
پایان بدنه
تابع برسد،
یا اگر تابع
اصلاً حاوی
هیچ دستور return
نباشد،
هشدار
میدهد.
تلاش برای استفاده از مقدار بازگشتی یک تابع غیر "void" بهجز "main" که با رسیدن به آکولاد پایانی تابع، اجرای آن به پایان میرسد، رفتاری تعریفنشده است.
برخلاف C، در C++ رسیدن اجرای یک تابع غیر "void" بهجز "main" به پایان بدنه آن، حتی زمانی که مقدار تابع استفاده نشود، منجر به رفتار تعریفنشده (undefined behavior) میشود.
این هشدار در C++ به طور پیشفرض فعال است و در غیر این صورت با -Wall فعال میشود.
- -Wno-shift-count-negative
- هشدارهای مربوط به منفی بودن مقدار شیفت را کنترل میکند. این هشدار به طور پیشفرض فعال است.
- -Wno-shift-count-overflow
- هشدارهای مربوط به بزرگتر یا مساوی بودن مقدار شیفت نسبت به پهنای بیتی نوع داده را کنترل میکند. این هشدار به طور پیشفرض فعال است.
- -Wshift-negative-value
- در صورت شیفت به چپ یک مقدار منفی هشدار میدهد. این هشدار توسط -Wextra در حالتهای C99 (و جدیدتر) و C++11 تا C++17 فعال میشود.
- -Wno-shift-overflow
- -Wshift-overflow=n
- این گزینهها هشدارهای مربوط به سرریزهای شیفت به چپ را کنترل میکنند.
- -Wshift-overflow=1
- این سطح هشدار -Wshift-overflow است و به طور پیشفرض در حالتهای C99 و C++11 (و جدیدتر) فعال است. این سطح هشدار درباره شیفت به چپ مقدار 1 به درون بیت علامت (sign bit) هشدار نمیدهد. (با این حال، در C، چنین سرریزی همچنان در زمینههایی که یک عبارت ثابت صحیح الزامی است، پذیرفته نمیشود.) در حالت C++20 (و جدیدتر) هیچ هشداری صادر نمیشود، زیرا شیفتهای به چپ علامتدار همیشه سرریز چرخشی دارند (wrap میشوند).
- -Wshift-overflow=2
- این سطح هشدار همچنین درباره شیفت به چپ مقدار 1 به درون بیت علامت هشدار میدهد، مگر اینکه حالت C++14 (یا جدیدتر) فعال باشد.
- -Wswitch
- هرگاه یک دستور "switch" اندیسی از نوع شمارشی داشته باشد و برای یک یا چند کد نامگذاریشده از آن شمارش فاقد "case" باشد، هشدار میدهد. (حضور برچسب "default" مانع از این هشدار میشود.) برچسبهای "case" که با مقادیر شمارشی همخوانی ندارند نیز هنگام استفاده از این گزینه موجب هشدار میشوند، مگر اینکه شمارش با مشخصه "flag_enum" علامتگذاری شده باشد. این هشدار با -Wall فعال میشود.
- -Wswitch-default
- هرگاه یک دستور "switch" فاقد مورد "default" باشد، هشدار میدهد.
- -Wswitch-enum
- هرگاه یک دستور "switch" اندیسی از نوع شمارشی داشته باشد و برای یک یا چند کد نامگذاریشده از آن شمارش فاقد "case" باشد، هشدار میدهد. برچسبهای "case" که با مقادیر شمارشی همخوانی ندارند نیز هنگام استفاده از این گزینه موجب هشدار میشوند، مگر اینکه شمارش با مشخصه "flag_enum" مشخص شده باشد. تنها تفاوت بین -Wswitch و این گزینه در این است که این گزینه حتی در صورت وجود برچسب "default" نیز درباره کد شمارشی از قلم افتاده هشدار میدهد.
- -Wno-switch-bool
- زمانی که یک
دستور
"switch"
اندیسی از
نوع بولی (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: ... }اگر دستور بین عبارت کنترلی و نخستین برچسب case صرفاً یک اعلان باشد، -Wswitch-unreachable هشداری صادر نمیکند:
switch (cond) { int i; ... case 5: i = 5; ... }این هشدار به طور پیشفرض برای برنامههای C و C++ فعال است.
- -Wsync-nand (C and C++ only)
- زمانی که توابع توکار "__sync_fetch_and_nand" و "__sync_nand_and_fetch" استفاده شوند، هشدار میدهد. معناشناسی این توابع در GCC 4.4 تغییر کرده است.
- -Wtrivial-auto-var-init
- زمانی که "-ftrivial-auto-var-init" نتواند متغیر خودکار را مقداردهی اولیه کند، هشدار میدهد. یک وضعیت معمول، متغیر خودکاری است که بین عبارت کنترلی و نخستین برچسب case در یک دستور "switch" اعلان شده باشد.
- -Wunused-but-set-parameter
- گزینه -Wunused-but-set-parameter همانند -Wunused-but-set-parameter=3 و -Wno-unused-but-set-parameter همانند -Wunused-but-set-parameter=0 است.
- -Wunused-but-set-parameter=n
- هرگاه به یک
پارامتر
تابع
مقداری
انتساب
داده شود،
اما در غیر
این صورت
(به جز در
اعلان آن)
استفاده
نشود،
هشدار
میدهد.
برای فرونشاندن این هشدار از مشخصه "unused" استفاده کنید.
گزینه -Wunused-but-set-parameter=0 این هشدار را غیرفعال میکند. با -Wunused-but-set-parameter=1 تمام استفادهها به جز مقداردهی اولیه و سمت چپ انتسابی که دیگر استفاده نشود، هشدار را غیرفعال میکنند. با -Wunused-but-set-parameter=2 علاوه بر این، استفاده از پارامتر در عملگرهای "++" و "--" به عنوان استفاده به شمار نمیآید. و سرانجام با -Wunused-but-set-parameter=3 علاوه بر این، استفاده در parm "@=" rhs خارج از rhs به عنوان استفاده به شمار نمیآید. برای دیدن مثالها گزینه -Wunused-but-set-variable=n را ببینید.
این هشدار -Wunused-but-set-parameter=3 همچنین توسط -Wunused همراه با -Wextra فعال میشود..IP -Wunused-but-set-variable 4 گزینهٔ -Wunused-but-set-variable مشابه -Wunused-but-set-variable=3 و -Wno-unused-but-set-variable مشابه -Wunused-but-set-variable=0 است.
- -Wunused-but-set-variable=n
- هروقت به یک
متغیر محلی
مقداری
انتساب
داده شود،
اما در غیر
این صورت
(بهجز
اعلان آن)
استفاده
نشود،
هشدار
میدهد. این
هشدار
-Wunused-but-set-variable=3 با -Wall
فعال
میشود.
برای فرونشاندن این هشدار از صفت "unused" استفاده کنید.
گزینهٔ -Wunused-but-set-variable=0 هشدار را غیرفعال میکند. با -Wunused-but-set-variable=1 تمام استفادهها بهجز مقداردهی اولیه و سمت چپ انتسابی که دیگر استفاده نمیشود، هشدار را غیرفعال میکنند. با -Wunused-but-set-variable=2 علاوه بر این، استفاده از متغیر در عملگرهای "++" و "--" به عنوان استفاده به شمار نمیآیند. و در نهایت با -Wunused-but-set-variable=3 افزون بر موارد پیشین، استفاده در parm "@=" rhs در خارج از rhs به عنوان استفاده به شمار نمیآیند.
این هشدار -Wunused-but-set-variable=3 همچنین با -Wunused که خود توسط -Wall فعال میشود، فعال میگردد.
void foo (void) { int a = 1; // B<-Wunused-variable> warning int b = 0; // Warning for <n> >= 1 b = 1; b = 2; int c = 0; // Warning for <n> >= 2 ++c; c--; --c; c++; int d = 0; // Warning for <n> >= 3 d += 4; int e = 0; // No warning, cast to void (void) e; int f = 0; // No warning, f used int g = f = 5; (void) g; int h = 0; // No warning, preincrement result used int i = ++h; (void) i; int j = 0; // No warning, postdecrement result used int k = j--; (void) k; int l = 0; // No warning, l used int m = l |= 2; (void) m; } - -Wunused-function
- هروقت یک تابع static اعلان شده اما تعریف نشده باشد، یا یک تابع static غیرِ inline استفاده نشده باشد، هشدار میدهد. این هشدار توسط -Wall فعال میشود.
- -Wunused-label
- هروقت یک
برچسب
اعلان شده
اما
استفاده
نشده باشد،
هشدار
میدهد. این
هشدار توسط
-Wall فعال
میشود.
برای فرونشاندن این هشدار از صفت "unused" استفاده کنید.
- -Wunused-local-typedefs (فقط C، Objective-C، C++ و Objective-C++)
- هنگامی که یک typedef که بهصورت محلی در یک تابع تعریف شده استفاده نشود، هشدار میدهد. این هشدار توسط -Wall فعال میشود.
- -Wunused-parameter
- هروقت یک
پارامتر
تابع بهجز
در اعلان آن
استفاده
نشود،
هشدار
میدهد. این
گزینه توسط
"-Wunused"
فعال
نمیشود
مگر اینکه
"-Wextra" نیز
مشخص شده
باشد.
برای فرونشاندن این هشدار از صفت "unused" استفاده کنید.
- -Wno-unused-result
- اگر فراخوانندهٔ تابعی که با صفت "warn_unused_result" علامتگذاری شده از مقدار بازگشتی آن استفاده نکند، هشدار نمیدهد. پیشفرض -Wunused-result است.
- -Wunused-variable
- هروقت یک
متغیر محلی
یا static بهجز
در اعلان آن
استفاده
نشود،
هشدار
میدهد. این
گزینه برای
C متضمن
-Wunused-const-variable=1 است،
اما نه برای
C++. این هشدار
توسط -Wall
فعال
میشود.
برای فرونشاندن این هشدار از صفت "unused" استفاده کنید.
- -Wunused-const-variable
- -Wunused-const-variable=n
- هروقت یک
متغیر static
ثابت (const)
بهجز در
اعلان آن
استفاده
نشود،
هشدار
میدهد.
برای فرونشاندن این هشدار از صفت "unused" استفاده کنید.
- -Wunused-const-variable=1
- دربارهٔ
متغیرهای static
const
استفادهنشده
که در واحد
ترجمهٔ
اصلی تعریف
شدهاند
هشدار
میدهد،
اما
دربارهٔ
متغیرهای static
const
اعلانشده
در
سرآیندهای
گنجاندهشده
هشدار
نمیدهد.
گزینهٔ -Wunused-const-variable=1 توسط هر یک از -Wunused-variable یا -Wunused برای C فعال میشود، اما نه برای C++. در C این کار فضای ذخیرهسازی متغیر را اعلان میکند، اما در C++ این یک خطا نیست زیرا متغیرهای const جای "#define"ها را میگیرند.
- -Wunused-const-variable=2
- این سطح هشدار همچنین برای متغیرهای static ثابتِ استفادهنشده در سرآیندها (بهجز سرآیندهای سیستمی) هشدار میدهد. این سطح معادل شکل کوتاه -Wunused-const-variable است. این سطح باید صریحاً در هر دو زبان C و C++ درخواست شود زیرا ممکن است پاکسازی تمام سرآیندهای گنجاندهشده دشوار باشد.
- -Wunused-value
- هروقت یک
گزاره
نتیجهای
را محاسبه
کند که
صراحتاً
استفاده
نمیشود،
هشدار
میدهد.
برای
فرونشاندن
این هشدار
عبارت
استفادهنشده
را به "void"
تبدیل نوع
کنید. این
شامل یک
گزاره-عبارت
یا سمت چپ
یک عبارت
کاما است که
فاقد عوارض
جانبی باشد.
برای
نمونه،
عبارتی
مانند
"x[i,j]"
موجب هشدار
میشود، در
حالی که
"x[(void)i,j]"
هشداری
ایجاد
نمیکند.
این هشدار توسط -Wall فعال میشود.
- -Wunused
- تمام
گزینههای
-Wunused بالا به
همراه
یکدیگر،
بهجز
مواردی که
مستند شده
است باید
صریحاً
مشخص شوند.
برای دریافت هشدار دربارهٔ یک پارامتر استفادهنشدهٔ تابع، باید یا -Wextra -Wunused را مشخص کنید (توجه داشته باشید که -Wall متضمن -Wunused است)، یا بهطور جداگانه -Wunused-parameter و/یا -Wunused-but-set-parameter را مشخص نمایید.
گزینهٔ -Wunused تنها -Wunused-const-variable=1 را به جای -Wunused-const-variable فعال میکند، و آن هم فقط برای C، نه C++.
- -Wuse-after-free (فقط C، Objective-C، C++ و Objective-C++)
- -Wuse-after-free=n
- دربارهٔ استفاده از اشارهگرها به اشیایی که بهصورت پویا تخصیص یافتهاند و بر اثر فراخوانی یک تابع آزادسازی حافظه، به وضعیت نامعین درآمدهاند، هشدار میدهد. این هشدار در تمام سطوح بهینهسازی فعال است، اما ممکن است در حالت با بهینهسازی نسبت به بدون بهینهسازی نتایج متفاوتی حاصل کند. گزینهٔ -Wuse-after-free معادل با -Wuse-after-free=1 است.
- -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++)
- هنگامی که
یک عبارت به
نوع خودش
تبدیل (cast)
میشود،
هشدار
میدهد. این
هشدار
زمانی که یک
شیء کلاس به
نوعی
غیرمرجع
تبدیل شود
رخ
نمیدهد،
زیرا این
روشی برای
ایجاد یک
شیء موقت
است:
struct S { }; void g (S&&); void f (S&& arg) { g (S(arg)); // make arg prvalue so that it can bind to S&& } - -Wuninitialized
- اگر شیئی با
طول عمر
ذخیرهسازی
خودکار (automatic)
یا
تخصیصیافته
(allocated) بدون
مقداردهی
اولیه
استفاده
شود، هشدار
میدهد. در
C++، همچنین
در صورتی که
یک ارجاع
غیرایستا
(non-static) یا عضو
غیرایستای
"const" در
کلاسی بدون
سازنده (constructor)
ظاهر شود،
هشدار
میدهد.
علاوه بر این، ارسال یک اشارهگر (یا در C++، یک ارجاع) به شیء مقداردهینشده به یک آرگومان واجد شرایط "const" در توابع توکار (built-in) که مشخص است شیء را میخوانند، توسط این هشدار تشخیص داده میشود. (-Wmaybe-uninitialized برای توابع معمولی صادر میشود.)
اگر میخواهید درباره کدی که از مقدار مقداردهینشده متغیر در مقداردهی اولیه خودش استفاده میکند هشدار دریافت کنید، از گزینه -Winit-self استفاده نمایید.
این هشدارها هم برای تکتک عناصر مقداردهینشده متغیرهای ساختار (structure)، اجتماع (union) یا آرایهها و هم برای متغیرهایی که بهطور کامل مقداردهی اولیه نشدهاند رخ میدهند. آنها برای متغیرها یا عناصری که به عنوان "volatile" اعلان شدهاند، رخ نمیدهند. از آنجا که این هشدارها به بهینهسازی وابستهاند، متغیرها یا عناصر دقیقی که برای آنها هشدار صادر میشود، به گزینههای بهینهسازی دقیق و نسخه GCC مورد استفاده بستگی دارند.
توجه داشته باشید که ممکن است برای متغیری که تنها برای محاسبه مقداری به کار رفته که خودش هرگز استفاده نمیشود هیچ هشداری داده نشود، زیرا چنین محاسباتی ممکن است پیش از چاپ هشدارها توسط تحلیل جریان داده (data flow analysis) حذف شوند.
در C++، این گزینه همچنین درباره استفاده از اشیاء مقداردهینشده در فهرستهای مقداردهی اولیه اعضا (member-initializer-lists) هشدار میدهد. برای نمونه، GCC درباره مقداردهینشده بودن "b" در قطعهکد زیر هشدار میدهد:
struct A { int a; int b; A() : a(b) { } }; - -Wno-invalid-memory-model
- این گزینه
هشدارهای
مربوط به
فراخوانیهای
__atomic Builtins، __sync Builtins، و
توابع
عمومی
اتمیک C11 را
که با
آرگومان
سازگاری
حافظه (memory consistency)
همراه
هستند و
برای آن
عملیات
نامعتبر
است یا خارج
از محدوده
مقادیر
شمارشی (enumeration)
"memory_order"
قرار دارد،
کنترل
میکند. به
عنوان
مثال، از
آنجا که
توابع
توکار
"__atomic_store" و
"__atomic_store_n"
تنها برای
ترتیبات
حافظه relaxed، release و
sequentially consistent تعریف
شدهاند،
کد زیر
تشخیص داده
میشود:
void store (int *i) { __atomic_store_n (i, 0, memory_order_consume); }گزینه -Winvalid-memory-model به طور پیشفرض فعال است.
- -Wmaybe-uninitialized
- برای شیئی
با طول عمر
ذخیرهسازی
خودکار یا
تخصیصیافته،
اگر مسیری
از ورودی
تابع تا
استفادهای
از شیء که
مقداردهی
شده است
وجود داشته
باشد، اما
مسیرهای
دیگری نیز
باشند که
شیء در
آنها
مقداردهی
اولیه نشده
باشد،
کامپایلر
در صورتی که
نتواند
اثبات کند
مسیرهای
مقداردهینشده
در زمان
اجرا اجرا
نمیشوند،
هشداری
صادر
میکند.
علاوه بر این، ارسال یک اشارهگر (یا در C++، یک ارجاع) به شیء مقداردهینشده به یک آرگومان تابع واجد شرایط "const" نیز توسط این هشدار تشخیص داده میشود. (-Wuninitialized برای توابع توکاری که مشخص است شیء را میخوانند صادر میشود.) نشانهگذاری تابع با ویژگی (attribute) "access (none)" نشان میدهد که از آرگومان برای دسترسی به شیء استفاده نمیشود و از هشدار جلوگیری میکند.
این هشدارها تنها در کامپایل با بهینهسازی امکانپذیرند، زیرا در غیر این صورت GCC وضعیت متغیرها را ردیابی نمیکند. از طرف دیگر، مشخص شده است که -Wmaybe-uninitialized در بسیاری از موقعیتها به دلیل بهینهسازیهایی که از تعریفنشده بودن استفادههای مقداردهینشده بهره میبرند (مانند انتشار ثابت یا constant propagation)، هشداری صادر نمیکند (منفی کاذب).
این هشدارها اختیاری در نظر گرفته شدهاند زیرا ممکن است GCC نتواند تشخیص دهد چه زمانی کد با وجود داشتن ظاهر خطادار، در واقع صحیح است. در اینجا نمونهای از چگونگی رخ دادن این حالت آورده شده است:
{ int x; switch (y) { case 1: x = 1; break; case 2: x = 4; break; case 3: x = 5; } foo (x); }اگر مقدار "y" همیشه ۱، ۲ یا ۳ باشد، آنگاه "x" همیشه مقداردهی اولیه شده است، اما GCC این موضوع را نمیداند. برای فرونشاندن هشدار، باید یک حالت default با assert(0) یا کدی مشابه فراهم کنید.
این گزینه همچنین زمانی هشدار میدهد که یک متغیر خودکار non-volatile ممکن است با فراخوانی "longjmp" تغییر کند. کامپایلر تنها فراخوانیهای "setjmp" را میبیند. کامپایلر نمیتواند بداند "longjmp" در کجا فراخوانی خواهد شد؛ در واقع، یک گرداننده سیگنال (signal handler) میتواند آن را در هر نقطهای از کد فراخوانی کند. در نتیجه، ممکن است حتی زمانی که در واقع مشکلی وجود ندارد هشدار دریافت کنید، زیرا در عمل "longjmp" نمیتواند در مکانی فراخوانی شود که باعث ایجاد مشکل گردد.
میتوان از برخی هشدارهای کاذب جلوگیری کرد، اگر تمامی توابعی را که استفاده میکنید و هرگز بازنمیگردند به صورت "noreturn" اعلان نمایید.
این هشدار توسط -Wall یا -Wextra فعال میشود.
- -Wunknown-pragmas
- زمانی که با یک رهنمود "#pragma" مواجه شود که برای GCC قابل درک نیست، هشدار میدهد. اگر از این گزینه خط فرمان استفاده شود، هشدارها حتی برای pragmaهای ناشناخته در فایلهای سرآیند سیستمی نیز صادر میشوند. این امر در صورتی که هشدارها صرفاً با گزینه خط فرمان -Wall فعال شده باشند رخ نمیدهد.
- -Wno-pragmas
- درباره استفادههای نادرست از pragmaها، مانند پارامترهای نادرست، نحو (syntax) نامعتبر، یا تداخل بین pragmaها هشدار ندهد. همچنین به -Wunknown-pragmas مراجعه کنید.
- -Wno-pragma-once-outside-header
- زمانی که از "#pragma once" در فایلی استفاده میشود که یک فایل سرآیند نیست (مانند فایل اصلی)، هشدار ندهد.
- -Wno-prio-ctor-dtor
- اگر اولویتی از 0 تا 100 برای سازنده (constructor) یا نابودکننده (destructor) استفاده شود، هشدار ندهد. استفاده از مشخصههای constructor و destructor به شما امکان میدهد اولویتی را به سازنده/نابودکننده اختصاص دهید تا ترتیب اجرای آن پیش از فراخوانی "main" یا پس از بازگشت از آن کنترل شود. مقادیر اولویت باید بزرگتر از 100 باشند، زیرا کامپایلر مقادیر اولویت بین 0--100 را برای پیادهسازی رزرو میکند.
- -Wstrict-aliasing
- این گزینه
تنها زمانی
فعال است که
-fstrict-aliasing فعال
باشد.
درباره کدی
که ممکن است
قوانین strict aliasing
مورد
استفاده
کامپایلر
برای
بهینهسازی
را نقض کند
هشدار
میدهد. این
هشدار همه
موارد را
پوشش
نمیدهد،
اما تلاش
میکند
خطاهای
رایجتر را
شناسایی
کند. این
گزینه در -Wall
گنجانده
شده است.
معادل با
-Wstrict-aliasing=3 است..IP
-Wstrict-aliasing=n 4 این
گزینه تنها
زمانی فعال
است که -fstrict-aliasing
فعال باشد.
درباره
کدهایی
هشدار
میدهد که
ممکن است
قواعد strict aliasing
(نام مستعار
دقیق) را که
کامپایلر
برای
بهینهسازی
به کار
میگیرد
نقض کنند.
سطوح
بالاتر با
دقت بالاتر
(مثبتهای
کاذب کمتر)
متناظر
هستند. سطوح
بالاتر
همچنین به
تلاش و
تحلیل
بیشتری
نیاز
دارند،
شبیه به
نحوه
عملکرد -O.
گزینه -Wstrict-aliasing
معادل -Wstrict-aliasing=3
است.
سطح ۱: تهاجمیترین، سریع، کمترین دقت. احتمالاً زمانی مفید است که سطوح بالاتر هشدار نمیدهند اما -fstrict-aliasing همچنان کد را دچار مشکل میکند، زیرا این سطح منفیهای کاذب بسیار اندکی دارد. هرچند، مثبتهای کاذب فراوانی دارد. برای تمام تبدیلهای اشارهگر بین انواع احتمالاً ناسازگار، حتی اگر هرگز ارجاعزدایی نشوند، هشدار میدهد. تنها در فرانتاند (front end) اجرا میشود.
سطح ۲: تهاجمی، سریع، نهچندان دقیق. ممکن است همچنان مثبتهای کاذب زیادی داشته باشد (البته نه به اندازه سطح ۱)، و منفیهای کاذب اندک (اما احتمالاً بیشتر از سطح ۱). برخلاف سطح ۱، تنها زمانی هشدار میدهد که آدرس گرفته شده باشد. درباره انواع ناقص (incomplete types) هشدار میدهد. تنها در فرانتاند اجرا میشود.
سطح ۳ (پیشفرض برای -Wstrict-aliasing): باید مثبتهای کاذب بسیار کم و منفیهای کاذب اندکی داشته باشد. در صورت فعال بودن بهینهسازی، اندکی از سطوح ۱ یا ۲ کندتر است. الگوی رایج pun+dereference را در فرانتاند بررسی میکند: "*(int*)&some_float". اگر بهینهسازی فعال باشد، در بکاند (back end) نیز اجرا میشود، جایی که با استفاده از اطلاعات points-to وابسته به جریان داده (flow-sensitive)، با موارد چندعبارتی سر و کار دارد. تنها زمانی هشدار میدهد که اشارهگرِ تبدیلشده ارجاعزدایی شود. درباره انواع ناقص هشدار نمیدهد.
- -Wstrict-overflow
- -Wstrict-overflow=n
- این گزینه
تنها زمانی
فعال است که
سرریز
علامتدار
(signed overflow)
تعریفنشده
باشد.
درباره
مواردی
هشدار
میدهد که
کامپایلر
بر اساس این
فرض که
سرریز
علامتدار
رخ
نمیدهد،
بهینهسازی
میکند.
توجه داشته
باشید که
این گزینه
درباره همه
مواردی که
ممکن است کد
دچار سرریز
شود هشدار
نمیدهد؛
بلکه فقط
درباره
مواردی
هشدار
میدهد که
کامپایلر
نوعی
بهینهسازی
روی آنها
اعمال
میکند.
بنابراین
این هشدار
به سطح
بهینهسازی
وابسته است.
بهینهسازیای که فرض میکند سرریز علامتدار رخ نمیدهد، در صورتی کاملاً ایمن است که مقادیر متغیرهای درگیر بهگونهای باشند که سرریز در عمل هرگز رخ ندهد. بنابراین این هشدار بهسادگی میتواند یک مثبت کاذب ایجاد کند: هشداری درباره کدی که در واقعیت مشکلی ندارد. برای کمک به تمرکز روی مسائل مهم، چندین سطح هشدار تعریف شده است. هیچ هشداری برای استفاده از سرریز علامتدارِ تعریفنشده هنگام تخمین تعداد تکرارهای مورد نیاز یک حلقه صادر نمیشود، بهویژه در تعیین اینکه آیا یک حلقه اصلاً اجرا خواهد شد یا خیر.
- -Wstrict-overflow=1
- درباره مواردی هشدار میدهد که هم جای تردید دارند و هم اجتناب از آنها آسان است. برای مثال کامپایلر "x + 1 > x" را به 1 سادهسازی میکند. این سطح از -Wstrict-overflow توسط -Wall فعال میشود؛ سطوح بالاتر به این صورت فعال نمیشوند و باید صراحتاً درخواست شوند.
- -Wstrict-overflow=2
- همچنین درباره موارد دیگری هشدار میدهد که در آنها یک مقایسه به یک ثابت سادهسازی میشود. برای مثال: "abs (x) >= 0". این مورد تنها زمانی قابل سادهسازی است که سرریز عدد صحیح علامتدار تعریفنشده باشد، زیرا "abs (INT_MIN)" به "INT_MIN" سرریز میکند، که کمتر از صفر است. گزینه -Wstrict-overflow (بدون تعیین سطح) مشابه -Wstrict-overflow=2 است.
- -Wstrict-overflow=3
- همچنین درباره موارد دیگری هشدار میدهد که در آنها یک مقایسه سادهسازی میشود. برای مثال: "x + 1 > 1" به "x > 0" سادهسازی میشود.
- -Wstrict-overflow=4
- همچنین درباره سادهسازیهای دیگری هشدار میدهد که تحت پوشش موارد بالا قرار نمیگیرند. برای مثال: "(x * 10) / 5" به "x * 2" سادهسازی میشود.
- -Wstrict-overflow=5
- همچنین درباره مواردی هشدار میدهد که در آنها کامپایلر بزرگی قدرمطلق یک ثابت درگیر در مقایسه را کاهش میدهد. برای مثال: "x + 2 > y" به "x + 1 >= y" ساده میشود. این وضعیت تنها در بالاترین سطح هشدار گزارش میشود زیرا این سادهسازی برای مقایسههای متعددی اعمال میگردد، در نتیجه این سطح هشدار تعداد بسیار زیادی از مثبتهای کاذب تولید میکند.
- -Wstring-compare
- برای
فراخوانیهایی
از "strcmp" و
"strncmp"
هشدار
میدهد که
در
آزمونهای
چنین
برابریهایی،
نتیجه به
دلیل بیشتر
بودن طول یک
آرگومان از
اندازه
آرایهای
که آرگومان
دیگر در آن
ذخیره شده
(یا کران در
مورد
"strncmp")،
صفر یا غیر
صفر تعیین
میشود.
چنین
فراخوانیهایی
ممکن است
اشتباه
باشند. برای
مثال،
فراخوانی
"strcmp" در
ادامه
گزارش
میشود
زیرا نتیجه
آن صرفنظر
از محتوای
آرایه
"a"
لزوماً غیر
صفر است.
extern char a[4]; void f (char *d) { strcpy (d, "string"); ... if (0 == strcmp (a, d)) // cannot be true puts ("a and d are the same"); }گزینه -Wstring-compare توسط -Wextra فعال میشود.
- -Wno-stringop-overflow
- -Wstringop-overflow
- -Wstringop-overflow=type
- درباره
کدهایی که
میتوان
بهطور
ایستا
تعیین کرد
که باعث
سرریز بافر
یا تجاوز از
محدوده
حافظه
میشوند
هشدار
میدهد؛
مانند
فراخوانیهایی
به "memcpy" و
"strcpy" که
موجب سرریز
بافر مقصد
میشوند.
آرگومان
اختیاری،
یک واحد
بزرگتر از
نوع بررسی
اندازه شیء
(Object Size Checking) است که
باید برای
تعیین
اندازه
مقصد انجام
شود. این
آرگومان
تنها برای
توابع
رشتهای که
روی
آرایههای
نویسهای
عمل
میکنند
معنادار
است؛ توابع
حافظه خام
مانند
"memcpy"
همواره از Object
Size Checking نوع صفر
استفاده
میکنند.
این گزینه همچنین برای فراخوانیهایی هشدار میدهد که اندازهای بیش از بزرگترین شیء ممکن یا نهایتاً "SIZE_MAX / 2" بایت را مشخص میکنند.
این گزینه با فعال بودن بهینهسازی بهترین نتایج را ایجاد میکند، اما میتواند زیرمجموعه کوچکی از سرریزهای بافر ساده را حتی بدون بهینهسازی در فراخوانی توابع درونی (built-in) کامپایلر GCC مانند "__builtin_memcpy" که متناظر با توابع استاندارد هستند تشخیص دهد. در هر حال، این گزینه تنها درباره زیرمجموعهای از سرریزهای بافر هشدار میدهد که توسط توابع درونی متناظر بررسی سرریز، مانند "__builtin___memcpy_chk"، شناسایی میشوند؛ توابعی که میتوانند در صورتی که دسترسی در زمان کامپایل ایمن تشخیص داده نشود، بررسی زمان اجرا را انجام دهند.
برای مثال، این گزینه برای فراخوانی "strcpy" در زیر هشداری صادر میکند، زیرا حداقل ۵ نویسه (رشته "blue" شامل NUL پایانی) را درون بافری به اندازه ۴ کپی میکند.
enum Color { blue, purple, yellow }; const char* f (enum Color clr) { static char buf [4]; const char *str; switch (clr) { case blue: str = "blue"; break; case purple: str = "purple"; break; case yellow: str = "yellow"; break; } return strcpy (buf, str); // warning here }اثر این گزینه به توابع دستکاری رشته یا حافظه محدود نمیشود. در این مثال، هشداری صادر میشود زیرا یک آرایه ۱-عنصری به تابعی فرستاده شده است که حداقل به یک آرگومان آرایه ۴-عنصری نیاز دارد:
void f (int[static 4]); void g (void) { int *p = (int *) malloc (1 * sizeof(int)); f (p); // warning here }گزینه -Wstringop-overflow=2 بهطور پیشفرض فعال است.
- -Wstringop-overflow
- -Wstringop-overflow=1
- گزینهٔ -Wstringop-overflow=1 از «بررسی اندازهٔ شیء نوع صفر» برای تعیین اندازهٔ اشیاء مقصد استفاده میکند. در این تنظیم، این گزینه برای نوشتن فراتر از انتهای زیراشیاءِ اشیاء بزرگتری که با اشارهگرها به آنها دسترسی پیدا شده است هشداری نمیدهد، مگر اینکه اندازهٔ بزرگترین شیءِ دربرگیرنده مشخص باشد. هنگامی که مقصد ممکن است یکی از چندین شیء باشد، بزرگترینِ آنها فرض میشود. در سیستمهای لینوکس، زمانی که بهینهسازی در این تنظیم فعال باشد، این گزینه برای همان کدهایی هشدار میدهد که ماکروی "_FORTIFY_SOURCE" با مقداری غیر صفر تعریف شده باشد.
- -Wstringop-overflow=2
- گزینهٔ -Wstringop-overflow=2 از «بررسی اندازهٔ شیء نوع یک» برای تعیین اندازهٔ اشیاء مقصد استفاده میکند. در این تنظیم، این گزینه دربارهٔ سرریزها هنگام نوشتن در اعضای بزرگترین اشیاء کاملی که اندازهٔ دقیق آنها مشخص است هشدار میدهد. با این حال، برای نوشتنهای بیش از اندازه در اعضای مشابه از اشیاء نامشخصی که با اشارهگر به آنها ارجاع داده شده هشداری نمیدهد، زیرا ممکن است به آرایههایی با تعداد نامشخصی از عناصر اشاره کنند. این تنظیمِ پیشفرض گزینه است.
- -Wstringop-overflow=3
- گزینهٔ -Wstringop-overflow=3 از «بررسی اندازهٔ شیء نوع دو» برای تعیین اندازهٔ اشیاء مقصد استفاده میکند. در این تنظیم، این گزینه دربارهٔ سرریز شدن از کوچکترین شیء یا عضو داده هشدار میدهد. این سختگیرانهترین تنظیم این گزینه است که ممکن است به ایجاد هشدارهایی برای کدهای امن منجر شود.
- -Wstringop-overflow=4
- گزینهٔ -Wstringop-overflow=4 از «بررسی اندازهٔ شیء نوع سه» برای تعیین اندازهٔ اشیاء مقصد استفاده میکند. در این تنظیم، این گزینه دربارهٔ سرریز شدن از هر یک از اعضای داده هشدار میدهد، و زمانی که مقصد یکی از چندین شیء باشد، از اندازهٔ بزرگترینِ آنها برای تصمیمگیری دربارهٔ صدور هشدار استفاده میکند. مشابه با -Wstringop-overflow=3، این تنظیم ممکن است هشدارهایی برای کدهای بیپیرایه و بیخطر ایجاد کند.
- -Wno-stringop-overread
- دربارهٔ
فراخوانی
توابع
دستکاری
رشته مانند
"memchr" یا
"strcpy" که
مشخص شده
است فراتر
از انتهای
توالی مبدأ
میخوانند،
هشدار
میدهد.
گزینهٔ -Wstringop-overread بهطور پیشفرض فعال است.
- -Wno-stringop-truncation
- برای
فراخوانی
توابع
کراندارِ
دستکاری
رشته مانند
"strncat"،
"strncpy" و
"stpncpy" که
ممکن است
رشتهٔ
رونوشتشده
را کوتاه
کرده یا
مقصد را
دستنخورده
باقی
بگذارند،
هشدار نده.
در مثال زیر، فراخوانی "strncat" کرانی را مشخص میکند که از طول رشتهٔ مبدأ کمتر است. در نتیجه، رونوشت مبدأ کوتاه خواهد شد و بنابراین این فراخوانی تشخیص داده شده و هشدار دریافت میکند. برای جلوگیری از این هشدار، از "bufsize - strlen (buf) - 1)" به عنوان کران استفاده کنید.
void append (char *buf, size_t bufsize) { strncat (buf, ".txt", 3); }به عنوان مثالی دیگر، فراخوانی زیر به "strncpy" منجر به رونوشت تنها نویسههای قبل از "NUL" پایانی به "d" میشود، بدون آنکه "NUL" به انتهای آن اضافه شود. این فرض که نتیجهٔ "strncpy" لزوماً یک رشتهٔ پایانیافته با "NUL" است یک اشتباه متداول است، و بنابراین فراخوانی شناسایی میشود. برای اجتناب از این هشدار در صورتی که انتظار نمیرود نتیجه با "NUL" پایان یابد، به جای آن "memcpy" را فراخوانی کنید.
void copy (char *d, const char *s) { strncpy (d, s, strlen (s)); }در مثال زیر، فراخوانی "strncpy" اندازهٔ بافر مقصد را به عنوان کران تعیین میکند. اگر طول رشتهٔ مبدأ بزرگتر یا مساوی این اندازه باشد، نتیجهٔ رونوشت با "NUL" خاتمه نخواهد یافت. بنابراین، فراخوانی شناسایی و گزارش میشود. برای جلوگیری از این هشدار، "sizeof buf - 1" را به عنوان کران تعیین کرده و آخرین عنصر بافر را روی "NUL" تنظیم کنید.
void copy (const char *s) { char buf[80]; strncpy (buf, s, sizeof buf); ... }در شرایطی که هدف یک آرایهٔ نویسهای، ذخیرهسازی توالیای از بایتها بدون "NUL" پایانی است، میتوان چنین آرایهای را با صفت "nonstring" نشانهگذاری کرد تا از این هشدار جلوگیری شود. با این حال، چنین آرایههایی آرگومانهای مناسبی برای توابعی که انتظار رشتههای پایانیافته با "NUL" را دارند نیستند. برای کمک به تشخیص استفادههای نادرست تصادفی از چنین آرایههایی، GCC هشدارهایی صادر میکند مگر اینکه بتواند امن بودن استفاده را اثبات نماید.
- -Wstrict-flex-arrays (فقط C و C++)
- دربارهٔ
استفادههای
نادرست از
اعضای
آرایهٔ
انعطافپذیر
با توجه به
level صفت
"strict_flex_array
(level)"
پیوستشده
به فیلد
آرایهٔ
انتهاییِ
یک ساختار
در صورت
موجود
بودن، و در
غیر این
صورت بر
اساس level
گزینهٔ
-fstrict-flex-arrays=level
هشدار
میدهد.
گزینهٔ
"-Wstrict-flex-arrays"
تنها زمانی
مؤثر است که
level بزرگتر
از 0 باشد.
هنگامی که level=1 باشد، اگر به آرایهٔ انتهاییِ ساختاری با ۲ عنصر یا بیشتر به عنوان عضو آرایهٔ انعطافپذیر ارجاع داده شود، هشدار صادر میشود.
هنگامی که level=2 باشد، علاوه بر level=1، اگر به آرایهٔ انتهاییِ تکعنصریِ یک ساختار به عنوان عضو آرایهٔ انعطافپذیر ارجاع داده شود، هشدارهای بیشتری صادر میشود.
هنگامی که level=3 باشد، علاوه بر level=2، اگر به آرایهٔ انتهاییِ با طول صفر در یک ساختار به عنوان عضو آرایهٔ انعطافپذیر ارجاع داده شود، هشدارهای بیشتری صادر میشود.
این گزینه زمانی که -ftree-vrp فعال باشد کارایی بیشتری دارد (حالت پیشفرض برای -O2 و بالاتر)، اما برخی هشدارها ممکن است حتی بدون بهینهسازی نیز تشخیص داده شوند.
- -Wsuggest-attribute=attribute-name
- در مواردی که افزودن یک صفت ممکن است سودمند باشد هشدار میدهد. مقادیر attribute-name که در حال حاضر پشتیبانی میشوند در زیر فهرست شدهاند.
- -Wsuggest-attribute=pure
- -Wsuggest-attribute=const
- -Wsuggest-attribute=noreturn
- -Wmissing-noreturn
- -Wsuggest-attribute=malloc
- -Wsuggest-attribute=returns_nonnull
- دربارهٔ توابعی که ممکن است نامزد صفتهای "pure"، "const"، "noreturn"، "malloc" یا "returns_nonnull" باشند هشدار میدهد. کامپایلر تنها برای توابعی که در سایر واحدهای ترجمه قابل مشاهده هستند، یا (در مورد "pure" و "const") اگر نتواند اثبات کند که تابع بهطور عادی بازمیگردد، هشدار صادر میکند. یک تابع زمانی بهطور عادی بازمیگردد که فاقد حلقهٔ بینهایت باشد یا با پرتاب استثنا، فراخوانی "abort" یا به دام افتادن بهطور غیرعادی خارج نشود. این تحلیل نیازمند گزینهٔ -fipa-pure-const است که بهطور پیشفرض در -O و بالاتر فعال است. سطوح بالاتر بهینهسازی دقت تحلیل را بهبود میبخشند.
- -Wsuggest-attribute=format
- -Wmissing-format-attribute
- دربارهٔ
اشارهگرهای
تابعی که
ممکن است
نامزد
صفتهای
"format"
باشند
هشدار
میدهد.
توجه داشته
باشید که
اینها
تنها
نامزدهای
احتمالی
هستند، نه
قطعی. GCC حدس
میزند
اشارهگرهای
تابعی با
صفتهای
"format" که
در انتساب،
مقداردهی
اولیه،
ارسال
پارامتر یا
عبارتهای
بازگشت
استفاده
میشوند،
باید صفت
متناظر
"format" را
در نوع حاصل
داشته
باشند؛
یعنی برای
جلوگیری از
این هشدار،
سمت چپِ
انتساب یا
مقداردهی
اولیه، نوع
متغیر
پارامتر،
یا نوع
بازگشتی
تابع
دربرگیرنده
به ترتیب
باید دارای
صفت "format"
باشند.
GCC همچنین دربارهٔ تعاریف توابعی که ممکن است نامزد صفتهای "format" باشند هشدار میدهد. مجدداً، اینها تنها نامزدهای احتمالی هستند. GCC حدس میزند که صفتهای "format" ممکن است برای هر تابعی که تابعی مانند "vprintf" یا "vscanf" را فراخوانی میکند مناسب باشد، اما این موضوع همیشه صادق نیست، و ممکن است برخی از توابعی که صفتهای "format" برای آنها مناسب است شناسایی نشوند.
- -Wsuggest-attribute=cold
- دربارهٔ توابعی که ممکن است نامزد صفت "cold" باشند هشدار میدهد. این هشدار بر اساس تحلیل ایستا است و عموماً تنها برای توابعی صادر میشود که همواره به فراخوانی تابع "cold" دیگری میانجامند، مانند پوششدهندههای دستور "throw" در ++C یا توابع گزارش خطای مهلک که منجر به فراخوانی "abort" میشوند.
- -Walloc-zero
- درباره فراخوانیهای توابع تخصیص حافظه مزین به صفت "alloc_size" که مقدار صفر بایت را مشخص میکنند هشدار میدهد، از جمله فراخوانیهای فرمهای توکار توابع "aligned_alloc"، "alloca"، "calloc"، "malloc" و "realloc". از آنجا که رفتار این توابع هنگام فراخوانی با اندازه صفر در پیادهسازیهای مختلف متفاوت است (و در مورد "realloc" منسوخ شده است)، اتکا به آن ممکن است منجر به باگهای پنهان در قابلیت حمل شده و باید از آن اجتناب گردد.
- -Wcalloc-transposed-args
- درباره فراخوانیهای توابع تخصیص حافظه دارای صفت "alloc_size" با دو آرگومان هشدار میدهد، که در آنها از عملگر "sizeof" به عنوان آرگومان اندازه اول استفاده شده و در آرگومان اندازه دوم استفاده نشده است. این یک هشدار سبک کدنویسی است. آرگومان اول "calloc" طبق مستندات تعداد عناصر در آرایه است، در حالی که آرگومان دوم اندازه هر عنصر است، بنابراین "calloc (n, sizeof (int))" بر "calloc (sizeof (int), n)" ترجیح داده میشود. اگر استفاده از "sizeof" در آرگومان اول و نه در دومی عمدی باشد، هشدار را میتوان با استفاده از "calloc (sizeof (struct S) + 0, n)" یا "calloc (1 * sizeof (struct S), 4)" یا استفاده از "sizeof" در آرگومان دوم فرونشاند.
- -Walloc-size-larger-than=byte-size
- درباره فراخوانیهای توابع دارای صفت "alloc_size" که تلاش میکنند اشیائی بزرگتر از تعداد بایت مشخصشده تخصیص دهند، یا جایی که نتیجه محاسبه اندازه در یک نوع عدد صحیح با دقت نامتناهی از مقدار PTRDIFF_MAX در مقصد فراتر میرود، هشدار میدهد. -Walloc-size-larger-than=PTRDIFF_MAX بهطور پیشفرض فعال است. هشدارهای کنترلشده توسط این گزینه را میتوان با مشخص کردن byte-size به میزان SIZE_MAX یا بیشتر، یا با استفاده از -Wno-alloc-size-larger-than غیرفعال کرد.
- -Wno-alloc-size-larger-than
- هشدارهای -Walloc-size-larger-than= را غیرفعال میکند. این گزینه معادل -Walloc-size-larger-than=SIZE_MAX یا بزرگتر است.
- -Walloca
- این گزینه در مورد تمامی استفادهها از "alloca" در کد منبع هشدار میدهد.
- -Wauto-profile
- هشدارهایی را درباره ناهمخوانیهای auto-profile نمایش میدهد.
- -Wcannot-profile
- هنگامی که ابزارگذاری پروفایلسازی درخواست شده باشد، اما نتوان آن را روی یک تابع خاص اعمال کرد، هشدار میدهد.
- -Walloca-larger-than=byte-size
- این گزینه
در مورد
فراخوانیهای
"alloca" با
یک آرگومان
عدد صحیح که
مقدار آن
صفر است یا
توسط یک
گزاره
کنترلی که
مقدار آن را
حداکثر به
byte-size محدود
کند مقید
نشده است،
هشدار
میدهد.
همچنین
برای
فراخوانیهایی
به "alloca"
که مقدار
کران در
آنها
نامشخص است
هشدار صادر
میکند.
آرگومانهایی
از انواع
غیر عدد
صحیح حتی
اگر به نظر
برسد به
محدوده
مورد
انتظار
مقید
شدهاند،
نامقید در
نظر گرفته
میشوند.
برای نمونه، یک حالت مقید از "alloca" میتواند چنین باشد:
void func (size_t n) { void *p; if (n <= 1000) p = alloca (n); else p = malloc (n); f (p); }در مثال بالا، ارسال "-Walloca-larger-than=1000" هشداری صادر نخواهد کرد، زیرا مشخص است که فراخوانی "alloca" حداکثر ۱۰۰۰ بایت است. با این حال، اگر "-Walloca-larger-than=500" داده میشد، کامپایلر هشداری صادر میکرد.
از سوی دیگر، کاربردهای نامقید استفادههایی از "alloca" بدون هیچ گزاره کنترلی محدودکننده آرگومان عدد صحیح آن هستند. برای نمونه:
void func () { void *p = alloca (n); f (p); }اگر "-Walloca-larger-than=500" داده میشد، کد بالا باعث ایجاد یک هشدار میشد، اما این بار به دلیل فقدان بررسی کرانها.
توجه داشته باشید که حتی کدی به ظاهر درست شامل اعداد صحیح علامتدار نیز میتواند موجب بروز هشدار شود:
void func (signed int n) { if (n < 500) { p = alloca (n); f (p); } }در مثال بالا، n میتواند منفی باشد، که باعث میشود آرگومانی بزرگتر از حد انتظار بهطور ضمنی به فراخوانی "alloca" تبدیل نوع شود.
این گزینه همچنین زمانی که "alloca" در یک حلقه استفاده شود هشدار میدهد.
-Walloca-larger-than=PTRDIFF_MAX بهطور پیشفرض فعال است اما معمولاً تنها زمانی مؤثر است که -ftree-vrp فعال باشد (پیشفرض برای -O2 و بالاتر).
همچنین ببینید: -Wvla-larger-than=byte-size.
- -Wno-alloca-larger-than
- هشدارهای -Walloca-larger-than= را غیرفعال میکند. این گزینه معادل -Walloca-larger-than=SIZE_MAX یا بزرگتر است.
- -Warith-conversion
- درباره
تبدیلهای
ضمنی ناشی
از عملیات
حسابی
هشدار
میدهد،
حتی زمانی
که تبدیل
عملوندها
به همان نوع
نتواند
مقادیر
آنها را
تغییر دهد.
این گزینه
بر
هشدارهای
ناشی از
-Wconversion، -Wfloat-conversion و
-Wsign-conversion اثر
میگذارد.
void f (char c, int i) { c = c + i; // warns with B<-Wconversion> c = c + 1; // only warns with B<-Warith-conversion> } - -Warray-bounds
- -Warray-bounds=n
- درباره
اندیسها
یا
آفستهای
خارج از
محدوده در
آرایهها
هشدار
میدهد. این
هشدار توسط
-Wall فعال
میشود. این
گزینه
زمانی که
-ftree-vrp فعال
باشد
مؤثرتر است
(پیشفرض
برای -O2 و
بالاتر)،
اما
زیرمجموعهای
از موارد
حتی بدون
بهینهسازی
نیز صادر
میشوند.
بهطور پیشفرض، آرایه پایانی یک ساختار در صورتی توسط -Warray-bounds یا -Warray-bounds=n بهعنوان عضو آرایه انعطافپذیر تلقی میشود که طبق استاندارد C99 به بعد بهصورت عضو آرایه انعطافپذیر ([])، افزونه آرایه با طول صفر در GCC ([0])، یا یک آرایه تکعنصری ([1]) اعلان شده باشد. در نتیجه، درباره اندیسها یا آفستهای خارج از محدوده در آرایههای با طول صفر یا تکعنصری بهطور پیشفرض هشداری داده نمیشود.
میتوانید گزینه -fstrict-flex-arrays یا -fstrict-flex-arrays=level را اضافه کنید تا نحوه برخورد این گزینه با آرایه پایانی ساختار بهعنوان عضو آرایه انعطافپذیر را کنترل کنید:
هنگامی که level<=1 باشد، تغییری در رفتار پیشفرض ایجاد نمیشود.
هنگامی که level=2 باشد، هشدارهای بیشتری برای اندیسها یا آفستهای خارج از محدوده در آرایههای تکعنصری صادر خواهد شد؛
هنگامی که level=3 باشد، علاوه بر level=2، هشدارهای بیشتری برای اندیسها یا آفستهای خارج از محدوده در آرایههای با طول صفر صادر خواهد شد.
- -Warray-bounds=1
- این سطح پیشفرض هشدار برای -Warray-bounds است و توسط -Wall فعال میشود؛ سطوح بالاتر فعال نمیشوند و باید بهطور صریح درخواست شوند.
- -Warray-bounds=2
- این سطح هشدار همچنین درباره نتایج میانی محاسبات اشارهگر که ممکن است مقادیر خارج از محدوده تولید کنند هشدار میدهد. این سطح هشدار ممکن است تعداد بیشتری موارد مثبت کاذب تولید کند و بهطور پیشفرض غیرفعال است.
char arr[3] = "foo"; /* Warning. */ char arr2[3] __attribute__((nonstring)) = "bar"; /* No warning. */
این هشدار با -Wextra فعال میشود. اگر -Wc++-compat فعال باشد، عبارتبندی هشدار کمی متفاوت خواهد بود و حتی در صورتی که اعلان در حال مقداردهی دارای صفت "nonstring" باشد نیز هشدار میدهد، چرا که در C++ چنین مقداردهیهایی یک خطا هستند.
- -Warray-compare
- دربارهٔ
مقایسههای
برابری و
رابطهای
بین دو
عملوند از
نوع آرایه
هشدار
میدهد. این
مقایسه در C++20
منسوخ شده
است. برای
نمونه:
int arr1[5]; int arr2[5]; bool same = arr1 == arr2;
گزینهٔ -Warray-compare با -Wall فعال میشود.
- -Warray-parameter
- -Warray-parameter=n
- دربارهٔ
اعلانهای
مجدد توابع
شامل
پارامترهایی
از نوع
آرایه یا
اشارهگر
با شکلها
یا
گونههای
ناهمخوان
هشدار
میدهد، و
امکان
تشخیص
دسترسیهای
خارج از
محدوده به
چنین
پارامترهایی
را توسط
هشدارهایی
مانند -Warray-bounds
فعال
میکند.
اگر نخستین اعلان تابع از شکل آرایهای برای اعلان پارامتر استفاده کند، حد مشخصشده در آرایه به عنوان حداقل تعداد عناصر مورد انتظار در فراخوانیهای تابع و حداکثر تعداد عناصر قابل دسترس توسط آن فرض میشود. عدم ارائهٔ آرگومانهایی با اندازهٔ کافی یا دسترسی به بیش از حداکثر تعداد عناصر ممکن است توسط هشدارهایی مانند -Warray-bounds یا -Wstringop-overflow تشخیص داده شود. در سطح ۱، این هشدار ناهمخوانیهای مربوط به پارامترهای آرایهای اعلانشده با شکل "T[static N]" را تشخیص میدهد.
برای نمونه، این هشدار برای دومین اعلان "f" فعال میشود زیرا اولین اعلان با کلمهٔ کلیدی "static" مشخص میکند که آرگومان آرایه باید حداقل چهار عنصر داشته باشد، در حالی که اعلان دوم اجازه میدهد آرایهای با هر اندازهای به "f" ارسال شود.
void f (int[static 4]); void f (int[]); // warning (inconsistent array form) void g (void) { int *p = (int *)malloc (1 * sizeof (int)); f (p); // warning (array too small) ... }در سطح ۲، این هشدار همچنین برای اعلانهای مجدد شامل هرگونه ناهمخوانی دیگر در شکلهای آرگومان آرایه یا اشارهگر که بیانگر اندازهٔ آرایه هستند، فعال میشود. اشارهگرها و آرایههای با کران نامشخص، یکسان در نظر گرفته میشوند و هشداری ایجاد نمیکنند.
void g (int*); void g (int[]); // no warning void g (int[8]); // warning (inconsistent array bound)
گزینهٔ -Warray-parameter=2 در -Wall گنجانده شده است. گزینهٔ -Wvla-parameter هشدارهایی را برای ناهمخوانیهای مشابه شامل آرگومانهای آرایه با طول متغیر (Variable Length Array) فعال میکند.
شکل کوتاه گزینهٔ -Warray-parameter معادل -Warray-parameter=2 است. شکل منفی -Wno-array-parameter معادل -Warray-parameter=0 است.
- -Wattribute-alias=n
- -Wno-attribute-alias
- دربارهٔ اعلانهایی که از صفتهای "alias" و موارد مشابه استفاده میکنند و هدف آنها با نوع نام مستعار ناسازگار است، هشدار میدهد.
- -Wattribute-alias=1
- سطح هشدار پیشفرض گزینهٔ -Wattribute-alias، ناسازگاریهای بین نوع اعلان نام مستعار و نوع هدف آن را تشخیص میدهد. چنین ناسازگاریهایی معمولاً نشاندهندهٔ اشکالات برنامهنویسی هستند.
- -Wattribute-alias=2
- در این سطح،
-Wattribute-alias مواردی
را نیز
تشخیص
میدهد که
در آنها
صفتهای
اعلان نام
مستعار
محدودکنندهتر
از صفتهای
اعمالشده
بر هدف آن
باشند. این
عدم
تطابقها
بالقوه
میتوانند
به تولید کد
نادرست
بینجامند.
در موارد
دیگر ممکن
است بیخطر
باشند و
صرفاً با
افزودن صفت
جاافتاده
به هدف
برطرف شوند.
برای
مقایسه،
گزینهٔ
-Wmissing-attributes را
ببینید که
موارد
تشخیصی را
هنگامی که
اعلان نام
مستعار
محدودیت
کمتری نسبت
به هدف
دارد،
کنترل
میکند.
صفتهای بررسیشده شامل "alloc_align"، "alloc_size"، "cold"، "const"، "hot"، "leaf"، "malloc"، "nonnull"، "noreturn"، "nothrow"، "pure"، "returns_nonnull" و "returns_twice" هستند.
گزینهٔ -Wattribute-alias معادل -Wattribute-alias=1 است. این مقدار پیشفرض است. میتوانید این هشدارها را با -Wno-attribute-alias یا -Wattribute-alias=0 غیرفعال کنید.
- -Wbidi-chars=[none|unpaired|any|ucn]
- دربارهٔ
نویسههای
کنترلی
دوجهتهٔ
احتمالاً
گمراهکننده
در UTF-8 در
کامنتها،
رشتههای
لفظی،
ثوابت
نویسهای و
شناسهها
هشدار
میدهد.
چنین
نویسههایی
میتوانند
جهت نوشتن
از چپ به
راست را به
راست به چپ
(و برعکس)
تغییر
دهند، که
میتواند
باعث
سردرگمی
میان ترتیب
منطقی و
ترتیب
دیداری شود.
این مسئله
میتواند
خطرناک
باشد؛ برای
نمونه،
ممکن است به
نظر برسد
بخشی از کد
کامنت نشده
است، در
حالی که در
واقع کامنت
است.
سه سطح هشدار توسط GCC پشتیبانی میشود. پیشفرض -Wbidi-chars=unpaired است که دربارهٔ بافتهای دوجهته که به درستی پایان نیافتهاند هشدار میدهد. گزینهٔ -Wbidi-chars=none هشدار را غیرفعال میکند. گزینهٔ -Wbidi-chars=any دربارهٔ هرگونه استفاده از نویسههای کنترلی دوجهته هشدار میدهد.
بهطور پیشفرض، این هشدار دربارهٔ UCNها اخطار نمیدهد. با این حال، میتوان چنین بررسی را با استفاده از -Wbidi-chars=unpaired,ucn یا -Wbidi-chars=any,ucn فعال کرد. استفاده از -Wbidi-chars=ucn معتبر است، و در صورتی که پیشتر -Wbidi-chars=any مشخص نشده باشد، معادل -Wbidi-chars=unpaired,ucn خواهد بود.
- -Wbool-compare
- دربارهٔ
مقایسهٔ
عبارت بولی
با یک مقدار
عددی صحیح
متفاوت با
"true"/"false"
هشدار
میدهد.
برای
نمونه،
مقایسهٔ
زیر همیشه
نادرست (false)
است:
int n = 5; ... if ((n > 1) == 2) { ... }این هشدار توسط -Wall فعال میشود.
- -Wbool-operation
- دربارهٔ
عملیاتهای
مشکوک روی
عبارتهایی
از نوع بولی
هشدار
میدهد.
برای
نمونه،
نقیض بیتی (bitwise
negation) یک مقدار
بولی بسیار
محتمل است
که یک اشکال
در برنامه
باشد. برای
زبان C، این
هشدار
همچنین در
مورد
افزایش یا
کاهش یک
مقدار بولی
اخطار
میدهد که
بهندرت
معقول است.
(در C++، کاهش
دادن یک
متغیر بولی
همیشه
نامعتبر
است. افزایش
دادن یک
مقدار بولی
در C++17
نامعتبر و
در سایر
نسخهها
منسوخ است.)
این هشدار توسط -Wall فعال میشود.
- -Wduplicated-branches
- هنگامی که
یک ساختار if-else
دارای
شاخههای
یکسان باشد
هشدار
میدهد. این
هشدار
مواردی
مانند زیر
را تشخیص
میدهد:
if (p != NULL) return 0; else return 0;
اگر هر دو شاخه تنها شامل یک دستور تهی باشند هشدار نمیدهد. این هشدار همچنین برای عملگرهای شرطی عمل میکند:
int i = x ? *p : *p;
- -Wduplicated-cond
- دربارهٔ
شرطهای
تکراری در
یک زنجیرهٔ
if-else-if هشدار
میدهد.
برای
نمونه،
برای کد زیر
هشدار
میدهد: if (p->q != NULL) {
... } else if (p->q != NULL) { ... }
- -Wframe-address
- هنگامی که __builtin_frame_address یا __builtin_return_address با یک آرگومان بزرگتر از 0 فراخوانی شوند، هشدار میدهد. چنین فراخوانیهایی ممکن است مقادیر نامعینی برگردانند یا باعث خرابی (crash) برنامه شوند. این هشدار در -Wall گنجانده شده است.
- -Wno-discarded-qualifiers (فقط C و Objective-C)
- اگر توصیفکنندههای نوع (type qualifiers) روی اشارهگرها نادیده گرفته شوند، هشدار نمیدهد. بهطور معمول، کامپایلر زمانی که یک متغیر "const char *" به تابعی ارسال شود که پارامتر "char *" میپذیرد، هشدار میدهد. از این گزینه میتوان برای جلوگیری از نمایش چنین هشداری استفاده کرد.
- -Wno-discarded-array-qualifiers (فقط C و Objective-C)
- اگر توصیفکنندههای نوع روی آرایههایی که هدف اشارهگر هستند نادیده گرفته شوند، هشدار نمیدهد. بهطور معمول، کامپایلر زمانی که یک متغیر "const int (*)[]" به تابعی ارسال شود که پارامتر "int (*)[]" میپذیرد، هشدار میدهد. از این گزینه میتوان برای جلوگیری از چنین هشداری استفاده کرد.
- -Wno-incompatible-pointer-types (فقط C و Objective-C)
- هنگامی که
تبدیلی
میان
اشارهگرهایی
با انواع
ناسازگار
رخ میدهد،
هشدار
نمیدهد.
این هشدار
برای
مواردی است
که تحت پوشش
-Wno-pointer-sign قرار
نمیگیرند؛
گزینهای
که برای
ارسال
آرگومانهای
اشارهگر
یا انتساب
با
علامتداری
(signedness) متفاوت
هشدار
میدهد.
بهطور پیشفرض، در C99 و گویشهای بعدی C، کامپایلر GCC با این مسئله مانند یک خطا برخورد میکند. این خطا میتواند با استفاده از -fpermissive (همراه با برخی خطاهای دیگر)، یا فقط برای این خطا بهتنهایی با -Wno-error=incompatible-pointer-types به یک هشدار تنزل داده شود.
این هشدار توسط -pedantic-errors به یک خطا ارتقا مییابد.
- -Wno-int-conversion (فقط C و Objective-C)
- درباره
تبدیلات
ناسازگار
عدد صحیح به
اشارهگر و
اشارهگر
به عدد صحیح
هشدار
نمیدهد.
این هشدار
مربوط به
تبدیلات
ضمنی (implicit)
است؛ برای
تبدیلات
صریح (explicit)
میتوان از
هشدارهای
-Wno-int-to-pointer-cast و -Wno-pointer-to-int-cast
استفاده
کرد.
بهطور پیشفرض، در C99 و گویشهای بعدی C، کامپایلر GCC با این مسئله مانند یک خطا برخورد میکند. این خطا میتواند با استفاده از -fpermissive (همراه با برخی خطاهای دیگر)، یا فقط برای این خطا بهتنهایی با -Wno-error=int-conversion به یک هشدار تنزل داده شود.
این هشدار توسط -pedantic-errors به یک خطا ارتقا مییابد.
- -Wzero-as-null-pointer-constant
- هنگامی که از یک لیترال 0 بهعنوان ثابت اشارهگر تهی (null pointer constant) استفاده شود، هشدار میدهد.
- -Wzero-length-bounds
- درباره
دسترسی به
عناصر
اعضای
آرایهای
با طول صفر
که ممکن است
با سایر
اعضای همان
شیء
همپوشانی
داشته
باشند
هشدار
میدهد.
اعلان
آرایههای
با طول صفرِ
درونی
توصیه
نمیشود،
زیرا
دسترسی به
آنها
تعریفنشده
(undefined) است.
برای مثال، دو ذخیرهسازی نخست در تابع "bad" تشخیص داده میشوند زیرا عناصر آرایه با اعضای بعدی "b" و "c" همپوشانی دارند. ذخیرهسازی سوم توسط -Warray-bounds تشخیص داده میشود زیرا خارج از محدوده شیء دربرگیرنده است.
struct X { int a[0]; int b, c; }; struct X x; void bad (void) { x.a[0] = 0; // -Wzero-length-bounds x.a[1] = 1; // -Wzero-length-bounds x.a[2] = 2; // -Warray-bounds }گزینه -Wzero-length-bounds توسط -Warray-bounds فعال میشود.
- -Wno-div-by-zero
- درباره تقسیم بر صفر عدد صحیح در زمان کامپایل هشدار نمیدهد. درباره تقسیم بر صفر ممیز شناور هشداری داده نمیشود، زیرا میتواند روشی معتبر برای بهدست آوردن مقادیر بینهایت (infinities) و NaN باشد.
- -Wsystem-headers
- پیامهای هشدار را برای ساختارهایی که در فایلهای سرآیند سیستم (system headers) یافت میشوند، چاپ میکند. هشدارهای مربوط به سرآیندهای سیستم معمولاً با این فرض نادیده گرفته میشوند که نشاندهنده مشکلات واقعی نیستند و تنها خواندن خروجی کامپایلر را دشوارتر میکنند. استفاده از این گزینه خط فرمان به GCC میگوید هشدارهای سرآیندهای سیستم را به گونهای صادر کند که گویی در کد کاربر رخ دادهاند. با این حال، توجه داشته باشید که استفاده از -Wall همراه با این گزینه، درباره پراگماهای ناشناخته در سرآیندهای سیستم هشدار نمیدهد---برای این منظور، باید از -Wunknown-pragmas نیز استفاده شود.
- -Wtautological-compare
- اگر یک
مقایسه با
خود (self-comparison)
همواره به true
یا false
ارزیابی
شود، هشدار
میدهد. این
هشدار
خطاهای
گوناگونی
را تشخیص
میدهد،
مانند:
int i = 1; ... if (i > i) { ... }این هشدار همچنین درباره مقایسههای بیتی که همیشه به true یا false ارزیابی میشوند هشدار میدهد؛ برای نمونه:
if ((a & 16) == 10) { ... }همواره false خواهد بود.
این هشدار توسط -Wall فعال میشود.
- -Wtrailing-whitespace
- -Wtrailing-whitespace=kind
- درباره فاصلههای خالی انتهایی (trailing whitespace) در پایان خطوط، از جمله درون کامنتها، اما به استثنای فاصلههای خالی انتهایی در لیترالهای رشتهای خام، هشدار میدهد. "-Wtrailing-whitespace" معادل "-Wtrailing-whitespace=blanks" است و تنها درباره نویسههای فاصله و تب افقی در انتهای خط هشدار میدهد. "-Wtrailing-whitespace=any" درباره این موارد یا نویسههای form feed و تب عمودی انتهایی هشدار میدهد. "-Wno-trailing-whitespace" یا "-Wtrailing-whitespace=none" این هشدار را غیرفعال میکند که وضعیت پیشفرض است. این یک هشدار مربوط به سبک کدنویسی است.
- -Wleading-whitespace=kind
- درباره مسائل مربوط به سبک در فاصلههای خالی ابتدای سطر (leading whitespace)، اما نه مقدار تورفتگی، هشدار میدهد. برخی پروژهها از سبکهای کدنویسی استفاده میکنند که در آنها فقط از فاصلهها برای تورفتگی استفاده میشود، برخی دیگر فقط از تبها، و برخی دیگر از صفر یا چند تب (برای مضارب "-ftabstop=n") و به دنبال آن صفر یا کمتر از n فاصله استفاده میکنند. روی خطوطی که منحصراً شامل فضای خالی هستند هشداری صادر نمیشود (اگرچه ممکن است هشدار "-Wtrailing-whitespace=" صادر شود)، و درون لیترالهای رشتهای خام نیز هشداری صادر نمیشود. همچنین برای فاصلههای خالی ابتدایی درون کامنتهای چندخطی هشدار صادر میشود. "-Wleading-whitespace=spaces" برای پروژههایی که میخواهند تورفتگی را فقط با فاصلهها اعمال کنند، درباره فاصلههای خالی ابتدایی غیر از فاصله هشدار میدهد. "-Wleading-whitespace=tabs" برای پروژههایی که میخواهند تورفتگی را فقط با تبهای افقی اعمال کنند، درباره فاصلههای خالی ابتدایی غیر از تبهای افقی هشدار میدهد. "-Wleading-whitespace=blanks" درباره فاصلههای خالی ابتدایی غیر از فاصله و تب افقی، یا درباره تب افقی پس از یک فاصله در ابتدای سطر، یا درباره n یا بیشتر فاصله متوالی در فاصلههای ابتدایی هشدار میدهد (که در آن n آرگومان "-ftabstop=n" است و بهطور پیشفرض 8 میباشد). "-Wleading-whitespace=none" این هشدار را غیرفعال میکند که حالت پیشفرض است. این یک هشدار مربوط به سبک کدنویسی است.
- -Wtrampolines
- درباره ترامپولینهای (trampolines) تولیدشده برای اشارهگرهای به توابع تودرتو هشدار میدهد. ترامپولین قطعه کوچکی از داده یا کد است که در زمان اجرا، هنگامی که نشانی یک تابع تودرتو گرفته میشود روی پشته (stack) ایجاد میگردد و برای فراخوانی غیرمستقیم تابع تودرتو استفاده میشود. برای برخی هدفها، ترامپولین تنها از داده تشکیل شده است و بنابراین به رفتار خاصی نیاز ندارد. اما برای بیشتر هدفها، از کد تشکیل شده است و بنابراین مستلزم آن است که پشته قابلاجرا شود تا برنامه به درستی کار کند.
- -Wfloat-equal
- اگر از
مقادیر
ممیز شناور
در
مقایسههای
برابری
استفاده
شود، هشدار
میدهد.
ایده پشت این هشدار این است که گاهی (برای برنامهنویس) مناسبتر است که مقادیر ممیز شناور را تقریبهایی از اعداد حقیقی با دقت نامحدود در نظر بگیرد. اگر چنین میکنید، باید (با تحلیل کد یا روشی دیگر) حداکثر یا حداکثر خطای احتمالی ناشی از محاسبات را حساب کرده و هنگام مقایسهها آن را در نظر بگیرید (و همچنین هنگام تولید خروجی، اما آن مسئله دیگری است). بهویژه، بهجای بررسی برابری دقیق، باید بررسی کنید که آیا این دو مقدار دارای بازههای همپوشان هستند یا خیر؛ و این کار با عملگرهای رابطهای انجام میشود، بنابراین مقایسههای برابری احتمالاً اشتباه هستند.
- -Wtraditional (فقط C و Objective-C)
- درباره ساختارهای خاصی که در C سنتی و ISO C رفتار متفاوتی دارند هشدار میدهد. همچنین درباره ساختارهای ISO C که معادلی در C سنتی ندارند، و/یا ساختارهای مسئلهداری که باید از آنها اجتناب شود، هشدار میدهد.
- پارامترهای ماکرو که درون لیترالهای رشتهای در بدنه ماکرو ظاهر میشوند. در C سنتی، جایگزینی ماکرو درون لیترالهای رشتهای انجام میشود، اما در ISO C چنین نیست..IP * 4 در C سنتی، برخی دستورالعملهای پیشپردازنده وجود نداشتند. پیشپردازندههای سنتی تنها در صورتی یک خط را به عنوان دستورالعمل در نظر میگرفتند که # در ستون ۱ خط ظاهر میشد. بنابراین -Wtraditional دربارهٔ دستورالعملهایی هشدار میدهد که C سنتی درک میکند اما چون # به عنوان نخستین نویسهٔ خط ظاهر نشده است نادیده میگیرد. همچنین پیشنهاد میکند دستورالعملهایی مانند "#pragma" را که در C سنتی پشتیبانی نمیشوند، با ایجاد تورفتگی پنهان کنید. برخی پیادهسازیهای سنتی "#elif" را بازشناسی نمیکنند، بنابراین این گزینه پیشنهاد میکند به طور کلی از آن اجتناب شود.
- ماکروی تابعگونهای که بدون آرگومان ظاهر شود.
- پسوند ثابت عدد صحیح U، یا پسوندهای ثابت ممیز شناور F یا L. (C سنتی از پسوند L روی ثابتهای عدد صحیح پشتیبانی میکند.) توجه داشته باشید که این پسوندها در ماکروهای تعریفشده در سرآیندهای سیستمی اکثر سامانههای نوین ظاهر میشوند، مانند ماکروهای _MIN/_MAX در "<limits.h>". استفاده از این ماکروها در کد کاربر ممکن است به طور معمول منجر به هشدارهای کاذب شود، با این وجود پیشپردازندهٔ یکپارچهٔ GCC زمینهٔ کافی برای اجتناب از صدور هشدار در این موارد را دارد.
- تابعی که در یک بلوک به صورت خارجی (external) اعلان شده و سپس پس از پایان آن بلوک استفاده شده است.
- یک دستور "switch" که عملوندی از نوع "long" دارد.
- اعلان یک تابع غیر "static" که پس از یک اعلان "static" بیاید. این ساختار توسط برخی کامپایلرهای C سنتی پذیرفته نمیشود.
- نوع ISO یک ثابت عدد صحیح، پهنا یا علامتداری متفاوتی نسبت به نوع سنتی آن داشته باشد. این هشدار تنها در صورتی صادر میشود که مبنای عدد ثابت ۱۰ باشد؛ یعنی دربارهٔ مقادیر هگزادسیمال یا اوکتال، که معمولاً الگوهای بیتی را نشان میدهند، هشداری صادر نمیشود.
- استفاده از الحاق رشتهٔ ISO تشخیص داده شود.
- مقداردهی اولیهٔ ساختارهای تجمعی (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)
- هشدار در صورتی که یک پیشنمونه باعث تبدیل نوعی شود که با آنچه برای همان آرگومان در نبود پیشنمونه رخ میداد تفاوت داشته باشد. این شامل تبدیلهای ممیز ثابت به ممیز شناور و برعکس، و تبدیلهایی است که پهنا یا علامتداری یک آرگومان ممیز ثابت را تغییر میدهند، مگر زمانی که همانند ارتقای پیشفرض باشد.
- -Wdeclaration-after-statement (فقط C و Objective-C)
- هشدار
زمانی که یک
اعلان بعد
از یک دستور
در یک بلوک
قرار گیرد.
این
ساختار، که
از C++ شناخته
شده است، با
ISO C99 معرفی شد و
به طور
پیشفرض در
GCC مجاز است.
این ساختار
توسط ISO C90
پشتیبانی
نمیشود.
این هشدار با -pedantic-errors به یک خطا ارتقا مییابد.
- -Wshadow
- هشدار در هر زمانی که یک متغیر محلی یا اعلان نوع، متغیر، پارامتر، نوع، عضو کلاس (در C++) یا متغیر نمونه (در Objective-C) دیگری را سایهاندازی (shadow) کند، یا هر زمان که یک تابع توکار سایهاندازی شود. توجه داشته باشید که در C++، اگر یک متغیر محلی یک typedef صریح را سایهاندازی کند کامپایلر هشدار میدهد، اما اگر یک struct/class/enum را سایهاندازی کند هشداری صادر نمیکند. اگر این هشدار فعال شود، شامل تمام موارد سایهاندازی محلی نیز میشود. این بدان معناست که در صورت استفاده از -Wshadow، گزینههای -Wno-shadow=local و -Wno-shadow=compatible-local نادیده گرفته میشوند. همانند -Wshadow=global است.
- -Wno-shadow-ivar (فقط Objective-C)
- هنگامی که یک متغیر محلی، متغیر نمونهای را در یک متد Objective-C سایهاندازی میکند، هشدار داده نشود.
- -Wshadow=global
- هشدار برای هر گونه سایهاندازی. همانند -Wshadow است.
- -Wshadow=local
- هشدار هنگامی که یک متغیر محلی، متغیر محلی یا پارامتر دیگری را سایهاندازی کند.
- -Wshadow=compatible-local
- هشدار
هنگامی که
یک متغیر
محلی،
متغیر محلی
یا پارامتر
دیگری را
سایهاندازی
کند که نوع
آن با نوع
متغیر
سایهانداز
سازگار است.
در C++،
سازگاری
نوع در
اینجا به
این معناست
که نوع
متغیر
سایهانداز
میتواند
به نوع
متغیر
سایهانداختهشده
تبدیل شود.
ایجاد این
پرچم (علاوه
بر -Wshadow=local) بر
اساس این
ایده است که
وقتی یک
متغیر
محلی،
متغیر
دیگری با
نوع
ناسازگار
را
سایهاندازی
میکند، به
احتمال
زیاد عمدی
بوده و یک
باگ یا غلط
تایپی
نیست،
همانطور
که در مثال
زیر نشان
داده شده
است:
for (SomeIterator i = SomeObj.begin(); i != SomeObj.end(); ++i) { for (int i = 0; i < N; ++i) { ... } ... }از آنجا که دو متغیر "i" در مثال بالا انواع ناسازگاری دارند، تنها با فعال کردن -Wshadow=compatible-local هشداری صادر نمیشود. از آنجا که نوعهای آنها ناسازگار است، اگر برنامهنویسی تصادفاً از یکی به جای دیگری استفاده کند، انتظار میرود که بررسی نوع (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
- هشدار در صورتی که اندازهٔ چارچوب (frame) یک تابع از byte-size فراتر رود. محاسبات انجامشده برای تعیین اندازهٔ چارچوب پشته تقریبی بوده و محتاطانه نیست. نیازمندیهای واقعی ممکن است تا حدی بیشتر از byte-size باشند حتی اگر هشداری دریافت نکنید. علاوه بر این، هر فضایی که از طریق "alloca"، آرایههای با طول متغیر یا ساختارهای مرتبط تخصیص یابد، هنگام تعیین صدور یا عدم صدور هشدار توسط کامپایلر لحاظ نمیشود. -Wframe-larger-than=PTRDIFF_MAX به طور پیشفرض فعال است. هشدارهای کنترلشده توسط این گزینه میتوانند با مشخص کردن byte-size برابر با SIZE_MAX یا بیشتر، یا با -Wno-frame-larger-than غیرفعال شوند.
- -Wno-frame-larger-than
- غیرفعال کردن هشدارهای -Wframe-larger-than=. این گزینه معادل -Wframe-larger-than=SIZE_MAX یا بزرگتر است.
- -Wfree-nonheap-object
- هشدار
هنگام تلاش
برای
آزادسازی
شیئی که یا
در هیپ (heap)
تخصیص
نیافته
است، یا با
استفاده از
اشارهگری
که از
فراخوانی
پیشین تابع
تخصیص
متناظر
بازگردانده
نشده است.
به عنوان
مثال، از
آنجا که
فراخوانی
"stpcpy"
اشارهگری
به نویسهٔ
پایانی nul
بازمیگرداند
و نه به
ابتدای
شیء،
فراخوانی
"free" در
زیر تشخیص
داده شده و
هشدار
میگیرد.
void f (char *p) { p = stpcpy (p, "abc"); // ... free (p); // warning }-Wfree-nonheap-object در -Wall گنجانده شده است..IP -Wstack-usage=byte-size 4 اگر میزان استفاده از پشته (stack) در یک تابع ممکن است از byte-size فراتر رود، هشدار میدهد. محاسبات انجامشده برای تعیین میزان استفاده از پشته، محافظهکارانه است. هر فضای تخصیصیافته از طریق "alloca"، آرایههای با طول متغیر (variable-length arrays)، یا ساختارهای مرتبط هنگام تعیین صدور یا عدم صدور هشدار توسط کامپایلر لحاظ میشود.
پیام هشدار با خروجی -fstack-usage همخوانی دارد.
- اگر
استفاده از
پشته
کاملاً
ایستا (static)
باشد اما از
مقدار
مشخصشده
فراتر رود:
warning: stack usage is 1120 bytes
- اگر
استفاده از
پشته (تا
حدی) پویا
اما محدود
(bounded) باشد:
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
- اگر مقایسهای به دلیل بازهٔ محدود نوع داده همیشه درست (true) یا همیشه نادرست (false) باشد، هشدار میدهد؛ اما برای عبارتهای ثابت هشداری صادر نمیکند. برای نمونه، اگر یک متغیر بدون علامت (unsigned) با استفاده از "<" یا ">=" با صفر مقایسه شود، هشدار میدهد. این هشدار با -Wextra نیز فعال میشود.
- -Wabsolute-value (تنها در C و Objective-C)
- هنگام فراخوانی توابع استانداردی که قدر مطلق (absolute value) یک آرگومان را محاسبه میکنند، در صورتی که تابع استاندارد مناسبتری در دسترس باشد، هشدار میدهد. برای نمونه، فراخوانی abs(3.14) این هشدار را صادر میکند زیرا تابع مناسب برای محاسبهٔ قدر مطلق یک آرگومان از نوع double، تابع "fabs" است. این گزینه همچنین زمانی که آرگومانِ یک فراخوانی به چنین تابعی دارای نوع بدون علامت (unsigned) باشد، هشدار میدهد. این هشدار را میتوان با تبدیل نوع صریح (explicit type cast) مهار کرد و همچنین با -Wextra فعال میشود.
- -Wcomment
- -Wcomments
- هرگاه توالی شروع کامنت /* درون یک کامنت /* ظاهر شود، یا هرگاه یک بکاسلش-خطجدید (backslash-newline) درون یک کامنت // قرار گیرد، هشدار میدهد. این هشدار با -Wall فعال میشود.
- -Wtrigraphs
- اگر با هر
سهنویسهای
(trigraph) مواجه
شود که ممکن
است معنای
برنامه را
تغییر دهد،
هشدار
میدهد.
دربارهٔ
سهنویسههای
درون
کامنتها
هشداری
داده
نمیشود،
به جز
مواردی که
یک خط جدید
گریزدار (escaped newline)
ایجاد کنند.
این گزینه به صورت ضمنی توسط -Wall فعال میشود. اگر -Wall مشخص نشده باشد، این گزینه همچنان فعال است مگر اینکه trigraphها فعال شده باشند. برای تبدیل trigraph بدون دریافت هشدار، اما دریافت سایر هشدارهای -Wall، از -trigraphs -Wall -Wno-trigraphs استفاده کنید.
- -Wundef
- اگر یک شناسهٔ تعریفنشده در یک دستور "#if" ارزیابی شود، هشدار میدهد. چنین شناسههایی با صفر جایگزین میشوند.
- -Wexpansion-to-defined
- هرگاه defined در بسط (expansion) یک ماکرو ظاهر شود (شامل حالتی که ماکرو توسط یک دستور #if باز میشود)، هشدار میدهد. چنین کاربردی غیرقابلحمل (non-portable) است. این هشدار با -Wpedantic و -Wextra نیز فعال میشود.
- -Wunused-macros
- دربارهٔ
ماکروهای
تعریفشده
در فایل
اصلی که
بلااستفاده
ماندهاند
هشدار
میدهد. یک
ماکرو در
صورتی
استفادهشده
تلقی
میشود که
دستکم
یکبار بسط
داده شود یا
وجود آن
بررسی گردد.
پیشپردازنده
همچنین در
صورتی که
ماکرو در
زمان
بازتعریف
(redefinition) یا لغو
تعریف (undefinition)
استفاده
نشده باشد،
هشدار
میدهد.
دربارهٔ ماکروهای توکار (built-in)، ماکروهای تعریفشده در خط فرمان، و ماکروهای تعریفشده در فایلهای include هشداری داده نمیشود.
نکته: اگر ماکرویی واقعاً استفاده شده باشد، اما صرفاً درون بلوکهای شرطی نادیدهگرفتهشده (skipped) قرار داشته باشد، پیشپردازنده آن را به عنوان استفادهنشده گزارش میکند. برای جلوگیری از هشدار در چنین مواردی، میتوانید حوزهٔ تعریف ماکرو را بهبود ببخشید؛ مثلاً با انتقال آن به اولین بلوک نادیدهگرفتهشده. در غیر این صورت، میتوانید یک کاربرد صوری (dummy use) شبیه به عبارت زیر فراهم کنید:
#if defined the_macro_causing_the_warning #endif
- -Wno-endif-labels
- هرگاه متنی
در ادامهٔ
یک "#else"
یا یک
"#endif"
بیاید،
هشدار
نمیدهد.
این وضعیت
گاهی در
برنامههای
قدیمیتر
با کدهایی
به شکل زیر
رخ میدهد:
#if FOO ... #else FOO ... #endif FOO
دومین و سومین "FOO" باید درون کامنت قرار گیرند. این هشدار به طور پیشفرض فعال است.
- -Wbad-function-cast (تنها در C و Objective-C)
- هنگامی که فراخوانی یک تابع به نوعی ناسازگار تبدیل (cast) شود، هشدار میدهد. برای نمونه، اگر فراخوانی تابعی که یک نوع عدد صحیح را برمیگرداند به یک نوع اشارهگر تبدیل شود، هشدار میدهد.
- -Wc90-c99-compat (تنها در C و Objective-C)
- دربارهٔ قابلیتهایی که در ISO C90 وجود ندارند، اما در ISO C99 موجودند، هشدار میدهد. برای نمونه، دربارهٔ استفاده از آرایههای با طول متغیر (variable length arrays)، نوع "long long"، نوع "bool"، مقدارهای لفظی مرکب (compound literals)، مقداردهندههای اولیهٔ معین (designated initializers) و غیره هشدار میدهد. این گزینه مستقل از حالت استانداردها است. هشدارها در عبارتی که پس از "__extension__" میآید، غیرفعال میشوند.
- -Wc99-c11-compat (تنها در C و Objective-C)
- دربارهٔ قابلیتهایی که در ISO C99 وجود ندارند، اما در ISO C11 موجودند، هشدار میدهد. برای نمونه، دربارهٔ استفاده از ساختارها و اجتماعات بینام (anonymous structures and unions)، توصیفکنندهٔ نوع "_Atomic"، مشخصکنندهٔ ردهٔ حافظهٔ "_Thread_local"، مشخصکنندهٔ "_Alignas"، عملگر "Alignof"، کلیدواژهٔ "_Generic" و غیره هشدار میدهد. این گزینه مستقل از حالت استانداردها است. هشدارها در عبارتی که پس از "__extension__" میآید، غیرفعال میشوند..IP "-Wc11-c23-compat (فقط C و Objective-C)" 4
- -Wc11-c2x-compat (فقط C و Objective-C)
- درباره
ویژگیهایی
هشدار
میدهد که
در ISO C11 موجود
نیستند،
اما در ISO C23
وجود دارند.
بهعنوان
مثال،
درباره حذف
رشته در
"_Static_assert"،
استفاده از
نحو [[]] برای
صفتها (attributes)،
استفاده از
انواع ممیز
شناور
دهدهی و
غیره هشدار
میدهد. این
گزینه
مستقل از
حالت
استاندارد
است.
هشدارها در
عبارتی که
پس از
"__extension__"
میآید
غیرفعال
میشوند.
نام -Wc11-c2x-compat
منسوخ شده
است.
هنگامی که کامپایل در حالت C23 انجام نمیشود، این هشدارها توسط -pedantic-errors به خطا ارتقا مییابند.
- -Wc23-c2y-compat (فقط C و Objective-C)
- -Wc23-c2y-compat (فقط C و Objective-C)
- درباره
ویژگیهایی
هشدار
میدهد که
در ISO C23 موجود
نیستند،
اما در ISO C2Y
وجود دارند.
بهعنوان
مثال،
درباره
انتخاب با
یک نام نوع
بهجای یک
عبارت در
"_Generic"
هشدار
میدهد. این
گزینه
مستقل از
حالت
استاندارد
است.
هشدارها در
عبارتی که
پس از
"__extension__"
میآید
غیرفعال
میشوند.
هنگامی که کامپایل در حالت C2Y انجام نمیشود، این هشدارها توسط -pedantic-errors به خطا ارتقا مییابند.
- -Wc++-compat (فقط C و Objective-C)
- درباره ساختارهای ISO C که خارج از زیرمجموعه مشترک ISO C و ISO C++ هستند هشدار میدهد؛ مانند درخواست برای تبدیل ضمنی از "void *" به یک اشارهگر به نوع غیر-"void".
- -Wc++11-compat (فقط C++ و Objective-C++)
- درباره ساختارهای C++ که معنای آنها بین ISO C++ 1998 و ISO C++ 2011 تفاوت دارد هشدار میدهد؛ مانند شناسههایی در ISO C++ 1998 که در ISO C++ 2011 کلمه کلیدی هستند. این هشدار -Wnarrowing را روشن میکند و توسط -Wall فعال میشود.
- -Wc++14-compat (فقط C++ و Objective-C++)
- درباره ساختارهای C++ که معنای آنها بین ISO C++ 2011 و ISO C++ 2014 تفاوت دارد هشدار میدهد. این هشدار توسط -Wall فعال میشود.
- -Wc++17-compat (فقط C++ و Objective-C++)
- درباره ساختارهای C++ که معنای آنها بین ISO C++ 2014 و ISO C++ 2017 تفاوت دارد هشدار میدهد. این هشدار توسط -Wall فعال میشود.
- -Wc++20-compat (فقط C++ و Objective-C++)
- درباره ساختارهای C++ که معنای آنها بین ISO C++ 2017 و ISO C++ 2020 تفاوت دارد هشدار میدهد. این هشدار توسط -Wall فعال میشود.
- -Wc++26-compat (فقط C++ و Objective-C++)
- درباره ساختارهای C++ که معنای آنها بین ISO C++ 2023 و استاندارد آینده ISO C++ 2026 تفاوت دارد هشدار میدهد. این هشدار توسط -Wall فعال میشود.
- -Wno-c++11-extensions (فقط C++ و Objective-C++)
- درباره ساختارهای C++11 در کدی که با استفاده از یک استاندارد قدیمیتر C++ کامپایل میشود، هشدار نمیدهد. حتی بدون این گزینه، برخی از ساختارهای C++11 تنها در صورتی تشخیص داده میشوند که از -Wpedantic استفاده شود.
- -Wno-c++14-extensions (فقط C++ و Objective-C++)
- درباره ساختارهای C++14 در کدی که با استفاده از یک استاندارد قدیمیتر C++ کامپایل میشود، هشدار نمیدهد. حتی بدون این گزینه، برخی از ساختارهای C++14 تنها در صورتی تشخیص داده میشوند که از -Wpedantic استفاده شود.
- -Wno-c++17-extensions (فقط C++ و Objective-C++)
- درباره ساختارهای C++17 در کدی که با استفاده از یک استاندارد قدیمیتر C++ کامپایل میشود، هشدار نمیدهد. حتی بدون این گزینه، برخی از ساختارهای C++17 تنها در صورتی تشخیص داده میشوند که از -Wpedantic استفاده شود.
- -Wno-c++20-extensions (فقط C++ و Objective-C++)
- درباره ساختارهای C++20 در کدی که با استفاده از یک استاندارد قدیمیتر C++ کامپایل میشود، هشدار نمیدهد. حتی بدون این گزینه، برخی از ساختارهای C++20 تنها در صورتی تشخیص داده میشوند که از -Wpedantic استفاده شود.
- -Wno-c++23-extensions (فقط C++ و Objective-C++)
- درباره ساختارهای C++23 در کدی که با استفاده از یک استاندارد قدیمیتر C++ کامپایل میشود، هشدار نمیدهد. حتی بدون این گزینه، برخی از ساختارهای C++23 تنها در صورتی تشخیص داده میشوند که از -Wpedantic استفاده شود.
- -Wno-c++26-extensions (فقط C++ و Objective-C++)
- درباره ساختارهای C++26 در کدی که با استفاده از یک استاندارد قدیمیتر C++ کامپایل میشود، هشدار نمیدهد. حتی بدون این گزینه، برخی از ساختارهای C++26 تنها در صورتی تشخیص داده میشوند که از -Wpedantic استفاده شود.
- -Wcast-qual
- هر زمان که
یک
اشارهگر
طوری تبدیل
نوع (cast) شود که
یک
توصیفکننده
نوع را از
نوع مقصد
حذف کند،
هشدار
میدهد. به
عنوان
مثال، اگر
یک "const char *"
به یک "char
*" معمولی
تبدیل نوع
شود، هشدار
میدهد.
همچنین هنگام انجام تبدیلی که یک توصیفکننده نوع را به روشی ناامن وارد میکند، هشدار میدهد. به عنوان مثال، تبدیل نوع "char **" به "const char **" ناامن است، همانند این مثال:
/* p is char ** value. */ const char **q = (const char **) p; /* Assignment of readonly string to const char * is OK. */ *q = "string"; /* Now char** pointer points to read-only memory. */ **p = 'b';
- -Wcast-align
- هر زمان که
یک
اشارهگر
طوری تبدیل
نوع شود که
همترازی
(alignment) مورد
نیاز مقصد
افزایش
یابد،
هشدار
میدهد.
برای
نمونه، اگر
یک "char *"
به یک "int
*" در
ماشینهایی
که اعداد
صحیح در
آنها فقط
در مرزهای
دو یا چهار
بایتی قابل
دسترسی
هستند
تبدیل نوع
شود، هشدار
میدهد.
هر زمان که یک اشارهگر طوری تبدیل نوع شود که همترازی مورد نیاز مقصد افزایش یابد، هشدار میدهد. برای نمونه، اگر یک "char *" صرفنظر از ماشین مقصد به یک "int *" تبدیل نوع شود، هشدار میدهد.
- -Wcast-function-type
- هنگامی که یک اشارهگر تابع به یک اشارهگر تابع ناسازگار تبدیل نوع شود، هشدار میدهد. در تبدیل نوعی که شامل انواع تابع با فهرست متغیر آرگومانها باشد، فقط انواع آرگومانهای اولیهای که مشخص شدهاند در نظر گرفته میشوند. هر پارامتری از نوع اشارهگر با هر نوع اشارهگر دیگری مطابقت دارد. هرگونه تفاوت بیضرر در انواع صحیح نادیده گرفته میشود، مانند "int" در برابر "long" در مقصدهای ILP32. به همین ترتیب توصیفکنندههای نوع نادیده گرفته میشوند. نوع تابع "void (*) (void)" ویژه است و با همه چیز مطابقت دارد که میتوان از آن برای فرونشاندن این هشدار استفاده کرد. در تبدیل نوعی که شامل اشارهگر به انواع عضو باشد، این هشدار هر زمان که تبدیل نوع باعث تغییر اشارهگر به نوع عضو شود هشدار میدهد. این هشدار توسط -Wextra فعال میشود.
- -Wcast-user-defined
- هنگامی که
یک تبدیل
نوع به نوع
ارجاعی (reference type)
شامل تبدیل
تعریفشده
توسط کاربر
که
برنامهنویس
ممکن است
انتظار
فراخوانی
آن را داشته
باشد
نباشد،
هشدار
میدهد.
struct A { operator const int&(); } a; auto r = (int&)a; // warningاین هشدار بهطور پیشفرض فعال است.
- -Wwrite-strings
- هنگام
کامپایل C،
به ثوابت
رشتهای
نوع "const
char[length]"
را اختصاص
میدهد تا
کپی کردن
نشانی یکی
از آنها در
یک
اشارهگر
غیر-"const"
از نوع "char
*" هشداری
تولید کند.
این
هشدارها به
شما کمک
میکنند در
زمان
کامپایل
کدی را پیدا
کنید که
میتواند
سعی در
نوشتن روی
یک ثابت
رشتهای
داشته
باشد، اما
این تنها
زمانی است
که در
استفاده از
"const" در
اعلانها و
پیشنمونهها
(prototypes) بسیار
دقت کرده
باشید. در
غیر این
صورت،
صرفاً
ایجاد
مزاحمت
میکند. به
همین دلیل
است که ما -Wall
را ملزم به
درخواست
این
هشدارها
نکردهایم.
هنگام کامپایل C++، درباره تبدیل منسوخ از لفظهای رشتهای (string literals) به "char *" هشدار میدهد. این هشدار بهطور پیشفرض برای برنامههای C++ فعال است.
این هشدار در حالت C++11 یا بالاتر توسط -pedantic-errors به یک خطا ارتقا مییابد.
- -Wclobbered
- درباره متغیرهایی که ممکن است توسط "longjmp" یا "vfork" تغییر کنند هشدار میدهد. این هشدار همچنین توسط -Wextra فعال میشود.
- -Wno-complain-wrong-lang
- بهطور
پیشفرض،
فرانتاندهای
زبان زمانی
که یک گزینه
خط فرمان
معتبر باشد
اما برای آن
فرانتاند
قابل اعمال
نباشد،
پیام اخطار
میدهند.
این رفتار
را میتوان
با -Wno-complain-wrong-lang
غیرفعال
کرد که
بیشتر
هنگام
فراخوانی
یک درایور
کامپایلر
واحد برای
چندین فایل
منبع
نوشتهشده
به
زبانهای
مختلف
سودمند
است، برای
مثال:
$ g++ -fno-rtti a.cc b.f90
درایور g++ فرانتاند C++ را برای کامپایل a.cc و فرانتاند Fortran را برای کامپایل b.f90 فراخوانی میکند. فرانتاند دوم اخطار زیر را صادر میکند: f951: Warning: command-line option '-fno-rtti' is valid for C++/D/ObjC++ but not for Fortran، که میتوان آن را با -Wno-complain-wrong-lang غیرفعال کرد.
این گزینه همچنین میتواند برای غیرفعال کردن هشدارهایی نظیر: cc1plus: note: CTF debug info requested, but not supported for 'GNU C++20' frontend که توسط -gctf یا -gsctf برای زبانهای پشتیبانینشده تولید میشوند، استفاده شود..IP "-Wcompare-distinct-pointer-types (فقط C و Objective-C)" 4 در صورتی که اشارهگرهایی از انواع متمایز بدون تبدیل نوع صریح (cast) مقایسه شوند، هشدار میدهد. این هشدار به طور پیشفرض فعال است.
- -Wconversion
- درباره
تبدیلهای
ضمنی (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;
}
در این مثال، هنگام استفاده از اشارهگر s، آرایه a خارج از حوزه دید قرار دارد. از آنجا که کدی که "s" را مقداردهی میکند شرطی است، هشدار در سطح ۲ فعال میشود.
extern void frob (const char *);
void h (char *s)
{
if (!s)
{
char a[12] = "tmpname";
s = a;
}
// warning: dangling pointer 's' to 'a' may be used
frob (s);
}
- -Wdate-time
- هنگامی که ماکروهای "__TIME__"، "__DATE__" یا "__TIMESTAMP__" مشاهده شوند هشدار میدهد، چرا که ممکن است مانع کامپایلهای بازتولیدپذیر با تطابق بیتبهبیت شوند.
- -Wempty-body
- اگر بدنه خالی در یک دستور "if"، "else" یا "do while" وجود داشته باشد، هشدار میدهد. این هشدار توسط -Wextra نیز فعال میشود.
- -Wno-endif-labels
- درباره نشانههای سرگردان پس از "#else" و "#endif" هشدار نمیدهد.
- -Wenum-compare
- درباره مقایسه بین مقادیر از انواع شمارشی (enumerated types) متفاوت هشدار میدهد. در C++، عدم تطابق انواع شمارشی در عبارات شرطی نیز تشخیص داده میشود و هشدار به طور پیشفرض فعال است. در C این هشدار توسط -Wall فعال میشود.
- -Wenum-conversion
- هنگامی که مقداری از نوع شمارشی به طور ضمنی به یک نوع شمارشی متفاوت تبدیل شود، هشدار میدهد. این هشدار توسط -Wextra در C فعال میشود.
- -Wenum-int-mismatch (فقط C و Objective-C)
- درباره عدم
تطابق بین
یک نوع
شمارشی و یک
نوع عدد
صحیح در
اعلانها
هشدار
میدهد.
برای نمونه:
enum E { l = -1, z = 0, g = 1 }; int foo(void); enum E foo(void);در C، یک نوع شمارشی با "char"، یک نوع عدد صحیح علامتدار، یا یک نوع عدد صحیح بدون علامت سازگار است. با این حال، از آنجا که انتخاب نوع زیربنایی (underlying type) یک نوع شمارشی وابسته به پیادهسازی (implementation-defined) است، چنین عدم تطابقهایی ممکن است باعث مشکلات قابلیت حمل شود. در C++، چنین عدم تطابقهایی یک خطا محسوب میشوند. در C، این هشدار توسط -Wall و -Wc++-compat فعال میشود.
- -Wjump-misses-init (فقط C و Objective-C)
- اگر یک
دستور
"goto" یا یک
دستور
"switch" به
جلو و از
روی
مقداردهی
اولیه یک
متغیر جهش
کند، یا به
عقب و به
سمتی از یک
برچسب پس از
مقداردهی
اولیه
متغیر جهش
نماید،
هشدار
میدهد. این
هشدار تنها
درباره
متغیرهایی
صادر
میشود که
هنگام
اعلانشان
مقداردهی
اولیه شده
باشند. این
هشدار فقط
برای C و Objective-C
پشتیبانی
میشود؛ در
C++ این نوع
انشعاب در
هر صورت یک
خطا است.
-Wjump-misses-init در -Wc++-compat گنجانده شده است. این هشدار را میتوان با گزینه -Wno-jump-misses-init غیرفعال کرد..IP -Wsign-compare 4 هنگامی که مقایسه میان مقادیر علامتدار و بدون علامت، در صورت تبدیل مقدار علامتدار به بدون علامت، ممکن است نتیجه نادرستی ایجاد کند، هشدار میدهد. در C++ این هشدار با -Wall نیز فعال میشود. در C این هشدار با -Wextra نیز فعال میشود.
- -Wsign-conversion
- برای تبدیلهای ضمنی که ممکن است علامت یک مقدار عدد صحیح را تغییر دهند (مانند انتساب یک عبارت صحیح علامتدار به یک متغیر صحیح بدون علامت) هشدار میدهد. یک تبدیل نوع صریح (cast) این هشدار را بیاثر میکند. در C این گزینه با -Wconversion نیز فعال میشود.
- -Wflex-array-member-not-at-end (تنها در C و C++)
- هنگامی که
یک ساختار
حاوی یک عضو
آرایه
انعطافپذیر
C99 به عنوان
آخرین
فیلد، در
انتهای
ساختار
دیگری قرار
نگرفته
باشد،
هشدار
میدهد. این
هشدار به
عنوان مثال
در مورد زیر
هشدار
میدهد:
struct flex { int length; char data[]; }; struct mid_flex { int m; struct flex flex_data; int n; }; - -Wfloat-conversion
- برای تبدیلهای ضمنی که دقت یک مقدار حقیقی را کاهش میدهند هشدار میدهد. این شامل تبدیل از حقیقی به عدد صحیح، و از مقادیر حقیقی با دقت بالاتر به مقادیر حقیقی با دقت پایینتر است. این گزینه همچنین توسط -Wconversion فعال میشود.
- -Wno-scalar-storage-order
- در مورد ساختارهای مشکوک مربوط به ترتیب ذخیرهسازی معکوس اسکالر (reverse scalar storage order) هشدار نده.
- -Wsizeof-array-div
- در مورد
تقسیم دو
عملگر sizeof
هنگامی که
اولی روی یک
آرایه
اعمال شده و
مقسومعلیه
با اندازه
عنصر آرایه
برابر
نیست،
هشدار
میدهد. در
چنین
حالتی،
محاسبه
تعداد
عناصر
آرایه را که
احتمالاً
هدف کاربر
بوده است،
به دست
نخواهد داد.
این هشدار
به عنوان
مثال در
مورد زیر
هشدار
میدهد:
int fn () { int arr[10]; return sizeof (arr) / sizeof (short); }این هشدار توسط -Wall فعال میشود.
- -Wsizeof-pointer-div
- در مورد تقسیمهای مشکوک دو عبارت sizeof که اندازه اشارهگر را بر اندازه عنصر تقسیم میکنند، هشدار میدهد؛ این روش معمول برای محاسبه اندازه آرایه است اما با اشارهگرها به درستی کار نخواهد کرد. این هشدار برای نمونه در مورد "sizeof (ptr) / sizeof (ptr[0])" چنانچه "ptr" یک اشارهگر باشد و نه آرایه، هشدار میدهد. این هشدار با -Wall فعال میشود.
- -Wsizeof-pointer-memaccess
- در مورد
پارامترهای
طول مشکوک
در توابع
توکار (built-in)
مشخص رشته و
حافظه، در
صورتی که
آرگومان از
"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 (); }مقایسه یک اشارهگر با یک رشتهواژه (string literal)، مانند:
void f (const char *x) { if (x == "abc") // warning: expression evaluates to false puts ("equal"); }و بررسی برابری نتیجه جمع یا تفریق اشارهگر با null، مانند:
void f (const int *p, int i) { return p + i == NULL; }چنین استفادههایی معمولاً بیانگر خطای برنامهنویس است: آدرس بیشتر توابع و اشیاء لزوماً برابر با true ارزیابی میشود (استثنا نمادهای ضعیف یا weak symbols هستند)، بنابراین استفاده از آنها در یک عبارت شرطی ممکن است نشاندهنده جا افتادن پرانتزها در فراخوانی تابع یا عدم ارجاعزدایی (dereference) در یک عبارت آرایه باشد. زیرمجموعه این هشدار برای اشارهگرهای شیء را میتوان با تبدیل نوع عملوند اشارهگر به یک نوع عدد صحیح مانند "intptr_t" یا "uintptr_t" نادیده گرفت. مقایسه در برابر رشتهواژهها به رفتار نامشخص (unspecified behavior) منجر میشود و قابلحمل نیست، و نشان میدهد که احتمالاً قصد فراخوانی "strcmp" بوده است. اگر عبارت مشکوک نتیجه بسط یک ماکرو باشد، این هشدار صادر نمیشود. هشدار -Waddress با -Wall فعال میشود.
- -Wno-address-of-packed-member
- هنگامی که آدرس عضوی با بستهبندی فشرده (packed) از یک struct یا union گرفته میشود (که معمولاً منجر به یک مقدار اشارهگر ترازنشده میشود)، هشدار نده. این گزینه به طور پیشفرض فعال است.
- -Wlogical-op
- در مورد
استفادههای
مشکوک از
عملگرهای
منطقی در
عبارتها
هشدار
میدهد. این
شامل
استفاده از
عملگرهای
منطقی در
بافتهایی
است که
احتمالاً
انتظار یک
عملگر بیتی
میرود.
همچنین
زمانی که
عملوندهای
یک عملگر
منطقی
یکسان
باشند
هشدار
میدهد:
extern int a; if (a < 0 && a < 0) { ... } - -Wlogical-not-parentheses
- در مورد
استفاده از
نقیض منطقی
(logical not) در
عملوند سمت
چپ یک
مقایسه
هشدار
میدهد. اگر
عملوند سمت
راست یک
عبارت بولی
در نظر
گرفته شود،
این گزینه
هشدار
نمیدهد.
هدف آن
شناسایی
کدهای
مشکوکی
مانند زیر
است:
int a; ... if (!a > 1) { ... }میتوان با قرار دادن عملوند سمت چپ درون پرانتز، این هشدار را برطرف کرد:
if ((!a) > 1) { ... }این هشدار توسط -Wall فعال میشود..IP -Waggregate-return 4 اگر توابعی که ساختارها (structures) یا اجتماعها (unions) را بازمیگردانند تعریف یا فراخوانی شوند، هشدار میدهد. (در زبانهایی که امکان بازگرداندن آرایه وجود دارد، این مورد نیز موجب ایجاد هشدار میشود.)
- -Wno-aggressive-loop-optimizations
- اگر کامپایلر رفتار تعریفنشدهای (undefined behavior) در حلقهای با تعداد تکرار ثابت شناسایی کند، هشدار نمیدهد. گزینهٔ -Waggressive-loop-optimizations بهطور پیشفرض فعال است.
- -Wno-attributes
- اگر یک
"__attribute__"
غیرمنتظره
استفاده
شود، مانند
صفتهای (attributes)
ناشناخته،
صفتهای
تابع
اعمالشده
روی
متغیرها و
غیره،
هشدار
نمیدهد.
این گزینه
مانع از
ایجاد خطا
برای
استفادهٔ
نادرست از
صفتهای
پشتیبانیشده
نمیشود.
هشدارهای مربوط به استفادههای ناصحیح (ill-formed) از صفتهای استاندارد، با -pedantic-errors به خطا تبدیل میشوند.
علاوه بر این، با استفاده از -Wno-attributes=، فرونشاندن هشدارهای مربوط به صفتهای دارای حوزه (scoped attributes) ناشناخته (در C++11 و C23) امکانپذیر است. برای نمونه، -Wno-attributes=vendor::attr هشدار دربارهٔ اعلان زیر را غیرفعال میکند:
[[vendor::attr]] void f();
همچنین میتوان با استفاده از -Wno-attributes=vendor::، هشدار دربارهٔ تمام صفتهای موجود در یک فضاینام (namespace) را غیرفعال کرد که از هشدار برای هر دوی این اعلانها جلوگیری میکند:
[[vendor::safe]] void f(); [[vendor::unsafe]] void f2();
توجه داشته باشید که -Wno-attributes= به معنای فعال شدن -Wno-attributes نیست.
- -Wno-builtin-declaration-mismatch
- اگر یک تابع
توکار (built-in) با
امضایی
ناسازگار
یا به عنوان
یک غیر-تابع
اعلان شود،
یا هنگامی
که یک تابع
توکار
اعلانشده
با نوعی
فاقد
پیشنمونه
(prototype)، با
آرگومانهایی
فراخوانی
گردد که
نوعهای
ارتقایافتهٔ
آنها با
نوعهای
مورد
انتظار
تابع
مطابقت
ندارد،
هشدار
میدهد.
زمانی که -Wextra
مشخص شده
باشد، اگر
یک تابع
توکار
آرگومانپذیر
بدون
پیشنمونه
اعلان شود
نیز هشدار
میدهد.
هشدار
-Wbuiltin-declaration-mismatch
بهطور
پیشفرض
فعال است.
برای
جلوگیری از
این هشدار،
سرایند
مناسب را
بگنجانید
تا
پیشنمونههای
توابع
توکار وارد
حوزه شوند.
برای نمونه، فراخوانی "memset" در زیر توسط این هشدار شناسایی میشود زیرا تابع انتظار مقداری از نوع "size_t" را به عنوان آرگومان خود دارد، اما نوع 32 برابر با "int" است. با -Wextra، اعلان تابع نیز خطاگیری میشود.
extern void* memset (); void f (void *d) { memset (d, '\0', 32); } - -Wno-builtin-macro-redefined
- اگر ماکروهای توکار (built-in) خاصی بازتعریف شوند، هشدار نمیدهد. این گزینه هشدارهای مربوط به بازتعریف "__TIMESTAMP__"، "__TIME__"، "__DATE__"، "__FILE__" و "__BASE_FILE__" را فرومینشاند.
- -Wkeyword-macro
- اگر یک کلمهٔ کلیدی به عنوان یک ماکرو تعریف یا لغو تعریف (undefine) شود، هشدار میدهد. برای C++، شناسههای دارای معنای خاص یا شناسههای صفتهای استاندارد نیز بررسی میشوند. در صورت فعال بودن "-Wpedantic"، این هشدار بهطور پیشفرض برای C++26 فعال است و در آن حالت یک pedwarn صادر میکند.
- -Wfree-labels (فقط C و Objective-C)
- اگر یک
برچسب (label) روی
یک
غیر-دستور
(non-statement) اعمال
شود، یا در
پایان یک
دستور مرکب
(compound statement) قرار
گیرد،
هشدار
میدهد.
چنین
برچسبهایی
توسط C23 و
گویشهای
بعدی C مجاز
هستند و در
تمام
گویشهای
دیگر به
عنوان یک
افزونهٔ GCC
در دسترس
قرار دارند.
این هشدار با -Wc11-c23-compat نیز فعال میشود. در صورت ساخت برای نسخهای از C قبل از C23، توسط -pedantic-errors به یک خطا تبدیل میشود.
- -Wheader-guard
- اگر یک محافظ گنجاندن چندبارهٔ معتبر سرایند در پیشپردازنده (multiple inclusion guard)، بلافاصله پس از دستور "#ifndef" یا "#if !defined" مربوط به محافظ گنجاندن چندباره، دارای یک دستور "#define" باشد که ماکرویی متفاوت از ماکروی محافظ با نامی مشابه را تعریف کند، و ماکروی محافظ واقعی در دستور متناظر با "#ifndef" در انتهای سرایند تعریف نشده باشد، و دستور "#define" یک ماکروی شیءگونه (object-like) با تعریفی خالی تعریف کند، هشدار میدهد. در چنین مواردی، معمولاً این تنها یک غلط املایی در نام محافظ است، چه در دستور "#ifndef" یا "#if !defined" و چه در دستور بعدی "#define". این هشدار با -Wall فعال میشود.
- -Wstrict-prototypes (فقط C و Objective-C)
- اگر تابعی بدون تعیین نوع آرگومانها اعلان یا تعریف شود، هشدار میدهد. (تعریف تابع به سبک قدیمی در صورتی که پیش از آن اعلانی باشد که نوع آرگومانها را مشخص میکند، بدون هشدار مجاز است.)
- -Wold-style-declaration (فقط C و Objective-C)
- دربارهٔ کاربردهای منسوخشده بر اساس استاندارد C در یک اعلان هشدار میدهد. برای نمونه، اگر مشخصکنندههای کلاس ذخیرهسازی (storage-class specifiers) مانند "static" اولین بخش در یک اعلان نباشند، هشدار میدهد. این هشدار با -Wextra نیز فعال میشود.
- -Wold-style-definition (فقط C و Objective-C)
- اگر از یک تعریف تابع به سبک قدیمی استفاده شود، هشدار میدهد. حتی در صورت وجود یک پیشنمونهٔ قبلی نیز هشدار صادر میشود. تعریفی که از () استفاده میکند در حالت C23 به عنوان تعریف سبک قدیمی در نظر گرفته نمیشود، زیرا در آن حالت معادل (void) است، اما برای استانداردهای قدیمیتر تعریفی به سبک قدیمی به شمار میرود.
- -Wmultiple-parameter-fwd-decl-lists (فقط C و Objective-C)
- اگر بیش از یک فهرست از اعلانهای پیشین (forward declarations) پارامترها در یک پیشنمونهٔ تابع ظاهر شود، هشدار میدهد. این هشدار با -Wextra نیز فعال میشود.
- -Wdeprecated-non-prototype (فقط C و Objective-C)
- اگر تابعی
که با فهرست
پارامتر
خالی ()
اعلان شده
است با یک
یا چند
آرگومان
فراخوانی
شود، یا اگر
پس از چنین
اعلانی،
تعریفی از
تابع با یک
یا چند
پارامتر
مشاهده
گردد،
هشدار
میدهد. هر
دو مورد در C23
و گویشهای
بعدی C خطا
محسوب
میشوند.
این هشدار با -Wc11-c23-compat نیز فعال میشود.
- -Wmissing-parameter-name (فقط C و Objective-C)
- اگر یک
تعریف
تابع، نام
پارامتر را
حذف کرده و
تنها نوع آن
را مشخص
کند، هشدار
میدهد. این
ویژگی
میتواند
برای
مستندسازی
استفاده
نشدن یک
پارامتر در
تعریف تابع
به کار رود.
این بخش
جزئی از C23 و
گویشهای
بعدی C است،
و در تمام
گویشهای
دیگر به
عنوان
افزونهٔ GCC
در دسترس
قرار دارد.
این هشدار با -Wc11-c23-compat نیز فعال میشود. در صورت ساخت برای نسخهای از C قبل از C23، توسط -pedantic-errors به یک خطا تبدیل میشود.
- -Wmissing-parameter-type (فقط C و Objective-C)
- در توابع به
سبک K&R، اگر
پارامتر
تابع بدون
مشخصکنندهٔ
نوع اعلان
شود، هشدار
میدهد:
void foo(bar) { }این هشدار با -Wextra نیز فعال میشود.
- -Wno-declaration-missing-parameter-type (فقط C و Objective-C)
- اگر یک
اعلان تابع
شامل نام
پارامتر
بدون نوع
باشد،
هشدار
نمیدهد.
چنین
اعلانهای
تابعی
پیشنمونهٔ
تابع را
ارائه
نمیدهند و
از بیشتر
بررسیهای
نوع در
فراخوانیهای
تابع
جلوگیری
میکنند.
این هشدار بهطور پیشفرض فعال است. در C99 و گویشهای بعدی C، این مورد به عنوان خطا در نظر گرفته میشود. این خطا را میتوان با استفاده از -fpermissive (به همراه برخی خطاهای دیگر) یا صرفاً برای همین خطا با -Wno-error=declaration-missing-parameter-type به یک هشدار تنزل داد.
این هشدار با -pedantic-errors به یک خطا ارتقا مییابد.
- -Wmissing-prototypes (فقط C و Objective-C)
- اگر یک تابع سراسری (global) بدون اعلان پیشنمونهٔ قبلی تعریف شود، هشدار میدهد. این هشدار حتی در صورتی که خودِ تعریفْ یک پیشنمونه ارائه دهد نیز صادر میشود. از این گزینه برای شناسایی توابع سراسری که فاقد اعلان پیشنمونهٔ متناظر در یک فایل سرایند هستند، استفاده کنید. این گزینه برای C++ معتبر نیست زیرا همهٔ اعلانهای توابعْ پیشنمونه ارائه میدهند و یک اعلان نامطابق، به جای تداخل با اعلانی پیشین، یک بارگذاری اضافی (overload) اعلان میکند. برای شناسایی اعلانهای ناموجود در C++، از -Wmissing-declarations استفاده کنید.
- -Wmissing-variable-declarations (فقط C و Objective-C)
- اگر یک متغیر سراسری بدون اعلان قبلی تعریف شود، هشدار میدهد. از این گزینه برای شناسایی متغیرهای سراسری که فاقد اعلان extern متناظر در یک فایل سرایند هستند، استفاده کنید.
- -Wmissing-declarations
- اگر یک تابع
سراسری
بدون اعلان
قبلی تعریف
شود، هشدار
میدهد. این
کار حتی اگر
خودِ
تعریفْ یک
پیشنمونه
ارائه دهد
نیز انجام
میشود. از
این گزینه
برای
شناسایی
توابع
سراسری که
در
فایلهای
سرایند
اعلان
نشدهاند
استفاده
کنید. در C،
هیچ هشداری
برای
توابعی که
دارای
اعلانهای
غیر-پیشنمونهای
قبلی هستند
صادر
نمیشود؛
برای
شناسایی
پیشنمونههای
ناموجود از
-Wmissing-prototypes
استفاده
کنید. در C++،
هیچ هشداری
برای
الگوهای
توابع (function templates)،
یا برای
توابع
درونخطی
(inline)، یا برای
توابع درون
فضاهای نام
گمنام (anonymous namespaces)
صادر
نمیشود..IP
-Wmissing-field-initializers 4 اگر
در
مقداردهی
اولیهی یک
ساختار (structure)
برخی
فیلدها جا
افتاده
باشند،
هشدار
میدهد.
برای مثال،
کد زیر موجب
چنین
هشداری
میشود،
زیرا "x.h"
به صورت
ضمنی صفر
است:
struct s { int f, g, h; }; struct s x = { 3, 4 };در C این گزینه برای مقداردهندههای اختصاصی (designated initializers) هشدار نمیدهد، بنابراین تغییر زیر هشداری ایجاد نمیکند:
struct s { int f, g, h; }; struct s x = { .f = 3, .g = 4 };در C این گزینه برای مقداردهی اولیهی صفر فراگیر { 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. }در موارد نادر ممکن است هشدارهای مثبت کاذب (false positive) رخ دهد. برای خاموش کردن این هشدار، عبارت را داخل پرانتز قرار دهید. برای مثال، مورد زیر به عنوان یک قالب در نظر گرفته میشود، حتی در حالتی که m و N اعداد صحیح هستند:
void NotATemplate (my_class t) { int N = 5; bool test = t.m < N > (0); // Treated as a template. test = (t.m < N) > (0); // Same meaning, but not treated as a template. }این هشدار میتواند با -Wno-missing-template-keyword غیرفعال شود.
- -Wno-multichar
- در صورت استفاده از یک ثابت چندنویسهای ('FOOF') هشدار نده. معمولاً این موارد نشاندهنده غلط املایی در کد کاربر هستند، زیرا مقادیر آنها وابسته به پیادهسازی (implementation-defined) است و نباید در کدهای قابلحمل استفاده شوند.
- -Wnormalized=[none|id|nfc|nfkc]
- در ISO C و ISO C++، دو
شناسه در
صورتی
متفاوت
هستند که
دنبالههای
متفاوتی از
نویسهها
باشند. با
این حال،
گاهی اوقات
هنگام
استفاده از
نویسههای
خارج از
مجموعه
نویسههای
اصلی ASCII،
ممکن است دو
دنباله
نویسهای
متفاوت
داشته
باشید که
یکسان به
نظر برسند.
برای
جلوگیری از
سردرگمی،
استاندارد
ISO 10646
مجموعهای
از قواعد
نرمالسازی
را تعریف
کرده است که
با اعمال
آنها
اطمینان
حاصل
میشود دو
دنباله با
ظاهر یکسان
به یک
دنباله
یکسان
تبدیل شوند.
GCC میتواند
در صورت
استفاده از
شناسههایی
که
نرمالسازی
نشدهاند
هشدار دهد؛
این گزینه
آن هشدار را
کنترل
میکند.
چهار سطح هشدار توسط GCC پشتیبانی میشود. مقدار پیشفرض -Wnormalized=nfc است که درباره هر شناسهای که در فرم نرمالسازی شده "C" از ISO 10646 یعنی NFC نباشد هشدار میدهد. فرم NFC برای بیشتر کاربردها توصیه میشود و معادل -Wnormalized است.
متأسفانه، برخی نویسهها وجود دارند که در شناسهها طبق ISO C و ISO C++ مجاز هستند، اما وقتی به NFC تبدیل میشوند دیگر در شناسهها مجاز نیستند. یعنی هیچ راهی وجود ندارد که این نمادها را در ISO C یا C++ قابلحمل به کار برد و در عین حال تمام شناسهها در قالب NFC باشند. گزینه -Wnormalized=id هشدار مربوط به این نویسهها را سرکوب میکند. امید میرود که نسخههای آینده استانداردهای مربوطه این مسئله را اصلاح کنند، و به همین دلیل است که این گزینه حالت پیشفرض نیست.
میتوانید با نوشتن -Wnormalized=none یا -Wno-normalized این هشدار را برای تمام نویسهها غیرفعال کنید. تنها زمانی باید این کار را انجام دهید که از طرح نرمالسازی دیگری (مانند "D") استفاده میکنید، زیرا در غیر این صورت ممکن است به سادگی باگهایی ایجاد کنید که به معنای واقعی کلمه با چشم دیده نمیشوند.
برخی نویسهها در ISO 10646 معانی متمایزی دارند اما در برخی قلمها یا روشهای نمایش، به ویژه پس از اعمال قالببندی، کاملاً یکسان به نظر میرسند. برای مثال "\u207F" یا "SUPERSCRIPT LATIN SMALL LETTER N"، دقیقاً مانند یک "n" معمولی نمایش داده میشود که در بالانویس قرار گرفته است. استاندارد ISO 10646 طرح نرمالسازی NFKC را نیز برای تبدیل همه این موارد به یک فرم استاندارد تعریف کرده است، و اگر از -Wnormalized=nfkc استفاده کنید، در صورتی که کد شما در قالب NFKC نباشد GCC هشدار میدهد. این هشدار شبیه به هشدار دادن درباره هر شناسهای است که حاوی حرف O باشد فقط به این دلیل که ممکن است با رقم 0 اشتباه گرفته شود، به همین دلیل پیشفرض نیست؛ اما اگر محیط برنامهنویسی نتواند برای نمایش متمایز این نویسهها اصلاح شود، ممکن است به عنوان یک قاعدهی کدنویسی محلی مفید باشد.
- -Wno-attribute-warning
- درباره استفاده از توابعی که با صفت "warning" اعلان شدهاند هشدار نده. به طور پیشفرض، این هشدار فعال است. -Wno-attribute-warning میتواند برای غیرفعال کردن هشدار، یا -Wno-error=attribute-warning برای جلوگیری از خطا شدن آن هنگام کامپایل با پرچم -Werror به کار رود.
- -Wno-deprecated
- درباره
استفاده از
ویژگیهای
منسوخشده
هشدار نده.
در C++، مشخص کردن صریح -Wdeprecated همچنین هشدارهایی را درباره برخی از امکاناتی که در استانداردهای بعدی زبان منسوخ شدهاند فعال میکند، به ویژه -Wcomma-subscript، -Wvolatile، -Wdeprecated-enum-float-conversion، -Wdeprecated-enum-enum-conversion، -Wdeprecated-literal-operator و -Wdeprecated-variadic-comma-omission.
- -Wno-deprecated-declarations
- درباره استفاده از توابع، متغیرها یا انواع نشانهگذاریشده با صفت "deprecated" هشدار نده.
- -Wno-deprecated-openmp
- درباره کدهای منسوخشده OpenMP هشدار نده.
- -Wno-overflow
- درباره سرریز زمان کامپایل در عبارتهای ثابت هشدار نده.
- -Wno-odr
- درباره نقضهای قاعده یک تعریف (One Definition Rule) در طول بهینهسازی زمان پیوند هشدار میدهد. به طور پیشفرض فعال است.
- -Wopenacc-parallelism
- درباره انتخابهای بالقوه نامطلوب و غیربهینه مرتبط با موازیسازی OpenACC هشدار میدهد.
- -Wno-openmp
- درباره کدهای مشکوک در OpenMP هشدار میدهد.
- -Wopenmp-simd
- اگر مدل هزینه بردارساز (vectorizer cost model) دستورالعمل simd مربوط به OpenMP تنظیمشده توسط کاربر را نادیده بگیرد، هشدار میدهد. گزینه -fsimd-cost-model=unlimited میتواند برای تعدیل مدل هزینه استفاده شود.
- -Woverride-init (تنها در C و Objective-C)
- اگر هنگام
استفاده از
مقداردهندههای
اختصاصی،
یک فیلد
مقداردهیشدهی
بدون اثر
جانبی
بازنویسی
شود، هشدار
میدهد.
این هشدار در -Wextra گنجانده شده است. برای دریافت سایر هشدارهای -Wextra بدون این مورد، از -Wextra -Wno-override-init استفاده کنید..IP "-Wno-override-init-side-effects (تنها C و Objective-C)" 4 اگر هنگام استفاده از مقداردهندههای اولیهی معین (designated initializers)، یک فیلد مقداردهیشده که دارای عوارض جانبی (side effects) است بازنویسی شود، هشدار نده. این هشدار بهطور پیشفرض فعال است.
- -Wpacked
- هشدار
میدهد اگر
به یک
ساختار
ویژگی packed
داده شود،
اما این
ویژگی packed هیچ
تأثیری بر
ساختاربندی
یا اندازهٔ
ساختار
نداشته
باشد. چنین
ساختارهایی
ممکن است با
سود اندک
دچار
ناهمترازی
شوند. برای
نمونه، در
این کد،
متغیر
"f.x" در
"struct bar"
ناهمتراز
است با
اینکه خود
"struct bar"
ویژگی packed را
ندارد:
struct foo { int x; char a, b, c, d; } __attribute__((packed)); struct bar { char z; struct foo f; }; - -Wnopacked-bitfield-compat
- سریهای
۴.۱، ۴.۲ و ۴.۳
از GCC ویژگی
"packed" را
روی
میدانهای
بیتی (bit-fields) از
نوع "char"
نادیده
میگیرند.
این مشکل در
GCC 4.4 برطرف شد
اما این
تغییر
میتواند
منجر به
تفاوتهایی
در چیدمان
ساختار شود.
GCC زمانی که
آفست چنین
فیلدی در GCC 4.4
تغییر کرده
باشد به شما
اطلاع
میدهد.
برای
نمونه، در
این ساختار
دیگر یک
فاصلهگذاری
(padding) ۴ بیتی
بین فیلد
"a" و
"b" وجود
ندارد:
struct foo { char a:4; char b:8; } __attribute__ ((packed));این هشدار بهطور پیشفرض فعال است. برای غیرفعال کردن این هشدار از -Wno-packed-bitfield-compat استفاده کنید.
- -Wpacked-not-aligned (تنها C، C++، Objective-C و Objective-C++)
- هشدار
میدهد اگر
فیلدی از
ساختار با
همترازی
مشخصشدهٔ
صریح، در یک
struct یا union
فشردهشده
(packed)
ناهمتراز
باشد. برای
نمونه، در
این کد
هشداری
برای "struct
S" به شکل
"warning: alignment 1 of 'struct S' is less than
8" صادر
خواهد شد:
struct __attribute__ ((aligned (8))) S8 { char a[8]; }; struct __attribute__ ((packed)) S { struct S8 s8; };این هشدار توسط -Wall فعال میشود.
- -Wpadded
- هشدار میدهد اگر فاصلهگذاری (padding) در یک ساختار گنجانده شود، چه برای همتراز کردن عنصری از ساختار یا همتراز کردن کل ساختار. گاهی اوقات هنگامی که این رخ میدهد، بازآرایی فیلدهای ساختار جهت کاهش فاصلهگذاری و در نتیجه کوچکتر ساختن ساختار امکانپذیر است.
- -Wredundant-decls
- هشدار میدهد اگر چیزی بیش از یک بار در همان حوزه (scope) اعلان شود، حتی در مواردی که اعلان چندگانه معتبر است و چیزی را تغییر نمیدهد.
- -Wrestrict
- هشدار
میدهد
هنگامی که
شیئی با
ارجاع از یک
پارامتر
دارای
توصیفگر
"restrict" (یا
در C++،
پارامتر با
توصیفگر
"__restrict")
توسط
آرگومان
دیگری نام
مستعار (alias)
شود، یا
زمانی که
رونوشتها
بین چنین
اشیائی
همپوشانی
داشته
باشند. برای
نمونه،
فراخوانی
تابع
"strcpy" در
زیر تلاش
میکند با
جایگزین
کردن
نویسههای
آغازین
رشته با
چهار
نویسهٔ
پایانی، آن
را کوتاه
کند. با این
حال، چون
این
فراخوانی
نویسهٔ
پایانی NUL را
درون "a[4]"
مینویسد،
رونوشتها
همپوشانی
پیدا کرده و
خطا در این
فراخوانی
تشخیص داده
میشود.
void foo (void) { char a[] = "abcd1234"; strcpy (a, a + 4); ... }گزینهٔ -Wrestrict حتی بدون بهینهسازی برخی نمونههای همپوشانی ساده را تشخیص میدهد، اما در -O2 و بالاتر بهترین عملکرد را دارد. این گزینه در -Wall گنجانده شده است.
- -Wnested-externs (تنها C و Objective-C)
- هشدار میدهد اگر یک اعلان "extern" درون یک تابع دیده شود.
- -Winline
- هشدار
میدهد اگر
تابعی که به
عنوان inline
اعلان شده،
نتواند
درونخط (inline)
شود. حتی با
این گزینه،
کامپایلر
دربارهٔ
عدم موفقیت
در
درونخطسازی
توابعی که
در
سرآیندهای
سیستمی
اعلان
شدهاند
هشداری
نمیدهد.
کامپایلر از روشهای اکتشافی (heuristics) متعددی برای تعیین درونخطسازی یا عدم درونخطسازی یک تابع استفاده میکند. برای نمونه، کامپایلر اندازهٔ تابعی که قرار است درونخط شود و میزان درونخطسازی انجامشده در تابع کنونی را در نظر میگیرد. بنابراین، تغییرات ظاهراً ناچیز در برنامهٔ منبع میتوانند سبب ظاهر شدن یا ناپدید شدن هشدارهای تولیدشده توسط -Winline شوند.
- -Winterference-size
- -Wno-interference-size
- دربارهٔ
استفادههای
شبههبرانگیز
از
متغیرهای
"constexpr" در C++17
یعنی
"std::hardware_destructive_interference_size"
و
"std::hardware_constructive_interference_size"
هشدار
میدهد.
این متغیرها برای کنترل چیدمان کلاس به منظور اجتناب از اشتراک کاذب (false sharing) در کدهای همروند در نظر گرفته شدهاند:
struct independent_fields { alignas(std::hardware_destructive_interference_size) std::atomic<int> one; alignas(std::hardware_destructive_interference_size) std::atomic<int> two; };در اینجا هدف این است که one و two به اندازهٔ کافی از یکدیگر فاصله داشته باشند تا نوشتن در یکی، دسترسیها به دیگری را ملزم به بارگذاری مجدد خط حافظهٔ نهان (cache line) نکند.
بهطور پیشفرض، به این متغیرها بر اساس گزینهٔ جاری -mtune مقادیری اختصاص مییابد؛ معمولاً به اندازهٔ خط حافظهٔ نهان L1 برای پردازندهٔ مقصد خاص، و گاهی به یک محدوده در صورتی که تنظیم برای یک هدف عمومی باشد. بنابراین تمام واحدهای ترجمهای (translation units) که برای استفاده از این متغیرها به سازگاری ABI وابسته هستند، باید با همان -mtune (یا -mcpu) کامپایل شوند.
اگر پایداری ABI اهمیت دارد، مانند زمانی که کاربرد در یک سرآیند برای کتابخانه است، احتمالاً اصلاً نباید از متغیرهای اندازهٔ تداخل سختافزاری استفاده کنید.
این هشدارها بهطور پیشفرض فعال هستند. اگر مطمئن هستید که استفادهٔ شما از این متغیرها بر ABI خارج از یک ساخت مجزای پروژهتان تأثیر نمیگذارد، میتوانید هشدار را با -Wno-interference-size خاموش کنید.
- -Wint-in-bool-context
- برای استفادههای مشکوک از مقادیر صحیح در مواردی که مقادیر بولی مورد انتظار است هشدار میدهد؛ مانند عبارتهای شرطی (?:) با استفاده از ثابتهای صحیح غیربولی در بافتار بولی، نظیر "if (a <= b ? 2 : 3)"؛ یا شیفت به چپ اعداد صحیح علامتدار در بافتار بولی، نظیر "for (a = 0; 1 << a; a++);". به همین ترتیب برای تمامی انواع ضربها صرفنظر از نوع داده. این هشدار توسط -Wall فعال میشود.
- -Wno-int-to-pointer-cast
- هشدارهای ناشی از تبدیل نوع (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 به یک خطا ارتقا مییابد..IP -Wvariadic-macros 4 اگر ماکروهای با تعداد آرگومان متغیر (variadic macros) در حالت ISO C90 استفاده شوند، یا ساختار جایگزین GNU در حالت ISO C99 به کار رود، هشدار میدهد. این گزینه توسط هر یک از -Wpedantic یا -Wtraditional فعال میشود. برای جلوگیری از پیامهای هشدار، از -Wno-variadic-macros استفاده کنید.
- -Wno-varargs
- در صورت استفاده مشکوک از ماکروهای مدیریت آرگومانهای متغیر مانند "va_start"، هشدار نده. این هشدارها بهطور پیشفرض فعال هستند.
- -Wvector-operation-performance
- اگر یک عملیات برداری از طریق قابلیتهای SIMD معماری پیادهسازی نشود، هشدار میدهد. عمدتاً برای تنظیم و بهبود کارایی مفید است. عملیات برداری میتواند بهصورت "piecewise" (تکهبهتکه) پیادهسازی شود، به این معنی که عملیات اسکالر روی هر عنصر بردار انجام میشود؛ "in parallel" (موازی)، به این معنی که عملیات برداری با استفاده از اسکالرهای از نوع عریضتر پیادهسازی میشود، که معمولاً از نظر کارایی بهینهتر است؛ و "as a single scalar" (بهعنوان یک اسکالر منفرد)، به این معنی که بردار در یک نوع اسکالر جا میشود.
- -Wvla
- اگر یک
آرایه با
طول متغیر
(variable-length array) در کد
استفاده
شود، هشدار
میدهد. -Wno-vla
از هشدار
-Wpedantic برای
آرایههای
با طول
متغیر
جلوگیری
میکند.
این هشدار با -pedantic-errors به یک خطا ارتقا مییابد.
- -Wvla-larger-than=byte-size
- اگر از این
گزینه
استفاده
شود،
کامپایلر
برای اعلان
آرایههای
با طول
متغیری که
اندازه
آنها
نامحدود
است، یا
محدود به
آرگومانی
است که
اجازه
میدهد
اندازه
آرایه از byte-size
بایت فراتر
رود، هشدار
میدهد. این
شبیه به
نحوه
کارکرد
-Walloca-larger-than=byte-size
است، اما
برای
آرایههای
با طول
متغیر.
توجه داشته باشید که GCC ممکن است آرایههای با طول متغیر کوچک با مقدار مشخص را به آرایههای معمولی بهینهسازی کند، بنابراین ممکن است این هشدار برای چنین آرایههایی صادر نشود.
گزینه -Wvla-larger-than=PTRDIFF_MAX بهطور پیشفرض فعال است اما معمولاً تنها زمانی مؤثر است که -ftree-vrp فعال باشد (پیشفرض برای -O2 و بالاتر).
همچنین ببینید: -Walloca-larger-than=byte-size.
- -Wno-vla-larger-than
- هشدارهای -Wvla-larger-than= را غیرفعال میکند. این گزینه معادل -Wvla-larger-than=SIZE_MAX یا بزرگتر است.
- -Wvla-parameter
- درباره
اعلانهای
مجدد
توابعی که
شامل
آرگومانهایی
از نوع
آرایه با
طول متغیر (VLA)
با انواع یا
اَشکال
ناهمسان
هستند
هشدار
میدهد، و
امکان
تشخیص
دسترسیهای
خارج از
محدوده به
چنین
پارامترهایی
را توسط
هشدارهایی
مانند -Warray-bounds
فعال
میکند.
اگر نخستین اعلان تابع از شکل VLA استفاده کند، کران مشخصشده در آرایه به عنوان حداقل تعداد عناصر مورد انتظار برای ارائه در فراخوانیهای تابع و حداکثر تعداد عناصری که توسط آن قابل دسترسی است در نظر گرفته میشود. عدم ارائه آرگومانهایی با اندازه کافی یا دسترسی به بیش از حداکثر تعداد عناصر ممکن است شناسایی شود.
به عنوان مثال، هشدار برای اعلانهای مجدد زیر فعال میشود زیرا اولی اجازه میدهد آرایهای با هر اندازهای به "f" ارسال شود در حالی که دومی مشخص میکند آرگومان آرایه باید حداقل "n" عنصر داشته باشد. علاوه بر این، فراخوانی "f" با پارامتر کران VLA مرتبط فراتر از کران واقعی VLA نیز باعث صدور هشدار میشود.
void f (int n, int[n]); // warning: argument 2 previously declared as a VLA void f (int, int[]); void g (int n) { if (n > 4) return; int a[n]; // warning: access to a by f may be out of bounds f (sizeof a, a); ... }گزینه -Wvla-parameter در -Wall گنجانده شده است. گزینه -Warray-parameter هشدارهایی را برای مشکلات مشابه شامل آرگومانهای آرایه معمولی فعال میکند.
- -Wvolatile-register-var
- اگر یک متغیر ثبات (register) بهصورت volatile اعلان شود، هشدار میدهد. اصلاحکننده volatile از تمام بهینهسازیهایی که ممکن است خواندن و/یا نوشتن روی متغیرهای ثبات را حذف کنند جلوگیری نمیکند. این هشدار توسط -Wall فعال میشود.
- -Wno-xor-used-as-pow (تنها C، C++، Objective-C و Objective-C++)
- هشدارهای
مربوط به
استفاده از
"^"
(عملگر XOR) را
در مواردی
که به نظر
میرسد
منظور کد
توانرسانی
بوده است،
غیرفعال
میکند. به
طور خاص،
هشدار
زمانی رخ
میدهد که
سمت چپ ثابت
دهدهی ۲ یا
۱۰ باشد و
سمت راست
نیز یک ثابت
دهدهی
باشد.
در C و C++، عملگر "^" به معنای XOR است، در حالی که در برخی زبانهای دیگر (مانند TeX و برخی نگارشهای BASIC) به معنای توانرسانی است.
این هشدار را میتوان با تبدیل یکی از عملوندها به هگزادسیمال و همچنین با کامپایل کردن با -Wno-xor-used-as-pow بیصدا کرد.
- -Wdisabled-optimization
- اگر یک مرحله (pass) بهینهسازی درخواستی غیرفعال شده باشد، هشدار میدهد. این هشدار عموماً به این معنا نیست که مشکلی در کد شما وجود دارد؛ بلکه صرفاً نشان میدهد که بهینهسازهای GCC قادر به مدیریت مؤثر کد نیستند. اغلب، مشکل این است که کد شما بسیار بزرگ یا بیش از حد پیچیده است؛ GCC زمانی که احتمال داده شود خودِ بهینهسازی زمان فوقالعاده زیادی صرف خواهد کرد، از بهینهسازی برنامهها خودداری میکند.
- -Wpointer-sign (تنها C و Objective-C)
- برای ارسال
یا انتساب
آرگومانهای
اشارهگر
با
علامتداری
(signedness) متفاوت،
هشدار
میدهد. این
گزینه تنها
برای C و Objective-C
پشتیبانی
میشود. این
هشدار به
طور ضمنی
توسط -Wall و -Wpedantic
فعال
میشود، و
میتوان آن
را با -Wno-pointer-sign
غیرفعال
کرد.
این هشدار با -pedantic-errors به یک خطا ارتقا مییابد.
- -Wstack-protector
- این گزینه تنها زمانی فعال است که -fstack-protector فعال باشد. این گزینه درباره توابعی که در برابر تخریب پشته (stack smashing) محافظت نشدهاند هشدار میدهد.
- -Woverlength-strings
- درباره
ثابتهای
رشتهای که
از طول
«حداقلِ
حداکثر»
مشخصشده
در
استاندارد C
طولانیتر
هستند
هشدار
میدهد.
کامپایلرهای
مدرن
معمولاً
اجازه
میدهند
ثابتهای
رشتهای
بسیار
طولانیتر
از حد مجاز
استاندارد
باشند، اما
برنامههای
بسیار
قابلحمل
(portable) باید از
استفاده از
رشتههای
طولانیتر
خودداری
کنند.
این محدودیت پس از الحاق ثابتهای رشتهای اعمال میشود، و نویسه تهی پایانی (NUL) را به حساب نمیآورد. در C90، این محدودیت ۵۰۹ نویسه بود؛ در C99، به ۴۰۹۵ افزایش یافت. C++98 یک حداقلِ حداکثرِ هنجاری تعیین نمیکند، بنابراین رشتههای با طول بیش از حد در C++ بررسی نمیشوند.
این گزینه به طور ضمنی توسط -Wpedantic فعال میشود، و میتوان آن را با -Wno-overlength-strings غیرفعال کرد.
- -Wunsuffixed-float-constants (تنها C و Objective-C)
- برای هر ثابت ممیز شناوری که فاقد پسوند است یک هشدار صادر میکند. هنگامی که همراه با -Wsystem-headers استفاده شود، درباره چنین ثابتهایی در فایلهای سرآیند سیستم نیز هشدار میدهد. این گزینه میتواند هنگام آمادهسازی کد برای استفاده با پراگمای "FLOAT_CONST_DECIMAL64" از افزونه ممیز شناور دهدهی در C99 مفید باشد.
- -Wno-lto-type-mismatch
- در طول بهینهسازی زمان پیوند (LTO)، درباره عدم تطابق نوع در اعلانهای سراسری از واحدهای کامپایل مختلف هشدار نده. نیازمند فعال بودن -flto است. بهطور پیشفرض فعال است.
- -Wno-designated-init (تنها C و Objective-C)
- هنگامی که از یک مقداردهی اولیهکننده موضعی (positional initializer) برای مقداردهی ساختاری که با مشخصه "designated_init" نشانهگذاری شده است استفاده میشود، هشدارها را فرو مینشاند..SS "گزینههای واپایش تحلیل ایستا (Options That Control Static Analysis)"
- -fanalyzer
- این گزینه
یک تحلیل
ایستا را بر
روی جریان
برنامه
فعال
میکند که
به دنبال
مسیرهای
بینروالی
(interprocedural) «جالب»
درون کد
میگردد و
برای
مشکلات
یافتشده
در آنها
هشدار صادر
میکند.
این تحلیل نسبت به سایر هشدارهای GCC پردازش بسیار سنگینتر و پرهزینهتری دارد.
از دید فنی، این گزینه یک اجرای نمادین مبتنی بر پوشش (coverage-guided symbolic execution) را روی کد در حال کامپایل انجام میدهد. این تحلیل نه معتبر (sound) است و نه کامل (complete): میتواند دارای مثبت کاذب (false positive) و منفی کاذب (false negative) باشد. این ابزار به جای اثبات درستی برنامه، ابزاری برای باگیابی است.
این تحلیلگر در این نگارش تنها برای استفاده بر روی کد C مناسب است.
فعالسازی این گزینه بهطور مؤثر هشدارهای زیر را فعال میکند:
-Wanalyzer-allocation-size -Wanalyzer-deref-before-check -Wanalyzer-double-fclose -Wanalyzer-double-free -Wanalyzer-exposure-through-output-file -Wanalyzer-exposure-through-uninit-copy -Wanalyzer-fd-access-mode-mismatch -Wanalyzer-fd-double-close -Wanalyzer-fd-leak -Wanalyzer-fd-phase-mismatch -Wanalyzer-fd-type-mismatch -Wanalyzer-fd-use-after-close -Wanalyzer-fd-use-without-check -Wanalyzer-file-leak -Wanalyzer-free-of-non-heap -Wanalyzer-imprecise-fp-arithmetic -Wanalyzer-infinite-loop -Wanalyzer-infinite-recursion -Wanalyzer-jump-through-null -Wanalyzer-malloc-leak -Wanalyzer-mismatching-deallocation -Wanalyzer-null-argument -Wanalyzer-null-dereference -Wanalyzer-out-of-bounds -Wanalyzer-overlapping-buffers -Wanalyzer-possible-null-argument -Wanalyzer-possible-null-dereference -Wanalyzer-putenv-of-auto-var -Wanalyzer-shift-count-negative -Wanalyzer-shift-count-overflow -Wanalyzer-stale-setjmp-buffer -Wanalyzer-tainted-allocation-size -Wanalyzer-tainted-array-index -Wanalyzer-tainted-assertion -Wanalyzer-tainted-divisor -Wanalyzer-tainted-offset -Wanalyzer-tainted-size -Wanalyzer-throw-of-unexpected-type -Wanalyzer-undefined-behavior-ptrdiff -Wanalyzer-undefined-behavior-strtok -Wanalyzer-unsafe-call-within-signal-handler -Wanalyzer-use-after-free -Wanalyzer-use-of-pointer-in-stale-stack-frame -Wanalyzer-use-of-uninitialized-value -Wanalyzer-va-arg-type-mismatch -Wanalyzer-va-list-exhausted -Wanalyzer-va-list-leak -Wanalyzer-va-list-use-after-va-end -Wanalyzer-write-to-const -Wanalyzer-write-to-string-literal
این گزینه تنها زمانی در دسترس است که GCC با پشتیبانی فعال از تحلیلگر (analyzer) پیکربندی شده باشد.
- -Wanalyzer-symbol-too-complex
- اگر -fanalyzer
فعال باشد،
تحلیلگر
از روشهای
اکتشافی (heuristics)
گوناگونی
برای تلاش
در جهت
ردیابی
وضعیت
حافظه
استفاده
میکند،
اما کدهای
بیش از حد
پیچیده
میتوانند
این
سازوکارها
را ناکام
بگذارند.
بهطور پیشفرض، اگر عبارتها از یک حد درونی فراتر روند، تحلیل بدون اعلام خطا ردیابی مقادیر آنها را متوقف کرده و برای چنین عبارتهایی به یک نمایش نادقیق برمیگردد. گزینهٔ -Wanalyzer-symbol-too-complex در صورت رخ دادن این موضوع هشدار میدهد.
- -Wanalyzer-too-complex
- اگر -fanalyzer
فعال باشد،
تحلیلگر
از روشهای
اکتشافی
گوناگونی
برای تلاش
در جهت کاوش
جریان
کنترل و
جریان داده
در برنامه
استفاده
میکند،
اما کدهای
بیش از حد
پیچیده
میتوانند
این
سازوکارها
را با شکست
مواجه کنند.
بهطور پیشفرض، اگر کد بیش از اندازه پیچیده باشد بهگونهای که تحلیلگر نتواند آن را بهطور کامل کاوش کند و به یک سقف درونی برسد، تحلیل بدون اعلام پیام متوقف میشود. گزینهٔ -Wanalyzer-too-complex در صورت وقوع این حالت هشدار میدهد.
- -Wno-analyzer-allocation-size
- این هشدار
به -fanalyzer نیاز
دارد که آن
را فعال
میکند؛
برای
غیرفعال
کردن آن از
-Wno-analyzer-allocation-size
استفاده
کنید.
این پیام تشخیصی دربارهٔ مسیرهایی در کد هشدار میدهد که در آنها یک اشارهگر به یک بافر طوری مقداردهی میشود که به بافری با اندازهای اشاره کند که مضربی از "sizeof (*pointer)" نیست.
ببینید: CWE-131: Incorrect Calculation of Buffer Size ("https://cwe.mitre.org/data/definitions/131.html").
- -Wno-analyzer-deref-before-check
- این هشدار
به -fanalyzer نیاز
دارد که آن
را فعال
میکند؛
برای
غیرفعال
کردن آن از
-Wno-analyzer-deref-before-check
استفاده
کنید.
این پیام تشخیصی برای مسیرهایی در کد هشدار میدهد که در آنها یک اشارهگر *پس از* ارجاعزدایی (dereference) شدن، برای مقدار "NULL" بررسی میشود؛ این موضوع نشان میدهد که اشارهگر احتمالاً میتوانسته NULL باشد. چنین مواردی بیانگر آن است که بررسی برای NULL یا زائد است، یا باید به پیش از ارجاعزدایی اشارهگر منتقل شود.
این پیام تشخیصی همچنین مقادیر ارسالی به آرگومان تابعی را که با "__attribute__((nonnull))" مشخص شدهاند، نیازمند مقدار غیر-NULL در نظر میگیرد؛ بنابراین اگر چنین مقادیری پس از بازگشت از فراخوانی آن تابع برای "NULL" بررسی شوند، هشدار صادر میکند.
احتمال گزارش این پیام تشخیصی در صورت فعال بودن هر سطحی از بهینهسازی کم است، چرا که منطق بهینهسازی GCC بهطور معمول چنین بررسیهایی را برای NULL زائد در نظر گرفته و پیش از آنکه تحلیلگر آنها را «ببیند»، با بهینهسازی حذفشان میکند. از این رو هنگام تلاش برای راهاندازی این پیام تشخیصی، بهینهسازی باید غیرفعال باشد.
- -Wno-analyzer-double-fclose
- این هشدار
به -fanalyzer نیاز
دارد که آن
را فعال
میکند؛
برای
غیرفعال
کردن آن از
-Wno-analyzer-double-fclose
استفاده
کنید.
این پیام تشخیصی دربارهٔ مسیرهایی در کد هشدار میدهد که در آنها ممکن است تابع "fclose" بیش از یک بار روی یک "FILE *" فراخوانی شود.
ببینید: CWE-1341: Multiple Releases of Same Resource or Handle ("https://cwe.mitre.org/data/definitions/1341.html").
- -Wno-analyzer-double-free
- این هشدار
به -fanalyzer نیاز
دارد که آن
را فعال
میکند؛
برای
غیرفعال
کردن آن از
-Wno-analyzer-double-free
استفاده
کنید.
این پیام تشخیصی برای مسیرهایی در کد هشدار میدهد که در آنها ممکن است یک تابع آزادسازی (deallocator) بیش از یک بار روی یک اشارهگر فراخوانی شود؛ خواه این تابع "free" باشد و خواه یک آزادساز که با صفت "malloc" مشخص شده است.
ببینید: CWE-415: Double Free ("https://cwe.mitre.org/data/definitions/415.html").
- -Wno-analyzer-exposure-through-output-file
- این هشدار
به -fanalyzer نیاز
دارد که آن
را فعال
میکند؛
برای
غیرفعال
کردن آن از
-Wno-analyzer-exposure-through-output-file
استفاده
کنید.
این پیام تشخیصی دربارهٔ مسیرهایی درون کد هشدار میدهد که در آنها یک مقدار حساس از نظر امنیتی در یک فایل خروجی نوشته میشود (مانند نوشتن گذرواژه در یک فایل لاگ).
ببینید: CWE-532: Information Exposure Through Log Files ("https://cwe.mitre.org/data/definitions/532.html").
- -Wanalyzer-exposure-through-uninit-copy
- این هشدار
هم به -fanalyzer و
هم به
استفاده از
یک پلاگین
نیاز دارد
تا تابعی را
مشخص کند که
دادهها را
از میان یک
«مرز
اعتماد»
کپی میکند.
برای
غیرفعال
کردن آن از
-Wno-analyzer-exposure-through-uninit-copy
استفاده
کنید.
این پیام تشخیصی دربارهٔ «نشت اطلاعات» (infoleaks) هشدار میدهد - مسیرهایی درون کد که در آنها مقادیر مقداردهینشده از میان یک مرز امنیتی کپی میشوند (مانند کدی در هستهٔ سیستمعامل که یک ساختار با مقداردهی اولیهٔ ناقص را از روی پشته به فضای کاربر کپی میکند).
ببینید: CWE-200: Exposure of Sensitive Information to an Unauthorized Actor ("https://cwe.mitre.org/data/definitions/200.html").
- -Wno-analyzer-fd-access-mode-mismatch
- این هشدار
به -fanalyzer نیاز
دارد که آن
را فعال
میکند؛
برای
غیرفعال
کردن آن از
-Wno-analyzer-fd-access-mode-mismatch
استفاده
کنید.
این پیام تشخیصی برای مسیرهایی درون کد هشدار میدهد که در آنها تلاش شده یک "read" روی یک توصیفگر فایل فقطنوشتنی انجام شود، یا برعکس.
این پیام تشخیصی همچنین دربارهٔ مسیرهایی از کد هشدار میدهد که در آنها تابعی با صفت "fd_arg_read (N)" همراه با توصیفگر فایلی که با "O_WRONLY" باز شده در آرگومان ارجاعشدهٔ "N" فراخوانی شده است، یا تابعی با صفت "fd_arg_write (N)" همراه با توصیفگر فایلی که با "O_RDONLY" باز شده در آرگومان ارجاعشدهٔ N فراخوانی شده است.
- -Wno-analyzer-fd-double-close
- این هشدار
به -fanalyzer نیاز
دارد که آن
را فعال
میکند؛
برای
غیرفعال
کردن آن از
-Wno-analyzer-fd-double-close
استفاده
کنید.
این پیام تشخیصی برای مسیرهایی درون کد هشدار میدهد که در آنها ممکن است یک توصیفگر فایل بیش از یک بار بسته شود.
ببینید: CWE-1341: Multiple Releases of Same Resource or Handle ("https://cwe.mitre.org/data/definitions/1341.html")..IP -Wno-analyzer-fd-leak 4 این هشدار نیازمند -fanalyzer است که آن را فعال میکند؛ برای غیرفعال کردن آن از -Wno-analyzer-fd-leak استفاده کنید.
این پیام تشخیصی درباره مسیرهایی در کد هشدار میدهد که در آنها یک توصیفگر فایل (file descriptor) باز نشت پیدا کرده است.
ببینید CWE-775: Missing Release of File Descriptor or Handle after Effective Lifetime ("https://cwe.mitre.org/data/definitions/775.html").
- -Wno-analyzer-fd-phase-mismatch
- این هشدار
نیازمند -fanalyzer
است که آن
را فعال
میکند؛
برای
غیرفعال
کردن آن از
-Wno-analyzer-fd-phase-mismatch
استفاده
کنید.
این پیام تشخیصی درباره مسیرهایی در کد هشدار میدهد که در آنها عملیاتی در فاز (مرحله) نادرستی از چرخه حیات توصیفگر فایل انجام شده است. به عنوان مثال، در صورت تلاش برای فراخوانی "accept" روی یک سوکت جریانی (stream socket) که هنوز "listen" با موفقیت روی آن فراخوانی نشده است، هشدار میدهد.
ببینید CWE-666: Operation on Resource in Wrong Phase of Lifetime ("https://cwe.mitre.org/data/definitions/666.html").
- -Wno-analyzer-fd-type-mismatch
- این هشدار
نیازمند -fanalyzer
است که آن
را فعال
میکند؛
برای
غیرفعال
کردن آن از
-Wno-analyzer-fd-type-mismatch
استفاده
کنید.
این پیام تشخیصی درباره مسیرهایی در کد هشدار میدهد که در آنها عملیاتی روی نوع نادرستی از توصیفگر فایل انجام شده است. به عنوان مثال، در صورت تلاش برای استفاده از عملیات سوکت روی توصیفگر فایلی که از طریق "open" به دست آمده است، یا هنگام تلاش برای استفاده از عملیات سوکت جریانی روی یک سوکت دادهگرام (datagram socket)، هشدار میدهد.
- -Wno-analyzer-fd-use-after-close
- این هشدار
نیازمند -fanalyzer
است که آن
را فعال
میکند؛
برای
غیرفعال
کردن آن از
-Wno-analyzer-fd-use-after-close
استفاده
کنید.
این پیام تشخیصی درباره مسیرهایی در کد هشدار میدهد که در آنها خواندن یا نوشتن روی یک توصیفگر فایل بسته شده فراخوانی میشود.
این پیام تشخیصی همچنین درباره مسیرهایی در کد هشدار میدهد که در آنها تابعی با مشخصه "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
استفاده
کنید.
این پیام تشخیصی درباره مسیرهایی در کد هشدار میدهد که در آنها یک شیء جریان "<stdio.h>" "FILE *" نشت پیدا کرده است.
ببینید CWE-775: Missing Release of File Descriptor or Handle after Effective Lifetime ("https://cwe.mitre.org/data/definitions/775.html").
- -Wno-analyzer-free-of-non-heap
- این هشدار
نیازمند -fanalyzer
است که آن
را فعال
میکند؛
برای
غیرفعال
کردن آن از
-Wno-analyzer-free-of-non-heap
استفاده
کنید.
این پیام تشخیصی درباره مسیرهایی در کد هشدار میدهد که در آنها "free" روی یک اشارهگر غیرِ هیپ (غیر heap) فراخوانی میشود (مانند یک بافر روی پشته، یا یک متغیر سراسری).
ببینید CWE-590: Free of Memory not on the Heap ("https://cwe.mitre.org/data/definitions/590.html").
- -Wno-analyzer-imprecise-fp-arithmetic
- این هشدار
نیازمند -fanalyzer
است که آن
را فعال
میکند؛
برای
غیرفعال
کردن آن از
-Wno-analyzer-imprecise-fp-arithmetic
استفاده
کنید.
این پیام تشخیصی درباره مسیرهایی در کد هشدار میدهد که در آنها محاسبات ممیز شناور (floating-point) در مکانهایی که به محاسبات دقیق نیاز است استفاده شده است. این پیام تشخیصی در حال حاضر فقط در صورت استفاده از عملوندهای ممیز شناور درون محاسبه اندازه تخصیص حافظه هشدار میدهد.
- -Wno-analyzer-infinite-loop
- این هشدار
نیازمند -fanalyzer
است که آن
را فعال
میکند؛
برای
غیرفعال
کردن آن از
-Wno-analyzer-infinite-loop به
کار ببرید.
این پیام تشخیصی درباره مسیرهایی در کد هشدار میدهد که به نظر میرسد به یک حلقه بینهایت منجر میشوند.
بهطور خاص، تحلیلگر زمانی این هشدار را صادر میکند که حلقهای را «مشاهده کند» که در آن:
- هیچ کار قابلمشاهدهای از بیرون در داخل حلقه انجام نشود
- هیچ راهی برای خروج از حلقه وجود نداشته باشد
- تحلیلگر به اندازه کافی درباره وضعیت برنامه در سرتاسر حلقه اطمینان داشته باشد که بداند موارد فوق درست هستند
یک حالت برای صدور این هشدار زمانی است که یک مسیر اجرایی در حلقه وجود داشته باشد که طی کردن آن مسیر در یک دور حلقه (iteration) به این معنی باشد که همان مسیر در تمام دورهای بعدی نیز پیموده خواهد شد.
به عنوان مثال، قطعهکد زیر را در نظر بگیرید:
while (1)
{
char opcode = *cpu_state.pc;
switch (opcode)
{
case OPCODE_FOO:
handle_opcode_foo (&cpu_state);
break;
case OPCODE_BAR:
handle_opcode_bar (&cpu_state);
break;
}
}
تحلیلگر در مورد حالت بالا اخطار خواهد داد زیرا اگر "opcode" با هیچیک از حالات تطابق نداشته باشد، دستور "switch" حالت ضمنی "default" را طی میکند، که باعث میشود بدنه حلقه با بدون تغییر ماندن "cpu_state.pc" به یک «دستور بیاثر» (no-op) تبدیل شود، و در نتیجه از همان مقدار "opcode" در تمام تکرارهای بعدی استفاده شده و منجر به یک حلقه بینهایت میشود.
ببینید CWE-835: Loop with Unreachable Exit Condition ('Infinite Loop') ("https://cwe.mitre.org/data/definitions/835.html").
- -Wno-analyzer-infinite-recursion
- این هشدار
نیازمند -fanalyzer
است که آن
را فعال
میکند؛
برای
غیرفعال
کردن آن از
-Wno-analyzer-infinite-recursion به
کار ببرید.
این پیام تشخیصی درباره مسیرهایی در کد هشدار میدهد که به نظر میرسد به بازگشت بینهایت (infinite recursion) منجر میشوند.
بهطور خاص، هنگامی که تحلیلگر یک فراخوانی بازگشتی را «مشاهده میکند»، وضعیت حافظه در ورودی چارچوب (frame) جدید را با وضعیت آن در ورودی چارچوب قبلی آن تابع روی پشته مقایسه میکند. در صورتی که به نظر برسد هیچ چیزی در حافظه تغییر نمیکند، این هشدار صادر میشود؛ هرگونه تغییر مشاهدهشده در پارامترها یا متغیرهای سراسری به عنوان عواملی فرض میشوند که به پایان بازگشت ختم شده و در نتیجه مانع از صدور هشدار میشوند.
این پیام تشخیصی احتمالاً مواردی از بازگشت بینهایت را که پیش از آنکه تحلیلگر آنها را «ببیند» توسط بهینهساز (optimizer) به تکرار (iteration) تبدیل شدهاند از دست میدهد. از این رو، هنگام تلاش برای فعالسازی این بررسی تشخیصی، بهینهسازی باید غیرفعال شود.
با -Winfinite-recursion مقایسه شود، که بررسی تشخیصی مشابهی ارائه میدهد، اما به شیوه متفاوتی پیادهسازی شده است.
ببینید CWE-674: Uncontrolled Recursion ("https://cwe.mitre.org/data/definitions/674.html").
- -Wno-analyzer-jump-through-null
- این هشدار
نیازمند -fanalyzer
است که آن
را فعال
میکند؛
برای
غیرفعال
کردن آن از
-Wno-analyzer-jump-through-null
استفاده
کنید.
این پیام تشخیصی درباره مسیرهایی در کد هشدار میدهد که در آنها یک اشارهگر تابع "NULL" فراخوانی میشود.
- -Wno-analyzer-malloc-leak
- این هشدار
نیازمند -fanalyzer
است که آن
را فعال
میکند؛
برای
غیرفعال
کردن آن از
-Wno-analyzer-malloc-leak
استفاده
کنید.
این پیام تشخیصی درباره مسیرهایی در کد هشدار میدهد که در آنها اشارهگری که از طریق یک تخصیصدهنده (allocator) تخصیص یافته نشت پیدا کرده است: چه "malloc"، و چه تابعی که با مشخصه "malloc" علامتگذاری شده است.
ببینید CWE-401: Missing Release of Memory after Effective Lifetime ("https://cwe.mitre.org/data/definitions/401.html")..IP -Wno-analyzer-mismatching-deallocation 4 این هشدار نیازمند -fanalyzer است که آن را فعال میکند؛ برای غیرفعال کردن آن از -Wno-analyzer-mismatching-deallocation استفاده کنید.
این هشدار تشخیصی دربارهٔ مسیرهایی درون کد هشدار میدهد که در آنها بر اساس تابعی که برای تخصیص مقدار اشارهگر به کار رفته، تابع آزادسازی اشتباهی روی آن فراخوانی شده است. این پیام تشخیصی در مورد عدم تطابق بین "free"، عملگر اسکالر "delete" و عملگر برداری "delete[]"، و مواردی که با استفاده از مشخصهٔ "malloc" به عنوان جفتهای تخصیصدهنده/آزادساز مشخص شدهاند هشدار خواهد داد.
ببینید: CWE-762: Mismatched Memory Management Routines ("https://cwe.mitre.org/data/definitions/762.html").
- -Wno-analyzer-out-of-bounds
- این هشدار
نیازمند -fanalyzer
است که آن
را فعال
میکند؛
برای
غیرفعال
کردن آن از
-Wno-analyzer-out-of-bounds
استفاده
کنید.
این هشدار تشخیصی دربارهٔ مسیرهایی درون کد هشدار میدهد که در آنها قطعاً خواندن یا نوشتن خارج از محدودهٔ بافر رخ میدهد. این پیام تشخیصی در مواردی اعمال میشود که تحلیلگر قادر به تعیین یک آفست ثابت باشد و برای دسترسیهای فراتر از انتهای بافر، ظرفیت ثابتی را نیز تعیین کند. افزون بر این، هنگامی که آفست و ظرفیت هر دو نمادین (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 است ارجاعزدایی میشود.
ببینید: CWE-476: NULL Pointer Dereference ("https://cwe.mitre.org/data/definitions/476.html").
- -Wno-analyzer-putenv-of-auto-var
- این هشدار
نیازمند -fanalyzer
است که آن
را فعال
میکند؛
برای
غیرفعال
کردن آن از
-Wno-analyzer-putenv-of-auto-var
استفاده
کنید.
این هشدار تشخیصی دربارهٔ مسیرهایی درون کد هشدار میدهد که در آنها در فراخوانی "putenv"، اشارهگری به یک متغیر محلی خودکار (automatic) یا یک بافر روی پشته (on-stack) فرستاده شده است.
ببینید: POS34-C. Do not call putenv() with a pointer to an automatic variable as the argument ("https://wiki.sei.cmu.edu/confluence/x/6NYxBQ").
- -Wno-analyzer-shift-count-negative
- این هشدار
نیازمند -fanalyzer
است که آن
را فعال
میکند؛
برای
غیرفعال
کردن آن از
-Wno-analyzer-shift-count-negative
استفاده
کنید.
این هشدار تشخیصی دربارهٔ مسیرهایی درون کد هشدار میدهد که در آنها عمل شیفت با تعداد منفی تلاش شده است. این گزینه مشابه پیام تشخیصی -Wshift-count-negative پیادهسازیشده در فرانتاندهای C/C++ است، اما به جای تجزیهٔ صِرف درخت نحو (syntax tree)، بر پایهٔ تحلیل مسیرهای میانرویهای (interprocedural) پیاده شده است. با این حال، تحلیلگر اولویتی برای تشخیص چنین مسیرهایی قائل نمیشود، بنابراین نتایج منفی کاذب (false negatives) در مقایسه با سایر هشدارها محتملتر است.
- -Wno-analyzer-shift-count-overflow
- این هشدار
نیازمند -fanalyzer
است که آن
را فعال
میکند؛
برای
غیرفعال
کردن آن از
-Wno-analyzer-shift-count-overflow
استفاده
کنید.
این هشدار تشخیصی دربارهٔ مسیرهایی درون کد هشدار میدهد که در آنها عمل شیفت با تعدادی بزرگتر یا برابر با دقت نوع عملوند تلاش شده است. این گزینه مشابه پیام تشخیصی -Wshift-count-overflow پیادهسازیشده در فرانتاندهای C/C++ است، اما به جای تجزیهٔ صِرف درخت نحو، بر پایهٔ تحلیل مسیرهای میانرویهای پیادهسازی شده است. با این حال، تحلیلگر اولویتی برای تشخیص چنین مسیرهایی قائل نمیشود، بنابراین نتایج منفی کاذب در مقایسه با سایر هشدارها محتملتر است.
- -Wno-analyzer-stale-setjmp-buffer
- این هشدار
نیازمند -fanalyzer
است که آن
را فعال
میکند؛
برای
غیرفعال
کردن آن از
-Wno-analyzer-stale-setjmp-buffer
استفاده
کنید.
این هشدار تشخیصی دربارهٔ مسیرهایی درون کد هشدار میدهد که در آنها "longjmp" برای بازگشت به یک "jmp_buf" مربوط به یک فراخوانی "setjmp" در تابعی که بازگشته است (returned)، فراخوانی میشود.
هنگامی که "setjmp" روی یک "jmp_buf" برای ثبت موقعیت بازگشت فراخوانی میشود، فریم پشته (stack frame) را ثبت میکند. وقتی تابعی که شامل فراخوانی "setjmp" است بازمیگردد، این فریم پشته نامعتبر میشود. تلاش برای بازگشت به آن از طریق "longjmp" به فریم پشتهای ارجاع میدهد که دیگر وجود ندارد و احتمالاً منجر به فروپاشی (crash) برنامه (یا بدتر از آن) خواهد شد.
- -Wno-analyzer-tainted-allocation-size
- این هشدار
نیازمند -fanalyzer
است که آن
را فعال
میکند؛
برای
غیرفعال
کردن آن از
-Wno-analyzer-tainted-allocation-size
استفاده
کنید.
این هشدار تشخیصی دربارهٔ مسیرهایی درون کد هشدار میدهد که در آنها مقداری که میتواند تحت کنترل یک مهاجم باشد، بدون اعتبارسنجی و پاکسازی (sanitize) به عنوان اندازهٔ تخصیص حافظه استفاده شده است، بهطوری که مهاجم میتواند یک تخصیص بیش از اندازه بزرگ را تزریق کند و بهطور بالقوه باعث حملهٔ منع سرویس (DoS) شود.
ببینید: CWE-789: Memory Allocation with Excessive Size Value ("https://cwe.mitre.org/data/definitions/789.html").
- -Wno-analyzer-tainted-assertion
- این هشدار
نیازمند -fanalyzer
است که آن
را فعال
میکند؛
برای
غیرفعال
کردن آن از
-Wno-analyzer-tainted-assertion
استفاده
کنید.
این هشدار تشخیصی دربارهٔ مسیرهایی درون کد هشدار میدهد که در آنها مقداری که میتواند تحت کنترل مهاجم باشد، بدون اینکه ابتدا پاکسازی و اعتبارسنجی شود به عنوان بخشی از یک شرط استفاده شده است، و آن شرط از فراخوانی تابعی با مشخصهٔ "noreturn" (مانند تابع "__builtin_unreachable") محافظت میکند. چنین توابعی معمولاً نشاندهندهٔ پایان غیرعادی برنامه هستند، مانند گردانندههای شکست ادعا (assertion failure handlers). برای نمونه:
assert (some_tainted_value < SOME_LIMIT);
در چنین مواردی:
- *
- هنگامی که بررسی ادعاها غیرفعال است، مانند زمان تعریف "NDEBUG"، مهاجم میتواند دادههایی را تزریق کند که فرایند را دچار تخریب کند، زیرا احتمالاً پیششرطی را که توسط کد فرض شده است نقض میکند.
توجه داشته باشید که در صورت غیرفعال بودن بررسی ادعاها، assertionها معمولاً پیش از آنکه تحلیلگر شانس «دیدن» آنها را داشته باشد توسط پیشپردازنده حذف میشوند؛ بنابراین این اعلان تشخیصی تنها میتواند در ساختهایی که بررسی ادعاها در آنها فعال است هشدار تولید کند.
به منظور این هشدار، هر تابعی که دارای صفت "noreturn" باشد، از جمله "__builtin_unreachable"، به عنوان یک گردانندهٔ احتمالی شکست ادعا در نظر گرفته میشود. توجه داشته باشید که این توابع گاهی پیش از آنکه تحلیلگر آنها را «ببیند»، توسط بهینهساز حذف میشوند. از این رو، هنگام تلاش برای فعالسازی این هشدار، بهینهسازی باید غیرفعال باشد.
ببینید: CWE-617: Reachable Assertion ("https://cwe.mitre.org/data/definitions/617.html").
این هشدار همچنین میتواند ساختارهای مشکلداری مانند نمونهٔ زیر را گزارش دهد:
switch (some_tainted_value) {
case 0:
/* [...etc; various valid cases omitted...] */
break;
default:
__builtin_unreachable (); /* BUG: attacker can trigger this */
}
اگرچه مورد بالا، به بیان دقیق، یک شکست ادعا نیست.
- -Wno-analyzer-tainted-array-index
- این هشدار
نیازمند -fanalyzer
است که آن
را فعال
میکند؛
برای
غیرفعال
کردن آن از
-Wno-analyzer-tainted-array-index
استفاده
کنید.
این هشدار برای مسیرهایی در کد صادر میشود که در آنها مقداری که ممکن است تحت کنترل مهاجم باشد، بدون پاکسازی و اعتبارسنجی به عنوان اندیس دسترسی به یک آرایه استفاده شود، به طوری که مهاجم بتواند یک دسترسی خارج از محدوده (out-of-bounds access) را تزریق کند.
ببینید: CWE-129: Improper Validation of Array Index ("https://cwe.mitre.org/data/definitions/129.html").
- -Wno-analyzer-tainted-divisor
- این هشدار
نیازمند -fanalyzer
است که آن
را فعال
میکند؛
برای
غیرفعال
کردن آن از
-Wno-analyzer-tainted-divisor
استفاده
کنید.
این هشدار برای مسیرهایی در کد صادر میشود که در آنها مقداری که ممکن است تحت کنترل مهاجم باشد، بدون پاکسازی به عنوان مقسومعلیه در یک عملیات تقسیم یا باقیمانده (modulus) به کار رود، به طوری که مهاجم بتواند یک تقسیم بر صفر (division-by-zero) را تزریق کند.
ببینید: CWE-369: Divide By Zero ("https://cwe.mitre.org/data/definitions/369.html").
- -Wno-analyzer-tainted-offset
- این هشدار
نیازمند -fanalyzer
است که آن
را فعال
میکند؛
برای
غیرفعال
کردن آن از
-Wno-analyzer-tainted-offset
استفاده
کنید.
این هشدار برای مسیرهایی در کد صادر میشود که در آنها مقداری که ممکن است تحت کنترل مهاجم باشد، بدون پاکسازی به عنوان آفست اشارهگر (pointer offset) استفاده شود، به طوری که مهاجم بتواند یک دسترسی خارج از محدوده را تزریق کند.
ببینید: CWE-823: Use of Out-of-range Pointer Offset ("https://cwe.mitre.org/data/definitions/823.html").
- -Wno-analyzer-tainted-size
- این هشدار
نیازمند -fanalyzer
است که آن
را فعال
میکند؛
برای
غیرفعال
کردن آن از
-Wno-analyzer-tainted-size
استفاده
کنید.
این هشدار برای مسیرهایی در کد صادر میشود که در آنها مقداری که ممکن است تحت کنترل مهاجم باشد، بدون پاکسازی به عنوان اندازهٔ عملیاتی مانند "memset" به کار رود، به طوری که مهاجم بتواند یک دسترسی خارج از محدوده را تزریق کند.
ببینید: CWE-129: Improper Validation of Array Index ("https://cwe.mitre.org/data/definitions/129.html").
- -Wno-analyzer-throw-of-unexpected-type
- این هشدار
نیازمند -fanalyzer
است که آن
را فعال
میکند؛
برای
غیرفعال
کردن آن از
-Wno-analyzer-throw-of-unexpected-type
استفاده
کنید.
مشخصات
استثنای
پویا (dynamic exception specification)
فقط در C++14 و
پیش از آن
در دسترس
است.
این هشدار برای مسیرهایی در کد صادر میشود که در آنها یک استثنا از تابعی با مشخصات استثنای پویا پرتاب میشود، در حالی که استثنا با آن مشخصات سازگار نیست.
- -Wno-analyzer-undefined-behavior-ptrdiff
- این هشدار
نیازمند -fanalyzer
است که آن
را فعال
میکند؛
برای
غیرفعال
کردن آن از
-Wno-analyzer-undefined-behavior-ptrdiff
استفاده
کنید.
این هشدار برای مسیرهایی در کد صادر میشود که در آنها تفریق اشارهگرها در شرایطی رخ میدهد که اشارهگرها به قطعههای متفاوتی از حافظه ارجاع دارند. چنین کدی به رفتار تعریفنشده (undefined behavior) متکی است، زیرا تفریق اشارهگر تنها برای حالاتی تعریف شده است که هر دو اشارهگر به درون (یا دقیقاً بعد از) یک آرایه اشاره کنند.
ببینید: CWE-469: Use of Pointer Subtraction to Determine Size ("https://cwe.mitre.org/data/definitions/469.html").
- -Wno-analyzer-undefined-behavior-strtok
- این هشدار
نیازمند -fanalyzer
است که آن
را فعال
میکند؛
برای
غیرفعال
کردن آن از
-Wno-analyzer-undefined-behavior-strtok
استفاده
کنید.
این هشدار برای مسیرهایی در کد صادر میشود که در آنها یک فراخوانی با رفتار تعریفنشده به "strtok" انجام میگیرد.
بهطور خاص، ارسال NULL به عنوان پارامتر نخست در اولین فراخوانی "strtok" در طول یک فرایند، دارای رفتار تعریفنشده است.
- -Wno-analyzer-unsafe-call-within-signal-handler
- این هشدار
نیازمند -fanalyzer
است که آن
را فعال
میکند؛
برای
غیرفعال
کردن آن از
-Wno-analyzer-unsafe-call-within-signal-handler
استفاده
کنید.
این هشدار برای مسیرهایی در کد صادر میشود که در آنها تابعی که ناامن برای سیگنالهای ناهمگام (async-signal-unsafe) شناخته شده است (مانند "fprintf")، از درون یک گردانندهٔ سیگنال (signal handler) فراخوانی شود.
ببینید: CWE-479: Signal Handler Use of a Non-reentrant Function ("https://cwe.mitre.org/data/definitions/479.html").
- -Wno-analyzer-use-after-free
- این هشدار
نیازمند -fanalyzer
است که آن
را فعال
میکند؛
برای
غیرفعال
کردن آن از
-Wno-analyzer-use-after-free
استفاده
کنید.
این هشدار برای مسیرهایی در کد صادر میشود که در آنها یک اشارهگر پس از فراخوانی یک تابع آزادساز روی آن، مورد استفاده قرار میگیرد: چه "free" باشد، و چه تابع آزادسازی که با صفت "malloc" ارجاع داده شده است.
ببینید: CWE-416: Use After Free ("https://cwe.mitre.org/data/definitions/416.html").
- -Wno-analyzer-use-of-pointer-in-stale-stack-frame
- این هشدار
نیازمند -fanalyzer
است که آن
را فعال
میکند؛
برای
غیرفعال
کردن آن از
-Wno-analyzer-use-of-pointer-in-stale-stack-frame
استفاده
کنید.
این هشدار برای مسیرهایی در کد صادر میشود که در آنها اشارهگری که به یک متغیر در یک قاب پشتهٔ منقضیشده (stale stack frame) اشاره دارد، ارجاعزدایی میشود.
- -Wno-analyzer-va-arg-type-mismatch
- این هشدار
نیازمند -fanalyzer
است که آن
را فعال
میکند؛
برای
غیرفعال
کردن آن از
-Wno-analyzer-va-arg-type-mismatch
استفاده
کنید.
این هشدار برای مسیرهای میانروالهای در کد صادر میشود که در آنها تحلیلگر تلاشی برای استفاده از "va_arg" به منظور استخراج مقداری که به یک فراخوانی با تعداد آرگومان متغیر (variadic) ارسال شده شناسایی میکند، اما نوع دادهای استفاده شده با نوع عبارت ارسالشده به فراخوانی همخوانی ندارد.
ببینید: CWE-686: Function Call With Incorrect Argument Type ("https://cwe.mitre.org/data/definitions/686.html").
- -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
استفاده
کنید.
این گزارش تشخیصی دربارهٔ مسیرهایی در کد هشدار میدهد که تحلیلگر در آنها تلاشی برای نوشتن از طریق یک اشارهگر روی یک لیترال رشتهای را تشخیص دهد. با این حال، تحلیلگر اولویتی برای تشخیص چنین مسیرهایی قائل نمیشود، بنابراین رخداد منفی کاذب در مقایسه با سایر هشدارها محتملتر است.
- -Wno-analyzer-use-of-uninitialized-value
- این هشدار
نیازمند -fanalyzer
است که آن
را فعال
میکند؛
برای
غیرفعال
کردن آن از
-Wno-analyzer-use-of-uninitialized-value
استفاده
کنید.
این گزارش تشخیصی دربارهٔ مسیرهایی در کد هشدار میدهد که در آنها از یک مقدار مقداردهینشده استفاده میشود.
نگاه کنید به CWE-457: Use of Uninitialized Variable ("https://cwe.mitre.org/data/definitions/457.html").
تحلیلگر دانشی توکار دربارهٔ رفتار توابع مدیریت حافظهٔ زیر دارد:
- *<"alloca">
- *<توابع توکار "__builtin_alloc"،>
- "__builtin_alloc_with_align"، @item "__builtin_calloc"، "__builtin_free"، "__builtin_malloc"، "__builtin_memcpy"، "__builtin_memcpy_chk"، "__builtin_memset"، "__builtin_memset_chk"، "__builtin_realloc"، "__builtin_stack_restore"، و "__builtin_stack_save"
- *<"calloc">
- *<"free">
- *<"malloc">
- *<"memset">
- *<"operator delete">
- *<"operator delete []">
- *<"operator new">
- *<"operator new []">
- *<"realloc">
- *<"strdup">
- *<"strndup">
دربارهٔ توابع زیر برای کار با توصیفکنندههای فایل:
- *<"open">
- *<"close">
- *<"creat">
- *<"dup"، "dup2" و "dup3">
- *<"isatty">
- *<"pipe" و "pipe2">
- *<"read">
- *<"write">
- *<"socket"، "bind"، "listen"، "accept" و "connect">
دربارهٔ توابع زیر برای کار با جریانهای "<stdio.h>":
- *<توابع توکار "__builtin_fprintf"،>
- "__builtin_fprintf_unlocked"، "__builtin_fputc"، "__builtin_fputc_unlocked"، "__builtin_fputs"، "__builtin_fputs_unlocked"، "__builtin_fwrite"، "__builtin_fwrite_unlocked"، "__builtin_printf"، "__builtin_printf_unlocked"، "__builtin_putc"، "__builtin_putchar"، "__builtin_putchar_unlocked"، "__builtin_putc_unlocked"، "__builtin_puts"، "__builtin_puts_unlocked"، "__builtin_vfprintf"، و "__builtin_vprintf"
- *<"fopen">
- *<"fclose">
- *<"ferror">
- *<"fgets">
- *<"fgets_unlocked">
- *<"fileno">
- *<"fread">
- *<"getc">
- *<"getchar">
- *<"fprintf">
- *<"printf">
- *<"fwrite">
و دربارهٔ توابع زیر:
- *<توابع توکار "__builtin_expect"،>
- "__builtin_expect_with_probability"، "__builtin_strchr"، "__builtin_strcpy"، "__builtin_strcpy_chk"، "__builtin_strlen"، "__builtin_va_copy"، و "__builtin_va_start"
- *<افزونههای گنو "error" و "error_at_line">
- *<"getpass">
- *<"longjmp">
- *<"putenv">
- *<"setjmp">
- *<"siglongjmp">
- *<"signal">
- *<"sigsetjmp">
- *<"strcat">
- *<"strchr">
- *<"strlen">
علاوه بر این، توابع گوناگون با پیشوند "__analyzer_" معنای ویژهای برای تحلیلگر دارند که در کتابچهٔ راهنمای GCC Internals شرح داده شدهاند. پارامترهای داخلی گوناگونی که از طریق --param قابل تنظیم هستند، برای کنترل پیمایش به کار میروند؛ این موارد نیز در راهنمای GCC Internals مستند شدهاند.
گزینههای زیر تحلیلگر را کنترل میکنند.
- -fanalyzer-assume-nothrow
- بهطور
پیشفرض،
اگر -fexceptions
فعال باشد،
تحلیلگر
فرض میکند
که
فراخوانی
هر تابعی
بدون
مشخصهٔ
"nothrow"
میتواند
یک استثنا
پرتاب کند.
این امر
میتواند
به شناسایی
مسیرهای
اجرایی که
به دلیل دور
زدن کدهای
پاکسازی
توسط
استثناها
دچار نشت
حافظه
میشوند
کمک کند،
اما ممکن
است هنگام
استفاده از
هدرهایی که
نویسنده
مشخصهٔ
"nothrow" را
به آنها
اضافه
نکرده است،
منجر به
هشدارهای
مثبت کاذب
شود.
اگر -fanalyzer-assume-nothrow فعال باشد، تحلیلگر فرض خواهد کرد که توابع خارجی استثنایی پرتاب نمیکنند. این ممکن است برای کاهش «نویز» تحلیلگر هنگام فعال کردن -fexceptions روی کدهای C مفید باشد، اما اگر استثنایی توسط مواردی که کد C فراخوانی میکند ایجاد شود، میتواند مشکلات واقعی را پنهان کند.
- -fanalyzer-call-summaries
- تحلیل
بینروالها
را با
محاسبهٔ
اثر
فراخوانیهای
خاص
سادهسازی
میکند، به
جای اینکه
تمام
مسیرهای
درون تابع
را از نقطهٔ
فراخوانی
تا هر
بازگشت
ممکن
پیمایش کند.
در صورت فعال بودن، خلاصههای فراخوانی تنها برای توابعی با بیش از یک نقطهٔ فراخوانی و به اندازهٔ کافی پیچیده استفاده میشوند.
- -fanalyzer-checker=name
- تحلیلگر را تنها به اجرای بررسیکنندهٔ (checker) نامبردهشده محدود کرده و آن را فعال میکند.
- -fanalyzer-debug-text-art-headings
- این گزینه برای توسعهدهندگان تحلیلگر در نظر گرفته شده است. در صورت فعال بودن، تحلیلگر حاشیهنویسیهای اضافی را به نمودارهایی که تولید میکند میافزاید.
- -fno-analyzer-feasibility
- این گزینه
برای
توسعهدهندگان
تحلیلگر
در نظر
گرفته شده
است.
بهطور پیشفرض تحلیلگر بررسی میکند که برای هر گزارش خطایی که صادر میکند، یک مسیر جریان کنترل امکانپذیر وجود داشته باشد: به این معنی که شرایط برقرارشده مانعةالجمع نباشند. گزارشهایی که هیچ مسیر امکانپذیری برای آنها یافت نشود رد میشوند. این فیلتر کردن را میتوان با -fno-analyzer-feasibility برای اشکالزدایی مشکلات این بخش از کد غیرفعال کرد.
- -fanalyzer-fine-grained
- کاری انجام نمیدهد. برای سازگاری با گذشته حفظ شده است.
- -fanalyzer-show-duplicate-count
- این گزینه برای توسعهدهندگان تحلیلگر در نظر گرفته شده است: اگر چند گزارش خطا به عنوان موارد تکراری یکدیگر شناسایی شده باشند، هنگام گزارش بهترین پیام تشخیصی، یادداشتی صادر میکند که تعداد گزارشهای اضافی نادیدهگرفتهشده توسط منطق حذف موارد تکراری را نشان میدهد.
- -fanalyzer-show-events-in-system-headers
- بهطور پیشفرض تحلیلگر با پنهان کردن رویدادهایی که بهطور کامل درون یک هدر سیستمی قرار دارند، مسیرهای تشخیصی سادهسازیشدهای صادر میکند. با -fanalyzer-show-events-in-system-headers این رویدادها دیگر پنهان نمیشوند.
- -fno-analyzer-simplify-supergraph
- این گزینه
برای
توسعهدهندگان
تحلیلگر
در نظر
گرفته شده
است.
بهطور پیشفرض، تحلیلگر قبل از تحلیل گراف بالادست (supergraph) برنامه، سادهسازیهای مختلفی را روی آن انجام میدهد. با -fno-analyzer-simplify-supergraph این سادهسازی را میتوان برای اشکالزدایی مشکلات مربوط به آن غیرفعال کرد.
- -fno-analyzer-state-merge
- این گزینه
برای
توسعهدهندگان
تحلیلگر
در نظر
گرفته شده
است.
بهطور پیشفرض تحلیلگر هنگام ساختن «گراف منفجرشده» (exploded graph) خود، تلاش میکند با ادغام وضعیتهای به اندازهٔ کافی مشابه در هر نقطه از برنامه، تحلیل را سادهسازی کند. با -fno-analyzer-state-merge این ادغام را میتوان برای اشکالزدایی مشکلات مربوط به مدیریت وضعیت غیرفعال کرد.
- -fno-analyzer-state-purge
- این گزینه
برای
توسعهدهندگان
تحلیلگر
در نظر
گرفته شده
است.
بهطور پیشفرض تحلیلگر تلاش میکند با پاکسازی جنبههایی از وضعیت در هر نقطه از برنامه که به نظر میرسد دیگر مرتبط نیستند، تحلیل را سادهتر کند؛ مانند مقادیر متغیرهای محلی که در ادامهٔ تابع به آنها دسترسی پیدا نمیشود و به تحلیل نشت ارتباطی ندارند.
با -fno-analyzer-state-purge این پاکسازی وضعیت را میتوان برای اشکالزدایی مشکلات مدیریت وضعیت غیرفعال کرد.
- -fno-analyzer-suppress-followups
- این گزینه
برای
توسعهدهندگان
تحلیلگر
در نظر
گرفته شده
است.
بهطور پیشفرض تحلیلگر پس از مواجهه با برخی خطاهای تشخیصی خاص، پیمایش یک مسیر اجرایی را متوقف میکند تا از صدور آبشاری از پیامهای تشخیصی بعدی جلوگیری کند.
پیامهای تشخیصی که تحلیل را در طول یک مسیر متوقف میکنند عبارتند از:
- *<-Wanalyzer-null-argument>
- *<-Wanalyzer-null-dereference>
- *<-Wanalyzer-use-after-free>
- *<-Wanalyzer-use-of-pointer-in-stale-stack-frame>
- *<-Wanalyzer-use-of-uninitialized-value>
با -fno-analyzer-suppress-followups تحلیلگر حتی پس از چنین خطاهایی به پیمایش مسیرها ادامه میدهد، که ممکن است برای اشکالزدایی مشکلات در تحلیلگر یا برای معیارسنجیهای خرد (microbenchmarks) جهت شناسایی رفتار تعریفنشده مفید باشد.
- -fanalyzer-transitivity
- این گزینه ویژگی تعدی (transitivity) قیدها را در تحلیلگر فعال میکند.
- -fno-analyzer-undo-inlining
- این گزینه
برای
توسعهدهندگان
تحلیلگر
در نظر
گرفته شده
است.
-fanalyzer در مقایسه با سایر ابزارهای تحلیل کد نسبتاً دیر اجرا میشود و برخی بهینهسازیها پیشتر روی کد اعمال شدهاند. بهویژه ممکن است درونخطسازی توابع (inlining) رخ داده باشد، که باعث میشود مسیرهای اجرایی بینروالها صادرشده توسط تحلیلگر حاوی فریمهای تابعی باشند که با موارد موجود در کد مبدأ اصلی مطابقت ندارند.
بهطور پیشفرض تحلیلگر تلاش میکند فریمهای تابع اصلی را بازسازی کرده و رویدادهایی را برای نشان دادن فراخوانیهای درونخطشده صادر کند.
با -fno-analyzer-undo-inlining میتوان این تلاش برای بازسازی اطلاعات فریم اصلی را غیرفعال کرد، که ممکن است هنگام اشکالزدایی مشکلات درون تحلیلگر مفید باشد.
- -fanalyzer-verbose-edges
- این گزینه برای توسعهدهندگان تحلیلگر در نظر گرفته شده است. این گزینه جزئیات پرگوتر و سطحپایینتری را در توصیف جریان کنترل درون مسیرهای تشخیصی فعال میکند.
- -fanalyzer-verbose-state-changes
- این گزینه برای توسعهدهندگان تحلیلگر در نظر گرفته شده است. این گزینه جزئیات پرگوتر و سطحپایینتری را در توصیف رویدادهای مربوط به ماشینهای وضعیت درون مسیرهای تشخیصی فعال میکند.
- -fanalyzer-verbosity=level
- این گزینه
پیچیدگی
مسیرهای
جریان
کنترلی را
که برای
پیامهای
تشخیصی
تحلیلگر
صادر
میشوند
کنترل
میکند.
مقدار level میتواند یکی از موارد زیر باشد:
- 0
- در این سطح، رویدادهای فراخوانی و بازگشت بینروالها همراه با مرتبطترین رویدادهای تغییر وضعیت مربوط به یک پیام تشخیصی نمایش داده میشوند. برای مثال، برای خطای آزادسازی مضاعف ("free" دوگانه)، هر دو فراخوانی به "free" نشان داده خواهند شد.
- 1
- همانند سطح قبل، اما علاوه بر آن رویدادهای مربوط به ورود به هر تابع را نیز نشان میدهد.
- 2
- همانند سطح
قبل، اما
علاوه بر آن
رویدادهای
مربوط به
جریان
کنترلی را
که در تحریک
مشکل نقش
اساسی
دارند نیز
نشان
میدهد
(مانند «طی
شدن مسیر
شرط درست»
در یک
گزارهٔ
شرطی).
این سطح حالت پیشفرض است.
- 3
- همانند سطح قبل، اما تمامی رویدادهای جریان کنترل را نشان میدهد، نه فقط رویدادهای مهم را.
- 4
- این سطح برای توسعهدهندگان تحلیلگر در نظر گرفته شده است؛ رویدادهای متفرقهٔ دیگری را که برای اشکالزدایی تحلیلگر کاربرد دارند اضافه میکند.
- -fdump-analyzer-stderr
- جزئیات درونی مربوط به اقدامات تحلیلگر را در stderr تخلیه میکند. این گزینه بر -fdump-analyzer اولویت دارد.
- -fdump-analyzer-callgraph
- نمایشی از نمودار فراخوانی (call graph) مناسب برای مشاهده با GraphViz را در file.callgraph.dot تخلیه میکند.
- -fdump-analyzer-exploded-graph
- نمایشی از «exploded graph» مناسب برای مشاهده با GraphViz را در file.eg.dot تخلیه میکند. گرهها بر اساس وضعیتهای ماشین حالت با رنگ کدگذاری شدهاند تا بر تغییرات حالت تأکید شود.
- -fdump-analyzer-exploded-nodes
- پیامهای تشخیصی صادر میکند که نشان میدهند گرههای موجود در «exploded graph» در کجای کد منبع برنامه قرار دارند.
- -fdump-analyzer-exploded-nodes-2
- نمایشی متنی از «exploded graph» را در file.eg.txt تخلیه میکند.
- -fdump-analyzer-exploded-nodes-3
- نمایشی متنی از «exploded graph» را بهازای هر گره در یک فایل تخلیه، در file.eg-id.txt تخلیه میکند. این کار معمولاً منجر به تعداد زیادی فایل تخلیه میشود.
- -fdump-analyzer-exploded-paths
- نمایشی متنی از «exploded path» را بهازای هر پیام تشخیصی در file.idx.kind.epath.txt تخلیه میکند.
- -fdump-analyzer-feasibility
- جزئیات درونی مربوط به جستجوی تحلیلگر برای مسیرهای شدنی (feasible paths) را تخلیه میکند. جزئیات به قالبی مناسب جهت مشاهده با GraphViz در فایلهایی با قالب نامگذاری file.*.fg.dot، file.*.tg.dot و file.*.fpath.txt نوشته میشوند.
- -fdump-analyzer-infinite-loop
- جزئیات درونی مربوط به جستجوی تحلیلگر برای حلقههای بینهایت را تخلیه میکند. جزئیات به قالبی مناسب جهت مشاهده با GraphViz در فایلهایی با قالب نامگذاری file.*.infinite-loop.dot نوشته میشوند.
- -fdump-analyzer-json
- نمایشی فشردهشده در قالب JSON از جزئیات درونی تحلیلگر را در file.analyzer.json.gz تخلیه میکند. قالب دقیق آن دستخوش تغییر است.
- -fdump-analyzer-state-purge
- مطابق با -fdump-analyzer-supergraph، نمایشی از «supergraph» مناسب برای مشاهده با GraphViz را تخلیه میکند، اما نمودار را با اطلاعاتی مبنی بر اینکه چه وضعیتی در هر گره پاکسازی خواهد شد حاشیهنویسی میکند. این نمودار در file.state-purge.dot نوشته میشود.
- -fdump-analyzer-supergraph
- نمایشهایی از «supergraph» مناسب برای مشاهده با GraphViz را در file.supergraph.index.kind.dot تخلیه میکند. این نمایشها تمام نمودارهای جریان کنترل را در برنامه، در مراحل گوناگونِ تحلیل نشان میدهند. مجموعهٔ دقیق فایلهای تخلیهشده و آنچه نمایش میدهند دستخوش تغییر است.
- -fdump-analyzer-untracked
- هشدارهای سفارشی همراه با جزئیات درونی صادر میکند که برای توسعهدهندگان تحلیلگر در نظر گرفته شده است.
گزینههای اشکالزدایی برنامه (Options for Debugging Your Program)
برای اینکه به GCC بگویید اطلاعات اضافی را جهت استفاده توسط یک اشکالزدا صادر کند، تقریباً در همهٔ موارد تنها کافی است -g را به سایر گزینههای خود اضافه کنید. برخی قالبهای اشکالزدایی میتوانند همزمان وجود داشته باشند (مانند DWARF همراه با CTF)، زمانی که هر یک از آنها بهطور صریح با افزودن گزینهٔ خط فرمان مربوطه به دیگر گزینههایتان فعال شده باشند.
کامپایلر GCC به شما اجازه میدهد از -g به همراه -O استفاده کنید. میانبرهایی که توسط کد بهینهشده اعمال میشوند ممکن است گهگاه غافلگیرکننده باشند: ممکن است برخی متغیرهایی که تعریف کردهاید اصلاً وجود نداشته باشند؛ جریان کنترل ممکن است لحظهای به جایی برود که انتظارش را نداشتید؛ برخی دستورها ممکن است اجرا نشوند زیرا نتایج ثابتی را محاسبه میکنند یا مقادیر آنها از پیش آماده است؛ برخی دستورها ممکن است در مکانهای متفاوتی اجرا شوند چون به بیرون از حلقهها منتقل شدهاند. با این وجود، اشکالزدایی خروجی بهینهشده امکانپذیر است. این امر استفاده از بهینهساز را برای برنامههایی که ممکن است باگ داشته باشند منطقی میسازد.
اگر از گزینهٔ بهینهسازی دیگری استفاده نمیکنید، استفاده از -Og را همراه با -g مد نظر قرار دهید. در نبود هیچ گزینهٔ -O، برخی از گذرهای کامپایلر که اطلاعاتِ مفید برای اشکالزدایی را جمعآوری میکنند اصلاً اجرا نمیشوند؛ در نتیجه -Og ممکن است به تجربهٔ اشکالزدایی بهتری منجر شود.
- -g
- --debug
- اطلاعات
اشکالزدایی
را در قالب
بومی
سیستمعامل
(stabs، COFF، XCOFF یا DWARF)
تولید
میکند. GDB
میتواند
با این
اطلاعات
اشکالزدایی
کار کند.
در بیشتر سیستمهایی که از قالب stabs استفاده میکنند، -g استفاده از اطلاعات اشکالزدایی اضافی را فعال میکند که تنها GDB قادر به استفاده از آن است؛ این اطلاعات اضافی باعث کارکرد بهتر اشکالزدایی در GDB میشود اما احتمالاً موجب کرش کردن یا امتناع سایر اشکالزداها از خواندن برنامه میگردد. اگر میخواهید با قطعیت مشخص کنید که آیا اطلاعات اضافی تولید شوند یا خیر، از -gvms استفاده کنید (پایین را ببینید).
- -ggdb
- اطلاعات اشکالزدایی را برای استفاده توسط GDB تولید میکند. این بدان معناست که از ویژهترین و گویاترین قالب موجود (DWARF، stabs، یا در صورت عدم پشتیبانی از هیچیک از آنها، قالب بومی) استفاده میشود، از جمله الحاقات GDB در صورت امکان.
- -gdwarf
- -gdwarf-version
- اطلاعات
اشکالزدایی
را در قالب DWARF
تولید
میکند (در
صورتی که
پشتیبانی
شود). مقدار
version
میتواند 2،
3، 4 یا 5 باشد؛
نسخهٔ
پیشفرض
برای بیشتر
مقصدها
برابر 5 است
(بهاستثنای
VxWorks، TPF و Darwin / macOS که
پیشفرض
آنها
نسخهٔ 2
است، و AIX که
پیشفرض آن
نسخهٔ 4 است).
توجه داشته باشید که در DWARF نسخهٔ 2، برخی درگاهها در جداول بازپیچی (unwind tables) نیازمند استفاده همیشگی از برخی الحاقات سازگار DWARF 3 هستند.
نسخهٔ 4 ممکن است برای بیشترین کارایی به GDB 7.0 و -fvar-tracking-assignments نیاز داشته باشد. نسخهٔ 5 نیازمند GDB 8.0 یا بالاتر است.
کامپایلر GCC دیگر از DWARF نسخهٔ 1، که تفاوتی اساسی با نسخهٔ 2 و پس از آن دارد، پشتیبانی نمیکند. بنا به دلایل تاریخی، برخی گزینههای دیگرِ مرتبط با DWARF نظیر -fno-dwarf2-cfi-asm ارجاع به DWARF نسخهٔ 2 را در نام خود حفظ کردهاند، اما بر تمام نسخههای پشتیبانیشدهٔ فعلیِ DWARF اعمال میشوند.
- -gbtf
- اطلاعات اشکالزدایی BTF را درخواست میکند. قالب BTF قالب پیشفرض اشکالزدایی برای مقصد eBPF است. در سایر مقصدها، مانند x86، اطلاعات اشکالزدایی BTF میتواند در کنار اطلاعات اشکالزدایی DWARF تولید شود، هنگامی که هر دو قالب اشکالزدایی بهطور صریح از طریق گزینههای خط فرمان مربوطه فعال شده باشند.
- -gprune-btf
- -gno-prune-btf
- هرس کردن
اطلاعات BTF
پیش از
صدور. هنگام
هرس کردن،
تنها
اطلاعات
نوع برای
انواع
استفادهشده
توسط
متغیرهای
سراسری و
توابع در
دامنهٔ
فایل (file-scope)
صادر
خواهند شد.
در صورت
کامپایل
برای مقصد BPF
همراه با BPF
CO-REِ فعال،
اطلاعات
نوع برای
انواع
استفادهشده
در
بازنشانیهای
BPF CO-RE نیز صادر
خواهند شد.
افزون بر
این، انواع
struct و union که تنها
از طریق
اشارهگرها
از اعضای
دیگر انواع
struct یا union به
آنها
ارجاع داده
شده است،
هرس شده و
با BTF_KIND_FWD
جایگزین
میشوند،
گویی آن
انواع تنها
بهصورت
اعلانهای
روبهجلو (forward
declarations) در ورودی
حضور
داشتهاند.
این گزینه اندازهٔ اطلاعات BTF تولیدشده را به میزان قابلتوجهی کاهش میدهد، اما با از دست رفتن چشمگیر در میزان اطلاعات تفصیلی نوع همراه است. این گزینه در درجه اول هنگام کامپایل برای مقصد BPF سودمند است، تا اندازهٔ شیء خروجی را به حداقل برساند و اطلاعات BTF را که فوراً مرتبط با فرایند بارگذاری برنامهٔ BPF نیستند حذف نماید.
این گزینه بهطور پیشفرض برای مقصد BPF هنگام تولید اطلاعات BTF فعال است.
- -gctf
- -gctflevel
- اطلاعات
اشکالزدایی
CTF را
درخواست
میکند و از
level برای مشخص
کردن میزان
اطلاعات
اشکالزدایی
تولیدشده
استفاده
میکند. اگر
-gctf بدون
مقداری
برای level مشخص
شود، سطح
پیشفرض
اطلاعات
اشکالزدایی
CTF برابر 2
خواهد بود.
اطلاعات اشکالزدایی CTF را میتوان در کنار اطلاعات اشکالزدایی DWARF تولید کرد، مشروط بر اینکه هر دو قالب اشکالزدایی بهطور صریح از طریق گزینههای خط فرمان مربوطه فعال شده باشند.
سطح 0 بههیچوجه اطلاعات اشکالزدایی CTF تولید نمیکند؛ بنابراین، -gctf0 اثر -gctf را خنثی میکند.
سطح 1 اطلاعات CTF را تنها برای ردگیریها (tracebacks) تولید میکند. این شامل اطلاعات محل فراخوانی (callsite) میشود، اما اطلاعات نوع را در بر نمیگیرد.
سطح 2 اطلاعات نوع را فقط برای موجودیتها (توابع، اشیاء داده و غیره) در دامنهٔ فایل (file-scope) یا دامنهٔ سراسری (global-scope) تولید میکند..IP -gvms 4 تولید اطلاعات اشکالزدایی در قالب اشکالزدایی Alpha/VMS (در صورت پشتیبانی). این قالبی است که توسط DEBUG در سیستمهای Alpha/VMS استفاده میشود.
- -gcodeview
- تولید اطلاعات اشکالزدایی در قالب اشکالزدایی CodeView (در صورت پشتیبانی). این قالبی است که توسط Microsoft Visual C++ در Windows استفاده میشود.
- -glevel
- -ggdblevel
- -gvmslevel
- درخواست
اطلاعات
اشکالزدایی
و همچنین
استفاده از
level برای
تعیین
میزان
اطلاعات.
سطح
پیشفرض ۲
است.
سطح ۰ اصلاً هیچ اطلاعات اشکالزدایی تولید نمیکند. بنابراین، -g0 گزینهٔ -g را خنثی میکند.
سطح ۱ اطلاعات حداقلی تولید میکند، به میزانی که برای گرفتن ردپای پشته (backtrace) در بخشهایی از برنامه که قصد اشکالزدایی آنها را ندارید کافی باشد. این اطلاعات شامل توصیف توابع و متغیرهای خارجی و جدولهای شماره سطر است، اما هیچ اطلاعاتی دربارهٔ متغیرهای محلی ارائه نمیدهد.
سطح ۲ تنظیم معمول برای تولید کد قابل اشکالزدایی است. خروجی اشکالزدایی شامل تمام اطلاعات سطح ۱، به همراه اطلاعات مربوط به متغیرهای محلی و typedefها است تا امکان گام برداشتن در کد (stepping) و بررسی وضعیت آن فراهم شود. برای کدهای C++، اطلاعات اضافی نیز برای کمک به اشکالزدایی توابع فضای نام (namespace)، کلاس و الگو (template) صادر میشود.
سطح ۳ شامل اطلاعات اضافی مانند تمام تعاریف ماکرو موجود در برنامه است. برخی از اشکالزداها هنگام استفاده از -g3 از گسترش ماکروها (macro expansion) پشتیبانی میکنند.
اگر از چندین گزینهٔ -g، همراه با شماره سطح یا بدون آن استفاده کنید، آخرین گزینه از این میان مؤثر خواهد بود.
گزینهٔ -gdwarf برای جلوگیری از سردرگمی با -gdwarf-level، سطح اشکالزدایی متصل را نمیپذیرد. در عوض از یک گزینهٔ اضافی -glevel برای تغییر سطح اشکالزدایی برای DWARF استفاده کنید.
- -fno-eliminate-unused-debug-symbols
- بهطور پیشفرض، برای نمادهایی (symbols) که عملاً استفاده نمیشوند هیچ اطلاعات اشکالزدایی تولید نمیشود. اگر میخواهید اطلاعات اشکالزدایی برای همهٔ نمادها تولید شود، از این گزینه استفاده کنید.
- -femit-class-debug-always
- به جای صدور اطلاعات اشکالزدایی برای یک کلاس C++ تنها در یک فایل هدف (object file)، آن را در تمام فایلهای هدفی که از کلاس استفاده میکنند صادر میکند. این گزینه فقط باید با اشکالزداهایی استفاده شود که قادر به مدیریت روش معمول GCC در صدور اطلاعات اشکالزدایی برای کلاسها نیستند، زیرا استفاده از این گزینه اندازهٔ اطلاعات اشکالزدایی را تا دو برابر افزایش میدهد.
- -fno-merge-debug-strings
- به پیونددهنده هدایت میدهد که رشتههای یکسان در اطلاعات اشکالزدایی فایلهای هدف مختلف را با یکدیگر ادغام نکند. ادغام توسط همهٔ اسمبلرها یا پیونددهندهها پشتیبانی نمیشود. ادغام حجم اطلاعات اشکالزدایی در فایل خروجی را به قیمت افزایش زمان پردازش پیوند کاهش میدهد. ادغام بهطور پیشفرض فعال است.
- -fdebug-prefix-map=old=new
- هنگام کامپایل فایلهای مستقر در پوشهٔ old، اطلاعات اشکالزدایی را طوری ثبت میکند که گویی فایلها در پوشهٔ new قرار دارند. این گزینه میتواند برای جایگزینی مسیر زمان ساخت با مسیر زمان نصب در اطلاعات اشکالزدایی استفاده شود. همچنین میتوان با استفاده از . برای new، یک مسیر مطلق را به یک مسیر نسبی تغییر داد. این کار میتواند ساختهای بازتولیدپذیرتری (reproducible builds) ارائه دهد که مستقل از مکان هستند، اما ممکن است نیاز به یک دستور اضافی برای اطلاع به GDB جهت یافتن فایلهای منبع داشته باشد. همچنین گزینههای -ffile-prefix-map و -fcanon-prefix-map را ببینید.
- -fvar-tracking
- گذرگاه
رهگیری
متغیرها (variable
tracking pass) را اجرا
میکند. این
گذرگاه
محاسبه
میکند که
متغیرها در
هر موقعیت
از کد کجا
ذخیره
شدهاند.
سپس
اطلاعات
اشکالزدایی
بهتری
تولید
میشود (در
صورتی که
قالب
اطلاعات
اشکالزدایی
از این
اطلاعات
پشتیبانی
کند).
این گزینه بهطور پیشفرض هنگام کامپایل با بهینهسازی (-Os، -O، -O2، ...) و اطلاعات اشکالزدایی (-g) فعال است، مشروط بر اینکه قالب اطلاعات اشکالزدایی از آن پشتیبانی کند.
- -fvar-tracking-assignments
- انتسابها
به
متغیرهای
کاربر را در
اوایل
فرایند
کامپایل
حاشیهنویسی
(annotate) میکند و
تلاش
میکند این
یادداشتها
را در
سرتاسر
فرایند
کامپایل تا
انتها حفظ
کند تا
اطلاعات
اشکالزدایی
در حین
بهینهسازی
بهبود
یابند.
استفاده از
-gdwarf-4 همراه با
آن توصیه
میشود.
این گزینه حتی در صورت غیرفعال بودن var-tracking نیز میتواند فعال شود، که در این حالت حاشیهنویسیها ایجاد و نگهداری میشوند اما در پایان دور انداخته میشوند. بهطور پیشفرض، این پرچم همراه با -fvar-tracking فعال است، به جز زمانی که selective scheduling فعال باشد.
- -fvar-tracking-uninit
- -fno-var-tracking-uninit
- رهگیری متغیرها را انجام میدهد و همچنین متغیرهای مقداردهینشده را در اطلاعات اشکالزدایی علامتگذاری میکند. این پرچم بهطور پیشفرض توسط -fvar-tracking فعال میشود؛ همچنین به معنای فعالسازی ضمنی -fvar-tracking نیز هست. برای انجام رهگیری متغیرها بدون علامتگذاری متغیرهای مقداردهینشده، از -fvar-tracking -fno-var-tracking-uninit استفاده کنید.
- -gsplit-dwarf
- اگر اطلاعات اشکالزدایی DWARF فعال باشد، تا حد امکان اطلاعات اشکالزدایی را به یک فایل خروجی جداگانه با پسوند .dwo تفکیک میکند. این گزینه به سیستم ساخت اجازه میدهد از پیوند دادن فایلها با اطلاعات اشکالزدایی اجتناب کند. برای سودمند بودن، این گزینه نیازمند اشکالزدایی است که توانایی خواندن فایلهای .dwo را داشته باشد.
- -gdwarf32
- -gdwarf64
- اگر اطلاعات اشکالزدایی DWARF فعال باشد، گزینهٔ -gdwarf32 قالب ۳۲ بیتی DWARF و گزینهٔ -gdwarf64 قالب ۶۴ بیتی DWARF را انتخاب میکند. پیشفرض وابسته به معماری مقصد (target) است، هرچند در بیشتر مقصدها -gdwarf32 است. قالب ۳۲ بیتی DWARF کمحجمتر است، اما نمیتواند بیش از ۲ گیبیبایت اطلاعات اشکالزدایی را در هر یک از بخشهای اطلاعات اشکالزدایی DWARF پشتیبانی کند. قالب ۶۴ بیتی DWARF اطلاعات اشکالزدایی بزرگتری را ممکن میسازد و ممکن است هنوز به خوبی توسط همهٔ مصرفکنندگان پشتیبانی نشود.
- -gdescribe-dies
- صفتهای توصیفی را به برخی از DIEهای DWARF که صفت نام ندارند اضافه میکند، مانند متغیرهای مصنوعی (artificial variables)، ارجاعهای خارجی و DIEهای پارامتر نقطهٔ فراخوانی (call site).
- -gpubnames
- بخشهای ".debug_pubnames" و ".debug_pubtypes" مربوط به DWARF را تولید میکند.
- -ggnu-pubnames
- بخشهای ".debug_pubnames" و ".debug_pubtypes" را در قالبی مناسب برای تبدیل به نمایهٔ GDB (index) تولید میکند. این گزینه تنها با پیونددهندهای مفید است که بتواند نسخهٔ ۷ نمایهٔ GDB را تولید کند.
- -gno-pubnames
- بخشهای ".debug_pubnames" و ".debug_pubtypes" مربوط به DWARF را تولید نمیکند.
- -fdebug-types-section
- هنگام استفاده از DWARF نسخهٔ ۴ یا بالاتر، DIEهای نوع میتوانند به جای اینکه بخشی از بخش ".debug_info" باشند، در بخش اختصاصی خود به نام ".debug_types" قرار گیرند. قرار دادن آنها در یک بخش مجزای comdat کارآمدتر است زیرا پیونددهنده میتواند موارد تکراری را حذف کند. اما همهٔ مصرفکنندگان DWARF هنوز از بخشهای ".debug_types" پشتیبانی نمیکنند و در برخی شیءها، ".debug_types" به جای کوچکتر کردن، اطلاعات اشکالزدایی بزرگتری تولید میکند.
- -grecord-gcc-switches
- -gno-record-gcc-switches
- این سوئیچ باعث میشود گزینههای خط فرمانی که برای فراخوانی کامپایلر استفاده شدهاند و ممکن است بر تولید کد تأثیر بگذارند، به صفت DW_AT_producer در اطلاعات اشکالزدایی DWARF پیوست شوند. گزینهها با فاصله از یکدیگر و از نسخهٔ کامپایلر جدا شده و متصل میگردند. این گزینه بهطور پیشفرض فعال است. همچنین -frecord-gcc-switches را برای روش دیگری از ذخیرهسازی گزینههای کامپایلر در فایل هدف ببینید.
- -gstrict-dwarf
- استفاده از افزونههای نسخههای بعدی استاندارد DWARF نسبت به نسخهٔ انتخابشده با -gdwarf-version را غیرمجاز میکند. در بیشتر مقصدها، استفاده از افزونههای غیرمتعارض DWARF از نسخههای بعدی استاندارد مجاز است.
- -gno-strict-dwarf
- اجازهٔ استفاده از افزونههای نسخههای بعدی استاندارد DWARF نسبت به نسخهٔ انتخابشده با -gdwarf-version را میدهد.
- -gas-loc-support
- به
کامپایلر
اطلاع
میدهد که
اسمبلر از
دستورالعملهای
".loc"
پشتیبانی
میکند. سپس
کامپایلر
میتواند
از آنها
استفاده
کند تا
اسمبلر
جدولهای
شماره سطر DWARF2+
را تولید
کند.
این کار معمولاً مطلوب است، زیرا جدولهای شماره سطر تولیدشده توسط اسمبلر بسیار فشردهتر از جدولهایی هستند که خود کامپایلر میتواند تولید کند.
این گزینه بهطور پیشفرض فعال است اگر در زمان پیکربندی GCC مشخص شود که اسمبلر از چنین دستورالعملهایی پشتیبانی میکند..IP -gno-as-loc-support 4 مجبور کردن GCC به تولید داخلی جدولهای شماره خط DWARF2+، چنانچه قرار باشد جدولهای شماره خط DWARF2+ تولید شوند.
- -gas-locview-support
- به
کامپایلر
اطلاع
میدهد که
اسمبلر از
انتساب
"view" و
بازنشانی
بررسی ادعا
(assertion checking) در
دستورالعملهای
".loc"
پشتیبانی
میکند.
این گزینه به طور پیشفرض فعال است اگر در زمان پیکربندی GCC مشخص شود که اسمبلر از آنها پشتیبانی میکند.
- -gno-as-locview-support
- مجبور کردن GCC به انتساب داخلی شمارههای view، در صورتی که -gvariable-location-views صراحتاً درخواست شده باشد.
- -gcolumn-info
- -gno-column-info
- اطلاعات ستون موقعیت را به جای صرفاً فایل و خط، در اطلاعات اشکالزدایی DWARF درج میکند. این گزینه به طور پیشفرض فعال است.
- -gstatement-frontiers
- -gno-statement-frontiers
- این گزینه باعث میشود GCC در بازنمود داخلی خود نشانگرهایی در ابتدای دستورها ایجاد کند و آنها را در طول فرایند کامپایل تقریباً در جای خود نگه دارد، تا از آنها برای هدایت خروجی نشانگرهای "is_stmt" در جدول شماره خط استفاده کند. این گزینه هنگام کامپایل با بهینهسازی (-Os، -O1، -O2 و ...) و تولید اطلاعات اشکالزدایی DWARF 2 در سطح عادی، به طور پیشفرض فعال است.
- -gvariable-location-views
- -gvariable-location-views=incompat5
- -gno-variable-location-views
- فهرستهای
موقعیت
متغیر را با
شمارههای
view فزاینده
که از جدول
شماره خط
استنباط
میشوند
تکمیل
میکند. این
کار به
مصرفکنندگان
اطلاعات
اشکالزدایی
امکان
میدهد تا
وضعیت را در
نقاط خاصی
از برنامه
بررسی
کنند، حتی
اگر هیچ
دستورالعمل
مرتبط با
موقعیتهای
کد مبدأ
مربوطه در
آن نقطه
وجود
نداشته
باشد. اگر
اسمبلر
فاقد
پشتیبانی
از
شمارههای
view در
جدولهای
شماره خط
باشد، این
امر موجب
میشود
کامپایلر
جدول شماره
خط را خود
صادر کند،
که معمولاً
فشردگی
آنها را تا
حدی کاهش
میدهد.
جدولهای
شماره خط و
فهرستهای
موقعیت
تکمیلشده
کاملاً
سازگار با
گذشته
هستند،
بنابراین
مصرفکنندگان
اطلاعات
اشکالزدایی
که از این
افزونهها
آگاه
نیستند نیز
میتوانند
آنها را
بخوانند،
هرچند
بهرهای هم
از آنها
نخواهند
برد.
این گزینه به طور پیشفرض هنگام تولید اطلاعات اشکالزدایی DWARF 2 در سطح عادی فعال است، مادامی که پشتیبانی اسمبلر وجود داشته باشد، -fvar-tracking-assignments فعال باشد و -gstrict-dwarf فعال نباشد. هنگامی که پشتیبانی اسمبلر در دسترس نباشد، این گزینه ممکن است همچنان فعال شود، اما GCC را مجبور به صدور جدولهای شماره خط داخلی میکند، و اگر -ginternal-reset-location-views فعال نباشد، این امر به احتمال بسیار قوی به عدم تطابق بیسروصدای نماهای موقعیت منجر خواهد شد.
یک بازنمود پیشنهادی برای شمارههای view وجود دارد که با قالب فهرست موقعیت معرفیشده در DWARF 5 سازگار با گذشته نیست؛ این بازنمود را میتوان با -gvariable-location-views=incompat5 فعال کرد. این گزینه ممکن است در آینده حذف شود و صرفاً به عنوان یک پیادهسازی مرجع از بازنمود پیشنهادی ارائه شده است. انتظار نمیرود مصرفکنندگان اطلاعات اشکالزدایی از این قالب گسترشیافته پشتیبانی کنند و آنها از رمزگشایی فهرستهای موقعیتی که از آن استفاده میکنند ناتوان خواهند بود.
- -ginternal-reset-location-views
- -gno-internal-reset-location-views
- تلاش برای تعیین نماهای موقعیتی که میتوان آنها را از فهرستهای نمای موقعیت حذف کرد. این کار مستلزم آن است که کامپایلر تخمینهای بسیار دقیقی از طول دستورالعملها داشته باشد که همیشه اینطور نیست، و ممکن است هنگام استفاده از اسمبلری که از فهرستهای نمای موقعیت پشتیبانی نمیکند، باعث تولید خاموش فهرستهای نمای نادرست شود. اسمبلر گنو هرگونه خطایی از این دست را با برچسب "view number mismatch" مشخص میکند. این گزینه فقط در پورتهایی فعال است که یک تابع تخمین قابل اعتماد تعریف کرده باشند.
- -ginline-points
- -gno-inline-points
- اطلاعات اشکالزدایی گسترشیافته را برای توابع درونخطیشده تولید میکند. نشانگرهای ردیابی نمای موقعیت در نقاط ورود درونخطی درج میشوند تا بتوان آدرس و شمارههای view را محاسبه کرده و در اطلاعات اشکالزدایی خروجی داد. این قابلیت را میتوان مستقل از نماهای موقعیت فعال کرد که در این صورت شمارههای view در خروجی قرار نخواهند گرفت، اما تنها همراه با مرزهای دستور (statement frontiers) قابل فعالسازی است و به طور پیشفرض تنها در صورتی فعال میشود که نماهای موقعیت فعال باشند.
- -gz[=type]
- تولید بخشهای اشکالزدایی فشرده در قالب DWARF، در صورت پشتیبانی شدن. اگر type مشخص نشود، نوع پیشفرض به قابلیتهای اسمبلر و پیونددهنده مورد استفاده بستگی دارد. type میتواند یکی از مقادیر none (بخشهای اشکالزدایی فشرده نشوند)، zlib (استفاده از فشردهسازی zlib در قالب ELF gABI) یا zstd (استفاده از فشردهسازی zstd در قالب ELF gABI) باشد. اگر پیونددهنده از نوشتن بخشهای اشکالزدایی فشرده پشتیبانی نکند، گزینه رد میشود. در غیر این صورت، چنانچه اسمبلر از آنها پشتیبانی نکند، -gz هنگام تولید فایلهای شیء بدون هشدار نادیده گرفته میشود.
- -femit-struct-debug-baseonly
- اطلاعات
اشکالزدایی
را برای
انواع
ساختارمانند
تنها زمانی
صادر
میکند که
نام پایه
فایل منبع
کامپایل با
نام پایه
فایلی که
ساختار در
آن تعریف
شده است
مطابقت
داشته باشد.
این گزینه اندازه اطلاعات اشکالزدایی را به میزان قابل توجهی کاهش میدهد، اما با احتمال از دست رفتن چشمگیر اطلاعات نوع برای دیباگر همراه است. برای گزینهای با شدت کمتر، به -femit-struct-debug-reduced مراجعه کنید. برای کنترل دقیقتر، به -femit-struct-debug-detailed مراجعه کنید.
این گزینه تنها با خروجی اشکالزدایی DWARF کار میکند.
- -femit-struct-debug-reduced
- اطلاعات
اشکالزدایی
را برای
انواع
ساختارمانند
تنها زمانی
صادر
میکند که
نام پایه
فایل منبع
کامپایل با
نام پایه
فایلی که
نوع در آن
تعریف شده
است مطابقت
داشته
باشد، مگر
اینکه
ساختار یک
قالب (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، اینها تخصیصهای غیرصریح از کلاسهای قالب یا کلاسهای غیرقالب درون موارد بالا هستند. زبانهای برنامهنویسی دیگر دارای generics هستند، اما -femit-struct-debug-detailed هنوز آنها را پیادهسازی نکرده است.
کلمه سوم، فایلهای منبع را برای آن دسته از ساختارهایی تعیین میکند که کامپایلر باید اطلاعات اشکالزداییشان را صادر کند. مقادیر none و any معنای معمول را دارند. مقدار base به این معنی است که نام پایه فایلی که اعلان نوع در آن ظاهر میشود باید با نام پایه فایل اصلی کامپایل مطابقت داشته باشد. در عمل، این بدان معناست که هنگام کامپایل foo.c، اطلاعات اشکالزدایی برای انواع اعلانشده در آن فایل و foo.h تولید میشود، اما برای سایر فایلهای سرایند تولید نمیگردد. مقدار sys به معنای انواعی است که شرایط base را برآورده میکنند یا در سرایندهای سیستمی یا کامپایلر اعلان شدهاند.
ممکن است برای تعیین بهترین تنظیمات برای برنامه خود نیاز به آزمون و آزمایش داشته باشید.
مقدار پیشفرض -femit-struct-debug-detailed=all است.
این گزینه تنها با خروجی اشکالزدایی DWARF کار میکند.
- -fno-dwarf2-cfi-asm
- صادر کردن اطلاعات unwind مربوط به DWARF به عنوان بخش ".eh_frame" تولیدشده توسط کامپایلر به جای استفاده از دستورالعملهای ".cfi_*" در GAS..IP -fno-eliminate-unused-debug-types 4 بهطور معمول، هنگام تولید خروجی DWARF، کامپایلر GCC از تولید نمادهای اشکالزدایی برای نوعهایی که در هیچ کجای فایل منبعِ در حال کامپایل استفاده نشدهاند، خودداری میکند. گاهی اوقات مفید است که GCC اطلاعات اشکالزدایی را برای تمام انواع اعلانشده در یک واحد ترجمه (compilation unit) صادر کند، فارغ از اینکه در عمل در آن واحد استفاده شده باشند یا خیر؛ برای نمونه زمانی که در اشکالزدا (debugger) بخواهید مقداری را به نوعی که عملاً در برنامهتان استفاده نشده (اما اعلان شده است) تبدیل نوع (cast) کنید. با این حال، در اغلب موارد این کار باعث هدر رفتن حجم قابل توجهی از فضا میشود.
گزینههای کنترل بهینهسازی (Options That Control Optimization)
این گزینهها انواع مختلفی از بهینهسازیها را کنترل میکنند.
بدون تعیین هیچ گزینه بهینهسازی، هدف کامپایلر کاهش هزینه و زمان کامپایل و فراهم کردن شرایطی است که اشکالزدایی نتایج مورد انتظار را حاصل کند. در این حالت دستورها مستقل هستند: اگر برنامه را با یک نقطه توقف (breakpoint) بین دستورها متوقف کنید، میتوانید مقداری جدید به هر متغیری نسبت دهید یا شمارنده برنامه (program counter) را به هر دستور دیگری در تابع هدایت کنید و دقیقاً همان نتایجی را بگیرید که از کد منبع انتظار دارید.
فعال کردن پرچمهای بهینهسازی باعث میشود کامپایلر تلاش کند تا کارایی و/یا اندازه کد را به بهای افزایش زمان کامپایل و احتمالاً کاهش توانایی اشکالزدایی برنامه بهبود بخشد.
کامپایلر بهینهسازی را بر پایه شناختی که از برنامه دارد انجام میدهد. کامپایل چندین فایل بهطور همزمان در قالب یک فایل خروجی واحد به کامپایلر اجازه میدهد تا هنگام کامپایل هر کدام از فایلها، از اطلاعات بهدستآمده از تمامی فایلها استفاده کند.
همه بهینهسازیها مستقیماً با یک پرچم کنترل نمیشوند. در این بخش فقط بهینهسازیهایی فهرست شدهاند که دارای پرچم اختصاصی هستند.
بیشتر بهینهسازیها در سطح -O0 یا در صورتی که سطح -O در خط فرمان مشخص نشده باشد، کاملاً غیرفعال میشوند؛ حتی اگر پرچمهای بهینهسازی منفرد بهطور جداگانه تعیین شده باشند. بهطور مشابه، -Og نیز بسیاری از مراحل (passes) بهینهسازی را متوقف میکند.
بسته به معماری مقصد و نحوه پیکربندی GCC، ممکن است در هر سطح -O مجموعهای کمی متفاوت از بهینهسازیها نسبت به موارد ذکر شده در اینجا فعال شود. میتوانید GCC را با دستور -Q --help=optimizers اجرا کنید تا از مجموعه دقیق بهینهسازیهای فعال در هر سطح مطلع شوید.
- -O
- -O1
- --optimize
- بهینهسازی.
کامپایل با
بهینهسازی
زمان
بیشتری
میبرد و
برای توابع
بزرگ،
حافظه
بسیار
بیشتری
مصرف
میکند.
با گزینه -O، کامپایلر تلاش میکند تا اندازه کد و زمان اجرا را بدون اجرای بهینهسازیهایی که زمان کامپایل بالایی میطلبند، کاهش دهد.
گزینه -O سطح بهینهسازی توصیهشده برای کدهای بزرگِ تولیدشده توسط ماشین است، چرا که تعادلی معقول میان زمان صرفشده برای کامپایل و مصرف حافظه برقرار میکند: سطوح بالاتر بهینهسازی، عملیات را با پیچیدگی الگوریتمی بیشتری نسبت به -O انجام میدهند.
گزینه -O پرچمهای بهینهسازی زیر را فعال میکند:
-fauto-inc-dec -fbranch-count-reg -fcombine-stack-adjustments -fcompare-elim -fcprop-registers -fdce -fdefer-pop -fdelayed-branch -fdse -fforward-propagate -fguess-branch-probability -fif-conversion -fif-conversion2 -finline-functions-called-once -fipa-modref -fipa-profile -fipa-pure-const -fipa-reference -fipa-reference-addressable -fivopts -fmerge-constants -fmove-loop-invariants -fmove-loop-stores -fomit-frame-pointer -freorder-blocks -fshrink-wrap -fshrink-wrap-separate -fsplit-wide-types -fssa-backprop -fssa-phiopt -ftree-bit-ccp -ftree-ccp -ftree-ch -ftree-coalesce-vars -ftree-copy-prop -ftree-dce -ftree-dominator-opts -ftree-dse -ftree-forwprop -ftree-fre -ftree-phiprop -ftree-pta -ftree-scev-cprop -ftree-sink -ftree-slsr -ftree-sra -ftree-ter -funit-at-a-time
- -O2
- بهینهسازی
حتی بیشتر.
کامپایلر GCC
تقریباً
تمامی
بهینهسازیهای
پشتیبانیشده
را که
مستلزم
مصالحه
میان فضا و
سرعت
نیستند،
انجام
میدهد. در
مقایسه با
-O، این
گزینه هم
زمان
کامپایل و
هم کارایی
کد
تولیدشده
را افزایش
میدهد.
گزینه -O2 تمامی پرچمهای بهینهسازی تعیینشده توسط -O1 را روشن میکند. این گزینه همچنین پرچمهای بهینهسازی زیر را نیز فعال میسازد:
-falign-functions -falign-jumps -falign-labels -falign-loops -fcaller-saves -fcode-hoisting -fcrossjumping -fcse-follow-jumps -fcse-skip-blocks -fdelete-null-pointer-checks -fdep-fusion -fdevirtualize -fdevirtualize-speculatively -fexpensive-optimizations -ffinite-loops -fgcse -fgcse-lm -fhoist-adjacent-loads -finline-functions -finline-small-functions -findirect-inlining -fipa-bit-cp -fipa-cp -fipa-icf -fipa-ra -fipa-sra -fipa-vrp -fisolate-erroneous-paths-dereference -flra-remat -foptimize-crc -foptimize-sibling-calls -foptimize-strlen -fpartial-inlining -fpeephole2 -freorder-blocks-algorithm=stc -freorder-blocks-and-partition -freorder-functions -frerun-cse-after-loop -fschedule-insns -fschedule-insns2 -fsched-interblock -fsched-spec -fspeculatively-call-stored-functions -fstore-merging -fstrict-aliasing -fthread-jumps -ftree-builtin-call-dce -ftree-loop-vectorize -ftree-pre -ftree-slp-vectorize -ftree-switch-conversion -ftree-tail-merge -ftree-vrp -fvect-cost-model=very-cheap
لطفاً به هشدار ذیل -fgcse در رابطه با اجرای -O2 برای برنامههایی که از دستورهای پرش محاسبهشده (computed gotos) استفاده میکنند، توجه داشته باشید.
- -O3
- بهینهسازی
باز هم
بیشتر.
گزینه -O3
تمام
بهینهسازیهای
مشخصشده
توسط -O2 را
روشن کرده و
علاوه بر
آن،
پرچمهای
بهینهسازی
زیر را نیز
فعال
میکند:
-fgcse-after-reload -fipa-cp-clone -floop-interchange -floop-unroll-and-jam -fpeel-loops -fpredictive-commoning -fsplit-loops -fsplit-paths -ftree-loop-distribution -ftree-partial-pre -funswitch-loops -fvect-cost-model=dynamic -fversion-loops-for-strides.IP -O0 4 کاهش زمان کامپایل و تولید نتایج مورد انتظار در خطایابی. این حالت پیشفرض است.
در سطح -O0، کامپایلر GCC بیشتر مراحل بهینهسازی را بهطور کامل غیرفعال میکند؛ این مراحل حتی اگر صراحتاً در خط فرمان فعال شوند، یا توسط -Q --help=optimizers بهعنوان گزینههای فعالِ پیشفرض فهرست شده باشند، اجرا نخواهند شد. بسیاری از بهینهسازیهای انجامشده توسط GCC به مراحل تحلیل کد یا استانداردسازی وابسته هستند که با -O فعال میشوند، و اجرای مجزای هر مرحله بهینهسازی به تنهایی مفید نخواهد بود.
- -Os
- بهینهسازی
برای
اندازه کد.
-Os تمام
بهینهسازیهای
-O2 را فعال
میکند به
جز مواردی
که اغلب
باعث
افزایش
اندازه کد
میشوند:
-falign-functions -falign-jumps -falign-labels -falign-loops -fprefetch-loop-arrays -freorder-blocks-algorithm=stc
این گزینه همچنین -finline-functions را فعال میکند، کامپایلر را وادار میسازد تا بهجای سرعت اجرا برای اندازه کد تنظیم شود، و بهینهسازیهای بیشتری را که برای کاهش حجم کد طراحی شدهاند انجام میدهد.
- -Ofast
- نادیده گرفتن انطباق دقیق با استانداردها. -Ofast تمام بهینهسازیهای -O3 را فعال میکند. همچنین بهینهسازیهایی را فعال میکند که برای همه برنامههای منطبق بر استاندارد معتبر نیستند. این گزینه پرچمهای -ffast-math، -fallow-store-data-races و پرچم ویژه Fortran یعنی -fstack-arrays (مگر اینکه -fmax-stack-var-size مشخص شده باشد) و همچنین -fno-protect-parens را فعال میسازد. این پرچم گزینه -fsemantic-interposition را غیرفعال میکند.
- -Og
- بهینهسازی
با در نظر
داشتن
تجربه
خطایابی
(دیباگ). -Og
باید سطح
بهینهسازی
انتخابی
برای چرخه
استاندارد
ویرایش-کامپایل-دیباگ
باشد، که
ترکیبی
معقول از
بهینهسازی،
کامپایل
سریع و
تجربه
خطایابی
مناسب را
بهویژه
برای
کدهایی با
بار
انتزاعی
بالا ارائه
میدهد.
برخلاف -O0،
این گزینه
-fvar-tracking-assignments و -fvar-tracking
را فعال
میکند که
اطلاعات
خطایابی را
در مقدمه (prologue)
و مؤخره (epilogue)
توابع بهتر
از -O0
مدیریت
میکنند.
همانند -O0، گزینه -Og تعدادی از مراحل بهینهسازی را بهطور کامل نادیده میگیرد تا گزینههای مجزای کنترلکننده آنها هیچ تأثیری نداشته باشند. در غیر این صورت، -Og تمام پرچمهای بهینهسازی -O1 را به جز مواردی که تداخل زیادی با خطایابی دارند فعال میکند:
-fbranch-count-reg -fdelayed-branch -fdse -fif-conversion -fif-conversion2 -finline-functions-called-once -fmove-loop-invariants -fmove-loop-stores -fssa-phiopt -ftree-bit-ccp -ftree-dse -ftree-pta -ftree-sra
- -Oz
- بهینهسازی تهاجمی برای اندازه بهجای سرعت. این عمل در صورتی که دستورالعملها به بایتهای کمتری برای کدگذاری نیاز داشته باشند، ممکن است تعداد دستورالعملهای اجراشده را افزایش دهد. -Oz رفتاری مشابه با -Os دارد، از جمله فعالسازی اکثر بهینهسازیهای -O2.
اگر از چندین گزینه -O، همراه با شماره سطح یا بدون آن استفاده کنید، آخرین گزینه اثرگذار خواهد بود.
گزینههایی به شکل -fflag پرچمهای مستقل از ماشین را مشخص میکنند. بیشتر پرچمها دارای هر دو فرم مثبت و منفی هستند؛ فرم منفی -ffoo بهصورت -fno-foo است. در جدول زیر، تنها یکی از فرمها فهرست شده است---همان فرمی که معمولاً استفاده میکنید. میتوانید فرم دیگر را با حذف یا افزودن no- مشخص کنید.
گزینههای زیر بهینهسازیهای خاصی را کنترل میکنند. آنها یا توسط گزینههای -O فعال میشوند یا مرتبط با گزینههای فعالشده هستند. در موارد نادری که «تنظیم دقیق» بهینهسازیهای انجامشونده مورد نظر است، میتوانید از پرچمهای زیر استفاده کنید.
- -fno-defer-pop
- برای ماشینهایی که باید آرگومانها را پس از فراخوانی تابع از پشته بردارند (pop کنند)، همیشه به محض بازگشت هر تابع، آرگومانها را بردارید. در سطوح -O1 و بالاتر، -fdefer-pop حالت پیشفرض است؛ این ویژگی به کامپایلر اجازه میدهد تا آرگومانها را برای چندین فراخوانی تابع روی پشته انباشته کند و همه آنها را یکجا بردارد.
- -fforward-propagate
- انجام یک
مرحله
انتشار رو
به جلو روی RTL.
این مرحله
سعی میکند
دو
دستورالعمل
را ترکیب
کرده و
بررسی کند
که آیا
نتیجه
میتواند
سادهتر
شود یا خیر.
اگر باز
کردن حلقه
فعال باشد،
دو مرحله
انجام
میشود و
مرحله دوم
پس از باز
کردن حلقه
زمانبندی
خواهد شد.
این گزینه بهطور پیشفرض در سطوح بهینهسازی -O1، -O2، -O3 و -Os فعال است.
- -favoid-store-forwarding
- -fno-avoid-store-forwarding
- بسیاری از
CPUها هنگامی
که یک
بارگذاری (load)
تا حدی به
ذخیرهسازیهای
(store) کوچکتری
پیشین
وابسته
باشد،
چرخههای
متعددی
متوقف
میشوند (stall).
این مرحله
سعی میکند
چنین
مواردی را
تشخیص داده
و با تغییر
ترتیب
بارگذاری و
ذخیرهسازی
و سپس اصلاح
مقدار
بارگذاریشده،
از این
جریمه
زمانی
جلوگیری
کند.
بهطور پیشفرض غیرفعال است.
- -ffp-contract=style
- -ffp-contract=off ادغام
عبارات
ممیز شناور
را غیرفعال
میکند.
-ffp-contract=fast ادغام
عبارات
ممیز شناور
مانند
ایجاد
عملیات ضرب
و جمع
ادغامشده
(fused multiply-add) را در
صورتی که
مقصد از
آنها
پشتیبانی
بومی داشته
باشد، فعال
میکند. -ffp-contract=on
ادغام
عبارات
ممیز شناور
را در صورت
مجاز بودن
طبق
استاندارد
زبان فعال
میکند. این
قابلیت
برای C و C++
پیادهسازی
شده است که
در آن،
ادغام درون
یک عبارت
مجاز است،
اما بین
دستورهای
مجزا مجاز
نیست.
پیشفرض برای C در حالت منطبق بر استاندارد (-std=c11 یا مشابه آن) -ffp-contract=off است، و در غیر این صورت -ffp-contract=fast خواهد بود.
- -ffp-int-builtin-inexact
- به توابع
داخلی
"ceil"،
"floor"،
"round" و
"trunc"، و
انواع
"float" و
"long double"
آنها
اجازه
میدهد کدی
تولید کنند
که برای
آرگومانهای
غیرصحیح،
استثنای
ممیز شناور
«inexact» را فعال
کند.
استانداردهای
ISO C99 و C11 به این
توابع
اجازه
ایجاد
استثنای
«inexact» را
میدهند،
اما ISO/IEC TS 18661-1:2014،
اتصالات C
به IEEE 754-2008
همانگونه
که در ISO C23
ادغام شده
است، به این
توابع چنین
اجازهای
نمیدهد.
حالت پیشفرض -fno-fp-int-builtin-inexact است که ایجاد این استثنا را غیرمجاز میداند، مگر اینکه C17 یا استانداردی قدیمیتر از C انتخاب شده باشد. این گزینه هیچ اثری ندارد مگر اینکه -ftrapping-math فعال باشد.
حتی اگر -fno-fp-int-builtin-inexact استفاده شود، در صورتی که توابع یک فراخوانی کتابخانهای ایجاد کنند و پیادهسازی کتابخانه از TS 18661 پیروی نکند، ممکن است استثنای «inexact» ایجاد شود.
- -fomit-frame-pointer
- حذف
اشارهگر
فریم در
توابعی که
به آن نیازی
ندارند. این
کار از
دستورالعملهای
ذخیره،
راهاندازی
و بازیابی
اشارهگر
فریم
جلوگیری
میکند؛ در
بسیاری از
معماریهای
مقصد
همچنین یک
ثبات اضافی
را در دسترس
قرار
میدهد.
در برخی از معماریهای مقصد این پرچم تأثیری ندارد زیرا توالی فراخوانی استاندارد همیشه از یک اشارهگر فریم استفاده میکند، بنابراین نمیتوان آن را حذف کرد.
توجه داشته باشید که -fno-omit-frame-pointer تضمین نمیکند اشارهگر فریم در همه توابع استفاده شود. چندین معماری مقصد همیشه اشارهگر فریم را در توابع برگ (leaf functions) حذف میکنند.
بهطور پیشفرض در -O1 و بالاتر فعال است.
- -foptimize-crc
- تشخیص
حلقههای
محاسبهکننده
CRC (انجام
تقسیم
طولانی
چندجملهای)
و جایگزینی
آنها با یک
پیادهسازی
سریعتر.
تشخیص CRCهای
۸، ۱۶، ۳۲ و
۶۴ بیتی با
چندجملهای
ثابت بدون
بیت ۱
پیشرو،
برای هر دو
حالت ترتیب
بیت رو به
جلو و بیت
معکوس. اگر
معماری
مقصد از
دستورالعمل
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-atomics
- -fno-inline-atomics
- درونخطیسازی عملیاتهای __atomic در صورت در دسترس بودن توالی دستورالعملهای بدون قفل (lock-free). این بهینهسازی بهطور پیشفرض فعال است.
- -finline-stringops[=fn]
- بسط
درونخطی
عملیاتهای
حافظه و
رشته (در
حال حاضر
تنها
"memset")،
حتی زمانی
که طول
متغیر باشد
یا به
اندازهای
بزرگ باشد
که نیاز به
حلقه داشته
باشد. این
گزینه
بیشترین
کاربرد را
همراه با
-ffreestanding و -fno-builtin
دارد.
در برخی شرایط، این گزینه به کامپایلر اجازه میدهد کدی تولید کند که از تراز و مضارب طول شناختهشده بهره میبرد، اما حتی در آن صورت هم ممکن است کارایی کمتری نسبت به پیادهسازیهای بهینهشده زمان اجرا داشته باشد، و حجم کد را چنان افزایش دهد که حتی یک پیادهسازی مشترک با کارایی کمتر، به دلیل استفاده بهتر از حافظههای نهان کد (code caches)، سریعتر اجرا شود. این گزینه بهطور پیشفرض غیرفعال است..IP -fno-inline 4 هیچ تابعی را بهصورت درونخطی (inline) بسط نده، مگر توابعی که با مشخصهٔ "always_inline" علامتگذاری شده باشند. در صورت عدم بهینهسازی، این رفتار پیشفرض است.
میتوان با علامتگذاری توابع منفرد با مشخصهٔ "noinline"، آنها را از درونخطی شدن معاف کرد.
- -finline-small-functions
- هنگامی که
بدنهٔ
توابع
کوچکتر از
کد مورد
انتظار
برای
فراخوانی
تابع باشد،
آنها را در
فراخوانندههایشان
ادغام کن
(به طوری که
اندازهٔ
کلی برنامه
کوچکتر
شود).
کامپایلر
با روشهای
ابتکاری (heuristic)
تصمیم
میگیرد که
کدام توابع
به اندازهٔ
کافی ساده
هستند که
ارزش ادغام
به این روش
را داشته
باشند. این
درونخطیسازی
برای تمامی
توابع
اعمال
میشود،
حتی توابعی
که بهصورت
inline اعلان
نشدهاند.
در سطوح -O2، -O3 و -Os فعال است.
- -findirect-inlining
- فراخوانیهای
غیرمستقیمی
را که به
لطف
درونخطیسازیهای
پیشین مشخص
شده که در
زمان
کامپایل
شناختهشده
هستند نیز
درونخطی
کن. این
گزینه تنها
زمانی
اثرگذار
است که خودِ
درونخطیسازی
با
گزینههای
-finline-functions یا -finline-small-functions
فعال شده
باشد.
در سطوح -O2، -O3 و -Os فعال است.
- -finline-functions
- تمام توابع
را برای
درونخطیسازی
در نظر
بگیر، حتی
اگر
بهصورت inline
اعلان نشده
باشند.
کامپایلر
با روشهای
ابتکاری
تصمیم
میگیرد که
ادغام کدام
توابع به
این شیوه
ارزش دارد.
اگر تمام فراخوانیها به یک تابع دادهشده ادغام شوند و تابع بهصورت "static" اعلان شده باشد، در حالت عادی کد اسمیلی مستقلی برای آن تابع تولید نمیشود.
در سطوح -O2، -O3 و -Os فعال است. همچنین توسط -fprofile-use و -fauto-profile فعال میگردد.
- -finline-functions-called-once
- تمام توابع
"static" را
که تنها یک
بار
فراخوانی
شدهاند،
برای
درونخطی
شدن در
فراخوانندهشان
در نظر
بگیر، حتی
اگر با
"inline"
مشخص نشده
باشند. اگر
فراخوانی
به یک تابع
معین ادغام
شود، آن
تابع
بهتنهایی
در خروجی کد
اسمبلی
قرار
نمیگیرد.
در سطوح -O1، -O2، -O3 و -Os فعال است، اما در -Og خیر.
- -fearly-inlining
- توابع
مشخصشده
با "always_inline"
و توابعی که
اندازهٔ
بدنهٔ
آنها
کوچکتر از
سربار
فراخوانی
تابع به نظر
میرسد را
زودهنگام و
پیش از
انجام
ابزارگذاری
(instrumentation) با -fprofile-generate و
گذر واقعی
درونخطیسازی،
درونخطی
کن. این عمل
سربار
ارزیابی
کارایی (profiling)
را به میزان
چشمگیری
کاهش
میدهد و
معمولاً
سرعت
درونخطیسازی
را در
برنامههایی
که دارای
زنجیرههای
طولانی از
توابع
پوششی (wrapper)
تودرتو
هستند
افزایش
میدهد.
بهطور پیشفرض فعال است.
- -fipa-sra
- جایگزینی
اسکالر
بینروالی
ساختارها
(aggregates)، حذف
پارامترهای
بیاستفاده،
و جایگزینی
پارامترهای
ارجاعی با
پارامترهای
مقداری را
انجام بده.
در سطوح -O2، -O3 و -Os فعال است.
- -finline-limit=n
- کامپایلر GCC
بهطور
پیشفرض
اندازهٔ
توابعی که
میتوانند
درونخطی
شوند را
محدود
میکند. این
پرچم امکان
کنترل کلی
این
محدودیت را
فراهم
میسازد. n
اندازهٔ
توابعی است
که
میتوانند
بر حسب
تعداد
شبهدستورها
درونخطی
شوند.
درونخطیسازی در عمل توسط مجموعهای از پارامترهای داخلی کنترل میشود که در مستندات GCC Internals تشریح شدهاند و معمولاً نباید مستقیماً تغییر داده شوند.
نکته: ممکن است هیچ مقداری برای -finline-limit وجود نداشته باشد که دقیقاً نتیجهای معادل رفتار پیشفرض داشته باشد.
نکته: شبهدستور در این زمینهٔ خاص، معیاری انتزاعی از اندازهٔ تابع را نشان میدهد. این مفهوم بههیچوجه به معنای شمارش دستورالعملهای اسمبلی نیست و از این رو ممکن است تعریف دقیق آن از یک نسخه به نسخهٔ دیگر تغییر کند.
- -fno-keep-inline-dllexport
- این یک نگارش ریزدانهتر از -fkeep-inline-functions است که فقط برای توابعی اعمال میشود که با مشخصه یا declspec مربوط به "dllexport" اعلان شده باشند.
- -fkeep-inline-functions
- در C، توابع "static" اعلانشده با "inline" را حتی اگر در تمام فراخوانندههایشان درونخطی شده باشند، در فایل شیء درج کن. این سوییچ بر توابعی که از افزونهٔ "extern inline" در GNU C90 استفاده میکنند تأثیری ندارد. در C++، همه و تکتک توابع درونخطی را در فایل شیء درج کن.
- -fkeep-static-functions
- توابع "static" را حتی در صورتی که هرگز استفاده نشده باشند، در فایل شیء درج کن.
- -fkeep-static-consts
- هنگامی که
بهینهسازی
غیرفعال
است،
متغیرهای
اعلانشده
بهصورت
"static const" را
در فایل شیء
درج کن، حتی
اگر هیچ
ارجاعی به
آنها وجود
نداشته
باشد.
کامپایلر GCC این گزینه را بهطور پیشفرض فعال میکند. اگر میخواهید کامپایلر را وادار کنید تا مستقل از فعال بودن یا نبودن بهینهسازی، ارجاع داده شدن به متغیر را بررسی کند، از گزینهٔ -fno-keep-static-consts استفاده کنید.
- -fmerge-constants
- تلاش برای
ادغام
ثابتهای
یکسان
(ثابتهای
رشتهای و
ممیز شناور)
در میان
واحدهای
ترجمه (compilation units).
در صورتی که اسمبلر و پیونددهنده پشتیبانی کنند، این گزینه در کامپایلهای بهینهشده بهطور پیشفرض فعال است. برای جلوگیری از این رفتار، از -fno-merge-constants استفاده کنید.
در سطوح -O1، -O2، -O3 و -Os فعال است.
- -fmerge-all-constants
- تلاش برای
ادغام
ثابتهای
یکسان و
متغیرهای
یکسان.
این گزینه به معنای بهکارگیری -fmerge-constants نیز هست. این گزینه علاوه بر موارد تحت پوشش -fmerge-constants، مواردی چون آرایههای با مقدار اولیهٔ ثابت یا متغیرهای با مقدار اولیهٔ ثابت با انواع صحیح یا ممیز شناور را نیز لحاظ میکند. زبانهایی مانند C یا C++ ایجاب میکنند که هر متغیر، از جمله نمونههای متعدد از متغیری یکسان در فراخوانیهای بازگشتی، آدرسهای حافظهٔ مجزایی داشته باشند؛ بنابراین استفاده از این گزینه منجر به رفتاری ناسازگار با استاندارد (non-conforming) میشود.
- -fmodulo-sched
- زمانبندی مدولو چرخشی (swing modulo scheduling) را بلافاصله قبل از نخستین گذر زمانبندی اجرا کن. این گذر درونیترین حلقهها را بررسی کرده و با همپوشانی تکرارهای مختلف، دستورالعملهای آنها را بازآرایی میکند.
- -fmodulo-sched-allow-regmoves
- زمانبندی مدولو تهاجمیتر مبتنی بر SMS را با مجاز دانستن جابهجایی ثباتها (register moves) انجام بده. با تنظیم این پرچم، برخی یالهای پادوابستگی (anti-dependences) حذف میشوند که موجب تولید reg-moveها بر اساس تحلیل محدودهٔ حیات (life-range analysis) میگردد. این گزینه تنها در صورت فعال بودن -fmodulo-sched مؤثر خواهد بود.
- -fno-branch-count-reg
- گذر
بهینهسازی
بررسی
فرصتهای
استفاده از
دستورالعملهای
“کاهش و
انشعاب”
روی ثبات
شمارنده به
جای توالی
دستورالعملهایی
که ثبات را
کاهش داده،
با صفر
مقایسه
کرده و سپس
بر اساس
نتیجه
انشعاب
ایجاد
میکنند را
غیرفعال کن.
این گزینه
فقط در
معماریهایی
که از چنین
دستورالعملهایی
پشتیبانی
میکنند
معنادار
است، از
جمله x86، PowerPC، IA-64
و S/390. توجه
داشته
باشید که
گزینهٔ
-fno-branch-count-reg
دستورالعملهای
کاهش و
انشعاب
تولیدشده
توسط سایر
گذرهای
بهینهسازی
را از جریان
دستورالعملها
حذف
نمیکند.
پیشفرض در -O1 و بالاتر، به جز -Og، گزینهٔ -fbranch-count-reg است.
- -fno-function-cse
- آدرسهای
توابع را در
ثباتها
قرار نده؛
کاری کن که
هر
دستورالعمل
فراخوانندهٔ
یک تابع
ثابت،
صراحتاً
حاوی آدرس
آن تابع
باشد.
این گزینه منجر به کدی با کارایی کمتر میشود، اما برخی ترفندهای خاص که خروجی اسمبلر را دستکاری میکنند ممکن است در صورت عدم استفاده از این گزینه با بهینهسازیهای اعمالشده تداخل پیدا کنند.
پیشفرض -ffunction-cse است.
- -ffuse-ops-with-volatile-access
- بهینهسازی
محدود
عملیاتِ
دارای
دسترسی به
حافظهٔ
فرّار (volatile) را
در صورتی که
موجب تغییر
معناشناسی
تشریحشده
در نشود،
مجاز بدار.
پیشفرض -ffuse-ops-with-volatile-access است.
- -fno-zero-initialized-in-bss
- اگر مقصد از
بخش BSS
پشتیبانی
کند، GCC
بهطور
پیشفرض
متغیرهایی
که با صفر
مقداردهی
اولیه
شدهاند را
درون BSS قرار
میدهد. این
کار
میتواند
فضای مورد
نیاز در کد
خروجی را
کاهش دهد.
این گزینه رفتار فوق را غیرفعال میکند زیرا برخی برنامهها صراحتاً وابسته به قرارگیری متغیرها در بخش data هستند؛ به عنوان مثال، برای این که فایل اجرایی نهایی بتواند ابتدای آن بخش را پیدا کرده و/یا فرضیاتی بر اساس آن بنا کند.
پیشفرض، به جز در زبان Ada، گزینهٔ -fzero-initialized-in-bss است.
- -fthread-jumps
- بهینهسازیهایی
را انجام
بده که
بررسی
میکنند
آیا یک پرش
به مکانی
انشعاب
پیدا
میکند که
در آنجا
مقایسهٔ
دیگری تحت
پوشش
مقایسهٔ
اول قرار
دارد یا
خیر. در این
صورت، بسته
به اینکه
مشخص شود
شرط صحیح
است یا غلط،
انشعاب
نخست به
مقصد
انشعاب دوم
یا نقطهای
بلافاصله
پس از آن
هدایت
میشود.
در سطوح -O1، -O2، -O3 و -Os فعال است..IP -fsplit-wide-types 4 هنگام استفاده از نوعی که چند ثبات را اشغال میکند، مانند "long long" در یک سیستم ۳۲-بیتی، ثباتها را تفکیک کرده و آنها را بهطور مستقل تخصیص میدهد. این کار معمولاً کد بهتری برای این نوعها تولید میکند، اما ممکن است اشکالزدایی را دشوارتر سازد.
در سطوح -O1، -O2، -O3، -Os فعال است.
- -fsplit-wide-types-early
- انواع عریض
را در مراحل
اولیه
بهطور
کامل تفکیک
میکند، به
جای اینکه
خیلی دیر
انجام شود.
این گزینه
هیچ تأثیری
ندارد مگر
اینکه -fsplit-wide-types
فعال باشد.
این حالت در برخی مقاصد پیشفرض است.
- -fcse-follow-jumps
- در حذف
عبارات
فرعی مشترک
(CSE)،
دستورالعملهای
پرش را
هنگامی که
مقصد پرش از
هیچ مسیر
دیگری در
دسترس
نیست،
پیمایش
میکند.
برای مثال،
زمانی که CSE
با یک عبارت
"if"
دارای بند
"else"
مواجه
میشود،
هنگام
نادرست
بودن شرط
مورد
آزمایش،
پرش را
دنبال
میکند.
در سطوح -O2، -O3، -Os فعال است.
- -fcse-skip-blocks
- این گزینه
مشابه -fcse-follow-jumps
است، اما
باعث
میشود که CSE
پرشهایی
را دنبال
کند که
بهطور
مشروط از
روی
بلوکها رد
میشوند.
هنگامی که CSE
با یک عبارت
سادهٔ
"if" بدون
بند else مواجه
میشود،
-fcse-skip-blocks باعث
میشود CSE
پرش اطراف
بدنهٔ
"if" را
دنبال کند.
در سطوح -O2، -O3، -Os فعال است.
- -frerun-cse-after-loop
- اجرای مجدد
حذف عبارات
فرعی مشترک
پس از انجام
بهینهسازیهای
حلقه.
در سطوح -O2، -O3، -Os فعال است.
- -fgcse
- یک گام حذف
عبارات
فرعی مشترک
سراسری
انجام
میدهد. این
گام همچنین
انتشار
سراسری
ثابت و کپی
را انجام
میدهد.
نکته: هنگام کامپایل برنامهای که از computed 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
انجام
میشود. هدف
این گام
پاکسازی
سرریزهای
ثبات (spilling)
زائد است.
توسط -O3، -fprofile-use و -fauto-profile فعال میشود.
- -faggressive-loop-optimizations
- این گزینه به بهینهساز حلقه میگوید که از قیدهای زبان برنامهنویسی برای به دست آوردن حدود شمار تکرارهای یک حلقه استفاده کند. این گزینه فرض میکند که کد حلقه رفتار تعریفنشده (undefined behavior) ایجاد نمیکند؛ مانند ایجاد سرریز عدد صحیح علامتدار یا دسترسی به آرایه فراتر از محدوده. حدود شمار تکرارهای یک حلقه برای هدایت باز کردن حلقه (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
- تلاش
میکند تا
پرشهای
شرطی را به
معادلهای
بدون
انشعاب
تبدیل کند.
این مورد
شامل
استفاده از
دستورالعملهای
انتقال
شرطی، min، max،
تنظیم
پرچمها و
abs، و برخی
ترفندهای
قابل انجام
با محاسبات
استاندارد
است.
استفاده از
اجرای شرطی
روی
تراشههایی
که این
ویژگی در
آنها در
دسترس است،
توسط -fif-conversion2
کنترل
میشود.
در سطوح -O1، -O2، -O3، -Os فعال است، اما نه با -Og.
- -fif-conversion2
- استفاده از
اجرای شرطی
(در صورت در
دسترس بودن)
برای تبدیل
پرشهای
شرطی به
معادلهای
بدون
انشعاب.
در سطوح -O1، -O2، -O3، -Os فعال است، اما نه با -Og.
- -fdeclone-ctor-dtor
- استاندارد
C++ ABI نیازمند
چندین
نقطهٔ ورود
برای
سازندهها
و
ویرانکنندهها
است: یکی
برای
زیرشیء
پایه، یکی
برای شیء
کامل، و یکی
برای
ویرانکنندهٔ
مجازی که پس
از آن operator delete را
فراخوانی
میکند.
برای
سلسلهمراتبی
با
پایههای
مجازی،
انواع پایه
و کامل
همزاد (clone)
یکدیگرند،
که به معنای
دو نسخه از
تابع است.
با این
گزینه،
انواع پایه
و کامل به
thunkهایی
تبدیل
میشوند که
یک
پیادهسازی
مشترک را
فراخوانی
میکنند.
توسط -Os فعال میشود.
- -fdelete-null-pointer-checks
- فرض میکند
که
برنامهها
نمیتوانند
بهطور
ایمن
اشارهگرهای
تهی (null) را
مبنازدایی
کنند، و هیچ
عنصر کد یا
دادهای در
نشانی صفر
قرار ندارد.
این گزینه
بهینهسازیهای
سادهٔ
ادغام
ثابتها را
در تمام
سطوح
بهینهسازی
فعال
میکند.
علاوه بر
این، سایر
گامهای
بهینهسازی
در GCC از این
پرچم برای
کنترل
تحلیلهای
جریان
دادهٔ
سراسری
استفاده
میکنند که
بررسیهای
بیهوده
برای
اشارهگرهای
تهی را حذف
مینمایند؛
این فرض بر
این اساس
است که
دسترسی
حافظه به
نشانی صفر
همیشه به یک
trap منجر
میشود،
بنابراین
اگر
اشارهگری
پس از
اینکه
قبلاً
مبنازدایی
شده بررسی
شود،
نمیتواند
تهی باشد.
با این حال توجه داشته باشید که در برخی محیطها این فرض درست نیست. برای برنامههایی که به آن رفتار وابستهاند، از -fno-delete-null-pointer-checks برای غیرفعال کردن این بهینهسازی استفاده کنید.
این گزینه بهطور پیشفرض در بیشتر مقاصد فعال است. در AVR و MSP430، این گزینه بهطور کامل غیرفعال است.
گامهایی که از اطلاعات جریان داده استفاده میکنند بهطور مستقل در سطوح مختلف بهینهسازی فعال میشوند.
- -fdevirtualize
- تلاش میکند تا فراخوانی توابع مجازی را به فراخوانیهای مستقیم تبدیل کند. این کار هم درون یک رویه و هم بین رویهها به عنوان بخشی از درونخطیسازی غیرمستقیم (-findirect-inlining) و انتشار ثوابت بینرویهای (-fipa-cp) انجام میشود. در سطوح -O2، -O3، -Os فعال است.
- -fdevirtualize-speculatively
- تلاش میکند تا فراخوانی توابع مجازی را به فراخوانیهای مستقیم حدسی تبدیل کند. بر اساس تحلیل گراف وراثت نوع، برای یک فراخوانی مشخص مجموعهای از مقاصد محتمل تعیین میشود. اگر این مجموعه کوچک باشد (ترجیحاً با اندازهٔ ۱)، فراخوانی را به یک دستور شرطی تبدیل میکند که بین فراخوانی مستقیم و غیرمستقیم تصمیم میگیرد. فراخوانیهای حدسی بهینهسازیهای بیشتری مانند درونخطیسازی را ممکن میسازند. هنگامی که پس از بهینهسازیهای بیشتر بیفایده به نظر برسند، دوباره به شکل اولیه برگردانده میشوند.
- -fdevirtualize-at-ltrans
- اطلاعات
اضافی مورد
نیاز برای
مجازیزدایی
تهاجمی را
هنگام
اجرای
بهینهساز
زمان پیوند
در حالت
تبدیلات
محلی
جاریسازی
میکند. این
گزینه
امکان
مجازیزدایی
بیشتری را
فراهم
میکند اما
حجم
دادههای
جاریسازیشده
را به میزان
قابل توجهی
افزایش
میدهد. به
همین دلیل
بهطور
پیشفرض
غیرفعال
است..IP -fexpensive-optimizations 4
انجام
تعدادی
بهینهسازی
جزئی که از
نظر
محاسباتی
نسبتاً
پرهزینهاند.
در سطوح -O2، -O3 و -Os فعال میشود.
- -fext-dce
- -fno-ext-dce
- انجام حذف کد مرده (dead code elimination) روی بسطهای صفر و علامت، با استفاده از تحلیل ویژهٔ جریان داده (dataflow analysis).
- -free
- تلاش برای
حذف
دستورالعملهای
بسطِ (extension)
زاید. این
گزینه
بهویژه
برای
معماری x86-64
سودمند است
که پس از
نوشتن در
نیمهٔ ۳۲
بیتی
پایینی
ثباتهای
۶۴ بیتی،
بهطور
ضمنی آنها
را با صفر
بسط میدهد
(zero-extends).
برای Alpha، AArch64، LoongArch، PowerPC، RISC-V، SPARC، h83000 و x86 در سطوح -O2، -O3 و -Os فعال است.
- -fno-lifetime-dse
- در ++C مقدار یک شیء تنها تحت تأثیر تغییراتی است که در طول عمر (lifetime) آن رخ میدهد: زمانی که سازنده (constructor) آغاز میشود، شیء دارای مقداری نامشخص است و هر تغییری در طول عمر شیء، پس از نابود شدن شیء مرده (dead) تلقی میشود. در حالت معمول حذف ذخیرههای مرده (dead store elimination) از این موضوع بهره میبرد؛ اگر کد شما متکی بر ماندگاری مقدار حافظهٔ شیء فراتر از طول عمر شیء است، میتوانید با این پرچم این بهینهسازی را غیرفعال کنید. برای حفظ ذخیرهها پیش از آغاز سازنده (برای نمونه به این دلیل که operator new شما فضای ذخیرهسازی شیء را پاکسازی میکند) اما همچنان مرده در نظر گرفتن شیء پس از ویرانگر (destructor)، میتوانید از -flifetime-dse=1 استفاده کنید. رفتار پیشفرض را میتوان بهصراحت با -flifetime-dse=2 تعیین کرد. -flifetime-dse=0 معادل -fno-lifetime-dse است.
- -flive-range-shrinkage
- تلاش برای کاهش فشار ثبات (register pressure) از طریق کوچک کردن بازهٔ حیات ثبات (live range shrinkage). این گزینه برای پردازندههای سریعی با مجموعههای ثبات کوچک یا متوسط سودمند است.
- -fira-algorithm=algorithm
- استفاده از الگوریتم رنگآمیزی مشخصشده برای تخصیصدهندهٔ یکپارچهٔ ثبات (IRA). آرگومان algorithm میتواند priority باشد که بیانگر رنگآمیزی اولویت Chow است، یا CB که رنگآمیزی Chaitin-Briggs را مشخص میکند. رنگآمیزی Chaitin-Briggs برای همهٔ معماریها پیادهسازی نشده است، اما برای مقاصدی که از آن پشتیبانی میکنند به دلیل تولید کد بهتر، پیشفرض است.
- -fira-region=region
- استفاده از ناحیههای مشخصشده برای تخصیصدهندهٔ یکپارچهٔ ثبات. آرگومان region باید یکی از موارد زیر باشد:
- all
- استفاده از همهٔ حلقهها به عنوان ناحیههای تخصیص ثبات. این حالت میتواند بهترین نتایج را برای ماشینهایی با مجموعه ثباتهای کوچک یا نامنظم ارائه دهد.
- mixed
- استفاده از همهٔ حلقهها، به جز حلقههایی با فشار ثبات اندک، به عنوان ناحیه. این مقدار معمولاً در اکثر موارد و برای بیشتر معماریها بهترین نتایج را میدهد و در هنگام کامپایل با بهینهسازی سرعت (-O، -O2، ...) بهطور پیشفرض فعال است.
- one
- استفاده از کل تابع به عنوان یک ناحیهٔ واحد. این مقدار معمولاً کمترین اندازهٔ کد را به همراه دارد و بهطور پیشفرض برای -Os یا -O0 فعال است.
- -fira-hoist-pressure
- استفاده از
IRA برای
ارزیابی
فشار ثبات
در مرحلهٔ
بالابردن
کد (code hoisting pass) به
منظور
تصمیمگیری
در
بالابردن
عبارات. این
گزینه
معمولاً
منجر به کد
کوچکتر
میشود،
اما
میتواند
سرعت
کامپایلر
را کاهش
دهد.
این گزینه در سطح -Os برای همهٔ مقاصد فعال است.
- -fira-loop-pressure
- استفاده از
IRA برای
ارزیابی
فشار ثبات
در حلقهها
به منظور
تصمیمگیری
در انتقال
مقادیر
پایای حلقه
(loop invariants). این
گزینه
معمولاً
روی
ماشینهایی
با
پروندههای
ثبات بزرگ (>=
۳۲ ثبات) به
تولید کدی
سریعتر و
کوچکتر
میانجامد،
اما
میتواند
سرعت
کامپایلر
را کاهش
دهد.
این گزینه در سطح -O3 برای برخی از مقاصد فعال است.
- -fno-ira-share-save-slots
- غیرفعال کردن اشتراکگذاری جایگاههای پشته (stack slots) مورد استفاده برای ذخیرهٔ ثباتهای سختافزاریِ دستخوش تغییر در فراخوانی (call-used) که در طول فراخوانی پابرجا میمانند. به هر ثبات سختافزاری یک جایگاه پشتهٔ جداگانه تعلق میگیرد و در نتیجه چارچوبهای پشتهٔ تابع (stack frames) بزرگتر میشوند.
- -fno-ira-share-spill-slots
- غیرفعال کردن اشتراکگذاری جایگاههای پشتهٔ تخصیصیافته به شبهثباتها (pseudo-registers). به هر شبهثباتی که ثبات سختافزاری دریافت نکند، یک جایگاه پشتهٔ جداگانه تعلق میگیرد و در نتیجه چارچوبهای پشتهٔ تابع بزرگتر میشوند.
- -flra-remat
- فعالسازی
بازتولید
(rematerialization) حساس به
گراف جریان
کنترل (CFG) در LRA.
بهجای
بارگذاری
مقادیر
شبهثباتهای
سرریزشده،
اگر سودمند
باشد LRA تلاش
میکند
مقادیر را
دوباره
بازتولید
(محاسبهٔ
مجدد) کند.
در سطوح -O2، -O3 و -Os فعال است.
- -fdelayed-branch
- در صورت
پشتیبانی
در ماشین
مقصد، تلاش
برای
بازآرایی
دستورالعملها
به منظور
بهرهگیری
از
شکافهای
دستورالعمل
(instruction slots) موجود
پس از
دستورالعملهای
پرش با
تأخیر (delayed branch).
در سطوح -O1، -O2، -O3 و -Os فعال است، اما در -Og فعال نیست.
- -fschedule-insns
- در صورت
پشتیبانی
در ماشین
مقصد، تلاش
برای
بازآرایی
دستورالعملها
به منظور
حذف
وقفههای
اجرایی (execution stalls)
ناشی از
دردسترس
نبودن
دادههای
مورد نیاز.
این کار با
امکان صدور
دستورالعملهای
دیگر تا
زمان نیاز
به نتیجهٔ
بارگذاری
حافظه یا
دستور ممیز
شناور، به
ماشینهایی
که
دستورالعملهای
کند ممیز
شناور یا
بارگذاری
حافظه
دارند کمک
میکند.
بهطور سنتی در سطوح بهینهسازی -O2 و -O3 فعال است. با این حال، بسیاری از مقاصد این رفتار را لغو میکنند؛ برای نمونه، روی x86 در همهٔ سطوح غیرفعال است، در حالی که در AArch64 فقط در -O3 فعال میشود.
- -fschedule-insns2
- مشابه -fschedule-insns
است، اما یک
مرحلهٔ
زمانبندی
دستورالعمل
اضافی پس از
انجام
تخصیص ثبات
درخواست
میکند. این
گزینه
بهویژه
روی
ماشینهایی
با تعداد
نسبتاً کم
ثبات و در
شرایطی که
دستورالعملهای
بارگذاری
حافظه بیش
از یک چرخه
زمان
میبرند،
سودمند است.
در سطوح -O2، -O3 و -Os فعال است.
- -fno-sched-interblock
- غیرفعال کردن زمانبندی دستورالعملها در میان بلوکهای پایه (basic blocks)، که معمولاً در زمانبندی پیش از تخصیص ثبات (یعنی با -fschedule-insns یا در -O2 یا بالاتر) فعال است.
- -fno-sched-spec
- غیرفعال کردن انتقال حدسی (speculative motion) دستورالعملهای غیربارگذاری، که معمولاً در زمانبندی پیش از تخصیص ثبات (یعنی با -fschedule-insns یا در -O2 یا بالاتر) فعال است.
- -fsched-pressure
- فعال کردن زمانبندی دستورالعملهای حساس به فشار ثبات پیش از تخصیص ثبات. این گزینه تنها زمانی کاربرد دارد که زمانبندی پیش از تخصیص ثبات فعال باشد (یعنی با -fschedule-insns یا در -O2 یا بالاتر). استفاده از این گزینه میتواند با جلوگیری از افزایش فشار ثبات به بیش از تعداد ثباتهای سختافزاری موجود و سرریزهای (spills) متعاقب در تخصیص ثبات، کد تولیدشده را بهبود بخشیده و اندازهٔ آن را کاهش دهد.
- -fsched-spec-load
- اجازه دادن به جابهجایی حدسی برخی از دستورالعملهای بارگذاری (load). این گزینه تنها زمانی کاربرد دارد که زمانبندی پیش از تخصیص ثبات فعال باشد (یعنی با -fschedule-insns یا در -O2 یا بالاتر).
- -fsched-spec-load-dangerous
- اجازه دادن به جابهجایی حدسی دستورالعملهای بارگذاری بیشتر. این گزینه تنها زمانی کاربرد دارد که زمانبندی پیش از تخصیص ثبات فعال باشد (یعنی با -fschedule-insns یا در -O2 یا بالاتر).
- -fsched-stalled-insns
- -fsched-stalled-insns=n
- تعیین اینکه در طول مرحلهٔ دوم زمانبندی چه تعداد دستورالعمل (در صورت وجود) میتوانند پیش از موعد از صف دستورالعملهای متوقفشده (stalled) به فهرست آماده (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)
استفاده
میکند. این
کار اجازهٔ
جابهجایی
از مرزهای
بلوک پایه
را داده و
منجر به
زمانبندیهای
سریعتر
میشود. این
گزینه
آزمایشی
است، چرا که
تمام
توصیفهای
ماشین مورد
استفاده
توسط GCC،
پردازنده (CPU)
را آنقدر
دقیق
مدلسازی
نمیکنند
که از نتایج
غیرقابلاطمینان
این
الگوریتم
جلوگیری
شود.
این گزینه تنها هنگام زمانبندی پس از تخصیص ثبات معنا دارد، یعنی همراه با -fschedule-insns2 یا در -O2 یا بالاتر.
- -fsched-group-heuristic
- هیوریستیک گروهی را در زمانبند فعال میکند. این هیوریستیک دستورالعملی را که متعلق به یک گروه زمانبندی است ترجیح میدهد. این گزینه بهطور پیشفرض در صورت فعال بودن زمانبندی، یعنی همراه با -fschedule-insns یا -fschedule-insns2 یا در -O2 یا بالاتر، فعال است.
- -fsched-critical-path-heuristic
- هیوریستیک مسیر بحرانی را در زمانبند فعال میکند. این هیوریستیک دستورالعملهای روی مسیر بحرانی را ترجیح میدهد. این گزینه بهطور پیشفرض در صورت فعال بودن زمانبندی، یعنی همراه با -fschedule-insns یا -fschedule-insns2 یا در -O2 یا بالاتر، فعال است.
- -fsched-spec-insn-heuristic
- هیوریستیک دستورالعملهای گمانهزنانه را در زمانبند فعال میکند. این هیوریستیک، دستورالعملهای گمانهزن با ضعف وابستگی بیشتر را ترجیح میدهد. این گزینه بهطور پیشفرض در صورت فعال بودن زمانبندی، یعنی همراه با -fschedule-insns یا -fschedule-insns2 یا در -O2 یا بالاتر، فعال است.
- -fsched-rank-heuristic
- هیوریستیک رتبه را در زمانبند فعال میکند. این هیوریستیک دستورالعمل متعلق به یک بلوک پایه با اندازه یا بسامد بزرگتر را ترجیح میدهد. این گزینه بهطور پیشفرض در صورت فعال بودن زمانبندی، یعنی همراه با -fschedule-insns یا -fschedule-insns2 یا در -O2 یا بالاتر، فعال است.
- -fsched-last-insn-heuristic
- هیوریستیک آخرین دستورالعمل را در زمانبند فعال میکند. این هیوریستیک دستورالعملی را که وابستگی کمتری به آخرین دستورالعمل زمانبندیشده دارد ترجیح میدهد. این گزینه بهطور پیشفرض در صورت فعال بودن زمانبندی، یعنی همراه با -fschedule-insns یا -fschedule-insns2 یا در -O2 یا بالاتر، فعال است.
- -fsched-dep-count-heuristic
- هیوریستیک تعداد وابستگی را در زمانبند فعال میکند. این هیوریستیک دستورالعملی را که دستورالعملهای بیشتری به آن وابستهاند ترجیح میدهد. این گزینه بهطور پیشفرض در صورت فعال بودن زمانبندی، یعنی همراه با -fschedule-insns یا -fschedule-insns2 یا در -O2 یا بالاتر، فعال است.
- -fspeculatively-call-stored-functions
- تلاش میکند فراخوانیهای غیرمستقیم اشارهگرهای تابع به اشارهگرهای بارگذاریشده از یک فیلد ساختار را در صورتی که تمام ذخیرهسازیهای قابلمشاهده در آن فیلد، تنها یک کاندیدای منفرد را ذخیره کنند، تبدیل کند. هنگام انجام این کار، فراخوانی به یک عبارت شرطی تبدیل میشود که بین فراخوانی مستقیم و فراخوانی غیرمستقیم اولیه تصمیمگیری میکند. این فراخوانیهای گمانهزنانه اغلب بهینهسازیهای بیشتری مانند درونخطیسازی (inlining) را امکانپذیر میسازند. چنانچه پس از بهینهسازیهای بیشتر بیفایده به نظر برسند، دوباره به شکل اولیه بازگردانده میشوند.
- -freschedule-modulo-scheduled-loops
- زمانبندی پیمانهای (modulo scheduling) پیش از زمانبندی سنتی انجام میشود. اگر یک حلقه بهصورت پیمانهای زمانبندی شود، گذرهای بعدی زمانبندی ممکن است زمانبندی آن را تغییر دهند. از این گزینه برای کنترل این رفتار استفاده کنید.
- -fselective-scheduling
- دستورالعملها را با استفاده از الگوریتم زمانبندی گزینشی زمانبندی میکند. زمانبندی گزینشی بهجای گذر اول زمانبند اجرا میشود.
- -fselective-scheduling2
- دستورالعملها را با استفاده از الگوریتم زمانبندی گزینشی زمانبندی میکند. زمانبندی گزینشی بهجای گذر دوم زمانبند اجرا میشود.
- -fsel-sched-pipelining
- خطلولهسازی نرمافزاری درونیترین حلقهها را در طول زمانبندی گزینشی فعال میکند. این گزینه هیچ تأثیری ندارد مگر اینکه یکی از گزینههای -fselective-scheduling یا -fselective-scheduling2 فعال باشد.
- -fsel-sched-pipelining-outer-loops
- هنگام خطلولهسازی حلقهها در طول زمانبندی گزینشی، حلقههای بیرونی را نیز خطلولهسازی میکند. این گزینه هیچ تأثیری ندارد مگر آنکه -fsel-sched-pipelining فعال باشد.
- -fsemantic-interposition
- برخی از قالبهای شیء مانند ELF، امکان مداخله/جایگزینی نمادها (interposition) را توسط پیونددهندهٔ پویا فراهم میکنند. این بدان معناست که برای نمادهای صادرشده از DSO، کامپایلر نمیتواند انتشار بینرویهای، درونخطیسازی و سایر بهینهسازیها را با این احتمال که ممکن است تابع یا متغیر مورد نظر تغییر کند، انجام دهد. اگرچه این قابلیت، به عنوان مثال برای بازنویسی توابع تخصیص حافظه با یک پیادهسازی اشکالزدایی مفید است، اما از نظر کیفیت کد هزینهٔ بالایی دارد. با -fno-semantic-interposition کامپایلر فرض میکند که اگر مداخله برای توابع رخ دهد، تابع جایگزین دقیقاً همان معناشناسی (و عوارض جانبی) را خواهد داشت. به همین ترتیب اگر مداخله برای متغیرها رخ دهد، سازندهٔ متغیر یکسان خواهد بود. این پرچم هیچ اثری بر روی توابعی که صراحتاً بهصورت inline اعلان شدهاند ندارد (جایی که هرگز به مداخله اجازه داده نمیشود معناشناسی را تغییر دهد) و بر روی نمادهایی که صراحتاً weak اعلان شدهاند نیز بیاثر است.
- -fshrink-wrap
- مقدمهٔ تابع (prologue) را تنها پیش از بخشهایی از تابع که به آن نیاز دارند، بهجای ابتدای تابع، صادر میکند. این پرچم بهطور پیشفرض در -O و بالاتر فعال است.
- -fshrink-wrap-separate
- بخشهای مجزای مقدمه و مؤخره را بهطور جداگانه بستهبندی انقباضی (shrink-wrap) میکند تا آن بخشها تنها در صورت نیاز اجرا شوند. این گزینه بهطور پیشفرض روشن است، اما اثری ندارد مگر اینکه -fshrink-wrap نیز فعال باشد و هدف مورد نظر از آن پشتیبانی کند.
- -fcaller-saves
- تخصیص
مقادیر به
ثباتهایی
را که در
اثر
فراخوانی
توابع
تخریب
میشوند،
با صادر
کردن
دستورالعملهای
اضافه برای
ذخیره و
بازیابی
ثباتها در
اطراف چنین
فراخوانیهایی
ممکن
میسازد.
چنین
تخصیصی
تنها در
صورتی
انجام
میشود که
به نظر برسد
به تولید کد
بهتری منجر
خواهد شد.
این گزینه در برخی ماشینها همواره بهطور پیشفرض فعال است؛ معمولاً ماشینهایی که هیچ ثبات نگهدارندهٔ وضعیت فراخوانی (call-preserved) برای استفادهٔ جایگزین ندارند.
در سطوح -O2، -O3 و -Os فعال است.
- -fcombine-stack-adjustments
- تنظیمات
پشته (push و pop) و
ارجاعات
حافظهٔ
پشته را
ردیابی
کرده و سپس
تلاش
میکند
روشهایی
برای ادغام
آنها
بیابد.
بهطور پیشفرض در -O1 و بالاتر فعال است.
- -fipa-ra
- از
ثباتهای
caller-save برای
تخصیص
استفاده
میکند اگر
آن ثباتها
توسط هیچ
تابع
فراخوانیشدهای
استفاده
نشوند. در
این حالت
نیازی به
ذخیره و
بازیابی
آنها در
اطراف
فراخوانیها
نیست. این
کار تنها در
صورتی
امکانپذیر
است که
توابع
فراخوانیشده
بخشی از
همان واحد
ترجمه (compilation unit)
تابع جاری
بوده و پیش
از آن
کامپایل
شده باشند.
در سطوح -O2، -O3 و -Os فعال است؛ با این حال این گزینه در صورتی که کد تولیدشده برای پروفایلسازی ابزاربندی شود (-p یا -pg)، یا اگر استفادهٔ callee از ثباتها نتواند بهطور دقیق مشخص شود (این اتفاق در اهدافی رخ میدهد که مقدمهها و مؤخرهها را در RTL آشکار نمیکنند)، غیرفعال است.
- -fconserve-stack
- تلاش میکند مصرف پشته را به حداقل برساند. کامپایلر تلاش میکند فضای کمتری از پشته را مصرف کند، حتی اگر این کار باعث کندتر شدن برنامه شود. این گزینه مستلزم تنظیم پارامتر large-stack-frame روی 100 و پارامتر large-stack-frame-growth روی 400 است.
- -ftree-reassoc
- بازشرکتپذیری (reassociation) را روی درختها انجام میدهد. این پرچم بهطور پیشفرض در -O1 و بالاتر فعال است.
- -fcode-hoisting
- بالا بردن کد (code hoisting) را انجام میدهد. بالا بردن کد تلاش میکند ارزیابی عباراتی را که در تمام مسیرها تا خروج تابع اجرا میشوند، تا حد امکان به مراحل اولیه منتقل کند. این کار بهویژه برای بهینهسازی اندازهٔ کد مفید است، اما اغلب به سرعت اجرای کد نیز کمک میکند. این پرچم بهطور پیشفرض در -O2 و بالاتر فعال است.
- -ftree-pre
- حذف افزونگی جزئی (PRE) را روی درختها انجام میدهد. این پرچم بهطور پیشفرض در -O2 و -O3 فعال است.
- -ftree-partial-pre
- حذف افزونگی جزئی (PRE) را تهاجمیتر میکند. این پرچم بهطور پیشفرض در -O3 فعال است.
- -ftree-forwprop
- انتشار به جلو (forward propagation) را روی درختها انجام میدهد. این پرچم بهطور پیشفرض در -O1 و بالاتر فعال است.
- -ftree-fre
- حذف افزونگی کامل (FRE) را روی درختها انجام میدهد. تفاوت بین FRE و PRE این است که FRE تنها عباراتی را در نظر میگیرد که در تمامی مسیرهای منتهی به محاسبهٔ افزونه محاسبه شده باشند. این تحلیل سریعتر از PRE است، اگرچه افزونگیهای کمتری را شناسایی میکند. این پرچم بهطور پیشفرض در -O1 و بالاتر فعال است..IP -ftree-phiprop 4 بالا کشیدن بارگذاریها از اشارهگرهای شرطی را روی درختها انجام میدهد. این گذر بهطور پیشفرض در -O1 و بالاتر فعال است.
- -fhoist-adjacent-loads
- بارگذاریها از هر دو شاخه یک if-then-else را در صورتی که بارگذاریها از مکانهای مجاور در یک ساختار یکسان باشند و معماری مقصد دستورالعمل انتقال شرطی داشته باشد، بهصورت گمانهزنانه به بالا منتقل میکند. این پرچم بهطور پیشفرض در -O2 و بالاتر فعال است.
- -ftree-copy-prop
- انتشار رونوشت (copy propagation) را روی درختها انجام میدهد. این گذر عملیاتهای کپی غیرضروری را حذف میکند. این پرچم بهطور پیشفرض در -O1 و بالاتر فعال است.
- -fipa-pure-const
- توابعی را که خالص (pure) یا ثابت (constant) هستند شناسایی میکند. بهطور پیشفرض در -O1 و بالاتر فعال است.
- -fipa-reference
- متغیرهای ایستایی (static) را که از واحد کامپایل خارج نمیشوند، شناسایی میکند. بهطور پیشفرض در -O1 و بالاتر فعال است.
- -fipa-reference-addressable
- متغیرهای ایستای فقطخواندنی، فقطنوشتنی و غیرقابلآدرسدهی را شناسایی میکند. بهطور پیشفرض در -O1 و بالاتر فعال است.
- -fipa-reorder-for-locality
- زنجیرههای فراخوانی را در چیدمان باینری نزدیک به هم گروهبندی میکند تا موضعیت کد بهبود یافته و فواصل پرش بین توابعی که مرتباً فراخوانی میشوند به حداقل برسد. برخلاف -freorder-functions، این گذر زنجیرههای فراخوانی بین توابع را در نظر گرفته و آنها را با یکدیگر گروهبندی میکند، بهجای اینکه همه توابع داغ/عادی/سرد/هرگز اجرانشده را در بخشهای جداگانه قرار دهد. برخلاف -fprofile-reorder-functions، هدف آن بهبود موضعیت کد در طول کل زمان اجرای برنامه است، بهجای اینکه تنها بر زمان راهاندازی برنامه تمرکز کند. این گزینه با گزینه صریح -flto-partition= ناسازگار است، چرا که یک طرح پارتیشنبندی سفارشی را اعمال میکند. در صورت استفاده از این گزینه، توصیه میشود از بازخورد پروفایل (profile feedback) نیز استفاده شود، اما در غیر این صورت این گزینه بهطور پیشفرض فعال نیست.
- -fipa-stack-alignment
- تراز پشته (stack alignment) را در جایگاههای فراخوانی در صورت امکان کاهش میدهد. بهطور پیشفرض فعال است.
- -fipa-pta
- تحلیل بینارویهای اشارهگر و تحلیل بینارویهای تغییر و ارجاع را انجام میدهد. این گزینه میتواند در واحدهای کامپایل بزرگ باعث مصرف بیشازحد حافظه و زمان کامپایل شود. این گزینه در هیچ سطح بهینهسازی بهطور پیشفرض فعال نیست.
- -fipa-profile
- انتشار بینارویهای پروفایل را انجام میدهد. توابعی که تنها از توابع سرد فراخوانی میشوند، بهعنوان سرد (cold) علامتگذاری میشوند. همچنین توابعی که یکبار اجرا میشوند (مانند "cold"، "noreturn"، سازندهها یا نابودکنندههای ایستا) شناسایی میشوند. سپس توابع سرد و بخشهای فاقد حلقه از توابعی که یکبار اجرا میشوند، برای اندازه بهینهسازی میگردند. بهطور پیشفرض در -O1 و بالاتر فعال است.
- -fipa-modref
- تحلیل بینارویهای mod/ref را انجام میدهد. این بهینهسازی عوارض جانبی توابع (مکانهایی از حافظه که تغییر یافته یا به آنها ارجاع داده میشود) را تحلیل کرده و بهینهسازی بهتری را در مرزهای فراخوانی تابع ممکن میسازد. این پرچم بهطور پیشفرض در -O1 و بالاتر فعال است.
- -fipa-cp
- انتشار بینارویهای مقادیر ثابت را انجام میدهد. این بهینهسازی برنامه را تحلیل میکند تا مشخص شود چه زمانی مقادیر ارسالی به توابع ثابت هستند و سپس بر این اساس بهینهسازی میکند. این بهینهسازی در صورتی که برنامه مقادیر ثابتی داشته باشد که به توابع ارسال میشوند، میتواند کارایی را بهمیزان قابلتوجهی افزایش دهد. این پرچم بهطور پیشفرض در -O2، -Os و -O3 فعال است. همچنین توسط -fprofile-use و -fauto-profile نیز فعال میشود.
- -fipa-cp-clone
- شبیهسازی تابع (function cloning) را انجام میدهد تا انتشار بینارویهای مقادیر ثابت قویتر شود. در زمان فعال بودن، انتشار بینارویهای مقادیر ثابت هنگامی که تابعی با دید بیرونی بتواند با آرگومانهای ثابت فراخوانی شود، شبیهسازی تابع را انجام میدهد. از آنجا که این بهینهسازی میتواند چندین رونوشت از توابع ایجاد کند، ممکن است اندازه کد را بهمیزان چشمگیری افزایش دهد. این پرچم بهطور پیشفرض در -O3 فعال است. همچنین توسط -fprofile-use و -fauto-profile نیز فعال میشود.
- -fipa-bit-cp
- در صورت فعال بودن، انتشار بیتی بینارویهای مقادیر ثابت را انجام میدهد. این پرچم بهطور پیشفرض در -O2 و توسط -fprofile-use و -fauto-profile فعال است. این گزینه نیازمند فعال بودن -fipa-cp است.
- -fipa-vrp
- در صورت فعال بودن، انتشار بینارویهای بازههای مقادیر را انجام میدهد. این پرچم بهطور پیشفرض در -O2 فعال است. این گزینه نیازمند فعال بودن -fipa-cp است.
- -fipa-icf-functions
- -fipa-icf-variables
- -fipa-icf
- تاکردن
کدهای
یکسان (Identical Code Folding)
را برای
توابع
(-fipa-icf-functions)،
متغیرهای
فقطخواندنی
(-fipa-icf-variables)، یا هر
دو (-fipa-icf)
انجام
میدهد. این
بهینهسازی
اندازه کد
را کاهش
میدهد و
ممکن است با
جایگزین
کردن یک
تابع با
تابعی
معادل با
نامی
متفاوت،
پشتههای
بازگشایی (unwind
stacks) را دچار
اختلال کند.
این
بهینهسازی
زمانی که
بهینهسازی
زمان پیوند
فعال باشد،
مؤثرتر عمل
میکند.
اگرچه رفتار آن مشابه بهینهسازی ICF در Gold Linker است، اما ICF در GCC در سطوح متفاوتی عمل میکند و بنابراین بهینهسازیها یکسان نیستند - همارزیهایی وجود دارند که تنها توسط GCC یافت میشوند و همارزیهایی که تنها توسط Gold پیدا میشوند.
-fipa-icf بهطور پیشفرض در -O2 و -Os فعال است.
- -flate-combine-instructions
- دو گذر
ترکیب
دستورالعملها
را که
نسبتاً در
مراحل
پایانی
فرایند
کامپایل
اجرا
میشوند
فعال
میکند. یکی
از گذرها
پیش از
تخصیص
ثباتها و
دیگری پس از
تخصیص
ثباتها
اجرا
میشود. هدف
اصلی این
گذرها
جایگزینی
تعاریف در
تمام موارد
استفاده
است.
بیشتر معماریهای مقصد این پرچم را بهطور پیشفرض در -O2 و -Os فعال میکنند.
- -flive-patching=level
- بهینهسازیهای
GCC را برای
تولید
خروجی
مناسب برای
وصلهزنی
زنده (live-patching)
کنترل
میکند.
اگر بهینهسازی کامپایلر از بدنه یک تابع یا اطلاعات استخراجشده از بدنه آن برای بهینهسازی/تغییر تابعی دیگر استفاده کند، به تابع دوم یک تابع متأثر از تابع اول گفته میشود. اگر یک تابع وصله شود، توابع متأثر آن نیز باید وصله شوند.
توابع متأثر توسط بهینهسازیهای بینارویهای کامپایلر تعیین میشوند. برای نمونه، یک فراخواننده متأثر میشود هنگامی که یک تابع درون فراخوانندهاش درونخطسازی شود، تابعی شبیهسازی شده و فراخواننده آن تغییر کند تا این کلون جدید را فراخوانی کند، یا اطلاعات خالص/ثابت بودن تابع استخراج شود تا فراخوانندههای مستقیم یا غیرمستقیم آن بهینهسازی شوند، و غیره.
معمولاً هر چه بهینهسازیهای IPA بیشتری فعال باشند، تعداد توابع متأثر برای هر تابع بیشتر خواهد بود. بهمنظور کنترل تعداد توابع متأثر و محاسبه آسانتر فهرست توابع متأثر، بهینهسازیهای IPA میتوانند بهصورت جزئی در دو سطح مختلف فعال شوند.
آرگومان level باید یکی از موارد زیر باشد:
- inline-clone
- تنها
بهینهسازیهای
درونخطسازی
و
شبیهسازی
را فعال
میکند، که
شامل
درونخطسازی،
شبیهسازی،
جایگزینی
اسکالر
بینارویهای
تجمیعها و
درونخطسازی
جزئی است.
در نتیجه،
هنگام
وصلهزنی
یک تابع،
تمام
فراخوانندههای
آن و
فراخوانندههای
کلونهای
آن متأثر
میشوند،
بنابراین
لازم است
آنها نیز
وصله شوند.
گزینه -flive-patching=inline-clone پرچمهای بهینهسازی زیر را غیرفعال میکند: -fwhole-program -fipa-pta -fipa-reference -fipa-ra -fipa-icf -fipa-icf-functions -fipa-icf-variables -fipa-bit-cp -fipa-vrp -fipa-pure-const -fipa-reference-addressable -fipa-stack-alignment -fipa-modref
- inline-only-static
- تنها
درونخطسازی
توابع
ایستا را
فعال
میکند. در
نتیجه،
هنگام
وصلهزنی
یک تابع
ایستا،
تمام
فراخوانندههای
آن متأثر
شده و
بنابراین
لازم است
آنها نیز
وصله شوند.
علاوه بر تمام پرچمهایی که -flive-patching=inline-clone غیرفعال میکند، -flive-patching=inline-only-static پرچمهای بهینهسازی اضافی زیر را نیز غیرفعال میکند: -fipa-cp-clone -fipa-sra -fpartial-inlining -fipa-cp
هنگامی که -flive-patching بدون مشخص کردن هیچ مقداری تعیین شود، مقدار پیشفرض inline-clone است.
این پرچم بهطور پیشفرض غیرفعال است.
توجه داشته باشید که -flive-patching همراه با بهینهسازی زمان پیوند (-flto) پشتیبانی نمیشود. مسیرهایی را شناسایی میکند که به دلیل ارجاعزدایی از یک اشارهگر تهی (در صورت فعال بودن -fdelete-null-pointer-checks) یا تقسیم بر صفر، رفتارهای نادرست یا تعریفنشده ایجاد میکنند. این مسیرها را از جریان اصلی کنترل جدا کرده و دستور دارای رفتار نادرست یا تعریفنشده را به یک تله (trap) تبدیل میکند. این پرچم بهطور پیشفرض در -O2 و بالاتر فعال است.
- -fisolate-erroneous-paths-attribute
- مسیرهایی را شناسایی میکند که به دلیل استفاده از یک مقدار تهی به روشی که توسط صفت "returns_nonnull" یا "nonnull" منع شده است، رفتار نادرست یا تعریفنشده ایجاد میکنند. این مسیرها را از جریان اصلی کنترل جدا کرده و دستور دارای رفتار نادرست یا تعریفنشده را به یک تله (trap) تبدیل میکند. این گزینه در حال حاضر فعال نیست، اما ممکن است در آینده در -O2 فعال شود.
- -ftree-sink
- انتقال رو به جلوی ذخیرهسازی (forward store motion) را روی درختها انجام میدهد. این پرچم بهطور پیشفرض در -O1 و بالاتر فعال است.
- -ftree-bit-ccp
- انتشار ثابت بیتی شرطی پراکنده را روی درختها انجام داده و اطلاعات همترازی اشارهگر را منتشر میکند. این گذر فقط روی متغیرهای اسکالر محلی عمل میکند و بهطور پیشفرض در -O1 و بالاتر، به جز -Og، فعال است. این گزینه نیازمند فعال بودن -ftree-ccp است.
- -ftree-ccp
- انتشار ثابت شرطی پراکنده (CCP) را روی درختها انجام میدهد. این گذر فقط روی متغیرهای اسکالر محلی عمل میکند و بهطور پیشفرض در -O1 و بالاتر فعال است.
- -fssa-backprop
- اطلاعات مربوط به استفادههای یک مقدار را در طول زنجیرهٔ تعریف به سمت بالا منتشر میکند تا تعاریف را سادهتر سازد. برای مثال، اگر علامت یک مقدار هرگز اهمیتی نداشته باشد، این گذر عملیات علامت را حذف میکند. این پرچم بهطور پیشفرض در -O1 و بالاتر فعال است.
- -fssa-phiopt
- تطبیق الگو را روی گرههای SSA PHI برای بهینهسازی کد شرطی انجام میدهد. این گذر بهطور پیشفرض در -O1 و بالاتر، به جز -Og، فعال است.
- -ftree-switch-conversion
- تبدیل مقداردهیهای اولیهٔ ساده در یک switch به مقداردهیهای اولیه از یک آرایهٔ اسکالر را انجام میدهد. این پرچم بهطور پیشفرض در -O2 و بالاتر فعال است.
- -ftree-tail-merge
- دنبال دنبالههای کُد یکسان میگردد. در صورت یافتن، یکی را با یک پرش به دیگری جایگزین میکند. این بهینهسازی به عنوان ادغام دنباله (tail merging) یا پرش متقاطع (cross jumping) شناخته میشود. این پرچم بهطور پیشفرض در -O2 و بالاتر فعال است. زمان کامپایل در این گذر را میتوان با استفاده از پارامتر max-tail-merge-comparisons و پارامتر max-tail-merge-iterations محدود کرد.
- -ftree-cselim
- حذف ذخیرهسازی شرطی را روی درختها انجام میدهد. این پرچم بهطور پیشفرض در -O1 و بالاتر در مقصدهایی که دارای دستورالعملهای جابهجایی شرطی (conditional move) هستند فعال است.
- -ftree-dce
- حذف کد مرده (DCE) را روی درختها انجام میدهد. این پرچم بهطور پیشفرض در -O1 و بالاتر فعال است.
- -ftree-builtin-call-dce
- حذف کد مردهٔ (DCE) شرطی را برای فراخوانیهای توابع توکار (built-in) انجام میدهد که ممکن است "errno" را مقداردهی کنند ولی در غیر این صورت فاقد اثر جانبی هستند. این پرچم بهطور پیشفرض در -O2 و بالاتر فعال است، در صورتی که -Os نیز مشخص نشده باشد.
- -ffinite-loops
- فرض میکند
که یک حلقه
با شرط
خروج،
سرانجام
خارج خواهد
شد و
بینهایت
تکرار
نمیشود.
این کار به
کامپایلر
اجازه
میدهد
حلقههایی
را که در
غیر این
صورت اثر
جانبی
ندارند حذف
کند و
احتمال
تکرار
بیپایان
را به عنوان
اثر جانبی
در نظر
نگیرد.
این گزینه بهطور پیشفرض در -O2 برای ++C با std=c++11- یا بالاتر فعال است.
- -ftree-dominator-opts
- مجموعهای از پاکسازیهای سادهٔ اسکالر (انتشار ثابت/رونوشت، حذف افزونگی، انتشار بازه و سادهسازی عبارت) را بر پایهٔ پیمایش درخت تسلط (dominator tree) انجام میدهد. این گزینه همچنین رزوهکشی پرش (jump threading) را برای کاهش پرشهای متوالی انجام میدهد. این پرچم بهطور پیشفرض در -O1 و بالاتر فعال است.
- -ftree-dse
- حذف ذخیرهسازی مرده (DSE) را روی درختها انجام میدهد. ذخیرهسازی مرده، ذخیرهسازی در مکانی از حافظه است که بعداً بدون هیچ بارگذاری میانی توسط ذخیرهسازی دیگری بازنویسی میشود. در این حالت میتوان ذخیرهسازی پیشین را حذف کرد. این پرچم بهطور پیشفرض در -O1 و بالاتر فعال است.
- -ftree-ch
- رونوشتبرداری از سرآیند حلقه را روی درختها انجام میدهد. این عمل سودمند است زیرا کارایی بهینهسازیهای جابهجایی کد را افزایش میدهد. همچنین باعث صرفهجویی در یک پرش میشود. این پرچم بهطور پیشفرض در -O1 و بالاتر فعال است. این گزینه برای -Os فعال نیست، زیرا معمولاً اندازهٔ کد را افزایش میدهد.
- -ftree-loop-optimize
- بهینهسازیهای حلقه را روی درختها انجام میدهد. این پرچم بهطور پیشفرض در -O1 و بالاتر فعال است.
- -ftree-loop-linear
- -floop-strip-mine
- -floop-block
- بهینهسازیهای حلقههای تودرتو را انجام میدهد. همانند -floop-nest-optimize عمل میکند. برای استفاده از این دگرگونی کد، GCC باید با --with-isl پیکربندی شده باشد تا زیرساخت دگرگونی حلقهٔ Graphite فعال گردد.
- -fgraphite-identity
- دگرگونی همانی (identity transformation) را برای graphite فعال میکند. برای هر SCoP نمایش چندوجهی را تولید کرده و آن را دوباره به gimple تبدیل میکند. با استفاده از -fgraphite-identity میتوان هزینهها یا مزایای دگرگونی GIMPLE -> GRAPHITE -> GIMPLE را بررسی کرد. برخی بهینهسازیهای جزئی نیز توسط تولیدکنندهٔ کد isl انجام میشود، مانند تفکیک نمایه و حذف کد مرده در حلقهها.
- -floop-nest-optimize
- بهینهساز حلقههای تودرتوی مبتنی بر isl را فعال میکند. این یک بهینهساز عمومی حلقههای تودرتو بر پایهٔ الگوریتمهای بهینهسازی Pluto است. این گزینه ساختار حلقهای را محاسبه میکند که برای محلی بودن دادهها و موازیسازی بهینه شده است. این گزینه آزمایشی است.
- -floop-parallelize-all
- از تحلیل وابستگی دادهٔ Graphite برای شناسایی حلقههایی که قابلیت موازیسازی دارند استفاده میکند. تمام حلقههایی را که پس از تحلیل مشخص شود فاقد وابستگیهای وابسته به دور حلقه (loop-carried dependences) هستند، بدون بررسی سودبخش بودن موازیسازی آنها، موازی میکند.
- -ftree-coalesce-vars
- هنگام انتقال برنامه به خارج از نمایش SSA، با ادغام کردن نسخههای متغیرهای گوناگون تعریفشده توسط کاربر بهجای متغیرهای موقت کامپایلر، برای کاهش رونوشتبرداری تلاش میکند. این کار ممکن است توانایی اشکالزدایی برنامهای بهینهشده را که با -fno-var-tracking-assignments کامپایل شده است، بهشدت محدود کند. در حالت نفی، این پرچم از ادغام متغیرهای کاربر در SSA جلوگیری میکند. این گزینه در صورت فعال بودن بهینهسازی، بهطور پیشفرض فعال است و در غیر این صورت کار چندانی انجام نمیدهد.
- -ftree-loop-if-convert
- تلاش میکند تا پرشهای شرطی در درونیترین حلقهها را به معادلهای بدون انشعاب تبدیل کند. هدف، حذف جریان کنترل از درونیترین حلقهها است تا توانایی گذر بردارسازی (vectorization pass) برای مدیریت این حلقهها بهبود یابد. این پرچم در صورت فعال بودن بردارسازی، بهطور پیشفرض فعال است.
- -ftree-loop-distribution
- توزیع حلقه
را انجام
میدهد. این
پرچم
میتواند
کارایی
حافظهٔ
پنهان را
روی
بدنههای
بزرگ حلقه
بهبود داده
و امکان
اعمال
بهینهسازیهای
بیشتر روی
حلقه،
مانند
موازیسازی
یا
بردارسازی
را فراهم
کند. برای
نمونه،
حلقهٔ
DO I = 1, N A(I) = B(I) + C D(I) = E(I) * F ENDDO
تبدیل میشود به
DO I = 1, N A(I) = B(I) + C ENDDO DO I = 1, N D(I) = E(I) * F ENDDO
این پرچم بهطور پیشفرض در -O3 فعال است. همچنین توسط -fprofile-use و -fauto-profile فعال میشود.
- -ftree-loop-distribute-patterns
- توزیع
الگوهایی
از حلقه را
انجام
میدهد که
میتوانند
با
فراخوانیهایی
به یک
کتابخانه
کد تولید
کنند. این
پرچم
بهطور
پیشفرض در
-O2 و
بالاتر، و
توسط -fprofile-use و
-fauto-profile فعال
است.
این گذر حلقههای مقداردهی اولیه را توزیع کرده و فراخوانی به memset صفر تولید میکند. برای نمونه، حلقهٔ DO I = 1, N A(I) = 0 B(I) = A(I) + I ENDDO
تبدیل میشود به
DO I = 1, N A(I) = 0 ENDDO DO I = 1, N B(I) = A(I) + I ENDDO
و حلقه مقداردهی اولیه به یک فراخوانی memset با صفر تبدیل میشود.
- -floop-interchange
- تعویض حلقه
(loop interchange) را
بیرون از graphite
انجام
میدهد. این
پرچم
میتواند
کارایی
حافظه نهان
(کَش) را در
حلقههای
تو در تو
بهبود
بخشیده و
اجازه دهد
بهینهسازیهای
بیشتری روی
حلقهها،
مانند
برداریسازی
(vectorization)، صورت
گیرد. برای
مثال، حلقه
for (int i = 0; i < N; i++) for (int j = 0; j < N; j++) for (int k = 0; k < N; k++) c[i][j] = c[i][j] + a[i][k]*b[k][j];تبدیل میشود به
for (int i = 0; i < N; i++) for (int k = 0; k < N; k++) for (int j = 0; j < N; j++) c[i][j] = c[i][j] + a[i][k]*b[k][j];این پرچم به طور پیشفرض در -O3 فعال است. همچنین توسط -fprofile-use و -fauto-profile فعال میشود.
- -floop-unroll-and-jam
- تبدیلهای باز کردن و ادغام حلقه (unroll and jam) را روی حلقههای امکانپذیر اعمال میکند. در حلقههای تو در تو، این کار حلقه بیرونی را با یک ضریب باز کرده و چندین حلقه درونی حاصل را با یکدیگر ادغام میکند. این پرچم به طور پیشفرض در -O3 فعال است. همچنین توسط -fprofile-use و -fauto-profile فعال میشود.
- -ftree-loop-im
- انتقال عبارات ناوردا در حلقه (loop invariant motion) را روی درختها انجام میدهد. این گذر فقط ناورداهایی را جابهجا میکند که مدیریت آنها در سطح RTL دشوار است (فراخوانیهای توابع، عملیاتی که به دنبالههای غیربدیهی از دستورالعملها (insns) گسترش مییابند). همراه با -funswitch-loops، این گزینه همچنین عملوندهای شروطی که ناوردا هستند را به بیرون از حلقه منتقل میکند تا بتوان در تعویض شاخه حلقه (loop unswitching) تنها از تحلیل ناوردایی ساده استفاده کرد. این گذر شامل انتقال ذخیرهسازی (store motion) نیز میشود.
- -ftree-loop-ivcanon
- یک شمارنده متعارف (canonical) برای تعداد تکرار در حلقههایی ایجاد میکند که تعیین تعداد تکرار آنها نیازمند تحلیلی پیچیده است. پس از آن، بهینهسازیهای بعدی میتوانند این تعداد را به آسانی تعیین کنند. این قابلیت به ویژه در ارتباط با باز کردن حلقه (unrolling) مفید است.
- -ftree-scev-cprop
- جایگزینی مقدار نهایی (final value replacement) را انجام میدهد. اگر متغیری در یک حلقه به گونهای تغییر یابد که مقدار آن هنگام خروج از حلقه تنها با استفاده از مقدار اولیه و تعداد تکرارهای حلقه قابل محاسبه باشد، استفادهها از مقدار نهایی را با چنین محاسباتی جایگزین میکند، به شرطی که هزینه محاسباتی آن به قدر کافی کم باشد. این امر وابستگیهای دادهای را کاهش داده و ممکن است سادهسازیهای بیشتری را میسر سازد. به طور پیشفرض در -O1 و بالاتر فعال است.
- -fivopts
- بهینهسازیهای متغیر القایی (کاهش توان محاسباتی (strength reduction)، ادغام متغیر القایی و حذف متغیر القایی) را روی درختها انجام میدهد. به طور پیشفرض در -O1 و بالاتر فعال است.
- -ftree-parallelize-loops
- -ftree-parallelize-loops=n
- حلقهها را
موازیسازی
میکند،
یعنی فضای
تکرار
آنها را
برای اجرا
در چندین
ریسه (thread)
تقسیم
میکند. این
بهینهسازی
تنها برای
حلقههایی
ممکن است که
تکرارهای
آنها
مستقل از
یکدیگر
بوده و
ترتیب
اجرای
آنها به
طور دلخواه
قابل
جابهجایی
باشد. این
بهینهسازی
تنها روی
ماشینهای
چندپردازندهای
و برای
حلقههایی
که از نظر
پردازشی
سنگین
هستند (CPU-intensive)،
نه
حلقههایی
که مثلاً با
پهنای باند
حافظه
محدود
شدهاند،
سودمند است.
این گزینه
متضمن -pthread
است و از
این رو تنها
روی
مقصدهایی
پشتیبانی
میشود که
از -pthread
پشتیبانی
میکنند.
هنگامی که یک مقدار مثبت n مشخص شود، تعداد ریسهها در زمان کامپایل ثابت شده و پس از کامپایل قابل تغییر نیست. کامپایلر عبارت "#pragma omp parallel num_threads(n)" را تولید میکند.
هنگامی که بدون "=n" استفاده شود (یعنی -ftree-parallelize-loops)، تعداد ریسهها در زمان اجرای برنامه از طریق متغیر محیطی OMP_NUM_THREADS تعیین میشود. اگر OMP_NUM_THREADS تنظیم نشده باشد، محیط زمان اجرای OpenMP به طور خودکار تعداد پردازندههای در دسترس را شناسایی کرده و از آن مقدار استفاده میکند. این ویژگی امکان ساخت باینریهایی را فراهم میکند که بدون نیاز به کامپایل مجدد با پیکربندیهای سختافزاری مختلف سازگار میشوند.
- -ftree-pta
- تحلیل اشارهگری محلی به تابع (function-local points-to analysis) را روی درختها انجام میدهد. این پرچم به طور پیشفرض در -O1 و بالاتر، به جز در -Og، فعال است.
- -ftree-sra
- جایگزینی اسکالر ساختارها (scalar replacement of aggregates) را انجام میدهد. این گذر ارجاعهای به ساختار را با متغیرهای اسکالر جایگزین میکند تا از ارسال زودهنگام ساختارها به حافظه جلوگیری کند. این پرچم به طور پیشفرض در -O1 و بالاتر، به جز در -Og، فعال است.
- -fstore-merging
- ادغام ذخیرهسازیهای باریک در آدرسهای حافظه متوالی را انجام میدهد. این گذر ذخیرهسازیهای پیوسته مقادیر بیواسطه که باریکتر از یک کلمه (word) هستند را در ذخیرهسازیهای عریضتر اما با تعداد کمتر ادغام میکند تا تعداد دستورالعملها کاهش یابد. این پرچم به طور پیشفرض در -O2 و بالاتر و همچنین در -Os فعال است.
- -ftree-ter
- جایگزینی عبارات موقت را در طول مرحله SSA->normal انجام میدهد. متغیرهای موقتی که تکبار تعریف و تکبار استفاده شدهاند در محل استفادهشان با عبارت تعریفکننده جایگزین میشوند. این عمل به ایجاد کدی غیر از GIMPLE منجر میشود، اما درختهای بسیار پیچیدهتری را برای کار در اختیار بسطدهندهها (expanders) قرار میدهد که به تولید کد بهتر در RTL میانجامد. این پرچم به طور پیشفرض در -O1 و بالاتر فعال است.
- -ftree-slsr
- کاهش توان محاسباتی در خط مستقیم (straight-line strength reduction) را روی درختها انجام میدهد. این عمل عبارات مرتبط شامل ضرب را شناسایی کرده و در صورت امکان آنها را با محاسبات ارزانتر جایگزین میکند. این پرچم به طور پیشفرض در -O1 و بالاتر فعال است.
- -ftree-vectorize
- برداریسازی (vectorization) را روی درختها انجام میدهد. این پرچم در صورت عدم تعیین صریح، گزینههای -ftree-loop-vectorize و -ftree-slp-vectorize را فعال میکند.
- -ftree-loop-vectorize
- برداریسازی حلقه را روی درختها انجام میدهد. این پرچم به طور پیشفرض در -O2 و توسط گزینههای -ftree-vectorize، -fprofile-use و -fauto-profile فعال میشود.
- -ftree-slp-vectorize
- برداریسازی بلوک پایه (basic block vectorization) را روی درختها انجام میدهد. این پرچم به طور پیشفرض در -O2 و توسط گزینههای -ftree-vectorize، -fprofile-use و -fauto-profile فعال میشود.
- -ftrivial-auto-var-init=choice
- متغیرهای
خودکار یا
اشیاء موقت
را با یک
الگو یا با
صفر
مقداردهی
اولیه
میکند تا
با جلوگیری
از افشا و
استفاده از
حافظه
مقداردهینشده،
امنیت و
پیشبینیپذیری
برنامه
افزایش
یابد. GCC
همچنان
متغیر
خودکاری را
که فاقد
مقدارده
اولیه صریح
است
مقداردهینشده
در نظر
میگیرد؛
گزینههای
-Wuninitialized و
-Wanalyzer-use-of-uninitialized-value
همچنان
پیامهای
هشدار را در
مورد چنین
متغیرهای
خودکار یا
اشیاء
موقتی
گزارش
خواهند داد
و کامپایلر
بهینهسازیها
را به
گونهای
انجام
میدهد که
گویی متغیر
مقداردهی
اولیه نشده
است. با این
گزینه، GCC
همچنین
هرگونه
لایه
پرکننده (padding)
مربوط به
متغیرهای
خودکار یا
اشیاء
موقتی را که
دارای نوع
داده
ساختار (structure)
یا اجتماع (union)
هستند، با
صفر
مقداردهی
اولیه
میکند. با
این حال،
پیادهسازی
فعلی
نمیتواند
متغیرهای
خودکاری را
که
مقداردهی
اولیه
آنها از
طریق
دستورات
"switch" یا
"goto" دور
زده شده
است،
مقداردهی
اولیه کند.
از گزینه
-Wtrivial-auto-var-init برای
گزارش تمام
چنین
مواردی
استفاده
کنید.
سه مقدار ممکن برای choice عبارتند از:
- uninitialized هیچ متغیر خودکاری را مقداردهی اولیه نمیکند.
- pattern متغیرهای خودکار را با مقادیری مقداردهی اولیه میکند که به احتمال زیاد باگهای منطقی را در ادامه مسیر به از کار افتادن برنامه (crash) تبدیل میکنند، در گزارشهای خرابی (crash dump) به آسانی قابل تشخیص هستند و مقادیری نیستند که برنامهنویسان بتوانند برای رفتارهای مفید برنامه به آنها تکیه کنند. مقدار فعلی الگویی تکرارشونده در سطح بایت با مقدار "0xFE" است. مقادیر استفادهشده برای مقداردهی اولیه با الگو ممکن است در آینده تغییر کنند.
- zero متغیرهای خودکار را با صفر مقداردهی اولیه میکند.
حالت پیشفرض uninitialized است به جز در C++26، که در این حالت اگر -ftrivial-auto-var-init= به کلی مشخص نشده باشد، متغیرهای خودکار یا اشیاء موقت با صفر مقداردهی اولیه میشوند، اما مقداردهی اولیه بیتهای پرکننده با صفر صورت نمیگیرد.
توجه داشته باشید که مقادیر اولیه، چه zero و چه pattern، به شیوه نمایش دادهها (در حافظه یا ثباتهای ماشین) اشاره دارند و نه به تفسیر آنها به عنوان مقادیر عددی. این تمایز ممکن است در زبانهایی که از انواع دارای انحراف (bias) یا ضرایب ضمنی پشتیبانی میکنند و با افزونههایی نظیر hardbool اهمیت داشته باشد. برای مثال، متغیری که از ۸ بیت برای نمایش مقادیر (دارای انحراف) در "range 160..400" استفاده میکند، بسته به choice با الگوهای بیتی 0x00 یا 0xFE مقداردهی اولیه میشود؛ چه این نمایشها نشاندهنده مقادیری در آن محدوده باشند یا خیر، و حتی اگر باشند، تفسیر مقدار موجود در متغیر به انحراف بستگی خواهد داشت. متغیر hardbool که فرضا از 0x5A و 0xA5 به ترتیب برای "false" و "true" استفاده میکند، با هر یک از مقادیر انتخابی (choice) مقدارده اولیه بدیهی متوقف میشود (trap)؛ یعنی مقداردهی اولیه zero به نمایش "false" تبدیل نمیشود، حتی اگر برای یک متغیر "static" از همان نوع چنین تبدیلی رخ دهد. این یعنی الگوی مقدارده اولیه به طور کلی به نوع متغیر مقداردهیشده وابسته نیست. یک استثنای قابل توجه این است که متغیرهای بولی (غیرمقاومسازیشده) که درون ثباتها جا میگیرند، حتی در صورت درخواست pattern، با مقدار "false" (صفر) مقداردهی اولیه میشوند.
میتوانید این رفتار را برای متغیری خاص با استفاده از ویژگی استاندارد متغیر "uninitialized" یا ویژگی استاندارد در C++26 یعنی "[[indeterminate]]" کنترل کنید. مدل هزینه مورد استفاده برای برداریسازی (vectorization) را تغییر میدهد. آرگومان model باید یکی از مقادیر unlimited، dynamic، cheap یا very-cheap باشد. با مدل unlimited فرض میشود که مسیر کد برداریشده سودمند است، در حالی که در مدل dynamic یک بررسی زمان اجرا از مسیر کد برداریشده محافظت میکند تا تنها برای تعداد تکرارهایی فعال شود که احتمالاً سریعتر از اجرای حلقه اسکالر اصلی اجرا میشوند. مدل cheap برداریسازی حلقههایی را که انجام آن هزینهبر و غیراقتصادی است (برای نمونه به دلیل بررسیهای زمان اجرای لازم برای وابستگی دادهها یا ترازسازی) غیرفعال میکند، اما در غیر این صورت معادل مدل dynamic است. مدل very-cheap در صورتی که هرگونه بررسی زمان اجرا برای وابستگی داده یا ترازسازی نیاز باشد، برداریسازی حلقهها را غیرفعال میسازد؛ این مدل همچنین برداریسازی حلقههای موخره (epilogue) را نیز غیرفعال میکند، اما در غیر این صورت معادل مدل cheap است.
مدل هزینه پیشفرض به سایر پرچمهای بهینهسازی بستگی دارد و یکی از مقادیر dynamic یا cheap است.
- -fsimd-cost-model=model
- مدل هزینه مورد استفاده برای برداریسازی حلقههای نشانهگذاریشده با رهنمود simd در OpenMP را تغییر میدهد. آرگومان model باید یکی از مقادیر unlimited، dynamic یا cheap باشد. تمامی مقادیر model همان معنای شرح داده شده در -fvect-cost-model را دارند و بهطور پیشفرض از مدل هزینه تعریفشده با -fvect-cost-model استفاده میشود.
- -ftree-vrp
- انتشار بازه مقادیر (Value Range Propagation) را روی درختها انجام میدهد. این عملیات مشابه گذر انتشار مقادیر ثابت (constant propagation) است، اما به جای مقادیر، بازهای از مقادیر منتشر میشوند. این امر به بهینهسازها امکان میدهد تا بررسیهای بازه غیرضروری مانند بررسی مرزهای آرایه و بررسیهای اشارهگر تهی (null pointer) را حذف کنند. این گزینه بهطور پیشفرض در -O2 و بالاتر فعال است. حذف بررسی اشارهگر تهی تنها در صورتی انجام میشود که -fdelete-null-pointer-checks فعال باشد.
- -fsplit-paths
- مسیرهای منتهی به یالهای بازگشتی (backedges) حلقه را تقسیم میکند. این میتواند حذف کدهای مرده (dead code elimination) و حذف زیرعبارتهای مشترک (common subexpression elimination) را بهبود بخشد. این گزینه بهطور پیشفرض در -O3 و بالاتر فعال است.
- -fsplit-ivs-in-unroller
- بیان
مقادیر
متغیرهای
القایی (induction variables)
را در
تکرارهای
بعدی حلقه
بازشده، با
استفاده از
مقدار
موجود در
اولین
تکرار فعال
میکند. این
کار
زنجیرههای
طولانی
وابستگی را
میشکند و
در نتیجه
کارایی
گذرهای
زمانبندی
(scheduling) را بهبود
میبخشد.
ترکیبی از -fweb و CSE اغلب برای دستیابی به همین نتیجه کافی است. با این حال، در مواردی که بدنه حلقه پیچیدهتر از یک بلوک پایه منفرد باشد، قابل اعتماد نیست. همچنین در برخی معماریها به دلیل محدودیتهای موجود در گذر CSE اصلاً کار نمیکند.
این بهینهسازی بهطور پیشفرض فعال است.
- -fvariable-expansion-in-unroller
- با این
گزینه،
کامپایلر
هنگام باز
کردن یک
حلقه،
چندین
رونوشت از
برخی
متغیرهای
محلی ایجاد
میکند که
میتواند
به کدی با
کارایی
برتر منجر
شود.
این بهینهسازی بهطور پیشفرض برای اهداف PowerPC فعال است، اما در غیر این صورت بهطور پیشفرض غیرفعال است.
- -fpartial-inlining
- بخشهایی
از توابع را
درونخطی (inline)
میکند. این
گزینه تنها
زمانی
اثرگذار
است که
درونخطیسازی
از طریق
گزینههای
-finline-functions یا -finline-small-functions
فعال شده
باشد.
در سطوح -O2، -O3 و -Os فعال است.
- -fpredictive-commoning
- بهینهسازی
اشتراکپیشبینانه
(predictive commoning) را
انجام
میدهد؛
یعنی
استفاده
مجدد از
محاسباتی
(بهویژه
بارگذاریها
و
ذخیرهسازیهای
حافظه) که
در
تکرارهای
قبلی
حلقهها
انجام
شدهاند.
این گزینه در سطح -O3 فعال است. همچنین توسط -fprofile-use و -fauto-profile نیز فعال میشود.
- -fprefetch-loop-arrays
- در صورت
پشتیبانی
توسط ماشین
مقصد،
دستورالعملهایی
برای
پیشواکشی
(prefetch) حافظه
تولید
میکند تا
عملکرد
حلقههایی
که به
آرایههای
بزرگ
دسترسی
دارند
بهبود یابد.
این گزینه ممکن است کد بهتر یا بدتری تولید کند؛ نتایج بهشدت به ساختار حلقهها درون کد منبع بستگی دارد.
در سطح -Os غیرفعال است.
- -fno-printf-return-value
- مقادیر
ثابت را
جایگزین
مقدار
بازگشتی
شناختهشده
توابع
خروجی
قالببندیشده
مانند
"sprintf"،
"snprintf"،
"vsprintf" و
"vsnprintf" (اما
نه "printf"
یا "fprintf")
نمیکند.
این تبدیل
به GCC امکان
میدهد تا
شاخهها را
بر اساس
مقدار
بازگشتی
معلوم این
توابع، در
صورتی که با
آرگومانهای
ثابت یا
آرگومانهایی
فراخوانی
شوند که
مشخصاً
مقادیر
آنها در
بازهای
قرار دارد
که تعیین
مقدار
بازگشتی
دقیق را
امکانپذیر
میسازد،
بهینهسازی
کرده یا حتی
حذف کند. به
عنوان
مثال،
هنگامی که
-fprintf-return-value فعال
باشد، هم
شاخه و هم
بدنه دستور
"if" (اما
نه
فراخوانی
"snprint")
میتوانند
در صورتی که
"i" یک
عدد صحیح ۳۲
بیتی یا
کوچکتر
باشد به طور
کامل حذف
شوند، زیرا
تضمین
میشود که
مقدار
بازگشتی
حداکثر ۸
خواهد بود.
char buf[9]; if (snprintf (buf, "%08x", i) >= sizeof buf) ...
گزینه -fprintf-return-value به بهینهسازیهای دیگر متکی است و در سطح -O2 و بالاتر بهترین نتایج را ارائه میدهد. این گزینه همراه با گزینههای -Wformat-overflow و -Wformat-truncation عمل میکند. گزینه -fprintf-return-value بهطور پیشفرض فعال است.
- -fno-peephole
- -fno-peephole2
- هرگونه
بهینهسازی
روزنهای
(peephole) وابسته
به ماشین را
غیرفعال
میکند.
تفاوت بین
-fno-peephole و -fno-peephole2 در
نحوه
پیادهسازی
آنها در
کامپایلر
است؛ برخی
معماریهای
مقصد از
یکی، برخی
از دیگری و
تعداد
معدودی از
هر دو
استفاده
میکنند.
-fpeephole بهطور پیشفرض فعال است. -fpeephole2 در سطوح -O2، -O3 و -Os فعال است.
- -fno-guess-branch-probability
- احتمالات
شاخهبندی
را با
استفاده از
روشهای
ابتکاری (heuristics)
حدس
نمیزند.
اگر احتمالات شاخهبندی توسط بازخورد پروفایلسازی (-fprofile-arcs) ارائه نشده باشند، GCC از روشهای ابتکاری برای حدس زدن آنها استفاده میکند. این روشهای ابتکاری مبتنی بر گراف جریان کنترل (control flow graph) هستند. اگر برخی از احتمالات شاخهبندی توسط "__builtin_expect" مشخص شده باشند، از روشهای ابتکاری برای حدس زدن احتمالات شاخهبندی سایر بخشهای گراف جریان کنترل، با در نظر گرفتن اطلاعات "__builtin_expect"، استفاده میشود. تعامل بین روشهای ابتکاری و "__builtin_expect" میتواند پیچیده باشد، و در برخی موارد، غیرفعال کردن روشهای ابتکاری ممکن است سودمند باشد تا فهم اثرات "__builtin_expect" آسانتر شود.
همچنین میتوان با استفاده از تابع توکار "__builtin_expect_with_probability" احتمال مورد انتظار عبارت را مشخص کرد.
پیشفرض در سطوح -O، -O2، -O3 و -Os گزینه -fguess-branch-probability است.
- -freorder-blocks
- بلوکهای
پایه را در
تابع
کامپایلشده
بازآرایی
میکند تا
تعداد
شاخههای
پرششده (taken branches)
را کاهش
داده و
محلیبودن
کد (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
افراز (partition)
میکند تا
کارایی
صفحهبندی
(paging) و
محلیبودن
حافظه نهان
(cache locality) بهبود
یابد.
این بهینهسازی در حضور مدیریت استثنا یا جدولهای بازپیچی (unwind tables) (در مقاصدی که از setjump/longjump یا طرحهای مختص مقصد استفاده میکنند)، برای بخشهای linkonce، برای توابعی با مشخصه بخش تعریفشده توسط کاربر، و در هر معماری که از بخشهای نامگذاریشده پشتیبانی نمیکند، بهطور خودکار خاموش میشود. هنگامی که -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 فعال است..IP -fstrict-aliasing 4 به کامپایلر اجازه میدهد سختگیرانهترین قواعد ناممستعار (aliasing) قابل اعمال بر زبانی که در حال کامپایل است را فرض کند. برای C (و ++C)، این گزینه بهینهسازیها را بر پایهٔ نوع عبارات فعال میکند. بهویژه، دسترسی به یک شیء از یک نوع از طریق عبارتی از نوعی متفاوت مجاز نیست، مگر اینکه نوعها انواع سازگار (compatible types) باشند، تنها در علامتدار بودن یا توصیفکنندهها (qualifiers) تفاوت داشته باشند، یا عبارت دارای نوع نویسهای (character type) باشد. دسترسی به اشیای اسکالر از طریق یک نوع برداری متناظر نیز مجاز است.
برای نمونه، یک "unsigned int" میتواند برای یک "int" ناممستعار باشد، اما نه برای یک "void*" یا یک "double". یک نوع نویسهای میتواند برای هر نوع دیگری ناممستعار واقع شود.
به کدهایی از این دست توجه ویژه داشته باشید:
union a_union { int i; double d; }; int f() { union a_union t; t.d = 3.0; return t.i; }شیوهٔ خواندن از عضوی از union غیر از آن که اخیراً درونش نوشته شده است (که «type-punning» نامیده میشود) متداول است. حتی با -fstrict-aliasing نیز استفاده از type-punning در C مجاز است، به شرطی که حافظه از طریق نوع union مورد دسترسی قرار گیرد. در ISO C++، عمل type-punning از طریق نوع union رفتاری تعریفنشده (undefined behavior) است، اما GCC آن را به عنوان یک افزونه (extension) پشتیبانی میکند. بنابراین، کد بالا طبق انتظار کار میکند. با این حال، کد زیر ممکن است اینگونه نباشد:
int f() { union a_union t; int* ip; t.d = 3.0; ip = &t.i; return *ip; }به همین ترتیب، دسترسی از طریق گرفتن آدرس، تبدیل نوع (cast) اشارهگر حاصل و ارجاعزدایی (dereference) نتیجه دارای رفتاری تعریفنشده است، حتی اگر تبدیل نوع از یک نوع union استفاده کند، مانند:
int f() { double d = 3.0; return ((union a_union *) &d)->i; }گزینهٔ -fstrict-aliasing در سطوح -O2، -O3 و -Os فعال میشود.
- -fipa-strict-aliasing
- کنترل
میکند که
آیا قواعد
-fstrict-aliasing در
سرتاسر
مرزهای
توابع
اعمال شوند
یا خیر.
توجه داشته
باشید که
اگر چندین
تابع در یک
تابع منفرد
درونخطی (inline)
شوند،
دسترسیهای
حافظه دیگر
عبور از مرز
تابع محسوب
نمیشوند.
گزینهٔ -fipa-strict-aliasing به صورت پیشفرض فعال است و تنها در ترکیب با -fstrict-aliasing مؤثر واقع میشود.
- -falign-functions
- -falign-functions=n
- -falign-functions=n:m
- -falign-functions=n:m:n2
- -falign-functions=n:m:n2:m2
- شروع توابع
را در توانِ
دوِ بعدی که
بزرگتر یا
مساوی n است
همتراز
میکند، با
صرفنظر
کردن از
حداکثر m-1
بایت. این
کار تضمین
میکند که
دستکم m
بایت
ابتدایی
تابع
بتواند
توسط
پردازنده
بدون عبور
از مرز
همترازیِ
n بایتی
واکشی (fetch) شود.
این یک
بهینهسازی
برای
کارایی کد
است و از
همترازی
برای
توابعی که
سرد (cold) در نظر
گرفته شوند
صرفنظر
میشود. اگر
همترازی
برای تمام
توابع
الزامی
است، از
-fmin-function-alignment
استفاده
کنید.
اگر m تعیین نشده باشد، مقدار پیشفرض آن n خواهد بود.
مثالها: -falign-functions=32 توابع را در مرز ۳۲ بایتی بعدی همتراز میکند، -falign-functions=24 تنها در صورتی در مرز ۳۲ بایتی بعدی همتراز میکند که این کار با رد کردن ۲۳ بایت یا کمتر امکانپذیر باشد، و -falign-functions=32:7 تنها زمانی در مرز ۳۲ بایتی بعدی همتراز میکند که این کار با رد کردن ۶ بایت یا کمتر میسر باشد.
جفت دوم از مقادیر n2:m2 به شما امکان میدهد یک همترازی ثانویه تعیین کنید: -falign-functions=64:7:32:3 در صورتی که امکان رد کردن ۶ بایت یا کمتر وجود داشته باشد در مرز ۶۴ بایتی بعدی همتراز میکند، در غیر این صورت اگر این کار با رد کردن ۲ بایت یا کمتر میسر باشد، در مرز ۳۲ بایتی بعدی همتراز میکند. اگر m2 تعیین نشده باشد، مقدار پیشفرض آن برابر با n2 خواهد بود.
برخی از اسمبلرها تنها زمانی از این پرچم پشتیبانی میکنند که n توانی از دو باشد؛ در آن صورت، مقدار به بالا گرد میشود.
گزینههای -fno-align-functions و -falign-functions=1 معادل یکدیگرند و به این معنی هستند که توابع همتراز نمیشوند.
اگر n مشخص نشده یا صفر باشد، از یک مقدار پیشفرض وابسته به ماشین استفاده میشود. حداکثر مقدار مجاز برای گزینهٔ n برابر با ۶۵۵۳۶ است.
در سطوح -O2 و -O3 فعال میشود.
- -flimit-function-alignment
- اگر این گزینه فعال باشد، کامپایلر تلاش میکند از همترازی بیشازحد و غیرضروری توابع خودداری کند. کامپایلر سعی میکند به اسمبلر دستور دهد به میزانی که توسط -falign-functions مشخص شده همترازی را انجام دهد، اما بیشتر از اندازهٔ خود تابع بایت رد نکند.
- -falign-labels
- -falign-labels=n
- -falign-labels=n:m
- -falign-labels=n:m:n2
- -falign-labels=n:m:n2:m2
- تمام
مقصدهای
انشعاب (branch targets)
را روی یک
مرز توانِ
دو همتراز
میکند.
پارامترهای این گزینه مشابه گزینهٔ -falign-functions هستند. -fno-align-labels و -falign-labels=1 معادل یکدیگرند و به این معنی هستند که برچسبها همتراز نمیشوند.
اگر -falign-loops یا -falign-jumps قابل اعمال بوده و بزرگتر از این مقدار باشند، آنگاه از مقادیر آنها به جای آن استفاده میشود.
اگر n مشخص نشده یا صفر باشد، از یک پیشفرض وابسته به ماشین استفاده میشود که به احتمال زیاد 1 است، یعنی بدون همترازی. حداکثر مقدار مجاز برای گزینهٔ n برابر با ۶۵۵۳۶ است.
در سطوح -O2 و -O3 فعال میشود.
- -falign-loops
- -falign-loops=n
- -falign-loops=n:m
- -falign-loops=n:m:n2
- -falign-loops=n:m:n2:m2
- حلقهها را
روی یک مرز
توانِ دو
همتراز
میکند. اگر
حلقهها به
دفعات
زیادی اجرا
شوند، این
کار هرگونه
اجرای
دستورالعملهای
لایهٔ
پرکنندهٔ
ساختگی (dummy padding)
را جبران
میکند. این
یک
بهینهسازی
برای
کارایی کد
است و از
همترازی
برای
حلقههایی
که سرد (cold) در
نظر گرفته
شوند
صرفنظر
میشود.
اگر مقدار -falign-labels بزرگتر از این مقدار باشد، به جای آن از مقدار آن استفاده خواهد شد.
پارامترهای این گزینه مشابه گزینهٔ -falign-functions هستند. -fno-align-loops و -falign-loops=1 معادل یکدیگرند و به این معنی هستند که حلقهها همتراز نمیشوند. حداکثر مقدار مجاز برای گزینهٔ n برابر با ۶۵۵۳۶ است.
اگر n مشخص نشده یا صفر باشد، از یک مقدار پیشفرض وابسته به ماشین استفاده میشود.
در سطوح -O2 و -O3 فعال میشود.
- -falign-jumps
- -falign-jumps=n
- -falign-jumps=n:m
- -falign-jumps=n:m:n2:m2
- تراز کردن
مقصدهای
انشعاب بر
روی مرز
توان دو،
برای
مقصدهای
انشعابی که
تنها از
طریق پرش
قابل
دسترسی
هستند. در
این حالت،
نیازی به
اجرای هیچ
دستور
ساختگی
نیست. این
یک
بهینهسازی
کارایی کد
است و از
ترازسازی
برای
پرشهایی
که سرد (cold) در
نظر گرفته
میشوند،
صرفنظر
میشود.
اگر -falign-labels بزرگتر از این مقدار باشد، مقدار آن بهجای این مقدار استفاده میشود.
پارامترهای این گزینه مشابه با گزینهٔ -falign-functions هستند. -fno-align-jumps و -falign-jumps=1 معادل یکدیگرند و به این معنا هستند که حلقهها تراز نمیشوند.
اگر n مشخص نشده باشد یا صفر باشد، از یک پیشفرض وابسته به ماشین استفاده میشود. حداکثر مقدار مجاز برای گزینهٔ n برابر با 65536 است.
در سطوح -O2 و -O3 فعال میشود.
- -fmin-function-alignment
- تعیین حداقل تراز توابع به توان دوی بعدی که بزرگتر یا مساوی با n باشد. بر خلاف -falign-functions، این ترازسازی برای همهٔ توابع (حتی توابعی که سرد در نظر گرفته شدهاند) نیز اعمال میشود. این ترازسازی همچنین تحت تأثیر -flimit-function-alignment قرار نمیگیرد.
- -fno-allocation-dce
- تخصیصهای
بدون
استفادهٔ ++C
(با استفاده
از عملگر
"new" و
عملگر
"delete") را
در فرایند
حذف کدهای
مرده (dead code elimination)
حذف نکنید.
همچنین -fmalloc-dce را ببینید.
- -fallow-store-data-races
- به
کامپایلر
اجازه
میدهد
بهینهسازیهایی
را انجام
دهد که ممکن
است شرایط
رقابتی
دادهای (data races)
جدیدی را
روی عملیات
ذخیرهسازی
ایجاد کند،
بدون اینکه
اثبات شود
متغیر
نمیتواند
بهطور
همروند
توسط
ریسمانهای
دیگر مورد
دسترسی
قرار گیرد.
بر
بهینهسازی
دادههای
محلی
تأثیری
ندارد. اگر
مشخص باشد
که
دادههای
سراسری
توسط چندین
ریسمان
مورد
دسترسی
قرار
نخواهند
گرفت،
استفاده از
این گزینه
ایمن است.
نمونههایی از بهینهسازیهای فعالشده توسط -fallow-store-data-races شامل بالا کشیدن (hoisting) یا تبدیلهای شرطی (if-conversions) است که ممکن است باعث شود مقداری که قبلاً در حافظه بوده است، مجدداً با همان مقدار بازنویسی شود. چنین بازنویسیای در یک زمینهٔ تکریسمانی ایمن است اما ممکن است در یک زمینهٔ چندریسمانی ناامن باشد. توجه داشته باشید که در برخی پردازندهها، ممکن است تبدیلهای شرطی برای فعالسازی برداریسازی (vectorization) الزامی باشند.
در سطح -Ofast فعال میشود.
- -funit-at-a-time
- این گزینه
صرفاً جهت
سازگاری
باقی مانده
است. -funit-at-a-time هیچ
تأثیری
ندارد، در
حالی که
-fno-unit-at-a-time متضمن
گزینههای
-fno-toplevel-reorder و -fno-section-anchors
است.
بهطور پیشفرض فعال است.
- -fno-toplevel-reorder
- توابع،
متغیرها و
عبارات
"asm" سطح
بالا (top-level) را
بازآرایی
نکنید.
آنها را به
همان
ترتیبی که
در فایل
ورودی ظاهر
میشوند در
خروجی قرار
دهید.
هنگامی که
از این
گزینه
استفاده
میشود،
متغیرهای
ایستای (static)
بدون ارجاع
حذف
نمیشوند.
هدف این
گزینه
پشتیبانی
از کدهای
موجودی است
که به
ترتیبی خاص
متکی هستند.
برای کدهای
جدید، بهتر
است در صورت
امکان از
صفتها (attributes)
استفاده
شود.
-ftoplevel-reorder در سطوح -O1 و بالاتر، و همچنین در -O0 در صورتی که -fsection-anchors بهصراحت درخواست شده باشد، پیشفرض است. علاوه بر این، -fno-toplevel-reorder متضمن -fno-section-anchors نیز است.
- -funreachable-traps
- با این
گزینه،
کامپایلر
فراخوانیهای
"__builtin_unreachable" را
بهجای
استفاده
برای
بهینهسازی،
به تلهها (traps)
تبدیل
میکند. این
امر همچنین
بر تمام
فراخوانیهای
از این دست
که بهطور
ضمنی توسط
کامپایلر
تولید شده
باشد اثر
میگذارد.
این گزینه اثری مشابه با -fsanitize=unreachable -fsanitize-trap=unreachable دارد، اما مقادیر آن گزینهها را تغییر نمیدهد. اگر -fsanitize=unreachable فعال باشد، آن گزینه بر این گزینه اولویت دارد.
این گزینه بهطور پیشفرض در -O0 و -Og فعال است.
- -fweb
- تارهای وب (webs)
را آنطور
که معمولاً
برای مقاصد
تخصیص ثبات
به کار
میرود
میسازد و
به هر وب یک
شبهثبات
جداگانه
اختصاص
میدهد. این
کار به
مرحلهٔ
تخصیص ثبات
اجازه
میدهد
مستقیماً
روی
شبهثباتها
عمل کند،
اما همچنین
چندین
مرحلهٔ
بهینهسازی
دیگر مانند
CSE،
بهینهساز
حلقه و
حذفکنندهٔ
کدهای
مردهٔ
بدیهی را
تقویت
مینماید.
با این حال،
میتواند
اشکالزدایی
را غیرممکن
کند، چرا که
متغیرها
دیگر در یک
«ثبات
مبنا» (home register)
باقی
نمیمانند.
بهطور پیشفرض با -funroll-loops فعال میشود.
- -fwhole-program
- فرض را بر
این
میگذارد
که واحد
ترجمهٔ
فعلی،
نمایانگر
کل برنامهٔ
در حال
کامپایل
است. تمامی
توابع و
متغیرهای
عمومی به
استثنای
"main" و
مواردی که
با صفت
"externally_visible"
مشخص
شدهاند به
توابع
ایستا
تبدیل
میشوند و
در عمل با
تهاجم
بیشتری
توسط
بهینهسازهای
بینرویهای
بهینهسازی
میگردند.
همراه با -flto این گزینه کاربرد محدودی دارد. در اغلب موارد فهرست دقیق نمادهای استفادهشده یا صادرشده از فایل باینری، از اطلاعات تفکیک ارسالشده به بهینهساز زمان پیوند توسط افزونهٔ پیونددهنده شناخته میشود. این گزینه در صورتی که از هیچ افزونهٔ پیونددهندهای استفاده نشود یا در طول مرحلهٔ پیوند تدریجی هنگام تولید کد نهایی (با -flto -flinker-output=nolto-rel)، همچنان سودمند است.
- -flto[=n]
- این گزینه
بهینهساز
استاندارد
زمان پیوند
را اجرا
میکند.
هنگامی که
همراه با کد
منبع
فراخوانی
شود، GIMPLE (یکی
از
نمایشهای
داخلی GCC) را
تولید کرده
و آن را در
بخشهای
ویژهٔ ELF در
فایل هدف
مینویسد.
هنگامی که
فایلهای
هدف به
یکدیگر
پیوند داده
میشوند،
بدنهٔ
تمامی
توابع از
این
بخشهای ELF
خوانده شده
و به
گونهای
نمونهسازی
میشوند که
گویی همگی
بخشی از
همان واحد
ترجمه
بودهاند.
برای استفاده از بهینهساز زمان پیوند، -flto و گزینههای بهینهسازی باید هم در زمان کامپایل و هم در طول پیوند نهایی مشخص شوند. توصیه میشود تمام فایلهای حاضر در یک پیوند را با گزینههای یکسان کامپایل کنید و همچنین آن گزینهها را در زمان پیوند نیز مشخص نمایید. برای مثال:
gcc -c -O2 -flto foo.c gcc -c -O2 -flto bar.c gcc -o myprog -flto -O2 foo.o bar.o
دو فراخوانی نخست GCC یک نمایش بایتکدی از GIMPLE را در بخشهای ویژهٔ ELF درون foo.o و bar.o ذخیره میکنند. فراخوانی نهایی، بایتکد GIMPLE را از foo.o و bar.o میخواند، این دو فایل را در یک تصویر داخلی واحد ادغام کرده و نتیجه را طبق روال معمول کامپایل میکند. از آنجا که هر دوی foo.o و bar.o در یک تصویر واحد ادغام شدهاند، این امر سبب میشود تمام تحلیلها و بهینهسازیهای بینرویهای در GCC در سرتاسر هر دو فایل چنان عمل کنند که گویی یک فایل واحد هستند. برای مثال این بدان معناست که جایگذار درونخطی میتواند توابع موجود در bar.o را درون توابع موجود در foo.o و برعکس بهصورت درونخطی قرار دهد.
یک راه دیگر (سادهتر) برای فعالسازی بهینهسازی زمان پیوند عبارت است از:
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> + (بدون گزینه) = (بدون گزینه) B<-fPIC> + B<-fPIE> = B<-fPIE> B<-fpic> + B<-fPIE> = B<-fpie> B<-fPIC/-fpic> + B<-fpie> = B<-fpie>
برخی پرچمهای تغییردهندهٔ ABI باید در تمام واحدهای ترجمه یکسان باشند و تلاش برای بازنویسی آنها در زمان پیوند با یک مقدار ناسازگار نادیده گرفته میشود. این موارد شامل گزینههایی چون -freg-struct-return و -fpcc-struct-return است.
سایر گزینهها مانند -ffp-contract، -fno-strict-overflow، -fwrapv، -fno-trapv یا -fno-strict-aliasing به مرحلهٔ پیوند ارسال شده و برای واحدهای ترجمهٔ متناقض، بهطور محافظهکارانه ادغام میشوند. بهطور مشخص، -fno-strict-overflow، -fwrapv و -fno-trapv اولویت دارند؛ و برای نمونه -ffp-contract=off بر -ffp-contract=fast ارجحیت دارد. شما میتوانید آنها را در زمان پیوند بازنویسی کنید.
گزینههای تشخیصی مانند -Wstringop-overflow به مرحلهٔ پیوند منتقل میشوند و تنظیمات آنها با مرحلهٔ کامپایل در سطح دانهبندی تابع مطابقت دارد. توجه داشته باشید که این موضوع تنها برای پیامهای تشخیصی صادرشده در حین بهینهسازی اهمیت دارد. همچنین توجه داشته باشید که تبدیلات کد مانند درونیسازی (inlining) میتواند منجر به فعال یا غیرفعال شدن هشدارها برای بخشهایی از کد شود، چنانچه با تنظیمات زمان کامپایل سازگار نباشد.
هنگامی که نیاز دارید گزینههایی را از طریق -Wa یا -Xassembler به اسمبلر ارسال کنید، مطمئن شوید که یا چنین واحدهای ترجمهای را با -fno-lto کامپایل میکنید یا بهطور یکدست از همان گزینههای اسمبلر در تمام واحدهای ترجمه استفاده مینمایید. متناوباً میتوانید گزینههای اسمبلر را در زمان پیوند LTO نیز مشخص کنید.
برای فعالسازی تولید اطلاعات اشکالزدایی باید -g را در زمان کامپایل ارائه دهید. اگر هر یک از فایلهای ورودی در زمان پیوند با تولید اطلاعات اشکالزداییِ فعال ساخته شده باشند، پیونددهنده نیز تولید اطلاعات اشکالزدایی را فعال خواهد کرد. هرگونه تنظیمات دقیقِ اطلاعات اشکالزدایی مانند سطح dwarf در -gdwarf-5 باید صراحتاً در خط فرمان پیونددهنده تکرار شود و ترکیب تنظیمات متفاوت در واحدهای ترجمهٔ مختلف توصیه نمیشود.
اگر LTO با اشیائی با پیوند C (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 را مشخص کنید، بهینهسازی و تولید کد انجامشده در زمان پیوند با بهرهگیری از یک برنامهٔ make نصبشده، با استفاده از n وظیفهٔ موازی اجرا میشود. متغیر محیطی MAKE میتواند برای لغو یا تغییر برنامهٔ مورد استفاده به کار رود.
همچنین میتوانید -flto=jobserver را تعیین کنید تا از حالت job server در GNU make برای تعیین تعداد وظایف موازی استفاده شود. این قابلیت زمانی مفید است که Makefile فراخوانندهٔ GCC از قبل بهصورت موازی در حال اجرا باشد. برای کارکرد این قابلیت باید یک + به ابتدای دستور در Makefile والد اضافه کنید. این گزینه احتمالاً تنها در صورتی کار میکند که MAKE از نوع GNU make باشد. حتی بدون مقدار این گزینه، GCC تلاش میکند یک job server در حال اجرای GNU make را بهطور خودکار شناسایی کند.
از -flto=auto برای استفاده از job server در GNU make (در صورت وجود) استفاده کنید، یا در غیر این صورت به شناسایی خودکار تعداد رشتههای (threads) پردازندهٔ موجود در سیستم شما رجوع میشود.
- -flto-partition=alg
- الگوریتم افرازبندیِ استفادهشده توسط بهینهساز زمان پیوند را مشخص میکند. این مقدار میتواند 1to1 برای تعیین افرازبندی آینهای از فایلهای منبع اصلی باشد، یا balanced برای تعیین افرازبندی به بخشهایی با اندازهٔ برابر (در صورت امکان)، یا max برای ایجاد افراز جدید برای هر نماد در صورت امکان، یا cache برای متعادل ساختن اندازهٔ بخشها در عین کنار هم نگهداشتن نمادهای مرتبط جهت حافظهنهانسازی بهتر در LTO افزایشی. تعیین none بهعنوان الگوریتم، افرازبندی و جاریسازی (streaming) را بهطور کامل غیرفعال میکند. مقدار پیشفرض balanced است. اگرچه میتوان از 1to1 بهعنوان راهکاری برای مشکلات مختلف ترتیب کد استفاده کرد، اما افرازبندی max صرفاً برای آزمایشهای داخلی در نظر گرفته شده است. مقدار one مشخص میکند که دقیقاً یک افراز باید استفاده شود، در حالی که مقدار none از افرازبندی صرفنظر کرده و مرحلهٔ بهینهسازی زمان پیوند را مستقیماً از فاز WPA اجرا میکند.
- -flto-incremental=path
- فعالسازی
LTO افزایشی،
با
قرارگیری
حافظهٔ
نهان آن در
دایرکتوری
موجودِ
مشخصشده.
میتواند
چرخههای
ویرایش-کامپایل
را با LTO
بهمیزان
قابلتوجهی
کوتاهتر
کند.
هنگامی که با LTO (-flto) استفاده شود، خروجی واحدهای ترجمه در داخل LTO در حافظهٔ نهان ذخیره میشود. واحدهای ترجمهٔ ذخیرهشده در حافظهٔ نهان به احتمال زیاد هنگام کامپایل مجدد با تغییرات کوچک کد دوباره استفاده خواهند شد که منجر به کاهش زمان کامپایل مجدد میشود.
چندین نمونه از GCC میتوانند بهطور موازی از یک حافظهٔ نهان یکسان استفاده کنند.
- -flto-incremental-cache-size=n
- تعداد مدخلهای حافظهٔ نهان در LTO افزایشی را مشخص میکند که پس از آن، مدخلهای قدیمی هرس میشوند. این یک حد ملایم (soft limit) است و موقتاً ممکن است مدخلهای بیشتری وجود داشته باشد.
- -flto-compression-level=n
- این گزینه سطح فشردهسازیِ استفادهشده برای زبان واسط نوشتهشده در فایلهای شیء LTO را مشخص میکند و تنها همراه با حالت LTO (-flto) معنا دارد. در حال حاضر GCC از دو الگوریتم فشردهسازی LTO پشتیبانی میکند. برای zstd، مقادیر معتبر از 0 (بدون فشردهسازی) تا 19 (بیشترین فشردهسازی) است، در حالی که zlib از مقادیر 0 تا 9 پشتیبانی میکند. مقادیر خارج از این محدوده به حداقل یا حداکثر مقادیر پشتیبانیشده محدود میشوند. اگر این گزینه ارائه نشود، تنظیم پیشفرض فشردهسازی متوازن استفاده میشود.
- -flto-toplevel-asm-heuristics
- روشهای
مکاشفهای
را برای
یافتن
نمادهای
استفادهشده
در "asm"
پایه در سطح
بالا فعال
میکند. این
امر
بهینهسازیهای
زمان پیوند
را که ممکن
است باعث
تغییر نام
یا حذف این
نمادها شده
و به خطاهای
نماد مفقود
توسط
پیونددهنده
منجر شود،
محدود
میکند.
این پرچم برای پروژههایی در نظر گرفته شده که هنوز به استفاده از "asm" گسترشیافته در سطح بالا روی نیاوردهاند، که کاربرد را مستقیماً بدون هیچ مثبت کاذبی مشخص میکند.
این روشهای مکاشفهای ساده هستند و کد اسمبلی را تجزیه نمیکنند. روشهای مکاشفهای کل اسمبلی سطح بالا را برای تمام شناسههای ممکن بررسی میکنند؛ اگر شناسهای در میان نمادهای اعلانشده یافت شود، نماد برای محدود کردن بهینهسازیهای زمان پیوند علامتگذاری میشود. نمادهای ایستا (static) بهینهسازیهای بیشتری را غیرفعال میکنند. همچنین شناسههایی که پس از آنها ':' آمده است بهینهسازیهای بیشتری را غیرفعال میکنند، زیرا ممکن است نمادی باشند که بهصورت محلی در اسمبلی تعریف شده است، حتی اگر اعلان آن با 'extern' مشخص شده باشد..IP -fuse-linker-plugin 4 استفاده از افزایهٔ پیونددهنده (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
- اشیای
فربهِ LTO (یا Fat LTO
objects) فایلهای
شیئی هستند
که هم زبان
میانی و هم
کد شیء را
در بر
دارند. این
ویژگی
آنها را هم
برای پیوند
LTO و هم برای
پیوند
معمولی
قابل
استفاده
میسازد.
این گزینه
تنها هنگام
کامپایل با
-flto مؤثر است
و در زمان
پیوند
نادیده
گرفته
میشود.
-fno-fat-lto-objects زمان کامپایل را نسبت به LTO ساده بهبود میبخشد، اما نیازمند آن است که کل زنجیرهٔ ابزار از LTO آگاه باشد. این گزینه برای عملکردهای پایه به پیونددهندهای با پشتیبانی از افزایهٔ پیونددهنده نیاز دارد. علاوه بر این، nm، ar و ranlib باید از افزایههای پیونددهنده پشتیبانی کنند تا یک محیط ساخت کامل (با قابلیت ساخت کتابخانههای ایستا و غیره) فراهم شود. کامپایلر GCC پوششهای gcc-ar، gcc-nm و gcc-ranlib را برای ارسال گزینههای مناسب به این ابزارها فراهم میکند. با LTO غیرفربه، فایلهای makefile باید برای استفاده از آنها تغییر یابند.
توجه داشته باشید که binutils مدرن سازوکار بارگذاری خودکار افزایه را ارائه میدهد. نصب افزایهٔ پیونددهنده در $libdir/bfd-plugins اثری مشابه با استفاده از پوششهای دستوری (gcc-ar، gcc-nm و gcc-ranlib) دارد.
پیشفرض در مقصدهایی با پشتیبانی از افزایهٔ پیونددهنده، -fno-fat-lto-objects است.
- -fcompare-elim
- پس از تخصیص
ثباتها و
تفکیک
دستورالعملهای
پس از تخصیص
ثبات،
دستورالعملهای
حسابی را که
پرچمهای
پردازنده
را مشابه یک
عملیات
مقایسه بر
اساس آن
حساب
محاسبه
میکنند،
شناسایی
میکند. در
صورت
امکان،
عملیات
مقایسهٔ
صریح حذف
میشود.
این گذرگاه فقط برای مقصدهای خاصی اعمال میشود که نمیتوانند عملیات مقایسه را پیش از تکمیل تخصیص ثبات به صورت صریح نمایش دهند.
در سطوح -O1، -O2، -O3 و -Os فعال است.
- -ffold-mem-offsets
- -fno-fold-mem-offsets
- سعی میکند
دستورالعملهای
add را با
ادغام در
بارگذاریها/ذخیرهسازیهای
حافظه حذف
کند.
در سطوح -O2 و -O3 فعال است.
- -fcprop-registers
- پس از تخصیص
ثباتها و
تفکیک
دستورالعملهای
پس از تخصیص
ثبات، یک
گذرگاه
انتشار کپی
(copy-propagation) را اجرا
میکند تا
وابستگیهای
زمانبندی
کاهش یافته
و در مواردی
کپی حذف
شود.
در سطوح -O1، -O2، -O3 و -Os فعال است.
- -fprofile-correction
- پروفایلهای
جمعآوریشده
با استفاده
از یک
باینری
مجهزشده
برای
برنامههای
چندنخی
ممکن است به
دلیل از دست
رفتن
بهروزرسانیهای
شمارنده
ناهمگون
باشند.
هنگامی که
این گزینه
مشخص شود، GCC
از روشهای
اکتشافی (heuristics)
برای تصحیح
یا
هموارسازی
این
ناهمگونیها
بهره
میبرد. به
طور
پیشفرض، GCC
هنگام
شناسایی
پروفایل
ناهمگون یک
پیام خطا
صادر
میکند.
این گزینه توسط -fauto-profile فعال میشود.
- -fprofile-partial-training
- با "-fprofile-use"، تمام بخشهایی از برنامه که در طول اجرای آزمایشی (آموزش) اجرا نشدهاند، به شدت برای اندازه به جای سرعت بهینهسازی میشوند. در برخی موارد آموزش تمام مسیرهای داغ (hot paths) ممکن در برنامه عملی نیست. (برای مثال، برنامه ممکن است شامل توابعی مخصوص یک سختافزار خاص باشد و آموزش ممکن است تمام پیکربندیهای سختافزاری را که برنامه بعداً روی آنها اجرا میشود پوشش ندهد.) با "-fprofile-partial-training"، بازخورد پروفایل برای تمام توابعی که در طول اجرای آزمایشی اجرا نشدهاند نادیده گرفته میشود، و باعث میشود آنها به گونهای بهینهسازی شوند که گویی بدون بازخورد پروفایل کامپایل شدهاند. این امر زمانی که آموزش نمایندهٔ رفتار واقعی برنامه نباشد، به قیمت اندازهٔ کد به طور قابل توجهی بزرگتر، منجر به عملکرد بهتر میشود.
- -fprofile-use
- -fprofile-use=path
- بهینهسازیهای
هدایتشده
با بازخورد
پروفایل، و
بهینهسازیهای
زیر را فعال
میکند که
بسیاری از
آنها
معمولاً
تنها با در
دسترس بودن
بازخورد
پروفایل
سودمند
هستند:
-fbranch-probabilities -fprofile-values -funroll-loops -fpeel-loops -ftracer -fvpt -finline-functions -fipa-cp -fipa-cp-clone -fipa-bit-cp -fpredictive-commoning -fsplit-loops -funswitch-loops -fgcse-after-reload -ftree-loop-vectorize -ftree-slp-vectorize -fvect-cost-model=dynamic -ftree-loop-distribute-patterns -fprofile-reorder-functions
پیش از آنکه بتوانید از این گزینه استفاده کنید، ابتدا باید اطلاعات پروفایلسازی را تولید نمایید.
به طور پیشفرض، اگر پروفایلهای بازخورد با کد منبع مطابقت نداشته باشند، GCC یک پیام خطا صادر میکند. این خطا را میتوان با استفاده از -Wno-error=coverage-mismatch به یک هشدار تبدیل کرد. توجه داشته باشید که این کار ممکن است منجر به تولید کدی با بهینهسازی ضعیف شود. علاوه بر این، به طور پیشفرض، GCC در صورت عدم وجود پروفایلهای بازخورد نیز یک پیام هشدار صادر میکند (-Wmissing-profile را ببینید).
اگر path مشخص شده باشد، GCC برای یافتن فایلهای دادهٔ بازخورد پروفایل به path نگاه میکند. -fprofile-dir را ببینید.
- -fauto-profile
- -fauto-profile=path
- بهینهسازیهای
هدایتشده
با بازخورد
مبتنی بر
نمونهبرداری،
و
بهینهسازیهای
زیر را فعال
میکند، که
بسیاری از
آنها
معمولاً
تنها با در
دسترس بودن
بازخورد
پروفایل
سودمند
هستند:
-fbranch-probabilities -fprofile-values -funroll-loops -fpeel-loops -ftracer -fvpt -finline-functions -fipa-cp -fipa-cp-clone -fipa-bit-cp -fpredictive-commoning -fsplit-loops -funswitch-loops -fgcse-after-reload -ftree-loop-vectorize -ftree-slp-vectorize -fvect-cost-model=dynamic -ftree-loop-distribute-patterns -fprofile-correction
path نام فایلی است که اطلاعات پروفایل AutoFDO را در بر دارد. در صورت حذف، مقدار پیشفرض آن fbdata.afdo در دایرکتوری جاری است.
تولید یک فایل دادهٔ پروفایل AutoFDO نیازمند اجرای برنامهٔ شما با ابزار کاربردی perf روی یک سیستم مقصد GNU/Linux پشتیبانیشده است. برای اطلاعات بیشتر، https://perfwiki.github.io/main را ببینید.
برای مثال:
perf record -e br_inst_retired:near_taken -b -o perf.data \ -- your_programسپس از ابزار create_gcov برای تبدیل دادههای خام پروفایل به قالبی که برای GCC قابل استفاده باشد، بهره بگیرید. همچنین باید باینری برهنهنشدهٔ (unstripped) برنامهٔ خود را در اختیار این ابزار قرار دهید. https://github.com/google/autofdo را ببینید.
برای مثال:
create_gcov --binary=your_program.unstripped --profile=perf.data \ --gcov=profile.afdo - -fauto-profile-inlining
- هنگامی که auto-profile در دسترس است، پیش از خواندن بازخورد پروفایل، تمام توابع مرتبطی را که در اجرای آزمایشی (آموزش) درونخط شده بودند، درونخط میکند. این امر حساسیت زمینهایِ (context sensitivity) پروفایل را بهبود میبخشد. به طور پیشفرض فعال است.
گزینههای زیر رفتار کامپایلر را در رابطه با محاسبات ممیز شناور کنترل میکنند. این گزینهها تعادلی میان سرعت و درستی برقرار میسازند. همهٔ آنها باید به طور صریح فعال شوند.
- -fexcess-precision=style
- این گزینه
امکان
کنترل دقت
مضاعف (excess precision)
را در
ماشینهایی
فراهم
میکند که
عملیات
ممیز شناور
در آنها در
قالبی با
دقت یا
دامنهٔ
بیشتر از
استاندارد
IEEE و انواع
ممیز شناور
تبادلی
انجام
میگیرد.
نمونهای
از چنین
مقصدی ممیز
شناور x87 در
پردازندههای
x86 است که در
داخل به جای
قالب ۶۴
بیتی IEEE از
نمایش ۸۰
بیتی
استفاده
میکند.
برای بیشتر
برنامهها،
دقت مضاعف
بیضرر
است، اما
برخی
برنامهها
ممکن است به
الزامات
استانداردهای
زبان C یا C++
برای
مدیریت
مقادیر IEEE
وابسته
باشند.
به طور پیشفرض، -fexcess-precision=fast برقرار است؛ این بدان معناست که عملیات ممکن است در دقتی بیشتر از انواع مشخصشده در منبع انجام شوند، اگر این امر منجر به تولید کدی سریعتر شود، و زمان گرد کردن به انواع مشخصشده در کد منبع غیرقابل پیشبینی است. هنگام کامپایل C یا C++، در صورتی که -fexcess-precision=standard مشخص شده باشد، دقت مضاعف از قوانین مشخصشده در ISO C99 یا C++ پیروی میکند؛ به ویژه، هر دو تبدیل نوع (casts) و انتسابها باعث میشوند مقادیر به انواع معنایی خود گرد شوند (در حالی که -ffloat-store تنها بر انتسابها اثر میگذارد). این گزینه برای C یا C++ در صورت استفاده از یک گزینهٔ انطباق دقیق مانند -std=c99 یا -std=c++17 به طور پیشفرض فعال است. -ffast-math صرفنظر از اینکه گزینهٔ انطباق دقیق استفاده شده باشد یا خیر، به طور پیشفرض -fexcess-precision=fast را فعال میکند. اگر -fexcess-precision=16 مشخص شود، مقادیر ثابت و نتایج عبارات با انواع "_Float16" و "__bf16" بدون دقت مضاعف محاسبه میشوند.
-fexcess-precision=standard برای زبانهایی غیر از C یا C++ پیادهسازی نشده است. در x86، اگر -mfpmath=sse یا -mfpmath=sse+387 مشخص شده باشد هیچ اثری ندارد؛ در حالت نخست، معناشناسی IEEE بدون دقت مضاعف اعمال میشود و در حالت دوم، گرد کردن غیرقابل پیشبینی است..IP -ffloat-store 4 متغیرهای ممیز شناور را در ثباتها ذخیره نمیکند و از گزینههای دیگری که ممکن است خوانده شدن مقدار ممیز شناور از ثبات یا حافظه را تغییر دهند، جلوگیری میکند. این گزینه عموماً جای خود را به -fexcess-precision=standard داده است که عامتر است. در صورت استفاده از -ffloat-store، ممکن است نیاز باشد برنامهتان را تغییر دهید تا محاسبات میانی را صریحاً در متغیرهای موقت ذخیره کند، زیرا -ffloat-store گرد کردن به قالب IEEE را بر خلاف -fexcess-precision=standard، تنها در انتسابها اعمال میکند و نه در تبدیل نوعها (casts).
- -ffast-math
- گزینههای
-fno-math-errno، -funsafe-math-optimizations،
-ffinite-math-only، -fno-rounding-math،
-fno-signaling-nans، -fcx-limited-range و
-fexcess-precision=fast را
فعال
میکند.
این گزینه باعث تعریف ماکروی پیشپردازندهٔ "__FAST_MATH__" میشود.
این گزینه توسط هیچیک از گزینههای -O بهجز -Ofast فعال نمیشود، زیرا میتواند منجر به خروجی نادرست برای برنامههایی شود که به پیادهسازی دقیق قواعد یا مشخصات IEEE یا ISO برای توابع ریاضی وابستهاند. با این حال، ممکن است برای برنامههایی که به ضمانتهای این مشخصات نیازی ندارند، کُد سریعتری تولید کند.
- -fno-math-errno
- پس از
فراخوانی
توابع
ریاضی که با
یک
دستورالعمل
منفرد اجرا
میشوند
(مانند
"sqrt")،
مقدار
"errno" را
تنظیم
نمیکند.
برنامهای
که برای
مدیریت
خطای ریاضی
به
استثناهای
IEEE متکی است،
ممکن است
بخواهد
برای
افزایش
سرعت ضمن
حفظ
سازگاری
محاسباتی
با IEEE از این
پرچم
استفاده
کند.
این گزینه توسط هیچیک از گزینههای -O بهجز -Ofast فعال نمیشود، زیرا میتواند منجر به خروجی نادرست برای برنامههایی شود که به پیادهسازی دقیق قواعد یا مشخصات IEEE یا ISO برای توابع ریاضی وابستهاند. با این حال، ممکن است برای برنامههایی که به ضمانتهای این مشخصات نیازی ندارند، کُد سریعتری تولید کند.
پیشفرض -fmath-errno است.
در سیستمهای Darwin، کتابخانهٔ ریاضی هرگز "errno" را تنظیم نمیکند؛ بنابراین دلیلی ندارد که کامپایلر چنین احتمالی را در نظر بگیرد، و -fno-math-errno حالت پیشفرض است.
- -funsafe-math-optimizations
- بهینهسازیهایی
را برای
محاسبات
ممیز شناور
مجاز
میکند که
(الف) فرض
میکنند
آرگومانها
و نتایج
معتبر
هستند و (ب)
ممکن است
استانداردهای
IEEE یا ANSI را نقض
کنند. در
صورت
استفاده در
زمان
پیوند،
ممکن است
کتابخانهها
یا
فایلهای
راهاندازیای
را شامل شود
که واژهٔ
کنترلی
پیشفرض FPU
یا سایر
بهینهسازیهای
مشابه را
تغییر
میدهند.
این گزینه توسط هیچیک از گزینههای -O بهجز -Ofast فعال نمیشود، زیرا میتواند منجر به خروجی نادرست برای برنامههایی شود که به پیادهسازی دقیق قواعد یا مشخصات IEEE یا ISO برای توابع ریاضی وابستهاند. با این حال، ممکن است برای برنامههایی که به ضمانتهای این مشخصات نیازی ندارند، کُد سریعتری تولید کند. گزینههای -fno-signed-zeros، -fno-trapping-math، -fassociative-math و -freciprocal-math را فعال میکند.
پیشفرض -fno-unsafe-math-optimizations است.
- -fassociative-math
- شرکتپذیری
مجدد (re-association)
عملوندها
را در
دنبالهای
از عملیات
ممیز شناور
مجاز
میکند. این
کار
استانداردهای
زبان ISO C و C++ را
با تغییر
احتمالی در
نتیجهٔ
محاسبات
نقض میکند.
توجه:
بازآرایی
ممکن است
علامت صفر
را تغییر
دهد،
مقادیر NaN را
نادیده
بگیرد، و
سرریز
زیرین یا
سرریز
زبرین را
مهار کند یا
به وجود
آورد (و
بنابراین
نباید در
کُدهایی که
به رفتار
گرد کردن
وابسته
هستند،
مانند "(x +
2**52) - 2**52"،
استفاده
شود).
همچنین
ممکن است
مقایسههای
ممیز شناور
را
بازآرایی
کند و
بنابراین
نباید در
جایی که
مقایسههای
ترتیبی (ordered)
لازم است به
کار رود.
این گزینه
مستلزم آن
است که هر
دو گزینهٔ
-fno-signed-zeros و -fno-trapping-math
فعال باشند.
علاوه بر
این، همراه
با -frounding-math
کاربرد
چندانی
ندارد. برای
Fortran، این
گزینه
زمانی که هر
دو گزینهٔ
-fno-signed-zeros و -fno-trapping-math
فعال
باشند، به
طور خودکار
فعال
میشود.
پیشفرض -fno-associative-math است.
- -freciprocal-math
- اجازه
میدهد در
صورتی که
بهینهسازیها
را ممکن
سازد، به
جای تقسیم
بر یک مقدار
از معکوس آن
مقدار
استفاده
شود؛ برای
نمونه "x /
y"
میتواند
با "x * (1/y)"
جایگزین
شود که در
صورتی مفید
است که
"(1/y)"
مشمول حذف
زیرعبارتهای
مشترک شود.
توجه داشته
باشید که
این کار دقت
را کاهش
داده و
تعداد
فلاپسها (flops)
را در
عملیات روی
مقدار
افزایش
میدهد.
پیشفرض -fno-reciprocal-math است.
- -ffinite-math-only
- بهینهسازیهایی
را برای
محاسبات
ممیز شناور
مجاز
میکند که
فرض
میکنند
آرگومانها
و نتایج NaN یا
+-Inf نیستند.
این گزینه توسط هیچیک از گزینههای -O بهجز -Ofast فعال نمیشود، زیرا میتواند منجر به خروجی نادرست برای برنامههایی شود که به پیادهسازی دقیق قواعد یا مشخصات IEEE یا ISO برای توابع ریاضی وابستهاند. با این حال، ممکن است برای برنامههایی که به ضمانتهای این مشخصات نیازی ندارند، کُد سریعتری تولید کند.
پیشفرض -fno-finite-math-only است.
- -fno-signed-zeros
- بهینهسازیهایی
را برای
محاسبات
ممیز شناور
مجاز
میکند که
علامتدار
بودن صفر را
نادیده
میگیرند.
محاسبات IEEE
رفتار
مقادیر
متمایز +0.0 و -0.0
را مشخص
میکند که
مانع از
سادهسازی
عباراتی
مانند x+0.0 یا 0.0*x
(حتی با -ffinite-math-only)
میشود. این
گزینه بدین
معناست که
علامت
نتیجهٔ صفر
اهمیت
ندارد.
پیشفرض -fsigned-zeros است.
- -fno-trapping-math
- کُد را با
این فرض
کامپایل
میکند که
عملیاتهای
ممیز شناور
نمیتوانند
تلههای (traps)
قابل رؤیت
برای کاربر
تولید کنند.
این تلهها
شامل تقسیم
بر صفر،
سرریز
زبرین،
سرریز
زیرین،
نتیجهٔ
غیردقیق و
عملیات
نامعتبر
هستند. این
گزینه
مستلزم آن
است که -fno-signaling-nans
فعال باشد.
تنظیم این
گزینه در
صورتی که
مثلاً بر
محاسبات IEEE
«بدون
توقف» (non-stop)
تکیه شود،
ممکن است
امکان
تولید کُد
سریعتر را
فراهم کند.
این گزینه توسط هیچیک از گزینههای -O بهجز -Ofast فعال نمیشود، زیرا میتواند منجر به خروجی نادرست برای برنامههایی شود که به پیادهسازی دقیق قواعد یا مشخصات IEEE یا ISO برای توابع ریاضی وابستهاند.
پیشفرض -ftrapping-math است.
نسخههای آیندهٔ GCC ممکن است کنترل دقیقتری بر این تنظیم با استفاده از پراگمای "FENV_ACCESS" در C99 ارائه دهند. این گزینهٔ خط فرمان به همراه -frounding-math برای تعیین حالت پیشفرض برای "FENV_ACCESS" استفاده خواهد شد.
- -frounding-math
- تبدیلها و
بهینهسازیهایی
را که رفتار
پیشفرض
گرد کردن
ممیز شناور
(گرد کردن
به
نزدیکترین
مقدار) را
فرض
میکنند،
غیرفعال
میکند. این
گزینه باید
برای
برنامههایی
مشخص شود که
حالت گرد
کردن ممیز
شناور را به
صورت پویا
تغییر
میدهند،
یا ممکن است
با یک حالت
گرد کردن
غیرپیشفرض
اجرا شوند.
این گزینه
ادغام
مقادیر
ثابت (constant folding)
عبارات
ممیز شناور
را در زمان
کامپایل (که
ممکن است
تحت تأثیر
حالت گرد
کردن قرار
گیرد) و
تبدیلات
محاسباتی
را که در
حضور
حالتهای
گرد کردن
وابسته به
علامت
ناامن
هستند،
غیرفعال
میکند.
پیشفرض -fno-rounding-math است.
این گزینه آزمایشی است و در حال حاضر تضمین نمیکند که تمام بهینهسازیهای GCC که تحت تأثیر حالت گرد کردن هستند را غیرفعال کند. نسخههای آیندهٔ GCC ممکن است کنترل دقیقتری بر این تنظیم با استفاده از پراگمای "FENV_ACCESS" در C99 ارائه دهند. این گزینهٔ خط فرمان همراه با -ftrapping-math برای تعیین حالت پیشفرض برای "FENV_ACCESS" استفاده خواهد شد.
- -fsignaling-nans
- کُد را با
این فرض
کامپایل
میکند که
signaling NaNهای IEEE
ممکن است در
حین
عملیاتهای
ممیز
شناور،
تلههای
قابل رؤیت
برای کاربر
تولید کنند.
تنظیم این
گزینه،
بهینهسازیهایی
را که ممکن
است تعداد
استثناهای
قابل رؤیت
با signaling NaNها را
تغییر
دهند،
غیرفعال
میکند. این
گزینه
مستلزم -ftrapping-math
است.
این گزینه باعث میشود که ماکروی پیشپردازندهٔ "__SUPPORT_SNAN__" تعریف شود.
پیشفرض -fno-signaling-nans است.
این گزینه آزمایشی است و در حال حاضر تضمین نمیکند که تمام بهینهسازیهای GCC متأثر از رفتار signaling NaN را غیرفعال کند.
- -fsingle-precision-constant
- با ثابتهای ممیز شناور به عنوان دقت منفرد (single precision) رفتار میکند به جای این که آنها را به صورت ضمنی به ثابتهای با دقت مضاعف (double-precision) تبدیل کند.
- -fcx-limited-range
- در صورت
فعال بودن،
این گزینه
بیان
میکند که
هنگام
انجام
تقسیم
مختلط به
مرحلهٔ
کاهش دامنه
نیازی نیست.
همچنین
بررسی
نمیشود که
آیا حاصل
ضرب یا
تقسیم
مختلط "NaN +
I*NaN" است یا
خیر، و
تلاشی برای
بهبود
وضعیت در آن
حالت انجام
نمیگیرد.
این گزینه
توسط -ffast-math
فعال
میشود.
این گزینه تنظیم پیشفرض پراگمای "CX_LIMITED_RANGE" در ISO C99 را کنترل میکند. با این حال، این گزینه برای همهٔ زبانها اعمال میشود.
- -fcx-fortran-rules
- ضرب و تقسیم
مختلط از
قواعد Fortran
پیروی
میکنند.
کاهش دامنه
به عنوان
بخشی از
تقسیم
مختلط
انجام
میشود،
اما هیچ
بررسیای
برای اینکه
آیا حاصل
ضرب یا
تقسیم
مختلط "NaN +
I*NaN" است یا
خیر، و
تلاشی برای
بهبود
وضعیت در آن
حالت صورت
نمیگیرد..IP
-fcx-method=method 4 ضرب و
تقسیم
اعداد
مختلط از method
مشخصشده
پیروی
میکنند.
آرگومان method
باید یکی از
مقادیر
limited-range، fortran یا stdc
باشد.
حالت پیشفرض، رعایت محدودیتهای خاص زبان است که به معنای fortran برای زبان Fortran و در غیر این صورت stdc خواهد بود.
گزینههای زیر بهینهسازیهایی را کنترل میکنند که ممکن است عملکرد را بهبود ببخشند، اما توسط هیچیک از گزینههای -O فعال نمیشوند. این بخش شامل گزینههای آزمایشی است که ممکن است کدهای معیوب تولید کنند.
- -fbranch-probabilities
- پس از اجرای
برنامهای
که با -fprofile-arcs
کامپایل
شده است،
میتوانید
آن را بار
دوم با
استفاده از
-fbranch-probabilities
کامپایل
کنید تا
بهینهسازیها
بر اساس
تعداد
دفعاتی که
هر انشعاب
طی شده است،
ارتقا
یابند.
هنگامی که
برنامهای
کامپایلشده
با -fprofile-arcs خارج
میشود،
تعداد
دفعات
اجرای
کمانها (arcs)
را برای هر
فایل مبدأ
در فایلی به
نام sourcename.gcda
ذخیره
میکند.
اطلاعات
موجود در
این فایل
داده به شدت
وابسته به
ساختار کد
تولید شده
است،
بنابراین
باید برای
هر دو
کامپایل از
همان کد
مبدأ و همان
گزینههای
بهینهسازی
استفاده
کنید.
جزئیات
نامگذاری
فایل را در
-fprofile-arcs ببینید.
با -fbranch-probabilities، کامپایلر GCC یک یادداشت REG_BR_PROB روی هر JUMP_INSN و CALL_INSN قرار میدهد. اینها میتوانند برای بهبود بهینهسازی استفاده شوند. در حال حاضر، آنها فقط در یک نقطه استفاده میشوند: در reorg.cc، به جای حدس زدن اینکه یک انشعاب به احتمال زیاد کدام مسیر را طی میکند، مقادیر REG_BR_PROB برای تعیین دقیق مسیری که بیشتر پیموده میشود به کار میروند.
توسط -fprofile-use و -fauto-profile فعال میشود.
- -fprofile-values
- اگر با -fprofile-arcs
ترکیب شود،
کدهایی را
اضافه
میکند تا
دادههایی
درباره
مقادیر
عبارات در
برنامه
جمعآوری
شوند.
همراه با -fbranch-probabilities، دادههای جمعآوریشده از پروفایلسازی مقادیر عبارات را برای استفاده در بهینهسازیها بازخوانی میکند.
توسط -fprofile-generate، -fprofile-use و -fauto-profile فعال میشود.
- -fprofile-reorder-functions
- بازآرایی
توابع بر
اساس ابزار
دقیق
پروفایل (profile
instrumentation)، زمان
نخستین
اجرای هر
تابع را
جمعآوری
کرده و این
توابع را به
ترتیب
صعودی مرتب
میکند؛
هدف آن
بهینهسازی
زمان
راهاندازی
برنامه از
طریق
بارگذاری
کارآمدتر
بخشهای
متن (text segments) است.
با -fprofile-use فعال میشود.
- -fvpt
- اگر با -fprofile-arcs
ترکیب شود،
این گزینه
به
کامپایلر
دستور
میدهد
کدهایی
برای
جمعآوری
اطلاعات
درباره
مقادیر
عبارات
اضافه کند.
همراه با -fbranch-probabilities، دادههای جمعآوریشده را بازخوانی کرده و عملاً بهینهسازیها را بر پایه آنها اعمال میکند. در حال حاضر این بهینهسازیها شامل تخصیصیافتگی عملیات تقسیم با استفاده از دانش مربوط به مقدار مخرج است.
با -fprofile-use و -fauto-profile فعال میشود.
- -frename-registers
- تلاش
میکند تا
با استفاده
از
ثباتهای
(registers)
باقیمانده
پس از تخصیص
ثبات، از
وابستگیهای
کاذب در
کدهای
زمانبندیشده
جلوگیری
کند. این
بهینهسازی
بیشترین
سود را برای
پردازندههایی
با
ثباتهای
زیاد به
همراه دارد.
با این حال،
بسته به
قالب
اطلاعات
اشکالزدایی
اتخاذشده
توسط هدف،
این کار
میتواند
اشکالزدایی
را غیرممکن
کند، زیرا
متغیرها
دیگر در یک
«home register» باقی
نمیمانند.
بهطور پیشفرض همراه با -funroll-loops فعال میشود.
- -fschedule-fusion
- یک گذر
وابسته به
معماری هدف
را روی
جریان
دستورالعملها
انجام
میدهد تا
دستورالعملهای
همنوع را
در کنار
یکدیگر
زمانبندی
کند، زیرا
ماشین هدف
میتواند
در صورت
مجاور بودن
آنها در
جریان
دستورالعمل،
آنها را با
کارایی
بیشتری
اجرا کند.
در سطوح -O2، -O3 و -Os فعال میشود.
- -fdep-fusion
- جفتهای
ادغامپذیر
کلاندستور
(macro-op fusible pairs) متشکل
از
دستورالعملهای
تککاربرده
و موارد
استفاده
آنها را
شناسایی
کرده و این
جفتها را
در جریان
دستورالعملها
کنار هم
قرار
میدهد تا
فرصتهای
ادغام در
سختافزار
افزایش
یابد. این
گذر یک بار
پیش از
تخصیص ثبات
و بار دیگر
پیش از
بازنامگذاری
ثبات اجرا
میشود.
در سطوح -O2، -O3 و -Os فعال میشود.
- -ftracer
- تکثیر دم (tail
duplication) را برای
بزرگتر
کردن
اندازه
سوپربلاک
(superblock) انجام
میدهد. این
تبدیل،
جریان
کنترل تابع
را ساده
کرده و به
دیگر
بهینهسازیها
اجازه
میدهد
کارایی
بهتری
داشته
باشند.
توسط -fprofile-use و -fauto-profile فعال میشود.
- -funroll-loops
- حلقههایی
را که تعداد
تکرارهای
آنها را
میتوان در
زمان
کامپایل یا
هنگام ورود
به حلقه
تعیین کرد،
باز (unroll)
میکند.
گزینه -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
- هر تابع یا
قلم داده (data item)
را در صورتی
که مقصد از
بخشهای
دلخواه (arbitrary sections)
پشتیبانی
کند، در بخش
اختصاصی
خودش در
فایل خروجی
قرار
میدهد. نام
تابع یا نام
قلم داده،
نام بخش
مربوطه در
فایل خروجی
را مشخص
میکند.
از این گزینهها در سیستمهایی استفاده کنید که پیونددهنده (linker) میتواند برای بهبود محلیبودن ارجاع (locality of reference) در فضای دستورالعملها، بهینهسازیهایی انجام دهد. بیشتر سیستمهایی که از قالب شیء ELF استفاده میکنند، پیونددهندههایی با چنین بهینهسازیهایی دارند. در AIX، پیونددهنده بخشها (CSECTها) را بر پایه گراف فراخوانی بازآرایی میکند. تأثیر بر کارایی متغیر است.
این گزینهها به همراه بازیافت بخشهای زائد توسط پیونددهنده (گزینه --gc-sections پیونددهنده) ممکن است (پس از پیراستن یا strip کردن) به فایلهای اجرایی پیوند ایستا (statically-linked) کوچکتری منجر شوند.
در سیستمهای ELF/DWARF این گزینهها کیفیت اطلاعات اشکالزدایی را کاهش نمیدهند. با این حال ممکن است با سایر قالبهای فایل شیء/اطلاعات اشکالزدایی مشکلاتی وجود داشته باشد.
تنها زمانی از این گزینهها استفاده کنید که مزایای قابلتوجهی داشته باشند. هنگامی که این گزینهها را مشخص میکنید، اسمبلر و پیونددهنده فایلهای شیء و اجرایی بزرگتری ایجاد میکنند و همچنین کندتر عمل میکنند. این گزینهها روی تولید کد تأثیر میگذارند. آنها مانع از بهینهسازیهایی توسط کامپایلر و اسمبلر میشوند که از مکانهای نسبی درون یک واحد ترجمه (translation unit) استفاده میکنند، زیرا مکانها تا زمان پیوند ناشناخته هستند. نمونهای از چنین بهینهسازیهایی، تعدیل فراخوانیها به دستورالعملهای فراخوانی کوتاه است.
- -fstdarg-opt
- پیشدرآمد (prologue) توابع با تعداد آرگومان متغیر (variadic argument) را با توجه به نحوه استفاده از آن آرگومانها بهینهسازی میکند.
- -fsection-anchors
- تلاش
میکند تا
با استفاده
از نمادهای
مشترک
«لنگر» (anchor)
برای
آدرسدهی
به اشیاء
مجاور،
تعداد
محاسبات
آدرس
نمادین را
کاهش دهد.
این تبدیل
میتواند
به کاهش
تعداد
مدخلهای GOT
و
دسترسیهای
GOT در برخی از
مقصدها کمک
کند.
برای مثال، پیادهسازی تابع زیر "foo":
static int a, b, c; int foo (void) { return a + b + c; }معمولاً آدرسهای هر سه متغیر را محاسبه میکند، اما اگر آن را با -fsection-anchors کامپایل کنید، در عوض از یک نقطه لنگر مشترک به متغیرها دسترسی پیدا میکند. اثر آن شبیه به شبهکد زیر است (که کد معتبر C نیست):
int foo (void) { register int *xr = &x; return xr[&a - &x] + xr[&b - &x] + xr[&c - &x]; }همه مقصدها از این گزینه پشتیبانی نمیکنند.
- -fzero-call-used-regs=choice
- ثباتهای
مورداستفاده
در
فراخوانی
(call-used registers) را در
هنگام
بازگشت از
تابع صفر
میکند تا
با کاهش
حملات
برنامهنویسی
مبتنی بر
بازگشت (ROP) یا
جلوگیری از
نشت
اطلاعات از
طریق
ثباتها،
امنیت
برنامه
افزایش
یابد.
مقادیر مجاز برای choice همانند مقادیر مشخصه "zero_call_used_regs" هستند. پیشفرض skip است.
میتوانید این رفتار را برای یک تابع خاص با استفاده از مشخصه تابع "zero_call_used_regs" کنترل کنید.
گزینههای ابزارگذاری برنامه (Program Instrumentation Options)
GCC از تعدادی گزینه خط فرمان پشتیبانی میکند که افزودن ابزارگذاری زمان اجرا (run-time instrumentation) را به کدی که بهطور عادی تولید میکند، کنترل مینمایند. برای نمونه، یک هدف از ابزارگذاری، جمعآوری آمار پروفایلسازی برای استفاده در یافتن نقاط داغ برنامه (hot spots)، تحلیل پوشش کد، یا بهینهسازیهای هدایتشده با پروفایل است. دسته دیگری از ابزارگذاری برنامه، افزودن بررسیهای زمان اجرا برای تشخیص خطاهای برنامهنویسی مانند ارجاع به اشارهگرهای نامعتبر یا دسترسیهای خارج از محدوده آرایهها، و همچنین حملات خصمانه عمدی مانند درهمشکستن پشته (stack smashing) یا ربودن جدول مجازی (vtable) در ++C است. همچنین یک قلاب (hook) عمومی وجود دارد که میتواند برای پیادهسازی اشکال دیگری از ردگیری (tracing) یا ابزارگذاری در سطح تابع برای اهداف اشکالزدایی یا تحلیل برنامه استفاده شود.
- -p
- --profile
- -fprofile
- -pg
- کد اضافی
برای نوشتن
اطلاعات
پروفایلسازی
مناسب برای
برنامه
تحلیلگر
prof (برای -p،
--profile، و -fprofile) یا
gprof (برای -pg)
تولید
میکند.
باید از این
گزینه
هنگام
کامپایل
کردن
فایلهای
منبعی که
دادههای
آنها را
میخواهید
استفاده
کنید، و
همچنین
باید آن را
در هنگام
پیوند دادن
نیز به کار
ببرید.
هنگام کامپایل با این گزینهها، میتوانید از مشخصه تابع "no_instrument_function" برای صرفنظر از پروفایلسازی توابع مشخص استفاده کنید.
- -fprofile-arcs
- کدی اضافه
میکند تا
کمانهای
جریان
برنامه (arcs)
ابزارگذاری
شوند. در
حین اجرا،
برنامه ثبت
میکند که
هر شاخه و
فراخوانی
چند بار
اجرا شده و
چند بار
منشعب شده
یا بازگشته
است. در
مقصدهایی
که از
سازندهها
(constructors) با
اولویت
پشتیبانی
میکنند،
پروفایلسازی
به درستی
سازندهها،
مخربها (destructors)
و
سازندههای
++C (و
مخربهای)
کلاسهایی
را که به
عنوان نوعی
از یک متغیر
سراسری
استفاده
میشوند،
مدیریت
میکند.
هنگامی که برنامه کامپایلشده خارج میشود، این دادهها را در فایلی به نام auxname.gcda برای هر فایل منبع ذخیره میکند. این دادهها میتوانند برای بهینهسازیهای هدایتشده با پروفایل (-fbranch-probabilities) یا برای تحلیل پوشش آزمون (-ftest-coverage) استفاده شوند. نام کمکی (auxname) هر فایل شیء از روی نام فایل خروجی (در صورتی که صراحتاً مشخص شده باشد و فایل اجرایی نهایی نباشد) تولید میشود، در غیر این صورت نام پایه (basename) فایل منبع است. در هر دو حالت، هر پسوندی حذف میشود (مثلاً foo.gcda برای فایل ورودی dir/foo.c، یا dir/foo.gcda برای فایل خروجی مشخصشده به صورت -o dir/foo.o).
توجه داشته باشید که اگر یک خط فرمان مستقیماً فایلهای منبع را پیوند دهد، نام فایل خروجی بدون پسوند به عنوان پیشوند فایلهای .gcda مربوطه قرار خواهد گرفت. برای مثال "gcc a.c b.c -o binary" فایلهای binary-a.gcda و binary-b.gcda را تولید میکند.
- -fcondition-coverage
- کدی اضافه میکند تا شرایط برنامه ابزارگذاری شوند. در طول اجرا، برنامه ثبت میکند چه عباراتی در یک شرط در یک تصمیمگیری نقش داشتهاند، که میتوان از آن برای راستیآزمایی این که همه عبارات در یک تابع بولی آزمایش شده و تأثیر مستقلی بر نتیجه تصمیمگیری دارند استفاده کرد. نتیجه را میتوان با "gcov --conditions" خواند.
- -fpath-coverage
- کدی اضافه میکند تا مسیرهای طیشده ردگیری شوند. در طول اجرا، برنامه مسیرهای اول طیشده (prime paths) را ثبت میکند. تعداد مسیرها با افزایش پیچیدگی بسیار سریع رشد میکند، و GCC برای جلوگیری از انفجار زمان کامپایل، در صورتی که تعداد تقریبی مسیرها از حد مجاز تعیینشده توسط -fpath-coverage-limit فراتر رود، از ابزارگذاری صرفنظر میکند. نتیجه را میتوان با "gcov --prime-paths --prime-paths-lines --prime-paths-source" خواند.
- -fpath-coverage-limit=limit
- آستانهای که در آن -fpath-coverage از ابزارگذاری یک تابع صرفنظر میکند. این محدودیت تقریبی و محافظهکارانه است، زیرا GCC از یک روش ابتکاری بدبینانه استفاده میکند که تعداد مسیرهای در حال پردازش را اندکی بیش از حد واقعی میشمارد، و در صورتی که پیش از یافتن همه مسیرها به آستانه برسد، کار را متوقف میکند. این گزینه برای کنترل دقیق و ریزدانه روی این که کدام توابع ابزارگذاری شوند نیست - بلکه برای محدود کردن اثر انفجار مسیر و منطقی نگه داشتن زمان کامپایل در نظر گرفته شده است. مقدار پیشفرض 250000 است.
- --coverage
- -coverage
- این گزینه برای کامپایل و پیوند کدهای ابزارگذاریشده جهت تحلیل پوشش کد استفاده میشود. گزینههای -coverage و --coverage معادل یکدیگرند؛ هر دو مترادفی برای -fprofile-arcs و -ftest-coverage (هنگام کامپایل) و -lgcov (هنگام پیوند) هستند. برای جزئیات بیشتر به مستندات آن گزینهها مراجعه کنید.
- فایلهای منبع را با -fprofile-arcs به همراه گزینههای بهینهسازی و تولید کد کامپایل کنید. برای تحلیل پوشش آزمون، از گزینه اضافی -ftest-coverage استفاده نمایید. نیازی نیست همه فایلهای منبع یک برنامه را پروفایلسازی کنید.
- فایلهای منبع را علاوه بر این با -fprofile-abs-path کامپایل کنید تا نام مسیرهای مطلق در فایلهای .gcno ایجاد شوند. این امر به gcov اجازه میدهد در پروژههایی که کامپایل با دایرکتوریهای کاری متفاوتی انجام میشود، منابع درست را پیدا کند.
- فایلهای
شیء خود را
با -lgcov یا -fprofile-arcs
پیوند دهید
(دومی اولی
را نیز در
بر دارد)..IP * 4
برنامه را
روی یک بار
کاری شاخص
اجرا کنید
تا اطلاعات
پروفایل
کمانها
تولید شود.
این کار
میتواند
به هر تعداد
دفعات
تکرار شود.
شما
میتوانید
نمونههای
همروند
برنامه خود
را اجرا
کنید، و به
شرطی که
فایلسیستم
از
قفلگذاری
پشتیبانی
کند،
فایلهای
داده
بهدرستی
بهروزرسانی
خواهند شد.
مگر اینکه
یک گزینه
سختگیرانه
برای گویش ISO C
فعال باشد،
فراخوانیهای
"fork"
شناسایی
شده و بدون
شمارش
مضاعف،
بهدرستی
مدیریت
میشوند.
علاوه بر این، یک فایل شیء میتواند چندین بار بازکامپایل شود و تا زمانی که فایل منبع و گزینههای کامپایلر تغییر نکرده باشند، فایل .gcda مربوطه ادغام میشود.
- برای بهینهسازیهای مبتنی بر پروفایل، فایلهای منبع را مجدداً با همان گزینههای بهینهسازی و تولید کد، به علاوهٔ -fbranch-probabilities کامپایل کنید.
- برای تحلیل پوشش آزمون، از gcov برای تولید اطلاعات خوانا برای انسان از فایلهای .gcno و .gcda استفاده کنید. برای اطلاعات بیشتر به مستندات gcov مراجعه نمایید.
با -fprofile-arcs، برای هر تابع از برنامه شما، GCC یک گراف جریان برنامه ایجاد میکند، سپس یک درخت پوشا برای گراف مییابد. تنها کمانهایی که روی درخت پوشا نیستند باید مجهزسازی شوند: کامپایلر کدی برای شمارش تعداد دفعات اجرای این کمانها اضافه میکند. هنگامی که یک کمان تنها خروجی یا تنها ورودی یک بلوک باشد، کد مجهزسازی را میتوان به همان بلوک افزود؛ در غیر این صورت، برای نگهداری کد مجهزسازی باید یک بلوک پایه جدید ایجاد شود.
با -fcondition-coverage، برای هر عبارت شرطی در برنامه شما، GCC یک مجموعه بیتی ایجاد میکند و مقادیر بولیِ اجراشدهای را که تأثیر مستقلی بر نتیجه آن عبارت دارند ثبت مینماید.
با -fpath-coverage، GCC مسیرهای اول (prime paths) پیمودهشده هر تابع را یافته، شمارش و ثبت میکند، مگر آنکه تعداد مسیرها از حد کنترلشده توسط -fpath-coverage-limit فراتر رود. در صورت فراتر رفتن از حد مجاز، تابع مجهزسازی نخواهد شد، درست مانند اینکه از -fpath-coverage استفاده نشده باشد. یک مسیر اول، طولانیترین دنباله از بلوکهای یکتا (بهجز احتمالاً اولی و آخری) است که زیرمسیری از هیچ مسیر دیگری نباشد.
- -ftest-coverage
- یک فایل یادداشت تولید میکند که ابزار سنجش پوشش کد gcov میتواند برای نمایش میزان پوشش برنامه از آن استفاده کند. فایل یادداشت هر فایل منبع، auxname.gcno نام دارد. برای توضیحات در مورد auxname و دستورالعملهای نحوه تولید دادههای پوشش آزمون، به گزینه -fprofile-arcs در بالا مراجعه کنید. اگر برنامه را بهینهسازی نکنید، دادههای پوشش با دقت بیشتری با فایلهای منبع تطابق خواهند داشت.
- -fprofile-abs-path
- نامهای نسبی فایلهای منبع را بهطور خودکار در فایلهای .gcno به مسیرهای مطلق تبدیل میکند. این به gcov امکان میدهد در پروژههایی که کامپایل در دایرکتوریهای کاری متفاوتی انجام میشود، فایلهای منبع صحیح را پیدا کند.
- -fprofile-dir=path
- دایرکتوری
جستجو برای
فایلهای
داده
پروفایل را
به path تنظیم
میکند. این
گزینه فقط
بر
دادههای
پروفایل
تولیدشده
توسط -fprofile-generate،
-ftest-coverage، -fprofile-arcs و
دادههای
استفادهشده
توسط -fprofile-use،
-fbranch-probabilities و
گزینههای
مرتبط با آن
تأثیر
میگذارد.
هر دو مسیر
مطلق و نسبی
قابل
استفاده
هستند.
بهطور
پیشفرض، GCC
از
دایرکتوری
جاری به
عنوان path
استفاده
میکند،
بنابراین
فایل داده
پروفایل در
همان
دایرکتوریِ
فایل شیء
ظاهر
میشود. به
منظور
جلوگیری از
تداخل نام
فایلها،
اگر نام
فایل شیء یک
مسیر مطلق
نباشد،
مسیر مطلق
فایل sourcename.gcda
دگرگون (mangle)
شده و به
عنوان نام
فایل یک
فایل .gcda
استفاده
میشود.
جزئیات
نامگذاری
فایل را در
-fprofile-arcs ببینید.
گزینه
مشابه -fprofile-note
را نیز
ملاحظه
کنید.
هنگامی که یک فایل اجرایی در یک محیط بسیار موازی اجرا میشود، توصیه میشود که پروفایل در پوشههای متفاوتی ذخیره گردد. این کار را میتوان با متغیرهایی در path انجام داد که در زمان اجرا مقداردهی (export) میشوند:
- %p
- شناسه فرایند (PID).
- %q{VAR}
- مقدار متغیر محیطی VAR
- -fprofile-generate
- -fprofile-generate=path
- گزینههایی
را فعال
میکند که
معمولاً
برای
مجهزسازی
برنامه جهت
تولید
پروفایلِ
مفید برای
بازکامپایل
بعدی با
بهینهسازی
مبتنی بر
بازخورد
پروفایل به
کار
میروند.
شما باید
-fprofile-generate را هم
هنگام
کامپایل و
هم هنگام
پیوند زدن
برنامه خود
به کار
ببرید.
گزینههای زیر فعال میشوند: -fprofile-arcs، -fprofile-values، -finline-functions و -fipa-bit-cp.
اگر path مشخص شده باشد، GCC برای یافتن فایلهای داده بازخورد پروفایل به path نگاه میکند. به -fprofile-dir مراجعه کنید.
برای بهینهسازی برنامه بر اساس اطلاعات پروفایل جمعآوریشده، از -fprofile-use استفاده کنید.
- -fprofile-info-section
- -fprofile-info-section=name
- اطلاعات
پروفایل را
به جای
استفاده از
سازنده/ویرانگر،
در بخش (section)
مشخصشده
ثبت میکند.
اگر name مشخص
شده باشد
نام بخش
همان است،
در غیر این
صورت نام
بخش به طور
پیشفرض به
".gcov_info"
تغییر
مییابد.
برای هر
واحد
ترجمه،
اشارهگری
به اطلاعات
پروفایل
تولیدشده
توسط -fprofile-arcs در
بخش
مشخصشده
قرار
میگیرد.
این گزینه
ثبت
اطلاعات
پروفایل از
طریق یک
سازنده را
غیرفعال
کرده و
پردازش
اطلاعات
پروفایل از
طریق یک
ویرانگر را
نیز
غیرفعال
میسازد.
این گزینه
برای
استفاده در
محیطهای
میزبانیشده
مانند GNU/Linux در
نظر گرفته
نشده است.
هدف آن
محیطهای
مستقل (برای
مثال
سامانههای
تعبیهشده)
با منابع
محدود است
که از
سازندهها/ویرانگرها
یا
ورودی/خروجی
فایل
کتابخانه C
پشتیبانی
نمیکنند.
پیونددهنده میتواند بخشهای ورودی را در یک بلوک پیوسته از حافظه جمعآوری کرده و نمادهای آغاز و پایان را تعریف نماید. نمونهای از اسکریپت پیونددهنده GNU که یک بخش خروجی پیونددهنده را تعریف میکند در ادامه آمده است:
.gcov_info : { PROVIDE (__gcov_info_start = .); KEEP (*(.gcov_info)) PROVIDE (__gcov_info_end = .); }برنامه میتواند اطلاعات پروفایل ثبتشده در این مجموعه پیونددهنده را مثلاً به این صورت تخلیه (dump) کند:
#include <gcov.h> #include <stdio.h> #include <stdlib.h> extern const struct gcov_info *const __gcov_info_start[]; extern const struct gcov_info *const __gcov_info_end[]; static void dump (const void *d, unsigned n, void *arg) { const unsigned char *c = d; for (unsigned i = 0; i < n; ++i) printf ("%02x", c[i]); } static void filename (const char *f, void *arg) { __gcov_filename_to_gcfn (f, dump, arg ); } static void * allocate (unsigned length, void *arg) { return malloc (length); } static void dump_gcov_info (void) { const struct gcov_info *const *info = __gcov_info_start; const struct gcov_info *const *end = __gcov_info_end; /* Obfuscate variable to prevent compiler optimizations. */ __asm__ ("" : "+r" (info)); while (info != end) { void *arg = NULL; __gcov_info_to_gcda (*info, filename, dump, allocate, arg); putchar ('\n'); ++info; } } int main (void) { dump_gcov_info (); return 0; }زیرفرمان merge-stream از gcov-tool میتواند برای بازسازی دادهها (deserialize) از جریان داده تولیدشده توسط توابع "__gcov_filename_to_gcfn" و "__gcov_info_to_gcda" و ادغام اطلاعات پروفایل در فایلهای .gcda روی فایلسیستم میزبان به کار رود..IP -fprofile-note=path 4 اگر path مشخص شده باشد، GCC فایل .gcno را در مکان path ذخیره میکند. اگر این گزینه را با چندین فایل مبدأ ترکیب کنید، فایل .gcno بازنویسی خواهد شد.
- -fprofile-prefix-path=path
- این گزینه میتواند در ترکیب با profile-generate=profile_dir و profile-use=profile_dir برای آگاهسازی GCC از مکان دایرکتوری پایهٔ درخت مبدأ ساختهشده به کار رود. بهطور پیشفرض، profile_dir شامل فایلهایی با مسیرهای مطلق درهمریخته (mangled) از تمامی فایلهای شیء پروژهٔ ساختهشده خواهد بود. این وضعیت زمانی که دایرکتوری مورد استفاده برای ساخت دودویی سنجششده (instrumented) با دایرکتوری مورد استفاده برای ساخت دودویی بهینهشده با بازخورد پروفایل تفاوت داشته باشد مطلوب نیست؛ زیرا دادههای پروفایل در طول ساخت بهینهشده پیدا نخواهند شد. در چنین شرایطی، میتوان از -fprofile-prefix-path=path در حالی که path به دایرکتوری پایهٔ ساخت اشاره دارد، برای حذف بخش نامربوط مسیر و نسبی نگهداشتن تمامی نامهای فایل نسبت به دایرکتوری اصلی ساخت استفاده کرد.
- -fprofile-prefix-map=old=new
- هنگام کامپایل فایلهای مستقر در دایرکتوری old، اطلاعات پروفایلسازی (با --coverage) را بهگونهای ثبت میکند که گویی آن فایلها در دایرکتوری new قرار دارند. همچنین -ffile-prefix-map و -fcanon-prefix-map را ببینید.
- -fprofile-update=method
- روش
بهروزرسانی
را برای
برنامهای
که برای
بهینهسازی
مبتنی بر
بازخورد
پروفایل
سنجش شده
است، تغییر
میدهد.
آرگومان method
باید یکی از
مقادیر single،
atomic یا prefer-atomic
باشد. مقدار
اول برای
برنامههای
تکنخی
مفید است،
در حالی که
مقدار دوم
با تولید کد
امن از نظر
نخها (thread-safe)،
از خراب شدن
پروفایل
جلوگیری
میکند.
هشدار: هنگامی که یک برنامه تمام نخها را بهدرستی الحاق (join) نکند (یا یک نخ جداشده/detached ایجاد کند)، فایل پروفایل همچنان ممکن است مخدوش شود.
استفاده از prefer-atomic در صورت پشتیبانی توسط معماری مقصد به atomic و در غیر این صورت به single تبدیل میشود. گردانندهٔ GCC زمانی که -pthread در خط فرمان موجود باشد، بهطور خودکار prefer-atomic را انتخاب میکند؛ در غیر این صورت روش پیشفرض single است.
اگر atomic انتخاب شود، اطلاعات پروفایل با استفاده از عملیات اتمیک بر اساس حداکثر تلاش (best-effort) بهروزرسانی میشوند. در حالت ایدهآل، اطلاعات پروفایل از طریق عملیات اتمیک در سختافزار بهروزرسانی میگردند. اما اگر سکوی مقصد از عملیات اتمیک مورد نیاز در سختافزار پشتیبانی نکند ولی libatomic در دسترس باشد، اطلاعات پروفایل از طریق فراخوانیهای libatomic بهروزرسانی میشوند. چنانچه سکوی مقصد نه از عملیات اتمیک سختافزاری لازم پشتیبانی کند و نه از libatomic، اطلاعات پروفایل بهصورت اتمیک بهروز نخواهد شد و هشداری صادر میشود. در این حالت، اطلاعات پروفایلِ بهدستآمده برای برنامههای چندنخی ممکن است نامعتبر یا مخدوش باشد.
به دلایل کارایی، اگر از شمارندههای ۶۴ بیتی برای اطلاعات پروفایل استفاده شود و سکوی مقصد تنها از عملیات اتمیک ۳۲ بیتی در سختافزار پشتیبانی کند، بهروزرسانیهای حساس به کارایی پروفایل با استفاده از دو عملیات اتمیک ۳۲ بیتی برای هر بهروزرسانی شمارنده انجام میشوند. اگر سیگنالی این دو عملیات بهروزرسانی شمارنده را قطع کند، اطلاعات پروفایل ممکن است در وضعیتی ناهمگون قرار گیرند.
- -fprofile-filter-files=regex
- تنها
توابعی از
فایلهایی
را مورد
سنجش قرار
میدهد که
نام آنها
با هر یک از
عبارتهای
باقاعده (که
با
نقطهویرگول
از یکدیگر
جدا
شدهاند)
مطابقت
داشته باشد.
برای مثال، -fprofile-filter-files=main\.c;module.*\.c تنها main.c و تمام فایلهای C که با 'module' آغاز میشوند را میسنجد.
- -fprofile-exclude-files=regex
- تنها
توابعی از
فایلهایی
را مورد
سنجش قرار
میدهد که
نام آنها
با هیچیک
از
عبارتهای
باقاعده (که
با
نقطهویرگول
از یکدیگر
جدا
شدهاند)
مطابقت
نداشته
باشد.
برای مثال، -fprofile-exclude-files=/usr/.* از سنجش تمامی فایلهایی که در پوشهٔ /usr/ قرار دارند جلوگیری میکند.
- -fprofile-reproducible=[multithreaded|parallel-runs|serial]
- سطح
تکرارپذیری
پروفایل
جمعآوریشده
توسط
"-fprofile-generate" را
کنترل
میکند. این
امکان را
فراهم
میسازد که
برنامه را
با نتیجهٔ
یکسان
بازسازی
کرد که برای
مثال در
بستههای
توزیع مفید
است.
با -fprofile-reproducible=serial، پروفایل جمعآوریشده توسط -fprofile-generate تکرارپذیر خواهد بود به شرطی که برنامهٔ آموزشدادهشده در هر بار فراخوانی اجرای آموزشی رفتار یکسانی داشته باشد، چندنخی نباشد و جریان دادههای پروفایل همیشه با ترتیبی یکسان انجام شود. توجه داشته باشید که جریان دادههای پروفایل در پایان اجرای برنامه و همچنین پیش از فراخوانی تابع "fork" صورت میگیرد.
توجه داشته باشید که بسیار معمول است که تعداد دفعات اجرای برخی از بخشهای برنامهها به عنوان مثال به طول نامهای فایلهای موقت یا تصادفیسازی فضای حافظه (که ممکن است بر نرخ برخورد در جدول هش تأثیر بگذارد) بستگی داشته باشد. چنین بخشهای غیرتکرارپذیری از برنامهها را میتوان با صفت تابع "no_instrument_function" حاشیهنویسی کرد. ابزار gcov-dump همراه با -l میتواند برای تخلیهٔ دادههای جمعآوریشده و راستیآزمایی تکرارپذیر بودن واقعی آنها به کار رود.
با -fprofile-reproducible=parallel-runs، پروفایل جمعآوریشده صرفنظر از ترتیب جریان دادهها به درون فایلهای gcda، تکرارپذیر میماند. این تنظیم امکان اجرای موازی چندین نمونه از برنامهٔ سنجششده را فراهم میکند (مانند اجرا با "make -j"). این کار کیفیت دادههای جمعآوریشده را، بهویژه در پروفایلسازی فراخوانیهای غیرمستقیم، کاهش میدهد.
- -fsanitize=address
- فعالسازی
AddressSanitizer، یک
آشکارساز
سریع
خطاهای
حافظه.
دستورالعملهای
دسترسی به
حافظه برای
تشخیص
باگهای
خارج از
محدوده (out-of-bounds) و
استفاده پس
از
آزادسازی
(use-after-free) مورد
سنجش قرار
میگیرند.
این گزینه
-fsanitize-address-use-after-scope را
فعال
میکند.
برای
جزئیات
بیشتر به
https://github.com/google/sanitizers/wiki/AddressSanitizer
مراجعه
کنید. رفتار
زمان اجرا
را میتوان
با استفاده
از متغیر
محیطی ASAN_OPTIONS
تحت تأثیر
قرار داد.
هنگامی که
روی "help=1"
تنظیم شود،
گزینههای
موجود در
زمان
راهاندازی
برنامهٔ
سنجششده
نمایش داده
میشوند.
برای
فهرستی از
گزینههای
پشتیبانیشده
به
https://github.com/google/sanitizers/wiki/AddressSanitizerFlags#run-time-flags
مراجعه
کنید. این
گزینه
نمیتواند
با -fsanitize=thread یا
-fsanitize=hwaddress ترکیب
شود. توجه
داشته
باشید که
تنها
مقصدهایی
که -fsanitize=hwaddress در
حال حاضر
روی آنها
پشتیبانی
میشود
عبارتند از
x86-64 (تنها با
گزینههای
"-mlam=u48" یا
"-mlam=u57") و AArch64،
در هر دو
مورد تنها
در ABIهای با
اشارهگرهای
۶۴ بیتی.
بهطور
مشابه،
-fsanitize=memtag-stack در حال
حاضر تنها
روی ABIهای AArch64
با
اشارهگرهای
۶۴ بیتی
پشتیبانی
میشود.
هنگام کامپایل با -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 (تصادفیسازی چیدمان فضای آدرس)، چندین بار اجرای برنامه ممکن است ردگیریهای برگشتی (backtraces) با آدرسهای متفاوتی تولید کنند، ممکن است خاموش کردن ASLR مطلوب باشد. در لینوکس، این کار با setarch `uname -m` -R ./prog قابل انجام است.
- -fsanitize=kernel-address
- فعالسازی AddressSanitizer برای هستهٔ لینوکس. برای جزئیات بیشتر به https://github.com/google/kernel-sanitizers مراجعه کنید.
- -fsanitize=hwaddress
- فعالسازی Hardware-assisted AddressSanitizer، که از یک قابلیت سختافزاری برای نادیده گرفتن بایت بالایی (top byte) یک اشارهگر استفاده میکند تا امکان تشخیص خطاهای حافظه را با سربار حافظهٔ اندک فراهم سازد. دستورالعملهای دسترسی به حافظه برای تشخیص باگهای خارج از محدوده و استفاده پس از آزادسازی مورد سنجش قرار میگیرند. این گزینه -fsanitize-address-use-after-scope را فعال میکند. برای جزئیات بیشتر به https://clang.llvm.org/docs/HardwareAssistedAddressSanitizerDesign.html مراجعه کنید. رفتار زمان اجرا را میتوان با استفاده از متغیر محیطی HWASAN_OPTIONS تحت تأثیر قرار داد. هنگامی که روی "help=1" تنظیم شود، گزینههای موجود در هنگام راهاندازی برنامهٔ سنجششده نمایش داده میشوند. این گزینه نمیتواند با -fsanitize=thread یا -fsanitize=address ترکیب شود، و در حال حاضر تنها روی AArch64 در دسترس است.
- -fsanitize=kernel-hwaddress
- فعالسازی
Hardware-assisted AddressSanitizer برای
کامپایل
هستهٔ
لینوکس.
مشابه -fsanitize=kernel-address
اما با
استفاده از
یک روش سنجش
جایگزین، و
مشابه -fsanitize=hwaddress
اما با
تفاوتهای
سنجشی که
برای
کامپایل
هستهٔ
لینوکس
ضروری است.
این
تفاوتها
برای
اجتناب از
فراخوانیهای
راهاندازی
اولیهٔ
کتابخانهٔ
hwasan و در نظر
گرفتن
داشتن
مقداری
متفاوت در
بایت
بالایی
اشارهگر
پشته هستند.
نکته: این گزینه مقادیر پیشفرض متفاوتی نسبت به -fsanitize=hwaddress دارد. سنجش پشته و فراخوانیهای alloca بهطور پیشفرض فعال نیستند. استفاده از برچسب تصادفی فریم (random frame tag) برای سنجش هسته پیادهسازی نشده است.
- -fsanitize=memtag-stack
- استفاده از دستورالعملهای Memory Tagging Extension به جای سنجش کد برای فراهم کردن امکان تشخیص خطاهای حافظه. مشابه HWASAN، این نیز یک روش احتمالی (probabilistic) است. این گزینه تنها روی آن دسته از معماریهای AArch64 در دسترس است که از Memory Tagging Extensions پشتیبانی میکنند.
- -fsanitize=pointer-compare
- سنجش عملیات مقایسه (<، <=، >، >=) با عملوندهای اشارهگر. این گزینه باید با -fsanitize=kernel-address یا -fsanitize=address ترکیب شود. این گزینه نمیتواند با -fsanitize=thread ترکیب شود. نکته: بهطور پیشفرض این بررسی در هنگام اجرا غیرفعال است. برای فعال کردن آن، "detect_invalid_pointer_pairs=2" را به متغیر محیطی ASAN_OPTIONS اضافه کنید. استفاده از "detect_invalid_pointer_pairs=1" عملیات نامعتبر را تنها زمانی تشخیص میدهد که هر دو اشارهگر غیرتهی (non-null) باشند..IP -fsanitize=pointer-subtract 4 ابزارگذاری عملیات تفریق با عملوندهای اشارهگر. این گزینه باید با -fsanitize=kernel-address یا -fsanitize=address ترکیب شود. این گزینه نمیتواند با -fsanitize=thread ترکیب شود. نکته: این بررسی بهطور پیشفرض در زمان اجرا غیرفعال است. برای فعالسازی آن، "detect_invalid_pointer_pairs=2" را به متغیر محیطی ASAN_OPTIONS اضافه کنید. استفاده از "detect_invalid_pointer_pairs=1" عملیات نامعتبر را تنها زمانی که هر دو اشارهگر غیرتهی (non-null) باشند تشخیص میدهد.
- -fsanitize=shadow-call-stack
- فعالسازی
ShadowCallStack،
سازوکاری
برای بهبود
امنیت به
منظور
محافظت از
برنامهها
در برابر
بازنویسی
آدرس
بازگشت
(مانند
سرریزهای
بافر پشته).
این
سازوکار با
ذخیره آدرس
بازگشت
تابع در یک
پشته
فراخوانی
سایه با
تخصیص
جداگانه در
مقدمه تابع
(prologue) و
بازیابی
آدرس
بازگشت از
پشته
فراخوانی
سایه در
مؤخره تابع
(epilogue) کار
میکند.
ابزارگذاری
تنها در
توابعی رخ
میدهد که
نیاز به
ذخیره آدرس
بازگشت در
پشته دارند.
در حال حاضر این سازوکار تنها از بستر aarch64 پشتیبانی میکند. این ویژگی بهطور خاص برای هستههای لینوکسی طراحی شده است که گزینه CONFIG_SHADOW_CALL_STACK را فعال کردهاند. برای برنامههای فضای کاربری، پشتیبانی زمان اجرا در حال حاضر در libc و libgcc فراهم نشده است. کاربرانی که میخواهند از این ویژگی در فضای کاربری استفاده کنند باید پشتیبانی زمان اجرای خودشان را فراهم سازند. باید توجه داشت که این کار ممکن است باعث نقض قواعد ABI شود.
در aarch64، ابزارگذاری از ثبات بستری "x18" استفاده میکند. این عموماً بدین معناست که هر کدی که ممکن است در همان ریسهای اجرا شود که کد کامپایلشده با ShadowCallStack اجرا میشود، باید با پرچم -ffixed-x18 کامپایل شود؛ در غیر این صورت توابعی که بدون -ffixed-x18 کامپایل شدهاند ممکن است "x18" را مخدوش کرده و اشارهگر پشته سایه را خراب کنند.
همچنین، به دلیل عدم وجود پشتیبانی زمان اجرا در فضای کاربری، کدهای کامپایلشده با ShadowCallStack نمیتوانند از مدیریت استثناها استفاده کنند. برای غیرفعال کردن استثناها از -fno-exceptions استفاده کنید.
برای جزئیات بیشتر به https://clang.llvm.org/docs/ShadowCallStack.html مراجعه کنید.
- -fsanitize=thread
- فعالسازی
ThreadSanitizer، یک
آشکارساز
سریع رقابت
دادهای (data race).
دستورالعملهای
دسترسی به
حافظه برای
تشخیص
باگهای
رقابت
دادهای
ابزارگذاری
میشوند.
برای
جزئیات
بیشتر به
https://github.com/google/sanitizers/wiki#threadsanitizer
مراجعه
کنید. رفتار
زمان اجرا
را میتوان
با استفاده
از متغیر
محیطی TSAN_OPTIONS
تحت تأثیر
قرار داد؛
برای
فهرستی از
گزینههای
پشتیبانیشده
به
https://github.com/google/sanitizers/wiki/ThreadSanitizerFlags
مراجعه
کنید. این
گزینه
نمیتواند
با -fsanitize=address یا
-fsanitize=leak ترکیب
شود.
هنگام کامپایل با -fsanitize=thread، باید از -g نیز برای تولید خروجی معنادارتر استفاده کنید.
توجه داشته باشید که توابع درونی اتمیک پالایششده هنگام کار روی آدرسهای حافظه نامعتبر با استثناهای غیرفراخوانی (-fnon-call-exceptions)، نمیتوانند استثنا پرتاب کنند.
- -fsanitize=leak
- فعالسازی LeakSanitizer، یک آشکارساز نشت حافظه. این گزینه تنها برای پیوند دادن (linking) فایلهای اجرایی اهمیت دارد. فایل اجرایی با کتابخانهای پیوند مییابد که تابع "malloc" و سایر توابع تخصیصدهنده را بازنویسی میکند. برای جزئیات بیشتر به https://github.com/google/sanitizers/wiki/AddressSanitizerLeakSanitizer مراجعه کنید. رفتار زمان اجرا را میتوان با استفاده از متغیر محیطی LSAN_OPTIONS تحت تأثیر قرار داد. این گزینه نمیتواند با -fsanitize=thread ترکیب شود.
- -fsanitize=undefined
- فعالسازی UndefinedBehaviorSanitizer، یک آشکارساز سریع رفتار تعریفنشده. محاسبات گوناگون برای تشخیص رفتار تعریفنشده در زمان اجرا ابزارگذاری میشوند. برای جزئیات بیشتر به https://clang.llvm.org/docs/UndefinedBehaviorSanitizer.html مراجعه کنید. رفتار زمان اجرا را میتوان با استفاده از متغیر محیطی UBSAN_OPTIONS تحت تأثیر قرار داد. زیرگزینههای کنونی عبارتند از:
- -fsanitize=shift
- این گزینه بررسی اینکه نتیجه عملیات شیفت تعریفنشده نباشد را فعال میکند. توجه داشته باشید که آنچه دقیقاً تعریفنشده تلقی میشود بین C و ++C و همچنین بین ISO C90 و C99 و غیره اندکی تفاوت دارد. این گزینه دو زیرگزینه دارد: -fsanitize=shift-base و -fsanitize=shift-exponent.
- -fsanitize=shift-exponent
- این گزینه بررسی منفی نبودن آرگومان دوم عملیات شیفت و کوچکتر بودن آن از دقتِ آرگومان اولِ ارتقایافته را فعال میکند.
- -fsanitize=shift-base
- اگر آرگومان دوم یک عملیات شیفت در محدوده مجاز باشد، بررسی میکند که نتیجه عملیات شیفت تعریفنشده نباشد. توجه داشته باشید که آنچه دقیقاً تعریفنشده تلقی میشود بین C و ++C و همچنین بین ISO C90 و C99 و غیره اندکی متفاوت است.
- -fsanitize=integer-divide-by-zero
- تشخیص تقسیم صحیح بر صفر.
- -fsanitize=unreachable
- با این گزینه، کامپایلر فراخوانی "__builtin_unreachable" را در عوض به یک فراخوانی پیام خطایابی تبدیل میکند. هنگام رسیدن به فراخوانی "__builtin_unreachable"، رفتار برنامه تعریفنشده است.
- -fsanitize=vla-bound
- این گزینه به کامپایلر دستور میدهد تا مثبت بودن اندازه یک آرایه با طول متغیر را بررسی کند.
- -fsanitize=null
- این گزینه بررسی اشارهگرها را فعال میکند. بهطور مشخص، برنامهای که با این گزینه فعال ساخته شود، در صورت تلاش برای ارجاعزدایی یک اشارهگر NULL، یا اگر یک ارجاع (احتمالاً یک ارجاع rvalue) به یک اشارهگر NULL مقید شود، یا اگر متدی روی شیئی که توسط یک اشارهگر NULL نشانه رفته فراخوانی شود، یک پیام خطا صادر خواهد کرد.
- -fsanitize=return
- این گزینه بررسی دستور بازگشت (return) را فعال میکند. برنامههایی که با این گزینه فعال ساخته شوند، در صورتی که به پایان یک تابع غیر-void بدون بازگرداندن واقعی یک مقدار برسند، یک پیام خطا صادر خواهند کرد. این گزینه تنها در ++C کار میکند.
- -fsanitize=signed-integer-overflow
- این گزینه
بررسی
سرریز
اعداد صحیح
علامتدار
را فعال
میکند.
بررسی
میشود که
نتیجه
"+"،
"*" و هر
دو عملگر
یگانی و
دودویی
"-" در
محاسبات
علامتدار
دچار سرریز
نشود. این
گزینه
همچنین
تقسیم
علامتدار
"INT_MIN / -1" را
تشخیص
میدهد.
توجه داشته
باشید که
قواعد
ارتقای
اعداد صحیح
را باید در
نظر گرفت؛
یعنی مورد
زیر یک
سرریز
محسوب
نمیشود:
signed char a = SCHAR_MAX; a++;
- -fsanitize=bounds
- این گزینه ابزارگذاری کرانهای آرایه را فعال میکند. دسترسیهای خارج از محدوده گوناگون شناسایی میشوند. اعضای آرایه انعطافپذیر، آرایههای شبیه به عضو آرایه انعطافپذیر و مقداردهندههای اولیهی متغیرها با حافظه ایستا ابزارگذاری نمیشوند؛ به استثنای آرایههای شبیه به عضو آرایه انعطافپذیر که گزینههای "-fstrict-flex-arrays" یا "-fstrict-flex-arrays=" یا صفات "strict_flex_array" مشخص کنند که نباید با آنها مانند آرایههای شبیه به عضو آرایه انعطافپذیر رفتار شود.
- -fsanitize=bounds-strict
- این گزینه ابزارگذاری سختگیرانه کرانهای آرایه را فعال میکند. بیشتر دسترسیهای خارج از محدوده، از جمله آرایههای شبیه به عضو آرایه انعطافپذیر، شناسایی میشوند. مقداردهندههای اولیهی متغیرها با حافظه ایستا ابزارگذاری نمیشوند.
- -fsanitize=alignment
- این گزینه بررسی ترازبندی اشارهگرها را هنگام ارجاعزدایی، یا هنگام مقید شدن یک ارجاع به مقصدی با ترازبندی ناکافی، یا هنگام فراخوانی یک متد یا سازنده روی شیئی با ترازبندی ناکافی فعال میکند.
- -fsanitize=object-size
- این گزینه ابزارگذاری ارجاعات حافظه را با استفاده از تابع "__builtin_dynamic_object_size" فعال میکند. دسترسیهای خارج از محدوده گوناگون توسط اشارهگرها شناسایی میشوند.
- -fsanitize=float-divide-by-zero
- تشخیص تقسیم ممیز شناور بر صفر. برخلاف سایر گزینههای مشابه، -fsanitize=float-divide-by-zero توسط -fsanitize=undefined فعال نمیشود، چرا که تقسیم ممیز شناور بر صفر میتواند روشی معتبر برای دستیابی به مقادیر بینهایت و NaNها باشد.
- -fsanitize=float-cast-overflow
- این گزینه بررسی تبدیل نوع ممیز شناور به عدد صحیح را فعال میکند. بررسی میشود که نتیجه تبدیل دچار سرریز نشود. برخلاف سایر گزینههای مشابه، -fsanitize=float-cast-overflow توسط -fsanitize=undefined فعال نمیشود. این گزینه با فعال بودن استثناهای "FE_INVALID" به خوبی کار نمیکند.
- -fsanitize=nonnull-attribute
- این گزینه ابزارگذاری فراخوانیها را فعال کرده و بررسی میکند که مقادیر تهی به آرگومانهایی که توسط صفت تابعی "nonnull" به عنوان نیازمند مقدار غیرتهی مشخص شدهاند، ارسال نشوند.
- -fsanitize=returns-nonnull-attribute
- این گزینه ابزارگذاری دستورات بازگشت را در توابعی که با صفت تابعی "returns_nonnull" مشخص شدهاند فعال میکند، تا بازگرداندن مقادیر تهی از چنین توابعی را شناسایی کند.
- -fsanitize=bool
- این گزینه ابزارگذاری بارگذاریها از bool را فعال میکند. اگر مقداری غیر از 0 یا 1 بارگذاری شود، یک خطای زمان اجرا صادر میشود..IP -fsanitize=enum 4 این گزینه ابزاردقیق (instrumentation) بارگذاریها از یک نوع enum را فعال میکند. اگر مقداری خارج از محدودهٔ مقادیر نوع enum بارگذاری شود، یک خطای زمان اجرا صادر میشود.
- -fsanitize=vptr
- این گزینه ابزاردقیق فراخوانی توابع عضو C++، دسترسیهای اعضا و برخی تبدیلها میان اشارهگرهای کلاسهای پایه و مشتقشده را فعال میکند تا اطمینان حاصل شود شیء ارجاعشده نوع پویای درستی دارد.
- -fsanitize=pointer-overflow
- این گزینه ابزاردقیق محاسبات اشارهگر را فعال میکند. اگر محاسبات اشارهگر دچار سرریز شود، یک خطای زمان اجرا صادر میشود.
- -fsanitize=builtin
- این گزینه ابزاردقیق آرگومانهای توابع توکار (builtin) منتخب را فعال میکند. اگر مقدار نامعتبری به چنین آرگومانهایی فرستاده شود، یک خطای زمان اجرا صادر میشود؛ برای مثال، فرستادن 0 بهعنوان آرگومان به "__builtin_ctz" یا "__builtin_clz" رفتار تعریفنشده ایجاد میکند و توسط این گزینه شناسایی میشود.
توجه داشته باشید که بهسازها (sanitizers) تمایل دارند نرخ هشدارهای مثبت کاذب را افزایش دهند، بهویژه هشدارهای پیرامون -Wmaybe-uninitialized. ما ترکیب -Werror و [استفاده از] بهسازها را توصیه نمیکنیم.
در حالی که -ftrapv باعث ایجاد تلهها (traps) برای سرریزهای علامتدار میشود، -fsanitize=undefined یک پیام تشخیصی ارائه میدهد. این ویژگی در حال حاضر تنها برای خانوادهٔ زبانهای C کار میکند.
- -fno-sanitize=all
- این گزینه تمام بهسازهای قبلاً فعالشده را غیرفعال میکند. استفاده از -fsanitize=all مجاز نیست، چرا که برخی بهسازها نمیتوانند همزمان استفاده شوند.
- -fasan-shadow-offset=number
- این گزینه GCC را وادار میکند تا در بررسیهای AddressSanitizer از آفست سایهٔ سفارشی استفاده کند. این ویژگی برای آزمایش با چیدمانهای حافظهٔ سایهٔ گوناگون در Kernel AddressSanitizer مفید است.
- -fsanitize-sections=s1,s2,...
- بهسازی متغیرهای سراسری در بخشهای کاربری (sections) منتخب. si میتواند شامل نویسههای عام (wildcards) باشد.
- -fsanitize-recover[=opts]
- گزینهٔ
-fsanitize-recover= حالت
بازیابی از
خطا را برای
بهسازهای
ذکرشده در
فهرست
جداشده با
کامای opts
کنترل
میکند.
فعالسازی
این گزینه
برای یک
مؤلفهٔ
بهساز باعث
میشود که
برنامه
طوری به
اجرای خود
ادامه دهد
که گویی
خطایی رخ
نداده است.
این بدان
معناست که
چندین خطای
زمان اجرا
را میتوان
در یک بار
اجرای
برنامه
گزارش کرد،
و کد خروج
برنامه
ممکن است
حتی در صورت
گزارش
خطاها
نشاندهندهٔ
موفقیت
باشد. از
گزینهٔ
-fno-sanitize-recover=
میتوان
برای تغییر
این رفتار
استفاده
کرد: فقط
نخستین
خطای
شناساییشده
گزارش
میشود و
سپس برنامه
با یک کد
خروج
غیرصفر
پایان
مییابد.
در حال حاضر این ویژگی تنها برای -fsanitize=undefined (و زیرگزینههای آن بهجز -fsanitize=unreachable و -fsanitize=return)، -fsanitize=float-cast-overflow، -fsanitize=float-divide-by-zero، -fsanitize=bounds-strict، -fsanitize=kernel-address و -fsanitize=address کار میکند. برای این بهسازها بازیابی از خطا بهطور پیشفرض فعال است، بهجز -fsanitize=address که این ویژگی برای آن آزمایشی است. -fsanitize-recover=all و -fno-sanitize-recover=all نیز پذیرفته میشوند، اولی بازیابی را برای تمام بهسازهای پشتیبانیکننده فعال، و دومی بازیابی را برای تمام بهسازهای پشتیبانیکننده غیرفعال میکند.
حتی اگر حالت بازیابی در سمت کامپایلر فعال باشد، باید در سمت کتابخانهٔ زمان اجرا نیز فعال شود، در غیر این صورت خرابیها همچنان مهلک هستند. پیشفرض کتابخانهٔ زمان اجرا برای ThreadSanitizer و UndefinedBehaviorSanitizer برابر با "halt_on_error=0" است، در حالی که مقدار پیشفرض برای AddressSanitizer برابر "halt_on_error=1" است. این مقدار را میتوان با تنظیم پرچم "halt_on_error" در متغیر محیطی مربوطه بازنویسی (override) کرد.
نحو دستوری بدون پارامتر صریح opts منسوخ شده است. این معادل مشخص کردن فهرست opts زیر است:
undefined,float-cast-overflow,float-divide-by-zero,bounds-strict
- -fsanitize-address-use-after-scope
- بهسازی متغیرهای محلی را برای شناسایی باگهای استفاده پس از پایان حوزه (use-after-scope) فعال میکند. این گزینه -fstack-reuse را روی none قرار میدهد.
- -fsanitize-trap[=opts]
- گزینهٔ -fsanitize-trap=
به
کامپایلر
دستور
میدهد تا
برای
بهسازهای
ذکرشده در
فهرست
جداشده با
کامای opts،
رفتار
تعریفنشده
را به جای
یک روتین
کتابخانهای
"libubsan"، با
استفاده از
"__builtin_trap"
گزارش کند.
اگر این
گزینه برای
بهساز خاصی
فعال شود،
نسبت به
-fsanitizer-recover= برای
آن بهساز
اولویت
دارد،
"__builtin_trap"
صادر خواهد
شد و صرف
نظر از
اینکه
بازیابی با
استفاده از
-fsanitize-recover= فعال
باشد یا
غیرفعال،
مهلک خواهد
بود.
مزیت این روش آن است که نیازی به کتابخانهٔ "libubsan" نیست و پیوند (link) داده نمیشود، بنابراین حتی در محیطهای مستقل (freestanding) نیز قابل استفاده است.
در حال حاضر این ویژگی با -fsanitize=undefined (و زیرگزینههای آن بهجز -fsanitize=vptr)، -fsanitize=float-cast-overflow، -fsanitize=float-divide-by-zero و -fsanitize=bounds-strict کار میکند. همچنین میتوان "-fsanitize-trap=all" را مشخص کرد که آن را برای زیرگزینههای "undefined"، -fsanitize=float-cast-overflow، -fsanitize=float-divide-by-zero و -fsanitize=bounds-strict فعال میکند. اگر از "-fsanitize-trap=undefined" یا "-fsanitize-trap=all" استفاده شود و "-fsanitize=vptr" در خط فرمان فعال باشد، ابزاردقیق در سکوت نادیده گرفته میشود چرا که همیشه به پشتیبانی "libubsan" نیاز دارد؛ -fsanitize-trap=vptr مجاز نیست.
- -fsanitize-undefined-trap-on-error
- گزینهٔ -fsanitize-undefined-trap-on-error معادل منسوخشدهٔ -fsanitize-trap=all است.
- -fsanitize-coverage=trace-pc
- ابزاردقیق کد را برای آزمون فاز هدایتشده با پوشش (coverage-guided fuzzing) فعال میکند. یک فراخوانی به "__sanitizer_cov_trace_pc" در هر بلوک پایه درج میکند.
- -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)، و
بهطور
مشابه
برنامهنویسی
مبتنی بر
فراخوانی/پرش
(COP/JOP) طراحی
شده است.
کلمات کلیدی -fcf-protection= بهصورت زیر تفسیر میشوند:
مقدار "branch" به کامپایلر دستور میدهد تا بررسی اعتبار انتقال جریان کنترل را در نقطهٔ دستورهای شاخهبندی غیرمستقیم، یعنی دستورهای call/jmp پیادهسازی کند.
مقدار "return" بررسی اعتبار را در نقطهٔ بازگشت از یک تابع پیادهسازی میکند.
مقدار "full" یک نام مستعار برای مشخص کردن همزمان هر دو مقدار "branch" و "return" است.
مقدار "check" برای پیوند نهایی همراه با بهینهسازی زمان پیوند (LTO) به کار میرود. اگر فایلهای شیء LTO با مقادیر متفاوت -fcf-protection کامپایل شده باشند، یک خطا صادر میشود. مقدار "check" در زمان کامپایل نادیده گرفته میشود.
مقدار "none" ابزاردقیق را غیرفعال میکند.
گزینهٔ -fcf-protection نام مستعاری برای -fcf-protection=full است. برای بازنویسی گزینهٔ قبلی -fcf-protection در خط فرمان، ابتدا -fcf-protection=none و سپس -fcf-protection=kind را اضافه کنید.
ماکروی "__CET__" هنگامی که -fcf-protection استفاده شود تعریف میشود. بیت نخست "__CET__" برای مقدار "branch" روی 1 تنظیم میشود و بیت دوم "__CET__" برای "return" روی 1 قرار میگیرد.
همچنین میتوانید از صفت "nocf_check" برای مشخص کردن توابع و فراخوانیهایی که باید از ابزاردقیق مستثنی شوند استفاده کنید.
در حال حاضر هدف x86 GNU/Linux پیادهسازی مبتنی بر Intel Control-flow Enforcement Technology (CET) را ارائه میدهد که برای پردازندههای i686 یا جدیدتر قابل استفاده است..IP -fharden-compares 4 به ازای هر آزمون منطقی که از بهینهسازیهای gimple باقی میماند و شرطی در یک انشعاب شرطی نیست (برای نمونه، شرایطی که برای جابهجاییهای شرطی یا برای ذخیره در متغیرهای بولی بررسی میشوند)، کد اضافی برای محاسبه و تأیید شرط معکوس و فراخوانی "__builtin_trap" در صورت عدم تطابق نتایج، تولید میکند. از این گزینه همراه با -fharden-conditional-branches برای پوشش دادن تمام عبارات شرطی استفاده کنید.
- -fharden-conditional-branches
- به ازای هر انشعاب شرطی غیربرداری که از بهینهسازیهای gimple باقی میماند، کد اضافی برای محاسبه و بررسی شرط معکوس و فراخوانی "__builtin_trap" در صورت غیرمنتظره بودن نتیجه، تولید میکند. از این گزینه همراه با -fharden-compares برای پوشش دادن تمام عبارات شرطی استفاده کنید.
- -fharden-control-flow-redundancy
- کد اضافی
تولید
میکند تا
هنگام ورود
به
بلوکهای
پایهای (basic
blocks)،
متغیرهای
بولی تنظیم
شوند و در
هنگام خروج
از تابع،
چنانچه
متغیرهای
بولی مسیر
اجرایی
سازگاری با
گراف جریان
کنترل
تشکیل
ندهند،
بررسی
انجام شده و
trap فراخوانی
شود.
اعتبارسنجی پیش از بازگشتها، پیش از فراخوانیهای دنبالهای اجباری (در ادامه ببینید) و بهطور اختیاری، پیش از خروج استثناها با -fhardcfr-check-exceptions، پیش از فراخوانیهای بازگرداننده با -fhardcfr-check-returning-calls، و پیش از فراخوانیهای noreturn با -fhardcfr-check-noreturn-calls انجام میشود).
بهینهسازی فراخوانی دنبالهای (tail call) بسیار دیر انجام میشود و نمیتواند بر افزونگی جریان کنترل تأثیر بگذارد، اما برای فراخوانیهایی که توسط فرانتاندهای زبان بهعنوان فراخوانیهای دنبالهای اجباری علامتگذاری شدهاند، و هر فراخوانی که به اندازه کافی زود بهعنوان فراخوانی دنبالهای بالقوه مشخص شده باشد، اعتبارسنجی پیش از فراخوانی صادر خواهد شد؛ هرچند این احتمالات صرفاً نظری هستند، چرا که این شرایط تنها هنگام استفاده از افزایههای سفارشی کامپایلر محقق میشوند.
- -fhardcfr-skip-leaf
- گزینه -fharden-control-flow-redundancy را در توابع برگ (leaf functions) غیرفعال میکند.
- -fhardcfr-check-exceptions
- هنگامی که -fharden-control-flow-redundancy فعال است، مسیر اجرای ثبتشده را در نقاط فرار استثنا در برابر گراف جریان کنترل بررسی میکند؛ درست مانند اینکه بدنه تابع در یک گرداننده پاکسازی (cleanup handler) پیچیده شده باشد که بررسی را انجام داده و استثنا را مجدداً پرتاب (reraise) میکند. این گزینه بهطور پیشفرض فعال است؛ برای غیرفعال کردن آن از -fno-hardcfr-check-exceptions استفاده کنید.
- -fhardcfr-check-returning-calls
- هنگامی که
-fharden-control-flow-redundancy فعال
است، مسیر
اجرای
ثبتشده را
در برابر
گراف جریان
کنترل پیش
از هر
فراخوانی
تابعی که
بلافاصله
بازگشت
نتیجه آن
(در صورت
وجود) را در
پی دارد
بررسی
میکند، تا
مانع
بهینهسازی
فراخوانی
دنبالهای
(tail-call) نشود،
صرفنظر از
اینکه آیا
در نهایت به
فراخوانی
دنبالهای
بهینهسازی
میشود یا
خیر.
این گزینه هر زمان که بهینهسازیهای فراخوانی همزاد (sibling call optimizations) فعال باشند بهطور پیشفرض فعال است (به -foptimize-sibling-calls مراجعه کنید)، اما میتوان آن را فارغ از بهینهسازیها بهطور صریح فعال (یا با استفاده از شکل نفی آن، غیرفعال) کرد.
- -fhardcfr-check-noreturn-calls=[always|no-xthrow|nothrow|never]
- هنگامی که
-fharden-control-flow-redundancy فعال
است، مسیر
اجرای
ثبتشده را
پیش از
فراخوانیهای
"noreturn" در
برابر گراف
جریان
کنترل
بررسی
میکند؛
خواه همه
آنها (always)،
آنهایی که
انتظار
نمیرود
کنترل را از
طریق یک
استثنا به
فراخواننده
بازگردانند
(no-xthrow،
پیشفرض)،
آنهایی که
همچنین
ممکن نیست
کنترل را از
طریق یک
استثنا به
فراخواننده
بازگردانند
(nothrow)، یا
هیچکدام
از آنها (never).
بررسی پیش از یک تابع "noreturn" که ممکن است کنترل را از طریق یک استثنا به فراخواننده بازگرداند، در صورتی که استثنا در فراخواننده (خواه توسط یک گرداننده یا یک پاکسازی) گرفته شود، ممکن است باعث شود بررسی بیش از یک بار انجام گیرد. هنگامی که -fhardcfr-check-exceptions نیز فعال باشد، کامپایلر از مرتبط کردن فراخوانی "noreturn" با گرداننده پاکسازیِ بهطور ضمنی اضافهشده خودداری میکند، چرا که نسبت به بررسی انجامشده پیش از فراخوانی تکراری خواهد بود؛ اما سایر گردانندهها یا پاکسازیها در تابع، در صورت فعال شدن، مسیر اجرای ثبتشده را تغییر داده و با رسیدن به نقطه بازرسی (checkpoint) دیگر، آن را دوباره بررسی میکنند. این نقطه بازرسی حتی ممکن است یک فراخوانی "noreturn" دیگر باشد، بنابراین ممکن است بررسی در نهایت چندین بار انجام شود.
بهینهسازهای گوناگون ممکن است باعث شوند فراخوانیها حتی در صورت نبود ویژگیهای متناظر، بهعنوان "noreturn" و/یا "nothrow" علامتگذاری شوند که میتواند بر جایگذاری بررسیها پیش از فراخوانیها و همچنین افزودن گردانندههای پاکسازی ضمنی برای آنها اثر بگذارد. این غیرقابلپیشبینی بودن، و این واقعیت که پرتاب کردن و پرتاب دوباره استثناها غالباً به منزله فراخوانی ضمنی توابع "noreturn" است، no-xthrow را به تنظیم پیشفرض برای این گزینه تبدیل کرده است: این حالت از رفتار "noreturn" تنها توابع داخلی مورد استفاده برای پرتاب (دوباره) استثناها را که تحت تأثیر این بهینهسازیها قرار نمیگیرند، مستثنی میکند.
- -fhardened
- مجموعهای
از پرچمها
را برای C و C++
فعال
میکند که
امنیت کد
تولیدشده
را بدون
تأثیر بر ABI
آن بهبود
میبخشند.
پرچمهای
دقیق
فعالشده
ممکن است
بین
نگارشهای
اصلی GCC
تغییر
کنند، اما
در حال حاضر
عبارتند از:
-D_FORTIFY_SOURCE=3 -D_GLIBCXX_ASSERTIONS -ftrivial-auto-var-init=zero -fPIE -pie -Wl,-z,relro,-z,now -fstack-protector-strong -fstack-clash-protection -fcf-protection=full (تنها در x86 GNU/Linux)
فهرست گزینههای فعالشده توسط -fhardened را میتوان با استفاده از گزینه --help=hardened به دست آورد.
هنگامی که glibc سیستم قدیمیتر از 2.35 باشد، بهجای آن از -D_FORTIFY_SOURCE=2 استفاده میشود.
این گزینه برای استفاده در ساختهای نهایی (production) در نظر گرفته شده است، نه صرفاً در ساختهای اشکالزدایی.
در حال حاضر، -fhardened تنها بر روی مقصدهای GNU/Linux پشتیبانی میشود.
-fhardened تنها در صورتی یک گزینه خاص را فعال میکند که از پیش در هیچ جای خط فرمان مشخص نشده باشد. برای نمونه، -fhardened -fstack-protector تنها -fstack-protector را فعال خواهد کرد، اما -fstack-protector-strong را فعال نمیکند.
- -fstack-protector
- برای بررسی سرریز بافر (buffer overflow)، مانند حملات خرد کردن پشته (stack smashing)، کد اضافی تولید میکند. این کار با افزودن یک متغیر نگهبان به توابع دارای شیءهای آسیبپذیر انجام میشود. این شامل توابعی است که "alloca" را فراخوانی میکنند، و توابعی با بافرهای بزرگتر یا مساوی ۸ بایت. نگهبانها هنگام ورود به تابع مقداردهی اولیه شده و هنگام خروج تابع بررسی میشوند. اگر بررسی نگهبان با شکست مواجه شود، یک پیام خطا چاپ شده و برنامه پایان مییابد. تنها متغیرهایی که واقعاً روی پشته تخصیص یافته باشند در نظر گرفته میشوند؛ متغیرهای حذفشده با بهینهسازی یا متغیرهای تخصیصیافته در ثباتها به حساب نمیآیند.
- -fstack-protector-all
- مانند -fstack-protector است با این تفاوت که تمام توابع محافظت میشوند.
- -fstack-protector-strong
- مانند -fstack-protector است اما توابع بیشتری را برای محافظت در بر میگیرد --- توابعی که تعاریف آرایه محلی دارند، یا ارجاعاتی به نشانیهای قاب محلی (local frame) دارند. تنها متغیرهایی که واقعاً روی پشته تخصیص یافته باشند در نظر گرفته میشوند؛ متغیرهای حذفشده با بهینهسازی یا متغیرهای تخصیصیافته در ثباتها به حساب نمیآیند.
- -fstack-protector-explicit
- مانند -fstack-protector است اما تنها از توابعی محافظت میکند که ویژگی "stack_protect" را داشته باشند.
- -fstack-check
- کدی تولید
میکند تا
اطمینان
حاصل شود که
از مرز پشته
فراتر
نمیروید.
اگر در
محیطی با
چند رشته
(چندریسمانی)
اجرا
میشوید،
باید این
پرچم را
مشخص کنید،
اما در یک
محیط
تکرشتهای
به ندرت
نیازی به
مشخص کردن
آن دارید،
چرا که اگر
تنها یک
پشته وجود
داشته
باشد،
سرریز پشته
تقریباً در
تمام
سیستمها
بهطور
خودکار
شناسایی
میشود.
توجه داشته باشید که این سوییچ در واقع باعث انجام بررسی نمیشود؛ سیستمعامل یا محیط زمان اجرای زبان باید این کار را انجام دهد. این سوییچ باعث تولید کدی میشود تا مطمئن شود آنها گسترش پشته را میبینند.
علاوه بر این میتوانید یک پارامتر رشتهای مشخص کنید: no به معنای عدم بررسی است، generic به معنای اجبار به استفاده از بررسی به سبک قدیمی است، و specific به معنای استفاده از بهترین روش بررسی بوده و معادل -fstack-check خالی است.
بررسی به سبک قدیمی یک سازوکار عمومی است که به هیچ پشتیبانی ویژه مقصد در کامپایلر نیاز ندارد، اما دارای معایب زیر است:
- 1.
- راهبرد تخصیص تغییریافته برای شیءهای بزرگ: اگر اندازه آنها از یک آستانه ثابت فراتر رود، همواره بهصورت پویا تخصیص مییابند. توجه داشته باشید که این ممکن است معناشناسی برخی کدها را تغییر دهد.
- 2.
- محدودیت ثابت در اندازه قاب ایستا (static frame) توابع: هنگامی که یک تابع خاص از آن فراتر میرود، بررسی پشته قابل اعتماد نیست و هشداری توسط کامپایلر صادر میشود.
- 3.
- ناکارآمدی: هم به دلیل راهبرد تخصیص تغییریافته و هم به دلیل پیادهسازی عمومی، کارایی کد دچار افت میشود.
توجه داشته باشید که بررسی پشته به سبک قدیمی، روش جایگزین (fallback) برای specific نیز هست، در صورتی که هیچ پشتیبانی از مقصد در کامپایلر افزوده نشده باشد.
گزینه -fstack-check= برای نیازهای زبان Ada جهت تشخیص بازگشت بینهایت و سرریزهای پشته طراحی شده است. specific هنگام کامپایل کد Ada انتخابی عالی است. این گزینه عموماً برای محافظت در برابر حملات برخورد پشته (stack-clash) کافی نیست. برای محافظت در برابر آنها باید از -fstack-clash-protection استفاده کنید. تولید کد برای جلوگیری از حملات به سبک تداخل پشته (stack clash). هنگامی که این گزینه فعال باشد، کامپایلر در هر زمان تنها یک صفحه از فضای پشته را تخصیص میدهد و به هر صفحه بلافاصله پس از تخصیص دسترسی پیدا میشود. بدین ترتیب، این گزینه از جهش تخصیصها روی صفحات محافظ پشته ارائهشده توسط سیستمعامل جلوگیری میکند.
بیشتر هدفها بهطور کامل از محافظت در برابر stack clash پشتیبانی نمیکنند. با این حال، در آن هدفها -fstack-clash-protection از تخصیصهای پویای پشته محافظت خواهد کرد. همچنین اگر هدف از -fstack-check=specific پشتیبانی کند، -fstack-clash-protection ممکن است محافظت محدودی برای تخصیصهای ایستای پشته نیز ارائه دهد.
- -fstack-limit-register=reg
- -fstack-limit-symbol=sym
- -fno-stack-limit
- تولید کد
برای
اطمینان از
اینکه
پشته فراتر
از یک مقدار
مشخص رشد
نکند، که
این مقدار
میتواند
مقدار یک
ثبات یا
آدرس یک
نماد باشد.
در صورتی که
به پشته
بزرگتری
نیاز باشد،
یک سیگنال
در زمان
اجرا ارسال
(raise) میشود.
برای بیشتر
هدفها،
این سیگنال
پیش از
اینکه پشته
از مرز
فراتر رود
ارسال
میشود،
بنابراین
امکان
دریافت (catch)
سیگنال
بدون اتخاذ
تدابیر
ویژه وجود
دارد.
برای نمونه، اگر پشته از آدرس مطلق 0x80000000 شروع شده و رو به پایین رشد کند، میتوانید از پرچمهای -fstack-limit-symbol=__stack_limit و -Wl,--defsym,__stack_limit=0x7ffe0000 برای اعمال محدودیت پشته ۱۲۸ کیلوبایتی استفاده کنید. توجه داشته باشید که این ممکن است تنها با پیونددهنده GNU کار کند.
میتوانید بررسی محدودیت پشته را بهصورت محلی با استفاده از مشخصه تابع "no_stack_limit" لغو (override) کنید.
- -fsplit-stack
- تولید کد
برای تقسیم
خودکار
پشته پیش از
سرریز شدن
آن. برنامه
حاصل دارای
یک پشته
ناپیوسته
است که تنها
در صورتی
ممکن است
سرریز شود
که برنامه
قادر به
تخصیص
حافظه
بیشتر
نباشد. این
قابلیت
هنگام
اجرای
برنامههای
چندنخی (threaded)
بیشترین
کاربرد را
دارد، زیرا
دیگر نیازی
به محاسبه
اندازه
مناسب پشته
برای هر نخ
نخواهد بود.
این قابلیت
در حال حاضر
تنها برای
هدفهای x86
که
گنو/لینوکس
را اجرا
میکنند
پیادهسازی
شده است.
هنگامی که کد کامپایلشده با -fsplit-stack کدی را فراخوانی میکند که بدون -fsplit-stack کامپایل شده است، ممکن است فضای پشته چندانی برای اجرای کد دوم در دسترس نباشد. اگر کامپایل کردن تمام کدها، از جمله کد کتابخانهها، با -fsplit-stack مقدور نباشد، پیونددهنده میتواند این فراخوانیها را بهگونهای اصلاح کند که کد کامپایلشده بدون -fsplit-stack همیشه پشته بزرگی در اختیار داشته باشد. پشتیبانی از این قابلیت در پیونددهنده gold در نگارش 2.21 به بعد GNU Binutils پیادهسازی شده است.
- -fstrub=disable
- غیرفعال کردن کامل پاکسازی پشته (stack scrubbing)، با نادیده گرفتن تمام مشخصههای "strub".
- -fstrub=strict
- حالت پیشفرض توابع را به "disabled" برای "strub" تغییر میدهد، و این محدودیت را بهطور سختگیرانه اعمال میکند که تنها توابع مرتبط با حالتهای "strub"-"callable" (شامل "at-calls"، "callable" و "always_inline" "internal") توسط توابعی با حالتهای فعالشده برای "strub" (شامل "at-calls" و "internal") قابل فراخوانی ("callable") باشند.
- -fstrub=relaxed
- بازگرداندن تنظیمات پیشفرض پاکسازی پشته ("strub")، بدین صورت که "strub" تنها بنا بر نیاز مشخصههای "strub" مرتبط با انواع تابع و داده فعال میشود. "Relaxed" بدین معناست که زمینههای strub تنها از فراخوانی توابعی بازداشته میشوند که صراحتاً با حالت "disabled" برای "strub" مرتبط شدهاند. این گزینه تنها برای لغو سایر گزینههای -fstrub=* که در خط فرمان پیش از آن آمدهاند کاربرد دارد.
- -fstrub=at-calls
- فعال کردن حالت "at-calls" برای "strub" در صورت امکانپذیر بودن. کاربرد اصلی این گزینه برای آزمایش است. این گزینه سازوکار "strub" را در سناریوهایی که کاملاً محلی برای یک واحد ترجمه (translation unit) هستند به کار میگیرد. این حالت "strub" واسطهای تابع را تغییر میدهد، بنابراین هر تابعی که برای سایر واحدهای ترجمه قابل مشاهده باشد، یا آدرس آن گرفته شده باشد، تحت تأثیر این گزینه قرار نخواهد گرفت. گزینههای بهینهسازی نیز ممکن است بر امکانپذیری تأثیر بگذارند. برای جزئیات مربوط به نیازمندیهای امکانپذیری و واجد شرایط بودن، مستندات مشخصه "strub" را ببینید.
- -fstrub=internal
- فعال کردن حالت "internal" برای "strub" در صورت امکانپذیر بودن. کاربرد اصلی این گزینه برای آزمایش است. این گزینه با هدف آزمودن دقیق بخشهایی از سازوکار "strub" طراحی شده است که حالت کمبازدهتر اما نگهدارنده واسط "strub" را پیادهسازی میکنند. توابعی که تحت تأثیر این گزینه قرار نگیرند بسیار نادر هستند.
- -fstrub=all
- فعال کردن یکی از حالتهای "strub" در صورت امکانپذیر بودن. هنگامی که هر دو حالت strub امکانپذیر باشند، "at-calls" ترجیح داده میشود. گزینه -fdump-ipa-strubm مشخصههای تابعی را اضافه میکند که نشان میدهند کدام حالت برای هر تابع انتخاب شده است. کاربرد اصلی این گزینه برای آزمایش و سنجش کامل سازوکار "strub" است.
- -fvtable-verify=[std|preinit|none]
- این گزینه
تنها هنگام
کامپایل کد
++C در دسترس
است. این
گزینه
قابلیت
امنیتیای
را روشن (یا
در صورت
استفاده از
-fvtable-verify=none خاموش)
میکند که
در زمان
اجرا، برای
هر
فراخوانی
مجازی،
تأیید
میکند
اشارهگر vtable
که
فراخوانی
از طریق آن
انجام
میشود
برای نوع
شیء معتبر
بوده و
دستکاری یا
بازنویسی
نشده باشد.
اگر
اشارهگر vtable
نامعتبری
در زمان
اجرا
شناسایی
شود، خطایی
گزارش شده و
اجرای
برنامه
بلافاصله
متوقف
میشود.
این گزینه باعث میشود که در زمان راهاندازی برنامه، ساختارهای داده زمان اجرا ساخته شوند که برای اعتبارسنجی اشارهگرهای vtable استفاده میشوند. گزینههای std و preinit زمان ساخته شدن این ساختارهای داده را کنترل میکنند. در هر دو حالت، این ساختارهای داده قبل از رسیدن اجرا به "main" ساخته میشوند. استفاده از -fvtable-verify=std باعث میشود ساختارهای داده پس از بارگذاری و مقداردهی اولیه کتابخانههای اشتراکی ساخته شوند. -fvtable-verify=preinit باعث میشود آنها پیش از بارگذاری و مقداردهی اولیه کتابخانههای اشتراکی ساخته شوند.
اگر این گزینه چندین بار با مقادیر مختلف در خط فرمان مشخص شود، none بیشترین اولویت را نسبت به هر دو مقدار std و preinit دارد؛ preinit نیز بر std اولویت دارد.
- -fvtv-debug
- هنگامی که
همراه با
-fvtable-verify=std یا -fvtable-verify=preinit
استفاده
شود، باعث
فراخوانی
نسخههای
اشکالزدایی
از توابع
زمان اجرا
برای
قابلیت
اعتبارسنجی
vtable میشود.
این پرچم
همچنین
باعث
میشود
کامپایلر
اطلاعات
مربوط به
اشارهگرهای
vtableای را که
برای هر
کلاس پیدا
میکند ثبت
کند. این
اطلاعات در
فایلی به
نام vtv_set_ptr_data.log در
دایرکتوری
تعیینشده
توسط متغیر
محیطی VTV_LOGS_DIR
در صورت
تعریف
بودن، یا در
غیر این
صورت در
دایرکتوری
کاری جاری
نوشته
میشود.
نکته: این ویژگی دادهها را به فایل لاگ الحاق میکند (append). اگر فایلی تازه میخواهید، حتماً هر فایل موجود را از پیش حذف کنید.
- -fvtv-counts
- این یک پرچم
اشکالزدایی
است. هنگامی
که همراه با
-fvtable-verify=std یا -fvtable-verify=preinit
استفاده
شود، باعث
میشود
کامپایلر
تعداد کل
فراخوانیهای
مجازی را که
با آنها
مواجه
میشود و
تعداد
اعتبارسنجیهایی
را که درج
میکند،
پیگیری
نماید.
همچنین
تعداد
فراخوانیهای
توابع خاصی
از
کتابخانه
زمان اجرا
را که درج
میکند
شمارش کرده
و این
اطلاعات را
برای هر
واحد
کامپایل
ثبت میکند.
کامپایلر
این
اطلاعات را
در فایلی به
نام vtv_count_data.log در
دایرکتوری
تعیینشده
توسط متغیر
محیطی VTV_LOGS_DIR
در صورت
تعریف
بودن، یا در
غیر این
صورت در
دایرکتوری
کاری جاری
مینویسد.
همچنین
اندازه
مجموعههای
اشارهگر vtable
را برای هر
کلاس شمارش
کرده و این
اطلاعات را
در vtv_class_set_sizes.log در
همان
دایرکتوری
مینویسد.
نکته: این ویژگی دادهها را به فایلهای لاگ الحاق میکند. برای داشتن فایلهای لاگ تازه، حتماً هر فایل موجود را از پیش حذف کنید.
- -finstrument-functions
- تولید
فراخوانیهای
سنجش کد (instrumentation)
برای ورود
به توابع و
خروج از
آنها.
دقیقاً پس
از ورود به
تابع و
دقیقاً پیش
از خروج از
تابع،
توابع
پروفایلسازی
زیر با آدرس
تابع جاری و
محل
فراخوانی
آن
فراخوانده
میشوند.
(در برخی
پلتفرمها،
"__builtin_return_address"
فراتر از
تابع جاری
کار
نمیکند،
بنابراین
ممکن است
اطلاعات
محل
فراخوانی
در غیر این
صورت برای
توابع
پروفایلسازی
در دسترس
نباشد.)
void __cyg_profile_func_enter (void *this_fn, void *call_site); void __cyg_profile_func_exit (void *this_fn, void *call_site);آرگومان نخست، آدرس آغازین تابع جاری است که میتوان آن را دقیقاً در جدول نمادها جستجو کرد.
این سنجش کد همچنین برای توابعی که بهصورت درونخطی (inline) در سایر توابع بسط یافتهاند نیز انجام میپذیرد. فراخوانیهای پروفایلسازی نشان میدهند که تابع درونخطی بهطور مفهومی در کجا وارد و خارج شده است. این بدان معناست که نسخههای آدرسپذیر از چنین توابعی باید موجود باشند. اگر تمام استفادههای شما از یک تابع بهصورت درونخطی بسط داده شده باشند، این امر ممکن است باعث افزایش بیشتر اندازه کد شود. اگر در کد C خود از "extern inline" استفاده میکنید، باید نسخهای آدرسپذیر از چنین توابعی ارائه شود. (معمولاً در هر حال اینگونه است، اما اگر خوششانس باشید و بهینهساز همواره توابع را درونخطی بسط دهد، ممکن بود بتوانید بدون ارائه نسخههای ایستا کار را پیش ببرید.)
میتوان به یک تابع مشخصه "no_instrument_function" را داد، که در این حالت این سنجش کد برای آن انجام نمیشود. این قابلیت میتواند برای نمونه، برای توابع پروفایلسازی فهرستشده در بالا، روتینهای وقفه با اولویت بالا، و هر تابعی که توابع پروفایلسازی نمیتوانند بهطور ایمن از آن فراخوانی شوند (احتمالاً گردانندههای سیگنال، در صورتی که روتینهای پروفایلسازی خروجی تولید کنند یا حافظه تخصیص دهند) استفاده شود..IP -finstrument-functions-once 4 این گزینه مشابه -finstrument-functions است، با این تفاوت که توابع پروفایلسازی (profiling) برای هر تابع ابزاردقیقشده تنها یکبار فراخوانی میشوند؛ بدین معنا که نخستین تابع پروفایلسازی پس از اولین ورود به تابع ابزاردقیقشده فراخوانی میشود و دومین تابع پروفایلسازی پیش از خروج متناظر با این ورودِ اول صدا زده میشود.
تعریف "once" (یکبار) برای اهداف این گزینه تا حدی مبهم است، زیرا پیادهسازی آن در برابر تداخل دادهها (data races) محافظت نشده است. در نتیجه، این پیادهسازی تنها تضمین میکند که توابع پروفایلسازی حداقل یکبار بهازای هر فرایند و حداکثر یکبار بهازای هر رشته (thread) فراخوانی شوند، اما فراخوانیها همواره جفتشده هستند؛ یعنی اگر یک رشته تابع اول را فراخوانی کند، تابع دوم را نیز فراخوانی خواهد کرد، مگر آنکه هرگز به نقطهٔ خروج از تابع ابزاردقیقشده نرسد.
- -finstrument-functions-exclude-file-list=file,file,...
- فهرست
توابعی را
تعیین
میکند که
از
ابزاردقیقسازی
(instrumentation) مستثنی
میشوند
(توضیحات
مربوط به
-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)،
میتوان از
آن برای
اعمال
هرگونه
ابزاردقیق
دلخواه
(وصلهکردن
/ patch) در زمان
اجرا
استفاده
کرد. مقدار
فضا
بهصورت
غیرمستقیم
از طریق
تعداد NOPها
قابل کنترل
است؛ دستور
NOP
استفادهشده
متناظر با
دستوری است
که توسط
رابط داخلی
پشتیبان (back-end)
کامپایلر GCC
یعنی
"gen_nop"
صادر
میشود. این
رفتار
وابسته به
معماری
مقصد (target-specific)
است و ممکن
است به
گونهٔ
معماری و/یا
سایر
گزینههای
کامپایل
نیز وابسته
باشد.
برای شناسایی در زمان اجرا، نشانیهای آغازین این نواحی—که متناظر با نقطهٔ ورود توابع مربوطه منهای M است—علاوه بر این در بخش "__patchable_function_entries" از باینری حاصل گردآوری میشوند.
توجه داشته باشید که مقدار "__attribute__ ((patchable_function_entry (N,M)))" نسبت به گزینهٔ خط فرمان -fpatchable-function-entry=N,M اولویت دارد. از این ویژگی میتوان برای افزایش اندازهٔ ناحیه یا حذف کامل آن در یک تابع منفرد استفاده کرد. اگر "N=0" باشد، هیچ مکانی برای لایهگذاری (pad location) ثبت نمیشود.
دستورهای NOP در نشانی ورود تابع—و بسته به M، شاید پیش از آن—حتی پیش از پیشدرآمد (prologue) درج میشوند. در PowerPC با ELFv2 ABI، برای تابعی با نقاط ورود دوگانه (dual entry points)، نقطهٔ ورود محلی بهطور پیشفرض همان نشانی ورود تابع است. برای تغییر این مورد به گزینهٔ -msplit-patch-nops مراجعه کنید.
حداکثر مقدار N و M برابر با 65535 است. در PowerPC با ELFv2 ABI، برای تابعی با نقاط ورود دوگانه، مقادیر پشتیبانیشده برای M در صورت عدم استفاده از -msplit-patch-nops برابر با 0، 2، 6 و 14 هستند..SS "گزینههای کنترلکنندهٔ پیشپردازنده (Options Controlling the Preprocessor)" این گزینهها پیشپردازندهٔ C را کنترل میکنند، که پیش از کامپایل واقعی روی هر فایل مبدأ C اجرا میشود.
اگر از گزینهٔ -E استفاده کنید، هیچ کاری بهجز پیشپردازش انجام نمیشود. برخی از این گزینهها تنها در کنار -E معنا دارند، چرا که خروجی پیشپردازنده را برای کامپایل واقعی نامناسب میکنند.
افزون بر گزینههای فهرستشده در اینجا، گزینههای متعددی برای کنترل مسیرهای جستجوی فایلهای include وجود دارند که در Directory Options مستند شدهاند. گزینههای کنترل خطایابی و گزارشهای پیشپردازنده در Warning Options فهرست شدهاند.
- -D name
- --define-macro=name
- --define-macro name
- name را بهعنوان یک ماکرو با مقدار تعریف 1 از پیش تعریف میکند.
- -D name=definition
- --define-macro=name=definition
- --define-macro name=definition
- محتوای definition
نشانهگذاری
(tokenized) شده و
طوری
پردازش
میشود که
گویی در
مرحلهٔ سوم
ترجمه درون
یک
دایرکتیو
#define ظاهر شده
است.
بهویژه،
تعریف با
نویسههای
خطجدیدِ
درونمتنی
بریده
میشود.
اگر پیشپردازنده را از یک شل یا برنامهای شبیه به شل اجرا میکنید، ممکن است لازم باشد از نحو نقلقول (quoting) شل برای محافظت از نویسههایی مانند فاصلهها که در نحو شل معنای خاصی دارند، استفاده کنید.
اگر مایلید یک ماکروی شبیه به تابع (function-like) را در خط فرمان تعریف کنید، فهرست آرگومانهای آن را در پرانتز قبل از علامت مساوی (در صورت وجود) بنویسید. پرانتزها برای اغلب شلها معنادار هستند، بنابراین باید این گزینه را نقلقول کنید. در sh و csh، ساختار -D'name(args...)=definition' کار میکند.
گزینههای -D و -U به ترتیبی که در خط فرمان داده شدهاند پردازش میشوند. تمام گزینههای -imacros file و -include file پس از همهٔ گزینههای -D و -U پردازش میشوند.
- -U name
- --undefine-macro=name
- --undefine-macro name
- هرگونه تعریف قبلی name را، چه توکار باشد چه با گزینهٔ -D ارائه شده باشد، لغو میکند.
- -include file
- --include=file
- --include file
- فایل file را
بهگونهای
پردازش
میکند که
گویی "#include
"file"" در خط
اول فایل
مبدأ اصلی
ظاهر شده
است. با این
حال،
نخستین
دایرکتوری
مورد جستجو
برای file
دایرکتوری
کاری
پیشپردازنده
است
بهجای
دایرکتوری
شامل فایل
مبدأ اصلی.
اگر در آنجا
یافت نشد،
مانند حالت
عادی در
بقیهٔ
زنجیرهٔ
جستجوی
"#include "...""
جستجو
میشود.
اگر چندین گزینهٔ -include داده شود، فایلها به ترتیبی که در خط فرمان ظاهر شدهاند گنجانده خواهند شد.
- -imacros file
- --imacros=file
- --imacros file
- دقیقاً
مانند -include
عمل
میکند، با
این تفاوت
که هرگونه
خروجی حاصل
از پیمایش
file دور
ریخته
میشود.
ماکروهایی
که تعریف
میکند
تعریفشده
باقی
میمانند.
این امر به
شما امکان
میدهد
تمام
ماکروها را
از یک هدر
دریافت
کنید بدون
اینکه
اعلانهای
آن پردازش
شوند.
تمام فایلهای مشخصشده با -imacros قبل از تمام فایلهای مشخصشده با -include پردازش میشوند.
- -undef
- هیچیک از ماکروهای وابسته به سیستم یا مخصوص GCC را از پیش تعریف نمیکند. ماکروهای استانداردِ از پیش تعریفشده، تعریفشده باقی میمانند.
- -pthread
- ماکروهای اضافی مورد نیاز برای استفاده از کتابخانهٔ POSIX threads را تعریف میکند. شما باید از این گزینه بهطور یکنواخت هم برای کامپایل و هم برای پیونددهی (linking) استفاده کنید. این گزینه روی مقصدهای GNU/Linux، اکثر مشتقات دیگر Unix و همچنین مقصدهای x86 Cygwin و MinGW پشتیبانی میشود.
- -M
- --dependencies
- بهجای
خروجی دادن
نتیجهٔ
پیشپردازش،
قاعدهای
مناسب برای
make خروجی
میدهد که
وابستگیهای
فایل مبدأ
اصلی را شرح
میدهد.
پیشپردازنده
یک قاعدهٔ
make شامل نام
فایل شیء (object file)
مربوط به آن
فایل مبدأ،
یک دونقطه،
و نام تمام
فایلهای
گنجاندهشده
(از جمله
فایلهایی
که از
گزینههای
خط فرمان -include
یا -imacros
آمدهاند)
را خروجی
میدهد.
مگر در صورت مشخص شدن صریح (با -MT یا -MQ)، نام فایل شیء شامل نام فایل مبدأ است که پسوند آن با پسوند فایل شیء جایگزین شده و تمام بخشهای دایرکتوری ابتدای آن حذف گردیده است. اگر فایلهای گنجاندهشده زیاد باشند، این قاعده با استفاده از \-newline به چند خط شکسته میشود. این قاعده هیچ دستوری ندارد.
این گزینه خروجی اشکالزدایی پیشپردازنده مانند -dM را متوقف نمیکند. برای جلوگیری از تداخل چنین خروجیهای اشکالزدایی با قواعد وابستگی، باید صراحتاً فایل خروجی وابستگی را با -MF مشخص کنید، یا از یک متغیر محیطی مانند DEPENDENCIES_OUTPUT استفاده نمایید. خروجی اشکالزدایی همچنان طبق روال عادی به جریان خروجی استاندارد فرستاده میشود.
ارائهٔ -M به راهانداز (driver) مستلزم -E بوده و هشدارها را با یک -w ضمنی غیرفعال میکند.
- -MM
- --user-dependencies
- مانند -M
عمل میکند
اما
فایلهای
هدر موجود
در
دایرکتوریهای
هدر سیستم و
نیز
فایلهای
هدری را که
بهطور
مستقیم یا
غیرمستقیم
از چنین
هدری
گنجانده
شدهاند،
ذکر
نمیکند.
این بدان معناست که انتخاب براکتهای زاویهدار یا علامت نقلقول دوتایی در یک دایرکتیو #include بهخودیخود تعیین نمیکند که آیا آن هدر در خروجی وابستگی -MM ظاهر شود یا خیر.
- -MF file
- هنگامی که
همراه با -M
یا -MM
استفاده
شود، فایلی
را برای
نوشتن
وابستگیها
مشخص
میکند. اگر
هیچ سوئیچ
-MF داده
نشود،
پیشپردازنده
قواعد را به
همان جایی
ارسال
میکند که
خروجی
پیشپردازششده
را ارسال
میکرد.
هنگامی که با گزینههای درایور -MD یا -MMD استفاده شود، -MF فایل پیشفرض خروجی وابستگی را بازنویسی میکند.
اگر file برابر با - باشد، وابستگیها در stdout نوشته میشوند.
- -MG
- --print-missing-file-dependencies
- همراه با
گزینهای
مانند -M که
درخواست
ایجاد
وابستگی
میکند، -MG
فرض میکند
فایلهای
هدر
ناموجود،
فایلهای
تولیدشده
(generated) هستند و
بدون ایجاد
خطا آنها
را به فهرست
وابستگیها
اضافه
میکند. نام
فایل
وابستگی
مستقیماً
از
دایرکتیو
"#include"
بدون
پیشوند
کردن هیچ
مسیری
گرفته
میشود. -MG
همچنین
خروجی
پیشپردازششده
را سرکوب
میکند،
زیرا نبود
یک فایل هدر
آن را
بیفایده
میسازد.
این قابلیت در بهروزرسانی خودکار makefileها استفاده میشود.
- -Mno-modules
- تولید وابستگی را برای رابطهای ماژول کامپایلشده غیرفعال میکند.
- -MP
- این گزینه
به CPP دستور
میدهد که
یک هدف
ساختگی (phony target)
برای هر
وابستگی
بهجز فایل
اصلی اضافه
کند، که
باعث
میشود هر
یک به
هیچچیز
وابسته
نباشد. این
قواعد
ساختگی
خطاهایی را
دور
میزنند که
make در صورت
حذف
فایلهای
هدر بدون
بهروزرسانی
متناظر در
Makefile صادر
میکند.
این یک خروجی نمونه است: test.o: test.c test.h test.h:
- -MT target
- هدف (target)
قاعدهای
را که با
تولید
وابستگی
صادر
میشود
تغییر
میدهد.
بهطور
پیشفرض CPP
نام فایل
ورودی اصلی
را
میگیرد،
هرگونه
بخشهای
دایرکتوری
و هر پسوند
فایلی
مانند .c را
حذف
میکند، و
پسوند
معمول
فایلهای
شیء پلتفرم
را اضافه
میکند.
نتیجه،
همان هدف
خواهد بود.
گزینهٔ -MT هدف را دقیقاً روی همان رشتهای که مشخص میکنید تنظیم میکند. اگر چندین هدف میخواهید، میتوانید آنها را بهعنوان یک تکآرگومان به -MT بدهید، یا از چندین گزینهٔ -MT استفاده کنید.
برای مثال، -MT '$(objpfx)foo.o' ممکن است چنین نتیجهای بدهد:
$(objpfx)foo.o: foo.c
- -MQ target
- مشابه -MT،
اما
نویسههایی
را که برای Make
ویژه هستند
نقلقول
میکند.
-MQ '$(objpfx)foo.o' چنین
نتیجهای
میدهد:
$$(objpfx)foo.o: foo.c
هدف پیشفرض بهطور خودکار نقلقول میشود، گویی با -MQ داده شده است.
- -MD
- --write-dependencies
- -MD معادل -M -MF
file است، به
این استثنا
که -E
بهطور
ضمنی اعمال
نمیشود.
راهانداز
(driver) مقدار file
را بر اساس
داده شدن یا
نشدن
گزینهٔ -o
تعیین
میکند. اگر
داده شده
باشد،
راهانداز
از آرگومان
آن اما با
پسوند .d
استفاده
میکند؛ در
غیر این
صورت نام
فایل ورودی
را گرفته،
هرگونه
بخشهای
دایرکتوری
و پسوند آن
را حذف
میکند، و
یک پسوند .d
را اعمال
مینماید.
اگر -MD همراه با -E استفاده شود، هر سوییچ -o به این صورت درک میشود که فایل خروجی وابستگی را مشخص میکند، اما اگر بدون -E استفاده شود، هر -o بهعنوان مشخصکنندهٔ فایل شیء هدف تلقی میگردد.
از آنجا که -E بهطور ضمنی اعمال نمیشود، از -MD میتوان برای تولید یک فایل خروجی وابستگی بهعنوان یک اثر جانبی در فرایند کامپایل استفاده کرد.
- -MMD
- --write-user-dependencies
- مشابه -MD، با این تفاوت که تنها فایلهای سرایند کاربر را ذکر میکند، نه فایلهای سرایند سیستم را.
- -fpreprocessed
- به
پیشپردازنده
اعلام
میکند که
فایل ورودی
قبلاً
پیشپردازش
شده است.
این امر
مواردی چون
گسترش
ماکروها،
تبدیل
سهنویسهایها
(trigraphs)، اتصال
خطوط جدید
با نویسهٔ
گریز، و
پردازش
اکثر
دستورات
پیشپردازنده
را غیرفعال
میکند.
پیشپردازنده
همچنان
توضیحها
(کامنتها)
را تشخیص
داده و حذف
میکند،
بهطوری که
میتوانید
فایلی را که
با -C
پیشپردازش
شده، بدون
مشکل به
کامپایلر
ارسال کنید.
در این
حالت،
پیشپردازندهٔ
یکپارچه
چیزی بیش از
یک
نشانهگذار
(tokenizer) برای
فرانتاندها
نخواهد بود.
اگر فایل ورودی یکی از پسوندهای .i، .ii یا .mi را داشته باشد، -fpreprocessed بهطور ضمنی اعمال میشود. اینها همان پسوندهایی هستند که GCC برای فایلهای پیشپردازششدهٔ ایجاد شده توسط -save-temps به کار میبرد.
- -fdirectives-only
- هنگام
پیشپردازش،
دستورات
پیشپردازنده
را مدیریت
کن، اما
ماکروها را
گسترش نده.
رفتار این گزینه به گزینههای -E و -fpreprocessed بستگی دارد.
همراه با -E، پیشپردازش به مدیریت دستوراتی مانند "#define"، "#ifdef" و "#error" محدود میشود. سایر عملیات پیشپردازنده، مانند گسترش ماکرو و تبدیل سهنویسهایها انجام نمیشوند. علاوه بر این، گزینهٔ -dD بهطور ضمنی فعال میگردد.
همراه با -fpreprocessed، پیشتعریف ماکروهای خط فرمان و بیشتر ماکروهای توکار (builtin) غیرفعال میشود. ماکروهایی مانند "__LINE__" که وابسته به زمینه هستند، بهطور عادی پردازش میشوند. این امر کامپایل فایلهایی را که پیشتر با "-E -fdirectives-only" پیشپردازش شدهاند امکانپذیر میسازد.
با حضور هر دو گزینهٔ -E و -fpreprocessed، قواعد مربوط به -fpreprocessed تقدم دارند. این امر پیشپردازش کامل فایلهایی را که قبلاً با "-E -fdirectives-only" پیشپردازش شدهاند ممکن میکند.
- -fdollars-in-identifiers
- پذیرش $ در شناسهها.
- -fextended-identifiers
- پذیرش نامهای نویسهٔ جهانشمول (universal character names) و نویسههای گسترشیافته در شناسهها. این گزینه بهطور پیشفرض برای C99 (و نسخههای بعدی استاندارد C) و C++ فعال است.
- -fno-canonical-system-headers
- هنگام پیشپردازش، مسیرهای سرایند سیستم را از طریق متعارفسازی (canonicalization) کوتاه نکن.
- -fmax-include-depth=depth
- حداکثر عمق تودرتویی دستورهای #include را تنظیم میکند. پیشفرض 200 است.
- -fsearch-include-path[=kind]
- جستجوی
فایلهای
ورودی در
مسیر #include، و
نه فقط در
دایرکتوری
جاری. این
گزینه
بهویژه
برای
ماژولهای
C++20 مفید است
که در آنها
هر دو
واحدهای
سرایند و
واحدهای
واسط ماژول
باید
مستقیماً
کامپایل
شوند:
g++ -c -std=c++20 -fmodules -fsearch-include-path bits/stdc++.h bits/std.cc
مقدار kind بهطور پیشفرض user است، که مسیر جستجوی #include "..." را بررسی میکند؛ همچنین میتوانید صراحتاً system را برای مسیر جستجوی "#include <...>" مشخص کنید.
- -ftabstop=width
- فاصلهٔ بین توقفهای تب (tab stops) را تنظیم میکند. این کار به پیشپردازنده کمک میکند تا شمارهٔ ستونهای صحیحی را در هشدارها یا خطاها گزارش دهد، حتی اگر تبها در خط ظاهر شوند. اگر مقدار کمتر از 1 یا بزرگتر از 100 باشد، از این گزینه صرفنظر میشود. پیشفرض 8 است.
- -ftrack-macro-expansion[=level]
- مکان
نشانهها (tokens)
را در
امتداد
گسترش
ماکروها
ردیابی
میکند. این
امکان را به
کامپایلر
میدهد تا
در صورت
بروز خطای
کامپایل
درون یک
گسترش
ماکرو،
گزارش
تشخیصی
دربارهٔ
پشتهٔ فعلی
گسترش
ماکرو صادر
کند.
استفاده از
این گزینه
باعث مصرف
حافظهٔ
بیشتر توسط
پیشپردازنده
و کامپایلر
میشود.
پارامتر level
میتواند
برای
انتخاب سطح
دقتِ
ردیابی
مکان
نشانهها
استفاده
شود و در
نتیجه در
صورت نیاز
مصرف حافظه
را کاهش
دهد. مقدار
0 برای level
این گزینه
را غیرفعال
میکند.
مقدار 1
مکان
نشانهها
را در یک
حالت
تقلیلیافته
بهمنظور
حداقل بار
اضافی
حافظه
ردیابی
میکند. در
این حالت
تمام
نشانههای
ناشی از
گسترش
آرگومانِ
یک ماکروی
شبهتابع،
دارای مکان
یکسانی
هستند.
مقدار 2
مکان
نشانهها
را بهطور
کامل
ردیابی
میکند. این
مقدار
بیشترین
مصرف حافظه
را دارد.
هنگامی که
هیچ
آرگومانی
به این
گزینه داده
نشود،
مقدار
پیشفرض
پارامتر 2
است.
توجه داشته باشید که "-ftrack-macro-expansion=2" بهطور پیشفرض فعال است.
- -fmacro-prefix-map=old=new
- هنگام پیشپردازش فایلهای واقع در دایرکتوری old، ماکروهای "__FILE__" و "__BASE_FILE__" را طوری گسترش میدهد که گویی فایلها در دایرکتوری new قرار دارند. از این قابلیت میتوان برای تغییر یک مسیر مطلق به یک مسیر نسبی با استفاده از . برای new بهره برد که میتواند منجر به ساختهای بازتولیدپذیرتری شود که مستقل از مکان هستند. این گزینه همچنین بر "__builtin_FILE()" حین کامپایل اثر میگذارد. همچنین ببینید: -ffile-prefix-map و -fcanon-prefix-map.
- -fexec-charset=charset
- مجموعهنویسهٔ اجرایی مورد استفاده برای ثوابت رشتهای و نویسهای را تنظیم میکند. پیشفرض UTF-8 است. charset میتواند هر کدگذاری پشتیبانیشده توسط روتین کتابخانهای "iconv" سیستم باشد.
- -fwide-exec-charset=charset
- مجموعهنویسهٔ اجرایی عریض مورد استفاده برای ثوابت رشتهای و نویسهای عریض را تعیین میکند. مقدار پیشفرض یکی از UTF-32BE، UTF-32LE، UTF-16BE، یا UTF-16LE است، هرکدام که با عرض "wchar_t" و ترتیب بایتی مهپایان (big-endian) یا کهپایان (little-endian) مورد استفاده برای تولید کد مطابقت داشته باشد. همانند -fexec-charset، charset میتواند هر کدگذاری پشتیبانیشده توسط روتین کتابخانهای "iconv" سیستم باشد؛ با این حال، با کدگذاریهایی که دقیقاً در "wchar_t" جا نمیشوند دچار مشکل خواهید شد.
- -finput-charset=charset
- مجموعهنویسهٔ
ورودی را
تنظیم
میکند که
برای تبدیل
از
مجموعهنویسهٔ
فایل ورودی
به
مجموعهنویسهٔ
مبدأ مورد
استفاده
توسط GCC به
کار میرود.
مقدار
پیشفرض UTF-8
است. charset
میتواند
هر کدگذاری
پشتیبانیشده
توسط روتین
کتابخانهای
"iconv"
سیستم باشد.
اگر مجموعهنویسهٔ ورودی UTF-8 باشد، در صورت فعال بودن -Winvalid-utf8، هشدارهایی دربارهٔ توالیهای بدقوارهٔ واحدهای کد (code unit) صادر میشود. در غیر این صورت، وقتی مجموعهنویسهٔ ورودی با مجموعهنویسهٔ اجرایی مطابقت داشته باشد هیچ گزارش تشخیصی صادر نمیشود. در صورت متفاوت بودن، توالیهای بدقوارهٔ واحدهای کد هنگام تبدیل کدگذاری (transcoding) به مجموعهنویسهٔ اجرایی موجب بروز خطا میشوند..IP -fpch-deps 4 هنگام استفاده از سرآیندهای ازپیشکامپایلشده (precompiled headers)، این پرچم باعث میشود که پرچمهای خروجی وابستگی، فایلهای موجود در وابستگیهای سرآیند ازپیشکامپایلشده را نیز فهرست کنند. در صورت عدم تعیین، تنها خود سرآیند ازپیشکامپایلشده فهرست میشود و نه فایلهایی که برای ساخت آن استفاده شدهاند، چرا که هنگام استفاده از یک سرآیند ازپیشکامپایلشده به آن فایلها رجوع نمیشود.
- -fpch-preprocess
- این گزینه
امکان
استفاده از
سرآیند
ازپیشکامپایلشده
را به همراه
-E فراهم
میکند. این
گزینه یک
"#pragma"
ویژه، به
صورت "#pragma GCC
pch_preprocess
"filename""
را در خروجی
درج میکند
تا مکانی را
که سرآیند
ازپیشکامپایلشده
در آن یافت
شد و نام
فایل آن (filename)
را مشخص
کند. هنگامی
که -fpreprocessed در
حال
استفاده
باشد، GCC این
"#pragma" را
تشخیص داده
و PCH را
بارگذاری
میکند.
این گزینه به صورت پیشفرض غیرفعال است، زیرا خروجی پیشپردازششدهٔ حاصل واقعاً فقط به عنوان ورودی برای GCC مناسب است. این گزینه توسط -save-temps فعال میشود.
شما نباید این "#pragma" را در کد خود بنویسید، اما در صورتی که فایل PCH در مکان دیگری در دسترس باشد، ویرایش نام فایل بیخطر است. نام فایل میتواند مطلق باشد یا نسبت به دایرکتوری جاری GCC مشخص شود.
- -fworking-directory
- تولید نشانگرهای خط (linemarkers) را در خروجی پیشپردازنده فعال میکند تا کامپایلر از دایرکتوری کاری جاری در زمان پیشپردازش مطلع شود. هنگامی که این گزینه فعال باشد، پیشپردازنده پس از نشانگر خط اولیه، یک نشانگر خط دوم همراه با دایرکتوری کاری جاری و به دنبال آن دو اسلش صادر میکند. هنگامی که این دایرکتوری در ورودی پیشپردازششده وجود داشته باشد، GCC از آن به عنوان دایرکتوری کاری جاری در برخی قالبهای اطلاعات اشکالزدایی (debugging) استفاده میکند. این گزینه در صورت فعال بودن اطلاعات اشکالزدایی بهطور ضمنی فعال میشود، اما میتوان با شکل نقیض آن یعنی -fno-working-directory جلوی آن را گرفت. اگر پرچم -P در خط فرمان وجود داشته باشد، این گزینه هیچ تأثیری نخواهد داشت، زیرا در این صورت اساساً هیچ دستورالعمل "#line" صادر نمیشود.
- -C
- --comments
- کامنتها
را دور
نریزید.
تمام
کامنتها
به فایل
خروجی
منتقل
میشوند،
به جز
کامنتهای
درون
دستورالعملهای
پردازششده
که همراه با
خود
دستورالعمل
حذف
میشوند.
هنگام استفاده از -C باید برای اثرات جانبی آماده باشید؛ این گزینه باعث میشود پیشپردازنده با کامنتها به عنوان توکنهای مستقل رفتار کند. برای مثال، قرار گرفتن کامنتها در ابتدای خطی که قرار است یک خط دستورالعمل باشد، باعث تبدیل آن خط به یک خط کد منبع معمولی میشود، زیرا نخستین توکن در آن خط دیگر یک # نخواهد بود.
- -CC
- --comments-in-macros
- کامنتها
را دور
نریزید، از
جمله در طول
بسط ماکرو (macro
expansion). این
گزینه شبیه
به -C است،
با این
تفاوت که
کامنتهای
درون
ماکروها
نیز در جایی
که ماکرو
بسط
مییابد به
فایل خروجی
منتقل
میشوند.
علاوه بر اثرات جانبی گزینهٔ -C، گزینهٔ -CC باعث میشود تمام کامنتهای سبک ++C در داخل ماکرو به کامنتهای سبک C تبدیل شوند. این کار برای جلوگیری از این است که استفادههای بعدی از آن ماکرو به طور ناخواسته بقیه خط منبع را به کامنت تبدیل نکند.
گزینهٔ -CC معمولاً برای پشتیبانی از کامنتهای lint استفاده میشود.
- -P
- --no-line-commands
- از تولید نشانگرهای خط در خروجی پیشپردازنده جلوگیری میکند. این ممکن است هنگام اجرای پیشپردازنده بر روی مواردی که کد C نیستند و قرار است به برنامهای ارسال شوند که ممکن است با نشانگرهای خط دچار سردرگمی شود، مفید باشد.
- -traditional
- --traditional
- -traditional-cpp
- --traditional-cpp
- تلاش
میکند تا
رفتار
پیشپردازندههای
C پیشاز
استاندارد
را به جای
پیشپردازندههای
ISO C
شبیهسازی
کند. برای
جزئیات به
دفترچه
راهنمای GNU CPP
مراجعه
کنید.
توجه داشته باشید که GCC در غیر این صورت تلاشی برای شبیهسازی یک کامپایلر C پیشاز استاندارد نمیکند، و این گزینهها تنها همراه با سوییچ -E یا هنگام فراخوانی صریح CPP پشتیبانی میشوند.
- -trigraphs
- --trigraphs
- از
سهنگارههای
(trigraphs)
استاندارد
ISO C پشتیبانی
میکند.
اینها
توالیهای
سهکاراکتری
هستند که
همگی با ??
شروع
میشوند و
توسط
استاندارد
ISO C برای نشان
دادن
کاراکترهای
منفرد
تعریف
شدهاند.
برای مثال،
??/ بیانگر \
است،
بنابراین
'??/n' یک ثابت
کاراکتری
برای خط
جدید (newline) است.
نُه سهنگاره و جایگزینهای آنها عبارتند از:
Trigraph: ??( ??) ??< ??> ??= ??/ ??' ??! ??- Replacement: [ ] { } # \ ^ | ~بهطور پیشفرض، GCC سهنگارهها را نادیده میگیرد، اما در حالتهای منطبق با استاندارد آنها را تبدیل میکند. گزینههای -std و -ansi را ببینید.
- -remap
- کد ویژهای را برای دور زدن محدودیت سیستمهای فایلی که فقط نامهای فایل بسیار کوتاه را مجاز میدانند (مانند MS-DOS)، فعال میکند.
- -H
- --trace-includes
- علاوه بر دیگر فعالیتهای عادی، نام هر فایل سرآیند استفادهشده را چاپ میکند. هر نام به گونهای دندانهدار میشود که نشان دهد در چه عمقی از پشتهٔ #include قرار دارد. فایلهای سرآیند ازپیشکامپایلشده نیز چاپ میشوند، حتی اگر نامعتبر شناخته شوند؛ یک فایل سرآیند ازپیشکامپایلشده نامعتبر با ...x و یک فایل معتبر با ...! چاپ میشود.
- -dletters
- --dump=letters
- --dump letters
- مشخص میکند که در حین کامپایل، روبرداریهای اشکالزدایی (debugging dumps) طبق آنچه توسط letters مشخص شده، تولید شوند. پرچمهای مستندشده در اینجا مواردی هستند که به پیشپردازنده مربوط میشوند. سایر letters توسط خود کامپایلر تفسیر میشوند، یا برای نسخههای آینده GCC رزرو شدهاند و بنابراین بدون هشدار نادیده گرفته میشوند. اگر letters مشخص کنید که رفتار آنها با یکدیگر تداخل داشته باشد، نتیجه نامشخص خواهد بود.
- -dM
- --dump=M
- به جای
خروجی
عادی،
فهرستی از
دستورالعملهای
#define را برای
تمامی
ماکروهای
تعریفشده
در طول
اجرای
پیشپردازنده،
از جمله
ماکروهای
ازپیشتعریفشده،
تولید
میکند. این
امکان را به
شما میدهد
تا متوجه
شوید چه
چیزهایی در
نسخهٔ
پیشپردازنده
شما از پیش
تعریف
شدهاند. با
فرض اینکه
فایلی به
نام foo.h
ندارید،
دستور
touch foo.h; cpp -dM foo.h
همه ماکروهای ازپیشتعریفشده را نشان میدهد.
اگر از -dM بدون گزینهٔ -E استفاده کنید، -dM به عنوان مترادفی برای -fdump-rtl-mach تفسیر میشود.
- -dD
- --dump=D
- مانند -dM عمل میکند، با این تفاوت که هم دستورالعملهای #define و هم نتیجهٔ پیشپردازش را در خروجی قرار میدهد. هر دو نوع خروجی به فایل خروجی استاندارد ارسال میشوند.
- -dN
- --dump=N
- مانند -dD، اما تنها نام ماکروها را صادر میکند و نه بسط آنها را.
- -dI
- --dump=I
- علاوه بر نتیجه پیشپردازش، دستورات #include را نیز در خروجی قرار میدهد.
- -dU
- --dump=U
- مانند -dD است، به جز اینکه فقط ماکروهایی که بسط داده شدهاند یا وضعیت تعریف بودن آنها در دستورات پیشپردازنده بررسی شده است در خروجی چاپ میشوند؛ چاپ خروجی تا زمان استفاده یا بررسی ماکرو به تعویق میافتد؛ و همچنین دستورات #undef نیز برای ماکروهایی که بررسی شدهاند اما در آن زمان تعریف نشده بودند در خروجی درج میشوند.
- -fdebug-cpp
- این گزینه
فقط برای
اشکالزدایی
GCC کاربرد
دارد.
هنگامی که
از طریق CPP یا
همراه با -E
استفاده
شود،
اطلاعات
اشکالزدایی
مربوط به
نقشههای
مکان (location maps) را
تخلیه
میکند. پیش
از هر نشانک
(token) در خروجی،
اطلاعات
نقشهای که
مکان آن
متعلق به آن
است درج
میگردد.
هنگامی که از طریق GCC و بدون -E استفاده شود، این گزینه هیچ تأثیری ندارد.
- -Wp,option
- میتوانید از -Wp,option برای دور زدن گرداننده کامپایلر (compiler driver) و ارسال مستقیم option به پیشپردازنده استفاده کنید. اگر option شامل ویرگول باشد، در محل ویرگولها به چندین گزینه تفکیک میشود. با این حال، بسیاری از گزینهها پیش از ارسال به پیشپردازنده توسط گرداننده کامپایلر اصلاح، ترجمه یا تفسیر میشوند، و -Wp بهاجبار این مرحله را نادیده میگیرد. رابط کاربری مستقیم پیشپردازنده مستندسازی نشده و ممکن است تغییر کند، بنابراین در صورت امکان باید از استفاده از -Wp خودداری کنید و اجازه دهید خود گرداننده گزینهها را مدیریت نماید.
- -Xpreprocessor option
- گزینه option را
به عنوان
گزینهای
برای
پیشپردازنده
ارسال
میکند.
میتوانید
از این مورد
برای ارائه
گزینههای
پیشپردازنده
مختص سیستم
که GCC آنها
را
نمیشناسد،
استفاده
کنید.
اگر میخواهید گزینهای ارسال کنید که دارای آرگومان است، باید از -Xpreprocessor دوبار استفاده کنید؛ یکبار برای خود گزینه و یکبار برای آرگومان آن.
- -no-integrated-cpp
- --no-integrated-cpp
- پیشپردازش را به عنوان یک مرحله مستقل پیش از کامپایل اجرا میکند. به طور پیشفرض، GCC پیشپردازش را به عنوان بخشی یکپارچه از نشانهگذاری (tokenization) و تجزیه ورودی انجام میدهد. اگر این گزینه مشخص شود، بخش فرانتاند زبان مربوطه (cc1، cc1plus یا cc1obj به ترتیب برای C، C++ و Objective-C) به جای آن دوبار فراخوانی میشود؛ یکبار فقط برای پیشپردازش و یکبار برای کامپایل واقعی ورودیِ پیشپردازششده. این گزینه ممکن است همراه با گزینههای -B یا -wrapper برای تعیین یک پیشپردازنده جایگزین یا اعمال پردازشهای اضافی روی سورس برنامه بین مرحله پیشپردازش عادی و کامپایل مفید باشد.
ارسال گزینهها به اسمبلر (Passing Options to the Assembler)
میتوانید گزینهها را به اسمبلر ارسال کنید.
- -Wa,option
- گزینه option را به عنوان گزینهای برای اسمبلر ارسال میکند. اگر option شامل ویرگول باشد، در محل ویرگولها به چندین گزینه تفکیک میشود.
- -Xassembler option
- --for-assembler=option
- --for-assembler option
- گزینه option را
به عنوان
گزینهای
برای
اسمبلر
ارسال
میکند.
میتوانید
از این مورد
برای ارائه
گزینههای
اسمبلر
مختص سیستم
که GCC آنها
را
نمیشناسد،
استفاده
کنید.
اگر میخواهید گزینهای ارسال کنید که دارای یک آرگومان است، باید از -Xassembler دوبار استفاده کنید؛ یکبار برای گزینه و یکبار برای آرگومان آن..SS "گزینههای پیوند دادن (Options for Linking)" این گزینهها زمانی فعال میشوند که کامپایلر فایلهای شیء را به یک فایل خروجی اجرایی پیوند میدهد. در صورتی که کامپایلر مرحلهٔ پیوند را انجام ندهد، این گزینهها بیاثر خواهند بود.
- object-file-name
- نام فایلی که به پسوند شناختهشدهٔ ویژهای ختم نمیشود، به عنوان نام یک فایل شیء یا کتابخانه در نظر گرفته میشود. (پیونددهنده بر اساس محتویات فایل، فایلهای شیء را از کتابخانهها تشخیص میدهد.) اگر پیوند انجام شود، این فایلهای شیء به عنوان ورودی برای پیونددهنده استفاده میشوند.
- -c
- -S
- -E
- اگر هر یک از این گزینهها استفاده شود، پیونددهنده اجرا نمیشود و نام فایلهای شیء نباید به عنوان آرگومان به کار روند.
- -flink-libatomic
- پیوند دادن libatomic را در صورت پشتیبانی توسط هدف فعال میکند؛ این گزینه به صورت پیشفرض فعال است. شکل نقیض آن -fno-link-libatomic میتواند برای غیرفعال کردن صریح پیوند دادن libatomic استفاده شود.
- -flinker-output=type
- این گزینه
تولید کد
بهینهساز
زمان پیوند
(LTO) را کنترل
میکند. به
طور
پیشفرض
خروجی
پیونددهنده
به صورت
خودکار
توسط
افزونهٔ
پیونددهنده
تعیین
میشود.
برای
اشکالزدایی
کامپایلر و
در شرایطی
که پیوند
افزایشی با
یک فایل شیء
غیر LTO مورد
نیاز باشد،
ممکن است
کنترل دستی
این نوع
خروجی مفید
باشد.
اگر مقدار type برابر با exec باشد، تولید کد یک باینری ایستا تولید میکند. در این حالت هر دو گزینهٔ -fpic و -fpie غیرفعال میشوند.
اگر مقدار type برابر با dyn باشد، تولید کد یک کتابخانهٔ اشتراکی ایجاد میکند. در این حالت -fpic یا -fPIC حفظ میشوند، اما به طور خودکار فعال نمیگردند. این سازوکار امکان ساخت کتابخانههای اشتراکی بدون کد مستقل از موقعیت (position-independent code) را در معماریهایی که این قابلیت در آنها مجاز است (مانند x86) فراهم میکند.
اگر مقدار type برابر با pie باشد، تولید کد یک فایل اجرایی -fpie تولید میکند. این گزینه بهینهسازیهایی مشابه exec به همراه دارد، با این تفاوت که اگر -fpie در زمان کامپایل مشخص شده باشد، غیرفعال نمیشود.
اگر مقدار type برابر با rel باشد، کامپایلر فرض میکند که پیوند افزایشی در حال انجام است. بخشهای حاوی کد میانی برای بهینهسازی زمان پیوند با هم ادغام شده، پیشبهینهسازی میشوند و در فایل شیء حاصل قرار میگیرند. علاوه بر این، اگر -ffat-lto-objects مشخص شده باشد، کد باینری برای پیوندهای غیر LTO آینده نیز تولید میگردد. فایل شیء تولیدشده توسط پیوند افزایشی کوچکتر از یک کتابخانهٔ ایستا خواهد بود که از همان فایلهای شیء ساخته شده باشد. در زمان پیوند، نتیجهٔ پیوند افزایشی با فرض اینکه بیشتر اشیاء موجود در کتابخانه استفاده میشوند، سریعتر از یک کتابخانهٔ ایستا بارگذاری میشود.
در نهایت، مقدار nolto-rel کامپایلر را برای پیوند افزایشی به گونهای پیکربندی میکند که تولید کد اجباری میشود، یک باینری نهایی تولید شده و کد میانی برای بهینهسازیهای آتی زمان پیوند حذف (strip) میشود. هنگامی که چندین فایل شیء با یکدیگر پیوند داده میشوند، کد حاصل نسبت به زمانی که بهینهسازیهای زمان پیوند غیرفعال است بهینهتر خواهد بود (برای مثال inlining بینماژولی صورت میگیرد)، اما بیشتر مزایای بهینهسازی کل برنامه (whole-program optimizations) از دست میرود.
در طول پیوند افزایشی (توسط -r) مقدار پیشفرض افزونهٔ پیونددهنده rel است. برای پیوند افزایشی اشیاء LTO و اشیاء غیر LTO در یک فایل شیء ترکیبی واحد، به GNU Binutils نسخهٔ 2.44 یا جدیدتر نیاز است. اگر هر یک از فایلهای شیء در پیوند افزایشی نتواند برای بهینهسازی زمان پیوند استفاده شود، افزونهٔ پیونددهنده یک هشدار صادر کرده و از nolto-rel استفاده میکند. برای حفظ بهینهسازی کل برنامه، در عوض چنین اشیائی را به یک کتابخانهٔ ایستا پیوند دهید.
- -fuse-ld=bfd
- استفاده از پیونددهندهٔ bfd به جای پیونددهندهٔ پیشفرض.
- -fuse-ld=gold
- استفاده از پیونددهندهٔ gold به جای پیونددهندهٔ پیشفرض.
- -fuse-ld=lld
- استفاده از پیونددهندهٔ lld متعلق به LLVM به جای پیونددهندهٔ پیشفرض.
- -fuse-ld=mold
- استفاده از پیونددهندهٔ Modern Linker (mold) به جای پیونددهندهٔ پیشفرض.
- -fuse-ld=wild
- استفاده از پیونددهندهٔ Wild (wild) به جای پیونددهندهٔ پیشفرض.
- -llibrary
- -l library
- هنگام
پیوند
دادن،
کتابخانهٔ
با نام library را
جستجو
میکند.
(حالت دوم
که
کتابخانه
به صورت یک
آرگومان
جداگانه
آمده، تنها
برای
سازگاری با
POSIX است و
توصیه
نمیشود.)
گزینهٔ -l توسط GCC مستقیماً به پیونددهنده ارسال میشود. برای جزئیات دقیق به مستندات پیونددهندهٔ خود مراجعه کنید. توضیحات کلی زیر در مورد پیونددهندهٔ GNU صدق میکند.
پیونددهنده فهرست استانداردی از دایرکتوریها را برای یافتن کتابخانه جستجو میکند. دایرکتوریهای جستجوشده شامل چندین دایرکتوری استاندارد سیستم به اضافهٔ هر دایرکتوری مشخصشده با -L است.
کتابخانههای ایستا، آرشیوهایی از فایلهای شیء هستند و نامهایی مانند liblibrary.a دارند. برخی از اهداف از کتابخانههای اشتراکی نیز پشتیبانی میکنند که معمولاً نامهایی مانند liblibrary.so دارند. اگر هر دو نوع کتابخانهٔ ایستا و اشتراکی یافت شوند، پیونددهنده اولویت را به پیوند با کتابخانهٔ اشتراکی میدهد مگر اینکه گزینهٔ -static استفاده شده باشد.
محل قرارگیری این گزینه در دستور اهمیت دارد؛ پیونددهنده کتابخانهها و فایلهای شیء را به همان ترتیبی که مشخص شدهاند جستجو و پردازش میکند. بنابراین، دستور foo.o -lz bar.o کتابخانهٔ z را پس از فایل foo.o اما قبل از bar.o جستجو میکند. اگر bar.o به توابعی در z ارجاع دهد، ممکن است آن توابع بارگذاری نشوند.
- -lobjc
- برای پیوند دادن یک برنامهٔ Objective-C یا Objective-C++ به این حالت خاص از گزینهٔ -l نیاز دارید.
- -nostartfiles
- هنگام پیوند دادن، از فایلهای راهاندازی (startup) استاندارد سیستم استفاده نکن. کتابخانههای استاندارد سیستم به طور عادی استفاده میشوند، مگر اینکه از -nostdlib، -nolibc، یا -nodefaultlibs استفاده شود.
- -nodefaultlibs
- هنگام
پیوند
دادن، از
کتابخانههای
استاندارد
سیستم
استفاده
نکن. فقط
کتابخانههایی
که شما مشخص
میکنید به
پیونددهنده
ارسال
میشوند، و
گزینههای
مشخصکنندهٔ
نحوهٔ
پیوند
کتابخانههای
سیستم،
مانند -static-libgcc
یا -shared-libgcc،
نادیده
گرفته
میشوند.
فایلهای
راهاندازی
استاندارد
به طور عادی
استفاده
میشوند،
مگر اینکه
از -nostartfiles
استفاده
شود.
کامپایلر ممکن است فراخوانیهایی برای "memcmp"، "memset"، "memcpy" و "memmove" تولید کند. این نمادها معمولاً توسط مدخلهای موجود در libc برطرف (resolve) میشوند. در صورت تعیین این گزینه، این نقاط ورود باید از طریق سازوکار دیگری تأمین شوند.
- -nolibc
- هنگام پیوند دادن، از کتابخانهٔ C یا کتابخانههای سیستمی که پیوند نزدیکی با آن دارند استفاده نکن. همچنان پیوند با فایلهای راهاندازی، libgcc، یا کتابخانههای پشتیبانی زبانی فراهمشده توسط زنجیره ابزار (toolchain) مانند libgnat، libgfortran یا libstdc++ برقرار خواهد بود، مگر اینکه گزینههایی که مانع از گنجاندن آنها میشوند نیز استفاده شده باشند. این گزینه معمولاً -lc را از خط فرمان پیوند حذف میکند، و همچنین کتابخانههای سیستمی را که به طور معمول با آن همراه هستند و در صورت نبود کتابخانهٔ C بیمعنی میشوند، مانند -lpthread یا -lm در برخی پیکربندیها. این گزینه برای اهداف bare-board در نظر گرفته شده است، یعنی زمانی که عملاً هیچ کتابخانهٔ C در دسترسی نیست.
- -nostdlib
- --no-standard-libraries
- هنگام
پیوند
دادن، از
فایلهای
راهاندازی
یا
کتابخانههای
استاندارد
سیستم
استفاده
نکن. هیچ
فایل
راهاندازی
ارسال
نمیشود و
فقط
کتابخانههای
مشخصشده
توسط شما به
پیونددهنده
تحویل داده
میشوند؛
همچنین
گزینههای
مشخصکنندهٔ
نحوهٔ
پیوند
کتابخانههای
سیستم،
مانند -static-libgcc
یا -shared-libgcc،
نادیده
گرفته
میشوند.
کامپایلر ممکن است فراخوانیهایی برای "memcmp"، "memset"، "memcpy" و "memmove" تولید کند. این نمادها معمولاً توسط مدخلهای موجود در libc برطرف میشوند. در صورت تعیین این گزینه، این نقاط ورود باید از طریق سازوکار دیگری تأمین شوند.
یکی از کتابخانههای استانداردی که توسط -nostdlib و -nodefaultlibs کنار گذاشته میشود، libgcc.a است؛ کتابخانهای از زیرروالهای داخلی که GCC برای برطرف کردن کاستیهای ماشینهای خاص یا نیازهای ویژهٔ برخی زبانها از آن استفاده میکند.
در بیشتر موارد، حتی زمانی که میخواهید از سایر کتابخانههای استاندارد اجتناب کنید، به libgcc.a نیاز خواهید داشت. به عبارت دیگر، هنگامی که -nostdlib یا -nodefaultlibs را مشخص میکنید، معمولاً باید -lgcc را نیز تعیین کنید. این کار تضمین میکند که هیچ ارجاع حلنشدهای به زیرروالهای کتابخانهٔ داخلی GCC باقی نمیماند. (یک نمونه از این زیرروالهای داخلی "__main" است که برای اطمینان از فراخوانی سازندههای ++C استفاده میشود.).IP -nostdlib++ 4 بهصورت ضمنی با کتابخانههای استاندارد C++ پیوند برقرار نشود.
- -e entry
- --entry=entry
- --entry entry
- مشخص میکند که نقطهٔ ورود برنامه entry است. این آرگومان توسط پیونددهنده تفسیر میشود؛ پیونددهندهٔ GNU نام یک نماد یا یک نشانی را میپذیرد.
- -pie
- --pie
- در مقصدهایی که پشتیبانی میکنند، یک فایل اجرایی مستقل از موقعیت بهصورت پویا پیوندخورده تولید میکند. برای دستیابی به نتایج قابل پیشبینی، هنگام مشخص کردن این گزینهٔ پیونددهنده باید همان مجموعه گزینههای استفاده شده در زمان کامپایل (-fpie، -fPIE، یا زیرگزینههای مربوط به مدل) را نیز مشخص کنید.
- -no-pie
- فایل اجرایی مستقل از موقعیت بهصورت پویا پیوندخورده تولید نکن.
- -static-pie
- --static-pie
- در مقصدهایی که پشتیبانی میکنند، یک فایل اجرایی مستقل از موقعیت ایستا تولید میکند. یک فایل اجرایی مستقل از موقعیت ایستا شبیه به فایل اجرایی ایستا است، اما میتواند بدون نیاز به پیونددهندهٔ پویا در هر نشانیای بارگذاری شود. برای دستیابی به نتایج قابل پیشبینی، هنگام مشخص کردن این گزینهٔ پیونددهنده باید همان مجموعه گزینههای استفاده شده در زمان کامپایل (-fpie، -fPIE، یا زیرگزینههای مربوط به مدل) را نیز مشخص کنید.
- -pthread
- با کتابخانهٔ ریسههای POSIX پیوند برقرار میکند. این گزینه در مقصدهای GNU/Linux، بیشتر مشتقات یونیکس و همچنین مقصدهای x86 Cygwin و MinGW پشتیبانی میشود. در برخی مقصدها این گزینه پرچمهایی را نیز برای پیشپردازنده تنظیم میکند، بنابراین باید بهطور پیوسته هم برای کامپایل و هم برای پیونددهی استفاده شود.
- -r
- یک شیء جابهجاشدنی را بهعنوان خروجی تولید میکند. این عمل با نام پیونددهی جزئی نیز شناخته میشود.
- -rdynamic
- پرچم -export-dynamic را به پیونددهندهٔ ELF در مقصدهایی که از آن پشتیبانی میکنند، ارسال میکند. این کار به پیونددهنده دستور میدهد که همهٔ نمادها را، نه فقط نمادهای استفادهشده، به جدول نمادهای پویا اضافه کند. این گزینه برای برخی از موارد استفاده از "dlopen" یا برای امکان دریافت ردیابی پشته (backtrace) از درون برنامه مورد نیاز است.
- -s
- تمام جدول نمادها و اطلاعات جابهجایی را از فایل اجرایی حذف میکند.
- -static
- --static
- در سامانههایی که از پیوند پویا پشتیبانی میکنند، این گزینه اثر -pie را لغو کرده و از پیوند با کتابخانههای مشترک جلوگیری میکند. در سایر سامانهها، این گزینه هیچ اثری ندارد.
- یک شیء مشترک (shared object) تولید میکند که میتواند با سایر اشیاء پیوند خورده و یک فایل اجرایی را تشکیل دهد. همهٔ سامانهها از این گزینه پشتیبانی نمیکنند. برای نتایج قابل پیشبینی، هنگام مشخص کردن این گزینهٔ پیونددهنده باید همان مجموعه گزینههای استفاده شده در زمان کامپایل (-fpic، -fPIC، یا زیرگزینههای مدل) را نیز مشخص کنید.[1]
- -static-libgcc
- در
سامانههایی
که libgcc را
بهصورت یک
کتابخانهٔ
مشترک
ارائه
میدهند،
این
گزینهها
به ترتیب
استفاده از
نسخهٔ
مشترک یا
ایستا را
اجبار
میکنند.
اگر هنگام
پیکربندی
کامپایلر
هیچ نسخهٔ
مشترکی از
libgcc ساخته
نشده باشد،
این
گزینهها
هیچ اثری
ندارند.
موقعیتهای گوناگونی وجود دارد که در آنها یک برنامهٔ کاربردی باید بهجای نسخهٔ ایستا، از نسخهٔ مشترک libgcc استفاده کند. رایجترین آنها زمانی است که برنامه قصد پرتاب (throw) و گرفتن (catch) استثناها را در میان کتابخانههای مشترک مختلف دارد. در این حالت، هر یک از کتابخانهها و همچنین خود برنامه باید از libgcc مشترک استفاده کنند.
بنابراین، راهانداز G++ هر زمان که یک کتابخانهٔ مشترک یا یک فایل اجرایی اصلی بسازید، بهطور خودکار -shared-libgcc را اضافه میکند، زیرا برنامههای C++ معمولاً از استثناها استفاده میکنند و این تصمیم درستی است.
اگر در عوض، از راهانداز GCC برای ساخت کتابخانههای مشترک استفاده کنید، ممکن است متوجه شوید که آنها همیشه با libgcc مشترک پیوند داده نمیشوند. اگر GCC در زمان پیکربندی خود تشخیص دهد که شما پیونددهندهٔ غیر گنو دارید یا پیونددهندهٔ گنویی دارید که از گزینهٔ --eh-frame-hdr پشتیبانی نمیکند، بهطور پیشفرض نسخهٔ مشترک libgcc را درون کتابخانههای مشترک پیوند میدهد. در غیر این صورت، از امکانات پیونددهنده بهره گرفته و پیوند با نسخهٔ مشترک libgcc را حذف و بهینهسازی میکند، و بهطور پیشفرض با نسخهٔ ایستای libgcc پیوند برقرار میکند. این امر اجازه میدهد تا استثناها بدون تحمیل هزینههای جابهجایی در هنگام بارگذاری کتابخانه، در میان چنین کتابخانههای مشترکی انتشار یابند.
با این حال، اگر قرار است یک کتابخانه یا فایل اجرایی اصلی استثنایی را پرتاب کند یا بگیرد، باید آن را با استفاده از راهانداز G++، یا با استفاده از گزینهٔ -shared-libgcc پیوند دهید، تا با libgcc مشترک پیوند یابد.
- -static-libasan
- هنگامی که گزینهٔ -fsanitize=address برای پیوند یک برنامه استفاده میشود، راهانداز GCC بهطور خودکار با libasan پیوند برقرار میکند. اگر libasan بهصورت کتابخانهٔ مشترک در دسترس باشد و گزینهٔ -static استفاده نشده باشد، پیوند با نسخهٔ مشترک libasan انجام میشود. گزینهٔ -static-libasan راهانداز GCC را هدایت میکند تا libasan را بهصورت ایستا پیوند دهد، بدون آنکه لزوماً سایر کتابخانهها بهصورت ایستا پیوند داده شوند.
- -static-libhwasan
- هنگامی که گزینهٔ -fsanitize=hwaddress برای پیوند یک برنامه استفاده میشود، راهانداز GCC بهطور خودکار با libhwasan پیوند برقرار میکند. اگر libhwasan بهصورت کتابخانهٔ مشترک در دسترس باشد و گزینهٔ -static استفاده نشده باشد، پیوند با نسخهٔ مشترک libhwasan انجام میشود. گزینهٔ -static-libhwasan راهانداز GCC را هدایت میکند تا libhwasan را بهصورت ایستا پیوند دهد، بدون آنکه لزوماً سایر کتابخانهها بهصورت ایستا پیوند داده شوند.
- -static-liblsan
- هنگامی که گزینهٔ -fsanitize=leak برای پیوند یک برنامه استفاده میشود، راهانداز GCC بهطور خودکار با liblsan پیوند برقرار میکند. اگر liblsan بهصورت کتابخانهٔ مشترک در دسترس باشد و گزینهٔ -static استفاده نشده باشد، پیوند با نسخهٔ مشترک liblsan انجام میشود. گزینهٔ -static-liblsan راهانداز GCC را هدایت میکند تا liblsan را بهصورت ایستا پیوند دهد، بدون آنکه لزوماً سایر کتابخانهها بهصورت ایستا پیوند داده شوند.
- -static-libtsan
- هنگامی که گزینهٔ -fsanitize=thread برای پیوند یک برنامه استفاده میشود، راهانداز GCC بهطور خودکار با libtsan پیوند برقرار میکند. اگر libtsan بهصورت کتابخانهٔ مشترک در دسترس باشد و گزینهٔ -static استفاده نشده باشد، پیوند با نسخهٔ مشترک libtsan انجام میشود. گزینهٔ -static-libtsan راهانداز GCC را هدایت میکند تا libtsan را بهصورت ایستا پیوند دهد، بدون آنکه لزوماً سایر کتابخانهها بهصورت ایستا پیوند داده شوند.
- -static-libubsan
- هنگامی که گزینهٔ -fsanitize=undefined برای پیوند یک برنامه استفاده میشود، راهانداز GCC بهطور خودکار با libubsan پیوند برقرار میکند. اگر libubsan بهصورت کتابخانهٔ مشترک در دسترس باشد و گزینهٔ -static استفاده نشده باشد، پیوند با نسخهٔ مشترک libubsan انجام میشود. گزینهٔ -static-libubsan راهانداز GCC را هدایت میکند تا libubsan را بهصورت ایستا پیوند دهد، بدون آنکه لزوماً سایر کتابخانهها بهصورت ایستا پیوند داده شوند.
- -static-libstdc++
- هنگامی که برنامهٔ g++ برای پیوند یک برنامهٔ C++ استفاده میشود، معمولاً بهطور خودکار با libstdc++ پیوند برقرار میکند. اگر libstdc++ بهعنوان یک کتابخانهٔ مشترک در دسترس باشد و از گزینهٔ -static استفاده نشود، پیوند با نسخهٔ مشترک libstdc++ انجام میشود. این حالت معمولاً مناسب است. با این حال، گاهی اوقات مفید است که نسخهٔ libstdc++ استفادهشده توسط برنامه را بدون نیاز به یک پیوند کاملاً ایستا تثبیت کنید. گزینهٔ -static-libstdc++ راهانداز g++ را هدایت میکند تا libstdc++ را بهصورت ایستا پیوند دهد، بدون آنکه لزوماً سایر کتابخانهها بهصورت ایستا پیوند داده شوند.
- -symbolic
- --symbolic
- هنگام ساخت یک شیء مشترک، ارجاعات به نمادهای سراسری را متصل میکند. دربارهٔ هرگونه ارجاع حلنشده هشدار میدهد (مگر اینکه توسط گزینهٔ ویرایشگر پیوند -Xlinker -z -Xlinker defs لغو شده باشد). تنها سامانههای معدودی از این گزینه پشتیبانی میکنند..IP "-T script" 4 از 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
- --for-linker=option
- --for-linker option
- گزینهٔ option را بهعنوان گزینهای به پیونددهنده ارسال میکند. اگر option شامل ویرگول باشد، بر اساس ویرگولها به چندین گزینه تقسیم میشود. میتوانید از این نحو برای ارسال یک آرگومان به گزینه استفاده کنید. برای مثال، -Wl,-Map,output.map گزینهٔ -Map output.map را به پیونددهنده ارسال میکند. هنگام استفاده از پیونددهندهٔ GNU، میتوانید با -Wl,-Map=output.map نیز به همین نتیجه دست یابید.
- -u symbol
- --force-link=symbol
- --force-link symbol
- وانمود میکند که نماد symbol تعریفنشده است، تا پیونددهی ماژولهای کتابخانهای را برای تعریف آن اجبار کند. میتوانید از -u چندین بار با نمادهای مختلف برای اجبار به بارگذاری ماژولهای کتابخانهای اضافی استفاده کنید.
- -Tbss=addr
- -Tdata=addr
- -Ttext=addr
- -N
- -n
- -t
- -Z
- -z keyword
- این گزینهها بدون تفسیر توسط GCC، مستقیماً به پیونددهنده فرستاده میشوند. برای اطلاع از معانی این گزینهها به مستندات پیونددهندهٔ خود مراجعه کنید.
گزینههای جستجوی دایرکتوری (Options for Directory Search)
این گزینهها دایرکتوریهایی را برای جستجوی فایلهای سرآیند (header files)، کتابخانهها و بخشهایی از کامپایلر مشخص میکنند:
- -I dir
- -iquote dir
- -isystem dir
- -idirafter dir
- --include-directory-after=dir
- --include-directory-after dir
- --include-directory=dir
- --include-directory dir
- دایرکتوری
dir را به
فهرست
دایرکتوریهایی
که در طول
پیشپردازش
برای
فایلهای
سرآیند
جستجو
میشوند،
اضافه
میکند.
گزینهٔ
--include-directory یک نام
مستعار
برای -I
است، در
حالی که
--include-directory-after یک نام
مستعار
برای -idirafter
میباشد.
اگر dir با =
یا $SYSROOT
شروع شود،
علامت = یا
$SYSROOT با
پیشوند sysroot
جایگزین
میشود؛
گزینههای
--sysroot و -isysroot را
ببینید.
دایرکتوریهای مشخصشده با -iquote تنها برای شکل نقلقولی دستورالعمل، یعنی "#include "file"" اعمال میشوند. دایرکتوریهای مشخصشده با -I، -isystem یا -idirafter برای جستجوی هر دو دستورالعمل "#include "file"" و "#include <file>" اعمال میگردند.
میتوانید هر تعداد یا ترکیبی از این گزینهها را در خط فرمان برای جستجوی فایلهای سرآیند در چندین دایرکتوری مشخص کنید. ترتیب جستجو به صورت زیر است:
- 1.
- برای شکل نقلقولی دستورالعمل include، ابتدا دایرکتوری فایل فعلی جستجو میشود.
- 2.
- برای شکل نقلقولی دستورالعمل include، دایرکتوریهای مشخصشده با گزینههای -iquote به ترتیبی که در خط فرمان ظاهر شدهاند، از چپ به راست جستجو میشوند.
- 3.
- دایرکتوریهای مشخصشده با گزینههای -I از چپ به راست پویش میشوند.
- 4.
- دایرکتوریهای مشخصشده با گزینههای -isystem از چپ به راست پویش میشوند.
- 5.
- دایرکتوریهای استاندارد سیستم پویش میشوند.
- 6.
- دایرکتوریهای مشخصشده با گزینههای -idirafter از چپ به راست پویش میشوند.
میتوانید از -I برای بازنویسی (override) یک فایل سرآیند سیستم و جایگزینی نسخهٔ خود استفاده کنید، زیرا این دایرکتوریها پیش از دایرکتوریهای استاندارد فایلهای سرآیند سیستم جستجو میشوند. با این حال، نباید از این گزینه برای افزودن دایرکتوریهایی استفاده کنید که شامل فایلهای سرآیند سیستم ارائهشده توسط توزیعکننده هستند؛ برای این منظور از -isystem استفاده نمایید.
گزینههای -isystem و -idirafter همچنین دایرکتوری را بهعنوان یک دایرکتوری سیستم علامتگذاری میکنند، تا همان رفتار ویژهای که برای دایرکتوریهای استاندارد سیستم اعمال میشود برای آن نیز لحاظ گردد.
اگر یک دایرکتوری include استاندارد سیستم، یا یک دایرکتوری مشخصشده با -isystem، همزمان با -I نیز مشخص شده باشد، گزینهٔ -I نادیده گرفته میشود. دایرکتوری همچنان جستجو میشود اما بهعنوان یک دایرکتوری سیستم در جایگاه عادی خود در زنجیرهٔ include سیستم. این عمل برای اطمینان از این است که فرایند GCC برای رفع عیب سرآیندهای معیوب سیستم و ترتیب دستورالعمل "#include_next" بهطور ناخواسته تغییر نکند. اگر واقعاً نیاز به تغییر ترتیب جستجوی دایرکتوریهای سیستم دارید، از گزینههای -nostdinc و/یا -isystem استفاده کنید.
- -I-
- --include-barrier
- مسیر include را
تفکیک
میکند. این
گزینه
منسوخ شده
است. لطفاً
بهجای آن
برای
دایرکتوریهای
-I پیش از -I-
از -iquote
استفاده
کرده و
گزینهٔ -I-
را حذف
کنید.
هر دایرکتوری مشخصشده با گزینههای -I قبل از -I-، تنها برای سرآیندهای درخواستشده با "#include "file"" جستجو میشود؛ آنها برای "#include <file>" جستجو نمیشوند. اگر دایرکتوریهای بیشتری با گزینههای -I پس از -I- مشخص شوند، آن دایرکتوریها برای تمامی دستورالعملهای #include جستجو خواهند شد.
علاوه بر این، -I- مانع استفاده از دایرکتوری فایل فعلی بهعنوان اولین دایرکتوری جستجو برای "#include "file"" میشود. هیچ راهی برای باطل کردن این اثر -I- وجود ندارد.
- -iprefix prefix
- --include-prefix=prefix
- --include-prefix prefix
- مقدار prefix را به عنوان پیشوند برای گزینههای بعدی -iwithprefix مشخص میکند. اگر پیشوند نمایانگر یک دایرکتوری باشد، باید / انتهایی را نیز لحاظ کنید.
- -iwithprefix dir
- -iwithprefixbefore dir
- --include-with-prefix=prefix
- --include-with-prefix prefix
- --include-with-prefix-after=prefix
- --include-with-prefix-after prefix
- --include-with-prefix-before=prefix
- --include-with-prefix-before prefix
- دایرکتوری
dir را به
پیشوندی که
قبلاً با -iprefix
مشخص شده
اضافه
میکند و
دایرکتوری
حاصل را به
مسیر
جستجوی include
میافزاید.
گزینهٔ -iwithprefixbefore
آن را در
همان
جایگاهی
قرار
میدهد که
-I قرار
میداد؛ در
حالی که -iwithprefix
آن را در
جایگاه -idirafter
میگذارد.
گزینههای --include-with-prefix و --include-with-prefix-after هر دو نامهای مستعار برای -iwithprefix هستند، در حالی که --include-with-prefix-before نام مستعاری برای -iwithprefixbefore است.
- -isysroot dir
- این گزینه شبیه گزینهٔ --sysroot است، اما تنها برای فایلهای سرآیند اعمال میشود (بهجز در هدفهای Darwin، که در آن هم برای فایلهای سرآیند و هم برای کتابخانهها اعمال میشود). برای اطلاعات بیشتر گزینهٔ --sysroot را ببینید.
- -imultilib dir
- از dir به عنوان یک زیردایرکتوری از دایرکتوریِ حاوی سرآیندهای ++C مختص هدف استفاده میکند.
- -imultiarch dir
- از dir به عنوان یک زیردایرکتوری از دایرکتوریِ حاوی سرآیندهای ++C مختص معماری استفاده میکند.
- -nostdinc
- --no-standard-includes
- دایرکتوریهای استاندارد سیستم را برای فایلهای سرآیند جستجو نمیکند. تنها دایرکتوریهایی که صراحتاً با گزینههای -I، -iquote، -isystem و/یا -idirafter مشخص شدهاند (و در صورت مناسب بودن، دایرکتوریِ فایل جاری) جستجو میشوند.
- -nostdinc++
- فایلهای سرآیند را در دایرکتوریهای استاندارد مختص ++C جستجو نمیکند، اما سایر دایرکتوریهای استاندارد را همچنان جستجو میکند. (این گزینه هنگام ساخت کتابخانهٔ ++C استفاده میشود.)
- --embed-dir=dir
- --embed-directory=dir
- --embed-directory dir
- دایرکتوری
dir را به
فهرست
دایرکتوریهای
جستجو برای
دستور
پیشپردازندهٔ
"#embed" یا
ماکروی
"__has_embed"
میافزاید.
هیچ
دایرکتوری
پیشفرضی
برای
"#embed"
وجود ندارد.
اگر dir با = یا $SYSROOT آغاز شود، آنگاه = یا $SYSROOT با پیشوند sysroot جایگزین میشود؛ گزینههای --sysroot و -isysroot را ببینید.
- -iplugindir=dir
- دایرکتوری مورد نظر برای جستجوی افزونههایی (plugins) که به جای -fplugin=path/name.so با -fplugin=name مشخص میشوند را تعیین میکند. این گزینه برای استفادهٔ مستقیم کاربر در نظر گرفته نشده است، بلکه فقط توسط گرداننده (driver) ارسال میشود.
- -Ldir
- --library-directory=dir
- --library-directory dir
- دایرکتوری dir را به فهرست دایرکتوریهایی که برای -l جستجو میشوند اضافه میکند.
- -Bprefix
- --prefix=prefix
- --prefix prefix
- این گزینه
مشخص
میکند
فایلهای
اجرایی،
کتابخانهها،
فایلهای include
و فایلهای
دادهایِ
خود
کامپایلر
در کجا پیدا
شوند.
برنامهٔ گردانندهٔ کامپایلر یک یا چند زیربرنامه از قبیل cpp، cc1، as و ld را اجرا میکند. این برنامه prefix را به عنوان پیشوند برای هر برنامهای که سعی در اجرای آن دارد، هم همراه با machine/version/ و هم بدون آن برای ماشین هدف و نسخهٔ کامپایلر مربوطه، امتحان میکند.
برای هر زیربرنامهای که قرار است اجرا شود، گردانندهٔ کامپایلر ابتدا پیشوند -B (در صورت وجود) را امتحان میکند. اگر آن نام پیدا نشود، یا اگر -B مشخص نشده باشد، گرداننده دو پیشوند استاندارد /usr/lib/gcc/ و /usr/local/lib/gcc/ را امتحان میکند. اگر هیچیک از آنها به نام فایلی پیدا شده منتهی نشود، نام دستنخوردهٔ برنامه با استفاده از دایرکتوریهای مشخصشده در متغیر محیطی PATH شما جستجو میشود.
کامپایلر بررسی میکند که آیا مسیر ارائهشده توسط -B به یک دایرکتوری اشاره دارد یا خیر، و در صورت لزوم یک نویسهٔ جداکنندهٔ دایرکتوری را به انتهای مسیر اضافه میکند.
پیشوندهای -B که عملاً نام دایرکتوریها را مشخص میکنند، برای کتابخانهها در پیونددهنده نیز اعمال میشوند، زیرا کامپایلر این گزینهها را به گزینههای -L برای پیونددهنده ترجمه میکند. آنها همچنین برای فایلهای include در پیشپردازنده نیز اعمال میشوند، زیرا کامپایلر این گزینهها را به گزینههای -isystem برای پیشپردازنده ترجمه میکند. در این حالت، کامپایلر عبارت include را به پیشوند پیوست میکند.
فایل پشتیبانی زمان اجرای libgcc.a نیز در صورت نیاز میتواند با استفاده از پیشوند -B جستجو شود. اگر در آنجا یافت نشد، دو پیشوند استاندارد فوق امتحان میشوند، و تمام. اگر این فایل با این روشها یافت نشود، از فرایند پیوند کنار گذاشته میشود.
راه دیگر برای مشخص کردن پیشوندی بسیار شبیه به پیشوند -B، استفاده از متغیر محیطی GCC_EXEC_PREFIX است.
به عنوان یک راهکار موقتِ ویژه (kludge)، اگر مسیر ارائهشده توسط -B به صورت [dir/]stageN/ باشد که در آن N عددی در محدودهٔ 0 تا 9 است، با [dir/]include جایگزین میشود. این کار برای کمک به خودراهاندازی (boot-strapping) کامپایلر است.
- -no-canonical-prefixes
- --no-canonical-prefixes
- پیوندهای نمادین را بسط نمیدهد، ارجاعات به /../ یا /./ را حلوفصل نمیکند، و هنگام تولید یک پیشوند نسبی مسیر را مطلق نمیسازد.
- --sysroot=dir
- --sysroot dir
- از dir به
عنوان
دایرکتوری
ریشهٔ
منطقی برای
سرآیندها و
کتابخانهها
استفاده
میکند.
برای مثال،
اگر
کامپایلر
در حالت
عادی برای
سرآیندها
در /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
- این گزینه
استفادهٔ
مجدد از
فضای پشته
را برای
متغیرهای
محلی/خودکار
(local/auto)
تعریفشده
توسط کاربر
و متغیرهای
موقت
تولیدشده
توسط
کامپایلر
کنترل
میکند. reuse_level
میتواند
all، named_vars یا none
باشد. مقدار
all
استفادهٔ
مجدد از
پشته را
برای تمام
متغیرهای
محلی و
متغیرهای
موقت فعال
میکند، named_vars
استفادهٔ
مجدد را
تنها برای
متغیرهای
محلی
نامدار
تعریفشده
توسط کاربر
فعال
میسازد، و
none
استفادهٔ
مجدد از
پشته را
بهطور
کامل
غیرفعال
میکند.
مقدار
پیشفرض all
است. این
گزینه
زمانی مورد
نیاز است که
برنامه طول
عمر یک
متغیر محلی
در حوزه (scoped)
یا متغیر
موقت
تولیدشده
توسط
کامپایلر
را فراتر از
نقطهٔ
پایان
تعریفشده
توسط زبان
گسترش
میدهد.
هنگامی که
طول عمر یک
متغیر
پایان
مییابد، و
چنانچه آن
متغیر در
حافظه مقیم
باشد،
کامپایلر
بهینهساز
این آزادی
عمل را دارد
که فضای
پشتهٔ آن را
برای دیگر
متغیرهای
موقت یا
متغیرهای
محلی دارای
حوزهای که
بازهٔ
حیاتشان (live range)
با آن
همپوشانی
ندارد،
مجدداً
استفاده
کند. کدهای
قدیمی (legacy) که
طول عمر
متغیرهای
محلی را
فراتر
میبرند به
احتمال
زیاد با
بهینهسازی
استفادهٔ
مجدد از
پشته دچار
شکست
میشوند.
بهعنوان مثال،
int *p; { int local1; p = &local1; local1 = 10; .... } { int local2; local2 = 20; ... } if (*p == 10) // out of scope use of local1 { }مثالی دیگر:
struct A { A(int k) : i(k), j(k) { } int i; int j; }; A *ap; void foo(const A& ar) { ap = &ar; } void bar() { foo(A(10)); // temp object's lifetime ends when foo returns { A a(20); .... } ap->i+= 10; // ap references out of scope temp whose space // is reused with a. What is the value of ap->i? }طول عمر متغیرهای موقت ایجادشده توسط کامپایلر بهخوبی توسط استاندارد C++ تعریف شده است. هنگامی که طول عمر یک متغیر موقت به پایان میرسد، و در صورتی که آن متغیر موقت در حافظه مقیم باشد، کامپایلر بهینهساز این آزادی عمل را دارد که فضای پشتهٔ آن را با سایر متغیرهای موقت یا متغیرهای محلی دارای حوزهای که بازهٔ حیات آنها با آن همپوشانی ندارد، مجدداً استفاده کند. با این حال برخی از کدهای قدیمی به رفتار کامپایلرهای قدیمیتر متکی هستند که در آنها فضای پشتهٔ متغیرهای موقت مجدداً استفاده نمیشد؛ بنابراین استفادهٔ مجدد تهاجمی از پشته میتواند منجر به خطاهای زمان اجرا شود. از این گزینه برای کنترل بهینهسازی استفادهٔ مجدد از پشته برای اشیاء موقت استفاده میشود.
- -ftrapv
- این گزینه برای سرریز علامتدار در عملیات جمع، تفریق و ضرب تله (trap) ایجاد میکند. گزینههای -ftrapv و -fwrapv اثر یکدیگر را لغو میکنند، بنابراین استفاده از -ftrapv -fwrapv در خط فرمان منجر به اعمال -fwrapv میشود. توجه داشته باشید که تنها گزینههای فعال اثر یکدیگر را خنثی میکنند، بنابراین استفاده از -ftrapv -fwrapv -fno-wrapv در خط فرمان منجر به اعمال -ftrapv خواهد شد.
- -fwrapv
- این گزینه به کامپایلر دستور میدهد فرض کند سرریز محاسبات حسابی علامتدار در جمع، تفریق و ضرب، با استفاده از نمایش مکمل دو (twos-complement) دچار چرخش (wrap around) میشود. این پرچم برخی بهینهسازیها را فعال و برخی دیگر را غیرفعال میسازد. گزینههای -ftrapv و -fwrapv اثر یکدیگر را لغو میکنند، بنابراین استفاده از -ftrapv -fwrapv در خط فرمان منجر به اعمال -fwrapv میشود. توجه داشته باشید که تنها گزینههای فعال اثر یکدیگر را خنثی میکنند، بنابراین استفاده از -ftrapv -fwrapv -fno-wrapv در خط فرمان موجب اعمال -ftrapv خواهد شد.
- -fwrapv-pointer
- این گزینه به کامپایلر دستور میدهد فرض کند سرریز محاسبات حسابی اشارهگرها در جمع و تفریق، با استفاده از نمایش مکمل دو دچار چرخش (wrap around) میشود. این پرچم برخی بهینهسازیها را که فرض میکنند سرریز اشارهگر نامعتبر است غیرفعال میکند.
- -fstrict-overflow
- این گزینه شامل -fno-wrapv -fno-wrapv-pointer است و در صورت منفی شدن بر -fwrapv -fwrapv-pointer دلالت دارد.
- -fexceptions
- مدیریت استثناها (exception handling) را فعال میکند. کدهای اضافی مورد نیاز برای انتشار استثناها را تولید میکند. برای برخی از اهداف (targets)، این بدین معناست که GCC اطلاعات بازپیچی قاب (frame unwind) را برای تمام توابع تولید میکند که میتواند بار سربار قابلتوجهی در اندازهٔ دادهها ایجاد کند، هرچند که بر اجرای برنامه تأثیری ندارد. اگر این گزینه را مشخص نکنید، GCC بهطور پیشفرض آن را برای زبانهایی مانند C++ که معمولاً به مدیریت استثنا نیاز دارند فعال کرده و برای زبانهایی مانند C که معمولاً به آن نیاز ندارند غیرفعال میسازد. با این حال، ممکن است هنگام کامپایل کدهای C که نیازمند تعامل صحیح با گردانندههای استثنا (exception handlers) نوشتهشده در C++ هستند، نیاز به فعال کردن این گزینه داشته باشید. همچنین ممکن است در صورت کامپایل برنامههای قدیمیتر C++ که از مدیریت استثنا استفاده نمیکنند، تمایل داشته باشید این گزینه را غیرفعال کنید.
- -fnon-call-exceptions
- کدی تولید میکند که به دستورالعملهای تلهانداز (trapping) اجازه میدهد استثنا پرتاب کنند. توجه داشته باشید که این امر نیازمند پشتیبانی زمان اجرای مختص هر پلتفرم است که در همه جا وجود ندارد. علاوه بر این، این گزینه تنها به دستورالعملهای تلهانداز اجازهٔ پرتاب استثنا میدهد، یعنی ارجاعات حافظه یا دستورالعملهای ممیز شناور. این ویژگی اجازه نمیدهد استثناها از گردانندههای سیگنال دلخواه نظیر "SIGALRM" پرتاب شوند. این گزینه -fexceptions را فعال میسازد.
- -fdelete-dead-exceptions
- فرض میکند دستورالعملهایی که ممکن است استثنا پرتاب کنند اما در غیر این صورت نقشی در اجرای برنامه ندارند، میتوانند از طریق بهینهسازی حذف شوند. این گزینه بر فراخوانی توابع تأثیری نمیگذارد مگر توابعی که دارای مشخصههای "pure" یا "const" باشند. این گزینه بهطور پیشفرض برای کامپایلرهای Ada و C++، همانطور که مشخصات این زبانها مجاز دانستهاند، فعال است. مراحل بهینهسازی که موجب حذف استثناهای مرده میشوند، بهطور مستقل در سطوح مختلف بهینهسازی فعال میگردند.
- -funwind-tables
- مشابه -fexceptions است، با این تفاوت که تنها دادههای ایستای مورد نیاز را تولید کرده و بههیچوجه دیگر بر کد تولیدشده تأثیر نمیگذارد. معمولاً نیازی به فعال کردن این گزینه ندارید؛ در عوض، پردازشگر زبانی که به این سازوکار نیاز دارد، آن را از جانب شما فعال میکند.
- -fasynchronous-unwind-tables
- در صورت پشتیبانی ماشین هدف، جدول بازپیچی را در قالب DWARF تولید میکند. این جدول در هر مرز دستورالعمل دقیق است، بنابراین میتواند برای بازپیچی پشته ناشی از رویدادهای ناهمگام (نظیر اشکالزدا یا زبالهروب) استفاده شود.
- -fno-gnu-unique
- در سیستمهایی با اسمبلر GNU و کتابخانهٔ C جدید، کامپایلر C++ از پیوند "STB_GNU_UNIQUE" استفاده میکند تا اطمینان یابد که تعاریف اعضای دادهای ایستای الگوها (template) و متغیرهای محلی ایستا در توابع برخط (inline) حتی در حضور "RTLD_LOCAL" نیز یکتا هستند؛ این امر برای جلوگیری از بروز مشکلاتی لازم است که در آنها کتابخانهای مورد استفاده توسط دو پلاگین مختلف "RTLD_LOCAL"، وابسته به تعریفی در یکی از آنها بوده و بنابراین با دیگری در مورد پیوند نماد دچار تضاد میشود. اما این امر باعث میشود "dlclose" برای DSOهای تحتتأثیر نادیده گرفته شود؛ اگر برنامهٔ شما به مقداردهی اولیهٔ مجدد یک DSO از طریق "dlclose" و "dlopen" متکی است، میتوانید از -fno-gnu-unique استفاده کنید.
- -fpcc-struct-return
- مقادیر
«کوتاه»
"struct" و
"union" را
مانند
ساختارهای
بلندتر در
حافظه
برمیگرداند،
نه در
ثباتها.
این
قرارداد
کارایی
کمتری
دارد، اما
این مزیت را
دارد که
اجازهٔ
قابلیت
فراخوانی
متقابل
میان
فایلهای
کامپایلشده
با GCC و
فایلهای
کامپایلشده
با سایر
کامپایلرها،
بهویژه Portable C
Compiler (pcc) را فراهم
میکند.
قرارداد دقیق برای بازگرداندن ساختارها در حافظه به ماکروهای پیکربندی هدف وابسته است.
ساختارها و اجتماعات (unions) کوتاه مواردی هستند که اندازه و همترازی (alignment) آنها با یک نوع عدد صحیح مطابقت دارد.
هشدار: کدی که با گزینهٔ -fpcc-struct-return کامپایل شده باشد از نظر باینری با کدی که با گزینهٔ -freg-struct-return کامپایل شده سازگار نیست. از آن برای تطابق با یک رابط باینری کاربردی (ABI) غیرپیشفرض استفاده کنید..IP -freg-struct-return 4 در صورت امکان، مقادیر "struct" و "union" را در ثباتها بازمیگرداند. این روش برای ساختارهای کوچک کارآمدتر از -fpcc-struct-return است.
اگر نه -fpcc-struct-return و نه -freg-struct-return را مشخص نکنید، پیشفرض GCC هر قراردادی خواهد بود که برای معماری مقصد استاندارد است. اگر هیچ قرارداد استانداردی وجود نداشته باشد، پیشفرض GCC بر روی -fpcc-struct-return قرار میگیرد، به جز در مقصدهایی که GCC کامپایلر اصلی است. در آن موارد، میتوانیم استاندارد را انتخاب کنیم و گزینهٔ کارآمدترِ بازگردانی در ثبات را برگزیدهایم.
هشدار: کدی که با سوییچ -freg-struct-return کامپایل شده باشد از نظر باینری با کدی که با سوییچ -fpcc-struct-return کامپایل شده سازگار نیست. از آن برای انطباق با یک رابط باینری کاربردی (ABI) غیرپیشفرض استفاده کنید.
- -fshort-enums
- برای یک نوع
"enum" تنها
به
اندازهای
بایت تخصیص
میدهد که
برای
محدودهٔ
مقادیر
ممکنِ
اعلانشده
نیاز دارد.
بهطور
خاص، نوع
"enum"
معادل
کوچکترین
نوع عدد
صحیحی
خواهد بود
که فضای
کافی داشته
باشد. این
گزینه برای
یک نوع
شمارشی با
نوعِ
زیرینِ
ثابت هیچ
تأثیری
ندارد.
هشدار: سوییچ -fshort-enums باعث میشود GCC کدی تولید کند که از نظر باینری با کد تولیدشده بدون این سوییچ سازگار نیست. از آن برای انطباق با یک رابط باینری کاربردی (ABI) غیرپیشفرض استفاده کنید.
- -fshort-wchar
- نوع زیرین
برای
"wchar_t" را
بازنویسی
میکند تا
به جای حالت
پیشفرض
برای مقصد،
برابر با
"short unsigned int"
باشد. این
گزینه برای
ساخت
برنامههایی
که قرار است
تحت WINE اجرا
شوند مفید
است.
هشدار: سوییچ -fshort-wchar باعث میشود GCC کدی تولید کند که از نظر باینری با کد تولیدشده بدون این سوییچ سازگار نیست. از آن برای انطباق با یک رابط باینری کاربردی (ABI) غیرپیشفرض استفاده کنید.
- -fcommon
- در کد C، این
گزینه
نحوهٔ
جایگذاری
متغیرهای
سراسریِ
تعریفشده
بدون مقدار
اولیهساز
را که در
استاندارد C
به عنوان
تعریفهای
آزمایشی (tentative
definitions) شناخته
میشوند،
کنترل
میکند.
تعریفهای
آزمایشی از
اعلانهای
متغیر با
کلمه کلیدی
"extern"، که
فضایی
تخصیص
نمیدهند،
متمایز
هستند.
حالت پیشفرض -fno-common است، که مشخص میکند کامپایلر متغیرهای سراسریِ مقداردهینشده را در بخش BSS فایل شیء قرار میدهد. این کار مانع از ادغام تعریفهای آزمایشی توسط پیونددهنده میشود؛ بنابراین اگر متغیر یکسانی بهطور تصادفی در بیش از یک واحد کامپایل تعریف شده باشد، با خطای multiple-definition مواجه میشوید.
گزینهٔ -fcommon متغیرهای سراسری مقداردهینشده را در یک بلوک مشترک قرار میدهد. این به پیونددهنده امکان میدهد همهٔ تعریفهای آزمایشی از یک متغیر یکسان در واحدهای مختلف کامپایل را به همان شیء، یا به یک تعریف غیرآزمایشی ارجاع دهد و حل کند. این رفتار با C++ ناسازگار است، و در بسیاری از مقاصد جریمهای در سرعت و اندازهٔ کد هنگام ارجاع به متغیرهای سراسری به همراه دارد. کاربرد اصلی آن، امکان پیوند دادن کدهای قدیمی بدون رخ دادن خطا است.
- -fno-ident
- -Qy
- -Qn
- -fno-ident از درج دستورالعملهای اسمبلی ".ident" جلوگیری کرده و باعث نادیده گرفته شدن رهنمود پیشپردازندهٔ "#ident" میشود. -Qy و -Qn مترادفهای منسوخشده بهترتیب برای -fident و -fno-ident هستند.
- -finhibit-size-directive
- دستورالعمل اسمبلی ".size" یا هر چیز دیگری را که در صورت تکهتکه شدن تابع از وسط و قرار گرفتن دو نیمه در مکانهایی دور از هم در حافظه مشکل ایجاد کند، خروجی نمیدهد. این گزینه هنگام کامپایل crtstuff.c استفاده میشود؛ نباید نیازی به استفاده از آن برای چیز دیگری داشته باشید.
- -fverbose-asm
- اطلاعات
توضیحی
بیشتری در
کد اسمبلی
تولیدشده
قرار
میدهد تا
خوانایی آن
بیشتر شود.
این گزینه
عموماً فقط
برای کسانی
مفید است که
واقعاً
نیاز به
خواندن کد
اسمبلی
تولیدشده
دارند (شاید
هنگام
اشکالزدایی
خود
کامپایلر).
گزینهٔ -fno-verbose-asm که حالت پیشفرض است، باعث حذف اطلاعات اضافی میشود و هنگام مقایسهٔ دو فایل اسمبلی کاربرد دارد.
توضیحات اضافهشده شامل موارد زیر است:
- اطلاعات مربوط به نسخهٔ کامپایلر و گزینههای خط فرمان،
- خطوط کد مبدأ مرتبط با دستورالعملهای اسمبلی، در قالب FILENAME:LINENUMBER:CONTENT OF LINE،
- نکاتی در مورد اینکه کدام عبارات سطح بالا با عملوندهای مختلف دستورالعمل اسمبلی مطابقت دارند.
برای مثال، با در نظر گرفتن این فایل مبدأ C:
int test (int n)
{
int i;
int total = 0;
for (i = 0; i < n; i++)
total += i * i;
return total;
}
کامپایل به اسمبلی (x86_64) از طریق -S و ارسال مستقیم نتیجه به stdout با استفاده از -o -
gcc -S test.c -fverbose-asm -Os -o -
خروجی مشابه زیر تولید میکند:
.file "test.c"
# GNU C11 (GCC) version 7.0.0 20160809 (experimental) (x86_64-pc-linux-gnu)
[...snip...]
# options passed:
[...snip...]
.text
.globl test
.type test, @function
test:
.LFB0:
.cfi_startproc
# test.c:4: int total = 0;
xorl %eax, %eax # <retval>
# test.c:6: for (i = 0; i < n; i++)
xorl %edx, %edx # i
.L2:
# test.c:6: for (i = 0; i < n; i++)
cmpl %edi, %edx # n, i
jge .L5 #,
# test.c:7: total += i * i;
movl %edx, %ecx # i, tmp92
imull %edx, %ecx # i, tmp92
# test.c:6: for (i = 0; i < n; i++)
incl %edx # i
# test.c:7: total += i * i;
addl %ecx, %eax # tmp92, <retval>
jmp .L2 #
.L5:
# test.c:10: }
ret
.cfi_endproc
.LFE0:
.size test, .-test
.ident "GCC: (GNU) 7.0.0 20160809 (experimental)"
.section .note.GNU-stack,"",@progbits
این توضیحات برای انسانها در نظر گرفته شدهاند نه ماشینها، و بنابراین فرمت دقیق توضیحات ممکن است تغییر کند.
- -frecord-gcc-switches
- این سوییچ باعث میشود خط فرمان استفادهشده برای فراخوانی کامپایلر، در فایل شیء در حال ایجاد ثبت شود. این سوییچ تنها روی برخی از مقاصد پیادهسازی شده است و قالب دقیق ثبت به مقصد و قالب فایل باینری بستگی دارد، اما معمولاً به شکل بخشی حاوی متن ASCII درمیآید. این سوییچ با سوییچ -fverbose-asm مرتبط است، اما آن سوییچ اطلاعات را فقط در فایل خروجی اسمبلی به عنوان توضیح ثبت میکند، بنابراین هرگز به فایل شیء راه نمییابد. همچنین برای روش دیگری از ذخیرهٔ گزینههای کامپایلر در فایل شیء، به -grecord-gcc-switches مراجعه کنید.
- -fpic
- در صورت
پشتیبانی
ماشین
مقصد، کد
مستقل از
موقعیت (PIC)
مناسب برای
استفاده در
یک
کتابخانهٔ
مشترک
تولید
میکند.
چنین کدی به
تمام
آدرسهای
ثابت از
طریق یک
جدول آفست
سراسری (GOT)
دسترسی
پیدا
میکند.
بارگذار
پویا هنگام
شروع
برنامه
ورودیهای
GOT را تحلیل و
حل میکند
(بارگذار
پویا بخشی
از GCC نیست؛
بلکه بخشی
از
سیستمعامل
است). اگر
اندازهٔ GOT
برای فایل
اجرایی
پیوند
دادهشده
از حداکثر
اندازهٔ
خاص ماشین
فراتر رود،
پیامی خطا
از
پیونددهنده
دریافت
میکنید که
نشان
میدهد -fpic
کار
نمیکند؛
در این
صورت،
بهجای آن
با -fPIC
دوباره
کامپایل
کنید. (این
مقادیر
بیشینه در SPARC
برابر با 8k،
در AArch64 برابر
با 28k و در m68k و RS/6000
برابر با 32k
است. x86 چنین
محدودیتی
ندارد.)
کد مستقل از موقعیت نیازمند پشتیبانی ویژهای است، و بنابراین تنها روی ماشینهای خاصی کار میکند. برای x86، کامپایلر GCC از PIC برای System V پشتیبانی میکند اما برای Sun 386i پشتیبانی نمیکند. کد تولیدشده برای IBM RS/6000 همواره مستقل از موقعیت است.
هنگامی که این پرچم تنظیم شده باشد، ماکروهای "__pic__" و "__PIC__" روی 1 تعریف میشوند..IP -fPIC 4 در صورت پشتیبانی توسط ماشین مقصد، کد مستقل از موقعیت (position-independent code) تولید میکند که برای پیوند پویا مناسب بوده و از هرگونه محدودیت در اندازهٔ جدول آفست سراسری (GOT) جلوگیری میکند. این گزینه روی AArch64، m68k، PowerPC و SPARC تفاوت ایجاد میکند.
کد مستقل از موقعیت نیازمند پشتیبانی ویژهای است و بنابراین تنها روی ماشینهای خاصی کار میکند.
هنگامی که این پرچم تنظیم شود، ماکروهای "__pic__" و "__PIC__" با مقدار 2 تعریف میشوند.
- -fpie
- -fPIE
- این
گزینهها
مشابه -fpic و
-fPIC هستند،
اما کد
مستقل از
موقعیت
تولیدشده
تنها
میتواند
در
فایلهای
اجرایی
پیوند داده
شود.
معمولاً از
این
گزینهها
برای
کامپایل
کدی
استفاده
میشود که
قرار است با
استفاده از
گزینهٔ -pie
در GCC پیوند
یابد.
-fpie و -fPIE هر دو ماکروهای "__pie__" و "__PIE__" را تعریف میکنند. این ماکروها برای -fpie دارای مقدار 1 و برای -fPIE دارای مقدار 2 هستند.
- -fno-plt
- برای
فراخوانی
توابع
خارجی در کد
مستقل از
موقعیت از PLT
استفاده
نکن. در
عوض، آدرس
فراخوانیشونده
(callee) را در
محلهای
فراخوانی
از GOT
بارگذاری
کرده و به
آن پرش کن.
این کار با
حذف کدهای
واسط (stubs) جدول
PLT و در معرض
بهینهسازی
قرار دادن
بارگذاریهای
GOT، منجر به
کدی
کارآمدتر
میشود. در
معماریهایی
مانند x86 ۳۲
بیتی که در
آنها
کدهای واسط
PLT انتظار
اشارهگر GOT
را در ثباتی
خاص دارند،
این کار
آزادی عمل
بیشتری در
تخصیص ثبات
به
کامپایلر
میدهد.
پیوند تنبل
(Lazy binding) نیازمند
استفاده از
PLT است؛ با -fno-plt
تمام
نمادهای
خارجی در
زمان
بارگذاری
حلوفصل
میشوند.
به عنوان روشی جایگزین، میتوان از صفت تابع "noplt" برای جلوگیری از فراخوانی توابع خارجی خاص از طریق PLT استفاده کرد.
در کد وابسته به موقعیت، برخی مقصدها نیز فراخوانی توابعی را که برای عدم استفاده از PLT نشانهگذاری شدهاند، به استفاده از GOT تغییر میدهند.
- -fno-jump-tables
- برای دستورهای switch از جدولهای پرش (jump tables) استفاده نکن، حتی در مواردی که نسبت به سایر راهبردهای تولید کد کارآمدتر باشد. این گزینه در ترکیب با -fpic یا -fPIC برای ساخت کدهایی که بخشی از یک پیونددهندهٔ پویا هستند و نمیتوانند به آدرس یک جدول پرش ارجاع دهند کاربرد دارد. در برخی مقصدها، جدولهای پرش نیازی به GOT ندارند و به این گزینه نیازی نیست.
- -fno-bit-tests
- برای دستورهای switch از آزمونهای بیتی (bit tests) استفاده نکن، حتی در مواردی که نسبت به سایر راهبردهای تولید کد کارآمدتر باشد.
- -ffixed-reg
- با ثبات
نامبردهشدهٔ
reg به عنوان
یک ثبات
ثابت رفتار
کن؛ کد
تولیدشده
هرگز نباید
به آن ارجاع
دهد (شاید
به جز به
عنوان
اشارهگر
پشته،
اشارهگر
فریم یا در
نقش ثابت
دیگری).
reg باید نام یک ثبات باشد. نامهای ثبات قابل قبول مختص ماشین هستند و در ماکروی "REGISTER_NAMES" در فایل ماکروی توصیف ماشین تعریف شدهاند.
این پرچم حالت منفی ندارد، زیرا یک انتخاب سهگانه را مشخص میکند.
- -fcall-used-reg
- با ثبات
نامبردهشدهٔ
reg به عنوان
یک ثبات
تخصیصپذیر
رفتار کن که
با
فراخوانی
توابع
مقدارش
دستخوش
تغییر
میشود (clobbered).
این ثبات
ممکن است
برای
متغیرهای
موقت یا
متغیرهایی
که در طول
فراخوانی
زنده
نمیمانند
تخصیص یابد.
توابعی که
به این روش
کامپایل
میشوند،
ثبات reg را
ذخیره و
بازیابی
نمیکنند.
استفاده از این پرچم برای اشارهگر فریم یا اشارهگر پشته یک خطا است. استفاده از این پرچم برای سایر ثباتهایی که نقشهای فراگیر ثابتی در مدل اجرای ماشین دارند، نتایج فاجعهباری به همراه دارد.
این پرچم حالت منفی ندارد، زیرا یک انتخاب سهگانه را مشخص میکند.
- -fcall-saved-reg
- با ثبات
نامبردهشدهٔ
reg به عنوان
یک ثبات
تخصیصپذیر
رفتار کن که
توسط توابع
ذخیره
میشود. این
ثبات ممکن
است حتی
برای
متغیرهای
موقت یا
متغیرهایی
که در طول
فراخوانی
زنده
میمانند
نیز تخصیص
یابد.
توابعی که
به این روش
کامپایل
میشوند،
در صورت
استفاده از
ثبات reg، آن
را ذخیره و
بازیابی
میکنند.
استفاده از این پرچم برای اشارهگر فریم یا اشارهگر پشته یک خطا است. استفاده از این پرچم برای سایر ثباتهایی که نقشهای فراگیر ثابتی در مدل اجرای ماشین دارند، نتایج فاجعهباری به همراه دارد.
استفاده از این پرچم برای ثباتی که مقادیر بازگشتی تابع ممکن است در آن قرار گیرد، نوع متفاوتی از فاجعه به بار میآورد.
این پرچم حالت منفی ندارد، زیرا یک انتخاب سهگانه را مشخص میکند.
- -fpack-struct[=n]
- بدون تعیین
یک مقدار،
تمام اعضای
ساختار را
بدون هیچ
فضای خالی
در کنار هم
فشردهسازی
کن. هنگامی
که مقداری
مشخص شود
(که باید
توان کوچکی
از دو
باشد)،
اعضای
ساختار را
مطابق با
این مقدار
که
نمایانگر
حداکثر
تراز (alignment) است
بستهبندی
کن (یعنی
اشیایی با
نیازمندیهای
تراز
پیشفرض
بزرگتر از
این مقدار،
احتمالاً
بهصورت
ترازنشده
در جایگاه
مناسب بعدی
قرار
میگیرند).
هشدار: گزینهٔ -fpack-struct باعث میشود GCC کدی تولید کند که با کدهای تولیدشده بدون این گزینه سازگاری باینری ندارد. علاوه بر این، کارایی کد را کاهش میدهد. تنها برای سازگاری با یک رابط باینری کاربردی (ABI) غیرپیشفرض از آن استفاده کنید.
- -fleading-underscore
- این گزینه و
همتای آن،
-fno-leading-underscore،
نحوهٔ
نمایش
نمادهای C
را در فایل
شیء
بهصورت
اجباری
تغییر
میدهند. یک
کاربرد آن،
کمک به
پیوند با
کدهای
قدیمی
اسمبلی است.
هشدار: گزینهٔ -fleading-underscore باعث میشود GCC کدی تولید کند که با کدهای تولیدشده بدون این گزینه سازگاری باینری ندارد. برای سازگاری با یک رابط باینری کاربردی غیرپیشفرض از آن استفاده کنید. همهٔ مقصدها پشتیبانی کاملی از این گزینه ارائه نمیدهند.
- -ftls-model=model
- مدل فضای
ذخیرهسازی
محلی رشته (TLS)
مورد
استفاده را
تغییر
میدهد.
آرگومان model
باید یکی از
مقادیر
global-dynamic، local-dynamic،
initial-exec یا local-exec
باشد. توجه
داشته
باشید که
این انتخاب
مشمول
بهینهسازی
است:
کامپایلر
ممکن است
برای
نمادهایی
که در خارج
از واحد
ترجمه قابل
مشاهده
نیستند، یا
اگر -fpic در خط
فرمان مشخص
نشده باشد،
از مدلی
کارآمدتر
استفاده
کند.
پیشفرض بدون -fpic مقدار initial-exec است؛ همراه با -fpic پیشفرض global-dynamic است.
- -ftrampolines
- برای
مقصدهایی
که معمولاً
برای توابع
تو در تو به
ترامپولینها
نیاز
دارند،
همیشه به
جای
استفاده از
توصیفکنندهها،
آنها را
تولید کن.
در غیر این
صورت، برای
مقصدهایی
که به آنها
نیازی
ندارند،
مانند HP-PA یا
IA-64، کاری
انجام نده.
ترامپولین قطعه کد کوچکی است که در زمان اجرا روی پشته ایجاد میشود، هنگامی که آدرس یک تابع تو در تو گرفته شده است، و برای فراخوانی غیرمستقیم تابع تو در تو استفاده میشود. بنابراین، برای عملکرد صحیح برنامه لازم است که پشته قابل اجرا (executable) شود.
گزینهٔ -fno-trampolines بر اساس نوع هر زبان به صورت پیشفرض فعال است تا به کامپایلر اجازه دهد در صورت ایمن تشخیص دادن، از تولید آنها خودداری کرده و آنها را با توصیفکنندهها جایگزین سازد. توصیفکنندهها فقط از داده تشکیل شدهاند، اما کد تولیدشده باید برای کار با آنها آماده باشد. در زمان نگارش این مستند، -fno-trampolines تنها برای زبان Ada به طور پیشفرض فعال است.
علاوه بر این، در صورت وجود توابع تو در تو، کدهای کامپایلشده با -ftrampolines و کدهای کامپایلشده با -fno-trampolines سازگاری باینری ندارند. بنابراین، این گزینه باید در کل سطح برنامه استفاده شده و با احتیاط بسیار دستکاری شود.
برای زبانهایی غیر از Ada، گزینههای "-ftrampolines" و "-fno-trampolines" در حال حاضر هیچ اثری ندارند، و ترامپولینها همیشه روی سکوهایی که برای توابع تو در تو به آنها نیاز دارند تولید میشوند.
- -ftrampoline-impl=[stack|heap]
- بهطور پیشفرض، ترامپولینها روی پشته تولید میشوند. با این حال، برخی سکوها (مانند Apple M1) پشتهٔ قابل اجرا را مجاز نمیدانند. کامپایل با -ftrampoline-impl=heap فراخوانیهایی به "__gcc_nested_func_ptr_created" و "__gcc_nested_func_ptr_deleted" ایجاد میکند تا فضای ترامپولین را روی هیپ قابل اجرا تخصیص داده و آزاد کند. این توابع در libgcc پیادهسازی شدهاند و تنها روی مقصدهای مشخصی ارائه خواهند شد: x86_64 Darwin، و x86_64 و aarch64 در Linux. توجه داشته باشید: در صورتی که "setjmp" انجام دهید، توابع تو در تو را نمونهسازی کنید و سپس با "longjmp" به وضعیتی پیش از تخصیص آن توابع تو در تو بازگردید، تضمینی وجود ندارد که ترامپولینهای هیپ بهدرستی آزاد شوند.
- -fvisibility=[default|internal|hidden|protected]
- نمایانی
پیشفرض
نمادهای
تصویر ELF را
روی گزینهٔ
مشخصشده
تنظیم
میکند---تمام
نمادها با
این مشخصه
علامتگذاری
میشوند
مگر اینکه
درون کد لغو
شوند.
استفاده از
این ویژگی
میتواند
زمان پیوند
و بارگذاری
کتابخانههای
شیء
اشتراکی را
بهطور
چشمگیری
بهبود
بخشد، کد
بهینهتری
تولید کند،
صادرات API
تقریباً
بینقصی
ارائه دهد و
از تداخل
نمادها
جلوگیری
کند.
اکیداً
توصیه
میشود که
از این
گزینه در هر
شیء
اشتراکی که
توزیع
میکنید
استفاده
نمایید.
برخلاف نامگذاری، default همیشه به معنای عمومی (public) است؛ یعنی در دسترس برای پیوند خوردن از خارج شیء اشتراکی. گزینههای protected و internal در کاربردهای واقعی عملاً بلااستفاده هستند، بنابراین تنها گزینهٔ رایج دیگر hidden است. پیشفرض در صورت عدم تعیین -fvisibility مقدار default است، یعنی تمام نمادها عمومی میشوند.
توضیح مناسبی دربارهٔ مزایای اطمینان از نمایانی صحیح نمادهای ELF در مقالهٔ "How To Write Shared Libraries" به قلم Ulrich Drepper (قابل دسترسی در https://www.akkadia.org/drepper) ارائه شده است---با این حال راهکار برتری که به کمک این گزینه نسبت به مخفیسازی در حالتی که پیشفرضْ عمومی است فراهم شده، این است که پیشفرض را hidden قرار داده و موارد لازم را عمومی علامتگذاری کنید. این امر در DLLها روی Windows یک هنجار است و با -fvisibility=hidden و "__attribute__ ((visibility("default")))" به جای "__declspec(dllexport)" معناشناسی تقریباً یکسانی با ساختار نحوی همسان به دست میآورید. این یک موهبت بزرگ برای کسانی است که روی پروژههای چندسکویی کار میکنند.
برای کسانی که پشتیبانی از نمایانی را به کدهای موجود اضافه میکنند، دستور "#pragma GCC visibility" میتواند مفید باشد. نحوهٔ کار به این صورت است که اعلانهایی را که میخواهید نمایانی آنها را تنظیم کنید (به عنوان مثال) با "#pragma GCC visibility push(hidden)" و "#pragma GCC visibility pop" احاطه میکنید. به یاد داشته باشید که نمایانی نمادها باید به عنوان بخشی از قرارداد رابط API دیده شود و بنابراین تمام کدهای جدید باید همیشه در صورتی که نمایانی پیشفرض نیست آن را مشخص کنند؛ یعنی اعلانهایی که صرفاً برای استفاده در DSO محلی هستند همیشه باید بهصراحت به عنوان hidden علامتگذاری شوند تا از سربار ارجاع غیرمستقیم PLT جلوگیری شود---واضح ساختن این موضوع به خوانایی و خودسندسازی کد نیز کمک میکند. توجه داشته باشید که به دلیل الزامات مشخصات ISO C++، عملگرهای "operator new" و "operator delete" همیشه باید دارای نمایانی پیشفرض (default) باشند.
آگاه باشید که سرایندهای خارج از پروژهٔ شما، بهویژه سرایندهای سیستم و سرایندهای هر کتابخانهٔ دیگری که استفاده میکنید، ممکن است انتظار کامپایل با نمایانی غیر از پیشفرض را نداشته باشند. ممکن است نیاز باشد بهصراحت از "#pragma GCC visibility push(default)" پیش از گنجاندن هر یک از این سرایندها استفاده کنید.
اعلانهای "extern" تحت تأثیر -fvisibility قرار نمیگیرند، بنابراین بخش زیادی از کدها را میتوان با -fvisibility=hidden بدون تغییر مجدداً کامپایل کرد. با این حال، این بدان معناست که فراخوانی توابع "extern" بدون نمایانی صریح از PLT استفاده میکند، بنابراین مؤثرتر است که از "__attribute ((visibility))" و/یا "#pragma GCC visibility" برای اعلام این که کدام اعلانهای "extern" باید مخفی در نظر گرفته شوند به کامپایلر استفاده کنید.
توجه داشته باشید که -fvisibility بر موجودیتهای پیوند مبهم (vague linkage) در C++ تأثیر میگذارد. این بدان معناست که برای نمونه، یک کلاس استثنا که بین DSOها پرتاب میشود باید صریحاً با نمایانی default نشانهگذاری شود تا گرههای type_info بین DSOها یکپارچه شوند.
مروری بر این روشها، مزایای آنها و نحوهٔ استفاده از آنها در https://gcc.gnu.org/wiki/Visibility در دسترس است..IP -fstrict-volatile-bitfields 4 این گزینه زمانی باید به کار رود که دسترسیها به فیلدهای بیتی volatile (یا سایر فیلدهای ساختار، اگرچه کامپایلر معمولاً در هر صورت آن نوعها را رعایت میکند) باید از یک دسترسی واحد با پهنای نوعِ فیلد، و در صورت امکان همتراز با تراز طبیعی استفاده کنند. برای نمونه، مقصدهایی با ثباتهای جانبی نگاشتشده در حافظه (memory-mapped) ممکن است به دسترسیهایی با پهنای دقیقاً ۱۶ بیت نیاز داشته باشند؛ با این پرچم میتوانید همهٔ فیلدهای بیتیِ جانبی را بهصورت "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) با صفر را
در
مقداردهندههای
اولیهٔ
متغیرهای
خودکار
تضمین
میکند.
برخی
زبانها
مقداردهی
اولیهٔ
بیتهای
فاصلهساز
با صفر را
در موارد
خاصی تضمین
میکنند؛
برای نمونه
C23 هنگام
استفاده از
مقداردهندههای
اولیهٔ
خالی
("{}")، یا C++
هنگام
استفاده از
مقداردهی
اولیه با
صفر، یا C
تضمین
میکند
فیلدهایی
که در یک
مقداردهنده
اولیه مشخص
نشدهاند،
بیتهای
فاصلهساز
آنها با
صفر
مقداردهی
اولیه شوند.
این گزینه
امکان
تغییر
زمانِ
تضمینِ
مقداردهی
با صفر
بیتهای
فاصلهساز
در
مقداردهندهها
را فراهم
میکند.
پیشفرض
"-fzero-init-padding-bits=standard"
است که هیچ
تضمینی
فراتر از
استاندارد
مربوطه
ارائه
نمیدهد؛
برای نمونه:
struct A { char a; unsigned long long b; char c; }; union B { char a; unsigned long long b; }; struct A a = {}; // C23 guarantees padding bits are zero. struct A b = { 1, 2, 3 }; // No guarantees. union B c = {}; // C23 guarantees padding bits are zero. union B d = { 1 }; // No guarantees."-fzero-init-padding-bits=unions" علاوهبر آنچه استانداردها تضمین میکنند، مقداردهی اولیهٔ بیتهای فاصلهساز را در اجتماعها (unions) تضمین میکند، مشروط بر اینکه مقداردهندهٔ اولیهٔ یک union خالی باشد (که در این صورت تمام بیتهای union با صفر مقداردهی اولیه میشوند) یا اگر عضو مقداردهیشده از union کوچکتر از اندازهٔ union باشد (که در این حالت تضمین میکند بیتهای فاصلهسازِ خارج از عضو مقداردهیشده با صفر مقداردهی اولیه شوند). این رفتار GCC پیش از GCC 15 بود و در مثال بالا، مقداردهی با صفر را برای "sizeof (unsigned long long) - 1" بایت پایانی در union تضمین میکند.
"-fzero-init-padding-bits=all" افزون بر این، مقداردهی اولیهٔ با صفر بیتهای فاصلهساز را در سایر ساختارهای تجمعی (aggregates) تضمین میکند؛ بنابراین فاصلهساز بین "b.a" و "b.b" (در صورت وجود) و فاصلهساز انتهایی در ساختار (در صورت وجود) را شامل میشود.
گزینههای توسعهدهندگان GCC (GCC Developer Options)
این بخش گزینههای خط فرمانی را شرح میدهد که عمدتاً مورد توجه توسعهدهندگان GCC هستند؛ از جمله گزینههایی برای پشتیبانی از آزمایش کامپایلر و بررسی اشکالات کامپایلر و مشکلات کارایی در زمان کامپایل. این موارد شامل گزینههایی است که در مراحل مختلف کامپایل، خروجیهای اشکالزدایی (debug dumps) تولید میکنند؛ آمارهایی مانند مصرف حافظه و زمان اجرا را چاپ میکنند؛ و اطلاعاتی را دربارهٔ پیکربندی GCC، مانند مکانهای جستجوی کتابخانهها، نمایش میدهند. برای کارهای معمول کامپایل و پیوند دادن (linking) بهندرت نیاز به استفاده از این گزینهها خواهید داشت.
بسیاری از گزینههای توسعهدهنده که باعث میشوند GCC خروجی را در یک فایل تخلیه (dump) کند، پسوند اختیاری =filename میپذیرند. میتوانید stdout یا - را برای تخلیه در خروجی استاندارد، و stderr را برای خطای استاندارد مشخص کنید.
اگر =filename حذف شود، یک نام پیشفرض برای فایل تخلیه با الحاق نام پایهٔ فایل تخلیه، شمارهٔ گذر (pass number)، حرف فاز (phase letter) و نام گذر ساخته میشود. نام پایهٔ فایل تخلیه، در صورتی که بهطور صریح مشخص شده باشد و یک فایل اجرایی نباشد، نام فایل خروجی تولیدشده توسط کامپایلر است؛ در غیر این صورت، نام فایل منبع خواهد بود. شمارهٔ گذر بر اساس ترتیبی تعیین میشود که گذرها در مدیر گذرهای کامپایلر ثبت میشوند. این ترتیب عموماً با ترتیب اجرا یکسان است، اما گذرهایی که توسط پلاگینها ثبت میشوند، گذرهای ویژهی معماری مقصد، یا گذرهایی که به دلایل دیگر دیر ثبت شدهاند، شمارهای بالاتر از گذر با نام final دریافت میکنند، حتی اگر زودتر اجرا شوند. حرف فاز یکی از موارد i (تحلیل بینروالی)، l (مختص زبان)، r (RTL)، یا t (درخت) است. این فایلها در دایرکتوری فایل خروجی ایجاد میشوند.
- -fcallgraph-info
- -fcallgraph-info=MARKERS
- کامپایلر
را وادار
میکند
اطلاعات
گراف
فراخوانی
(callgraph) برنامه
را به ازای
هر فایل شیء
(object file) در خروجی
قرار دهد.
این
اطلاعات در
قالب
متداول VCG
تولید
میشوند. در
صورت مشخص
کردن یک
فهرست از
نشانگرهای
جداشده با
کاما،
میتوان آن
را با
اطلاعات
اضافی به
ازای هر گره
یا هر یال
آراست.
هنگامی که
نشانگر
"su" مشخص
شود، گراف
فراخوانی
با اطلاعات
استفاده از
پشته
آراسته
میشود؛
این معادل
با -fstack-usage است.
هنگامی که
نشانگر
"da"
تعیین شود،
گراف
فراخوانی
با اطلاعات
مربوط به
اشیاء پویا
تخصیصیافته
آراسته
میشود.
هنگام کامپایل با -flto، هیچ اطلاعات گراف فراخوانی همراه با فایل شیء در خروجی نوشته نمیشود. در زمان پیوند LTO، گزینهٔ -fcallgraph-info ممکن است چندین فایل اطلاعات گراف فراخوانی در کنار فایلهای خروجی میانی LTO تولید کند.
- -dletters
- --dump=letters
- --dump letters
- -fdump-rtl-pass
- -fdump-rtl-pass-options
- -fdump-rtl-pass-options=filename
- مشخص
میکند که
در طول
کامپایل،
در
زمانهای
تعیینشده
توسط letters
(هنگام
استفاده از
-d) یا توسط pass
(هنگام
استفاده از
-fdump-rtl)،
خروجیهای
تخلیهٔ
اشکالزدایی
ایجاد شوند.
این مورد
برای
اشکالزدایی
گذرهای
مبتنی بر RTL
کامپایلر
استفاده
میشود.
برخی از سوئیچهای -dletters هنگامی که -E برای پیشپردازش به کار میرود، معنای متفاوتی دارند.
شکل -options کنترل بیشتری بر روی جزئیات فایل تخلیه فراهم میکند. به -fdump-tree مراجعه کنید.
در اینجا نمونههای واقعی گزینههای خط فرمان که از این الگوها پیروی میکنند و معانی آنها آورده شده است:
- -fdump-rtl-alignments
- تخلیه پس از محاسبهٔ ترازهای پرش (branch alignments).
- -fdump-rtl-asmcons
- تخلیه پس از اصلاح عبارتهای rtl که قیدهای ورودی/خروجی (in/out constraints) برآوردهنشده دارند.
- -fdump-rtl-auto_inc_dec
- تخلیه پس از کشف خودافزایش/کاهش (auto-inc-dec). این گذر تنها روی معماریهایی اجرا میشود که دستورالعملهای خودافزایش یا خودکاهش دارند.
- -fdump-rtl-barriers
- تخلیه پس از پاکسازی دستورالعملهای مانع (barrier instructions).
- -fdump-rtl-bbpart
- تخلیه پس از افرازش (پارتیشنبندی) بلوکهای پایهٔ داغ و سرد.
- -fdump-rtl-bbro
- تخلیه پس از بازآرایی بلوکها (block reordering).
- -fdump-rtl-btl1
- -fdump-rtl-btl2
- -fdump-rtl-btl1 و -fdump-rtl-btl2 تخلیهٔ خروجی پس از دو گذر بهینهسازی بارگذاری مقصد پرش (branch target load) را فعال میکنند..IP -fdump-rtl-bypass 4 تخلیه پس از کنارگذر پرشها و بهینهسازیهای جریان کنترل.
- -fdump-rtl-combine
- تخلیه پس از گذر ترکیب دستورالعملهای RTL.
- -fdump-rtl-compgotos
- تخلیه پس از تکثیر gotoهای محاسبهشده.
- -fdump-rtl-ce1
- -fdump-rtl-ce2
- -fdump-rtl-ce3
- گزینههای -fdump-rtl-ce1، -fdump-rtl-ce2 و -fdump-rtl-ce3 تخلیه پس از سه گذر تبدیل if را فعال میکنند.
- -fdump-rtl-cprop_hardreg
- تخلیه پس از انتشار رونوشت ثبات سختافزاری.
- -fdump-rtl-csa
- تخلیه پس از ترکیب تنظیمات پشته.
- -fdump-rtl-cse1
- -fdump-rtl-cse2
- گزینههای -fdump-rtl-cse1 و -fdump-rtl-cse2 تخلیه پس از دو گذر حذف زیرعبارتهای مشترک را فعال میکنند.
- -fdump-rtl-dce
- تخلیه پس از گذرهای مستقل حذف کدهای مرده.
- -fdump-rtl-dbr
- تخلیه پس از زمانبندی انشعابهای با تاخیر.
- -fdump-rtl-dce1
- -fdump-rtl-dce2
- گزینههای -fdump-rtl-dce1 و -fdump-rtl-dce2 تخلیه پس از دو گذر حذف ذخیرهسازیهای مرده را فعال میکنند.
- -fdump-rtl-eh
- تخلیه پس از نهاییسازی کد مدیریت استثنا (EH).
- -fdump-rtl-eh_ranges
- تخلیه پس از تبدیل نواحی بازه مدیریت استثنا (EH).
- -fdump-rtl-expand
- تخلیه پس از تولید RTL.
- -fdump-rtl-fwprop1
- -fdump-rtl-fwprop2
- گزینههای -fdump-rtl-fwprop1 و -fdump-rtl-fwprop2 تخلیه پس از دو گذر انتشار رو به جلو را فعال میکنند.
- -fdump-rtl-gcse1
- -fdump-rtl-gcse2
- گزینههای -fdump-rtl-gcse1 و -fdump-rtl-gcse2 تخلیه پس از حذف سراسری زیرعبارتهای مشترک را فعال میکنند.
- -fdump-rtl-init-regs
- تخلیه پس از مقداردهی اولیه ثباتها.
- -fdump-rtl-initvals
- تخلیه پس از محاسبه مجموعههای مقادیر اولیه.
- -fdump-rtl-into_cfglayout
- تخلیه پس از تبدیل به حالت cfglayout.
- -fdump-rtl-ira
- تخلیه پس از تخصیص تکرارشونده ثباتها.
- -fdump-rtl-jump
- تخلیه پس از دومین بهینهسازی پرش.
- -fdump-rtl-loop2
- -fdump-rtl-loop2 تخلیه پس از گذرهای بهینهسازی حلقه در RTL را فعال میکند.
- -fdump-rtl-mach
- تخلیه پس از انجام گذر بازسازماندهی وابسته به ماشین، در صورت وجود آن گذر.
- -fdump-rtl-mode_sw
- تخلیه پس از حذف تعویضهای زاید حالت.
- -fdump-rtl-rnreg
- تخلیه پس از شمارهگذاری مجدد ثباتها.
- -fdump-rtl-outof_cfglayout
- تخلیه پس از خروج از حالت cfglayout.
- -fdump-rtl-peephole2
- تخلیه پس از گذر peephole.
- -fdump-rtl-postreload
- تخلیه پس از بهینهسازیهای پس از بارگذاری مجدد (post-reload).
- -fdump-rtl-pro_and_epilogue
- تخلیه پس از تولید مقدمه و مؤخره توابع.
- -fdump-rtl-sched1
- -fdump-rtl-sched2
- گزینههای -fdump-rtl-sched1 و -fdump-rtl-sched2 تخلیه پس از گذرهای زمانبندی بلوک پایه را فعال میکنند.
- -fdump-rtl-ree
- تخلیه پس از حذف بسط با علامت/صفر.
- -fdump-rtl-seqabstr
- تخلیه پس از کشف توالیهای مشترک.
- -fdump-rtl-shorten
- تخلیه پس از کوتاهسازی انشعابها.
- -fdump-rtl-split1
- -fdump-rtl-split2
- -fdump-rtl-split3
- -fdump-rtl-split4
- -fdump-rtl-split5
- این گزینهها تخلیه پس از پنج دور تقسیم دستورالعملها را فعال میکنند.
- -fdump-rtl-sms
- تخلیه پس از زمانبندی پیمانهای (modulo scheduling). این گذر فقط روی برخی معماریها اجرا میشود.
- -fdump-rtl-stack
- تخلیه پس از تبدیل ثباتهای «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
- تخلیه پس از تقسیم بازه حیات.
- -fdump-rtl-regclass
- -fdump-rtl-subregs_of_mode_init
- -fdump-rtl-subregs_of_mode_finish
- -fdump-rtl-dfinit
- -fdump-rtl-dfinish
- این تخلیهها تعریف شدهاند اما همواره فایلهای خالی تولید میکنند.
- -da
- --dump=a
- -fdump-rtl-all
- تولید تمام تخلیههای فهرستشده در بالا.
- -dA
- --dump=A
- حاشیهنویسی خروجی اسمبلر با اطلاعات گوناگون اشکالزدایی.
- -dD
- --dump=D
- تخلیه تمام تعاریف ماکرو در انتهای پیشپردازش، علاوه بر خروجی عادی.
- -dH
- --dump=H
- تولید یک core dump هر زمان که خطایی رخ دهد.
- -dp
- --dump=p
- حاشیهنویسی خروجی اسمبلر با یادداشتی که نشان میدهد از کدام الگو و جایگزین استفاده شده است. طول و هزینه هر دستورالعمل نیز چاپ میشود.
- -dP
- --dump=P
- تخلیه RTL در خروجی اسمبلر به صورت یک توضیح (comment) پیش از هر دستورالعمل. همچنین حاشیهنویسی -dp را فعال میکند.
- -dx
- --dump=x
- تنها تولید RTL برای یک تابع به جای کامپایل کردن آن. معمولاً به همراه -fdump-rtl-expand استفاده میشود.
- -fdump-debug
- تخلیه اطلاعات اشکالزدایی تولیدشده در طول مرحله تولید اشکالزدایی.
- -fdump-earlydebug
- تخلیه اطلاعات اشکالزدایی تولیدشده در طول مرحله زودهنگام تولید اشکالزدایی.
- -fdump-noaddr
- هنگام انجام تخلیههای اشکالزدایی، از چاپ آدرسها جلوگیری میکند. این کار استفاده از diff را روی تخلیههای اشکالزدایی برای فراخوانیهای کامپایلر با باینریهای مختلف کامپایلر و/یا مکانهای شروع متفاوت text / bss / data / heap / stack / dso امکانپذیرتر میسازد.
- -freport-bug
- در صورت وقوع خطای داخلی کامپایلر (ICE)، اطلاعات اشکالزدایی را جمعآوری کرده و در یک فایل موقت تخلیه میکند.
- -fdump-unnumbered
- هنگام انجام تخلیههای اشکالزدایی، شماره دستورالعملها و خروجی آدرس را حذف میکند. این امر استفاده از diff را روی تخلیههای اشکالزدایی برای فراخوانیهای کامپایلر با گزینههای متفاوت، به ویژه با و بدون -g، عملیتر میکند.
- -fdump-unnumbered-links
- هنگام انجام تخلیههای اشکالزدایی (گزینه -d در بالا را ببینید)، شماره دستورالعملها را برای پیوندها به دستورالعملهای قبلی و بعدی در یک دنباله حذف میکند.
- -fdump-internal-locations
- تخلیه اطلاعات دقیق درباره بازنمایی داخلی GCC از مکانهای کد منبع.
- -fdump-ipa-switch
- -fdump-ipa-switch-options
- کنترل تخلیه درخت زبان در مراحل مختلف تحلیل بینرویهای (inter-procedural analysis) درون یک فایل. نام فایل با افزودن یک پسوند ویژه switch به نام فایل منبع ایجاد میشود، و فایل در همان دایرکتوری فایل خروجی تولید میگردد. تخلیههای زیر امکانپذیر هستند:
- all
- تمام تخلیههای تحلیل بینرویهای را فعال میکند.
- cgraph
- تخلیه اطلاعات مربوط به بهینهسازی گراف فراخوانی (call-graph)، حذف توابع استفادهنشده و تصمیمات درونخطیسازی (inlining).
- inline
- تخلیه پس از درونخطیسازی توابع.
- strubm
- تخلیه پس از انتخاب حالتهای "strub" و ثبت انتخابها به عنوان ویژگیهای تابع (function attributes).
- strub
- تخلیه تبدیلات "strub": تغییرات واسط (interface)، پوششدهی تابع (function wrapping) و درج فراخوانیهای توکار (builtin) برای پاکسازی پشته (stack scrubbing) و واترمارکگذاری.
علاوه بر این، گزینههای -optimized، -missed، -note و -all میتوانند مشخص شوند که معنایی مشابه با -fopt-info دارند، و مقدار پیشفرض آنها -optimized است.
به عنوان مثال، -fdump-ipa-inline-optimized-missed اطلاعات مربوط به جایگاههای فراخوانی (callsites) را که درونخطی شدهاند، به همراه جایگاههای فراخوانی که درونخطی نشدهاند منتشر میکند.
به طور پیشفرض، فایل تخلیه حاوی پیامهایی درباره بهینهسازیهای موفق (معادل با -optimized) به همراه جزئیات سطح پایین در مورد تحلیل خواهد بود.
- -fdump-ipa-clones
- ایجاد یک
فایل تخلیه
حاوی
اطلاعات
مربوط به
ایجاد
کلونهای
گره گراف
فراخوانی و
حذف
گرههای
گراف
فراخوانی
در طول
بهینهسازیها
و تبدیلات
بینرویهای.
کاربرد
اصلی مورد
نظر آن این
است که
ابزارهای
ایجاد
وصلههای
زنده (live-patches)
بتوانند
مجموعهای
از توابع را
که برای
جایگزینی
کامل یک
تابع خاص
نیاز به
وصله زنده
دارند مشخص
کنند (نگاه
کنید به -flive-patching).
نام فایل با
افزودن
پسوند
"ipa-clones" به
نام فایل
منبع ایجاد
میشود و
فایل در
همان
دایرکتوری
فایل خروجی
تولید
میگردد. هر
مدخل در
فایل در یک
خط جداگانه
قرار دارد
که شامل
فیلدهای
جداشده با
نقطه
ویرگول است.
در حالت ایجاد کلون از گراف فراخوانی، هر یک از فیلدها عبارتند از:
- 1.
- رشته "Callgraph clone".
- 2.
- نام تابعی که کلون میشود، به همان شکلی که به اسمبلر ارائه شده است.
- 3.
- عددی که تابع در حال کلونشدن را در گراف فراخوانی به صورت یکتا مشخص میکند. توجه داشته باشید که این عدد تنها درون یک واحد کامپایل یا درون تحلیل کل برنامه یکتا است اما به احتمال زیاد در این دو مرحله متفاوت خواهد بود.
- 4.
- نام فایل منبعی که تابع در آن تعریف شده است.
- 5.
- خطی که تعریف تابع در آن قرار دارد.
- 6.
- ستونی که تعریف تابع در آن قرار دارد.
- 7.
- نام کلون تابع جدید، به همان شکلی که به اسمبلر ارائه شده است.
- 8.
- عددی که کلون تابع جدید را در گراف فراخوانی به صورت یکتا مشخص میکند. توجه داشته باشید که این عدد تنها درون یک واحد کامپایل یا درون تحلیل کل برنامه یکتا است اما به احتمال زیاد در این دو مرحله متفاوت خواهد بود..IP 9. 4 نام فایل منبعی که مکان کد منبع کلون جدید به آن اشاره میکند.
- 10.
- سطری که مکان کد منبع کلون جدید به آن اشاره میکند.
- 11.
- ستونی که مکان کد منبع کلون جدید به آن اشاره میکند.
- 12.
- رشتهای که دلیل کلونسازی را مشخص میکند.
در صورت حذف کلون از گراف فراخوانی (call graph)، فیلدهای مربوطه عبارتند از:
- 1.
- رشتهٔ "Callgraph removal".
- 2.
- نام تابعی که در حال حذف است، به همان صورتی که به اسمبلیکننده ارائه میشود.
- 3.
- عددی که به طور یکتا تابع در حال کلون شدن را در گراف فراخوانی مشخص میکند. توجه داشته باشید که این عدد تنها در یک واحد کامپایل یا در تحلیل کل برنامه (whole-program analysis) یکتا است، اما به احتمال زیاد در این دو مرحله متفاوت خواهد بود.
- 4.
- نام فایل منبعی که تابع در آن تعریف شده است.
- 5.
- سطری که تعریف تابع در آن قرار دارد.
- 6.
- ستونی که تعریف تابع در آن قرار دارد.
- -fdump-lang
- برونریزی اطلاعات مختص زبان. نام فایل با افزودن .lang به نام فایل منبع ساخته میشود.
- -fdump-lang-all
- -fdump-lang-switch
- -fdump-lang-switch-options
- -fdump-lang-switch-options=filename
- کنترل برونریزی اطلاعات مختص زبان. بخشهای options و filename همانگونه که در گزینهٔ -fdump-tree توضیح داده شده رفتار میکنند. گزینهٔ -fdump-tree-all تمام برونریزیهای مختص زبان را فعال میکند؛ سایر گزینهها بسته به زبان متفاوت هستند. برای نمونه، ببینید
- -fdump-passes
- چاپ فهرست گذرهای بهینهسازی فعال یا غیرفعالشده توسط گزینههای فعلی خط فرمان روی stderr.
- -fdump-statistics-option
- فعالسازی و کنترل برونریزی آمار گذرها در فایلی جداگانه. نام فایل با افزودن پسوندی که به .statistics ختم میشود به نام فایل منبع تولید میگردد و فایل در همان دایرکتوری فایل خروجی ایجاد میشود. اگر از قالب -option استفاده شود، -stats باعث جمع بستن شمارندهها روی کل واحد کامپایل میشود، در حالی که -details تکتک رویدادها را به محض تولید توسط گذرها برونریزی میکند. حالت پیشفرض بدون هیچ گزینهای، جمع بستن شمارندهها برای هر تابع کامپایلشده است.
- -fdump-tree-all
- -fdump-tree-switch
- -fdump-tree-switch-options
- -fdump-tree-switch-options=filename
- کنترل برونریزی درخت زبان واسط در مراحل مختلف پردازش در یک فایل. اگر از قالب -options استفاده شود، options فهرستی از گزینههای جداشده با - است که جزئیات برونریزی را کنترل میکنند. همهٔ گزینهها برای همهٔ برونریزیها قابل اعمال نیستند؛ مواردی که کاربردی ندارند نادیده گرفته میشوند. گزینههای زیر در دسترس هستند
- address
- چاپ آدرس هر گره. معمولاً این گزینه معنای خاصی ندارد، چرا که بر اساس محیط و فایل منبع تغییر میکند. کاربرد اصلی آن برای مطابقت دادن یک فایل برونریزی با محیط اشکالزدایی است.
- asmname
- اگر "DECL_ASSEMBLER_NAME" برای یک اعلان مشخص تنظیم شده باشد، به جای "DECL_NAME" از آن در برونریزی استفاده میشود. کاربرد اصلی آن، سهولت در ردیابی معکوس از نامهای درهمریخته (mangled names) در فایل اسمبلی است.
- slim
- هنگام
برونریزی
بازنماییهای
واسط
فرانتاند،
از
برونریزی
اعضای یک
حوزه (scope) یا
بدنهٔ یک
تابع صرفاً
به این دلیل
که به آن
حوزه رسیده
است
جلوگیری
میکند.
تنها
مواردی
برونریزی
میشوند که
مستقیماً
از طریق
مسیر دیگری
قابل
دسترسی
باشند.
هنگام برونریزی درختهای چاپ زیبا، این گزینه از برونریزی بدنهٔ ساختارهای کنترلی جلوگیری میکند.
هنگام برونریزی RTL، خروجی RTL را به جای بازنمایی پیشفرض مشابه لیسپ (LISP-like)، به صورت مختصر (slim) چاپ میکند.
- raw
- چاپ بازنمایی خام (raw) از درخت. به طور پیشفرض، درختها با چاپ زیبا به شکلی مشابه با ساختار زبان C بازنمایی میشوند.
- details
- فعالسازی برونریزیهای دقیقتر (توسط همهٔ گزینههای برونریزی اعمال نمیشود). همچنین اطلاعات گذرهای بهینهسازی را شامل میشود.
- stats
- فعالسازی برونریزی آمارهای گوناگون دربارهٔ گذر (توسط همهٔ گزینههای برونریزی اعمال نمیشود).
- blocks
- فعالسازی نمایش مرزهای بلوک پایه (در برونریزیهای خام غیرفعال است).
- graph
- برای هر یک
از دیگر
فایلهای
برونریزی
مشخصشده
(-fdump-rtl-pass)،
بازنماییای
از گراف
جریان
کنترل که
مناسب
مشاهده با GraphViz
باشد را در
فایل file.passid.pass.dot
برونریزی
میکند. هر
تابع در
فایل به
صورت یک
زیرگراف (subgraph)
با فرمت
زیبا چاپ
میشود، تا
GraphViz بتواند
همهٔ آنها
را در یک
نمودار
واحد رسم
کند.
RTL همیشه به صورت خلاصه (slim) برونریزی میشود.
- vops
- فعالسازی نمایش عملوندهای مجازی برای هر عبارت.
- lineno
- فعالسازی نمایش شماره سطرها برای عبارتها.
- uid
- فعالسازی نمایش شناسهٔ یکتا ("DECL_UID") برای هر متغیر.
- verbose
- فعالسازی نمایش برونریزی درخت برای هر عبارت.
- eh
- فعالسازی نمایش شماره ناحیهٔ EH که هر عبارت را در بر میگیرد.
- scev
- فعالسازی نمایش جزئیات تحلیل تکامل اسکالر (scalar evolution).
- optimized
- فعالسازی نمایش اطلاعات بهینهسازی (تنها در گذرهای مشخصی موجود است).
- missed
- فعالسازی نمایش اطلاعات بهینهسازیهای از دست رفته (تنها در گذرهای مشخصی موجود است).
- note
- فعالسازی سایر اطلاعات تفصیلی بهینهسازی (تنها در گذرهای مشخصی موجود است).
- folding
- فعالسازی برونریزی اطلاعات الگوهای تطبیق و سادهسازی (match.pd)، در هنگام اعمال شدن آنها.
- all
- فعالسازی تمام گزینهها، به جز raw، slim، verbose و lineno.
- optall
- فعالسازی تمام گزینههای بهینهسازی، یعنی optimized، missed و note.
برای تعیین اینکه چه برونریزیهای درختی در دسترس هستند یا یافتن برونریزی برای یک گذر مورد نظر، مراحل زیر را دنبال کنید..IP 1. 4 کامپایلر GCC را با -fdump-passes فراخوانی کنید و در خروجی stderr بهدنبال کدی بگردید که متناظر با گذر (pass) مد نظر شماست. برای نمونه، کدهای "tree-evrp"، "tree-vrp1" و "tree-vrp2" متناظر با سه گذرِ Value Range Propagation هستند. عدد انتهای نام، فراخوانیهای متمایزِ همان گذر را تفکیک میکند.
- 2.
- برای فعالسازی ایجاد فایل تخلیه (dump file)، کد گذر را به پیشوند گزینهٔ -fdump- الحاق کرده و GCC را با آن فراخوانی کنید. برای نمونه، جهت فعالسازی خروجی تخلیه از گذر Early Value Range Propagation، کامپایلر GCC را با گزینهٔ -fdump-tree-evrp فراخوانی نمایید. بهصورت اختیاری، میتوانید نام فایل تخلیه را نیز مشخص کنید. اگر نامی تعیین نکنید، GCC آن را طبق توضیحات زیر ایجاد میکند.
- 3.
- خروجی تخلیهٔ گذر را در فایلی بیابید که نام آن از سه مؤلفه تشکیل شده و با نقطه از یکدیگر جدا شدهاند: نام فایل مبدأیی که GCC برای کامپایل آن فراخوانی شده است، یک پسوند عددی که بیانگر شمارهٔ گذر است و بهدنبال آن حرف t برای گذرهای درختی (و حرف r برای گذرهای RTL) میآید، و در نهایت کد گذر. برای نمونه، تخلیهٔ گذر Early VRP ممکن است در فایلی با نام myfile.c.038t.evrp در دایرکتوری کاری فعلی باشد. توجه داشته باشید که این کدهای عددی پایدار نیستند و ممکن است از یک نگارش GCC به نگارش دیگر تغییر کنند.
- -fopt-info
- -fopt-info-options
- -fopt-info-options=filename
- خروجیهای
تخلیهٔ
بهینهسازی
را از
گذرهای
مختلف
بهینهسازی
کنترل
میکند. اگر
از قالب -options
استفاده
شود، options
فهرستی از
کلمات
کلیدی
گزینهها
است که با -
از هم جدا
شدهاند تا
جزئیات
تخلیه و
بهینهسازیها
را انتخاب
نمایند.
میتوان options را به سه گروه تقسیم کرد:
- 1.
- گزینههایی که تعیین میکنند چه نوع پیامهایی باید صادر شوند،
- 2.
- گزینههایی که میزان پرگویی (verbosity) خروجی تخلیه را مشخص میکنند، و
- 3.
- گزینههایی که مشخص میکنند کدام بهینهسازیها باید لحاظ گردند.
گزینههای هر گروه را میتوان آزادانه با یکدیگر ترکیب کرد زیرا فاقد همپوشانی هستند. با این حال، در صورت بروز هرگونه تعارض، گزینههای پسین در خط فرمان بر گزینههای پیشین اولویت یافته و جایگزین آنها میشوند.
گزینههای زیر کنترل میکنند که چه نوع پیامهایی باید صادر شوند:
- optimized
- چاپ اطلاعات هنگام اعمال موفقیتآمیز یک بهینهسازی. تعیین اینکه کدام اطلاعات مرتبط هستند بر عهدهٔ گذر است. برای نمونه، گذرهای بردارساز (vectorizer) موقعیت حلقههایی را در کد مبدأ چاپ میکنند که با موفقیت برداریسازی شدهاند.
- missed
- چاپ اطلاعات دربارهٔ بهینهسازیهای ازدسترفته. هر گذر بهطور مجزا مشخص میکند چه اطلاعاتی در خروجی گنجانده شود.
- note
- چاپ اطلاعات تفصیلی دربارهٔ بهینهسازیها، مانند برخی دگرگونیها، پیامهای با جزئیات بیشتر دربارهٔ تصمیمگیریها و غیره.
- all
- چاپ اطلاعات با جزئیات دربارهٔ بهینهسازی. این شامل optimized، missed و note است.
گزینهٔ زیر میزان پرگویی تخلیه را کنترل میکند:
- internals
- بهطور پیشفرض، فقط پیامهای «سطح بالا» صادر میشوند. این گزینه پیامهای اضافی و با جزئیات بیشتر را فعال میکند که احتمالاً تنها برای توسعهدهندگان GCC حائز اهمیت خواهند بود.
یک یا چند کلمهٔ کلیدی زیر را میتوان برای توصیف گروهی از بهینهسازیها به کار برد:
- ipa
- فعالسازی تخلیه از تمام بهینهسازیهای بینروالی (interprocedural).
- loop
- فعالسازی تخلیه از تمام بهینهسازیهای حلقه.
- inline
- فعالسازی تخلیه از تمام بهینهسازیهای درونخطیسازی (inlining).
- omp
- فعالسازی تخلیه از تمام بهینهسازیهای OMP (تخلیه بار محاسباتی و چندپردازشی).
- vec
- فعالسازی تخلیه از تمام بهینهسازیهای برداریسازی (vectorization).
- optall
- فعالسازی تخلیه از تمام بهینهسازیها. این یک ابرمجموعه از گروههای بهینهسازی ذکرشده در بالاست.
اگر options حذف شود، مقدار پیشفرض آن optimized-optall خواهد بود، به این معنی که پیامهای مربوط به بهینهسازیهای موفقیتآمیز از تمام گذرها تخلیه شده و از پیامهایی که بهعنوان «داخلی» (internals) تلقی میشوند صرفنظر میگردد.
اگر filename ارائه شود، خروجیهای تخلیه از تمام بهینهسازیهای قابلاعمال در filename الحاق و تجمیع میشوند. در غیر این صورت، خروجی تخلیه در stderr فرستاده میشود. هرچند چندین گزینهٔ -fopt-info پذیرفته میشود، تنها یکی از آنها میتواند حاوی یک filename باشد. اگر نامهای فایل دیگری مشخص شوند، به جز نخستین گزینه، سایر موارد نادیده گرفته میشوند.
توجه داشته باشید که در صورت وجود چندین واحد ترجمه، فایل خروجی 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 تولید میشود که شامل تخلیههای ارائهشده از بردارساز پیرامون فرصتهای ازدسترفته است. یک فایل SRCFILE.opt-record.json.gz با ذکر جزئیات بهینهسازیهای انجامشده، برای آن دسته از بهینهسازیهایی که از -fopt-info پشتیبانی میکنند، مینویسد.
این گزینه آزمایشی است و قالب دادههای درون فایل فشردهٔ JSON ممکن است تغییر کند.
این گزینه تقریباً معادل یک نسخهٔ ماشینخوان از -fopt-info-all است، بهصورت مجموعهای از پیامها به همراه فایل منبع، شماره خط و شماره ستون، با دادههای اضافی زیر برای هر پیام:
- تعداد دفعات اجرای کدی که در حال بهینهسازی است، به همراه فرادادهای درباره اینکه آیا این مقدار از دادههای واقعی پروفایلسازی بهدست آمده یا صرفاً یک برآورد است، که به مصرفکنندگان اجازه میدهد پیامها را بر اساس میزان داغی (hotness) کد اولویتبندی کنند،
- نام تابعِ کدی که در حال بهینهسازی است، در صورت امکان،
- «زنجیرهٔ درونخطیسازی» (inlining chain) برای کدی که در حال بهینهسازی است، به طوری که وقتی یک تابع در چندین مکان مختلف درونخطی میشود (که ممکن است خودشان نیز درونخطی شده باشند)، خواننده بتواند نسخهها را از یکدیگر تشخیص دهد،
- اشیایی که آن بخشهایی از پیام را که به عبارتها، دستورها یا گرههای جدول نماد ارجاع دارند، اینکه جزء کدامیک از این دستهها هستند، و در صورت موجود بودن، مکان آنها در کد منبع را مشخص میکنند،
- گذر GCC که پیام را صادر کرده است، و
- مکانی در کد خود GCC که پیام از آنجا صادر شده است
علاوه بر این، برخی از پیامها بهطور منطقی درون پیامهای دیگر تو در تو هستند، که بازتابدهندهٔ جزئیات پیادهسازی گذرهای بهینهسازی است.
- -fsched-verbose=n
- در
مقصدهایی
که از
زمانبندی
دستورالعمل
استفاده
میکنند،
این گزینه
مقدار
خروجی
اشکالزداییای
را که
زمانبند
در
فایلهای dump
مینویسد
کنترل
میکند.
به ازای n بزرگتر از صفر، -fsched-verbose همان اطلاعات -fdump-rtl-sched1 و -fdump-rtl-sched2 را خروجی میدهد. برای n بزرگتر از یک، احتمالات بلوک پایه (basic block)، اطلاعات دقیق فهرست آماده و اطلاعات واحد/دستورالعمل (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 نمایش داده میشود، و نامهای گذرها را میتوان با استفاده از گزینهٔ -fdump-passes خروجی گرفت (dump کرد).
- -fdisable-tree-pass
- -fdisable-tree-pass=range-list
- گذر tree با نام pass را غیرفعال میکند. برای شرح آرگومانهای گزینه به -fdisable-rtl مراجعه کنید.
- -fenable-ipa-pass
- گذر IPA با نام pass را فعال میکند. pass نام گذر است. اگر همان گذر بهطور ایستا چندین بار در کامپایلر فراخوانی شود، یک شمارهٔ ترتیبی با شروع از ۱ باید به انتهای نام گذر افزوده شود.
- -fenable-rtl-pass
- -fenable-rtl-pass=range-list
- گذر RTL با نام pass را فعال میکند. برای شرح آرگومانهای گزینه و مثالها به -fdisable-rtl مراجعه کنید.
- -fenable-tree-pass
- -fenable-tree-pass=range-list
- گذر tree با نام pass را فعال میکند. برای شرح آرگومانهای گزینه به -fdisable-rtl مراجعه کنید.
در اینجا چند مثال آورده شده است که نحوهٔ استفاده از این گزینهها را نشان میدهند.
# disable ccp1 for all functions -fdisable-tree-ccp1 # disable complete unroll for function whose cgraph node uid is 1 -fenable-tree-cunroll=1 # disable gcse2 for functions at the following ranges [1,1], # [300,400], and [400,1000] # disable gcse2 for functions foo and foo2 -fdisable-rtl-gcse2=foo,foo2 # disable early inlining -fdisable-tree-einline # disable ipa inlining -fdisable-ipa-inline # enable tree full unroll -fenable-tree-unroll
- -fchecking
- -fchecking=n
- بررسیهای سازگاری داخلی را فعال میکند. پیشفرض به پیکربندی کامپایلر بستگی دارد. -fchecking=2 بررسیهای سازگاری داخلی بیشتری را فعال میکند که ممکن است بر تولید کد تأثیر بگذارند.
- -frandom-seed=string
- این گزینه
بذری (seed) را
فراهم
میکند که GCC
بهجای
اعداد
تصادفی در
تولید
نامهای
نماد خاصی
استفاده
میکند که
باید در هر
فایل
کامپایلشده
متفاوت
باشند.
همچنین
برای قرار
دادن
مُهرهای
یکتا در
فایلهای
دادهٔ پوشش
(coverage) و
فایلهای
شیءِ
تولیدکنندهٔ
آنها
استفاده
میشود.
میتوانید
از گزینهٔ
-frandom-seed برای
تولید
فایلهای
شیءِ
بازتولیدپذیر
و دقیقاً
یکسان
استفاده
کنید.
مقدار string میتواند یک عدد (دهدهی، هشتهشتی یا شانزدهشانزدهی) یا یک رشتهٔ دلخواه باشد (که در این حالت با محاسبهٔ CRC32 به یک عدد تبدیل میشود).
مقدار string باید برای هر فایلی که کامپایل میکنید متفاوت باشد.
- -save-temps
- --save-temps
- فایلهای
میانی
معمولاً
«موقت» را
بهطور
دائمی
ذخیره
میکند؛
آنها را
طبق آنچه
ذیل -dumpbase و -dumpdir
شرح داده
شده،
بهعنوان
فایلهای
خروجی کمکی
نامگذاری
میکند.
هنگامی که در ترکیب با گزینهٔ خط فرمان -x استفاده شود، -save-temps آنقدر هوشمند است که از بازنویسی روی یک فایل منبع ورودی با پسوند مشابه با یک فایل میانی جلوگیری کند. فایل میانی متناظر را میتوان با تغییر نام فایل منبع قبل از استفاده از -save-temps به دست آورد.
- -save-temps=cwd
- معادل با -save-temps -dumpdir ./ است.
- -save-temps=obj
- معادل با -save-temps -dumpdir outdir/ است، که در آن outdir/ دایرکتوری فایل خروجی مشخصشده پس از گزینهٔ -o، از جمله هرگونه جداکنندهٔ دایرکتوری است. اگر گزینهٔ -o استفاده نشود، سوییچ -save-temps=obj مانند -save-temps=cwd رفتار میکند..IP -specs=file 4
- --specs=file
- --specs file
- پردازش file پس از آنکه کامپایلر فایل استاندارد specs را خواند، به منظور بازنویسی پیشفرضهایی که برنامهٔ راهانداز gcc هنگام تعیین سوییچهای ارسالی به cc1، cc1plus، as، ld و غیره به کار میبرد. بیش از یک -specs=file میتواند در خط فرمان مشخص شود، و آنها به ترتیب، از چپ به راست پردازش میشوند.
- -time[=file]
- گزارش زمان
CPU صرفشده
توسط هر
زیرپردازش
در توالی
کامپایل.
برای
فایلهای
منبع C، این
شامل خود
کامپایلر و
اسمبلر است
(بعلاوهٔ
پیونددهنده
اگر
پیوندزنی
انجام شود).
بدون مشخص کردن فایل خروجی، خروجی به این صورت خواهد بود:
# cc1 0.12 0.01 # as 0.00 0.01
نخستین عدد در هر خط، «زمان کاربر» است، یعنی زمانی که صرف اجرای خود برنامه شده است. عدد دوم «زمان سیستم» است، زمانی که صرف اجرای روالهای سیستمعامل از طرف برنامه شده است. هر دو عدد بر حسب ثانیه هستند.
با مشخص کردن یک فایل خروجی، خروجی به انتهای فایل نامبرده الحاق میشود، و به این صورت خواهد بود:
0.12 0.01 cc1 <options> 0.00 0.01 as <options>
«زمان کاربر» و «زمان سیستم» به پیش از نام برنامه منتقل میشوند، و گزینههای ارسالشده به برنامه نمایش داده میشوند، تا بعداً بتوان فهمید چه فایلی، و با چه گزینههایی در حال کامپایل بوده است.
- -fdump-final-insns[=file]
- تخلیهٔ (dump) بازنمایی درونی نهایی (RTL) در file. اگر آرگومان اختیاری حذف شود (یا اگر file برابر با "." باشد)، نام فایل dump با الحاق ".gkd" به نام پایهٔ dump تعیین میشود؛ -dumpbase را ببینید.
- -fcompare-debug[=opts]
- اگر هیچ
خطایی در
طول
کامپایل رخ
ندهد،
کامپایلر
را برای بار
دوم اجرا
میکند، و
opts و -fcompare-debug-second را
به
آرگومانهای
ارسالی به
کامپایل
دوم
میافزاید.
بازنمایی
درونی
نهایی در هر
دو کامپایل
dump میشود، و
در صورت
وجود
تفاوت، یک
خطا چاپ
میکند.
اگر علامت مساوی حذف شود، مقدار پیشفرض -gtoggle استفاده میشود.
متغیر محیطی GCC_COMPARE_DEBUG، در صورت تعریف شدن، غیرخالی بودن و غیرصفر بودن، بهطور ضمنی -fcompare-debug را فعال میکند. اگر GCC_COMPARE_DEBUG با یک رشته که با خط تیره آغاز میشود تعریف شده باشد، برای opts استفاده میشود؛ در غیر این صورت، مقدار پیشفرض -gtoggle به کار میرود.
-fcompare-debug=، با علامت مساوی اما بدون opts، معادل -fno-compare-debug است، که dump کردن بازنمایی نهایی و کامپایل دوم را غیرفعال کرده و حتی از اثرگذاری 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
- تغییر وضعیت (toggle) گزینهٔ -fvar-tracking-assignments، به همان شیوهای که -gtoggle وضعیت -g را تغییر میدهد.
- -Q
- هنگامی که
پیش از --help= در
خط فرمان به
کار رود، -Q
به عنوان
تغییردهندهٔ
خروجی
راهنما عمل
میکند.
در غیر این صورت، این گزینه باعث میشود کامپایلر نام هر تابع را هنگام کامپایل شدن چاپ کند، و آمارهایی دربارهٔ هر گذر (pass) پس از پایان آن نمایش دهد.
- -ftime-report
- باعث
میشود
کامپایلر
پس از
اتمام،
آمارهایی
را دربارهٔ
زمان
مصرفشده
توسط هر گذر
در stderr چاپ کند.
اگر خروجی SARIF برای پیامهای تشخیصی از طریق -fdiagnostics-format=sarif-file یا -fdiagnostics-format=sarif-stderr درخواست شده باشد، اطلاعات -ftime-report در عوض در قالب JSON و به عنوان بخشی از خروجی SARIF صادر میشود. ساختار دقیق این دادههای JSON ممکن است تغییر کند، و به دلیل ثبت شدن در مکانی کمی متفاوت درون کامپایلر، مقادیر ممکن است دقیقاً با موارد صادرشده به stderr مطابقت نداشته باشند.
- -ftime-report-details
- زمان مصرفشده توسط بخشهای زیرساختی را برای هر گذر به صورت جداگانه ثبت میکند.
- -fira-verbose=n
- کنترل میزان جزئیات فایل dump برای تخصیصدهندهٔ یکپارچهٔ ثبات (IRA). مقدار پیشفرض 5 است. اگر مقدار n بزرگتر یا مساوی با 10 باشد، خروجی dump با همان قالبِ n منهای 10 به stderr فرستاده میشود.
- -flto-report
- گزارشی با
جزئیات
درونی
دربارهٔ
نحوهٔ
کارکرد
بهینهساز
زمان پیوند
(LTO) چاپ
میکند.
محتویات
این گزارش
از نسخهای
به نسخهٔ
دیگر
متفاوت است.
هدف آن مفید
بودن برای
توسعهدهندگان
GCC هنگام
پردازش
فایلهای
شیء در حالت
LTO (از طریق -flto)
است.
بهطور پیشفرض غیرفعال است.
- -flto-report-wpa
- مانند -flto-report، اما گزارش را تنها برای فاز WPA از بهینهسازی زمان پیوند چاپ میکند.
- -fmem-report
- باعث میشود کامپایلر پس از پایان، آمارهایی دربارهٔ تخصیص حافظهٔ دائمی چاپ کند.
- -fmem-report-wpa
- باعث میشود کامپایلر آمارهایی دربارهٔ تخصیص حافظهٔ دائمی را تنها برای فاز WPA چاپ کند.
- -fpre-ipa-mem-report
- -fpost-ipa-mem-report
- باعث میشود کامپایلر آمارهایی دربارهٔ تخصیص حافظهٔ دائمی را قبل یا بعد از بهینهسازی بینروالی (IPA) چاپ کند.
- -fmultiflags
- این گزینه
امکان
استفاده از
"TFLAGS"
آگاه از
چندکتابخانهای
(multilib) را برای
ساخت
کتابخانههای
مقصد با
گزینههایی
متفاوت از
آنچه
کامپایلر
بهطور
پیشفرض
برای
استفاده
پیکربندی
شده است، از
طریق
مشخصات (specs)
تنظیمشده
توسط
بخشهای
درونی
کامپایلر،
توسط هدف،
یا توسط
سازندگان
در زمان
پیکربندی
فراهم
میکند.
همانند "TFLAGS"، این گزینه اجازه میدهد کتابخانههای مقصد برای محیطهای پایهٔ سازگار و قابلحمل ساخته شوند، در حالی که پیشفرضهای کامپایلر روی محیطهای پیشرفتهتر تنظیم شده باشند. این ویژگی سودمند است زیرا اگر پیشفرضها برای محیط مقصد بهینه نباشند، کاربران میتوانند پیشفرضهای پیکربندیشدهٔ کامپایلر را برای ساخت برنامههای خود بهسادگی تغییر دهند، در حالی که بازسازی کتابخانههای زمان اجرا معمولاً به این آسانی یا مطلوب نیست.
برخلاف "TFLAGS"، استفاده از specs امکان انتخاب پرچمهای متفاوت برای multilibهای گوناگون را فراهم میسازد. روش انجام آن، ساخت با دستور make TFLAGS=-fmultiflags پس از پیکربندی با --with-specs=%{fmultiflags:...} است.
این گزینه پس از پایان پردازش self specهای درایور، توسط درایور کنار گذاشته میشود.
همچنین برای بررسی اینکه آیا "TFLAGS" برای ساخت همهٔ کتابخانههای مقصد به کار میرود یا خیر، پیکربندی یک کامپایلر غیر خودراهانداز (non-bootstrap) با --with-specs='%{!fmultiflags:%emissing TFLAGS}' و سپس ساخت کامپایلر و کتابخانههای مقصد مفید است..IP -fprofile-report 4 باعث میشود کامپایلر آماری را دربارهٔ سازگاری نمایهٔ (تخمینزدهشده) و تأثیر هر یک از گذرها (passes) چاپ کند.
- -fstack-usage
- باعث میشود کامپایلر اطلاعات میزان استفاده از پشته را برای برنامه، بهتفکیک هر تابع، در خروجی ارائه دهد. نام فایل برای ثبت این دادهها (dump) با افزودن .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 برای ۱۰ فراخوانی اول برگردانده میشود.
- -print-autofdo-gcov-version
- --print-autofdo-gcov-version
- نسخهٔ فعلی GCOV مورد استفاده توسط زیرساخت AutoFDO را چاپ میکند.
- -print-file-name=library
- --print-file-name=library
- --print-file-name library
- نام مطلق و کامل فایل کتابخانهٔ library را که هنگام پیوند (link) استفاده خواهد شد چاپ میکند---و هیچ کار دیگری انجام نمیدهد. با این گزینه، GCC هیچ چیز را کامپایل یا پیوند نمیکند؛ فقط نام فایل را چاپ میکند.
- -print-multi-directory
- --print-multi-directory
- نام دایرکتوری متناظر با multilib انتخابشده توسط هر یک از سوییچهای دیگر خط فرمان را چاپ میکند. فرض بر این است که این دایرکتوری در GCC_EXEC_PREFIX وجود دارد.
- -print-multi-lib
- --print-multi-lib
- نگاشت نام دایرکتوریهای multilib به سوییچهای کامپایلر را که آنها را فعال میکنند، چاپ میکند. نام دایرکتوری با یک ; از سوییچها جدا میشود، و هر سوییچ به جای - با یک @ شروع میشود، بدون هیچ فاصلهای میان سوییچهای چندگانه. هدف از این کار تسهیل پردازش در شل است.
- -print-multi-os-directory
- --print-multi-os-directory
- مسیر کتابخانههای سیستمعامل برای multilib انتخابشده را، نسبت به یک زیردایرکتوری lib چاپ میکند. اگر کتابخانههای سیستمعامل در زیردایرکتوری lib موجود باشند و از هیچ multilibای استفاده نشود، این معمولاً فقط . است؛ اگر کتابخانههای سیستمعامل در دایرکتوریهای همسطحِ libsuffix موجود باشند، برای مثال ../lib64، ../lib یا ../lib32 را چاپ میکند، یا اگر کتابخانههای سیستمعامل در زیردایرکتوریهای lib/subdir قرار داشته باشند، عناوینی مانند amd64، sparcv9 یا ev6 را چاپ میکند.
- -print-multiarch
- --print-multiarch
- مسیر کتابخانههای سیستمعامل را برای معماری چندگانهٔ (multiarch) انتخابشده، نسبت به یک زیردایرکتوری lib چاپ میکند.
- -print-prog-name=program
- --print-prog-name=program
- --print-prog-name program
- مشابه -print-file-name، اما برای برنامهای مانند cpp جستجو میکند.
- -print-libgcc-file-name
- --print-libgcc-file-name
- همانند
-print-file-name=libgcc.a.
این گزینه زمانی مفید است که از -nostdlib یا -nodefaultlibs استفاده میکنید اما مایلید با libgcc.a پیوند برقرار کنید. میتوانید اینگونه عمل کنید:
gcc -nostdlib <files>... `gcc -print-libgcc-file-name`
- -print-search-dirs
- --print-search-dirs
- نام
دایرکتوری
نصب
پیکربندیشده
و فهرستی از
دایرکتوریهای
برنامه و
کتابخانهای
را که gcc
جستجو
میکند چاپ
میکند---و
هیچ کار
دیگری
انجام
نمیدهد.
این گزینه زمانی مفید است که gcc پیام خطای installation problem, cannot exec cpp0: No such file or directory را چاپ میکند. برای برطرف کردن این مشکل یا باید cpp0 و سایر اجزای کامپایلر را در جایی که gcc انتظار دارد قرار دهید، یا متغیر محیطی GCC_EXEC_PREFIX را روی دایرکتوری محل نصب آنها تنظیم کنید. علامت / انتهایی را فراموش نکنید.
- -print-sysroot
- --print-sysroot
- دایرکتوری sysroot مقصد را که در طول کامپایل استفاده میشود، چاپ میکند. این همان sysroot مقصدی است که در زمان configure یا با استفاده از گزینهٔ --sysroot مشخص شده است؛ احتمالاً همراه با یک پسوند اضافی که به گزینههای کامپایل بستگی دارد. اگر هیچ sysroot مقصدی مشخص نشده باشد، این گزینه چیزی چاپ نمیکند.
- -print-sysroot-headers-suffix
- --print-sysroot-headers-suffix
- پسوند اضافهشده به sysroot مقصد را هنگام جستجوی سرآیندها چاپ میکند، یا در صورتی که کامپایلر با چنین پسوندی پیکربندی نشده باشد خطا میدهد---و هیچ کار دیگری انجام نمیدهد.
- -dumpmachine
- ماشین مقصد کامپایلر را (برای مثال، i686-pc-linux-gnu) چاپ میکند---و هیچ کار دیگری انجام نمیدهد.
- -dumpversion
- نسخهٔ کامپایلر را (برای مثال 3.0، 6.3.0 یا 7) چاپ میکند---و هیچ کار دیگری انجام نمیدهد. این نسخهٔ کامپایلر است که در مسیرهای فایلسیستم و specs استفاده میشود. بسته به نحوهٔ پیکربندی کامپایلر، این مقدار میتواند تنها یک عدد (نسخهٔ اصلی یا major)، دو عدد جداشده با نقطه (نسخهٔ اصلی و فرعی یا major و minor) یا سه عدد جداشده با نقطه (نسخهٔ اصلی، فرعی و سطح وصله یا patchlevel) باشد..IP -dumpfullversion 4 نسخه کامل کامپایلر را چاپ میکند---و کار دیگری انجام نمیدهد. خروجی همیشه سه عدد است که با نقطه از هم جدا شدهاند: نسخه اصلی (major)، فرعی (minor) و وصله (patchlevel).
- -dumpspecs
- مشخصات (specs) توکار کامپایلر را چاپ میکند---و کار دیگری انجام نمیدهد. (این گزینه هنگام ساخت خود GCC استفاده میشود.)
- --param name=value
- --param=name=value
- بهطور
قراردادی،
GCC به جای
استفاده از
مقادیر
ثابت
سختکدشده،
از
پارامترهایی
استفاده
میکند که
میتوان
آنها را در
خط فرمان
مشخص کرد تا
محدودیتهای
دلخواه یا
قواعد
تجربی (heuristics)
کامپایلر
را نشان
دهند.
بسیاری از
پارامترها
به
بهینهسازی
مربوط
میشوند؛
برای مثال،
GCC توابعی را
که بیش از
تعداد
مشخصی
دستورالعمل
داشته
باشند
درونخطی (inline)
نمیکند.
تحلیلگر
ایستا (static analyzer)
نیز به همین
ترتیب از
پارامترها
برای محدود
کردن
پیچیدگی
استفاده
میکند،
بهینهسازی
زمان پیوند
(link-time optimization) از
پارامترها
برای کنترل
بخشبندی
استفاده
میکند و
غیره.
پارامترهای
دیگر
جنبههایی
از GCC را
کنترل
میکنند که
کاملاً
داخلی
هستند،
مانند
تخصیص
حافظه و
راهبرد
بازیافت
حافظه (garbage collection).
موارد دیگر
رفتارهای
خاص معماری
هدف را
کنترل
میکنند.
گزینه --param یک رابط یکپارچه برای مشخص کردن مقادیر این پارامترهای کامپایلر فراهم میکند. با این حال، نام پارامترهای خاص و معنای مقادیر آنها به سازوکارهای درونی کامپایلر وابسته است و ممکن است بدون اطلاع قبلی در نسخههای آینده تغییر کند. شما نباید برای کامپایل صحیح برنامه خود به تنظیمات این پارامترها وابسته باشید. این پارامترها برای راحتی توسعهدهندگان در اشکالزدایی مشکلات کامپایل یا در برخی موارد، برای ارائه راهحلهای موقت (workarounds) در برابر باگهای کامپایلر از طریق خط فرمان در دسترس قرار گرفتهاند.
گزینههای وابسته به معماری هدف (Target-Specific Options)
هر ماشین هدفی که توسط GCC پشتیبانی میشود میتواند گزینههای خاص خود را داشته باشد---برای مثال، تا به شما امکان دهد برای یک نوع پردازنده یا ABI خاص کامپایل کنید، یا بهینهسازیهای مختص آن ماشین را کنترل نمایید. بهطور مشابه، GCC همچنین دارای گزینههایی است که مخصوص سیستمعاملها یا محیطهای زمان اجرای خاص در سیستم هدف هستند.
بهطور قراردادی، نام گزینههای مختص ماشین با -m آغاز میشود. برخی پیکربندیهای کامپایلر نیز از گزینههای وابسته به هدف اضافی پشتیبانی میکنند که معمولاً برای سازگاری با سایر کامپایلرها روی همان پلتفرم است.
گزینههای AArch64
این گزینهها برای پیادهسازیهای AArch64 تعریف شدهاند:
- -mabi=name
- برای مدل
داده
مشخصشده
کد تولید
میکند.
مقادیر
مجاز
عبارتند از
ilp32 برای مدل
داده شبه SysV
که در آن int، long int
و
اشارهگرها
۳۲ بیتی
هستند، و lp64
برای مدل
داده شبه SysV
که در آن int ۳۲
بیتی است
اما long int و
اشارهگرها
۶۴ بیتی
هستند.
مقدار پیشفرض به پیکربندی معماری هدف خاص بستگی دارد. توجه داشته باشید که ABIهای LP64 و ILP32 از نظر پیوند سازگار نیستند؛ شما باید تمام برنامه خود را با همان ABI کامپایل کنید و با مجموعهای از کتابخانههای سازگار پیوند دهید.
مدل ilp32 منسوخ شده است.
- -mbig-endian
- کد با ترتیب بایت بزرگانتهای (big-endian) تولید میکند. این پیشفرض است زمانی که GCC برای یک هدف aarch64_be-*-* پیکربندی شده باشد.
- -mlittle-endian
- کد با ترتیب بایت کوچکانتهای (little-endian) تولید میکند. این پیشفرض است زمانی که GCC برای یک هدف aarch64-*-* پیکربندی شده باشد، اما نه برای یک هدف aarch64_be-*-*.
- -menable-sysreg-checking
- در صورتی که تلاشی برای دسترسی به یک ثبات سیستم (system register) که روی معماری هدف موجود نیست صورت گیرد، پیام خطا تولید میکند.
- -mgeneral-regs-only
- کدی تولید میکند که فقط از ثباتهای همهمنظوره استفاده میکند. این کار کامپایلر را از استفاده از ثباتهای ممیز شناور (floating-point) و Advanced SIMD باز میدارد، اما هیچ محدودیتی بر اسمبلر اعمال نمیکند.
- -mcmodel=tiny
- کد را برای مدل کد ناچیز (tiny) تولید میکند. برنامه و نمادهای ایستا تعریفشده آن باید در فاصله 1MB از یکدیگر قرار گیرند. برنامهها میتوانند بهصورت ایستا یا پویا پیوند داده شوند.
- -mcmodel=small
- کد را برای مدل کد کوچک (small) تولید میکند. برنامه و نمادهای ایستا تعریفشده آن باید در فاصله 4GB از یکدیگر قرار گیرند. برنامهها میتوانند بهصورت ایستا یا پویا پیوند داده شوند. این مدل کد پیشفرض است.
- -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
- اندازه بیتی آفستهای بیدرنگ (immediate) در TLS را مشخص میکند. مقادیر معتبر عبارتند از 12، 24، 32 و 48. این گزینه نیازمند binutils نسخه 2.26 یا جدیدتر است.
- -mfix-cortex-a53-835769
- -mno-fix-cortex-a53-835769
- راهحل موقت برای نقص فنی (erratum) شماره 835769 در ARM Cortex-A53 را فعال یا غیرفعال میکند. این شامل قرار دادن یک دستورالعمل NOP بین دستورالعملهای حافظه و دستورالعملهای ضرب-تجمع (multiply-accumulate) اعداد صحیح ۶۴ بیتی است. اگر در خط فرمان معماری یا پردازندهای مشخص شود که به این راهحل نیازی ندارد، این پرچم نادیده گرفته خواهد شد.
- -mfix-cortex-a53-843419
- -mno-fix-cortex-a53-843419
- راهحل موقت برای نقص فنی شماره 843419 در ARM Cortex-A53 را فعال یا غیرفعال میکند. راهحل این نقص فنی در زمان پیوند انجام میشود و این گزینه فقط پرچم مربوطه را به پیونددهنده (linker) ارسال میکند. اگر در خط فرمان معماری یا پردازندهای مشخص شود که به این راهحل نیازی ندارد، این پرچم نادیده گرفته خواهد شد.
- -mlow-precision-recip-sqrt
- -mno-low-precision-recip-sqrt
- تقریب جذر معکوس (reciprocal square root) را فعال یا غیرفعال میکند. این گزینه تنها در صورتی تأثیر دارد که -ffast-math یا -funsafe-math-optimizations نیز استفاده شده باشد. فعال کردن این گزینه دقت نتایج جذر معکوس را برای دقت یگانه (single precision) به حدود ۱۶ بیت و برای دقت دوگانه (double precision) به ۳۲ بیت کاهش میدهد..IP -mlow-precision-sqrt 4
- -mno-low-precision-sqrt
- تقریب جذر (ریشه دوم) را فعال یا غیرفعال میکند. این گزینه تنها زمانی اثرگذار است که -ffast-math یا -funsafe-math-optimizations نیز استفاده شده باشد. فعال کردن این گزینه، دقت نتایج جذر را برای دقت یگانه (single precision) به حدود ۱۶ بیت و برای دقت دوگانه (double precision) به ۳۲ بیت کاهش میدهد. در صورت فعال بودن، بهطور ضمنی -mlow-precision-recip-sqrt را نیز در بر دارد.
- -mlow-precision-div
- -mno-low-precision-div
- تقریب تقسیم را فعال یا غیرفعال میکند. این گزینه تنها زمانی اثرگذار است که -ffast-math یا -funsafe-math-optimizations نیز استفاده شده باشد. فعال کردن این گزینه، دقت نتایج تقسیم را برای دقت یگانه به حدود ۱۶ بیت و برای دقت دوگانه به ۳۲ بیت کاهش میدهد.
- -mtrack-speculation
- -mno-track-speculation
- تولید کد اضافی برای ردیابی اجرای حدسی (speculative execution) از طریق شاخههای شرطی را فعال یا غیرفعال میکند. سپس وضعیت ردیابیشده میتواند توسط کامپایلر هنگام بسط دادن فراخوانیهای "__builtin_speculation_safe_value" به منظور تولید توالی کد کارآمدتر استفاده شود.
- -moutline-atomics
- -mno-outline-atomics
- فراخوانی
توابع کمکی
درونخطینشده
(out-of-line helpers) را برای
پیادهسازی
عملیات
اتمیک فعال
یا غیرفعال
میکند. این
توابع کمکی
در زمان
اجرا مشخص
میکنند که
آیا
میتوان از
دستورالعملهای
LSE متعلق به ARMv8.1-A
استفاده
کرد یا خیر؛
در غیر این
صورت، از
دستورالعملهای
load/store-exclusive موجود
در ISA پایهٔ ARMv8.0
استفاده
خواهند کرد.
این گزینه تنها هنگام کامپایل برای مجموعه دستورالعمل پایهٔ ARMv8.0 قابل اعمال است. در صورت استفاده از نسخههای جدیدتر، مانند -march=armv8.1-a یا -march=armv8-a+lse، دستورالعملهای ARMv8.1-Atomics مستقیماً استفاده خواهند شد. همین موضوع هنگام استفاده از -mcpu= در صورتی که پردازندهٔ انتخابشده از ویژگی lse پشتیبانی کند نیز صدق میکند. این گزینه بهطور پیشفرض فعال است.
- -mmax-vectorization
- -mno-max-vectorization
- نادیدهگرفتن (override) مدل هزینهٔ بردارساز را فعال یا غیرفعال میکند تا بردارسازی همیشه سودمند به نظر برسد. این گزینه میتواند با -mautovec-preference ترکیب شود و امکان کنترل دقیق بر روی اینکه کدام ISA برای بردارسازی خودکار استفاده شود را فراهم کند. بر خلاف -fno-vect-cost-model یا -fvect-cost-model=unlimited، این گزینه مقایسهٔ هزینه بین حالتهای برداری مختلف را خاموش نمیکند.
- -mautovec-preference=name
- یک راهبرد انتخاب ISA را برای بردارسازی خودکار تحمیل میکند. مقادیر مجاز name عبارتند از:
- default
- استفاده از روشهای اکتشافی (heuristics) پیشفرض.
- asimd-only
- تنها استفاده از Advanced SIMD برای بردارسازی خودکار.
- sve-only
- تنها استفاده از SVE برای بردارسازی خودکار.
- prefer-asimd
- استفاده از هر دو Advanced SIMD و SVE. اولویت دادن به Advanced SIMD هنگامی که هزینهها برابر برآورد شوند.
- prefer-sve
- استفاده از هر دو Advanced SIMD و SVE. اولویت دادن به SVE هنگامی که هزینهها برابر برآورد شوند.
برای بهترین کارایی اکیداً توصیه میشود بهجای آن از -mcpu یا -mtune استفاده شود. این پارامتر فقط باید برای بررسی و ارزیابی کد استفاده شود.
- -march=name
- نام معماری
هدف و در
صورت
تمایل، یک
یا چند
تغییردهندهٔ
ویژگی (feature modifier)
را مشخص
میکند. این
گزینه
دارای
ساختار
-march=arch{+[no]feature}*
است.
جدول زیر مقادیر مجاز برای arch و ویژگیهایی را که بهطور پیشفرض فعال میکنند خلاصه کرده است:
- مقدار arch : معماری : بهطور پیشفرض شامل
- armv8-a : Armv8-A : +fp, +simd
- armv8.1-a : Armv8.1-A : armv8-a, +crc, +lse, +rdma
- armv8.2-a : Armv8.2-A : armv8.1-a
- armv8.3-a : Armv8.3-A : armv8.2-a, +pauth, +fcma, +jscvt
- armv8.4-a : Armv8.4-A : armv8.3-a, +flagm, +fp16fml, +dotprod, +rcpc2
- armv8.5-a : Armv8.5-A : armv8.4-a, +sb, +ssbs, +predres, +frintts, +flagm2
- armv8.6-a : Armv8.6-A : armv8.5-a, +bf16, +i8mm
- armv8.7-a : Armv8.7-A : armv8.6-a, +wfxt, +xs
- armv8.8-a : Armv8.8-a : armv8.7-a, +mops
- armv8.9-a : Armv8.9-a : armv8.8-a
- armv9-a : Armv9-A : armv8.5-a, +sve, +sve2
- armv9.1-a : Armv9.1-A : armv9-a, +bf16, +i8mm
- armv9.2-a : Armv9.2-A : armv9.1-a, +wfxt, +xs
- armv9.3-a : Armv9.3-A : armv9.2-a, +mops
- armv9.4-a : Armv9.4-A : armv9.3-a, +sve2p1
- armv9.5-a : Armv9.5-A : armv9.4-a, cpa, +faminmax, +lut
- armv8-r : Armv8-R : armv8-r
مقدار native در سیستمهای محلی AArch64 GNU/Linux در دسترس است و باعث میشود کامپایلر معماری سیستم میزبان را انتخاب کند. این گزینه در صورتی که کامپایلر قادر به شناسایی معماری سیستم میزبان نباشد، هیچ اثری نخواهد داشت. هنگامی که -march=native داده شود و گزینهٔ دیگری از -mcpu یا -mtune مشخص نشده باشد، GCC پردازندهٔ میزبان را هم به عنوان پردازندهٔ هدف جهت تنظیم کارایی و هم جهت انتخاب ویژگیهای معماری برمیگزیند. بدین معنی که با -march=native همانند -mcpu=native رفتار میشود.
مقادیر مجاز برای feature در زیربخش مربوط به aarch64-feature-modifiers,,-march and -mcpu Feature Modifiers فهرست شدهاند. در صورت تعیین تغییردهندههای متناقض ویژگی، راستترین ویژگی اعمال میشود.
کامپایلر GCC از name برای تعیین نوع دستورالعملهایی که میتواند در زمان تولید کد اسمبلی صادر کند، استفاده مینماید. اگر -march بدون تعیین هر یک از گزینههای -mtune یا -mcpu مشخص شده باشد، کد بهگونهای بهینهسازی میشود که در طیفی از پردازندههای هدفی که معماری مورد نظر را پیادهسازی میکنند عملکرد خوبی داشته باشد.
- -mtune=name
- نام
پردازندهٔ
هدف را مشخص
میکند که GCC
باید
کارایی کد
را برای آن
تنظیم (tune) کند.
مقادیر
مجاز برای
این گزینه
عبارتند از:
generic, cortex-a35, cortex-a53, cortex-a55,
cortex-a57, cortex-a72, cortex-a73,
cortex-a75, cortex-a76, cortex-a76ae,
cortex-a77, cortex-a65, cortex-a65ae,
cortex-a34, cortex-a78, cortex-a78ae,
cortex-a78c, ares, exynos-m1, emag,
falkor, oryon-1, neoverse-512tvb, neoverse-e1,
neoverse-n1, neoverse-n2, neoverse-v1,
neoverse-v2, grace, neoverse-v3,
neoverse-v3ae, armagicpu, neoverse-n3,
olympus, rigel, cortex-a725, cortex-x925,
qdf24xx, saphira, phecda, xgene1,
vulcan, octeontx, octeontx81, octeontx83,
octeontx2, octeontx2t98, octeontx2t96
octeontx2t93, octeontx2f95, octeontx2f95n,
octeontx2f95mm, a64fx, fujitsu-monaka,
thunderx, thunderxt88, thunderxt88p1,
thunderxt81, tsv110, hip12, thunderxt83,
thunderx2t99, thunderx3t110, zeus,
cortex-a57.cortex-a53, cortex-a72.cortex-a53,
cortex-a73.cortex-a35, cortex-a73.cortex-a53,
cortex-a75.cortex-a55, cortex-a76.cortex-a55,
cortex-r82, cortex-r82ae, cortex-x1,
cortex-x1c, cortex-x2, cortex-x3, cortex-x4,
cortex-a510, cortex-a520, cortex-a520ae,
cortex-a710, cortex-a715, cortex-a720,
cortex-a720ae, ampere1, ampere1a, ampere1b,
ampere1c, cobalt-100, apple-m1, apple-m2,
apple-m3, apple-m4, apple-m5, c1-nano,
c1-pro, c1-premium c1-ultra و native.
مقادیر cortex-a57.cortex-a53، cortex-a72.cortex-a53، cortex-a73.cortex-a35، cortex-a73.cortex-a53، cortex-a75.cortex-a55، cortex-a76.cortex-a55، apple-m1، apple-m2، apple-m3 و gb10 مشخص میکنند که GCC باید برای یک سامانهٔ big.LITTLE بهینهسازی کند.
مقدار neoverse-512tvb مشخص میکند که GCC باید برای هستههای Neoverse تنظیم شود که (الف) SVE را پیادهسازی کردهاند و (ب) پهنای باند برداری کل آنها ۵۱۲ بیت در هر چرخه است. به بیان دیگر، این گزینه به GCC میگوید که کد را برای هستههای Neoverse تنظیم کند که میتوانند در هر چرخه ۴ دستورالعمل محاسباتی ۱۲۸ بیتی Advanced SIMD را اجرا کنند و تعداد معادل آن دستورالعمل محاسباتی SVE در هر چرخه انجام دهند (۲ دستورالعمل برای SVE با اندازه ۲۵۶ بیت، و ۴ دستورالعمل برای SVE با اندازه ۱۲۸ بیت). این تنظیم کلیتر از تنظیم برای یک هستهٔ خاص مانند Neoverse V1 است، اما از تنظیم پیشفرضی که در زیر شرح داده شده، خاصتر است.
علاوه بر این، در سیستمهای محلی AArch64 GNU/Linux مقدار native کارایی را متناسب با سیستم میزبان تنظیم میکند. این گزینه در صورتی که کامپایلر نتواند پردازندهٔ سیستم میزبان را شناسایی کند، هیچ اثری نخواهد داشت.
در صورتی که هیچیک از -mtune=، -mcpu= یا -march= مشخص نشده باشند، کد بهگونهای تنظیم میشود که در طیفی از پردازندههای هدف عملکرد خوبی داشته باشد.
این گزینه نمیتواند با تغییردهندههای ویژگی همراه شود..IP -mcpu=name 4 نام پردازندهٔ مقصد را مشخص میکند، که بهطور اختیاری میتواند با یک یا چند اصلاحکنندهٔ ویژگی پسوند یابد. این گزینه دارای قالب -mcpu=cpu{+[no]feature}* است، که در آن مقادیر مجاز برای cpu همان مقادیر دردسترس برای -mtune هستند. مقادیر مجاز برای feature در زیربخش مربوط به aarch64-feature-modifiers,,-march and -mcpu Feature Modifiers مستند شدهاند. در صورت تعیین اصلاحکنندههای ویژگی متناقض، راستترین ویژگی اعمال میشود.
کامپایلر GCC از name برای تعیین نوع دستورالعملهایی که میتواند هنگام تولید کد اسمبلی صادر کند (همانند -march) و برای تعیین پردازندهٔ مقصدی که کارایی برای آن تنظیم و بهینه میشود (همانند -mtune) استفاده میکند. در صورتی که این گزینه همراه با -march یا -mtune استفاده شود، آن گزینهها بر بخش مربوطه از این گزینه ارجحیت خواهند داشت.
گزینهٔ -mcpu=neoverse-512tvb از این نظر خاص است که به یک هستهٔ خاص اشاره نمیکند، بلکه به تمام هستههای Neoverse اشاره دارد که (الف) SVE را پیادهسازی کرده باشند و (ب) مجموع پهنای باند برداری ۵۱۲ بیت در هر چرخه داشته باشند. مگر اینکه توسط -march لغو شود، -mcpu=neoverse-512tvb کدی تولید میکند که میتواند روی یک هستهٔ Neoverse V1 اجرا شود، چرا که Neoverse V1 نخستین هستهٔ Neoverse با این ویژگیها است. مگر اینکه توسط -mtune لغو شود، -mcpu=neoverse-512tvb کد را همانند -mtune=neoverse-512tvb تنظیم و بهینه میکند.
- -moverride=string
- تصمیمات
بهینهسازیِ
اتخاذشده
توسط
بکاند را
در پاسخ به
سوییچ -mtune=
لغو و
بازنویسی
میکند.
تضمینی
وجود ندارد
که نحو،
معناشناسی
و مقادیر
پذیرفتهشده
برای string در
این گزینه
در بین
نسخههای
مختلف
یکسان و
سازگار
بماند.
این گزینه صرفاً برای استفاده در هنگام توسعهٔ GCC در نظر گرفته شده است.
- -mpc-relative-literal-loads
- -mno-pc-relative-literal-loads
- بارگذاریهای مقادیر لیترال وابسته به PC (یا PC-relative literal loads) را فعال یا غیرفعال میکند. با این گزینه، استخرهای لیترال با استفاده از یک دستورالعمل منفرد دردسترس قرار میگیرند و پس از هر تابع صادر میشوند. این امر حداکثر اندازهٔ توابع را به 1MB محدود میکند. این گزینه بهطور پیشفرض برای -mcmodel=tiny فعال است.
- -msign-return-address=scope
- حوزهٔ تابعی را که امضای نشانی بازگشت روی آن اعمال خواهد شد انتخاب میکند. مقادیر مجاز عبارتند از none که امضای نشانی بازگشت را غیرفعال میکند، non-leaf که امضای اشارهگر را برای توابعی که تابع برگ (leaf) نیستند فعال میسازد، و all که امضای اشارهگر را برای تمام توابع فعال میکند. مقدار پیشفرض none است. این گزینه به نفع -mbranch-protection منسوخ شده است.
- -mbranch-protection=features
- ویژگیهای
محافظت از
انشعاب
مورد
استفاده را
انتخاب
میکند. features
میتواند
یکی از
حالتهای
زیر را
داشته باشد:
none مقدار پیشفرض است و تمام انواع محافظت از انشعاب را غیرفعال میکند.
standard تمام انواع ویژگیهای محافظت از انشعاب را فعال میکند. اگر یک ویژگی دارای گزینههای تنظیم بیشتری باشد، standard آن را روی سطح استاندارد خود قرار میدهد.
pac-ret امضای نشانی بازگشت را در سطح استاندارد فعال میکند: امضای توابعی که نشانی بازگشت را در حافظه ذخیره میکنند (توابع غیربرگ عملاً همیشه این کار را انجام میدهند) با استفاده از A-key.
pac-ret+leaf امضای pac-ret را گسترش میدهد تا توابع برگ را نیز شامل شود.
از pac-ret+b-key یا pac-ret+leaf+b-key میتوان برای امضای توابع با B-key به جای A-key استفاده کرد.
bti سازوکار شناسایی مقصد انشعاب (branch target identification) را فعال میکند.
gcs تولید کد سازگار با پشتهٔ کنترل محافظتشده (guarded control stack) را فعال میکند.
- -mharden-sls=opts
- مقاومسازی کامپایلر در برابر گمانهزنی خط مستقیم (SLS) را فعال میکند. opts فهرستی از گزینههای زیر است که با کاما از یکدیگر جدا شدهاند:
علاوه بر این، -mharden-sls=all تمام مقاومسازیهای SLS را فعال میکند در حالی که -mharden-sls=none تمام مقاومسازیهای SLS را غیرفعال میسازد.
- -mearly-ra=scope
- تعیین
میکند چه
زمانی یک
گذر
زودهنگام
تخصیص ثبات
فعال شود.
این گذر پیش
از
زمانبندی
دستورالعملها
اجرا
میشود و
تلاش
میکند یک
تخصیص بدون
ریزش (spill-free)
برای کدهای
ممیز شناور
و برداری
پیدا کند.
همچنین
تلاش
میکند از
دستورالعملهای
چندثباتی
گامدار،
مانند LD1 و ST1
گامدار در
SME2 استفاده
کند.
مقادیر ممکن برای scope عبارتند از: all که این گذر را روی تمام توابع اجرا میکند؛ strided که گذر را روی توابعی اجرا میکند که به دستورالعملهای چندثباتی گامدار دسترسی دارند؛ و none که گذر را غیرفعال میسازد.
گزینهٔ -mearly-ra=all برای -O2 و بالاتر، و برای -Os پیشفرض است. در غیر این صورت -mearly-ra=none پیشفرض است.
- -mearly-ldp-fusion
- -mno-early-ldp-fusion
- نسخهای از گذر ادغام جفت بارگذاری/ذخیرهسازی (load/store pair fusion) در AArch64 را که قبل از تخصیص ثبات اجرا میشود فعال میکند. بهطور پیشفرض در -O و بالاتر فعال است.
- -mlate-ldp-fusion
- -mno-late-ldp-fusion
- نسخهای از گذر ادغام جفت بارگذاری/ذخیرهسازی در AArch64 را که بعد از تخصیص ثبات اجرا میشود فعال میکند. بهطور پیشفرض در -O و بالاتر فعال است.
- -mnarrow-gp-writes
- تبدیل نوشتنهای ثبات عمومی ۶۴ بیتی به عملیاتهای معادل ۳۲ بیتی را هنگامی که مشخص است ۳۲ بیت بالایی صفر هستند فعال میکند. این گذر را میتوان با -mnarrow-gp-writes کنترل کرد و در -O2 و بالاتر فعال است، اما بهطور پیشفرض فعال نیست، مگر برای -mcpu=olympus.
- -msve-vector-bits=bits
- تعداد
بیتها در
یک ثبات
برداری SVE را
مشخص
میکند. این
گزینه تنها
زمانی
اثرگذار
است که SVE
فعال باشد.
کامپایلر GCC از دو حالت تولید کد SVE پشتیبانی میکند: خروجی «مستقل از طول بردار» (vector-length agnostic) که با هر اندازهای از ثبات برداری کار میکند و خروجی «وابسته به طول بردار» (vector-length specific) که به GCC امکان میدهد زمانی که برای بهینهسازی مفید باشد، دربارهٔ طول بردار فرضیاتی در نظر بگیرد. مقادیر ممکن برای bits عبارتند از: scalable، 128، 256، 512، 1024 و 2048. تعیین scalable خروجی مستقل از طول بردار را برمیگزیند. در حال حاضر -msve-vector-bits=128 نیز برای مقاصد big-endian خروجی مستقل از طول بردار تولید میکند. سایر مقادیر، کد وابسته به طول بردار تولید میکنند. رفتار این مقادیر ممکن است در نسخههای آینده تغییر کند و برای تولید کدی که بین طولهای مختلف بردار سختافزاری SVE سازگار و قابلحمل باشد، نباید به مقداری جز scalable اتکا کرد.
مقدار پیشفرض -msve-vector-bits=scalable است که کد مستقل از طول بردار تولید میکند.
اصلاحکنندههای ویژگی -march و -mcpu
اصلاحکنندههای ویژگی مورد استفاده با -march و -mcpu میتوانند هر یک از موارد زیر و معکوس آنها یعنی nofeature باشند:
- crc
- افزونهٔ CRC را فعال میکند. این ویژگی بهطور پیشفرض برای -march=armv8.1-a فعال است.
- crypto
- افزونهٔ Crypto را فعال میکند. این گزینه همچنین دستورالعملهای Advanced SIMD و ممیز شناور را فعال میسازد.
- fp
- دستورالعملهای ممیز شناور را فعال میکند. این ویژگی بهطور پیشفرض برای تمام مقادیر ممکن گزینههای -march و -mcpu فعال است.
- simd
- دستورالعملهای Advanced SIMD را فعال میکند. این گزینه همچنین دستورالعملهای ممیز شناور را فعال میسازد. این ویژگی بهطور پیشفرض برای تمام مقادیر ممکن گزینههای -march و -mcpu فعال است.
- sve
- دستورالعملهای Scalable Vector Extension را فعال میکند. این گزینه همچنین دستورالعملهای Advanced SIMD و ممیز شناور را فعال میسازد.
- lse
- دستورالعملهای Large System Extension را فعال میکند. این ویژگی بهطور پیشفرض برای -march=armv8.1-a فعال است..IP rdma 4 دستورالعملهای Round Double Multiply Accumulate را فعال میکند. این گزینه بهطور پیشفرض برای -march=armv8.1-a فعال است.
- fp16
- افزونهٔ FP16 را فعال میکند. این گزینه همچنین دستورالعملهای ممیز شناور را فعال میسازد.
- fp16fml
- افزونهٔ FP16 fmla را فعال میکند. این گزینه همچنین افزونههای FP16 و دستورالعملهای ممیز شناور را فعال میسازد. این گزینه بهطور پیشفرض برای -march=armv8.4-a فعال است. استفاده از این گزینه در معماریهای پیش از Armv8.2-A پشتیبانی نمیشود.
- rcpc
- افزونهٔ RCpc را فعال میکند. این گزینه امکان استفاده از دستورالعملهای LDAPR را برای معناشناسی اتمیک بارگیری-دستیابی (load-acquire atomic semantics) فراهم ساخته و آن را به اسمبلر منتقل میکند تا دستورهای asm درونخطی بتوانند از دستورالعملهای افزونهٔ RCpc استفاده کنند.
- dotprod
- افزونهٔ Dot Product را فعال میکند. این گزینه همچنین دستورالعملهای Advanced SIMD را فعال میسازد.
- aes
- افزونهٔ رمزنگاری aes و pmull در Armv8-a را فعال میکند. این گزینه همچنین دستورالعملهای Advanced SIMD را فعال میسازد.
- sha2
- افزونهٔ رمزنگاری sha2 در Armv8-a را فعال میکند. این گزینه همچنین دستورالعملهای Advanced SIMD را فعال میسازد.
- sha3
- افزونهٔ رمزنگاری sha512 و sha3 را فعال میکند. این گزینه همچنین دستورالعملهای Advanced SIMD را فعال میسازد. استفاده از این گزینه در معماریهای پیش از Armv8.2-A پشتیبانی نمیشود.
- sm4
- افزونهٔ رمزنگاری sm3 و sm4 را فعال میکند. این گزینه همچنین دستورالعملهای Advanced SIMD را فعال میسازد. استفاده از این گزینه در معماریهای پیش از Armv8.2-A پشتیبانی نمیشود.
- profile
- افزونهٔ Statistical Profiling را فعال میکند. این گزینه صرفاً برای فعالسازی افزونه در سطح اسمبلر است و بر تولید کد تأثیری نمیگذارد.
- rng
- دستورالعملهای تولید عدد تصادفی (Random Number) در Armv8.5-a را فعال میکند. این گزینه صرفاً برای فعالسازی افزونه در سطح اسمبلر است و بر تولید کد تأثیری نمیگذارد.
- memtag
- افزونههای برچسبگذاری حافظه (Memory Tagging Extensions) در Armv8.5-a را فعال میکند. استفاده از این گزینه در معماریهای پیش از Armv8.5-A پشتیبانی نمیشود.
- sb
- دستورالعمل Speculation Barrier در Armv8-a را فعال میکند. این گزینه صرفاً برای فعالسازی افزونه در سطح اسمبلر است و بر تولید کد تأثیری نمیگذارد. این گزینه بهطور پیشفرض برای -march=armv8.5-a فعال است.
- ssbs
- دستورالعمل Speculative Store Bypass Safe در Armv8-a را فعال میکند. این گزینه صرفاً برای فعالسازی افزونه در سطح اسمبلر است و بر تولید کد تأثیری نمیگذارد. این گزینه بهطور پیشفرض برای -march=armv8.5-a فعال است.
- predres
- دستورالعملهای Execution and Data Prediction Restriction در Armv8-a را فعال میکند. این گزینه صرفاً برای فعالسازی افزونه در سطح اسمبلر است و بر تولید کد تأثیری نمیگذارد. این گزینه بهطور پیشفرض برای -march=armv8.5-a فعال است.
- sve2
- افزونهٔ Scalable Vector Extension 2 در Armv8-a را فعال میکند. این گزینه همچنین دستورالعملهای SVE را فعال میسازد.
- sve2-bitperm
- دستورالعملهای SVE2 bitperm را فعال میکند. این گزینه همچنین دستورالعملهای SVE2 را فعال میسازد.
- sve2-sm4
- دستورالعملهای SVE2 sm4 را فعال میکند. این گزینه همچنین دستورالعملهای SVE2 را فعال میسازد.
- sve2-aes
- دستورالعملهای SVE2 aes را فعال میکند. این گزینه همچنین دستورالعملهای SVE2 را فعال میسازد.
- sve2-sha3
- دستورالعملهای SVE2 sha3 را فعال میکند. این گزینه همچنین دستورالعملهای SVE2 را فعال میسازد.
- sve2p1
- دستورالعملهای SVE2.1 را فعال میکند. این گزینه همچنین دستورالعملهای SVE2 را فعال میسازد.
- tme
- افزونهٔ حافظهٔ تراکنشی (Transactional Memory Extension) را فعال میکند.
- i8mm
- دستورالعملهای ضرب ماتریس عدد صحیح ۸ بیتی را فعال میکند. این گزینه همچنین دستورالعملهای Advanced SIMD و ممیز شناور را فعال میسازد. این گزینه بهطور پیشفرض برای -march=armv8.6-a فعال است. استفاده از این گزینه در معماریهای پیش از Armv8.2-A پشتیبانی نمیشود.
- f32mm
- دستورالعملهای ضرب ماتریس ممیز شناور ۳۲ بیتی را فعال میکند. این گزینه همچنین دستورالعملهای SVE را فعال میسازد. استفاده از این گزینه در معماریهای پیش از Armv8.2-A پشتیبانی نمیشود.
- f64mm
- دستورالعملهای ضرب ماتریس ممیز شناور ۶۴ بیتی را فعال میکند. این گزینه همچنین دستورالعملهای SVE را فعال میسازد. استفاده از این گزینه در معماریهای پیش از Armv8.2-A پشتیبانی نمیشود.
- bf16
- دستورالعملهای ممیز شناور با دقت نیمه brain (brain half-precision) را فعال میکند. این گزینه همچنین دستورالعملهای Advanced SIMD و ممیز شناور را فعال میسازد. این گزینه بهطور پیشفرض برای -march=armv8.6-a فعال است. استفاده از این گزینه در معماریهای پیش از Armv8.2-A پشتیبانی نمیشود.
- ls64
- دستورالعملهای بارگیری و ذخیرهٔ اتمیک ۶۴ بایتی را برای شتابدهندهها فعال میکند.
- mops
- دستورالعملهای تسریع عملیات حافظه مانند "memcpy"، "memmove" و "memset" را فعال میکند. این گزینه بهطور پیشفرض برای -march=armv8.8-a فعال است.
- flagm
- افزونهٔ دستورالعملهای دستکاری پرچم (Flag Manipulation instructions Extension) را فعال میکند.
- flagm2
- دستورالعملهای تبدیل پرچم FlagM2 را فعال میکند.
- pauth
- افزونهٔ اصالتسنجی اشارهگر (Pointer Authentication Extension) را فعال میکند.
- cssc
- دستورالعملهای فشردهسازی توالی کوتاه مشترک (Common Short Sequence Compression) را فعال میکند.
- cmpbr
- دستورالعملهای کوتاهتر مقایسه و انشعاب، یعنی "cbb"، "cbh" و "cb" را فعال میکند.
- sme
- افزونهٔ ماتریس مقیاسپذیر (Scalable Matrix Extension) را فعال میکند.
- sme-i16i64
- افزونهٔ FEAT_SME_I16I64 را برای SME فعال میکند. این گزینه همچنین دستورالعملهای SME را فعال میسازد.
- sme-f64f64
- افزونهٔ FEAT_SME_F64F64 را برای SME فعال میکند. این گزینه همچنین دستورالعملهای SME را فعال میسازد.
- sme2
- افزونهٔ Scalable Matrix Extension 2 را فعال میکند. این گزینه همچنین دستورالعملهای SME را فعال میسازد.
- sme-f8f16
- افزونهٔ FEAT_SME_F8F16 را برای SME فعال میکند. این گزینه همچنین دستورالعملهای SME2 و FP8 را فعال میسازد.
- sme-f8f32
- افزونهٔ FEAT_SME_F8F32 را برای SME فعال میکند. این گزینه همچنین دستورالعملهای SME2 و FP8 را فعال میسازد.
- sme-b16b16
- افزونهٔ FEAT_SME_B16B16 را برای SME فعال میکند. این گزینه همچنین دستورالعملهای SME2 و SVE_B16B16 را فعال میسازد.
- sme-f16f16
- افزونهٔ FEAT_SME_F16F16 را برای SME فعال میکند. این گزینه همچنین دستورالعملهای SME2 را فعال میسازد.
- sme2p1
- نسخهٔ ۲.۱ از افزونهٔ Scalable Matrix Extension را فعال میکند. این گزینه همچنین دستورالعملهای SME2 را فعال میسازد.
- fcma
- افزونههای SIMD برای اعداد مختلط را فعال میکند.
- jscvt
- دستورالعمل تبدیل جاوااسکریپت "fjcvtzs" را فعال میکند.
- frintts
- دستورالعملهای گرد کردن ممیز شناور به مقدار عدد صحیح را فعال میکند.
- wfxt
- دستورالعملهای "wfet" و "wfit" را فعال میکند.
- xs
- افزونهٔ صفت حافظهٔ XS را فعال میکند..IP lse128 4 فعالسازی افزونه دستورالعملهای اتمیک ۱۲۸ بیتی LSE128. این گزینه همچنین دستورالعملهای LSE را فعال میکند.
- d128
- فعالسازی پشتیبانی از دستورالعملهای خواندن/نوشتن ثباتهای سیستمی ۱۲۸ بیتی. این گزینه افزونه LSE128 را نیز فعال میکند.
- gcs
- فعالسازی پشتیبانی از افزونه Guarded Control Stack در Armv9.4-a.
- the
- فعالسازی پشتیبانی از افزونه مقاومسازی ترجمه (translation hardening) در Armv8.9-a/9.4-a.
- rcpc2
- فعالسازی افزونه RCpc2.
- rcpc3
- فعالسازی افزونه RCpc3 (سازگاری آزادسازی یا Release Consistency).
- fp8
- فعالسازی افزونه fp8 (نقطه شناور ۸ بیتی).
- fp8fma
- فعالسازی افزونه ضرب و جمع انباشته (multiply accumulate) نقطه شناور ۸ بیتی (fp8).
- ssve-fp8fma
- فعالسازی افزونه ضرب و جمع انباشته نقطه شناور ۸ بیتی (fp8) در حالت جاری (streaming 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).
- sme-lutv2
- فعالسازی افزونه نسخه ۲ جدول جستجوی SME (یا LUTv2).
- cpa
- فعالسازی دستورالعملهای محاسبات اشارهگر بررسیشده (Checked Pointer Arithmetic).
- sve-b16b16
- فعالسازی افزونه ممیز شناور مغزی ("bf16") بدون گسترش پهنا (non-widening) در SVE. این گزینه تنها زمانی تأثیر دارد که "sve2" یا "sme2" نیز فعال باشند.
- sve-bfscale
- فعالسازی افزونه SVE_BFSCALE.
- poe2
- فعالسازی افزونه همپوشانیهای مجوز ۲ (Permission Overlays Extension 2).
- tev
- فعالسازی افزونه بردار شبهاستثناء TIndex (TIndex Exception-like Vector).
- tlbid
- فعالسازی افزونه دامنههای TLBI (TLBI Domains).
- gcie
- فعالسازی افزونه رابط پردازنده برای کنترلکننده وقفه عمومی نسخه ۵ (GICv5).
- lscp
- فعالسازی افزونه جفت بارگذاری دستیابی و ذخیره آزادسازی (load acquire and store release pair).
- mops-go
- فعالسازی گونههای فقط برچسب (tag only) از دستورالعملهای MOPS. این گزینه همچنین دستورالعملهای شتابدهی به عملیاتهای حافظه و افزونههای برچسبگذاری حافظه Armv8.5-a را فعال میکند.
- sve2p3
- فعالسازی SVE2.3. این گزینه همچنین دستورالعملهای SVE2.2 را فعال میکند.
- sme2p3
- فعالسازی SME2.3. این گزینه همچنین دستورالعملهای SME2.2 را فعال میکند.
- f16f32dot
- فعالسازی دستورالعملهای f16f32dot در Armv9.7-a. این گزینه همچنین Advanced SIMD، دستورالعملهای ممیز شناور و دستورالعملهای FP16 در Armv8.2-a را فعال میکند.
- sve-b16mm
- فعالسازی افزونه SVE B16MM. این گزینه همچنین دستورالعملهای SVE، Advanced SIMD و ممیز شناور را فعال میکند.
- mtetc
- فعالسازی عملیاتهای بلوک برچسب حافظه پنهان داده (Data cache tag block). این گزینه همچنین افزونههای برچسبگذاری حافظه Armv8.5-a را فعال میکند.
- f16f32mm
- فعالسازی دستورالعملهای f16f32mm در Armv9.7-a. این گزینه همچنین Advanced SIMD، دستورالعملهای ممیز شناور و دستورالعملهای FP16 در Armv8.2-a را فعال میکند.
- f16mm
- فعالسازی دستورالعملهای f16mm. این گزینه همچنین Advanced SIMD، دستورالعملهای ممیز شناور و دستورالعملهای FP16 در Armv8.2-a را فعال میکند.
ویژگی crypto مستلزم فعال بودن aes، sha2 و simd است که خود fp را نیز در بر دارد. برعکس، nofp مستلزم nosimd است که به نوبه خود شامل nocrypto، noaes و nosha2 میشود.
گزینههای Adapteva Epiphany
این گزینههای -m برای پردازنده Adapteva Epiphany تعریف شدهاند:
- -mhalf-reg-file
- -mno-half-reg-file
- هیچ ثباتی را در محدوده "r32"..."r63" تخصیص ندهد. این کار اجازه میدهد کد روی گونههای سختافزاری که فاقد این ثباتها هستند اجرا شود.
- -mprefer-short-insn-regs
- -mno-prefer-short-insn-regs
- تخصیص ترجیحی ثباتهایی که امکان تولید دستورالعملهای کوتاه را فراهم میکنند. این کار میتواند منجر به افزایش تعداد دستورالعملها شود، بنابراین ممکن است اندازه کلی کد را کاهش یا افزایش دهد.
- -mbranch-cost=num
- تنظیم هزینه انشعابها به حدوداً num دستورالعمل «ساده». این هزینه صرفاً یک تخمین اکتشافی است و تضمین نمیشود که در انتشارها و نسخههای مختلف نتایج یکسانی ایجاد کند.
- -mcmove
- -mno-cmove
- فعالسازی تولید دستورالعملهای انتقال شرطی (conditional moves).
- -mnops=num
- درج num دستور NOP پیش از هر دستورالعمل تولیدشده دیگر.
- -mno-soft-cmpsf
- -msoft-cmpsf
- برای مقایسههای ممیز شناور با دقت یگانه، یک دستورالعمل "fsub" درج کرده و پرچمها را بررسی میکند. این روش سریعتر از مقایسه نرمافزاری است، اما ممکن است در حضور مقادیر NaN، یا زمانی که دو عدد کوچکِ متفاوت به گونهای مقایسه میشوند که تفاضل آنها صفر محاسبه میشود، نتایج نادرستی ایجاد کند. حالت پیشفرض -msoft-cmpsf است که از مقایسههای نرمافزاری کندتر ولی سازگار با IEEE استفاده میکند.
- -mstack-offset=num
- تنظیم فاصله (افست) بین بالای پشته و اشارهگر پشته. برای مثال، مقدار ۸ به این معنی است که هشت بایت در محدوده "sp+0...sp+7" میتواند توسط توابع برگ (leaf functions) بدون تخصیص پشته استفاده شود. مقادیری غیر از 8 یا 16 آزمایشنشده هستند و بعید است بهدرستی کار کنند. همچنین توجه داشته باشید که این گزینه ABI را تغییر میدهد؛ کامپایل کردن برنامهای با افست پشته متفاوت از کتابخانههایی که برنامه با آنها کامپایل شده است، معمولاً کار نخواهد کرد. این گزینه در صورتی مفید است که بخواهید ارزیابی کنید آیا یک افست پشته متفاوت کد بهتری تولید میکند یا خیر، اما برای استفاده واقعی از یک افست پشته دیگر جهت ساخت برنامههای کاربردی، توصیه میشود زنجیره ابزار (toolchain) با گزینه مناسب --with-stack-offset=num پیکربندی شود.
- -mno-round-nearest
- -mround-nearest
- -mno-round-nearest باعث میشود که زمانبند فرض کند حالت گرد کردن روی بُرش (truncating) تنظیم شده است. پیشفرض -mround-nearest است.
- -mlong-calls
- اگر بهطور دیگری توسط یک صفت (attribute) مشخص نشده باشد، فرض میکند همهٔ فراخوانیها ممکن است فراتر از محدودهٔ آفست دستورالعملهای "b" / "bl" باشند، و بنابراین نشانی تابع را پیش از اجرای فراخوانی (که در غیر این صورت مستقیم بود) درون یک ثبات بارگذاری میکند. این حالت پیشفرض است.
- -mshort-calls
- اگر بهطور
دیگری توسط
یک صفت مشخص
نشده باشد،
فرض میکند
همهٔ
فراخوانیهای
مستقیم در
محدودهٔ
دستورالعملهای
"b" /
"bl" قرار
دارند،
بنابراین
از این
دستورالعملها
برای
فراخوانیهای
مستقیم
استفاده
میکند.
پیشفرض -mlong-calls است. توجه داشته باشید که -mlong-calls معادل -mno-short-calls است، و به همین ترتیب -mno-long-calls معادل -mshort-calls است.
- -msmall16
- -mno-small16
- فرض میکند نشانیها میتوانند به عنوان مقادیر بدون علامت ۱۶ بیتی بارگذاری شوند. این مورد برای نشانیهای توابعی که معناشناسی -mlong-calls برای آنها اعمال شده، صدق نمیکند.
- -mfp-mode=mode
- حالت غالب
واحد ممیز
شناور (FPU) را
تنظیم
میکند. این
گزینه حالت
ممیز
شناوری را
تعیین
میکند که
در زمان
فراخوانی و
بازگشت
تابع ارائه
شده و مورد
انتظار است.
تطبیق دادن
این حالت با
حالتی که
بیشتر در
شروع تابع
به آن نیاز
دارید،
میتواند
با جلوگیری
از تغییر
حالتهای
غیرضروری،
برنامههای
شما را
کوچکتر و
سریعتر
کند.
مقدار mode میتواند روی یکی از مقادیر زیر تنظیم شود:
- caller
- هر حالتی در هنگام ورود به تابع معتبر است، و با بازگشت تابع و زمان فراخوانی توابع دیگر، حفظ یا بازیابی میشود. این حالت برای کامپایل کتابخانهها یا سایر واحدهای کامپایلی مفید است که ممکن است بخواهید آنها را در برنامههای مختلف با حالتهای غالب متفاوت FPU ادغام کنید؛ در این وضعیت، سهولت استفاده از یک فایل شیء (object file) منفرد، بر بار اضافهٔ حجم و سرعت ناشی از هرگونه تغییر حالت اضافی که ممکن است در مقایسه با انتخاب حالت غالب دقیقتر FPU لازم باشد، ارجحیت دارد.
- truncate
- این حالتی است که برای محاسبات ممیز شناور با حالت گرد کردن بُرِشی (یعنی گرد کردن به سمت صفر) استفاده میشود. این شامل تبدیل از ممیز شناور به عدد صحیح نیز هست.
- round-nearest
- این حالتی است که برای محاسبات ممیز شناور با حالت گرد کردن به نزدیکترین یا زوج (round-to-nearest-or-even) استفاده میشود.
- int
- این حالتی است که برای انجام محاسبات اعداد صحیح در FPU استفاده میشود، مانند ضرب عدد صحیح یا ضرب و جمع انباشتهٔ اعداد صحیح.
پیشفرض -mfp-mode=caller است.
- -mmay-round-for-trunc
- -mno-may-round-for-trunc
- این گزینه اجازه میدهد بُرش ممیز شناور به عدد صحیح با گرد کردن جایگزین شود تا در تعویض حالت صرفهجویی شود. این گزینه بهطور پیشفرض غیرفعال است.
- -mfp-iarith
- -mno-fp-iarith
- این گزینه استفاده از واحد ممیز شناور را برای جمع و تفریق اعداد صحیح فعال میکند. این گزینه بهطور پیشفرض غیرفعال است.
- -msplit-lohi
- -mno-split-lohi
- -mpost-inc
- -mno-post-inc
- -mpost-modify
- -mno-post-modify
- بهینهسازیهای جزئی تولید کد که به ترتیب تقسیم بارگذاریهای ۳۲ بیتی، تولید نشانیهای پسافزایشی (post-increment)، و تولید نشانیهای پساصلاحی (post-modify) را کنترل میکنند. حالتهای پیشفرض عبارتند از msplit-lohi، -mpost-inc و -mpost-modify.
- -mno-vect-double
- حالت SIMD ترجیحی را به SImode تغییر میدهد. پیشفرض -mvect-double است که از DImode به عنوان حالت ترجیحی SIMD استفاده میکند.
- -max-vect-align=num
- حداکثر تراز (alignment) برای انواع حالت برداری SIMD. مقدار num میتواند ۴ یا ۸ باشد. پیشفرض ۸ است. توجه داشته باشید که این یک تغییر در ABI است، هرچند بسیاری از رابطهای توابع کتابخانهای در صورتی که از حالتهای برداری SIMD در مواردی که بر اندازه یا تراز انواع مربوطه تأثیر میگذارد استفاده نکنند، دستنخورده باقی میمانند.
- -msplit-vecmove-early
- -mno-split-vecmove-early
- انتقالهای برداری را پیش از reload به انتقالهای تککلمهای تقسیم میکند. از نظر تئوری این کار میتواند تخصیص ثبات بهتری ارائه دهد، اما تاکنون عموماً خلاف این صادق بوده است.
- -m1reg-reg
- ثباتی را برای نگهداشتن مقدار ثابت -1 مشخص میکند، که بارگذاری مقادیر ثابت منفی کوچک و برخی ماسکهای بیتی را سریعتر میسازد. مقادیر مجاز برای reg عبارتند از r43 و r63، که استفاده از آن ثبات را به عنوان ثبات ثابت تعیین میکنند، و none، که نشان میدهد هیچ ثباتی برای این منظور استفاده نمیشود. پیشفرض -m1reg-none است.
گزینههای AMD GCN
این گزینهها بهطور خاص برای پورت AMD GCN تعریف شدهاند.
- -march=gpu
- -mtune=gpu
- نوع معماری یا تنظیم بهینهسازی (tuning) را برای gpu تعیین میکند. مقادیر پشتیبانیشده برای gpu عبارتند از:
- gfx900
- کامپایل برای دستگاههای GCN5 Vega 10 (gfx900).
- gfx902
- کامپایل برای دستگاههای GCN5 Vega gfx902. (آزمایشی)
- gfx904
- کامپایل برای دستگاههای GCN5 Vega gfx904. (آزمایشی)
- gfx906
- کامپایل برای دستگاههای GCN5 Vega 20 (gfx906).
- gfx908
- کامپایل برای دستگاههای سری CDNA1 Instinct MI100 (gfx908).
- gfx909
- کامپایل برای دستگاههای GCN5 Vega gfx909. (آزمایشی)
- gfx90a
- کامپایل برای دستگاههای سری CDNA2 Instinct MI200 (gfx90a).
- gfx90c
- کامپایل برای دستگاههای GCN5 Vega 7 (gfx90c).
- gfx942
- کامپایل برای دستگاههای سری CDNA3 Instinct MI300 (gfx942). (آزمایشی)
- gfx950
- کامپایل برای دستگاههای CDNA3 gfx950. (آزمایشی)
- gfx9-generic
- کامپایل کد عمومی برای دستگاههای Vega، قابل اجرا بر روی زیرمجموعهٔ زیر از دستگاههای GFX9: gfx900، gfx902، gfx904، gfx906، gfx909 و gfx90c.
- gfx9-4-generic
- کامپایل کد عمومی برای دستگاههای CDNA3، قابل اجرا بر روی زیرمجموعهٔ زیر از دستگاههای GFX9: gfx942 و gfx950. (آزمایشی).IP gfx1030 4 کامپایل برای دستگاههای RDNA2 gfx1030 (سری GFX10).
- gfx1031
- کامپایل برای دستگاههای RDNA2 gfx1031 (سری GFX10). (آزمایشی)
- gfx1032
- کامپایل برای دستگاههای RDNA2 gfx1032 (سری GFX10). (آزمایشی)
- gfx1033
- کامپایل برای دستگاههای RDNA2 gfx1033 (سری GFX10). (آزمایشی)
- gfx1034
- کامپایل برای دستگاههای RDNA2 gfx1034 (سری GFX10). (آزمایشی)
- gfx1035
- کامپایل برای دستگاههای RDNA2 gfx1035 (سری GFX10). (آزمایشی)
- gfx1036
- کامپایل برای دستگاههای RDNA2 gfx1036 (سری GFX10).
- gfx10-3-generic
- کامپایل کد عمومی برای دستگاههای GFX10-3، قابل اجرا روی gfx1030، gfx1031، gfx1032، gfx1033، gfx1034، gfx1035، و gfx1036.
- gfx1100
- کامپایل برای دستگاههای RDNA3 gfx1100 (سری GFX11).
- gfx1101
- کامپایل برای دستگاههای RDNA3 gfx1101 (سری GFX11). (آزمایشی)
- gfx1102
- کامپایل برای دستگاههای RDNA3 gfx1102 (سری GFX11). (آزمایشی)
- gfx1103
- کامپایل برای دستگاههای RDNA3 gfx1103 (سری GFX11).
- gfx1150
- کامپایل برای دستگاههای RDNA3 gfx1150 (سری GFX11). (آزمایشی)
- gfx1151
- کامپایل برای دستگاههای RDNA3 gfx1151 (سری GFX11). (آزمایشی)
- gfx1152
- کامپایل برای دستگاههای RDNA3 gfx1152 (سری GFX11). (آزمایشی)
- gfx1153
- کامپایل برای دستگاههای RDNA3 gfx1153 (سری GFX11). (آزمایشی)
- gfx11-generic
- کامپایل کد عمومی برای دستگاههای GFX11، قابل اجرا روی gfx1100، gfx1101، gfx1102، gfx1103، gfx1150، gfx1151، gfx1152، و gfx1153.
- -mgang-private-size=bytes
- تنظیم مقدار حافظهٔ اشتراک داده محلی (LDS) جهت رزرو برای متغیرهای gang-private. مقدار پیشفرض 512 است.
- -msram-ecc=on
- -msram-ecc=off
- -msram-ecc=any
- کامپایل باینریهای مناسب برای دستگاههایی که قابلیت SRAM-ECC در آنها فعال، غیرفعال یا در هر یک از این دو حالت باشد. این قابلیت در برخی دستگاهها میتواند بهازای هر فرایند فعال شود. کد کامپایلشده باید با حالت دستگاه مطابقت داشته باشد. مقدار پیشفرض برای دستگاههایی که از آن پشتیبانی میکنند any است.
- -mxnack=on
- -mxnack=off
- -mxnack=any
- کامپایل باینریهای مناسب برای دستگاههایی که قابلیت XNACK در آنها فعال، غیرفعال یا در هر یک از این دو حالت است. برخی از دستگاهها همیشه به XNACK نیاز دارند و برخی به کاربر اجازهٔ پیکربندی XNACK را میدهند. کد کامپایلشده باید با حالت دستگاه مطابقت داشته باشد. مقدار پیشفرض در دستگاههایی که از حافظهٔ اشتراکی یکپارچه (Unified Shared Memory) پشتیبانی میکنند -mxnack=any است، و در غیر این صورت -mxnack=no.
- -Wopenacc-dims
- -Wno-openacc-dims
- کنترل هشدارهای مربوط به ابعاد نامعتبر OpenACC.
گزینههای ARC
گزینههای زیر گونهٔ معماریای را که کد برای آن کامپایل میشود، کنترل میکنند:
- -mbarrel-shifter
- تولید دستورالعملهای پشتیبانیشده توسط barrel shifter. این حالت پیشفرض است، مگر اینکه -mcpu=ARC601 یا -mcpu=ARCEM فعال باشد.
- -mjli-always
- اجبار به فراخوانی یک تابع با استفاده از دستور jli_s. این گزینه تنها برای معماری ARCv2 معتبر است.
- -mcpu=cpu
- تنظیم نوع معماری، نحوهٔ استفاده از ثباتها، و پارامترهای زمانبندی دستورالعملها برای cpu. همچنین گزینههای نام مستعار میانبری برای سازگاری با گذشته و سهولت در دسترس هستند. مقادیر پشتیبانیشده برای cpu عبارتاند از:
- arc600
- کامپایل برای ARC600. نامهای مستعار: -mA6، -mARC600.
- arc601
- کامپایل برای ARC601. نام مستعار: -mARC601.
- arc700
- کامپایل برای ARC700. نامهای مستعار: -mA7، -mARC700. در صورت پیکربندی با --with-cpu=arc700، این حالت پیشفرض است.
- arcem
- کامپایل برای ARC EM.
- archs
- کامپایل برای ARC HS.
- em
- کامپایل برای پردازندهٔ ARC EM بدون افزونههای سختافزاری.
- em4
- کامپایل برای پردازندهٔ ARC EM4.
- em4_dmips
- کامپایل برای پردازندهٔ ARC EM4 DMIPS.
- em4_fpus
- کامپایل برای پردازندهٔ ARC EM4 DMIPS بههمراه افزونهٔ ممیز شناور با دقت یگانه (single-precision).
- em4_fpuda
- کامپایل برای پردازندهٔ ARC EM4 DMIPS با ممیز شناور دقت یگانه و دستورالعملهای کمکی دقت مضاعف (double assist).
- hs
- کامپایل برای پردازندهٔ ARC HS بدون هیچگونه افزونه سختافزاری به جز دستورالعملهای اتمیک (atomic).
- hs34
- کامپایل برای پردازندهٔ ARC HS34.
- hs38
- کامپایل برای پردازندهٔ ARC HS38.
- hs38_linux
- کامپایل برای پردازندهٔ ARC HS38 با فعال بودن تمامی افزونههای سختافزاری.
- hs4x
- کامپایل برای پردازندهٔ ARC HS4x.
- hs4xd
- کامپایل برای پردازندهٔ ARC HS4xD.
- hs4x_rel31
- کامپایل برای پردازندهٔ ARC HS4x نگارش 3.10a.
- arc600_norm
- کامپایل برای پردازندهٔ ARC 600 با فعال بودن دستورالعملهای "norm".
- arc600_mul32x16
- کامپایل برای پردازندهٔ ARC 600 با فعال بودن دستورالعملهای "norm" و ضرب ۳۲ در ۱۶ بیتی.
- arc600_mul64
- کامپایل برای پردازندهٔ ARC 600 با فعال بودن دستورالعملهای "norm" و خانوادهٔ "mul64".
- arc601_norm
- کامپایل برای پردازندهٔ ARC 601 با فعال بودن دستورالعملهای "norm"..IP arc601_mul32x16 4 کامپایل برای پردازندهٔ ARC 601 با فعال بودن دستورهای ضرب 32x16-bit و "norm".
- arc601_mul64
- کامپایل برای پردازندهٔ ARC 601 با فعال بودن دستورهای خانوادهٔ "mul64" و "norm".
- nps400
- کامپایل برای ARC 700 روی تراشهٔ NPS400.
- em_mini
- کامپایل برای پیکربندی کمینهگرای ARC EM دارای مجموعه ثباتهای کاهشیافته.
- -mdpfp
- -mdpfp-compact
- تولید دستورهای FPX با دقت مضاعف (double-precision)، بهینهشده برای پیادهسازی فشرده (compact).
- -mdpfp-fast
- تولید دستورهای FPX با دقت مضاعف، بهینهشده برای پیادهسازی سریع (fast).
- -mno-dpfp-lrsr
- -mdpfp-lrsr
- کنترل اینکه آیا دستورهای "lr" و "sr" از ثباتهای کمکی (aux registers) افزونهٔ FPX استفاده کنند یا خیر. این گزینه بهطور پیشفرض فعال است.
- -mea
- تولید دستورهای محاسباتی گسترشیافته (extended arithmetic). در حال حاضر تنها "divaw"، "adds"، "subs" و "sat16" پشتیبانی میشوند. فقط برای -mcpu=ARC700 معتبر است.
- -mmul32x16
- تولید دستورهای ضرب و ضرب-انباشت (multiply-accumulate) 32x16-bit.
- -mmul64
- تولید دستورهای "mul64" و "mulu64". فقط برای -mcpu=ARC600 معتبر است.
- -mnorm
- تولید دستورهای "norm". در صورتی که -mcpu=ARC700 اعمال شده باشد، این حالت پیشفرض است.
- -mspfp
- -mspfp-compact
- تولید دستورهای FPX با دقت یگانه (single-precision)، بهینهشده برای پیادهسازی فشرده (compact).
- -mspfp-fast
- تولید دستورهای FPX با دقت یگانه، بهینهشده برای پیادهسازی سریع (fast).
- -msimd
- فعالسازی تولید دستورهای ARC SIMD از طریق توابع توکار (builtins) ویژهٔ مقصد. فقط برای -mcpu=ARC700 معتبر است.
- -msoft-float
- این گزینه نادیده گرفته میشود؛ صرفاً برای اهداف سازگاری ارائه شده است. کد ممیز شناور نرمافزاری بهطور پیشفرض تولید میشود و این مقدار پیشفرض میتواند توسط گزینههای FPX جایگزین شود؛ -mspfp، -mspfp-compact، یا -mspfp-fast برای دقت یگانه، و -mdpfp، -mdpfp-compact، یا -mdpfp-fast برای دقت مضاعف.
- -mswap
- تولید دستورهای "swap".
- -matomic
- این گزینه استفاده از افزونهٔ شرطی بارگذاری/ذخیرهسازی قفلشده (locked load/store conditional) را برای پیادهسازی توابع توکار حافظهٔ اتمیک فعال میکند. برای هستههای ARC 6xx یا ARC EM در دسترس نیست.
- -mdiv-rem
- فعالسازی دستورهای "div" و "rem" برای هستههای ARCv2.
- -mcode-density
- -mno-code-density
- فعالسازی دستورهای چگالی کد (code density) برای ARC EM. این گزینه بهطور پیشفرض برای ARC HS فعال است.
- -mll64
- فعالسازی عملیات بارگذاری/ذخیرهسازی دوگانه (double load/store) برای هستههای ARC HS.
- -mtp-regno=regno
- تعیین شمارهٔ ثبات اشارهگر رشته (thread pointer).
- -mbitops
- فعالسازی استفاده از عملیات بیتی NPS400.
- -mcmem
- فعالسازی استفاده از افزونهٔ xld/xst در NPS400.
- -mmpy-option=multo
- کامپایل کد ARCv2 با یک گزینهٔ طراحی ضربکننده (multiplier). میتوانید این گزینه را با استفاده از یک رشته یا یک مقدار عددی برای multo مشخص کنید. wlh1 مقدار پیشفرض است. مقادیر شناختهشده عبارتند از:
- 0
- none
- هیچ ضربکنندهای در دسترس نیست.
- 1
- w
- ضربکنندهٔ 16x16، کاملاً خطلولهای (fully pipelined). دستورهای زیر فعال میشوند: "mpyw" و "mpyuw".
- 2
- wlh1
- ضربکنندهٔ 32x32، کاملاً خطلولهای (۱ مرحله). دستورهای زیر نیز علاوه بر آن فعال میشوند: "mpy"، "mpyu"، "mpym"، "mpymu" و "mpy_s".
- 3
- wlh2
- ضربکنندهٔ 32x32، کاملاً خطلولهای (۲ مرحله). دستورهای زیر نیز علاوه بر آن فعال میشوند: "mpy"، "mpyu"، "mpym"، "mpymu" و "mpy_s".
- 4
- wlh3
- دو ضربکنندهٔ 16x16، انسدادی (blocking)، ترتیبی (sequential). دستورهای زیر نیز علاوه بر آن فعال میشوند: "mpy"، "mpyu"، "mpym"، "mpymu" و "mpy_s".
- 5
- wlh4
- یک ضربکنندهٔ 16x16، انسدادی، ترتیبی. دستورهای زیر نیز علاوه بر آن فعال میشوند: "mpy"، "mpyu"، "mpym"، "mpymu" و "mpy_s".
- 6
- wlh5
- یک ضربکنندهٔ 32x4، انسدادی، ترتیبی. دستورهای زیر نیز علاوه بر آن فعال میشوند: "mpy"، "mpyu"، "mpym"، "mpymu" و "mpy_s".
- 7
- plus_dmpy
- پشتیبانی از SIMD در ARC HS..IP 8 4
- plus_macd
- پشتیبانی از SIMD پردازندههای ARC HS.
- 9
- plus_qmacw
- پشتیبانی از SIMD پردازندههای ARC HS.
این گزینه تنها برای هستههای ARCv2 در دسترس است.
- -mfpu=fpu
- پشتیبانی از افزونههای سختافزاری ممیز شناور خاص را برای هستههای ARCv2 فعال میکند. مقادیر پشتیبانیشده برای fpu عبارتند از:
- fpus
- پشتیبانی از افزونههای سختافزاری ممیز شناور با دقت یگانه را فعال میکند.
- fpud
- پشتیبانی از افزونههای سختافزاری ممیز شناور با دقت مضاعف را فعال میکند. افزونهٔ ممیز شناور با دقت یگانه نیز فعال میشود. برای ARC EM در دسترس نیست.
- fpuda
- پشتیبانی از افزونههای سختافزاری ممیز شناور با دقت مضاعف را با استفاده از دستورالعملهای کمکی دقت مضاعف فعال میکند. افزونهٔ ممیز شناور با دقت یگانه نیز فعال میشود. این گزینه تنها برای ARC EM در دسترس است.
- fpuda_div
- پشتیبانی از افزونههای سختافزاری ممیز شناور با دقت مضاعف را با استفاده از دستورالعملهای کمکی دقت مضاعف فعال میکند. افزونههای سختافزاری ممیز شناور با دقت یگانه، ریشهٔ دوم و تقسیم نیز فعال میشوند. این گزینه تنها برای ARC EM در دسترس است.
- fpuda_fma
- پشتیبانی از افزونههای سختافزاری ممیز شناور با دقت مضاعف را با استفاده از دستورالعملهای کمکی دقت مضاعف فعال میکند. افزونههای سختافزاری ممیز شناور با دقت یگانه و ضرب و جمع ادغامشده نیز فعال میشوند. این گزینه تنها برای ARC EM در دسترس است.
- fpuda_all
- پشتیبانی از افزونههای سختافزاری ممیز شناور با دقت مضاعف را با استفاده از دستورالعملهای کمکی دقت مضاعف فعال میکند. تمامی افزونههای سختافزاری ممیز شناور با دقت یگانه نیز فعال میشوند. این گزینه تنها برای ARC EM در دسترس است.
- fpus_div
- پشتیبانی از افزونههای سختافزاری ممیز شناور با دقت یگانه، ریشهٔ دوم و تقسیم را فعال میکند.
- fpud_div
- پشتیبانی از افزونههای سختافزاری ممیز شناور با دقت مضاعف، ریشهٔ دوم و تقسیم را فعال میکند. این گزینه شامل گزینهٔ fpus_div نیز میشود. برای ARC EM در دسترس نیست.
- fpus_fma
- پشتیبانی از افزونههای سختافزاری ممیز شناور با دقت یگانه و ضرب و جمع ادغامشده را فعال میکند.
- fpud_fma
- پشتیبانی از افزونههای سختافزاری ممیز شناور با دقت مضاعف و ضرب و جمع ادغامشده را فعال میکند. این گزینه شامل گزینهٔ fpus_fma نیز میشود. برای ARC EM در دسترس نیست.
- fpus_all
- پشتیبانی از تمامی افزونههای سختافزاری ممیز شناور با دقت یگانه را فعال میکند.
- fpud_all
- پشتیبانی از تمامی افزونههای سختافزاری ممیز شناور با دقت یگانه و مضاعف را فعال میکند. برای ARC EM در دسترس نیست.
- -mirq-ctrl-saved=register-range, blink, lp_count
- ثباتهای همهمنظورهای را مشخص میکند که پردازنده هنگام ورود و خروج وقفه بهطور خودکار ذخیره/بازیابی میکند. register-range بهصورت دو ثبات که با یک خط تیره جدا شدهاند مشخص میشود. محدودهٔ ثباتها همواره با "r0" آغاز میشود و حد بالایی آن ثبات "fp" است. blink و lp_count اختیاری هستند. این گزینه تنها برای هستههای ARC EM و ARC HS معتبر است.
- -mrgf-banked-regs=number
- تعداد ثباتهایی را مشخص میکند که در هنگام ورود به وقفهٔ سریع در بانک دوم ثباتها تکرار میشوند. وقفههای سریع، وقفههایی با بالاترین سطح اولویت P0 هستند. این وقفهها برای جلوگیری از تراکنشهای حافظه در طول توالیهای ورود و خروج وقفه، تنها ثباتهای PC و STATUS32 را ذخیره میکنند. هنگامی که از وقفههای سریع در یک پردازندهٔ خانوادهٔ ARC V2 استفاده میکنید از این گزینه بهره ببرید. مقادیر مجاز عبارتند از 4، 8، 16 و 32.
- -mlpc-width=width
- عرض ثبات "lp_count" را مشخص میکند. مقادیر معتبر برای width عبارتند از 8، 16، 20، 24، 28 و 32 بیت. عرض پیشفرض بر روی 32 بیت ثابت است. اگر عرض کمتر از 32 باشد، کامپایلر تلاشی برای تبدیل حلقهها در برنامهٔ شما جهت استفاده از سازوکار حلقه با تأخیر صفر (zero-delay loop) نمیکند، مگر اینکه مشخص باشد ثبات "lp_count" میتواند مقدار شمارندهٔ حلقهٔ مورد نیاز را در خود نگه دارد. بسته به عرض مشخصشده، کامپایلر و کتابخانهٔ زمان اجرا ممکن است برای نیازهای گوناگون همچنان به استفاده از سازوکار حلقه ادامه دهند. این گزینه ماکروی "__ARC_LPC_WIDTH__" را با مقدار width تعریف میکند.
- -mrf16
- این گزینه به کامپایلر دستور میدهد تا کد را برای یک فایل ثبات ۱۶ مدخلی تولید کند. این گزینه ماکروی پیشپردازندهٔ "__ARC_RF16__" را تعریف میکند.
- -mbranch-index
- استفاده از دستورالعملهای "bi" یا "bih" را برای پیادهسازی جدولهای پرش فعال میکند.
گزینههای زیر به اسمبلر ارسال میشوند و همچنین نمادهای ماکروی پیشپردازنده را تعریف میکنند.
- -mlock
- به اسمبلر ارسال میشود تا افزونهٔ شرطی بارگذاری/ذخیرهٔ قفلشده را فعال کند. همچنین نماد پیشپردازندهٔ "__Xlock" را تنظیم میکند.
- -mswape
- به اسمبلر ارسال میشود تا دستورالعمل افزونهٔ تغییر ترتیب بایتها را فعال کند. همچنین نماد پیشپردازندهٔ "__Xswape" را تنظیم میکند.
- -mxy
- به اسمبلر ارسال میشود تا افزونهٔ حافظهٔ XY را فعال کند. همچنین نماد پیشپردازندهٔ "__Xxy" را تنظیم میکند.
گزینههای زیر نحوهٔ حاشیهنویسی کد اسمبلی را کنترل میکنند:
- -misize
- دستورالعملهای اسمبلی را با آدرسهای تخمینی حاشیهنویسی میکند.
گزینههای زیر به پیونددهنده ارسال میشوند:
- -marclinux
- -mno-arclinux
- به پیونددهنده ارسال میشود تا استفاده از شبیهسازی "arclinux" را مشخص کند. این گزینه بهطور پیشفرض در زنجیرههای ابزار ساختهشده برای اهداف "arc-linux-uclibc" و "arceb-linux-uclibc" در صورتی که پروفایلسازی درخواست نشده باشد، فعال است.
- -marclinux_prof
- -mno-arclinux_prof
- به پیونددهنده ارسال میشود تا استفاده از شبیهسازی "arclinux_prof" را مشخص کند. این گزینه بهطور پیشفرض در زنجیرههای ابزار ساختهشده برای اهداف "arc-linux-uclibc" و "arceb-linux-uclibc" هنگامی که پروفایلسازی درخواست شده باشد، فعال است.
گزینههای زیر معناشناسی کد تولیدشده را کنترل میکنند:
- -mlong-calls
- فراخوانیها را بهصورت فراخوانیهای غیرمستقیم از طریق ثبات تولید میکند، بدین ترتیب دسترسی به کل محدودهٔ آدرس ۳۲ بیتی را فراهم میسازد.
- -mmedium-calls
- -mno-medium-calls
- برای فراخوانیها از محدودهٔ آدرسدهی کمتر از ۲۵ بیت استفاده نمیکند، که آفست در دسترس برای دستور شاخهروی و پیوند غیرمشروط است. اجرای شرطی فراخوانیهای توابع سرکوب میشود تا امکان استفاده از محدودهٔ ۲۵ بیتی را به جای محدودهٔ ۲۱ بیتی شاخهروی و پیوند شرطی فراهم کند. این حالت پیشفرض برای زنجیرههای ابزار ساختهشده برای اهداف "arc-linux-uclibc" و "arceb-linux-uclibc" است..IP "-G num" 4 قراردادن تعاریف دادههای قابل مشاهده از خارج در یک بخش دادههای کوچک (small data section) در صورتی که اندازهٔ آن داده بزرگتر از num بایت نباشد. مقدار پیشفرض num برای هر پیکربندی ARC برابر با ۴ است، یا در صورت وجود عملیات بارگذاری/ذخیرهٔ (load/store) دوگانه، ۸ میباشد.
- -mno-sdata
- عدم تولید ارجاعهای sdata. این حالت پیشفرض برای زنجیرههای ابزار ساختهشده برای اهداف "arc-linux-uclibc" و "arceb-linux-uclibc" است.
- -mvolatile-cache
- -mno-volatile-cache
- کنترل نحوهٔ دسترسی به ارجاعهای فرار (volatile). حالت پیشفرض -mvolatile-cache است که از دسترسیهای حافظهٔ معمولِ دارای حافظهٔ پنهان (cached) برای ارجاعهای فرار استفاده میکند. از -mno-volatile-cache برای فعالسازی دور زدن حافظهٔ پنهان (cache bypass) برای ارجاعهای فرار استفاده کنید.
گزینههای زیر تولید کد را تنظیم دقیق میکنند:
- -mauto-modify-reg
- فعالسازی استفاده از pre/post modify همراه با جابهجایی ثبات.
- -mno-brcc
- -mbrcc
- این گزینه یک گذر وابسته به هدف را در arc_reorg برای تولید دستورالعملهای مقایسه و انشعاب ("brcc") کنترل میکند، که به طور پیشفرض فعال است. این گزینه هیچ تأثیری بر تولید این دستورالعملها که توسط گذر combiner هدایت میشوند ندارد.
- -mcase-vector-pcrel
- استفاده از جدولهای switch case وابسته به شمارندهٔ برنامه (PC-relative) جهت فعالسازی کوتاهسازی جدول case. این حالت پیشفرض برای -Os است.
- -mno-cond-exec
- غیرفعال
کردن گذر
ویژهٔ ARCompact
برای تولید
دستورالعملهای
اجرای شرطی.
به دلیل زمانبندی delay slot و برهمکنشهای میان تعداد عملوندها، اندازه مقادیر مستقیم (literal sizes)، طول دستورالعملها، و پشتیبانی از اجرای شرطی، گذر مستقل از هدف برای تولید اجرای شرطی اغلب ناکافی است، بنابراین پورت ARC یک گذر ویژه را حفظ کرده است که پس از تخصیص ثبات، کوتاهسازی انشعاب (branch shortening)، و زمانبندی delay slot، سعی میکند فرصتهای بیشتری برای تولید اجرای شرطی پیدا کند. این گذر عموماً، اما نه همیشه، عملکرد و اندازهٔ کد را به بهای زمان کامپایل بیشتر بهبود میبخشد، و به همین دلیل گزینهای برای خاموش کردن آن وجود دارد. اگر به دلیل شرطیشدن دستورالعملهای call با مشکل فراتر رفتن آنها از محدودهٔ مجاز آفست مواجه شدید، باید استفاده از -mmedium-calls را مد نظر قرار دهید.
- -mearly-cbranchsi
- فعالسازی استفاده از الگوی "cbranchsi" پیش از reload.
- -mindexed-loads
- فعالسازی استفاده از بارگذاریهای نمایهدار (indexed loads). این مورد میتواند مشکلساز باشد زیرا برخی از بهینهسازها در این صورت فرض میکنند که ذخیرهسازیهای نمایهدار (indexed stores) نیز وجود دارند، در حالی که چنین نیست.
- -mlra-priority-none
- عدم تعیین هرگونه اولویت برای ثباتهای هدف.
- -mlra-priority-compact
- تعیین اولویت ثبات هدف برای r0..r3 / r12..r15.
- -mlra-priority-noncompact
- کاهش اولویت ثبات هدف برای r0..r3 / r12..r15.
- -mmillicode
- هنگام بهینهسازی برای اندازه (با استفاده از -Os)، پرولوگها و اپیلوگهایی که باید تعداد زیادی ثبات را ذخیره یا بازیابی کنند اغلب با استفاده از فراخوانی یک تابع ویژه در libgcc کوتاه میشوند؛ این فراخوانی به عنوان یک فراخوانی millicode شناخته میشود. از آنجا که این فراخوانیها میتوانند مسائلی در کارایی ایجاد کنند و/یا هنگام پیوند دادن به شیوهٔ غیر استاندارد موجب مشکلات پیوندزنی شوند، این گزینه برای روشن یا خاموش کردن تولید فراخوانی millicode فراهم شده است.
- -mcode-density-frame
- این گزینه کامپایلر را قادر میسازد تا دستورالعملهای "enter" و "leave" را صادر کند. این دستورالعملها فقط برای پردازندههای دارای ویژگی code-density معتبر هستند.
- -msize-level=level
- تنظیم دقیق بهینهسازی اندازه با توجه به طول دستورالعملها و ترازسازی (alignment). مقادیر شناختهشده برای level عبارتند از:
- 0
- بدون بهینهسازی اندازه. این سطح منسوخ شده و مانند 1 با آن رفتار میشود.
- 1
- دستورالعملهای کوتاه به صورت فرصتطلبانه استفاده میشوند.
- 2
- علاوه بر این، ترازسازی حلقهها و کد پس از سدها (barriers) حذف میشود.
- 3
- علاوه بر این، ترازسازی اختیاری دادهها حذف شده و گزینهٔ Os فعال میشود.
هنگامی که -Os فعال باشد، مقدار پیشفرض روی 3 قرار میگیرد. در غیر این صورت، رفتار در هنگام تعیین نشدن آن معادل سطح 1 است.
- -mtune=cpu
- تنظیم
پارامترهای
زمانبندی
دستورالعمل
برای cpu، که
هر مقدار
ضمنی
تعیینشده
توسط -mcpu= را
بازنویسی
میکند.
مقادیر پشتیبانیشده برای cpu عبارتند از:
- ARC600
- تنظیم برای پردازندهٔ ARC600.
- ARC601
- تنظیم برای پردازندهٔ ARC601.
- ARC700
- تنظیم برای پردازندهٔ ARC700 با بلوک ضربکننده استاندارد.
- ARC700-xmac
- تنظیم برای پردازندهٔ ARC700 با بلوک XMAC.
- ARC725D
- تنظیم برای پردازندهٔ ARC725D.
- ARC750D
- تنظیم برای پردازندهٔ ARC750D.
- core3
- تنظیم برای پردازندهٔ نوع core3 از معماری ARCv2. این گزینه استفاده از دستورالعمل "dbnz" را فعال میکند.
- release31a
- تنظیم برای ARC4x انتشار 3.10a.
- -mmultcost=num
- هزینهای که برای یک دستورالعمل ضرب در نظر گرفته میشود، بهطوری که 4 معادل یک دستورالعمل معمولی است.
گزینههای ARM (ARM Options)
این گزینههای -m برای پورت ARM تعریف شدهاند:
- -mabi=name
- تولید کد برای ABI مشخصشده. مقادیر مجاز عبارتند از: apcs-gnu، atpcs، aapcs و aapcs-linux.
- -mapcs-frame
- تولید یک فریم پشته (stack frame) سازگار با استاندارد فراخوانی رویهٔ ARM (ARM Procedure Call Standard) برای همهٔ توابع، حتی اگر این کار برای اجرای صحیح کد اکیداً ضروری نباشد. تعیین -fomit-frame-pointer همراه با این گزینه باعث میشود فریمهای پشته برای توابع برگی (leaf functions) تولید نشوند. حالت پیشفرض -mno-apcs-frame است. این گزینه منسوخ شده است.
- -mapcs
- این گزینه مترادفی برای -mapcs-frame است و منسوخ شده میباشد.
- -mthumb-interwork
- تولید کدی که از فراخوانی متقابل میان مجموعهدستورالعملهای ARM و Thumb پشتیبانی کند. بدون این گزینه، در معماریهای پیش از نسخهٔ ۵ (pre-v5)، این دو مجموعهدستورالعمل نمیتوانند به صورت قابل اطمینان در یک برنامه استفاده شوند. حالت پیشفرض -mno-thumb-interwork است، زیرا در صورت تعیین -mthumb-interwork کد اندکی بزرگتر تولید میشود. در پیکربندیهای AAPCS این گزینه بیمعنی است.
- -msched-prolog
- -mno-sched-prolog
- مجاز شمردن یا جلوگیری از تغییر ترتیب دستورالعملها در مقدمهٔ تابع (function prologue)، یا ادغام آن دستورالعملها با دستورالعملهای موجود در بدنهٔ تابع. با -mno-sched-prolog، این بدان معناست که همه توابع با یک مجموعه دستورالعمل قابلتشخیص شروع میشوند (یا در واقع با انتخابی از میان یک مجموعه کوچک از مقدمههای گوناگون توابع)، و میتوان از این اطلاعات برای تعیین محل شروع توابع در یک قطعه کد اجرایی استفاده کرد. پیشفرض -msched-prolog است.
- -mfloat-abi=name
- مشخص
میکند از
کدام ABI ممیز
شناور (floating-point)
استفاده
شود. مقادیر
مجاز
عبارتاند
از: soft، softfp و hard.
تعیین soft باعث میشود GCC خروجی حاوی فراخوانیهای کتابخانهای برای عملیات ممیز شناور تولید کند. softfp اجازه تولید کدی را میدهد که از دستورالعملهای سختافزاری ممیز شناور استفاده میکند، اما همچنان از قراردادهای فراخوانی soft-float بهره میبرد. hard اجازه تولید دستورالعملهای ممیز شناور را داده و از قراردادهای فراخوانی ویژهٔ FPU استفاده میکند.
پیشفرض به پیکربندی مقصد مشخص بستگی دارد. توجه داشته باشید که ABIهای hard-float و soft-float از نظر پیوند سازگار نیستند؛ شما باید کل برنامه خود را با همان ABI کامپایل کرده و با مجموعهای سازگار از کتابخانهها پیوند دهید.
- -mgeneral-regs-only
- تولید کدی که تنها از ثباتهای همهمنظوره استفاده میکند. این کار مانع از استفاده کامپایلر از ثباتهای ممیز شناور و Advanced SIMD میشود اما هیچ محدودیتی بر اسمبلر اعمال نخواهد کرد.
- -mlittle-endian
- تولید کد برای پردازندهای که در حالت little-endian اجرا میشود. این پیشفرض برای تمامی پیکربندیهای استاندارد است.
- -mbig-endian
- تولید کد برای پردازندهای که در حالت big-endian اجرا میشود؛ پیشفرض کامپایل کردن کد برای پردازنده little-endian است.
- -mbe8
- -mbe32
- هنگام پیوند دادن یک ایمیج big-endian بین قالبهای BE8 و BE32 انتخاب میکند. این گزینه روی ایمیجهای little-endian تأثیری ندارد و نادیده گرفته میشود. پیشفرض به معماری مقصد انتخابشده بستگی دارد. برای معماری ARMv6 و جدیدتر پیشفرض BE8 است، و برای معماریهای قدیمیتر پیشفرض BE32 است. قالب BE32 توسط ARM منسوخ شده است.
- -march=name[+extension...]
- نام معماری
مقصد ARM را
مشخص
میکند. GCC از
این نام
برای تعیین
اینکه چه
نوع
دستورالعملهایی
را
میتواند
هنگام
تولید کد
اسمبلی
منتشر کند،
استفاده
میکند. این
گزینه
میتواند
در کنار یا
به جای
گزینه -mcpu=
استفاده
شود.
نامهای مجاز عبارتاند از: armv4t، armv5t، armv5te، armv6، armv6j، armv6k، armv6kz، armv6t2، armv6z، armv6zk، armv7، armv7-a، armv7ve، armv8-a، armv8.1-a، armv8.2-a، armv8.3-a، armv8.4-a، armv8.5-a، armv8.6-a، armv9-a، armv7-r، armv8-r، armv6-m، armv6s-m، armv7-m، armv7e-m، armv8-m.base، armv8-m.main، armv8.1-m.main، iwmmxt و iwmmxt2.
علاوه بر این، معماریهای زیر که فاقد پشتیبانی از حالت اجرای Thumb هستند شناسایی میشوند اما پشتیبانی از آنها منسوخ شده است: armv4.
بسیاری از معماریها از افزونهها پشتیبانی میکنند. اینها را میتوان با افزودن +extension به نام معماری اضافه کرد. گزینههای افزونه به ترتیب پردازش میشوند و قابلیتها انباشته میشوند. یک افزونه همچنین هرگونه افزونه پایه لازم را که به آن وابسته است فعال میکند. برای مثال، افزونه +crypto همواره افزونه +simd را فعال خواهد کرد. استثنای ساختار افزایشی برای افزونههایی است که پیشوند +no... دارند: این افزونهها گزینه مشخصشده و هر افزونه دیگری را که ممکن است به حضور آن افزونه وابسته باشد غیرفعال میکنند.
برای مثال، -march=armv7-a+simd+nofp+vfpv4 معادل نوشتن -march=armv7-a+vfpv4 است، چرا که گزینه +simd کاملاً توسط گزینه +nofp که به دنبال آن میآید غیرفعال میشود.
بیشتر نامهای افزونهها به صورت عمومی نامگذاری شدهاند، اما اثری دارند که به معماری اعمالشده بر آن وابسته است. برای مثال، گزینه +simd را میتوان هم بر معماری armv7-a و هم armv8-a اعمال کرد، اما افزونههای اصلی ARMv7-A Advanced SIMD (Neon) را برای armv7-a و نوع ARMv8-A را برای armv8-a فعال میکند.
جدول زیر افزونههای پشتیبانیشده را برای هر معماری فهرست میکند. معماریهایی که ذکر نشدهاند از هیچ افزونهای پشتیبانی نمیکنند.
- +fp
- دستورالعملهای ممیز شناور VFPv2. افزونه +vfpv2 میتواند به عنوان یک نام مستعار برای این افزونه استفاده شود.
- +nofp
- غیرفعال کردن دستورالعملهای ممیز شناور.
- armv7
- زیرمجموعه مشترک معماریهای ARMv7-A، ARMv7-R و ARMv7-M.
- +fp
- دستورالعملهای ممیز شناور VFPv3، با ۱۶ ثبات دقت مضاعف (double-precision). افزونه +vfpv3-d16 میتواند به عنوان یک نام مستعار برای این افزونه استفاده شود. توجه داشته باشید که ممیز شناور توسط معماری پایه ARMv7-M پشتیبانی نمیشود، اما با هر دو معماری ARMv7-A و ARMv7-R سازگار است.
- +nofp
- غیرفعال کردن دستورالعملهای ممیز شناور.
- +mp
- افزونه چندپردازشی (multiprocessing).
- +sec
- افزونه امنیتی (security).
- +fp
- دستورالعملهای ممیز شناور VFPv3، با ۱۶ ثبات دقت مضاعف. افزونه +vfpv3-d16 میتواند به عنوان یک نام مستعار برای این افزونه استفاده شود.
- +simd
- دستورالعملهای Advanced SIMD (Neon) v1 و دستورالعملهای ممیز شناور VFPv3. افزونههای +neon و +neon-vfpv3 میتوانند به عنوان نامهای مستعار برای این افزونه استفاده شوند.
- +vfpv3
- دستورالعملهای ممیز شناور VFPv3، با ۳۲ ثبات دقت مضاعف.
- +vfpv3-d16-fp16
- دستورالعملهای ممیز شناور VFPv3، با ۱۶ ثبات دقت مضاعف و عملیات تبدیل ممیز شناور با دقت نیمه (half-precision)..IP +vfpv3-fp16 4 دستورالعملهای ممیز شناور VFPv3، با ۳۲ ثبات دقت مضاعف و عملیات تبدیل ممیز شناور نیمهدقت.
- +vfpv4-d16
- دستورالعملهای ممیز شناور VFPv4، با ۱۶ ثبات دقت مضاعف.
- +vfpv4
- دستورالعملهای ممیز شناور VFPv4، با ۳۲ ثبات دقت مضاعف.
- +neon-fp16
- دستورالعملهای Advanced SIMD (Neon) v1 و ممیز شناور VFPv3، به همراه عملیات تبدیل ممیز شناور نیمهدقت.
- +neon-vfpv4
- دستورالعملهای Advanced SIMD (Neon) v2 و ممیز شناور VFPv4.
- +nosimd
- غیرفعال کردن دستورالعملهای Advanced SIMD (ممیز شناور را غیرفعال نمیکند).
- +nofp
- غیرفعال کردن دستورالعملهای ممیز شناور و Advanced SIMD.
- armv7ve
- نسخهٔ گسترشیافتهٔ معماری ARMv7-A با پشتیبانی از مجازیسازی.
- +fp
- دستورالعملهای ممیز شناور VFPv4، با ۱۶ ثبات دقت مضاعف. افزونهٔ +vfpv4-d16 میتواند به عنوان نام مستعار برای این افزونه به کار رود.
- +simd
- دستورالعملهای Advanced SIMD (Neon) v2 و ممیز شناور VFPv4. افزونهٔ +neon-vfpv4 میتواند به عنوان نام مستعار برای این افزونه به کار رود.
- +vfpv3-d16
- دستورالعملهای ممیز شناور VFPv3، با ۱۶ ثبات دقت مضاعف.
- +vfpv3
- دستورالعملهای ممیز شناور VFPv3، با ۳۲ ثبات دقت مضاعف.
- +vfpv3-d16-fp16
- دستورالعملهای ممیز شناور VFPv3، با ۱۶ ثبات دقت مضاعف و عملیات تبدیل ممیز شناور نیمهدقت.
- +vfpv3-fp16
- دستورالعملهای ممیز شناور VFPv3، با ۳۲ ثبات دقت مضاعف و عملیات تبدیل ممیز شناور نیمهدقت.
- +vfpv4-d16
- دستورالعملهای ممیز شناور VFPv4، با ۱۶ ثبات دقت مضاعف.
- +vfpv4
- دستورالعملهای ممیز شناور VFPv4، با ۳۲ ثبات دقت مضاعف.
- +neon
- دستورالعملهای Advanced SIMD (Neon) v1 و ممیز شناور VFPv3. افزونهٔ +neon-vfpv3 میتواند به عنوان نام مستعار برای این افزونه به کار رود.
- +neon-fp16
- دستورالعملهای Advanced SIMD (Neon) v1 و ممیز شناور VFPv3، به همراه عملیات تبدیل ممیز شناور نیمهدقت.
- +nosimd
- غیرفعال کردن دستورالعملهای Advanced SIMD (ممیز شناور را غیرفعال نمیکند).
- +nofp
- غیرفعال کردن دستورالعملهای ممیز شناور و Advanced SIMD.
- +crc
- دستورالعملهای بررسی افزونگی چرخهای (CRC).
- +simd
- دستورالعملهای ARMv8-A Advanced SIMD و ممیز شناور.
- +crypto
- دستورالعملهای رمزنگاری.
- +nocrypto
- غیرفعال کردن دستورالعملهای رمزنگاری.
- +nofp
- غیرفعال کردن دستورالعملهای ممیز شناور، Advanced SIMD و رمزنگاری.
- +sb
- دستورالعمل سد گمانهزنی (Speculation Barrier).
- +predres
- دستورالعملهای محدودسازی پیشبینی اجرا و داده (Execution and Data Prediction Restriction).
- +simd
- دستورالعملهای ARMv8.1-A Advanced SIMD و ممیز شناور.
- +crypto
- دستورالعملهای رمزنگاری. این گزینه همچنین دستورالعملهای Advanced SIMD و ممیز شناور را فعال میکند.
- +nocrypto
- غیرفعال کردن دستورالعملهای رمزنگاری.
- +nofp
- غیرفعال کردن دستورالعملهای ممیز شناور، Advanced SIMD و رمزنگاری.
- +sb
- دستورالعمل سد گمانهزنی (Speculation Barrier).
- +predres
- دستورالعملهای محدودسازی پیشبینی اجرا و داده (Execution and Data Prediction Restriction).
- +fp16
- دستورالعملهای پردازش دادهٔ ممیز شناور نیمهدقت. این گزینه همچنین دستورالعملهای Advanced SIMD و ممیز شناور را فعال میکند.
- +fp16fml
- افزونهٔ fmla ممیز شناور نیمهدقت. این گزینه همچنین افزونهٔ ممیز شناور نیمهدقت و دستورالعملهای Advanced SIMD و ممیز شناور را فعال میکند.
- +simd
- دستورالعملهای ARMv8.1-A Advanced SIMD و ممیز شناور.
- +crypto
- دستورالعملهای رمزنگاری. این گزینه همچنین دستورالعملهای Advanced SIMD و ممیز شناور را فعال میکند.
- +dotprod
- فعالسازی افزونهٔ ضرب نقطهای (Dot Product). این گزینه همچنین دستورالعملهای Advanced SIMD را فعال میکند.
- +nocrypto
- غیرفعال کردن افزونهٔ رمزنگاری.
- +nofp
- غیرفعال کردن دستورالعملهای ممیز شناور، Advanced SIMD و رمزنگاری.
- +sb
- دستورالعمل سد گمانهزنی (Speculation Barrier).
- +predres
- دستورالعملهای محدودسازی پیشبینی اجرا و داده (Execution and Data Prediction Restriction).
- +i8mm
- دستورالعملهای ضرب ماتریسی اعداد صحیح ۸ بیتی (8-bit Integer Matrix Multiply). این گزینه همچنین دستورالعملهای Advanced SIMD و ممیز شناور را فعال میکند..IP +bf16 4 دستورالعملهای ممیز شناور با دقت نیمه Brain. این گزینه همچنین دستورالعملهای Advanced SIMD و ممیز شناور را فعال میکند.
- +fp16
- دستورالعملهای پردازش دادهٔ ممیز شناور با دقت نیمه. این گزینه همچنین دستورالعملهای Advanced SIMD و ممیز شناور و نیز افزونهٔ Dot Product و افزونهٔ fmla ممیز شناور با دقت نیمه را فعال میکند.
- +simd
- دستورالعملهای ممیز شناور و Advanced SIMD مربوط به ARMv8.3-A و همچنین افزونهٔ Dot Product.
- +crypto
- دستورالعملهای رمزنگاری. این گزینه همچنین دستورالعملهای Advanced SIMD و ممیز شناور و نیز افزونهٔ Dot Product را فعال میکند.
- +nocrypto
- غیرفعال کردن افزونهٔ رمزنگاری.
- +nofp
- غیرفعال کردن دستورالعملهای ممیز شناور، Advanced SIMD و رمزنگاری.
- +sb
- دستورالعمل سد گمانهزنی (Speculation Barrier).
- +predres
- دستورالعملهای محدودسازی پیشبینی اجرا و داده (Execution and Data Prediction Restriction).
- +i8mm
- دستورالعملهای ضرب ماتریسی اعداد صحیح ۸ بیتی. این گزینه همچنین دستورالعملهای Advanced SIMD و ممیز شناور را فعال میکند.
- +bf16
- دستورالعملهای ممیز شناور با دقت نیمه Brain. این گزینه همچنین دستورالعملهای Advanced SIMD و ممیز شناور را فعال میکند.
- +fp16
- دستورالعملهای پردازش دادهٔ ممیز شناور با دقت نیمه. این گزینه همچنین دستورالعملهای Advanced SIMD و ممیز شناور و نیز افزونهٔ Dot Product و افزونهٔ fmla ممیز شناور با دقت نیمه را فعال میکند.
- +simd
- دستورالعملهای ممیز شناور و Advanced SIMD مربوط به ARMv8.3-A و همچنین افزونهٔ Dot Product.
- +crypto
- دستورالعملهای رمزنگاری. این گزینه همچنین دستورالعملهای Advanced SIMD و ممیز شناور و نیز افزونهٔ Dot Product را فعال میکند.
- +nocrypto
- غیرفعال کردن افزونهٔ رمزنگاری.
- +nofp
- غیرفعال کردن دستورالعملهای ممیز شناور، Advanced SIMD و رمزنگاری.
- +i8mm
- دستورالعملهای ضرب ماتریسی اعداد صحیح ۸ بیتی. این گزینه همچنین دستورالعملهای Advanced SIMD و ممیز شناور را فعال میکند.
- +bf16
- دستورالعملهای ممیز شناور با دقت نیمه Brain. این گزینه همچنین دستورالعملهای Advanced SIMD و ممیز شناور را فعال میکند.
- +fp16
- دستورالعملهای پردازش دادهٔ ممیز شناور با دقت نیمه. این گزینه همچنین دستورالعملهای Advanced SIMD و ممیز شناور و نیز افزونهٔ Dot Product و افزونهٔ fmla ممیز شناور با دقت نیمه را فعال میکند.
- +simd
- دستورالعملهای ممیز شناور و Advanced SIMD مربوط به ARMv8.3-A و همچنین افزونهٔ Dot Product.
- +crypto
- دستورالعملهای رمزنگاری. این گزینه همچنین دستورالعملهای Advanced SIMD و ممیز شناور و نیز افزونهٔ Dot Product را فعال میکند.
- +nocrypto
- غیرفعال کردن افزونهٔ رمزنگاری.
- +nofp
- غیرفعال کردن دستورالعملهای ممیز شناور، Advanced SIMD و رمزنگاری.
- +i8mm
- دستورالعملهای ضرب ماتریسی اعداد صحیح ۸ بیتی. این گزینه همچنین دستورالعملهای Advanced SIMD و ممیز شناور را فعال میکند.
- +bf16
- دستورالعملهای ممیز شناور با دقت نیمه Brain. این گزینه همچنین دستورالعملهای Advanced SIMD و ممیز شناور را فعال میکند.
- +fp.sp
- دستورالعملهای ممیز شناور VFPv3 با دقت تکی. افزونهٔ +vfpv3xd میتواند به عنوان نام مستعاری برای این افزونه استفاده شود.
- +fp
- دستورالعملهای ممیز شناور VFPv3 با ۱۶ ثبات با دقت مضاعف. افزونهٔ +vfpv3-d16 میتواند به عنوان نام مستعاری برای این افزونه استفاده شود.
- +vfpv3xd-d16-fp16
- دستورالعملهای ممیز شناور VFPv3 با دقت تکی با ۱۶ ثبات دقت مضاعف و عملیات تبدیل ممیز شناور با دقت نیمه.
- +vfpv3-d16-fp16
- دستورالعملهای ممیز شناور VFPv3 با ۱۶ ثبات با دقت مضاعف و عملیات تبدیل ممیز شناور با دقت نیمه.
- +nofp
- غیرفعال کردن افزونهٔ ممیز شناور.
- +idiv
- دستورالعملهای تقسیم عدد صحیح در حالت ARM.
- +noidiv
- غیرفعال کردن افزونهٔ تقسیم عدد صحیح در حالت ARM.
- +fp
- دستورالعملهای ممیز شناور VFPv4 با دقت تکی.
- +fpv5
- دستورالعملهای ممیز شناور FPv5 با دقت تکی.
- +fp.dp
- دستورالعملهای ممیز شناور FPv5 با دقت تکی و مضاعف.
- +nofp
- غیرفعال کردن افزونههای ممیز شناور.
- +dsp
- دستورالعملهای DSP.
- +mve
- دستورالعملهای اعداد صحیح M-Profile Vector Extension (MVE).
- +mve.fp
- دستورالعملهای اعداد صحیح و ممیز شناور با دقت یگانه در M-Profile Vector Extension (MVE).
- +fp
- دستورالعملهای ممیز شناور با دقت یگانه.
- +fp.dp
- دستورالعملهای ممیز شناور با دقت یگانه و دوگانه.
- +nofp
- غیرفعال کردن افزونهٔ ممیز شناور.
- +cdecp0, +cdecp1, ... , +cdecp7
- فعال کردن Custom Datapath Extension (CDE) روی کمکپردازندههای انتخابشده بر پایهٔ شمارههای ارائهشده در گزینهها در بازهٔ 0 تا 7.
- +pacbti
- فعال کردن افزونهٔ احراز هویت اشارهگر و شناسایی مقصد انشعاب (Pointer Authentication and Branch Target Identification Extension).
- +dsp
- دستورالعملهای DSP.
- +nodsp
- غیرفعال کردن افزونهٔ DSP.
- +fp
- دستورالعملهای ممیز شناور با دقت یگانه.
- +fp.dp
- دستورالعملهای ممیز شناور با دقت یگانه و دوگانه.
- +nofp
- غیرفعال کردن افزونهٔ ممیز شناور.
- +cdecp0, +cdecp1, ... , +cdecp7
- فعال کردن Custom Datapath Extension (CDE) روی کمکپردازندههای انتخابشده بر پایهٔ شمارههای ارائهشده در گزینهها در بازهٔ 0 تا 7.
- +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 بهینهسازی کند. هدف، تولید کدی است که روی محبوبترین پردازندههای کنونی بهخوبی اجرا شود، و ایجاد تعادلی میان بهینهسازیهایی که به سود برخی پردازندهها در این بازه هستند و پرهیز از تلههای افت کارایی در سایر پردازندهها است. تأثیرات این گزینه ممکن است در نسخههای آیندهٔ GCC با آمدن و رفتن مدلهای CPU تغییر یابد.
گزینهٔ -mtune همان گزینههای افزونهٔ مجاز در -mcpu را میپذیرد، اما این گزینههای افزونه تأثیری بر بهینهسازی کارایی کد تولیدشده ندارند.
گزینهٔ -mtune=native باعث میشود کامپایلر CPU رایانهٔ ساخت را بهطور خودکار تشخیص دهد. در حال حاضر، این قابلیت تنها در GNU/Linux پشتیبانی میشود و همهٔ معماریها شناسایی نمیشوند. اگر تشخیص خودکار ناموفق باشد، این گزینه هیچ تأثیری نخواهد داشت.
- -mcpu=name[+extension...]
- این گزینه
نام
پردازندهٔ
ARM مقصد را
مشخص
میکند. GCC از
این نام
برای تعیین
نام معماری
ARM مقصد (گویی
با -march مشخص
شده باشد) و
نوع
پردازندهٔ
ARM جهت
بهینهسازی
کارایی
(گویی با -mtune
مشخص شده
باشد)
استفاده
میکند. در
مواردی که
این گزینه
در کنار -march
یا -mtune
استفاده
شود، آن
گزینهها
بر بخش
مربوطه از
این گزینه
اولویت
خواهند
داشت.
بسیاری از پردازندههای پشتیبانیشده افزونههای معماری اختیاری را پیادهسازی میکنند. در مواردی که چنین باشد، افزونههای معماری معمولاً بهطور پیشفرض فعال هستند. چنانچه پیادهسازیهایی فاقد آن افزونه وجود داشته باشند، میتوان از نحو افزونه برای غیرفعال کردن افزونههایی که حذف شدهاند استفاده کرد. برای دستورالعملهای ممیز شناور و Advanced SIMD (Neon)، تنظیمات گزینههای -mfloat-abi و -mfpu نیز باید در نظر گرفته شوند: دستورالعملهای ممیز شناور و Advanced SIMD تنها در صورتی استفاده خواهند شد که -mfloat-abi روی soft تنظیم نشده باشد؛ و هر تنظیمی از -mfpu بهجز auto، دستورالعملهای افزونهٔ ممیز شناور و SIMD در دسترس را بازنویسی خواهد کرد.
برای نمونه، cortex-a9 را میتوان در سه پیکربندی اصلی یافت: فقط عدد صحیح، تنها با یک واحد ممیز شناور، یا با ممیز شناور و Advanced SIMD. حالت پیشفرض فعال کردن همهٔ دستورالعملها است، اما میتوان از افزونههای +nosimd و +nofp به ترتیب برای غیرفعال کردن تنها SIMD یا هر دو گروه دستورالعملهای SIMD و ممیز شناور استفاده کرد.
نامهای مجاز برای این گزینه مشابه با نامهای مجاز برای -mtune است.
گزینههای افزونهٔ زیر میان پردازندههای فهرستشده مشترک هستند:
- +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) را روی همپردازندههای انتخابشده بر اساس اعداد ارائهشده در گزینهها در بازهٔ ۰ تا ۷ روی cortex-m52، cortex-m55، cortex-m85 و star-mc1 فعال میکند.
- +nofp
- دستورالعملهای ممیز شناور را روی arm9e، arm946e-s، arm966e-s، arm968e-s، arm10e، arm1020e، arm1022e، arm926ej-s، arm1026ej-s، cortex-r5، cortex-r7، cortex-r8، cortex-m4، cortex-m7، cortex-m33، cortex-m35p، cortex-m52، cortex-m55 و cortex-m85 غیرفعال میکند. دستورالعملهای ممیز شناور و SIMD را روی generic-armv7-a، cortex-a5، cortex-a7، cortex-a8، cortex-a9، cortex-a12، cortex-a15، cortex-a17، cortex-a15.cortex-a7، cortex-a17.cortex-a7، cortex-a32، cortex-a35، cortex-a53 و cortex-a55 غیرفعال میکند.
- +nofp.dp
- بخش دقت مضاعف (double-precision) دستورالعملهای ممیز شناور را روی cortex-r5، cortex-r7، cortex-r8، cortex-r52، cortex-r52plus و cortex-m7 غیرفعال میکند.
- +nosimd
- دستورالعملهای SIMD (اما نه ممیز شناور) را روی generic-armv7-a، cortex-a5، cortex-a7 و cortex-a9 غیرفعال میکند.
- +crypto
- دستورالعملهای رمزنگاری را روی cortex-a32، cortex-a35، cortex-a53، cortex-a55، cortex-a57، cortex-a72، cortex-a73، cortex-a75، exynos-m1، xgene1، cortex-a57.cortex-a53، cortex-a72.cortex-a53، cortex-a73.cortex-a35، cortex-a73.cortex-a53 و cortex-a75.cortex-a55 فعال میکند.
علاوه بر این، شبههدف generic-armv7-a بهطور پیشفرض از VFPv3 با ۱۶ ثبات دقت مضاعف استفاده میکند. این هدف از گزینههای افزونهٔ زیر پشتیبانی میکند: mp، sec، vfpv3-d16، vfpv3، vfpv3-d16-fp16، vfpv3-fp16، vfpv4-d16، vfpv4، neon، neon-vfpv3، neon-fp16، neon-vfpv4. معانی آنها مشابه افزونههای مربوط به -march=armv7-a است.
استفاده از -mcpu=generic-arch نیز مجاز است و معادل با -march=arch -mtune=generic-arch میباشد. برای اطلاعات بیشتر -mtune را ببینید.
گزینهٔ -mcpu=native باعث میشود کامپایلر پردازندهٔ رایانهٔ ساخت را بهطور خودکار شناسایی کند. در حال حاضر، این قابلیت تنها روی GNU/Linux پشتیبانی میشود و همهٔ معماریها شناسایی نمیشوند. اگر تشخیص خودکار ناموفق باشد، این گزینه هیچ اثری نخواهد داشت.
گزینهٔ -mcpu=unset باعث میشود کامپایلر هرگونه گزینهٔ -mcpu=... را که پیشتر در خط فرمان آمده نادیده بگیرد و بهگونهای عمل کند که گویی این گزینه هرگز ارسال نشده است. این برای جلوگیری از هشدارهای مربوط به تداخل گزینههای CPU و معماری، زمانی که این دو مشخصات متفاوتی برای معماری ایجاد میکنند، مفید است.
- -mfpu=name
- این گزینه
مشخص
میکند چه
سختافزار
ممیز
شناوری (یا
شبیهسازی
سختافزاری)
روی هدف در
دسترس است.
نامهای
مجاز
عبارتند از:
auto، vfpv2، vfpv3،
vfpv3-fp16، vfpv3-d16،
vfpv3-d16-fp16، vfpv3xd،
vfpv3xd-fp16، neon-vfpv3،
neon-fp16، vfpv4، vfpv4-d16،
fpv4-sp-d16، neon-vfpv4،
fpv5-d16، fpv5-sp-d16، fp-armv8،
neon-fp-armv8 و crypto-neon-fp-armv8.
توجه داشته
باشید که neon
یک نام
مستعار
برای neon-vfpv3 و vfp
نام
مستعاری
برای vfpv2 است.
تنظیم auto حالت پیشفرض و خاص است. این تنظیم باعث میشود کامپایلر دستورالعملهای ممیز شناور و Advanced SIMD را بر اساس تنظیمات -mcpu و -march انتخاب کند.
اگر سختافزار ممیز شناور انتخابشده شامل افزونهٔ NEON باشد (مانند -mfpu=neon)، توجه داشته باشید که عملیات ممیز شناور توسط گذر بردارسازی خودکار GCC's تولید نخواهد شد مگر اینکه -funsafe-math-optimizations نیز مشخص شده باشد. دلیل این امر این است که سختافزار NEON استاندارد IEEE 754 را برای محاسبات ممیز شناور بهطور کامل پیادهسازی نمیکند (بهویژه مقادیر غیرعادی (denormal) بهعنوان صفر در نظر گرفته میشوند)، بنابراین استفاده از دستورالعملهای NEON ممکن است منجر به کاهش دقت شود.
شما همچنین میتوانید نام fpu را در سطح تابع با استفاده از پراگماها یا مشخصههای تابع target("fpu=") تعیین کنید.
- -mfp16-format=name
- قالب نوع دادهٔ ممیز شناور با نیمدقت "__fp16" را مشخص میکند. نامهای مجاز عبارتند از none، ieee و alternative؛ حالت پیشفرض none است که در این حالت نوع دادهٔ "__fp16" تعریف نمیشود.
- -mstructure-size-boundary=n
- اندازهٔ
تمام
ساختارها
(structures) و
اجتماعها
(unions) به مضربی
از تعداد
بیتهای
تعیینشده
توسط این
گزینه رو به
بالا گرد
میشود.
مقادیر
مجاز ۸، ۳۲
و ۶۴ هستند.
مقدار
پیشفرض
برای
زنجیرهابزارهای
مختلف
متفاوت است.
برای
زنجیرهابزارهایی
که COFF را هدف
قرار
میدهند،
مقدار
پیشفرض ۸
است. مقدار
۶۴ تنها در
صورتی مجاز
است که ABI
زیربنایی
از آن
پشتیبانی
کند.
تعیین عدد بزرگتر میتواند کدی سریعتر و بهینهتر تولید کند، اما ممکن است اندازهٔ برنامه را نیز افزایش دهد. مقادیر مختلف بهطور بالقوه با یکدیگر ناسازگار هستند. کدی که با یک مقدار کامپایل شده باشد، در صورت تبادل اطلاعات از طریق ساختارها یا اجتماعها، لزوماً نمیتواند با کد یا کتابخانههایی که با مقدار دیگری کامپایل شدهاند کار کند.
این گزینه منسوخ شده است.
- -mabort-on-noreturn
- یک فراخوانی به تابع "abort" در انتهای یک تابع "noreturn" ایجاد میکند. اگر تابع تلاش کند بازگردد، این فراخوانی اجرا میشود.
- -mlong-calls
- -mno-long-calls
- به
کامپایلر
اعلام
میکند که
فراخوانی
توابع را
ابتدا با
بارگذاری
آدرس تابع
در یک ثبات
و سپس انجام
فراخوانی
زیرروال
روی این
ثبات انجام
دهد. در
صورتی که
تابع هدف
خارج از
محدودهٔ
آدرسدهی
۶۴
مگابایتی
نسخهٔ
مبتنی بر
آفست دستور
فراخوانی
زیرروال
قرار داشته
باشد، به
این گزینه
نیاز است.
حتی اگر این گزینه فعال باشد، همهٔ فراخوانیهای توابع به فراخوانیهای طولانی (long calls) تبدیل نمیشوند. قاعدهٔ کلی این است که توابع ایستا (static)، توابعی که دارای مشخصهٔ "short_call" هستند، توابعی که در دامنهٔ دستور "#pragma no_long_calls" قرار دارند، و توابعی که تعاریف آنها از قبل در همان واحد کامپایل جاری کامپایل شده است، به فراخوانیهای طولانی تبدیل نمیشوند. استثنائات این قاعده این است که تعاریف توابع ضعیف (weak)، توابع با مشخصهٔ "long_call" یا مشخصهٔ "section"، و توابعی که در دامنهٔ دستور "#pragma long_calls" قرار دارند، همواره به فراخوانیهای طولانی تبدیل میشوند.
این قابلیت بهطور پیشفرض فعال نیست. تعیین گزینهٔ -mno-long-calls رفتار پیشفرض را بازیابی میکند، همانطور که قرار دادن فراخوانی توابع در دامنهٔ دستور "#pragma long_calls_off" این کار را انجام میدهد. توجه داشته باشید که این گزینهها هیچ تاثیری بر نحوهٔ تولید کد توسط کامپایلر برای مدیریت فراخوانی توابع از طریق اشارهگرهای تابع ندارند.
- -msingle-pic-base
- با ثبات مورد استفاده برای آدرسدهی PIC بهصورت فقطخواندنی رفتار میکند، بهجای اینکه آن را در مقدمهٔ (prologue) هر تابع بارگذاری کند. سیستم زمان اجرا مسئول مقداردهی اولیهٔ این ثبات با مقداری مناسب پیش از شروع اجرا است.
- -mpic-register=reg
- ثبات مورد استفاده برای آدرسدهی PIC را مشخص میکند. برای حالت پایهٔ استاندارد PIC، مقدار پیشفرض هر ثبات مناسبی است که توسط کامپایلر تعیین شود. برای حالت پایهٔ تکی PIC، اگر هدف مبتنی بر EABI باشد یا بررسی پشته فعال باشد، پیشفرض R9 است؛ در غیر این صورت مقدار پیشفرض R10 خواهد بود.
- -mpic-data-is-text-relative
- فرض میکند
که فاصلهٔ
جابهجایی
میان
بخشهای
متن (text) و داده
(data) در زمان
پیوند
ایستا ثابت
است. این به
کامپایلر
اجازه
میدهد تا
با استفاده
از عملیات
آدرسدهی
وابسته به PC
به
دادههایی
که مشخص است
در بخش داده
قرار دارند
دسترسی
پیدا کند.
برای اهداف
غیر VxWorks RTP، این
گزینه
بهطور
پیشفرض
فعال است.
هنگام
غیرفعال
شدن روی
چنین
اهدافی،
گزینهٔ -msingle-pic-base
را بهطور
پیشفرض
فعال
میکند..IP
-mpoke-function-name 4 نام هر
تابع را
مستقیماً
پیش از
پیشدرآمد
تابع (prologue)، در
بخش text
مینویسد.
کد
تولیدشده
مشابه زیر
است:
t0 .ascii "arm_poke_function_name", 0 .align t1 .word 0xff000000 + (t1 - t0) arm_poke_function_name mov ip, sp stmfd sp!, {fp, ip, lr, pc} sub fp, ip, #4هنگام انجام ردگیری پشته (stack backtrace)، کد میتواند مقدار "pc" ذخیرهشده در "fp + 0" را بررسی کند. اگر تابع ردگیری سپس به مکان "pc - 12" نگاه کند و ۸ بیت بالایی تنظیم شده باشند، آنگاه مشخص میشود که نام تابعی بلافاصله پیش از این مکان جاسازی شده و طول آن برابر "((pc[-3]) & 0xff000000)" است.
- -mthumb
- -marm
- بین تولید
کدی که در
وضعیتهای
ARM و Thumb اجرا
میشود،
انتخاب
میکند.
پیشفرض در
بیشتر
پیکربندیها
تولید کدی
است که در
وضعیت ARM
اجرا شود،
اما این
پیشفرض
میتواند
با
پیکربندی GCC
از طریق
گزینه
پیکربندی
--with-mode=state تغییر
کند.
همچنین میتوانید وضعیت ARM و Thumb را برای هر تابع با استفاده از صفتها یا عملگرهای عملیاخته (pragmas) تابعی target("thumb") و target("arm") بازنویسی (override) کنید.
- -mtpcs-frame
- یک فریم پشته (stack frame) سازگار با استاندارد فراخوانی روال Thumb (یا TPCS) برای تمامی توابع غیربرگی (non-leaf) تولید میکند. (تابع برگی تابعی است که هیچ تابع دیگری را فراخوانی نمیکند.) مقدار پیشفرض -mno-tpcs-frame است.
- -mtpcs-leaf-frame
- یک فریم پشته سازگار با استاندارد فراخوانی روال Thumb برای تمامی توابع برگی تولید میکند. (تابع برگی تابعی است که هیچ تابع دیگری را فراخوانی نمیکند.) مقدار پیشفرض -mno-apcs-leaf-frame است.
- -mcallee-super-interworking
- به تمامی توابعِ دارای دسترسی خارجی در فایل در حال کامپایل، سرآیندی از مجموعه دستورالعملهای ARM اختصاص میدهد که پیش از اجرای بقیه تابع، به حالت Thumb تغییر وضعیت میدهد. این ویژگی امکان فراخوانی این توابع را از کدهای فاقد تعاملپذیری (non-interworking) فراهم میکند. این گزینه در پیکربندیهای AAPCS معتبر نیست، چرا که تعاملپذیری به طور پیشفرض فعال است.
- -mcaller-super-interworking
- به فراخوانیها از طریق اشارهگرهای تابع (شامل توابع مجازی) اجازه میدهد بدون توجه به اینکه کد مقصد برای تعاملپذیری کامپایل شده است یا خیر، به درستی اجرا شوند. در صورت فعال بودن این گزینه، سربار اندکی در هزینه اجرای اشارهگر تابع وجود خواهد داشت. این گزینه در پیکربندیهای AAPCS معتبر نیست، زیرا تعاملپذیری به طور پیشفرض فعال است.
- -mtp=name
- مدل دسترسی برای اشارهگر فضای ذخیرهسازی محلی رشته (TLS) را مشخص میکند. مدل soft فراخوانیهایی به "__aeabi_read_tp" تولید میکند. سایر مدلهای پذیرفتهشده عبارتند از tpidrurw، tpidruro و tpidrprw که اشارهگر رشته را مستقیماً از ثبات سیستمی متناظر واکشی میکنند (از معماری arm6k به بعد پشتیبانی میشود). این ثباتهای سیستمی از طریق واسط پردازنده کمکی CP15 قابل دسترسی هستند و آرگومان cp15 نیز به عنوان یک نام مستعار برای tpidruro پذیرفته میشود. آرگومان auto از بهترین روش موجود برای پردازنده انتخابشده استفاده میکند. تنظیم پیشفرض auto است.
- -mtls-dialect=dialect
- گویش مورد استفاده برای دسترسی به فضای ذخیرهسازی محلی رشته را مشخص میکند. دو گویش پشتیبانی میشوند: gnu و gnu2. گویش gnu طرحواره اصلی GNU را برای پشتیبانی از مدلهای پویای محلی و سراسری TLS انتخاب میکند. گویش gnu2 طرح توصیفگر GNU را برمیگزیند که کارایی بهتری را برای کتابخانههای اشتراکی فراهم میسازد. طرح توصیفگر GNU با طرح اصلی سازگار است، اما نیازمند پشتیبانی جدید اسمبلر، پیونددهنده و کتابخانه است. مدلهای TLS اجرایی اولیه (initial exec) و محلی (local exec) تحت تأثیر این گزینه قرار نمیگیرند و همواره از طرح اصلی استفاده میکنند.
- -mword-relocations
- تنها بازنشانیهای مطلق (absolute relocations) را روی مقادیری به اندازه کلمه (یعنی R_ARM_ABS32) تولید میکند. این گزینه به طور پیشفرض روی مقصدهایی (مانند uClinux و SymbianOS) که بارگذار زمان اجرا این محدودیت را تحمیل میکند، و همچنین هنگامی که -fpic یا -fPIC مشخص شده باشد، فعال است. این گزینه با -mslow-flash-data تداخل دارد.
- -mfix-cortex-m3-ldrd
- برخی از هستههای Cortex-M3 میتوانند هنگام استفاده از دستورالعملهای "ldrd" با ثباتهای مقصد و پایه متداخل، موجب خرابی دادهها شوند. این گزینه از تولید این دستورالعملها جلوگیری میکند. این گزینه به طور پیشفرض هنگام مشخص شدن -mcpu=cortex-m3 فعال است.
- -mfix-cortex-a57-aes-1742098
- -mno-fix-cortex-a57-aes-1742098
- -mfix-cortex-a72-aes-1655431
- -mno-fix-cortex-a72-aes-1655431
- کاهش اثر (یا غیرفعالسازی آن) برای یک خطای سختافزاری (erratum) در Cortex-A57 و Cortex-A72 را که بر دستورالعملهای رمزنگاری AES تأثیر میگذارد، فعال میکند. این گزینه به طور پیشفرض در صورت مشخص شدن -mcpu=cortex-a57 یا -mcpu=cortex-a72 فعال است.
- -munaligned-access
- -mno-unaligned-access
- خواندن و
نوشتن
مقادیر ۱۶ و
۳۲ بیتی را
از
آدرسهایی
که تراز ۱۶
یا ۳۲ بیتی
ندارند
فعال (یا
غیرفعال)
میکند. به
طور
پیشفرض،
دسترسی
ناتراز
برای تمامی
معماریهای
پیش از ARMv6،
تمامی ARMv6-M و
معماریهای
پایه ARMv8-M Baseline
غیرفعال
است و برای
تمامی
معماریهای
دیگر فعال
میباشد.
اگر دسترسی
ناتراز
فعال
نباشد،
دسترسی به
کلمات در
ساختارهای
داده
فشردهشده
(packed) به صورت
بایت به
بایت انجام
میگیرد.
صفت ARM با نام "Tag_CPU_unaligned_access" در فایل شیء تولیدشده، بسته به تنظیم این گزینه، روی true یا false قرار میگیرد. اگر دسترسی ناتراز فعال باشد، نماد پیشپردازنده "__ARM_FEATURE_UNALIGNED" نیز تعریف میشود.
- -mslow-flash-data
- فرض میکند که بارگذاری دادهها از حافظه flash کندتر از واکشی دستورالعمل است. بنابراین بارگذاری مقادیر تحتاللفظی (literal load) برای دستیابی به کارایی بهتر به حداقل میرسد. این گزینه تنها هنگام کامپایل برای ARMv7 M-profile پشتیبانی میشود و به طور پیشفرض خاموش است. این گزینه با -mword-relocations تداخل دارد.
- -masm-syntax-unified
- فرض میکند که اسمبلر درونخطی از نحو یکپارچه asm استفاده میکند. پیشفرض در حال حاضر خاموش است که به معنای نحو تفکیکشده (divided syntax) میباشد. این گزینه هیچ تأثیری بر Thumb2 ندارد؛ با این حال ممکن است در نسخههای بعدی GCC تغییر کند. نحو تفکیکشده باید منسوخ تلقی شود.
- -mrestrict-it
- تولید بلوکهای IT را محدود میکند تا با قواعد ARMv8-A مطابقت داشته باشد. بلوکهای IT تنها میتوانند شامل یک دستورالعمل تک ۱۶ بیتی از یک مجموعه برگزیده از دستورالعملها باشند. این گزینه به طور پیشفرض برای حالت ARMv8-A Thumb روشن است.
- -mpure-code
- اجازه قرارگیری دادههای ثابت در بخشهای کد را نمیدهد. علاوه بر این، هنگام کامپایل برای قالب شیء ELF، به تمامی بخشهای text ویژگی بخش ویژه پردازنده ELF یعنی "SHF_ARM_PURECODE" را اختصاص میدهد. این گزینه تنها هنگام تولید کد غیر-pic برای مقصدهای M-profile در دسترس است.
- -mcmse
- کد امن را مطابق با «ARMv8-M Security Extensions: Requirements on Development Tools Engineering Specification» تولید میکند که در نشانی https://developer.arm.com/documentation/ecm0359818/latest قابل دسترسی است.
- -mfix-cmse-cve-2021-35465
- اثر یک مشکل امنیتی بالقوه را در دستورالعمل "VLLDM" در برخی از دستگاههای M-profile هنگام استفاده از CMSE کاهش میدهد (CVE-2021-365465). این گزینه به طور پیشفرض زمانی فعال است که گزینه -mcpu= به همراه "cortex-m33"، "cortex-m35p"، "cortex-m52"، "cortex-m55"، "cortex-m85" یا "star-mc1" استفاده شود. گزینه -mno-fix-cmse-cve-2021-35465 میتواند برای غیرفعال کردن این کاهش اثر استفاده شود.
- -mstack-protector-guard=guard
- -mstack-protector-guard-offset=offset
- کد محافظت از پشته را با استفاده از قناری در guard تولید میکند. مکانهای پشتیبانیشده عبارتند از global برای یک قناری سراسری یا tls برای یک قناری در دسترس از طریق ثبات TLS. گزینه -mstack-protector-guard-offset= برای استفاده با -fstack-protector-guard=tls در نظر گرفته شده است و برای استفاده در کدهای فضای کاربری (user-land) نیست.
- -mfdpic
- -mno-fdpic
- واسط
دوتایی
برنامه (ABI)
مربوط به FDPIC
را انتخاب
میکند، که
از
توصیفکنندههای
تابع ۶۴
بیتی برای
نمایش
اشارهگرها
به توابع
استفاده
میکند.
هنگامی که
کامپایلر
برای
مقصدهای
"arm-*-uclinuxfdpiceabi"
پیکربندی
شده باشد،
این گزینه
به طور
پیشفرض
فعال است و
در صورتی که
هیچیک از
گزینههای
مرتبط با PIC/PIE
ارائه نشده
باشد، به
طور ضمنی -fPIE
را فعال
میکند. در
سایر
مقصدها،
تنها
قابلیتهای
تولید کد
مختص FDPIC را
فعال
میسازد و
کاربر در
صورت نیاز
باید
گزینههای
مربوط به PIC/PIE
را صراحتاً
ارائه دهد.
توجه داشته باشید که پیوند ایستا پشتیبانی نمیشود، زیرا هنگام بازنشانی خودکار برنامه (self-relocation) همچنان پیونددهنده پویا را درگیر میکند. اگر چنین رفتاری قابل قبول باشد، از گزینههای -static و -Wl,-dynamic-linker استفاده کنید.
گزینه معکوس -mno-fdpic برای ساخت هسته لینوکس با استفاده از همان زنجیره ابزار ("arm-*-uclinuxfdpiceabi") که برای ساخت برنامههای فضای کاربری استفاده میشود، مفید (و الزامی) است..IP -mbranch-protection=features 4 فعالسازی ویژگیهای محافظت از انشعاب (تنها armv8.1-m.main).
features میتواند یکی از شکلهای زیر را داشته باشد:
none کد را بدون محافظت از انشعاب یا امضای آدرس بازگشت تولید میکند.
standard کد را با تمام ویژگیهای محافظت از انشعاب فعالشده در سطح استانداردشان تولید میکند.
pac-ret کد را در حالی تولید میکند که امضای آدرس بازگشت در سطح استاندارد تنظیم شده است؛ یعنی تمام توابعی که آدرس بازگشت را در حافظه ذخیره میکنند امضا میشوند.
pac-ret+leaf امضای pac-ret را گسترش میدهد تا توابع برگی (leaf) را نیز حتی اگر آدرس بازگشت را در حافظه ذخیره نکنند، شامل شود.
bti دستورالعملهای فرودگاهی (landing-pad) را به مقصدهای مجاز دستورالعملهای انشعاب غیرمستقیم اضافه میکند.
اگر پشتیبانی از افزونهٔ معماری +pacbti فعال نشده باشد (مثلاً از طریق -march=)، تمام عملیاتهای محافظت از انشعاب و امضای آدرس بازگشت مقید به استفاده از دستورالعملهایی هستند که تنها در فضای architectural-NOP تعریف شدهاند. کد تولیدشده همچنان با نسخههای پیشین معماری سازگار با گذشته (backwards-compatible) باقی میماند، اما امنیت اضافی میتواند در زمان اجرا روی پردازندههایی که از افزونهٔ PACBTI پشتیبانی میکنند فعال شود.
اجرای اجباری مقصد انشعاب با استفاده از BTI تنها در صورتی میتواند در زمان اجرا فعال شود که تمام کدهای برنامه دستکم با -mbranch-protection=bti کامپایل شده باشند.
هر تنظیمی غیر از none تنها در armv8-m.main یا جدیدتر پشتیبانی میشود.
حالت پیشفرض، تولید کد بدون محافظت از انشعاب یا امضای آدرس بازگشت است.
- -mvectorize-with-neon-quad
- -mvectorize-with-neon-double
- کنترل اینکه آیا برداریسازی (vectorization) از ثباتهای quad-word یا double-word در NEON استفاده کند یا خیر. حالت پیشفرض -mvectorize-with-neon-quad است.
گزینههای AVR
این گزینهها برای پیادهسازیهای AVR تعریف شدهاند:
- -mmcu=mcu
- معماری
مجموعه
دستورالعمل
(ISA) یا نوع
قطعهٔ AVR را
مشخص
میکند.
پیشفرض
برای این
گزینه
"avr2" است.
دستگاهها و ISAهای AVR زیر پشتیبانی میشوند. نکته: پشتیبانی کامل از یک دستگاه متشکل از کد راهاندازی "crtmcu.o"، یک هدر دستگاه "avr/io*.h"، یک کتابخانهٔ دستگاه "libmcu.a" و یک فایل device-specs ("https://gcc.gnu.org/wiki/avr-gcc#spec-files") با نام "specs-mcu" است. کامپایلر تنها مورد آخر را بر اساس "mcu"های پشتیبانیشدهٔ زیر ارائه میدهد. مابقی موارد توسط AVR-LibC ("https://github.com/avrdudes/avr-libc") یا بهوسیلهٔ فایلهای "atpack" ("https://gcc.gnu.org/wiki/avr-gcc#atpack") از سوی سازندهٔ سختافزار پشتیبانی میشوند.
- "avr2"
- دستگاههای «Classic» با حداکثر 8 KiB حافظهٔ برنامه. mcu = "attiny22", "attiny26", "at90s2313", "at90s2323", "at90s2333", "at90s2343", "at90s4414", "at90s4433", "at90s4434", "at90c8534", "at90s8515", "at90s8535".
- "avr25"
- دستگاههای «Classic» با حداکثر 8 KiB حافظهٔ برنامه و دارای دستورالعمل "MOVW". mcu = "attiny13", "attiny13a", "attiny24", "attiny24a", "attiny25", "attiny261", "attiny261a", "attiny2313", "attiny2313a", "attiny43u", "attiny44", "attiny44a", "attiny45", "attiny48", "attiny441", "attiny461", "attiny461a", "attiny4313", "attiny84", "attiny84a", "attiny85", "attiny87", "attiny88", "attiny828", "attiny841", "attiny861", "attiny861a", "ata5272", "ata6616c", "at86rf401".
- "avr3"
- دستگاههای «Classic» با 16 KiB تا 64 KiB حافظهٔ برنامه. mcu = "at76c711", "at43usb355".
- "avr31"
- دستگاههای «Classic» با 128 KiB حافظهٔ برنامه. mcu = "atmega103", "at43usb320".
- "avr35"
- دستگاههای «Classic» با 16 KiB تا 64 KiB حافظهٔ برنامه و دارای دستورالعمل "MOVW". mcu = "attiny167", "attiny1634", "atmega8u2", "atmega16u2", "atmega32u2", "ata5505", "ata6617c", "ata664251", "at90usb82", "at90usb162".
- "avr4"
- دستگاههای «Enhanced» با حداکثر 8 KiB حافظهٔ برنامه. mcu = "atmega48", "atmega48a", "atmega48p", "atmega48pa", "atmega48pb", "atmega8", "atmega8a", "atmega8hva", "atmega88", "atmega88a", "atmega88p", "atmega88pa", "atmega88pb", "atmega8515", "atmega8535", "ata5795", "ata6285", "ata6286", "ata6289", "ata6612c", "at90pwm1", "at90pwm2", "at90pwm2b", "at90pwm3", "at90pwm3b", "at90pwm81".
- "avr5"
- دستگاههای «Enhanced» با 16 KiB تا 64 KiB حافظهٔ برنامه. mcu = "atmega16", "atmega16a", "atmega16hva", "atmega16hva2", "atmega16hvb", "atmega16hvbrevb", "atmega16m1", "atmega16u4", "atmega161", "atmega162", "atmega163", "atmega164a", "atmega164p", "atmega164pa", "atmega165", "atmega165a", "atmega165p", "atmega165pa", "atmega168", "atmega168a", "atmega168p", "atmega168pa", "atmega168pb", "atmega169", "atmega169a", "atmega169p", "atmega169pa", "atmega32", "atmega32a", "atmega32c1", "atmega32hvb", "atmega32hvbrevb", "atmega32m1", "atmega32u4", "atmega32u6", "atmega323", "atmega324a", "atmega324p", "atmega324pa", "atmega324pb", "atmega325", "atmega325a", "atmega325p", "atmega325pa", "atmega328", "atmega328p", "atmega328pb", "atmega329", "atmega329a", "atmega329p", "atmega329pa", "atmega3250", "atmega3250a", "atmega3250p", "atmega3250pa", "atmega3290", "atmega3290a", "atmega3290p", "atmega3290pa", "atmega406", "atmega64", "atmega64a", "atmega64c1", "atmega64hve", "atmega64hve2", "atmega64m1", "atmega64rfr2", "atmega640", "atmega644", "atmega644a", "atmega644p", "atmega644pa", "atmega644rfr2", "atmega645", "atmega645a", "atmega645p", "atmega649", "atmega649a", "atmega649p", "atmega6450", "atmega6450a", "atmega6450p", "atmega6490", "atmega6490a", "atmega6490p", "ata5790", "ata5790n", "ata5791", "ata6613c", "ata6614q", "ata5782", "ata5831", "ata8210", "ata8510", "ata5787", "ata5835", "ata5700m322", "ata5702m322", "at90pwm161", "at90pwm216", "at90pwm316", "at90can32", "at90can64", "at90scr100", "at90usb646", "at90usb647", "at94k", "m3000".
- "avr51"
- دستگاههای «Enhanced» با 128 KiB حافظهٔ برنامه. mcu = "atmega128", "atmega128a", "atmega128rfa1", "atmega128rfr2", "atmega1280", "atmega1281", "atmega1284", "atmega1284p", "atmega1284rfr2", "at90can128", "at90usb1286", "at90usb1287".
- "avr6"
- دستگاههای «Enhanced» با شمارندهٔ برنامه (PC) سه بایتی، یعنی با بیش از 128 KiB حافظهٔ برنامه. mcu = "atmega256rfr2", "atmega2560", "atmega2561", "atmega2564rfr2".
- "avrxmega2"
- دستگاههای «XMEGA» با بیش از 8 KiB و حداکثر 64 KiB حافظهٔ برنامه. mcu = "atxmega8e5", "atxmega16a4", "atxmega16a4u", "atxmega16c4", "atxmega16d4", "atxmega16e5", "atxmega32a4", "atxmega32a4u", "atxmega32c3", "atxmega32c4", "atxmega32d3", "atxmega32d4", "atxmega32e5", "avr64da28", "avr64da28s", "avr64da32", "avr64da32s", "avr64da48", "avr64da48s", "avr64da64", "avr64da64s", "avr64db28", "avr64db32", "avr64db48", "avr64db64", "avr64dd14", "avr64dd20", "avr64dd28", "avr64dd32", "avr64du28", "avr64du32", "avr64ea28", "avr64ea32", "avr64ea48", "avr64sd28", "avr64sd32", "avr64sd48".
- "avrxmega3"
- دستگاههای «XMEGA» با حداکثر 64 KiB حافظهٔ برنامه و RAM به صورت ترکیبی، و با حافظهٔ برنامهای که در فضای نشانی RAM قابل مشاهده است. mcu = "attiny202", "attiny204", "attiny212", "attiny214", "attiny402", "attiny404", "attiny406", "attiny412", "attiny414", "attiny416", "attiny416auto", "attiny417", "attiny424", "attiny426", "attiny427", "attiny804", "attiny806", "attiny807", "attiny814", "attiny816", "attiny817", "attiny824", "attiny826", "attiny827", "attiny1604", "attiny1606", "attiny1607", "attiny1614", "attiny1616", "attiny1617", "attiny1624", "attiny1626", "attiny1627", "attiny3214", "attiny3216", "attiny3217", "attiny3224", "attiny3226", "attiny3227", "atmega808", "atmega809", "atmega1608", "atmega1609", "atmega3208", "atmega3209", "atmega4808", "atmega4809", "avr16dd14", "avr16dd20", "avr16dd28", "avr16dd32", "avr16du14", "avr16du20", "avr16du28", "avr16du32", "avr16ea28", "avr16ea32", "avr16ea48", "avr16eb14", "avr16eb20", "avr16eb28", "avr16eb32", "avr16la14", "avr16la20", "avr16la28", "avr16la32", "avr32da28", "avr32da28s", "avr32da32", "avr32da32s", "avr32da48", "avr32da48s", "avr32db28", "avr32db32", "avr32db48", "avr32dd14", "avr32dd20", "avr32dd28", "avr32dd32", "avr32du14", "avr32du20", "avr32du28", "avr32du32", "avr32ea28", "avr32ea32", "avr32ea48", "avr32eb14", "avr32eb20", "avr32eb28", "avr32eb32", "avr32la14", "avr32la20", "avr32la28", "avr32la32", "avr32sd20", "avr32sd28", "avr32sd32".
- "avrxmega4"
- دستگاههای «XMEGA» با بیش از 64 KiB و حداکثر 128 KiB حافظهٔ برنامه. mcu = "atxmega64a3", "atxmega64a3u", "atxmega64a4u", "atxmega64b1", "atxmega64b3", "atxmega64c3", "atxmega64d3", "atxmega64d4", "avr128da28", "avr128da28s", "avr128da32", "avr128da32s", "avr128da48", "avr128da48s", "avr128da64", "avr128da64s", "avr128db28", "avr128db32", "avr128db48", "avr128db64".
- "avrxmega5"
- دستگاههای «XMEGA» با بیش از 64 KiB و حداکثر 128 KiB حافظهٔ برنامه و بیش از 64 KiB حافظهٔ RAM. mcu = "atxmega64a1", "atxmega64a1u".
- "avrxmega6"
- دستگاههای «XMEGA» با بیش از 128 KiB حافظهٔ برنامه. mcu = "atxmega128a3", "atxmega128a3u", "atxmega128b1", "atxmega128b3", "atxmega128c3", "atxmega128d3", "atxmega128d4", "atxmega192a3", "atxmega192a3u", "atxmega192c3", "atxmega192d3", "atxmega256a3", "atxmega256a3b", "atxmega256a3bu", "atxmega256a3u", "atxmega256c3", "atxmega256d3", "atxmega384c3", "atxmega384d3".
- "avrxmega7"
- دستگاههای «XMEGA» با بیش از 128 KiB حافظهٔ برنامه و بیش از 64 KiB حافظهٔ RAM. mcu = "atxmega128a1", "atxmega128a1u", "atxmega128a4u".
- "avrtiny"
- دستگاههای با هستهٔ Tiny از نوع «Reduced Tiny» تنها با ۱۶ ثبات همهمنظوره و 512 B تا 4 KiB حافظهٔ برنامه. mcu = "attiny4", "attiny5", "attiny9", "attiny10", "attiny102", "attiny104", "attiny20", "attiny40".
- "avr1"
- این ISA توسط هستهٔ کمینهٔ AVR پیادهسازی شده و تنها برای اسمبلر پشتیبانی میشود. mcu = "attiny11", "attiny12", "attiny15", "attiny28", "at90s1200".
- -mabsdata
- فرض میکند که تمام دادهها در حافظهٔ ایستا میتوانند توسط دستورالعملهای LDS / STS دسترسیپذیر باشند. این گزینه تنها بر روی دستگاههای تقلیلیافتهٔ Tiny مانند ATtiny40 اثر دارد. همچنین ویژگی متغیر "absdata" در AVR Attributes,variable attribute را ببینید.
- -mcvt
- استفاده از
یک جدول
بردار
فشرده (CVT).
برخی
دستگاهها
از یک CVT با
تنها چهار
ورودی
پشتیبانی
میکنند: 0=Reset،
1=NMI، 2=Prio1 IRQ، 3=Prio0 IRQs. این
گزینه
بهجای
"crtmcu.o"
معمول، کد
راهاندازی
را از
"crtmcu-cvt.o"
پیوند (link)
میدهد.
علاوه بر
ارائهٔ یک
جدول بردار
فشرده، کد
راهاندازی
بیت
"CPUINT_CTRLA.CPUINT_CVT"
را تنظیم
خواهد کرد
که CVT را روی
دستگاه
فعال
میکند.
هنگامی که نمیخواهید کد راهاندازی بیت "CPUINT_CTRLA.CPUINT_CVT" را تنظیم کند، میتوانید نماد "__init_cvt" را مقداردهی کنید تا کد مربوطه دیگر از "libmcu.a" وارد نشود. بهعنوان مثال، میتوانید با "-Wl,--defsym,__init_cvt=0" پیوند دهید.
کد راهاندازی CVT از نسخهٔ AVR-LibC v2.3 ("https://github.com/avrdudes/avr-libc/issues/1010") به بعد در دسترس است.
- -mdouble=bits
- -mlong-double=bits
- اندازه (به بیت) نوعهای "double" یا "long double" را به ترتیب تعیین میکند. مقادیر ممکن برای bits برابر با 32 و 64 هستند. مجاز بودن یا نبودن یک مقدار مشخص برای bits به گزینههای پیکربندی "--with-double=" و "--with-long-double=" در configure بستگی دارد ("https://gcc.gnu.org/install/configure.html#avr")، و همین موضوع برای مقادیر پیشفرض گزینهها نیز صدق میکند.
- -mgas-isr-prologues
- روالهای سرویس وقفه (ISRها) ممکن است از شبهدستور "__gcc_isr" که توسط GNU Binutils پشتیبانی میشود استفاده کنند. اگر این گزینه فعال باشد، این ویژگی همچنان میتواند برای تکتک ISRها از طریق صفت تابع AVR Attributes,,"no_gccisr" غیرفعال شود. این ویژگی در صورتی که بهینهسازی فعال باشد بهطور پیشفرض فعال است (اما نه با -Og، @pxref{Optimize Options})، و به شرطی که GNU Binutils از PR21683 پشتیبانی کند ("https://sourceware.org/PR21683").
- -mint8
- نوع "int" را یک عدد صحیح ۸ بیتی فرض میکند. این مورد بر اندازه تمام انواع داده تأثیر میگذارد: یک "char" برابر با ۱ بایت، یک "int" برابر با ۱ بایت، یک "long" برابر با ۲ بایت، و "long long" برابر با ۴ بایت خواهد بود. لطفاً توجه داشته باشید که این گزینه با استانداردهای C مطابقت ندارد، اما اندازه کد تولیدشده را کاهش میدهد.
- -mmain-is-OS_task
- ثباتها را در "main" ذخیره نمیکند. اثر آن مشابه الصاق صفت AVR Attributes,,"OS_task" به "main" است. این ویژگی در صورتی که بهینهسازی روشن باشد بهطور پیشفرض فعال است.
- -mno-call-main
- تابع "main"
را از طریق
دستورهای
زیر اجرا
نمیکند:
XCALL main XJMP exit
در عوض، "main" را در بخش ".init9" ("https://avrdudes.github.io/avr-libc/avr-libc-user-manual/mem_sections.html#sec_dot_init") قرار میدهد تا نیازی به فراخوانی نباشد. با تنظیم این گزینه، کاربر تضمین میکند که "main" هرگز بازنمیگردد.
این گزینه میتواند برای دستگاههایی با منابع بسیار محدود، جهت صرفهجویی در چند بایت کد و فضای پشته استفاده شود. این قابلیت از نسخه AVR-LibC v2.3 طبق انتظار کار خواهد کرد ("https://github.com/avrdudes/avr-libc/issues/1012"). در نسخههای قدیمیتر، هیچ بهبودی در کارایی حاصل نخواهد شد.
- -mno-interrupts
- کد تولیدشده با وقفههای سختافزاری سازگار نیست. اندازه کد کوچکتر میشود.
- -mrelax
- تلاش
میکند تا
در صورت
امکان،
دستورهای
"CALL" یا
"JMP" را با
دستورهای
کوتاهتر
"RCALL" یا
"RJMP"
جایگزین
کند. تنظیم
-mrelax صرفاً
گزینه --mlink-relax
را به خط
فرمان
اسمبلر و
گزینه --relax را
به خط فرمان
پیونددهنده
(linker) اضافه
میکند.
تعدیل پرشها (Jump relaxing) توسط پیونددهنده انجام میشود، زیرا آفستهای پرش پیش از جایگذاری کد مشخص نیستند. بنابراین، کد اسمبلی تولیدشده توسط کامپایلر یکسان است، اما ممکن است دستورالعملهای موجود در فایل اجرایی با دستورالعملهای موجود در کد اسمبلی متفاوت باشند.
در صورت نیاز به استابهای پیونددهنده (linker stubs)، باید relaxing فعال باشد؛ بخش مربوط به "EIND" و استابهای پیونددهنده را در زیر ببینید.
- -mpmem-wrap-around
- چرخش شمارنده برنامه (program counter wrap-around) را در بهینهسازی پیونددهنده فعال میکند.
- -mrodata-in-ram
- -mno-rodata-in-ram
- بخشهای
".rodata" را
برای
دادههای
فقطخواندنی
به ترتیب در
RAM یا در
حافظه
برنامه
قرار
میدهد.
برای بیشتر
دستگاهها
انتخابی
وجود ندارد
و این گزینه
بیشتر شبیه
به یک اعلان
قطعی (assertion) عمل
میکند.
از نسخه 14 و برای دستگاههای AVR64* و AVR128*، بخش ".rodata" بهطور پیشفرض در حافظه فلش قرار میگیرد، به شرط آنکه پشتیبانی مورد نیاز در GNU Binutils (PR31124 ("https://sourceware.org/PR31124")) در دسترس باشد. در آن حالت، میتوان از -mrodata-in-ram برای بازگشت به چیدمان قدیمی با قرار دادن ".rodata" در RAM استفاده کرد.
- -mtiny-stack
- تنها ۸ بیت پایینی اشارهگر پشته را تغییر میدهد.
- -mfract-convert-truncate
- اجازه میدهد تا برای نوعهای ممیزثابت کسری، به جای گرد کردن به سمت صفر از برش (truncation) استفاده شود.
- -nodevicelib
- با
کتابخانه
اختصاصی
دستگاه در AVR-LibC
یعنی
"libmcu.a"
پیوند
برقرار
نمیکند.
توجه داشته باشید که از نسخه AVR-LibC v2.3، این کتابخانه شامل کدهایی است که برای عملکرد صحیح برنامه ضروری هستند. بهویژه، شامل بخشهایی از کد راهاندازی (startup code) مانند موارد زیر است: "__init_sp" ("https://github.com/avrdudes/avr-libc/issues/1011") برای مقداردهی اولیه اشارهگر پشته با نماد "__stack"، "__init_cvt" ("https://github.com/avrdudes/avr-libc/issues/1010") برای آمادهسازی سختافزار جهت استفاده از جدول بردار فشرده با -mcvt، "__call_main" ("https://github.com/avrdudes/avr-libc/issues/1012") برای فراخوانی "main" و "exit"، و "__do_flmap_init" ("https://github.com/avrdudes/avr-libc/issues/931") برای تنظیم FLMAP بر اساس نماد "__flmap".
- -nodevicespecs
- مقدار
-specs=device-specs/specs-mcu را
به خط فرمان
راهانداز
کامپایلر
اضافه
نمیکند.
کاربر
مسئولیت
تأمین
گزینههای
مناسب خط
فرمان برای
زیرپردازشهایی
مانند
کامپایلر
اصلی،
اسمبلر و
پیونددهنده
را بر عهده
میگیرد.
این بدان
معناست که
کاربر باید
فایل
مشخصات
اختصاصی
دستگاه خود
را از طریق
-specs=path-to-specs-file
ارائه دهد.
در این صورت
دیگر نیازی
به گزینه
-mmcu=mcu نخواهد
بود.
این گزینه همچنین میتواند بهعنوان جایگزینی برای روش قدیمیتر تعیین فایلهای سفارشی device-specs به کار رود؛ روشی که در آن نیاز بود -B some-path به دایرکتوریای اشاره کند که حاوی پوشهای به نام "device-specs" بود که آن هم شامل فایل مشخصاتی به نام "specs-mcu" میشد، جایی که mcu توسط -mmcu=mcu تعیین شده بود.
- -Waddr-space-convert
- در مواردی که فضای آدرس حاصل در فضای آدرس مبدأ گنجانده نشده باشد، درباره تبدیلهای بین فضاهای آدرس هشدار میدهد.
- -Wmisspelled-isr
- در صورتی که نام ISR اشتباه نوشته شده باشد (یعنی بدون پیشوند __vector باشد) هشدار میدهد. بهطور پیشفرض فعال است.
گزینههای بهینهسازی AVR (AVR Optimization Options)
گزینههای زیر، گزینههای بهینهسازی خالص هستند. گزینههای -mgas-isr-prologues، -mmain-is-OS_task، -mno-call-main و -mrelax که در بالا آمدند، تنها تقریباً گزینه بهینهسازی محسوب میشوند، زیرا موارد نادری وجود دارد که در آنها تفاوت در کد تولیدشده اهمیت پیدا میکند.
- -maccumulate-args
- آرگومانهای
خروجی تابع
را انباشته
کرده و فضای
پشته مورد
نیاز برای
آرگومانهای
خروجی تابع
را یکبار
در
مقدمه/پایانبخش
(prologue/epilogue) تابع
تخصیص
داده/آزاد
میکند.
بدون این
گزینه،
آرگومانهای
خروجی پیش
از
فراخوانی
تابع روی
پشته قرار
گرفته (push) و پس
از آن
برداشته
میشوند (pop).
همچنین
گزینه
بهینهسازی
-fdefer-pop را
ببینید: Optimize
Options,,optimization option.
برداشتن آرگومانها از پشته پس از فراخوانی تابع در AVR میتواند پرهزینه باشد، بنابراین انباشته کردن فضای پشته ممکن است منجر به فایلهای اجرایی کوچکتر شود، زیرا نیازی به حذف آرگومانها از پشته پس از چنین فراخوانیهایی نخواهد بود.
این گزینه میتواند حجم کد را برای توابعی که چندین بار توابعی با آرگومانهای روی پشته را فراخوانی میکنند (مانند توابع شبیه به printf)، کاهش دهد.
- -mbranch-cost=cost
- هزینه انشعاب را برای دستورالعملهای انشعاب شرطی روی cost تنظیم میکند. مقادیر معقول برای cost اعداد صحیح، کوچک و غیرمنفی هستند. هزینه پیشفرض انشعاب 0 است.
- -mcall-prologues
- مقدمهها و پایانبخشهای توابع بهصورت فراخوانی زیرروالهای مناسب بسط داده میشوند. اندازه کد کوچکتر میشود.
- -mfuse-add
- -mno-fuse-add
- -mfuse-add=level
- دسترسیهای غیرمستقیم به حافظه را در دستگاههای کوچکشده Tiny بهینهسازی میکند. حالت پیشفرض برای بهینهسازیهای -Og و -O1 از مقدار "level=1" و برای بهینهسازیهای بالاتر از مقدار "level=2" استفاده میکند. مقادیر معتبر برای level عبارتند از 0، 1 و 2.
- -mfuse-move
- -mno-fuse-move
- اجرای یک مرحله بهینهسازی پس از بارگذاری مجدد (post reload) که تلاش میکند دستورالعملهای انتقال (move) را ادغام کرده و دستورالعملهای چندبایتی را به عملیاتهای ۸ بیتی تقسیم کند. حالت پیشفرض برای بهینهسازی -O1 مقدار "level=3"، و برای سطوح بهینهسازی بالاتر مقدار "level=23" را استفاده میکند. مقادیر معتبر برای level در بازه 0 ... 23 قرار دارند که یک مقدار مبنای مختلط (mixed radix) 3:2:2:2 است. هر رقم جنبهای از بهینهسازی را کنترل میکند.
- -mfuse-move2
- اجرای یک مرحله بهینهسازی پس از ترکیب (post combine) که تلاش میکند دستورالعملهای انتقال (move) را ادغام کند.
- -mstrict-X
- استفاده از
ثبات
آدرسدهی
"X" به
روشی که
توسط
سختافزار
پیشنهاد
شده است.
بدین معنی
که از "X"
تنها در
آدرسدهی
غیرمستقیم،
پسافزایشی
(post-increment) یا
پیشکاهشی
(pre-decrement) استفاده
میشود.
بدون این گزینه، ثبات "X" ممکن است به همان شیوهٔ "Y" یا "Z" استفاده شود که در این حالت با دستورالعملهای اضافی شبیهسازی خواهد شد. بهعنوان مثال، بارگذاری یک مقدار با آدرسدهی "X+const" با مقدار نامنفی و کوچک "const < 64" در ثبات Rn بهصورت زیر انجام میشود:
adiw r26, const ; X += const ld <Rn>, X ; <Rn> = *X sbiw r26, const ; X -= const
- -msplit-bit-shift
- تقسیم شیفتهای چندبایتی با آفست ثابت به یک شیفت با آفست بایتی و یک شیفت باقیمانده با آفست غیربایتی. این بهینهسازی بهطور پیشفرض برای -O2 و بالاتر، شامل -Os اما بهجز -Oz، فعال است. تقسیم شیفتها با آفست ثابتی که مضربی از ۸ باشد توسط -mfuse-move کنترل میشود.
- -msplit-ldst
- تقسیم بارگذاریها و ذخیرهسازیهای چندبایتی به چندین بارگذاری و ذخیرهسازی تکبایتی. این بهینهسازی بهطور پیشفرض برای -O2 و بالاتر فعال است.
- -muse-nonzero-bits
- فعالسازی بهینهسازیهایی که تنها زمانی امکانپذیرند که برخی بیتها در یک ثبات همواره صفر باشند. این بهینهسازی بهطور پیشفرض برای -O2 و بالاتر فعال است.
"EIND" و دستگاههایی با بیش از ۱۲۸ کیبیبایت فلش
اشارهگرها در این پیادهسازی ۱۶ بیتی هستند. آدرس یک تابع یا برچسب بهصورت آدرس کلمهای (word address) نمایش داده میشود تا پرشها و فراخوانیهای غیرمستقیم بتوانند به هر آدرس کدی در محدوده ۶۴ کیبیکلمه هدفگیری کنند.
بهمنظور تسهیل پرشهای غیرمستقیم در دستگاههایی با بیش از ۱۲۸ کیبیبایت فضای حافظه برنامه، یک ثبات با کاربرد خاص به نام "EIND" وجود دارد که هنگام استفاده از دستورالعملهای "EICALL" یا "EIJMP" بهعنوان پرارزشترین بخش آدرس هدف عمل میکند.
پرشها و فراخوانیهای غیرمستقیم در این دستگاهها توسط کامپایلر بهصورت زیر مدیریت میشوند و مشمول برخی محدودیتها هستند:
- کامپایلر هرگز "EIND" را مقداردهی نمیکند.
- کامپایلر از "EIND" بهطور ضمنی در دستورالعملهای "EICALL"/"EIJMP" استفاده میکند، یا ممکن است "EIND" را مستقیماً بخواند تا یک فراخوانی/پرش غیرمستقیم را با استفاده از دستورالعمل "RET" شبیهسازی کند.
- کامپایلر فرض میکند که "EIND" هرگز در حین اجرای کد راهاندازی یا در طول برنامه تغییر نمیکند. بهویژه، "EIND" در مقدمه/پایان (prologue/epilogue) توابع یا روتینهای سرویس وقفه ذخیره یا بازیابی نمیشود.
- برای فراخوانیهای غیرمستقیم به توابع و gotoهای محاسبهشده (computed goto)، پیونددهنده قطعهکدهای واسط (stub) تولید میکند. استابها سکوهای پرش هستند که گاهی ترامپولین (trampoline) نیز نامیده میشوند. بنابراین، فراخوانی/پرش غیرمستقیم به چنین استابی میپرد. استاب حاوی یک پرش مستقیم به آدرس مد نظر است.
- بهینهسازی relaxation پیونددهنده باید فعال باشد تا پیونددهنده بتواند در تمام شرایط استابها را بهدرستی ایجاد کند. گزینه کامپایلر -mrelax و گزینه پیونددهنده --relax را ببینید. موارد خاصی وجود دارد که پیونددهنده قرار است استاب تولید کند اما در صورت فعال نبودن relaxation، بدون ارائه پیام خطای مفید متوقف میشود.
- اسکریپت پیشفرض پیونددهنده برای کدهایی با "EIND = 0" تنظیم شده است. اگر قرار باشد کد در شرایطی با "EIND != 0" کار کند، باید از یک اسکریپت پیونددهنده سفارشی استفاده شود تا بخشهایی که نام آنها با ".trampolines" آغاز میشود در قطعهای قرار گیرند که "EIND" به آن اشاره میکند.
- کد راهاندازی libgcc هرگز "EIND" را تنظیم نمیکند. توجه داشته باشید که کد راهاندازی ترکیبی از کدهای libgcc و AVR-LibC است. برای بررسی تأثیر AVR-LibC بر روی "EIND"، راهنمای کاربری AVR-LibC را ببینید ("https://avrdudes.github.io/avr-libc/avr-libc-user-manual").
- برای کدهای
راهاندازی
اختصاصی
کاربر مجاز
است که
"EIND" را
زودتر
مقداردهی
کنند،
بهعنوان
مثال با
استفاده از
کد
مقداردهی
اولیه که در
بخش ".init3"
قرار دارد.
این کد پیش
از کدهای
عمومی
راهاندازی
که RAM را
مقداردهی
اولیه کرده
و
سازندهها
را
فراخوانی
میکنند
اجرا
میشود،
اما بعد از
بخشی از کد
راهاندازی
AVR-LibC اجرا
خواهد شد که
"EIND" را
روی
قطعهای
تنظیم
میکند که
جدول بردار
در آن واقع
شده است.
#include <avr/io.h> static void __attribute__((section(".init3"),naked,used,no_instrument_function)) init3_set_eind (void) { __asm volatile ("ldi r24,pm_hh8(__trampolines_start)\n\t" "out %i0,r24" :: "n" (&EIND) : "r24","memory"); }نماد "__trampolines_start" در اسکریپت پیونددهنده تعریف شده است.
- استابها در صورتی بهطور خودکار توسط پیونددهنده تولید میشوند که دو شرط زیر برقرار باشند:
- -<آدرس یک برچسب با استفاده از اصلاحگر "gs" گرفته شده باشد>
- (کوتاهشدهٔ
generate stubs) مانند:
LDI r24, lo8(gs(<func>)) LDI r25, hi8(gs(<func>))
- -<مکان نهایی آن برچسب در یک قطعه کد باشد>
- خارج از قطعهای که استابها در آن قرار دارند.
- *
- کامپایلر چنین اصلاحگرهای "gs" را برای برچسبهای کد در موقعیتهای زیر صادر میکند:
- -<گرفتن آدرس یک تابع یا برچسب کد.>
- -<دستورات gotoی محاسبهشده (Computed goto).>
- -<اگر از تابع prologue-save استفاده شده باشد؛ به گزینه خط فرمان -mcall-prologues>
- مراجعه کنید.
- -<جدولهای توزیع switch/case. اگر چنین جدولهای توزیعی را نمیخواهید،>
- میتوانید گزینه خط فرمان -fno-jump-tables را مشخص کنید.
- -<سازندهها/ویرانگرهای C و C++ که در زمان راهاندازی/خاموشی فراخوانی میشوند.>
- -<اگر ابزارها با یک اصلاحگر ()gs که در بالا توضیح داده شد برخورد کنند.>
- *
- پرش به
آدرسهای
غیرنمادین
بهصورت
زیر
پشتیبانی
نمیشود:
int main (void) { /* Call function at word address 0x2 */ return ((int(*)(void)) 0x2)(); }در عوض، باید یک استاب تنظیم شود، یعنی تابع باید از طریق یک نماد ("func_4" در این مثال) فراخوانی گردد:
int main (void) { extern int func_4 (void); /* Call function at byte address 0x4 */ return func_4(); }و برنامه با -Wl,--defsym,func_4=0x4 پیوند داده شود. همچنین میتوان "func_4" را در اسکریپت پیونددهنده تعریف کرد..PP مدیریت ثباتهای با کاربرد خاص "RAMPD"، "RAMPX"، "RAMPY" و "RAMPZ"
برخی از دستگاههای AVR از حافظههایی بزرگتر از محدودهٔ 64 KiB که با اشارهگرهای ۱۶ بیتی قابل دسترسی هستند، پشتیبانی میکنند. برای دسترسی به مکانهای حافظه در خارج از این محدودهٔ 64 KiB، محتوای یک ثبات "RAMP" بهعنوان بخش بالایی آدرس استفاده میشود: ثباتهای آدرس "X"، "Y"، "Z" به ترتیب با ثباتهای با کاربرد خاص "RAMPX"، "RAMPY"، "RAMPZ" الحاق میشوند تا یک آدرس عریض به دست آید. به طور مشابه، "RAMPD" همراه با آدرسدهی مستقیم استفاده میشود.
- کد راهاندازی، ثباتهای با کاربرد خاص "RAMP" را با صفر مقداردهی اولیه میکند.
- اگر از یک AVR Named Address Spaces,فضای آدرس نامگذاریشده غیر از generic یا "__flash" استفاده شود، آنگاه "RAMPZ" در صورت نیاز پیش از عملیات تنظیم میشود.
- اگر دستگاه از RAM بزرگتر از 64 KiB پشتیبانی کند و کامپایلر برای انجام عملیاتی نیاز به تغییر "RAMPZ" داشته باشد، "RAMPZ" پس از پایان عملیات به صفر بازنشانی میشود.
- اگر دستگاه دارای یک ثبات "RAMP" مشخص باشد، پرولوگ/اپیلوگ روتین وقفه (ISR) آن SFR را ذخیره/بازیابی کرده و آن را با صفر مقداردهی اولیه میکند تا در صورتی که کد ISR (به طور ضمنی) از آن استفاده کند، آماده باشد.
- حافظهٔ RAM بزرگتر از 64 KiB توسط GCC برای اهداف AVR پشتیبانی نمیشود. اگر از اسمبلی درونخطی (inline assembler) برای خواندن از مکانهایی خارج از محدودهٔ آدرسدهی ۱۶ بیتی استفاده کرده و یکی از ثباتهای "RAMP" را تغییر میدهید، باید پس از دسترسی دوباره آن را به صفر بازنشانی کنید.
ماکروهای توکار AVR
کامپایلر GCC چندین ماکروی توکار را تعریف میکند تا کد کاربر بتواند وجود یا عدم وجود قابلیتها را بیازماید. تقریباً تمام ماکروهای توکار زیر از قابلیتهای دستگاه استنتاج شده و بنابراین با گزینهٔ خط فرمانی -mmcu= فعال میشوند.
برای ماکروهای توکار اختصاصی AVR بیشتر، به AVR Named Address Spaces و AVR Built-in Functions مراجعه کنید.
- "__AVR_ARCH__"
- ماکروی
توکاری که
به یک عدد
دهدهی
مشخصکنندهٔ
معماری بسط
مییابد و
به گزینهٔ
-mmcu=mcu بستگی
دارد.
مقادیر
ممکن
عبارتند از:
2, 25, 3, 31, 35, 4, 5, 51, 6
برای mcu="avr2", "avr25", "avr3", "avr31", "avr35", "avr4", "avr5", "avr51", "avr6",
به ترتیب و
100, 102, 103, 104, 105, 106, 107
به ترتیب برای mcu="avrtiny", "avrxmega2", "avrxmega3", "avrxmega4", "avrxmega5", "avrxmega6", "avrxmega7". اگر mcu یک دستگاه را تعیین کند، این ماکروی توکار متناسب با آن مقداردهی میشود. برای نمونه، با -mmcu=atmega8 این ماکرو برابر با 4 تعریف میشود.
- "__AVR_Device__"
- تنظیم -mmcu=device
این ماکروی
توکار را
تعریف
میکند که
نمایانگر
نام دستگاه
است. برای
نمونه، -mmcu=atmega8
ماکروی
توکار
"__AVR_ATmega8__" و
-mmcu=attiny261a ماکروی
"__AVR_ATtiny261A__" را
تعریف
میکند، و
غیره.
نامهای ماکروهای توکار از الگوی "__AVR_Device__" پیروی میکنند که در آن Device همان نام دستگاه طبق راهنمای کاربر AVR است. تفاوت بین Device در ماکروی توکار و device در -mmcu=device در این است که دومی همیشه با حروف کوچک نوشته میشود.
اگر device یک دستگاه نبوده بلکه تنها یک معماری هسته مانند avr51 باشد، این ماکرو تعریف نمیشود.
- "__AVR_DEVICE_NAME__"
- تنظیم -mmcu=device
این ماکروی
توکار را
برابر با
نام دستگاه
تعیین
میکند.
برای
نمونه، با
-mmcu=atmega8 این
ماکرو
برابر با
"atmega8"
تعریف
میشود.
اگر device یک دستگاه نبوده بلکه تنها یک معماری هسته مانند avr51 باشد، این ماکرو تعریف نمیشود.
- "__AVR_CVT__"
- کد با گزینهٔ "-mcvt" برای استفاده از یک compact vector table (جدول بردار فشرده) کامپایل میشود.
- "__AVR_XMEGA__"
- دستگاه / معماری متعلق به خانوادهٔ دستگاههای XMEGA است.
- "__AVR_HAVE_ADIW__"
- دستگاه دارای دستورالعملهای "ADIW" و "SBIW" است.
- "__AVR_HAVE_ELPM__"
- دستگاه دارای دستورالعمل "ELPM" است.
- "__AVR_HAVE_ELPMX__"
- دستگاه دارای دستورالعملهای "ELPM Rn,Z" و "ELPM Rn,Z+" است.
- "__AVR_HAVE_LPMX__"
- دستگاه دارای دستورالعملهای "LPM Rn,Z" و "LPM Rn,Z+" است.
- "__AVR_HAVE_MOVW__"
- دستگاه دارای دستورالعمل "MOVW" برای انجام جابهجاییهای ۱۶ بیتی ثبات به ثبات است.
- "__AVR_HAVE_MUL__"
- دستگاه دارای یک ضربکنندهٔ سختافزاری است.
- "__AVR_HAVE_JMP_CALL__"
- دستگاه دارای دستورالعملهای "JMP" و "CALL" است. این مورد برای دستگاههایی با بیش از 8 KiB حافظهٔ برنامه صدق میکند.
- "__AVR_HAVE_EIJMP_EICALL__"
- "__AVR_3_BYTE_PC__"
- دستگاه دارای دستورالعملهای "EIJMP" و "EICALL" است. این مورد برای دستگاههایی با بیش از 128 KiB حافظهٔ برنامه صادق است. این امر همچنین بدین معناست که شمارندهٔ برنامه (PC) دارای پهنای ۳ بایت است.
- "__AVR_2_BYTE_PC__"
- شمارندهٔ برنامه (PC) دارای پهنای ۲ بایت است. این مورد برای دستگاههایی با حداکثر 128 KiB حافظهٔ برنامه صدق میکند.
- "__AVR_HAVE_8BIT_SP__"
- "__AVR_HAVE_16BIT_SP__"
- ثبات اشارهگر پشته (SP) توسط کامپایلر به ترتیب بهعنوان یک ثبات ۸ بیتی یا ۱۶ بیتی در نظر گرفته میشود. تعریف این ماکروها تحت تأثیر گزینهٔ -mtiny-stack قرار دارد.
- "__AVR_HAVE_SPH__"
- "__AVR_SP8__"
- دستگاه به ترتیب دارای ثبات با کاربرد خاص SPH (بخش بالایی اشارهگر پشته) است یا یک اشارهگر پشتهٔ ۸ بیتی دارد. تعریف این ماکروها تحت تأثیر -mmcu= و در موارد -mmcu=avr2 و -mmcu=avr25 همچنین تحت تأثیر -msp8 قرار دارد.
- "__AVR_HAVE_RAMPD__"
- "__AVR_HAVE_RAMPX__"
- "__AVR_HAVE_RAMPY__"
- "__AVR_HAVE_RAMPZ__"
- دستگاه به ترتیب دارای ثباتهای عملکرد ویژه "RAMPD"، "RAMPX"، "RAMPY" و "RAMPZ" است.
- "__NO_INTERRUPTS__"
- این ماکرو نشاندهنده گزینه خط فرمان -mno-interrupts است.
- "__AVR_ERRATA_SKIP__"
- "__AVR_ERRATA_SKIP_JMP_CALL__"
- برخی دستگاههای AVR (مانند AT90S8515 و ATmega103) نباید به دلیل یک نقص سختافزاری (erratum) از روی دستورالعملهای ۳۲ بیتی پرش کنند. دستورالعملهای پرش عبارتند از "SBRS"، "SBRC"، "SBIS"، "SBIC" و "CPSE". ماکروی دوم تنها زمانی تعریف میشود که "__AVR_HAVE_JMP_CALL__" نیز تنظیم شده باشد.
- "__AVR_ISA_RMW__"
- دستگاه دارای دستورالعملهای خواندن-تغییر-نوشتن (XCH، LAC، LAS و LAT) است.
- "__AVR_SFR_OFFSET__=offset"
- دستورالعملهایی که میتوانند مستقیماً ثباتهای عملکرد ویژه ورودی/خروجی را مانند "IN"، "OUT"، "SBI" و غیره آدرسدهی کنند، ممکن است از آدرسی متفاوت نسبت به حالتی که با دستورالعمل دسترسی به RAM مانند "LD" یا "STS" آدرسدهی میشوند، استفاده نمایند. این آفست به معماری دستگاه بستگی دارد و باید از آدرس RAM کسر شود تا آدرس I/O مربوطه به دست آید.
- "__AVR_SHORT_CALLS__"
- گزینه خط فرمان -mshort-calls تنظیم شده است.
- "__AVR_PM_BASE_ADDRESS__=addr"
- برخی دستگاهها از خواندن از حافظه فلش با استفاده از دستورالعملهای "LD*" پشتیبانی میکنند. حافظه فلش در فضای آدرس داده در یک آفست "__AVR_PM_BASE_ADDRESS__" دیده میشود. اگر این ماکرو تعریف نشده باشد، این ویژگی در دسترس نخواهد بود. در صورت تعریف شدن، فضای آدرس خطی است و نیازی به قرار دادن ".rodata" در RAM نیست. این موضوع توسط فایل توصیف پیونددهنده پیشفرض مدیریت میشود و در حال حاضر برای "avrtiny" و "avrxmega3" در دسترس است. حتی راحتتر از آن، نیازی به استفاده از فضاهای آدرس مانند "__flash" یا ویژگیهایی چون مشخصه "progmem" و "pgm_read_*" نخواهد بود.
- "__AVR_HAVE_FLMAP__"
- این ماکرو در صورت برقرار بودن شرایط زیر تعریف میشود:
- *<دستگاه دارای فیلد بیتی "NVMCTRL_CTRLB.FLMAP" است.>
- این مورد برای دستگاههای AVR64* و AVR128* اعمال میشود.
- *<در زمان اسمبل مشخص نیست از کدام شبیهسازی استفاده خواهد شد.>
این بدان معناست که کامپایلر با GNU Binutils که PR31124 ("https://sourceware.org/PR31124") را پیادهسازی میکند، پیکربندی شده است.
- "__AVR_RODATA_IN_RAM__"
- این ماکرو
هنگامی که
کد برای یک
معماری
پایه
کامپایل
میشود،
تعریفنشده
است.
هنگامی که کد برای یک دستگاه کامپایل میشود، اگر بخشهای ".rodata" برای دادههای فقطخواندنی در RAM قرار گیرند، این ماکرو برابر ۱ تعریف میشود؛ و در غیر این صورت، برابر ۰ تعریف میشود.
- "__WITH_AVRLIBC__"
- کامپایلر برای استفاده به همراه AVR-LibC پیکربندی شده است. گزینه پیکربندی --with-avrlibc را ببینید.
- "__HAVE_SIGNAL_N__"
- کامپایلر از signal(num) و interrupt(num) در AVR Attributes,,function attributes با آرگومان num که شماره زیرروال خدمت وقفه را مشخص میکند، پشتیبانی مینماید.
- "__HAVE_DOUBLE_MULTILIB__"
- در صورتی تعریف میشود که -mdouble= به عنوان یک گزینه multilib عمل کند.
- "__HAVE_DOUBLE32__"
- "__HAVE_DOUBLE64__"
- در صورتی تعریف میشود که کامپایلر به ترتیب از double ۳۲ بیتی یا ۶۴ بیتی پشتیبانی کند. ساختار واقعی توسط گزینه -mdouble= مشخص میشود.
- "__DEFAULT_DOUBLE__"
- اندازه "double" بر حسب بیت، در صورتی که -mdouble= تنظیم نشده باشد. برای بررسی ساختار "double" در یک برنامه، از ماکروی داخلی "__SIZEOF_DOUBLE__" استفاده کنید.
- "__HAVE_LONG_DOUBLE32__"
- "__HAVE_LONG_DOUBLE64__"
- "__HAVE_LONG_DOUBLE_MULTILIB__"
- "__DEFAULT_LONG_DOUBLE__"
- مشابه موارد بالا، اما برای "long double" به جای "double".
- "__WITH_DOUBLE_COMPARISON__"
- نشاندهنده گزینه پیکربندی "--with-double-comparison={tristate|bool|libf7}" ("https://gcc.gnu.org/install/configure.html#avr") است و برابر با 2 یا 3 تعریف میشود.
- "__WITH_LIBF7_LIBGCC__"
- "__WITH_LIBF7_MATH__"
- "__WITH_LIBF7_MATH_SYMBOLS__"
- نشاندهنده گزینه پیکربندی "--with-libf7={libgcc|math|math-symbols}" ("https://gcc.gnu.org/install/configure.html#avr") است.
گزینههای داخلی AVR (AVR Internal Options)
گزینههای زیر به صورت داخلی توسط کامپایلر و برای ارتباط بین فایلهای مشخصات دستگاه (device specs) و خود کامپایلر استفاده میشوند. نیازی به تنظیم دستی این گزینهها نیست؛ بهویژه آنکه این موارد گزینه بهینهسازی نیستند. استفاده نادرست از این گزینهها ممکن است به تولید کدهای غیربهینه یا نادرست منجر شود. این موارد صرفاً جهت کامل بودن مستندات و برای درک بهتر فایلهای مشخصات دستگاه ("https://gcc.gnu.org/wiki/avr-gcc#spec-files") مستند شدهاند.
- -mn-flash=num
- فرض میکند که حافظه فلش اندازهای معادل num برابر ۶۴ کیبیبایت دارد. این گزینه تعیین میکند کدام فضاهای آدرس "__flashN" در دسترس هستند.
- -mflmap
- دستگاه دارای فیلد بیتی "FLMAP" واقع در ثبات عملکرد ویژه "NVMCTRL_CTRLB" است.
- -mrmw
- فرض میکند که دستگاه از دستورالعملهای خواندن-تغییر-نوشتن "XCH"، "LAC"، "LAS" و "LAT" پشتیبانی میکند.
- -mshort-calls
- فرض میکند که "RJMP" و "RCALL" میتوانند کل حافظه برنامه را هدف قرار دهند. این گزینه برای تولید و انتخاب multilib برای دستگاههای معماری "avrxmega3" استفاده میشود.
- -mskip-bug
- تولید کد بدون پرش ("CPSE"، "SBRS"، "SBRC"، "SBIS"، "SBIC") از روی دستورالعملهای ۳۲ بیتی.
- -msp8
- با ثبات اشارهگر پشته به عنوان یک ثبات ۸ بیتی رفتار میکند؛ یعنی فرض میکند بایت بالایی اشارهگر پشته صفر است. این گزینه توسط کامپایلر برای انتخاب و ساخت multilibها برای معماریهای "avr2" و "avr25" استفاده میشود. این معماریها دستگاههای دارای "SPH" و فاقد آن را ترکیب میکنند..PP گزینههای Blackfin
- -mcpu=cpu[-sirevision]
- نام
پردازندهٔ
Blackfin مقصد را
مشخص
میکند. در
حال حاضر،
cpu
میتواند
یکی از
موارد bf512،
bf514، bf516، bf518،
bf522، bf523، bf524،
bf525، bf526، bf527،
bf531، bf532، bf533،
bf534، bf536، bf537،
bf538، bf539، bf542،
bf544، bf547، bf548،
bf549، bf542m، bf544m،
bf547m، bf548m، bf549m،
bf561، bf592 باشد.
بخش اختیاری sirevision نسخهٔ بازبینی سیلیکون (silicon revision) پردازندهٔ Blackfin مقصد را مشخص میکند. تمامی راهکارهای دورزدن اشکال سختافزاری (workaround) موجود برای بازبینی سیلیکونِ هدف فعال میشوند. اگر sirevision برابر با none باشد، هیچ راهکاری فعال نمیشود. اگر sirevision برابر با any باشد، تمامی راهکارها برای پردازندهٔ هدف فعال خواهند شد. ماکروی "__SILICON_REVISION__" به صورت دو رقم هگزادسیمال که نشاندهندهٔ شمارههای اصلی و فرعی در بازبینی سیلیکون هستند تعریف میشود. اگر sirevision برابر با none باشد، "__SILICON_REVISION__" تعریف نمیشود. اگر sirevision برابر با any باشد، "__SILICON_REVISION__" به صورت 0xffff تعریف میگردد. اگر این sirevision اختیاری استفاده نشود، GCC جدیدترین نسخهٔ بازبینی سیلیکون شناختهشده برای پردازندهٔ Blackfin هدف را در نظر میگیرد.
کامپایلر GCC یک ماکروی پیشپردازنده برای cpu مشخصشده تعریف میکند. برای زنجیرهٔ ابزار bfin-elf، در صورتی که گزینهٔ -msim داده نشود، این گزینه موجب پیوند خوردن BSP سختافزاری ارائهشده توسط libgloss میشود.
بدون این گزینه، بهطور پیشفرض bf532 به عنوان پردازنده استفاده میشود.
توجه داشته باشید که پشتیبانی از bf561 کامل نیست. برای bf561، تنها ماکروی پیشپردازنده تعریف میشود.
- -msim
- مشخص میکند که برنامه روی شبیهساز اجرا خواهد شد. این کار باعث پیوند خوردن BSP شبیهساز ارائهشده توسط libgloss میشود. این گزینه فقط برای زنجیرهٔ ابزار bfin-elf اثرگذار است. برخی گزینههای دیگر مانند -mid-shared-library و -mfdpic، به صورت ضمنی گزینهٔ -msim را فعال میکنند.
- -momit-leaf-frame-pointer
- اشارهگر چارچوب (frame pointer) را در توابع برگ (leaf functions) در ثبات نگه نمیدارد. این کار از دستورالعملهای ذخیره، راهاندازی و بازیابی اشارهگرهای چارچوب جلوگیری کرده و یک ثبات اضافی را در توابع برگ در دسترس قرار میدهد.
- -mspecld-anomaly
- -mno-specld-anomaly
- در صورت فعال بودن، کامپایلر اطمینان حاصل میکند که کد تولیدشده شامل بارگذاریهای حدسی (speculative loads) پس از دستورالعملهای پرش نباشد. اگر از این گزینه استفاده شود، "__WORKAROUND_SPECULATIVE_LOADS" تعریف میشود.
- -mcsync-anomaly
- -mno-csync-anomaly
- در صورت فعال بودن، کامپایلر اطمینان حاصل میکند که کد تولیدشده شامل دستورالعملهای CSYNC یا SSYNC با فاصلهٔ بسیار کم پس از انشعابهای شرطی نباشد. اگر از این گزینه استفاده شود، "__WORKAROUND_SPECULATIVE_SYNCS" تعریف میشود.
- -mlow64k
- -mno-low64k
- در صورت فعال بودن، کامپایلر مجاز است از این آگاهی که کل برنامه در 64k پایینی حافظه جای میگیرد، بهره ببرد. رفتار پیشفرض این است که فرض شود برنامه اندازهای نامحدود دارد (-mno-low64k).
- -mstack-check-l1
- بررسی پشته را با استفاده از اطلاعات قرار دادهشده در حافظهٔ یادداشت موقت (scratchpad) L1 توسط هستهٔ uClinux انجام میدهد.
- -mid-shared-library
- -mno-id-shared-library
- کدی تولید میکند که از کتابخانههای اشتراکی از طریق روش شناسهٔ کتابخانه (library ID) پشتیبانی میکند. این کار امکان «اجرا در جا» (execute in place) و کتابخانههای اشتراکی را در محیطی بدون مدیریت حافظهٔ مجازی فراهم میسازد. این گزینه به صورت ضمنی -fPIC را فعال میکند. در هدف bfin-elf، این گزینه به صورت ضمنی -msim را نیز در بر دارد. حالت پیشفرض -mno-id-shared-library است تا کدی تولید کند که فرض نمیکند کتابخانههای اشتراکی مبتنی بر شناسه به کار میروند.
- -mleaf-id-shared-library
- -mno-leaf-id-shared-library
- کدی تولید
میکند که
از
کتابخانههای
اشتراکی از
طریق روش
شناسهٔ
کتابخانه
پشتیبانی
میکند،
اما فرض را
بر این
میگذارد
که این
کتابخانه
یا فایل
اجرایی با
هیچ
کتابخانهٔ
اشتراکیِ
مبتنی بر
شناسهٔ
دیگری
پیوند
نخواهد
خورد. این
امر به
کامپایلر
اجازه
میدهد تا
از کدهای
سریعتری
برای
پرشها و
فراخوانیها
استفاده
کند.
پیشفرض -mno-leaf-id-shared-library است، که در آن فرضی مبنی بر عدم پیوند کد در حال کامپایل با کتابخانههای اشتراکیِ مبتنی بر شناسه در نظر گرفته نمیشود. در این حالت برای دستورالعملهای پرش و فراخوانی کدهای کندتری تولید میشود.
- شمارهٔ شناسایی کتابخانهٔ اشتراکیِ مبتنی بر شناسه را که در حال کامپایل است مشخص میکند. تعیین مقدار 0 کد فشردهتری تولید میکند؛ تعیین مقادیر دیگر تخصیص آن شماره را به کتابخانهٔ فعلی تحمیل میکند اما نسبت به حذف این گزینه، از نظر حافظه یا زمان بهینهتر نخواهد بود.
- -msep-data
- -mno-sep-data
- کدی تولید میکند که امکان قرارگیری قطعهٔ داده (data segment) را در ناحیهای متفاوت از حافظه نسبت به قطعهٔ کد (text segment) فراهم میآورد. این امر با حذف بازنشانیها (relocations) نسبت به بخش متن، امکان «اجرا در جا» را در یک محیط بدون مدیریت حافظهٔ مجازی فراهم میسازد. پیشفرض -mno-sep-data است که به GCC دستور میدهد کدی تولید کند که فرض میکند قطعهٔ داده بلافاصله پس از قطعهٔ کد قرار دارد.
- -mlong-calls
- -mno-long-calls
- به
کامپایلر
اعلام
میکند که
فراخوانی
توابع را
ابتدا با
بارگذاری
نشانی تابع
در یک ثبات
و سپس انجام
یک
فراخوانی
زیرروال (subroutine call)
روی این
ثبات انجام
دهد. این
سوییچ
زمانی لازم
است که تابع
هدف خارج از
دامنهٔ
آدرسدهی
۲۴ بیتیِ
دستورالعمل
فراخوانی
زیرروال
مبتنی بر
آفست قرار
داشته باشد.
این قابلیت بهطور پیشفرض فعال نیست. تعیین -mno-long-calls رفتار پیشفرض را بازمیگرداند. توجه داشته باشید که این سوییچها هیچ تأثیری بر نحوهٔ تولید کد برای رسیدگی به فراخوانی توابع از طریق اشارهگرهای تابع ندارند.
- -mfast-fp
- پیوند با کتابخانهٔ ممیز شناور سریع. این کتابخانه به منظور بهبود کارایی، برخی از قوانین استاندارد ممیز شناور IEEE را برای بررسی ورودیها در برابر «عدد نیست» (NAN) نادیده میگیرد.
- -minline-plt
- درونخطسازی (inlining) مدخلهای PLT را در فراخوانی توابعی که معلوم نیست به صورت محلی مقید (bind) میشوند، فعال میکند. این گزینه بدون -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 قابل استفاده است.
- -mcoreb
- هنگام استفاده از مدل برنامهنویسی «یک برنامه برای هر هسته»، یک برنامهٔ مستقل برای هستهٔ Core B از BF561 میسازد. برای پشتیبانی از Core B، فایلهای راهانداز و اسکریپتهای پیوند مناسب به کار گرفته میشوند و ماکروی "__BFIN_COREB" تعریف میگردد. در زمان استفاده از این گزینه، باید به جای "main" از "coreb_main" استفاده شود. این گزینه تنها در ترکیب با -mmulticore قابل استفاده است.
- -msdram
- یک برنامهٔ مستقل برای حافظهٔ SDRAM میسازد. فایلهای راهانداز و اسکریپتهای پیوند مناسب برای قرار دادن برنامه در SDRAM استفاده میشوند، و ماکروی "__BFIN_SDRAM" تعریف میگردد. بارگذار (loader) باید پیش از بارگذاری برنامه، حافظهٔ SDRAM را مقداردهی اولیه کند..IP -micplb 4 فرض میکند که ICPLBها در زمان اجرا فعال هستند. این گزینه بر برخی از راهحلهای موقت ناهنجاریها (anomaly workarounds) تأثیر میگذارد. برای اهداف لینوکس، پیشفرض این است که فرض شود ICPLBها فعال هستند؛ برای برنامههای مستقل (standalone)، پیشفرض غیرفعال بودن است.
گزینههای C6X
- -march=name
- این گزینه نام معماری هدف را تعیین میکند. GCC از این نام برای مشخص کردن نوع دستورالعملهایی که میتواند هنگام تولید کد اسمبلی ایجاد کند، استفاده میکند. نامهای مجاز عبارتند از: c62x، c64x، c64x+، c67x، c67x+، c674x.
- -mbig-endian
- تولید کد برای یک هدف big-endian.
- -mlittle-endian
- تولید کد برای یک هدف little-endian. این حالت پیشفرض است.
- -msim
- انتخاب فایلهای راهاندازی (startup) و اسکریپت پیونددهنده مناسب برای شبیهساز.
- -msdata=default
- دادههای سراسری و ایستا کوچک را در بخش ".neardata" قرار میدهد که توسط ثبات "B14" اشاره میشود. دادههای سراسری و ایستا مقداردهینشده کوچک را در بخش ".bss" که مجاور بخش ".neardata" است قرار میدهد. دادههای فقطخواندنی کوچک را در بخش ".rodata" قرار میدهد. بخشهای متناظر مورد استفاده برای تکهدادههای بزرگ عبارتند از ".fardata"، ".far" و ".const".
- -msdata=all
- تمام دادهها، و نه فقط اشیای کوچک، را در بخشهای رزرو شده برای دادههای کوچک قرار میدهد و برای دسترسی به آنها از آدرسدهی نسبی نسبت به ثبات "B14" استفاده میکند.
- -msdata=none
- از بخشهای رزرو شده برای دادههای کوچک هیچ استفادهای نمیکند و برای دسترسی به تمام دادهها از نشانیهای مطلق استفاده میکند. تمام دادههای سراسری و ایستای مقداردهیشده را در بخش ".fardata"، و تمام دادههای مقداردهینشده را در بخش ".far" قرار میدهد. تمام دادههای ثابت را در بخش ".const" قرار میدهد.
- -mdsbt
- کامپایل برای ABI کتابخانه اشتراکی DSBT. این گزینه برای کامپایل با -fpic یا -fPIC لازم است، و متضمن -fpic میباشد.
- -mlong-calls
- از تولید فراخوانیهای وابسته به PC خودداری میکند؛ در عوض از ارجاع غیرمستقیم استفاده میکند.
گزینههای CRIS
این گزینهها بهطور خاص برای پورتهای CRIS تعریف شدهاند.
- -march=architecture-type
- -mcpu=architecture-type
- تولید کد برای معماری مشخصشده. گزینههای انتخابی برای architecture-type به ترتیب برای ETRAX 4، ETRAX 100 و ETRAX 100 LX عبارتند از v3، v8 و v10. پیشفرض v0 است.
- -mtune=architecture-type
- بهینهسازی هر آنچه مربوط به کد تولیدی است برای architecture-type، بهجز ABI و مجموعه دستورالعملهای در دسترس. گزینههای انتخابی برای architecture-type همانند گزینههای -march=architecture-type هستند.
- -mmax-stackframe=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
- از نتایج کدهای شرطی حاصل از دستورالعمل قبلی استفاده نمیکند؛ همیشه پیش از استفاده از کدهای شرطی، دستورالعملهای مقایسه و آزمون را صادر میکند.
- -mno-side-effects
- دستورالعملهای دارای اثرات جانبی را در حالتهای آدرسدهی غیر از پسافزایش صادر نمیکند.
- -mstack-align
- -mno-stack-align
- -mdata-align
- -mno-data-align
- -mconst-align
- -mno-const-align
- این گزینهها (گزینههای حاوی no-) ترتیب همترازی (حذف ترتیب همترازی) فریم پشته، دادههای منفرد و ثوابت را بر اساس بیشینه اندازه دسترسی به یک قلم داده برای مدل پردازنده انتخابشده مهیا میکنند. پیشفرض، همترازی ۳۲ بیتی است. جزئیات ABI مانند چیدمان ساختار تحت تأثیر این گزینهها قرار نمیگیرند.
- -m32-bit
- -m16-bit
- -m8-bit
- همانند گزینههای همترازی پشته، داده و ثوابت در بالا، این گزینهها ترتیب همتراز شدن فریم پشته، دادههای قابل نوشتن و ثوابت را به صورت ۳۲ بیتی، ۱۶ بیتی یا ۸ بیتی فراهم میکنند. حالت پیشفرض، همترازی ۳۲ بیتی است.
- -mno-prologue-epilogue
- -mprologue-epilogue
- با -mno-prologue-epilogue، مقدمه و مؤخره عادی تابع که فریم پشته را برپا میکنند حذف میشوند و هیچ دستورالعمل بازگشت یا دنباله بازگشتی در کد تولید نمیشود. از این گزینه تنها به همراه بررسی چشمی کد کامپایلشده استفاده کنید: هیچ هشدار یا خطایی در صورتی که ثباتهای ذخیرهشونده توسط فراخواندهشده نیاز به ذخیرهسازی داشته باشند یا برای متغیرهای محلی نیاز به تخصیص حافظه باشد، صادر نمیشود.
- -mbest-lib-options
- -moverride-best-lib-options
- گزینه -mbest-lib-options گزینههایی را انتخاب میکند که بیشترین قابلیتها را که توسط سایر گزینهها مجاز شمرده شدهاند، فعال میکنند. این گزینه فرم دارای no- ندارد، اما -moverride-best-lib-options صرف نظر از ترتیب قرارگیری این دو گزینه در خط فرمان، آن را غیرفعال میکند.
- -mtrap-using-break8
- صدور تلهها به صورت break 8. این رفتار پیشفرض برای CRIS v3 به بالا است. در صورت غیرفعال بودن، به جای آن از فراخوانیهای "abort" استفاده میشود.
- -mtrap-unaligned-atomic
- صدور بررسیهایی که هنگام اعمال توابع توکار اتمیک بر روی حافظه ناتراز، باعث اجرای دستورالعملهای break 8 میشوند.
- -munaligned-atomic-may-use-library
- مدیریت توابع توکار اتمیکی که ممکن است با فراخوانی توابع کتابخانهای روی دادههای ناتراز اعمال شوند. این گزینه اولویتی بالاتر از -mtrap-unaligned-atomic دارد.
- -sim
- این گزینه ترتیبی میدهد تا پیوند با توابع ورودی-خروجیِ یک کتابخانه شبیهساز برقرار شود. کد، دادههای مقداردهیشده و دادههای مقداردهیشده با صفر بهطور متوالی تخصیص مییابند.
- -sim2
- مشابه -sim، اما گزینههای پیونددهنده را برای قرار دادن دادههای مقداردهیشده در 0x40000000 و دادههای مقداردهیشده با صفر در 0x80000000 ارسال میکند.
گزینههای C-SKY کامپایلر GCC هنگام کامپایل برای پردازندههای C-SKY V2 از این گزینهها پشتیبانی میکند.
- -march=arch
- معماری هدف C-SKY را مشخص میکند. مقادیر معتبر برای arch عبارتند از: ck801، ck802، ck803، ck807 و ck810. مقدار پیشفرض ck810 است.
- -mcpu=cpu
- پردازندهٔ هدف C-SKY را مشخص میکند. مقادیر معتبر برای cpu عبارتند از: ck801، ck801t، ck802، ck802t، ck802j، ck803، ck803h، ck803t، ck803ht، ck803f، ck803fh، ck803e، ck803eh، ck803et، ck803eht، ck803ef، ck803efh، ck803ft، ck803eft، ck803efht، ck803r1، ck803hr1، ck803tr1، ck803htr1، ck803fr1، ck803fhr1، ck803er1، ck803ehr1، ck803etr1، ck803ehtr1، ck803efr1، ck803efhr1، ck803ftr1، ck803eftr1، ck803efhtr1، ck803s، ck803st، ck803se، ck803sf، ck803sef، ck803seft، ck807e، ck807ef، ck807، ck807f، ck810e، ck810et، ck810ef، ck810eft، ck810، ck810v، ck810f، ck810t، ck810fv، ck810tv، ck810ft و ck810ftv.
- -mbig-endian
- -mlittle-endian
- تولید کد با ترتیب بایت بزرگپایان (big-endian) یا کوچکپایان (little-endian) را انتخاب میکند. مقدار پیشفرض little-endian است.
- -mfloat-abi=name
- مشخص
میکند که
از کدام ABI
ممیز شناور
استفاده
شود. مقادیر
مجاز
عبارتند از:
soft، softfp و hard.
تعیین soft باعث میشود GCC خروجیای حاوی فراخوانی توابع کتابخانهای برای عملیات ممیز شناور تولید کند. softfp امکان تولید کد با استفاده از دستورالعملهای سختافزاری ممیز شناور را فراهم میکند، اما همچنان از قراردادهای فراخوانی soft-float بهره میبرد. hard امکان تولید دستورالعملهای ممیز شناور را فراهم ساخته و از قراردادهای فراخوانی اختصاصی FPU استفاده میکند.
مقدار پیشفرض به پیکربندی هدف خاص وابسته است. توجه داشته باشید که ABIهای hard-float و soft-float از نظر پیوند (link) سازگار نیستند؛ شما باید تمام برنامهٔ خود را با همان ABI کامپایل کرده و با مجموعهای از کتابخانههای سازگار پیوند دهید.
- -mdouble-float
- -mno-double-float
- هنگامی که -mhard-float فعال است، تولید دستورالعملهای ممیز شناور با دقت مضاعف (double-precision) را فعال میکند. این حالت به جز هنگام کامپایل برای CK803، مقدار پیشفرض است.
- -mfdivdu
- -mno-fdivdu
- هنگامی که -mhard-float فعال است، تولید دستورالعملهای "frecipd"، "fsqrtd" و "fdivd" را فعال میکند. این حالت به جز هنگام کامپایل برای CK803، مقدار پیشفرض است.
- -mfpu=fpu
- پردازندهٔ ممیز شناور را انتخاب میکند. این گزینه تنها همراه با -mhard-float قابل استفاده است. مقادیر مجاز برای fpu عبارتند از: fpv2_sf (معادل با -mno-double-float -mno-fdivdu)، fpv2 (-mdouble-float -mno-divdu) و fpv2_divd (-mdouble-float -mdivdu).
- -melrw
- -mno-elrw
- دستورالعمل گسترشیافتهٔ "lrw" را فعال میکند. این گزینه بهطور پیشفرض برای CK801 فعال و در غیر این صورت غیرفعال است.
- -mistack
- -mno-istack
- دستورالعملهای
پشتهٔ وقفه
را فعال
میکند؛
پیشفرض
غیرفعال
است.
گزینهٔ -mistack برای مدیریت ویژگیهای تابعی "interrupt" و "isr" الزامی است.
- -mmp
- -mno-mp
- دستورالعملهای چندپردازندهای را فعال میکند؛ پیشفرض غیرفعال است.
- -mcp
- -mno-cp
- دستورالعملهای کمکپردازنده را فعال میکند؛ پیشفرض غیرفعال است.
- -mcache
- -mno-cache
- دستورالعملهای کمکپردازنده را فعال میکند؛ پیشفرض غیرفعال است.
- -msecurity
- -mno-security
- دستورالعملهای امنیتی C-SKY را فعال میکند؛ پیشفرض غیرفعال است.
- -mtrust
- -mno-trust
- دستورالعملهای تراست (trust) در C-SKY را فعال میکند؛ پیشفرض غیرفعال است.
- -mdsp
- -mno-dsp
- -medsp
- -mno-edsp
- -mvdsp
- -mno-vdsp
- به ترتیب دستورالعملهای DSP، Enhanced DSP یا Vector DSP در C-SKY را فعال میکند. تمام این گزینهها بهطور پیشفرض غیرفعال هستند.
- -mdiv
- -mno-div
- دستورالعملهای تقسیم را تولید میکند. پیشفرض غیرفعال است.
- -msmart
- -mno-smart
- کد را برای حالت هوشمند (Smart Mode) تولید میکند که تنها از ثباتهای شمارهٔ 0-7 استفاده میکند تا امکان استفاده از دستورالعملهای ۱۶ بیتی فراهم شود. این گزینه برای CK801 که این رفتار در آن الزامی است نادیده گرفته میشود، و برای CK802 بهطور پیشفرض فعال است. برای سایر اهداف، پیشفرض غیرفعال است.
- -mhigh-registers
- -mno-high-registers
- کد را با استفاده از ثباتهای بالایی شمارهٔ 16-31 تولید میکند. این گزینه روی CK801، CK802 یا CK803 پشتیبانی نمیشود، و برای سایر پردازندهها بهطور پیشفرض فعال است.
- -manchor
- -mno-anchor
- کد را با استفاده از آدرسهای نماد لنگر سراسری (global anchor symbol) تولید میکند.
- -mpushpop
- تولید کد با استفاده از دستورالعملهای "push" و "pop". این گزینه بهطور پیشفرض فعال است.
- -mmultiple-stld
- -mno-multiple-stld
- تولید کد با استفاده از دستورالعملهای "stm" و "ldm". این گزینه در CK801 پشتیبانی نمیشود، اما در سایر پردازندهها بهطور پیشفرض فعال است.
- -mconstpool
- -mno-constpool
- ایجاد استخرهای ثابت (constant pools) در کامپایلر به جای واگذاری آن به اسمبلر. این گزینه حالت پیشفرض بوده و برای تولید کد صحیح روی CK801 و CK802 الزامی است، و روی سایر پردازندهها اختیاری میباشد.
- -mstack-size
- -mno-stack-size
- درج دستورات راهنمای ".stack_size" برای هر تابع در خروجی اسمبلی. این گزینه بهطور پیشفرض غیرفعال است.
- -mccrt
- -mno-ccrt
- تولید کد برای زمان اجرای کامپایلر C-SKY به جای libgcc. این گزینه بهطور پیشفرض غیرفعال است.
- -mbranch-cost=n
- تنظیم هزینهٔ انشعاب به حدود "n" دستورالعمل. مقدار پیشفرض ۱ است.
- -msched-prolog
- -mno-sched-prolog
- اجازه دادن به زمانبندی توالیهای prologue و epilogue توابع. استفاده از این گزینه میتواند منجر به تولید کدی شود که با الزامات پیشدرآمد C-SKY V2 ABI سازگار نبوده و امکان اشکالزدایی یا ردگیری به عقب (backtrace) آن وجود نداشته باشد. این گزینه بهطور پیشفرض غیرفعال است.
- -msim
- -mno-sim
- پیوند با کتابخانهٔ libsemi.a که با شبیهساز سازگار است. فقط برای کامپایلر ELF کاربرد دارد.
گزینههای Cygwin و MinGW
این گزینههای اضافی برای مقصدهای Microsoft Windows در دسترس هستند:
- -mconsole
- این گزینه مشخص میکند که یک برنامهٔ کنسولی باید تولید شود؛ با دستور دادن به پیونددهنده برای تنظیم نوع زیرسیستم در سرآیند PE به مقدار مورد نیاز برنامههای کنسولی. این گزینه برای مقصدهای Cygwin و MinGW در دسترس بوده و بهطور پیشفرض روی آن مقصدها فعال است.
- -mcrtdll=library
- پیشپردازش، کامپایل یا پیوند با کتابخانهٔ C RunTime DLL مشخصشده توسط library. این گزینه ماکروهای پیشتعریفشدهٔ "__CRTDLL__"، "__MSVCRT__"، "_UCRT" و "__MSVCRT_VERSION__" را برای library مربوط به CRT مشخصشده تنظیم میکند، فایل آغازین را برای کتابخانهٔ CRT انتخاب کرده و با آن کتابخانهٔ CRT پیوند میدهد. نامهای شناختهشدهٔ کتابخانهٔ CRT برای پیشپردازنده عبارتند از: "crtdll*"، "msvcrt10*"، "msvcrt20*"، "msvcrt40*"، "msvcr40*"، "msvcrtd*"، "msvcrt-os*"، "msvcr70*"، "msvcr71*"، "msvcr80*"، "msvcr90*"، "msvcr100*"، "msvcr110*"، "msvcr120*" و "ucrt*". اگر این گزینه مشخص نشود، کتابخانهٔ واردات پیشفرض MinGW با نام "msvcrt" برای پیوند استفاده میشود و هیچ تنظیم دیگری برای پیشپردازنده انجام نخواهد شد. کتابخانهٔ واردات MinGW با نام "msvcrt" صرفاً یک پیوند نمادین به (یا کپی از) یک کتابخانهٔ واردات دیگر MinGW CRT است که در طول کامپایل MinGW انتخاب شده است. کتابخانهٔ واردات MinGW با نام "msvcrt-os" برای کتابخانهٔ سیستمی CRT DLL ویندوز یعنی "msvcrt.dll" است و در بیشتر موارد، کتابخانهٔ واردات پیشفرض MinGW میباشد. بهطور کلی، تغییر دادن CRT DLL نیازمند کامپایل مجدد کل MinGW CRT است. این گزینه صرفاً برای مقاصد آزمایشی و تست است. این گزینه برای مقصدهای MinGW در دسترس است.
- -mdll
- این گزینه برای مقصدهای Cygwin و MinGW در دسترس است. این گزینه مشخص میکند که یک DLL---یک کتابخانهٔ پیوند پویا---باید تولید شود، و امکان انتخاب شیء آغازین زمان اجرا و نقطهٔ ورود مورد نیاز را فراهم میسازد.
- -mnop-fun-dllimport
- این گزینه برای مقصدهای Cygwin و MinGW در دسترس است. این گزینه مشخص میکند که صفت "dllimport" باید نادیده گرفته شود.
- -mthreads
- پشتیبانی از مدیریت استثنای امن در برابر نخها (thread-safe exception handling) روی MinGW. برنامههایی که به مدیریت استثنای thread-safe متکی هستند باید تمام کد را با گزینهٔ -mthreads کامپایل و پیوند دهند. هنگام کامپایل، -mthreads مقدار -D_MT را تعریف میکند؛ هنگام پیوند دادن، کتابخانهٔ کمکی ویژهٔ نخها با نام -lmingwthrd را پیوند میدهد که دادههای مدیریت استثنای مربوط به هر نخ را پاکسازی میکند.
- -municode
- این گزینه برای مقصدهای MinGW-w64 در دسترس است. این گزینه موجب تعریف پیشفرض ماکروی پیشپردازندهٔ "UNICODE" شده، و کد راهانداز زمان اجرای سازگار با یونیکد را انتخاب میکند.
- -mwin32
- این گزینه برای مقصدهای Cygwin و MinGW در دسترس است. این گزینه مشخص میکند که ماکروهای از پیش تعریفشدهٔ معمول Microsoft Windows در پیشپردازنده تنظیم شوند، اما بر انتخاب کتابخانهٔ زمان اجرا/کد راهانداز تأثیری نمیگذارد.
- -mwindows
- این گزینه برای مقصدهای Cygwin و MinGW در دسترس است. این گزینه مشخص میکند که یک برنامه با رابط گرافیکی کاربر (GUI) باید با دستور به پیونددهنده برای تنظیم مناسب نوع زیرسیستم در سرآیند PE تولید شود.
- -fno-set-stack-executable
- این گزینه برای مقصدهای MinGW در دسترس است. این گزینه مشخص میکند که پرچم قابل اجرا بودن پشته که توسط توابع تو در تو استفاده میشود، تنظیم نشود. این امر برای باینریهایی که در حالت هسته (kernel mode) مربوط به Microsoft Windows اجرا میشوند ضروری است، زیرا در آنجا API مربوط به User32 که برای تنظیم دسترسیهای اجرایی به کار میرود، در دسترس نیست.
- -fwritable-relocated-rdata
- این گزینه برای مقصدهای MinGW و Cygwin در دسترس است. این گزینه مشخص میکند که دادههای بازآراییشده در بخش فقط خواندنی، در بخش ".data" قرار گیرند. این قابلیت برای زمانهای اجرای قدیمیتری که از تغییر دادن بخشهای ".rdata" برای شبهبازآرایی (pseudo-relocation) پشتیبانی نمیکنند، ضروری است.
- -mpe-aligned-commons
- این گزینه برای مقصدهای Cygwin و MinGW در دسترس است. این گزینه مشخص میکند که هنگام تولید کد، از پسوند گنو برای قالب فایل PE که امکان ترازسازی صحیح متغیرهای COMMON را فراهم میسازد، استفاده شود. این گزینه بهطور پیشفرض فعال است اگر GCC تشخیص دهد که اسمبلر مقصد یافتشده در حین پیکربندی از این قابلیت پشتیبانی میکند.
- -muse-libstdc-wrappers
- استفاده از پوششهای DLL مربوط به Cygwin برای پشتیبانی از عملگرهای "new" و "delete" در ++C.
همچنین برای گزینههای استاندارد، بخش گزینههای x86 را ببینید.
گزینههای Darwin
این گزینهها برای همهٔ معماریهایی که سیستمعامل Darwin را اجرا میکنند تعریف شدهاند.
کامپایلر FSF GCC روی Darwin فایلهای شیء چندمعماری («fat») ایجاد نمیکند؛ بلکه یک فایل شیء برای همان تک معماریای ایجاد میکند که GCC برای هدف گرفتن آن ساخته شده است. کامپایلر GCC متعلق به شرکت Apple در Darwin در صورت استفاده از چندین گزینهٔ -arch فایلهای «fat» ایجاد میکند؛ این کار را با اجرای چندبارهٔ کامپایلر یا پیونددهنده و سپس ترکیب نتایج با ابزار lipo انجام میدهد.
زیرنوع (subtype) فایل ایجادشده (مانند ppc7400، ppc970 یا i686) توسط پرچمهایی تعیین میشود که معماری مجموعه دستورالعملها (ISA) را که GCC هدف قرار میدهد مشخص میکنند، مانند -mcpu یا -march. از گزینهٔ -force_cpusubtype_ALL میتوان برای لغو این رفتار استفاده کرد.
ابزارهای Darwin هنگام مواجهه با عدم تطابق در ISA رفتارهای متفاوتی دارند. اسمبلر، as، تنها به دستورالعملهایی اجازهٔ استفاده میدهد که برای زیرنوع فایلِ در حال تولید معتبر باشند، بنابراین نمیتوانید دستورالعملهای ۶۴ بیتی را در یک فایل شیء ppc750 قرار دهید. پیونددهنده برای کتابخانههای اشتراکی، /usr/bin/libtool، اگر خواسته شود کتابخانهای اشتراکی با زیرنوعی با محدودیت کمتر نسبت به فایلهای ورودیاش ایجاد کند شکست میخورد و خطا چاپ میکند (به عنوان مثال، تلاش برای قرار دادن یک فایل شیء ppc970 در یک کتابخانهٔ ppc7400). پیونددهنده برای فایلهای اجرایی، ld، بدون تولید پیام خطا، محدودکنندهترین زیرنوع در میان تمامی فایلهای ورودیاش را به فایل اجرایی اختصاص میدهد..IP -Fdir 4 دایرکتوری فریمورک dir را به ابتدای فهرست دایرکتوریهای مورد جستجو برای فایلهای سرآیند اضافه میکند. این دایرکتوریها با موارد مشخصشده توسط گزینههای -I در هم آمیخته شده و به ترتیب از چپ به راست بررسی میشوند.
دایرکتوری فریمورک دایرکتوریای است که شامل فریمورکها باشد. یک فریمورک، دایرکتوریای با پسوند .framework است که مستقیماً شامل یک دایرکتوری Headers و/یا PrivateHeaders باشد. نام یک فریمورک، نام این دایرکتوری بدون پسوند .framework است. سرآیندهای مرتبط با فریمورک در یکی از این دو دایرکتوری یافت میشوند، که در این بین ابتدا Headers جستجو میشود. یک زیرفریمورک (subframework)، دایرکتوری فریمورکی است که در دایرکتوری Frameworks یک فریمورک دیگر قرار دارد. شمول (include) سرآیندهای زیرفریمورک تنها میتواند در سرآیند فریمورکی که شامل آن زیرفریمورک است یا در سرآیند یک زیرفریمورک همسطح ظاهر شود. دو زیرفریمورک در صورتی همسطح هستند که در یک فریمورک مشترک قرار داشته باشند. یک زیرفریمورک نباید همنام یک فریمورک باشد؛ در صورت نقض این مورد، یک هشدار صادر میشود. در حال حاضر یک زیرفریمورک نمیتواند دارای زیرفریمورکهای دیگری باشد؛ در آینده ممکن است این سازوکار برای پشتیبانی از این حالت گسترش یابد. فریمورکهای استاندارد را میتوان در /System/Library/Frameworks و /Library/Frameworks یافت. یک نمونه include به صورت "#include <Framework/header.h>" است، که در آن Framework بیانگر نام فریمورک بوده و header.h در دایرکتوری PrivateHeaders یا Headers یافت میشود.
- -iframeworkdir
- مشابه -F است با این تفاوت که دایرکتوری به عنوان یک دایرکتوری سیستمی در نظر گرفته میشود. تفاوت اصلی میان -iframework و -F در این است که با -iframework کامپایلر در مورد ساختارهای موجود در فایلهای سرآیندی که از طریق dir پیدا میشوند هشداری صادر نمیکند. این گزینه تنها برای خانواده زبانهای C معتبر است.
- -arch name
- تولید خروجی برای معماری name. همانطور که در بالا توضیح داده شد، GCC خروجی را برای معماریای که برای آن پیکربندی شده است تولید میکند و از گزینههای معمول خود برای انتخاب گونههای زیرمعماری بهره میبرد. گزینه -arch برای سازگاری پذیرفته میشود، اما اگر name با تشخیص خود GCC از معماری مقصد ناهمخوان باشد، یک خطا گزارش میشود.
- -dependency-file filename
- نام مستعاری برای گزینه پیشپردازنده -MF filename.
- -fapple-kext
- تولید کد برای افزونههای هسته (kext) قابل بارگذاری Darwin.
- -gused
- تولید اطلاعات اشکالزدایی برای نمادهایی که استفاده شدهاند. برای قالب اشکالزدایی stabs، این گزینه -feliminate-unused-debug-symbols را فعال میکند. این گزینه بهطور پیشفرض روشن (ON) است.
- -gfull
- تولید اطلاعات اشکالزدایی برای تمام نمادها و نوعها.
- -matt-stubs
- -mno-att-stubs
- فعالسازی استابهای PIC به سبک AT&T. در صورت پشتیبانی توسط معماری مقصد (در حال حاضر تنها x86)، این حالت پیشفرض است.
- -mconstant-cfstrings
- -fconstant-cfstrings
- هنگامی که
زمان اجرای
NeXT استفاده
میشود
(حالت
پیشفرض در
این
سیستمها)،
هرگونه
تنظیمات
-fconstant-string-class
نادیده
گرفته شده و
باعث
میشود
ثابتهای
لفظی
"@"..."" به
عنوان
رشتههای
ثابت CoreFoundation
چیده شوند.
گزینه -fconstant-cfstrings یک نام مستعار برای -mconstant-cfstrings است.
- -mdynamic-no-pic
- تولید کد مناسب برای فایلهای اجرایی (نه کتابخانههای اشتراکی). این گزینه با -fpic، -fPIC، -fpie یا -fPIE ناسازگار است.
- -mfix-and-continue
- -ffix-and-continue
- -findirect-data
- تولید کد مناسب برای چرخه توسعه سریع، مانند فراهم ساختن امکان بارگذاری پویای فایلهای .o توسط GDB در برنامههای در حال اجرا. گزینههای -findirect-data و -ffix-and-continue برای سازگاری با نسخههای قبلی ارائه شدهاند.
- -mkernel
- فعالسازی حالت توسعه هسته (kernel). گزینه -mkernel در صورت امکان گزینههای -static، -fno-common، -fno-use-cxa-atexit، -fno-exceptions، -fno-non-call-exceptions، -fapple-kext، -fno-weak و -fno-rtti را تنظیم میکند. این حالت همچنین برای مقصدهای PowerPC، گزینههای -mno-altivec، -msoft-float، -fno-builtin و -mlong-branch را تنظیم مینماید.
- -mmacosx-version-min=version
- -asm_macosx_version_min=version
- گزینه -mmacosx-version-min
مشخص
میکند
قدیمیترین
نسخه MacOS X که
این فایل
اجرایی روی
آن اجرا
خواهد شد،
version است.
مقادیر
معمول
پشتیبانیشده
برای version
شامل 12،
10.12 و 10.5.8
هستند.
اگر کامپایلر طوری ساخته شده باشد که بهطور پیشفرض از سرآیندهای سیستم استفاده کند، مقدار پیشفرض این گزینه همان نسخه سیستمی است که کامپایلر روی آن اجرا میشود؛ در غیر این صورت، مقدار پیشفرض انتخاب گزینههایی است که با بیشترین تعداد سیستمها و پایگاههای کد سازگار باشند.
گزینه -asm_macosx_version_min=version مشابه است، اما راهانداز GCC اطلاعات version آن را تنها به اسمبلر ارسال میکند.
- -mone-byte-bool
- نادیده
گرفتن
مقادیر
پیشفرض
برای "bool"
به طوری که
"sizeof(bool)==1"
برقرار
باشد.
بهطور
پیشفرض
هنگام
کامپایل
برای Darwin/PowerPC
مقدار
sizeof(bool)
برابر 4
و هنگام
کامپایل
برای Darwin/x86
برابر 1
است،
بنابراین
این گزینه
روی x86
تأثیری
ندارد.
هشدار: سوئیچ -mone-byte-bool باعث میشود GCC کدی تولید کند که با کد تولیدشده بدون این سوئیچ سازگاری باینری ندارد. استفاده از این سوئیچ ممکن است نیازمند کامپایل مجدد تمام پودمانهای دیگر برنامه، از جمله کتابخانههای سیستمی باشد. از این سوئیچ برای مطابقت با یک مدل داده غیرپیشفرض استفاده کنید.
- -msymbol-stubs
- -mno-symbol-stubs
- اجبار به تولید استابهای غیرمستقیم نماد خارجی برای ارجاعات PIC. بهطور پیشفرض، اگر نسخه پیونددهنده مقصد (-mtarget-linker) به اندازه کافی قدیمی باشد که به آنها نیاز داشته باشد، این گزینه بهطور خودکار فعال میشود.
- -mtarget-linker=version
- -mtarget-linker version
- مشخص کردن نسخه هدف ld64، که هر نسخه مشخصشده در پیکربندی GCC را لغو میکند. نسخههای جدیدتر پیونددهنده در برخی موارد، مثلاً برای کد PIC، از تولید کد بهبودیافته پشتیبانی میکنند.
- -ObjC
- معادل -x objective-c؛ مشخص میکند که ورودی، کد منبع Objective-C است.
- -ObjC++
- معادل -x objective-c++؛ مشخص میکند که ورودی، کد منبع Objective-C++ است.
- -Wnonportable-cfstrings
- -Wno-nonportable-cfstrings
- هشدار در صورتی که اشیاء رشتهای ثابت CoreFoundation حاوی نویسههای غیرقابلحمل باشند. این هشدار بهطور پیشفرض فعال است.
- -all_load
- بارگذاری تمام اعضای کتابخانههای آرشیو ایستا. برای اطلاعات بیشتر به ld(1) مراجعه کنید.
- -arch_errors_fatal
- باعث میشود خطاهای مربوط به فایلهایی با معماری نادرست، مهلک (fatal) تلقی شوند.
- -bind_at_load
- باعث میشود فایل خروجی بهگونهای نشانهگذاری شود که پیونددهنده پویا هنگام بارگذاری یا راهاندازی فایل، تمام ارجاعات تعریفنشده را مقیدسازی (bind) کند.
- -bundle
- تولید یک فایل در قالب بسته (bundle) Mach-o. برای اطلاعات بیشتر به ld(1) مراجعه کنید..IP "-bundle_loader executable" 4 این گزینه executable (فایل اجرایی) را مشخص میکند که فایل خروجی ساخت پیوندخورده را بارگذاری خواهد کرد. برای اطلاعات بیشتر صفحه راهنمای ld(1) را ببینید.
- -dynamiclib
- هنگام ارسال این گزینه، GCC در زمان پیوند به جای یک فایل اجرایی، با استفاده از دستور libtool مربوط به Darwin، یک کتابخانه پویا تولید میکند.
- -force_cpusubtype_ALL
- این گزینه باعث میشود که فایل خروجی GCC بهجای زیرنوع کنترلشده توسط گزینه -mcpu یا -march، زیرنوع ALL را داشته باشد.
- -nodefaultrpaths
- مسیرهای اجرای پیشفرض (run paths) برای دایرکتوریهای کتابخانه کامپایلر را به فایلهای اجرایی، پودمانها یا کتابخانههای پویا اضافه نمیکند. در macOS 10.5 و جدیدتر، runpath تعبیهشده بهطور پیشفرض اضافه میشود مگر اینکه کاربر -nodefaultrpaths را به خط پیوند اضافه کند. مسیرهای اجرا برای ساخت در macOS نسخه 10.11 یا بالاتر لازم هستند (و بنابراین اجبار میشوند).
- -nodefaultexport
- صادرههای نماد پیشفرض را به پودمانها یا کتابخانههای پویا اضافه نمیکند.
- -allowable_client client_name
- -client_name
- -compatibility_version
- -current_version
- -dead_strip
- -dylib_file
- -dylinker
- -dylinker_install_name
- -dynamic
- -exported_symbols_list
- -filelist
- -flat_namespace
- -force_flat_namespace
- -framework
- -headerpad_max_install_names
- -image_base
- -init symbol-name
- -install_name
- -keep_private_externs
- -pagezero_size
- -preload
- -read_only_relocs
- -sectalign
- -sectcreate
- -seg_addr_table
- -seg1addr
- -segaddr
- -segprot
- -segs_read_only_addr
- -segs_read_write_addr
- -sub_library
- -sub_umbrella
- -twolevel_namespace
- -twolevel_namespace_hints
- -umbrella
- -undefined
- -unexported_symbols_list
- -weak_framework
- -weak_reference_mismatches
- -whatsloaded
- -whyload
- این گزینهها به پیونددهنده Darwin منتقل میشوند. صفحه راهنمای پیونددهنده Darwin آنها را با جزئیات شرح میدهد.
گزینههای DEC Alpha
این گزینههای -m برای پیادهسازیهای DEC Alpha تعریف شدهاند:
- -mno-soft-float
- -msoft-float
- از
دستورالعملهای
سختافزاری
ممیز شناور
برای
محاسبات
ممیز شناور
استفاده
میکند (یا
نمیکند).
وقتی -msoft-float
مشخص شده
باشد،
توابع
موجود در libgcc.a
برای انجام
عملیات
ممیز شناور
به کار
میروند.
این
روتینها
دستورالعملهای
ممیز شناور
را صادر
میکنند،
مگر اینکه
با
روتینهایی
که عملیات
ممیز شناور
را
شبیهسازی
میکنند
جایگزین
شده باشند،
یا
بهگونهای
کامپایل
شده باشند
که چنین
روتینهای
شبیهسازی
را
فراخوانی
کنند. اگر
برای یک Alpha
بدون
عملیات
ممیز شناور
کامپایل
میکنید،
باید مطمئن
شوید که
کتابخانه
بهگونهای
ساخته شده
باشد که
آنها را
فراخوانی
نکند.
توجه داشته باشید که پیادهسازیهای Alpha بدون عملیات ممیز شناور ملزم به داشتن ثباتهای ممیز شناور هستند.
- -mfp-regs
- -mno-fp-regs
- کدی تولید
میکند که
از مجموعه
ثباتهای
ممیز شناور
استفاده
میکند (یا
نمیکند).
گزینه -mno-fp-regs
مستلزم -msoft-float
است. اگر از
مجموعه
ثباتهای
ممیز شناور
استفاده
نشود،
عملوندهای
ممیز شناور
مانند
اعداد صحیح
در
ثباتهای
عدد صحیح
منتقل
میشوند و
نتایج ممیز
شناور
بهجای
$f0 در $0
ارسال
میشوند.
این یک
توالی
فراخوانی
غیراستاندارد
است،
بنابراین
هر تابعی با
آرگومان یا
مقدار
بازگشتی
ممیز شناور
که توسط کد
کامپایلشده
با -mno-fp-regs
فراخوانی
میشود نیز
باید با این
گزینه
کامپایل
گردد.
کاربرد معمول این گزینه، ساخت کرنلی است که از هیچ ثبات ممیز شناوری استفاده نمیکند و بنابراین نیازی به ذخیره و بازیابی آنها ندارد.
- -mieee
- معماری Alpha سختافزار ممیز شناور را بهینهشده برای حداکثر کارایی پیادهسازی میکند. این معماری تا حد زیادی با استاندارد ممیز شناور IEEE سازگار است. با این حال، برای انطباق کامل، به کمک نرمافزاری نیاز است. این گزینه کدی کاملاً منطبق بر IEEE تولید میکند، بهجز اینکه inexact-flag نگهداری نمیشود (به زیر مراجعه کنید). اگر این گزینه فعال باشد، ماکروی پیشپردازنده "_IEEE_FP" در زمان کامپایل تعریف میشود. کد حاصل کارایی کمتری دارد، اما میتواند بهدرستی از اعداد غیرنرمال (denormalized) و مقادیر استثنایی IEEE مانند Not-a-Number (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
- این گزینه کنترل میکند که چه تلههای (trap) مربوط به ممیز شناور فعال شوند. سایر کامپایلرهای Alpha این گزینه را -fptm trap-mode مینامند. حالت تله را میتوان روی یکی از چهار مقدار زیر تنظیم کرد:
- n
- این حالت پیشفرض (عادی) است. تنها تلههایی فعال میشوند که در نرمافزار نمیتوان آنها را غیرفعال کرد (بهعنوان مثال، تله تقسیم بر صفر)..IP u 4 علاوه بر تلههای فعالشده توسط n، تلههای زیرریز (underflow) نیز فعال میشوند.
- su
- مانند u، اما دستورالعملها به گونهای علامتگذاری میشوند که برای تکمیل نرمافزاری امن باشند (برای جزئیات به راهنمای معماری Alpha مراجعه کنید).
- sui
- مانند su، اما تلههای نادقیق (inexact) نیز فعال میشوند.
- -mfp-rounding-mode=rounding-mode
- حالت گرد کردن IEEE را انتخاب میکند. دیگر کامپایلرهای Alpha این گزینه را -fprm rounding-mode مینامند. مقدار rounding-mode میتواند یکی از موارد زیر باشد:
- n
- حالت گرد کردن عادی IEEE. اعداد ممیز شناور به سمت نزدیکترین عدد ماشین یا در صورت تساوی فاصله، به سمت عدد ماشین زوج گرد میشوند.
- m
- گرد کردن به سمت منفی بینهایت.
- c
- حالت گرد کردن بریدهشده (chopped). اعداد ممیز شناور به سمت صفر گرد میشوند.
- d
- حالت گرد کردن پویا (dynamic). فیلدی در ثبات کنترل ممیز شناور (fpcr، به راهنمای مرجع معماری Alpha مراجعه کنید) حالت گرد کردن اعمالشده را کنترل میکند. کتابخانهٔ C این ثبات را برای گرد کردن به سمت مثبت بینهایت مقداردهی اولیه میکند. بنابراین، مگر اینکه برنامهٔ شما fpcr را تغییر دهد، d معادل گرد کردن به سمت مثبت بینهایت خواهد بود.
- -mtrap-precision=trap-precision
- در معماری Alpha، تلههای ممیز شناور نادقیق (imprecise) هستند. این بدان معناست که بدون کمک نرمافزاری، بازیابی پس از یک تلهٔ ممیز شناور غیرممکن است و اجرای برنامه معمولاً باید پایان یابد. GCC میتواند کدی تولید کند که به گردانندههای تلهٔ سیستمعامل در تعیین محل دقیقی که باعث ایجاد تلهٔ ممیز شناور شده است کمک کند. بسته به نیازمندیهای برنامه، میتوان سطوح مختلفی از دقت را انتخاب کرد:
- p
- دقت در سطح برنامه (Program precision). این گزینه پیشفرض است و به این معنی است که گردانندهٔ تله فقط میتواند تشخیص دهد کدام برنامه باعث ایجاد استثنای ممیز شناور شده است.
- f
- دقت در سطح تابع (Function precision). گردانندهٔ تله میتواند تابعی را که باعث ایجاد استثنای ممیز شناور شده است مشخص کند.
- i
- دقت در سطح دستورالعمل (Instruction precision). گردانندهٔ تله میتواند دستورالعمل دقیقی را که باعث ایجاد استثنای ممیز شناور شده است مشخص کند.
سایر کامپایلرهای Alpha گزینههای معادل دیگری با نامهای -scope_safe و -resumption_safe ارائه میدهند.
- -mieee-conformant
- این گزینه کد تولیدشده را به عنوان سازگار با IEEE علامتگذاری میکند. شما نباید از این گزینه استفاده کنید مگر اینکه گزینهٔ -mtrap-precision=i و همچنین یکی از گزینههای -mfp-trap-mode=su یا -mfp-trap-mode=sui را مشخص کرده باشید. تنها اثر آن، درج خط .eflag 48 در دیباچهٔ تابع (prologue) در فایل اسمبلی تولیدشده است.
- -mbuild-constants
- به طور
معمول، GCC یک
ثابت عدد
صحیح ۳۲ یا
۶۴ بیتی را
بررسی
میکند تا
ببیند آیا
میتواند
آن را از
ثابتهای
کوچکتر در
دو یا سه
دستورالعمل
بسازد یا
خیر. اگر
نتواند،
ثابت را به
عنوان یک
لیترال در
خروجی قرار
میدهد و
کدی برای
بارگیری آن
از بخش داده
(data segment) در زمان
اجرا تولید
میکند.
از این گزینه استفاده کنید تا GCC ملزم شود همهٔ ثابتهای عدد صحیح را با استفاده از کد بسازد، حتی اگر به دستورالعملهای بیشتری نیاز داشته باشد (حداکثر شش دستورالعمل).
شما معمولاً از این گزینه برای ساخت بارگذار پویای کتابخانهٔ مشترک استفاده میکنید. از آنجا که بارگذار خود یک کتابخانهٔ مشترک است، باید پیش از آنکه بتواند متغیرها و ثابتها را در بخش دادهٔ خود پیدا کند، خود را در حافظه بازنشانی (relocate) کند.
- -mbwx
- -mno-bwx
- -mcix
- -mno-cix
- -mfix
- -mno-fix
- -mmax
- -mno-max
- مشخص میکند که آیا GCC باید برای استفاده از مجموعهدستورالعملهای اختیاری BWX، CIX، FIX و MAX کد تولید کند یا خیر. حالت پیشفرض، استفاده از مجموعهدستورالعملهای پشتیبانیشده توسط نوع پردازندهای است که از طریق گزینهٔ -mcpu= مشخص شده است؛ یا در صورت مشخص نشدن، نوع پردازندهای که GCC روی آن ساخته شده است.
- -msafe-bwa
- -mno-safe-bwa
- مشخص میکند که در صورت عدم وجود مجموعهدستورالعمل اختیاری BWX، آیا GCC باید برای دسترسیهای حافظه در سطح بایت و کلمهٔ همتراز (aligned word)، کدی امن در برابر چندنخی (multi-thread safe) و سیگنالهای ناهمگام (async-signal safe) تولید کند یا خیر.
- -msafe-partial
- -mno-safe-partial
- مشخص میکند که آیا GCC باید برای دسترسیهای جزئی به حافظه کدی امن در برابر چندنخی و سیگنالهای ناهمگام تولید کند یا خیر؛ این دسترسیها شامل دسترسیهای تکهتکه به دادههای ناهمتراز و همچنین دسترسیهای بلوکی به بخشهای ابتدایی و انتهایی انواع دادههای تجمیعی (aggregate types) یا سایر اشیاء موجود در حافظه است که به ترتیب بر روی یک مرز دادهٔ ۶۴ بیتیِ همتراز شروع یا پایان نمییابند.
- -mfloat-vax
- -mfloat-ieee
- تولید کدی که به جای دقتهای تکی (single) و دوگانهٔ (double) استاندارد IEEE، از محاسبات ممیز شناور F و G در VAX استفاده میکند (یا استفاده نمیکند).
- -mexplicit-relocs
- -mno-explicit-relocs
- اسمبلرهای قدیمیتر Alpha راهی برای تولید بازنشانی نمادها (symbol relocations) به جز از طریق ماکروهای اسمبلر نداشتند. استفاده از این ماکروها اجازهٔ زمانبندی بهینهٔ دستورالعملها را نمیدهد. بستهٔ GNU Binutils از نسخهٔ 2.12 از نحو جدیدی پشتیبانی میکند که به کامپایلر اجازه میدهد به طور صریح مشخص کند کدام بازنشانیها باید بر روی کدام دستورالعملها اعمال شوند. این گزینه بیشتر برای اشکالزدایی مفید است، زیرا GCC در هنگام ساخته شدن، قابلیتهای اسمبلر را تشخیص داده و مقدار پیشفرض را بر همان اساس تنظیم میکند.
- -msmall-data
- -mlarge-data
- هنگامی که
-mexplicit-relocs فعال
باشد،
دادههای
ایستا (static data) از
طریق
بازنشانیهای
نسبی به gp
دسترسی
پیدا
میکنند.
هنگامی که
-msmall-data
استفاده
شود،
اشیایی به
طول ۸ بایت
یا کوچکتر
در یک
«ناحیهٔ
دادههای
کوچک» (small data area،
یعنی
بخشهای
".sdata" و
".sbss")
قرار
میگیرند و
از طریق
بازنشانیهای
۱۶ بیتی
نسبت به
ثبات $gp
در دسترس
قرار
میگیرند.
این امر
اندازهٔ
ناحیهٔ
دادههای
کوچک را به
۶۴
کیلوبایت
محدود
میکند،
اما به
متغیرها
اجازه
میدهد که
مستقیماً
از طریق یک
تکدستورالعمل
قابل
دسترسی
باشند.
حالت پیشفرض -mlarge-data است. با این گزینه، ناحیهٔ داده به کمی کمتر از ۲ گیگابایت محدود میشود. برنامههایی که به بیش از ۲ گیگابایت داده نیاز دارند، باید به جای بخش دادهٔ برنامه، از "malloc" یا "mmap" برای تخصیص دادهها در هیپ (heap) استفاده کنند.
هنگام تولید کد برای کتابخانههای مشترک، -fpic متضمن -msmall-data و -fPIC متضمن -mlarge-data است.
- -msmall-text
- -mlarge-text
- هنگامی که
-msmall-text
استفاده
میشود،
کامپایلر
فرض میکند
که کد کل
برنامه (یا
کتابخانهٔ
مشترک) در ۴
مگابایت
جای
میگیرد و
در نتیجه با
یک دستور
انشعاب (branch)
قابل
دستیابی
است. هنگامی
که -msmall-data
استفاده
میشود،
کامپایلر
میتواند
فرض کند که
همهٔ
نمادهای
محلی مقدار
$gp
یکسانی
دارند و
بدین ترتیب
تعداد
دستورالعملهای
مورد نیاز
برای
فراخوانی
یک تابع را
از ۴ به ۱
کاهش دهد.
حالت پیشفرض -mlarge-text است..IP -mcpu=cpu_type 4 مجموعه دستورالعملها و پارامترهای زمانبندی دستورالعمل را برای نوع ماشین cpu_type تعیین میکند. میتوانید نام به سبک EV یا شماره تراشه متناظر را مشخص کنید. GCC از پارامترهای زمانبندی برای خانواده پردازندههای EV4، EV5 و EV6 پشتیبانی میکند و مقادیر پیشفرض را برای مجموعه دستورالعملها از روی پردازندهای که مشخص میکنید برمیگزیند. اگر نوع پردازنده را مشخص نکنید، GCC بهطور پیشفرض پردازندهای را در نظر میگیرد که کامپایلر روی آن ساخته شده است.
مقادیر پشتیبانیشده برای cpu_type عبارتند از:
- ev4
- ev45
- 21064
- همانند یک EV4 زمانبندی میشود و هیچ افزونه مجموعه دستورالعملی ندارد.
- ev5
- 21164
- همانند یک EV5 زمانبندی میشود و هیچ افزونه مجموعه دستورالعملی ندارد.
- ev56
- 21164a
- همانند یک EV5 زمانبندی میشود و از افزونه BWX پشتیبانی میکند.
- pca56
- 21164pc
- 21164PC
- همانند یک EV5 زمانبندی میشود و از افزونههای BWX و MAX پشتیبانی میکند.
- ev6
- 21264
- همانند یک EV6 زمانبندی میشود و از افزونههای BWX، FIX و MAX پشتیبانی میکند.
- ev67
- 21264a
- همانند یک EV6 زمانبندی میشود و از افزونههای BWX، CIX، FIX و MAX پشتیبانی میکند.
زنجیره ابزارهای بومی (Native toolchains) همچنین از مقدار native پشتیبانی میکنند که بهترین گزینه معماری را برای پردازنده میزبان انتخاب میکند. اگر GCC پردازنده را شناسایی نکند، -mcpu=native هیچ اثری نخواهد داشت.
- -mtune=cpu_type
- فقط
پارامترهای
زمانبندی
دستورالعمل
را برای نوع
ماشین cpu_type
تعیین
میکند.
مجموعه
دستورالعملها
تغییر
نمیکند.
زنجیره ابزارهای بومی همچنین از مقدار native پشتیبانی میکنند که بهترین گزینه معماری را برای پردازنده میزبان انتخاب میکند. اگر GCC پردازنده را شناسایی نکند، -mtune=native هیچ اثری نخواهد داشت.
- -mmemory-latency=time
- میزان
تأخیری (latency)
را تعیین
میکند که
زمانبند
باید برای
ارجاعات
معمول به
حافظه، از
دیدگاه
برنامه، در
نظر بگیرد.
این عدد به
شدت به
الگوهای
دسترسی به
حافظه توسط
برنامه و
اندازه
حافظه نهان
(کَش) خارجی
روی ماشین
وابسته است.
گزینههای معتبر برای time عبارتند از:
- -mtls-kernel
- بهجای "rduniq" دستور "rdval" را برای اشارهگر ریسه (thread pointer) صادر میکند.
- -mtls-size=bitsize
- اندازه بر حسب بیت آفستهای بیواسطه (immediate) در TLS را مشخص میکند. مقادیر معتبر برای bitsize عبارتند از 16، 32 و 64؛ مقدار پیشفرض 32 است.
- -mlong-double-128
- -mlong-double-64
- اندازه نوع داده "long double" را مشخص میکند. توجه داشته باشید که -mlong-double-128 با ممیز شناور VAX ناسازگار است.
گزینههای eBPF
- -mframe-limit=bytes
- حد قطعی اندازه فریم را بر حسب بایت مشخص میکند. در حال حاضر، مقداری که میتوان مشخص کرد باید کمتر یا مساوی 32767 باشد. پیشفرض، هر محدودیتی است که توسط نسخه هسته لینوکس هدف اعمال شده باشد.
- -mbig-endian
- کد را برای یک هدف بزرگپایان (big-endian) تولید میکند.
- -mlittle-endian
- کد را برای یک هدف کوچکپایان (little-endian) تولید میکند. این گزینه پیشفرض است.
- -mjmpext
- -mno-jmpext
- تولید دستورالعملهای پرش شرطی اضافه را فعال یا غیرفعال میکند. برای CPU v2 و بالاتر فعال است.
- -mjmp32
- -mno-jmp32
- تولید دستورالعملهای پرش ۳۲ بیتی را فعال یا غیرفعال میکند. برای CPU v3 و بالاتر فعال است.
- -malu32
- -mno-alu32
- تولید دستورالعملهای ۳۲ بیتی ALU را فعال یا غیرفعال میکند. برای CPU v3 و بالاتر فعال است.
- -mv3-atomics
- -mno-v3-atomics
- دستورالعملهای مربوط به عملیات اتمی عمومی معرفیشده در CPU v3 را فعال یا غیرفعال میکند. برای CPU v3 و بالاتر فعال است.
- -mbswap
- -mno-bswap
- دستورالعملهای جابهجایی بایت (byte swap) را فعال یا غیرفعال میکند. برای CPU v4 و بالاتر فعال است.
- -msdiv
- -mno-sdiv
- دستورالعملهای تقسیم علامتدار و باقیمانده (modulus) را فعال یا غیرفعال میکند. برای CPU v4 و بالاتر فعال است..IP -msmov 4
- -mno-smov
- دستورالعملهای انتقال (move) با گسترش علامت (sign-extending) و بارگذاری حافظه را فعال یا غیرفعال میکند. برای پردازندههای v4 و بالاتر فعال است.
- -mcpu=version
- مشخص
میکند که
کدام نسخه
از معماری
مجموعه
دستورالعملهای
(ISA) eBPF هدف قرار
گیرد.
نسخههای
جدیدتر
ممکن است
توسط همه
کرنلها
پشتیبانی
نشوند.
مقدار
پیشفرض v4
است.
مقادیر پشتیبانیشده برای version عبارتند از:
- v1
- نخستین ISA پایدار eBPF بدون ویژگیها یا افزونههای ویژه.
- v2
- پشتیبانی از افزونههای پرش (jump)، مانند آنچه در -mjmpext آمده است.
- v3
- همه قابلیتهای v2، بهعلاوه:
- -<عملیاتهای پرش ۳۲-بیتی، مانند -mjmp32>
- -<عملیاتهای ALU ۳۲-بیتی، مانند -malu32>
- -<عملیاتهای اتمیک عمومی، مانند -mv3-atomics>
- v4
- همه قابلیتهای v3، بهعلاوه:
- -<دستورالعملهای جابهجایی بایت (Byte swap)، مانند -mbswap>
- -<دستورالعملهای تقسیم و باقیمانده علامتدار، مانند -msdiv>
- -<دستورالعملهای انتقال با گسترش علامت و بارگذاری حافظه، مانند -msmov>
- -mco-re
- -mno-co-re
- پشتیبانی از BPF Compile Once - Run Everywhere (CO-RE) را فعال یا غیرفعال میکند. پشتیبانی از BPF CO-RE هنگام تولید اطلاعات اشکالزدایی BTF برای هدف BPF (-gbtf) بهطور پیشفرض فعال است.
- -mxbpf
- تولید کد برای یک نسخه گسترشیافته از BPF، که برخی از محدودیتهای اعمالشده توسط معماری BPF را کاهش میدهد:
- -<ذخیره و بازیابی ثباتهای callee-saved بهترتیب در زمان ورود به تابع و>
- خروج از آن.
- -masm=dialect
- دستورالعملهای
اسمبلی را
با استفاده
از dialect
انتخابشده
برای eBPF
خروجی
میدهد.
مقدار
پیشفرض pseudoc
است.
مقادیر پشتیبانیشده برای dialect عبارتند از:
- -minline-memops-threshold=bytes
- آستانه اندازهای را بر حسب بایت مشخص میکند که در مقادیر کمتر یا مساوی آن، توابع memmove، memcpy و memset همواره باید بهصورت درونخطی (inline) بسط داده شوند. عملیاتهایی که با اندازههای بزرگتر از این آستانه سروکار دارند، باید بهجای بسط درونخطی با استفاده از فراخوانی کتابخانه پیادهسازی شوند؛ اما از آنجا که BPF فراخوانیهای کتابخانهای (libcalls) را مجاز نمیداند، فراتر رفتن از این آستانه منجر به خطای زمان کامپایل میشود. مقدار پیشفرض 1024 بایت است.
- -Wco-re
- هشدارهایی را برای سناریوهایی فعال میکند که در آنها -mco-re فعال است، اما امکان تولید کد سازگار با CO-RE وجود ندارد.
گزینههای FR30
این گزینهها بهطور ویژه برای پورت FR30 تعریف شدهاند.
- -msmall-model
- استفاده از مدل فضای آدرس کوچک (small address space model). این گزینه میتواند کد کوچکتری تولید کند، اما فرض میکند که تمامی مقادیر نمادین و آدرسها در یک محدوده ۲۰-بیتی جای میگیرند.
- -mno-lsim
- فرض میکند که پشتیبانی زمان اجرا فراهم شده است و بنابراین نیازی به گنجاندن کتابخانه شبیهساز (libsim.a) در خط فرمان پیونددهنده نیست.
گزینههای FRV
- -mgpr-32
- تنها از ۳۲ ثبات همهمنظوره نخست استفاده میکند.
- -mgpr-64
- از تمامی ۶۴ ثبات همهمنظوره استفاده میکند.
- -mfpr-32
- تنها از ۳۲ ثبات ممیز شناور نخست استفاده میکند.
- -mfpr-64
- از تمامی ۶۴ ثبات ممیز شناور استفاده میکند.
- -mhard-float
- برای عملیاتهای ممیز شناور از دستورالعملهای سختافزاری استفاده میکند.
- -msoft-float
- برای عملیاتهای ممیز شناور از توابع کتابخانهای استفاده میکند.
- -malloc-cc
- تخصیص پویای ثباتهای کد شرط (condition code).
- -mfixed-cc
- برای تخصیص پویای ثباتهای کد شرط تلاش نمیکند، تنها از "icc0" و "fcc0" استفاده میکند.
- -mdword
- -mno-dword
- کنترل میکند که آیا ABI از دستورالعملهای کلمه مضاعف (double-word) استفاده کند یا خیر.
- -mdouble
- -mno-double
- استفاده از دستورالعملهای ممیز شناور دقت مضاعف (double) را فعال یا غیرفعال میکند.
- -mmedia
- -mno-media
- استفاده از دستورالعملهای چندرسانهای (media) را فعال یا غیرفعال میکند.
- -mmuladd
- -mno-muladd
- استفاده از دستورالعملهای ضرب و جمع/تفریق را فعال یا غیرفعال میکند.
- -mfdpic
- انتخاب ABI مربوط به FDPIC، که از توصیفگرهای تابع برای نمایش اشارهگرها به توابع استفاده میکند. بدون هیچیک از گزینههای مرتبط با PIC/PIE، مستلزم -fPIE است. همراه با -fpic یا -fpie، فرض میکند که ورودیهای GOT و دادههای کوچک در یک محدوده ۱۲-بیتی از آدرس پایه GOT قرار دارند؛ با -fPIC یا -fPIE، آفستهای GOT بهصورت ۳۲ بیتی محاسبه میشوند. با هدف bfin-elf، این گزینه مستلزم -msim است..IP -minline-plt 4 درونریزی (inlining) مدخلهای PLT را در فراخوانی توابعی که مقید شدن محلی (bind locally) آنها محرز نیست، فعال میکند. این گزینه بدون -mfdpic بیاستفاده است. این قابلیت در صورت بهینهسازی برای سرعت و کامپایل برای کتابخانههای اشتراکی (یعنی -fPIC یا -fpic)، یا هنگامی که گزینه بهینهسازی مانند -O3 یا بالاتر در خط فرمان مشخص شده باشد، بهطور پیشفرض فعال است.
- -mTLS
- هنگام تولید کد محلیِ ریسه (thread-local)، قطعه (segment) بزرگ TLS را فرض میگیرد.
- -mtls
- هنگام تولید کد محلیِ ریسه، قطعه بزرگ TLS را فرض نمیگیرد.
- -mgprel-ro
- استفاده از بازنشانیهای (relocations) "GPREL" را در FDPIC ABI برای دادههایی که مشخص است در بخشهای فقطخواندنی (read-only) قرار دارند فعال میکند. بهطور پیشفرض فعال است، بهجز برای -fpic یا -fpie: هرچند ممکن است به کوچکتر شدن جدول آفست سراسری (GOT) کمک کند، اما ۱ دستورالعمل را با ۴ دستورالعمل معاوضه میکند. با -fPIC یا -fPIE، ۳ دستورالعمل را با ۴ دستورالعمل معاوضه میکند که یکی از آنها میتواند بین چندین نماد به اشتراک گذاشته شود و از نیاز به یک مدخل GOT برای نماد ارجاعشده جلوگیری میکند، بنابراین احتمال سودمندی آن بیشتر است. در غیر این صورت، میتوان از -mno-gprel-ro برای غیرفعال کردن آن استفاده کرد.
- -multilib-library-pic
- پیوند با کتابخانههای pic (کتابخانهای، نه FD). این گزینه بهطور ضمنی توسط -mlibrary-pic و همچنین -fPIC و -fpic بدون -mfdpic فعال میشود. هرگز نباید نیاز به استفاده صریح از آن داشته باشید.
- -mlinked-fp
- از الزام EABI مبنی بر ایجاد همیشگی اشارهگر فریم (frame pointer) در زمان تخصیص یک فریم پشته (stack frame) پیروی میکند. این گزینه بهطور پیشفرض فعال است و میتوان با -mno-linked-fp آن را غیرفعال کرد.
- -mlong-calls
- استفاده از آدرسدهی غیرمستقیم برای فراخوانی توابع خارج از واحد ترجمه (compilation unit) فعلی. این امکان را فراهم میسازد که توابع در هر نقطهای از فضای آدرسدهی ۳۲ بیتی قرار گیرند.
- -malign-labels
- تلاش میکند تا برچسبها را با درج NOP در بسته (packet) قبلی، روی مرز ۸ بایتی تراز کند. این گزینه فقط زمانی تأثیر دارد که بستهبندی VLIW فعال باشد. این گزینه بسته جدیدی ایجاد نمیکند؛ بلکه صرفاً NOPها را به بستههای موجود اضافه میکند.
- -mlibrary-pic
- تولید کد EABI مستقل از موقعیت (position-independent).
- -macc-4
- فقط از چهار ثبات انباشتگر چندرسانهای (media accumulator) اول استفاده میکند.
- -macc-8
- از هر هشت ثبات انباشتگر چندرسانهای استفاده میکند.
- -mpack
- -mno-pack
- فعال یا غیرفعال کردن بستهبندی دستورالعملهای VLIW.
- -mno-eflags
- سوئیچهای ABI را در e_flags علامتگذاری نمیکند.
- -mcond-move
- -mno-cond-move
- فعال یا
غیرفعال
کردن
استفاده از
دستورالعملهای
انتقال
شرطی (conditional-move)؛
این گزینه
بهطور
پیشفرض
فعال است.
این سوئیچ عمدتاً برای اشکالزدایی کامپایلر است و احتمالاً در نسخههای آینده حذف خواهد شد.
- -mscc
- -mno-scc
- فعال یا
غیرفعال
کردن
استفاده از
دستورالعملهای
مقداردهی
شرطی (conditional set)؛
بهطور
پیشفرض
فعال است.
این سوئیچ عمدتاً برای اشکالزدایی کامپایلر است و احتمالاً در نسخههای آینده حذف خواهد شد.
- -mcond-exec
- -mno-cond-exec
- فعال یا
غیرفعال
کردن
استفاده از
اجرای شرطی
(conditional execution)؛
بهطور
پیشفرض
فعال است.
این سوئیچ عمدتاً برای اشکالزدایی کامپایلر است و احتمالاً در نسخههای آینده حذف خواهد شد.
- -mvliw-branch
- -mno-vliw-branch
- فعال یا
غیرفعال
کردن یک گام
بهینهسازی
برای
بستهبندی
انشعابها
(branches) در
دستورالعملهای
VLIW؛ بهطور
پیشفرض
فعال است.
این سوئیچ عمدتاً برای اشکالزدایی کامپایلر است و احتمالاً در نسخههای آینده حذف خواهد شد.
- -mmulti-cond-exec
- -mno-multi-cond-exec
- فعال یا
غیرفعال
کردن
بهینهسازی
"&&" و
"||" در
اجرای
شرطی؛
بهطور
پیشفرض
فعال است.
این سوئیچ عمدتاً برای اشکالزدایی کامپایلر است و احتمالاً در نسخههای آینده حذف خواهد شد.
- -mnested-cond-exec
- -mno-nested-cond-exec
- فعال یا
غیرفعال
کردن
بهینهسازیهای
اجرای شرطی
تودرتو؛
بهطور
پیشفرض
فعال است.
این سوئیچ عمدتاً برای اشکالزدایی کامپایلر است و احتمالاً در نسخههای آینده حذف خواهد شد.
- -moptimize-membar
- -mno-optimize-membar
- این سوئیچ دستورالعملهای زائد "membar" را از کد تولیدشده توسط کامپایلر حذف میکند. بهطور پیشفرض فعال است.
- -mtomcat-stats
- باعث میشود gas آمار tomcat را چاپ کند.
- -mcpu=cpu
- نوع پردازندهای که کد برای آن تولید میشود را مشخص میکند. مقادیر ممکن عبارتند از: frv، fr550، tomcat، fr500، fr450، fr405، fr400، fr300 و simple.
گزینههای FT32 (FT32 Options)
این گزینهها بهطور خاص برای معماری FT32 تعریف شدهاند.
- -msim
- مشخص میکند که برنامه روی شبیهساز (simulator) اجرا خواهد شد. این کار باعث پیوند خوردن کتابخانه و کد راهاندازی (startup) زمان اجرای متفاوتی میشود. هنگام تولید برنامههایی که روی سختافزار واقعی اجرا میشوند، نباید از این گزینه استفاده کنید؛ باید کتابخانه زمان اجرای خود را برای هرگونه توابع ورودی/خروجی مورد نیاز فراهم کنید.
- -mnodiv
- از دستورالعملهای div و mod استفاده نمیکند.
- -mft32b
- استفاده از دستورالعملهای توسعهیافته پردازنده FT32B را فعال میکند.
- -mcompress
- تمام کد را با استفاده از طرح فشردهسازی کد FT32B فشرده میکند.
- -mnopm
- کدی تولید نمیکند که حافظه برنامه (program memory) را بخواند.
گزینههای GNU/Linux (GNU/Linux Options)
این گزینههای -m برای مقاصد GNU/Linux تعریف شدهاند:
- -mglibc
- استفاده از کتابخانه GNU C (glibc). این گزینه بهطور پیشفرض فعال است، مگر در مقاصد *-*-linux-*uclibc*، *-*-linux-*musl* و *-*-linux-*android*..IP -muclibc 4 استفاده از کتابخانهٔ سی uClibc. این رفتار پیشفرض در هدفهای *-*-linux-*uclibc* است.
- -mmusl
- استفاده از کتابخانهٔ سی musl. این رفتار پیشفرض در هدفهای *-*-linux-*musl* است.
- -mbionic
- استفاده از کتابخانهٔ سی Bionic. این رفتار پیشفرض در هدفهای *-*-linux-*android* است.
- -mandroid
- -mno-android
- کامپایل کد
سازگار با
پلتفرم Android.
این رفتار
پیشفرض
روی
هدفهای
*-*-linux-*android* است.
هنگام کامپایل، این گزینه بهطور پیشفرض -mbionic، -fPIC، -fno-exceptions و -fno-rtti را فعال میکند. هنگام پیوند، این گزینه باعث میشود راهانداز GCC گزینههای مختص Android را به پیونددهنده پاس دهد. در نهایت، این گزینه موجب تعریف شدن ماکروی پیشپردازندهٔ "__ANDROID__" میشود.
این گزینه را میتوان بهطور کامل با -mno-android غیرفعال کرد.
- -tno-android-cc
- غیرفعال کردن اثرات کامپایلیِ -mandroid، یعنی عدم فعالسازی -mbionic، -fPIC، -fno-exceptions و -fno-rtti بهطور پیشفرض.
- -tno-android-ld
- غیرفعال کردن اثرات پیوندِ -mandroid، یعنی ارسال گزینههای پیوند استاندارد Linux به پیونددهنده.
گزینههای H8/300
این گزینههای -m برای پیادهسازیهای H8/300 تعریف شدهاند:
- -mrelax
- کوتاهتر کردن برخی از ارجاعات آدرس در زمان پیوند در صورت امکان؛ از گزینهٔ پیونددهندهٔ -relax استفاده میکند.
- -mh
- تولید کد برای H8/300H.
- -ms
- تولید کد برای H8S.
- -mn
- تولید کد برای H8S و H8/300H در حالت عادی (normal mode). این سوییچ باید همراه با -mh یا -ms استفاده شود.
- -msx
- تولید کد H8SX.
- -ms2600
- تولید کد برای H8S/2600. این سوییچ باید همراه با -ms استفاده شود.
- -mquickcall
- استفاده از ثباتها برای ارسال آرگومان.
- -mslowbyte
- کند در نظر گرفتن دسترسی به حافظه در اندازهٔ بایت.
- -mexr
- -mno-exr
- ذخیرهٔ ثباتهای گسترشیافته روی پشته قبل از اجرای توابعی با مشخصهٔ "monitor". پیشفرض -mexr است. این گزینه فقط برای هدفهای H8S معتبر است.
- -mint32
- تنظیم اندازهٔ دادههای "int" بهطور پیشفرض روی ۳۲ بیت.
- -malign-300
- در H8/300H و H8S، از همان قواعد ترازسازی مشابه H8/300 استفاده میکند. پیشفرض برای H8/300H و H8S تراز کردن دادههای long و float روی مرزهای ۴ بایتی است. -malign-300 باعث تراز شدن آنها روی مرزهای ۲ بایتی میشود. این گزینه روی H8/300 هیچ اثری ندارد.
گزینههای HPPA
این گزینههای -m برای خانوادهٔ رایانههای HPPA تعریف شدهاند:
- -march=architecture-type
- تولید کد برای معماری مشخصشده. گزینههای موجود برای architecture-type عبارتند از 1.0 برای پردازندههای PA 1.0، 1.1 برای PA 1.1، و 2.0 برای پردازندههای PA 2.0. برای تعیین گزینهٔ معماری مناسب برای دستگاه خود، به فایل /usr/lib/sched.models در یک سیستم HP-UX مراجعه کنید. کدهای کامپایلشده برای معماریهای با شمارهٔ پایینتر روی معماریهای با شمارهٔ بالاتر اجرا میشوند، اما عکس آن صادق نیست.
- -mpa-risc-1-0
- -mpa-risc-1-1
- -mpa-risc-2-0
- بهترتیب مترادفهایی برای -march=1.0، -march=1.1 و -march=2.0 هستند.
- -matomic-libcalls
- -mno-atomic-libcalls
- تولید libcallها
برای
بارگذاریها
و
ذخیرهسازیهای
اتمیک در
صورت
غیرفعال
بودن sync libcallها.
این گزینه
بهطور
پیشفرض
فعال است.
این گزینه
تنها بر
تولید libcallهای
اتمیک توسط
backend مربوط به HPPA
تأثیر
میگذارد.
هر دوی پیادهسازیهای فراخوانی کتابخانهای sync و libatomic از قفلگذاری استفاده میکنند. در نتیجه، عملهای ذخیره در پردازنده نسبت به سایر عملیات اتمیک، اتمیک نیستند. عملهای بارگذاری پردازنده تا اندازهٔ DImode نسبت به سایر عملیات اتمیک اتمیک هستند، به شرطی که بهصورت یک دسترسی واحد پیادهسازی شده باشند.
معماری PA-RISC به جز دستورالعمل "ldcw" از هیچ عملیات اتمیکی در سختافزار پشتیبانی نمیکند. بنابراین، تمام پشتیبانی اتمیک با استفاده از libcallهای sync و atomic پیادهسازی شده است. پشتیبانی از sync libcall در libgcc.a و پشتیبانی از atomic libcall در libatomic قرار دارد.
این گزینه فراخوانیهای "__atomic_exchange" را برای ذخیرههای اتمیک تولید میکند. همچنین مدیریت ویژهای را برای دسترسیهای اتمیک DImode روی هدفهای ۳۲ بیتی فراهم میآورد.
- -mcaller-copies
- فراخواننده (caller) آرگومانهای تابعی را که با ارجاع پنهان ارسال شدهاند کپی میکند. این گزینه باید با احتیاط استفاده شود چرا که با زماناجرای پیشفرض ۳۲ بیتی سازگار نیست. با این حال، فقط ساختارهای دادهای بزرگتر از هشت بایت با ارجاع پنهان ارسال میشوند و این گزینه سازگاری بهتری با OpenMP فراهم میکند.
- -mcoherent-ldcw
- استفاده از راهنمایی کنترل حافظه موقتِ همگام (coherent cache-control hint) برای ldcw/ldcd.
- -mdisable-fpregs
- غیرفعال کردن ثباتهای ممیز شناور. معادل -msoft-float است.
- -mdisable-indexing
- جلوگیری از استفادهٔ کامپایلر از حالتهای آدرسدهی اندیسی. این کار از برخی مشکلات مبهم هنگام کامپایل کد تولیدشده توسط MIG در MACH جلوگیری میکند.
- -mfast-indirect-calls
- تولید کدی
با این فرض
که
فراخوانیها
هرگز از
مرزهای
فضایی عبور
نمیکنند.
این به GCC
اجازه
میدهد کدی
با
فراخوانیهای
غیرمستقیم
سریعتر
تولید کند.
این گزینه در حضور کتابخانههای مشترک یا توابع تودرتو کار نمیکند.
- -mfixed-range=register-range
- تولید کدی که با محدودهٔ ثبات دادهشده به عنوان ثباتهای ثابت برخورد میکند. یک ثبات ثابت ثباتی است که تخصیصدهندهٔ ثبات نمیتواند از آن استفاده کند. این گزینه هنگام کامپایل کد هسته مفید است. محدودهٔ ثبات بهصورت دو ثبات که با یک خط تیره از هم جدا شدهاند مشخص میشود. میتوان چندین محدودهٔ ثبات را بهصورت جداشده با کاما تعیین کرد.
- -mgas
- فعالسازی استفاده از دستورالعملهای اسمبلری که فقط GAS متوجه آنها میشود.
- -mgnu-ld
- استفاده از گزینههای مخصوص به GNU ld. این کار هنگام ساخت یک کتابخانهٔ مشترک، -shared را به ld ارسال میکند. این رفتار پیشفرض است زمانی که GCC بهطور صریح یا ضمنی با پیونددهندهٔ GNU پیکربندی شده باشد. این گزینه بر اینکه کدام ld فراخوانی شود اثری ندارد؛ بلکه تنها پارامترهای ارسالی به آن ld را تغییر میدهد. پیونددهندهای که فراخوانی میشود با گزینهٔ پیکربندی --with-ld، مسیر جستجوی برنامه در GCC و در نهایت با PATH کاربر تعیین میشود. پیونددهندهٔ مورداستفاده توسط GCC را میتوان با دستور which `gcc -print-prog-name=ld` چاپ کرد. این گزینه تنها روی GCC مربوط به HP-UX شصت و چهار بیتی، یعنی پیکربندیشده با hppa*64*-*-hpux*، در دسترس است..IP -mhp-ld 4 استفاده از گزینههای مخصوص به ld شرکت HP. این گزینه در هنگام ساخت یک کتابخانهٔ مشترک، مقدار -b را به ld ارسال میکند و در تمامی پیوندها، +Accept TypeMismatch را به ld میفرستد. این رفتار پیشفرض است هنگامی که GCC بهصورت صریح یا ضمنی با پیونددهندهٔ HP پیکربندی شده باشد. این گزینه بر اینکه کدام ld فراخوانی شود تأثیری ندارد؛ فقط پارامترهایی را که به آن ld ارسال میشوند تغییر میدهد. پیونددهندهٔ ld فراخوانیشده توسط گزینهٔ پیکربندی --with-ld، مسیر جستجوی برنامههای GCC، و در نهایت توسط PATH کاربر تعیین میشود. پیونددهندهٔ استفادهشده توسط GCC را میتوان با دستور which `gcc -print-prog-name=ld` مشاهده کرد. این گزینه تنها در GCC ۶۴-بیتی HP-UX، یعنی پیکربندیشده با hppa*64*-*-hpux*، در دسترس است.
- -mlinker-opt
- گذر بهینهسازی را در پیونددهندهٔ HP-UX فعال میکند. توجه داشته باشید که این کار دیباگ نمادین را غیرممکن میسازد.
- -mlong-calls
- تولید کدی
که از
توالیهای
فراخوانی
طولانی
استفاده
میکند. این
کار تضمین
میکند که
یک
فراخوانی
همواره
بتواند به
stubهای
تولیدشده
توسط
پیونددهنده
دسترسی
یابد. رفتار
پیشفرض
این است که
فراخوانیهای
طولانی
تنها زمانی
تولید شوند
که فاصله از
محل
فراخوانی
تا ابتدای
تابع یا
واحد ترجمه
(بسته به
مورد)، از
حد از پیش
تعیینشدهای
که بر پایهٔ
نوع انشعاب
مورداستفاده
مشخص شده،
فراتر رود.
محدودیتها
برای
فراخوانیهای
عادی
بهترتیب
۷,۶۰۰,۰۰۰ و
۲۴۰,۰۰۰
بایت برای
معماریهای
PA 2.0 و PA 1.X است.
فراخوانیهای
همسطح (Sibling calls)
همیشه به
۲۴۰,۰۰۰
بایت محدود
هستند.
فاصلهها هنگام استفاده از گزینهٔ -ffunction-sections، یا هنگام استفاده از گزینههای -mgas و -mno-portable-runtime در کنار هم تحت HP-UX با پیونددهندهٔ SOM، از ابتدای توابع اندازهگیری میشوند.
معمولاً استفاده از این گزینه مطلوب نیست زیرا کارایی را کاهش میدهد. با این حال، ممکن است در برنامههای بزرگ، بهویژه زمانی که از پیوند جزئی (partial linking) برای ساخت برنامه استفاده میشود، مفید باشد.
انواع فراخوانیهای طولانی مورداستفاده به توانمندیهای اسمبلر و پیونددهنده و نوع کدی که تولید میشود بستگی دارد. تأثیر آن بر سیستمهایی که از فراخوانیهای طولانی مطلق، و فراخوانیهای طولانی تفاضل نماد PIC یا فراخوانیهای نسبی نسبت به PC پشتیبانی میکنند باید نسبتاً اندک باشد. با این حال، در سیستمهای ۳۲-بیتی ELF در کد PIC از فراخوانی غیرمستقیم استفاده میشود که بسیار طولانی است.
- -mlong-load-store
- توالیهای بارگذاری و ذخیرهسازی سهدستوری را آنگونه که گاهی توسط پیونددهندهٔ HP-UX 10 الزام میشود تولید میکند. این گزینه معادل گزینهٔ +k در کامپایلرهای HP است.
- -mno-space-regs
- کدی تولید
میکند که
فرض میکند
مقصد فاقد
ثباتهای
فضا (space registers) است.
این به GCC
اجازه
میدهد
فراخوانیهای
غیرمستقیم
سریعتری
تولید کرده
و از
حالتهای
آدرسدهی
اندیسدار
مقیاسبندینشده
استفاده
کند.
چنین کدی برای سیستمهای PA سطح ۰ و هستهها مناسب است.
- -mordered
- فرض میکند که ارجاعات به حافظه مرتب هستند و نیازی به حائلها (barriers) نیست.
- -mportable-runtime
- استفاده از قراردادهای فراخوانی قابلحمل پیشنهادشده توسط HP برای سیستمهای ELF.
- -mschedule=cpu-type
- کد را با توجه به محدودیتهای نوع ماشین cpu-type زمانبندی میکند. گزینههای انتخابی برای cpu-type عبارتند از 700، 7100، 7100LC، 7200، 7300 و 8000. برای تعیین گزینهٔ زمانبندی مناسب برای دستگاه خود، در یک سیستم HP-UX به /usr/lib/sched.models مراجعه کنید. زمانبندی پیشفرض 8000 است.
- -msio
- -mwsio
- گزینهٔ -msio تعریف پیشین "_SIO" را برای IO کارساز تولید میکند. پیشفرض -mwsio است. این گزینه تعاریف پیشین "__hp9000s700"، "__hp9000s700__" و "_WSIO" را برای IO ایستگاه کاری تولید میکند. این گزینهها تحت HP-UX و HI-UX در دسترس هستند.
- -msoft-float
- خروجی حاوی
فراخوانیهای
کتابخانهای
برای
محاسبات
ممیز شناور
تولید
میکند.
هشدار:
کتابخانههای
ضروری برای
تمامی
مقصدهای HPPA
در دسترس
نیستند.
معمولاً از
امکانات
کامپایلر C
مرسوم
دستگاه
استفاده
میشود،
اما این کار
در کامپایل
متقاطع
بهصورت
مستقیم
امکانپذیر
نیست. شما
باید
خودتان
تمهیدات
لازم را
برای فراهم
کردن توابع
کتابخانهای
مناسب برای
کامپایل
متقاطع
مهیا کنید.
گزینهٔ -msoft-float قرارداد فراخوانی را در فایل خروجی تغییر میدهد؛ بنابراین تنها زمانی مفید است که تمام برنامه را با این گزینه کامپایل کنید. بهویژه، برای اینکه این قابلیت کار کند باید libgcc.a، کتابخانهای که همراه با GCC ارائه میشود، را با -msoft-float کامپایل کنید.
- -msoft-mult
- استفاده از
ضرب عدد
صحیح
نرمافزاری.
این گزینه استفاده از دستورالعمل "xmpyu" را غیرفعال میکند.
- -munix=unix-std
- تعاریف
پیشین
کامپایلر
را تولید
کرده و یک 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" در
کتابخانهٔ C
متعلق به HP-UX
به libdld.sl
وابسته است.
نسخهٔ
بایگانیشدهای
از libdld.sl وجود
ندارد.
بنابراین
زمانی که
گزینهٔ -static
تعیین
میشود، به
گزینههای
پیوند
ویژهای
برای رفع
این
وابستگی
نیاز است.
در HP-UX 10 و بالاتر، درایور GCC در زمان مشخص شدن گزینهٔ -static، گزینههای ضروری برای پیوند با libdld.sl را میافزاید. این موضوع باعث میشود باینری حاصل بهصورت پویا باشد. در پورت ۶۴-بیتی، پیونددهندهها در هر حال بهطور پیشفرض باینریهای پویا تولید میکنند. گزینهٔ -nolibdld میتواند برای ممانعت از افزودن این گزینههای پیوند توسط درایور GCC به کار رود.
- -threads
- پشتیبانی از چندریسمانی با کتابخانهٔ dce thread را تحت HP-UX اضافه میکند. این گزینه پرچمهایی را هم برای پیشپردازنده و هم برای پیونددهنده تنظیم میکند.
گزینههای IA-64 (IA-64 Options)
اینها گزینههای -m هستند که برای معماری Intel IA-64 تعریف شدهاند.
- -mbig-endian
- تولید کد برای مقصد بزرگپایان (big-endian). این مقدار پیشفرض برای HP-UX است.
- -mlittle-endian
- تولید کد برای مقصد کوچکپایان (little-endian). این مقدار پیشفرض برای AIX5 و GNU/Linux است.
- -mgnu-as
- -mno-gnu-as
- تولید (یا عدم تولید) کد برای اسمبلر GNU. این رفتار پیشفرض است.
- -mgnu-ld
- -mno-gnu-ld
- تولید (یا عدم تولید) کد برای پیونددهندهٔ GNU. این رفتار پیشفرض است.
- -mno-pic
- تولید کدی که از ثبات اشارهگر عمومی استفاده نمیکند. نتیجه، کد مستقل از موقعیت نخواهد بود و ABI متعلق به IA-64 را نقض میکند.
- -mvolatile-asm-stop
- -mno-volatile-asm-stop
- تولید کردن (یا نکردن) بیت توقف (stop bit) بلافاصله پیش و پس از عبارتهای volatile asm.
- -mregister-names
- -mno-register-names
- تولید کردن (یا نکردن) نامهای ثبات in، loc و out برای ثباتهای پشتهای (stacked registers). این کار ممکن است خوانایی خروجی اسمبلر را افزایش دهد.
- -mno-sdata
- -msdata
- غیرفعالسازی (یا فعالسازی) بهینهسازیهایی که از بخش دادههای کوچک (small data section) استفاده میکنند. این گزینه ممکن است برای دور زدن اشکالات بهینهساز مفید باشد.
- -mconstant-gp
- تولید کدی که از یک مقدار ثابت و یکتای اشارهگر سراسری (global pointer) استفاده میکند. این گزینه هنگام کامپایل کد کرنل کاربرد دارد.
- -mauto-pic
- تولید کدی که خودبازمکانیاب (self-relocatable) باشد. این گزینه مستلزم -mconstant-gp است. این ویژگی هنگام کامپایل کد میانافزار (firmware) مفید است.
- -minline-float-divide-min-latency
- تولید کد برای تقسیمهای درونخطی (inline) مقادیر ممیز شناور با استفاده از الگوریتم کمینهٔ تاخیر (minimum latency).
- -minline-float-divide-max-throughput
- تولید کد برای تقسیمهای درونخطی مقادیر ممیز شناور با استفاده از الگوریتم بیشینهٔ توان عملیاتی (maximum throughput).
- -mno-inline-float-divide
- تولید نکردن کد درونخطی برای تقسیمهای مقادیر ممیز شناور.
- -minline-int-divide-min-latency
- تولید کد برای تقسیمهای درونخطی مقادیر صحیح با استفاده از الگوریتم کمینهٔ تاخیر.
- -minline-int-divide-max-throughput
- تولید کد برای تقسیمهای درونخطی مقادیر صحیح با استفاده از الگوریتم بیشینهٔ توان عملیاتی.
- -mno-inline-int-divide
- تولید نکردن کد درونخطی برای تقسیمهای مقادیر صحیح.
- -minline-sqrt-min-latency
- تولید کد برای جذر درونخطی با استفاده از الگوریتم کمینهٔ تاخیر.
- -minline-sqrt-max-throughput
- تولید کد برای جذر درونخطی با استفاده از الگوریتم بیشینهٔ توان عملیاتی.
- -mno-inline-sqrt
- تولید نکردن کد درونخطی برای "sqrt".
- -mno-dwarf2-asm
- -mdwarf2-asm
- تولید نکردن (یا کردن) کد اسمبلر برای اطلاعات اشکالزدایی شماره خط DWARF. این گزینه ممکن است هنگام استفاده نکردن از اسمبلر گنو (GNU assembler) مفید باشد.
- -mearly-stop-bits
- -mno-early-stop-bits
- اجازه دادن به قرارگیری بیتهای توقف زودتر از موقعیت بلافاصله پیش از دستوری که باعث فعال شدن بیت توقف شده است. این کار میتواند زمانبندی دستورها را بهبود بخشد، اما همواره اینگونه نیست.
- -mfixed-range=register-range
- تولید کدی که بازهٔ ثبات مشخصشده را به عنوان ثباتهای ثابت در نظر میگیرد. ثبات ثابت ثباتی است که تخصیصدهندهٔ ثبات (register allocator) نمیتواند از آن استفاده کند. این گزینه هنگام کامپایل کد کرنل کاربرد دارد. بازهٔ ثباتها به صورت دو ثبات جداشده با یک خط تیره مشخص میشود. چندین بازهٔ ثبات را میتوان با ویرگول انگلیسی از یکدیگر جدا کرد.
- -mtls-size=tls-size
- مشخص کردن اندازهٔ بیتی آفستهای بیواسطهٔ 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" میشود. تنظیم پیشفرض غیرفعال است.
- -msched-br-in-data-spec
- -mno-sched-br-in-data-spec
- (فعال/غیرفعال)سازی زمانبندی حدسی دستورهایی که قبل از reload به بارگذاریهای حدسی دادهها وابسته هستند. این گزینه تنها با فعال بودن -msched-br-data-spec مؤثر است. تنظیم پیشفرض فعال است.
- -msched-ar-in-data-spec
- -mno-sched-ar-in-data-spec
- (فعال/غیرفعال)سازی زمانبندی حدسی دستورهایی که پس از reload به بارگذاریهای حدسی دادهها وابسته هستند. این گزینه تنها با فعال بودن -msched-ar-data-spec مؤثر است. تنظیم پیشفرض فعال است.
- -msched-in-control-spec
- -mno-sched-in-control-spec
- (فعال/غیرفعال)سازی زمانبندی حدسی دستورهایی که به بارگذاریهای حدسی کنترلی وابسته هستند. این گزینه تنها با فعال بودن -msched-control-spec مؤثر است. تنظیم پیشفرض فعال است.
- -mno-sched-count-spec-in-critical-path
- -msched-count-spec-in-critical-path
- در صورت فعال بودن، وابستگیهای حدسی در طول محاسبهٔ اولویتهای دستورها در نظر گرفته میشوند. این امر کاربرد حدسزنی را کمی محافظهکارانهتر میکند. تنظیم پیشفرض غیرفعال است.
- -msched-spec-ldc
- -mno-sched-spec-ldc
- استفاده از بررسی سادهٔ حدس دادهها. این گزینه بهطور پیشفرض فعال است..IP -msched-control-spec-ldc 4
- -mno-sched-control-spec-ldc
- استفاده از یک بررسی ساده برای حدس کنترلی (control speculation). این گزینه بهطور پیشفرض فعال است.
- -msched-stop-bits-after-every-cycle
- -mno-sched-stop-bits-after-every-cycle
- قرار دادن یک بیت توقف پس از هر چرخه در زمان زمانبندی. این گزینه بهطور پیشفرض فعال است.
- -msched-fp-mem-deps-zero-cost
- -mno-sched-fp-mem-deps-zero-cost
- فرض بر اینکه ذخیرهها و بارگذاریهای ممیز شناور در صورت قرارگیری در یک گروه دستورالعمل یکسان، احتمالاً تداخلی ایجاد نمیکنند. این گزینه بهطور پیشفرض غیرفعال است.
- -msel-sched-dont-check-control-spec
- -mno-sel-sched-dont-check-control-spec
- تولید بررسیها برای حدس کنترلی در زمانبندی انتخابی (selective scheduling). این پرچم بهطور پیشفرض غیرفعال است.
- -msched-max-memory-insns=max-insns
- محدود کردن تعداد دستورالعملهای حافظه در هر گروه دستورالعمل، با اولویت پایینتر دادن به دستورالعملهای حافظه بعدی که سعی در زمانبندی در همان گروه دستورالعمل دارند. این گزینه اغلب برای جلوگیری از تداخلهای بنک حافظه پنهان (cache bank conflicts) مفید است. مقدار پیشفرض 1 است.
- -msched-max-memory-insns-hard-limit
- -mno-sched-max-memory-insns-hard-limit
- محدودیت مشخصشده توسط msched-max-memory-insns را به یک حد سخت (hard limit) تبدیل میکند که وجود تعداد بیشتری در یک گروه دستورالعمل را مجاز نمیداند. در غیر این صورت، این محدودیت «نرم» (soft) است، به این معنی که با رسیدن به حد نصاب، عملیاتهای غیر حافظهای ترجیح داده میشوند، اما عملیاتهای حافظه همچنان ممکن است زمانبندی شوند.
گزینههای LM32
این گزینههای -m برای معماری LatticeMico32 تعریف شدهاند:
- -mbarrel-shift-enabled
- فعالسازی دستورالعملهای barrel-shift.
- -mdivide-enabled
- فعالسازی دستورالعملهای تقسیم و باقیمانده (modulus).
- -mmultiply-enabled
- فعالسازی دستورالعملهای ضرب.
- -msign-extend-enabled
- فعالسازی دستورالعملهای گسترش علامت (sign extend).
- -muser-enabled
- فعالسازی دستورالعملهای تعریفشده توسط کاربر.
گزینههای LoongArch
این گزینههای خط فرمان برای مقصدهای LoongArch تعریف شدهاند:
- -march=arch-type
- تولید
دستورالعملها
برای نوع
ماشین arch-type.
-march=arch-type به GCC
اجازه
میدهد کدی
تولید کند
که ممکن است
روی
پردازندههایی
غیر از
پردازنده
مشخصشده
اصلاً اجرا
نشود.
انتخابها برای arch-type عبارتند از:
- native
- نوع پردازنده محلی تشخیصدادهشده توسط کامپایلر بومی.
- loongarch64
- پردازنده عمومی ۶۴ بیتی LoongArch.
- la464
- پردازنده مبتنی بر LoongArch LA464 همراه با LSX و LASX.
- la664
- پردازنده مبتنی بر LoongArch LA664 همراه با LSX، LASX و تمام دستورالعملهای LoongArch v1.1.
- la64v1.0
- LoongArch64 ISA نسخه 1.0.
- la64v1.1
- LoongArch64 ISA نسخه 1.1.
- la32v1.0
- LoongArch32 ISA نسخه 1.0.
- la32rv1.0
- LoongArch32 Reduced ISA نسخه 1.0.
اطلاعات بیشتر درباره نسخههای LoongArch ISA را میتوان در https://github.com/loongson/la-toolchain-conventions یافت.
- -mtune=tune-type
- بهینهسازی
کد
تولیدشده
برای
پردازنده
مقصد
مشخصشده.
انتخابها برای tune-type عبارتند از:
- native
- نوع پردازنده محلی تشخیصدادهشده توسط کامپایلر بومی.
- generic
- پردازنده عمومی LoongArch.
- loongarch64
- پردازنده عمومی ۶۴ بیتی LoongArch.
- la464
- هسته LoongArch LA464.
- la664
- هسته LoongArch LA664.
- loongarch32
- پردازنده عمومی ۳۲ بیتی LoongArch.
- -mabi=base-abi-type
- تولید کد برای قرارداد فراخوانی (calling convention) مشخصشده. base-abi-type میتواند یکی از موارد زیر باشد:
- lp64d
- استفاده از ثباتهای همهمنظوره ۶۴ بیتی و ثباتهای ممیز شناور ۳۲/۶۴ بیتی برای انتقال پارامتر. مدل داده LP64 است که در آن int برابر ۳۲ بیت و long int و اشارهگرها ۶۴ بیتی هستند.
- lp64f
- استفاده از ثباتهای همهمنظوره ۶۴ بیتی و ثباتهای ممیز شناور ۳۲ بیتی برای انتقال پارامتر. مدل داده LP64 است که در آن int برابر ۳۲ بیت و long int و اشارهگرها ۶۴ بیتی هستند.
- lp64s
- استفاده از ثباتهای همهمنظوره ۶۴ بیتی و عدم استفاده از ثباتهای ممیز شناور برای انتقال پارامتر. مدل داده LP64 است که در آن int برابر ۳۲ بیت و long int و اشارهگرها ۶۴ بیتی هستند.
- -mfpu=fpu-type
- تولید کد برای نوع FPU مشخصشده، که میتواند یکی از موارد زیر باشد:
- 64
- مجاز شمردن استفاده از دستورالعملهای سختافزاری ممیز شناور برای عملیاتهای ۳۲ بیتی و ۶۴ بیتی.
- 32
- مجاز شمردن استفاده از دستورالعملهای سختافزاری ممیز شناور برای عملیاتهای ۳۲ بیتی.
- none
- 0
- از بهکارگیری دستورالعملهای ممیز شناور سختافزاری جلوگیری میکند.
- -msimd=simd-type
- تولید دستورالعملهای LoongArch SIMD را برای برداریسازی (vectorization) و از طریق توابع توکار (builtin) فعال میکند. مقدار میتواند یکی از موارد زیر باشد:
- -msoft-float
- گزینهٔ -mfpu=none را اجبار کرده و از بهکارگیری ثباتهای ممیز شناور برای انتقال پارامترها جلوگیری میکند. این گزینه ممکن است ABI هدف را تغییر دهد.
- -msingle-float
- گزینهٔ -mfpu=32 را اجبار کرده و استفاده از ثباتهای ممیز شناور ۳۲بیتی را برای انتقال پارامترها مجاز میکند. این گزینه ممکن است ABI هدف را تغییر دهد.
- -mdouble-float
- گزینهٔ -mfpu=64 را اجبار کرده و استفاده از ثباتهای ممیز شناور ۳۲/۶۴بیتی را برای انتقال پارامترها مجاز میکند. این گزینه ممکن است ABI هدف را تغییر دهد.
- -mlasx
- -mno-lasx
- -mlsx
- -mno-lsx
- دامنهٔ افزونههای SIMD قابلاستفاده توسط کامپایلر برای تولید کد (none / LSX / LASX) را بهصورت تدریجی تنظیم میکند. فعالسازی LASX با -mlasx بهطور خودکار LSX را فعال کرده، و غیرفعالسازی LSX با -mno-lsx بهطور خودکار LASX را غیرفعال میکند. این گزینههای اختصاصی درایور، روی وضعیت نهایی پیکربندی -msimd اعمال شده و به ترتیبی که در خط فرمان درایور GCC ظاهر میشوند تغییرات تدریجی ایجاد میکنند تا در نهایت گزینهٔ استانداردشده و نهایی -msimd را که به خود کامپایلر ارسال میشود حاصل نمایند.
- -mbranch-cost=n
- هزینهٔ انشعابها را تقریباً برابر با n دستورالعمل تعیین میکند.
- -maddr-reg-reg-cost=n
- هزینهٔ ADDRESS_REG_REG را برابر با مقدار محاسبهشده توسط n قرار میدهد.
- -mcheck-zero-division
- -mno-check-zero-divison
- در تقسیم عدد صحیح بر صفر تله (trap) ایجاد میکند (نمیکند). حالت پیشفرض، -mcheck-zero-division برای سطوح بهینهسازی -O0 یا -Og، و -mno-check-zero-division برای سایر سطوح بهینهسازی است.
- -mbreak-code=code
- یک دستورالعمل "break" code برای تلههای غیرقابلبازیابی حاصل از "__builtin_trap" یا موارد درجشده توسط کامپایلر (برای نمونه یک مسیر نادرست تفکیکشده با -fisolate-erroneous-paths-dereference) صادر میکند، یا در صورتی که code منفی یا بزرگتر از ۳۲۷۶۷ باشد یک دستورالعمل "amswap.w $r0, $r1, $r0" صادر میکند که سبب میشود سختافزار یک استثنای Instruction Not-defined Exception ایجاد نماید. مقدار پیشفرض -1 است، به این معنی که از دستورالعمل "amswap.w" استفاده شود.
- -mcond-move-int
- -mno-cond-move-int
- انتقالهای شرطی برای دادههای صحیح در ثباتهای همهمنظوره فعال (غیرفعال) میشوند. پیشفرض -mcond-move-int است.
- -mcond-move-float
- -mno-cond-move-float
- انتقالهای شرطی برای ثباتهای ممیز شناور فعال (غیرفعال) میشوند. پیشفرض -mcond-move-float است.
- -mmemcpy
- -mno-memcpy
- استفاده از "memcpy" را برای جابهجاییهای بلوکی غیرساده اجبار (یا عدم اجبار) میکند. پیشفرض -mno-memcpy است که به GCC امکان میدهد بیشتر رونوشتهای با اندازهٔ ثابت را درونخطی (inline) کند. تعیین سطح بهینهسازی روی -Os نیز استفاده از "memcpy" را اجبار میکند، اما در صورت تعیین صریح، -mno-memcpy میتواند این رفتار را صرفنظر از ترتیب این گزینهها در خط فرمان لغو نماید.
- -mstrict-align
- -mno-strict-align
- از ایجاد دسترسیهای حافظهای که ممکن است بر روی مرز طبیعی شیء، آنگونه که در مشخصات معماری تعریف شده، تراز نشده باشند اجتناب میکند (یا آنها را مجاز میسازد). مقدار پیشفرض -mno-strict-align است.
- -G num
- دادههای سراسری و ایستا با اندازهٔ کوچکتر از num بایت را در یک بخش دادههای کوچک (small data section) قرار میدهد. مقدار پیشفرض 0 است.
- -mmax-inline-memcpy-size=n
- تمام جابهجاییهای بلوکی (مانند فراخوانیهای "memcpy" یا رونوشتهای ساختار) کمتر یا مساوی با n بایت را درونخطی (inline) میکند. مقدار پیشفرض n برابر با 1024 است.
- -mcmodel=code-model
- مدل کد (code model) را روی یکی از موارد زیر تنظیم میکند:
- tiny-static (هنوز پیادهسازی نشده است)
- tiny (هنوز پیادهسازی نشده است)
- normal
- بخش کد (text segment) باید درون فضای آدرسدهی 128MB باشد. بخش داده (data segment) باید درون فضای آدرسدهی 2GB باشد.
- medium
- بخش کد و بخش داده هر دو باید درون فضای آدرسدهی 2GB قرار داشته باشند. این مدل کد پیشفرض است مگر آنکه GCC با --with-cmodel= بهگونهای پیکربندی شده باشد که مدل کد پیشفرض متفاوتی را مشخص کند.
- large (هنوز پیادهسازی نشده است)
- extreme
- این حالت اندازهٔ بخش کد و بخش داده را محدود نمیکند. گزینهٔ -mcmodel=extreme با -fplt و/یا -mexplicit-relocs=none ناسازگار است.
- -mexplicit-relocs=style
- -mexplicit-relocs
- -mno-explicit-relocs
- تعیین
میکند که
چه زمانی در
هنگام کار
با
آدرسهای
نمادین، از
عملگرهای
بازمکانی
(relocation operators) اسمبلر
استفاده
شود. روش
جایگزین،
استفاده از
ماکروهای
اسمبلر است
که ممکن است
زمانبندی
دستورالعملها
را محدود
کند اما
امکان
بهینهسازی
پیونددهنده
(linker relaxation) را
فراهم
میسازد. با
-mexplicit-relocs=none،
همواره از
ماکروهای
اسمبلر
استفاده
میشود؛ با
-mexplicit-relocs=always،
همواره از
عملگرهای
بازمکانی
اسمبلر
استفاده
میشود؛ و
با -mexplicit-relocs=auto
کامپایلر
در جاهایی
که linker relaxation برای
بهبود
کیفیت کد
غیرممکن
است از
عملگرهای
بازمکانی،
و در سایر
جاها از
ماکروها
استفاده
میکند.
مقدار پیشفرض این گزینه بر اساس قابلیتهای اسمبلر شناساییشده در زمان ساخت GCC و همچنین تنظیم -mrelax تعیین میشود: -mexplicit-relocs=none اگر اسمبلر اصلاً از عملگرهای بازمکانی پشتیبانی نکند، -mexplicit-relocs=always اگر اسمبلر از عملگرهای بازمکانی پشتیبانی کند اما -mrelax فعال نباشد، -mexplicit-relocs=auto اگر اسمبلر از عملگرهای بازمکانی پشتیبانی کند و -mrelax نیز فعال باشد.
برای سازگاری رو به عقب، -mexplicit-relocs معادل با -mexplicit-relocs=always بوده، در حالی که -mno-explicit-relocs معادل با -mexplicit-relocs=none است..IP -mdirect-extern-access 4
- -mno-direct-extern-access
- استفاده از
GOT را برای
دسترسی به
نمادهای
خارجی
کنترل
میکند.
حالت
پیشفرض
-mno-direct-extern-access است:
برای
نمادهای
خارجی با
نمایانی
پیشفرض از
GOT استفاده
میشود،
اما برای
سایر
نمادهای
خارجی
استفاده
نمیشود.
با -mdirect-extern-access، از GOT استفاده نمیشود و تمام نمادهای خارجی بهصورت وابسته به PC (یا PC-relative) آدرسدهی میشوند. این گزینه تنها برای محیطهایی مناسب است که هیچ پیوند پویایی در آنها انجام نمیشود؛ مانند سفتافزارها، هستههای سیستمعامل، یا فایلهای اجرایی پیوندیافته با -static یا -static-pie. گزینهٔ -mdirect-extern-access با -fPIC یا -fpic سازگار نیست.
- -mrelax
- -mno-relax
- بهرهگیری (یا عدم بهرهگیری) از آسانسازیهای پیونددهنده (linker relaxations). اگر -mpass-mrelax-to-as فعال باشد، این گزینه به اسمبلر نیز ارسال میشود. حالت پیشفرض در زمان ساخت GCC با تشخیص پشتیبانی اسمبلر مربوطه تعیین میشود: در صورتی که اسمبلر هم از گزینهٔ -mrelax و هم از بهینهسازی relaxation انشعاب شرطی پشتیبانی کند، مقدار پیشفرض -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" پشتیبانی میکند. توجه داشته باشید که اگرچه توان عملیاتی این توالی بالاتر از توان عملیاتی دستور غیرمعکوس است، اما دقت توالی میتواند تا ۲ ulp کاهش یابد (به عنوان مثال معکوس 1.0 برابر با 0.99999994 میشود).
- -mrecip=opt
- این گزینه مشخص میکند کدامیک از دستورهای تخمین معکوس مجاز به استفاده هستند. opt فهرستی از گزینهها است که با کاما از یکدیگر جدا میشوند، و میتوان یک علامت ! را در ابتدای هر گزینه برای معکوس کردن عملکرد آن قرار داد:
- all
- فعالسازی تمامی دستورهای تخمین.
- default
- فعالسازی دستورهای پیشفرض، معادل با -mrecip.
- none
- غیرفعالسازی تمامی دستورهای تخمین، معادل با -mno-recip.
- div
- فعالسازی تقریب برای تقسیم اسکالر.
- vec-div
- فعالسازی تقریب برای تقسیم برداری.
- sqrt
- فعالسازی تقریب برای ریشهٔ دوم اسکالر.
- vec-sqrt
- فعالسازی تقریب برای ریشهٔ دوم برداری.
- rsqrt
- فعالسازی تقریب برای معکوس ریشهٔ دوم اسکالر.
- vec-rsqrt
- فعالسازی تقریب برای معکوس ریشهٔ دوم برداری.
بنابراین، به عنوان مثال، -mrecip=all,!sqrt تمامی تقریبهای معکوس را به جز ریشهٔ دوم اسکالر فعال میکند.
- -mfrecipe
- -mno-frecipe
- استفاده (یا عدم استفاده) از دستورهای "frecipe.{s/d}" و "frsqrte.{s/d}". هنگام کامپایل با -march=la664، این گزینه بهطور پیشفرض فعال است. در غیر این صورت، مقدار پیشفرض -mno-frecipe خواهد بود.
- -mdiv32
- -mno-div32
- استفاده (یا عدم استفاده) از دستورهای "div.w[u]" و "mod.w[u]" با ورودیهایی که بسط علامت نیافتهاند (sign-extended نشدهاند). هنگام کامپایل با -march=la664، این گزینه بهطور پیشفرض فعال است. در غیر این صورت پیشفرض -mno-div32 است.
- -mlam-bh
- -mno-lam-bh
- استفاده (یا عدم استفاده) از دستورهای "am{swap/add}[_db].{b/h}". هنگام کامپایل با -march=la664، بهطور پیشفرض فعال است. در غیر این صورت پیشفرض -mno-lam-bh است.
- -mlamcas
- -mno-lamcas
- استفاده (یا عدم استفاده) از دستورهای "amcas[_db].{b/h/w/d}". هنگام کامپایل با -march=la664، این گزینه بهطور پیشفرض فعال است. در غیر این صورت پیشفرض -mno-lamcas است.
- -mld-seq-sa
- -mno-ld-seq-sa
- تعیین اینکه آیا به یک سد بارگذاری-بارگذاری همآدرس ("dbar 0x700") نیاز است یا خیر. هنگام کامپایل با -march=la664، این گزینه بهطور پیشفرض فعال است. در غیر این صورت، پیشفرض -mno-ld-seq-sa است و به سد بارگذاری-بارگذاری نیاز خواهد بود.
- -mscq
- -mno-scq
- استفاده (یا عدم استفاده) از دستور ذخیرهٔ مشروط ۱۶ بایتی "sc.q". اگر نوع ماشین مشخصشده با -march= از این دستور پشتیبانی کند، مقدار پیشفرض -mscq است؛ در غیر این صورت -mno-scq خواهد بود.
- -mtls-dialect=opt
- این گزینه مشخص میکند کدام گویش TLS برای مدلهای پویای عمومی (general dynamic) و پویای محلی (local dynamic) میتواند استفاده شود. آرگومان opt میتواند یکی از موارد زیر باشد:
- -mannotate-tablejump
- -mno-annotate-tablejump
- ایجاد یک بخش حاشیهنویسی با نام ".discard.tablejump_annotate" برای مرتبط کردن دستور "jirl" و جدول پرش، زمانی که از یک جدول پرش برای بهینهسازی عبارت "switch" استفاده میشود. برخی ابزارهای خارجی، برای نمونه objtool در سامانهٔ ساخت هستهٔ لینوکس، برای تحلیل جریان کنترل به این حاشیهنویسی نیاز دارند. پیشفرض -mno-annotate-tablejump است..PP گزینههای LynxOS
این گزینهها برای اهداف LynxOS در دسترس هستند.
- استفاده از کتابخانههای اشتراکی. حالت پیشفرض پیوند دادن با کتابخانههای ایستا است.
- -mthreads
- پشتیبانی از چندنخی (multi-threading).
- -mlegacy-threads
- پشتیبانی از چندنخی سنتی (legacy). این گزینه با -mthreads ناسازگار است.
گزینههای M32C
- -mcpu=name
- پردازندهای (CPU) که کد برای آن تولید میشود را انتخاب میکند. name میتواند یکی از مقادیر r8c برای سری R8C/Tiny، m16c برای سری M16C (تا /60)، m32cm برای سری M16C/80، یا m32c برای سری M32C/80 باشد.
- -msim
- مشخص میکند که برنامه روی شبیهساز اجرا خواهد شد. این کار باعث پیوند خوردن با یک کتابخانهٔ زمان اجرای جایگزین میشود که برای مثال از ورودی/خروجی فایل پشتیبانی میکند. هنگام تولید برنامههایی که قرار است روی سختافزار واقعی اجرا شوند، نباید از این گزینه استفاده کنید؛ باید برای هر تابع ورودی/خروجی که نیاز است، کتابخانهٔ زمان اجرای خود را فراهم کنید.
- -memregs=number
- تعداد شبهثباتهای مبتنی بر حافظه را که GCC در زمان تولید کد استفاده میکند، مشخص مینماید. این شبهثباتها مانند ثباتهای واقعی استفاده میشوند، بنابراین بین توانایی GCC در جا دادن کد در ثباتهای موجود و افت کارایی ناشی از استفاده از حافظه به جای ثباتها، یک مصالحه وجود دارد. توجه داشته باشید که تمام ماژولهای یک برنامه باید با مقدار یکسانی برای این گزینه کامپایل شوند. به همین دلیل، نباید از این گزینه به همراه کتابخانههای زمان اجرای پیشفرض GCC استفاده کنید.
گزینههای M32R/D
این گزینههای -m برای معماریهای Renesas M32R/D تعریف شدهاند:
- -m32r2
- تولید کد برای M32R/2.
- -m32rx
- تولید کد برای M32R/X.
- -m32r
- تولید کد برای M32R. این مقدار پیشفرض است.
- -mmodel=small
- فرض میکند
همهٔ شیءها
در ۱۶
مگابایت
ابتدایی
حافظه قرار
دارند (به
طوری که
آدرس آنها
بتواند با
دستورالعمل
"ld24"
بارگذاری
شود)، و فرض
میکند
همهٔ
زیرروالها
با
دستورالعمل
"bl" در
دسترس
هستند. این
مقدار
پیشفرض
است.
آدرسپذیری یک شیء خاص را میتوان با استفاده از ویژگی "model" تعیین کرد.
- -mmodel=medium
- فرض میکند شیءها ممکن است در هر کجای فضای آدرس ۳۲ بیتی باشند (کامپایلر دستورالعملهای "seth/add3" را برای بارگذاری آدرسهای آنها تولید میکند)، و فرض میکند همهٔ زیرروالها با دستورالعمل "bl" در دسترس هستند.
- -mmodel=large
- فرض میکند شیءها ممکن است در هر کجای فضای آدرس ۳۲ بیتی باشند (کامپایلر دستورالعملهای "seth/add3" را برای بارگذاری آدرسهای آنها تولید میکند)، و فرض میکند زیرروالها ممکن است با دستورالعمل "bl" در دسترس نباشند (کامپایلر توالی دستورالعمل بسیار کندترِ "seth/add3/jl" را تولید میکند).
- -msdata=none
- استفاده از
ناحیهٔ
دادههای
کوچک (small data area) را
غیرفعال
میکند.
متغیرها در
یکی از
بخشهای
".data"،
".bss"، یا
".rodata"
قرار
میگیرند
(مگر اینکه
ویژگی
"section"
مشخص شده
باشد). این
مقدار
پیشفرض
است.
ناحیهٔ دادههای کوچک شامل بخشهای ".sdata" و ".sbss" است. اشیاء را میتوان با استفاده از ویژگی "section" و با بهکارگیری یکی از این بخشها، به صورت صریح در ناحیهٔ دادههای کوچک قرار داد.
- -msdata=sdata
- دادههای سراسری و ایستای کوچک را در ناحیهٔ دادههای کوچک قرار میدهد، اما کد خاصی برای ارجاع به آنها تولید نمیکند.
- -msdata=use
- دادههای سراسری و ایستای کوچک را در ناحیهٔ دادههای کوچک قرار میدهد و دستورالعملهای خاصی برای ارجاع به آنها تولید میکند.
- -G num
- اشیاء
سراسری و
ایستای
کوچکتر یا
مساوی با num
بایت را به
جای
بخشهای
عادی data یا BSS،
در بخشهای
دادههای
کوچک یا BSS
قرار
میدهد.
مقدار
پیشفرض num
برابر 8 است.
گزینهٔ -msdata
برای
اینکه این
گزینه اثری
داشته باشد
باید روی
یکی از
مقادیر sdata
یا use تنظیم
شده باشد.
همهٔ ماژولها باید با مقدار -G num یکسانی کامپایل شوند. کامپایل کردن با مقادیر متفاوت num ممکن است کار کند یا نکند؛ اگر کار نکند، پیونددهنده یک پیام خطا میدهد---کد نادرست تولید نخواهد شد.
- -mdebug
- باعث میشود کد مخصوص M32R در کامپایلر، برخی آمارهها را نمایش دهد که ممکن است در اشکالزدایی برنامهها مفید باشد.
- -malign-loops
- -mno-align-loops
- تراز کردن همهٔ حلقهها روی یک مرز ۳۲ بایتی. این گزینه بهطور پیشفرض غیرفعال است.
- -missue-rate=number
- صدور number دستورالعمل در هر چرخه. number تنها میتواند 1 یا 2 باشد.
- -mbranch-cost=number
- مقدار number تنها میتواند 1 یا 2 باشد. اگر 1 باشد، انشعابها بر کد شرطی ترجیح داده میشوند؛ اگر 2 باشد، عکس این حالت اعمال میشود.
- -mflush-trap=number
- شمارهٔ trap مورد استفاده برای تخلیهٔ حافظهٔ نهان (cache flush) را مشخص میکند. مقدار پیشفرض 12 است. شمارههای معتبر بین 0 و 15 (شامل هر دو) هستند.
- -mno-flush-trap
- مشخص میکند که حافظهٔ نهان نمیتواند با استفاده از یک trap تخلیه شود.
- -mflush-func=name
- نام تابع سیستمعاملی را که برای تخلیهٔ حافظهٔ نهان باید فراخوانی شود مشخص میکند. مقدار پیشفرض _flush_cache است، اما فراخوانی تابع تنها در صورتی استفاده میشود که trap در دسترس نباشد.
- -mno-flush-func
- نشان میدهد که هیچ تابع سیستمعاملی برای تخلیهٔ حافظهٔ نهان وجود ندارد.
گزینههای M680x0
اینها گزینههای -m تعریفشده برای پردازندههای M680x0 و ColdFire هستند. تنظیمات پیشفرض به این بستگی دارد که در هنگام پیکربندی کامپایلر کدام معماری انتخاب شده باشد؛ مقادیر پیشفرض برای متداولترین انتخابها در زیر آمده است.
- -march=arch
- تولید کد
برای یک
معماری
مجموعه
دستورالعمل
خاص از M680x0 یا
ColdFire. مقادیر
مجاز برای
arch در
معماریهای
M680x0 عبارتند
از: 68000، 68010،
68020، 68030، 68040،
68060 و cpu32.
معماریهای
ColdFire بر اساس
طبقهبندی
ISA شرکت Freescale
انتخاب
میشوند و
مقادیر
مجاز
عبارتند از:
isaa، isaaplus، isab و
isac.
کامپایلر GCC هر زمان که کدی برای یک هدف ColdFire تولید میکند، ماکروی "__mcfarch__" را تعریف مینماید. arch در این ماکرو یکی از آرگومانهای -march است که در بالا ذکر شد.
هنگامی که -march و -mtune با یکدیگر استفاده شوند، کدی را انتخاب میکنند که روی خانوادهای از پردازندههای مشابه اجرا میشود اما برای یک ریزمعماری (microarchitecture) خاص بهینهسازی شده است.
- -mcpu=cpu
- تولید کد برای یک پردازندهٔ خاص M680x0 یا ColdFire. مقادیر cpu برای M680x0 عبارتند از: 68000، 68010، 68020، 68030، 68040، 68060، 68302، 68332 و cpu32. پردازندههای cpu برای ColdFire در جدول زیر آورده شدهاند، که همچنین پردازندهها را به خانوادهها دستهبندی میکند:
- خانواده : آرگومانهای -mcpu
- 51 : 51 51ac 51ag 51cn 51em 51je 51jf 51jg 51jm 51mm 51qe 51qm
- 5206 : 5202 5204 5206
- 5206e : 5206e
- 5211a : 5210a 5211a
- 5213 : 5211 5212 5213
- 5216 : 5214 5216
- 52235 : 52230 52231 52232 52233 52234 52235
- 5225 : 5224 5225
- 52259 : 52252 52254 52255 52256 52258 52259
- 5235 : 5232 5233 5234 5235 523x
- 5249 : 5249
- 5250 : 5250
- 5271 : 5270 5271
- 5272 : 5272
- 5275 : 5274 5275
- 5282 : 5280 5281 5282 528x
- 53017 : 53011 53012 53013 53014 53015 53016 53017
- 5307 : 5307
- 5329 : 5327 5328 5329 532x
- 5373 : 5372 5373 537x
- 5407 : 5407
- 5475 : 5470 5471 5472 5473 5474 5475 547x 5480 5481 5482 5483 5484 5485
در صورتی که arch با cpu سازگار باشد، -mcpu=cpu بر -march=arch اولویت دارد. سایر ترکیبهای -mcpu و -march پذیرفته نمیشوند.
هنگامی که مقصد ColdFire با نام cpu انتخاب شود، GCC ماکروی "__mcf_cpu_cpu" را تعریف میکند. همچنین "__mcf_family_family" را نیز تعریف میکند، که در آن مقدار family در جدول بالا مشخص شده است.
- -mtune=tune
- کد را برای
یک
ریزمعماری
خاص در
چارچوب
محدودیتهای
تعیینشده
توسط -march و -mcpu
تنظیم
(بهینهسازی)
میکند.
ریزمعماریهای
M680x0 عبارتند
از: 68000، 68010،
68020، 68030، 68040،
68060 و cpu32.
ریزمعماریهای
ColdFire عبارتند
از: cfv1، cfv2،
cfv3، cfv4 و cfv4e.
همچنین میتوانید از -mtune=68020-40 برای کدهایی استفاده کنید که باید به طور نسبتاً مطلوبی روی مقصدهای 68020، 68030 و 68040 اجرا شوند. گزینهٔ -mtune=68020-60 مشابه است اما مقصدهای 68060 را نیز شامل میشود. این دو گزینه به ترتیب همان تصمیمهای بهینهسازی -m68020-40 و -m68020-60 را برمیگزینند.
هنگام بهینهسازی برای معماری 680x0 با نام arch، کامپایلر GCC ماکروهای "__mcarch" و "__mcarch__" را تعریف میکند. همچنین "mcarch" را نیز تعریف میکند، مگر اینکه گزینهٔ -ansi یا یک گزینهٔ غیر گنو -std استفاده شده باشد. اگر GCC برای محدودهای از معماریها تنظیم شود، مانند آنچه با -mtune=68020-40 یا -mtune=68020-60 انتخاب میشود، ماکروها را برای تمام معماریهای موجود در آن بازه تعریف میکند.
کامپایلر GCC همچنین ماکروی "__muarch__" را هنگام بهینهسازی برای ریزمعماری ColdFire با نام uarch تعریف میکند، که در آن uarch یکی از آرگومانهای ارائهشده در بالا است.
- -m68000
- -mc68000
- تولید
خروجی برای
68000. این حالت
پیشفرض
است زمانی
که
کامپایلر
برای
سیستمهای
مبتنی بر 68000
پیکربندی
شده باشد.
این گزینه
معادل -march=68000
است.
از این گزینه برای میکروکنترلرهای دارای هستهٔ 68000 یا EC000 شامل 68008، 68302، 68306، 68307، 68322، 68328 و 68356 استفاده کنید.
- -m68010
- تولید خروجی برای 68010. این حالت پیشفرض است زمانی که کامپایلر برای سیستمهای مبتنی بر 68010 پیکربندی شده باشد. این گزینه معادل -march=68010 است.
- -m68020
- -mc68020
- تولید خروجی برای 68020. این حالت پیشفرض است زمانی که کامپایلر برای سیستمهای مبتنی بر 68020 پیکربندی شده باشد. این گزینه معادل -march=68020 است.
- -m68030
- تولید خروجی برای 68030. این حالت پیشفرض است هنگامی که کامپایلر برای سیستمهای مبتنی بر 68030 پیکربندی شده باشد. این گزینه معادل -march=68030 است.
- -m68040
- تولید
خروجی برای
68040. این حالت
پیشفرض
است هنگامی
که
کامپایلر
برای
سیستمهای
مبتنی بر 68040
پیکربندی
شده باشد.
این گزینه
معادل -march=68040
است.
این گزینه از بهکارگیری دستورالعملهای 68881/68882 که باید توسط نرمافزار روی 68040 شبیهسازی شوند جلوگیری میکند. اگر 68040 شما کدی برای شبیهسازی آن دستورالعملها ندارد از این گزینه استفاده کنید.
- -m68060
- تولید
خروجی برای
68060. این حالت
پیشفرض
است هنگامی
که
کامپایلر
برای
سیستمهای
مبتنی بر 68060
پیکربندی
شده باشد.
این گزینه
معادل -march=68060
است.
این گزینه از بهکارگیری دستورالعملهای 68020 و 68881/68882 که باید توسط نرمافزار روی 68060 شبیهسازی شوند جلوگیری میکند. اگر 68060 شما کدی برای شبیهسازی آن دستورالعملها ندارد از این گزینه استفاده کنید.
- -m68302
- تولید کد برای 68302.
- -m68332
- تولید کد برای 68332.
- -m68851
- پردازندهٔ 68851 یک MMU خارجی برای پردازندهٔ 68020 بود. کامپایلر GCC این گزینه را میپذیرد، اما از آن استفاده نمیکند.
- -mcpu32
- تولید
خروجی برای
CPU32. این حالت
پیشفرض
است زمانی
که
کامپایلر
برای
سیستمهای
مبتنی بر CPU32
پیکربندی
شده باشد.
این گزینه
معادل -march=cpu32
است.
از این گزینه برای میکروکنترلرهای دارای هستهٔ CPU32 یا CPU32+ شامل 68330، 68331، 68332، 68333، 68334، 68336، 68340، 68341، 68349 و 68360 استفاده کنید.
- -mfidoa
- تولید کد برای Fido A.
- -m5200
- تولید
خروجی برای
پردازندهٔ
ColdFire 520X. این حالت
پیشفرض
است زمانی
که
کامپایلر
برای
سیستمهای
مبتنی بر 520X
پیکربندی
شده باشد.
این گزینه
معادل -mcpu=5206
است، و
اکنون به
نفع آن
گزینه
منسوخ شده
است.
از این گزینه برای میکروکنترلرهای با هستهٔ 5200، شامل MCF5202، MCF5203، MCF5204 و MCF5206 استفاده کنید.
- -m5206e
- تولید خروجی برای پردازندهٔ ColdFire 5206e. این گزینه اکنون به نفع گزینهٔ معادل -mcpu=5206e منسوخ شده است.
- -m528x
- تولید خروجی برای یکی از اعضای خانوادهٔ ColdFire 528X. این گزینه اکنون به نفع گزینهٔ معادل -mcpu=528x منسوخ شده است.
- -m5307
- تولید خروجی برای پردازندهٔ ColdFire 5307. این گزینه اکنون به نفع گزینهٔ معادل -mcpu=5307 منسوخ شده است.
- -m5407
- تولید خروجی برای پردازندهٔ ColdFire 5407. این گزینه اکنون به نفع گزینهٔ معادل -mcpu=5407 منسوخ شده است.
- -mcfv4e
- تولید
خروجی برای
پردازندهای
از
خانوادهٔ ColdFire
V4e (مانند 547x/548x).
این شامل
استفاده از
دستورالعملهای
سختافزاری
ممیز شناور
میشود. این
گزینه
معادل -mcpu=547x
است، و
اکنون به
نفع آن
گزینه
منسوخ شده
است..IP -m68020-40 4
تولید
خروجی برای
68040، بدون
استفاده از
هیچیک از
دستورالعملهای
جدید. این
کار منجر به
تولید کدی
میشود که
میتواند
با کارایی
نسبتاً
مناسبی روی
68020/68881 یا 68030 یا 68040
اجرا شود.
کد
تولیدشده
از
دستورالعملهای
68881 که روی 68040
شبیهسازی
میشوند
استفاده
میکند.
این گزینه معادل -march=68020 -mtune=68020-40 است.
- -m68020-60
- تولید
خروجی برای
68060، بدون
استفاده از
هیچیک از
دستورالعملهای
جدید. این
کار منجر به
تولید کدی
میشود که
میتواند
با کارایی
نسبتاً
مناسبی روی
68020/68881 یا 68030 یا 68040
اجرا شود.
کد
تولیدشده
از
دستورالعملهای
68881 که روی 68060
شبیهسازی
میشوند
استفاده
میکند.
این گزینه معادل -march=68020 -mtune=68020-60 است.
- -mhard-float
- -m68881
- تولید دستورالعملهای ممیز شناور (floating-point). این مقدار پیشفرض برای 68020 و بالاتر و همچنین دستگاههای ColdFire دارای FPU است. این گزینه ماکروی "__HAVE_68881__" را روی اهداف M680x0 و "__mcffpu__" را روی اهداف ColdFire تعریف میکند.
- -msoft-float
- دستورالعملهای ممیز شناور را تولید نکن؛ بهجای آن از فراخوانیهای کتابخانهای استفاده کن. این مقدار پیشفرض برای اهداف 68000، 68010 و 68832 است. همچنین مقدار پیشفرض برای دستگاههای ColdFire فاقد FPU میباشد.
- -mdiv
- -mno-div
- دستورالعملهای
سختافزاری
تقسیم و
باقیماندهٔ
ColdFire را تولید
بکن (یا نکن).
اگر -march بدون
-mcpu استفاده
شود، مقدار
پیشفرض
برای
معماریهای
ColdFire برابر «on»
(فعال) و
برای
معماریهای
M680x0 برابر «off»
(غیرفعال)
است. در غیر
این صورت،
مقدار
پیشفرض از
پردازندهٔ
مقصد گرفته
میشود
(خواه
پردازندهٔ
پیشفرض،
یا
پردازندهای
که با -mcpu
مشخص شده
است). برای
مثال،
مقدار
پیشفرض
برای -mcpu=5206
برابر «off» و
برای -mcpu=5206e
برابر «on»
است.
هنگامی که این گزینه فعال باشد، GCC ماکروی "__mcfhwdiv__" را تعریف میکند.
- -mshort
- -mno-short
- -mnoshort
- نوع "int" را همانند "short int" بهاندازهٔ ۱۶ بیت در نظر بگیر. علاوه بر این، پارامترهای ارسالشده روی پشته نیز حتی در اهدافی که API آنها ارتقا به ۳۲ بیت را الزامی میکند، روی مرز ۱۶ بیتی همتراز میشوند. این گزینه بهطور پیشفرض غیرفعال است.
- -mbitfield
- -mno-bitfield
- -mnobitfield
- استفاده از دستورالعملهای میدان بیتی (bit-field) را کنترل کن. گزینههای -m68000، -mcpu32 و -m5200 مستلزم -mnobitfield هستند؛ گزینهٔ -m68020 مستلزم -mbitfield است.
- -mrtd
- -mno-rtd
- -mnortd
- استفاده از
یک قرارداد
فراخوانی
تابع (function-calling convention)
متفاوت را
کنترل
میکند که
در آن
توابعی با
تعداد
ثابتی از
آرگومانها
با
دستورالعمل
"rtd"
بازمیگردند؛
دستوری که
هنگام
بازگشت،
آرگومانهای
آنها را از
پشته
برمیدارد
(pop میکند).
این امر
باعث
صرفهجویی
در یک
دستورالعمل
در تابع
فراخواننده
میشود
زیرا نیازی
به برداشتن
آرگومانها
از پشته در
آنجا نیست.
این قرارداد فراخوانی با قراردادی که معمولاً در Unix استفاده میشود ناسازگار است، بنابراین اگر نیاز به فراخوانی کتابخانههای کامپایلشده با کامپایلر Unix دارید، نمیتوانید از آن استفاده کنید.
همچنین، باید اعلانهای پیشالگو (prototype) را برای تمام توابعی که تعداد متغیری از آرگومانها دریافت میکنند (از جمله "printf") فراهم کنید؛ در غیر این صورت برای فراخوانی آن توابع کدی نادرست تولید میشود.
علاوه بر این، اگر تابعی را با تعداد بیش از حد آرگومان فراخوانی کنید، کد بهشدت نادرستی حاصل میشود. (بهطور معمول، آرگومانهای اضافی بدون هیچ آسیبی نادیده گرفته میشوند.)
دستورالعمل "rtd" توسط پردازندههای 68010، 68020، 68030، 68040، 68060 و CPU32 پشتیبانی میشود، اما توسط 68000 یا 5200 پشتیبانی نمیشود.
مقدار پیشفرض -mno-rtd است.
- -malign-int
- -mno-align-int
- کنترل
میکند که
آیا GCC
متغیرهای
"int"،
"long"،
"long long"،
"float"،
"double" و
"long double" را
روی مرز ۳۲
بیتی
همتراز
کند (-malign-int) یا
مرز ۱۶ بیتی
(-mno-align-int).
همتراز
کردن
متغیرها
روی مرزهای
۳۲ بیتی کدی
تولید
میکند که
روی
پردازندههای
دارای
گذرگاههای
۳۲ بیتی تا
حدی
سریعتر
اجرا
میشود،
البته به
بهای مصرف
حافظهٔ
بیشتر.
هشدار: اگر از گزینهٔ -malign-int استفاده کنید، GCC ساختارهای حاوی انواع فوق را متفاوت از اغلب مشخصات منتشرشدهٔ رابط دودویی برنامه کاربردی (ABI) برای m68k همتراز میکند.
استفاده مستقیم از حالت آدرسدهی وابسته به pc (pc-relative) پردازندهٔ 68000، بهجای استفاده از جدول آفست سراسری (GOT). در حال حاضر، این گزینه مستلزم -fpic است که حداکثر یک آفست ۱۶ بیتی را برای آدرسدهی وابسته به pc مجاز میداند. در حال حاضر -fPIC به همراه -mpcrel پشتیبانی نمیشود، هرچند که این قابلیت میتواند برای پردازندههای 68020 و بالاتر پشتیبانی شود.
- -mno-strict-align
- -mstrict-align
- فرض نکن (فرض کن) که ارجاعات حافظهٔ غیرهمتراز توسط سیستم مدیریت میشوند.
- -msep-data
- -mno-sep-data
- با -msep-data، کدی
تولید
میکند که
اجازه
میدهد بخش
داده (data segment) در
ناحیهای
متفاوت از
حافظه نسبت
به بخش متن (text
segment) قرار
گیرد. این
کار امکان
اجرا درجا
(execute-in-place) را در
محیطهای
فاقد
مدیریت
حافظهٔ
مجازی
فراهم
میسازد.
این گزینه
مستلزم -fPIC
است.
این گزینه بهطور پیشفرض غیرفعال است؛ GCC کدی تولید میکند که فرض میکند بخش داده بلافاصله پس از بخش متن قرار دارد.
- -mid-shared-library
- -mno-id-shared-library
- در صورت
فعال بودن،
کدی تولید
میکند که
از
کتابخانههای
مشترک از
طریق روش
شناسهٔ
کتابخانه (library
ID) پشتیبانی
میکند. این
کار امکان
اجرا درجا و
کتابخانههای
مشترک را در
محیطهای
بدون
مدیریت
حافظهٔ
مجازی
فراهم
میآورد.
این گزینه
مستلزم -fPIC
است.
این گزینه بهطور پیشفرض غیرفعال است.
- شمارهٔ شناسایی کتابخانهٔ مشترک مبتنی بر شناسه را که در حال کامپایل است مشخص میکند. تعیین مقدار 0 کدی فشردهتر تولید میکند؛ تعیین مقادیر دیگر تخصیص آن شماره به کتابخانهٔ فعلی را اجباری میکند، اما از نظر فضا یا زمان کارآمدتر از حذف این گزینه نیست.
- -mxgot
- -mno-xgot
- هنگام
تولید کد
مستقل از
موقعیت (position-independent
code) برای ColdFire،
کدی تولید
میکند که
حتی اگر GOT
بیش از ۸۱۹۲
مدخل داشته
باشد کار
کند. این کد
بزرگتر و
کندتر از
کدی است که
بدون این
گزینه
تولید
میشود. در
پردازندههای
M680x0، این
گزینه لازم
نیست؛ -fPIC
کافی است.
بهطور معمول GCC برای بارگذاری مقادیر از GOT از یک دستورالعمل واحد استفاده میکند. اگرچه این روش نسبتاً کارآمد است، اما تنها زمانی کار میکند که اندازهٔ GOT کمتر از حدود 64k باشد. هر اندازهٔ بزرگتری باعث میشود پیونددهنده خطایی مانند زیر گزارش کند:
relocation truncated to fit: R_68K_GOT16O foobar
اگر چنین اتفاقی افتاد، باید کد خود را با -mxgot دوباره کامپایل کنید. در این صورت باید با GOTهای بسیار بزرگ کار کند. با این حال، کد تولیدشده با -mxgot کارایی کمتری دارد، زیرا برای واکشی مقدار یک نماد سراسری ۴ دستورالعمل زمان میبرد.
توجه داشته باشید که برخی پیونددهندهها، از جمله نسخههای جدیدتر پیونددهندهٔ GNU، میتوانند چندین GOT ایجاد کرده و مدخلهای GOT را مرتب کنند. اگر از چنین پیونددهندهای استفاده میکنید، تنها در صورتی نیاز به استفاده از -mxgot خواهید داشت که یک فایل شیء (object file) منفرد را کامپایل کنید که به بیش از ۸۱۹۲ مدخل GOT دسترسی داشته باشد. موارد بسیار کمی اینگونه هستند.
این گزینهها هیچ اثری ندارند مگر اینکه GCC در حال تولید کد مستقل از موقعیت باشد..IP -mxtls 4 پشتیبانی از قطعه TLS بزرگتر از 64K. ملاحظات مربوط به استفاده از این گزینه مشابه موارد -mxgot در بالا است؛ آدرسدهی پیشفرض با آفست ۱۶-بیتی برای TLS کارآمدتر است، اما ممکن است برای برخی برنامهها ناکافی باشد.
- -mlong-jump-table-offsets
- استفاده از آفستهای ۳۲-بیتی در جدولهای "switch". پیشفرض استفاده از آفستهای ۱۶-بیتی است.
گزینههای MCore
اینها گزینههای -m تعریفشده برای پردازندههای Motorola M*Core هستند.
- -mhardlit
- -mno-hardlit
- جایگذاری مستقیم مقادیر ثابت درون جریان کد در صورتی که در دو دستورالعمل یا کمتر امکانپذیر باشد.
- -mdiv
- -mno-div
- استفاده از دستورالعمل تقسیم. (بهطور پیشفرض فعال است).
- -mrelax-immediates
- -mno-relax-immediates
- اجازه دادن به مقادیر بیواسطه با اندازه دلخواه در عملیات بیتی.
- -mwide-bitfields
- -mno-wide-bitfields
- در نظر گرفتن همیشگی فیلدهای بیتی به اندازه "int".
- -m4byte-functions
- -mno-4byte-functions
- اجبار تمام توابع به تراز شدن روی مرز ۴-بایتی.
- -mcallgraph-data
- -mno-callgraph-data
- تولید اطلاعات گراف فراخوانی (callgraph).
- -mslow-bytes
- -mno-slow-bytes
- ترجیح دسترسی کلمهای هنگام خواندن مقادیر بایتی.
- -mlittle-endian
- -mbig-endian
- تولید کد به ترتیب برای مقاصد little-endian یا big-endian. پیشفرض big-endian است. کد little-endian فقط با -m340 پشتیبانی میشود.
- -m210
- تولید کد برای پردازنده 210.
- -m340
- تولید کد برای پردازنده 340.
- -mno-lsim
- فرض بر این که پشتیبانی زمان اجرا از پیش فراهم شده است و در نتیجه کتابخانه شبیهساز (libsim.a) از خط فرمان پیونددهنده حذف میشود.
- -mstack-increment=size
- تنظیم بیشینه مقدار برای یک عملیات منفرد افزایش پشته. مقادیر بزرگ میتوانند سرعت برنامههایی را که شامل توابعی با نیاز به فضای پشته زیاد هستند افزایش دهند، اما اگر پشته بیش از حد گسترش یابد، میتوانند باعث بروز خطای بخشبندی (segmentation fault) نیز بشوند. مقدار پیشفرض 0x1000 است.
گزینههای MicroBlaze
- -msoft-float
- استفاده از شبیهسازی نرمافزاری برای ممیز شناور (پیشفرض).
- -mhard-float
- استفاده از دستورالعملهای سختافزاری ممیز شناور.
- -mmemcpy
- عدم بهینهسازی انتقالهای بلوکی؛ استفاده از "memcpy".
- -mcpu=cpu-type
- استفاده از ویژگیها و زمانبندی کد برای CPU مشخصشده. مقادیر پشتیبانیشده در قالب vX.YY.Z هستند، که در آن X نسخه اصلی، YY نسخه فرعی، و Z کد سازگاری است. مقادیر نمونه عبارتند از v3.00.a، v4.00.b، v5.00.a، v5.00.b، v6.00.a.
- -mxl-soft-mul
- -mno-xl-soft-mul
- استفاده از شبیهسازی نرمافزاری ضرب. این گزینه بهطور پیشفرض فعال است.
- -mxl-soft-div
- -mno-xl-soft-div
- استفاده از شبیهسازی نرمافزاری برای تقسیم. این گزینه بهطور پیشفرض فعال است.
- -mxl-barrel-shift
- استفاده از شیفتدهنده بشکهای سختافزاری.
- -mxl-pattern-compare
- استفاده از دستورالعملهای مقایسه الگو.
- -msmall-divides
- استفاده از بهینهسازی جدول جستجو برای تقسیم اعداد صحیح علامتدار کوچک.
- -mxl-gp-opt
- استفاده از بخشهای ".sdata"/".sbss" با آدرسدهی نسبی به GP.
- -mxl-multiply-high
- استفاده از دستورالعملهای ضرب بالا برای بخش بالایی حاصلضرب 32x32.
- -mxl-float-convert
- استفاده از دستورالعملهای سختافزاری تبدیل ممیز شناور.
- -mxl-float-sqrt
- استفاده از دستورالعمل سختافزاری جذر ممیز شناور.
- -mbig-endian
- تولید کد برای مقصد big-endian.
- -mlittle-endian
- تولید کد برای مقصد little-endian.
- -mxl-reorder
- استفاده از دستورالعملهای بازآرایی (دستورهای swap و بارگذاری/ذخیرهسازی با بایتهای معکوس).
- -mxl-mode-app-model
- انتخاب مدل برنامه app-model. مدلهای معتبر عبارتند از:
- executable
- برنامه اجرایی عادی (پیشفرض)، از کد راهاندازی crt0.o استفاده میکند.
- xmdstub
- جهت استفاده همراه با عامل دیباگ نفوذی مبتنی بر Xilinx Microprocessor Debugger (XMD) به نام xmdstub. این مدل از فایل راهاندازی crt1.o استفاده میکند و نشانی آغازین برنامه را روی 0x800 تنظیم مینماید.
- bootstrap
- برای برنامههایی که با استفاده از یک بارگذار بوت بارگذاری میشوند. این مدل از فایل راهاندازی crt2.o استفاده میکند که فاقد گرداننده بردار بازنشانی پردازنده است. این حالت برای انتقال کنترل در هنگام بازنشانی پردازنده به بارگذار بوت به جای برنامه مناسب است.
- novectors
- برای برنامههایی که به هیچیک از بردارهای MicroBlaze نیازی ندارند. این گزینه ممکن است برای برنامههایی که درون یک برنامه پایشگر اجرا میشوند مفید باشد. این مدل از crt3.o به عنوان فایل راهاندازی استفاده میکند.
- -mpic-data-is-text-relative
- فرض میکند که جابهجایی میان بخشهای text و data در زمان پیوند ایستا (static link time) ثابت است. این قابلیت اجازه میدهد که دادهها بهجای GOT، از طریق آفست نسبت به ابتدای آدرس text ارجاع داده شوند، زیرا آدرسدهی وابسته به PC پشتیبانی نمیشود.
گزینههای MIPS (MIPS Options)
- -EB
- -meb
- تولید کد بزرگپایان (big-endian).
- -EL
- -mel
- تولید کد کوچکپایان (little-endian). این گزینه پیشفرض برای پیکربندیهای mips*el-*-* است.
- -march=arch
- تولید کد
قابل اجرا
روی arch، که
میتواند
نام یک ISA
عمومی MIPS یا
نام یک
پردازندهٔ
خاص باشد.
نامهای ISA
عبارتند از:
mips1، mips2، mips3،
mips4، mips32، mips32r2،
mips32r3، mips32r5، mips32r6،
mips64، mips64r2، mips64r3،
mips64r5 و mips64r6.
نامهای
پردازنده
عبارتند از:
4kc، 4km، 4kp،
4ksc، 4kec، 4kem،
4kep، 4ksd، 5kc،
5kf، 20kc، 24kc،
24kf2_1، 24kf1_1، 24kec،
24kef2_1، 24kef1_1، 34kc،
34kf2_1، 34kf1_1، 34kn،
74kc، 74kf2_1، 74kf1_1،
74kf3_2، 1004kc، 1004kf2_1،
1004kf1_1، i6400، i6500،
interaptiv، loongson2e،
loongson2f، loongson3a، gs464،
gs464e، gs264e، m4k،
m14k، m14kc، m14ke،
m14kec، m5100، m5101،
octeon، octeon+، octeon2،
octeon3، orion، p5600،
p6600، r2000، r3000،
r3900، r4000، r4400،
r4600، r4650، r4700،
r5900، r6000، r8000،
rm7000، rm9000، r10000،
r12000، r14000، r16000،
sb1، sr71000، vr4100،
vr4111، vr4120، vr4130،
vr4300، vr5000، vr5400،
vr5500، xlr و xlp.
allegrex، مقدار
ویژهٔ from-abi
سازگارترین
معماری را
برای ABI
انتخابشده
برمیگزیند
(یعنی mips1
برای ABIهای
۳۲ بیتی و mips3
برای ABIهای
۶۴ بیتی).
زنجیره ابزار بومی Linux/GNU نیز از مقدار native پشتیبانی میکند، که بهترین گزینهٔ معماری را برای پردازندهٔ میزبان انتخاب مینماید. اگر GCC پردازنده را شناسایی نکند، -march=native هیچ تأثیری نخواهد داشت.
در نامهای پردازندهها، پسوند پایانی 000 میتواند به صورت k خلاصه شود (برای مثال، -march=r2k). پیشوندها اختیاری هستند و vr ممکن است بهصورت r نوشته شود.
نامهایی با قالب nf2_1 به پردازندههایی اشاره دارند که کلاک FPU آنها با نصف نرخ کلاک هسته کار میکند، نامهایی با قالب nf1_1 به پردازندههایی با FPUهایی اشاره دارند که سرعت کلاک یکسانی با هسته دارند، و نامهایی با قالب nf3_2 به پردازندههایی اشاره دارند که نسبت کلاک FPU آنها ۳:۲ نسبت به هسته است. به دلایل سازگاری، nf به عنوان مترادفی برای nf2_1 پذیرفته شده است، در حالی که nx و bfx به عنوان مترادفهایی برای nf1_1 پذیرفته میشوند.
کامپایلر GCC بر پایهٔ مقدار این گزینه، دو ماکرو تعریف میکند. ماکروی نخست "_MIPS_ARCH" است که نام معماری هدف را بهصورت یک رشته مشخص میکند. ماکروی دوم ساختار "_MIPS_ARCH_foo" دارد که در آن foo مقدار بزرگنویسیشدهٔ "_MIPS_ARCH" است. برای مثال، -march=r2000 مقدار "_MIPS_ARCH" را برابر با "r2000" قرار داده و ماکروی "_MIPS_ARCH_R2000" را تعریف میکند.
توجه داشته باشید که ماکروی "_MIPS_ARCH" از نامهای پردازنده که در بالا ذکر شد استفاده میکند. به بیانی دیگر، پیشوند کامل را حفظ کرده و 000 را به k خلاصه نمیکند. در مورد from-abi، این ماکرو نام معماری تعیینشده (یا "mips1" یا "mips3") را برمیگرداند. در صورت مشخص نشدن هیچ گزینهٔ -march، این ماکرو نام معماری پیشفرض را تعیین میکند.
- -mtune=arch
- بهینهسازی
برای arch. این
گزینه از
جمله،
شیوهٔ
زمانبندی
دستورالعملها
و هزینهٔ
تخمینی
عملیات
محاسباتی
را کنترل
میکند.
فهرست
مقادیر arch
همانند
مقادیر -march
است.
هنگامی که از این گزینه استفاده نشود، GCC برای پردازندهای که با -march مشخص شده است بهینهسازی میکند. با استفادهٔ همزمان از -march و -mtune، میتوان کدی تولید کرد که روی یک خانواده از پردازندهها اجرا شود، اما بهینهسازی کد برای یکی از اعضای خاص آن خانواده انجام پذیرد.
گزینهٔ -mtune ماکروهای "_MIPS_TUNE" و "_MIPS_TUNE_foo" را تعریف میکند، که مشابه ماکروهای -march شرحدادهشده در بالا عمل میکنند.
- -mips1
- معادل با -march=mips1.
- -mips2
- معادل با -march=mips2.
- -mips3
- معادل با -march=mips3.
- -mips4
- معادل با -march=mips4.
- -mips32
- معادل با -march=mips32.
- -mips32r3
- معادل با -march=mips32r3.
- -mips32r5
- معادل با -march=mips32r5.
- -mips32r6
- معادل با -march=mips32r6.
- -mips64
- معادل با -march=mips64.
- -mips64r2
- معادل با -march=mips64r2.
- -mips64r3
- معادل با -march=mips64r3.
- -mips64r5
- معادل با -march=mips64r5.
- -mips64r6
- معادل با -march=mips64r6.
- -mips16
- -mno-mips16
- تولید (عدم
تولید) کد MIPS16.
اگر هدف GCC یک
معماری MIPS32 یا
MIPS64 باشد، از MIPS16e
ASE بهره
میبرد.
تولید کد MIPS16 همچنین میتواند بر پایهٔ هر تابع از طریق مشخصههای "mips16" و "nomips16" کنترل شود.
- -mmips16e2
- -mno-mips16e2
- استفاده از (عدم استفاده از) MIPS16e2 ASE. این گزینه رفتار گزینهٔ -mips16 را تغییر میدهد به گونهای که MIPS16e2 ASE را هدف قرار دهد.
- -mflip-mips16
- -mflip-mips16
- تولید کد MIPS16 روی توابع بهصورت متناوب (یکدرمیان). این گزینه برای آزمون رگرسیونِ تولید کد ترکیبی MIPS16/غیر-MIPS16 ارائه شده است و برای استفادهٔ معمول در کامپایل کد کاربر در نظر گرفته نشده است.
- -minterlink-compressed
- -mno-interlink-compressed
- الزام (عدم
الزام) به
این که کدی
که از ISA
استاندارد
MIPS
(فشردهنشده)
استفاده
میکند، از
نظر پیوند
با کد MIPS16 و microMIPS
سازگار
باشد و
برعکس.
برای نمونه، کدی که از کدگذاری استاندارد ISA استفاده میکند نمیتواند مستقیماً به کد MIPS16 یا microMIPS پرش کند؛ بلکه باید از یک فراخوانی یا یک پرش غیرمستقیم استفاده نماید. بنابراین -minterlink-compressed پرشهای مستقیم را غیرفعال میکند مگر آنکه GCC بداند مقصد پرش فشرده نیست.
- -minterlink-mips16
- -mno-interlink-mips16
- نامهای مستعار -minterlink-compressed و -mno-interlink-compressed. این گزینهها پیش از microMIPS ASE به وجود آمدهاند و برای سازگاری با نسخههای پیشین نگهداشته شدهاند.
- -mabi=32
- -mabi=o64
- -mabi=n32
- -mabi=64
- -mabi=eabi
- تولید کد
برای ABI
مشخصشده.
توجه داشته باشید که EABI دارای یک نوع ۳۲ بیتی و یک نوع ۶۴ بیتی است. بهطور معمول هنگامی که یک معماری ۶۴ بیتی را انتخاب میکنید GCC کد ۶۴ بیتی تولید میکند، اما میتوانید از -mgp32 برای دریافت کد ۳۲ بیتی به جای آن استفاده کنید.
برای اطلاعات بیشتر دربارهٔ O64 ABI، به https://gcc.gnu.org/projects/mipso64-abi.html مراجعه کنید.
کامپایلر GCC از نوعی از o32 ABI پشتیبانی میکند که در آن ثباتهای ممیز شناور به جای ۳۲ بیت، دارای پهنای ۶۴ بیت هستند. میتوانید این ترکیب را با -mabi=32 -mfp64 انتخاب کنید. این ABI به دستورالعملهای "mthc1" و "mfhc1" متکی است و بنابراین تنها در پردازندههای MIPS32R2، MIPS32R3 و MIPS32R5 پشتیبانی میشود.
تخصیص ثباتها برای آرگومانها و مقادیر بازگشتی یکسان باقی میماند، اما هر مقدار اسکالر به جای یک جفت ثبات ۳۲ بیتی، در یک ثبات ۶۴ بیتی تکی ارسال میشود. برای مثال، مقادیر ممیز شناور اسکالر فقط در $f0 بازگردانده میشوند، نه در یک جفت $f0/$f1. مجموعهٔ ثباتهای ذخیرهشده هنگام فراخوانی (call-saved) نیز از این حیث بدون تغییر باقی میماند که ثباتهای با دقت مضاعفِ شمارهزوج ذخیره میشوند.
دو نوع دیگر از o32 ABI برای امکانپذیر ساختن انتقال از ثباتهای ۳۲ بیتی به ۶۴ بیتی پشتیبانی میشوند. این دو، FPXX (-mfpxx) و FP64A (-mfp64 -mno-odd-spreg) هستند. افزونهٔ FPXX الزام میکند که تمام کدها باید هنگام اجرا با استفاده از ثباتهای ۳۲ بیتی یا ۶۴ بیتی بهدرستی کار کنند. این کد میتواند با FP32 یا FP64 پیوند متقابل بخورد، اما نه با هر دو. افزونهٔ FP64A مشابه افزونهٔ FP64 است اما استفاده از ثباتهای دقت یگانه با شمارههای فرد را منع میکند. این گزینه میتواند در کنار حالت "FRE" پردازندههای کمکی شناور (FPU) در پردازندههای MIPS32R5 استفاده شود و به هر دو کد FP32 و FP64A امکان میدهد بدون تغییر حالتهای FPU، در یک فرایند پیوند خورده و اجرا شوند.
- -mabicalls
- -mno-abicalls
- تولید (عدم تولید) کدی که برای شیءهای پویای سبک SVR4 مناسب است. گزینهٔ -mabicalls برای سیستمهای مبتنی بر SVR4 پیشفرض است.
- -mno-shared
- تولید (عدم
تولید) کدی
که کاملاً
مستقل از
موقعیت است
و بنابراین
میتواند
به
کتابخانههای
مشترک
پیوند داده
شود. این
گزینه فقط
بر -mabicalls
تأثیر
میگذارد.
تمامی کدهای -mabicalls از قدیم بدون در نظر گرفتن گزینههایی مانند -fPIC و -fpic، مستقل از موقعیت بودهاند. با این حال، زنجیرهابزار GNU بهعنوان یک افزونه به فایلهای اجرایی اجازه میدهد تا برای نمادهایی با پیوند محلی از دسترسیهای مطلق استفاده کنند. همچنین میتواند از توالیهای کوتاهتر راهاندازی اولیهٔ GP استفاده کند و فراخوانیهای مستقیم برای توابعِ تعریفشدهٔ محلی بسازد. این حالت با -mno-shared انتخاب میشود.
گزینهٔ -mno-shared به binutils نسخهٔ 2.16 یا بالاتر وابسته است و شیءهایی تولید میکند که فقط توسط پیونددهندهٔ GNU میتوانند پیوند داده شوند. با این حال، این گزینه بر ABI فایل اجرایی نهایی تأثیری ندارد؛ بلکه تنها بر ABI شیءهای با قابلیت بازنشانی (relocatable) اثر میگذارد. استفاده از -mno-shared عموماً فایلهای اجرایی را هم کوچکتر و هم سریعتر میکند.
گزینهٔ -mshared پیشفرض است.
- -mplt
- -mno-plt
- فرض کردن
(فرض نکردن)
اینکه
پیونددهندههای
ایستا و
پویا از PLTها
و
بازنشانیهای
کپی (copy relocations)
پشتیبانی
میکنند.
این گزینه
فقط بر -mno-shared -mabicalls
اثر
میگذارد.
برای n64 ABI، این
گزینه بدون
-msym32 اثری
ندارد.
میتوانید با پیکربندی GCC با --with-mips-plt، گزینهٔ -mplt را پیشفرض کنید. در غیر این صورت، پیشفرض -mno-plt است.
- -mxgot
- -mno-xgot
- برداشتن
(برنداشتن)
محدودیتهای
معمول روی
اندازهٔ
جدول افست
سراسری (GOT).
بهطور معمول GCC برای بارگذاری مقادیر از GOT از یک دستورالعمل واحد استفاده میکند. اگرچه این کار نسبتاً کارآمد است، تنها در صورتی کار میکند که GOT کوچکتر از حدود 64k باشد. هر مقداری بزرگتر باعث میشود پیونددهنده خطایی مانند زیر را گزارش دهد:
relocation truncated to fit: R_MIPS_GOT16 foobar
در صورت بروز چنین خطایی، باید کد خود را با -mxgot دوباره کامپایل کنید. این روش با GOTهای بسیار بزرگ کار میکند، اگرچه کد کارایی کمتری خواهد داشت، چرا که واکشی مقدار یک نماد سراسری نیازمند سه دستورالعمل خواهد بود.
توجه داشته باشید که برخی پیونددهندهها میتوانند چندین GOT ایجاد کنند. اگر از چنین پیونددهندهای استفاده میکنید، تنها زمانی به -mxgot نیاز خواهید داشت که یک فایل شیء واحد به بیش از مدخلهای معادل 64k از GOT دسترسی پیدا کند. فایلهای شیء بسیار اندکی چنین رفتاری دارند.
این گزینهها هیچ اثری ندارند مگر اینکه GCC در حال تولید کد مستقل از موقعیت باشد.
- -mgp32
- فرض میکند که ثباتهای عمومی ۳۲ بیتی هستند.
- -mgp64
- فرض میکند که ثباتهای عمومی ۶۴ بیتی هستند.
- -mfp32
- فرض میکند که ثباتهای ممیز شناور ۳۲ بیتی هستند.
- -mfp64
- فرض میکند که ثباتهای ممیز شناور ۶۴ بیتی هستند.
- -mfpxx
- هیچ فرضی دربارهٔ پهنای ثباتهای ممیز شناور در نظر نمیگیرد.
- -mhard-float
- استفاده از دستورالعملهای پردازندهٔ کمکی ممیز شناور.
- -msoft-float
- عدم استفاده از دستورالعملهای پردازندهٔ کمکی ممیز شناور. در عوض، محاسبات ممیز شناور را با استفاده از فراخوانی توابع کتابخانهای انجام میدهد.
- -mno-float
- معادل -msoft-float است، اما علاوه بر آن تصریح میکند که برنامهٔ در حال کامپایل هیچ عملیات ممیز شناوری انجام نمیدهد. این گزینه در حال حاضر تنها توسط برخی پیکربندیهای MIPS بر روی سختافزار خام (bare-metal) پشتیبانی میشود؛ جایی که ممکن است مجموعهٔ خاصی از کتابخانهها را انتخاب کند که فاقد هرگونه پشتیبانی از ممیز شناور هستند (از جمله، برای مثال، قالبهای ممیز شناور در "printf"). اگر کدی که با -mno-float کامپایل شده است تصادفاً شامل عملیات ممیز شناور باشد، احتمالاً با خطا در زمان پیوند یا زمان اجرا مواجه خواهد شد..IP -msingle-float 4 فرض کردن اینکه کمکپردازندهٔ ممیز شناور تنها از عملیات با دقتتکی پشتیبانی میکند.
- -mdouble-float
- فرض کردن اینکه کمکپردازندهٔ ممیز شناور از عملیات با دقتمضاعف پشتیبانی میکند. این مقدار پیشفرض است.
- -modd-spreg
- -mno-odd-spreg
- فعالسازی استفاده از ثباتهای ممیز شناور دقتتکی با شمارهٔ فرد برای o32 ABI. این گزینه پیشفرض برای پردازندههایی است که پشتیبانی آنها از این ثباتها مشخص است. هنگام استفاده از o32 FPXX ABI، گزینهٔ -mno-odd-spreg بهطور پیشفرض تنظیم میشود.
- -mabs=2008
- -mabs=legacy
- این
گزینهها
رفتار با
دادههای
ممیز شناور
ویژهٔ
عددناپذیر
(NaN)
استاندارد
IEEE 754 را توسط
دستورالعملهای
ماشین
"abs.fmt"
و
"neg.fmt"
کنترل
میکنند.
بهطور پیشفرض یا زمانی که -mabs=legacy استفاده میشود، رفتار سنتی (legacy) انتخاب میگردد. در این حالت این دستورالعملها محاسباتی تلقی شده و در جایی که عملکرد صحیح مورد نیاز است و عملوند ورودی ممکن است NaN باشد، از آنها اجتناب میشود. در عوض، دنبالهٔ طولانیتری از دستورالعملها که بیت علامت دادهٔ ممیز شناور را بهصورت دستی دستکاری میکنند استفاده میشود، مگر اینکه گزینهٔ -ffinite-math-only نیز مشخص شده باشد.
گزینهٔ -mabs=2008 رفتار IEEE 754-2008 را انتخاب میکند. در این حالت این دستورالعملها غیرمحاسباتی تلقی میشوند و بنابراین در تمام موارد، بهویژه در حالتی که عملوند ورودی یک NaN باشد، عملکرد درستی دارند. بنابراین این دستورالعملها همواره برای عملیات مربوطه استفاده میشوند.
- -mnan=2008
- -mnan=legacy
- این
گزینهها
کدگذاری
دادههای
ممیز شناور
ویژهٔ
عددناپذیر
(NaN)
استاندارد
IEEE 754 را کنترل
میکنند.
گزینهٔ -mnan=legacy کدگذاری سنتی (legacy) را انتخاب میکند. در این حالت NaNهای آرام (qNaNs) با 0 بودن بیت نخست فیلد کسر پایانی (trailing significand) نشان داده میشوند، در حالی که NaNهای هشداردهنده (sNaNs) با 1 بودن بیت نخست فیلد کسر پایانی نشان داده میشوند.
گزینهٔ -mnan=2008 کدگذاری IEEE 754-2008 را انتخاب میکند. در این حالت qNaNها با 1 بودن بیت نخست فیلد کسر پایانی مشخص میشوند، در حالی که sNaNها با 0 بودن بیت نخست فیلد کسر پایانی مشخص میگردند.
پیشفرض -mnan=legacy است، مگر اینکه GCC با گزینهٔ --with-nan=2008 پیکربندی شده باشد.
- -mllsc
- -mno-llsc
- استفاده
کردن (یا
نکردن) از
دستورالعملهای
ll، sc و sync
برای
پیادهسازی
توابع
توکار
حافظهٔ
اتمی.
هنگامی که
هیچکدام
از این
گزینهها
مشخص نشده
باشد، اگر
معماری
مقصد از
آنها
پشتیبانی
کند، GCC از
این
دستورالعملها
استفاده
میکند.
-mllsc زمانی سودمند است که محیط زمان اجرا بتواند این دستورالعملها را شبیهسازی کند و -mno-llsc هنگام کامپایل برای معماریهای مجموعه دستورالعمل (ISA) غیراستاندارد کاربرد دارد. میتوانید بهترتیب با پیکربندی GCC با --with-llsc و --without-llsc هر یک را به حالت پیشفرض درآورید. گزینهٔ --with-llsc برای برخی پیکربندیها پیشفرض است؛ برای جزئیات به مستندات نصب مراجعه کنید.
- -mdsp
- -mno-dsp
- استفاده کردن (یا نکردن) از ویرایش ۱ افزونهٔ MIPS DSP ASE. این گزینه ماکروی پیشپردازندهٔ "__mips_dsp" را تعریف میکند. همچنین "__mips_dsp_rev" را برابر با 1 تعیین میکند.
- -mdspr2
- -mno-dspr2
- استفاده کردن (یا نکردن) از ویرایش ۲ افزونهٔ MIPS DSP ASE. این گزینه ماکروهای پیشپردازندهٔ "__mips_dsp" و "__mips_dspr2" را تعریف میکند. همچنین "__mips_dsp_rev" را برابر با 2 قرار میدهد.
- -msmartmips
- -mno-smartmips
- استفاده کردن (یا نکردن) از افزونهٔ MIPS SmartMIPS ASE.
- -mpaired-single
- -mno-paired-single
- استفاده کردن (یا نکردن) از دستورالعملهای ممیز شناور جفتشدهتکی (paired-single). این گزینه نیازمند فعال بودن پشتیبانی سختافزاری ممیز شناور است.
- -mdmx
- -mno-mdmx
- استفاده کردن (یا نکردن) از دستورالعملهای افزونهٔ رسانهٔ دیجیتال MIPS (Digital Media Extension). این گزینه تنها هنگام تولید کد ۶۴ بیتی قابل استفاده است و نیازمند فعال بودن پشتیبانی سختافزاری ممیز شناور است.
- -mips3d
- -mno-mips3d
- استفاده کردن (یا نکردن) از افزونهٔ MIPS-3D ASE. گزینهٔ -mips3d مستلزم فعال بودن -mpaired-single است.
- -mmicromips
- -mno-micromips
- تولید کردن
(یا نکردن)
کد microMIPS.
تولید کد microMIPS میتواند بر پایهٔ هر تابع نیز از طریق مشخصههای "micromips" و "nomicromips" کنترل شود.
- -mmt
- -mno-mt
- استفاده کردن (یا نکردن) از دستورالعملهای چندریسمانی (Multithreading) MT.
- -mmcu
- -mno-mcu
- استفاده کردن (یا نکردن) از دستورالعملهای افزونهٔ MIPS MCU ASE.
- -meva
- -mno-eva
- استفاده کردن (یا نکردن) از دستورالعملهای آدرسدهی مجازی بهبودیافتهٔ MIPS (EVA).
- -mvirt
- -mno-virt
- استفاده کردن (یا نکردن) از دستورالعملهای مجازیسازی (VZ) MIPS.
- -mxpa
- -mno-xpa
- استفاده کردن (یا نکردن) از دستورالعملهای آدرس فیزیکی گسترشیافتهٔ MIPS (XPA).
- -mcrc
- استفاده (عدم استفاده) از دستورالعملهای وارسی افزونگی چرخشی (CRC) در MIPS.
- -mginv
- -mno-ginv
- استفاده (عدم استفاده) از دستورالعملهای باطلسازی سراسری (GINV) در MIPS.
- -mmsa
- -mno-msa
- استفاده (عدم استفاده) از دستورالعملهای افزونهٔ MIPS MSA.
- -mloongson-mmi
- -mno-loongson-mmi
- استفاده (عدم استفاده) از دستورالعملهای افزونههای چندرسانهای MIPS Loongson (MMI).
- -mloongson-ext
- -mno-loongson-ext
- استفاده (عدم استفاده) از دستورالعملهای افزونههای MIPS Loongson (EXT).
- -mloongson-ext2
- -mno-loongson-ext2
- استفاده (عدم استفاده) از دستورالعملهای افزونههای نگارش ۲ MIPS Loongson (EXT2).
- -mlong64
- اجبار نوعهای "long" به داشتن پهنای ۶۴ بیتی. برای توضیحات در مورد حالت پیشفرض و چگونگی تعیین اندازهٔ اشارهگر (pointer)، -mlong32 را ببینید.
- -mlong32
- اجبار
نوعهای
"long"،
"int" و
اشارهگر
به داشتن
پهنای ۳۲
بیتی.
اندازهٔ پیشفرض "int"ها، "long"ها و اشارهگرها به ABI بستگی دارد. تمام ABIهای پشتیبانیشده از "int"های ۳۲ بیتی استفاده میکنند. ABI نوع n64 و همچنین EABI ۶۴ بیتی از "long"های ۶۴ بیتی استفاده میکنند؛ سایر موارد از "long"های ۳۲ بیتی استفاده میکنند. اندازهٔ اشارهگرها برابر با اندازهٔ "long"ها یا هماندازه با ثباتهای اعداد صحیح (هرکدام که کوچکتر باشد) است.
- -msym32
- -mno-sym32
- فرض کردن (فرض نکردن) اینکه تمام نمادها بدون توجه به ABI انتخابشده مقادیر ۳۲ بیتی دارند. این گزینه در ترکیب با -mabi=64 و -mno-abicalls مفید است؛ زیرا به GCC اجازه میدهد ارجاعات کوتاهتر و سریعتری به آدرسهای نمادین ایجاد کند.
- -G num
- قرار دادن
تعاریف
دادههای
با دید
خارجی (externally-visible)
در یک بخش
دادهٔ کوچک
(small data section) در
صورتی که
اندازهٔ آن
داده
بزرگتر از
num بایت
نباشد. در
این صورت GCC
میتواند
دسترسیهای
کارآمدتری
به دادهها
تولید کند؛
برای
جزئیات -mgpopt
را ببینید.
مقدار پیشفرض گزینهٔ -G به پیکربندی بستگی دارد.
- -mlocal-sdata
- -mno-local-sdata
- تعمیم دادن
(تعمیم
ندادن)
رفتار -G به
دادههای
محلی نیز،
مانند
متغیرهای static
در زبان C.
گزینهٔ -mlocal-sdata
در تمام
پیکربندیها
حالت
پیشفرض
است.
اگر پیونددهنده (linker) هشدار دهد که برنامه بیش از حد از دادههای کوچک استفاده میکند، میتوانید بازسازی بخشهایی از برنامه را که از نظر کارایی حساسیت کمتری دارند با -mno-local-sdata امتحان کنید. همچنین ممکن است بخواهید کتابخانههای بزرگ را با -mno-local-sdata بسازید تا کتابخانهها فضای بیشتری برای برنامهٔ اصلی باقی بگذارند.
- -mextern-sdata
- -mno-extern-sdata
- فرض کردن
(فرض نکردن)
اینکه
دادههای
تعریفشده
در خارج، در
صورتی که
اندازهٔ
آنها در
محدودهٔ -G
باشد، در یک
بخش دادهٔ
کوچک قرار
دارند.
گزینهٔ -mextern-sdata
در تمام
پیکربندیها
حالت
پیشفرض
است.
اگر پودمانی مانند Mod را با گزینههای -mextern-sdata -G num -mgpopt کامپایل کنید، و Mod به متغیری به نام Var ارجاع دهد که بزرگتر از num بایت نباشد، باید مطمئن شوید که Var در یک بخش دادهٔ کوچک قرار گرفته است. اگر Var توسط پودمان دیگری تعریف شده است، باید یا آن پودمان را با مقدار -G بهاندازهٔ کافی بزرگ کامپایل کنید یا صفت "section" را به تعریف Var پیوست کنید. اگر Var اشتراکی (common) باشد، باید برنامه را با تنظیم -G بهاندازهٔ کافی بزرگ پیوند دهید.
سادهترین راه برای برآورده کردن این محدودیتها، کامپایل و پیوند دادن تمام پودمانها با یک گزینهٔ -G یکسان است. با این حال، ممکن است بخواهید کتابخانهای بسازید که از چندین حد مختلف برای دادههای کوچک پشتیبانی کند. میتوانید این کار را با کامپایل کتابخانه با بالاترین مقدار پشتیبانیشدهٔ -G و علاوهبرآن، استفاده از -mno-extern-sdata برای جلوگیری از ایجاد فرضیات در کتابخانه دربارهٔ دادههای تعریفشده در خارج، انجام دهید.
- -mgpopt
- -mno-gpopt
- استفاده
(عدم
استفاده) از
دسترسیهای
نسبی به GP
برای
نمادهایی
که مشخص است
در بخش
دادهٔ کوچک
قرار
دارند؛
گزینههای
-G، -mlocal-sdata و -mextern-sdata
را ببینید.
گزینهٔ -mgpopt
در تمام
پیکربندیها
حالت
پیشفرض
است.
گزینهٔ -mno-gpopt برای مواردی مفید است که ثبات $gp ممکن است مقدار "_gp" را در خود نگه ندارد. بهعنوان مثال، اگر کد بخشی از یک کتابخانه باشد که ممکن است در یک ناظر راهاندازی (boot monitor) استفاده شود، برنامههایی که روالهای boot monitor را فراخوانی میکنند مقدار نامشخصی را در $gp عبور میدهند. (در چنین شرایطی، خود boot monitor معمولاً با -G0 کامپایل میشود.)
گزینهٔ -mno-gpopt مستلزم -mno-local-sdata و -mno-extern-sdata است.
- -membedded-data
- -mno-embedded-data
- تخصیص متغیرها در وهلهٔ اول به بخش دادههای فقطخواندنی در صورت امکان، سپس در بخش دادههای کوچک در صورت امکان، و در غیر این صورت در بخش داده (data). این کار کدی کمی کُندتر از حالت پیشفرض ایجاد میکند، اما مقدار RAM مورد نیاز در هنگام اجرا را کاهش میدهد و بنابراین ممکن است برای برخی سیستمهای توکار (embedded) ارجح باشد.
- -muninit-const-in-rodata
- -mno-uninit-const-in-rodata
- قرار دادن متغیرهای "const" مقداردهینشده در بخش دادههای فقطخواندنی. این گزینه تنها در ترکیب با -membedded-data معنادار است.
- -mcode-readable=setting
- مشخص میکند که آیا GCC مجاز است کدی تولید کند که از بخشهای قابل اجرا (executable sections) بخواند یا خیر. سه مقدار ممکن وجود دارد:
- -mcode-readable=yes
- دستورالعملها آزادانه میتوانند به بخشهای قابل اجرا دسترسی داشته باشند. این مقدار پیشفرض است.
- -mcode-readable=pcrel
- دستورالعملهای بارگذاری نسبی به PC در MIPS16 میتوانند به بخشهای قابل اجرا دسترسی داشته باشند، اما سایر دستورالعملها نباید این کار را انجام دهند. این گزینه در پردازندههای 4KSc و 4KSd هنگامی که بیت Read Inhibit در TLBهای کد تنظیم شده است مفید است. همچنین در پردازندههایی که میتوان آنها را با رابط دوگانهٔ SRAM دستورالعمل/داده پیکربندی کرد و مانند M4K بارگذاریهای نسبی به PC را بهطور خودکار به RAM دستورالعمل تغییر مسیر میدهند، مفید واقع میشود.
- -mcode-readable=no
- دستورالعملها نباید به بخشهای قابل اجرا دسترسی داشته باشند. این گزینه میتواند روی مقصدهایی مفید باشد که برای داشتن رابط دوگانهٔ SRAM دستورالعمل/داده پیکربندی شدهاند اما (برخلاف M4K) بارگذاریهای نسبی به PC را بهطور خودکار به RAM دستورالعمل هدایت نمیکنند.
در مقصدهای SDE، گزینهٔ -mcode-data-in-code بهعنوان نام مستعار سنتی برای -mcode-readable=no، و گزینهٔ -mcode-xonly برای -mcode-readable=pcrel در دسترس است.
- -msplit-addresses
- -mno-split-addresses
- فعالسازی (غیرفعالسازی) استفاده از عملگرهای بازآرایی (relocation) اسمبلر %hi() و %lo(). این گزینه با -mexplicit-relocs جایگزین شده است، اما برای سازگاری با نسخههای پیشین حفظ میشود.
- -mexplicit-relocs=none
- -mexplicit-relocs=base
- -mexplicit-relocs=pcrel
- -mexplicit-relocs
- -mno-explicit-relocs
- این
گزینهها
استفاده از
بازآراییهای
صریح (مانند
%gp_rel) را
کنترل
میکنند.
مقدار
پیشفرض به
نسخهٔ GAS در
زمان ساخت
خود GCC بستگی
دارد.
پشتیبانی از بازآراییهای صریح "base" در سال ۲۰۰۱ به GAS اضافه شد. پشتیبانی از بازآراییهای صریح "pcrel" در سال ۲۰۱۴ به GAS افزوده شد که از %pcrel_hi و %pcrel_lo پشتیبانی میکند.
- -mcheck-zero-division
- -mno-check-zero-division
- ایجاد تله
(عدم ایجاد
تله) هنگام
تقسیم عدد
صحیح بر
صفر.
پیشفرض -mcheck-zero-division است.
- -mdivide-traps
- -mdivide-breaks
- سیستمهای
MIPS تقسیم بر
صفر را با
تولید یک
تلهٔ شرطی
(conditional trap) یا یک
دستورالعمل
break بررسی
میکنند.
استفاده از
تلهها
منجر به کد
کوچکتر
میشود،
اما فقط روی
MIPS II و
نسخههای
پس از آن
پشتیبانی
میشود.
همچنین،
برخی از
نسخههای
هستهٔ
لینوکس
دارای باگی
هستند که
مانع از
تولید
سیگنال
مناسب
("SIGFPE")
توسط تله
میشود. از
-mdivide-traps برای
مجاز ساختن
تلههای
شرطی روی
معماریهایی
که از آنها
پشتیبانی
میکنند و
از -mdivide-breaks برای
اجبار به
استفاده از
دستورات break
استفاده
کنید.
پیشفرض معمولاً -mdivide-traps است، اما این مقدار را میتوان در زمان پیکربندی (configure time) با استفاده از --with-divide=breaks لغو کرد. بررسیهای تقسیم بر صفر را میتوان با استفاده از -mno-check-zero-division بهطور کامل غیرفعال کرد.
- -mload-store-pairs
- -mno-load-store-pairs
- فعالسازی (غیرفعالسازی) بهینهسازی جفتکردن دستورالعملهای بارگذاری (load) یا ذخیرهسازی (store) متوالی برای فعال کردن پیوند بارگذاری/ذخیره (load/store bonding). این گزینه بهطور پیشفرض فعال است، اما تنها زمانی اعمال میشود که معماری انتخابشده از پیونددهی پشتیبانی کند.
- -mstrict-align
- -mno-strict-align
- -munaligned-access
- -mno-unaligned-access
- غیرفعالسازی (فعالسازی) دسترسی مستقیم غیرهمتراز برای MIPS Release 6. معماری MIPSr6 نیازمند پشتیبانی از دسترسی غیرهمتراز در دستورات load/store است، چه از طریق سختافزار و چه از طریق تلهگذاری و شبیهسازی (trapping and emulation). در حالت دوم، ممکن است هستهٔ سیستمعامل به -mstrict-align نیاز داشته باشد. گزینههای -munaligned-access و -mno-unaligned-access منسوخ شدهاند و تنها برای سازگاری با نسخههای پیشین ارائه میشوند.
- -mmemcpy
- -mno-memcpy
- اجبار (عدم اجبار) به استفاده از "memcpy" برای انتقالهای بلوکی غیربدیهی (non-trivial). پیشفرض -mno-memcpy است که به GCC اجازه میدهد بیشتر رونوشتهای با اندازهٔ ثابت را بهصورت درونخطی (inline) درآورد.
- -mlong-calls
- -mno-long-calls
- غیرفعالسازی
(عدم
غیرفعالسازی)
استفاده از
دستورالعمل
"jal".
فراخوانی
توابع با
استفاده از
"jal"
کارآمدتر
است، اما
مستلزم آن
است که
فراخواننده
(caller) و
فراخواندهشده
(callee) در یک
قطعهٔ (segment)
۲۵۶
مگابایتی
یکسان قرار
داشته
باشند.
این گزینه هیچ تأثیری بر کدهای abicalls ندارد. پیشفرض -mno-long-calls است.
- -mmad
- -mno-mad
- فعالسازی (غیرفعالسازی) استفاده از دستورالعملهای "mad"، "madu" و "mul"، طبق آنچه که توسط ISA پردازندهٔ R4650 ارائه شده است.
- -mimadd
- -mno-imadd
- فعالسازی (غیرفعالسازی) استفاده از دستورالعملهای عدد صحیح "madd" و "msub". پیشفرض در معماریهایی که از "madd" و "msub" پشتیبانی میکنند -mimadd است، بهجز در معماری 74k که مشخص شده است کد کندتری تولید میکند.
- -mfused-madd
- -mno-fused-madd
- فعالسازی
(غیرفعالسازی)
استفاده از
دستورالعملهای
ضرب-انباشت
(multiply-accumulate) ممیز
شناور در
صورت در
دسترس بودن
آنها.
پیشفرض
-mfused-madd است.
در پردازندهٔ R8000 هنگام استفاده از دستورالعملهای ضرب-انباشت، حاصلضرب میانی با دقت بینهایت محاسبه میشود و مشمول بیت FCSR Flush to Zero نمیگردد. این مسئله ممکن است در برخی شرایط نامطلوب باشد. در سایر پردازندهها، نتیجه از نظر عددی با محاسبهٔ معادل با استفاده از دستورالعملهای جداگانهٔ ضرب، جمع، تفریق و منفیسازی یکسان است.
- -nocpp
- به اسمبلر MIPS اعلام میکند که هنگام اسمبل کردن فایلهای اسمبلر کاربر (با پسوند .s)، پیشپردازندهٔ خود را بر روی آنها اجرا نکند.
- -mfix-24k
- -mno-fix-24k
- دور زدن نقص فنی (errata) پردازندهٔ 24K E48 (از دست رفتن دادهها در ذخیرهسازیها حین بازپرکنی/refill). این راهحلها به جای GCC توسط اسمبلر پیادهسازی میشوند.
- -mfix-r4000
- -mno-fix-r4000
- دور زدن برخی از نقصهای فنی (errata) پردازندهٔ R4000:
- یک شیفت دوکلمهای (double-word) یا متغیر ممکن است در صورت اجرا بلافاصله پس از آغاز یک تقسیم عدد صحیح، نتیجهٔ نادرستی تولید کند.
- یک شیفت دوکلمهای یا متغیر ممکن است در صورت اجرا هنگام در جریان بودن یک ضرب عدد صحیح، نتیجهٔ نادرستی تولید کند.
- یک تقسیم عدد صحیح ممکن است در صورت آغاز در شکاف تأخیر (delay slot) یک انشعاب انجامشده (taken branch) یا یک پرش، نتیجهٔ نادرستی بدهد.
- -mfix-r4400
- -mno-fix-r4400
- دور زدن برخی از نقصهای فنی (errata) پردازندهٔ R4400:
- -
- یک شیفت دوکلمهای یا متغیر ممکن است در صورت اجرا بلافاصله پس از آغاز یک تقسیم عدد صحیح، نتیجهٔ نادرستی تولید کند.
- -mfix-r10000
- -mno-fix-r10000
- برطرف کردن برخی اشکالات سختافزاری (errata) در 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
- -mno-fix-vr4130
- اشکالات سختافزاری دستورهای "mflo"/"mfhi" در VR4130 را برطرف میکند. این راهکارها بهجای GCC توسط اسِمبلر پیادهسازی شدهاند، اگرچه GCC در صورتی که دستورالعملهای "macc"، "macchi"، "dmacc" و "dmacchi" در VR4130 در دسترس باشند، از استفاده از "mflo" و "mfhi" خودداری میکند.
- -mfix-sb1
- -mno-fix-sb1
- برطرف کردن برخی اشکالات سختافزاری خاص در هسته پردازنده SB-1. (این پرچم در حال حاضر اشکالات ممیز شناور «F1» و «F2» را در ویرایش دوم پردازنده SB-1 برطرف میکند.)
- -mfix4300
- -mno-fix4300
- اشکالی را در سیلیکونهای اولیه VR4300 برطرف میکند که باعث میشد عملیات ضرب با عملوندهای خاص، ضربهای بلافاصله پس از خود را خراب کند.
- -mr10k-cache-barrier=setting
- مشخص
میکند که
آیا GCC باید
برای
جلوگیری از
اثرات
جانبی
اجرای حدسی
(speculation) در
پردازندههای
R10K،
مانعهای
کَش (cache barriers) درج
کند یا خیر.
مشابه بسیاری از پردازندهها، R10K تلاش میکند نتیجه یک پرش شرطی را پیشبینی کرده و دستورالعملهای شاخه «انتخابشده» را بهطور حدسی اجرا کند. در صورتی که نتیجه پیشبینی نادرست باشد، پردازنده بعداً اجرای این دستورالعملها را لغو میکند. با این حال، در R10K حتی دستورالعملهای لغو شده نیز میتوانند اثرات جانبی داشته باشند.
این مشکل فقط بر روی ذخیرهسازیهای هسته (kernel stores) و بسته به سیستم، بر روی بارگذاریهای هسته (kernel loads) تأثیر میگذارد. بهعنوان مثال، یک ذخیرهسازی که بهصورت حدسی اجرا شده است ممکن است حافظه مقصد را در کَش بارگذاری کرده و خط کَش را بهعنوان کثیف (dirty) نشانهگذاری کند، حتی اگر خود عملیات ذخیرهسازی بعداً لغو شود. اگر یک عملیات DMA پیش از تخلیه (flush) خط «کثیف» روی همان ناحیه از حافظه بنویسد، دادههای کَششده روی دادههای ارائهشده توسط DMA بازنویسی میشوند. برای توضیحات کامل، از جمله سایر مشکلات احتمالی، به دفترچه راهنمای پردازنده R10K مراجعه کنید.
یک راهکار این است که پیش از هر دسترسی به حافظه که ممکن است بهصورت حدسی اجرا شود و حتی در صورت لغو شدن دارای اثر جانبی باشد، دستورالعملهای مانع کَش درج شوند. گزینه -mr10k-cache-barrier=setting نحوه پیادهسازی این راهکار در GCC را کنترل میکند. این گزینه فرض میکند که دسترسیهای لغوشده به هر بایتی در نواحی زیر، اثر جانبی نخواهند داشت:
- 1.
- حافظه اشغالشده توسط فریم پشته (stack frame) تابع جاری؛
- 2.
- حافظه اشغالشده توسط یک آرگومان ورودی پشته؛
- 3.
- حافظه اشغالشده توسط شیئی که آدرس آن در زمان پیوند ثابت (link-time-constant) است.
اطمینان از امن بودن دسترسیهای حدسی به این نواحی بر عهده هسته (kernel) است.
اگر برنامه ورودی شامل یک اعلان تابع مانند زیر باشد:
void foo (void);
آنگاه پیادهسازی "foo" باید اجازه دهد که "j foo" و "jal foo" بهصورت حدسی اجرا شوند. GCC این محدودیت را برای توابعی که خود کامپایل میکند رعایت مینماید. انتظار میرود توابع غیر GCC (مانند کدهای اسمبلی دستنویس) نیز همین رویه را دنبال کنند.
این گزینه دارای سه حالت است:
- -mr10k-cache-barrier=load-store
- یک مانع کَش پیش از هر بارگذاری یا ذخیرهسازی که ممکن است بهصورت حدسی اجرا شده و حتی در صورت لغو شدن اثر جانبی داشته باشد، درج میکند.
- -mr10k-cache-barrier=store
- یک مانع کَش پیش از هر ذخیرهسازی که ممکن است بهصورت حدسی اجرا شده و حتی در صورت لغو شدن اثر جانبی داشته باشد، درج میکند.
- -mr10k-cache-barrier=none
- درج مانعهای کَش را غیرفعال میکند. این حالت پیشفرض است.
- -mflush-func=func
- -mno-flush-func
- تابعی را برای فراخوانی جهت تخلیه کَشهای I و D تعیین میکند، یا مشخص میکند هیچ تابعی فراخوانی نشود. در صورت فراخوانی، تابع باید همان آرگومانهای تابع متداول "_flush_func" را بپذیرد، یعنی آدرس محدوده حافظهای که کَش آن تخلیه میشود، اندازه محدوده حافظه و عدد 3 (برای تخلیه هر دو کَش). مقدار پیشفرض به مقصدی که GCC برای آن پیکربندی شده است بستگی دارد، اما معمولاً "_flush_func" یا "__cpu_flush" است.
- -mbranch-cost=num
- هزینه پرشها (branches) را تقریباً برابر با num دستورالعمل «ساده» تنظیم میکند. این هزینه صرفاً یک تقریب اکتشافی (heuristic) است و تضمینی نیست که نتایج یکسانی در نگارشهای مختلف ایجاد کند. مقدار هزینه صفر، مقدار پیشفرض را انتخاب میکند که بر اساس تنظیمات -mtune تعیین میشود.
- -mbranch-likely
- -mno-branch-likely
- فعال یا غیرفعال کردن استفاده از دستورالعملهای Branch Likely، صرفنظر از پیشفرض معماری انتخابشده. بهطور پیشفرض، در صورتی که توسط معماری انتخابشده پشتیبانی شوند، ممکن است دستورالعملهای Branch Likely تولید شوند. یک استثنا برای معماریهای MIPS32 و MIPS64 و پردازندههایی است که این معماریها را پیادهسازی میکنند؛ برای آنها، دستورالعملهای Branch Likely بهطور پیشفرض تولید نمیشوند زیرا معماریهای MIPS32 و MIPS64 صراحتاً استفاده از آنها را منسوخ کردهاند.
- -mcompact-branches=never
- -mcompact-branches=optimal
- -mcompact-branches=always
- این
گزینهها
شکل
پرشهای
تولیدشده
را کنترل
میکنند.
پیشفرض
-mcompact-branches=optimal است.
گزینهٔ -mcompact-branches=never تضمین میکند که دستورالعملهای پرش فشرده (compact branch) هرگز تولید نشوند.
گزینهٔ -mcompact-branches=always تضمین میکند که در صورت وجود، برای MIPS Release 6 به بعد یک دستورالعمل پرش فشرده تولید شود. اگر دستور پرش فشرده در دسترس نباشد (یا پیش از R6 باشد)، بهجای آن از نوع delay slot پرش استفاده میشود.
اگر برای اهداف MIPS16/microMIPS استفاده شود، در حال حاضر نادیده گرفته میشود. رفتار برای MIPS16/microMIPS ممکن است در آینده تغییر کند، چرا که آنها دارای برخی دستورالعملهای پرش فشرده هستند.
گزینهٔ -mcompact-branches=optimal باعث میشود در صورتی که پرش با delay slot در ISA فعلی در دسترس باشد و شکاف تاخیر با موفقیت پر شود، از آن استفاده گردد. اگر شکاف تاخیر پر نشود، در صورت موجود بودن، یک پرش فشرده انتخاب میشود.
- -mfp-exceptions
- -mno-fp-exceptions
- مشخص
میکند که
آیا
استثناهای
ممیز شناور
(FP) فعال
باشند یا
خیر. این
مورد بر
نحوهٔ
زمانبندی
دستورالعملهای
FP برای برخی
پردازندهها
تأثیر
میگذارد.
پیشفرض
این است که
استثناهای
FP فعال
هستند.
برای نمونه، در SB-1، اگر استثناهای FP غیرفعال باشند و در حال تولید کد ۶۴ بیتی باشیم، میتوانیم از هر دو لولهخط (pipe) ممیز شناور استفاده کنیم. در غیر این صورت، تنها میتوانیم از یک لولهخط FP استفاده کنیم.
- -mvr4130-align
- -mno-vr4130-align
- لولهخط
پردازندهٔ
VR4130 از نوع
سوپراسکالر
دوطرفه (two-way superscalar)
است، اما
تنها در
صورتی
میتواند
دو
دستورالعمل
را با هم
صادر کند که
دستورالعمل
نخست تراز ۸
بایتی
داشته باشد.
هنگامی که
این گزینه
فعال است، GCC
جفتدستورالعملهایی
را که فکر
میکند
باید
بهطور
موازی اجرا
شوند، تراز
میکند.
این گزینه تنها هنگام بهینهسازی برای VR4130 تأثیرگذار است. معمولاً کد را سریعتر میکند، اما به بهای بزرگتر شدن اندازهٔ آن تمام میشود. این گزینه بهطور پیشفرض در سطح بهینهسازی -O3 فعال است.
- -msynci
- -mno-synci
- فعال
(غیرفعال)
کردن تولید
دستورالعملهای
"synci" در
معماریهایی
که از آن
پشتیبانی
میکنند.
دستورالعملهای
"synci" (در
صورت فعال
بودن)
هنگامی که
"__builtin___clear_cache"
کامپایل
شود تولید
میشوند.
این گزینه بهطور پیشفرض روی -mno-synci تنظیم شده است، اما میتوان با پیکربندی GCC با --with-synci این مقدار پیشفرض را لغو کرد.
هنگام کامپایل کد برای سیستمهای تکپردازندهای، استفاده از "synci" بهطور کلی ایمن است. با این حال، در بسیاری از سیستمهای چندهستهای (SMP)، کَشهای دستورالعمل را روی تمام هستهها نامعتبر نمیسازد و ممکن است منجر به رفتار تعریفنشده شود.
- -mrelax-pic-calls
- -mno-relax-pic-calls
- تلاش برای
تبدیل
فراخوانیهای
PIC که
معمولاً از
طریق ثبات
$25 ارسال
میشوند به
فراخوانیهای
مستقیم. این
مورد تنها
در صورتی
ممکن است که
پیونددهنده
بتواند
مقصد را در
زمان پیوند
حل کند و
مقصد در
محدودهٔ یک
فراخوانی
مستقیم
باشد.
در صورتی که GCC برای استفاده از یک اسمبلر و یک پیونددهنده پیکربندی شده باشد که از دستورالعمل اسمبلی ".reloc" پشتیبانی کنند و -mexplicit-relocs برقرار باشد، -mrelax-pic-calls حالت پیشفرض است. با -mno-explicit-relocs، این بهینهسازی میتواند بهتنهایی توسط اسمبلر و پیونددهنده بدون کمک کامپایلر انجام شود.
- -mmcount-ra-address
- -mno-mcount-ra-address
- تولید (یا عدم تولید) کدی که به "_mcount" اجازه میدهد آدرس بازگشت تابع فراخواننده را تغییر دهد. در صورت فعال بودن، این گزینه رابط معمول "_mcount" را با یک پارامتر جدید ra-address گسترش میدهد که نوع "intptr_t *" دارد و در ثبات $12 فرستاده میشود. سپس "_mcount" میتواند با انجام هر دوی موارد زیر، آدرس بازگشت را ویرایش کند:
- بازگرداندن آدرس جدید در ثبات $31.
- ذخیرهٔ آدرس جدید در "*ra-address"، اگر ra-address تهی نباشد.
پیشفرض -mno-mcount-ra-address است.
- -mframe-header-opt
- -mno-frame-header-opt
- فعال
(غیرفعال)
کردن
بهینهسازی
سرآیند
فریم در o32 ABI.
هنگام
استفاده از
o32 ABI،
فراخوانی
توابع ۱۶
بایت را روی
پشته تخصیص
میدهد تا
تابع
فراخواندهشده
آرگومانهای
ثبات را روی
آن بنویسد.
در صورت
فعال بودن،
این
بهینهسازی
اگر تشخیص
دهد که
سرآیند
فریم بدون
استفاده
است، از
تخصیص آن
صرفنظر
میکند.
این بهینهسازی بهطور پیشفرض در تمام سطوح بهینهسازی خاموش است.
- -mlxc1-sxc1
- -mno-lxc1-sxc1
- در صورت امکان، فعال (غیرفعال) کردن تولید دستورالعملهای "lwxc1"، "swxc1"، "ldxc1" و "sdxc1". بهطور پیشفرض فعال است.
- -mmadd4
- -mno-madd4
- در صورت امکان، فعال (غیرفعال) کردن تولید دستورالعملهای ۴ عملوندی "madd.s"، "madd.d" و دستورالعملهای مرتبط. بهطور پیشفرض فعال است.
گزینههای MMIX
این گزینهها برای MMIX تعریف شدهاند:
- -mlibfuncs
- -mno-libfuncs
- مشخص میکند که توابع درونی کتابخانه (intrinsic) کامپایل میشوند و بدون توجه به اندازه، تمام مقادیر را در ثباتها ارسال میکنند.
- -mepsilon
- -mno-epsilon
- تولید دستورالعملهای مقایسهٔ ممیز شناور که با ارجاع به ثبات اپسیلون "rE" مقایسه میکنند.
- -mabi=mmixware
- -mabi=gnu
- تولید کدی که پارامترهای تابع و مقادیر بازگشتی را بهگونهای ارسال میکند که (در تابع فراخواندهشده) بهعنوان ثباتهای $0 به بالا دیده شوند، بر خلاف GNU ABI که از ثباتهای سراسری $231 به بالا استفاده میکند.
- -mzero-extend
- -mno-zero-extend
- هنگام خواندن دادهها از حافظه در اندازههای کوتاهتر از ۶۴ بیت، بهطور پیشفرض از دستورالعملهای بارگذاری با بسط صفر استفاده میکند (استفاده نمیکند)، به جای دستورالعملهای با بسط علامت.
- -mknuthdiv
- -mno-knuthdiv
- باعث میشود که علامت باقیمانده حاصل از تقسیم، همعلامت با مقسومعلیه باشد. در حالت پیشفرض، یعنی -mno-knuthdiv، علامت باقیمانده از علامت مقسوم پیروی میکند. هر دو روش از نظر محاسباتی معتبر هستند، که روش دوم تقریباً به طور اختصاصی استفاده میشود.
- -mtoplevel-symbols
- -mno-toplevel-symbols
- یک : به ابتدای همه نمادهای سراسری اضافه میکند (اضافه نمیکند)، تا کد اسمبلی بتواند با دستورالعمل اسمبلی "PREFIX" استفاده شود.
- -melf
- یک فایل اجرایی در قالب ELF تولید میکند، به جای قالب پیشفرض mmo که توسط شبیهساز mmix استفاده میشود.
- -mbranch-predict
- -mno-branch-predict
- هنگامی که پیشبینی ایستان انشعاب یک انشعاب محتمل را نشان میدهد، از دستورالعملهای انشعاب محتمل استفاده میکند (استفاده نمیکند).
- -mbase-addresses
- -mno-base-addresses
- کدی تولید میکند (تولید نمیکند) که از آدرسهای پایه استفاده کند. استفاده از یک آدرس پایه بهطور خودکار درخواستی را (که توسط اسمبلر و پیونددهنده مدیریت میشود) برای تنظیم یک مقدار ثابت در یک ثبات سراسری ایجاد میکند. این ثبات برای یک یا چند درخواست آدرس پایه در محدوده ۰ تا ۲۵۵ از مقدار نگهداریشده در ثبات استفاده میشود. این امر عموماً به کدی کوتاه و سریع منجر میشود، اما تعداد دادههای متفاوتی که میتوانند آدرسدهی شوند محدود است. این بدان معناست که برنامهای که از دادههای ایستای زیادی استفاده میکند ممکن است به -mno-base-addresses نیاز داشته باشد.
- -msingle-exit
- -mno-single-exit
- کد تولیدشده را وادار میکند (وادار نمیکند) تا در هر تابع تنها یک نقطه خروج داشته باشد.
- -mset-data-start=address
- هنگام پیوند دادن، شروع بخش داده را روی address تنظیم میکند.
- -mset-program-start=address
- -mno-set-program-start
- هنگام پیوند دادن، آدرس شروع برنامه را روی address تنظیم میکند. مقدار پیشفرض آن 0x100 است مگر اینکه از -mno-set-program-start برای لغو کامل این گزینه استفاده شود.
گزینههای MN10300
این گزینههای -m برای معماریهای Matsushita MN10300 تعریف شدهاند:
- -mmult-bug
- -mno-mult-bug
- در صورت فعال بودن، کدی تولید میکند تا از اشکالات موجود در دستورالعملهای ضرب برای پردازندههای MN10300 اجتناب شود. این حالت پیشفرض است.
- -mam33
- -mno-am33
- کد را با استفاده از ویژگیهای اختصاصی پردازنده AM33 تولید میکند. حالت پیشفرض -mno-am33 است.
- -mam33-2
- -mno-am33-2
- کد را با استفاده از ویژگیهای اختصاصی پردازنده AM33/2.0 تولید میکند. حالت پیشفرض -mno-am33-2 است.
- -mam34
- -mno-am34
- کد را با استفاده از ویژگیهای اختصاصی پردازنده AM34 تولید میکند. حالت پیشفرض -mno-am34 است.
- -mtune=cpu-type
- هنگام زمانبندی دستورالعملها، از ویژگیهای زمانبندی نوع CPU مشخصشده استفاده میکند. این کار نوع پردازنده هدف را تغییر نمیدهد. نوع CPU باید یکی از موارد mn10300، am33، am33-2 یا am34 باشد.
- -mreturn-pointer-on-d0
- -mno-return-pointer-on-d0
- هنگام تولید تابعی که یک اشارهگر برمیگرداند، اشارهگر را در هر دوی "a0" و "d0" بازمیگرداند. در غیر این صورت، اشارهگر تنها در "a0" بازگردانده میشود، و تلاش برای فراخوانی چنین توابعی بدون پیشنمونه منجر به خطا میشود. توجه داشته باشید که این گزینه بهطور پیشفرض فعال است؛ برای غیرفعال کردن آن از -mno-return-pointer-on-d0 استفاده کنید.
- -mno-crt0
- فایل شیء مقداردهی اولیه زمان اجرای C را پیوند نمیدهد.
- -mrelax
- به
پیونددهنده
نشان
میدهد که
باید یک
مرحله
بهینهسازی
واهلش (relaxation) را
برای
کوتاهتر
کردن
انشعابها،
فراخوانیها
و آدرسهای
حافظه مطلق
انجام دهد.
این گزینه
فقط زمانی
تأثیر دارد
که در خط
فرمان برای
مرحله
نهایی
پیوند
استفاده
شود.
این گزینه اشکالزدایی نمادین را غیرممکن میکند.
- -mliw
- -mno-liw
- به کامپایلر اجازه میدهد در صورتی که هدف AM33 یا جدیدتر باشد، دستورالعملهای کلمه دستورالعمل طولانی را تولید کند. این گزینه بهطور پیشفرض فعال است. -mliw ماکروی پیشپردازنده "__LIW__" را تعریف میکند؛ -mno-liw ماکروی پیشپردازنده "__NO_LIW__" را تعریف میکند.
- -msetlb
- -mno-setlb
- به کامپایلر اجازه میدهد در صورتی که هدف AM33 یا جدیدتر باشد، دستورالعملهای SETLB و Lcc را تولید کند. این گزینه بهطور پیشفرض فعال است. -msetlb ماکروی پیشپردازنده "__SETLB__" را تعریف میکند؛ -mno-setlb ماکروی پیشپردازنده "__NO_SETLB__" را تعریف میکند.
گزینههای Moxie
- -meb
- کد بزرگپایان (big-endian) تولید میکند. این حالت پیشفرض برای پیکربندیهای moxie-*-* است.
- -mel
- کد کوچکپایان (little-endian) تولید میکند.
- -mmul.x
- -mno-mul.x
- دستورالعملهای mul.x و umul.x را تولید میکند. این گزینه بهطور پیشفرض برای پیکربندیهای moxiebox-*-* فعال است.
- -mno-crt0
- فایل شیء مقداردهی اولیه زمان اجرای C را پیوند نمیدهد.
گزینههای MSP430 این گزینهها برای MSP430 تعریف شدهاند:
- -masm-hex
- خروجی اسمبلی را وادار میکند تا همیشه از ثابتهای شانزدهشانزدهی (hex) استفاده کند. به طور معمول چنین ثابتهایی اعداد دهدهی علامتدار هستند، اما این گزینه برای اهداف مجموعه آزمایش (testsuite) و/یا زیبایی ظاهری در دسترس است.
- -mmcu=name
- میکروکنترلر
(MCU) هدف را
انتخاب
میکند. این
گزینه برای
ایجاد یک
نماد
پیشپردازنده
C بر اساس
نام MCU
استفاده
میشود، به
این صورت که
به حروف
بزرگ تبدیل
شده و
پیشوند و
پسوند __ به
آن افزوده
میگردد.
این نماد به
نوبه خود
توسط فایل
سرایند msp430.h
برای
انتخاب یک
فایل
سرایند
مکمل ویژه MCU
به کار
میرود.
این گزینه همچنین معماری مجموعه دستورالعمل (ISA) مورد استفاده را تعیین میکند. اگر نام MCU به گونهای باشد که تنها از 430 ISA پشتیبانی کند، همان انتخاب میشود، در غیر این صورت 430X ISA انتخاب خواهد شد. نام عمومی MCU به شکل msp430 نیز میتواند برای انتخاب 430 ISA استفاده شود. به طور مشابه، نام عمومی msp430x برای MCU معماری 430X ISA را انتخاب میکند.
علاوه بر این، یک اسکریپت پیونددهنده ویژه MCU به خط فرمان پیونددهنده اضافه میشود. نام اسکریپت، نام MCU به همراه پسوند .ld است. بنابراین، مشخص کردن -mmcu=xxx در خط فرمان gcc، نماد پیشپردازنده C یعنی "__XXX__" را تعریف کرده و باعث میشود پیونددهنده به دنبال اسکریپتی به نام xxx.ld بگردد.
معماری ISA و ضرب سختافزاری پشتیبانیشده برای MCUهای گوناگون، به صورت کدگذاریشده ثابت درون GCC قرار دارد. با این حال، میتوان از یک فایل خارجی devices.csv برای گسترش پشتیبانی از دستگاهها فراتر از موارد کدگذاریشده استفاده کرد.
کامپایلر GCC با استفاده از روشهای زیر و بر اساس اولویت مشخصشده به دنبال فایل devices.csv میگردد، به طوری که روش نخست بر روش دوم و روش دوم بر روش سوم اولویت دارد.
- مسیر include مشخصشده با -I و -L
- فایل devices.csv در هر یک از دایرکتوریهای مشخصشده توسط مسیرهای include و مسیرهای جستجوی کتابخانه پیونددهنده جستجو میشود.
- مسیر مشخصشده توسط متغیر محیطی MSP430_GCC_INCLUDE_DIR
- مقدار متغیر محیطی سراسری MSP430_GCC_INCLUDE_DIR را برابر با مسیر کامل دایرکتوری حاوی devices.csv تعریف کنید تا GCC این دایرکتوری را برای یافتن devices.csv جستجو کند. اگر devices.csv یافت شود، این دایرکتوری همچنین به عنوان مسیر include و مسیر کتابخانه پیونددهنده ثبت میشود. بنابراین فایلهای سرایند و اسکریپتهای پیونددهنده موجود در این دایرکتوری را میتوان بدون تعیین دستی -I و -L در خط فرمان استفاده کرد.
- دایرکتوری msp430-elf{,bare}/include/devices
- در نهایت، GCC مسیر msp430-elf{,bare}/include/devices را از دایرکتوری ریشه زنجیره ابزار بررسی میکند. این دایرکتوری در نصب پیشفرض وجود ندارد، اما اگر آن را ایجاد کرده و devices.csv را در آن رونوشت کرده باشید، دادههای MCU خوانده میشوند. همانند موارد بالا، این دایرکتوری نیز به عنوان مسیر include و مسیر کتابخانه پیونددهنده ثبت میشود.
اگر هیچیک از روشهای جستجوی بالا فایل devices.csv را پیدا نکنند، از دادههای کدگذاریشده ثابت MCU استفاده خواهد شد.
- -mwarn-mcu
- -mno-warn-mcu
- این گزینه هشدارهای مربوط به تداخل میان نام MCU مشخصشده توسط گزینه -mmcu و ISA تعیینشده توسط گزینه -mcpu و/یا پشتیبانی از ضرب سختافزاری تعیینشده توسط گزینه -mhwmult را فعال یا غیرفعال میکند. این گزینه همچنین هشدارهای مربوط به نامهای ناشناخته MCU را تغییر وضعیت میدهد. این گزینه بهطور پیشفرض فعال است.
- -msim
- پیوند با کتابخانههای زمان اجرای شبیهساز و اسکریپت پیونددهنده آن. این گزینه بر هر اسکریپتی که ممکن است توسط گزینه -mmcu= انتخاب شود اولویت دارد و جایگزین آن میشود.
- -mlarge
- استفاده از مدل آدرسدهی بزرگ (اشارهگرهای ۲۰ بیتی، "size_t" ۲۰ بیتی).
- -msmall
- استفاده از مدل آدرسدهی کوچک (اشارهگرهای ۱۶ بیتی، "size_t" ۱۶ بیتی).
- -mrelax
- این گزینه به اسمبلر و پیونددهنده ارسال میشود و به پیونددهنده اجازه میدهد بهینهسازیهای خاصی را انجام دهد که تا پیش از زمان پیوند نهایی قابل انجام نیستند.
- mhwmult=type
- نوع ضرب
سختافزاری
پشتیبانیشده
توسط هدف را
توصیف
میکند.
مقادیر
پذیرفتهشده
برای type
عبارتند از:
none برای عدم
وجود ضرب
سختافزاری،
16bit برای ضرب
اصلی صرفاً
۱۶ بیتی که
در MCUهای
اولیه
پشتیبانی
میشد، 32bit
برای ضرب
۱۶/۳۲ بیتی
پشتیبانیشده
در MCUهای
جدیدتر، و
f5series برای ضرب
۱۶/۳۲ بیتی
پشتیبانیشده
در MCUهای سری F5.
مقدار auto
نیز
میتواند
ارائه شود.
این مقدار
به GCC
میگوید تا
پشتیبانی
از ضرب
سختافزاری
را بر اساس
نام MCU
ارائهشده
توسط گزینه
-mmcu استنتاج
کند. اگر
هیچ گزینه
-mmcu مشخص
نشده باشد
یا نام MCU
ناشناخته
باشد، فرض
میشود ضرب
سختافزاری
پشتیبانی
نمیشود.
"auto"
مقدار
پیشفرض
است.
ضربهای سختافزاری معمولاً با فراخوانی یک روتین کتابخانهای انجام میشوند. این کار باعث صرفهجویی در فضای کد تولیدشده میشود. با این حال هنگام کامپایل با -O3 یا بالاتر، ضربکننده سختافزاری به صورت درونخطی (inline) فراخوانی میشود. این کار کدی بزرگتر اما سریعتر تولید میکند.
روتینهای ضرب سختافزاری وقفهها را در حین اجرا غیرفعال کرده و پس از اتمام کار، وضعیت پیشین وقفه را بازمیگردانند. این موضوع استفاده از آنها را در داخل گردانندههای وقفه و همچنین در کدهای معمولی ایمن میسازد.
- -minrt
- استفاده از یک محیط زمان اجرای حداقلی بدون پشتیبانی از مقداردهندههای اولیهی ایستا یا سازندهها را فعال میکند. این قابلیت برای دستگاههای با حافظه محدود در نظر گرفته شده است. کامپایلر نمادهای خاصی را در برخی شیءها قرار میدهد که به پیونددهنده و زمان اجرا اعلام میکنند کدام بخشهای کد مورد نیاز است.
- -mtiny-printf
- توابع
کتابخانهای
"printf" و
"puts" با
اندازه کد
کاهشیافته
را فعال
میکند.
پیادهسازیهای
tiny این
توابع
بازورودپذیر
(reentrant) نیستند،
بنابراین
باید در
برنامههای
چندنخی با
احتیاط
استفاده
شوند.
پشتیبانی از جریانها (streams) حذف شده است و رشتههای چاپی همیشه از طریق فراخوانی سیستمی "write" به stdout ارسال میشوند. رشته پیش از ارسال به write بافر نمیشود.
این گزینه به Newlib Nano IO نیاز دارد، بنابراین GCC باید با --enable-newlib-nano-formatted-io پیکربندی شده باشد.
- -mmax-inline-shift=n
- این گزینه
یک عدد صحیح
n بین ۰ تا
۶۴ (شامل هر
دو) میگیرد
و حداکثر
تعداد
دستورهای
شیفت
درونخطی (inline)
را تعیین
میکند که
باید برای
انجام
عملیات
شیفت با
مقداری
ثابت صادر
شوند.
هنگامی که
نیاز به
عبور از این
مقدار
باشد، به
جای آن از
یک تابع
کمکی mspabi
استفاده
میشود.
مقدار
پیشفرض ۴
است.
این موضوع فقط بر مواردی اثر میگذارد که شیفت به چندین موقعیت نتواند با یک دستور واحد انجام شود (مانند تمام شیفتهای >1 در 430 ISA).
شیفتهای یک مقدار ۳۲ بیتی دستکم دو برابر پرهزینهتر هستند، بنابراین مقدار ارائهشده برای این گزینه بر ۲ تقسیم شده و مقدار حاصل به جای آن استفاده میشود.
- -mcode-region=where
- -mdata-region=where
- این گزینهها به کامپایلر اعلام میکنند که توابع و دادههایی را که هیچیک از صفتهای "lower"، "upper"، "either" یا "section" را ندارند در کجا قرار دهد. مقادیر ممکن برای where عبارتند از lower، upper، either یا any. سه مقدار نخست مانند صفت متناظر عمل میکنند. چهارمین مقدار ممکن، any، پیشفرض است. این مقدار، جایگذاری را به طور کامل به اسکریپت پیونددهنده و نحوه تخصیص بخشهای استاندارد (".text"، ".data" و غیره) به نواحی حافظه واگذار میکند.
- -muse-lower-region-prefix
- هنگام کامپایل با -mcode-region=lower یا -mdata-region=lower، پیشوند .lower را به نام بخشها اضافه میکند. به طور پیشفرض غیرفعال است.
- -msilicon-errata=name[,name...]
- این گزینه درخواستی را به اسمبلر ارسال میکند تا اصلاحات مربوط به خطاهای سختافزاری سیلیسیمی (silicon errata) نامبردهشده را فعال کند. برای جزئیات به مستندات اسمبلر مراجعه کنید.
- -msilicon-errata-warn=name[,name...]
- این گزینه درخواستی را به اسمبلر ارسال میکند تا در مواردی که ممکن است نیاز به اعمال خطای سختافزاری سیلیسیمی نامبردهشده باشد، پیامهای هشدار را فعال کند. برای جزئیات به مستندات اسمبلر مراجعه کنید.
- -mwarn-devices-csv
- -mno-warn-devices-csv
- اگر devices.csv پیدا نشود یا در تجزیه آن مشکلی وجود داشته باشد هشدار میدهد (پیشفرض: فعال).
گزینههای NDS32 این گزینهها برای پیادهسازیهای NDS32 تعریف شدهاند:
- -mbig-endian
- -EB
- تولید کد در حالت big-endian.
- -mlittle-endian
- -EL
- تولید کد در حالت little-endian.
- -mabi=2
- -mfloat-abi=soft
- استفاده از ABI نرمافزاری ممیز شناور (soft floating-point).
- -mabi=2fp+
- -mfloat-abi=hard
- استفاده از ABI سختافزاری ممیز شناور (hard floating-point).
- -mreduced-regs
- استفاده از مجموعه ثباتهای کاهشیافته (reduced-set) برای تخصیص ثبات.
- -mfull-regs
- استفاده از مجموعه ثباتهای کامل (full-set) برای تخصیص ثبات.
- -malways-align
- همترازسازی همیشگی نقطه ورود تابع، مقصدهای پرش و نشانی بازگشت.
- -malign-functions
- همترازسازی نقطه ورود تابع با مرز ۴ بایت.
- -mfp-as-gp
- -mno-fp-as-gp
- فعال/غیرفعال کردن بهینهسازی fp-as-gp.
- -mcmov
- -mno-cmov
- فعال/غیرفعال کردن تولید دستورالعملهای جابهجایی شرطی (conditional move).
- -mhw-abs
- -mno-hw-abs
- فعال/غیرفعال کردن تولید دستورالعملهای سختافزاری قدر مطلق (abs).
- -mext-perf
- -mno-ext-perf
- فعال/غیرفعال کردن تولید دستورالعملهای افزونه کارایی (performance extension).
- -mext-perf2
- -mno-ext-perf2
- فعال/غیرفعال کردن تولید دستورالعملهای افزونه کارایی ۲ (performance extension 2).
- -mext-string
- -mno-ext-string
- فعال/غیرفعال کردن تولید دستورالعملهای افزونه رشته (string extension).
- -mext-dsp
- -mno-ext-dsp
- فعال/غیرفعال کردن تولید دستورالعملهای افزونه DSP.
- -mext-fpu-fma
- -mno-ext-fpu-fma
- فعال/غیرفعال کردن تولید دستورالعملهای ضرب و جمع ممیز شناور (multiply-accumulation).
- -mext-fpu-sp
- -mno-ext-fpu-sp
- فعال/غیرفعال کردن تولید دستورالعملهای ممیز شناور با دقت یگانه (single-precision).
- -mext-fpu-dp
- -mno-ext-fpu-dp
- فعال/غیرفعال کردن تولید دستورالعملهای ممیز شناور با دقت مضاعف (double-precision).
- -mv3push
- -mno-v3push
- فعال/غیرفعال کردن تولید دستورالعملهای v3 push25/pop25.
- -m16-bit
- -mno-16-bit
- فعال/غیرفعال کردن تولید دستورالعملهای ۱۶ بیتی.
- -mvh
- -mno-vh
- فعال/غیرفعال کردن پشتیبانی از Virtual Hosting.
- -misr-vector-size=num
- تعیین اندازه هر بردار وقفه، که باید ۴ یا ۱۶ باشد.
- -misr-secure=num
- تعیین سطح امنیت c-isr برای کل فایل.
- -mcache-block-size=num
- تعیین اندازه هر بلوک حافظه نهان (cache block)، که باید توانی از ۲ بین ۴ و ۵۱۲ باشد.
- -march=arch
- معماری مقصد را مشخص میکند. arch میتواند یکی از مقادیر v2، v3، v3j، v3m، v3f یا v3s باشد.
- -mcpu=cpu
- پردازنده (CPU) مقصد برای کامپایل را مشخص میکند. cpu میتواند یکی از مقادیر n6، n650، n7، n705، n8، n801، sn8، sn801، s8، s801، e8، e801، n820، s830، e830، n9، n903، n903a، n968، n968a، n10، n1033، n1033a، n1033-fpu، n1033-spu، n1068، n1068a، n1068-fpu، n1068a-fpu، d10، d1088، d1088-fpu، d1088-spu، n15، d15، n15s، d15s، n15f، d15f، n12، n1213، n1233، n1233-fpu، n1233-spu، n13، n1337، n1337-fpu، n1337-spu یا simple باشد.
- -mconfig-fpu=num
- مقدار پیکربندی FPU را از 0 تا 7 مشخص میکند؛ مقادیر 0--3 همانطور که در مشخصات FPU آمده است میباشند، و مقادیر 4--7 متناظر با 0--3 هستند.
- -mconfig-mul=type
- پیکربندی دستورالعمل ضرب را تعیین میکند. type میتواند یکی از مقادیر fast، fast1 (معادل با fast)، fast2 یا slow باشد. مقدار پیشفرض fast1 است.
- -mconfig-register-ports=kind
- تعداد درگاههای خواندن/نوشتن را برای هستههای n9/n10 تعیین میکند. این مقدار باید 3r2w یا 2r1w باشد.
- -mcmodel=code-model
- مدل کد را روی یکی از موارد زیر تنظیم میکند:
- small
- تمام بخشهای داده و دادههای فقطخواندنی (read-only data) باید در فضای آدرسدهی 512KB قرار داشته باشند. بخش کد (text segment) باید در فضای آدرسدهی 16MB قرار داشته باشد..IP medium 4 قطعهٔ داده باید درون محدودهٔ 512KB باشد، در حالی که قطعهٔ دادهٔ فقطخواندنی میتواند درون فضای آدرسدهی 4GB قرار گیرد. قطعهٔ کد (text segment) همچنان باید درون فضای آدرسدهی 16MB باشد.
- large
- تمام قطعههای کد و داده میتوانند درون فضای آدرسدهی 4GB باشند.
پیشفرض در مقصدهای GNU/Linux برابر با large و در سایر مقصدهای ELF برابر با medium است.
- -mctor-dtor
- -mno-ctor-dtor
- فعال/غیرفعال کردن ویژگی سازنده/ویرانگر (constructor/destructor).
- -mrelax
- -mno-relax
- فعال/غیرفعال کردن گزینهٔ پیونددهنده برای تعدیل (relax) دستورالعملها.
- -mrelax-hint
- -mno-relax-hint
- فعال/غیرفعال کردن درج راهنماها (hints) برای پیونددهنده جهت انجام تعدیل.
- -msched-prolog-epilog
- -mno-sched-prolog-epilog
- فعال/غیرفعال کردن زمانبندی توالی آغازین (prologue) و پایانی (epilogue) تابع.
- -mret-in-naked-func
- -mno-ret-in-naked-func
- فعال/غیرفعال کردن تولید دستورالعملهای بازگشت در توابع عریان (naked functions). این گزینه به طور پیشفرض فعال است.
- -malways-save-lp
- -mno-always-save-lp
- فعال/غیرفعال کردن ذخیرهٔ همیشگی $lp در پشته (stack).
- -munaligned-access
- -mno-unaligned-access
- فعال/غیرفعال کردن دسترسیهای ناتراز کلمه (word) و نیمکلمه (halfword) به دادههای بستهبندیشده (packed).
- -minline-asm-r15
- -mno-inline-asm-r15
- مجاز/غیرمجاز کردن استفاده از r15 برای اسمبلی درونخطی (inline asm).
گزینههای Nvidia PTX
این گزینهها برای Nvidia PTX تعریف شدهاند:
- -m64
- نادیده گرفته میشود، اما برای سازگاری با گذشته حفظ شده است. تنها ABI ۶۴-بیتی پشتیبانی میشود.
- -march=architecture-string
- تولید کد
برای
معماری
مقصد PTX ISA
مشخصشده.
رشتههای
معماری
معتبر
عبارتند از:
sm_30، sm_35، sm_37،
sm_50، sm_52، sm_53،
sm_61، sm_70، sm_75،
sm_80 و sm_89.
مقدار
پیشفرض به
نحوهٔ
پیکربندی
کامپایلر
بستگی
دارد؛ به
--with-arch مراجعه
کنید.
این گزینه مقدار ماکروی پیشپردازندهٔ "__PTX_SM__" را تنظیم میکند؛ برای نمونه، برای sm_35، دارای مقدار 350 است.
- -misa=architecture-string
- نام مستعار -march=.
- -march-map=architecture-string
- نزدیکترین مقدار دردسترس برای -march= را انتخاب میکند که توانمندتر از مقدار درخواستی نباشد. برای نمونه، برای -march-map=sm_50 گزینهٔ -march=sm_37 و برای -march-map=sm_53 گزینهٔ -march=sm_53 را انتخاب میکند.
- -mptx=version-string
- تولید کد
برای نگارش
مشخصشده
از PTX ISA.
رشتههای
نگارش
معتبر
عبارتند از:
3.1، 4.0، 4.1،
4.2، 5.0، 6.0،
6.3، 7.0، 7.3 و 7.8.
نگارش
پیشفرض PTX ISA
همان
نسخهای
است که
پشتیبانی
از معماری
مقصد
انتخابشده
را افزوده
است (به -march=
مراجعه
کنید)، اما
حداقل 6.3،
یا برای -march=sm_52
و بالاتر،
7.3 است.
این گزینه مقدارهای ماکروهای پیشپردازندهٔ "__PTX_ISA_VERSION_MAJOR__" و "__PTX_ISA_VERSION_MINOR__" را تنظیم میکند؛ برای نمونه، برای 3.1 این ماکروها به ترتیب دارای مقادیر 3 و 1 هستند.
- -mmainkernel
- پیوند دادن کد برای یک کرنل __main. این گزینه برای اجرای مستقل (stand-alone) به جای اجرای تخلیه بار پردازشی (offloading) به کار میرود.
- -moptimize
- -mno-optimize
- فعال/غیرفعال کردن بهینهسازیهای اجرای بخشبندیشده (partitioned execution). این گزینه به طور پیشفرض زمانی که هر سطحی از بهینهسازی انتخاب شده باشد، فعال است.
- -msoft-stack
- -mno-soft-stack
- برای -mno-soft-stack
(پیشفرض،
مگر اینکه
-mgomp مشخص شده
باشد)، از
پشتههای
«بومی» (native) در
PTX استفاده
میشود؛
بدین معنی
که کدی
تولید
میشود که
از حافظهٔ
".local" یا
دستور
"alloca" در PTX
به طور
مستقیم
برای
ذخیرهسازی
پشته بهره
میبرد. مگر
در حالتی که
-mptx=7.3 یا
بالاتر و
-march=sm_52 یا
بالاتر
فعال
باشند،
آرایههای
با طول
متغیر و
تخصیص
پویای
حافظه روی
پشته با
"alloca"
پشتیبانی
نمیشوند.
برای -msoft-stack (که توسط -mgomp به طور ضمنی فعال میشود)، کدی تولید میشود که از حافظهٔ ".local" یا "alloca" در PTX مستقیماً برای ذخیرهسازی پشته استفاده نمیکند. در عوض، یک اشارهگر پشته به ازای هر warp به طور صریح نگهداری میشود. این کار امکان تخصیص پشته با طول متغیر (با آرایههای با طول متغیر یا "alloca") را فراهم میکند، و زمانی که حافظهٔ سراسری (global memory) برای ذخیرهسازی زیربنایی به کار رود، دسترسی به متغیرهای خودکار (automatic variables) از سایر رشتهها (threads) یا با دستورالعملهای اتمیک را ممکن میسازد. این روش تولید کد برای offloading در OpenMP استفاده میشود، اما این گزینه به تنهایی به منظور آزمودن کامپایلر دردسترس قرار گرفته است؛ برای تولید کد مناسب جهت پیوند در برنامههایی که از offloading در OpenMP استفاده میکنند، از گزینهٔ -mgomp استفاده کنید.
- -msoft-stack-reserve-local=size
- اندازهٔ حافظهٔ ".local" استفادهشده برای پشته را هنگامی که مقدار دقیق آن مشخص نیست تعیین میکند. مقدار پیشفرض آن 128 است.
- -muniform-simt
- -mno-uniform-simt
- فعال/غیرفعال کردن نوعی از تولید کد که امکان اجرای تمام رشتهها (threads) را در هر warp فراهم میکند، در حالی که وضعیت حافظه و اثرات جانبی (side effects) را طوری حفظ میکند که گویی تنها یک رشته در هر warp بیرون از ناحیههای SIMD مربوط به OpenMP فعال است. تمام عملیات اتمیک و فراخوانیهای زمان اجرا ("malloc"، "free"، "vprintf") به صورت شرطی اجرا میشوند (تنها در صورتی که نمایهٔ لاین کنونی برابر با نمایهٔ لاین اصلی باشد)، و ثباتی که مقداردهی میشود از طریق یک دستورالعمل shuffle از لاین اصلی رونوشت میگردد. در خارج از ناحیههای SIMD، لاین 0 به عنوان اصلی (master) عمل میکند؛ در درون، هر رشته خود را به عنوان اصلی در نظر میگیرد. آرایهٔ حافظهٔ اشتراکی "int __nvptx_uni[]" ماسکهای بیتی تمامصفر یا تمامیک را برای هر warp ذخیره میکند که نشاندهندهٔ حالت جاری است (۰ در خارج از ناحیههای SIMD). هر رشته میتواند ماسک بیتی در موقعیت "tid.y" را با نمایهٔ لاین جاری AND بیتی کند تا نمایهٔ لاین اصلی را محاسبه نماید..IP -mgomp 4
- -mno-gomp
- فعال/غیرفعالسازی تولید کد برای استفاده در OpenMP offloading. گزینهٔ -mgomp گزینههای -msoft-stack و -muniform-simt را فعال کرده و گونهٔ multilib متناظر را انتخاب میکند.
گزینههای OpenRISC
این گزینهها برای OpenRISC تعریف شدهاند:
- -mboard=name
- پیکربندی زمان اجرای مخصوص یک برد. این مقدار برای پیوند با کتابخانهٔ برد newlib به پیونددهنده ارسال میشود. مقدار پیشفرض "or1ksim" است.
- -msoft-div
- -mhard-div
- انتخاب دستورالعملهای نرمافزاری یا سختافزاری تقسیم ("l.div"، "l.divu"). حالت پیشفرض تقسیم سختافزاری است.
- -msoft-mul
- -mhard-mul
- انتخاب دستورالعملهای نرمافزاری یا سختافزاری ضرب ("l.mul"، "l.muli"). حالت پیشفرض ضرب سختافزاری است.
- -msoft-float
- -mhard-float
- انتخاب نرمافزار یا سختافزار برای محاسبات ممیز شناور. پیشفرض حالت نرمافزاری است.
- -mdouble-float
- هنگامی که -mhard-float انتخاب شده باشد، تولید دستورالعملهای ممیز شناور با دقت مضاعف (double-precision) را فعال میکند. بهطور پیشفرض، از توابع libgcc برای انجام عملیات ممیز شناور با دقت مضاعف استفاده میشود.
- -munordered-float
- هنگامی که -mhard-float انتخاب شده باشد، تولید دستورالعملهای مقایسهٔ نامرتب ممیز شناور و تنظیم پرچم ("lf.sfun*") را فعال میکند. بهطور پیشفرض از توابع libgcc برای انجام عملیات مقایسهٔ نامرتب ممیز شناور و تنظیم پرچم استفاده میشود.
- -mcmov
- فعال کردن تولید دستورالعملهای انتقال شرطی ("l.cmov"). بهطور پیشفرض، معادلهای آن با استفاده از set و branch تولید میشوند.
- -mror
- فعال کردن تولید دستورالعملهای چرخش به راست ("l.ror"). بهطور پیشفرض از توابع libgcc برای انجام عملیات چرخش به راست استفاده میشود.
- -mrori
- فعال کردن تولید دستورالعملهای چرخش به راست با مقدار بیواسطه ("l.rori"). بهطور پیشفرض، از توابع libgcc برای انجام عملیات چرخش به راست با مقدار بیواسطه استفاده میشود.
- -msext
- فعال کردن تولید دستورالعملهای گسترش علامت ("l.ext*"). بهطور پیشفرض از بارگذاریهای حافظه برای انجام گسترش علامت استفاده میشود.
- -msfimm
- فعال کردن تولید دستورالعملهای مقایسه و تنظیم پرچم با مقدار بیواسطه ("l.sf*i"). بهطور پیشفرض، دستورالعملهای اضافی برای ذخیرهٔ مقدار بیواسطه در یک ثبات تولید میشود.
- -mshftimm
- فعال کردن تولید دستورالعملهای شیفت با مقدار بیواسطه ("l.srai"، "l.srli" و "l.slli"). بهطور پیشفرض، دستورالعملهای اضافی برای ذخیرهٔ مقدار بیواسطه در یک ثبات تولید میشود.
- -mcmodel=small
- تولید کد OpenRISC برای مدل small: جدول GOT به 64k و پرشهای فراخوانی تابع به آفستهای 64M محدود میشوند. این مدل پیشفرض است.
- -mcmodel=large
- تولید کد OpenRISC برای مدل large: جدول GOT میتواند تا اندازهٔ 4G رشد کند و پرشهای فراخوانی تابع میتوانند کل فضای آدرسدهی 4G را هدف قرار دهند.
گزینههای PDP-11
این گزینهها برای PDP-11 تعریف شدهاند:
- -mfpu
- استفاده از ممیز شناور سختافزاری FPP. این حالت پیشفرض است. (ممیز شناور FIS در PDP-11/40 پشتیبانی نمیشود.) مستلزم -m45 است.
- -msoft-float
- عدم استفاده از ممیز شناور سختافزاری.
- -mac0
- -mno-ac0
- با -mac0، نتایج ممیز شناور در ac0 (که در نحو اسمبلر Unix به صورت fr0 است) بازگردانده میشوند. حالت پیشفرض، -mno-ac0، بازگرداندن نتایج ممیز شناور در حافظه است.
- -m40
- تولید کد برای یک PDP-11/40. مستلزم -msoft-float و -mno-split است.
- -m45
- تولید کد برای یک PDP-11/45. این حالت پیشفرض است.
- -m10
- تولید کد برای یک PDP-11/10. مستلزم -msoft-float و -mno-split است.
- -mint16
- -mno-int32
- استفاده از "int" ۱۶-بیتی. این حالت پیشفرض است.
- -mint32
- -mno-int16
- استفاده از "int" ۳۲-بیتی.
- -msplit
- مقصد دارای فضای دستورالعمل و دادهٔ مجزا (split) است. مستلزم -m45 است.
- -munix-asm
- استفاده از نحو اسمبلر Unix.
- -mdec-asm
- استفاده از نحو اسمبلر DEC.
- -mgnu-asm
- استفاده از نحو اسمبلر GNU. این حالت پیشفرض است.
- -mlra
- استفاده از تخصیصدهندهٔ جدید ثبات LRA. بهطور پیشفرض، از تخصیصدهندهٔ قدیمی “reload” استفاده میشود.
گزینههای Picolibc
این گزینهها همگردانی و پیوند را در زمان استفاده از Picolibc کنترل میکنند:
- --oslib=library
- جستجوی کتابخانهای به نام library پس از کتابخانهٔ C، که امکان میدهد نمادهای تعریفنشده توسط کتابخانهٔ C توسط این کتابخانه تعریف شوند. کتابخانهٔ C، libgcc و این کتابخانه بین پرچمهای --start-group و --end-group قرار میگیرند تا هر یک بتوانند به نمادهای دیگری ارجاع دهند. برای بسیاری از مقاصد، Picolibc گونهای از semihost ارائه میدهد (مشخصشده با --oslib=semihost) که کارکردهای پایهای سیستمعامل را برای پشتیبانی از کنسول و ورودی/خروجی فایل هنگام اجرا در یک شبیهساز یا استفاده از یک اشکالزدای مدار-داخلی به اندازهٔ کافی فراهم میآورد.
- --crt0=[none|minimal|hosted|semihost]
- جایگزین کردن نام پیشفرض crt0.o با crt0-variant.o. گونهٔ none هیچ کد راهاندازیای ارائه نمیدهد و به شما اجازه میدهد کد خود را فراهم کنید. minimal راهاندازی اولیهٔ حافظه را انجام میدهد اما هیچ سازندهای را فراخوانی نمیکند. هنگامی که هیچ گزینهٔ -crt0 مشخص نشده باشد، کد مقداردهی اولیهٔ پیشفرض فراخوانیهایی را به همهٔ سازندهها اضافه میکند. hosted یک فراخوانی به "exit" را در زمان بازگشت از "main" اضافه میکند. semihost به یک پارامتر خط فرمانی ارائهشده از طریق رابط semihosting دسترسی پیدا کرده و آن را بر اساس فاصلهها به آرگومانها تقسیم میکند، و آرایهٔ حاصل از رشتهها را در "argc" و "argv" به "main" ارسال میکند. در برخی از مقاصد، از جمله AArch64، ARC، ARM، LoongArch، M680x0، RISC-V، SH و x86، گزینهٔ semihost همچنین استثناهای سختافزاری را به دام انداخته و اطلاعات را در کنسول چاپ میکند. توجه داشته باشید که --crt0=semihost به APIهای ارائهشده توسط --oslib=semihost وابسته است..IP --printf=[d|f|l|i|m] 4 گونهٔ "printf" را انتخاب میکند. کتابخانهٔ Picolibc پنج گونهٔ مختلف از "printf" را ارائه میدهد که همگام با کاهش اندازهٔ کد، سطوح کارایی کمتری را ارائه میکنند. مقدار d سطح پیشفرض است که انطباق کامل با C17 و POSIX.1-2024 را فراهم میکند. مقدار f همان مجموعه ویژگیها را ارائه میدهد، اما به جای مقادیر "double" از مقادیر "float" که با استفاده از ماکروی "printf_float" ارسال میشوند پشتیبانی میکند. مقدار l تمام پشتیبانی از ممیز شناور و پارامترهای مکانی POSIX را حذف میکند. مقدار i اعداد صحیح را به مقادیری که بزرگتر از "long" نیستند محدود میسازد. مقدار m پشتیبانی از بیشتر گزینههای قالببندی از جمله پهنا و دقت را حذف میکند. قالبها و آرگومانها همچنان به درستی تجزیه میشوند، اما خروجی به آن پارامترها پایبند نخواهد بود.
- --scanf=[d|f|l|i|m]
- گونهٔ "scanf" را انتخاب میکند. کتابخانهٔ Picolibc پنج گونهٔ مختلف از "scanf" را ارائه میدهد که همگام با کاهش اندازهٔ کد، سطوح کارایی کمتری را ارائه میکنند. مقدار d سطح پیشفرض است که انطباق کامل با C17 و POSIX.1-2024 را فراهم میکند. مقدار f پشتیبانی از مقادیر "double" را حذف میکند. مقدار l تمام پشتیبانی از ممیز شناور را حذف میکند. مقدار i اعداد صحیح را به مقادیری که بزرگتر از "long" نیستند محدود میسازد. مقدار m پشتیبانی از مشخصکنندههای تبدیل %[ را حذف میکند.
گزینههای PowerPC
این موارد در زیر فهرست شدهاند
گزینههای PRU
این گزینههای خط فرمان برای هدف PRU تعریف شدهاند:
- -minrt
- پیوند دادن
با حداقل
محیط زمان
اجرا (runtime). این
گزینه
میتواند
اندازهٔ
باینری
نهایی ELF را
به طور
چشمگیری
کاهش دهد،
اما برخی از
ویژگیهای
استاندارد
زمان اجرای
C حذف
میشوند.
این گزینه پشتیبانی از مقداردهندههای اولیه و سازندههای ایستا (static initializers and constructors) را غیرفعال میکند. توجه داشته باشید که کامپایلر همچنان ممکن است کدی با مقداردهندهها و سازندههای ایستا تولید کند. این بر عهدهٔ برنامهنویس است که اطمینان حاصل کند برنامهٔ مبدأ از این ویژگیها استفاده نمیکند.
کد راهاندازی حداقلی آرگومانهای "argc" و "argv" را به تابع "main" ارسال نمیکند، بنابراین تابع "main" باید به صورت "int main (void)" اعلان شود. این حالت در حال حاضر در اکثر پروژههای سفتافزار (firmware) یک قاعدهٔ معمول است.
- -mmcu=mcu
- گونهٔ
سختافزار
PRU مورد
استفاده را
مشخص
میکند. یک
فایل spec با
نام متناظر
بارگذاری
میشود که
اندازههای
ناحیهٔ
حافظه را به
پیونددهنده
ارسال کرده
و ماکروهای
C ویژهٔ
سختافزار
را تعریف
میکند.
کتابخانهٔ Newlib تنها مشخصهٔ "sim" را ارائه میدهد که برای اجرای آزمونهای رگرسیون با استفاده از شبیهساز در نظر گرفته شده است. مشخصات (specs) سختافزار واقعی را میتوان با نصب بستهٔ GnuPruMcu ("https://github.com/dinuxbg/gnuprumcu") به دست آورد.
- -mno-relax
- باعث میشود GCC گزینهٔ خط فرمان --no-relax را به جای گزینهٔ --relax به پیونددهنده ارسال کند.
- -mloop
- -mno-loop
- اجازه دادن (یا اجازه ندادن) به GCC برای استفاده از دستورالعمل LOOP.
- -mmul
- -mno-mul
- اجازه دادن (یا اجازه ندادن) به GCC برای استفاده از واحد ضربکنندهٔ PRU.
- -mfillzero
- -mno-fillzero
- اجازه دادن (یا اجازه ندادن) به GCC برای استفاده از دستورالعملهای FILL و ZERO.
- -mabi=variant
- گونهٔ ABI را برای تولید کد مشخص میکند. گزینهٔ -mabi=ti گونهٔ دستنخوردهٔ TI ABI را انتخاب میکند، در حالی که -mabi=gnu گونهای از GNU را انتخاب میکند که به شکل طبیعیتری با مفروضات خاص GCC سازگار است. تفاوتها به شرح زیر هستند:
- اندازهٔ اشارهگر تابع (Function Pointer Size)
- مقررات TI ABI مشخص میکند که اشارهگرهای تابع (کد) ۱۶ بیتی هستند، در حالی که GNU تنها از اشارهگرهای داده و کد ۳۲ بیتی پشتیبانی میکند.
- اشارهگر اختیاری مقدار بازگشتی (Optional Return Value Pointer)
- مقادیر بازگشتی تابع که بزرگتر از ۶۴ بیت هستند با استفاده از یک اشارهگر پنهان به عنوان نخستین آرگومان تابع ارسال میشوند. با این حال، TI ABI مقرر میدارد که اگر فراخواننده از مقدار بازگشتی استفاده نکند، این اشارهگر میتواند NULL باشد. در مقابل، GNU همواره یک اشارهگر معتبر برای مقدار بازگشتی ارسال کرده و انتظار آن را دارد.
- اندازهٔ ساختار حاوی فیلدهای بیتی (Size Of Struct Containing Bit-fields)
- TI ABI مقرر
میدارد که
اگر struct حاوی
فیلد بیتی
باشد،
اندازهٔ آن
با نوع فیلد
بیتی تعیین
شود. از سوی
دیگر، GNU
کمترین
تعداد
بایتهایی
را که
بتواند
فیلد بیتی
را در خود
جای دهد،
تخصیص
میدهد.
برای مثال، TI ABI برای این struct مقدار ۴ بایت رزرو میکند، در حالی که GNU یک بایت واحد را رزرو مینماید:
struct S { int i:1; }; - اندازهٔ دسترسی برای فیلدهای بیتی فرار (Access Size For Volatile Bit-fields)
- TI ABI الزامی
میکند که
به فیلدهای
بیتی فرار
(volatile) با
استفاده از
نوع آنها
دسترسی
پیدا شود.
در مقابل، GNU ABI
از
کوچکترین
نوع عدد
صحیحی که
فیلد بیتی
در آن جای
گیرد
استفاده
میکند.
برای مثال، TI ABI برای فیلد بیتی زیر نیازمند یک بارگذاری منفرد ۴ بایتی است. اما GNU یک بارگذاری ۱ بایتی تولید میکند:
struct S { volatile int i:1; };
پیادهسازی کنونی -mabi=ti در صورت شناسایی هر یک از ساختارهای کدی بالا، صرفاً یک خطای کامپایل صادر میکند. در نتیجه، کتابخانهٔ استاندارد C قابل ساخت نیست و هنگام پیوند دادن با -mabi=ti حذف میشود.
ویژگی Relaxation یک قابلیت GNU است و به دلایل ایمنی هنگام استفاده از -mabi=ti غیرفعال میشود. زنجیره ابزار TI بازنشانیها را برای دستورالعملهای QBBx منتشر نمیکند، بنابراین پیونددهندهٔ GNU نمیتواند هنگام کوتاهسازی شبهدستورالعملهای مجاور LDI32، آنها را تنظیم کند.
گزینههای RISC-V
این گزینههای خط فرمان برای هدفهای RISC-V تعریف شدهاند:
- -mbranch-cost=n
- هزینهٔ انشعابها (branches) را تقریباً به اندازهٔ n دستورالعمل تنظیم میکند.
- -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 قابل استفاده است و ABI نوع lp64e که تنها با rv64e قابل استفاده میباشد. این ABIها در حال حاضر به خوبی مشخص نشدهاند و ممکن است دستخوش تغییر شوند.
- -mfdiv
- -mno-fdiv
- استفاده کردن یا نکردن از دستورالعملهای سختافزاری تقسیم و جذر (ریشه دوم) ممیز شناور. این گزینه نیازمند افزونههای F یا D برای ثباتهای ممیز شناور است. در صورتی که معماری مشخصشده دارای این دستورالعملها باشد، حالت پیشفرض استفاده از آنها است.
- -mfence-tso
- -mno-fence-tso
- استفاده کردن یا نکردن از دستورالعمل fence.tso، که روی برخی پردازندهها (از جمله پردازندههای ساخت T-Head) پیادهسازی نشده است. اگر دستورالعمل fence.tso در دسترس نباشد، در عوض از یک fence قویتر استفاده میشود.
- -mdiv
- -mno-div
- استفاده کردن یا نکردن از دستورالعملهای سختافزاری برای تقسیم اعداد صحیح. این کار به افزونهٔ M نیاز دارد. حالت پیشفرض در صورتی که معماری مشخصشده دارای این دستورالعملها باشد، استفاده از آنهاست.
- -misa-spec=ISA-spec-string
- تعیین نسخهای از مشخصات ISA بدون امتیاز (سابقاً سطح کاربر یا User-Level) برای RISC-V که کد تولیدشده باید با آن سازگار باشد. مقادیر ممکن برای ISA-spec-string عبارتند از:
- 2.2
- تولید کد منطبق با نسخهٔ 2.2.
- 20190608
- تولید کد منطبق با نسخهٔ 20190608.
- 20191213
- تولید کد منطبق با نسخهٔ 20191213.
پیشفرض -misa-spec=20191213 است مگر اینکه GCC با گزینهٔ --with-isa-spec= برای تعیین یک نسخهٔ پیشفرض متفاوت پیکربندی شده باشد.
- -march=[ISA|Profile|Profile_ISA|processor-string]
- تولید کد
برای ISA یا
پروفایل
مشخصشدهٔ
RISC-V یا ترکیبی
از آنها
(مانند rv64im،
rvi20u64 یا rvi20u64_zbb).
نامهای
ISAها و
پروفایلها
باید با
حروف کوچک
باشند.
نمونهها
شامل rv64i، rv32g،
rv32e، rv32imaf، rva22u64 و
rva23u64 هستند.
برای ترکیب
یک پروفایل
نامگذاریشده
با
افزونههای
اختیاری RISC-V
ISA، ابتدا
پروفایل را
ذکر کنید و
سپس نام
افزونه(ها)
را با
استفاده از
یک زیرخط (underscore)
بهعنوان
جداکننده
به آن الحاق
کنید (مانند
rvi20u64_zca_zcb و rva23u64_zacas).
علاوه بر
این، مقدار
ویژهٔ help (-march=help)
برای فهرست
کردن تمام
افزونههای
پشتیبانیشده
پذیرفته
میشود.
گزینهٔ -march=unset باعث میشود کامپایلر تمام گزینههای -march=... را که پیشتر در خط فرمان آمدهاند نادیده بگیرد، و بهگونهای عمل کند که گویی این گزینه هرگز داده نشده است. این مورد برای اطمینان از اینکه معماری از گزینهٔ -mcpu گرفته شود مفید است، و در صورتی که هنگام استفاده از -march=unset هیچ گزینهٔ -mcpu مشخص نشده باشد، خطایی رخ خواهد داد.
قواعد نحوی رشتهٔ ISA به شرح زیر تعریف میشود:
- رشته باید با rv32 یا rv64 آغاز شود، و پس از آن i، e یا g بیاید، که به آن ISA پایه گفته میشود.
- بخش بعدی رشته، فهرستی از نامهای افزونه است. نامهای افزونه میتوانند به چندحرفی (مانند zba) و تکحرفی (مانند v) دستهبندی شوند. افزونههای تکحرفی میتوانند بهصورت پیاپی بیایند، اما افزونههای چندحرفی باید با زیرخط از یکدیگر جدا شوند.
- زیرخط میتواند در هر کجای پس از ISA پایه قرار بگیرد. این کار تأثیر خاصی ندارد اما برای بهبود خوانایی استفاده میشود و میتواند بهعنوان جداکننده عمل کند.
- نامهای افزونه ممکن است شامل یک شماره نسخهٔ اختیاری باشند، که از نحو <major>p<minor> یا <major> پیروی میکند (برای نمونه m2p1 یا m2).
افزونههای پشتیبانیشده در زیر فهرست شدهاند:
- نام افزونه : نسخهٔ پشتیبانیشده : توضیحات
- g
- @tab - @tab افزونهٔ پایهٔ محاسبات همهمنظوره؛ g به i، m، a، f، d، zicsr و zifencei بسط مییابد.
- e
- @tab 2.0 @tab افزونهٔ پایهٔ عدد صحیح کاهشیافته
- i
- @tab 2.0 2.1 @tab افزونهٔ پایهٔ عدد صحیح
- m
- @tab 2.0 @tab افزونهٔ ضرب و تقسیم عدد صحیح
- a
- @tab 2.0 2.1 @tab افزونهٔ اتمیک (Atomic)
- f
- @tab 2.0 2.2 @tab افزونهٔ ممیز شناور با دقت یگانه (Single-precision)
- d
- @tab 2.0 2.2 @tab افزونهٔ ممیز شناور با دقت دوگانه (Double-precision)
- c
- @tab 2.0 @tab افزونهٔ فشرده (Compressed)
- b
- @tab 1.0 @tab افزونهٔ استاندارد برای توابع دستکاری بیت
- v
- @tab 1.0 @tab افزونهٔ برداری (Vector)
- h
- @tab 1.0 @tab افزونهٔ هایپروایزر (Hypervisor)
- zic64b
- @tab 1.0 @tab اندازهٔ بلوک حافظهٔ نهان (Cache) برابر با ۶۴ بایت است
- zicbom
- @tab 1.0 @tab افزونهٔ مدیریت بلوک حافظهٔ نهان
- zicbop
- @tab 1.0 @tab افزونهٔ پیشواکشی (Prefetch) بلوک حافظهٔ نهان
- zicboz
- @tab 1.0 @tab افزونهٔ صفر کردن بلوک حافظهٔ نهان
- ziccamoa
- @tab 1.0 @tab حافظهٔ اصلی از تمام عملیات اتمیک در A پشتیبانی میکند
- ziccif
- @tab 1.0 @tab حافظهٔ اصلی از واکشی دستورالعمل با الزام اتمیک بودن پشتیبانی میکند
- zicclsm
- @tab 1.0 @tab حافظهٔ اصلی از بارگذاریها/ذخیرهسازیهای ناهمتراز پشتیبانی میکند
- ziccrse
- @tab 1.0 @tab حافظهٔ اصلی از پیشروی متوالی در دنبالههای LR/SC پشتیبانی میکند
- zicfilp
- @tab 1.0 @tab افزونهٔ پد فرود (Landing pad) یکپارچگی جریان کنترل
- zicfiss
- @tab 1.0 @tab افزونهٔ پشتهٔ سایه (Shadow stack) یکپارچگی جریان کنترل
- zicntr
- @tab 2.0 @tab افزونهٔ استاندارد برای شمارندهها و زمانسنجهای پایه
- zicond
- @tab 1.0 @tab افزونهٔ عملیات شرطی عدد صحیح
- zicsr
- @tab 2.0 @tab افزونهٔ دسترسی به ثبات کنترل و وضعیت (CSR).IP zifencei 4 @tab 2.0 @tab افزونهٔ حصار واکشی دستورالعمل
- zihintntl
- @tab 1.0 @tab افزونهٔ رهنمودهای مکانمندی غیرزمانی
- zihintpause
- @tab 2.0 @tab افزونهٔ رهنمود مکث
- zihpm
- @tab 2.0 @tab افزونهٔ استاندارد برای شمارندههای عملکرد سختافزاری
- zimop
- @tab 1.0 @tab افزونهٔ عملیاتهای ممکن (May-be-operations)
- zilsd
- @tab 1.0 @tab افزونهٔ دستورالعملهای جفت بارگذاری/ذخیره
- zmmul
- @tab 1.0 @tab افزونهٔ ضرب اعداد صحیح
- za128rs
- @tab 1.0 @tab اندازهٔ ۱۲۸ بایتی مجموعهٔ رزرو
- za64rs
- @tab 1.0 @tab اندازهٔ ۶۴ بایتی مجموعهٔ رزرو
- zaamo
- @tab 1.0 @tab افزونهٔ عملیاتهای حافظهٔ اتمی
- zabha
- @tab 1.0 @tab افزونهٔ عملیاتهای حافظهٔ اتمی بایت و نیمکلمه
- zacas
- @tab 1.0 @tab افزونهٔ دستورالعملهای مقایسه و جابهجایی اتمی (CAS)
- zalrsc
- @tab 1.0 @tab زیرمجموعهٔ بارگذاری-رزرو/ذخیرهٔ-مشروط از افزونهٔ A
- zawrs
- @tab 1.0 @tab افزونهٔ انتظار روی مجموعهٔ رزرو
- zama16b
- @tab 1.0 @tab بارگذاریها، ذخیرهها و AMOهای ناترازی که کاملاً درون یک مرز ۱۶ بایتی با تراز طبیعی قرار دارند، اتمی هستند
- zfa
- @tab 1.0 @tab افزونهٔ ممیز شناور تکمیلی
- zfbfmin
- @tab 1.0 @tab افزونهٔ حداقل پشتیبانی از BF16
- zfh
- @tab 1.0 @tab افزونهٔ ممیز شناور با دقت نیمه
- zfhmin
- @tab 1.0 @tab افزونهٔ حداقل ممیز شناور با دقت نیمه
- zfinx
- @tab 1.0 @tab افزونهٔ ممیز شناور با دقت یگانه در ثباتهای عدد صحیح
- zdinx
- @tab 1.0 @tab افزونهٔ ممیز شناور با دقت دوگانه در ثباتهای عدد صحیح
- zca
- @tab 1.0 @tab افزونهٔ دستورالعملهای فشردهٔ عدد صحیح
- zcb
- @tab 1.0 @tab افزونهٔ دستورالعملهای فشردهٔ ساده
- zcd
- @tab 1.0 @tab افزونهٔ بارگذاریها و ذخیرههای ممیز شناور فشرده با دقت دوگانه
- zce
- @tab 1.0 @tab افزونههای دستورالعمل فشرده برای پردازندههای تعبیهشده
- zcf
- @tab 1.0 @tab افزونهٔ بارگذاریها و ذخیرههای ممیز شناور فشرده با دقت یگانه
- zcmop
- @tab 1.0 @tab افزونهٔ عملیاتهای ممکن فشرده
- zcmp
- @tab 1.0 @tab افزونهٔ فشردهٔ Push/Pop
- zcmt
- @tab 1.0 @tab افزونهٔ دستورالعمل پرش جدولی
- zclsd
- @tab 1.0 @tab افزونهٔ دستورالعملهای جفت بارگذاری/ذخیرهٔ فشرده
- zba
- @tab 1.0 @tab افزونهٔ محاسبهٔ آدرس
- zbb
- @tab 1.0 @tab افزونهٔ دستکاری بیتی پایهای
- zbc
- @tab 1.0 @tab افزونهٔ ضرب بدون رقم نقلی
- zbkb
- @tab 1.0 @tab افزونهٔ دستکاری بیتی رمزنگاری
- zbkc
- @tab 1.0 @tab افزونهٔ ضرب بدون رقم نقلی رمزنگاری
- zbkx
- @tab 1.0 @tab افزونهٔ جایگشت ماتریس کلیدی (Crossbar) رمزنگاری
- zbs
- @tab 1.0 @tab افزونهٔ عملیات تکبیتی
- zk
- @tab 1.0 @tab افزونهٔ استاندارد رمزنگاری اسکالر
- zkn
- @tab 1.0 @tab افزونهٔ مجموعه الگوریتمهای NIST
- zknd
- @tab 1.0 @tab افزونهٔ رمزگشایی AES
- zkne
- @tab 1.0 @tab افزونهٔ رمزنگاری AES
- zknh
- @tab 1.0 @tab افزونهٔ تابع درهمسازی
- zkr
- @tab 1.0 @tab افزونهٔ منبع آنتروپی
- zks
- @tab 1.0 @tab افزونهٔ مجموعه الگوریتمهای ShangMi
- zksed
- @tab 1.0 @tab افزونهٔ رمز قالبی SM4.IP zksh 4 @tab 1.0 @tab افزونه تابع درهمساز SM3
- zkt
- @tab 1.0 @tab افزونه تاخیر اجرای مستقل از داده
- ztso
- @tab 1.0 @tab افزونه ترتیببندی کامل ذخیرهسازی
- zvbb
- @tab 1.0 @tab افزونه برداری دستکاری بیتی پایهای
- zvbc
- @tab 1.0 @tab افزونه برداری ضرب بدون رقم نقلی
- zve32f
- @tab 1.0 @tab افزونههای برداری برای پردازندههای تعبیهشده
- zve32x
- @tab 1.0 @tab افزونههای برداری برای پردازندههای تعبیهشده
- zve64d
- @tab 1.0 @tab افزونههای برداری برای پردازندههای تعبیهشده
- zve64f
- @tab 1.0 @tab افزونههای برداری برای پردازندههای تعبیهشده
- zve64x
- @tab 1.0 @tab افزونههای برداری برای پردازندههای تعبیهشده
- zvfbfmin
- @tab 1.0 @tab افزونه برداری تبدیلهای BF16
- zvfbfwma
- @tab 1.0 @tab افزونه برداری ضرب/جمع عریضکننده BF16
- zvfh
- @tab 1.0 @tab افزونه برداری ممیز شناور نیمدقت
- zvfhmin
- @tab 1.0 @tab افزونه برداری کمینه ممیز شناور نیمدقت
- zvkb
- @tab 1.0 @tab افزونه برداری دستکاری بیتی رمزنگاری
- zvkg
- @tab 1.0 @tab افزونه برداری GCM/GMAC
- zvkn
- @tab 1.0 @tab افزونه برداری مجموعه الگوریتمهای NIST، zvkn بسط مییابد به
- zvknc
- @tab 1.0 @tab افزونه برداری مجموعه الگوریتمهای NIST به همراه ضرب بدون رقم نقلی، zvknc
- zvkned
- @tab 1.0 @tab افزونه برداری رمز قالبی AES
- zvkng
- @tab 1.0 @tab افزونه برداری مجموعه الگوریتمهای NIST به همراه GCM، zvkng بسط مییابد
- zvknha
- @tab 1.0 @tab افزونه برداری درهمساز امن SHA-2
- zvknhb
- @tab 1.0 @tab افزونه برداری درهمساز امن SHA-2
- zvks
- @tab 1.0 @tab افزونه برداری مجموعه الگوریتمهای ShangMi، zvks بسط مییابد
- zvksc
- @tab 1.0 @tab افزونه برداری مجموعه الگوریتمهای ShangMi به همراه ضرب بدون رقم نقلی،
- zvksed
- @tab 1.0 @tab افزونه برداری رمز قالبی SM4
- zvksg
- @tab 1.0 @tab افزونه برداری مجموعه الگوریتمهای ShangMi به همراه GCM
- zvksh
- @tab 1.0 @tab افزونه برداری درهمساز امن SM3
- zvkt
- @tab 1.0 @tab افزونه برداری تاخیر اجرای مستقل از داده
- zvl1024b
- @tab 1.0 @tab افزونههای استاندارد کمینه طول بردار
- zvl128b
- @tab 1.0 @tab افزونههای استاندارد کمینه طول بردار
- zvl16384b
- @tab 1.0 @tab افزونه استاندارد کمینه طول بردار
- zvl2048b
- @tab 1.0 @tab افزونههای استاندارد کمینه طول بردار
- zvl256b
- @tab 1.0 @tab افزونههای استاندارد کمینه طول بردار
- zvl32768b
- @tab 1.0 @tab افزونه استاندارد کمینه طول بردار
- zvl32b
- @tab 1.0 @tab افزونههای استاندارد کمینه طول بردار
- zvl4096b
- @tab 1.0 @tab افزونههای استاندارد کمینه طول بردار
- zvl512b
- @tab 1.0 @tab افزونههای استاندارد کمینه طول بردار
- zvl64b
- @tab 1.0 @tab افزونههای استاندارد کمینه طول بردار
- zvl65536b
- @tab 1.0 @tab افزونه استاندارد کمینه طول بردار
- zvl8192b
- @tab 1.0 @tab افزونه استاندارد کمینه طول بردار
- zhinx
- @tab 1.0 @tab افزونه ممیز شناور نیمدقت در ثباتهای عدد صحیح
- zhinxmin
- @tab 1.0 @tab افزونه کمینه ممیز شناور نیمدقت در ثباتهای عدد صحیح
- sdtrig
- @tab 1.0 @tab افزونه محرکهای اشکالزدایی
- sha
- @tab 1.0 @tab افزونه تقویتشده هایپروایزر
- shcounterenw
- @tab 1.0 @tab پشتیبانی از فعالسازهای قابل نوشتن برای هر شمارنده پشتیبانیشده.IP shgatpa 4 @tab 1.0 @tab پشتیبانی از حالت SvNNx4 برای تمام حالتهای پشتیبانیشده توسط satp
- shlcofideleg
- @tab 1.0 @tab تفویض وقفههای LCOFI به VS-mode
- shtvala
- @tab 1.0 @tab ثبات htval تمامی مقادیر مورد نیاز را فراهم میکند
- shvstvala
- @tab 1.0 @tab ثبات vstval تمامی مقادیر مورد نیاز را فراهم میکند
- shvstvecd
- @tab 1.0 @tab ثبات vstvec از حالت مستقیم پشتیبانی میکند
- shvsatpa
- @tab 1.0 @tab ثبات vsatp از تمام حالتهای پشتیبانیشده توسط satp پشتیبانی میکند
- smaia
- @tab 1.0 @tab افزونه معماری پیشرفته وقفه
- smcntrpmf
- @tab 1.0 @tab فیلتر کردن حالت سطح دسترسی cycle و instret
- smcsrind
- @tab 1.0 @tab دسترسی غیرمستقیم به CSR در سطح Machine
- smepmp
- @tab 1.0 @tab بهبودهای PMP برای دسترسی به حافظه و جلوگیری از اجرا در حالت Machine
- smmpm
- @tab 1.0 @tab افزونه ماسکگذاری اشارهگر در حالت سرپرست
- smnpm
- @tab 1.0 @tab افزونه ماسکگذاری اشارهگر در حالت سرپرست
- smrnmi
- @tab 1.0 @tab وقفههای غیرقابلماسک با قابلیت ازسرگیری
- smstateen
- @tab 1.0 @tab افزونه فعالسازی وضعیت
- smdbltrp
- @tab 1.0 @tab افزونههای به دام انداختن دوگانه (double trap)
- ssaia
- @tab 1.0 @tab افزونه معماری پیشرفته وقفه برای حالت سرپرست
- ssccptr
- @tab 1.0 @tab پشتیبانی حافظه اصلی از خواندن جدول صفحه
- sscofpmf
- @tab 1.0 @tab افزونه سرریز شمارنده و فیلترگذاری
- sscounterenw
- @tab 1.0 @tab پشتیبانی از فعالسازهای قابل نوشتن برای هر شمارنده پشتیبانیشده
- sscsrind
- @tab 1.0 @tab دسترسی غیرمستقیم به CSR در حالت سرپرست
- ssnpm
- @tab 1.0 @tab افزونه ماسکگذاری اشارهگر در حالت سرپرست
- sspm
- @tab 1.0 @tab افزونه ماسکگذاری اشارهگر در حالت سرپرست
- ssstateen
- @tab 1.0 @tab افزونه فعالسازی وضعیت در حالت سرپرست
- sstc
- @tab 1.0 @tab افزونه وقفههای زمانسنج در حالت سرپرست
- sstvala
- @tab 1.0 @tab ثبات stval تمامی مقادیر مورد نیاز را فراهم میکند
- sstvecd
- @tab 1.0 @tab ثبات stvec از حالت مستقیم پشتیبانی میکند
- ssstrict
- @tab 1.0 @tab کدگذاریهای رزروشدهٔ پیادهسازینشده استثنای دستور غیرمجاز صادر میکنند و هیچ افزونه ناسازگاری وجود ندارد
- ssdbltrp
- @tab 1.0 @tab افزونههای به دام انداختن دوگانه (double trap)
- ssu64xl
- @tab 1.0 @tab پشتیبانی از UXLEN=64 الزامی است
- supm
- @tab 1.0 @tab افزونه ماسکگذاری اشارهگر در حالت کاربر
- svinval
- @tab 1.0 @tab افزونه باطلسازی دقیق کَش ترجمه نشانی
- svnapot
- @tab 1.0 @tab افزونه پیوستگی ترجمه NAPOT
- svpbmt
- @tab 1.0 @tab افزونه انواع حافظه مبتنی بر صفحه
- svvptc
- @tab 1.0 @tab افزونه بینیازکننده از دستورهای مدیریت حافظه پس از علامتگذاری PTEها به عنوان معتبر
- svadu
- @tab 1.0 @tab افزونه بهروزرسانی سختافزاری بیتهای A/D
- svade
- @tab 1.0 @tab ایجاد استثنا هنگامی که بهروزرسانی سختافزاری بیتهای A/D غیرفعال است
- svbare
- @tab 1.0 @tab حالت bare در satp پشتیبانی میشود
- xcvalu
- @tab 1.0 @tab افزونه متفرقه ALU برای Core-V
- xcvbi
- @tab 1.0 @tab افزونه انشعاب بیواسطه برای Core-V
- xcvelw
- @tab 1.0 @tab افزونه بارگذاری کلمه رویداد در Core-V
- xcvmac
- @tab 1.0 @tab افزونه ضرب-انباشت برای Core-V
- xcvsimd
- @tab 1.0 @tab افزونه SIMD برای Core-V
- xsfcease
- @tab 1.0 @tab افزونه دستور CEASE برای SiFive
- xsfvcp
- @tab 1.0 @tab افزونه کمکپردازنده برداری VCIX برای SiFive
- xsfvfnrclipxfqf
- @tab 1.0 @tab دستورهای برش محدودهای FP32 به int8 در SiFive.IP xsfvqmaccdod 4 @tab 1.0 @tab افزونه ضرب ماتریسی int8 شرکت SiFive
- xsfvqmaccqoq
- @tab 1.0 @tab افزونه ضرب ماتریسی int8 شرکت SiFive
- xtheadba
- @tab 1.0 @tab افزونه محاسبه آدرس T-head
- xtheadbb
- @tab 1.0 @tab افزونه دستکاری بیتی پایه T-head
- xtheadbs
- @tab 1.0 @tab افزونه دستورالعملهای تکبیتی T-head
- xtheadcmo
- @tab 1.0 @tab افزونه عملیات مدیریت حافظه نهان T-head
- xtheadcondmov
- @tab 1.0 @tab افزونه انتقال شرطی T-head
- xtheadfmemidx
- @tab 1.0 @tab افزونه عملیات حافظه نمایهشده برای ثباتهای ممیز شناور T-head
- xtheadfmv
- @tab 1.0 @tab افزونه انتقال دادههای بیتهای بالای ممیز شناور با دقت مضاعف T-head
- xtheadint
- @tab 1.0 @tab افزونه شتابدهی وقفه T-head
- xtheadmac
- @tab 1.0 @tab افزونه ضرب-انباشت (MAC) شرکت T-head
- xtheadmemidx
- @tab 1.0 @tab افزونه عملیات حافظه نمایهشده T-head
- xtheadmempair
- @tab 1.0 @tab افزونه عملیات حافظه با دو GPR شرکت T-head
- xtheadsync
- @tab 1.0 @tab افزونه همگامسازی چندهستهای T-head
- xtheadvector
- @tab 1.0 @tab افزونه برداری T-head
- xventanacondops
- @tab 1.0 @tab افزونه عملیات شرطی عدد صحیح Ventana
- xmipscmov
- @tab 1.0 @tab افزونه انتقال شرطی Mips
- xmipscbop
- @tab 1.0 @tab افزونه پیشواکشی (prefetch) شرکت Mips
- xandesperf
- @tab 5.0 @tab افزونه کارایی Andes
- xandesbfhcvt
- @tab 5.0 @tab افزونه تبدیل bfloat16 شرکت Andes
- xandesvbfhcvt
- @tab 5.0 @tab افزونه برداری تبدیل bfloat16 شرکت Andes
- xandesvsintload
- @tab 5.0 @tab افزونه بارگذاری برداری INT4 شرکت Andes
- xandesvpackfph
- @tab 5.0 @tab افزونه برداری بستهبندیشده FP16 شرکت Andes
- xandesvdot
- @tab 5.0 @tab افزونه ضرب داخلی برداری Andes
- xsmtvdot
- @tab 1.0 @tab افزونه ضرب داخلی برداری SpacemiT
هنگامی که -march= مشخص نشده باشد، GCC از تنظیمات -mcpu استفاده میکند.
اگر هیچیک از گزینههای -march و -mcpu= مشخص نشده باشند، مقدار پیشفرض این آرگومان وابسته به سیستم است؛ اگر خواهان یک افزونه معماری خاص هستید، باید آن را بهطور صریح مشخص کنید.
هنگامی که مشخصات RISC-V افزونهای را وابسته به افزونههای دیگر تعریف میکند، در صورتی که آن افزونههای وابسته بهطور صریح اضافه نشده باشند، GCC آنها را بهطور ضمنی به مجموعه افزونههای فعال اضافه میکند.
نام هسته (Core Name)
- -mcpu=processor-string
- از معماری
پردازنده
ارائهشده
استفاده
کرده و
خروجی را
برای آن، که
با نام
پردازنده
خاصی تعیین
میشود،
بهینهسازی
میکند.
مقادیر
مجاز برای
این گزینه
عبارتند از:
sifive-e20,
sifive-e21,
sifive-e24,
sifive-e31,
sifive-e34,
sifive-e76,
sifive-s21,
sifive-s51,
sifive-s54,
sifive-s76,
sifive-u54,
sifive-u74,
sifive-x280,
sifive-p450,
sifive-p670,
thead-c906,
xt-c908,
xt-c908v,
xt-c910,
xt-c910v2,
xt-c920,
xt-c920v2,
tt-ascalon-x,
tt-ascalon-d8,
xiangshan-nanhu,
xiangshan-kunminghu,
mips-p8700,
andes-n22,
andes-n25,
andes-a25,
andes-nx25,
andes-ax25,
andes-a27,
andes-ax27,
andes-n225,
andes-d23,
andes-n45,
andes-nx45,
andes-a45,
andes-ax45,
spacemit-x60.
توجه داشته باشید که -mcpu اولویتی بر -march یا -mtune ندارد و آنها را لغو نمیکند.
نام تنظیم (Tune Name).IP -mtune=processor-string 4 خروجی را برای پردازندهٔ دادهشده بهینهسازی میکند، که توسط ریزمعماری یا نام یک پردازنده (CPU) مشخص تعیین میشود. مقادیر مجاز برای این گزینه عبارتند از:
generic,
rocket,
sifive-3-series,
sifive-5-series,
sifive-7-series,
sifive-p400-series,
sifive-p600-series,
tt-ascalon-x,
tt-ascalon-d8,
thead-c906,
xt-c908,
xt-c908v,
xt-c910,
xt-c910v2,
xt-c920,
xt-c920v2,
xiangshan-nanhu,
xiangshan-kunminghu,
spacemit-x60,
generic-ooo,
size,
mips-p8700,
andes-25-series,
andes-23-series,
andes-45-series,
و تمام گزینههای معتبر برای -mcpu=.
هنگامی که -mtune= مشخص نشده باشد، GCC از تنظیمات مربوط به -mcpu استفاده میکند. اگر هیچکدام مشخص نشده باشند، پیشفرض generic است.
گزینهٔ size برای استفاده توسط کاربران نهایی در نظر گرفته نشده است. این گزینه زمانی که -Os مشخص شده باشد استفاده میشود. این مقدار اطلاعات هزینهٔ دستورالعملهای ارائهشده توسط -mtune= را لغو (override) میکند، اما اطلاعات خطلوله (pipeline) را لغو نمیکند. این امر به کاهش اندازهٔ کد در عین ارائهٔ عملکرد مناسب کمک میکند.
- -mpreferred-stack-boundary=num
- تلاش
میکند
تراز مرز
پشته (stack) را
روی مرز ۲
به توان num
بایت نگه
دارد. اگر
-mpreferred-stack-boundary مشخص
نشده باشد،
مقدار
پیشفرض ۴
(۱۶ بایت یا
۱۲۸ بیت)
است.
هشدار: در صورت استفاده از این گزینه، باید تمام پودمانها (modules)، از جمله هرگونه کتابخانهای را با همین مقدار بسازید. این امر شامل کتابخانههای سیستم و پودمانهای راهاندازی (startup) نیز میشود.
- -msmall-data-limit=n
- دادههای سراسری و ایستای کوچکتر از n بایت را در یک بخش (section) ویژه قرار میدهد (در برخی مقصدها).
- -msave-restore
- -mno-save-restore
- استفاده یا عدم استفاده از کد پیشدرآمد (prologue) و پسدرآمد (epilogue) کوچکتر اما کندتر که از فراخوانی توابع کتابخانهای استفاده میکند. پیشفرض، استفاده از پیشدرآمدها و پسدرآمدهای سریع درونخطی (inline) است.
- -mmovcc
- -mno-movcc
- تولید یا عدم تولید توالیهای کد انتقال شرطی بدون انشعاب (branchless conditional-move)، حتی برای مقصدهایی که دستورالعملهای خاصی برای عملیات شرطی ندارند. در صورت فعال بودن، در جاهایی که سودمند باشد توالیهایی از عملیاتهای ALU با استفاده از دستورالعملهای معماری پایهٔ عدد صحیح (base integer ISA) تولید میشود.
- -minline-atomics
- -mno-inline-atomics
- استفاده یا عدم استفاده از کد شبیهسازی اتمی زیرکلمهای (subword atomic) کوچکتر اما کندتر که از فراخوانی توابع libatomic استفاده میکند. پیشفرض، استفاده از عملیات اتمی زیرکلمهای سریع و درونخطی است که نیازی به libatomic ندارند.
- -minline-strlen
- -mno-inline-strlen
- تلاش کردن یا نکردن برای درونخطیسازی فراخوانیهای "strlen" در صورت امکان. درونخطیسازی تنها زمانی قابل انجام است که رشته بهدرستی تراز شده باشد و دستورالعملهای پردازش شتابیافته در دسترس باشند. پیشفرض، درونخطی کردن فراخوانیهای "strlen" است.
- -minline-strcmp
- -mno-inline-strcmp
- تلاش کردن یا نکردن برای درونخطیسازی فراخوانیهای "strcmp" در صورت امکان. درونخطیسازی تنها زمانی قابل انجام است که رشتهها بهدرستی تراز شده باشند و دستورالعملهای پردازش شتابیافته در دسترس باشند. پیشفرض، درونخطی کردن فراخوانیهای "strcmp" است.
- -minline-strncmp
- -mno-inline-strncmp
- تلاش کردن یا نکردن برای درونخطیسازی فراخوانیهای "strncmp" در صورت امکان. درونخطیسازی تنها زمانی قابل انجام است که رشتهها بهدرستی تراز شده باشند و دستورالعملهای پردازش شتابیافته در دسترس باشند. پیشفرض، درونخطی کردن فراخوانیهای "strncmp" است.
- -mstringop-strategy=strategy
- تعیین یک راهبرد مشخص برای درونخطیسازی عملیاتهای رشته و حافظه. strategy میتواند یکی از مقادیر auto، libcall، scalar یا vector باشد.
- -mshorten-memrefs
- -mno-shorten-memrefs
- تلاش کردن یا نکردن برای استفادهٔ بیشتر از دستورالعملهای فشردهٔ بارگذاری/ذخیره (load/store) با جایگزین کردن بارگذاری/ذخیرهٔ 'ثبات پایه + آفست بزرگ' با یک بارگذاری/ذخیرهٔ جدید از 'پایه جدید + آفست کوچک'. اگر پایهٔ جدید در یک ثبات فشرده ذخیره شود، بارگذاری/ذخیرهٔ جدید میتواند فشرده گردد. در حال حاضر تنها بارگذاری/ذخیرهٔ اعداد صحیح ۳۲-بیتی را هدف قرار میدهد.
- -mstrict-align
- -mno-strict-align
- عدم تولید یا تولید دسترسیهای غیرتراز به حافظه. پیشفرض بر این اساس تنظیم میشود که آیا پردازندهای که برای آن بهینهسازی میکنیم از دسترسی سریع غیرتراز پشتیبانی میکند یا خیر.
- -mscalar-strict-align
- -mno-scalar-strict-align
- عدم تولید یا تولید دسترسیهای غیرتراز به حافظه. مقدار پیشفرض بسته به اینکه پردازندهای که برای آن بهینهسازی میکنیم از دسترسی سریع غیرتراز پشتیبانی میکند یا خیر، تنظیم میشود. این گزینه یک نام مستعار برای -mstrict-align است.
- -mvector-strict-align
- -mno-vector-strict-align
- عدم تولید یا تولید دسترسیهای برداری غیرتراز به حافظه. پیشفرض روی غیرفعال (off) تنظیم شده است مگر اینکه پردازندهای که برای آن بهینهسازی میکنیم صراحتاً از دسترسی حافظهٔ برداری با عناصر غیرتراز (element-misaligned) پشتیبانی کند.
- -mmax-vectorization
- -mno-max-vectorization
- فعال یا غیرفعال کردن بازنویسیِ (override) مدل هزینه بردارساز بهگونهای که بردارسازی همیشه سودمند به نظر برسد. بر خلاف -fno-vect-cost-model یا -fvect-cost-model=unlimited این گزینه مقایسه هزینه بین حالتهای برداری مختلف را خاموش نمیکند.
- -mcmodel=medlow
- تولید کد برای مدل کد medium-low. برنامه و نمادهای ایستا تعریفشده آن باید درون یک محدوده آدرس ۲ گیبیبایتی (2 GiB) واحد قرار گیرند و باید بین آدرسهای مطلق -2 GiB و +2 GiB باشند. برنامهها میتوانند بهصورت ایستا یا پویا پیوند داده شوند. این مدل کد پیشفرض است مگر اینکه GCC با --with-cmodel= که یک مدل کد پیشفرض متفاوت را تعیین میکند، پیکربندی شده باشد.
- -mcmodel=medany
- تولید کد
برای مدل کد
medium-any. برنامه و
نمادهای
ایستا
تعریفشده
آن باید
درون هر
محدوده
آدرس ۲
گیبیبایتی
(2 GiB) واحد قرار
گیرند.
برنامهها
میتوانند
بهصورت
ایستا یا
پویا پیوند
داده شوند.
کد تولیدشده توسط مدل کد medium-any مستقل از موقعیت (position-independent) است، اما تضمین نمیشود هنگام پیوند در برنامههای اجرایی یا کتابخانههای مستقل از موقعیت بهدرستی کار کند.
- -mcmodel=large
- تولید کد برای یک مدل کد بزرگ (large)، که هیچ محدودیتی روی اندازه یا جایگذاری نمادها ندارد.
- -mexplicit-relocs
- -mno-explicit-relocs
- استفاده یا عدم استفاده از عملگرهای بازنشانی (relocation) اسمبلر هنگام کار با آدرسهای نمادین. راهحل جایگزین، استفاده از ماکروهای اسمبلر است که ممکن است بهینهسازی را محدود کند.
- -mrelax
- -mno-relax
- بهرهگیری از تعدیلهای پیونددهنده (linker relaxations) برای کاهش تعداد دستورالعملهای مورد نیاز جهت تحقق آدرسهای نماد. حالت پیشفرض، بهرهگیری از تعدیلهای پیونددهنده است.
- -mriscv-attribute
- -mno-riscv-attribute
- تولید کردن (یا تولید نکردن) صفت RISC-V برای ثبت اطلاعات اضافی درون اشیاء ELF. این ویژگی دستکم به binutils نسخه 2.32 نیاز دارد.
- -mcsr-check
- -mno-csr-check
- بررسی CSR را فعال یا غیرفعال میکند.
- -momit-leaf-frame-pointer
- اشارهگر چارچوب (frame pointer) را در یک ثبات برای توابع برگ (leaf functions) نگه نمیدارد. این کار از دستورالعملهای ذخیره، برپاسازی و بازیابی اشارهگرهای چارچوب جلوگیری کرده و یک ثبات اضافی را در توابع برگ در دسترس قرار میدهد.
- -malign-data=type
- کنترل نحوه همترازی متغیرها و ثابتهای از نوع آرایه، ساختار (structure) یا اجتماع (union) توسط GCC. مقادیر پشتیبانیشده برای type عبارتند از xlen که از پهنای ثبات x بهعنوان مقدار همترازی استفاده میکند، و natural که از همترازی طبیعی بهره میبرد. حالت پیشفرض xlen است.
- -mbig-endian
- تولید کد بزرگپایان (big-endian). این گزینه در حالتی که GCC برای یک هدف riscv64be-*-* یا riscv32be-*-* پیکربندی شده باشد، پیشفرض است. پشتیبانی از big-endian در RISC-V آزمایشی است. رابط ABI هنوز پایدار نیست و ممکن است در نسخههای آینده دستخوش تغییرات ناسازگار شود.
- -mlittle-endian
- تولید کد کوچکپایان (little-endian). این گزینه در حالتی که GCC برای یک هدف riscv64-*-* یا riscv32-*-* (و نه برای یک هدف riscv64be-*-* یا riscv32be-*-*) پیکربندی شده باشد، پیشفرض است.
- -mstack-protector-guard=guard
- -mstack-protector-guard-reg=reg
- -mstack-protector-guard-offset=offset
- تولید کد
محافظت از
پشته با
استفاده از
قناری (canary) در
guard.
مکانهای
پشتیبانیشده
عبارتند از
global برای یک
قناری
سراسری یا
tls برای
قناری به
ازای هر
رشته (per-thread) در
بلوک TLS.
با انتخاب دوم، گزینههای -mstack-protector-guard-reg=reg و -mstack-protector-guard-offset=offset علاوهبراین مشخص میکنند که کدام ثبات بهعنوان ثبات پایه برای خواندن قناری، و از چه آفستی نسبت به آن ثبات پایه استفاده شود. هیچ ثبات یا آفست پیشفرضی وجود ندارد چرا که این قابلیت منحصراً برای استفاده در هسته لینوکس در نظر گرفته شده است.
- -mtls-dialect=desc
- استفاده از توصیفکنندههای TLS بهعنوان سازوکار فضای ذخیرهسازی محلی رشته (thread-local storage) برای دسترسیهای پویای متغیرهای TLS.
- -mtls-dialect=trad
- استفاده از TLS سنتی بهعنوان سازوکار فضای ذخیرهسازی محلی رشته برای دسترسیهای پویای متغیرهای TLS. این گزینه پیشفرض است.
- -mrvv-vector-bits=value
- مشخص میکند که تعداد بیتها برای یک ثبات برداری RVV، که از گزینه -march= گرفته شده است، چگونه تفسیر شود. پارامتر value بهصورت یک کلیدواژه رشتهای مشخص میشود و میتواند یکی از scalable یا zvl باشد. پیشفرض scalable است که به GCC میگوید عدد را بهعنوان حداقل تفسیر کند، در حالی که zvl به GCC میگوید دقیقاً از همان تعداد بیتهای مشخصشده استفاده نماید.
- -mrvv-max-lmul=value
- این گزینه امکان کنترل صریح بر حداکثر ضریب طول (LMUL) مورد استفاده هنگام تولید کد برای افزونههای برداری RISC-V (RVV) را فراهم میکند. پارامتر value بهصورت یک کلیدواژه رشتهای مشخص میشود و میتواند یکی از m1، m2، m4، m8 یا dynamic باشد. مقدار پیشفرض برای سازگاری با سختافزارهای موجود که از سایر گزینهها پشتیبانی نمیکنند، m1 است.
- -madjust-lmul-cost
- -mno-adjust-lmul-cost
- این گزینه مدل هزینه مورد استفاده برای زمانبندی دستورالعملهای برداری را بهگونهای تنظیم میکند که زمان تأخیر (latency) دستورالعملها را در ضریب طول RVV، یعنی LMUL، ضرب کند. این گزینه بهطور پیشفرض غیرفعال است.
- -mautovec-segment
- -mno-autovec-segment
- فعال یا غیرفعال کردن تولید دستورالعملهای بارگذاری/ذخیره قطعه برداری (vector segment load/store). این گزینه بهطور پیشفرض فعال است.
گزینههای RL78
- -msim
- پیوند دادن کتابخانههای هدف اضافی جهت پشتیبانی از اجرا در یک شبیهساز.
- -mmul=none
- -mmul=g10
- -mmul=g13
- -mmul=g14
- -mmul=rl78
- نوع
پشتیبانی
سختافزاری
از ضرب و
تقسیم را
برای
استفاده
مشخص
میکند.
سادهترین
حالت "none"
است که از
نرمافزار
برای هر دو
عمل ضرب و
تقسیم
استفاده
میکند. این
حالت
پیشفرض
است. مقدار
"g13" برای
قطعه جانبی
ضرب/تقسیم
سختافزاری
موجود روی
اهداف RL78/G13
(هسته S2) است.
مقدار
"g14"
استفاده از
دستورالعملهای
ضرب و تقسیم
پشتیبانیشده
توسط قطعات
RL78/G14 (هسته S3) را
انتخاب
میکند.
مقدار
"rl78" نام
مستعاری
برای "g14"
و مقدار
"mg10" نام
مستعاری
برای "none"
است.
علاوهبراین، بر پایه تنظیم این گزینه، یک ماکروی پیشپردازنده C تعریف میشود. مقادیر ممکن عبارتند از: "__RL78_MUL_NONE__"، "__RL78_MUL_G13__" یا "__RL78_MUL_G14__".
- -mcpu=g10
- -mcpu=g13
- -mcpu=rl78
- هسته RL78 مورد
نظر را مشخص
میکند.
پیشفرض
هسته G14 است
که با نام
هسته S3 یا
صرفاً RL78 نیز
شناخته
میشود.
هسته G13 یا S2
فاقد
دستورالعملهای
ضرب یا
تقسیم است و
در عوض برای
این
عملیاتها
از یک جانبی
سختافزاری
استفاده
میکند.
هسته G10 یا S1
بانکهای
ثبات
ندارد،
بنابراین
از یک
قرارداد
فراخوانی
متفاوت
استفاده
میکند.
اگر این گزینه تنظیم شود، نوع پشتیبانی ضرب سختافزاری مورد استفاده را نیز انتخاب میکند، مگر اینکه با یک گزینه صریح -mmul=none در خط فرمان لغو شود. بنابراین، مشخص کردن -mcpu=g13 استفاده از جانبی سختافزاری ضرب G13 را فعال میکند و مشخص کردن -mcpu=g10 استفاده از ضربهای سختافزاری را بهطور کامل غیرفعال میسازد.
توجه داشته باشید اگرچه هسته RL78/G14 هدف پیشفرض است، مشخص کردن -mcpu=g14 یا -mcpu=rl78 در خط فرمان، رفتار زنجیره ابزار را تغییر میدهد چرا که پشتیبانی ضرب سختافزاری G14 را نیز فعال میکند. اگر این گزینهها در خط فرمان مشخص نشوند، حتی در صورتی که کد هسته RL78 را هدف قرار داده باشد، روالهای ضرب نرمافزاری استفاده خواهند شد. این امر برای سازگاری رو به عقب با زنجیره ابزارهای قدیمیتری است که فاقد پشتیبانی از ضرب و تقسیم سختافزاری بودند.
علاوه بر این، یک ماکروی پیشپردازنده C بر اساس تنظیمات این گزینه تعریف میشود. مقادیر ممکن عبارتند از: "__RL78_G10__"، "__RL78_G13__" یا "__RL78_G14__".
- -mg10
- -mg13
- -mg14
- -mrl78
- اینها نامهای مستعار برای گزینه متناظر -mcpu= هستند. این موارد برای سازگاری رو به عقب ارائه شدهاند.
- -mallregs
- به کامپایلر اجازه میدهد از تمام ثباتهای در دسترس استفاده کند. بهطور پیشفرض ثباتهای "r24..r31" برای استفاده در گردانندههای وقفه رزرو شدهاند. با فعال بودن این گزینه، این ثباتها میتوانند در توابع عادی نیز استفاده شوند.
- -mrelax
- -mno-relax
- فعال/غیرفعال کردن بازآرایی (relaxation) اسمبلر و پیونددهنده. این گزینه بهطور پیشفرض در -Os فعال است.
- -mes0
- فرض میکند مقدار "ES" در سراسر اجرای برنامه صفر است، و از آن برای آدرسدهی دادههای فقطخواندنی استفاده میکند.
- -msave-mduc-in-interrupts
- -mno-save-mduc-in-interrupts
- مشخص میکند که توابع گرداننده وقفه باید ثباتهای MDUC را حفظ کنند. این تنها در صورتی لازم است که کد عادی ممکن باشد از ثباتهای MDUC استفاده کند، برای مثال به این دلیل که عملیات ضرب و تقسیم انجام میدهد. پیشفرض، نادیده گرفتن ثباتهای MDUC است زیرا این امر گردانندههای وقفه را سریعتر میکند. برای اینکه این ویژگی کار کند، باید گزینه هدف -mg13 ارسال شود، چرا که این قابلیت تنها روی هدف G13 (هسته S2) موجود است. ثباتهای MDUC تنها در صورتی ذخیره میشوند که گرداننده وقفه عملیات ضرب یا تقسیم انجام دهد یا تابع دیگری را فراخوانی کند.
گزینههای IBM RS/6000 و PowerPC
این گزینههای -m برای IBM RS/6000 و PowerPC تعریف شدهاند:
- -mcpu=cpu_type
- نوع
معماری،
نحوه
استفاده از
ثباتها و
پارامترهای
زمانبندی
دستورالعمل
را برای نوع
ماشین cpu_type
تنظیم
میکند.
مقادیر
پشتیبانیشده
برای cpu_type
عبارتند از:
401، 403، 405،
405fp، 440، 440fp،
464، 464fp، 476،
476fp، 505، 601،
602، 603، 603e،
604، 604e، 620،
630، 740، 7400،
7450، 750، 801،
821، 823، 860،
970، 8540، a2،
e300c2، e300c3، e500mc،
e500mc64، e5500، e6500،
ec603e، G3، G4،
G5، titan، power3،
power4، power5، power5+،
power6، power6x، power7،
power8، power9، power10،
power11، future، powerpc،
powerpc64، powerpc64le، rs64 و
native.
گزینههای -mcpu=powerpc، -mcpu=powerpc64 و -mcpu=powerpc64le نوع ماشینهای معماری PowerPC ۳۲-بیتی خالص (با هر دو نوع ترتیب بایت)، PowerPC ۶۴-بیتی big endian و PowerPC ۶۴-بیتی little endian را مشخص میکنند، که در آنها یک مدل پردازنده عمومی و مناسب برای اهداف زمانبندی فرض میشود.
مشخص کردن native به عنوان نوع پردازنده، گزینه معماری متناظر با پردازنده میزبان سیستمی را که کامپایل را انجام میدهد شناسایی و انتخاب میکند. اگر GCC پردازنده را شناسایی نکند، -mcpu=native هیچ تأثیری ندارد.
گزینههای دیگر یک پردازنده خاص را مشخص میکنند. کدی که تحت این گزینهها تولید میشود بهترین اجرا را روی آن پردازنده دارد، و ممکن است روی پردازندههای دیگر اصلاً اجرا نشود.
گزینههای -mcpu گزینههای زیر را بهطور خودکار فعال یا غیرفعال میکنند:
-maltivec -mfprnd -mhard-float -mmfcrf -mmultiple -mpopcntb -mpopcntd -mpowerpc64 -mpowerpc-gpopt -mpowerpc-gfxopt -mmulhw -mdlmzb -mmfpgpr -mvsx -mcrypto -mhtm -mpower8-fusion -mquad-memory -mquad-memory-atomic -mfloat128 -mfloat128-hardware -mprefixed -mpcrel -mmma -mdense-math -mrop-protect
گزینههای خاص تنظیمشده برای هر CPU بین نسخههای مختلف کامپایلر تفاوت دارد، که به تنظیماتی بستگی دارد که به نظر میرسد کدی بهینه برای آن پردازنده تولید میکند؛ این لزوماً بازتابدهنده قابلیتهای واقعی سختافزار نیست. اگر مایلید گزینهای مجزا را روی مقداری مشخص تنظیم کنید، میتوانید آن را پس از گزینه -mcpu مشخص کنید، مانند -mcpu=970 -mno-altivec.
در AIX، در حال حاضر گزینههای -maltivec و -mpowerpc64 توسط گزینه -mcpu فعال یا غیرفعال نمیشوند چرا که AIX پشتیبانی کاملی از این گزینهها ندارد. با این حال اگر مطمئن هستید که در محیط شما کار خواهند کرد، همچنان میتوانید آنها را بهصورت جداگانه فعال یا غیرفعال کنید.
در موارد دیگر، توصیه میکنیم به جای گزینههایی که تولید دستورالعملهای خاص را کنترل میکنند، از گزینه -mcpu=cpu_type استفاده کنید.
- -mtune=cpu_type
- پارامترهای زمانبندی دستورالعمل را برای نوع ماشین cpu_type تنظیم میکند، اما برخلاف -mcpu=cpu_type نوع معماری یا استفاده از ثباتها را تغییر نمیدهد. همان مقادیر cpu_type که برای -mcpu به کار میروند، برای -mtune نیز استفاده میشوند. اگر هر دو مشخص شوند، کد تولیدشده از معماری و ثباتهای تعیینشده توسط -mcpu استفاده میکند، اما پارامترهای زمانبندی تعیینشده توسط -mtune را به کار میگیرد.
- -mpowerpc64
- -mno-powerpc64
- گزینه -mpowerpc64 به GCC اجازه میدهد دستورالعملهای ۶۴-بیتی اضافی را که در معماری کامل PowerPC64 وجود دارند تولید کرده و با ثباتهای GPR به عنوان مقادیر ۶۴-بیتی doubleword رفتار کند. پیشفرض GCC گزینه -mno-powerpc64 است.
- -mcmodel=small
- تولید کد PowerPC64 برای مدل کوچک (small): جدول TOC به 64k محدود است.
- -mcmodel=medium
- تولید کد PowerPC64 برای مدل متوسط (medium): جدول TOC و سایر دادههای ایستا میتوانند تا مجموعاً اندازه 4G باشند. این حالت پیشفرض برای لینوکس ۶۴-بیتی است.
- -mcmodel=large
- تولید کد PowerPC64 برای مدل بزرگ (large): جدول TOC میتواند تا اندازه 4G باشد. سایر دادهها و کد تنها توسط فضای آدرس ۶۴-بیتی محدود میشوند.
- -mprofile-kernel
- این گزینه در اهداف PowerPC64 GNU/Linux موجود است. در صورت استفاده با -pg، باعث میشود فراخوانیهای "mcount" به جای بعد از مقدمه تابع، قبل از آن درج شوند.
- -maltivec
- -mno-altivec
- کدی تولید
میکند که
از
دستورالعملهای
AltiVec استفاده
میکند
(استفاده
نمیکند)، و
همچنین
استفاده از
توابع
توکار (built-in) را
فعال
میکند که
دسترسی
مستقیمتر
به مجموعه
دستورالعملهای
AltiVec را
امکانپذیر
میسازند.
ممکن است
برای تطبیق
ABI فعلی با
بهبودهای ABI
مربوط به AltiVec،
به تنظیم
-mabi=altivec نیز
نیاز داشته
باشید.
هنگامی که -maltivec استفاده میشود، ترتیب عناصر برای توابع درونی AltiVec مانند "vec_splat"، "vec_extract" و "vec_insert" با ترتیب عناصر آرایه متناسب با ترتیب بایتها (endianness) در مقصد مطابقت دارد. بدین معنا که هنگام هدفگیری بسترهای big-endian، عنصر صفر نشاندهنده چپترین عنصر در یک ثبات برداری است و هنگام هدفگیری بسترهای little-endian، نشاندهنده راستترین عنصر در یک ثبات برداری خواهد بود.
- -mpowerpc-gpopt
- -mno-powerpc-gpopt
- مشخص کردن -mpowerpc-gpopt به GCC اجازه میدهد از دستورالعملهای اختیاری معماری PowerPC در گروه کاربرد عمومی (General Purpose)، شامل جذر ممیز شناور، استفاده کند. مشخص کردن
- -mpowerpc-gfxopt
- -mno-powerpc-gfxopt
- -mpowerpc-gfxopt به GCC اجازه میدهد از دستورالعملهای اختیاری معماری PowerPC در گروه گرافیک (Graphics)، شامل انتخاب ممیز شناور (floating-point select)، استفاده کند.
- -mmfcrf
- -mno-mfcrf
- گزینهٔ -mmfcrf به GCC اجازه میدهد دستورالعمل انتقال از فیلد ثبات شرطی (move from condition register field) را که روی پردازندهٔ POWER4 و دیگر پردازندههای پشتیبانیکننده از معماری PowerPC V2.01 پیادهسازی شده است، تولید کند.
- -mpopcntb
- -mno-popcntb
- گزینهٔ -mpopcntb به GCC اجازه میدهد دستورالعملهای popcount و تخمین معکوس ممیز شناور با دقت مضاعف را که روی پردازندهٔ POWER5 و دیگر پردازندههای پشتیبانیکننده از معماری PowerPC V2.02 پیادهسازی شده است، تولید کند.
- -mpopcntd
- -mno-popcntd
- گزینهٔ -mpopcntd به GCC اجازه میدهد دستورالعمل popcount پیادهسازیشده روی پردازندهٔ POWER7 و دیگر پردازندههای پشتیبانیکننده از معماری PowerPC V2.06 را تولید کند.
- -mfprnd
- -mno-fprnd
- گزینهٔ -mfprnd به GCC اجازه میدهد دستورالعملهای گرد کردن ممیز شناور به عدد صحیح را که روی پردازندهٔ +POWER5 و دیگر پردازندههای پشتیبانیکننده از معماری PowerPC V2.03 پیادهسازی شده است، تولید کند.
- -mcmpb
- -mno-cmpb
- گزینهٔ -mcmpb به GCC اجازه میدهد دستورالعمل مقایسهٔ بایتها را که روی پردازندهٔ POWER6 و دیگر پردازندههای پشتیبانیکننده از معماری PowerPC V2.05 پیادهسازی شده است، تولید کند.
- -mhard-dfp
- -mno-hard-dfp
- گزینهٔ -mhard-dfp به GCC اجازه میدهد دستورالعملهای ممیز شناور دهدهی (decimal floating-point) را که روی برخی پردازندههای POWER پیادهسازی شده است، تولید کند.
- -mvrsave
- -mno-vrsave
- هنگام تولید کد AltiVec، دستورالعملهای VRSAVE را تولید میکند.
- -msecure-plt
- کدی تولید میکند که به ld و ld.so امکان میدهد فایلهای اجرایی و کتابخانههای اشتراکی را با بخشهای غیرقابلاجرای ".plt" و ".got" بسازند. این یک گزینهٔ PowerPC برای SYSV ABI ۳۲ بیتی است.
- -mbss-plt
- کدی تولید میکند که از بخش BSS ".plt" که توسط ld.so پر میشود استفاده کرده و نیازمند بخشهای ".plt" و ".got" است که هم قابل نوشتن و هم قابل اجرا باشند. این یک گزینهٔ PowerPC برای SYSV ABI ۳۲ بیتی است.
- -msplit-patch-nops
- هنگام افزودن NOPها برای یک ناحیهٔ قابل وصلهزنی از طریق گزینهٔ -fpatchable-function-entry، دستورات NOP «قبل» را پیش از نقطهٔ ورود سراسری و NOPهای «بعد» را پس از نقطهٔ ورود محلی درج میکند. این امر موجب میشود در زمان تولید نقطهٔ ورود سراسری، توالی 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 نیازمند استفاده از حالت ۶۴ بیتی است.
- -mquad-memory-atomic
- -mno-quad-memory-atomic
- کدی تولید میکند که از دستورالعملهای اتمیک حافظه برای کلمهٔ چهارتایی (quad word) استفاده میکند (استفاده نمیکند). گزینهٔ -mquad-memory-atomic نیازمند استفاده از حالت ۶۴ بیتی است..IP -mfloat128 4
- -mno-float128
- فعال/غیرفعال
کردن کلمه
کلیدی __float128
برای ممیز
شناور ۱۲۸
بیتی IEEE و
استفاده از
شبیهسازی
نرمافزاری
یا
دستورالعملهای
سختافزاری
برای ممیز
شناور ۱۲۸
بیتی IEEE.
مجموعه دستورالعمل VSX (-mvsx) برای استفاده از پشتیبانی ممیز شناور ۱۲۸ بیتی IEEE باید فعال باشد. ممیز شناور ۱۲۸ بیتی IEEE فقط روی Linux پشتیبانی میشود.
مقدار پیشفرض برای -mfloat128 در سیستمهای PowerPC Linux با مجموعه دستورالعمل VSX فعال و در سایر سیستمها غیرفعال است.
اگر از مجموعه دستورالعمل ISA 3.0 (-mcpu=power9) روی یک سیستم ۶۴ بیتی استفاده کنید، پشتیبانی ممیز شناور ۱۲۸ بیتی IEEE همچنین تولید دستورالعملهای سختافزاری ممیز شناور ۱۲۸ بیتی IEEE مربوط به ISA 3.0 را فعال میکند. در غیر این صورت، اگر تولید دستورالعملهای ISA 3.0 را مشخص نکنید یا یک سیستم ۳۲ بیتی big-endian را هدف قرار دهید، ممیز شناور ۱۲۸ بیتی IEEE با شبیهسازی نرمافزاری مدیریت میشود.
- -mfloat128-hardware
- -mno-float128-hardware
- فعال/غیرفعال
کردن
استفاده از
دستورالعملهای
سختافزاری
ISA 3.0 برای
پشتیبانی
از نوع
دادهی __float128.
مقدار پیشفرض برای -mfloat128-hardware در سیستمهای PowerPC Linux که از مجموعه دستورالعمل ISA 3.0 استفاده میکنند فعال و در سایر سیستمها غیرفعال است.
- -m32
- -m64
- تولید کد برای محیطهای ۳۲ بیتی یا ۶۴ بیتی مقصدهای Darwin و SVR4 (شامل GNU/Linux). محیط ۳۲ بیتی مقادیر int، long و اشارهگر (pointer) را ۳۲ بیت تنظیم میکند و کدی تولید میکند که روی هر گونهای از PowerPC اجرا میشود. محیط ۶۴ بیتی مقدار int را ۳۲ بیت و long و اشارهگر را ۶۴ بیت تنظیم کرده و مشابه -mpowerpc64 برای PowerPC64 کد تولید میکند.
- -mfull-toc
- -mno-fp-in-toc
- -mno-sum-in-toc
- -mminimal-toc
- تغییر
نحوهی
ایجاد جدول
محتویات یا
TOC (Table Of Contents)، که
برای هر
فایل
اجرایی
ایجاد
میشود.
گزینه -mfull-toc
بهطور
پیشفرض
انتخاب شده
است. در این
حالت، GCC
دستکم یک
مدخل TOC برای
هر ارجاع
یکتای
متغیرهای
غیرخودکار
در برنامه
تخصیص
میدهد. GCC
همچنین
مقادیر
ثابت ممیز
شناور را در
TOC قرار
میدهد. با
این حال،
تنها
۱۶٬۳۸۴
مدخل در TOC
موجود است.
اگر پیام خطایی از پیونددهنده دریافت کردید مبنی بر اینکه فضای در دسترس TOC سرریز شده است، میتوانید با گزینههای -mno-fp-in-toc و -mno-sum-in-toc میزان فضای مصرفی TOC را کاهش دهید. گزینه -mno-fp-in-toc مانع از قرار دادن مقادیر ثابت ممیز شناور در TOC توسط GCC میشود و -mno-sum-in-toc باعث میشود GCC بهجای قرار دادن حاصلجمع یک آدرس و یک مقدار ثابت در TOC، کدی تولید کند که این مجموع را در زمان اجرا محاسبه کند. میتوانید یک یا هر دوی این گزینهها را مشخص کنید. هر یک از آنها به بهای صرفهجویی در فضای TOC، موجب تولید کدی اندکی کندتر و حجیمتر توسط GCC میشود.
اگر حتی با مشخص کردن هر دوی این گزینهها فضای TOC کم آمد، بهجای آنها -mminimal-toc را مشخص کنید. این گزینه موجب میشود GCC تنها یک مدخل TOC برای هر فایل ایجاد کند. با تعیین این گزینه، GCC کدی کندتر و حجیمتر تولید میکند که مصرف فضای TOC در آن فوقالعاده اندک است. ممکن است ترجیح دهید از این گزینه تنها روی فایلهایی استفاده کنید که کدهای با بسامد اجرای کمتر دارند.
- -maix64
- -maix32
- فعالسازی ABI و قرارداد فراخوانی ۶۴ بیتی AIX: اشارهگرهای ۶۴ بیتی، نوع ۶۴ بیتی "long" و زیرساخت مورد نیاز برای پشتیبانی از آنها. مشخص کردن -maix64 متضمن -mpowerpc64 است، در حالی که -maix32 رابط ۶۴ بیتی ABI را غیرفعال کرده و متضمن -mno-powerpc64 است. پیشفرض GCC گزینه -maix32 است.
- -mxl-compat
- -mno-xl-compat
- تولید کدی
که هنگام
استفاده از
ABI سازگار با
AIX، تطابق
بیشتری با
معناشناسی
کامپایلر IBM XL
داشته باشد.
آرگومانهای
ممیز شناور
توابعی که
دارای
اعلان
الگوی
اولیه (prototype)
هستند را
علاوه بر
ثباتهای FPR
مخصوص
آرگومان،
روی پشته و
فراتر از
ناحیه
ذخیره ثبات
(RSA) ارسال
میکند.
هنگام
مقایسه
مقادیر و
تبدیل به double،
فرض
نمیکند که
باارزشترین
double در مقدار
۱۲۸ بیتی long double
بهدرستی
گرد شده
است. همچنین
از نامهای
نماد XL برای
روالهای
پشتیبانی long
double استفاده
میکند.
قرارداد فراخوانی AIX گسترش داده شده بود اما در ابتدا مستند نشده بود تا حالت نامتعارفی از K&R C را مدیریت کند؛ حالتی که در آن تابعی که آدرس آرگومانهای خود را میگیرد، با آرگومانهای کمتری نسبت به تعریفش فراخوانی میشود. کامپایلرهای IBM XL زمانی که یک زیرروال بدون بهینهسازی کامپایل شود، به آرگومانهای ممیز شناوری که در RSA جا نمیشوند از طریق پشته دسترسی پیدا میکنند. از آنجا که ذخیرهسازی همیشگی آرگومانهای ممیز شناور روی پشته ناکارآمد است و بهندرت نیاز میشود، این گزینه بهطور پیشفرض فعال نیست و تنها هنگام فراخوانی زیرروالهایی که توسط کامپایلرهای IBM XL بدون بهینهسازی کامپایل شدهاند لازم خواهد بود.
- -mpe
- پشتیبانی از IBM RS/6000 SP Parallel Environment (PE). پیوند دادن برنامهای که برای استفاده از تبادل پیام نوشته شده است با کد راهاندازی ویژه جهت فعالسازی اجرای برنامه. سیستم باید PE را در مسیر استاندارد (/usr/lpp/ppe.poe/) نصب داشته باشد، یا فایل specs باید با گزینه -specs= جایگزین شود تا مسیر پوشه مناسب تعیین گردد. محیط Parallel Environment از رشتهها (threads) پشتیبانی نمیکند، بنابراین گزینه -mpe و گزینه -pthread ناسازگار هستند.
- -malign-natural
- -malign-power
- در AIX، نگارش
۳۲ بیتی Darwin و
نگارش ۶۴
بیتی PowerPC GNU/Linux،
گزینه -malign-natural
همترازی
تعریفشده
در ABI برای
انواع داده
بزرگتر،
مانند doubleهای
ممیز شناور
را بر مبنای
مرز اندازه
طبیعی
آنها
نادیده
میگیرد (override).
گزینه -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 روی سیستمهای PowerPC با ترتیب little-endian استفاده نکنید، زیرا این دستورالعملها در شرایطی که پردازنده در حالت little-endian است کار نمیکنند. موارد استثنا PPC740 و PPC750 هستند که این دستورالعملها را در حالت little-endian مجاز میدانند.
- -mupdate
- -mno-update
- تولید کدی که از دستورالعملهای بارگذاری یا ذخیرهای استفاده میکند (نمیکند) که ثبات پایه را به آدرس مکان حافظه محاسبهشده بهروز میکنند. این دستورالعملها بهطور پیشفرض تولید میشوند. اگر از -mno-update استفاده کنید، بازه زمانی کوتاهی میان زمان بهروزرسانی اشارهگر پشته و ذخیره آدرس چارچوب قبلی وجود خواهد داشت؛ به این معنا که کدی که در جریان وقفهها یا سیگنالها چارچوب پشته را میپیماید، ممکن است با دادههای مخدوش مواجه شود.
- -mavoid-indexed-addresses
- -mno-avoid-indexed-addresses
- تولید کدی که تلاش میکند از استفاده از دستورالعملهای بارگذاری یا ذخیره نمایهشده اجتناب کند (اجتناب نکند). این دستورالعملها میتوانند در پردازندههای Power6 در شرایط خاصی باعث کاهش کارایی شوند، مانند زمانی که در آرایههای بزرگی گام برداشته میشود که از یک مرز 16M عبور میکنند. این گزینه هنگام هدفگیری Power6 بهطور پیشفرض فعال است و در غیر این صورت غیرفعال خواهد بود..IP -mfused-madd 4
- -mno-fused-madd
- تولید کدی که از دستورالعملهای ضرب و جمع ممیز شناور (فلوتینگ پوینت) استفاده کند (استفاده نکند). در صورت استفاده از ممیز شناور سختافزاری، این دستورالعملها به صورت پیشفرض تولید میشوند. گزینهٔ وابسته به ماشین -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،
ساختارها و
اجتماعهایی
که شامل
فیلدهای
بیتی هستند
را برای
تراز شدن با
نوع پایهٔ
فیلد بیتی،
مجبور
نمیکند
(میکند).
برای مثال، به طور پیشفرض ساختاری که چیزی جز ۸ فیلد بیتی "unsigned" با طول ۱ ندارد، در یک مرز ۴ بایتی تراز میشود و اندازهای برابر با ۴ بایت دارد. با استفاده از -mno-bit-align، ساختار در یک مرز ۱ بایتی تراز شده و اندازهٔ آن ۱ بایت خواهد بود.
- -mbit-word
- -mno-bit-word
- اجازه دادن به فیلدهای بیتی برای عبور از مرزهای کلمه (word).
- -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 کامپایل شدهاند پیوند داد.
- -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 استفاده میشود به عنوان فقطخواندنی رفتار میکند، به جای اینکه در مقدمهٔ هر تابع بارگذاری شود. سیستم زمان اجرا مسئول مقداردهی اولیهٔ این ثبات با یک مقدار مناسب پیش از شروع اجرا است.
- -mprioritize-restricted-insns=priority
- این گزینه اولویتی را که به دستورالعملهای محدود به شیار اعزام در طول گذر دوم زمانبندی اختصاص مییابد، کنترل میکند. آرگومان priority یکی از مقادیر 0، 1 یا 2 را میگیرد تا به ترتیب اولویت هیچ، بالاترین، یا دومین اولویت بالا را به دستورالعملهای محدود به شیار اعزام اختصاص دهد.
- -msched-costly-dep=dependence_type
- این گزینه کنترل میکند که کدام وابستگیها در طول زمانبندی دستورالعمل توسط هدف پرهزینه در نظر گرفته شوند. آرگومان dependence_type یکی از مقادیر زیر را میپذیرد:
- no
- هیچ وابستگیای پرهزینه نیست.
- all
- تمام وابستگیها پرهزینه هستند.
- true_store_to_load
- وابستگی واقعی از ذخیرهسازی به بارگذاری (store to load) پرهزینه است.
- store_to_load
- هرگونه وابستگی از ذخیرهسازی به بارگذاری پرهزینه است.
- number
- هر وابستگیای که تأخیر آن بزرگتر یا مساوی با number باشد پرهزینه است.
- -minsert-sched-nops=scheme
- این گزینه تعیین میکند که در گذر دوم زمانبندی از کدام طرح درج NOP استفاده شود. آرگومان scheme یکی از مقادیر زیر را میپذیرد:
- no
- دستورهای NOP درج نشوند.
- pad
- پر کردن هر گروه اعزام که شکافهای صدور خالی دارد با NOP، بر اساس گروهبندی زمانبند.
- regroup_exact
- درج NOPها برای وادار کردن دستورهای وابستهٔ پرهزینه به رفتن در گروههای جداگانه. درج دقیقاً به همان تعداد NOP که بر اساس گروهبندی تخمینی پردازنده، برای راندن یک دستور به یک گروه جدید لازم است.
- number
- درج NOPها برای وادار کردن دستورهای وابستهٔ پرهزینه به رفتن در گروههای جداگانه. درج number دستور NOP برای انتقال یک دستور به گروه جدید.
- -mcall-sysv
- روی System V.4 و سیستمهای توکار PowerPC، کد را با استفاده از قراردادهای فراخوانی که به پیشنویس مارس ۱۹۹۵ از مکمل رابط باینری کاربردی System V برای پردازندهٔ PowerPC پایبند هستند، کامپایل میکند. این حالت پیشفرض است، مگر اینکه GCC را با استفاده از powerpc-*-eabiaix پیکربندی کرده باشید..IP -mcall-sysv-eabi 4
- -mcall-eabi
- مشخص کردن هر دو گزینهٔ -mcall-sysv و -meabi.
- -mcall-sysv-noeabi
- مشخص کردن هر دو گزینهٔ -mcall-sysv و -mno-eabi.
- -mcall-aixdesc
- در سیستمهای System V.4 و سامانههای توکار PowerPC، کد را برای سیستمعامل AIX کامپایل میکند.
- -mcall-linux
- در سیستمهای System V.4 و سامانههای توکار PowerPC، کد را برای سیستم گنو مبتنی بر لینوکس کامپایل میکند.
- -mcall-freebsd
- در سیستمهای System V.4 و سامانههای توکار PowerPC، کد را برای سیستمعامل FreeBSD کامپایل میکند.
- -mcall-netbsd
- در سیستمهای System V.4 و سامانههای توکار PowerPC، کد را برای سیستمعامل NetBSD کامپایل میکند.
- -mcall-openbsd
- در سیستمهای System V.4 و سامانههای توکار PowerPC، کد را برای سیستمعامل OpenBSD کامپایل میکند.
- -mtraceback=traceback_type
- انتخاب نوع جدول traceback. مقادیر معتبر برای traceback_type عبارتاند از full، part و no.
- -maix-struct-return
- بازگرداندن تمام ساختارها در حافظه (همانطور که در ABI مربوط به AIX مشخص شده است).
- -msvr4-struct-return
- بازگرداندن ساختارهای کوچکتر از ۸ بایت در ثباتها (همانطور که در ABI مربوط به SVR4 مشخص شده است).
- -mabi=abi-type
- گسترش ABI فعلی با یک افزونهٔ خاص، یا حذف چنین افزونهای. مقادیر معتبر عبارتاند از: altivec، no-altivec، ibmlongdouble، ieeelongdouble، elfv1، elfv2، و برای AIX: vec-extabi، vec-default.
- -mabi=ibmlongdouble
- تغییر ABI فعلی برای استفاده از long double با دقت گسترشیافتهٔ IBM. اگر پیشفرض سیستم شما استفاده از long double با دقت گسترشیافتهٔ IEEE باشد، احتمالاً این گزینه کار نخواهد کرد. اگر نوع long double را از دقت گسترشیافتهٔ IEEE تغییر دهید، کامپایلر هشداری صادر میکند مگر اینکه از گزینهٔ -Wno-psabi استفاده کنید. نیازمند فعال بودن -mlong-double-128 است.
- -mabi=ieeelongdouble
- تغییر ABI فعلی برای استفاده از long double با دقت گسترشیافتهٔ IEEE. اگر پیشفرض سیستم شما استفاده از long double با دقت گسترشیافتهٔ IBM باشد، احتمالاً این گزینه کار نخواهد کرد. اگر نوع long double را از دقت گسترشیافتهٔ IBM تغییر دهید، کامپایلر هشداری صادر میکند مگر اینکه از گزینهٔ -Wno-psabi استفاده کنید. نیازمند فعال بودن -mlong-double-128 است.
- -mabi=elfv1
- تغییر ABI فعلی برای استفاده از ELFv1 ABI. این ABI پیشفرض برای لینوکس ۶۴ بیتی PowerPC با ترتیب بایت بزرگتر (big-endian) است. بازنویسی ABI پیشفرض نیازمند پشتیبانی سیستمی ویژهای است و احتمالاً به شکلهای غیرمنتظره و شدیدی شکست خواهد خورد.
- -mabi=elfv2
- تغییر ABI فعلی برای استفاده از ELFv2 ABI. این ABI پیشفرض برای لینوکس ۶۴ بیتی PowerPC با ترتیب بایت کوچکتر (little-endian) است. بازنویسی ABI پیشفرض نیازمند پشتیبانی سیستمی ویژهای است و احتمالاً به شکلهای غیرمنتظره و شدیدی شکست خواهد خورد.
- -mgnu-attribute
- -mno-gnu-attribute
- تولید دستورالعملهای اسمبلی .gnu_attribute برای تنظیم جفتهای برچسب/مقدار در بخش .gnu.attributes که دگرگونیهای ABI را در پارامترهای توابع یا مقادیر بازگشتی مشخص میکنند.
- -mprototype
- -mno-prototype
- در سیستمهای System V.4 و سامانههای توکار PowerPC فرض میکند که تمام فراخوانیها به توابع با آرگومانهای متغیر به درستی پیشنمونهسازی (prototyped) شدهاند. در غیر این صورت، کامپایلر باید پیش از هر فراخوانی فاقد پیشنمونه، یک دستورالعمل برای تنظیم یا پاک کردن بیت ۶ ثبات کد وضعیت ("CR") درج کند تا مشخص شود که آیا در صورت دریافت آرگومانهای متغیر، مقادیر ممیز شناور در ثباتهای ممیز شناور ارسال میشوند یا خیر. با گزینهٔ -mprototype، تنها فراخوانیهای دارای پیشنمونه به توابع با آرگومان متغیر این بیت را تنظیم یا پاک میکنند.
- -msim
- در سامانههای توکار PowerPC، فرض میکند که نام ماژول راهاندازی sim-crt0.o است و کتابخانههای استاندارد C شامل libsim.a و libc.a هستند. این حالت پیشفرض برای پیکربندیهای powerpc-*-eabisim است.
- -mmvme
- در سامانههای توکار PowerPC، فرض میکند که نام ماژول راهاندازی crt0.o است و کتابخانههای استاندارد C شامل libmvme.a و libc.a هستند.
- -mads
- در سامانههای توکار PowerPC، فرض میکند که نام ماژول راهاندازی crt0.o است و کتابخانههای استاندارد C شامل libads.a و libc.a هستند.
- -myellowknife
- در سامانههای توکار PowerPC، فرض میکند که نام ماژول راهاندازی crt0.o است و کتابخانههای استاندارد C شامل libyk.a و libc.a هستند.
- -mvxworks
- در سیستمهای System V.4 و سامانههای توکار PowerPC، مشخص میکند که شما برای یک سیستم VxWorks کامپایل میکنید.
- -memb
- در سامانههای توکار PowerPC، بیت "PPC_EMB" را در هدر پرچمهای ELF تنظیم میکند تا نشان دهد که بازآراییهای گسترشیافتهٔ eabi استفاده شدهاند.
- -meabi
- -mno-eabi
- در سیستمهای System V.4 و سامانههای توکار PowerPC، از مشخصات رابط دودویی برنامههای توکار (EABI) که مجموعهای از اصلاحات روی ویژگیهای System V.4 است، پیروی میکند (یا نمیکند). انتخاب -meabi به این معنی است که پشته روی یک مرز ۸ بایتی همتراز میشود، تابع "__eabi" از "main" فراخوانی میشود تا محیط EABI را برپا کند، و گزینهٔ -msdata میتواند از هر دو ثبات "r2" و "r13" برای اشاره به دو ناحیهٔ دادههای کوچک مجزا استفاده کند. انتخاب -mno-eabi بدین معنی است که پشته روی یک مرز ۱۶ بایتی همتراز میشود، هیچ تابع مقداردهی اولیهٔ EABI از "main" فراخوانی نمیشود، و گزینهٔ -msdata تنها از "r13" برای اشاره به یک ناحیهٔ دادههای کوچک منفرد استفاده میکند. اگر GCC را با استفاده از یکی از گزینههای powerpc*-*-eabi* پیکربندی کرده باشید، گزینهٔ -meabi بهطور پیشفرض فعال است.
- -msdata=eabi
- در سیستمهای System V.4 و سامانههای توکار PowerPC، دادههای سراسری و ایستای کوچک و مقداردهیشدهٔ "const" را در بخش ".sdata2" قرار میدهد که توسط ثبات "r2" به آن اشاره میشود. دادههای سراسری و ایستای کوچک و مقداردهیشدهٔ غیر-"const" را در بخش ".sdata" قرار میدهد که توسط ثبات "r13" به آن اشاره میشود. دادههای سراسری و ایستای کوچک و مقداردهینشده را در بخش ".sbss" قرار میدهد که همجوار بخش ".sdata" است. گزینهٔ -msdata=eabi با گزینهٔ -mrelocatable ناسازگار است. گزینهٔ -msdata=eabi همچنین گزینهٔ -memb را نیز تنظیم میکند.
- -msdata=sysv
- در سیستمهای System V.4 و سامانههای توکار PowerPC، دادههای سراسری و ایستای کوچک را در بخش ".sdata" قرار میدهد که توسط ثبات "r13" به آن اشاره میشود. دادههای سراسری و ایستای کوچک و مقداردهینشده را در بخش ".sbss" قرار میدهد که همجوار با بخش ".sdata" است. گزینهٔ -msdata=sysv با گزینهٔ -mrelocatable ناسازگار است.
- -msdata=default
- -msdata
- در سیستمهای System V.4 و سامانههای توکار PowerPC، اگر -meabi استفاده شود، کد را همانند -msdata=eabi کامپایل میکند؛ در غیر این صورت کد را همانند -msdata=sysv کامپایل میکند.
- -msdata=data
- در سیستمهای System V.4 و سامانههای توکار PowerPC، دادههای سراسری کوچک را در بخش ".sdata" قرار میدهد. دادههای سراسری کوچک و مقداردهینشده را در بخش ".sbss" قرار میدهد. با این حال، از ثبات "r13" برای آدرسدهی دادههای کوچک استفاده نمیکند. این رفتار پیشفرض است مگر اینکه از گزینههای دیگر -msdata استفاده شده باشد..IP -msdata=none 4
- -mno-sdata
- در سامانههای تعبیهشدهٔ PowerPC، تمام دادههای سراسری و ایستای مقداردهی اولیهشده را در بخش ".data" و تمام دادههای مقداردهینشده را در بخش ".bss" قرار میدهد.
- -mreadonly-in-sdata
- اشیاء فقطخواندنی را نیز در بخش ".sdata" قرار میدهد. این رفتار پیشفرض است.
- -mblock-move-inline-limit=num
- تمام انتقالهای بلوکی (مانند فراخوانیهای "memcpy" یا رونوشتهای ساختار) با اندازهٔ کمتر یا مساوی با num بایت را درونخطی (inline) میکند. حداقل مقدار برای num در مقصدهای ۳۲ بیتی برابر با ۳۲ بایت و در مقصدهای ۶۴ بیتی برابر با ۶۴ بایت است. مقدار پیشفرض بسته به مقصد متغیر است.
- -mblock-compare-inline-limit=num
- برای تمام مقایسههای بلوکی (مانند فراخوانیهای "memcmp" یا مقایسههای ساختار) که کمتر یا مساوی با num بایت هستند، کد درونخطی غیرحلقهای تولید میکند. اگر num برابر با 0 باشد، تمام بسطهای درونخطی (حلقهای و غیرحلقهای) مقایسهٔ بلوک غیرفعال میشوند. مقدار پیشفرض بسته به مقصد تعیین میشود.
- -mblock-compare-inline-loop-limit=num
- یک بسط درونخطی با استفاده از کد حلقهای برای تمام مقایسههای بلوکی تولید میکند که طول آنها کمتر یا مساوی با num بایت بوده، اما از حد مجاز بسط درونخطی غیرحلقهای بیشتر است. اگر طول بلوک ثابت نباشد، حداکثر num بایت قبل از اینکه "memcmp" برای مقایسهٔ باقیماندهٔ بلوک فراخوانی شود، مقایسه میگردد. مقدار پیشفرض بسته به مقصد تعیین میشود.
- -mstring-compare-inline-limit=num
- حداکثر num بایت از رشته را با کد درونخطی مقایسه میکند. اگر تفاوت یا پایان رشته تا انتهای مقایسهٔ درونخطی مشخص نشود، فراخوانی "strcmp" یا "strncmp" باقی مقایسه را انجام میدهد. مقدار پیشفرض ۶۴ بایت است.
- -G num
- در سامانههای تعبیهشدهٔ PowerPC، متغیرهای سراسری و ایستایی را که اندازهٔ آنها کمتر یا مساوی با num بایت است، بهجای بخشهای عادی data یا BSS، در بخشهای دادههای کوچک (small data) یا BSS قرار میدهد. بهطور پیشفرض، مقدار num برابر با 8 است. سوئیچ -G num به پیونددهنده (linker) نیز فرستاده میشود. تمام پیمانهها باید با مقدار یکسان -G num همگردانی شوند.
- -mregnames
- -mno-regnames
- در System V.4 و سامانههای تعبیهشدهٔ PowerPC، نام ثباتها را در خروجی زبان اسمبلی با استفاده از اشکال نمادین درج میکند (یا درج نمیکند).
- -mlongcall
- -mno-longcall
- بهطور
پیشفرض
فرض میکند
که تمام
فراخوانیها
دوردست
هستند،
بهطوری که
یک توالی
فراخوانی
طولانیتر
و
پرهزینهتر
مورد نیاز
است. این
امر برای
فراخوانیهایی
که دورتر از
۳۲ مگابایت
(۳۳٬۵۵۴٬۴۳۲
بایت) از
مکان فعلی
هستند
الزامی است.
اگر
کامپایلر
بداند که
فراخوانی
نمیتواند
تا این
اندازه دور
باشد، یک
فراخوانی
کوتاه (short call)
تولید
میشود. این
تنظیم را
میتوان
توسط صفت
تابع
"shortcall" یا
دستور #pragma
longcall(0) لغو کرد.
برخی پیونددهندهها قادرند فراخوانیهای خارج از محدوده را شناسایی کرده و کدهای رابط (glue code) را بیدرنگ ایجاد کنند. در این سامانهها، فراخوانیهای طولانی غیرضروری بوده و کد کندتری تولید میکنند. در زمان نگارش این متن، پیونددهندهٔ AIX و همچنین پیونددهندهٔ GNU برای PowerPC/64 قادر به انجام این کار هستند. برنامهریزی شده است که این ویژگی به پیونددهندهٔ GNU برای سامانههای ۳۲ بیتی PowerPC نیز افزوده شود.
در سامانههای PowerPC64 ELFv2 و سامانههای ۳۲ بیتی PowerPC با پیونددهندههای جدیدتر GNU، کامپایلر GCC میتواند با استفاده از یک توالی فراخوانی PLT درونخطی، فراخوانیهای دوردست را تولید کند (ببینید: -mpltseq). سامانهٔ PowerPC با گزینهٔ -mbss-plt و سامانههای PowerPC64 ELFv1 (بزرگپایان) از فراخوانیهای درونخطی PLT پشتیبانی نمیکنند.
در سامانههای Darwin/PPC، دستور "#pragma longcall" عبارت "jbsr callee, L42" را به همراه یک branch island (کد واسط) تولید میکند. دو نشانی مقصد نمایانگر تابع فراخواندهشده (callee) و جزیرهٔ انشعاب (branch island) هستند. پیونددهندهٔ Darwin/PPC نشانی اول را ترجیح میدهد و اگر دستور "bl" در PPC مستقیماً به تابع فراخواندهشده برسد، یک "bl callee" تولید میکند؛ در غیر این صورت، پیونددهنده عبارت "bl L42" را برای فراخوانی جزیرهٔ انشعاب ایجاد مینماید. جزیرهٔ انشعاب به بدنهٔ تابع فراخواننده ضمیمه میشود؛ این بخش، نشانی کامل ۳۲ بیتی تابع فراخواندهشده را محاسبه کرده و به آن پرش میکند.
در سامانههای Mach-O (Darwin)، این گزینه کامپایلر را هدایت میکند تا کد واسط را برای هر فراخوانی مستقیم ایجاد کند و پیونددهندهٔ Darwin تصمیم میگیرد که از آن استفاده کند یا آن را کنار بگذارد.
در آینده، ممکن است GCC تمام تعاریف longcall را هنگامی که مشخص باشد پیونددهنده کدهای واسط تولید میکند، نادیده بگیرد.
- -mpltseq
- -mno-pltseq
- ویژگی -fno-plt و فراخوانیهای طولانی را با استفاده از یک توالی فراخوانی PLT درونخطی پیادهسازی میکند (یا نمیکند) که از پیوند تنبل (lazy linking) و فراخوانیهای طولانی به توابع در کتابخانههای مشترک بارگذاریشده با dlopen پشتیبانی مینماید. فراخوانیهای درونخطی PLT فقط در PowerPC64 ELFv2 و سامانههای ۳۲ بیتی PowerPC با پیونددهندههای جدیدتر GNU پشتیبانی میشوند؛ در صورت شناسایی این پشتیبانی در هنگام پیکربندی GCC و در مورد سامانههای ۳۲ بیتی PowerPC در صورتی که GCC با --enable-secureplt پیکربندی شده باشد، بهطور پیشفرض فعال هستند. کدهای تولیدشده با -mpltseq و اشیاء بازنشانیپذیر (relocatable) ۳۲ بیتی PowerPC با -mbss-plt نباید با یکدیگر پیوند داده شوند.
- -mtls-markers
- -mno-tls-markers
- فراخوانیهای "__tls_get_addr" را با یک بازنشانی (relocation) که آرگومان تابع را تعیین میکند، علامتگذاری میکند (یا نمیکند). این بازنشانی به پیونددهنده امکان میدهد فراخوانی تابع را برای بهینهسازی TLS با دستورالعملهای راهاندازی آرگومان پیوند دهد، که این امر به نوبهٔ خود به GCC اجازه میدهد زمانبندی بهتری برای این توالی انجام دهد.
- -mrecip
- -mno-recip
- این گزینه استفاده از دستورالعملهای برآورد معکوس و برآورد ریشهٔ دوم معکوس را به همراه گامهای اضافی نیوتن-رافسون (Newton-Raphson) برای افزایش دقت بهجای تقسیم یا جذر و تقسیم برای آرگومانهای ممیز شناور فعال میکند. هنگام استفاده از -mrecip باید گزینهٔ -ffast-math (یا حداقل گزینههای -funsafe-math-optimizations، -ffinite-math-only، -freciprocal-math و -fno-trapping-math) را به کار ببرید. توجه داشته باشید در حالی که توان پردازشی توالی عموماً بالاتر از دستورالعملهای غیرمعکوس است، دقت توالی برای ریشههای دوم معکوس میتواند تا 2 ulp کاهش یابد (برای نمونه، معکوس 1.0 برابر با 0.99999994 میشود).
- -mrecip=opt
- این گزینه مشخص میکند کدام دستورالعملهای برآورد معکوس میتوانند استفاده شوند. opt فهرستی از گزینهها است که با ویرگول لاتین از یکدیگر جدا شدهاند و میتوان یک نماد "!" را برای معکوس کردن عملکرد گزینه به ابتدای آن افزود:
- all
- تمام دستورالعملهای برآورد را فعال میکند.
- default
- دستورالعملهای پیشفرض را فعال میکند که معادل با -mrecip است.
- none
- تمام دستورالعملهای برآورد را غیرفعال میکند که معادل با -mno-recip است.
- div
- دستورالعملهای تقریب معکوس را برای هر دو دقت تکی (single) و مضاعف (double) فعال میکند.
- divf
- دستورالعملهای تقریب معکوس با دقت تکی را فعال میکند.
- divd
- دستورالعملهای تقریب معکوس با دقت مضاعف را فعال میکند.
- rsqrt
- دستورالعملهای تقریب ریشهٔ دوم معکوس را برای هر دو دقت تکی و مضاعف فعال میکند.
- rsqrtf
- دستورالعملهای تقریب ریشهٔ دوم معکوس با دقت تکی را فعال میکند.
- rsqrtd
- دستورالعملهای تقریب ریشهٔ دوم معکوس با دقت مضاعف را فعال میکند.
بنابراین برای نمونه، گزینهٔ -mrecip=all,!rsqrtd تمام دستورالعملهای برآورد معکوس را به جز دستورالعملهای "FRSQRTE"، "XSRSQRTEDP" و "XVRSQRTEDP" که محاسبات ریشهٔ دوم معکوس با دقت مضاعف را مدیریت میکنند، فعال میسازد.
- -mno-recip-precision
- فرض میکند (فرض نمیکند) که دستورالعملهای برآورد معکوس (reciprocal estimate)، تخمینهایی با دقت بالاتر از آنچه توسط PowerPC ABI الزامی شده ارائه میدهند. انتخاب -mcpu=power6، -mcpu=power7 یا -mcpu=power8 به طور خودکار -mrecip-precision را فعال میکند. دستورالعملهای تخمین ریشه دوم با دقت مضاعف (double-precision) به طور پیشفرض روی ماشینهای با دقت پایین تولید نمیشوند، چرا که تخمینی ارائه نمیدهند که پس از سه مرحله همگرا شود.
- -mveclibabi=type
- نوع ABI مورد استفاده برای برداریسازی توابع درونی (intrinsics) با استفاده از یک کتابخانه خارجی را تعیین میکند. تنها نوعی که در حال حاضر پشتیبانی میشود mass است، که استفاده از کتابخانههای Mathematical Acceleration Subsystem (MASS) شرکت IBM را برای برداریسازی توابع درونی با استفاده از کتابخانههای خارجی مشخص میکند. در حال حاضر GCC هنگام تولید کد برای power7 فراخوانیهایی به "acosd2"، "acosf4"، "acoshd2"، "acoshf4"، "asind2"، "asinf4"، "asinhd2"، "asinhf4"، "atan2d2"، "atan2f4"، "atand2"، "atanf4"، "atanhd2"، "atanhf4"، "cbrtd2"، "cbrtf4"، "cosd2"، "cosf4"، "coshd2"، "coshf4"، "erfcd2"، "erfcf4"، "erfd2"، "erff4"، "exp2d2"، "exp2f4"، "expd2"، "expf4"، "expm1d2"، "expm1f4"، "hypotd2"، "hypotf4"، "lgammad2"، "lgammaf4"، "log10d2"، "log10f4"، "log1pd2"، "log1pf4"، "log2d2"، "log2f4"، "logd2"، "logf4"، "powd2"، "powf4"، "sind2"، "sinf4"، "sinhd2"، "sinhf4"، "sqrtd2"، "sqrtf4"، "tand2"، "tanf4"، "tanhd2" و "tanhf4" صادر میکند. هر دو گزینه -ftree-vectorize و -funsafe-math-optimizations نیز باید فعال باشند. کتابخانههای MASS باید در زمان پیوند مشخص شوند.
- -mfriz
- -mno-friz
- دستورالعمل "friz" را تولید میکند (تولید نمیکند) هنگامی که از گزینه -funsafe-math-optimizations برای بهینهسازی گرد کردن مقادیر ممیز شناور به عدد صحیح ۶۴ بیتی و بازگشت به ممیز شناور استفاده میشود. دستورالعمل "friz" در صورتی که عدد ممیز شناور برای قرار گرفتن در عدد صحیح بیش از حد بزرگ باشد، همان مقدار را بازنمیگرداند.
- -mpointers-to-nested-functions
- -mno-pointers-to-nested-functions
- کدی برای بارگذاری ثبات زنجیره ایستا ("r11") هنگام فراخوانی از طریق یک اشارهگر در سیستمهای AIX و لینوکس ۶۴ بیتی تولید میکند (تولید نمیکند)؛ در این سیستمها، اشارهگر تابع به یک توصیفگر ۳ کلمهای اشاره دارد که آدرس تابع، مقدار TOC جهت بارگذاری در ثبات "r2"، و مقدار زنجیره ایستا جهت بارگذاری در ثبات "r11" را در بر دارد. گزینه -mpointers-to-nested-functions به طور پیشفرض فعال است. اگر از -mno-pointers-to-nested-functions استفاده کنید، نمیتوانید از طریق اشارهگرها، توابع تو در تو یا توابعی را که در زبانهای دیگر کامپایل شده و از زنجیره ایستا استفاده میکنند فراخوانی کنید.
- -msave-toc-indirect
- -mno-save-toc-indirect
- کدی برای ذخیره مقدار TOC در محل رزروشده پشته در مقدمه تابع (prologue) تولید میکند (تولید نمیکند)، در صورتی که تابع در سیستمهای AIX و لینوکس ۶۴ بیتی از طریق یک اشارهگر فراخوانی کند. اگر مقدار TOC در مقدمه ذخیره نشود، دقیقاً پیش از فراخوانی از طریق اشارهگر ذخیره میشود. گزینه -mno-save-toc-indirect حالت پیشفرض است.
- -mcompat-align-parm
- -mno-compat-align-parm
- کدی برای
ارسال
پارامترهای
ساختار با
حداکثر
تراز ۶۴
بیت، جهت
سازگاری با
نسخههای
قدیمیتر GCC
تولید
میکند
(تولید
نمیکند).
نسخههای قدیمیتر GCC (قبل از 4.9.0) به اشتباه پارامتر ساختار را روی مرز ۱۲۸ بیتی تراز نمیکردند، زمانی که آن ساختار حاوی عضوی بود که به تراز ۱۲۸ بیتی نیاز داشت. این موضوع در نسخههای جدیدتر GCC اصلاح شده است. این گزینه میتواند برای تولید کدی استفاده شود که با توابع کامپایلشده توسط نسخههای قدیمیتر GCC سازگار باشد.
گزینه -mno-compat-align-parm حالت پیشفرض است.
- -mstack-protector-guard=guard
- -mstack-protector-guard-reg=reg
- -mstack-protector-guard-offset=offset
- کد محافظت
از پشته را
با استفاده
از قناری (canary)
در guard تولید
میکند.
مکانهای
پشتیبانیشده
عبارتند از
global برای
قناری
سراسری یا
tls برای
قناری مجزا
برای هر
رشته در
بلوک TLS
(پیشفرض در
نسخه GNU libc 2.4 یا
بالاتر).
با انتخاب حالت دوم، گزینههای -mstack-protector-guard-reg=reg و -mstack-protector-guard-offset=offset علاوه بر این مشخص میکنند که کدام ثبات به عنوان ثبات پایه برای خواندن قناری، و از چه آفستی نسبت به آن ثبات پایه استفاده شود. مقدار پیشفرض برای آنها بر اساس آنچه در ABI مربوطه مشخص شده تعیین میگردد.
- -mpcrel
- -mno-pcrel
- آدرسدهی وابسته به شمارنده برنامه (pc-relative) را تولید میکند (تولید نمیکند). گزینه -mpcrel نیازمند فعال بودن مدل کد متوسط (-mcmodel=medium) و گزینههای آدرسدهی پیشوندی (-mprefixed) است.
- -mprefixed
- -mno-prefixed
- حالتهای آدرسدهی را با استفاده از دستورالعملهای بارگذاری و ذخیرهسازی پیشوندی (prefixed) تولید میکند (تولید نمیکند). گزینه -mprefixed مستلزم فعال بودن گزینه -mcpu=power10 (یا جدیدتر) است.
- -mmma
- -mno-mma
- دستورالعملهای MMA را تولید میکند (تولید نمیکند). گزینه -mma مستلزم فعال بودن گزینه -mcpu=power10 (یا جدیدتر) است.
- -mdense-math
- -mno-dense-math
- دستورالعملهای Dense Math Facility (DMF) را تولید میکند (تولید نمیکند). گزینه -mdense-math مستلزم فعال بودن گزینه -mcpu=future (یا جدیدتر) است.
- -mrop-protect
- -mno-rop-protect
- دستورالعملهای محافظت از ROP را هنگامی که پردازنده هدف از آنها پشتیبانی میکند تولید میکند (تولید نمیکند). در حال حاضر این گزینه بهینهسازی جمعبندی (-fshrink-wrap) را غیرفعال میکند.
- -mprivileged
- -mno-privileged
- کدی که در حالت ممتاز (privileged state) اجرا میشود را تولید میکند (تولید نمیکند).
- -mblock-ops-unaligned-vsx
- -mno-block-ops-unaligned-vsx
- عملیات بارگذاری و ذخیرهسازی ترازنشده vsx را برای بسط درونخطی توابع "memcpy" و "memmove" تولید میکند (تولید نمیکند).
- -msplat-word-constant
- -mno-splat-word-constant
- کدی را تولید میکند (تولید نمیکند) که از دستورالعمل "XXSPLTIW" استفاده میکند. این گزینه به طور پیشفرض فعال است.
- -msplat-float-constant
- تولید (عدم تولید) کدی که از دستورالعمل "XXSPLTIDP" استفاده میکند. این گزینه بهطور پیشفرض فعال است.
- -mieee128-constant
- -mno-ieee128-constant
- تولید (عدم تولید) کدی که از دستورالعمل "LXVKQ" استفاده میکند. این گزینه بهطور پیشفرض فعال است.
- -mwarn-altivec-long
- -mno-warn-altivec-long
- فعالسازی یا غیرفعالسازی هشدارها دربارهٔ استفاده از نوع منسوخشدهٔ vector long ... در Altivec. این گزینه بهطور پیشفرض فعال است.
گزینههای RX
این گزینههای خط فرمان برای اهداف RX تعریف شدهاند:
- -m64bit-doubles
- -m32bit-doubles
- اندازهٔ نوع دادهٔ "double" را ۶۴ بیت (-m64bit-doubles) یا ۳۲ بیت (-m32bit-doubles) تعیین میکند. مقدار پیشفرض -m32bit-doubles است. نکته: سختافزار ممیز شناور RX تنها روی مقادیر ۳۲ بیتی کار میکند، به همین دلیل مقدار پیشفرض -m32bit-doubles است.
- -fpu
- -nofpu
- استفاده از
سختافزار
ممیز شناور
RX را فعال (-fpu)
یا غیرفعال
(-nofpu) میکند.
پیشفرض
برای سری RX600
فعال و برای
سری RX200
غیرفعال
است.
با این حال، دستورالعملهای ممیز شناور تنها برای مقادیر ممیز شناور ۳۲ بیتی تولید میشوند، بنابراین در صورت استفاده از گزینهٔ -m64bit-doubles، سختافزار FPU برای مقادیر double استفاده نمیشود.
نکته: در صورت فعال بودن گزینهٔ -fpu، گزینهٔ -funsafe-math-optimizations نیز بهطور خودکار فعال میشود. دلیل این امر این است که دستورالعملهای RX FPU ذاتاً ناامن هستند.
- -mcpu=name
- نوع
پردازندهٔ
RX مورد نظر
را انتخاب
میکند. در
حال حاضر سه
نوع
پشتیبانی
میشوند:
سختافزارهای
عمومی سری
RX600 و RX200، و
پردازندهٔ
خاص RX610.
مقدار
پیشفرض RX600
است.
تنها تفاوت میان RX600 و RX610 این است که RX610 از دستورالعمل "MVTIPL" پشتیبانی نمیکند.
سری RX200 فاقد واحد ممیز شناور سختافزاری است و بنابراین هنگام انتخاب این نوع، -nofpu بهطور پیشفرض فعال میشود.
- -mbig-endian-data
- -mlittle-endian-data
- دادهها (نه کدها) را در قالب big-endian ذخیره میکند. پیشفرض -mlittle-endian-data است، یعنی ذخیرهٔ دادهها در قالب little-endian.
- -msmall-data-limit=N
- حداکثر
اندازه (به
بایت)
متغیرهای
سراسری و
ایستا را که
میتوانند
در ناحیهٔ
دادههای
کوچک (small data area)
قرار
گیرند،
مشخص
میکند.
استفاده از
ناحیهٔ
دادههای
کوچک
میتواند
به کدی
کوچکتر و
سریعتر
منجر شود،
اما
اندازهٔ
این ناحیه
محدود است و
اطمینان از
سرریز نشدن
آن بر عهدهٔ
برنامهنویس
است. همچنین
در صورت
استفاده از
ناحیهٔ
دادههای
کوچک، یکی
از
ثباتهای RX
(معمولاً
"r13") برای
اشاره به
این ناحیه
رزرو
میشود،
بنابراین
دیگر توسط
کامپایلر
قابل
استفاده
نخواهد بود.
در صورتی که
متغیرها به
جای
نگهداری در
این ثبات به
داخل پشته
رانده
شوند، این
امر ممکن
است به کدی
کُندتر و/یا
بزرگتر
منجر شود.
توجه داشته باشید که متغیرهای مشترک (متغیرهایی که مقداردهی اولیه نشدهاند) و ثوابت در ناحیهٔ دادههای کوچک قرار نمیگیرند، چرا که به بخشهای دیگری در فایل اجرایی خروجی اختصاص مییابند.
مقدار پیشفرض صفر است که این ویژگی را غیرفعال میکند. توجه داشته باشید که این ویژگی در سطوح بالاتر بهینهسازی (-O2 و غیره) به دلیل اثرات مضر بالقوهٔ رزرو یک ثبات، بهطور پیشفرض فعال نمیشود. بر عهدهٔ برنامهنویس است که بررسی کند و ببیند آیا این ویژگی برای برنامهاش سودمند است یا خیر. برای آگاهی از چگونگی انتخاب ثبات اصلیِ نگهدارندهٔ اشارهگر ناحیهٔ دادههای کوچک، توضیحات مربوط به گزینهٔ -mpid را ببینید.
- -msim
- -mno-sim
- از زماناجرای شبیهساز استفاده میکند. پیشفرض استفاده از زماناجرای مختص به برد 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) را حفظ کنند. این کار تنها زمانی لازم است که کد عادی احتمالاً از ثبات انباشتگر استفاده کند؛ برای مثال، به این دلیل که ضربهای ۶۴ بیتی انجام میدهد. پیشفرض، نادیده گرفتن انباشتگر است زیرا این امر سرعت گردانندههای وقفه را بیشتر میکند.
- -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" را
فعال یا
غیرفعال
میکند. این
دستورالعملها
ممکن است
دادهها را
پیشواکشی
(prefetch) کنند که
در صورت
دسترسی به
یک ثبات I/O،
انجام آن
امن نیست.
(برای
اطلاعات
بیشتر به
بخش 12.2.7 از RX62N Group User's Manual
مراجعه
کنید).
پیشفرض مجاز بودن این دستورالعملها است، اما برای GCC ممکن نیست که با اطمینان تمامی شرایطی را که ممکن است از یک دستورالعمل رشته برای دسترسی به یک ثبات I/O استفاده شود تشخیص دهد، بنابراین استفاده از آنها نمیتواند بهطور خودکار غیرفعال شود. در عوض، به برنامهنویس واگذار شده است که در صورت دسترسی برنامهاش به فضای I/O، از گزینه -mno-allow-string-insns استفاده کند.
هنگامی که این دستورالعملها فعال باشند، GCC نماد پیشپردازنده C یعنی "__RX_ALLOW_STRING_INSNS__" را تعریف میکند، و در غیر این صورت نماد "__RX_DISALLOW_STRING_INSNS__" را تعریف میکند.
- -mjsr
- -mno-jsr
- تنها (یا نه فقط) از دستورالعملهای "JSR" برای دسترسی به توابع استفاده شود. این گزینه میتواند زمانی که اندازه کد از محدوده دستورالعملهای "BSR" فراتر میرود به کار رود. توجه داشته باشید که -mno-jsr به معنای عدم استفاده از "JSR" نیست، بلکه بدین معناست که از هر نوع شاخهبندی (branch) میتوان استفاده کرد.
- -mlra
- استفاده از تخصیصدهنده ثبات جدید LRA. بهطور پیشفرض، از تخصیصدهنده قدیمی «reload» استفاده میشود.
نکته: گزینه خط فرمان عمومی GCC به نام -ffixed-reg هنگام استفاده با ویژگی تابع "interrupt"، برای درگاه (port) معماری 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
pointer) در فریم
پشته
فراخواندهشده.
ممکن است یک
backchain برای
امکان
خطایابی با
استفاده از
ابزارهایی
که اطلاعات
فریم
فراخوانی DWARF
را تشخیص
نمیدهند،
مورد نیاز
باشد.
هنگامی که
-mno-packed-stack فعال
باشد،
اشارهگر backchain
در پایین
فریم پشته
ذخیره
میشود؛
هنگامی که
-mpacked-stack فعال
باشد، backchain در
بالاترین
کلمه (word) از
ناحیه
ذخیره ثبات
۹۶/۱۶۰
بایتی قرار
میگیرد.
بهطور کلی، کدهای کامپایلشده با -mbackchain از نظر فراخوانی با کدهای کامپایلشده با -mno-backchain سازگار (call-compatible) هستند؛ اما استفاده از backchain برای اهداف خطایابی معمولاً مستلزم آن است که کل باینری با -mbackchain ساخته شود. توجه داشته باشید که ترکیب -mbackchain، -mpacked-stack و -mhard-float پشتیبانی نمیشود. به منظور ساخت هسته لینوکس از -msoft-float استفاده کنید.
پیشفرض بر این است که backchain نگهداری نشود.
- -mpacked-stack
- -mno-packed-stack
- استفاده از
(عدم
استفاده از)
چیدمان
فشرده پشته
(packed stack layout). هنگامی
که -mno-packed-stack مشخص
شود،
کامپایلر
از تمامی
فیلدهای
ناحیه
ذخیره ثبات
۹۶/۱۶۰
بایتی تنها
برای اهداف
پیشفرض
آنها
استفاده
میکند؛
فیلدهای
بلااستفاده
همچنان
فضای پشته
را اشغال
خواهند کرد.
هنگامی که
-mpacked-stack مشخص
شود،
شیارهای
ذخیره ثبات
بهصورت
متراکم در
بالای
ناحیه
ذخیره ثبات
بستهبندی
میشوند؛
فضای
استفادهنشده
برای مقاصد
دیگر
استفاده
مجدد
میشود، که
امکان
استفاده
کارآمدتر
از فضای
موجود در
پشته را
فراهم
میسازد. با
این حال،
زمانی که
-mbackchain نیز
فعال باشد،
بالاترین
کلمه از
ناحیه
ذخیره
همواره
برای
نگهداری backchain
استفاده
میشود، و
ثبات نشانی
بازگشت
همواره دو
کلمه
پایینتر
از backchain ذخیره
میگردد.
تا زمانی که از backchain فریم پشته استفاده نشود، کدهای تولیدشده با -mpacked-stack از نظر فراخوانی با کدهای تولیدشده با -mno-packed-stack سازگار هستند. توجه داشته باشید که برخی نگارشهای غیر FSF از GCC 2.95 برای S/390 یا zSeries کدهایی تولید میکردند که از backchain فریم پشته در زمان اجرا استفاده میکرد، نه صرفاً برای اهداف خطایابی. چنین کدهایی از نظر فراخوانی با کدهای کامپایلشده با -mpacked-stack سازگار نیستند. همچنین توجه داشته باشید که ترکیب -mbackchain، -mpacked-stack و -mhard-float پشتیبانی نمیشود. به منظور ساخت هسته لینوکس از -msoft-float استفاده کنید.
پیشفرض بر این است که از چیدمان فشرده پشته استفاده نشود.
- -msmall-exec
- -mno-small-exec
- تولید (یا عدم تولید) کد با استفاده از دستورالعمل "bras" جهت انجام فراخوانی زیرروالها. این قابلیت تنها در صورتی با اطمینان کار میکند که اندازه کل فایل اجرایی از 64k تجاوز نکند. پیشفرض، استفاده از دستورالعمل "basr" به جای آن است که فاقد این محدودیت میباشد.
- -m64
- -m31
- هنگامی که -m31 مشخص شود، کدی منطبق با ABI سیستم GNU/Linux برای S/390 تولید میکند. زمانی که -m64 مشخص شود، کدی منطبق با ABI سیستم GNU/Linux برای zSeries تولید میکند. این موضوع بهویژه به GCC امکان تولید دستورالعملهای ۶۴ بیتی را میدهد. برای مقصدهای s390، پیشفرض -m31 است، در حالی که برای مقصدهای s390x پیشفرض -m64 میباشد. توجه داشته باشید که -m31 منسوخ شده است و پشتیبانی از آن حذف خواهد شد.
- -mzarch
- -mesa
- هنگامی که -mzarch مشخص شود، با استفاده از دستورالعملهای موجود در z/Architecture کد تولید میکند. هنگامی که -mesa مشخص شود، با استفاده از دستورالعملهای موجود در ESA/390 کد تولید میکند. توجه داشته باشید که استفاده از -mesa همراه با -m64 امکانپذیر نیست. هنگام تولید کدی منطبق با ABI سیستم GNU/Linux برای S/390، پیشفرض -mesa است. هنگام تولید کدی منطبق با ABI سیستم GNU/Linux برای zSeries، پیشفرض -mzarch است..IP -mhtm 4
- -mno-htm
- گزینهٔ -mhtm مجموعهای از توابع توکار (built-ins) را فعال میکند که از دستورالعملهای موجود در تسهیلات اجرای تراکنشی (transactional execution facility) معرفیشده در نسل رایانهٔ IBM zEnterprise EC12 بهره میبرند؛ بخش S/390 System z Built-in Functions. -mhtm هنگام استفاده از -march=zEC12 بهطور پیشفرض فعال است.
- -mvx
- -mno-vx
- هنگامی که -mvx مشخص شود، کدی با استفاده از دستورالعملهای موجود در تسهیلات گسترش برداری (vector extension facility) معرفیشده در نسل رایانهٔ IBM z13 تولید میشود. این گزینه ABI را برای برخی مقادیر از نوع برداری، با توجه به همترازی (alignment) و قراردادهای فراخوانی (calling conventions) تغییر میدهد. در صورتی که مقادیر از نوع برداری در زمینهای مرتبط با ABI استفاده شوند، یک دستور .gnu_attribute از GAS اضافه میشود تا باینری حاصل را با ABI استفادهشده علامتگذاری کند. -mvx هنگام استفاده از -march=z13 بهطور پیشفرض فعال است.
- -mzvector
- -mno-zvector
- گزینهٔ -mzvector افزونههای زبان برداری و توابع توکاری که از دستورالعملهای ارائهشده توسط تسهیلات گسترش برداری معرفیشده در نسل رایانهٔ IBM z13 استفاده میکنند را فعال میسازد. این گزینه پشتیبانی از کلمهٔ کلیدی vector را برای تعریف متغیرها و آرگومانهای نوع برداری اضافه میکند. vector تنها زمانی در دسترس است که افزونههای GNU فعال باشند. در صورت درخواست انطباق دقیق با استاندارد، برای مثال با -std=c99، این کلمه بسط داده نمیشود. علاوه بر توابع توکار سطح پایین GCC، گزینهٔ -mzvector مجموعهای از توابع توکار را فعال میکند که برای سازگاری با پیادهسازیهای سبک AltiVec مانند Power و Cell اضافه شدهاند. برای استفاده از این توابع توکار، باید فایل سرآیند vecintrin.h را بگنجانید. -mzvector بهطور پیشفرض غیرفعال است.
- -mmvcle
- -mno-mvcle
- تولید کردن (یا نکردن) کدی که از دستورالعمل "mvcle" برای انجام جابهجاییهای بلوکی استفاده میکند. زمانی که -mno-mvcle مشخص شود، به جای آن از یک حلقهٔ "mvc" استفاده میشود. این حالت پیشفرض است، مگر اینکه بهینهسازی برای اندازه (size) انجام شود.
- -mdebug
- -mno-debug
- چاپ کردن (یا نکردن) اطلاعات اشکالزدایی اضافی هنگام کامپایل. حالت پیشفرض چاپ نکردن اطلاعات اشکالزدایی است.
- -march=cpu-type
- تولید کدی
که بر روی cpu-type
اجرا
میشود، که
نام سیستمی
نشاندهندهٔ
نوع
پردازندهای
مشخص است.
مقادیر
ممکن برای
cpu-type عبارتند
از z900/arch5،
z990/arch6، z9-109،
z9-ec/arch7، z10/arch8،
z196/arch9، zEC12،
z13/arch11، z14/arch12،
z15/arch13، z16/arch14،
z17/arch15 و native.
پیشفرض -march=z900 است.
مشخص کردن native به عنوان نوع پردازنده میتواند برای انتخاب بهترین گزینهٔ معماری متناسب با پردازندهٔ میزبان به کار رود. اگر GCC پردازنده را شناسایی نکند، -march=native هیچ تأثیری نخواهد داشت.
- -mtune=cpu-type
- میزانسازی دقیق تمام موارد ممکن دربارهٔ کد تولیدشده متناسب با cpu-type، به جز ABI و مجموعهٔ دستورالعملهای در دسترس. فهرست مقادیر cpu-type همانند فهرست -march است. پیشفرض، مقداری است که برای -march استفاده شده است.
- -mtpf-trace
- -mno-tpf-trace
- تولید کدی که انشعابهای ویژهٔ سیستمعامل TPF را به روالهای ردگیری (trace routines) در سیستمعامل اضافه میکند (یا اضافه نمیکند). این گزینه حتی هنگام کامپایل برای سیستمعامل TPF نیز بهطور پیشفرض غیرفعال است.
- -mtpf-trace-skip
- -mno-tpf-trace-skip
- تولید کدی که مقاصد انشعاب پیشفرضِ فعالشده توسط -mtpf-trace را تغییر میدهد (یا نمیدهد) تا به روالهای ردگیری تخصصی اشاره کنند که امکان نادیده گرفتن انتخابی ورودیهای ردگیری تابع را برای سیستمعامل TPF فراهم میآورند. این گزینه بهطور پیشفرض خاموش است، حتی در زمان کامپایل برای سیستمعامل TPF و مشخص کردن -mtpf-trace.
- -mmain
- برای مقصد سیستمعامل TPF، هنگام پیوند دادن از این گزینه برای افزودن کد راهاندازی (startup code) و سایر گزینههای پیونددهنده جهت تولید شیء اصلی استفاده کنید.
- -mfused-madd
- -mno-fused-madd
- تولید کدی که از دستورالعملهای ضرب و جمع توأم ممیز شناور (fused multiply-accumulate) استفاده میکند (یا نمیکند). در صورت استفاده از ممیز شناور سختافزاری، این دستورالعملها بهطور پیشفرض تولید میشوند.
- -mwarn-framesize=framesize
- صدور یک
هشدار در
صورتی که
تابع جاری
از اندازه
فریم
دادهشده
فراتر رود.
از آنجا که
این بررسی
در زمان
کامپایل
انجام
میشود،
لزوماً به
این معنی
نیست که
هنگام
اجرای
برنامه یک
مشکل واقعی
رخ خواهد
داد. هدف از
آن شناسایی
توابعی است
که به
احتمال
زیاد باعث
سرریز پشته
(stack overflow) میشوند.
این گزینه
برای
محیطهایی
با اندازهٔ
پشتهٔ
محدود،
مانند
هستهٔ
لینوکس،
مفید است.
مقدار صفر این هشدار را غیرفعال میکند؛ که همان مقدار پیشفرض است.
- -mwarn-dynamicstack
- -mno-warn-dynamicstack
- صدور یک هشدار اگر تابع، "alloca" را فراخوانی کند یا از آرایههای با اندازهٔ پویا استفاده کند. این کار در شرایطی با اندازهٔ پشتهٔ محدود عموماً ایدهٔ نامناسبی است.
- -mstack-guard=stack-guard
- -mstack-size=stack-size
- -mno-stack-guard
- -mno-stack-size
- اگر این
گزینهها
فعال
باشند، بخش
پسین S/390
دستورالعملهای
اضافی را در
مقدمهٔ
تابع (function prologue)
صادر
میکند که
اگر اندازه
پشته به
میزان stack-guard
بایت فراتر
از stack-size
برود، یک
تله (trap) را
فعال
میکنند (به
یاد داشته
باشید که
پشته در S/390 رو
به پایین
رشد
میکند).
اگر گزینهٔ
stack-guard ذکر
نشود،
کوچکترین
توان ۲ که
بزرگتر از
اندازهٔ
فریم تابع
کامپایلشده
باشد
انتخاب
میشود.
این گزینهها برای کمک به اشکالزدایی مشکلات سرریز پشته در نظر گرفته شدهاند. کد اضافی تولیدشده سربار ناچیزی ایجاد میکند و از این رو میتواند در سیستمهای شبهعملیاتی بدون افت عملکرد چشمگیر استفاده شود.
مقادیر دادهشده باید دقیقاً توانی از ۲ باشند و stack-size باید بدون تجاوز از 64k، بزرگتر از stack-guard باشد. برای کارایی بهینه، کد اضافی این فرض را در نظر میگیرد که پشته در آدرسی همتراز با مقدار مشخصشده توسط stack-size آغاز میشود.
گزینهٔ -mstack-guard= فقط میتواند در ترکیب با -mstack-size= به کار رود. شما میتوانید این گزینهها را در خط فرمان به ترتیب با -mno-stack-guard و -mno-stack-size بازنویسی و لغو کنید.
- -mhotpatch=pre-halfwords,post-halfwords
- اگر گزینهٔ
وصلهزنی
زنده (hotpatch)
فعال باشد،
یک مقدمهٔ
تابع مخصوص
وصلهزنی
زنده برای
تمامی
توابع
موجود در
واحد
کامپایل
تولید
میشود. پیش
از برچسب
تابع،
تعداد
مشخصشدهای
از
دستورالعملهای
دو بایتی NOP
قرار
میگیرد
(pre-halfwords،
حداکثر
۱۰۰۰۰۰۰).
پس از
برچسب، ۲ *
post-halfwords بایت با
استفاده از
بزرگترین
دستورالعملهای
شبیه NOP که
معماری
اجازه
میدهد
افزوده
میشود
(حداکثر
۱۰۰۰۰۰۰).
اگر هر دو آرگومان صفر باشند، وصلهزنی زنده غیرفعال است.
این گزینه را میتوان برای توابع منفرد با استفاده از صفت "hotpatch" لغو و جایگزین کرد.
- -mpic-data-is-text-relative
- -mno-pic-data-is-text-relative
- هنگام کامپایل برای S/390 با -fpic یا -fPIC، بهطور معمول GCC کدی با استفاده از آدرسدهی نسبی بین کد و داده تولید میکند. با این حال، برای وصلهزدن زنده (hotpatching) ممکن است نیاز باشد بخشهای جدید ".text" اضافه شوند در حالی که از بخشهای موجود ".data" و ".bss" استفاده میشود. در این حالت، برای اجبار به آدرسدهی از طریق GOT از -mno-pic-data-is-text-relative استفاده کنید.
- -mstack-protector-guard=guard
- -mstack-protector-guard-record
- کد محافظت
از پشته را
با استفاده
از قناری (canary)
در guard تولید
میکند.
مکانهای
پشتیبانیشده
عبارتند از
global برای یک
قناری
سراسری یا
tls برای یک
قناری به
ازای هر
رشته در
بلوک TLS
(پیشفرض).
گزینه -mstack-protector-guard-record منجر به تولید بخش "__stack_protector_loc" شامل اشارهگرهایی به تمام دستورالعملهایی میشود که آدرس محافظ سراسری را بارگذاری میکنند. بنابراین، این گزینه فقط در ترکیب با -mstack-protector-guard=global مؤثر است. کاربرد مورد نظر آن برای هسته Linux است.
- -mindirect-branch=choice
- -mindirect-branch-jump=choice
- -mindirect-branch-call=choice
- -mfunction-return=choice
- -mfunction-return-mem=choice
- -mfunction-return-reg=choice
- این گروه از
گزینهها
با
فعالسازی
جایگزینی
پرشهای
غیرمستقیم
و
بازگشتهای
توابع با
پرشهای
مستقیم به
یک thunk،
آسیبپذیریهای
امنیتی
مرتبط با
اجرای حدسی
(speculative execution) و
پیشبینی
پرش
غیرمستقیم
را رفع
میکند.
مشخص کردن choice به عنوان keep باعث تولید کد پیشفرض میشود. مقدار thunk تولید thunkهای خارج از خط (out-of-line) را فعال کرده و پرش غیرمستقیم قبلی را با یک پرش مستقیم به thunk جایگزین میکند. مقدار thunk-extern جایگزینی پرش را مانند thunk انجام میدهد اما thunkها را تولید نمیکند. مقدار thunk-inline فقط با -mindirect-branch-jump در دسترس است؛ برای پشتیبانی از بازگشایی صحیح پشته و مدیریت استثناها، بهتر است در برنامههای فضای کاربر بهجای thunk از آن استفاده شود.
گزینه -mindirect-branch مقادیر -mindirect-branch-jump و -mindirect-branch-call را تنظیم میکند. گزینه -mfunction-return مقادیر -mfunction-return-reg و -mfunction-return-mem را تنظیم میکند.
تمامی این گزینهها را میتوان بر پایه هر تابع نیز با استفاده از ویژگیهای تابع (function attributes) تنظیم کرد.
- -mindirect-branch-table
- -mno-indirect-branch-table
- این گزینه در ترکیب با گزینههای -mindirect-branch و -mfunction-return مفید است. هنگامی که فعال باشد، باعث تولید جدولهایی میشود که به مکانهای پرشی که توسط آن گزینهها وصله شدهاند، اشاره میکنند. این جدولها در بخشهایی به نامهای ".s390_indirect_jump"، ".s390_indirect_call"، ".s390_return_reg" و ".s390_return_mem" منتشر میشوند. هر بخش شامل آرایهای از عناصر ۳۲ بیتی است؛ هر مدخل آفستِ از آن مدخل تا مکان وصلهشده را در خود نگه میدارد.
- -mfentry
- -mno-fentry
- هنگامی که در ترکیب با گزینه -pg استفاده شود، کد پروفایلینگ را با استفاده از قلاب "__fentry__" که توسط GLIBC 2.29 یا بالاتر ارائه شده، تولید میکند. این ویژگی فقط برای کد ۶۴ بیتی در دسترس است. اگر این گزینه فعال نباشد، پروفایلینگ در عوض از قلاب کمبازدهتر "_mcount" استفاده میکند.
- -mrecord-mcount
- -mno-record-mcount
- هنگامی که فعال باشد، یک بخش "__mcount_loc" شامل مکانهای تمام فراخوانیهای پروفایلینگ تولیدشده برای "_mcount" یا "__fentry__" ایجاد میکند.
- mnop-mcount
- mno-nop-mcount
- بهجای تولید فراخوانیها به "_mcount" یا "__fentry__" با -pg، دنبالهای از دستورالعملهای بیاثر (no-op) با همان طول را در مکانهایی که فراخوانیها باید درج میشدند، وارد میکند. این گزینه میتواند در ترکیب با گزینه -mrecord-mcount برای وصله کردن دنبالههای فراخوانی در فایل شیء (object file) بدون کامپایل مجدد آن استفاده شود.
- -mpreserve-args
- -mno-preserve-args
- هنگامی که فعال باشد، تمام ثباتهای آرگومان را در پشته ذخیره کرده و اطلاعات CFI متناظر را تولید میکند. این گزینه برای برنامههایی که مایلند بازگشایی پشته مختص به خود را پیادهسازی کنند و به آرگومانهای تابع نیاز دارند مفید است.
- -munaligned-symbols
- -mno-unaligned-symbols
- فرض میکند که نمادهای خارجی با همترازی طبیعی ۱ بالقوه ناتراز (unaligned) هستند. بهطور پیشفرض، تمام نمادهای بدون تراز صریح، همانگونه که توسط IBM Z ABI تعیین شده است، بر روی مرز ۲ بایتی تراز فرض میشوند.
گزینههای SH
این گزینههای -m برای پیادهسازیهای SH تعریف شدهاند:
- -m1
- تولید کد برای SH1.
- -m2
- تولید کد برای SH2.
- -m2e
- تولید کد برای SH2e.
- -m2a-nofpu
- تولید کد برای SH2a بدون FPU، یا برای یک SH2a-FPU به نحوی که از واحد ممیز شناور استفاده نشود.
- -m2a-single-only
- تولید کد برای SH2a-FPU به گونهای که از هیچ عملیات ممیز شناور با دقت مضاعف (double-precision) استفاده نشود.
- -m2a-single
- تولید کد برای SH2a-FPU با فرض اینکه واحد ممیز شناور بهطور پیشفرض در حالت دقت منفرد (single-precision) است.
- -m2a
- تولید کد برای SH2a-FPU با فرض اینکه واحد ممیز شناور بهطور پیشفرض در حالت دقت مضاعف است.
- -m3
- تولید کد برای SH3.
- -m3e
- تولید کد برای SH3e.
- -m4-nofpu
- تولید کد برای SH4 بدون واحد ممیز شناور.
- -m4-single-only
- تولید کد برای SH4 با واحد ممیز شناوری که فقط از محاسبات با دقت منفرد پشتیبانی میکند.
- -m4-single
- تولید کد برای SH4 با فرض اینکه واحد ممیز شناور بهطور پیشفرض در حالت دقت منفرد است.
- -m4
- تولید کد برای SH4.
- -m4-100
- تولید کد برای SH4-100.
- -m4-100-nofpu
- تولید کد برای SH4-100 به نحوی که از واحد ممیز شناور استفاده نشود.
- -m4-100-single
- تولید کد برای SH4-100 با فرض اینکه واحد ممیز شناور بهطور پیشفرض در حالت دقت منفرد است..IP -m4-100-single-only 4 تولید کد برای SH4-100 به گونهای که از هیچ عملیات ممیز شناور با دقت مضاعف استفاده نشود.
- -m4-200
- تولید کد برای SH4-200.
- -m4-200-nofpu
- تولید کد برای SH4-200 به گونهای که از واحد ممیز شناور استفاده نشود.
- -m4-200-single
- تولید کد برای SH4-200 با این فرض که واحد ممیز شناور بهطور پیشفرض در حالت دقت یگانه قرار دارد.
- -m4-200-single-only
- تولید کد برای SH4-200 به گونهای که از هیچ عملیات ممیز شناور با دقت مضاعف استفاده نشود.
- -m4-300
- تولید کد برای SH4-300.
- -m4-300-nofpu
- تولید کد برای SH4-300 به گونهای که از واحد ممیز شناور استفاده نشود.
- -m4-300-single
- تولید کد برای SH4-300 به گونهای که از هیچ عملیات ممیز شناور با دقت مضاعف استفاده نشود.
- -m4-300-single-only
- تولید کد برای SH4-300 به گونهای که از هیچ عملیات ممیز شناور با دقت مضاعف استفاده نشود.
- -m4-340
- تولید کد برای SH4-340 (بدون MMU، بدون FPU).
- -m4-400
- تولید کد برای SH4-400 (بدون MMU، بدون FPU).
- -m4-500
- تولید کد برای SH4-500 (بدون FPU). گزینهٔ -isa=sh4-nofpu را به اسمبلر ارسال میکند.
- -m4a-nofpu
- تولید کد برای SH4al-dsp، یا برای یک SH4a به گونهای که از واحد ممیز شناور استفاده نشود.
- -m4a-single-only
- تولید کد برای SH4a به گونهای که از هیچ عملیات ممیز شناور با دقت مضاعف استفاده نشود.
- -m4a-single
- تولید کد برای SH4a با این فرض که واحد ممیز شناور بهطور پیشفرض در حالت دقت یگانه قرار دارد.
- -m4a
- تولید کد برای SH4a.
- -m4al
- مشابه -m4a-nofpu، به جز اینکه بهطور ضمنی -dsp را به اسمبلر ارسال میکند. کامپایلر GCC در حال حاضر هیچ دستورالعمل DSP تولید نمیکند.
- -mb
- کامپایل کد برای پردازنده در حالت big-endian.
- -ml
- کامپایل کد برای پردازنده در حالت little-endian.
- -mdalign
- همتراز کردن دادههای دقت مضاعف (doubles) در مرزهای ۶۴ بیتی. توجه داشته باشید که این کار قراردادهای فراخوانی را تغییر میدهد و در نتیجه برخی از توابع کتابخانه استاندارد C کار نخواهند کرد، مگر اینکه ابتدا آن را با -mdalign بازکامپایل کنید.
- -mrelax
- کوتاهتر کردن برخی از ارجاعات آدرس در زمان پیوند در صورت امکان؛ از گزینهٔ پیونددهندهٔ -relax استفاده میکند.
- -mbigtable
- استفاده از آفستهای ۳۲ بیتی در جدولهای "switch". پیشفرض استفاده از آفستهای ۱۶ بیتی است.
- -mbitops
- فعالسازی استفاده از دستورالعملهای دستکاری بیت روی SH2A.
- -mfmovd
- فعالسازی استفاده از دستورالعمل "fmovd". محدودیتهای تراز را در -mdalign بررسی کنید.
- -mrenesas
- -mno-renesas
- مطابقت با قراردادهای فراخوانی تعریفشده توسط Renesas. پیشفرض برای تمامی مقصدهای زنجیره ابزار SH گزینهٔ -mno-renesas است که از قراردادهای فراخوانی تعریفشده برای GCC قبل از در دسترس قرار گرفتن قراردادهای Renesas استفاده میکند.
- -mnomacsave
- علامتگذاری ثبات "MAC" به عنوان call-clobbered، حتی اگر گزینهٔ -mrenesas داده شده باشد.
- -mieee
- -mno-ieee
- کنترل تطابق مقایسههای ممیز شناور با استاندارد IEEE، که بر نحوه مدیریت مواردی که نتیجه یک مقایسه نامرتب (unordered) است تأثیر میگذارد. بهطور پیشفرض -mieee بهصورت ضمنی فعال است. اگر -ffinite-math-only فعال باشد، -mno-ieee بهطور ضمنی تنظیم میشود که منجر به مقایسههای ممیز شناور سریعتر «بزرگتر یا مساوی» و «کوچکتر یا مساوی» میگردد. تنظیمات ضمنی را میتوان با تعیین -mieee یا -mno-ieee لغو کرد.
- -minline-ic_invalidate
- -mno-inline-ic_invalidate
- درونخطی (Inline) کردن کد برای باطلسازی ورودیهای حافظهٔ نهان دستورالعمل (instruction cache) پس از راهاندازی ترامپولینهای توابع تودرتو. این گزینه در صورتی که -musermode فعال باشد و گزینهٔ تولید کدِ انتخابشده (مانند -m4) اجازه استفاده از دستورالعمل "icbi" را ندهد، هیچ تأثیری ندارد. اگر گزینهٔ تولید کدِ انتخابشده اجازه استفاده از دستورالعمل "icbi" را ندهد و -musermode فعال نباشد، کد درونخطیشده آرایهٔ آدرس حافظهٔ نهان دستورالعمل را مستقیماً با یک نوشتن انجمنی (associative write) دستکاری میکند. این امر نه تنها در زمان اجرا به حالت ممتاز (privileged mode) نیاز دارد، بلکه در صورتی که خط حافظهٔ نهان از طریق TLB نگاشت شده و سپس نگاشت آن لغو شده باشد، با شکست مواجه میشود.
- -misize
- درج اندازه و محل دستورالعمل در کد اسمبلی.
- -matomic-model=model
- مدل عملیات اتمی و پارامترهای اضافی را به صورت یک فهرست جداشده با کاما تنظیم میکند. برای جزئیات درباره توابع توکار اتمی، بخش __atomic Builtins را ببینید. مدلها و پارامترهای زیر پشتیبانی میشوند:
- none
- غیرفعال کردن توالیهای اتمی تولیدشده توسط کامپایلر و ارسال فراخوانیهای کتابخانهای برای عملیات اتمی. این حالت پیشفرض است اگر مقصد "sh*-*-linux*" نباشد.
- soft-gusa
- تولید توالیهای اتمی نرمافزاری gUSA سازگار با GNU/Linux برای توابع توکار اتمی. توالیهای اتمی تولیدشده به پشتیبانی اضافی از سوی کد مدیریت وقفه/استثنای سیستم نیاز دارند و فقط برای سیستمهای تکهستهای SH3* و SH4* مناسب هستند. این گزینه زمانی که مقصد "sh*-*-linux*" و پردازنده SH3* یا SH4* باشد، بهطور پیشفرض فعال است. هنگامی که مقصد SH4A باشد، این گزینه همچنین تا حدی از دستورالعملهای سختافزاری اتمی "movli.l" و "movco.l" برای تولید کد بهینهتر استفاده میکند، مگر اینکه strict مشخص شده باشد.
- soft-tcb
- تولید توالیهای نرمافزاری اتمی که از متغیری در بلوک کنترل ریسه (thread control block) استفاده میکنند. این مورد نوعی تغییریافته از توالیهای gUSA است که میتواند روی مقصدهای SH1* و SH2* نیز استفاده شود. توالیهای اتمی تولیدشده به پشتیبانی اضافی از طرف کد مدیریت وقفه/استثنای سیستم نیاز دارند و فقط برای سیستمهای تکهستهای مناسب هستند. هنگام استفاده از این مدل، پارامتر gbr-offset= نیز باید مشخص شود.
- soft-imask
- تولید توالیهای اتمی نرمافزاری که وقفهها را موقتاً با تنظیم "SR.IMASK = 1111" غیرفعال میکنند. این مدل فقط زمانی کار میکند که برنامه در حالت ممتاز (privileged mode) اجرا شود و تنها برای سیستمهای تکهستهای مناسب است. پشتیبانی اضافی از طرف کد مدیریت وقفه/استثنای سیستم برای این حالت لازم نیست. این مدل بهطور پیشفرض زمانی که مقصد "sh*-*-linux*" و SH1* یا SH2* باشد فعال میشود.
- hard-llcs
- تولید توالیهای اتمی سختافزاری تنها با استفاده از دستورالعملهای "movli.l" و "movco.l". این قابلیت تنها روی SH4A در دسترس است و برای سیستمهای چندهستهای مناسب میباشد. از آنجا که دستورالعملهای سختافزاری فقط از متغیرهای اتمی ۳۲ بیتی پشتیبانی میکنند، دسترسی به متغیرهای ۸ یا ۱۶ بیتی با دسترسیهای ۳۲ بیتی شبیهسازی میشود. کد کامپایلشده با این گزینه، در صورت اجرا روی سیستم SH4A، با سیستمهای مدیریت وقفه/استثنای سایر مدلهای اتمی نرمافزاری نیز سازگار است. برای این مدل پشتیبانی اضافی از طرف کد مدیریت وقفه/استثنای سیستم لازم نیست..IP gbr-offset= 4 این پارامتر، آفست (برحسب بایت) متغیر در ساختار بلوک کنترل ریسه (thread control block) را مشخص میکند که باید توسط توالیهای اتمیکِ تولیدشده در هنگام انتخاب مدل soft-tcb استفاده شود. برای سایر مدلها، این پارامتر نادیده گرفته میشود. مقدار مشخصشده باید مضرب صحیحی از چهار و در بازهٔ 0-1020 باشد.
- strict
- این پارامتر از استفادهٔ ترکیبی چندین مدل اتمیک، حتی در صورت سازگار بودن آنها، جلوگیری میکند و کامپایلر را وادار میسازد تا توالیهای اتمیک را تنها بر اساس مدل مشخصشده تولید کند.
- -mtas
- کد دستوریِ "tas.b" را برای "__atomic_test_and_set" تولید میکند. توجه داشته باشید که بسته به پیکربندی سختافزاری و نرمافزاری خاص، این کار میتواند به دلیل تخلیهٔ خط حافظهٔ نهانِ عملوند ناشی از دستورالعمل "tas.b"، کارایی کلی را کاهش دهد. در پردازندههای چندهستهای SH4A، دستورالعمل "tas.b" باید با احتیاط استفاده شود چرا که در برخی پیکربندیهای حافظهٔ نهان میتواند منجر به آسیبدیدگی دادهها شود.
- -mprefergot
- هنگام تولید کد مستقل از موقعیت، فراخوانیهای تابع را به جای جدول پیوند رویه (Procedure Linkage Table) با استفاده از جدول آفست سراسری (Global Offset Table) صادر میکند.
- -musermode
- -mno-usermode
- به کامپایلر اجازه نمیدهد (اجازه میدهد) کدی برای حالت ممتاز تولید کند. مشخص کردن -musermode همچنین در صورتی که کد درونخطیشده در حالت کاربری کار نکند، -mno-inline-ic_invalidate را نیز در بر دارد. -musermode هنگامی که مقصد "sh*-*-linux*" باشد، حالت پیشفرض است. اگر مقصد SH1* یا SH2* باشد، -musermode هیچ تأثیری ندارد، زیرا حالت کاربری وجود ندارد.
- -multcost=number
- هزینهٔ در نظر گرفتهشده برای یک دستورالعمل ضرب را تعیین میکند.
- -mdiv=strategy
- راهبرد تقسیم مورد استفاده برای عملیات تقسیم عدد صحیح را تعیین میکند. strategy میتواند یکی از موارد زیر باشد:
- call-div1
- تابعی از کتابخانه را فراخوانی میکند که برای انجام عملیات از دستورالعمل تقسیم تکمرحلهای "div1" استفاده میکند. تقسیم بر صفر نتیجهای نامشخص تولید میکند و به تله (trap) منجر نمیشود. این حالت بهجز برای SH4، SH2A و SHcompact پیشفرض است.
- call-fp
- تابعی از کتابخانه را فراخوانی میکند که عملیات را با ممیز شناور دقتمضاعف انجام میدهد. تقسیم بر صفر باعث ایجاد استثنای ممیز شناور میشود. این حالت برای SHcompact دارای FPU پیشفرض است. مشخص کردن این مورد برای مقاصدی که فاقد FPU دقتمضاعف هستند، به "call-div1" برمیگردد.
- call-table
- تابعی از کتابخانه را فراخوانی میکند که برای مقسومعلیههای کوچک از یک جدول جستوجو (lookup table) و برای مقسومعلیههای بزرگتر از دستورالعمل "div1" همراه با تفکیک حالات استفاده میکند. تقسیم بر صفر نتیجهای نامشخص تولید میکند و به تله منجر نمیشود. این حالت پیشفرضِ SH4 است. مشخص کردن این مورد برای مقاصدی که فاقد دستورالعملهای تغییر مکان پویا هستند، به "call-div1" برمیگردد.
هنگامی که راهبرد تقسیم مشخص نشده باشد، راهبرد پیشفرض بر اساس مقصد فعلی انتخاب میشود. برای SH2A راهبرد پیشفرض، استفاده از دستورالعملهای "divs" و "divu" به جای فراخوانی توابع کتابخانهای است.
- -maccumulate-outgoing-args
- -mno-accumulate-outgoing-args
- فضا را یکبار در مقدمهٔ تابع برای آرگومانهای خروجی رزرو میکند، به جای آنکه این کار در اطراف هر فراخوانی انجام شود. این کار بهطور کلی برای کارایی و اندازه مفید است و همچنین برای بازپیچی (unwinding) جهت جلوگیری از تغییر فریم پشته در اطراف کد شرطی لازم است. -maccumulate-outgoing-args بهطور پیشفرض فعال است.
- -mdivsi3_libfunc=name
- نام تابع کتابخانهای مورد استفاده برای تقسیم علامتدار ۳۲ بیتی را روی name تنظیم میکند. این گزینه فقط بر نام استفادهشده در راهبردهای تقسیم call تأثیر میگذارد، و کامپایلر همچنان انتظار همان مجموعههای ثباتهای ورودی/خروجی/تخریبشده را دارد که گویی این گزینه وجود نداشته است.
- -mfixed-range=register-range
- کدی تولید میکند که با بازهٔ ثباتهای ارائهشده به عنوان ثباتهای ثابت برخورد میکند. ثبات ثابت ثباتی است که تخصیصدهندهٔ ثبات نمیتواند از آن استفاده کند. این گزینه هنگام کامپایل کد هسته مفید است. بازهٔ ثبات با دو ثبات که با یک خط تیره از هم جدا شدهاند مشخص میشود. میتوان چندین بازهٔ ثبات را جداشده با کاما مشخص کرد.
- -mbranch-cost=num
- مقدار num را به عنوان هزینهٔ یک دستورالعمل انشعاب در نظر میگیرد. مقادیر بالاتر باعث میشوند کامپایلر در صورت امکان تلاش کند کدهای بدون انشعاب بیشتری تولید کند. اگر مشخص نشود، این مقدار بسته به نوع پردازندهای که برای آن کامپایل میشود انتخاب میگردد.
- -mzdcbranch
- -mno-zdcbranch
- فرض میکند (فرض نمیکند) که دستورالعملهای انشعاب شرطی با جابهجایی صفر "bt" و "bf" سریع هستند. اگر -mzdcbranch مشخص شود، کامپایلر توالیهای کد انشعاب با جابهجایی صفر را ترجیح میدهد. این گزینه هنگام تولید کد برای SH4 و SH4A بهطور پیشفرض فعال است. میتوان آن را بهطور صریح با مشخص کردن -mno-zdcbranch غیرفعال کرد.
- -mcbranch-force-delay-slot
- استفاده از شکافهای تأخیر را برای انشعابهای شرطی اجباری میکند، که در صورت نیافتن دستورالعمل مناسب، شکاف تأخیر را با یک "nop" پر میکند. بهطور پیشفرض این گزینه غیرفعال است. این گزینه میتواند برای دور زدن اشکالات سختافزاریِ موجود در SH7055 اصلی فعال شود.
- -mfsca
- -mno-fsca
- به کامپایلر اجازه میدهد یا نمیدهد که دستورالعمل "fsca" را برای تقریبهای سینوس و کسینوس صادر کند. گزینهٔ -mfsca باید در ترکیب با -funsafe-math-optimizations استفاده شود. این گزینه هنگام تولید کد برای SH4A بهطور پیشفرض فعال است. استفاده از -mno-fsca تقریبهای سینوس و کسینوس را غیرفعال میکند، حتی اگر -funsafe-math-optimizations فعال باشد.
- -mfsrra
- -mno-fsrra
- به کامپایلر اجازه میدهد یا نمیدهد که دستورالعمل "fsrra" را برای تقریبهای معکوس ریشهٔ دوم صادر کند. گزینهٔ -mfsrra باید در ترکیب با -funsafe-math-optimizations و -ffinite-math-only استفاده شود. این گزینه هنگام تولید کد برای SH4A بهطور پیشفرض فعال است. استفاده از -mno-fsrra تقریبهای معکوس ریشهٔ دوم را غیرفعال میکند، حتی اگر -funsafe-math-optimizations و -ffinite-math-only فعال باشند.
- -mpretend-cmove
- -mno-pretend-cmove
- انشعابهای شرطی با جابهجایی صفر را برای الگوهای دستورالعمل انتقال شرطی ترجیح میدهد یا ترجیح نمیدهد. این کار میتواند منجر به کدهای سریعتر در پردازندهٔ SH4 شود.
- -mfdpic
- -mno-fdpic
- کد را با استفاده از ABI مربوط به FDPIC تولید میکند.
- -mlra
- -mno-lra
- از تخصیصدهندهٔ جدید ثبات LRA استفاده میکند. بهطور پیشفرض، تخصیصدهندهٔ قدیمی «reload» استفاده میشود.
گزینههای Solaris 2
این گزینهها در Solaris 2 پشتیبانی میشوند:
- -mclear-hwcap
- -mno-clear-hwcap
- گزینهٔ -mclear-hwcap به کامپایلر میگوید قابلیتهای سختافزاری (hardware capabilities) تولیدشده توسط اسمبلر Solaris را حذف کند. این کار تنها زمانی ضروری است که فایلهای شیء از افزونههای ISA استفاده میکنند که توسط ماشین فعلی پشتیبانی نمیشود، اما در زمان اجرا بررسی میکنند که آیا باید از آنها استفاده شود یا خیر.
- -mimpure-text
- -mno-impure-text
- گزینهٔ -mimpure-text
که علاوه بر
-shared استفاده
میشود، به
کامپایلر
میگوید
هنگام
پیوند یک
شیء
اشتراکی (shared
object)، گزینهٔ -z
text را به
پیونددهنده
ارسال نکند.
با استفاده
از این
گزینه،
میتوانید
کد وابسته
به موقعیت
(position-dependent) را به یک
شیء
اشتراکی
پیوند دهید.
گزینهٔ -mimpure-text پیام خطای پیونددهنده مبنی بر «relocations remain against allocatable but non-writable sections» را فرونشانی میکند. با این حال، بازنشانیهای ضروری باعث برانگیختن رونوشت در زمان نوشتن (copy-on-write) میشوند و شیء اشتراکی عملاً بین فرایندها به اشتراک گذاشته نمیشود. به جای استفاده از -mimpure-text، باید تمام کدهای منبع را با -fpic یا -fPIC کامپایل کنید.
- -gsctf
- قالب CTF مربوط به Solaris را تولید میکند. باید هم برای کامپایل و هم برای پیوند استفاده شود. برای اطلاعات بیشتر ctf(7) را ببینید. این گزینه تنها از Solaris 11.4 SRU 84 به بعد که پشتیبانی لازم به زنجیرهابزار افزوده شد، پشتیبانی میشود.
گزینههای SPARC
این گزینههای -m در SPARC پشتیبانی میشوند:
- -mno-app-regs
- -mapp-regs
- گزینهٔ -mapp-regs
را مشخص
کنید تا
خروجی با
استفاده از
ثباتهای
سراسری ۲ تا
۴ تولید
شود؛
ثباتهایی
که SPARC SVR4 ABI برای
برنامههای
کاربردی
رزرو کرده
است. مانند
ثبات
سراسری ۱،
با هر یک از
ثباتهای
سراسری ۲ تا
۴ نیز به
عنوان یک
ثبات قابل
تخصیص که با
فراخوانی
توابع
بازنویسی (clobber)
میشود
رفتار
خواهد شد.
این حالت
پیشفرض
است.
برای سازگاری کامل با SVR4 ABI به قیمت مقداری افت کارایی، -mno-app-regs را مشخص کنید. باید کتابخانهها و نرمافزارهای سیستمی را با این گزینه کامپایل کنید.
- -mflat
- -mno-flat
- با -mflat،
کامپایلر
دستورالعملهای
save/restore را تولید
نمیکند و
از یک مدل
پنجرهٔ
ثبات
«مسطح» (flat) یا
تکپنجرهای
استفاده
میکند. این
مدل با مدل
پنجرهٔ
ثبات
معمولی
سازگار است.
ثباتهای
محلی و
ثباتهای
ورودی (۰ تا
۵) همچنان
به عنوان
ثباتهای
ذخیرهشده
توسط
فراخواندهشده
(call-saved) در نظر
گرفته
میشوند و
در صورت
نیاز روی
پشته ذخیره
میشوند.
با -mno-flat (پیشفرض)، کامپایلر دستورالعملهای save/restore را تولید میکند (به جز برای توابع برگ یا leaf functions). این حالت کاری عادی است.
- -mfpu
- -mhard-float
- خروجی شامل دستورالعملهای ممیز شناور (floating-point) تولید میکند. این حالت پیشفرض است.
- -mno-fpu
- -msoft-float
- خروجی شامل
فراخوانیهای
کتابخانهای
برای ممیز
شناور
تولید
میکند.
هشدار:
کتابخانههای
لازم برای
تمام اهداف
SPARC در دسترس
نیستند.
معمولاً از
امکانات
کامپایلر C
معمول
ماشین
استفاده
میشود،
اما این کار
در کامپایل
متقابل (cross-compilation)
مستقیماً
امکانپذیر
نیست. برای
کامپایل
متقابل
باید
خودتان
ترتیبی
برای
ارائهٔ
توابع
کتابخانهای
مناسب
اتخاذ کنید.
اهداف
توکار sparc-*-aout و
sparclite-*-*
پشتیبانی
ممیز شناور
نرمافزاری
را ارائه
میدهند.
گزینهٔ -msoft-float شیوهٔ فراخوانی (calling convention) را در فایل خروجی تغییر میدهد؛ بنابراین تنها زمانی مفید است که تمام برنامه را با این گزینه کامپایل کنید. بهویژه، باید libgcc.a (کتابخانهای که همراه GCC ارائه میشود) را با -msoft-float کامپایل کنید تا به درستی کار کند.
- -mhard-quad-float
- خروجی شامل دستورالعملهای ممیز شناور با کلمهٔ چهارگانه (long double) تولید میکند.
- -msoft-quad-float
- خروجی شامل
فراخوانیهای
کتابخانهای
برای
دستورالعملهای
ممیز شناور
با کلمهٔ
چهارگانه (long
double) تولید
میکند.
توابع
فراخوانیشده
همانهایی
هستند که در
SPARC ABI مشخص
شدهاند.
این حالت
پیشفرض
است.
تا زمان نگارش این مستند، هیچ پیادهسازی از SPARC وجود ندارد که از دستورالعملهای سختافزاری ممیز شناور کلمهٔ چهارگانه پشتیبانی کند. همهٔ آنها برای این دستورالعملها یک گردانندهٔ تله (trap handler) فراخوانی میکنند، و سپس گردانندهٔ تله اثر آن دستورالعمل را شبیهسازی میکند. به دلیل سربار گردانندهٔ تله، این روش بسیار کندتر از فراخوانی توابع کتابخانهٔ ABI است. بنابراین گزینهٔ -msoft-quad-float پیشفرض است.
- -mno-unaligned-doubles
- -munaligned-doubles
- فرض میکند
که doubleها
ترازبندی ۸
بایتی
دارند. این
حالت
پیشفرض
است.
با -munaligned-doubles، کامپایلر GCC تنها در صورتی فرض میکند که doubleها ترازبندی ۸ بایتی دارند که در نوع دیگری گنجانده شده باشند، یا آدرس مطلق داشته باشند. در غیر این صورت، فرض میکند که آنها ترازبندی ۴ بایتی دارند. مشخص کردن این گزینه از برخی مشکلات نادر سازگاری با کدهای تولیدشده توسط دیگر کامپایلرها جلوگیری میکند. این حالت پیشفرض نیست زیرا منجر به افت کارایی، بهویژه برای کدهای ممیز شناور میشود.
- -muser-mode
- -mno-user-mode
- کدی که فقط میتواند در حالت ناظر (supervisor mode) اجرا شود تولید نمیکند. این موضوع تنها مربوط به دستورالعمل "casa" است که برای پردازندهٔ LEON3 صادر میشود. این حالت پیشفرض است.
- -mfaster-structs
- -mno-faster-structs
- با -mfaster-structs، کامپایلر فرض میکند ساختارها (structures) باید ترازبندی ۸ بایتی داشته باشند. این کار استفاده از جفتدستورالعملهای "ldd" و "std" را برای رونوشتها در انتساب ساختار، به جای دو برابر جفتهای "ld" و "st" ممکن میسازد. با این حال، استفاده از این ترازبندی تغییریافته مستقیماً SPARC ABI را نقض میکند. بنابراین، این گزینه فقط برای استفاده روی اهدافی در نظر گرفته شده است که توسعهدهنده اذعان دارد کد حاصل مستقیماً با قوانین ABI مطابقت ندارد.
- -mstd-struct-return
- -mno-std-struct-return
- با -mstd-struct-return،
کامپایلر
طبق 32-bit ABI
کدهای
بررسیکننده
در توابعی
که
ساختارها
یا
اجتماعها
(unions) را
برمیگردانند
تولید
میکند تا
عدم تطابق
اندازه
میان دو طرف
فراخوانی
تابع را
تشخیص دهد.
پیشفرض -mno-std-struct-return است. این گزینه در حالت ۶۴ بیتی هیچ اثری ندارد.
- -mcpu=cpu_type
- مجموعه
دستورالعمل،
مجموعه
ثباتها، و
پارامترهای
زمانبندی
دستورالعمل
را برای نوع
ماشین cpu_type
تنظیم
میکند.
مقادیر
پشتیبانیشده
برای cpu_type
عبارتند از:
v7، cypress، v8،
supersparc، hypersparc، leon،
leon3، leon3v7، leon5،
sparclite، f930، f934،
sparclite86x، sparclet، tsc701،
v9، ultrasparc، ultrasparc3،
niagara، niagara2، niagara3،
niagara4، niagara7 و m8.
زنجیرهابزارهای بومی Solaris و GNU/Linux همچنین از مقدار native پشتیبانی میکنند که بهترین گزینهٔ معماری را برای پردازندهٔ میزبان انتخاب میکند. اگر GCC پردازنده را شناسایی نکند، -mcpu=native هیچ تأثیری ندارد.
پارامترهای زمانبندی دستورالعمل پیشفرض برای مقادیری استفاده میشوند که یک معماری و نه یک پیادهسازی را انتخاب میکنند. این مقادیر عبارتند از v7، v8، sparclite، sparclet و v9.
در اینجا فهرستی از هر معماری پشتیبانیشده و پیادهسازیهای پشتیبانیشدهٔ آنها آمده است.
بهطور پیشفرض (مگر اینکه طور دیگری پیکربندی شده باشد)، GCC کدی برای گونهٔ V7 از معماری SPARC تولید میکند. با -mcpu=cypress، کامپایلر علاوه بر آن، کد را برای تراشهٔ Cypress CY7C602 که در سری SPARCStation/SPARCServer 3xx استفاده شده است بهینهسازی میکند. این مقدار همچنین برای مدلهای قدیمیتر SPARCStation 1، 2، IPX و غیره مناسب است.
با -mcpu=v8، کامپایلر GCC کدی برای گونهٔ V8 معماری SPARC تولید میکند. تنها تفاوت آن با کد V7 این است که کامپایلر دستورالعملهای ضرب عدد صحیح و تقسیم عدد صحیح را صادر میکند که در SPARC-V8 وجود دارند اما در SPARC-V7 موجود نیستند. با -mcpu=supersparc، کامپایلر علاوه بر این، کد را برای تراشهٔ SuperSPARC، که در سری SPARCStation 10، 1000 و 2000 به کار رفته است، بهینهسازی میکند.
با -mcpu=sparclite، کامپایلر GCC کدی برای گونهٔ SPARClite معماری SPARC تولید میکند. این گزینه دستورالعملهای ضرب عدد صحیح، گام تقسیم عدد صحیح و پویش ("ffs") را که در SPARClite وجود داشته اما در SPARC-V7 وجود ندارند اضافه میکند. با -mcpu=f930، کامپایلر علاوه بر این، کد را برای تراشهٔ Fujitsu MB86930 که گونهٔ اولیهٔ SPARClite و بدون FPU است بهینهسازی میکند. با -mcpu=f934، کامپایلر علاوه بر این، کد را برای تراشهٔ جدیدتر Fujitsu MB86934 همراه با FPU بهینهسازی میکند.
با -mcpu=sparclet، کامپایلر GCC کدی برای گونهٔ SPARClet معماری SPARC تولید میکند. این گزینه دستورالعملهای ضرب عدد صحیح، ضرب/انباشت، گام تقسیم عدد صحیح و پویش ("ffs") را که در SPARClet وجود دارند اما در SPARC-V7 نیستند اضافه میکند. با -mcpu=tsc701، کامپایلر علاوه بر این، کد را برای تراشهٔ TEMIC SPARClet بهینهسازی میکند.
با -mcpu=v9، کامپایلر GCC کدی برای گونهٔ V9 معماری SPARC تولید میکند. این گزینه دستورالعملهای انتقال ۶۴ بیتی عدد صحیح و ممیز شناور، ۳ ثبات کد وضعیت ممیز شناور اضافی و دستورالعملهای انتقال شرطی را اضافه میکند. با -mcpu=ultrasparc، کامپایلر علاوه بر این، کد را برای تراشههای Sun UltraSPARC I/II/IIi بهینهسازی میکند. با -mcpu=ultrasparc3، کامپایلر علاوه بر این، کد را برای تراشههای Sun UltraSPARC III/III+/IIIi/IIIi+/IV/IV+ بهینهسازی میکند. با -mcpu=niagara، کامپایلر علاوه بر این، کد را برای تراشههای Sun UltraSPARC T1 بهینهسازی میکند. با -mcpu=niagara2، کامپایلر علاوه بر این، کد را برای تراشههای Sun UltraSPARC T2 بهینهسازی میکند. با -mcpu=niagara3، کامپایلر علاوه بر این، کد را برای تراشههای Sun UltraSPARC T3 بهینهسازی میکند. با -mcpu=niagara4، کامپایلر علاوه بر این، کد را برای تراشههای Sun UltraSPARC T4 بهینهسازی میکند. با -mcpu=niagara7، کامپایلر علاوه بر این، کد را برای تراشههای Oracle SPARC M7 بهینهسازی میکند. با -mcpu=m8، کامپایلر علاوه بر این، کد را برای تراشههای Oracle M8 بهینهسازی میکند.
- -mtune=cpu_type
- پارامترهای
زمانبندی
دستورالعملها
را برای نوع
ماشین cpu_type
تعیین
میکند،
اما بر خلاف
گزینهٔ
-mcpu=cpu_type،
مجموعه
دستورالعملها
یا مجموعه
ثباتها را
تغییر
نمیدهد.
همان مقادیر مجاز برای -mcpu=cpu_type را میتوان برای -mtune=cpu_type نیز به کار برد، اما تنها مقادیر سودمند آنهایی هستند که یک پیادهسازی خاص از پردازنده را انتخاب میکنند. این مقادیر عبارتند از: cypress، supersparc، hypersparc، leon، leon3، leon3v7، leon5، f930، f934، sparclite86x، tsc701، ultrasparc، ultrasparc3، niagara، niagara2، niagara3، niagara4، niagara7 و m8. در زنجیرهابزارهای بومی Solaris و GNU/Linux، از مقدار native نیز میتوان استفاده کرد.
- -mv8plus
- -mno-v8plus
- با -mv8plus، کامپایلر GCC کدی منطبق بر ABI مربوط به SPARC-V8+ تولید میکند. تفاوت آن با ABI مربوط به V8 در این است که ثباتهای سراسری و خروجی ۶۴ بیتی در نظر گرفته میشوند. این گزینه بهطور پیشفرض در Solaris در حالت ۳۲ بیتی برای تمام پردازندههای SPARC-V9 فعال است.
- -mvis
- -mno-vis
- با -mvis، کامپایلر GCC کدی تولید میکند که از افزونههای مجموعه دستورالعمل تصویری (VIS) پردازندهٔ UltraSPARC بهره میبرد. مقدار پیشفرض -mno-vis است.
- -mvis2
- -mno-vis2
- با -mvis2، کامپایلر GCC کدی تولید میکند که از نسخهٔ 2.0 افزونههای مجموعه دستورالعمل تصویری UltraSPARC بهره میبرد. هنگام هدف قرار دادن پردازندهای که از این دستورالعملها پشتیبانی میکند، مانند UltraSPARC-III و جدیدتر، پیشفرض -mvis2 است. تعیین -mvis2 همچنین گزینهٔ -mvis را فعال میکند.
- -mvis3
- -mno-vis3
- با -mvis3، کامپایلر GCC کدی تولید میکند که از نسخهٔ 3.0 افزونههای مجموعه دستورالعمل تصویری UltraSPARC بهره میبرد. هنگام هدف قرار دادن پردازندهای که از این دستورالعملها پشتیبانی میکند، مانند niagara-3 و جدیدتر، پیشفرض -mvis3 است. تعیین -mvis3 همچنین گزینههای -mvis2 و -mvis را فعال میکند.
- -mvis3b
- -mno-vis3b
- با -mvis3b، کامپایلر GCC کدی تولید میکند که از نسخهٔ 3.0 افزونههای مجموعه دستورالعمل تصویری UltraSPARC، به همراه دستورالعملهای اضافی VIS معرفیشده در معماری Oracle SPARC 2011 بهره میبرد. هنگام هدف قرار دادن پردازندهای که از این دستورالعملها پشتیبانی میکند، مانند niagara-7 و جدیدتر، پیشفرض -mvis3b است. تعیین -mvis3b همچنین گزینههای -mvis3، -mvis2 و -mvis را فعال میکند.
- -mvis4
- -mno-vis4
- با -mvis4، کامپایلر GCC کدی تولید میکند که از نسخهٔ 4.0 افزونههای مجموعه دستورالعمل تصویری UltraSPARC بهره میبرد. هنگام هدف قرار دادن پردازندهای که از این دستورالعملها پشتیبانی میکند، مانند niagara-7 و جدیدتر، پیشفرض -mvis4 است. تعیین -mvis4 همچنین گزینههای -mvis3b، -mvis3، -mvis2 و -mvis را فعال میکند.
- -mvis4b
- -mno-vis4b
- با -mvis4b، کامپایلر GCC کدی تولید میکند که از نسخهٔ 4.0 افزونههای مجموعه دستورالعمل تصویری UltraSPARC، به همراه دستورالعملهای اضافی VIS معرفیشده در معماری Oracle SPARC 2017 بهره میبرد. هنگام هدف قرار دادن پردازندهای که از این دستورالعملها پشتیبانی میکند، مانند m8 و جدیدتر، پیشفرض -mvis4b است. تعیین -mvis4b همچنین گزینههای -mvis4، -mvis3b، -mvis3، -mvis2 و -mvis را فعال میکند.
- -mcbcond
- -mno-cbcond
- با -mcbcond، کامپایلر GCC کدی تولید میکند که از دستورالعملهای مقایسه و پرش شرطی (Compare-and-Branch-on-Condition) در UltraSPARC بهره میبرد. هنگام هدف قرار دادن پردازندهای که از این دستورالعملها پشتیبانی میکند، مانند Niagara-4 و جدیدتر، پیشفرض -mcbcond است.
- -mfmaf
- -mno-fmaf
- با -mfmaf، کامپایلر GCC کدی تولید میکند که از دستورالعملهای ممیز شناور ضرب-جمع توأم (Fused Multiply-Add) در UltraSPARC بهره میبرد. هنگام هدف قرار دادن پردازندهای که از این دستورالعملها پشتیبانی میکند، مانند Niagara-3 و جدیدتر، پیشفرض -mfmaf است.
- -mfsmuld
- -mno-fsmuld
- با -mfsmuld، کامپایلر GCC کدی تولید میکند که از دستورالعمل ضرب ممیز شناور تکی به دوگانه (FsMULd) بهره میبرد. هنگام هدف قرار دادن پردازندهای که از نسخههای معماری V8 یا V9 با FPU به جز -mcpu=leon پشتیبانی میکند، پیشفرض -mfsmuld است..IP -mpopc 4
- -mno-popc
- با -mpopc، کامپایلر GCC کدی تولید میکند که از دستورالعمل Population Count در UltraSPARC بهره میبرد. در صورت هدفقرار دادن پردازندهای که از چنین دستورالعملی پشتیبانی میکند (مانند Niagara-2 و بعد از آن)، پیشفرض -mpopc است.
- -msubxc
- -mno-subxc
- با -msubxc، کامپایلر GCC کدی تولید میکند که از دستورالعمل Subtract-Extended-with-Carry در UltraSPARC بهره میبرد. در صورت هدفقرار دادن پردازندهای که از چنین دستورالعملی پشتیبانی میکند (مانند Niagara-7 و بعد از آن)، پیشفرض -msubxc است.
- -mfix-at697f
- راهکار ثبتشده برای تکایراد سختافزاری (erratum) پردازنده Atmel AT697F (که متناظر با ایراد شماره ۱۳ پردازنده AT697E است) را فعال میکند.
- -mfix-ut699
- راهکارهای ثبتشده برای ایرادهای ممیز شناور (floating-point) و ایرادهای ابطال حافظهٔ نهان داده (data cache nullify) در پردازنده UT699 را فعال میکند.
- -mfix-ut700
- راهکار ثبتشده برای ایرادهای ذخیرهسازی متوالی (back-to-back store) پردازنده UT699E/UT700 را فعال میکند.
- -mfix-gr712rc
- راهکار ثبتشده برای ایرادهای ذخیرهسازی متوالی (back-to-back store) پردازنده GR712RC را فعال میکند.
این گزینههای -m، علاوه بر موارد بالا، بر روی پردازندههای SPARC-V9 در محیطهای ۶۴ بیتی پشتیبانی میشوند:
- -m32
- -m64
- کد را برای یک محیط ۳۲ بیتی یا ۶۴ بیتی تولید میکند. محیط ۳۲ بیتی، int، long و اشارهگر (pointer) را روی ۳۲ بیت تنظیم میکند. محیط ۶۴ بیتی، int را روی ۳۲ بیت و long و اشارهگر را روی ۶۴ بیت تنظیم میکند.
- -mptr32
- -mptr64
- بهترتیب از اشارهگرهای ۳۲ یا ۶۴ بیتی استفاده میکند. برخلاف گزینههای -m32 و -m64، این گزینه تنها بر اندازهٔ اشارهگر تأثیر میگذارد و تأثیری بر ABI ندارد.
- -mcmodel=which
- مدل کد را روی یکی از موارد زیر تنظیم میکند:
- medlow
- مدل کد Medium/Low: آدرسهای ۶۴ بیتی، برنامهها باید در ۳۲ بیت پایینی حافظه پیوند (link) داده شوند. برنامهها میتوانند بهصورت ایستا یا پویا پیوند داده شوند.
- medmid
- مدل کد Medium/Middle: آدرسهای ۶۴ بیتی، برنامهها باید در ۴۴ بیت پایینی حافظه پیوند داده شوند، قطعههای text و data باید اندازهای کمتر از 2GB داشته باشند و قطعه data باید در فاصلهٔ حداکثر 2GB از قطعه text قرار گیرد.
- medany
- مدل کد Medium/Anywhere: آدرسهای ۶۴ بیتی، برنامهها ممکن است در هر کجای حافظه پیوند داده شوند، قطعههای text و data باید اندازهای کمتر از 2GB داشته باشند و قطعه data باید در فاصلهٔ حداکثر 2GB از قطعه text واقع شود.
- embmedany
- مدل کد Medium/Anywhere برای سامانههای تعبیهشده (embedded): آدرسهای ۶۴ بیتی، قطعههای text و data باید اندازهای کمتر از 2GB داشته باشند، و هر دو میتوانند از هر کجای حافظه شروع شوند (تعیینشده در زمان پیوند). ثبات عمومی %g4 به ابتدای قطعه data اشاره میکند. برنامهها بهصورت ایستا پیوند میخورند و PIC پشتیبانی نمیشود.
- -mmemory-model=mem-model
- مدل حافظهٔ اجرایی روی پردازنده را به یکی از موارد زیر تنظیم میکند:
این مدلهای حافظه بهطور رسمی در پیوست D راهنمای معماری SPARC-V9، همانطور که در فیلد "PSTATE.MM" پردازنده مقداردهی میشوند، تعریف شدهاند.
- -mstack-bias
- -mno-stack-bias
- با -mstack-bias، کامپایلر GCC فرض میکند که اشارهگر پشته (stack pointer)، و در صورت وجود اشارهگر فریم (frame pointer)، دارای آفست -2047 هستند که هنگام ارجاع به فریم پشته باید مجدداً اضافه شود. این حالت، رفتار پیشفرض در حالت ۶۴ بیتی است. در غیر این صورت، فرض میشود چنین آفستی وجود ندارد.
گزینههای System V
این گزینههای اضافی در System V Release 4 برای سازگاری با سایر کامپایلرها در آن سیستمها در دسترس هستند:
- -G
- یک شیء اشتراکی (shared object) ایجاد میکند. توصیه میشود بهجای آن از -symbolic یا -shared استفاده شود.
- -YP,dirs
- برای کتابخانههای مشخصشده با -l فقط دایرکتوریهای dirs (و نه هیچ جای دیگر) را جستجو میکند.
- -Ym,dir
- برای یافتن پیشپردازندهٔ M4 در دایرکتوری dir جستجو میکند. اسمبلر از این گزینه استفاده میکند.
گزینههای V850
این گزینههای -m برای پیادهسازیهای V850 تعریف شدهاند:
- -mlong-calls
- -mno-long-calls
- با تمام فراخوانیها بهصورت دوردست (نزدیک) رفتار میکند. اگر فراخوانیها دوردست در نظر گرفته شوند، کامپایلر همواره آدرس تابع را در یک ثبات بارگذاری میکند و بهصورت غیرمستقیم از طریق اشارهگر فراخوانی را انجام میدهد.
- -mno-ep
- -mep
- بلوکهای پایهای را که ۴ بار یا بیشتر از یک اشارهگر شاخص برای کپی کردن اشارهگر در ثبات "ep" استفاده میکنند، بهینهسازی نمیکند (بهینهسازی میکند) و از دستورالعملهای کوتاهتر "sld" و "sst" بهره میبرد. در صورت بهینهسازی، گزینهٔ -mep بهطور پیشفرض فعال است.
- -mno-prolog-function
- -mprolog-function
- از توابع خارجی برای ذخیره و بازیابی ثباتها در آغاز و پایان (prologue و epilogue) تابع استفاده نمیکند (استفاده میکند). توابع خارجی کندتر هستند، اما اگر بیش از یک تابع تعداد یکسانی ثبات را ذخیره کنند، فضای کد کمتری مصرف میکنند. در صورت بهینهسازی، گزینهٔ -mprolog-function بهطور پیشفرض فعال است.
- -mspace
- تلاش میکند اندازهٔ کد تا جای ممکن کوچک شود. در حال حاضر، این گزینه فقط گزینههای -mep و -mprolog-function را فعال میکند..IP -mtda=n 4 متغیرهای ایستا یا سراسری را که اندازه آنها n بایت یا کمتر است، در ناحیه داده بسیار کوچک (tiny data area) که ثبات "ep" به آن اشاره میکند قرار میدهد. ناحیه داده بسیار کوچک میتواند در مجموع تا 256 بایت (128 بایت برای ارجاعات بایتی) را در خود جای دهد.
- -msda=n
- متغیرهای ایستا یا سراسری را که اندازه آنها n بایت یا کمتر است، در ناحیه داده کوچک (small data area) که ثبات "gp" به آن اشاره میکند قرار میدهد. ناحیه داده کوچک میتواند تا 64 کیلوبایت را در خود جای دهد.
- -mzda=n
- متغیرهای ایستا یا سراسری را که اندازه آنها n بایت یا کمتر است، در 32 کیلوبایت نخست حافظه قرار میدهد.
- -mv850
- مشخص میکند که پردازنده مقصد V850 است.
- -mv850e3v5
- مشخص میکند که پردازنده مقصد V850E3V5 است. در صورت استفاده از این گزینه، ثابت پیشپردازنده "__v850e3v5__" تعریف میشود.
- -mv850e2v4
- مشخص میکند که پردازنده مقصد V850E3V5 است. این گزینه یک نام مستعار برای گزینه -mv850e3v5 است.
- -mv850e2v3
- مشخص میکند که پردازنده مقصد V850E2V3 است. در صورت استفاده از این گزینه، ثابت پیشپردازنده "__v850e2v3__" تعریف میشود.
- -mv850e2
- مشخص میکند که پردازنده مقصد V850E2 است. در صورت استفاده از این گزینه، ثابت پیشپردازنده "__v850e2__" تعریف میشود.
- -mv850e1
- مشخص میکند که پردازنده مقصد V850E1 است. در صورت استفاده از این گزینه، ثابتهای پیشپردازنده "__v850e1__" و "__v850e__" تعریف میشوند.
- -mv850es
- مشخص میکند که پردازنده مقصد V850ES است. این گزینه یک نام مستعار برای گزینه -mv850e1 است.
- -mv850e
- مشخص
میکند که
پردازنده
مقصد V850E است.
در صورت
استفاده از
این گزینه،
ثابت
پیشپردازنده
"__v850e__"
تعریف
میشود.
اگر هیچیک از گزینههای -mv850، -mv850e، -mv850e1، -mv850e2، -mv850e2v3 یا -mv850e3v5 تعریف نشده باشند، یک پردازنده مقصد پیشفرض انتخاب شده و ثابت پیشپردازنده مربوطه __v850*__ تعریف میگردد.
ثابتهای پیشپردازنده "__v850" و "__v851__" صرفنظر از اینکه کدام گونه پردازنده مقصد باشد، همواره تعریف میشوند.
- -mdisable-callt
- -mno-disable-callt
- این گزینه
از تولید
دستورالعمل
"CALLT" برای
انواع v850e، v850e1،
v850e2، v850e2v3 و v850e3v5 از
معماری v850
جلوگیری
میکند.
این گزینه هنگام استفاده از RH850 ABI بهطور پیشفرض فعال است (به -mrh850-abi مراجعه کنید) و هنگام استفاده از GCC ABI بهطور پیشفرض غیرفعال است. اگر دستورالعملهای "CALLT" تولید شوند، نماد پیشپردازنده C به نام "__V850_CALLT__" تعریف خواهد شد.
- -mrelax
- -mno-relax
- گزینه خط فرمان -mrelax را به اسمبلر منتقل میکند (یا منتقل نمیکند).
- -mlong-jumps
- -mno-long-jumps
- تولید دستورالعملهای پرش نسبی به PC را غیرفعال (یا دوباره فعال) میکند.
- -msoft-float
- -mhard-float
- تولید دستورالعملهای ممیز شناور سختافزاری را غیرفعال (یا دوباره فعال) میکند. این گزینه تنها زمانی اهمیت دارد که معماری مقصد V850E2V3 یا بالاتر باشد. اگر دستورالعملهای ممیز شناور سختافزاری در حال تولید باشند، نماد پیشپردازنده C به نام "__FPU_OK__" تعریف میشود، در غیر این صورت نماد "__NO_FPU__" تعریف خواهد شد.
- -mloop
- استفاده از دستورالعمل LOOP در e3v5 را فعال میکند. هنگام انتخاب معماری e3v5، استفاده از این دستورالعمل بهطور پیشفرض فعال نیست، زیرا استفاده از آن هنوز جنبه آزمایشی دارد.
- -mrh850-abi
- -mghs
- پشتیبانی از نسخه RH850 از V850 ABI را فعال میکند. این حالت پیشفرض است. با این نسخه از ABI، قوانین زیر اعمال میشوند:
- ساختارها و اجتماعها با اندازه عدد صحیح بهجای ثبات، از طریق یک اشارهگر حافظه بازگردانده میشوند.
- ساختارها و اجتماعهای بزرگ (بزرگتر از 8 بایت) از طریق مقدار (by value) ارسال میشوند.
- توابع روی مرزهای 16 بیتی تراز میشوند.
- گزینه خط فرمان -m8byte-align پشتیبانی میشود.
- گزینه خط فرمان -mdisable-callt بهطور پیشفرض فعال است. گزینه خط فرمان -mno-disable-callt پشتیبانی نمیشود.
هنگامی که این نسخه از ABI فعال باشد، نماد پیشپردازنده C به نام "__V850_RH850_ABI__" تعریف میشود.
- -mgcc-abi
- پشتیبانی از نسخه قدیمی GCC از V850 ABI را فعال میکند. با این نسخه از ABI، قوانین زیر اعمال میشوند:
- ساختارها و اجتماعها با اندازه عدد صحیح در ثبات "r10" بازگردانده میشوند.
- ساختارها و اجتماعهای بزرگ (بزرگتر از 8 بایت) با ارجاع (by reference) ارسال میشوند.
- توابع روی مرزهای 32 بیتی تراز میشوند، مگر اینکه بهینهسازی برای اندازه انجام گیرد.
- گزینه خط فرمان -m8byte-align پشتیبانی نمیشود.
- گزینه خط فرمان -mdisable-callt پشتیبانی میشود، اما بهطور پیشفرض فعال نیست.
هنگامی که این نسخه از ABI فعال باشد، نماد پیشپردازنده C به نام "__V850_GCC_ABI__" تعریف میشود.
- -m8byte-align
- -mno-8byte-align
- پشتیبانی از تراز شدن نوعهای "double" و "long long" روی مرزهای 8 بایتی را فعال میکند. حالت پیشفرض این است که تراز تمام اشیاء حداکثر به 4 بایت محدود شود. هنگامی که -m8byte-align در حال اثر باشد، نماد پیشپردازنده C به نام "__V850_8BYTE_ALIGN__" تعریف میشود.
- -mbig-switch
- -mno-big-switch
- کدی مناسب برای جدولهای switch بزرگ تولید میکند. تنها زمانی از این گزینه استفاده کنید که اسمبلر یا پیونددهنده در مورد انشعابهای خارج از محدوده درون یک جدول switch خطا گزارش کند.
- -mapp-regs
- -mno-app-regs
- گزینه -mapp-regs باعث میشود از r2 و r5 در کدهای تولیدشده توسط کامپایلر استفاده شود. این تنظیم پیشفرض است. گزینه -mno-app-regs باعث میشود با r2 و r5 به عنوان ثباتهای ثابت برخورد شود..IP -msmall-sld 4
- -mno-small-sld
- فعال یا غیرفعال کردن استفاده از دستورالعملهای بارگذاری کوتاه (short load).
- -mno-strict-align
- عدم اعمال همترازی دقیق دادهها.
- -mjump-tables-in-data-section
- -mno-jump-tables-in-data-section
- فعال یا غیرفعال کردن قرارگیری جدولهای پرش برای عبارتهای switch در بخش ".data" به جای بخش ".code". مقدار پیشفرض -mno-jump-tables-in-data-section است.
گزینههای VAX
این گزینههای -m برای VAX تعریف شدهاند:
- -munix
- از تولید دستورالعملهای پرش خاصی ("aobleq" و غیره) که اسمبلر Unix برای VAX نمیتواند آنها را در بازههای طولانی مدیریت کند، خودداری کن.
- -mgnu
- با این فرض که از اسمبلر GNU استفاده میشود، آن دستورالعملهای پرش را تولید کن.
- -md
- -md-float
- استفاده از قالب دادهٔ D_floating به جای G_floating برای اعداد ممیز شناور با دقت مضاعف (double-precision).
- -mg
- -mg-float
- استفاده از قالب دادهٔ G_floating به جای D_floating برای اعداد ممیز شناور با دقت مضاعف (double-precision).
- -mlra
- -mno-lra
- فعالسازی تخصیص ثبات محلی (LRA). این ویژگی برای VAX هنوز آزمایشی است، بنابراین کامپایلر به طور پیشفرض از بارگذاری مجدد (reload) استاندارد استفاده میکند.
- -mvaxc-alignment
- استفاده از قراردادهای VAXC برای همترازی اعضای ساختار (structure).
- -mqmath
- -mno-qmath
- فعال یا غیرفعال کردن الگوهای دستورالعمل جدید برای جمع و تفریق اعداد صحیح ۶۴ بیتی.
گزینههای Visium
- -mdebug
- هنگام پیوند زدن برنامههایی که ورودی/خروجی فایل انجام میدهند و قرار است روی هدف MCM اجرا شوند، از این گزینه استفاده کنید. این گزینه باعث میشود کتابخانههای libc.a و libdebug.a پیوند داده شوند. شما باید برنامه را روی مقصد تحت کنترل واسط اشکالزدایی از راه دور (stub) نرمافزار GDB اجرا کنید.
- -msim
- هنگام پیوند زدن برنامههایی که ورودی/خروجی فایل انجام میدهند و قرار است روی شبیهساز اجرا شوند، از این گزینه استفاده کنید. این گزینه موجب پیوند خوردن کتابخانههای libc.a و libsim.a میشود.
- -mfpu
- -mhard-float
- تولید کدی شامل دستورالعملهای ممیز شناور. این حالت پیشفرض است.
- -mno-fpu
- -msoft-float
- تولید کدی
حاوی
فراخوانیهای
کتابخانهای
برای ممیز
شناور.
گزینهٔ -msoft-float قرارداد فراخوانی (calling convention) را در فایل خروجی تغییر میدهد؛ بنابراین تنها زمانی مفید است که تمام برنامه را با این گزینه کامپایل کنید. بهویژه، برای اینکه این مورد کار کند، باید libgcc.a (کتابخانهای که همراه GCC ارائه میشود) را با -msoft-float کامپایل کنید.
- -mcpu=cpu_type
- تنظیم
مجموعه
دستورالعمل،
مجموعه
ثباتها و
پارامترهای
زمانبندی
دستورالعمل
برای نوع
ماشین cpu_type.
مقادیر
پشتیبانیشده
برای cpu_type
شامل mcm، gr5 و
gr6 هستند.
مقدار mcm مترادفی برای gr5 است که جهت سازگاری با نسخههای قبلی قرار داده شده است.
بهطور پیشفرض (مگر اینکه به گونهای دیگر پیکربندی شده باشد)، GCC کدی برای گونهٔ GR5 از معماری Visium تولید میکند.
با گزینهٔ -mcpu=gr6، کامپایلر GCC برای گونهٔ GR6 از معماری Visium کد تولید میکند. تنها تفاوت با کد GR5 این است که کامپایلر دستورالعملهای انتقال بلوکی (block move) را تولید خواهد کرد.
- -mtune=cpu_type
- پارامترهای زمانبندی دستورالعمل را برای نوع ماشین cpu_type تنظیم میکند، اما بر خلاف گزینهٔ -mcpu=cpu_type، مجموعه دستورالعملها یا مجموعه ثباتها را تغییر نمیدهد.
- -msv-mode
- تولید کد برای حالت ناظر (supervisor mode)، که در آن هیچ محدودیتی در دسترسی به ثباتهای عمومی وجود ندارد. این حالت پیشفرض است.
- -muser-mode
- تولید کد برای حالت کاربر (user mode)، که در آن دسترسی به برخی از ثباتهای عمومی ممنوع است: روی GR5، دسترسی به ثباتهای r24 تا r31 در این حالت امکانپذیر نیست؛ روی GR6، تنها ثباتهای r29 تا r31 تحت تأثیر قرار میگیرند.
گزینههای VMS
این گزینههای -m برای پیادهسازیهای VMS تعریف شدهاند:
- -mvms-return-codes
- بازگرداندن کدهای وضعیت VMS از تابع "main". پیشفرض بازگرداندن کدهای وضعیت به سبک POSIX (مانند کدهای خطا) است.
- -mdebug-main=prefix
- نشانهگذاری اولین روالی که نام آن با prefix شروع میشود به عنوان روال اصلی برای اشکالزدا.
- -mmalloc64
- استفادهٔ پیشفرض از روالهای تخصیص حافظهٔ ۶۴ بیتی.
- -mpointer-size=size
- تنظیم اندازهٔ پیشفرض اشارهگرها. گزینههای ممکن برای size عبارتاند از: 32 یا short برای اشارهگرهای ۳۲ بیتی، 64 یا long برای اشارهگرهای ۶۴ بیتی، و no برای پشتیبانیِ صرف از اشارهگرهای ۳۲ بیتی. گزینهٔ آخر "pragma pointer_size" را غیرفعال میکند.
گزینههای VxWorks
گزینههای این بخش برای تمامی اهداف VxWorks تعریف شدهاند. گزینههای مختص سختافزار هدف در کنار سایر گزینهها برای آن هدف فهرست شدهاند.
- -mrtp
- کامپایلر GCC میتواند هم برای هستههای VxWorks و هم برای فرایندهای بلادرنگ (RTPs) کد تولید کند. این گزینه حالت تولید کد را از حالت اول به حالت دوم تغییر میدهد. همچنین ماکروی پیشپردازندهٔ "__RTP__" را تعریف میکند.
- -msmp
- انتخاب زمانهای اجرای SMP برای پیوند زدن. در معماریهایی غیر از PowerPC و همچنین در VxWorks نسخه ۷ یا بالاتر در دسترس نیست، چرا که در آن نسخهها انتخاب بخشی از پیکربندی ساخت VxWorks است و مسیرهای کتابخانه برای هر دو حالت یکسان هستند.
- -mvthreads
- پیوند زدن با محیط زمان اجرای VxWorks AE vThread.
- -non-static
- پیوند زدن فایل اجرایی RTP با کتابخانههای مشترک (shared) به جای کتابخانههای ایستا (static). گزینههای -static و -shared نیز میتوانند برای RTPها استفاده شوند؛ -static حالت پیشفرض است..IP -Bstatic 4
- -Bdynamic
- این گزینهها به پیونددهنده ارسال میشوند. آنها برای سازگاری با Diab تعریف شدهاند.
- -Xbind-lazy
- پیوندزدن تنبل (lazy binding) فراخوانیهای توابع را فعال میکند. این گزینه معادل -Wl,-z,now بوده و برای سازگاری با Diab تعریف شده است.
- -Xbind-now
- پیوندزدن تنبل فراخوانیهای توابع را غیرفعال میکند. این گزینه پیشفرض است و برای سازگاری با Diab تعریف شده است.
گزینههای x86
این بخش گزینههای -m موجود برای خانواده رایانههای x86 را مستند میکند.
گروه گزینههای زیر امکان کامپایل با هدف قرار دادن یک پردازنده خاص را فراهم میسازند.
- -march=cpu-type
- تولید
دستورالعملها
برای نوع
ماشین cpu-type. بر
خلاف -mtune=cpu-type
که صرفاً کد
تولیدشده
را برای cpu-type
مشخصشده
تنظیم
میکند،
-march=cpu-type به GCC
اجازه
میدهد کدی
تولید کند
که ممکن است
اصلاً روی
پردازندههایی
غیر از
پردازنده
مشخصشده
اجرا نشود.
مشخص کردن
-march=cpu-type متضمن
-mtune=cpu-type نیز
هست، مگر در
مواردی که
خلاف آن ذکر
شده باشد.
انتخابها برای cpu-type عبارتاند از:
- native
- این گزینه با تشخیص نوع پردازنده ماشینی که کامپایل روی آن انجام میشود، پردازنده هدف برای تولید کد در زمان کامپایل را انتخاب میکند. استفاده از -march=native تمام زیرمجموعههای دستورالعمل پشتیبانیشده توسط ماشین محلی را فعال میکند (بنابراین ممکن است نتیجه روی ماشینهای دیگر اجرا نشود). استفاده از -mtune=native کدی بهینهشده برای ماشین محلی تحت محدودیتهای مجموعه دستورالعمل انتخابشده تولید میکند.
- x86-64
- یک پردازنده عمومی با افزونههای 64-bit و پشتیبانی از مجموعههای دستورالعمل MMX، SSE، SSE2 و FXSR.
- x86-64-v2
- x86-64-v3
- x86-64-v4
- این
انتخابها
برای cpu-type،
سطح
ریزمعماری
متناظر را
از psABI مربوط
به x86-64 انتخاب
میکنند. در
ABIهایی غیر
از psABI برای x86-64،
آنها همان
ویژگیهای
CPU را انتخاب
میکنند که
اسناد psABI
برای x86-64 برای
آن سطح
ریزمعماری
خاص مشخص
کرده است.
از آنجا که این مقادیر cpu-type تنظیم -mtune متناظری ندارند، استفاده از -march با این مقادیر، تنظیم عمومی را فعال میکند. تنظیم اختصاصی را میتوان با استفاده از گزینه -mtune=other-cpu-type و با مقدار مناسب other-cpu-type فعال کرد.
- i386
- پردازنده اصلی Intel i386.
- i486
- پردازنده Intel i486. (هیچ زمانبندیای برای این تراشه پیادهسازی نشده است.)
- i586
- pentium
- پردازنده Intel Pentium بدون پشتیبانی از MMX.
- lakemont
- میکروکنترلر Intel Lakemont، بر پایه پردازنده Intel Pentium.
- pentium-mmx
- پردازنده Intel Pentium MMX، بر پایه هسته Pentium با پشتیبانی از مجموعه دستورالعمل MMX.
- pentiumpro
- پردازنده Intel Pentium Pro بدون پشتیبانی از MMX.
- i686
- هنگامی که با -march استفاده شود، مجموعه دستورالعمل Pentium Pro استفاده میشود، بنابراین کد روی تمام تراشههای خانواده i686 اجرا میشود. هنگامی که با -mtune استفاده شود، معنای یکسانی با generic دارد.
- pentium2
- پردازنده Intel Pentium II، بر پایه هسته Pentium Pro با پشتیبانی از مجموعههای دستورالعمل MMX و FXSR.
- pentium3
- pentium3m
- پردازنده Intel Pentium III، بر پایه هسته Pentium Pro با پشتیبانی از مجموعههای دستورالعمل MMX، FXSR و SSE.
- pentium-m
- پردازنده Intel Pentium M؛ نسخه کممصرف پردازنده Intel Pentium III با پشتیبانی از مجموعههای دستورالعمل MMX، SSE، SSE2 و FXSR. استفادهشده در لپتاپهای Centrino.
- pentium4
- pentium4m
- پردازنده Intel Pentium 4 با پشتیبانی از مجموعههای دستورالعمل MMX، SSE، SSE2 و FXSR.
- prescott
- نسخه بهبودیافته پردازنده Intel Pentium 4 با پشتیبانی از مجموعههای دستورالعمل MMX، SSE، SSE2، SSE3 و FXSR.
- nocona
- نسخه بهبودیافته پردازنده Intel Pentium 4 با افزونههای 64-bit و پشتیبانی از مجموعههای دستورالعمل MMX، SSE، SSE2، SSE3، CX16 و FXSR.
- core2
- پردازنده Intel Core 2 با افزونههای 64-bit و پشتیبانی از مجموعههای دستورالعمل MMX، SSE، SSE2، SSE3، SSSE3، CX16، SAHF و FXSR.
- nehalem
- corei7
- پردازنده Intel Nehalem با افزونههای 64-bit و پشتیبانی از مجموعههای دستورالعمل MMX، SSE، SSE2، SSE3، SSSE3، SSE4.1، SSE4.2، POPCNT، CX16، SAHF و FXSR.
- westmere
- پردازنده Intel Westmere با افزونههای 64-bit و پشتیبانی از مجموعههای دستورالعمل MMX، SSE، SSE2، SSE3، SSSE3، SSE4.1، SSE4.2، POPCNT، CX16، SAHF، FXSR و PCLMUL.
- sandybridge
- corei7-avx
- پردازنده Intel Sandy Bridge با افزونههای 64-bit و پشتیبانی از مجموعههای دستورالعمل MMX، SSE، SSE2، SSE3، SSSE3، SSE4.1، SSE4.2، POPCNT، CX16، SAHF، FXSR، AVX، XSAVE و PCLMUL.
- ivybridge
- core-avx-i
- پردازنده Intel Ivy Bridge با افزونههای 64-bit و پشتیبانی از مجموعههای دستورالعمل MMX، SSE، SSE2، SSE3، SSSE3، SSE4.1، SSE4.2، POPCNT، CX16، SAHF، FXSR، AVX، XSAVE، PCLMUL، FSGSBASE، RDRND و F16C.
- haswell
- core-avx2
- پردازنده Intel Haswell با افزونههای 64-bit و پشتیبانی از مجموعههای دستورالعمل MMX، SSE، SSE2، SSE3، SSSE3، SSE4.1، SSE4.2، POPCNT، CX16، SAHF، FXSR، AVX، XSAVE، PCLMUL، FSGSBASE، RDRND، F16C، AVX2، BMI، BMI2، LZCNT، FMA، MOVBE و HLE.
- broadwell
- پردازنده Intel Broadwell با افزونههای 64-bit و پشتیبانی از مجموعههای دستورالعمل MMX، SSE، SSE2، SSE3، SSSE3، SSE4.1، SSE4.2، POPCNT، CX16، SAHF، FXSR، AVX، XSAVE، PCLMUL، FSGSBASE، RDRND، F16C، AVX2، BMI، BMI2، LZCNT، FMA، MOVBE، HLE، RDSEED، ADCX و PREFETCHW.
- skylake
- پردازنده Intel Skylake با افزونههای 64-bit و پشتیبانی از مجموعههای دستورالعمل MMX، SSE، SSE2، SSE3، SSSE3، SSE4.1، SSE4.2، POPCNT، CX16، SAHF، FXSR، AVX، XSAVE، PCLMUL، FSGSBASE، RDRND، F16C، AVX2، BMI، BMI2، LZCNT، FMA، MOVBE، HLE، RDSEED، ADCX، PREFETCHW، AES، CLFLUSHOPT، XSAVEC، XSAVES و SGX..IP skylake-avx512 4 پردازنده سرور Intel Skylake با افزونههای 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، CX16، AES، PREFETCHW، PCLMUL، RDRND، XSAVE، XSAVEC، XSAVES، XSAVEOPT، FSGSBASE، PTWRITE، RDPID، SGX، GFNI-SSE، CLWB، MOVDIRI، MOVDIR64B، WAITPKG، ADCX، AVX، AVX2، BMI، BMI2، F16C، FMA، LZCNT، PCONFIG، PKU، VAES، VPCLMULQDQ، SERIALIZE، HRESET، KL، WIDEKL و AVX-VNNI.
- arrowlake
- پردازنده Intel Arrow Lake با افزونههای 64-bit و پشتیبانی از مجموعه دستورالعملهای MOVBE، MMX، SSE، SSE2، SSE3، SSSE3، SSE4.1، SSE4.2، POPCNT، CX16، AES، PREFETCHW، PCLMUL، RDRND، XSAVE، XSAVEC، XSAVES، XSAVEOPT، FSGSBASE، PTWRITE، RDPID، SGX، GFNI-SSE، CLWB، MOVDIRI، MOVDIR64B، 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، CX16، AES، PREFETCHW، PCLMUL، RDRND، XSAVE، XSAVEC، XSAVES، XSAVEOPT، FSGSBASE، PTWRITE، RDPID، SGX، GFNI-SSE، CLWB، MOVDIRI، MOVDIR64B، WAITPKG، ADCX، AVX، AVX2، BMI، BMI2، F16C، FMA، LZCNT، PCONFIG، PKU، VAES، VPCLMULQDQ، SERIALIZE، HRESET، KL، WIDEKL، AVX-VNNI، UINTR، AVXIFMA، AVXVNNIINT8، AVXNECONVERT، CMPCCXADD، AVXVNNIINT16، SHA512، SM3 و SM4.
- pantherlake
- wildcatlake
- پردازنده Intel Panther Lake/Wildcat Lake با افزونههای 64-bit و پشتیبانی از مجموعه دستورالعملهای MOVBE، MMX، SSE، SSE2، SSE3، SSSE3، SSE4.1، SSE4.2، POPCNT، CX16، AES، PREFETCHW، PCLMUL، RDRND، XSAVE، XSAVEC، XSAVES، XSAVEOPT، FSGSBASE، PTWRITE، RDPID، SGX، GFNI-SSE، CLWB، MOVDIRI، MOVDIR64B، WAITPKG، ADCX، AVX، AVX2، BMI، BMI2، F16C، FMA، LZCNT، PCONFIG، PKU، VAES، VPCLMULQDQ، SERIALIZE، HRESET، AVX-VNNI، UINTR، AVXIFMA، AVXVNNIINT8، AVXNECONVERT، CMPCCXADD، AVXVNNIINT16، SHA512، SM3 و SM4.
- novalake
- پردازنده Intel Nova Lake با افزونههای 64-bit و پشتیبانی از مجموعه دستورالعملهای MOVBE، MMX، SSE، SSE2، SSE3، SSSE3، SSE4.1، SSE4.2، POPCNT، CX16، AES، PREFETCHW، PCLMUL، RDRND، XSAVE، XSAVEC، XSAVES، XSAVEOPT، FSGSBASE، PTWRITE، RDPID، SGX، GFNI-SSE، CLWB، MOVDIRI، MOVDIR64B، WAITPKG، ADCX، AVX، AVX2، BMI، BMI2، F16C، FMA، LZCNT، PCONFIG، PKU، VAES، VPCLMULQDQ، SERIALIZE، HRESET، AVX-VNNI، UINTR، AVXIFMA، AVXVNNIINT8، AVXNECONVERT، CMPCCXADD، AVXVNNIINT16، SHA512، SM3، SM4، PREFETCHI، APX_F، AVX10.1، AVX10.2 و MOVRS.
- sapphirerapids
- emeraldrapids
- پردازنده Intel Sapphire Rapids/Emerald Rapids با افزونههای 64-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، MOVRS و AMX-MOVRS.
- bonnell
- atom
- پردازندهٔ Intel Bonnell با پشتیبانی از افزونههای 64-bit و مجموعه دستورالعملهای MOVBE، MMX، SSE، SSE2، SSE3، SSSE3 و CX16.
- silvermont
- slm
- پردازندهٔ Intel Silvermont با پشتیبانی از افزونههای 64-bit و مجموعه دستورالعملهای MOVBE، MMX، SSE، SSE2، SSE3، SSSE3، SSE4.1، SSE4.2، POPCNT، CX16، SAHF، FXSR، PCLMUL، PREFETCHW و RDRND.
- goldmont
- پردازندهٔ Intel Goldmont با پشتیبانی از افزونههای 64-bit و مجموعه دستورالعملهای MOVBE، MMX، SSE، SSE2، SSE3، SSSE3، SSE4.1، SSE4.2، POPCNT، CX16، SAHF، FXSR، PCLMUL، PREFETCHW، RDRND، AES، SHA، RDSEED، XSAVE، XSAVEC، XSAVES، XSAVEOPT، CLFLUSHOPT و FSGSBASE.
- goldmont-plus
- پردازندهٔ Intel Goldmont Plus با پشتیبانی از افزونههای 64-bit و مجموعه دستورالعملهای MOVBE، MMX، SSE، SSE2، SSE3، SSSE3، SSE4.1، SSE4.2، POPCNT، CX16، SAHF، FXSR، PCLMUL، PREFETCHW، RDRND، AES، SHA، RDSEED، XSAVE، XSAVEC، XSAVES، XSAVEOPT، CLFLUSHOPT، FSGSBASE، PTWRITE، RDPID و SGX.
- tremont
- پردازندهٔ Intel Tremont با پشتیبانی از افزونههای 64-bit و مجموعه دستورالعملهای MOVBE، MMX، SSE، SSE2، SSE3، SSSE3، SSE4.1، SSE4.2، POPCNT، CX16، SAHF، FXSR، PCLMUL، PREFETCHW، RDRND، AES، SHA، RDSEED، XSAVE، XSAVEC، XSAVES، XSAVEOPT، CLFLUSHOPT، FSGSBASE، PTWRITE، RDPID، SGX، CLWB، GFNI-SSE، MOVDIRI، MOVDIR64B، CLDEMOTE و WAITPKG.
- sierraforest
- پردازندهٔ Intel Sierra Forest با پشتیبانی از افزونههای 64-bit و مجموعه دستورالعملهای MOVBE، MMX، SSE، SSE2، SSE3، SSSE3، SSE4.1، SSE4.2، POPCNT، CX16، AES، PREFETCHW، PCLMUL، RDRND، XSAVE، XSAVEC، XSAVES، XSAVEOPT، FSGSBASE، PTWRITE، RDPID، SGX، GFNI-SSE، CLWB، MOVDIRI، MOVDIR64B، CLDEMOTE، WAITPKG، ADCX، AVX، AVX2، BMI، BMI2، F16C، FMA، LZCNT، PCONFIG، PKU، VAES، VPCLMULQDQ، SERIALIZE، HRESET، KL، WIDEKL، AVX-VNNI، AVXIFMA، AVXVNNIINT8، AVXNECONVERT، CMPCCXADD، ENQCMD و UINTR.
- grandridge
- پردازندهٔ Intel Grand Ridge با پشتیبانی از افزونههای 64-bit و مجموعه دستورالعملهای MOVBE، MMX، SSE، SSE2، SSE3، SSSE3، SSE4.1، SSE4.2، POPCNT، CX16، AES، PREFETCHW، PCLMUL، RDRND، XSAVE، XSAVEC، XSAVES، XSAVEOPT، FSGSBASE، PTWRITE، RDPID، SGX، GFNI-SSE، CLWB، MOVDIRI، MOVDIR64B، CLDEMOTE، WAITPKG، ADCX، AVX، AVX2، BMI، BMI2، F16C، FMA، LZCNT، PCONFIG، PKU، VAES، VPCLMULQDQ، SERIALIZE، HRESET، KL، WIDEKL، AVX-VNNI، AVXIFMA، AVXVNNIINT8، AVXNECONVERT، CMPCCXADD، ENQCMD و UINTR.
- clearwaterforest
- پردازندهٔ Intel Clearwater Forest با پشتیبانی از افزونههای 64-bit و مجموعه دستورالعملهای MOVBE، MMX، SSE، SSE2، SSE3، SSSE3، SSE4.1، SSE4.2، POPCNT، CX16، AES، PREFETCHW، PCLMUL، RDRND، XSAVE، XSAVEC، XSAVES، XSAVEOPT، FSGSBASE، PTWRITE، RDPID، SGX، GFNI-SSE، CLWB، MOVDIRI، MOVDIR64B، CLDEMOTE، WAITPKG، ADCX، AVX، AVX2، BMI، BMI2، F16C، FMA، LZCNT، PCONFIG، PKU، VAES، VPCLMULQDQ، SERIALIZE، HRESET، AVX-VNNI، ENQCMD، UINTR، AVXIFMA، AVXVNNIINT8، AVXNECONVERT، CMPCCXADD، AVXVNNIINT16، SHA512، SM3، SM4، USER_MSR و PREFETCHI.
- k6
- پردازندهٔ AMD K6 با پشتیبانی از مجموعه دستورالعملهای MMX.
- k6-2
- k6-3
- نسخههای بهبودیافتهٔ پردازندهٔ AMD K6 با پشتیبانی از مجموعه دستورالعملهای MMX و !3DNow.
- athlon
- athlon-tbird
- پردازندهٔ AMD Athlon با پشتیبانی از MMX، !3dNOW، !3DNow بهبودیافته و دستورالعملهای پیشواکشی (prefetch) در SSE.
- athlon-4
- athlon-xp
- athlon-mp
- پردازندهٔ بهبودیافتهٔ AMD Athlon با پشتیبانی از مجموعه دستورالعملهای MMX، !3DNow، !3DNow بهبودیافته و پشتیبانی کامل از مجموعه دستورالعملهای SSE.
- k8
- opteron
- athlon64
- athlon-fx
- پردازندههای مبتنی بر هستهٔ AMD K8 با پشتیبانی از مجموعه دستورالعملهای x86-64، شامل پردازندههای AMD Opteron، Athlon 64 و Athlon 64 FX. (این مورد شامل ابرمجموعهای از MMX، SSE، SSE2، !3DNow، !3DNow بهبودیافته و افزونههای مجموعه دستورالعملهای 64-bit است.)
- k8-sse3
- opteron-sse3
- athlon64-sse3
- نسخههای بهبودیافتهٔ هستههای AMD K8 با پشتیبانی از مجموعه دستورالعملهای SSE3.
- amdfam10
- barcelona
- پردازندههای مبتنی بر هستههای AMD Family 10h با پشتیبانی از مجموعه دستورالعملهای x86-64. (این مورد شامل ابرمجموعهای از CX16، MMX، SSE، SSE2، SSE3، SSE4A، !3DNow، !3DNow بهبودیافته، ABM و افزونههای مجموعه دستورالعملهای 64-bit است.)
- bdver1
- پردازندههای مبتنی بر هستههای AMD Family 15h با پشتیبانی از مجموعه دستورالعملهای x86-64. (این مورد شامل ابرمجموعهای از FMA4، AVX، XOP، LWP، AES، PCLMUL، CX16، MMX، SSE، SSE2، SSE3، SSE4A، SSSE3، SSE4.1، SSE4.2، ABM و افزونههای مجموعه دستورالعملهای 64-bit است.)
- bdver2
- پردازندههای مبتنی بر هستهٔ AMD Family 15h با پشتیبانی از مجموعه دستورالعملهای x86-64. (این مورد شامل ابرمجموعهای از BMI، TBM، F16C، FMA، FMA4، AVX، XOP، LWP، AES، PCLMUL، CX16، MMX، SSE، SSE2، SSE3، SSE4A، SSSE3، SSE4.1، SSE4.2، ABM و افزونههای مجموعه دستورالعملهای 64-bit است.)
- bdver3
- پردازندههای مبتنی بر هستهٔ AMD Family 15h با پشتیبانی از مجموعه دستورالعملهای x86-64. (این مورد شامل ابرمجموعهای از BMI، TBM، F16C، FMA، FMA4، FSGSBASE، AVX، XOP، LWP، AES، PCLMUL، CX16، MMX، SSE، SSE2، SSE3، SSE4A، SSSE3، SSE4.1، SSE4.2، ABM و افزونههای مجموعه دستورالعملهای 64-bit است.)
- bdver4
- پردازندههای مبتنی بر هستهٔ AMD Family 15h با پشتیبانی از مجموعه دستورالعملهای x86-64. (این مورد شامل ابرمجموعهای از BMI، BMI2، TBM، F16C، FMA، FMA4، FSGSBASE، AVX، AVX2، XOP، LWP، AES، PCLMUL، CX16، MOVBE، MMX، SSE، SSE2، SSE3، SSE4A، SSSE3، SSE4.1، SSE4.2، ABM و افزونههای مجموعه دستورالعملهای 64-bit است.)
- znver1
- پردازندههای مبتنی بر هستهٔ AMD Family 17h با پشتیبانی از مجموعه دستورالعملهای x86-64. (این مورد شامل ابرمجموعهای از BMI، BMI2، F16C، FMA، FSGSBASE، AVX، AVX2، ADCX، RDSEED، MWAITX، SHA، CLZERO، AES، PCLMUL، CX16، MOVBE، MMX، SSE، SSE2، SSE3، SSE4A، SSSE3، SSE4.1، SSE4.2، ABM، XSAVEC، XSAVES، CLFLUSHOPT، POPCNT و افزونههای مجموعه دستورالعملهای 64-bit است.)
- znver2
- پردازندههای مبتنی بر هستهٔ AMD Family 17h با پشتیبانی از مجموعه دستورالعملهای x86-64. (این مورد شامل ابرمجموعهای از BMI، BMI2، CLWB، F16C، FMA، FSGSBASE، AVX، AVX2، ADCX، RDSEED، MWAITX، SHA، CLZERO، AES، PCLMUL، CX16، MOVBE، MMX، SSE، SSE2، SSE3، SSE4A، SSSE3، SSE4.1، SSE4.2، ABM، XSAVEC، XSAVES، CLFLUSHOPT، POPCNT، RDPID، WBNOINVD و افزونههای مجموعه دستورالعملهای 64-bit است.)
- znver3
- پردازندههای مبتنی بر هستهٔ AMD Family 19h با پشتیبانی از مجموعه دستورالعملهای x86-64. (این مورد شامل ابرمجموعهای از BMI، BMI2، CLWB، F16C، FMA، FSGSBASE، AVX، AVX2، ADCX، RDSEED، MWAITX، SHA، CLZERO، AES، PCLMUL، CX16، MOVBE، MMX، SSE، SSE2، SSE3، SSE4A، SSSE3، SSE4.1، SSE4.2، ABM، XSAVEC، XSAVES، CLFLUSHOPT، POPCNT، RDPID، WBNOINVD، PKU، VPCLMULQDQ، VAES و افزونههای مجموعه دستورالعملهای 64-bit است.)
- znver4
- پردازندههای مبتنی بر هستهٔ AMD Family 19h با پشتیبانی از مجموعه دستورالعملهای x86-64. (این مورد شامل ابرمجموعهای از BMI، BMI2، CLWB، F16C، FMA، FSGSBASE، AVX، AVX2، ADCX، RDSEED، MWAITX، SHA، CLZERO، AES، PCLMUL، CX16، MOVBE، MMX، SSE، SSE2، SSE3، SSE4A، SSSE3، SSE4.1، SSE4.2، ABM، XSAVEC، XSAVES، CLFLUSHOPT، POPCNT، RDPID، WBNOINVD، PKU، VPCLMULQDQ، VAES، AVX512F، AVX512DQ، AVX512IFMA، AVX512CD، AVX512BW، AVX512VL، AVX512BF16، AVX512VBMI، AVX512VBMI2، AVX512VNNI، AVX512BITALG، AVX512VPOPCNTDQ، GFNI و افزونههای مجموعه دستورالعملهای 64-bit است.)
- znver5
- پردازندههای مبتنی بر هستهٔ AMD Family 1ah با پشتیبانی از مجموعه دستورالعملهای x86-64. (این مورد شامل ابرمجموعهای از BMI، BMI2، CLWB، F16C، FMA، FSGSBASE، AVX، AVX2، ADCX، RDSEED، MWAITX، SHA، CLZERO، AES، PCLMUL، CX16، MOVBE، MMX، SSE، SSE2، SSE3، SSE4A، SSSE3، SSE4.1، SSE4.2، ABM، XSAVEC، XSAVES، CLFLUSHOPT، POPCNT، RDPID، WBNOINVD، PKU، VPCLMULQDQ، VAES، AVX512F، AVX512DQ، AVX512IFMA، AVX512CD، AVX512BW، AVX512VL، AVX512BF16، AVX512VBMI، AVX512VBMI2، AVX512VNNI، AVX512BITALG، AVX512VPOPCNTDQ، GFNI، AVXVNNI، MOVDIRI، MOVDIR64B، AVX512VP2INTERSECT، PREFETCHI و افزونههای مجموعه دستورالعملهای 64-bit است.).IP znver6 4 پردازندههای مبتنی بر هسته AMD Family 1ah با پشتیبانی از مجموعه دستورالعملهای x86-64. (این گزینه دربرگیرنده ابرمجموعهای از BMI، BMI2، CLWB، F16C، FMA، FSGSBASE، AVX، AVX2، ADCX، RDSEED، MWAITX، SHA، CLZERO، AES، PCLMUL، CX16، MOVBE، MMX، SSE، SSE2، SSE3، SSE4A، SSSE3، SSE4.1، SSE4.2، ABM، XSAVEC، XSAVES، CLFLUSHOPT، POPCNT، RDPID، WBNOINVD، PKU، VPCLMULQDQ، VAES، AVX512F، AVX512DQ، AVX512IFMA، AVX512CD، AVX512BW، AVX512VL، AVX512BF16، AVX512VBMI، AVX512VBMI2، AVX512VNNI، AVX512BITALG، AVX512VPOPCNTDQ، GFNI، AVXVNNI، MOVDIRI، MOVDIR64B، AVX512VP2INTERSECT، PREFETCHI، AVXVNNIINT8، AVXIFMA، AVX512FP16، AVXNECONVERT، AVX512BMM و افزونههای مجموعه دستورالعملهای 64-bit است.)
- btver1
- پردازندههای مبتنی بر هستههای AMD Family 14h با پشتیبانی از مجموعه دستورالعملهای x86-64. (این گزینه دربرگیرنده ابرمجموعهای از MMX، SSE، SSE2، SSE3، SSSE3، SSE4A، CX16، ABM و افزونههای مجموعه دستورالعملهای 64-bit است.)
- btver2
- پردازندههای مبتنی بر هستههای AMD Family 16h با پشتیبانی از مجموعه دستورالعملهای x86-64. این مورد شامل MOVBE، F16C، BMI، AVX، PCLMUL، AES، SSE4.2، SSE4.1، CX16، ABM، SSE4A، SSSE3، SSE3، SSE2، SSE، MMX و افزونههای مجموعه دستورالعملهای 64-bit میشود.
- winchip-c6
- پردازنده IDT WinChip C6، که همانند i486 به همراه پشتیبانی اضافی از مجموعه دستورالعملهای MMX با آن رفتار میشود.
- winchip2
- پردازنده IDT WinChip 2، که همانند i486 به همراه پشتیبانی اضافی از مجموعه دستورالعملهای MMX و !3DNow با آن رفتار میشود.
- c3
- پردازنده VIA C3 با پشتیبانی از مجموعه دستورالعملهای MMX و !3DNow. (هیچ زمانبندیای برای این تراشه پیادهسازی نشده است.)
- c3-2
- پردازنده VIA C3-2 (Nehemiah/C5XL) با پشتیبانی از مجموعه دستورالعملهای MMX و SSE. (هیچ زمانبندیای برای این تراشه پیادهسازی نشده است.)
- c7
- پردازنده VIA C7 (Esther) با پشتیبانی از مجموعه دستورالعملهای MMX، SSE، SSE2 و SSE3. (هیچ زمانبندیای برای این تراشه پیادهسازی نشده است.)
- samuel-2
- پردازنده VIA Eden Samuel 2 با پشتیبانی از مجموعه دستورالعملهای MMX و !3DNow. (هیچ زمانبندیای برای این تراشه پیادهسازی نشده است.)
- nehemiah
- پردازنده VIA Eden Nehemiah با پشتیبانی از مجموعه دستورالعملهای MMX و SSE. (هیچ زمانبندیای برای این تراشه پیادهسازی نشده است.)
- esther
- پردازنده VIA Eden Esther با پشتیبانی از مجموعه دستورالعملهای MMX، SSE، SSE2 و SSE3. (هیچ زمانبندیای برای این تراشه پیادهسازی نشده است.)
- eden-x2
- پردازنده VIA Eden X2 با پشتیبانی از مجموعه دستورالعملهای x86-64، MMX، SSE، SSE2 و SSE3. (هیچ زمانبندیای برای این تراشه پیادهسازی نشده است.)
- eden-x4
- پردازنده VIA Eden X4 با پشتیبانی از مجموعه دستورالعملهای x86-64، MMX، SSE، SSE2، SSE3، SSSE3، SSE4.1، SSE4.2، AVX و AVX2. (هیچ زمانبندیای برای این تراشه پیادهسازی نشده است.)
- nano
- پردازنده عمومی VIA Nano با پشتیبانی از مجموعه دستورالعملهای x86-64، MMX، SSE، SSE2، SSE3 و SSSE3. (هیچ زمانبندیای برای این تراشه پیادهسازی نشده است.)
- nano-1000
- پردازنده VIA Nano 1xxx با پشتیبانی از مجموعه دستورالعملهای x86-64، MMX، SSE، SSE2، SSE3 و SSSE3. (هیچ زمانبندیای برای این تراشه پیادهسازی نشده است.)
- nano-2000
- پردازنده VIA Nano 2xxx با پشتیبانی از مجموعه دستورالعملهای x86-64، MMX، SSE، SSE2، SSE3 و SSSE3. (هیچ زمانبندیای برای این تراشه پیادهسازی نشده است.)
- nano-3000
- پردازنده VIA Nano 3xxx با پشتیبانی از مجموعه دستورالعملهای x86-64، MMX، SSE، SSE2، SSE3، SSSE3 و SSE4.1. (هیچ زمانبندیای برای این تراشه پیادهسازی نشده است.)
- nano-x2
- پردازنده دو هستهای VIA Nano با پشتیبانی از مجموعه دستورالعملهای x86-64، MMX، SSE، SSE2، SSE3، SSSE3 و SSE4.1. (هیچ زمانبندیای برای این تراشه پیادهسازی نشده است.)
- nano-x4
- پردازنده چهار هستهای VIA Nano با پشتیبانی از مجموعه دستورالعملهای x86-64، MMX، SSE، SSE2، SSE3، SSSE3 و SSE4.1. (هیچ زمانبندیای برای این تراشه پیادهسازی نشده است.)
- lujiazui
- پردازنده ZHAOXIN lujiazui با پشتیبانی از مجموعه دستورالعملهای x86-64، MOVBE، MMX، SSE، SSE2، SSE3، SSSE3، SSE4.1، SSE4.2، POPCNT، AES، PCLMUL، RDRND، XSAVE، XSAVEOPT، FSGSBASE، CX16، ABM، BMI، BMI2، FXSR، RDSEED. اگرچه پردازندهها از AVX و F16C پشتیبانی میکنند، اما به دلایل کارایی توسط "-march=lujiazui" فعال نشدهاند.
- yongfeng
- پردازنده ZHAOXIN yongfeng با پشتیبانی از مجموعه دستورالعملهای x86-64، MOVBE، MMX، SSE، SSE2، SSE3، SSSE3، SSE4.1، SSE4.2، AVX، POPCNT، AES، PCLMUL، RDRND، XSAVE، XSAVEOPT، FSGSBASE، CX16، ABM، BMI، BMI2، F16C، FXSR، RDSEED، AVX2، FMA، SHA، LZCNT.
- shijidadao
- پردازنده ZHAOXIN shijidadao با پشتیبانی از مجموعه دستورالعملهای x86-64، MOVBE، MMX، SSE، SSE2، SSE3، SSSE3، SSE4.1، SSE4.2، AVX، POPCNT، AES، PCLMUL، RDRND، XSAVE، XSAVEOPT، FSGSBASE، CX16، ABM، BMI، BMI2، F16C، FXSR، RDSEED، AVX2، FMA، SHA، LZCNT.
- geode
- پردازنده تعبیهشده AMD Geode با پشتیبانی از مجموعه دستورالعملهای MMX و !3DNow.
- c86-4g-m4
- پردازنده HYGON c86-4g-m4 با پشتیبانی از مجموعه دستورالعملهای x86-64، MMX، SSE، SSE2، SSE3، SSE4A، CX16، ABM، SSSE3، SSE4.1، SSE4.2، AES، PCLMUL، AVX، AVX2، BMI، BMI2، F16C، FMA، PRFCHW، FXSR، SHA، XSAVE، XSAVEOPT، XSAVEC، FSGSBASE، RDRND، MOVBE، MWAITX، ADX، RDSEED، CLZERO، CLFLUSHOPT، XSAVES، LZCNT، POPCNT.
- c86-4g-m6
- پردازنده HYGON c86-4g-m6 با پشتیبانی از مجموعه دستورالعملهای x86-64، MMX، SSE، SSE2، SSE3، SSE4A، CX16، ABM، SSSE3، SSE4.1، SSE4.2، AES، PCLMUL، AVX، AVX2، BMI، BMI2، F16C، FMA، PRFCHW، FXSR، SHA، XSAVE، XSAVEOPT، XSAVEC، FSGSBASE، RDRND، MOVBE، MWAITX، ADX، RDSEED، CLZERO، CLFLUSHOPT، XSAVES، LZCNT، POPCNT.
- c86-4g-m7
- پردازنده HYGON c86-4g-m7 با پشتیبانی از مجموعه دستورالعملهای x86-64، MMX، SSE، SSE2، SSE3، SSE4A، CX16، ABM، SSSE3، SSE4.1، SSE4.2، AES، PCLMUL، AVX، AVX2، BMI، BMI2، F16C، FMA، PRFCHW، FXSR، SHA، XSAVE، XSAVEOPT، XSAVEC، FSGSBASE، RDRND، MOVBE، MWAITX، ADX، RDSEED، CLZERO، CLFLUSHOPT، XSAVES، LZCNT، POPCNT، AVX512F، AVX512DQ، AVX512IFMA، AVX512CD، AVX512BW، AVX512VL، AVX512BF16، AVX512VBMI، AVX512VBMI2، GFNI، AVX512VNNI، VAES، AVX512BITALG، AVX512VPOPCNTDQ، AVX512VP2INTERSECT، AVXVNNI، VPCLMULQDQ، WBNOINVD.
- c86-4g-m8
- پردازنده HYGON c86-4g-m8 با پشتیبانی از مجموعه دستورالعملهای x86-64، MMX، SSE، SSE2، SSE3، SSE4A، CX16، ABM، SSSE3، SSE4.1، SSE4.2، AES، PCLMUL، AVX، AVX2، BMI، BMI2، F16C، FMA، PRFCHW، FXSR، SHA، XSAVE، XSAVEOPT، XSAVEC، FSGSBASE، RDRND، MOVBE، MWAITX، ADX، RDSEED، CLZERO، CLFLUSHOPT، XSAVES، LZCNT، POPCNT، AVX512F، AVX512DQ، AVX512IFMA، AVX512CD، AVX512BW، AVX512VL، AVX512BF16، AVX512VBMI، AVX512VBMI2، GFNI، AVX512VNNI، VAES، AVX512BITALG، AVX512VPOPCNTDQ، AVX512VP2INTERSECT، AVXVNNI، VPCLMULQDQ، WBNOINVD.
- -mtune=cpu-type
- همه موارد
قابلاعمال
در کد
تولیدشده،
بهجز 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 پشتیبانی میکند:
- generic
- تولید کد
بهینهسازیشده
برای
رایجترین
پردازندههای
IA32/AMD64/EM64T. اگر
پردازندهای
را که کد
شما روی آن
اجرا خواهد
شد
میشناسید،
باید
بهجای -mtune=generic
از گزینه
متناظر -mtune
یا -march
استفاده
کنید. اما
اگر دقیقاً
نمیدانید
کاربران
برنامه شما
چه
پردازندهای
خواهند
داشت، باید
از این
گزینه
استفاده
کنید.
با عرضه پردازندههای جدید در بازار، رفتار این گزینه تغییر خواهد کرد. بنابراین، اگر به نسخه جدیدتری از GCC ارتقا دهید، تولید کدِ کنترلشده توسط این گزینه تغییر خواهد کرد تا منعکسکننده پردازندههایی باشد که در زمان انتشار آن نسخه از GCC رایجتر بودهاند.
هیچ گزینه -march=generic وجود ندارد زیرا -march نشاندهنده مجموعه دستورالعملهایی است که کامپایلر میتواند استفاده کند، و هیچ مجموعه دستورالعمل عمومیای وجود ندارد که برای همه پردازندهها قابلاعمال باشد. در مقابل، -mtune نشاندهنده پردازندهای (یا در این مورد، مجموعهای از پردازندهها) است که کد برای آن بهینهسازی میشود..IP intel 4 تولید کد بهینهشده برای جدیدترین پردازندههای Intel، که برای این نسخه از GCC شامل Haswell و Silvermont میشوند. اگر پردازندهای را که کد شما روی آن اجرا خواهد شد میشناسید، باید بهجای -mtune=intel از گزینهٔ متناظر -mtune یا -march استفاده کنید. با این حال، اگر میخواهید برنامهتان روی هر دو پردازندهٔ Diamond Rapids و Clearwater Forest عملکرد بهتری داشته باشد، باید از این گزینه استفاده کنید.
با عرضهٔ پردازندههای جدیدتر Intel در بازار، رفتار این گزینه تغییر خواهد کرد. بنابراین، اگر به نسخهٔ جدیدتری از GCC ارتقا دهید، تولید کد کنترلشده توسط این گزینه تغییر خواهد کرد تا منعکسکنندهٔ جدیدترین پردازندههای Intel در زمان انتشار آن نسخه از GCC باشد.
گزینهٔ -march=intel وجود ندارد، زیرا -march مجموعه دستورالعملهایی را که کامپایلر میتواند استفاده کند مشخص میسازد، و هیچ مجموعه دستورالعمل مشترکی که برای همهٔ پردازندهها قابلاعمال باشد وجود ندارد. در مقابل، -mtune پردازنده (یا در این حالت، مجموعهای از پردازندهها) را که کد برای آن بهینهسازی میشود، مشخص میکند.
گزینههای زیر امکان کنترل دقیقتر بر پسوندهای مجموعه دستورالعملهای هدف GCC را فراهم میکنند. هر یک دارای یک گزینهٔ متناظر -mno- برای غیرفعال کردن استفاده از این دستورالعملها است.
این پسوندها همچنین بهصورت توابع توکار (built-in) در دسترس هستند: برای جزئیات توابع فعال و غیرفعالشده توسط این سوئیچها، به x86 Built-in Functions مراجعه کنید.
این گزینهها GCC را قادر میسازند تا از این دستورالعملهای گسترشیافته در کد تولیدشده استفاده کند. برنامههایی که تشخیص پردازنده را در زمان اجرا انجام میدهند، باید فایلهای جداگانهای را برای هر معماری پشتیبانیشده، با استفاده از پرچمهای مناسب کامپایل کنند. بهویژه، فایلی که شامل کد تشخیص پردازنده است باید بدون این گزینهها کامپایل شود.
برای کنترل اینکه آیا دستورالعملهای 387 یا SSE/AVX بهطور خودکار برای محاسبات ممیز شناور تولید شوند یا خیر، به گزینهٔ -mfpmath= در زیر مراجعه کنید.
- -mmmx
- پشتیبانی از توابع توکار MMX.
- -msse
- پشتیبانی از توابع توکار و تولید کد MMX و SSE.
- -msse2
- پشتیبانی از توابع توکار و تولید کد MMX، SSE و SSE2.
- -msse3
- پشتیبانی از توابع توکار و تولید کد MMX، SSE، SSE2 و SSE3.
- -mssse3
- پشتیبانی از توابع توکار و تولید کد MMX، SSE، SSE2، SSE3 و SSSE3.
- -msse4.1
- پشتیبانی از توابع توکار و تولید کد MMX، SSE، SSE2، SSE3، SSSE3 و SSE4.1.
- -msse4.2
- پشتیبانی از توابع توکار و تولید کد MMX، SSE، SSE2، SSE3، SSSE3، SSE4.1 و SSE4.2.
- -msse4
- پشتیبانی
از توابع
توکار و
تولید کد MMX،
SSE، SSE2، SSE3، SSSE3، SSE4.1 و
SSE4.2.
توجه داشته باشید که -msse4 پشتیبانی از هر دو مجموعهٔ SSE4.1 و SSE4.2 را فعال میکند، در حالی که -mno-sse4 این ویژگیها را غیرفعال میسازد؛ هیچیک از حالتهای این گزینه تأثیری بر پشتیبانی از SSE4A که بهطور جداگانه توسط -msse4a کنترل میشود، ندارد.
- -msse4a
- پشتیبانی از توابع توکار و تولید کد MMX، SSE، SSE2، SSE3 و SSE4A.
- -mavx
- پشتیبانی از توابع توکار و تولید کد MMX، SSE، SSE2، SSE3، SSSE3، SSE4.1، SSE4.2 و AVX.
- -mavx2
- پشتیبانی از توابع توکار و تولید کد MMX، SSE، SSE2، SSE3، SSSE3، SSE4.1، SSE4.2، AVX و AVX2.
- -mavx512f
- پشتیبانی از توابع توکار و تولید کد MMX، SSE، SSE2، SSE3، SSSE3، SSE4.1، SSE4.2، AVX، AVX2 و AVX512F.
- -mavx512cd
- پشتیبانی از توابع توکار و تولید کد MMX، SSE، SSE2، SSE3، SSSE3، SSE4.1، SSE4.2، AVX، AVX2، AVX512F و AVX512CD.
- -mavx512vl
- پشتیبانی از توابع توکار و تولید کد MMX، SSE، SSE2، SSE3، SSSE3، SSE4.1، SSE4.2، AVX، AVX2، AVX512F و AVX512VL.
- -mavx512bw
- پشتیبانی از توابع توکار و تولید کد MMX، SSE، SSE2، SSE3، SSSE3، SSE4.1، SSE4.2، AVX، AVX2، AVX512F و AVX512BW.
- -mavx512dq
- پشتیبانی از توابع توکار و تولید کد MMX، SSE، SSE2، SSE3، SSSE3، SSE4.1، SSE4.2، AVX، AVX2، AVX512F و AVX512DQ.
- -mavx512ifma
- پشتیبانی از توابع توکار و تولید کد MMX، SSE، SSE2، SSE3، SSSE3، SSE4.1، SSE4.2، AVX، AVX2، AVX512F و AVX512IFMA.
- -mavx512vbmi
- پشتیبانی از توابع توکار و تولید کد MMX، SSE، SSE2، SSE3، SSSE3، SSE4.1، SSE4.2، AVX، AVX2، AVX512F و AVX512VBMI.
- -mavx512vpopcntdq
- پشتیبانی از توابع توکار و تولید کد MMX، SSE، SSE2، SSE3، SSSE3، SSE4.1، SSE4.2، AVX، AVX2، AVX512F و AVX512VPOPCNTDQ.
- -mavx512vp2intersect
- پشتیبانی از توابع توکار و تولید کد AVX512VP2INTERSECT.
- -mavx512vnni
- پشتیبانی از توابع توکار و تولید کد AVX512VNNI.
- -mavx512vbmi2
- پشتیبانی از توابع توکار و تولید کد MMX، SSE، SSE2، SSE3، SSSE3، SSE4.1، SSE4.2، AVX، AVX2، AVX512F و AVX512VBMI2.
- -mavx512bf16
- پشتیبانی از توابع توکار و تولید کد MMX، SSE، SSE2، SSE3، SSSE3، SSE4.1، SSE4.2، AVX، AVX2، AVX512F و AVX512BF16.
- -mavx512fp16
- پشتیبانی از توابع توکار و تولید کد MMX، SSE، SSE2، SSE3، SSSE3، SSE4.1، SSE4.2، AVX، AVX2، AVX512F و AVX512-FP16.
- -mavx512bitalg
- پشتیبانی از توابع توکار و تولید کد MMX، SSE، SSE2، SSE3، SSSE3، SSE4.1، SSE4.2، AVX، AVX2، AVX512F و AVX512BITALG.
- -mavx512bmm
- پشتیبانی از توابع توکار و تولید کد AVX512BMM.
- -mavxvnni
- پشتیبانی از توابع توکار و تولید کد MMX، SSE، SSE2، SSE3، SSSE3، SSE4.1، SSE4.2، AVX، AVX2 و AVXVNNI.
- -mavxifma
- پشتیبانی از توابع توکار و تولید کد MMX، SSE، SSE2، SSE3، SSSE3، SSE4.1، SSE4.2، AVX، AVX2 و AVXIFMA.
- -mavxvnniint8
- پشتیبانی از توابع توکار و تولید کد MMX، SSE، SSE2، SSE3، SSSE3، SSE4.1، SSE4.2، AVX، AVX2 و AVXVNNIINT8.
- -mavxneconvert
- پشتیبانی از توابع توکار و تولید کد MMX، SSE، SSE2، SSE3، SSSE3، SSE4.1، SSE4.2، AVX، AVX2 و AVXNECONVERT.
- -mavxvnniint16
- پشتیبانی از توابع توکار و تولید کد MMX، SSE، SSE2، SSE3، SSSE3، SSE4.1، SSE4.2، AVX، AVX2 و AVXVNNIINT16.
- -mavx10.1
- پشتیبانی از توابع توکار و تولید کد MMX، SSE، SSE2، SSE3، SSSE3، SSE4.1، SSE4.2، AVX، AVX2 و AVX10.1.
- -mavx10.2
- پشتیبانی از توابع توکار و تولید کد MMX، SSE، SSE2، SSE3، SSSE3، SSE4.1، SSE4.2، AVX، AVX2، AVX10.1 و AVX10.2.
- -msha
- پشتیبانی از توابع توکار و تولید کد SHA1 و SHA256.
- -maes
- پشتیبانی از توابع توکار و تولید کد AES.
- -mpclmul
- پشتیبانی از توابع توکار و تولید کد PCLMUL.
- -mclflushopt
- پشتیبانی از دستورالعملهای CLFLUSHOPT..IP -mclwb 4 پشتیبانی از دستور CLWB.
- -mfsgsbase
- پشتیبانی از توابع توکار و تولید کد FSGSBASE.
- -mptwrite
- پشتیبانی از توابع توکار و تولید کد PTWRITE.
- -mrdrnd
- پشتیبانی از توابع توکار و تولید کد RDRND.
- -mf16c
- پشتیبانی از توابع توکار و تولید کد F16C.
- -mfma
- پشتیبانی از توابع توکار و تولید کد MMX، SSE، SSE2، SSE3، SSSE3، SSE4.1، SSE4.2، AVX و FMA.
- -mfma4
- پشتیبانی از توابع توکار و تولید کد FMA4.
- -mpconfig
- پشتیبانی از توابع توکار و تولید کد PCONFIG.
- -mwbnoinvd
- پشتیبانی از توابع توکار و تولید کد WBNOINVD.
- -mprfchw
- پشتیبانی از دستور PREFETCHW.
- -mrdpid
- پشتیبانی از توابع توکار و تولید کد RDPID.
- -mrdseed
- پشتیبانی از دستور RDSEED.
- -msgx
- پشتیبانی از توابع توکار و تولید کد SGX.
- -mxop
- پشتیبانی از توابع توکار و تولید کد XOP.
- -mlwp
- پشتیبانی از توابع توکار و تولید کد LWP.
- -m3dnow
- پشتیبانی از توابع توکار 3DNow!.
- -m3dnowa
- پشتیبانی از توابع توکار Athlon 3Dnow!.
- -mpopcnt
- پشتیبانی از تولید کد دستور popcnt.
- -mabm
- پشتیبانی از تولید کد دستورهای دستکاری پیشرفته بیت (ABM).
- -madx
- پشتیبانی از دستورهای add-carry با حفظ پرچم.
- -mbmi
- پشتیبانی از توابع توکار و تولید کد BMI.
- -mbmi2
- پشتیبانی از توابع توکار و تولید کد BMI2.
- -mlzcnt
- پشتیبانی از تابع توکار و تولید کد LZCNT.
- -mfxsr
- پشتیبانی از دستورهای FXSAVE و FXRSTOR.
- -mxsave
- پشتیبانی از دستورهای XSAVE و XRSTOR.
- -mxsaveopt
- پشتیبانی از دستور XSAVEOPT.
- -mxsavec
- پشتیبانی از دستورهای XSAVEC.
- -mxsaves
- پشتیبانی از دستورهای XSAVES و XRSTORS.
- -mrtm
- پشتیبانی از توابع توکار و تولید کد RTM.
- -mhle
- پشتیبانی از پیشوندهای Hardware Lock Elision.
- -mtbm
- پشتیبانی از توابع توکار و تولید کد TBM.
- -mmwaitx
- پشتیبانی از توابع توکار و تولید کد MWAITX و MONITORX.
- -mclzero
- پشتیبانی از توابع توکار و تولید کد CLZERO.
- -mpku
- پشتیبانی از توابع توکار و تولید کد PKU.
- -mgfni
- پشتیبانی از توابع توکار و تولید کد GFNI.
- -mvaes
- پشتیبانی از توابع توکار و تولید کد VAES.
- -mwaitpkg
- پشتیبانی از توابع توکار و تولید کد WAITPKG.
- -mvpclmulqdq
- پشتیبانی از توابع توکار و تولید کد VPCLMULQDQ.
- -mmovdiri
- پشتیبانی از توابع توکار و تولید کد MOVDIRI.
- -mmovdir64b
- پشتیبانی از توابع توکار و تولید کد MOVDIR64B.
- -menqcmd
- پشتیبانی از توابع توکار و تولید کد ENQCMD.
- -muintr
- پشتیبانی از توابع توکار و تولید کد UINTR.
- -mtsxldtrk
- پشتیبانی از توابع توکار و تولید کد TSXLDTRK.
- -mcldemote
- پشتیبانی از توابع توکار و تولید کد CLDEMOTE.
- -mserialize
- پشتیبانی از توابع توکار و تولید کد SERIALIZE.
- -mamx-tile
- پشتیبانی از توابع توکار و تولید کد AMX-TILE.
- -mamx-int8
- پشتیبانی از توابع توکار و تولید کد AMX-INT8.
- -mamx-bf16
- پشتیبانی از توابع توکار و تولید کد AMX-BF16.
- -mhreset
- پشتیبانی از توابع توکار و تولید کد HRESET.
- -mkl
- پشتیبانی از توابع توکار و تولید کد KL.
- -mwidekl
- پشتیبانی از توابع توکار و تولید کد WIDEKL.
- -mcmpccxadd
- پشتیبانی از توابع توکار و تولید کد MMX، SSE، SSE2، SSE3، SSSE3، SSE4.1، SSE4.2، AVX، AVX2 و CMPCCXADD.
- -mamx-fp16
- پشتیبانی از توابع توکار و تولید کد AMX-FP16.
- -mprefetchi
- پشتیبانی از توابع توکار و تولید کد PREFETCHI.
- -mraoint
- پشتیبانی از توابع توکار و تولید کد RAOINT.
- -mamx-complex
- پشتیبانی از توابع توکار و تولید کد AMX-COMPLEX.
- -msm3
- پشتیبانی از توابع توکار و تولید کد MMX، SSE، SSE2، SSE3، SSSE3، SSE4.1، SSE4.2، AVX و SM3.
- -msm4
- پشتیبانی از توابع توکار و تولید کد MMX، SSE، SSE2، SSE3، SSSE3، SSE4.1، SSE4.2، AVX و SM4.
- -msha512
- پشتیبانی از توابع توکار و تولید کد MMX، SSE، SSE2، SSE3، SSSE3، SSE4.1، SSE4.2، AVX و SHA512..IP -mapxf 4 پشتیبانی از تولید کد برای قابلیتهای APX، شامل EGPR، PUSH2POP2، NDD، PPX، NF، CCMP و ZU.
- -musermsr
- پشتیبانی از توابع توکار و تولید کد برای USER_MSR.
- -mamx-avx512
- پشتیبانی از توابع توکار و تولید کد برای MMX، SSE، SSE2، SSE3، SSSE3، SSE4.1، SSE4.2، AVX، AVX2، AVX10.1، AVX10.2 و AMX-AVX512.
- -mamx-tf32
- پشتیبانی از توابع توکار و تولید کد برای AMX-TF32.
- -mamx-fp8
- پشتیبانی از توابع توکار و تولید کد برای AMX-FP8.
- -mmovrs
- پشتیبانی از توابع توکار و تولید کد برای MOVRS.
- -mamx-movrs
- پشتیبانی از توابع توکار و تولید کد برای AMX-MOVRS.
این گزینههای اضافی برای خانوادهٔ پردازندههای x86 در دسترس هستند.
- -mfpmath=unit
- تولید محاسبات ممیز شناور برای واحد انتخابشدهٔ unit. گزینههای موجود برای unit عبارتند از:
- 387
- استفاده از
پردازندهٔ
کمکی ممیز
شناور
استاندارد
387 که در اکثر
تراشهها
موجود است و
در غیر این
صورت
شبیهسازی
میشود. کد
کامپایلشده
با این
گزینه
تقریباً در
همهجا
اجرا
میشود.
نتایج موقت
به جای دقتی
که نوع داده
مشخص کرده
است، با دقت
۸۰ بیتی
محاسبه
میشوند که
در مقایسه
با اکثر
تراشههای
دیگر به
نتایجی با
تفاوت جزئی
میانجامد.
برای
توضیحات
دقیقتر،
-ffloat-store را
ببینید.
این انتخاب پیشفرض برای مقصدهای x86-32 غیر از Darwin است.
- sse
- استفاده از
دستورالعملهای
ممیز شناور
اسکالرِ
موجود در
مجموعه
دستورالعملهای
SSE. این
مجموعه
دستورالعمل
توسط Pentium III و
تراشههای
جدیدتر، و
در خط تولید
AMD توسط
تراشههای
Athlon-4، Athlon XP و Athlon MP
پشتیبانی
میشود.
نسخهٔ
اولیهٔ
مجموعه
دستورالعملهای
SSE فقط از
محاسبات با
دقت یگانه
(single-precision)
پشتیبانی
میکند،
بنابراین
محاسبات با
دقت دوگانه
و دقت
گسترشیافته
همچنان با
استفاده از
387 انجام
میشوند.
نسخهٔ
بعدی، که
فقط در
تراشههای
Pentium 4 و AMD x86-64 وجود
دارد، از
محاسبات با
دقت دوگانه
نیز
پشتیبانی
میکند.
برای کامپایلر x86-32، باید از سوییچهای -march=cpu-type، -msse یا -msse2 برای فعالسازی پسوندهای SSE و اثربخش کردن این گزینه استفاده کنید. برای کامپایلر x86-64، این پسوندها به صورت پیشفرض فعال هستند.
کد حاصل در اکثر موارد باید بهطور قابل توجهی سریعتر باشد و از مشکلات ناپایداری عددی کدهای 387 جلوگیری کند، اما ممکن است برخی از کدهای موجود را که انتظار دارند متغیرهای موقت ۸۰ بیتی باشند دچار خطا کند.
این انتخاب پیشفرض برای کامپایلر x86-64، مقصدهای Darwin x86-32، و انتخاب پیشفرض برای مقصدهای x86-32 دارای مجموعه دستورالعملهای SSE2 در هنگام فعال بودن -ffast-math است.
هنگام استفاده از -mavx (یا گزینهٔ دیگری که پسوندهای AVX را فعال میکند)، GCC دستورالعملهای SSE را فرومینشاند؛ در عوض، دستورالعملهای جدید AVX یا معادلهای AVX را در صورت نیاز برای تمامی دستورالعملهای SSE تولید میکند.
- sse,387
- sse+387
- both
- تلاش برای استفاده از هر دو مجموعه دستورالعمل بهطور همزمان. این کار عملاً تعداد ثباتهای در دسترس را دو برابر میکند، و در تراشههایی با واحدهای اجرایی جداگانه برای 387 و SSE، منابع اجرایی را نیز مضاعف میسازد. از این گزینه با احتیاط استفاده کنید، زیرا هنوز آزمایشی است؛ چرا که تخصیصدهندهٔ ثبات GCC واحدهای عملکردی مجزا را به خوبی مدلسازی نمیکند که منجر به کارایی ناپایدار میشود.
- -mieee-fp
- -mno-ieee-fp
- کنترل میکند که آیا کامپایلر از مقایسههای ممیز شناور IEEE استفاده کند یا خیر. این مقایسهها حالتی را که نتیجهٔ یک مقایسه نامرتب (unordered) است، بهدرستی مدیریت میکنند.
- -m80387
- -mhard-float
- تولید خروجی حاوی دستورالعملهای 80387 برای ممیز شناور.
- -mno-80387
- -msoft-float
- تولید
خروجی حاوی
فراخوانیهای
کتابخانهای
برای ممیز
شناور.
هشدار: کتابخانههای ضروری بخشی از GCC نیستند. بهطور معمول از امکانات کامپایلر معمول C ماشین استفاده میشود، اما این کار در کامپایل متقابل (cross-compilation) بهطور مستقیم امکانپذیر نیست. باید تمهیدات لازم را برای فراهم کردن توابع کتابخانهای مناسب برای کامپایل متقابل در نظر بگیرید.
در ماشینهایی که یک تابع نتایج ممیز شناور را در پشتهٔ ثباتهای 80387 برمیگرداند، ممکن است حتی در صورت استفاده از -msoft-float برخی کدهای دستوری (opcode) ممیز شناور صادر شوند.
- -mno-fp-ret-in-387
- عدم
استفاده از
ثباتهای FPU
برای
مقادیر
بازگشتی
توابع.
قرارداد فراخوانی معمول به این صورت است که توابع مقادیر نوعهای "float" و "double" را در یک ثبات FPU بازمیگردانند، حتی اگر FPU فیزیکی وجود نداشته باشد. ایده این است که سیستمعامل باید یک FPU را شبیهسازی کند.
گزینهٔ -mno-fp-ret-in-387 باعث میشود چنین مقادیری در عوض در ثباتهای معمولی CPU بازگردانده شوند.
- -mno-fancy-math-387
- برخی شبیهسازهای 387 از دستورالعملهای "sin"، "cos" و "sqrt" برای 387 پشتیبانی نمیکنند. این گزینه را برای جلوگیری از تولید این دستورالعملها مشخص کنید. این گزینه در صورتی که -march مشخص کند CPU مقصد همیشه دارای یک FPU است و بنابراین دستور نیازی به شبیهسازی ندارد، نادیده گرفته میشود. این دستورالعملها تولید نمیشوند مگر اینکه از سوییچ -funsafe-math-optimizations نیز استفاده کنید.
- -malign-double
- -mno-align-double
- کنترل
میکند که
آیا GCC
متغیرهای
"double"،
"long double" و
"long long" را
در یک مرز
دو کلمهای
تراز کند یا
یک مرز تک
کلمهای.
تراز کردن
متغیرهای
"double" در
یک مرز دو
کلمهای
کدی تولید
میکند که
روی Pentium با
هزینهٔ
مصرف
حافظهٔ
بیشتر، تا
حدی
سریعتر
اجرا
میشود.
در x86-64، گزینهٔ -malign-double به صورت پیشفرض فعال است.
هشدار: در صورت استفاده از سوییچ -malign-double، ساختارهای حاوی انواع فوق متفاوت با مشخصات منتشرشدهٔ رابط باینری کاربردی (ABI) برای x86-32 تراز میشوند و با ساختارها در کدهای کامپایلشده بدون این سوییچ سازگاری باینری نخواهند داشت.
- -m96bit-long-double
- -m128bit-long-double
- این
سوییچها
اندازهٔ
نوع دادهٔ
"long double" را
کنترل
میکنند.
رابط
باینری
کاربردی (ABI)
در x86-32 اندازه
را ۹۶ بیت
مشخص
میکند،
بنابراین
-m96bit-long-double در
حالت ۳۲
بیتی
پیشفرض
است.
معماریهای مدرن (Pentium و جدیدتر) ترجیح میدهند "long double" روی یک مرز ۸ یا ۱۶ بایتی تراز شود. در آرایهها یا ساختارهای منطبق با ABI، این امر امکانپذیر نیست. بنابراین، مشخص کردن -m128bit-long-double، نوع دادهٔ "long double" را با پَد کردن (padding) با ۳۲ بیت صفر اضافه، روی یک مرز ۱۶ بایتی تراز میکند.
در کامپایلر x86-64، گزینهٔ -m128bit-long-double انتخاب پیشفرض است زیرا ABI آن مشخص میکند که "long double" روی مرز ۱۶ بایتی تراز شود.
توجه داشته باشید که هیچیک از این گزینهها دقتی فراتر از استاندارد ۸۰ بیتی x87 برای "long double" فراهم نمیکنند.
هشدار: اگر مقدار پیشفرض را برای ABI مقصد خود بازنویسی کنید، این کار اندازهٔ ساختارها و آرایههای حاوی متغیرهای "long double" را تغییر میدهد، و همچنین قرارداد فراخوانی تابع را برای توابعی که آرگومان "long double" میگیرند دگرگون میسازد. از این رو، این موارد با کدهایی که بدون این سوییچ کامپایل شدهاند سازگاری باینری نخواهند داشت..IP -mlong-double-64 4
- -mlong-double-80
- -mlong-double-128
- این
سوییچها
اندازهٔ
نوع "long double"
را کنترل
میکنند.
اندازهٔ ۶۴
بیتی، نوع
"long double" را
معادل با
نوع "double"
قرار
میدهد. این
حالت
پیشفرض
برای
کتابخانه
۳۲ بیتی Bionic C
است.
اندازهٔ
۱۲۸ بیتی،
نوع "long double"
را معادل با
نوع "__float128"
قرار
میدهد. این
حالت
پیشفرض
برای
کتابخانه
۶۴ بیتی Bionic C
است.
هشدار: اگر مقدار پیشفرض را برای ABI مقصد خود تغییر دهید، این کار اندازهٔ ساختارها و آرایههای حاوی متغیرهای "long double" را تغییر میدهد و همچنین قرارداد فراخوانی تابع (calling convention) را برای توابعی که آرگومان "long double" میگیرند دگرگون میسازد. از این رو، آنها با کدهایی که بدون این سوییچ کامپایل شدهاند سازگاری باینری (binary-compatible) نخواهند داشت.
- -malign-data=type
- نحوهٔ همترازی متغیرها توسط GCC را کنترل میکند. مقادیر پشتیبانیشده برای type عبارتند از: compat از مقدار همترازیِ افزایشیافته سازگار با GCC 4.8 و پیش از آن استفاده میکند، abi از مقدار همترازی مشخصشده توسط psABI بهره میبرد، و cacheline از مقدار همترازیِ افزایشیافته برای مطابقت با اندازه خط حافظهٔ نهان (cache line size) استفاده میکند. مقدار پیشفرض compat است.
- -mlarge-data-threshold=threshold
- هنگامی که -mcmodel=medium یا -mcmodel=large مشخص شده باشد، شیءهای داده بزرگتر از threshold در بخشهای دادهٔ بزرگ (large data sections) قرار میگیرند. مقدار پیشفرض 65535 است.
- -mrtd
- از یک
قرارداد
فراخوانی
تابع
متفاوت
استفاده
میکند که
در آن،
توابعی با
تعداد
ثابتی از
آرگومانها
با دستور
"ret
num"
بازمیگردند؛
دستوری که
آرگومانهای
آنها را در
هنگام
بازگشت از
پشته خارج (pop)
میکند. این
کار به دلیل
عدم نیاز به
خارج کردن
آرگومانها
در سمت
فراخواننده،
باعث
صرفهجویی
در یک دستور
در
فراخواننده
(caller) میشود.
میتوانید با استفاده از مشخصهٔ تابع (function attribute) "stdcall" تعیین کنید که یک تابع مشخص با این توالی فراخوانی صدا زده شود. همچنین میتوانید گزینهٔ -mrtd را با استفاده از مشخصهٔ تابع "cdecl" لغو و بازنویسی کنید.
هشدار: این قرارداد فراخوانی با قراردادی که بهطور معمول در Unix استفاده میشود ناسازگار است؛ بنابراین در صورت نیاز به فراخوانی کتابخانههایی که با کامپایلر Unix کامپایل شدهاند، نمیتوانید از آن استفاده کنید.
همچنین، باید الگوی اولیهٔ تابع (function prototype) را برای همهٔ توابعی که تعداد متغیری آرگومان میپذیرند (شامل "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 (FPU control word)
در دسترس
برنامهنویس
نخواهد بود.
تنظیم گرد کردن محاسبات ممیز شناور به مقداری کمتر از ۸۰ بیت پیشفرض میتواند سرعت برخی برنامهها را ۲٪ یا بیشتر افزایش دهد. توجه داشته باشید که برخی از کتابخانههای ریاضیاتی فرض میکنند که محاسبات ممیز شناور با دقت گسترشیافته (۸۰ بیتی) بهطور پیشفرض فعال است؛ بنابراین روتینهای چنین کتابخانههایی ممکن است در صورت استفاده از این گزینه برای تنظیم دقت روی مقداری کمتر از دقت گسترشیافته، بهطور قابل توجهی دچار افت دقت شوند که معمولاً به دلیل پدیدهای موسوم به «حذف فاجعهبار» (catastrophic cancellation) رخ میدهد.
- -mdaz-ftz
- -mno-daz-ftz
- پرچمهای flush-to-zero (FTZ) و denormals-are-zero (DAZ) در ثبات MXCSR برای کنترل محاسبات ممیز شناور به کار میروند. گزینههای -Ofast، -ffast-math یا -funsafe-math-optimizations معمولاً کدهای راهاندازیای (startup code) را پیوند میدهند که این پرچمها را تنظیم میکند، مگر در هنگام ساخت یک کتابخانهٔ مشترک (-shared). میتوانید از گزینههای -mdaz-ftz و -mno-daz-ftz برای فعال یا غیرفعال کردن صریح تنظیم این پرچمها، صرف نظر از سایر گزینههای ارائهشده به GCC استفاده کنید.
- -mstackrealign
- همترازی مجدد پشته در بدو ورود. در x86، گزینهٔ -mstackrealign یک مقدمه (prologue) و مؤخره (epilogue) جایگزین تولید میکند که در صورت نیاز، پشتهٔ زمان اجرا را مجدداً همتراز میسازد. این کار از ادغام کدهای قدیمی که همترازی پشتهٔ ۴ بایتی را حفظ میکنند با کدهای نوین که همترازی پشتهٔ ۱۶ بایتی را برای سازگاری با SSE حفظ میکنند، پشتیبانی میکند. همچنین مشخصهٔ "force_align_arg_pointer" را ببینید که برای توابع منفرد قابل اعمال است.
- -mstack-arg-probe
- کد کاوش پشته (stack probing code) را در مقدمهٔ تابع تولید میکند.
- -mpreferred-stack-boundary=num
- تلاش
میکند مرز
پشته را
همتراز با
مضارب ۲ به
توان num
بایت نگه
دارد. اگر
-mpreferred-stack-boundary مشخص
نشده باشد،
مقدار
پیشفرض ۴
(۱۶ بایت یا
۱۲۸ بیت)
است.
هشدار: هنگام تولید کد برای معماری x86-64 در حالی که افزونههای SSE غیرفعال هستند، میتوان از -mpreferred-stack-boundary=3 برای همتراز نگه داشتن مرز پشته با مضارب ۸ بایت استفاده کرد. از آنجا که ABI در معماری x86-64 نیازمند همترازی ۱۶ بایتی پشته است، این کار موجب ناسازگاری با ABI میشود و برای استفاده در محیطهای کنترلشدهای در نظر گرفته شده که فضای پشته در آنها محدودیتی اساسی است. این گزینه زمانی که توابع کامپایلشده با همترازی ۱۶ بایتی پشته (مانند توابع یک کتابخانهٔ استاندارد) با پشتهٔ غیرهمتراز فراخوانی شوند، به تولید کدهای اشتباه منجر میشود. در این حالت، دستورالعملهای SSE ممکن است باعث بروز تلههای دسترسی غیرهمتراز به حافظه (misaligned memory access traps) شوند. علاوه بر این، آرگومانهای متغیر برای شیءهای با همترازی ۱۶ بایتی (از جمله x87 long double و __int128) بهطور نادرست مدیریت میشوند که به نتایج اشتباه میانجامد. شما باید تمام پودمانها، از جمله همهٔ کتابخانهها را با -mpreferred-stack-boundary=3 بسازید. این امر کتابخانههای سیستم و پودمانهای راهاندازی را نیز شامل میشود.
- -mincoming-stack-boundary=num
- فرض میکند
پشتهٔ
ورودی با
مضارب ۲ به
توان num
بایت
همتراز
شده است.
اگر -mincoming-stack-boundary
مشخص نشود،
از مقدار
تعیینشده
توسط -mpreferred-stack-boundary
استفاده
میشود.
در پردازندههای Pentium و Pentium Pro، مقادیر "double" و "long double" باید با مرز ۸ بایتی همتراز شوند (نگاه کنید به -malign-double)، در غیر این صورت دچار افت شدید کارایی در زمان اجرا خواهند شد. در Pentium III، ممکن است نوع دادهٔ Streaming SIMD Extension (SSE) موسوم به "__m128" در صورت عدم همترازی ۱۶ بایتی بهدرستی کار نکند.
برای اطمینان از همترازی صحیح این مقادیر روی پشته، مرز پشته باید به اندازهای که هر مقدار ذخیرهشده روی آن نیاز دارد همتراز باشد. علاوه بر این، هر تابع باید بهگونهای تولید شود که پشته را همتراز نگه دارد. از این رو فراخوانی تابعی که با مرز ترجیحی پشتهٔ بالاتری کامپایل شده از تابعی با مرز ترجیحی پشتهٔ پایینتر، به احتمال زیاد پشته را از حالت همتراز خارج میسازد. توصیه میشود کتابخانههایی که از توابع بازفراخوانی (callback) استفاده میکنند، همواره از تنظیمات پیشفرض بهره ببرند.
این همترازیِ افزوده، فضای پشتهٔ بیشتری مصرف کرده و عموماً حجم کد را افزایش میدهد. کدهایی که به مصرف فضای پشته حساس هستند، مانند سامانههای تعبیهشده (embedded systems) و هستههای سیستمعامل، ممکن است مایل باشند همترازی ترجیحی را به -mpreferred-stack-boundary=2 کاهش دهند.
- -mdump-tune-features
- این گزینه به GCC دستور میدهد تا نام ویژگیهای تنظیم کارایی x86 و تنظیمات پیشفرض آنها را تخلیه (dump) کند. این نامها میتوانند در -mtune-ctrl=feature-list به کار روند..IP -mtune-ctrl=feature-list 4 این گزینه برای کنترل دقیق و ریزدانهای ویژگیهای تولید کد x86 استفاده میشود. feature-list فهرستی جداشده با کاما از نامهای feature است. همچنین -mdump-tune-features را ببینید. هنگام مشخص شدن، feature فعال میشود اگر پیش از آن ^ نیامده باشد؛ در غیر این صورت، غیرفعال میگردد. -mtune-ctrl=feature-list برای استفاده توسط توسعهدهندگان GCC در نظر گرفته شده است. استفاده از آن ممکن است به مسیرهای کدی منجر شود که با آزمایشها پوشش داده نشدهاند و بهطور بالقوه میتواند موجب خطاهای ICE کامپایلر یا خطاهای زمان اجرا شود.
- -mno-default
- این گزینه به GCC دستور میدهد که تمام ویژگیهای قابلتنظیم را خاموش کند. همچنین -mtune-ctrl=feature-list و -mdump-tune-features را ببینید.
- -mcld
- این گزینه به GCC دستور میدهد تا یک دستورالعمل "cld" را در پیشدرآمد (prologue) توابعی که از دستورالعملهای رشتهای استفاده میکنند، صادر کند. دستورالعملهای رشتهای برای انتخاب بین حالت افزایش خودکار یا کاهش خودکار به پرچم DF وابسته هستند. در حالی که ABI مشخص میکند که پرچم DF باید در هنگام ورود به تابع پاک شود، برخی از سیستمعاملها با پاک نکردن پرچم DF در توزیعکنندههای استثنای (exception dispatchers) خود، این مشخصات را نقض میکنند. گردانندهٔ استثنا ممکن است با پرچم DFِ تنظیمشده فراخوانی شود که هنگام استفاده از دستورالعملهای رشتهای به حالت جهتیابی اشتباه منجر میشود. این گزینه میتواند با پیکربندی GCC از طریق گزینهٔ پیکربندی --enable-cld، بهطور پیشفرض روی اهداف ۳۲ بیتی x86 فعال شود. تولید دستورالعملهای "cld" در این حالت میتواند با گزینهٔ کامپایلر -mno-cld متوقف شود.
- -mvzeroupper
- این گزینه به GCC دستور میدهد تا قبل از انتقال جریان کنترل به خارج از تابع، یک دستورالعمل "vzeroupper" صادر کند تا جریمهٔ انتقال از AVX به SSE را به حداقل رسانده و همچنین ذاتیهای (intrinsics) غیرضروری "zeroupper" را حذف کند.
- -mstv
- -mno-stv
- فعال/غیرفعالسازی گذرگاه تبدیل اسکالر به برداری (Scalar to Vectorization pass) که محاسبات عدد صحیح ۶۴ بیتی را به محاسبات برداری تبدیل میکند. این بهینهسازی به -O2 و بالاتر محدود شده است.
- -mprefer-avx128
- این گزینه به GCC دستور میدهد تا در برداریساز خودکار (auto-vectorizer) به جای دستورالعملهای ۲۵۶ بیتی AVX، از دستورالعملهای ۱۲۸ بیتی AVX استفاده کند.
- -mprefer-vector-width=opt
- این گزینه به GCC دستور میدهد تا در دستورالعملها به جای عرض پیشفرض در سکوی انتخابی، از پهنای بردار opt بیتی استفاده کند.
- -mpartial-vector-fp-math
- -mno-partial-vector-fp-math
- این گزینه
به GCC امکان
میدهد تا
عملیات
ممیز
شناوری
تولید کند
که ممکن است
بر مجموعه
پرچمهای
وضعیت ممیز
شناور روی
بردارهای
جزئی اثر
بگذارد؛
جایی که
عناصر
بردار در
بخش پایینی
ثبات ۱۲۸
بیتی SSE قرار
دارند. مگر
اینکه -fno-trapping-math
مشخص شده
باشد،
کامپایلر
با
پاکسازی
تمام
عملوندهای
ورودی
بهگونهای
که در بخش
بالاییِ
استفادهنشده
ثبات
برداری صفر
داشته
باشند،
رفتار صحیح
را تضمین
میکند.
توجه داشته
باشید که با
استفاده از
توابع
درونی یا
اسمبلی
برخط (inline assembly) با
آرگومانهای
بردار
جزئی،
مقادیر NaN،
غیرعادی (denormal)
یا نامعتبر
میتوانند
به بخش
بالایی
بردار نشت
کرده و در
صورت فعال
بودن -fno-trapping-math،
مشکلات
احتمالی در
کارایی
ایجاد کنند.
این مشکلات
را میتوان
با
پاکسازی
دستی بخش
بالایی
ثبات
آرگومان
بردار جزئی
یا با
استفاده از
-mdaz-ftz برای
تنظیم پرچم
DAZ (مخفف denormals-are-zero) در
ثبات MXCSR کاهش
داد.
این گزینه بهطور پیشفرض فعال است.
- -mmove-max=bits
- این گزینه به GCC دستور میدهد تا حداکثر تعداد بیتهایی را که میتوان بهطور کارآمد از حافظه به حافظه منتقل کرد روی bits تنظیم کند. مقادیر معتبر bits شامل 128، 256 و 512 است.
- -mstore-max=bits
- این گزینه به GCC دستور میدهد تا حداکثر تعداد بیتهایی را که میتوان بهطور کارآمد در حافظه ذخیره کرد روی bits تنظیم کند. مقادیر معتبر bits شامل 128، 256 و 512 است.
- none
- هیچ محدودیت اضافی فراتر از آنچه توسط سکوی انتخابی تعریف شده به GCC اعمال نمیشود.
- 128
- ترجیح پهنای بردار ۱۲۸ بیتی برای دستورالعملها.
- 256
- ترجیح پهنای بردار ۲۵۶ بیتی برای دستورالعملها.
- 512
- ترجیح پهنای بردار ۵۱۲ بیتی برای دستورالعملها.
- -mnoreturn-no-callee-saved-registers
- این گزینه توابع دارای ویژگی "noreturn" یا مشخصکنندهٔ "_Noreturn" را از طریق ذخیره نکردن ثباتهای callee-saved استفادهشده در تابع در پیشدرآمد تابع (به جز ثبات "BP") بهینهسازی میکند. این گزینه میتواند در اشکالزدایی فراخوانندهٔ تابع "noreturn" یا هر تابعی بالاتر در پشتهٔ فراخوانی تداخل ایجاد کند، بنابراین بهطور پیشفرض فعال نیست.
- -mcx16
- این گزینه به GCC امکان میدهد تا دستورالعملهای "CMPXCHG16B" را در کد ۶۴ بیتی برای پیادهسازی عملیات مقایسه-و-تبادل (compare-and-exchange) روی اشیای ۱۲۸ بیتی ترازشده در ۱۶ بایت تولید کند. این برای بهروزرسانیهای اتمیک ساختارهای دادهای که اندازهٔ آنها از یک کلمهٔ ماشین بیشتر است مفید است. کامپایلر از این دستورالعمل برای پیادهسازی __sync Builtins استفاده میکند. با این حال، برای __atomic Builtins که روی اعداد صحیح ۱۲۸ بیتی عمل میکنند، همیشه از یک فراخوانی کتابخانهای استفاده میشود.
- -msahf
- این گزینه تولید دستورالعملهای "SAHF" را در کد ۶۴ بیتی فعال میکند. پردازندههای اولیهٔ Intel Pentium 4 با پشتیبانی از Intel 64، پیش از معرفی گام Pentium 4 G1 در دسامبر ۲۰۰۵، فاقد دستورالعملهای "LAHF" و "SAHF" بودند که توسط AMD64 پشتیبانی میشوند. اینها بهترتیب دستورالعملهای بارگذاری و ذخیرهسازی برای برخی پرچمهای وضعیت هستند. در حالت ۶۴ بیتی، دستورالعمل "SAHF" برای بهینهسازی توابع درونی "fmod"، "drem" و "remainder" استفاده میشود؛ برای جزئیات بیشتر Other Builtins را ببینید.
- -mmovbe
- این گزینه استفاده از دستورالعمل "movbe" را برای بهینهسازی تعویض بایت (byte swapping) موجودیتهای چهار و هشت بایتی فعال میکند.
- -mshstk
- گزینهٔ -mshstk توابع درونی پشتهٔ سایه (shadow stack) را از فناوری اعمال جریان کنترل (CET) در x86 فعال میکند.
- -mcrc32
- این گزینه به توابع درونی "__builtin_ia32_crc32qi"، "__builtin_ia32_crc32hi"، "__builtin_ia32_crc32si" و "__builtin_ia32_crc32di" امکان میدهد تا دستورالعمل ماشین "crc32" را تولید کنند.
- -mmwait
- این گزینه به توابع درونی "__builtin_ia32_monitor" و "__builtin_ia32_mwait" امکان میدهد تا دستورالعملهای ماشین "monitor" و "mwait" را تولید کنند.
- -mrecip
- این گزینه
استفاده از
دستورالعملهای
"RCPSS" و
"RSQRTSS" (و
انواع
برداریشدهٔ
آنها
"RCPPS" و
"RSQRTPS")
همراه با یک
گام اضافی
نیوتن-رافسون
(Newton-Raphson) را برای
افزایش
دقت، به جای
"DIVSS" و
"SQRTSS" (و
انواع
برداریشدهٔ
آنها) برای
آرگومانهای
ممیز شناور
با دقت
یگانه فعال
میکند. این
دستورالعملها
تنها زمانی
تولید
میشوند که
-funsafe-math-optimizations
همراه با
-ffinite-math-only و -fno-trapping-math
فعال باشد.
توجه داشته
باشید
اگرچه توان
عملیاتی
این توالی
بالاتر از
توان
عملیاتی
دستورالعمل
غیرمعکوس
است، اما
دقت توالی
میتواند
تا ۲ ulp کاهش
یابد (یعنی
معکوس ۱٫۰
برابر است
با
۰٫۹۹۹۹۹۹۹۴).
توجه داشته باشید که GCC عبارت "1.0f/sqrtf(x)" را با استفاده از "RSQRTSS" (یا "RSQRTPS") حتی تنها با -ffast-math (یا ترکیب گزینههای فوق) پیادهسازی میکند و نیازی به -mrecip ندارد.
همچنین توجه داشته باشید که GCC توالی فوق را همراه با گام اضافی نیوتن-رافسون برای تقسیم ممیز شناورِ یگانهٔ برداریشده و sqrtf(x) برداریشده حتی تنها با -ffast-math (یا ترکیب گزینههای فوق) صادر میکند و نیازی به -mrecip ندارد.
- -mrecip=opt
- این گزینه مشخص میکند که از کدام دستورالعملهای برآورد معکوس (reciprocal estimate) میتوان استفاده کرد. opt فهرستی جداشده با کاما از گزینههاست که میتواند برای معکوس کردن گزینه، با یک ! آغاز شود:
- all
- فعالسازی تمام دستورالعملهای برآورد.
- default
- فعالسازی دستورالعملهای پیشفرض، معادل -mrecip.
- none
- غیرفعالسازی تمام دستورالعملهای برآورد، معادل -mno-recip.
- div
- فعالسازی تقریب برای تقسیم اسکالر..IP vec-div 4 فعالسازی تقریب برای تقسیم برداریشده.
- sqrt
- فعالسازی تقریب برای ریشه دوم اسکالر.
- vec-sqrt
- فعالسازی تقریب برای ریشه دوم برداریشده.
بنابراین، برای مثال، -mrecip=all,!sqrt تمام تقریبهای معکوس را، به جز ریشه دوم، فعال میکند.
- -mveclibabi=type
- نوع ABI مورد
استفاده
برای
برداریسازی
توابع
درونی (intrinsics) با
استفاده از
یک
کتابخانه
خارجی را
مشخص
میکند.
مقادیر
پشتیبانیشده
برای type
عبارتند از
svml برای
کتابخانه
ریاضی
بردار
کوتاه Intel، aocl
برای
کتابخانه
ریاضی (LibM)
متعلق به AMD Optimizing
CPU Libraries (AOCL) و acml برای
کتابخانه
ریاضی پایه
منسوخشده
AMD (که AOCL-LibM
جانشین آن
است). برای
استفاده از
این گزینه،
باید هر دو
گزینه -ftree-vectorize و
-funsafe-math-optimizations فعال
باشند، و یک
کتابخانه
سازگار با ABI
مربوط به SVML
یا ACML در زمان
پیوند مشخص
شود.
در حال حاضر GCC فراخوانیهایی را به "vmldExp2"، "vmldLn2"، "vmldLog102"، "vmldPow2"، "vmldTanh2"، "vmldTan2"، "vmldAtan2"، "vmldAtanh2"، "vmldCbrt2"، "vmldSinh2"، "vmldSin2"، "vmldAsinh2"، "vmldAsin2"، "vmldCosh2"، "vmldCos2"، "vmldAcosh2"، "vmldAcos2"، "vmlsExp4"، "vmlsLn4"، "vmlsLog104"، "vmlsPow4"، "vmlsTanh4"، "vmlsTan4"، "vmlsAtan4"، "vmlsAtanh4"، "vmlsCbrt4"، "vmlsSinh4"، "vmlsSin4"، "vmlsAsinh4"، "vmlsAsin4"، "vmlsCosh4"، "vmlsCos4"، "vmlsAcosh4" و "vmlsAcos4" برای نوع تابع متناظر در هنگام استفاده از -mveclibabi=svml، و "amd_vrs4_acosf"، "amd_vrs16_acosf"، "amd_vrd8_asin"، "amd_vrs4_asinf"، "amd_vrs8_asinf"، "amd_vrs16_asinf"، "amd_vrd2_atan"، "amd_vrd8_atan"، "amd_vrs4_atanf"، "amd_vrs8_atanf"، "amd_vrs16_atanf"، "amd_vrd2_cos"، "amd_vrd4_cos"، "amd_vrd8_cos"، "amd_vrs4_cosf"، "amd_vrs8_cosf"، "amd_vrs16_cosf"، "amd_vrs4_coshf"، "amd_vrs8_coshf"، "amd_vrd2_erf"، "amd_vrd4_erf"، "amd_vrd8_erf"، "amd_vrs4_erff"، "amd_vrs8_erff"، "amd_vrs16_erff"، "amd_vrd2_exp"، "amd_vrd4_exp"، "amd_vrd8_exp"، "amd_vrs4_expf"، "amd_vrs8_expf"، "amd_vrs16_expf"، "amd_vrd2_exp10"، "amd_vrs4_exp10f"، "amd_vrd2_exp2"، "amd_vrd4_exp2"، "amd_vrd8_exp2"، "amd_vrs4_exp2f"، "amd_vrs8_exp2f"، "amd_vrs16_exp2f"، "amd_vrs4_expm1f"، "amd_vrd2_log"، "amd_vrd4_log"، "amd_vrd8_log"، "amd_vrs4_logf"، "amd_vrs8_logf"، "amd_vrs16_logf"، "amd_vrd2_log10"، "amd_vrs4_log10f"، "amd_vrs8_log10f"، "amd_vrs16_log10f"، "amd_vrd2_log1p"، "amd_vrs4_log1pf"، "amd_vrd2_log2"، "amd_vrd4_log2"، "amd_vrd8_log2"، "amd_vrs4_log2f"، "amd_vrs8_log2f"، "amd_vrs16_log2f"، "amd_vrd2_pow"، "amd_vrd4_pow"، "amd_vrd8_pow"، "amd_vrs4_powf"، "amd_vrs8_powf"، "amd_vrs16_powf"، "amd_vrd2_sin"، "amd_vrd4_sin"، "amd_vrd8_sin"، "amd_vrs4_sinf"، "amd_vrs8_sinf"، "amd_vrs16_sinf"، "amd_vrd2_tan"، "amd_vrd4_tan"، "amd_vrd8_tan"، "amd_vrs16_tanf"، "amd_vrs4_tanhf"، "amd_vrs8_tanhf"، "amd_vrs16_tanhf" برای نوع تابع متناظر در هنگام استفاده از -mveclibabi=aocl، و "__vrd2_sin"، "__vrd2_cos"، "__vrd2_exp"، "__vrd2_log"، "__vrd2_log2"، "__vrd2_log10"، "__vrs4_sinf"، "__vrs4_cosf"، "__vrs4_expf"، "__vrs4_logf"، "__vrs4_log2f"، "__vrs4_log10f" و "__vrs4_powf" را برای نوع تابع متناظر در هنگام استفاده از -mveclibabi=acml ارسال میکند.
- -mabi=name
- تولید کد برای قرارداد فراخوانی (calling convention) مشخصشده. مقادیر مجاز عبارتند از sysv برای ABI مورد استفاده در GNU/Linux و سایر سیستمها، و ms برای Microsoft ABI. پیشفرض در صورت هدف قرار دادن Microsoft Windows، استفاده از Microsoft ABI و در تمام سیستمهای دیگر SysV ABI است. شما میتوانید این رفتار را برای توابع خاص با استفاده از ویژگیهای تابع "ms_abi" و "sysv_abi" کنترل کنید.
- -masm=dialect
- خروجی دادن دستورالعملهای اسمبلی با استفاده از dialect (لهجه) انتخابی. همچنین بر اینکه کدام لهجه برای "asm" پایه و "asm" گسترشیافته استفاده شود اثر میگذارد. گزینههای پشتیبانیشده (به ترتیب لهجه) att یا intel هستند. پیشفرض att است. Darwin از intel پشتیبانی نمیکند.
- -mforce-indirect-call
- اجبار تمام فراخوانیهای توابع به غیرمستقیم بودن (indirect). این گزینه هنگام استفاده از Intel Processor Trace که اطلاعات زمانبندی دقیقتری را برای فراخوانیهای تابع تولید میکند، مفید است.
- -mmanual-endbr
- درج دستورالعمل ENDBR در مدخل تابع تنها از طریق ویژگی تابع "cf_check". این گزینه زمانی مفید است که همراه با گزینه -fcf-protection=branch برای کنترل درج ENDBR در مدخل تابع استفاده شود.
- -mcet-switch
- بهطور پیشفرض، سنجشگری CET در دستورات switch که از یک جدول پرش (jump table) استفاده میکنند خاموش است و ردیابی شاخه غیرمستقیم غیرفعال است. از آنجا که جدولهای پرش در حافظه فقطخواندنی ذخیره میشوند، این امر منجر به از دست رفتن مستقیم مقاومسازی نمیشود. اما اگر اندیس جدول پرش توسط مهاجم کنترل شود، پرش غیرمستقیم ممکن است توسط CET محدود نگردد. این گزینه سنجشگری CET را روشن میکند تا ردیابی شاخه غیرمستقیم را برای دستورات switch با جدولهای پرش فعال سازد، که باعث میشود مقاصد پرش از طریق هر پرش غیرمستقیمی قابل دسترسی باشند.
- -mcall-ms2sysv-xlogues
- به دلیل تفاوتهای موجود در ABIهای ۶۴-بیتی، هر تابع Microsoft ABI که تابعی از System V ABI را فراخوانی میکند، باید ثباتهای RSI، RDI و XMM6-15 را به عنوان مخدوششده (clobbered) در نظر بگیرد. بهطور پیشفرض، کد ذخیره و بازیابی این ثباتها به صورت درونخطی (inline) تولید میشود که منجر به مقدمهها (prologues) و موخرههای (epilogues) نسبتاً طولانی میگردد. استفاده از -mcall-ms2sysv-xlogues مقدمهها و موخرههایی تولید میکند که برای انجام این ذخیرهها و بازیابیها از stubها در بخش ایستان libgcc استفاده میکنند، و بدین ترتیب اندازه تابع را با هزینه چند دستورالعمل اضافه کاهش میدهد.
- -mtls-dialect=type
- تولید کد برای دسترسی به حافظه محلی نخ (thread-local storage) با استفاده از قراردادهای gnu یا gnu2. گزینه gnu پیشفرض محتاطانه است؛ gnu2 کارآمدتر است، اما ممکن است نیازمندیهای زمان کامپایل و زمان اجرایی را بیفزاید که در همه سیستمها قابل برآورده شدن نباشند.
- -mpush-args
- -mno-push-args
- استفاده از عملیات PUSH برای ذخیره پارامترهای خروجی. این روش کوتاهتر است و معمولاً سرعتی برابر با روش استفاده از عملیات SUB/MOV دارد و بهطور پیشفرض فعال است. در برخی موارد، غیرفعال کردن آن ممکن است به دلیل زمانبندی بهبودیافته و کاهش وابستگیها، کارایی را بهبود بخشد.
- -maccumulate-outgoing-args
- در صورت فعال بودن، حداکثر مقدار فضای مورد نیاز برای آرگومانهای خروجی در مقدمه تابع (prologue) محاسبه میشود. این کار در اکثر پردازندههای مدرن به دلیل کاهش وابستگیها، زمانبندی بهبودیافته و کاهش استفاده از پشته در شرایطی که مرز ترجیحی پشته برابر با ۲ نباشد سریعتر است. نکته منفی آن افزایش قابل توجه در اندازه کد است. این سوئیچ متضمن -mno-push-args است.
- -mms-bitfields
- -mno-ms-bitfields
- فعال/غیرفعال
کردن چینش
میدان بیتی
(bit-field layout) سازگار
با
کامپایلر
بومی Microsoft Windows.
اگر "packed" روی یک ساختار (structure) به کار رود، یا اگر از میدانهای بیتی استفاده شود، ممکن است Microsoft ABI ساختار را به گونهای متفاوت از شیوه معمول GCC سازماندهی کند. بهویژه هنگام انتقال دادههای فشردهشده (packed) میان توابع کامپایلشده با GCC و کامپایلر بومی مایکروسافت (خواه از طریق فراخوانی تابع یا به عنوان داده در یک فایل)، ممکن است دسترسی به هر دو قالب ضروری باشد.
این گزینه بهطور پیشفرض برای اهداف Microsoft Windows فعال است. این رفتار همچنین میتواند با استفاده از ویژگیهای متغیر یا نوع بهطور محلی کنترل شود. برای اطلاعات بیشتر، x86 Attributes را ببینید.
الگوریتم چینش ساختار مایکروسافت به استثنای بستهبندی میدانهای بیتی، نسبتاً ساده است. فاصلهگذاری (padding) و ترازسازی (alignment) اعضای ساختارها و اینکه آیا یک میدان بیتی میتواند از مرز یک واحد ذخیرهسازی عبور کند یا خیر، با این قوانین تعیین میشود:
- 1. اعضای ساختار به صورت متوالی و به ترتیبی که
- اعلان شدهاند ذخیره میشوند: اولین عضو دارای کمترین نشانی حافظه و آخرین عضو دارای بیشترین نشانی است.
- 2. هر شیء داده نیازمندی ترازسازی دارد. نیازمندی ترازسازی
- برای تمام
دادهها به
جز
ساختارها،
unionها و
آرایهها،
یا اندازه
شیء است یا
اندازه
بستهبندی
فعلی (که با
ویژگی
"aligned" یا
عملگر
کاربردی
"pack" مشخص
میشود)، هر
کدام که
کمتر باشد.
برای
ساختارها،
unionها و
آرایهها،
نیازمندی
ترازسازی،
بزرگترین
نیازمندی
ترازسازی
اعضای آن
است. به هر
شیء یک
انحراف (offset)
اختصاص
داده
میشود
بهطوری که:
offset % alignment_requirement == 0
- 3. میدانهای بیتی مجاور در یک واحد تخصیص ۱، ۲ یا ۴ بایتی بستهبندی
- میشوند اگر انواع صحیح دارای اندازه یکسانی باشند و میدان بیتی بعدی بدون عبور از مرز تحمیلشده توسط نیازمندیهای ترازسازی مشترک میدانهای بیتی، در واحد تخصیص فعلی جای گیرد.
کامپایلر MSVC میدانهای بیتی با طول صفر را به روشهای زیر تفسیر میکند:.IP "۱. اگر یک میدان بیتی با طول صفر بین دو میدان بیتی درج شود که" 4 بهطور معمول ادغام میشوند، آن میدانهای بیتی ادغام نخواهند شد.
برای مثال:
struct
{
unsigned long bf_1 : 12;
unsigned long : 0;
unsigned long bf_2 : 12;
} t1;
اندازهٔ "t1" با وجود میدان بیتی با طول صفر برابر با ۸ بایت است. اگر این میدان بیتی با طول صفر حذف شود، اندازهٔ "t1" برابر با ۴ بایت خواهد بود.
- ۲. اگر یک میدان بیتی با طول صفر پس از یک میدان بیتی، "foo"، درج شود و
- ترازبندی
میدان بیتی
با طول صفر
بزرگتر از
عضوی باشد
که پس از آن
میآید،
"bar"،
آنگاه
"bar"
مطابق با
نوع میدان
بیتی با طول
صفر تراز
میشود.
برای مثال:
struct { char foo : 4; short : 0; char bar; } t2; struct { char foo : 4; short : 0; double bar; } t3;برای "t2"، عضو "bar" به جای افست ۱، در افست ۲ قرار میگیرد. بر همین اساس، اندازهٔ "t2" برابر با ۴ است. برای "t3"، میدان بیتی با طول صفر بر ترازبندی "bar" یا در نتیجه بر اندازهٔ ساختار تأثیری نمیگذارد.
با در نظر گرفتن این موضوع، توجه به موارد زیر حائز اهمیت است:
- ۱. اگر یک میدان بیتی با طول صفر پس از یک میدان بیتی معمولی بیاید، نوعِ
- میدان بیتی با طول صفر ممکن است بر ترازبندی کل ساختار تأثیر بگذارد. برای مثال، اندازهٔ "t2" برابر با ۴ بایت است، زیرا میدان بیتی با طول صفر پس از یک میدان بیتی معمولی آمده و از نوع short است.
- ۲. حتی اگر پس از یک میدان بیتی با طول صفر یک میدان بیتی معمولی نیاید،
- همچنان
ممکن است بر
ترازبندی
ساختار
تأثیر
بگذارد:
struct { char foo : 6; long : 0; } t4;در اینجا، "t4" مقدار ۴ بایت فضا اشغال میکند.
- ۳. میدانهای بیتی با طول صفر پس از اعضای غیر میدان بیتی نادیده گرفته میشوند:
-
struct { char foo; long : 0; char bar; } t5;در اینجا، "t5" مقدار ۲ بایت فضا اشغال میکند.
- -mno-align-stringops
- مقصد عملیات درونخطیشدهٔ رشتهای را تراز نمیکند. این سوییچ اندازهٔ کد را کاهش داده و در صورتی که مقصد از پیش تراز شده باشد ولی GCC از آن مطلع نباشد، کارایی را بهبود میبخشد.
- -minline-all-stringops
- بهطور پیشفرض، GCC تنها زمانی عملیات رشتهای را درونخطی میکند که مشخص باشد مقصد حداقل روی یک مرز ۴ بایتی تراز شده است. این گزینه امکان درونخطیسازی بیشتری را فراهم کرده و اندازهٔ کد را افزایش میدهد، اما ممکن است کارایی کدهایی را که برای طولهای کوتاه به "memcpy" و "memset" سریع وابسته هستند، بهبود بخشد. این گزینه بسط درونخطی "strlen" را برای تمامی ترازبندیهای اشارهگر فعال میسازد.
- -minline-stringops-dynamically
- برای عملیات رشتهای با اندازهٔ نامشخص، از بررسیهای زمان اجرا به همراه کد درونخطی برای بلوکهای کوچک و فراخوانی کتابخانه برای بلوکهای بزرگ استفاده میکند.
- -mstringop-strategy=alg
- روش تصمیمگیری مکاشفهای داخلی را برای الگوریتم خاص مورد استفاده جهت درونخطیسازی عملیات رشتهای لغو و بازنویسی میکند. مقادیر مجاز برای alg عبارتند از:
- -mmemcpy-strategy=strategy
- روش تصمیمگیری مکاشفهای داخلی را جهت تعیین اینکه آیا "__builtin_memcpy" باید درونخطی شود یا خیر، و اینکه هنگام مشخص بودن اندازهٔ مورد انتظار عملیات رونوشت از چه الگوریتم درونخطی استفاده شود، بازنویسی میکند. strategy فهرستی از سهگانههای alg:max_size:dest_align است که با کاما از هم جدا شدهاند. alg در -mstringop-strategy مشخص میشود؛ max_size بیشینهٔ اندازه به بایت را مشخص میکند که الگوریتم درونخطی alg با آن مجاز است. برای آخرین سهگانه، مقدار max_size باید -1 باشد. مقدار max_size سهگانهها در فهرست باید با ترتیبی صعودی مشخص گردد. کمینهٔ اندازهٔ بایتی برای alg برای نخستین سهگانه 0 و برای سهگانههای بعدی برابر با "max_size + 1" از محدودهٔ پیشین است.
- -mmemset-strategy=strategy
- این گزینه مشابه -mmemcpy-strategy= است با این تفاوت که بسط "__builtin_memset" را کنترل میکند.
- -momit-leaf-frame-pointer
- اشارهگر چارچوب را در یک ثبات برای توابع برگ نگه نمیدارد. این کار از دستورالعملهای ذخیره، راهاندازی و بازیابی اشارهگرهای چارچوب جلوگیری کرده و یک ثبات اضافی را در توابع برگ در دسترس قرار میدهد. گزینهٔ -momit-leaf-frame-pointer اشارهگر چارچوب را برای توابع برگ حذف میکند، که ممکن است اشکالزدایی را دشوارتر سازد.
- -mtls-direct-seg-refs
- -mno-tls-direct-seg-refs
- کنترل
میکند که
آیا
متغیرهای TLS
ممکن است با
آفستهایی
از ثبات
قطعهٔ TLS (%gs
برای ۳۲
بیتی، %fs
برای ۶۴
بیتی) مورد
دسترسی
قرار گیرند
یا اینکه
اشارهگر
پایهٔ رشته
باید اضافه
شود. معتبر
بودن یا
نبودن این
رفتار به
سیستمعامل
و اینکه آیا
قطعه را به
گونهای
نگاشت
میکند که
کل ناحیهٔ TLS
را پوشش دهد
یا خیر،
بستگی دارد.
برای سیستمهایی که از کتابخانهٔ C گنو استفاده میکنند، حالت پیشفرض روشن است.
- -msse2avx
- -mno-sse2avx
- مشخص میکند که اسمبلر باید دستورالعملهای SSE را با پیشوند VEX کدگذاری کند. گزینهٔ -mavx این ویژگی را بهطور پیشفرض فعال میکند.
- -mfentry
- -mno-fentry
- اگر پروفایلسازی فعال باشد (-pg)، فراخوانی شمارندهٔ پروفایلسازی را پیش از پرولوگ قرار میدهد. نکته: در معماریهای x86، مشخصهٔ "ms_hook_prologue" در حال حاضر برای -mfentry و -pg امکانپذیر نیست.
- -mrecord-mcount
- -mno-record-mcount
- اگر پروفایلسازی فعال باشد (-pg)، بخشی ایجاد میکند که شامل اشارهگرهایی به هر فراخوانی پروفایلسازی است؛ این ویژگی برای وصله کردن خودکار فراخوانیها مفید است. میتوانید از گزینهٔ mfentry-section= برای تعیین نام این بخش استفاده کنید؛ مقدار پیشفرض آن __mcount_loc است.
- -mnop-mcount
- -mno-nop-mcount
- اگر پروفایلسازی فعال باشد (-pg)، فراخوانیهای توابع پروفایلسازی را به صورت NOP تولید میکند. این ویژگی زمانی مفید است که آنها بعداً باید بهطور پویا وصله شوند. این گزینه احتمالاً تنها همراه با -mrecord-mcount سودمند است.
- -minstrument-return=type
- همراه با -pg -mfentry، خروجهای تابع را بر اساس type ابزارگذاری میکند، که میتواند یکی از مقادیر none برای عدم ابزارگذاری، call برای ایجاد فراخوانی به "__return__"، یا nop5 برای تولید یک دنبالهٔ nop پنج بایتی باشد. این گزینه فقط بازگشتهای واقعی را که به یک "ret" ختم میشوند ابزارگذاری میکند، نه فراخوانیهای همسطح از طریق پرش.
- -mrecord-return
- -mno-record-return
- یک بخش "__return_loc" ایجاد میکند که به تمام کدهای ابزارگذاری بازگشت اشاره دارد.
- -mfentry-name=name
- نام نماد "__fentry__" فراخوانیشده در ورودی تابع را برای توابع -pg -mfentry تعیین میکند.
- -mfentry-section=name
- نام بخش مربوط به ثبت فراخوانیهای -mrecord-mcount را تعیین میکند. مقدار پیشفرض __mcount_loc است.
- -mskip-rax-setup
- -mno-skip-rax-setup
- هنگام تولید کد برای معماری x86-64 با غیرفعال بودن افزونههای SSE، میتوان از -mskip-rax-setup برای صرفنظر از تنظیم ثبات RAX در حالتی که هیچ آرگومان متغیری در ثباتهای برداری ارسال نشده است، استفاده کرد.
- -m8bit-idiv
- -mno-8bit-idiv
- در برخی پردازندهها، مانند Intel Atom، تقسیم اعداد صحیح بدون علامت ۸ بیتی بسیار سریعتر از تقسیم اعداد صحیح ۳۲ بیتی/۶۴ بیتی است. این گزینه یک بررسی در زمان اجرا ایجاد میکند. اگر هم مقسوم و هم مقسومعلیه در محدودهٔ ۰ تا ۲۵۵ باشند، به جای تقسیم اعداد صحیح ۳۲ بیتی/۶۴ بیتی، از تقسیم اعداد صحیح بدون علامت ۸ بیتی استفاده میشود.
- -mavx256-split-unaligned-load
- -mavx256-split-unaligned-store
- بارگذاری و ذخیرهسازی غیرتراز ۳۲ بایتی 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 خارجی را بهگونهای ساخت که بررسی جریان کنترل را فعال کند.
- -mfunction-return=choice
- بازگشت
تابع را با
choice تبدیل
میکند.
پیشفرض keep
است که
بازگشت
تابع را
دستنخورده
نگه
میدارد. thunk
بازگشت
تابع را به thunk
فراخوانی و
بازگشت
تبدیل
میکند. thunk-inline
بازگشت
تابع را به thunk
درونخطی
فراخوانی و
بازگشت
تبدیل
میکند. thunk-extern
بازگشت
تابع را به thunk
خارجی
فراخوانی و
بازگشت
ارائهشده
در یک فایل
شیء
جداگانه
تبدیل
میکند.
میتوانید
این رفتار
را برای یک
تابع خاص با
استفاده از
صفت تابع
"function_return"
کنترل کنید.
توجه داشته باشید که -mindirect-return=thunk-extern با -fcf-protection=branch سازگار است، زیرا میتوان thunk خارجی را برای فعالسازی بررسی جریان کنترل تنظیم کرد.
توجه داشته باشید که -mcmodel=large با -mfunction-return=thunk و -mfunction-return=thunk-extern ناسازگار است زیرا ممکن است تابع thunk در مدل کد بزرگ در دسترس نباشد.
- -mindirect-branch-register
- فراخوانی و پرش غیرمستقیم از طریق ثبات را اجباری میکند.
- -mharden-sls=choice
- کدی برای کاهش اثرات حدس و گمان خط مستقیم (SLS) با choice تولید میکند. پیشفرض none است که تمام مقاومسازیهای SLS را غیرفعال میکند. return مقاومسازی SLS را برای بازگشتهای تابع فعال میکند. indirect-jmp مقاومسازی SLS را برای پرشهای غیرمستقیم فعال میکند. all تمامی مقاومسازیهای SLS را فعال میکند.
- -mindirect-branch-cs-prefix
- پیشوند CS را به دستورات call و jmp به مقصد thunk غیرمستقیم با هدف شاخه در ثباتهای r8-r15 اضافه میکند تا طول دستورالعمل call و jmp برابر با ۶ بایت شود. این کار اجازه میدهد که آنها در زمان اجرا بتوانند به طور بالقوه با lfence; call *%r8-r15 یا lfence; jmp *%r8-r15 جایگزین شوند.
- -mapx-inline-asm-use-gpr32
- بهطور پیشفرض، استفاده از EGPR در قیدهای اسمبلی درونخطی غیرفعال است زیرا GCC نمیتواند مطلع شود که آیا دستورالعملهای اسمبلی از GP32 پشتیبانی میکنند یا خیر. اگر اسمبلی درونخطی شما میتواند EGPR را مدیریت کند، از -mapx-inline-asm-use-gpr32 استفاده کنید.
- -mgather
- -mscatter
- بهترتیب بردارسازی را برای دستورالعملهای gather و scatter فعال میکند.
این گزینههای -m علاوهبر موارد بالا، در پردازندههای x86-64 در محیطهای ۶۴ بیتی پشتیبانی میشوند.
- -m32
- -m64
- -mx32
- -m16
- تولید کد
برای یک
محیط ۱۶
بیتی، ۳۲
بیتی یا ۶۴
بیتی.
گزینهٔ -m32
انواع
دادهٔ
"int"،
"long" و
اشارهگرها
را ۳۲ بیتی
تعیین کرده
و کدی تولید
میکند که
در حالت ۳۲
بیتی اجرا
میشود.
گزینهٔ -m64 نوع "int" را ۳۲ بیتی و انواع "long" و اشارهگر را ۶۴ بیتی تعیین میکند و برای معماری x86-64 کد تولید مینماید. فقط در Darwin، گزینهٔ -m64 همچنین گزینههای -fno-pic و -mdynamic-no-pic را غیرفعال میکند.
گزینهٔ -mx32 انواع دادهٔ "int"، "long" و اشارهگر را روی ۳۲ بیت تنظیم میکند و برای معماری x86-64 کد تولید مینماید.
گزینهٔ -m16 مشابه -m32 است، با این تفاوت که در ابتدای خروجی اسمبلی دستورالعمل اسمبلی ".code16gcc" را درج میکند تا فایل باینری بتواند در حالت ۱۶ بیتی اجرا شود.
- -miamcu
- گزینهٔ -miamcu کدی سازگار با Intel MCU psABI تولید میکند. این گزینه نیازمند فعال بودن گزینهٔ -m32 است.
- -mno-red-zone
- از بهاصطلاح «red zone» برای کدهای x86-64 استفاده نمیکند. red zone توسط ABI مربوط به x86-64 الزامی شده است؛ ناحیهای ۱۲۸ بایتی فراتر از موقعیت اشارهگر پشته (stack pointer) است که توسط روتینهای مدیریت سیگنال یا وقفه تغییر نمیکند و بنابراین میتواند بدون تنظیم اشارهگر پشته برای دادههای موقت استفاده شود. پرچم -mno-red-zone این red zone را غیرفعال میکند.
- -mcmodel=small
- تولید کد برای مدل کد کوچک (small code model): برنامه و نمادهای آن باید در ۲ گیگابایت پایینی فضای آدرس پیوند (link) داده شوند. اشارهگرها ۶۴ بیتی هستند. برنامهها میتوانند بهصورت ایستا یا پویا پیوند داده شوند. این مدل، مدل کد پیشفرض است.
- -mcmodel=kernel
- تولید کد برای مدل کد هسته (kernel code model). هسته در ۲ گیگابایت منفی از فضای آدرس اجرا میشود. این مدل باید برای کدهای هستهٔ Linux استفاده شود.
- -mcmodel=medium
- تولید کد برای مدل متوسط (medium model): برنامه در ۲ گیگابایت پایینی فضای آدرس پیوند داده میشود. نمادهای کوچک نیز در آنجا قرار میگیرند. نمادهایی با اندازههای بزرگتر از -mlarge-data-threshold در بخشهای دادهٔ بزرگ (large data) یا 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
- -mno-unroll-only-small-loops
- باز کردن محافظهکارانهٔ حلقههای کوچک (loop unrolling) را کنترل میکند. این گزینه بهطور پیشفرض با -O2 فعال است و حلقههای دارای کمتر از ۴ دستورالعمل را ۱ بار باز میکند. این کار بهرهوری بهتری از خط لولهٔ رمزگشایی دستورالعملها در پردازندههای امروزی فراهم میکند. میتوانید این قابلیت را با -mno-unroll-only-small-loops غیرفعال کنید، و همچنین در صورتی که گزینههای کلیتر -funroll-loops یا -funroll-all-loops فعال باشند یا صراحتاً غیرفعال شده باشند نیز غیرفعال میشود.
- -mdispatch-scheduler
- فعالسازی زمانبندی دستورالعملها. این مورد تنها در پردازندههای bdver1، bdver2، bdver3، bdver4 و znver1 پشتیبانی میشود و علاوه بر آن نیازمند -fschedule-insns -fsched-pressure است.
- -mlam=choice
- قابلیت LAM (ماسکگذاری آدرس خطی یا linear-address masking) امکان استفاده از بیتهای خاصی در اشارهگر را برای فراداده فراهم میسازد. مقدار پیشفرض none است. با u48، بیتهای اشارهگر در موقعیتهای 62:48 میتوانند برای فراداده استفاده شوند؛ با u57، بیتهای اشارهگر در موقعیتهای 62:57 میتوانند برای فراداده استفاده شوند.
گزینههای x86 Windows
گزینههای Xstormy16
این گزینهها برای Xstormy16 تعریف شدهاند:
- -msim
- انتخاب فایلهای راهاندازی (startup) و اسکریپت پیونددهندهٔ مناسب برای شبیهساز.
گزینههای Xtensa
این گزینهها برای مقصدهای Xtensa پشتیبانی میشوند:
- -mconst16
- -mno-const16
- فعال یا غیرفعال کردن استفاده از دستورالعملهای "CONST16" برای بارگذاری مقادیر ثابت. در صورت فعال بودن، دستورالعملهای "CONST16" همواره بهجای دستورالعملهای استاندارد "L32R" استفاده میشوند. استفاده از "CONST16" تنها زمانی بهطور پیشفرض فعال است که دستورالعمل "L32R" در دسترس نباشد.
- -mserialize-volatile
- -mno-serialize-volatile
- هنگامی که این گزینه فعال باشد، GCC دستورالعملهای "MEMW" را پیش از ارجاعات حافظهٔ "volatile" درج میکند تا سازگاری ترتیبی (sequential consistency) تضمین شود. پیشفرض -mserialize-volatile است. از -mno-serialize-volatile برای حذف دستورالعملهای "MEMW" استفاده کنید.
- -mforce-no-pic
- -mno-force-no-pic
- برای مقاصدی مانند GNU/Linux، که در آنها تمام کدهای حالت کاربر (user-mode) در Xtensa باید کد مستقل از موقعیت (PIC) باشند، این گزینه PIC را برای کامپایل کد هسته غیرفعال میکند.
- -mtext-section-literals
- -mno-text-section-literals
- این گزینهها مدیریت استخرهای مقادیر صریح (literal pools) را کنترل میکنند. حالت پیشفرض -mno-text-section-literals است که مقادیر صریح را در یک بخش مجزا در فایل خروجی قرار میدهد. این امر اجازه میدهد استخر مقادیر صریح در یک RAM/ROM داده قرار گیرد و همچنین به پیونددهنده امکان میدهد استخرهای مقادیر صریح را از فایلهای شیء مجزا ترکیب کند تا مقادیر تکراری حذف شده و اندازهٔ کد بهینه شود. با -mtext-section-literals، مقادیر صریح درون بخش متن پراکنده میشوند تا در نزدیکترین فاصلهٔ ممکن به ارجاعات خود قرار گیرند. این ممکن است برای فایلهای اسمبلی بزرگ ضروری باشد. مقادیر صریح برای هر تابع دقیقاً پیش از همان تابع قرار میگیرند.
- -mauto-litpools
- -mno-auto-litpools
- این گزینهها نحوهٔ مدیریت استخرهای مقادیر صریح را کنترل میکنند. حالت پیشفرض -mno-auto-litpools است که مقادیر صریح را در یک بخش مجزا در فایل خروجی قرار میدهد مگر اینکه از -mtext-section-literals استفاده شده باشد. با -mauto-litpools مقادیر صریح توسط اسمبلر در بخش متن پراکنده میشوند. کامپایلر دستورالعملهای صریح ".literal" را تولید نکرده و مقادیر صریح را با دستورالعملهای "MOVI" بهجای "L32R" درون ثباتها بارگذاری میکند تا به اسمبلر اجازه دهد عملیات ریلکسیشن (relaxation) را انجام داده و مقادیر صریح را بر حسب نیاز جایگذاری کند. این گزینه به اسمبلر اجازه میدهد چندین استخر مقادیر صریح به ازای هر تابع ایجاد کرده و توابع بسیار بزرگ را اسمبل نماید؛ امری که ممکن است با -mtext-section-literals مقدور نباشد..IP -mtarget-align 4
- -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" ممکن است به عنوان اشارهگر فریم (frame pointer) استفاده شود. هنگامی که این نسخه از ABI فعال باشد، نماد پیشپردازنده C یعنی "__XTENSA_CALL0_ABI__" تعریف میشود.
- -mabi=windowed
- هنگامی که این گزینه فعال باشد، پارامترهای تابع در ثباتهای "a10" تا "a15" منتقل میشوند و تابع فراخواندهشده در هنگام ورود، پنجره ثباتها را به اندازه ۸ ثبات میچرخاند تا آرگومانهای آن در ثباتهای "a2" تا "a7" قرار گیرند. از ثبات "a7" ممکن است به عنوان اشارهگر فریم استفاده شود. پنجره ثباتها هنگام بازگشت، ۸ ثبات به عقب بازگردانده میشود. هنگامی که این نسخه از ABI فعال باشد، نماد پیشپردازنده C یعنی "__XTENSA_WINDOWED_ABI__" تعریف میشود.
- -mextra-l32r-costs=n
- مشخص کردن هزینه اضافی دسترسی RAM/ROM دستورالعمل برای دستورالعملهای "L32R"، بر حسب چرخههای ساعت (clock cycles). این مورد هنگام بهینهسازی برای سرعت، بر این موضوع تأثیر میگذارد که آیا یک مقدار ثابت از استخر لیترال با استفاده از "L32R" بارگیری شود یا اینکه مقدار ثابت از یک مقدار کوچک با چند دستورالعمل حسابی ترکیب و ساخته شود. مقدار پیشفرض 0 است.
- -mstrict-align
- -mno-strict-align
- اجتناب یا اجازه دادن به تولید دسترسیهای حافظهای که ممکن است بر روی مرز طبیعی شیء همانطور که در مشخصات معماری شرح داده شده است، تراز نشده باشند. مقدار پیشفرض برای هستههایی که از هر دو بارگیری و ذخیرهسازی ناتراز در سختافزار پشتیبانی میکنند -mno-strict-align و برای سایر هستهها -mstrict-align است.
گزینههای zSeries
این موارد در ادامه فهرست شدهاند
محیط (ENVIRONMENT)
این بخش چندین متغیر محیطی را شرح میدهد که بر نحوه عملکرد GCC تأثیر میگذارند. برخی از آنها با تعیین دایرکتوریها یا پیشوندهایی که هنگام جستجو برای انواع فایلها به کار میروند، عمل میکنند. برخی دیگر برای مشخص کردن سایر جنبههای محیط کامپایل استفاده میشوند.
توجه داشته باشید که همچنین میتوانید مکانهای جستجو را با استفاده از گزینههایی مانند -B، -I و -L مشخص کنید. این گزینهها بر مکانهای تعیینشده توسط متغیرهای محیطی اولویت دارند، و آنها نیز به نوبه خود بر مکانهای تعیینشده توسط پیکربندی GCC اولویت دارند.
- LANG
- LC_CTYPE
- LC_MESSAGES
- LC_ALL
- این
متغیرهای
محیطی نحوه
استفاده GCC
از اطلاعات
بومیسازی
را کنترل
میکنند؛
اطلاعاتی
که به GCC
اجازه
میدهد با
قراردادهای
ملی مختلف
برای
خروجیهای
تشخیصی و
اطلاعاتی
کار کند. GCC
دستههای
محلی (locale categories) LC_CTYPE
و LC_MESSAGES را در
صورتی که
برای این
کار
پیکربندی
شده باشد،
بررسی
میکند. این
دستههای
محلی را
میتوان
روی هر
مقداری که
توسط سیستم
شما
پشتیبانی
میشود
تنظیم کرد.
یک مقدار
معمول برای
زبان
انگلیسی
بریتانیا
با کدگذاری
UTF-8، مقدار en_GB.UTF-8
است.
اگر متغیر محیطی LC_ALL تنظیم شده باشد، مقدار LC_CTYPE و LC_MESSAGES را نادیده میگیرد و جایگزین آنها میشود؛ در غیر این صورت، LC_CTYPE و LC_MESSAGES به طور پیشفرض از مقدار متغیر محیطی LANG استفاده میکنند. اگر هیچیک از این متغیرها تنظیم نشده باشند، GCC به رفتار سنتی C انگلیسی بازمیگردد.
این متغیرهای محیطی بر کدگذاری فایلهای ورودی و رشتهها در فایلهای خروجیِ تولیدشده توسط GCC تأثیری ندارند؛ این موارد به ترتیب توسط گزینههای -finput-charset و -fexec-charset کنترل میشوند.
- TMPDIR
- اگر TMPDIR تنظیم شده باشد، دایرکتوری مورد استفاده برای فایلهای موقت را مشخص میکند. GCC از فایلهای موقت برای نگهداری خروجی یک مرحله از کامپایل که قرار است به عنوان ورودی مرحله بعد استفاده شود، بهره میبرد: برای مثال، خروجی پیشپردازنده که ورودی خودِ کامپایلر است.
- GCC_DIAGNOSTICS_LOG
- اگر GCC_DIAGNOSTICS_LOG
تنظیم شده
باشد،
اطلاعات
بیشتری در
مورد
زیرسیستم
عیبیابی
منتشر
خواهد شد.
اگر مقدار
آن خالی
تنظیم شده
باشد،
اطلاعات در
stderr نوشته
خواهد شد؛
در غیر این
صورت، GCC
تلاش
میکند آن
فایل را باز
کرده و
اطلاعات را
در آن
بنویسد.
محتوا و قالب دقیق اطلاعات ممکن است تغییر کند؛ این اطلاعات به جای کاربران نهایی، برای استفاده توسعهدهندگان GCC در نظر گرفته شده است.
- GCC_COMPARE_DEBUG
- تنظیم GCC_COMPARE_DEBUG تقریباً معادل ارسال -fcompare-debug به راهانداز کامپایلر است. برای جزئیات بیشتر به مستندات این گزینه مراجعه کنید.
- GCC_EXEC_PREFIX
- اگر GCC_EXEC_PREFIX
تنظیم شده
باشد،
پیشوندی را
برای
استفاده در
نام
زیربرنامههای
اجراشده
توسط
کامپایلر
مشخص
میکند.
هنگام
الحاق این
پیشوند به
نام یک
زیربرنامه
هیچ اسلشی
اضافه
نمیشود،
اما در صورت
تمایل
میتوانید
پیشوندی را
تعیین کنید
که با یک
اسلش ختم
شود.
اگر GCC_EXEC_PREFIX تنظیم نشده باشد، GCC تلاش میکند تا بر اساس نام مسیری که با آن فراخوانی شده است، پیشوند مناسبی را برای استفاده تعیین کند.
اگر GCC نتواند زیربرنامه را با استفاده از پیشوند مشخصشده بیابد، مکانهای معمول را برای یافتن زیربرنامه جستجو میکند.
مقدار پیشفرض GCC_EXEC_PREFIX برابر است با prefix/lib/gcc/ که در آن prefix پیشوندِ کامپایلر نصبشده است. در بسیاری از موارد، prefix همان مقدار "prefix" در زمان اجرای اسکریپت configure است.
سایر پیشوندهای مشخصشده با -B بر این پیشوند اولویت دارند.
این پیشوند همچنین برای یافتن فایلهایی مانند crt0.o که برای پیوند دادن (linking) استفاده میشوند، به کار میرود.
علاوه بر این، از این پیشوند به شیوهای غیرمعمول در یافتن دایرکتوریهای جستجوی فایلهای سرآیند استفاده میشود. به ازای هر یک از دایرکتوریهای استانداردی که نام آنها به طور معمول با /usr/local/lib/gcc آغاز میشود (به طور دقیقتر، با مقدار GCC_INCLUDE_DIR)، GCC تلاش میکند تا آن بخش آغازین را با پیشوند مشخصشده جایگزین کند تا نام دایرکتوری جایگزینی تولید شود. بنابراین، با -Bfoo/، کامپایلر GCC دایرکتوری foo/bar را درست قبل از جستجوی دایرکتوری استاندارد /usr/local/lib/bar جستجو میکند. اگر یک دایرکتوری استاندارد با prefix پیکربندیشده آغاز شود، هنگام جستجوی فایلهای سرآیند، مقدار prefix با GCC_EXEC_PREFIX جایگزین میشود.
- COMPILER_PATH
- مقدار COMPILER_PATH فهرستی از دایرکتوریها است که با دونقطه (:) از هم جدا شدهاند، بسیار شبیه به PATH. در صورتی که GCC نتواند زیربرنامهها را با استفاده از GCC_EXEC_PREFIX پیدا کند، دایرکتوریهای مشخصشده را برای جستجوی زیربرنامهها بررسی میکند.
- LIBRARY_PATH
- مقدار LIBRARY_PATH فهرستی از دایرکتوریها است که با دونقطه از هم جدا شدهاند، بسیار شبیه به PATH. هنگامی که کامپایلر به صورت محلی (native) پیکربندی شده باشد، اگر نتواند فایلهای ویژه پیونددهنده را با استفاده از GCC_EXEC_PREFIX پیدا کند، دایرکتوریهای مشخصشده را جستجو میکند. همچنین عملیات پیوند دادن با استفاده از GCC، هنگام جستجوی کتابخانههای معمولی برای گزینه -l از این دایرکتوریها استفاده میکند (اما دایرکتوریهای مشخصشده با -L اولویت دارند)..IP GCC_EXTRA_DIAGNOSTIC_OUTPUT 4 اگر GCC_EXTRA_DIAGNOSTIC_OUTPUT روی یکی از مقدارهای زیر تنظیم شده باشد، هنگام صدور راهنماییهای تصحیح (fix-it hints)، متن اضافی در stderr چاپ خواهد شد. گزینههای -fdiagnostics-parseable-fixits و -fno-diagnostics-parseable-fixits نسبت به این متغیر محیطی اولویت دارند.
- fixits-v1
- صدور راهنماییهای تصحیح قابل تجزیه، معادل با -fdiagnostics-parseable-fixits. بهویژه، ستونها به صورت تعداد بایتها بیان میشوند که از بایت ۱ برای ستون اولیه آغاز میشود.
- fixits-v2
- همانند "fixits-v1"، اما ستونها همانطور که با -fdiagnostics-column-unit=display مشخص میشود، به صورت ستونهای نمایشی بیان میگردند.
- EXPERIMENTAL_SARIF_SOCKET
- اگر EXPERIMENTAL_SARIF_SOCKET در
محیط تنظیم
شده باشد،
کامپایلر
تلاش خواهد
کرد به یک
سوکت
جریانی
دامنهٔ
یونیکس (UNIX domain stream
socket) با آن نام
متصل شود و
به ازای هر
پیام
تشخیصی که
رخ میدهد،
یک اعلان JSON-RPC 2.0
از نوع
"OnSarifResult" به
آن ارسال
کند، که در
آن مقدار
اعلان یک
شیء "result"
در قالب SARIF
است.
اگر EXPERIMENTAL_SARIF_SOCKET تنظیم شده باشد و کامپایلر نتواند به آن متصل شود، بیدرنگ با خطا مواجه خواهد شد.
این ویژگی آزمایشی است و ممکن است بدون اطلاع قبلی تغییر کند یا حذف شود.
برخی متغیرهای محیطی دیگر نیز بر رفتار پیشپردازنده تأثیر میگذارند.
- CPATH
- C_INCLUDE_PATH
- CPLUS_INCLUDE_PATH
- OBJC_INCLUDE_PATH
- مقدار هر
متغیر
فهرستی از
دایرکتوریها
است که با
یک نویسهٔ
ویژه از
یکدیگر جدا
شدهاند
(بسیار شبیه
به PATH) و
کامپایلر
در آنها به
دنبال
فایلهای
سرایند
میگردد.
نویسهٔ
ویژه، یعنی
"PATH_SEPARATOR"،
وابسته به
معماری هدف
بوده و در
زمان ساخت GCC
تعیین
میشود.
برای
سیستمهای
مبتنی بر Microsoft
Windows این نویسه
نقطه-ویرگول
و برای
تقریباً
تمامی
سیستمهای
هدف دیگر
دونقطه است.
متغیر محیطی CPATH فهرستی از دایرکتوریها را مشخص میکند که گویی با گزینهٔ -I تعیین شدهاند، با این تفاوت که پس از هر مسیر دادهشده با گزینههای -I در خط فرمان جستجو میشوند. این متغیر محیطی صرفنظر از اینکه چه زبانی در حال پیشپردازش است، به کار میرود.
بقیهٔ متغیرهای محیطی تنها هنگام پیشپردازش زبان مشخصشده اعمال میشوند. هر یک فهرستی از دایرکتوریها را برای جستجو مشخص میکنند که گویی با -isystem تعیین شدهاند، اما پس از هر مسیری که با گزینههای -isystem در خط فرمان مشخص شده باشد جستجو خواهند شد.
در تمام این متغیرها، یک عضو خالی به کامپایلر دستور میدهد تا دایرکتوری کاری فعلی خود را جستجو کند. اعضای خالی میتوانند در ابتدا یا انتهای یک مسیر ظاهر شوند. برای نمونه، اگر مقدار CPATH برابر با ":/special/include" باشد، اثری مشابه با -I. -I/special/include خواهد داشت.
- DEPENDENCIES_OUTPUT
- اگر این
متغیر
تنظیم شده
باشد،
مقدار آن
نحوهٔ صدور
وابستگیها
را برای Make بر
اساس
فایلهای
سرایند
غیرسیستمیِ
پردازششده
توسط
کامپایلر
مشخص
میکند.
فایلهای
سرایند
سیستمی در
خروجی
وابستگیها
نادیده
گرفته
میشوند.
مقدار DEPENDENCIES_OUTPUT میتواند صرفاً یک نام فایل باشد، که در این حالت قواعد Make در آن فایل نوشته شده و نام هدف از روی نام فایل منبع حدس زده میشود. همچنین مقدار میتواند به قالب file target باشد که در این صورت قواعد با استفاده از target به عنوان نام هدف، در فایل file نوشته میشوند.
به عبارت دیگر، این متغیر محیطی معادل با ترکیب گزینههای -MM و -MF، به همراه گزینهٔ اختیاری -MT است.
- SUNPRO_DEPENDENCIES
- این متغیر مشابه DEPENDENCIES_OUTPUT است (به بالا مراجعه کنید)، با این تفاوت که فایلهای سرایند سیستمی نادیده گرفته نمیشوند، بنابراین به جای -MM بر -M دلالت دارد. با این حال، وابستگی به فایل ورودی اصلی نادیده گرفته میشود.
- SOURCE_DATE_EPOCH
- اگر این
متغیر
تنظیم شده
باشد،
مقدار آن یک
برچسب
زمانی
یونیکس (UNIX timestamp)
را مشخص
میکند تا
به جای
تاریخ و
زمان فعلی
در
ماکروهای
"__DATE__" و
"__TIME__"
استفاده
شود، به
گونهای که
برچسبهای
زمانی
جاسازیشده
بازتولیدپذیر
شوند.
مقدار SOURCE_DATE_EPOCH باید یک برچسب زمانی یونیکس باشد که به صورت تعداد ثانیهها (بدون احتساب ثانیههای کبیسه) از تاریخ 01 Jan 1970 00:00:00 در قالب ASCII نشان داده میشود؛ دقیقاً یکسان با خروجی دستور "date +%s" در گنو/لینوکس و سایر سیستمهایی که از پسوند %s در دستور "date" پشتیبانی میکنند.
این مقدار باید یک برچسب زمانی مشخص مانند زمان آخرین تغییر کد منبع یا بسته باشد و باید توسط فرآیند ساخت تنظیم شود..SH "گزارش باگها (BUGS)" برای دریافت دستورالعملهای مربوط به گزارش باگها، ببینید: https://gcc.gnu.org/bugs.
پانویسها (FOOTNOTES)
- 1.
- در برخی سیستمها، gcc -shared برای کارکرد سازندهها نیازمند ساخت کد تکمیلی stub است. در سیستمهای چندکتابخانهای (multi-libbed)، gcc -shared باید کتابخانههای پشتیبان صحیح را برای پیوند انتخاب کند. عدم تعیین گزینههای صحیح ممکن است منجر به ایرادهای نامحسوس شود. تعیین آنها در مواردی که ضروری نیستند بیضرر است. گزینه -shared مانع از افزودن کد راهاندازی (startup code) برای تغییر محیط ممیز شناور میشود؛ کاری که در برخی از مقصدها با -ffast-math، -Ofast یا -funsafe-math-optimizations انجام میگیرد.
همچنین ببینید (SEE ALSO)
gpl(7)، gfdl(7)، fsf-funding(7)، cpp(1)، gcov(1)، as(1)، ld(1)، gdb(1) و مدخلهای Info برای gcc، cpp، as، ld، binutils و gdb.
نویسندگان (AUTHORS)
برای مشاهده مشارکتکنندگان در GCC، به مدخل Info برای gcc یا https://gcc.gnu.org/onlinedocs/gcc/Contributors.html مراجعه کنید.
کپیرایت و تکثیر (COPYRIGHT)
کپیرایت (c) 1988-2026 متعلق به بنیاد نرمافزار آزاد (.Free Software Foundation, Inc) است.
اجازه کپی، توزیع و/یا تغییر این سند تحت شرایط مجوز مستندات آزاد گنو (GNU Free Documentation License)، نسخه 1.3 یا هر نسخه بعدی منتشرشده توسط بنیاد نرمافزارهای آزاد داده میشود؛ بدون بخشهای ناپیوسته، با بخشهای تغییرناپذیر «GNU General Public License» و «Funding Free Software»، به همراه متنهای روی جلد (a) (پایین را ببینید) و با متنهای پشت جلد (b) (پایین را ببینید). یک رونوشت از این مجوز در صفحه راهنمای gfdl(7) گنجانده شده است.
(a) متن روی جلد FSF عبارت است از:
A GNU Manual
(b) متن پشت جلد FSF عبارت است از:
You have freedom to copy and modify this GNU Manual, like GNU software. Copies published by the Free Software Foundation raise funds for GNU development.
| 2026-08-07 | gcc-16.2.0 |