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

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

التحسينات في Clang 12.0:

  • تم تنفيذ وتمكين دعم السمات "المحتملة" و"غير المحتملة" المقترحة في معيار C++20 افتراضيًا، مما يسمح للمُحسِّن بإبلاغه باحتمالية تشغيل البنية الشرطية (على سبيل المثال، "[[من المحتمل ]] إذا (عشوائي > 0) {").
  • تمت إضافة دعم لمعالجات AMD Zen 3 (-march=znver3) وIntel Alder Lake (-march=alderlake) وIntel Sapphire Rapids (-march=sapphirerapids).
  • تمت إضافة دعم لعلامات "-march=x86-64-v[234]" لتحديد مستويات بنية x86-64 (الإصدار 2 - يغطي امتدادات SSE4.2 وSSSE3 وPOPCNT وCMPXCHG16B؛ v3 - AVX2 وMOVBE؛ v4 - AVX-512 ) .
  • تمت إضافة دعم لمعالجات Arm Cortex-A78C (cortex-a78c) وArm Cortex-R82 (cortex-r82) وArm Neoverse V1 (neoverse-v1) وArm Neoverse N2 (neoverse-n2) وFujitsu A64FX (a64fx). على سبيل المثال، لتمكين التحسينات لوحدات المعالجة المركزية Neoverse-V1، يمكنك تحديد "-mcpu=neoverse-v1".
  • بالنسبة إلى بنية AArch64، تمت إضافة إشارات المترجم الجديدة "-moutline-atomics" و"-mno-outline-atomics" لتمكين أو تعطيل وظائف مساعد التشغيل الذري، مثل "__aarch64_cas8_relax". تكتشف هذه الوظائف في وقت التشغيل ما إذا كان دعم LSE (امتدادات النظام الكبيرة) متاحًا وتستخدم تعليمات المعالج الذري المتوفرة أو ترجع إلى استخدام تعليمات LL/SC (ارتباط التحميل/التخزين المشروط) للمزامنة.
  • تمت إضافة خيار "-fbinutils-version" لتحديد الإصدار المستهدف من مجموعة binutils للتوافق مع سلوك الرابط والمجمّع الأقدم.
  • بالنسبة لملفات ELF القابلة للتنفيذ، عند تحديد علامة "-gz"، يتم تمكين ضغط معلومات تصحيح الأخطاء باستخدام مكتبة zlib افتراضيًا (gz=zlib). يتطلب ربط ملفات الكائنات الناتجة lld أو GNU binutils 2.26+. لاستعادة التوافق مع الإصدارات الأقدم من binutils، يمكنك تحديد "-gz=zlib-gnu".
  • تتم الآن معالجة المؤشر "هذا" باستخدام عمليات التحقق غير الفارغة والقابلة للرجوع إليها (N). لإزالة السمة غير الخالية عندما تحتاج إلى استخدام قيم فارغة، يمكنك استخدام الخيار "-fdelete-null-pointer-checks".
  • على نظام التشغيل Linux، يتم تمكين وضع "-fasynchronous-unwind-tables" لبنيتي AArch64 وPowerPC لإنشاء جداول استدعاء غير قابلة للإلغاء، كما هو الحال في دول مجلس التعاون الخليجي.
  • في "#pragma clang Loop Vectorize_width" تمت إضافة القدرة على تحديد الخيارات "الثابتة" (الافتراضية) و"القابلة للتطوير" لتحديد طريقة التوجيه. يعد الوضع "القابل للتطوير"، المستقل عن طول المتجه، تجريبيًا ويمكن استخدامه على الأجهزة التي تدعم التوجيه القابل للتطوير.
  • دعم محسّن لنظام التشغيل Windows: تم إعداد التجميعات الثنائية الرسمية لنظام التشغيل Windows على أنظمة Arm64، بما في ذلك مترجم Clang ورابط LLD ومكتبات وقت تشغيل برنامج التحويل البرمجي. عند إنشاء منصات MinGW المستهدفة، تتم إضافة اللاحقة .exe، حتى عند التجميع المتبادل.
  • تم توسيع الإمكانيات المرتبطة بدعم OpenCL وOpenMP وCUDA. تمت إضافة الخيارات "-cl-std=CL3.0" و"-cl-std=CL1.0" لتحديد خيارات الماكرو لـ OpenCL 3.0 وOpenCL 1.0. تم توسيع أدوات التشخيص.
  • تمت إضافة دعم لتعليمات HRESET وUINTR وAVXVNNI المطبقة في بعض المعالجات المستندة إلى x86.
  • في أنظمة x86، يتم تمكين دعم الخيار "-mtune="، مما يتيح تحسينات معمارية دقيقة محددة بغض النظر عن قيمة "-march=".
  • قام المحلل الثابت بتحسين معالجة بعض وظائف POSIX وتحسين كبير في تحديد نتيجة العمليات الشرطية عندما تكون هناك عدة قيم رمزية في المقارنة. تمت إضافة عمليات فحص جديدة: fuchia.HandleChecker (يحدد المقابض في الهياكل)، وwebkit.UncountedLambdaCapturesChecker webkit وalpha.webkit.UncountedLocalVarsChecker (يأخذ في الاعتبار خصوصيات العمل مع المؤشرات في كود محرك WebKit).
  • في التعبيرات المستخدمة في سياق الثوابت، يتم استخدام الوظائف المضمنة __builtin_bitreverse*, __builtin_rotateleft*, __builtin_rotateright*, _mm_popcnt*, _bit_scan_forward, __bsfd, __bsfq, __bit_scan_reverse, __bsrd, __bsrq, __bswap, __bswapd, __bswap64, __ مسموح بswapq و _castf* و __rol* و __ror*.
  • تمت إضافة خيار BitFieldColonSpacing إلى الأداة المساعدة clang-format لتحديد التباعد حول المعرفات والأعمدة وتعريفات الحقول.
  • قام خادم التخزين المؤقت clangd (Clang Server) على نظام التشغيل Linux بتقليل استهلاك الذاكرة بشكل كبير أثناء التشغيل طويل المدى (يتم توفير مكالمات دورية إلى malloc_trim لإرجاع صفحات الذاكرة المجانية إلى نظام التشغيل).

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

  • تم إيقاف دعم أداة البناء llvm-build المكتوبة بلغة Python، وبدلاً من ذلك تحول المشروع بالكامل إلى استخدام نظام البناء CMake.
  • في الواجهة الخلفية لبنية AArch64، تم تحسين دعم نظام Windows الأساسي: تم ضمان الجيل الصحيح لمخرجات المجمع لأنظمة Windows المستهدفة، وتم تحسين إنشاء البيانات على مكالمات الاسترخاء (تم تقليل حجم هذه البيانات بمقدار 60 %))، تمت إضافة القدرة على إنشاء بيانات استرخاء باستخدام توجيهات المجمّع .seh_*.
  • تتميز الواجهة الخلفية لبنية PowerPC بتحسينات جديدة للحلقات والنشر المضمن ودعم موسع لمعالجات Power10 ودعم إضافي لتعليمات MMA لمعالجة المصفوفات ودعم محسّن لنظام التشغيل AIX.
  • تضيف الواجهة الخلفية x86 دعمًا لمعالجات AMD Zen 3 وIntel Alder Lake وIntel Sapphire Rapids، بالإضافة إلى تعليمات المعالج HRESET وUINTR وAVXVNNI. دعم MPX (امتدادات حماية الذاكرة) للتحقق من المؤشرات للتأكد من أن حدود الذاكرة لم تعد مدعومة (هذه التقنية ليست منتشرة على نطاق واسع وقد تمت إزالتها بالفعل من دول مجلس التعاون الخليجي و clang). تمت إضافة دعم إلى المجمّع للبادئات {disp32} و{disp8} واللاحقات .d32 و.d8 للتحكم في حجم إزاحات المعامل والقفزات. تمت إضافة سمة جديدة "tune-cpu" للتحكم في تضمين التحسينات المعمارية الدقيقة.
  • تمت إضافة وضع جديد "-fsanitize=unsigned-shift-base" إلى كاشف مشكلة الأعداد الصحيحة (مطهر الأعداد الصحيحة، "-fsanitize=integer") للكشف عن الفائض من الأعداد الصحيحة غير الموقعة بعد تحول قليل إلى اليسار.
  • في العديد من أجهزة الكشف (asan، cfi، lsan، msan، tsan، ubsan sanitizer) تمت إضافة دعم لتوزيعات Linux مع مكتبة Musl القياسية.
  • تم توسيع قدرات رابط LLD. تحسين الدعم لتنسيق ELF، بما في ذلك الخيارات المضافة "--dependency-file"، و"-error-handling-script"، و"-lto-pseudo-probe-for-profiling"، و"-no-lto-whole-program" -الرؤية"" تحسين دعم MinGW. بالنسبة لتنسيق Mach-O (macOS)، تم تنفيذ دعم بنيات Arm64 وarm وi386 وتحسينات وقت الارتباط (LTO) وتفكيك المكدس لمعالجة الاستثناءات.
  • تطبق Libc++ ميزات جديدة لمعيار C++20 وبدأت في تطوير ميزات مواصفات C++2b. تمت إضافة دعم للإنشاء مع تعطيل دعم الترجمة ("-DLIBCXX_ENABLE_LOCALIZATION=OFF") وأجهزة لإنشاء أرقام عشوائية زائفة ("-DLIBCXX_ENABLE_RANDOM_DEVICE=OFF").

المصدر: opennet.ru

إضافة تعليق