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

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

تغییر کلیدی در نسخه جدید گنجاندن جناح، مقدماتی برای زبان فرترن. Flang از Fortran 2018، OpenMP 4.5 و OpenACC 3.0 پشتیبانی می کند، اما توسعه پروژه هنوز کامل نشده است و قسمت جلویی محدود به تجزیه کد و بررسی صحت است. تولید کد میانی LLVM هنوز پشتیبانی نمی‌شود و برای تولید فایل‌های اجرایی، کد متعارف تولید شده و به یک کامپایلر خارجی فرترن ارسال می‌شود.

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

  • اضافه شدن قابلیت بازیابی درخت نحو انتزاعی (AST) برای کد C++ شکسته، که می تواند برای کمک به تشخیص خطاها استفاده شود و اطلاعات اضافی را در اختیار ابزارهای خارجی مانند clang-tidy و clangd قرار دهد. این ویژگی به طور پیش فرض برای کد ++C فعال است و از طریق گزینه های "-Xclang -f[no-]recovery-ast" کنترل می شود.
  • اضافه شدن حالت های تشخیصی جدید:
    • "-Wpointer-to-int-cast" گروهی از هشدارها در مورد فرستادن اشاره گرها به یک عدد صحیح int است که همه مقادیر ممکن را در خود جای نمی دهد.
    • "-Wuninitialized-const-reference" - هشدار در مورد ارسال متغیرهای بدون مقدار اولیه در پارامترهای تابعی که آرگومان های مرجع را با ویژگی "const" می پذیرند.
    • "-Wimplicit-const-int-float-conversion" - به طور پیش فرض هشدار در مورد تبدیل ضمنی یک ثابت واقعی به یک نوع عدد صحیح فعال شده است.
  • برای پلتفرم ARM، توابع C تعبیه شده در کامپایلر ارائه شده است (ذاتی، جایگزین دستورالعمل های برداری کارآمد Arm v8.1-M MVE و CDE شد. توابع موجود در فایل های هدر arm_mve.h و arm_cde.h تعریف شده اند.
  • اضافه مجموعه‌ای از انواع اعداد صحیح توسعه‌یافته _ExtInt(N) که به شما امکان می‌دهد انواعی بسازید که مضرب دو توان نیستند، که می‌توانند به طور موثر در FPGA/HLS پردازش شوند. مثلا، _ExtInt(7) یک نوع عدد صحیح متشکل از 7 بیت را تعریف می کند.
  • ماکروهای اضافه شده که پشتیبانی از توابع C داخلی را بر اساس دستورالعمل های ARM SVE (افزونه برداری مقیاس پذیر) تعریف می کنند:
    __ARM_FEATURE_SVE، __ARM_FEATURE_SVE_BF16،
    __ARM_FEATURE_SVE_MATMUL_FP32، __ARM_FEATURE_SVE_MATMUL_FP64،
    __ARM_FEATURE_SVE_MATMUL_INT8،
    __ARM_FEATURE_SVE2، __ARM_FEATURE_SVE2_AES،
    __ARM_FEATURE_SVE2_BITPERM،
    __ARM_FEATURE_SVE2_SHA3،
    __ARM_FEATURE_SVE2_SM4. به عنوان مثال، ماکرو __ARM_FEATURE_SVE هنگام تولید کد AArch64 با تنظیم گزینه خط فرمان "-march=armv8-a+sve" تعریف می شود.

  • اکنون پرچم "-O" به جای "-O1" با حالت بهینه سازی "-O2" مشخص می شود.
  • پرچم های کامپایلر جدید اضافه شد:
    • "-fstack-clash-protection" - محافظت در برابر تقاطع پشته و پشته.
    • "-ffp-exception-behavior={ignore,maytrap,strict}" - به شما امکان می دهد حالت کنترل کننده استثنا را برای اعداد ممیز شناور انتخاب کنید.
    • "-ffp-model={precise,strict,fast}" - دسترسی به یک سری گزینه های تخصصی برای اعداد ممیز شناور را ساده می کند.
    • "-fpch-codegen" و "-fpch-debuginfo" برای ایجاد یک هدر از پیش کامپایل شده (PCH) با فایل های شی جداگانه برای کد و اطلاعات اشکال زدایی.
    • "-fsanitize-coverage-allowlist" و "fsanitize-coverage-blocklist" برای بررسی لیست های سفید و سیاه تست پوشش.
    • «-mtls-size={12,24,32,48}» برای انتخاب اندازه TLS (رشته ذخیره‌سازی محلی).
    • "-menable-experimental-extension" برای فعال کردن برنامه های افزودنی آزمایشی RISC-V.
  • حالت پیش فرض برای C "-fno-common" است که امکان دسترسی کارآمدتر به متغیرهای سراسری را در برخی از پلتفرم ها فراهم می کند.
  • کش پیش فرض ماژول از /tmp به دایرکتوری ~/.cache منتقل شده است. برای لغو، می توانید از پرچم "-fmodules-cache-path=" استفاده کنید.
  • استاندارد زبان C پیش فرض از gnu11 به gnu17 به روز شده است.
  • اضافه شدن پشتیبانی اولیه برای پسوند گنو C "asm inline» برای افزودن درج های اسمبلر. برنامه افزودنی هنوز در حال تجزیه و تحلیل است، اما به هیچ وجه پردازش نشده است.
  • قابلیت های مرتبط با پشتیبانی OpenCL و CUDA گسترش یافته است. اضافه شدن پشتیبانی برای تشخیص بلوک OpenCL 2.0 و پیاده سازی ویژگی های جدید OpenMP 5.0.
  • گزینه IndentExternBlock به ابزار با فرمت clang برای تراز در بلوک های خارجی "C" و خارجی "C++" اضافه شد.
  • تحلیلگر استاتیک مدیریت سازنده های به ارث برده شده در C++ را بهبود بخشیده است. چک‌های جدید alpha.core.C11Lock و alpha.fuchsia.Lock برای بررسی قفل‌ها، alpha.security.cert.pos.34c برای تشخیص استفاده ناامن از putenv، webkit.NoUncountedMemberChecker و webkit.RefCntblBaseVirtualDtor برای تشخیص انواع غیرقابل شمارش alpha. .cplusplus .SmartPtr برای بررسی عدم ارجاع اشاره گر هوشمند تهی.
  • در لینتر صدای جرنگ مرتب اضافه بخش بزرگی از چک های جدید
  • سرور clangd caching (Clang Server) عملکرد را بهبود بخشیده و قابلیت های تشخیصی جدیدی اضافه کرده است.

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

  • سیستم ساخت به استفاده از پایتون 3 تغییر یافته است. اگر پایتون 3 در دسترس نباشد، امکان بازگشت به استفاده از پایتون 2 وجود دارد.
  • قسمت جلویی با کامپایلر برای زبان Go (llgo) از انتشار حذف شده است، که ممکن است در آینده بازسازی شود.
  • ویژگی vector-function-abi-variant به نمایش میانی (IR) اضافه شده است تا نگاشت بین توابع اسکالر و برداری را برای بردار کردن فراخوانی توصیف کند. از llvm::VectorType دو نوع برداری جداگانه وجود دارد llvm::FixedVectorType و llvm::ScalableVectorType.
  • انشعاب بر اساس مقادیر udef و ارسال مقادیر undef به توابع استاندارد کتابخانه به عنوان رفتار تعریف نشده شناخته می شود. که در
    memset/memcpy/memmove اجازه می دهد تا نشانگرهای undef را ارسال کنید، اما اگر پارامتر با اندازه صفر باشد.

  • LLJIT پشتیبانی برای انجام مقداردهی اولیه استاتیک از طریق متدهای LLJIT::initialize و LLJIT::deinitialize اضافه کرده است. امکان افزودن کتابخانه های استاتیک به JITDylib با استفاده از کلاس StaticLibraryDefinitionGenerator پیاده سازی شده است. C API برای ORCv2 (API برای ساخت کامپایلرهای JIT).
  • پشتیبانی از پردازنده های Cortex-A64، Cortex-A34، Cortex-A77 و Cortex-X78 به باطن معماری AArch1 اضافه شده است. برنامه‌های افزودنی ARMv8.2-BF16 (BFloat16) و ARMv8.6-A، از جمله RMv8.6-ECV (مجازی‌سازی شمارنده پیشرفته)، ARMv8.6-FGT (تله‌های دانه‌ریز)، ARMv8.6-AMU (مجازی‌سازی مانیتورهای فعالیت) و ARMv8.0-DGH (اشاره به جمع آوری داده ها). توانایی تولید کد برای توابع داخلی-پیوندها به دستورالعمل های برداری SVE ارائه شده است.
  • پشتیبانی از پردازنده های Cortex-M55، Cortex-A77، Cortex-A78 و Cortex-X1 برای معماری ARM به باطن اضافه شده است. برنامه های افزودنی اجرا شده است
    Armv8.6-A Matrix Multiply و RMv8.2-AA32BF16 BFloat16.

  • پشتیبانی از تولید کد برای پردازنده های POWER10 به باطن معماری PowerPC اضافه شده است. بهینه سازی حلقه گسترش یافته و پشتیبانی از ممیز شناور بهبود یافته است.
  • پشتیبان معماری RISC-V امکان پذیرش وصله هایی را می دهد که از مجموعه دستورالعمل های توسعه یافته آزمایشی که هنوز به طور رسمی تأیید نشده اند پشتیبانی می کنند.
  • Backend برای معماری AVR از دسته آزمایشی به پایدار منتقل شده است که در توزیع اولیه گنجانده شده است.
  • Backend برای معماری x86 از دستورالعمل های Intel AMX و TSXLDTRK پشتیبانی می کند. محافظت در برابر حملات اضافه شده است LVI (Load Value Injection) و همچنین یک مکانیسم عمومی Speculative Execution Side Effect Suppression را برای جلوگیری از حملات ناشی از اجرای گمانه زنی عملیات روی CPU پیاده سازی می کند.
  • در باطن معماری SystemZ، پشتیبانی از MemorySanitizer و LeakSanitizer اضافه شده است.
  • پشتیبانی از فایل هدر با ثابت های ریاضی به Libc++ اضافه شد .
  • منبسط قابلیت های پیوند دهنده LLD پشتیبانی بهبود یافته برای قالب ELF، از جمله گزینه های اضافه شده "--lto-emit-asm"، "--lto-whole-program-visibility"، "-print-archive-stats"، "-shuffle-sections"، " -thinlto- single-module، "-unique"، "-rosegment"، "-threads=N". گزینه "--time-trace" برای ذخیره ردیابی در یک فایل اضافه شده است، که سپس می توان آن را از طریق رابط chrome://tracing در کروم تجزیه و تحلیل کرد.

منبع: opennet.ru

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