انتشار مجموعه کامپایلر LLVM 16.0

پس از شش ماه توسعه، انتشار پروژه LLVM 16.0 ارائه شد - یک جعبه ابزار سازگار با GCC (کامپایلر، بهینه ساز و تولید کننده کد) که برنامه ها را در بیت کد میانی دستورالعمل های مجازی RISC مانند (یک ماشین مجازی سطح پایین با سیستم بهینه سازی چند سطحی). شبه کد تولید شده را می توان با استفاده از یک کامپایلر JIT به دستورات ماشین مستقیماً در زمان اجرای برنامه تبدیل کرد.

پیشرفت های عمده در Clang 16.0:

  • استاندارد پیش‌فرض C++/ObjC++ gnu++17 (قبلاً gnu++14) است، به این معنی که ویژگی‌های C++17 با پسوندهای گنو به‌طور پیش‌فرض پشتیبانی می‌شوند. برای برگرداندن رفتار قبلی، می توانید از گزینه "-std=gnu++14" استفاده کنید.
  • ویژگی های پیشرفته پیاده سازی شده مربوط به استاندارد C++20:
    • توابع عضو ویژه مشروط بی اهمیت،
    • گرفتن پیوندهای ساخت یافته در توابع لامبدا،
    • عملگر برابری درون عبارات،
    • گزینه ای برای حذف کلمه کلیدی typename در برخی زمینه ها،
    • مقداردهی اولیه جمع معتبر در پرانتز ("Aggr(val1, val2)").
  • ویژگی های تعریف شده در استاندارد آینده C++2b پیاده سازی شده است:
    • قرار دادن برچسب ها در انتهای عبارات مرکب مجاز است،
    • عملگر استاتیک()،
    • عملگر استاتیک[]،
    • سازگاری با نوع char8_t تضمین شده است،
    • دامنه نویسه‌های مجاز برای استفاده در "\N{...}" گسترش یافته است
    • قابلیت استفاده از متغیرهای اعلام شده به عنوان "static constexpr" در توابع اعلام شده به عنوان constexpr اضافه شده است.
  • ویژگی های تعریف شده در C2x استاندارد C آینده پیاده سازی شده است:
    • برای غیرفعال کردن اخطار "-Wunused-label"، ویژگی "[[شاید_unused]]" مجاز است برای برچسب‌ها اعمال شود.
    • مجاز به قرار دادن برچسب ها در هر جایی از عبارات ترکیبی است،
    • اپراتورهای typeof و typeof_unqual اضافه شدند،
    • یک نوع جدید nullptr_t و یک ثابت nullptr برای تعریف نشانگرهای تهی که می توانند به هر نوع اشاره گر تبدیل شوند و گونه ای از NULL را نشان دهند که به انواع عدد صحیح و void* محدود نمی شود.
    • در حالت C2x فراخوانی ماکرو va_start با تعداد متغیر آرگومان (variadic) مجاز است.
  • در حالت‌های انطباق C99، C11 و C17، گزینه‌های پیش‌فرض "-Wimplicit-function-declaration" و "-Wimplicit-int" اکنون به جای اخطار یک خطا ایجاد می‌کنند.
  • استفاده غیرمستقیم از "void *" (به عنوان مثال "void func(void *p) { *p; }") در حالت C++ اکنون خطایی مشابه ISO C++، GCC، ICC و MSVC ایجاد می‌کند.
  • مشخص کردن فیلدهای بیتی به عنوان عملوندهای دستورالعمل (به عنوان مثال "__asm ​​{ mov eax, s.bf }") در بلوک های اسمبلی درون خطی مایکروسافت اکنون یک خطا ایجاد می کند.
  • اضافه شده تشخیص برای حضور ساختارها و اتحادیه های مختلف با نام های مشابه در ماژول های مختلف.
  • قابلیت های مرتبط با پشتیبانی OpenCL و OpenMP گسترش یافته است. تشخیص بهبود یافته برای الگوهای C++ مورد استفاده در آرگومان های هسته OpenCL. پشتیبانی از بلوک صف بهبود یافته برای AMDGPU. ویژگی nounwind به طور ضمنی به همه توابع اضافه می شود. پشتیبانی بهبود یافته از توابع داخلی.
  • قابلیت استفاده از متغیر محیطی CLANG_CRASH_DIAGNOSTICS_DIR برای تعریف دایرکتوری که داده‌های تشخیص خرابی در آن ذخیره می‌شود، اضافه شد.
  • پشتیبانی یونیکد به مشخصات یونیکد 15.0 به روز شده است. برخی از نمادهای ریاضی در شناسه‌ها مجاز هستند، مانند "₊" (به عنوان مثال "xₖ₊XNUMX").
  • پشتیبانی برای بارگیری چندین فایل پیکربندی اضافه شده است (فایل های پیکربندی پیش فرض ابتدا بارگذاری می شوند، و سپس آنهایی که از طریق پرچم "--config=" مشخص شده اند، که اکنون می توانند چندین بار مشخص شوند بارگیری می شوند). ترتیب بارگذاری پیش‌فرض فایل‌های پیکربندی را تغییر داد: clang ابتدا سعی می‌کند فایل را بارگیری کند - cfg.، و اگر پیدا نشد سعی می کند دو فایل را بارگذاری کند .cfg و cfg. برای غیرفعال کردن بارگیری فایل های پیکربندی به طور پیش فرض، پرچم "--no-default-config" اضافه شده است.
  • برای اطمینان از ساخت‌های قابل تکرار، می‌توان مقادیر تاریخ و زمان فعلی را در ماکروهای __DATE__، __TIME__ و __TIMESTAMP__ با زمان مشخص‌شده در متغیر محیطی SOURCE_DATE_EPOCH جایگزین کرد.
  • برای بررسی وجود توابع داخلی (builtin) که می توانند در زمینه ثابت ها استفاده شوند، ماکرو "__has_constexpr_builtin" اضافه شده است.
  • پرچم تلفیقی جدید "-fcoro-aligned-allocation" برای تخصیص قاب کوروتین تراز شده اضافه شد.
  • پرچم "-fstrict-flex-arrays=" پشتیبانی از سطح سوم تأیید عناصر آرایه انعطاف پذیر در ساختارها را اجرا می کند (اعضای آرایه انعطاف پذیر، آرایه ای با اندازه نامحدود در انتهای ساختار). در سطح سوم، فقط اندازه "[]" (به عنوان مثال، "int b[]") به عنوان یک آرایه انعطاف پذیر در نظر گرفته می شود، اما اندازه "[0]" (برای مثال، "int b[0]") نیست.
  • پرچم "-fmodule-output" برای فعال کردن مدل کامپایل تک فاز برای ماژول های استاندارد C++ اضافه شد.
  • حالت "-Rpass-analysis=stack-frame-layout" برای کمک به تشخیص مشکلات طرح بندی قاب پشته اضافه شده است.
  • یک ویژگی جدید __attribute__((target_version("cpu_features"))) اضافه کرد و عملکرد ویژگی __attribute__((target_clones("cpu_features1","cpu_features2",...))) را برای انتخاب نسخه های خاصی از ویژگی های ارائه شده توسط AArch64 گسترش داد. CPU ها
  • ابزارهای تشخیصی گسترش یافته است:
    • اخطار "-Wsingle-bit-bitfield-constant-conversion" اضافه شد تا هنگام تخصیص یک به یک فیلد بیتی امضا شده تک بیت، برش ضمنی را تشخیص دهد.
    • تشخيص متغيرهاي constexpr بدون مقداردهي اوليه گسترش يافته است.
    • هشدارهای "-Wcast-function-type-strict" و "-Wincompatible-function-pointer-types-strict" برای شناسایی مشکلات احتمالی در ریخته گری نوع عملکرد اضافه شده است.
    • عیب‌یابی برای استفاده از نام‌های ماژول نادرست یا رزرو شده در بلوک‌های صادراتی اضافه شده است.
    • تشخیص بهبود یافته کلمات کلیدی «خودکار» در تعاریف.
    • اجرای هشدار "-Winteger-overflow" بررسی هایی را برای موقعیت های اضافی که منجر به سرریز می شود اضافه کرده است.
  • پشتیبانی پیاده‌سازی شده برای معماری مجموعه دستورالعمل LoongArch (-march=loongarch64 یا -march=la464)، مورد استفاده در پردازنده‌های Loongson 3 5000 و پیاده‌سازی RISC ISA جدید، مشابه MIPS و RISC-V.

نوآوری های کلیدی در LLVM 16.0:

  • کد LLVM مجاز به استفاده از عناصر تعریف شده در استاندارد C++17 است.
  • الزامات محیطی برای ساخت LLVM افزایش یافته است. ابزارهای ساخت اکنون باید از استاندارد C++17 پشتیبانی کنند، یعنی. برای ساخت، به حداقل GCC 7.1، Clang 5.0، Apple Clang 10.0 یا Visual Studio 2019 16.7 نیاز دارید.
  • پشتیبان معماری AArch64 پشتیبانی از پردازنده‌های Cortex-A715، Cortex-X3 و Neoverse V2، اسمبلر برای RME MEC (زمینه‌های رمزگذاری حافظه)، پسوندهای Armv8.3 (شماره پیچیده) و Function Multi Versioning را اضافه می‌کند.
  • در باطن معماری ARM، پشتیبانی از پلتفرم های هدف Armv2، Armv2A، Armv3 و Armv3M متوقف شده است، که تولید کد صحیح برای آنها تضمین نشده است. اضافه شدن قابلیت تولید کد برای دستورالعمل های کار با اعداد مختلط.
  • پشتیبان معماری X86 پشتیبانی از معماری های مجموعه دستورالعمل (ISAs) AMX-FP16، CMPCCXADD، AVX-IFMA، AVX-VNNI-INT8، AVX-NE-CONVERT را اضافه کرده است. پشتیبانی از دستورالعمل های RDMSRLIST، RMSRLIST و WRMSRNS اضافه شده است. گزینه های پیاده سازی شده "-mcpu=raptorlake"، "-mcpu=meteorlake"، "-mcpu=emeraldrapids"، "-mcpu=sierraforest"، "-mcpu=graniterapids" و "-mcpu=grandridge".
  • پشتیبانی رسمی برای پلتفرم LoongArch اضافه شد.
  • پشتیبان‌های بهبود یافته برای معماری‌های MIPS، PowerPC و RISC-V
  • پشتیبانی از اشکال زدایی فایل های اجرایی 64 بیتی برای معماری LoongArch به دیباگر LLDB اضافه شده است. مدیریت بهتر نمادهای اشکال زدایی COFF. فیلتر کردن DLL های تکراری در لیست ماژول های ویندوز بارگذاری شده ارائه شده است.
  • در کتابخانه Libc++، کار اصلی بر اجرای پشتیبانی از ویژگی‌های جدید استانداردهای C++20 و C++23 متمرکز بود.
  • پیوند دهنده LDD با موازی کردن عملیات اسکن جابجایی آدرس و عملیات اولیه سازی بخش، زمان پیوند را به طور قابل توجهی کاهش می دهد. اضافه شدن پشتیبانی برای فشرده سازی بخش با استفاده از الگوریتم ZSTD.

منبع: opennet.ru

اضافه کردن نظر