إطلاق مجموعة مترجم LLVM 15.0

بعد ستة أشهر من التطوير، تم تقديم إصدار مشروع LLVM 15.0 - وهو عبارة عن مجموعة أدوات متوافقة مع دول مجلس التعاون الخليجي (المترجمون والمحسنون ومولدو الأكواد) التي تجمع البرامج في كود بت متوسط ​​لتعليمات افتراضية تشبه RISC (جهاز افتراضي منخفض المستوى مزود بـ نظام التحسين متعدد المستويات). يمكن تحويل الكود الكاذب الذي تم إنشاؤه باستخدام مترجم JIT إلى تعليمات الجهاز مباشرة في وقت تنفيذ البرنامج.

تحسينات كبيرة في Clang 15.0:

  • بالنسبة للأنظمة المستندة إلى بنية x86، تمت إضافة علامة "-fzero-call-used-regs"، والتي تضمن إعادة تعيين جميع سجلات وحدة المعالجة المركزية المستخدمة في الوظيفة إلى الصفر قبل إعادة التحكم من الوظيفة. يتيح لك هذا الخيار الحماية من تسرب المعلومات من الوظائف وتقليل عدد الكتل المناسبة لبناء أدوات ROP (البرمجة الموجهة نحو العودة) في عمليات الاستغلال بنسبة 20% تقريبًا.
  • تم تنفيذ التوزيع العشوائي لوضع الهياكل في الذاكرة لكود C، مما يزيد من تعقيد عملية استخراج البيانات من الهياكل في حالة استغلال الثغرات الأمنية. يتم تشغيل وإيقاف التوزيع العشوائي باستخدام السمتين Randomize_layout وno_randomize_layout، ويتطلب تعيين بذرة باستخدام العلامة "-frandomize-layout-seed" أو "-frandomize-layout-seed-file".
  • تمت إضافة علامة "-fstrict-flex-arrays=" "، والتي يمكنك من خلالها التحكم في حدود عنصر المصفوفة المرنة في الهياكل (أعضاء المصفوفة المرنة، مصفوفة ذات حجم غير محدد في نهاية البنية). عند التعيين على 0 (افتراضي)، تتم دائمًا معالجة العنصر الأخير في البنية مع المصفوفة كمصفوفة مرنة، 1 - تتم معالجة الأحجام فقط [] و[0] و[1] كمصفوفة مرنة، 2 - الأحجام فقط تتم معالجة [] و [0] مثل مصفوفة مرنة.
  • تمت إضافة دعم تجريبي للغة HLSL (لغة التظليل عالية المستوى) التي تشبه C، والمستخدمة في DirectX لكتابة التظليل.
  • تمت إضافة "-Warray-parameter" للتحذير من تجاوز الوظائف بإعلانات الوسائط غير المتوافقة المرتبطة بالصفائف ذات الطول الثابت والمتغير.
  • تحسين التوافق مع MSVC. تمت إضافة دعم لـ "وظيفة #pragma" (يطلب من المترجم إنشاء استدعاء دالة بدلاً من التوسيع المضمن) و"#pragma alloc_text" (يحدد اسم القسم مع رمز الوظيفة) المقدم في MSVC. تمت إضافة دعم لأعلام /JMC و/JMC المتوافقة مع MSVC.
  • ويستمر العمل لدعم معايير C2X وC++23 المستقبلية. بالنسبة للغة C، يتم تنفيذ ما يلي: سمة noreturn، والكلمات الأساسية false وtrue، ونوع _BitInt(N) للأعداد الصحيحة بعمق بت معين، ووحدات الماكرو *_WIDTH، والبادئة u8 للأحرف المشفرة UTF-8.

    بالنسبة لـ C++، يتم تنفيذ ما يلي: دمج الوحدات، عزل ABI لأعضاء الوظائف، التهيئة الديناميكية المطلوبة للمتغيرات غير المحلية في الوحدات، عوامل تشغيل الفهرس متعددة الأبعاد، auto(x)، المتغيرات غير الحرفية، goto والتسميات في الوظائف المعلن عنها على أنها constexpr ، تسلسلات هروب محددة، تسمى أحرف الهروب.

  • تم توسيع الإمكانيات المرتبطة بدعم OpenCL وOpenMP. تمت إضافة دعم لامتداد OpenCL cl_khr_subgroup_rotate.
  • بالنسبة إلى بنية x86، تمت إضافة الحماية ضد الثغرات الأمنية في المعالجات الناتجة عن التنفيذ التخميني للتعليمات بعد عمليات القفز للأمام غير المشروطة. تحدث المشكلة بسبب المعالجة الوقائية للتعليمات التي تتبع تعليمات الفرع مباشرة في الذاكرة (SLS، تخمين الخط المستقيم). لتمكين الحماية، يُقترح الخيار "-mharden-sls=[none|all|return|indirect-jmp]".
  • بالنسبة للأنظمة الأساسية التي تدعم امتداد SSE2، تمت إضافة نوع _Float16، والذي تتم محاكاته باستخدام النوع float في حالة عدم دعم تعليمات AVX512-FP16.
  • تمت إضافة علامة "-m[no-]rdpru" للتحكم في استخدام تعليمات RDPRU، المدعومة بدءًا من معالجات AMD Zen2.
  • تمت إضافة علامة "-mfunction-return=thunk-extern" للحماية من ثغرة RETBLEED، والتي تعمل عن طريق إضافة سلسلة من التعليمات التي تستبعد مشاركة آلية التنفيذ التخميني للفروع غير المباشرة.

الابتكارات الرئيسية في LLVM 15.0:

  • تمت إضافة دعم لبنيات Cortex-M85 CPU وArmv9-A وArmv9.1-A وArmv9.2-A وملحقات Armv8.1-M PACBTI-M.
  • تمت إضافة واجهة خلفية تجريبية لـ DirectX تدعم تنسيق DXIL (لغة DirectX الوسيطة) المستخدم لتظليل DirectX. يتم تمكين الواجهة الخلفية عن طريق تحديد المعلمة "-DLLVM_EXPERIMENTAL_TARGETS_TO_BUILD=DirectX" أثناء التجميع.
  • تواصل Libc++ تنفيذ الميزات الجديدة لمعايير C++20 وC++2b، بما في ذلك الانتهاء من تنفيذ مكتبة "format" والإصدار التجريبي المقترح من مكتبة "ranges".
  • واجهات خلفية محسّنة لبنيات x86 وPowerPC وRISC-V.
  • تم تحسين قدرات رابط LLD ومصحح أخطاء LLDB.

المصدر: opennet.ru

إضافة تعليق