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

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

ویژگی‌های جدید LLVM 10.0 شامل پشتیبانی از C++ Concepts، دیگر اجرای Clang به‌عنوان یک فرآیند جداگانه، پشتیبانی از بررسی‌های CFG (Control flow guard) برای ویندوز و پشتیبانی از قابلیت‌های جدید CPU است.

پیشرفت ها در Clang 10.0:

  • پشتیبانی اضافه شده برای "مفاهیم"، یک پسوند قالب C++ است که در استاندارد بعدی با کد C++2a (با پرچم -std=c++2a روشن می‌شود) گنجانده خواهد شد.
    مفاهیم به شما امکان می دهد مجموعه ای از الزامات پارامتر الگو را تعریف کنید که در زمان کامپایل، مجموعه ای از آرگومان هایی را که می توان به عنوان پارامترهای الگو پذیرفت، محدود کرد. این مفاهیم را می توان برای جلوگیری از تناقضات منطقی بین خصوصیات انواع داده های مورد استفاده در قالب و ویژگی های نوع داده پارامترهای ورودی استفاده کرد.

    قالب
    مفهوم EqualityComparable = نیازمند (T a, T b) {
    { a == b } -> std::boolean;
    { a != b } -> std::boolean;
    };

  • به طور پیش فرض، راه اندازی یک فرآیند جداگانه ("clang -cc1") که در آن کامپایل انجام می شود متوقف می شود. هم اکنون کامپایل در فرآیند اصلی انجام می شود و می توان از گزینه "-fno-integrated-cc1" برای بازیابی رفتار قدیمی استفاده کرد.
  • حالت های تشخیصی جدید:
    • "-Wc99-designator" و "-Wreorder-init-list" نسبت به استفاده از مقداردهی اولیه C99 در حالت C++ در مواردی که در C99 صحیح هستند اما در C++20 صحیح نیستند هشدار می دهند.
    • "-Wsizeof-array-div" - موقعیت هایی مانند "int arr[10] را می گیرد. …sizeof(arr) / sizeof(short)…” (باید “sizeof(arr) / sizeof(int)” باشد).
    • "-Wxor-used-as-po" - در مورد استفاده از ساختارهایی مانند استفاده از عملگر "^" (xor) در عملیاتی که می تواند با قدرت (2^16) اشتباه گرفته شود، هشدار می دهد.
    • "-Wfinal-dtor-non-final-class" - در مورد کلاس هایی که با مشخص کننده "final" علامت گذاری نشده اند، اما دارای یک تخریب کننده با ویژگی "final" هستند هشدار می دهد.
    • "-Wtautological-bitwise-compare" گروهی از هشدارها برای تشخیص مقایسه‌های توتولوژیک بین یک عملیات بیتی و یک ثابت، و برای شناسایی مقایسه‌های همیشه درست است که در آن عملیات OR بیتی به یک عدد غیر منفی اعمال می‌شود.
    • "-Wbitwise-conditional-Prantheses" در مورد مشکلات هنگام مخلوط کردن عملگرهای منطقی AND (&) و OR (|) با عملگر شرطی (?:) هشدار می دهد.
    • "-Wmisleading-indentation" یک آنالوگ چک با همین نام از GCC است که در مورد عبارات تورفتگی هشدار می دهد که انگار بخشی از یک بلوک if/else/for/while هستند، اما در واقع در این بلوک گنجانده نشده اند. .
    • هنگام تعیین "-Wextra"، تیک "-Wdeprecated-copy" فعال می شود و در مورد استفاده از سازنده ها هشدار می دهد.
      "حرکت" و "کپی" در کلاس هایی با تعریف واضح تخریب کننده.

    • بررسی‌های «-Wtautological-overlap-compare»، «-Wsizeof-pointer-div»، «-Wtautological-compare»، «-Wrange-loop-analysis» گسترش یافته‌اند.
    • چک های "-Wbitwise-op-parentheses" و "-Wlogical-op-parentheses" به طور پیش فرض غیرفعال هستند.
  • در کدهای C و C++، عملیات حسابی اشاره گر فقط در آرایه ها مجاز است. پاک کننده رفتار تعریف نشده در حالت "-fsanitize=pointer-overflow" اکنون مواردی مانند اضافه کردن یک افست غیر صفر به یک نشانگر تهی یا ایجاد یک نشانگر تهی هنگام کم کردن یک عدد صحیح از یک اشاره گر غیر تهی را می گیرد.
  • حالت "-fsanitize=Implicit-Conversion" (Implicit Conversion Sanitizer) برای شناسایی مشکلات مربوط به عملیات افزایش و کاهش برای انواع با اندازه کمی کوچکتر از نوع "int" تطبیق داده شده است.
  • هنگام انتخاب معماری های هدف x86 "-march=skylake-avx512"، "-march=icelake-client"، "-march=icelake-server"، "-march=cascadelake" و "-march=cooperlake" به طور پیش فرض در حالت برداری کد استفاده از رجیسترهای 512 بیتی zmm را متوقف کرده است، به جز نشان دادن مستقیم آنها در کد منبع. دلیل آن این است که فرکانس CPU هنگام انجام عملیات 512 بیتی کاهش می یابد که می تواند بر عملکرد کلی تأثیر منفی بگذارد. برای تغییر رفتار جدید، گزینه "-mprefer-vector-width=512" ارائه شده است.
  • رفتار پرچم "تبدیل-بردار-کتانی" مشابه GCC است: تبدیل بیت بردار ضمنی بین بردارهای عدد صحیح و ممیز شناور ممنوع است. برای رفع این محدودیت، استفاده از پرچم پیشنهاد شده است
    "-flax-vector-conversions=all" که پیش فرض است.

  • پشتیبانی بهبود یافته از CPU های MIPS خانواده Octeon. "octeon+" به لیست انواع CPU معتبر اضافه شد.
  • هنگام مونتاژ در کد میانی WebAssembly، بهینه ساز wasm-opt به طور خودکار فراخوانی می شود، در صورتی که در سیستم موجود باشد.
  • برای سیستم‌های مبتنی بر معماری RISC-V، استفاده از رجیسترهایی که مقادیر ممیز شناور را ذخیره می‌کنند در بلوک‌های شرطی درج‌های درون خطی اسمبلر مجاز است.
  • پرچم های کامپایلر جدید اضافه شد: "-fgnuc-version" برای تنظیم مقدار نسخه برای "__GNUC__" و ماکروهای مشابه. "-fmacro-prefix-map=OLD=NEW" برای جایگزینی پیشوند دایرکتوری OLD با NEW در ماکروهایی مانند "__FILE__"؛ "-fpatchable-function-entry=N[,M]" برای تولید تعداد معینی دستورالعمل NOP قبل و بعد از نقطه ورودی تابع. برای RISC-V
    پشتیبانی از پرچم های "-fixed-xX"، "-mcmodel=medany" و "-mcmodel=medlow" اضافه شده است.

  • پشتیبانی از ویژگی "__attribute__((target("branch-protection=..."))) اضافه شد که اثر آن شبیه به گزینه است. حفاظت از شاخه.
  • در پلتفرم ویندوز، هنگام تعیین پرچم "-cfguard"، جایگزینی بررسی های یکپارچگی جریان اجرا (Control Flow Guard) برای فراخوانی عملکرد غیرمستقیم اجرا می شود. برای غیرفعال کردن جایگزینی چک، می توانید از پرچم "-cfguard-nochecks" یا اصلاح کننده "__declspec(guard(nocf))" استفاده کنید.
  • رفتار ویژگی gnu_inline مشابه GCC در مواردی است که بدون کلمه کلیدی "خارجی" استفاده می شود.
  • قابلیت های مرتبط با پشتیبانی OpenCL و CUDA گسترش یافته است. پشتیبانی از ویژگی های جدید OpenMP 5.0 اضافه شده است.
  • یک گزینه استاندارد به ابزار clang-format اضافه شده است که به شما امکان می دهد نسخه استاندارد C++ مورد استفاده در هنگام تجزیه و قالب بندی کد را تعیین کنید (جدیدترین، خودکار، c++03، c++11، c++14، c++17، c++20).
  • بررسی‌های جدیدی به آنالایزر استاتیک اضافه شده است: alpha.cplusplus.PlacementNew برای تعیین اینکه آیا فضای ذخیره‌سازی کافی وجود دارد، fuchsia.HandleChecker برای شناسایی نشت‌های مربوط به کنترل‌کننده‌های Fuchsia، security.insecureAPI.decodeValueOfObjCType برای تشخیص سرریزهای احتمالی بافر در هنگام استفاده از [NSColliueder) :at:] .
  • ضدعفونی‌کننده رفتار نامشخص (UBSan) بررسی‌های سرریز اشاره‌گر خود را گسترش داده است تا اعمال انحراف‌های غیرصفر را برای نشانگرهای NULL یا اضافه کردن یک افست نشانگر NULL به دست آورد.
  • در لینتر صدای جرنگ مرتب اضافه بخش بزرگی از چک های جدید

اصلی نوآوری ها LLVM 10.0:

  • به چارچوب نسبت دهنده بهینه سازی ها و تحلیلگرهای بین رویه ای جدید اضافه شده است. وضعیت 19 ویژگی مختلف، از جمله 12 ویژگی، 12 LLVM IR و 7 ویژگی انتزاعی مانند زنده بودن، پیش‌بینی شده است.
  • اضافه شدن توابع ریاضی ماتریس جدید در کامپایلر (ذاتی) که در حین کامپایل با دستورالعمل های برداری کارآمد جایگزین می شوند.
  • برای معماری های X86، AArch64، ARM، SystemZ، MIPS، AMDGPU و PowerPC، پیشرفت های زیادی در backend صورت گرفته است. پشتیبانی از CPU اضافه شد
    Cortex-A65، Cortex-A65AE، Neoverse E1 و Neoverse N1. برای ARMv8.1-M، فرآیند تولید کد بهینه شده است (به عنوان مثال، پشتیبانی از حلقه هایی با حداقل سربار ظاهر شده است) و پشتیبانی از autovectorization با استفاده از پسوند MVE اضافه شده است. پشتیبانی از CPU MIPS Octeon بهبود یافته است. برای PowerPC، برداری از زیر روال های ریاضی با استفاده از کتابخانه MASSV (زیر سیستم شتاب ریاضی) فعال است، تولید کد بهبود می یابد، و دسترسی به حافظه از حلقه ها بهینه می شود. برای x86، مدیریت انواع بردار v2i32، v4i16، v2i16، v8i8، v4i8 و v2i8 تغییر کرده است.

  • مولد کد بهبود یافته برای WebAssembly. پشتیبانی از TLS (Thread-Local Storage) و دستورالعمل های atomic.fence اضافه شده است. پشتیبانی SIMD به طور قابل توجهی گسترش یافته است. فایل های آبجکت WebAssembly اکنون قابلیت استفاده از امضاهای تابع چند ارزشی را دارند.
  • هنگام پردازش حلقه ها از آنالیزور استفاده می شود MemorySSA، که به شما امکان می دهد وابستگی هایی را بین عملیات های مختلف حافظه تعریف کنید. MemorySSA می تواند زمان کامپایل و اجرا را کاهش دهد یا می تواند به جای AliasSetTracker بدون از دست دادن عملکرد استفاده شود.
  • دیباگر LLDB پشتیبانی قابل توجهی از فرمت DWARF v5 را بهبود بخشیده است. پشتیبانی بهبود یافته برای ساخت و ساز با MinGW
    و توانایی اولیه برای اشکال زدایی فایل های اجرایی ویندوز برای معماری های ARM و ARM64 را اضافه کرد. توضیحات گزینه‌های ارائه شده هنگام تکمیل خودکار ورودی با فشار دادن تب اضافه شد.

  • منبسط قابلیت های پیوند دهنده LLD پشتیبانی بهبودیافته از قالب ELF، از جمله اطمینان از سازگاری کامل الگوهای glob با پیوند دهنده گنو، افزودن پشتیبانی برای بخش‌های اشکال زدایی فشرده "zdebug"، افزودن ویژگی PT_GNU_PROPERTY برای تعریف بخش .note.gnu.property (در آینده قابل استفاده است. هسته های لینوکس)
    حالت‌های «-z noseparate-code»، «-z جداگانه-code» و «-z جداگانه-loadable-segments» پیاده‌سازی شده‌اند. پشتیبانی بهبود یافته برای MinGW و WebAssembly.

منبع: opennet.ru

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