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

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

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

  • معيار C++/ObjC++ الافتراضي هو gnu++17 (gnu++14 سابقًا)، مما يعني أن ميزات C++17 ذات امتدادات GNU مدعومة افتراضيًا. لإرجاع السلوك السابق، يمكنك استخدام الخيار "-std=gnu++14".
  • الميزات المتقدمة المنفذة المتعلقة بمعيار C++ 20:
    • وظائف الأعضاء الخاصة التافهة بشكل مشروط،
    • التقاط الارتباطات المنظمة في وظائف لامدا،
    • عامل المساواة داخل التعبيرات،
    • خيار لحذف الكلمة الأساسية typename في بعض السياقات،
    • تهيئة مجمعة صالحة بين قوسين ("Aggr(val1, val2)").
  • تم تنفيذ الميزات المحددة في معيار C++ 2b المستقبلي:
    • يجوز وضع التسميات في نهاية التعبيرات المركبة،
    • عامل ثابت ()،
    • عامل ثابت[]،
    • يتم ضمان التوافق مع نوع char8_t،
    • تم توسيع نطاق الأحرف المسموح باستخدامها في "\N{...}".
    • تمت إضافة القدرة على استخدام المتغيرات التي تم تعريفها على أنها "constexpr" في الوظائف التي تم تعريفها على أنها constexpr.
  • تم تنفيذ الميزات المحددة في C-standard C2x المستقبلية:
    • لتعطيل تحذير "-Wunused-label"، يُسمح بتطبيق السمة "[[maybe_unused]]" على التصنيفات
    • يُسمح بوضع التسميات في أي مكان ضمن التعبيرات المركبة،
    • تمت إضافة عوامل التشغيل typeof وtypeof_unqual،
    • نوع جديد nullptr_t وثابت nullptr لتعريف المؤشرات الفارغة التي يمكن تحويلها إلى أي نوع مؤشر وتمثل متغير NULL غير المرتبط بالأنواع الصحيحة والباطلة*.
    • في وضع C2x، يُسمح باستدعاء الماكرو va_start بعدد متغير من الوسائط (متغيرة).
  • في أوضاع التوافق C99 وC11 وC17، تنتج الآن الخيارات الافتراضية "-Wimplicit-function-declaration" و"-Wimplicit-int" خطأ بدلاً من التحذير.
  • يؤدي الاستخدام غير المباشر لـ "void *" (على سبيل المثال، "void func(void *p) { *p; }") في وضع C++ إلى إنشاء خطأ، مشابه لـ ISO C++ وGC وICC وMSVC.
  • يؤدي الآن تحديد حقول البت كمعاملات تعليمات (على سبيل المثال، "__asm ​​​​{ mov eax, s.bf }") في كتل التجميع المضمنة بنمط Microsoft إلى إنشاء خطأ.
  • تمت إضافة تشخيص لوجود هياكل واتحادات مختلفة بنفس الأسماء في وحدات مختلفة.
  • تم توسيع الإمكانيات المرتبطة بدعم OpenCL وOpenMP. تشخيصات محسنة لقوالب C++ المستخدمة في وسيطات kernel OpenCL. تحسين دعم كتلة قائمة الانتظار لـ AMDGPU. تتم إضافة السمة nonwind ضمنيًا إلى جميع الوظائف. تحسين الدعم للوظائف المضمنة.
  • تمت إضافة القدرة على استخدام متغير البيئة CLANG_CRASH_DIAGNOSTICS_DIR لتحديد الدليل الذي يتم حفظ بيانات تشخيص الأعطال فيه.
  • تم تحديث دعم Unicode إلى مواصفات Unicode 15.0. يُسمح ببعض الرموز الرياضية في المعرفات، مثل "₊" (على سبيل المثال "double xₖ₊₁").
  • تمت إضافة دعم لتحميل ملفات تكوين متعددة (يتم تحميل ملفات التكوين الافتراضية أولاً، ثم تلك المحددة عبر علامة "--config="، والتي يمكن الآن تحديدها عدة مرات). تم تغيير ترتيب التحميل الافتراضي لملفات التكوين: يحاول clang تحميل الملف أولاً - .cfg، وإذا لم يتم العثور عليه فإنه يحاول تحميل ملفين .cfg و .cfg. لتعطيل تحميل ملفات التكوين بشكل افتراضي، تمت إضافة علامة "--no-default-config".
  • لضمان الإصدارات القابلة للتكرار، من الممكن استبدال قيم التاريخ والوقت الحالية في وحدات الماكرو __DATE__ و__TIME__ و__TIMESTAMP__ بالوقت المحدد في متغير البيئة SOURCE_DATE_EPOCH.
  • للتحقق من وجود وظائف مدمجة (مدمجة) يمكن استخدامها في سياق الثوابت، تمت إضافة الماكرو "__has_constexpr_builtin".
  • تمت إضافة علامة تجميع جديدة "-fcoro-align-allocation" لتخصيص إطار coroutine المحاذي.
  • تطبق العلامة "-fstrict-flex-arrays=" دعم المستوى الثالث للتحقق من عناصر المصفوفة المرنة في الهياكل (أعضاء المصفوفة المرنة، مصفوفة ذات حجم غير محدد في نهاية البنية). في المستوى الثالث، يتم التعامل مع الحجم "[]" فقط (على سبيل المثال، "int b[]") كمصفوفة مرنة، ولكن يتم التعامل مع الحجم "[0]" (على سبيل المثال، "int b[0]") ليس.
  • تمت إضافة علامة "-fmodule-output" لتمكين نموذج التحويل البرمجي أحادي الطور لوحدات C++ القياسية.
  • تمت إضافة وضع "-Rpass-analogy=stack-frame-layout" للمساعدة في تشخيص المشكلات المتعلقة بتخطيط إطار المكدس.
  • تمت إضافة سمة جديدة __attribute__((target_version("cpu_features"))) وتوسيع وظائف السمة __attribute__((target_clones("cpu_features1"،"cpu_features2"،...)))) لتحديد إصدارات محددة من الميزات التي يوفرها AArch64 وحدات المعالجة المركزية.
  • توسيع أدوات التشخيص:
    • تمت إضافة تحذير "-Wsingle-bit-bitfield-constant-conversion" لاكتشاف الاقتطاع الضمني عند تعيين واحد لحقل بت موقّع أحادي البت.
    • تم توسيع تشخيص متغيرات constexpr غير المهيأة.
    • تمت إضافة تحذيرات "-Wcast-function-type-strict" و"-Wincompatible-function-pointer-types-strict" لتحديد المشكلات المحتملة في صب نوع الوظيفة.
    • تمت إضافة تشخيصات لاستخدام أسماء الوحدات النمطية غير الصحيحة أو المحجوزة في كتل التصدير.
    • تحسين اكتشاف الكلمات الرئيسية "التلقائية" المفقودة في التعريفات.
    • أدى تنفيذ تحذير "-Winteger-overflow" إلى إضافة عمليات فحص للمواقف الإضافية التي تؤدي إلى تجاوزات.
  • تم تنفيذ الدعم لبنية مجموعة تعليمات LoongArch (-march=loongarch64 أو -march=la464)، المستخدمة في معالجات Loongson 3 5000 وتنفيذ RISC ISA الجديد، على غرار MIPS وRISC-V.

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

  • يُسمح لكود LLVM باستخدام العناصر المحددة في معيار C++ 17.
  • تمت زيادة المتطلبات البيئية لبناء LLVM. يجب أن تدعم أدوات البناء الآن معيار C++ 17، أي. للإنشاء، تحتاج على الأقل إلى الإصدار 7.1 أو Clang 5.0 أو Apple Clang 10.0 أو Visual Studio 2019 16.7.
  • تضيف الواجهة الخلفية لبنية AArch64 دعمًا لوحدات المعالجة المركزية Cortex-A715 وCortex-X3 وNeoverse V2 ومجمع RME MEC (سياقات تشفير الذاكرة) وملحقات Armv8.3 (الرقم المعقد) وإصدار الوظائف المتعددة.
  • في الواجهة الخلفية لبنية ARM، تم إيقاف دعم الأنظمة الأساسية المستهدفة Armv2 وArmv2A وArmv3 وArmv3M، والتي لم يكن من المضمون إنشاء التعليمات البرمجية الصحيحة لها. تمت إضافة القدرة على إنشاء تعليمات برمجية لتعليمات التعامل مع الأعداد المركبة.
  • أضافت الواجهة الخلفية لبنية X86 دعمًا لبنيات مجموعة التعليمات (ISAs) AMX-FP16 وCMPCXADD وAVX-IFMA وAVX-VNNI-INT8 وAVX-NE-CONVERT. تمت إضافة دعم لتعليمات RDMSRLIST وRMSRLIST وWRMSRNS. الخيارات المنفذة "-mcpu=raptorlake"، و"-mcpu=meteorlake"، و"-mcpu=emeraldrapids"، و"-mcpu=sierraforest"، و"-mcpu=graniterapids" و"-mcpu=grandridge".
  • تمت إضافة الدعم الرسمي لمنصة LoongArch.
  • واجهات خلفية محسّنة لبنيات MIPS وPowerPC وRISC-V
  • تمت إضافة دعم لتصحيح أخطاء الملفات التنفيذية 64 بت لبنية LoongArch إلى مصحح أخطاء LLDB. تحسين التعامل مع رموز تصحيح COFF. تم توفير تصفية ملفات DLL المكررة في قائمة وحدات Windows المحملة.
  • في مكتبة Libc++، تركز العمل الرئيسي على تنفيذ الدعم للميزات الجديدة لمعايير C++20 وC++23.
  • يعمل رابط LDD على تقليل وقت الارتباط بشكل كبير عن طريق موازنة مسح نقل العنوان وعمليات تهيئة القسم. تمت إضافة دعم لضغط القسم باستخدام خوارزمية ZSTD.

المصدر: opennet.ru

إضافة تعليق