پس از شش ماه توسعه، انتشار پروژه LLVM 12.0 ارائه شد - یک جعبه ابزار سازگار با GCC (کامپایلر، بهینه ساز و تولید کننده کد) که برنامه ها را در بیت کد میانی دستورالعمل های مجازی RISC مانند (یک ماشین مجازی سطح پایین با سیستم بهینه سازی چند سطحی). شبه کد تولید شده را می توان با استفاده از یک کامپایلر JIT به دستورات ماشین مستقیماً در زمان اجرای برنامه تبدیل کرد.
بهبود در Clang 12.0:
- پشتیبانی از ویژگیهای «محتمل» و «بعید» پیشنهاد شده در استاندارد C++20 بهطور پیشفرض پیادهسازی و فعال شده است و به بهینهساز اجازه میدهد تا از احتمال راهاندازی ساختار شرطی مطلع شود (برای مثال، «[[احتمالاً ]] اگر (تصادفی > 0) {“).
- پشتیبانی از پردازنده های AMD Zen 3 (-march=znver3)، Intel Alder Lake (-march=alderlake) و Intel Sapphire Rapids (-march=sapphirerapids) اضافه شده است.
- پشتیبانی از پرچمهای "-march=x86-64-v[234]" برای انتخاب سطوح معماری x86-64 (v2 - برنامههای افزودنی SSE4.2، SSSE3، POPCNT و CMPXCHG16B را پوشش میدهد؛ v3 - AVX2 و MOVBE؛ v4 - AVX-512 ) .
- پشتیبانی از پردازنده های Arm Cortex-A78C (cortex-a78c)، Arm Cortex-R82 (cortex-r82)، Arm Neoverse V1 (neoverse-v1)، Arm Neoverse N2 (neoverse-n2) و Fujitsu A64FX (a64fx) اضافه شده است. به عنوان مثال، برای فعال کردن بهینه سازی برای CPU های Neoverse-V1، می توانید "-mcpu=neoverse-v1" را مشخص کنید.
- برای معماری AArch64، پرچم های کامپایلر جدید "-moutline-atomics" و "-mno-outline-atomics" برای فعال یا غیرفعال کردن توابع کمکی عملیات اتمی، مانند "__aarch64_cas8_relax" اضافه شده اند. چنین توابعی در زمان اجرا تشخیص می دهند که آیا پشتیبانی LSE (برنامه های افزودنی سیستم بزرگ) در دسترس است یا خیر و از دستورالعمل های پردازنده اتمی ارائه شده استفاده می کنند یا به استفاده از دستورالعمل های LL/SC (Load-link/store-conditional) برای همگام سازی بازمی گردند.
- گزینه "-fbinutils-version" اضافه شد تا نسخه هدف مجموعه binutils را برای سازگاری با رفتار پیوند دهنده و اسمبلر قدیمی انتخاب کنید.
- برای فایل های اجرایی ELF، زمانی که پرچم "-gz" مشخص شده است، فشرده سازی اطلاعات اشکال زدایی با استفاده از کتابخانه zlib به طور پیش فرض فعال است (gz=zlib). پیوند دادن فایلهای شی بهدستآمده به lld یا GNU binutils 2.26+ نیاز دارد. برای بازیابی سازگاری با نسخه های قدیمی تر binutils، می توانید "-gz=zlib-gnu" را مشخص کنید.
- نشانگر "this" اکنون با چک های غیر تهی و غیر قابل ارجاع (N) پردازش می شود. برای حذف ویژگی nonnull، اگر نیاز به استفاده از مقادیر NULL دارید، می توانید از گزینه "-fdelete-null-pointer-checks" استفاده کنید.
- در پلتفرم لینوکس، حالت "-fasynchronous-unwind-tables" برای معماریهای AArch64 و PowerPC فعال است تا جداول فراخوانی باز کردن را تولید کند، مانند GCC.
- در "#pragma clang loop vectorize_width" قابلیت تعیین گزینه های "ثابت" (پیش فرض) و "مقیاس پذیر" را برای انتخاب روش برداری اضافه کرد. حالت «مقیاسپذیر»، مستقل از طول بردار، آزمایشی است و میتواند روی سختافزاری که از بردارسازی مقیاسپذیر پشتیبانی میکند، استفاده شود.
- پشتیبانی بهبودیافته از پلتفرم ویندوز: مجموعه های باینری رسمی برای ویندوز در سیستم های Arm64 آماده شده اند، از جمله کامپایلر Clang، لینکر LLD و کتابخانه های زمان اجرا کامپایلر-rt. هنگام ساختن برای پلتفرم های هدف MinGW، پسوند exe اضافه می شود، حتی در هنگام کامپایل متقابل.
- قابلیت های مرتبط با پشتیبانی از OpenCL، OpenMP و CUDA گسترش یافته است. گزینههای "-cl-std=CL3.0" و "-cl-std=CL1.0" برای انتخاب گزینههای ماکرو برای OpenCL 3.0 و OpenCL 1.0 اضافه شد. ابزارهای تشخیصی گسترش یافته است.
- پشتیبانی از دستورالعملهای HRESET، UINTR و AVXVNNI که در برخی از پردازندههای مبتنی بر x86 پیادهسازی شدهاند، اضافه شده است.
- در سیستمهای x86، پشتیبانی از گزینه "-mtune=" فعال است و بهینهسازیهای ریزمعماری انتخاب شده را بدون توجه به مقدار "-march=" فعال میکند.
- تحلیلگر استاتیک پردازش برخی از توابع POSIX را بهبود بخشیده و تعیین نتیجه عملیات مشروط را هنگامی که چندین مقدار نمادین در مقایسه وجود دارد، به طور قابل توجهی بهبود بخشیده است. چکهای جدیدی اضافه شدهاند: fuchia.HandleChecker (دستهها را در ساختارها تعریف میکند)، webkit.UncountedLambdaCapturesChecker webkit و alpha.webkit.UncountedLocalVarsChecker (ویژگیهای کار با اشارهگرها را در کد موتور WebKit در نظر میگیرد).
- در عبارات مورد استفاده در زمینه ثابت ها، استفاده از توابع داخلی __builtin_bitreverse*, __builtin_rotateleft*, __builtin_rotateright*, _mm_popcnt*, _bit_scan_forward, __bsfd, __bsfq, __bit_scan_reverse, __bit_scan_reverse, __bit_scan_bitreverse, __bit_scan_reverse, __bit_scan_reverse, __bit_scan_reverse, _bsd_. _ مجاز است bswapq ، _castf*، __rol* و __ror*.
- یک گزینه BitFieldColonSpacing را به ابزار clang-format اضافه کرد تا فاصله بین شناسهها، ستونها و تعاریف فیلد را انتخاب کند.
- سرور clangd caching (Clang Server) در پلتفرم لینوکس مصرف حافظه را در طول عملیات طولانی مدت به میزان قابل توجهی کاهش داده است (تماس های دوره ای به malloc_trim برای بازگرداندن صفحات حافظه رایگان به سیستم عامل ارائه می شود).
نوآوری های کلیدی در LLVM 12.0:
- پشتیبانی از ابزار ساخت llvm-build نوشته شده در پایتون متوقف شده است و در عوض پروژه به طور کامل به استفاده از سیستم ساخت CMake تغییر کرده است.
- در پسزمینه معماری AArch64، پشتیبانی از پلتفرم ویندوز بهبود یافته است: تولید صحیح خروجی اسمبلر برای سیستمهای ویندوز هدف تضمین شده است، تولید دادهها در تماسهای باز کردن بهینه شده است (اندازه چنین دادههایی تا 60 کاهش یافته است. %)، قابلیت ایجاد unwind داده با استفاده از اسمبلر به دستورات .seh_* اضافه شده است.
- پشتیبان معماری PowerPC دارای بهینه سازی های جدید برای حلقه ها و استقرار درون خطی، پشتیبانی گسترده از پردازنده های Power10، پشتیبانی از دستورالعمل های MMA برای دستکاری ماتریس و پشتیبانی بهبود یافته برای سیستم عامل AIX است.
- پشتیبان x86 پشتیبانی از پردازنده های AMD Zen 3، Intel Alder Lake و Intel Sapphire Rapids و همچنین دستورالعمل های پردازنده HRESET، UINTR و AVXVNNI را اضافه می کند. پشتیبانی از MPX (برنامههای افزودنی حفاظت از حافظه) برای بررسی نشانگرها برای اطمینان از اینکه مرزهای حافظه دیگر پشتیبانی نمیشوند (این فناوری گسترده نیست و قبلاً از GCC حذف شده است). پشتیبانی به اسمبلر برای پیشوندهای {disp32} و {disp8} و پسوندهای .d32 و .d8 برای کنترل اندازه افستها و پرشهای عملوند اضافه شد. یک ویژگی جدید "tune-cpu" برای کنترل گنجاندن بهینهسازیهای ریزمعماری اضافه شد.
- یک حالت جدید "-fsanitize=unsigned-shift-base" به آشکارساز مشکل اعداد صحیح (عفونی کننده عدد صحیح، "-fsanitize=integer") اضافه شده است تا سرریز اعداد صحیح بدون علامت را پس از کمی جابجایی به چپ تشخیص دهد.
- در آشکارسازهای مختلف (asan, cfi, lsan, msan, tsan, ubsan sanitizer) پشتیبانی از توزیع های لینوکس با کتابخانه استاندارد Musl اضافه شده است.
- قابلیت های پیوند دهنده LLD گسترش یافته است. پشتیبانی بهبودیافته از فرمت ELF، از جمله گزینه های اضافه شده "--dependency-file"، "error-handling-script"، "-lto-pseudo-probe-for-profiling"، "-no-lto-whole-program" -دید" " پشتیبانی از MinGW بهبود یافته است. برای فرمت Mach-O (macOS)، پشتیبانی از معماریهای arm64، arm، و i386، بهینهسازی زمان پیوند (LTO) و باز کردن پشته برای مدیریت استثنا اجرا شده است.
- Libc++ ویژگی های جدید استاندارد C++20 را پیاده سازی کرده و توسعه ویژگی های مشخصات C++2b را آغاز کرده است. پشتیبانی برای ساخت با غیرفعال کردن پشتیبانی محلی سازی ("-DLIBCXX_ENABLE_LOCALIZATION=OFF") و دستگاه هایی برای تولید اعداد شبه تصادفی ("-DLIBCXX_ENABLE_RANDOM_DEVICE=OFF") اضافه شده است.
منبع: opennet.ru