انتشار مجموعه کامپایلر GCC 12

پس از یک سال توسعه، مجموعه کامپایلر رایگان GCC 12.1 منتشر شد که اولین نسخه قابل توجه در شاخه جدید GCC 12.x است. مطابق با طرح شماره گذاری نسخه جدید، نسخه 12.0 در فرآیند توسعه استفاده شد و اندکی قبل از انتشار GCC 12.1، شعبه GCC 13.0 قبلاً منشعب شده بود که بر اساس آن نسخه اصلی بعدی، GCC 13.1، خواهد بود. تشکیل شود. در 23 می، این پروژه 35 سال از تشکیل اولین نسخه GCC را جشن می گیرد.

تغییرات اصلی:

  • پشتیبانی از فرمت اشکال زدایی CTF (فرمت نوع فشرده) که ذخیره سازی فشرده اطلاعات در مورد انواع C، اتصالات بین توابع و نمادهای اشکال زدایی را فراهم می کند. هنگامی که در اشیاء ELF تعبیه می شود، قالب اجازه می دهد تا از جداول کاراکتر EFL برای جلوگیری از تکرار داده ها استفاده کنید.
  • پشتیبانی از فرمت ذخیره سازی اطلاعات اشکال زدایی "STABS" که در دهه 1980 ایجاد شد، منسوخ شده است.
  • کار برای گسترش پشتیبانی از استانداردهای آینده C2X و C++23 برای زبان های C و C++ ادامه دارد. به عنوان مثال، پشتیبانی از عبارت "if consteval" اضافه شده است. مجاز به استفاده از خودکار در آرگومان های تابع ("f(auto(g()))"); استفاده از متغیرهای غیر تحت اللفظی، goto و برچسب ها در توابع اعلام شده به عنوان constexpr مجاز است. پشتیبانی اضافه شده برای عملگرهای شاخص چند بعدی[]. در if، for و switch، قابلیت های بلوک های اولیه سازی گسترش یافته است ("for (استفاده از T = int; T e: v)").
  • کتابخانه استاندارد C++ پشتیبانی از بخش های آزمایشی استانداردهای C++20 و C++23 را بهبود بخشیده است. پشتیبانی اضافه شده برای std::move_only_function، ، std::basic_string::resize_and_overwrite، ، و std::invoke_r. مجاز به استفاده از std::unique_ptr، std:: vector، std::basic_string، std::optional و std::variant در توابع constexpr.
  • Fortran frontend از مشخصات TS 29113 پشتیبانی کامل می‌کند، که قابلیت‌هایی را برای اطمینان از قابلیت حمل بین Fortran و کد C توضیح می‌دهد.
  • پشتیبانی اضافه شده برای پسوند __builtin_shufflector(vec1، vec2، index1، index2، ...) که قبلاً به Clang اضافه شده بود، که یک فراخوانی را برای انجام عملیات زدن بردار و زدن عملیات رایج ارائه می دهد.
  • هنگام استفاده از سطح بهینه سازی "-O2"، برداری به طور پیش فرض فعال است (حالت های -ftree-vectorize و -fvect-cost-model=very-cheap فعال هستند). مدل بسیار ارزان تنها در صورتی امکان برداری را می دهد که کد برداری بتواند به طور کامل جایگزین کد اسکالر در حال بردار شدن شود.
  • حالت "-ftrivial-auto-var-init" برای فعال کردن مقداردهی اولیه متغیرهای موجود در پشته برای ردیابی مسائل و مسدود کردن آسیب‌پذیری‌های مرتبط با استفاده از متغیرهای اولیه اضافه شده است.
  • برای زبان های C و C++، یک تابع داخلی __builtin_dynamic_object_size اضافه شده است تا اندازه یک شی را تعیین کند، که با یک تابع مشابه از Clang سازگار است.
  • برای زبان‌های C و C++، پشتیبانی از ویژگی «unavailable» اضافه شده است (به عنوان مثال، می‌توانید توابعی را علامت‌گذاری کنید که اگر سعی کنید از آنها استفاده کنید، خطا ایجاد می‌کنند).
  • برای زبان های C و C++، پشتیبانی از دستورالعمل های پیش پردازش "#elifdef" و "#elifndef" اضافه شده است.
  • پرچم "-Wbidi-chars" اضافه شد تا در صورت استفاده نادرست از کاراکترهای UTF-8، اخطاری نمایش داده شود و ترتیب نمایش متن دو جهته را تغییر دهد.
  • پرچم "-Warray-compare" برای نمایش هشدار هنگام تلاش برای مقایسه دو عملوند که به آرایه ها اشاره می کنند اضافه شد.
  • اجرای استانداردهای OpenMP 5.0 و 5.1 (Open Multi-Processing) که API و روش های اعمال روش های برنامه نویسی موازی را در سیستم های چند هسته ای و ترکیبی (CPU+GPU/DSP) با حافظه مشترک و واحدهای برداری (SIMD) تعریف می کند. ، ادامه داده است.
  • اجرای بهبود یافته مشخصات برنامه نویسی موازی OpenACC 2.6، که ابزارهایی را برای تخلیه عملیات بر روی GPU و پردازنده های تخصصی مانند NVIDIA PTX تعریف می کند.
  • پشتیبانی از دستورالعمل‌های توسعه‌یافته Intel AVX86-FP512 و نوع _Float16 به باطن تولید کد برای معماری x16 اضافه شده است.
  • برای معماری x86، حفاظت در برابر آسیب‌پذیری‌ها در پردازنده‌ها اضافه شده است که ناشی از اجرای گمانه‌زنی دستورالعمل‌ها پس از عملیات پرش بدون قید و شرط به جلو است. مشکل به دلیل پردازش پیشگیرانه دستورالعمل ها بلافاصله پس از دستورالعمل شاخه در حافظه (SLS، Straight Line Speculation) رخ می دهد. برای فعال کردن حفاظت، گزینه "-mharden-sls" پیشنهاد شده است.
  • تشخیص استفاده از متغیرهای اولیه به تحلیلگر استاتیک تجربی اضافه شد. پشتیبانی اولیه برای تجزیه و تحلیل کد اسمبلی در درج های درون خطی اضافه شده است. ردیابی حافظه بهبود یافته کد پردازش عبارات سوئیچ بازنویسی شده است.
  • 30 تماس جدید به libgccjit اضافه شد، یک کتابخانه مشترک برای جاسازی یک تولید کننده کد در سایر فرآیندها و استفاده از آن برای کامپایل بایت کد JIT در کد ماشین.
  • پشتیبانی از مکانیزم CO-RE (Compile Once - Run Everywhere) برای تولید بایت کد BPF به پشتیبان اضافه شده است، که به شما امکان می دهد کد برنامه های eBPF را برای هسته لینوکس تنها یک بار کامپایل کنید و از یک بارگذار جهانی ویژه استفاده کنید که سازگار با برنامه بارگذاری شده در هسته فعلی و فرمت انواع BPF). CO-RE مشکل قابل حمل بودن برنامه های کامپایل شده eBPF را حل می کند، که قبلا فقط در نسخه هسته ای که برای آن کامپایل شده بودند قابل استفاده بودند، زیرا موقعیت عناصر در ساختارهای داده از نسخه به نسخه تغییر می کند.
  • باطن RISC-V از پسوندهای معماری مجموعه دستورالعمل جدید zba، zbb، zbc و zbs و همچنین پسوندهای ISA برای عملیات رمزنگاری برداری و اسکالر پشتیبانی می‌کند. به طور پیش فرض، پشتیبانی از مشخصات RISC-V ISA 20191213 ارائه شده است. پرچم -mtune=thead-c906 برای فعال کردن بهینه سازی برای هسته های T-HEAD c906 اضافه شده است.
  • پشتیبانی از نوع __int128_t/integer(kind=16) به باطن تولید کد برای GPU های AMD بر اساس ریزمعماری GCN اضافه شده است. امکان استفاده از حداکثر 40 گروه کاری در هر واحد محاسباتی (CU) و حداکثر 16 جبهه دستورالعمل (موج، مجموعه ای از رشته ها که به صورت موازی توسط موتور SIMD اجرا می شوند) در هر گروه وجود دارد. پیش از این، تنها یک لبه دستورالعمل در هر CU مجاز بود.
  • پشتیبان NVPTX که برای تولید کد با استفاده از معماری مجموعه دستورات NVIDIA PTX (Parallel Thread Execution) طراحی شده است، توانایی استفاده از پرچم های "-مارچ"، "-mptx" و "-مارش-نقشه" را اضافه کرده است. پشتیبانی پیاده سازی شده برای PTX ISA sm_53، sm_70، sm_75 و sm_80. معماری پیش فرض sm_30 است.
  • در باطن پردازنده های PowerPC / PowerPC64 / RS6000، پیاده سازی توابع داخلی بازنویسی شده است. توابع داخلی __builtin_get_texasr, __builtin_get_texasru, __builtin_get_tfhar, __builtin_get_tfiar, __builtin_set_texasr, __builtin_set_texasru, __builtin_set_tfhar, __builtin_set_tfhar and __t.
  • پشتیبانی از Arm Ampere-64 (-mcpu/-mtune ampere1)، Arm Cortex-A1 (cortex-a510)، Arm Cortex-A510 (cortex-a710) و Arm Cortex-X710 (cortex-x2). پشتیبانی از گزینه‌های معماری جدید ARMv2 برای استفاده با گزینه "-مارچ" اضافه شده است: armv8-a، armv8.7-a، armv8.8-a. اضافه شدن اجرای توابع C در کامپایلر (Intrinsics) برای بارگذاری اتمی و ذخیره داده ها در حافظه، بر اساس استفاده از دستورالعمل های توسعه یافته ARM (ls9). اضافه شدن پشتیبانی برای تسریع عملکردهای memcpy، memmove و memset با استفاده از پسوند mopsoption ARM.
  • یک حالت بررسی جدید "-fsanitize=shadow-call-stack" (ShadowCallStack) اضافه شد که در حال حاضر فقط برای معماری AArch64 در دسترس است و هنگام ساخت کد با گزینه "-fixed-r18" کار می کند. حالت محافظت در برابر بازنویسی آدرس برگشتی از یک تابع در صورت سرریز شدن بافر در پشته را فراهم می کند. ماهیت حفاظت این است که پس از انتقال کنترل به یک تابع و بازیابی این آدرس قبل از خروج از تابع، آدرس بازگشتی را در یک پشته "سایه" جداگانه ذخیره کنید.

منبع: opennet.ru

اضافه کردن نظر