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

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

كان التغيير الرئيسي في الإصدار الجديد هو تضمين شفة، الواجهة الأمامية للغة فورتران. يدعم Flang Fortran 2018 وOpenMP 4.5 وOpenACC 3.0، لكن لم يكتمل تطوير المشروع بعد وتقتصر الواجهة الأمامية على تحليل الكود والتحقق من صحته. إنشاء التعليمات البرمجية المتوسطة لـ LLVM غير مدعوم حتى الآن، ولإنشاء ملفات قابلة للتنفيذ، يتم إنشاء التعليمات البرمجية الأساسية وتمريرها إلى مترجم Fortran خارجي.

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

  • تمت إضافة القدرة على استعادة شجرة بناء الجملة المجردة (AST) للحصول على كود C++ غير صحيح، والذي يمكن استخدامه للمساعدة في تشخيص الأخطاء وتوفير معلومات إضافية للأدوات المساعدة الخارجية مثل clang-tidy و clangd. يتم تمكين الميزة افتراضيًا لكود C++ ويتم التحكم فيها عبر خيارات "-Xclang -f[no-]recovery-ast".
  • تمت إضافة أوضاع تشخيصية جديدة:
    • "-Wpointer-to-int-cast" عبارة عن مجموعة من التحذيرات حول إرسال المؤشرات إلى نوع صحيح لا يحتوي على كافة القيم الممكنة.
    • "-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.
  • تمت إضافة دعم أولي لامتداد GNU C "خط أسم» لإضافة إدراجات المجمع. تم تحليل الامتداد حتى الآن فقط، ولكن لم تتم معالجته بأي شكل من الأشكال.
  • توسيع القدرات المتعلقة بدعم 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 (Clang Server) إلى تحسين الأداء وإضافة إمكانات تشخيصية جديدة.

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

  • تم تحويل نظام البناء لاستخدام Python 3. إذا لم يكن Python 3 متاحًا، فقد تم تنفيذ القدرة على العودة إلى استخدام Python 2.
  • تم استبعاد الواجهة الأمامية المزودة بمترجم للغة Go (llgo) من الإصدار، والتي يمكن إعادة هيكلتها في المستقبل.
  • تمت إضافة سمة Vector-function-abi-variant إلى التمثيل الوسيط (IR) لوصف التعيين بين الوظائف العددية والمتجهة لتوجيه النداء. يتم فصل نوعين متجهين منفصلين llvm::FixedVectorType وllvm::ScalableVectorType عن llvm::VectorType.
  • يعتبر التفرع بناءً على قيم udef وتمرير قيم undef إلى وظائف المكتبة القياسية سلوكًا غير محدد. في
    يُسمح بتمرير مؤشرات undef من memset/memcpy/memmove، ولكن إذا كانت المعلمة ذات الحجم صفرًا.

  • أضاف LLJIT دعمًا لإجراء عمليات التهيئة الثابتة عبر أساليب LLJIT::initialize وLLJIT::deinitialize. تم تنفيذ القدرة على إضافة مكتبات ثابتة إلى JITDylib باستخدام فئة StaticLibraryDefinitionGenerator. تمت إضافة C API لـ ORCv2 (واجهة برمجة التطبيقات لبناء مترجمي JIT).
  • تمت إضافة دعم لمعالجات Cortex-A64 وCortex-A34 وCortex-A77 وCortex-X78 إلى الواجهة الخلفية لبنية AArch1. تم تنفيذ امتدادات ARMv8.2-BF16 (BFloat16) وARMv8.6-A، بما في ذلك RMv8.6-ECV (محاكاة افتراضية مضادة محسنة)، وARMv8.6-FGT (Fine Grained Traps)، وARMv8.6-AMU (المحاكاة الافتراضية لشاشات النشاط) وARMv8.0-DGH (تلميح جمع البيانات). يتم توفير القدرة على إنشاء تعليمات برمجية لوظائف الالتفاف المضمنة لتعليمات ناقل SVE.
  • تمت إضافة دعم معالجات Cortex-M55 وCortex-A77 وCortex-A78 وCortex-X1 إلى الواجهة الخلفية لبنية ARM. الامتدادات المنفذة
    Armv8.6-A مصفوفة تضاعف و RMv8.2-AA32BF16 BFloat16.

  • تمت إضافة دعم إنشاء التعليمات البرمجية لمعالجات POWER10 إلى الواجهة الخلفية لهندسة PowerPC. تحسينات الحلقة الموسعة وتحسين الدعم لعمليات الفاصلة العائمة.
  • يُسمح للواجهة الخلفية لبنية RISC-V بقبول التصحيحات التي تدعم مجموعات التعليمات الموسعة التجريبية التي لم تتم الموافقة عليها رسميًا بعد.
  • تم نقل الواجهة الخلفية لبنية AVR من الفئة التجريبية إلى الفئة المستقرة، وهي مضمنة في الحزمة الأساسية.
  • تدعم الواجهة الخلفية لبنية x86 تعليمات Intel AMX وTSXLDTRK. تمت إضافة حماية الهجوم LVI (حقن قيمة التحميل)، بالإضافة إلى آلية قمع التأثير الجانبي العامة للتنفيذ المضاربي لمنع الهجمات الناجمة عن التنفيذ المضاربي للعمليات في وحدة المعالجة المركزية.
  • تمت إضافة دعم لـ MemorySanitizer وLeakSanitizer في الواجهة الخلفية لـ SystemZ.
  • تمت إضافة دعم لملف رأس يحتوي على ثوابت رياضية إلى Libc++ .
  • موسع قدرات رابط LLD. تحسين دعم تنسيق ELF، بما في ذلك إضافة "--lto-emit-asm"، "--lto-whole-program-visibility"، "--print-archive-stats"، "--shuffle-sections"، "-- Thinlto- وحدة مفردة"، "--unique"، "--rosegment"، "--threads=N". تمت إضافة خيار "--time-trace" لحفظ التتبع في ملف، والذي يمكن بعد ذلك تحليله عبر واجهة chrome://tracing في Chrome.

المصدر: opennet.ru

إضافة تعليق