CLANG(1) Clang CLANG(1)

clang - کامپایلر زبان‌های C، C++ و Objective-C

clang [گزینه‌ها] نام_فایل ...

clang یک کامپایلر برای زبان‌های C، C++ و Objective-C است که مراحل پیش‌پردازش، تجزیه (parsing)، بهینه‌سازی، تولید کد، اسمبلی و پیوند (linking) را در بر می‌گیرد. بسته به اینکه کدام حالت سطح‌بالا تعیین شده باشد، Clang پیش از اجرای یک پیوند کامل متوقف خواهد شد. اگرچه Clang به صورت بسیار یکپارچه طراحی شده است، اما برای درک نحوه فراخوانی آن، شناخت مراحل کامپایل اهمیت دارد. این مراحل عبارتند از:

راه‌انداز (Driver)
فایل اجرایی clang در واقع یک راه‌انداز کوچک است که اجرای کلی سایر ابزارها مانند کامپایلر، اسمبلر و پیونددهنده را کنترل می‌کند. به طور معمول نیازی به تعامل مستقیم با این راه‌انداز ندارید، بلکه برای اجرای سایر ابزارها به صورت شفاف از آن استفاده می‌کنید.
پیش‌پردازش (Preprocessing)
این مرحله نشانه‌گذاری (tokenization) فایل منبع ورودی، بسط ماکروها، بسط #include و مدیریت سایر دستورات پیش‌پردازنده را بر عهده دارد. خروجی این مرحله معمولاً فایلی با پسوند ".i" (برای C)، ".ii" (برای C++)، ".mi" (برای Objective-C) یا ".mii" (برای Objective-C++) نامیده می‌شود.
تجزیه و تحلیل معنایی (Parsing and Semantic Analysis)
این مرحله فایل ورودی را تجزیه کرده و نشانه‌های پیش‌پردازنده را به یک درخت تجزیه تبدیل می‌کند. پس از تبدیل به شکل درخت تجزیه، تحلیل معنایی را برای محاسبه انواع داده در عبارت‌ها و همچنین تعیین خوش‌ساخت بودن کد اعمال می‌نماید. این مرحله مسئول ایجاد اکثر هشدارهای کامپایلر و همچنین خطاهای تجزیه است. خروجی این مرحله یک «درخت نحو انتزاعی» ("Abstract Syntax Tree" یا AST) است.
تولید و بهینه‌سازی کد (Code Generation and Optimization)
این مرحله AST را به کد واسط سطح‌پایین (معروف به "LLVM IR") و در نهایت به کد ماشین ترجمه می‌کند. این فاز مسئول بهینه‌سازی کد تولیدشده و مدیریت تولید کد مختص معماری مقصد است. خروجی این مرحله معمولاً یک فایل ".s" یا فایل "assembly" نامیده می‌شود.

همچنین Clang از یک اسمبلر یکپارچه پشتیبانی می‌کند که در آن تولیدکننده کد مستقیماً فایل‌های شیء را تولید می‌کند. این امر از سربار تولید فایل ".s" و فراخوانی اسمبلر مقصد جلوگیری می‌نماید.

اسمبلر (Assembler)
این مرحله اسمبلر مقصد را اجرا می‌کند تا خروجی کامپایلر را به یک فایل شیء مقصد تبدیل کند. خروجی این مرحله معمولاً یک فایل ".o" یا فایل "object" نامیده می‌شود.
پیونددهنده (Linker)
این مرحله پیونددهنده مقصد را اجرا می‌کند تا چندین فایل شیء را در یک فایل اجرایی یا کتابخانه پویا ادغام نماید. خروجی این مرحله معمولاً یک فایل "a.out"، ".dylib" یا ".so" نامیده می‌شود.

تحلیل‌گر ایستای Clang (Clang Static Analyzer)

تحلیل‌گر ایستای Clang ابزاری است که کد منبع را به منظور یافتن اشکالات (باگ‌ها) از طریق تحلیل کد پویش می‌کند. این ابزار از بخش‌های متعددی از Clang استفاده می‌کند و درون همان راه‌انداز تعبیه شده است. لطفاً برای جزئیات بیشتر در مورد نحوه استفاده از این ابزار به https://clang-analyzer.llvm.org مراجعه کنید.

اجرای مرحله پیش‌پردازش.
اجرای مراحل پیش‌پردازش، تجزیه‌کننده و تحلیل معنایی.
اجرای مراحل پیشین به‌همراه مراحل تولید و بهینه‌سازی LLVM و تولید کد مختص مقصد، که منجر به تولید یک فایل اسمبلی می‌شود.
اجرای تمام مراحل فوق، به اضافه اسمبلر، جهت تولید فایل شیء مقصد ".o".
بدون گزینه انتخاب مرحله (no stage selection option)
در صورتی که هیچ گزینه‌ای برای انتخاب مرحله تعیین نشود، تمام مراحل بالا اجرا شده و سپس پیونددهنده برای ترکیب نتایج در یک فایل اجرایی یا کتابخانه اشتراکی فراخوانی می‌شود.
فایل‌های ورودی بعدی را از نوع language در نظر می‌گیرد.
استاندارد زبانی را که باید برای آن کامپایل شود مشخص می‌کند.

مقادیر پشتیبانی‌شده برای زبان C عبارت‌اند از:

c89
c90
iso9899:1990
ISO C 1990
iso9899:199409
ISO C 1990 به‌همراه اصلاحیه ۱
gnu89
gnu90
ISO C 1990 به‌همراه افزونه‌های GNU
c99
iso9899:1999
ISO C 1999
gnu99
ISO C 1999 به‌همراه افزونه‌های GNU
c11
iso9899:2011
ISO C 2011
gnu11
ISO C 2011 به‌همراه افزونه‌های GNU
c17
iso9899:2017
ISO C 2017
gnu17
ISO C 2017 به‌همراه افزونه‌های GNU
c23
iso9899:2024
ISO C 2023
gnu23
ISO C 2023 به‌همراه افزونه‌های GNU
c2y
ISO C 202y
gnu2y
ISO C 202y به‌همراه افزونه‌های GNU

استاندارد پیش‌فرض زبان C مقدار gnu17 است، به‌جز در PS4 که gnu99 است.

مقادیر پشتیبانی‌شده برای زبان C++ عبارت‌اند از:

c++98
c++03
ISO C++ 1998 به‌همراه اصلاحیه‌ها
gnu++98
gnu++03
ISO C++ 1998 به‌همراه اصلاحیه‌ها و افزونه‌های GNU
c++11
ISO C++ 2011 به‌همراه اصلاحیه‌ها
gnu++11
ISO C++ 2011 به‌همراه اصلاحیه‌ها و افزونه‌های GNU
c++14
ISO C++ 2014 به‌همراه اصلاحیه‌ها
gnu++14
ISO C++ 2014 به‌همراه اصلاحیه‌ها و افزونه‌های GNU
c++17
ISO C++ 2017 به‌همراه اصلاحیه‌ها
gnu++17
ISO C++ 2017 به‌همراه اصلاحیه‌ها و افزونه‌های GNU
c++20
ISO C++ 2020 به‌همراه اصلاحیه‌ها
gnu++20
ISO C++ 2020 به‌همراه اصلاحیه‌ها و افزونه‌های GNU
c++23
ISO C++ 2023 به‌همراه اصلاحیه‌ها
gnu++23
ISO C++ 2023 به‌همراه اصلاحیه‌ها و افزونه‌های GNU
c++2c
پیش‌نویس کاری برای C++2c
gnu++2c
پیش‌نویس کاری برای C++2c به‌همراه افزونه‌های GNU

استاندارد پیش‌فرض زبان C++ مقدار gnu++17 است.

مقادیر پشتیبانی‌شده برای زبان OpenCL عبارت‌اند از:

cl1.0
OpenCL 1.0
cl1.1
OpenCL 1.1
cl1.2
OpenCL 1.2
cl2.0
OpenCL 2.0

استاندارد پیش‌فرض زبان OpenCL مقدار cl1.0 است.

مقادیر پشتیبانی‌شده برای زبان CUDA عبارت‌اند از:

cuda
NVIDIA CUDA(tm)
-stdlib=<library> کتابخانه استاندارد C++ مورد استفاده را مشخص می‌کند؛ گزینه‌های پشتیبانی‌شده libstdc++ و libc++ هستند. در صورت عدم تعیین، پیش‌فرض پلتفرم استفاده خواهد شد.
کتابخانه زمان اجرای کامپایلر (runtime library) مورد استفاده را مشخص می‌کند؛ گزینه‌های پشتیبانی‌شده libgcc و compiler-rt هستند. در صورت عدم تعیین، پیش‌فرض پلتفرم استفاده خواهد شد.
مشابه -std=c89 است.
با فایل‌های ورودی منبع به ترتیب به عنوان ورودی‌های Objective-C و Objective-C++ رفتار می‌کند.
سه‌نگاره‌ها (trigraphs) را فعال می‌کند.
مشخص می‌کند که فایل باید برای یک محیط مستقل (freestanding) و نه یک محیط میزبان (hosted) کامپایل شود. توجه داشته باشید که ساخت مستقل همچنان نیازمند پیوند دادن (link) با یک کتابخانه استاندارد C است که از رابط‌های مستقل برای حالت زبان و محیط هدفِ مشخص‌شده پشتیبانی کند. این شامل توابعی مانند memcpy، memmove و memset است.
رفتار ویژه و بهینه‌سازی‌های توابع شناخته‌شده کتابخانه، مانند strlen() و malloc() را غیرفعال می‌کند.
رفتار ویژه و بهینه‌سازی‌ها را برای تابع مشخصی از کتابخانه غیرفعال می‌کند. برای مثال، -fno-builtin-strlen هرگونه رفتار ویژه برای تابع کتابخانه‌ای strlen() را حذف می‌کند.
رفتار ویژه و بهینه‌سازی‌ها را برای تابع مشخصی از کتابخانه استاندارد C++ در فضای نام std غیرفعال می‌کند. برای مثال، -fno-builtin-std-move_if_noexcept هرگونه رفتار ویژه برای تابع کتابخانه‌ای std::move_if_noexcept() را حذف می‌کند.

برای توابع کتابخانه استاندارد C که کتابخانه استاندارد C++ نیز آن‌ها را در فضای نام std ارائه می‌دهد، به جای آن از -fno-builtin-<function> استفاده کنید.

مشخص می‌کند که باید با توابع ریاضی به گونه‌ای رفتار شود که errno را به‌روزرسانی کنند.
پشتیبانی از رشته‌های سبک پاسکال را با الگوی "\pfoo" فعال می‌کند.
پشتیبانی از افزونه‌های مایکروسافت (Microsoft extensions) را فعال می‌کند.
مقدار _MSC_VER را تنظیم می‌کند. در ویندوز، پیش‌فرض این مقدار برابر با نسخه فعلیِ نصب‌شده از cl.exe، یا 1933 است. در غیر این صورت تنظیم نمی‌شود.
پشتیبانی از افزونه‌های بورلند (Borland extensions) را فعال می‌کند.
تمام رشته‌های لیتِرال (string literals) را به طور پیش‌فرض قابل نوشتن قرار می‌دهد. این کار یکتاسازی رشته‌ها (uniquing) و سایر بهینه‌سازی‌ها را غیرفعال می‌کند.
قوانین آسان‌گیرانه بررسی نوع را برای تبدیل‌های ضمنی بردارها مجاز می‌کند. مقادیر ممکن برای <kind>:
  • none: هیچ تبدیل ضمنی بین بردارها مجاز نیست
  • integer: تبدیل‌های بیتی ضمنی (implicit bitcasts) بین بردارهای صحیحی که عرض بیت کل یکسانی دارند مجاز است
  • all: تبدیل‌های بیتی ضمنی بین هر بردارهایی با عرض بیت کل یکسان مجاز است

در صورت عدم تعیین، مقدار پیش‌فرض <kind> برابر با integer است.

ویژگی زبانی "Blocks" را فعال می‌کند.
نسخه ABI مورد استفاده برای Objective-C را انتخاب می‌کند. نسخه‌های موجود عبارتند از 1 (ABI موروثی و شکننده "fragile")، 2 (ABI غیرشکننده 1)، و 3 (ABI غیرشکننده 2).
نسخه ABI غیرشکننده Objective-C را برای استفاده به عنوان پیش‌فرض انتخاب می‌کند. این مقدار تنها زمانی به عنوان ABI زبان Objective-C استفاده خواهد شد که ABI غیرشکننده فعال باشد (خواه از طریق -fobjc-nonfragile-abi، یا به دلیل این‌که پیش‌فرض پلتفرم است).
استفاده از ABI غیرشکننده Objective-C را فعال می‌کند. در پلتفرم‌هایی که این گزینه ABI پیش‌فرض است، می‌توان آن را با -fno-objc-nonfragile-abi غیرفعال کرد.

Clang به‌طور کامل و به عنوان بخشی ذاتی از معماری خود از کامپایل متقاطع (cross compilation) پشتیبانی می‌کند. بسته به نحوه پیکربندی نسخه Clang شما، ممکن است از چندین کامپایلر متقاطع پشتیبانی کند، یا فقط از یک هدف بومی (native) پشتیبانی نماید.

معماری مد نظر برای ساخت را مشخص می‌کند (مختص Mac OS X).
معماری مد نظر برای ساخت را مشخص می‌کند (تمامی پلتفرم‌ها).
هنگام ساخت برای macOS، حداقل نسخه پشتیبانی‌شده توسط برنامه شما را مشخص می‌کند.
هنگام ساخت برای iPhone OS، حداقل نسخه پشتیبانی‌شده توسط برنامه شما را مشخص می‌کند.
-دprint-supported-cpus
فهرستی از پردازنده‌های پشتیبانی‌شده برای هدف داده‌شده (که از طریق --target=<architecture> یا -arch <architecture> مشخص می‌شود) را چاپ می‌کند. اگر هیچ هدفی مشخص نشود، از هدف پیش‌فرض سیستم استفاده خواهد شد.
به عنوان یک نام مستعار برای --print-supported-cpus عمل می‌کند.
به عنوان یک نام مستعار برای --print-supported-cpus عمل می‌کند.
مشخص می‌کند که Clang باید برای یک عضو خاص از خانواده پردازنده‌ها و مدل‌های پس از آن کد تولید کند. برای مثال، اگر -march=i486 را مشخص کنید، کامپایلر مجاز است دستورالعمل‌هایی را تولید کند که روی i486 و پردازنده‌های پس از آن معتبر هستند، اما ممکن است در پردازنده‌های پیش از آن وجود نداشته باشند.
فهرست افزونه‌هایی (extensions) را که برای هدف تعیین‌شده توسط ترکیبی از مقادیر --target، -march و -mcpu فعال هستند، چاپ می‌کند. در حال حاضر، این گزینه تنها روی AArch64 و RISC-V پشتیبانی می‌شود. روی RISC-V، این گزینه همچنین رشته ISA افزونه‌های فعال‌شده را چاپ می‌کند.
فهرست تمام افزونه‌های پشتیبانی‌شده را برای هر پردازنده هدفِ یک معماری (که از طریق --target=<architecture> یا -arch <architecture> مشخص می‌شود) چاپ می‌کند. اگر هیچ هدفی مشخص نشود، از هدف پیش‌فرض سیستم استفاده خواهد شد. در حال حاضر، این گزینه فقط روی AArch64 و RISC-V پشتیبانی می‌شود.

سطح بهینه‌سازی مورد استفاده را مشخص می‌کند:
-O0 به معنای "بدون بهینه‌سازی" است: این سطح سریع‌ترین زمان کامپایل را داشته و کدی با بیشترین قابلیت اشکال‌زدایی تولید می‌کند.

-O1 جایی میان -O0 و -O2.

-O2 سطح متوسطی از بهینه‌سازی که اکثر بهینه‌سازی‌ها را فعال می‌کند.

-O3 شبیه -O2، با این تفاوت که بهینه‌سازی‌هایی را فعال می‌کند که اجرای آن‌ها زمان بیشتری می‌برد یا ممکن است کدهای بزرگ‌تری تولید کنند (به امید اینکه برنامه سریع‌تر اجرا شود).

-Ofast تمام بهینه‌سازی‌های -O3 را به همراه بهینه‌سازی‌های تهاجمی دیگری که ممکن است انطباق دقیق با استانداردهای زبان را نقض کنند فعال می‌کند. این گزینه در Clang 19 منسوخ شده است و هشداری صادر می‌شود مبنی بر اینکه اگر رفتار ریاضیاتی غیراستاندارد مد نظر است، باید از ترکیب -O3 با -ffast-math <#cmdoption-ffast-math> استفاده شود. هنوز زمان‌بندی مشخصی برای حذف آن وجود ندارد؛ هدف، جلوگیری از استفاده از -Ofast به دلیل رفتار غیرمنتظره یک پرچم بهینه‌سازی است که رفتار قابل‌مشاهده کد صحیح را تغییر می‌دهد.

-Os شبیه -O2 به همراه بهینه‌سازی‌های اضافه جهت کاهش حجم کد.

-Oz شبیه -Os (و در نتیجه -O2)، اما حجم کد را بیش از پیش کاهش می‌دهد.

-Og مشابه -O1، اما با بهینه‌سازی اندکی کمتر و دیدپذیری بهتر متغیرها. همان بهینه‌سازی‌های -O1 اجرا می‌شوند، اما پرچم -fextend-variable-liveness نیز تنظیم می‌شود که تلاش می‌کند از کاهش زنده‌بودن (liveness) متغیرهای کاربر توسط بهینه‌سازی‌ها جلوگیری کرده و در دسترس بودن آن‌ها را هنگام اشکال‌زدایی بهبود بخشد.

-O معادل -O1.

-O4 و بالاتر

در حال حاضر معادل -O3 است.
خروجی اطلاعات اشکال‌زدایی را کنترل می‌کند. توجه داشته باشید که اطلاعات اشکال‌زدایی Clang در -O0 بهترین کارایی را دارد. هنگامی که بیش از یک گزینه شروع‌شونده با -g مشخص شود، آخرین گزینه اعمال خواهد شد:
-g اطلاعات اشکال‌زدایی تولید می‌کند.

-gline-tables-only فقط اطلاعات جدول خطوط اشکال‌زدایی را تولید می‌کند. این گزینه امکان ردیابی نمادین پشته (backtrace) با اطلاعات درون‌خطی‌سازی (inlining) را فراهم می‌آورد، اما شامل هیچ اطلاعاتی درباره متغیرها، مکان‌ها یا انواع آن‌ها نمی‌شود.

-gmodules اطلاعات اشکال‌زدایی را تولید می‌کند که حاوی ارجاعات خارجی به انواع تعریف‌شده در ماژول‌های Clang یا هدرهای از پیش کامپایل‌شده (precompiled headers) است، به‌جای اینکه اطلاعات تکراری انواع اشکال‌زدایی را در هر فایل شیء (object file) قرار دهد. این گزینه قالب ماژول Clang را به‌طور شفاف به محفظه‌های فایل شیء تغییر می‌دهد که ماژول Clang را به همراه اطلاعات اشکال‌زدایی نگهداری می‌کنند. هنگام کامپایل برنامه‌ای که از ماژول‌های Clang یا هدرهای از پیش کامپایل‌شده استفاده می‌کند، این گزینه اطلاعات اشکال‌زدایی کامل را با زمان‌های کامپایل سریع‌تر و فایل‌های شیء بسیار کوچک‌تر تولید می‌کند.

این گزینه نباید هنگام ساخت کتابخانه‌های ایستا برای توزیع روی ماشین‌های دیگر استفاده شود، زیرا اطلاعات اشکال‌زدایی حاوی ارجاعاتی به حافظه موقت (cache) ماژول در ماشینی خواهد بود که فایل‌های شیء کتابخانه در آن ساخته شده‌اند.

Clang از تعدادی بهینه‌سازی برای کاهش حجم اطلاعات اشکال‌زدایی در فایل باینری پشتیبانی می‌کند. این بهینه‌سازی‌ها بر اساس این فرض کار می‌کنند که اطلاعات نوعِ اشکال‌زدایی می‌توانند در چندین واحد کامپایل (compilation units) پخش شوند. به عنوان مثال، Clang تعاریف نوع را برای انواعی که توسط یک ماژول نیاز نیستند و می‌توانند با یک اعلان رو به جلو (forward declaration) جایگزین شوند، تولید نخواهد کرد. علاوه بر این، Clang فقط اطلاعات نوع را برای یک کلاس پویای C++ در ماژولی صادر می‌کند که شامل vtable آن کلاس باشد.

گزینه -fstandalone-debug این بهینه‌سازی‌ها را خاموش می‌کند. این امر هنگام کار با کتابخانه‌های شخص ثالث که همراه با اطلاعات اشکال‌زدایی ارائه نمی‌شوند مفید است. این حالت در Darwin پیش‌فرض است. توجه داشته باشید که Clang هرگز اطلاعات نوع را برای انواعی که اصلاً توسط برنامه ارجاع داده نشده‌اند، تولید نخواهد کرد.

به‌طور پیش‌فرض، Clang اطلاعات نوع را برای انواعی که تعریف شده اما در برنامه استفاده نشده‌اند تولید نمی‌کند. برای حفظ اطلاعات اشکال‌زدایی برای این انواع استفاده‌نشده، می‌توان از نقیض آن یعنی -fno-eliminate-unused-debug-types استفاده کرد.
امکان پرتاب استثناها (exceptions) از طریق قاب‌های پشته (stack frames) کامپایل‌شده با Clang را فراهم می‌کند (در بسیاری از اهداف، این پرچم اطلاعات بازپیچی پشته (unwind) را برای توابعی که ممکن است استثنا از طریق آن‌ها پرتاب شود فعال می‌کند). برای بیشتر اهداف، این ویژگی به‌طور پیش‌فرض برای C++ فعال است.
کدی برای به دام انداختن خطاهای سرریز عدد صحیح (integer overflow) تولید می‌کند. سرریز عدد صحیح علامت‌دار در C رفتاری تعریف‌نشده (undefined) است. با این پرچم، کد اضافی تولید می‌شود تا این مورد را شناسایی کرده و هنگام رخ دادن آن، برنامه را متوقف کند (abort).
این پرچم، سطح دیدپذیری (visibility) پیش‌فرض را تعیین می‌کند.
این پرچم مشخص می‌کند که متغیرهای فاقد مقداردهی اولیه، پیوند مشترک (common linkage) دریافت کنند. این رفتار را می‌توان با -fno-common غیرفعال کرد.
-ftls-model=<model> مدل پیش‌فرض ذخیره‌سازی محلی رشته (TLS) را برای استفاده در متغیرهای محلی رشته تعیین می‌کند. مقادیر معتبر عبارتند از: "global-dynamic"، "local-dynamic"، "initial-exec" و "local-exec". مقدار پیش‌فرض "global-dynamic" است. مدل پیش‌فرض را می‌توان با ویژگی tls_model بازنویسی کرد. کامپایلر در صورت امکان تلاش خواهد کرد مدلی کارآمدتر را انتخاب کند.
تولید فایل‌های خروجی در قالب‌های LLVM، مناسب برای بهینه‌سازی زمان پیوند (LTO). هنگامی که همراه با -S استفاده شود، فایل‌های اسمبلی زبان میانی LLVM را تولید می‌کند؛ در غیر این صورت، فایل‌های شیء با قالب بیت‌کد LLVM تولید می‌شوند (که ممکن است بسته به گزینه‌های انتخاب مرحله، به پیونددهنده ارسال شوند).

مقدار پیش‌فرض برای -flto برابر "full" است که در آن بیت‌کد LLVM برای بهینه‌سازی یکپارچه زمان پیوند (LTO) مناسب است، به‌طوری که پیونددهنده تمام چنین ماژول‌هایی را برای بهینه‌سازی در یک ماژول واحد ادغام می‌کند. با انتخاب "thin"، کامپایل با ThinLTO <> در عوض فراخوانی می‌شود.

نکته:

در Darwin، هنگام استفاده از -flto به همراه -g و کامپایل و پیوند در مراحل مجزا، همچنین لازم است گزینه -Wl,-object_path_lto,<lto-filename>.o را در مرحله پیوند ارسال کنید تا به پیونددهنده ld64 دستور دهد فایل شیء موقت تولیدشده در حین بهینه‌سازی زمان پیوند را حذف نکند (در صورتی که کامپایل و پیوند در یک مرحله انجام شوند، این فلگ به طور خودکار توسط Clang به پیونددهنده ارسال می‌شود). این کار امکان اشکال‌زدایی فایل اجرایی و همچنین تولید بسته .dSYM را با استفاده از dsymutil(1) فراهم می‌کند.

-###
چاپ (بدون اجرای) دستوراتی که برای این کامپایل باید اجرا شوند.
نمایش گزینه‌های موجود.
عدم صدور هرگونه هشدار برای آرگومان‌های استفاده‌نشده‌ی گرداننده.
ارسال آرگومان‌های جداشده با کاما در args به اسمبلر.
ارسال آرگومان‌های جداشده با کاما در args به پیونددهنده (linker).
ارسال آرگومان‌های جداشده با کاما در args به پیش‌پردازنده.
ارسال arg به تحلیل‌گر ایستا.
ارسال arg به اسمبلر.
ارسال arg به پیونددهنده.
ارسال arg به پیش‌پردازنده.
نوشتن خروجی در file.
چاپ مسیر کتابخانه‌ای کامل مربوط به file.
چاپ مسیر کتابخانه‌ای برای کتابخانه زمان اجرای کامپایلر که در حال حاضر استفاده می‌شود ("libgcc.a" یا "libclang_rt.builtins.*.a").
چاپ مسیر کامل برنامه name.
چاپ مسیرهای استفاده‌شده برای یافتن کتابخانه‌ها و برنامه‌ها.
ذخیره نتایج میانی کامپایل.
ذخیره آمار داخلی تولید کد (LLVM) در فایلی در دایرکتوری جاری (-save-stats/"-save-stats=cwd") یا دایرکتوری فایل خروجی ("-save-stats=obj").

همچنین می‌توانید از متغیرهای محیطی برای کنترل گزارش آمار استفاده کنید. تنظیم CC_PRINT_INTERNAL_STAT به 1 این قابلیت را فعال می‌کند و گزارش در قالب JSON به خروجی استاندارد (stdout) ارسال می‌شود.

تنظیم CC_PRINT_INTERNAL_STAT_FILE به مسیر یک فایل، باعث می‌شود آمار در قالب JSON در فایل مشخص‌شده گزارش داده شود.

توجه داشته باشید که -save-stats بر CC_PRINT_INTERNAL_STAT و CC_PRINT_INTERNAL_STAT_FILE اولویت دارد.

به ترتیب برای فعال و غیرفعال کردن استفاده از اسمبلر یکپارچه استفاده می‌شود. این که اسمبلر یکپارچه به طور پیش‌فرض فعال باشد یا خیر، وابسته به معماری مقصد (target) است.
اندازه‌گیری زمان اجرای دستورات به صورت مجزا.
چاپ خلاصه‌ای از زمان‌بندی هر مرحله از کامپایل.
نمایش دستورات قابل اجرا و استفاده از خروجی با جزئیات (verbose).
این گزینه‌ها نحوه چاپ اطلاعات مربوط به پیام‌های تشخیصی (خطاها و هشدارها) را توسط Clang کنترل می‌کنند. لطفاً برای اطلاعات بیشتر به راهنمای کاربر Clang (Clang User's Manual) مراجعه کنید.

یک دستور ضمنی #define را به بافر تعاریف اولیه اضافه می‌کند که پیش از پیش‌پردازش فایل مبدأ خوانده می‌شود.
یک دستور ضمنی #undef را به بافر تعاریف اولیه اضافه می‌کند که پیش از پیش‌پردازش فایل مبدأ خوانده می‌شود.
یک دستور ضمنی #include را به بافر تعاریف اولیه اضافه می‌کند که پیش از پیش‌پردازش فایل مبدأ خوانده می‌شود.
دایرکتوری مشخص‌شده را به مسیر جستجوی فایل‌های include اضافه می‌کند.
دایرکتوری مشخص‌شده را به مسیر جستجوی فایل‌های include فریم‌ورک اضافه می‌کند.
دایرکتوری‌های استاندارد سیستم یا دایرکتوری‌های توکار کامپایلر را برای فایل‌های include جستجو نمی‌کند.
دایرکتوری‌های استاندارد سیستم را برای فایل‌های include جستجو نمی‌کند، اما دایرکتوری‌های include توکار کامپایلر را جستجو می‌کند.
دایرکتوری توکار clang را برای فایل‌های include جستجو نمی‌کند.
دایرکتوری کتابخانه استاندارد C++ سیستم را برای فایل‌های include جستجو نمی‌کند.
تنها به همراه -E قابل استفاده است. محتوای پیش‌پردازش‌شده سرآیندهای "سیستمی" را در خروجی کپی نمی‌کند؛ در عوض، دستور #include را حفظ می‌کند. این امر می‌تواند حجم متن تولیدشده توسط -E را تا حد زیادی کاهش دهد که هنگام تلاش برای تولید یک نمونه آزمایشی بازتولیدپذیر و "کوچک" می‌تواند مفید باشد.

با این حال، این گزینه بازتولیدپذیری را تضمین نمی‌کند. اگر کد مبدأ فراخوانی‌کننده نمادهای پیش‌پردازنده‌ای را تعریف کند که بر رفتار سرآیندهای سیستمی تأثیر می‌گذارند (برای مثال، _XOPEN_SOURCE)، عملکرد -E آن تعریف را حذف خواهد کرد و بنابراین می‌تواند معناشناسی سرآیند گنجانده‌شده را تغییر دهد. همچنین، استفاده از نسخه متفاوتی از سرآیندهای سیستمی (به‌ویژه نسخه متفاوتی از STL) ممکن است به رفتاری متفاوت منجر شود. همیشه فایل پیش‌پردازش‌شده را با کامپایل جداگانه آن اعتبارسنجی کنید.

این متغیرهای محیطی، به ترتیب، برای یافتن مکانی جهت نوشتن فایل‌های موقت مورد استفاده در طول فرآیند کامپایل بررسی می‌شوند.
این متغیر محیطی مسیرهای جستجوی سرآیند اضافی (غیرسیستمی) را مشخص می‌کند که برای یافتن فایل‌های سرآیند include‌شده استفاده می‌شوند. این مسیرها پس از مسیرهای مشخص‌شده با گزینه -I<directory>، اما پیش از هرگونه مسیر جستجوی سرآیند سیستمی بررسی می‌شوند. مسیرها با جداکننده وابسته به پلتفرم، مانند آنچه در متغیر محیطی PATH استفاده می‌شود، تفکیک می‌گردند. ورودی‌های خالی در فهرست مسیرهای تفکیک‌شده، از جمله موارد موجود در ابتدا یا انتهای فهرست، به عنوان دایرکتوری کاری فعلی کامپایلر در نظر گرفته می‌شوند.
این متغیرهای محیطی مسیرهای جستجوی فایل‌های سرآیند سیستمی اضافی را مشخص می‌کنند که هنگام پردازش زبان متناظر استفاده می‌شوند. مسیرهای جستجو مشابه متغیر محیطی CPATH تفکیک می‌شوند.
اگر -mmacos-version-min مشخص نشده باشد، هدف استقرار (deployment target) پیش‌فرض از این متغیر محیطی خوانده می‌شود. این گزینه تنها بر اهداف Darwin تأثیر می‌گذارد.

برای گزارش باگ‌ها، لطفاً از <https://github.com/llvm/llvm-project/issues> بازدید کنید. اکثر گزارش‌های باگ باید شامل فایل‌های مبدأ پیش‌پردازش‌شده (با استفاده از گزینه -E) و خروجی کامل کامپایلر، همراه با اطلاعات لازم برای بازتولید مشکل باشند.

as(1), ld(1)

نگهداری‌شده توسط تیم Clang / LLVM (http://clang.llvm.org)

2007-2026, The Clang Team

June 21, 2026 22