LLVM 10.0 کمپائلر سیٹ کی ریلیز

چھ ماہ کی ترقی کے بعد پیش کیا منصوبے کی رہائی LLVM 10.0 — جی سی سی سے مطابقت رکھنے والے ٹولز (مرتب کرنے والے، آپٹیمائزرز اور کوڈ جنریٹر)، پروگراموں کو RISC جیسی ورچوئل ہدایات کے انٹرمیڈیٹ بٹ کوڈ میں مرتب کرنا (ملٹی لیول آپٹیمائزیشن سسٹم کے ساتھ نچلی سطح کی ورچوئل مشین)۔ تیار کردہ سیڈو کوڈ کو JIT کمپائلر کا استعمال کرتے ہوئے براہ راست پروگرام کے عمل کے وقت مشین ہدایات میں تبدیل کیا جا سکتا ہے۔

LLVM 10.0 میں نئی ​​خصوصیات میں C++ تصورات کے لیے سپورٹ، کلینگ کو ایک علیحدہ عمل کے طور پر نہیں چلانا، ونڈوز کے لیے CFG (کنٹرول فلو گارڈ) چیک کے لیے سپورٹ، اور نئی CPU صلاحیتوں کے لیے سپورٹ شامل ہیں۔

بہتری بجنا 10.0 میں:

  • کے لیے شامل کردہ حمایتتصور"، ایک C++ ٹیمپلیٹ ایکسٹینشن جو اگلے معیار میں شامل کیا جائے گا، کوڈ نام C++2a (-std=c++2a جھنڈے سے آن کیا گیا)۔
    تصورات آپ کو ٹیمپلیٹ پیرامیٹر کی ضروریات کے ایک سیٹ کی وضاحت کرنے کی اجازت دیتے ہیں جو، مرتب کرنے کے وقت، دلائل کے سیٹ کو محدود کرتے ہیں جنہیں ٹیمپلیٹ پیرامیٹرز کے طور پر قبول کیا جا سکتا ہے۔ تصورات کو ٹیمپلیٹ کے اندر استعمال ہونے والی ڈیٹا کی اقسام کی خصوصیات اور ان پٹ پیرامیٹرز کی ڈیٹا ٹائپ خصوصیات کے درمیان منطقی تضادات سے بچنے کے لیے استعمال کیا جا سکتا ہے۔

    سانچے
    تصور Equality Comparable = درکار ہے (T a, T b) {
    { a == b } -> std::boolean;
    { a != b } -> 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 آپریشن اور ایک مستقل کے درمیان tautological موازنہ کی تشخیص کرنے کے لیے، اور ہمیشہ صحیح موازنہ کی نشاندہی کرنے کے لیے جن میں bitwise OR آپریشن کا اطلاق غیر منفی نمبر پر ہوتا ہے۔
    • "-Wbitwise-conditional-قوسین" منطقی آپریٹرز AND (&) اور OR (|) کو مشروط آپریٹر (?:) کے ساتھ ملاتے وقت مسائل سے خبردار کرتا ہے۔
    • "-Wmisleading-Indentation" GCC سے اسی نام کے چیک کا ایک اینالاگ ہے، جو انڈینٹڈ ایکسپریشنز کے بارے میں خبردار کرتا ہے جیسے کہ وہ if/else/for/while بلاک کا حصہ ہیں، لیکن حقیقت میں وہ اس بلاک میں شامل نہیں ہیں۔ .
    • "-Wextra" کی وضاحت کرتے وقت، "-Wdeprecated-copy" چیک فعال ہوتا ہے، کنسٹرکٹرز کے استعمال کے بارے میں انتباہ
      واضح تباہ کن تعریف کے ساتھ کلاسوں میں "منتقل" اور "کاپی" کریں۔

    • "-Wtautological-overlap-compare"، "-Wsizeof-pointer-div"، "-Wtautological-compare"، "-Wrange-loop-analysis" چیکس کو بڑھا دیا گیا ہے۔
    • "-Wbitwise-op-قوسین" اور "-Wlogical-op-قوسین" چیکس بطور ڈیفالٹ غیر فعال ہیں۔
  • C اور C++ کوڈ میں، پوائنٹر ریاضی کی کارروائیوں کی صرف صفوں میں اجازت ہے۔ "-fsanitize=pointer-overflow" موڈ میں Undefined Behavior Sanitizer اب ایسے معاملات کو پکڑتا ہے جیسے کہ ایک null pointer میں نان-zero offset کو شامل کرنا یا ایک null pointer بنانا جب نان null پوائنٹر سے ایک عدد کو گھٹاتے وقت۔
  • "-fsanitize=implicit-conversion" (Implicit Conversion Sanitizer) موڈ کو "int" قسم سے تھوڑا سا سائز والی اقسام کے لیے انکریمنٹ اور ڈیکریمنٹ آپریشنز کے مسائل کی نشاندہی کرنے کے لیے موافق بنایا گیا ہے۔
  • x86 ٹارگٹ آرکیٹیکچرز کو منتخب کرتے وقت "-march=skylake-avx512"، "-march=icelake-client"، "-march=icelake-server"، "-march=cascadelake" اور "-march=cooperlake" بطور ڈیفالٹ ویکٹرائزڈ The میں کوڈ نے سورس کوڈ میں براہ راست اشارے کے علاوہ 512 بٹ zmm رجسٹروں کا استعمال بند کر دیا ہے۔ وجہ یہ ہے کہ 512 بٹ آپریشنز کرتے وقت CPU فریکوئنسی کم ہو جاتی ہے، جو مجموعی کارکردگی کو منفی طور پر متاثر کر سکتی ہے۔ نئے رویے کو تبدیل کرنے کے لیے، آپشن "-mprefer-vector-width=512" فراہم کیا گیا ہے۔
  • "-flax-vector-conversions" جھنڈے کا برتاؤ GCC سے ملتا جلتا ہے: انٹیجر اور فلوٹنگ پوائنٹ ویکٹر کے درمیان مضمر ویکٹر بٹ کی تبدیلیاں ممنوع ہیں۔ اس حد کو ختم کرنے کے لیے جھنڈے کو استعمال کرنے کی تجویز ہے۔
    "-flax-vector-conversions=all" جو ڈیفالٹ ہے۔

  • Octeon خاندان کے MIPS CPUs کے لیے بہتر سپورٹ۔ درست CPU اقسام کی فہرست میں "octeon+" کو شامل کیا گیا۔
  • WebAssembly انٹرمیڈیٹ کوڈ میں جمع کرتے وقت، اگر سسٹم میں دستیاب ہو تو wasm-opt optimizer خود بخود بلایا جاتا ہے۔
  • RISC-V فن تعمیر پر مبنی سسٹمز کے لیے، اسمبلر ان لائن انسرٹس کے مشروط بلاکس میں فلوٹنگ پوائنٹ ویلیوز کو اسٹور کرنے والے رجسٹروں کے استعمال کی اجازت ہے۔
  • نئے مرتب کرنے والے جھنڈے شامل کیے گئے: "__GNUC__" اور اسی طرح کے میکرو کے لیے ورژن ویلیو سیٹ کرنے کے لیے "-fgnuc-version"؛ "-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=..."))) انتساب کے لیے تعاون شامل کیا گیا، جس کا اثر آپشن کی طرح ہے۔ برانچ - تحفظ.
  • ونڈوز پلیٹ فارم پر، "-cfguard" پرچم کی وضاحت کرتے وقت، بالواسطہ فنکشن کالز کے لیے ایگزیکیوشن فلو انٹیگریٹی چیک (کنٹرول فلو گارڈ) کا متبادل لاگو کیا جاتا ہے۔ چیک متبادل کو غیر فعال کرنے کے لیے، آپ "-cfguard-nochecks" پرچم یا "__declspec(guard(nocf))" ترمیم کنندہ استعمال کر سکتے ہیں۔
  • gnu_inline انتساب کا برتاؤ GCC سے ملتا جلتا ہے ان صورتوں میں جہاں اسے "بیرونی" کلیدی لفظ کے بغیر استعمال کیا جاتا ہے۔
  • OpenCL اور CUDA سپورٹ سے وابستہ صلاحیتوں کو بڑھا دیا گیا ہے۔ نئی OpenMP 5.0 خصوصیات کے لیے تعاون شامل کیا گیا۔
  • کلینگ فارمیٹ یوٹیلیٹی میں ایک معیاری آپشن شامل کیا گیا ہے، جو آپ کو کوڈ کو پارس اور فارمیٹنگ کرتے وقت استعمال ہونے والے C++ معیار کے ورژن کا تعین کرنے کی اجازت دیتا ہے (تازہ ترین، آٹو، c++03، c++11، c++14، c++17، c++20)۔
  • جامد تجزیہ کار میں نئے چیک شامل کیے گئے ہیں: alpha.cplusplus.PlacementNew اس بات کا تعین کرنے کے لیے کہ آیا کافی ذخیرہ کرنے کی جگہ ہے، Fuchsia.HandleChecker Fuchsia ہینڈلرز سے متعلق لیکس کا پتہ لگانے کے لیے، security.insecureAPI.decodeValueOfObjCType کا پتہ لگانے کے لیے ممکنہ بفر اوور فلو کا استعمال کرتے وقت :پر:] .
  • Undefined Behavior Sanitizer (UBSan) نے اپنے پوائنٹر اوور فلو چیک کو بڑھا دیا ہے تاکہ NULL پوائنٹرز پر غیر صفر آفسیٹس کی درخواست یا NULL پوائنٹر آفسیٹ کے نتیجے میں اضافہ کیا جا سکے۔
  • لنٹر میں بجنا صاف شامل کیا نئے چیکوں کا ایک بڑا حصہ۔

اہم بدعات LLVM 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 ایکسٹینشن کا استعمال کرتے ہوئے آٹو ویکٹرائزیشن کے لیے سپورٹ شامل کیا گیا ہے۔ بہتر CPU MIPS Octeon سپورٹ۔ پاور پی سی کے لیے، MASSV (ریاضی ایکسلریشن سب سسٹم) لائبریری کا استعمال کرتے ہوئے ریاضی کے سب روٹینز کی ویکٹرائزیشن کو فعال کیا گیا ہے، کوڈ جنریشن کو بہتر بنایا گیا ہے، اور لوپس سے میموری تک رسائی کو بہتر بنایا گیا ہے۔ x86 کے لیے، v2i32، v4i16، v2i16، v8i8، v4i8 اور v2i8 کے ویکٹر کی اقسام کو ہینڈلنگ تبدیل کر دیا گیا ہے۔

  • WebAssembly کے لیے بہتر کوڈ جنریٹر۔ TLS (Thread-Local Storage) اور atomic.fence ہدایات کے لیے شامل کیا گیا تعاون۔ SIMD سپورٹ کو نمایاں طور پر بڑھا دیا گیا ہے۔ WebAssembly آبجیکٹ فائلوں میں اب کثیر قدر والے فنکشن دستخطوں کو استعمال کرنے کی صلاحیت ہے۔
  • تجزیہ کار لوپس پر کارروائی کرتے وقت استعمال ہوتا ہے۔ میموری ایس ایس اے، جو آپ کو مختلف میموری آپریشنز کے درمیان انحصار کی وضاحت کرنے کی اجازت دیتا ہے۔ MemorySSA تالیف اور عملدرآمد کے وقت کو کم کر سکتا ہے یا کارکردگی کے نقصان کے بغیر AliasSetTracker کے بجائے استعمال کیا جا سکتا ہے۔
  • LLDB ڈیبگر نے DWARF v5 فارمیٹ کے لیے سپورٹ کو نمایاں طور پر بہتر کیا ہے۔ MinGW کے ساتھ تعمیر کے لیے بہتر سپورٹ
    اور ARM اور ARM64 آرکیٹیکچرز کے لیے ونڈوز ایگزیکیوٹیبلز کو ڈیبگ کرنے کی ابتدائی صلاحیت شامل کی۔ ٹیب کو دبانے سے ان پٹ کو خود بخود مکمل کرتے وقت پیش کردہ اختیارات کی تفصیل شامل کی گئی۔

  • توسیع شدہ ایل ایل ڈی لنکر کی صلاحیتیں۔ ELF فارمیٹ کے لیے بہتر سپورٹ، بشمول GNU لنکر کے ساتھ گلوب ٹیمپلیٹس کی مکمل مطابقت کو یقینی بنانا، کمپریسڈ ڈیبگ سیکشن ".zdebug" کے لیے سپورٹ شامل کرنا، .note.gnu.property سیکشن کی وضاحت کے لیے PT_GNU_PROPERTY پراپرٹی شامل کرنا (مستقبل میں استعمال کیا جا سکتا ہے۔ لینکس کرنل)
    "-z noseparate-code"، "-zعلیحدہ کوڈ" اور "-zعلیحدہ-لوڈ ایبل-سیگمنٹس" کے طریقوں کو نافذ کر دیا گیا ہے۔ MinGW اور WebAssembly کے لیے بہتر سپورٹ۔

ماخذ: opennet.ru

نیا تبصرہ شامل کریں