پس از شش ماه توسعه، انتشار پروژه LLVM 13.0 ارائه شد - یک جعبه ابزار سازگار با GCC (کامپایلر، بهینه ساز و تولید کننده کد) که برنامه ها را در بیت کد میانی دستورالعمل های مجازی RISC مانند (یک ماشین مجازی سطح پایین با سیستم بهینه سازی چند سطحی). شبه کد تولید شده را می توان با استفاده از یک کامپایلر JIT به دستورات ماشین مستقیماً در زمان اجرای برنامه تبدیل کرد.
بهبود در Clang 13.0:
- پشتیبانی پیادهسازی شده برای فراخوانیهای دم تضمینی ( فراخوانی یک زیربرنامه در انتهای یک تابع، تشکیل یک بازگشت دنباله در صورت فراخوانی زیربرنامه). پشتیبانی از تماسهای تضمینی دم توسط ویژگی "[[clang::musttail]]" در C++ و "__attribute__((musttail))" در C، که در عبارت "return" استفاده میشود، ارائه میشود. این ویژگی به شما امکان می دهد با استقرار کد در یک تکرار مسطح برای صرفه جویی در مصرف پشته، بهینه سازی ها را پیاده سازی کنید.
- اعلانهای "استفاده" و پسوندهای clang از تعریف ویژگیهای سبک C++11 با استفاده از قالب "[[]] پشتیبانی میکنند.
- پرچم "-Wreserved-identifier" را برای نمایش اخطار زمانی که شناسه های رزرو شده را در کد کاربر مشخص می کنید، اضافه کرد.
- پرچمهای "-Wunused-but-set-parameter" و "-Wunused-but-set-variable" اضافه شد تا در صورت تنظیم یک پارامتر یا متغیر، اخطار نمایش داده شود.
- پرچم "-Wnull-pointer-subtraction" اضافه شد تا در صورتی که کد ممکن است به دلیل استفاده از نشانگر تهی در عملیات تفریق رفتار نامشخصی ایجاد کند، هشداری صادر کند.
- پرچم "-fstack-usage" را اضافه کرد تا برای هر فایل کد یک فایل ".su" اضافی حاوی اطلاعاتی در مورد اندازه فریم های پشته برای هر تابع تعریف شده در فایل در حال پردازش ایجاد کند.
- یک نوع خروجی جدید به تحلیلگر استاتیک اضافه شده است - "sarif-html" که منجر به تولید گزارش ها به طور همزمان در قالب های HTML و Sarif می شود. چک allocClassWithName جدید اضافه شد. هنگام تعیین گزینه "-analyzer-display-progress"، زمان تجزیه و تحلیل هر تابع نمایش داده می شود. تحلیلگر اشاره گر هوشمند (alpha.cplusplus.SmartPtr) تقریباً آماده است.
- قابلیت های مرتبط با پشتیبانی OpenCL گسترش یافته است. پشتیبانی از افزونههای جدید cl_khr_integer_dot_product، cl_khr_extended_bit_ops، __cl_clang_bitfields و __cl_clang_non_portable_kernel_param_types اضافه شده است. اجرای مشخصات OpenCL 3.0 ادامه یافته است. برای C، مشخصات OpenCL 1.2 به طور پیش فرض استفاده می شود مگر اینکه نسخه دیگری به صراحت انتخاب شده باشد. برای C++، پشتیبانی از فایلهای با پسوند ".clcpp" اضافه شده است.
- پشتیبانی از دستورالعمل های تبدیل حلقه ("#pragma omp unrol" و "#pragma omp tile") تعریف شده در مشخصات OpenMP 5.1 اجرا شده است.
- گزینههای اضافه شده به ابزار clang-format: SpacesInLineCommentPrefix برای تعریف تعداد فاصلههای قبل از نظرات، IndentAccessModifiers، LambdaBodyIndentation و PPIndentWidth برای کنترل تراز ورودیها، عبارات لامبدا و دستورالعملهای پیشپردازنده. امکانات مرتب سازی شمارش فایل های هدر (SortIncludes) گسترش یافته است. پشتیبانی برای قالب بندی فایل های JSON اضافه شده است.
- بخش بزرگی از چکهای جدید به لنگرها اضافه شده است.
نوآوری های کلیدی در LLVM 13.0:
- گزینه "-ehcontguard" را برای استفاده از فناوری CET (فناوری اجرای کنترل جریان ویندوز) برای محافظت در برابر اجرای اکسپلویت های ساخته شده با استفاده از تکنیک های برنامه نویسی بازگشت گرا (ROP) در مرحله رسیدگی به استثناها اضافه کرد.
- پروژه آزمون اشکالزدایی به آزمایشهای متقابل پروژه تغییر نام داده است و برای آزمایش اجزای پروژههای مختلف طراحی شده است، نه محدود به اطلاعات اشکالزدایی.
- سیستم اسمبلی از ساخت چندین توزیع پشتیبانی می کند، به عنوان مثال، یکی با برنامه های کاربردی و دیگری با کتابخانه ها برای توسعه دهندگان.
- در باطن معماری AArch64، پشتیبانی از پسوندهای Armv9-A RME (افزونه مدیریت قلمرو) و SME (افزونه ماتریس مقیاس پذیر) در اسمبلر پیاده سازی شده است.
- پشتیبانی از ISA V68/HVX به باطن معماری Hexagon اضافه شده است.
- پشتیبان x86 پشتیبانی از پردازنده های AMD Zen 3 را بهبود بخشیده است.
- پشتیبانی از GFX1013 RDNA2 APU به باطن AMDGPU اضافه شد.
- Libc++ به پیاده سازی ویژگی های جدید استانداردهای C++20 و C++2b، از جمله تکمیل کتابخانه "مفاهیم" ادامه می دهد. پشتیبانی از std:: فایل سیستم برای پلتفرم ویندوز مبتنی بر MinGW اضافه شده است. فایل های سرصفحه ، و از هم جدا شده اند. گزینه ساخت LIBCXX_ENABLE_INCOMPLETE_FEATURES برای غیرفعال کردن فایلهای سرصفحه با قابلیت اجرا نشده اضافه شد.
- قابلیتهای پیوند دهنده LLD گسترش یافته است، که در آن پشتیبانی از پردازندههای Big-Endian Aarch64 پیادهسازی میشود، و باطن Mach-O به حالتی رسیده است که امکان پیوند برنامههای معمولی را فراهم میکند. شامل بهبودهای مورد نیاز برای پیوند Glibc با استفاده از LLD.
- ابزار llvm-mca (ماشین کد آنالیزگر) پشتیبانی از پردازندههایی را اضافه کرده است که دستورالعملها را به ترتیب اجرا میکنند (خط لوله فوقاسکالار به ترتیب)، مانند ARM Cortex-A55.
- دیباگر LLDB برای پلتفرم AArch64 پشتیبانی کامل از Pointer Authentication، MTE (MemTag، Memory Tagging Extension) و ثبت SVE را فراهم می کند. دستورات اضافه شده است که به شما امکان می دهد برچسب ها را به هر عملیات تخصیص حافظه متصل کنید و هنگام دسترسی به حافظه، نشانگر را سازماندهی کنید، که باید با برچسب صحیح مرتبط باشد.
- دیباگر LLDB و فرانت اند زبان فرترن - Flang به مجموعه های باینری تولید شده توسط پروژه اضافه شده است.
منبع: opennet.ru