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

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

تتضمن الميزات الجديدة لـ LLVM 9.0 إزالة علامة التصميم التجريبي من منصة RISC-V المستهدفة، ودعم C++ لـ OpenCL، والقدرة على تقسيم البرنامج إلى أجزاء محملة ديناميكيًا في LLD، وتنفيذ "اسم غوتو"، المستخدم في كود Linux kernel. أضاف libc++ دعمًا لـ WASI (واجهة نظام WebAssembly)، وأضاف LLD دعمًا أوليًا للارتباط الديناميكي WebAssembly.

تحسينات في كلانج 9.0:

  • أضيفت بواسطة تنفيذ التعبير الخاص بدول مجلس التعاون الخليجي "اسم غوتو"، والذي يسمح لك بالانتقال من كتلة مضمنة للمجمع إلى تسمية في كود C. هذه الميزة مطلوبة لبناء نواة Linux في الوضع "CONFIG_JUMP_LABEL=y" باستخدام Clang على الأنظمة ذات البنية x86_64. مع الأخذ في الاعتبار التغييرات التي تمت إضافتها في الإصدارات السابقة، يمكن الآن إنشاء نواة Linux في Clang للبنية x86_64 (كان يتم دعم البنية في السابق فقط للهندسة المعمارية Arm وaarch64 وppc32 وppc64le وmips). علاوة على ذلك، تم بالفعل تحويل مشاريع Android وChromeOS لاستخدام Clang لبناء النواة، وتقوم Google باختبار Clang كمنصة رئيسية لبناء النواة لأنظمة Linux الإنتاجية الخاصة بها. في المستقبل، يمكن استخدام مكونات LLVM أخرى في عملية بناء kernel، بما في ذلك 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(allocator)" وإنشاء معلومات تصحيح الأخطاء المصاحبة التي تسمح لك بمراقبة استهلاك الذاكرة في بيئة Visual Studio؛
  • بالنسبة للغة 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-werror" للتعامل مع التحذيرات كأخطاء.
    تمت إضافة أوضاع التحقق الجديدة:

    • Security.insecureAPI.DeprecatedOrUnsafeBufferHandling لتحديد الممارسات غير الآمنة للعمل مع المخازن المؤقتة؛
    • osx.MIGChecker للبحث عن انتهاكات قواعد استدعاء MIG (Mach Interface Generator)؛
    • optin.osx.OSObjectCStyleCast للعثور على تحويلات كائنات XNU libkern غير الصحيحة؛
    • apiModeling.llvm مع مجموعة من وظائف فحص النمذجة لاكتشاف الأخطاء في قاعدة تعليمات LLVM؛
    • كود ثابت للتحقق من كائنات C++ غير المهيأة (UninitializedObject في الحزمة optin.cplusplus)؛
  • أضافت الأداة المساعدة clang-format دعمًا لتنسيق التعليمات البرمجية في لغة C# وتوفر الدعم لنمط تنسيق التعليمات البرمجية الذي تستخدمه Microsoft؛
  • clang-cl، وهي واجهة سطر أوامر بديلة توفر توافقًا على مستوى الخيارات مع برنامج التحويل البرمجي cl.exe المضمن في Visual Studio، أضافت أساليب استدلالية للتعامل مع الملفات غير الموجودة كخيارات سطر أوامر وعرض التحذير المقابل (على سبيل المثال، عند تشغيل "clang-cl /diagnostic :caret /c test.cc")؛
  • تمت إضافة جزء كبير من عمليات التحقق الجديدة إلى linter clang-tidy، بما في ذلك عمليات التحقق المضافة الخاصة بواجهة برمجة تطبيقات OpenMP؛
  • موسع قدرات الخادم clangd (Clang Server)، حيث يتم تمكين وضع بناء فهرس الخلفية افتراضيًا، تمت إضافة دعم الإجراءات السياقية باستخدام التعليمات البرمجية (استرجاع متغير، وتوسيع التعريفات التلقائية والماكرو، وتحويل السلاسل التي تم تجاوزها إلى تلك التي لم يتم الهروب منها)، والقدرة على العرض تحذيرات من Clang-tidy، وتشخيصات موسعة للأخطاء في ملفات الرأس وإضافة القدرة على عرض معلومات حول التسلسل الهرمي للأنواع؛

رئيسي الابتكارات إل إل في إم 9.0:

  • تمت إضافة ميزة التقسيم التجريبية إلى رابط LLD، والتي تسمح لك بتقسيم برنامج واحد إلى عدة أجزاء، كل منها موجود في ملف ELF منفصل. تتيح لك هذه الميزة تشغيل الجزء الرئيسي من البرنامج، والذي سيقوم بتحميل المكونات الأخرى حسب الحاجة أثناء التشغيل (على سبيل المثال، يمكنك فصل عارض PDF المدمج في ملف منفصل، والذي سيتم تحميله فقط عندما يفتح المستخدم ملف PDF ملف).

    رابط LLD جلبت إلى حالة مناسبة لربط نواة Linux للهندسة المعمارية Arm32_7 وarm64 وppc64le وx86_64.
    خيارات جديدة "-" (الإخراج إلى stdout)، "-[no-]allow-shlib-undef"، "-undef-glob"، "-nmagic"، "-omagic"، "-dependent-library"، " - z ifunc-noplt" و"-z common-page-size". بالنسبة لبنية AArch64، تمت إضافة دعم لتعليمات BTI (مؤشر هدف الفرع) وPAC (رمز مصادقة المؤشر). تم تحسين دعم الأنظمة الأساسية MIPS وRISC-V وPowerPC بشكل ملحوظ. تمت إضافة الدعم الأولي للارتباط الديناميكي لـ WebAssembly؛

  • في ليبك ++ مُنفّذ الدوال ssize، std::is_constant_evaluated، std::midpoint وstd::lerp، تمت إضافة الأساليب "الأمامية" و"الخلفية" إلى std::span، تمت إضافة سمات الأنواع std::is_unbounded_array وstd::is_bounded_array ، تم توسيع القدرات القياسية: :atomic. تم إيقاف دعم الإصدار 4.9 من إصدار مجلس التعاون الخليجي (يمكن استخدامه مع الإصدار 5.1 من إصدار مجلس التعاون الخليجي والإصدارات الأحدث). تمت إضافة الدعم هل كنت (واجهة نظام WebAssembly، وهي واجهة لاستخدام WebAssembly خارج المتصفح)؛
  • تمت إضافة تحسينات جديدة. تمكين تحويل استدعاءات memcmp إلى bcmp في بعض المواقف. تم تنفيذ إغفال التحقق من النطاق لجداول الانتقال التي لا يمكن الوصول فيها إلى كتل التبديل السفلية أو عندما لا يتم استخدام التعليمات، على سبيل المثال، عند استدعاء وظائف من النوع void؛
  • تم تثبيت الواجهة الخلفية لبنية RISC-V، والتي لم تعد في وضع تجريبي وتم إنشاؤها بشكل افتراضي. يوفر دعمًا كاملاً لإنشاء التعليمات البرمجية لمتغيرات مجموعة تعليمات RV32I وRV64I مع امتدادات MAFDC؛
  • تم إجراء العديد من التحسينات على الواجهات الخلفية لبنيات X86 وAArch64 وARM وSystemZ وMIPS وAMDGPU وPowerPC. على سبيل المثال، للهندسة المعمارية
    أضاف AArch64 دعمًا لتعليمات SVE2 (Scalable Vector Extension 2) وتعليمات MTE (امتدادات وضع علامات الذاكرة)، وفي الواجهة الخلفية لـ ARM، تمت إضافة دعم لبنية Armv8.1-M وامتداد MVE (M-Profile Vector Extension). تمت إضافة دعم بنية GFX10 (Navi) إلى الواجهة الخلفية لـ AMDGPU، ويتم تمكين إمكانات استدعاء الوظائف بشكل افتراضي، ويتم تنشيط المرور المدمج DDP (البدائيات الموازية للبيانات).

  • يحتوي مصحح أخطاء LLDB الآن على تمييز الألوان للتتبعات الخلفية ودعم إضافي لأنواع debug_types DWARF4 وكتل DWARF5 debug_info؛
  • تمت إضافة دعم للكائنات والملفات القابلة للتنفيذ بتنسيق COFF إلى الأدوات المساعدة llvm-objcopy وllvm-strip.

المصدر: opennet.ru

إضافة تعليق