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

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

ویژگی‌های جدید LLVM 9.0 شامل حذف تگ طراحی آزمایشی از پلتفرم RISC-V هدف، پشتیبانی از C++ از OpenCL، امکان تقسیم یک برنامه به قطعات بارگذاری شده پویا در LLD و پیاده‌سازی «asm goto"، در کد هسته لینوکس استفاده می شود. libc++ از WASI (رابط سیستم WebAssembly) و LLD پشتیبانی اولیه برای پیوند پویا WebAssembly را اضافه کرد.

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

  • اضافه اجرای عبارت خاص GCC "asm goto"، که به شما امکان می دهد از یک بلوک درون خطی اسمبلر به یک برچسب در کد C حرکت کنید. این ویژگی برای ساخت هسته لینوکس در حالت "CONFIG_JUMP_LABEL=y" با استفاده از Clang در سیستم هایی با معماری x86_64 مورد نیاز است. با در نظر گرفتن تغییرات اضافه شده در نسخه های قبلی، هسته لینوکس اکنون می تواند در Clang برای معماری x86_64 ساخته شود (قبلا فقط ساختمان برای معماری های arm، aarch64، ppc32، ppc64le و mips پشتیبانی می شد). علاوه بر این، پروژه‌های Android و ChromeOS قبلاً به استفاده از Clang برای ساخت هسته تبدیل شده‌اند و Google در حال آزمایش Clang به عنوان پلتفرم اصلی برای ساخت هسته‌ها برای سیستم‌های لینوکس تولیدی خود است. در آینده، سایر اجزای LLVM را می توان در فرآیند ساخت هسته استفاده کرد، از جمله LLD، llvm-objcopy، llvm-ar، llvm-nm، و llvm-objdump.
  • پشتیبانی آزمایشی برای استفاده از C++17 در OpenCL اضافه شد. ویژگی های خاص شامل پشتیبانی از ویژگی های فضای آدرس، مسدود کردن تبدیل فضای آدرس توسط عملگرهای ریخته گری نوع، ارائه انواع برداری مانند OpenCL برای C، وجود انواع OpenCL خاص برای تصاویر، رویدادها، کانال ها و غیره است.
  • پرچم های کامپایلر جدید "-ftime-trace" و "-ftime-trace-granularity=N" اضافه شد تا گزارشی از زمان اجرای مراحل مختلف فرانت اند (تجزیه، مقداردهی اولیه) و باطن (مراحل بهینه سازی) ایجاد کند. گزارش با فرمت json، سازگار با chrome://tracing و speedscope.app ذخیره شده است.
  • پردازش مشخص‌کننده «__declspec(تخصیص‌دهنده)» و تولید اطلاعات اشکال‌زدایی همراه که به شما امکان می‌دهد مصرف حافظه را در محیط ویژوال استودیو نظارت کنید.
  • برای زبان C، پشتیبانی از ماکرو "__FILE_NAME__" اضافه شده است، که شبیه ماکرو "__FILE__" است، اما فقط شامل نام فایل بدون مسیر کامل است.
  • ++C پشتیبانی از ویژگی‌های فضای آدرس را برای پوشش ویژگی‌های مختلف C++، از جمله الگوهای پارامتر و آرگومان، انواع مرجع، استنتاج نوع برگشتی، اشیاء، توابع تولید خودکار، عملگرهای داخلی و غیره گسترش داده است.
  • قابلیت های مرتبط با پشتیبانی از OpenCL، OpenMP و CUDA گسترش یافته است. این شامل پشتیبانی اولیه برای گنجاندن ضمنی توابع داخلی OpenCL است (پرچم -fdeclare-opencl-builtins اضافه شده است)، پسوند cl_arm_integer_dot_product پیاده‌سازی شده است، و ابزارهای تشخیصی گسترش یافته‌اند.
  • کار تجزیه و تحلیل استاتیک بهبود یافته است و مستندات مربوط به انجام تجزیه و تحلیل استاتیک اضافه شده است. پرچم‌ها برای نمایش ماژول‌های جستجوگر موجود و گزینه‌های پشتیبانی شده ("-analyzer-checker[-option]-help"، "-analyzer-checker[-option]-help-alpha" و "-analyzer-checker[-option] -help اضافه شده است. "-توسعه دهنده"). پرچم "-analyzer-error" اضافه شد تا هشدارها را به عنوان خطا در نظر بگیرد.
    اضافه شدن حالت های تأیید جدید:

    • security.insecureAPI.DeprecatedOrUnsafeBufferHandling برای شناسایی شیوه های ناامن برای کار با بافرها.
    • osx.MIGChecker برای جستجوی نقض قوانین تماس MIG (Mach Interface Generator).
    • optin.osx.OSObjectCStyleCast برای یافتن تبدیل های نادرست شی libkern XNU.
    • apiModeling.llvm با مجموعه ای از توابع بررسی مدل سازی برای تشخیص خطاها در پایگاه کد LLVM.
    • کد تثبیت شده برای بررسی اشیاء C++ غیر اولیه (UninitializedObject در بسته optin.cplusplus).
  • ابزار clang-format پشتیبانی از قالب‌بندی کد در زبان سی شارپ را اضافه کرده است و از سبک قالب‌بندی کد مورد استفاده مایکروسافت پشتیبانی می‌کند.
  • clang-cl، یک رابط خط فرمان جایگزین که سازگاری در سطح گزینه را با کامپایلر cl.exe موجود در ویژوال استودیو فراهم می‌کند، اکتشافی‌هایی را برای درمان فایل‌های موجود به عنوان گزینه‌های خط فرمان و نمایش یک هشدار مربوطه اضافه کرده است (به عنوان مثال، هنگام اجرای "clang-cl /diagnostic:caret /c test.cc")؛
  • بخش بزرگی از چک‌های جدید، از جمله چک‌های اضافه شده مخصوص OpenMP API، به linter clang-tidy اضافه شده است.
  • منبسط قابلیت های سرور به هم خورد (Clang Server)، که در آن حالت ساختمان نمایه پس زمینه به طور پیش فرض فعال است، پشتیبانی از اقدامات متنی با کد اضافه شده است (بازیابی متغیر، گسترش تعاریف خودکار و ماکرو، تبدیل رشته های فرار به رشته های بدون فرار)، امکان نمایش هشدارهایی از Clang-tidy، تشخیص خطاها در فایل‌های هدر و امکان نمایش اطلاعات در مورد سلسله مراتب نوع را اضافه کرد.

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

  • یک ویژگی پارتیشن بندی آزمایشی به لینکر LLD اضافه شده است که به شما امکان می دهد یک برنامه را به چند قسمت تقسیم کنید که هر کدام در یک فایل ELF جداگانه قرار دارند. این ویژگی به شما امکان می دهد بخش اصلی برنامه را اجرا کنید، که در حین کار، اجزای دیگر را در صورت نیاز بارگذاری می کند (به عنوان مثال، می توانید نمایشگر PDF داخلی را در یک فایل جداگانه جدا کنید، که فقط زمانی بارگیری می شود که کاربر PDF را باز کند. فایل).

    پیوند دهنده LLD آورده شده به حالتی مناسب برای پیوند هسته لینوکس برای معماری های arm32_7، arm64، ppc64le و x86_64.
    گزینه های جدید "-" (خروجی به stdout)، "-[no-]allow-shlib-undefined"، "-undefined-glob"، "-nmagic"، "-omagic"، "-dependent-library"، "- z ifunc-noplt" و "-z common-page-size". برای معماری AArch64، پشتیبانی از دستورالعمل های BTI (شاخص هدف شاخه) و PAC (کد احراز هویت اشاره گر) اضافه شده است. پشتیبانی از پلتفرم های MIPS، RISC-V و PowerPC به طور قابل توجهی بهبود یافته است. پشتیبانی اولیه برای پیوند پویا برای WebAssembly اضافه شد.

  • در libc++ اجرا شد توابع ssize، std::is_constant_evaluated، std::midpoint و std::lerp، متدهای "front" و "back" به std::span، ویژگی های انواع std::is_unbounded_array و std::is_bounded_array اضافه شده اند. ، قابلیت های std گسترش یافته است: :atomic. پشتیبانی از GCC 4.9 متوقف شده است (می توان با GCC 5.1 و نسخه های جدیدتر استفاده کرد). پشتیبانی اضافه شد آیا من بودم (واسط سیستم WebAssembly، رابطی برای استفاده از WebAssembly در خارج از مرورگر).
  • بهینه سازی های جدید اضافه شده است. در برخی شرایط تبدیل تماس‌های memcmp به bcmp فعال شده است. حذف پیاده‌سازی بررسی محدوده برای جداول پرش که بلوک‌های سوئیچ پایینی غیرقابل دسترسی هستند یا زمانی که دستورالعمل‌ها استفاده نمی‌شوند، برای مثال، هنگام فراخوانی توابع با نوع void.
  • Backend برای معماری RISC-V تثبیت شده است، که دیگر به عنوان آزمایشی قرار نمی گیرد و به طور پیش فرض ساخته شده است. پشتیبانی کامل از تولید کد را برای انواع مجموعه دستورالعمل RV32I و RV64I با پسوندهای MAFDC ارائه می دهد.
  • برای معماری های X86، AArch64، ARM، SystemZ، MIPS، AMDGPU و PowerPC، پیشرفت های زیادی در backend صورت گرفته است. مثلا برای معماری
    AArch64 از دستورالعمل‌های SVE2 (افزودن بردار مقیاس‌پذیر 2) و MTE (برنامه‌های افزودنی برچسب‌گذاری حافظه) پشتیبانی می‌کند؛ در باطن ARM، پشتیبانی از معماری Armv8.1-M و پسوند MVE (افزونه M-Profile Vector) اضافه شده است. پشتیبانی از معماری GFX10 (Navi) به باطن AMDGPU اضافه شده است، قابلیت فراخوانی تابع به طور پیش‌فرض فعال است و یک پاس ترکیبی فعال می‌شود. DPP (Data-Parallel Primitives).

  • اشکال‌زدای LLDB اکنون دارای برجسته‌سازی رنگی برای بک‌ترس‌ها و پشتیبانی اضافه‌شده برای بلوک‌های DWARF4 debug_types و DWARF5 debug_info است.
  • پشتیبانی از شی و فایل های اجرایی با فرمت COFF به ابزارهای llvm-objcopy و llvm-strip اضافه شده است.

منبع: opennet.ru

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