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

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

تتضمن الميزات الجديدة في LLVM 10.0 دعمًا لمفاهيم C++، ولم تعد تقوم بتشغيل Clang كعملية منفصلة، ​​ودعم عمليات التحقق من CFG (مراقبة تدفق التحكم) لنظام التشغيل Windows، ودعم قدرات وحدة المعالجة المركزية الجديدة.

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

  • تمت إضافة الدعم لـ "المفهوم"، وهو امتداد قالب C++ الذي سيتم تضمينه في المعيار التالي، الذي يحمل الاسم الرمزي C++2a (ممكن بواسطة العلامة -std=c++2a).
    تتيح لك المفاهيم تحديد مجموعة من متطلبات معلمات القالب التي، في وقت الترجمة، تحد من مجموعة الوسائط التي يمكن قبولها كمعلمات قالب. يمكن استخدام المفاهيم لتجنب التناقضات المنطقية بين خصائص أنواع البيانات المستخدمة داخل القالب وخصائص نوع البيانات لمعلمات الإدخال.

    نموذج
    مفهوم المساواة القابلة للمقارنة = يتطلب (T a، T b) {
    { أ == ب } -> std::boolean;
    { أ != ب } -> 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" - يحذر من الفئات التي لم يتم وضع علامة عليها بالمحدد "النهائي"، ولكن تحتوي على أداة إتلاف بالسمة "النهائية".
    • "-Wtautological-bitwise-compare" عبارة عن مجموعة من التحذيرات لتشخيص المقارنات الحشوية بين عملية bitwise وثابت، ولتحديد المقارنات الحقيقية دائمًا التي يتم فيها تطبيق عملية bitwise OR على رقم غير سالب.
    • يحذر "-Wbitwise-conditional-parentheses" من حدوث مشكلات عند خلط العوامل المنطقية AND (&) وOR (|) مع العامل الشرطي (؟:).
    • "-Wmisleading-indentation" هو نظير للتحقق الذي يحمل نفس الاسم من دول مجلس التعاون الخليجي، والذي يحذر من التعبيرات ذات المسافة البادئة كما لو كانت جزءًا من كتلة if/else/for/while، ولكنها في الواقع غير مدرجة في هذه الكتلة .
    • عند تحديد "-Wextra"، يتم تمكين فحص "-Wdeprecated-copy"، للتحذير من استخدام المنشئات
      "نقل" و"نسخ" في الفئات ذات تعريف مدمر واضح.

    • تم توسيع عمليات التحقق من "-Wtautological-overlap-compare"، و"-Wsizeof-pointer-div"، و"-Wtautological-compare"، و"-Wrange-loop-analyse".
    • يتم تعطيل عمليات التحقق "-Wbitwise-op-parentheses" و"-Wlogic-op-parentheses" بشكل افتراضي.
  • في كود C وC++، يُسمح بعمليات المؤشر الحسابية فقط في المصفوفات. يقوم الآن مُطهر السلوك غير المحدد في وضع "-fsanitize=pointer-overflow" بالتقاط حالات مثل إضافة إزاحة غير صفرية إلى مؤشر فارغ أو إنشاء مؤشر فارغ عند طرح عدد صحيح من مؤشر غير فارغ.
  • تم تكييف وضع "-fsanitize=implicit-conversion" (مطهر التحويل الضمني) لتحديد المشكلات المتعلقة بعمليات الزيادة والنقصان للأنواع ذات حجم بت أصغر من حجم النوع "int".
  • عند تحديد بنيات الهدف x86 "-march=skylake-avx512"، و"-march=icelake-client"، و"-march=icelake-server"، و"-march=cascadelake" و"-march=cooperlake" بشكل افتراضي في المتجهات توقف الكود عن استخدام تسجيلات zmm 512 بت، باستثناء الإشارة المباشرة إليها في الكود المصدري. والسبب هو أن تردد وحدة المعالجة المركزية ينخفض ​​عند إجراء عمليات 512 بت، مما قد يؤثر سلبًا على الأداء العام. لتغيير السلوك الجديد، يتم توفير الخيار "-mprefer-vector-width=512".
  • سلوك علامة "-flax-vector-conversions" يشبه سلوك مجلس التعاون الخليجي: تحويلات بتات المتجهات الضمنية بين ناقلات الأعداد الصحيحة ومتجهات الفاصلة العائمة محظورة. ولإزالة هذا القيد، يقترح استخدام العلم
    "-flax-vector-conversions=all" وهو الإعداد الافتراضي.

  • تحسين الدعم لوحدات المعالجة المركزية MIPS من عائلة Octeon. تمت إضافة "octeon+" إلى قائمة أنواع وحدة المعالجة المركزية الصالحة.
  • عند التجميع في كود WebAssembly الوسيط، يتم استدعاء مُحسِّن Wasm-opt تلقائيًا، إذا كان متاحًا في النظام.
  • بالنسبة للأنظمة المستندة إلى بنية RISC-V، يُسمح باستخدام السجلات التي تخزن قيم الفاصلة العائمة في الكتل الشرطية للإدراجات المضمّنة للمجمّع.
  • تمت إضافة علامات مترجم جديدة: "-fgnuc-version" لتعيين قيمة الإصدار لـ "__GNUC__" ووحدات الماكرو المشابهة؛ "-fmacro-prefix-map=OLD=NEW" لاستبدال بادئة الدليل OLD بـ NEW في وحدات الماكرو مثل "__FILE__"؛ "-fpatchable-function-entry=N[,M]" لإنشاء عدد معين من تعليمات NOP قبل وبعد نقطة إدخال الوظيفة. بالنسبة إلى RISC-V
    تمت إضافة دعم للأعلام "-ffixed-xX" و"-mcmodel=medany" و"-mcmodel=medlow".

  • تمت إضافة دعم للسمة '__attribute__((target("branch-protection=...")))، والتي يشبه تأثيرها الخيار -حماية الفروع.
  • على نظام التشغيل Windows، عند تحديد علامة "-cfguard"، يتم تنفيذ استبدال عمليات التحقق من تكامل تدفق التنفيذ (Control Flow Guard) لاستدعاءات الوظائف غير المباشرة. لتعطيل استبدال الشيكات، يمكنك استخدام علامة "-cfguard-nochecks" أو معدّل "__declspec(guard(nocf))".
  • يشبه سلوك السمة gnu_inline سلوك مجلس التعاون الخليجي في الحالات التي يتم فيها استخدامها بدون الكلمة الأساسية "الخارجية".
  • تم توسيع الإمكانات المرتبطة بدعم OpenCL وCUDA. تمت إضافة دعم لميزات OpenMP 5.0 الجديدة.
  • تمت إضافة خيار قياسي إلى الأداة المساعدة clang-format، والذي يسمح لك بتحديد إصدار معيار C++ المستخدم عند تحليل التعليمات البرمجية وتنسيقها (Latest، Auto، c++03، c++11، c++14، ج ++ 17، ج ++ 20 ).
  • تمت إضافة اختبارات جديدة إلى المحلل الثابت: alpha.cplusplus.PlacementNew لتحديد ما إذا كانت هناك مساحة تخزين كافية، وfuchsia.HandleChecker للكشف عن التسريبات المتعلقة بمعالجات Fuchsia، وsecurity.insecureAPI.decodeValueOfObjCType للكشف عن تجاوزات المخزن المؤقت المحتملة عند استخدام [NSCoder decodeValueOfObjCType :في:] .
  • لقد قام Unified Behavior Sanitizer (UBSan) بتوسيع عمليات التحقق من تجاوز سعة المؤشر لالتقاط تطبيق الإزاحات غير الصفرية على مؤشرات NULL أو الإضافة الناتجة لإزاحة مؤشر NULL.
  • في لينت رنة مرتبة مضاف جزء كبير من الشيكات الجديدة.

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

  • إلى الإطار عازي تمت إضافة تحسينات ومحللات جديدة بين الإجراءات. يتم التنبؤ بحالة 19 سمة مختلفة، بما في ذلك 12 سمة و12 سمة LLVM IR و7 سمات مجردة مثل الحيوية.
  • تمت إضافة وظائف رياضية مصفوفة جديدة مدمجة في المترجم (جوهريات)، والتي يتم استبدالها بتعليمات المتجهات الفعالة أثناء التجميع.
  • تم إجراء العديد من التحسينات على الواجهات الخلفية لبنيات X86 وAArch64 وARM وSystemZ وMIPS وAMDGPU وPowerPC. تمت إضافة دعم وحدة المعالجة المركزية
    Cortex-A65، وCortex-A65AE، وNeoverse E1، وNeoverse N1. بالنسبة لـ ARMv8.1-M، تم تحسين عملية إنشاء التعليمات البرمجية (على سبيل المثال، ظهر دعم للحلقات ذات الحد الأدنى من الحمل) وتمت إضافة دعم التوجيه التلقائي باستخدام امتداد MVE. تحسين دعم وحدة المعالجة المركزية MIPS Octeon. بالنسبة إلى PowerPC، يتم تمكين توجيه الإجراءات الفرعية الرياضية باستخدام مكتبة MASSV (النظام الفرعي للتسريع الرياضي)، وتحسين إنشاء التعليمات البرمجية، وتحسين الوصول إلى الذاكرة من الحلقات. بالنسبة إلى الإصدار x86، تم تغيير التعامل مع أنواع المتجهات v2i32 وv4i16 وv2i16 وv8i8 وv4i8 وv2i8.

  • تحسين مولد التعليمات البرمجية لـ WebAssembly. تمت إضافة دعم لـ TLS (التخزين المحلي لمؤشر الترابط) وتعليمات atomic.fence. تم توسيع دعم SIMD بشكل كبير. تتمتع ملفات كائنات WebAssembly الآن بالقدرة على استخدام توقيعات الوظائف متعددة القيم.
  • يتم استخدام المحلل عند معالجة الحلقات MemorySSA، والذي يسمح لك بتحديد التبعيات بين عمليات الذاكرة المختلفة. يمكن لـ MemorySSA تقليل وقت الترجمة والتنفيذ أو يمكن استخدامها بدلاً من AliasSetTracker دون فقدان الأداء.
  • قام مصحح أخطاء LLDB بتحسين الدعم لتنسيق DWARF v5 بشكل ملحوظ. تحسين الدعم للبناء باستخدام MinGW
    وأضاف القدرة الأولية لتصحيح أخطاء الملفات التنفيذية لنظام Windows لبنيتي ARM وARM64. تمت إضافة أوصاف للخيارات المقدمة عند إكمال الإدخال تلقائيًا بالضغط على علامة التبويب.

  • موسع قدرات رابط LLD. دعم محسّن لتنسيق ELF، بما في ذلك ضمان التوافق الكامل للقوالب الشاملة مع رابط GNU، وإضافة دعم لأقسام تصحيح الأخطاء المضغوطة ".zdebug"، وإضافة خاصية PT_GNU_PROPERTY لتحديد قسم .note.gnu.property (يمكن استخدامه في المستقبل نواة لينكس)،
    تم تنفيذ أوضاع "-z Noseparate-code" و"-z Separate-code" و"-z Separate-loadable-segments". تحسين الدعم لـ MinGW وWebAssembly.

المصدر: opennet.ru

إضافة تعليق