پس از یک سال توسعه، مجموعه کامپایلر رایگان GCC 11.1 منتشر شد که اولین نسخه قابل توجه در شاخه جدید GCC 11.x است. مطابق با طرح شماره گذاری نسخه جدید، نسخه 11.0 در فرآیند توسعه استفاده شد و کمی قبل از انتشار GCC 11.1، شعبه GCC 12.0 قبلاً منشعب شده بود که نسخه اصلی بعدی GCC 12.1 از آن تشکیل می شد.
GCC 11.1 برای انتقال آن به استفاده از فرمت پرونده اشکال زدایی DWARF 5 به طور پیش فرض ، گنجاندن پیش فرض استاندارد C ++ 17 ("-STD = GNU ++ 17") قابل توجه است ، پیشرفت های چشمگیری در پشتیبانی از C ++ 20 استاندارد، پشتیبانی آزمایشی برای C++23، بهبودهای مربوط به استاندارد زبان C آینده (C2x)، بهینه سازی عملکرد جدید.
تغییرات اصلی:
- حالت پیشفرض برای زبان C++ برای استفاده از استاندارد C++17 (-std=gnu++17) بهجای C++14 قبلی تغییر یافته است. می توان هنگام پردازش الگوهای که از سایر الگوهای به عنوان یک پارامتر استفاده می کنند (-FNO-NEW-TTP-Matching) به طور انتخابی رفتار جدید C ++ 17 را غیرفعال کنید.
- پشتیبانی اضافه شده برای شتاب سخت افزاری ابزار AdressSanitizer ، که به شما امکان می دهد حقایق دسترسی به مناطق حافظه آزاد شده ، فراتر از مرزهای بافر اختصاص یافته و برخی دیگر از خطاها را هنگام کار با حافظه تعیین کنید. شتاب سخت افزاری در حال حاضر فقط برای معماری AArch64 در دسترس است و بر روی استفاده در هنگام کامپایل هسته لینوکس متمرکز است. برای فعال کردن شتاب سخت افزار آدرس دهنده هنگام ساختن اجزای فضایی کاربر ، پرچم "-fsanitize = hwaddress" اضافه شده است ، و پرچم هسته "-fsanitize = هسته-hwaddress".
- هنگام تولید اطلاعات اشکال زدایی، فرمت DWARF 5 به طور پیش فرض استفاده می شود، که در مقایسه با نسخه های قبلی، امکان تولید 25٪ داده های اشکال زدایی فشرده تر را فراهم می کند. پشتیبانی کامل از DWARF 5 حداقل به نسخه 2.35.2 binutils نیاز دارد. فرمت DWARF 5 در ابزارهای اشکال زدایی از GDB 8.0، valgrind 3.17.0، elfutils 0.172 و dwz 0.14 پشتیبانی می شود. برای تولید فایل های اشکال زدایی با استفاده از نسخه های دیگر DWARF، می توانید از گزینه های "-gdwarf-2"، "-gdwarf-3" و "-gdwarf-4" استفاده کنید.
- الزامات کامپایلرهایی که می توانند برای ساخت GCC استفاده شوند افزایش یافته است. کامپایلر اکنون باید از استاندارد C++11 (قبلاً C++98 مورد نیاز بود) پشتیبانی کند. اگر GCC 10 برای ساخت GCC 3.4 کافی بود، اکنون حداقل GCC 11 برای ساخت GCC 4.8 لازم است.
- نام و محل فایل ها برای ذخیره dump ها، فایل های موقت و اطلاعات اضافی لازم برای بهینه سازی LTO تغییر کرده است. اکنون چنین فایلهایی همیشه در دایرکتوری فعلی ذخیره میشوند، مگر اینکه مسیر به صراحت از طریق گزینههای "-dumpbase"، "-dumpdir" و "-save-temps=*" تغییر داده شود.
- پشتیبانی از فرمت باینری BRIG برای استفاده با زبان HSAIL (زبان میانی معماری سیستم ناهمگن) منسوخ شده است و به زودی حذف خواهد شد.
- قابلیتهای حالت ThreadSanitizer (-fsanitize=thread) گسترش یافتهاند، که برای شناسایی شرایط مسابقه هنگام اشتراکگذاری دادههای مشابه از رشتههای مختلف یک برنامه چند رشتهای طراحی شده است. نسخه جدید پشتیبانی از زمانها و محیطهای جایگزین و همچنین پشتیبانی از ابزار اشکالزدایی KCSAN (Kernel Concurrency Sanitizer) را اضافه میکند که برای شناسایی پویا شرایط مسابقه در هسته لینوکس طراحی شده است. گزینه های جدید "-param tsan-distinguish-volatile" و "-param tsan-instrument-func-entry-exit" اضافه شد.
- شماره ستونها در پیامهای تشخیصی اکنون تعداد بایتها را از ابتدای خط منعکس نمیکنند، بلکه در واقع اعداد ستونهایی را نشان میدهند که نویسههای چند بایتی و کاراکترهایی را که چندین موقعیت را در خط اشغال میکنند، در نظر میگیرند (به عنوان مثال، کاراکتر 🙂 دو موقعیت را اشغال میکند و در 4 بایت کدگذاری شده است). به همین ترتیب، کاراکترهای برگه اکنون به عنوان تعداد مشخصی فاصله در نظر گرفته می شوند (قابل تنظیم از طریق گزینه -ftabstop، پیش فرض 8). برای بازیابی رفتار قدیمی، گزینه "-fdiagnostics-column-unit=byte" و برای تعیین مقدار اولیه (شماره گذاری از 0 یا 1) - گزینه "-fdiagnostics-column-origin=" پیشنهاد شده است.
- وکتوریزر کل محتویات تابع را در نظر می گیرد و قابلیت های پردازش مرتبط با تقاطع ها و ارجاع به بلوک های قبلی را در نمودار جریان کنترل (CFG، گراف کنترل جریان) اضافه می کند.
- بهینه ساز توانایی تبدیل یک سری عملیات شرطی را که همان متغیر را به یک عبارت سوئیچ مقایسه می کند، پیاده سازی می کند. عبارت سوئیچ را میتوان بعداً با استفاده از دستورالعملهای تست بیت کدگذاری کرد (گزینه -fbit-tests برای کنترل چنین تبدیلی اضافه شده است).
- بهینه سازی بین رویه ای بهبود یافته یک مجوز IPA-modref جدید (-fipa-modref) برای ردیابی عوارض جانبی هنگام فراخوانی توابع و بهبود دقت تجزیه و تحلیل اضافه شده است. اجرای بهبود یافته پاس IPA-ICF (-fipa-icf)، که مصرف حافظه را در طول کامپایل کاهش می دهد و تعداد توابع یکپارچه را افزایش می دهد که بلوک های یکسان کد برای آنها ترکیب می شوند. در پاس IPA-CP (انتشار ثابت بین رویه ای)، اکتشافی پیش بینی با در نظر گرفتن مرزها و ویژگی های شناخته شده حلقه ها بهبود یافته است.
- در Linking Time Optimizations (LTO)، قالب بایت کد برای کاهش اندازه و بهبود سرعت پردازش بهینه شده است. کاهش مصرف حداکثر حافظه در مرحله اتصال.
- در مکانیسم بهینه سازی بر اساس نتایج پروفایل کد (PGO - بهینه سازی با هدایت پروفایل) ، که امکان تولید کد بهینه تر را بر اساس تجزیه و تحلیل ویژگی های اجرای می دهد ، اندازه پرونده ها با داده های GCOV به دلیل بسته بندی فشرده تر پیشخوان های صفر کاهش می یابد . بهبود حالت "-fprofile-values" با پیگیری پارامترهای بیشتر در تماس های غیر مستقیم.
- اجرای استاندارد OpenMP 5.0 (چند پردازش باز) ، که API و روش های استفاده از روش های برنامه نویسی موازی بر روی سیستم های چند هسته ای و هیبریدی (CPU+GPU/DSP) با واحدهای حافظه مشترک و وکتوریزه کردن (SIMD) را تعریف می کند ، دارد. ادامه داد. پشتیبانی اولیه برای تخصیص دستورالعمل و توانایی استفاده از حلقه های ناهمگن در ساختارهای OpenMP اضافه شده است. پشتیبانی از متغیر محیطی OMP_TARGET_OFFLOAD اجرا شده است.
- اجرای مشخصات برنامه نویسی موازی OpenACC 2.6 که برای زبان های C ، C ++ و Fortran ارائه شده است ، بهبود یافته است که ابزارهایی را برای بارگذاری عملیات در GPU و پردازنده های تخصصی مانند NVIDIA PTX تعریف می کند.
- برای زبانهای C، یک ویژگی جدید «no_stack_protector» پیادهسازی شده است که برای علامتگذاری توابعی طراحی شده است که محافظت پشتهای برای آنها نباید فعال شود («-fstack-protector»). ویژگی "malloc" برای پشتیبانی از شناسایی جفت فراخوانی برای تخصیص و آزادسازی حافظه (تخصیص دهنده/تخصیص دهنده) گسترش یافته است که در تحلیلگر استاتیک برای شناسایی خطاهای معمولی در کار با حافظه استفاده می شود (نشت حافظه، استفاده پس از آزادسازی، دوبار فراخوانی تابع رایگان و غیره) و در اخطارهای کامپایلر "-Wmismatched-dealloc"، "-Wmismatched-new-delete" و "-Wfree-nonheap-object"، از ناسازگاری بین عملیات تخصیص حافظه و تخصیص حافظه اطلاع رسانی می کند.
- هشدارهای جدیدی برای زبان C اضافه شده است:
- "-Wmismatched-dealloc" (به طور پیش فرض فعال است) - در مورد عملیات تخصیص حافظه که از نشانگری استفاده می کند که با توابع تخصیص حافظه سازگار نیست، هشدار می دهد.
- "-Wsizeof-array-div" (هنگامی که "-Wall" مشخص شده است فعال می شود) - در مورد تقسیم دو عملگر sizeof در صورتی که تقسیم کننده با اندازه عنصر آرایه مطابقت نداشته باشد هشدار می دهد.
- "-Wstringop-overread" (به طور پیش فرض فعال است) - در مورد فراخوانی یک تابع رشته ای که داده ها را از ناحیه ای خارج از مرز آرایه می خواند هشدار می دهد.
- "-Wtsan" (به طور پیش فرض فعال است) - در مورد استفاده از ویژگی هایی (مانند std::atomic_thread_fence) که در ThreadSanitizer پشتیبانی نمی شوند هشدار می دهد.
- "-Warray-parameter" و "-Wvla-parameter" (در هنگام تعیین "-Wall" فعال می شود) - در مورد توابع لغو با اعلان های ناسازگار آرگومان های مرتبط با آرایه های با طول ثابت و متغیر هشدار می دهد.
- اخطار "-Wuninitialized" اکنون تلاشهایی را برای خواندن از حافظه اختصاصیافته پویا شناسایی نشده است.
- هشدار "-Wfree-nonheap-object" تعریف مواردی را گسترش می دهد که در آن توابع تخصیص حافظه با اشارهگری فراخوانی می شوند که از طریق توابع تخصیص حافظه پویا بدست نیامده است.
- هشدار "-Wmaybe-unitialized" تشخیص انتقال اشاره گرها به توابعی را که به مکان های حافظه اولیه اشاره می کنند گسترش داده است.
- برای زبان C، بخشی از ویژگیهای جدید توسعهیافته در چارچوب استاندارد C2X پیادهسازی شده است (فعال شده با تعیین -std=c2x و -std=gnu2x): ماکروهای BOOL_MAX و BOOL_WIDTH، نشاندهنده اختیاری نام پارامترهای استفاده نشده در تابع تعاریف (مانند C++)، ویژگی "[[nodiscard]]"، اپراتور پیش پردازشگر "__has_c_attribute"، ماکروها FLT_IS_IEC_60559، DBL_IS_IEC_60559، LDBL_IS_IEC_60559، __STDC_60559_WANT_XNUMX، NEXT, NIN ، DBL_SNAN، LDBL_SNAN، DEC_INFINITY و DEC _NAN، NaN=ماکروها برای FloatN، _FloatNx و _DecimalN، قابلیت تعیین نشانه های پرش قبل از اعلان ها و در پایان عبارات ترکیبی.
- برای C ++ ، بخشی از تغییرات و نوآوری های ارائه شده در استاندارد C ++ 20 اجرا شده است ، از جمله توابع مجازی "مجازی ثابت" ، شبه محرک برای پایان چرخه زندگی اشیاء ، استفاده از کلاس Enum و محاسبه اندازه یک آرایه در عبارت "جدید".
- برای C ++ ، پشتیبانی آزمایشی برای برخی از پیشرفت های مورد نظر برای آینده C ++ 23 اضافه شده است (-std = C ++ 23 ، -std = GNU ++ 23 ، -std = C ++ 2B ، -std = GNU ++2b). به عنوان مثال، اکنون از پسوند تحت اللفظی "zu" برای مقادیر sign_t پشتیبانی می شود.
- libstdc++ پشتیبانی از استاندارد C++17 را بهبود بخشیده است، از جمله معرفی std::from_chars و std::to_chars برای انواع ممیز شناور. عناصر جدید استاندارد C++20، از جمله std::bit_cast، std::source_location، عملیات اتمی منتظر و اطلاع رسانی، ، ، ، و همچنین عناصر استاندارد 23 C++ آینده (std::to_underlying، std::is_scoped_enum). اضافه شدن پشتیبانی آزمایشی برای انواع برای پردازش داده های موازی (SIMD، Data-Parallel Types). اجرای std::uniform_int_distribution تسریع شده است.
- پرچم کیفیت آلفا را از libgccjit حذف کرد، یک کتابخانه مشترک برای جاسازی یک تولید کننده کد در سایر فرآیندها و استفاده از آن برای سازماندهی کامپایل JIT بایت کد در کد ماشین. قابلیت ساخت libgccjit برای MinGW اضافه شد.
- پشتیبانی از معماری AArch64 Armv8-R (-march=armv8-r) اضافه شده است. برای معماری های AArch64 و ARM، پشتیبانی از پردازنده ها اضافه شده است (پارامترهای -mcpu و -mtune): Arm Cortex-A78 (cortex-a78)، Arm Cortex-A78AE (cortex-a78ae)، Arm Cortex-A78C (cortex-a78c) ، Arm Cortex- X1 (cortex-x1)، Arm Neoverse V1 (neoverse-v1) و Arm Neoverse N2 (neoverse-n2). پردازنده های Fujitsu A64FX (a64fx) و Arm Cortex-R82 (cortex-r82) نیز اضافه شده اند که فقط از معماری AArch64 پشتیبانی می کنند.
- اضافه شدن پشتیبانی برای استفاده از دستورات SIMD Armv8.3-a (AArch64/AArch32)، SVE (AArch64)، SVE2 (AArch64) و MVE (AArch32 M-profile) برای بردارسازی خودکار عملیات انجام جمع، تفریق، ضرب و انواع جمع/ تفریق. اعداد مختلط. پشتیبانی اولیه برای autovectorization برای ARM با استفاده از مجموعه دستورالعمل MVE اضافه شده است.
- برای پلتفرمهای ARM، مجموعه کاملی از توابع C یکپارچه با کامپایلر (Intrinsics) ارائه میشود که با دستورالعملهای برداری توسعهیافته (SIMD) جایگزین شده است، که تمام دستورالعملهای NEON مستند شده در مشخصات ACLE Q3 2020 را پوشش میدهد.
- پشتیبانی از GPU gfx908 برای تولید کد برای GPU های AMD بر اساس ریزمعماری GCN به باطن اضافه شده است.
- اضافه شدن پشتیبانی از پردازنده های جدید و برنامه های افزودنی مجموعه دستورالعمل های جدید پیاده سازی شده در آنها:
- Intel Sapphire Rapids (-marsh=sapphirerapids، پشتیبانی از دستورالعملهای MOVDIRI، MOVDIR64B، AVX512VP2INTERSECT، ENQCMD، CLDEMOTE، SERIALIZE، PTWRITE، WAITPKG، TSXLDTRK8، AMTXAMFNI، TSXLDTRK، AMTXAMFNIX، و .
- Intel Alderlake (-march=alderlake، پشتیبانی از دستورالعمل های CLDEMOTE، PTWRITE، WAITPKG، SERIALIZE، KEYLOCKER، AVX-VNNI و HRESET را فعال می کند).
- Rocketlake اینتل (-march=rocketlake، مشابه Rocket Lake بدون پشتیبانی SGX).
- AMD Zen 3 (-مارچ=znver3).
- برای سیستم های IA-32/x86-64 مبتنی بر پردازنده های Intel ، پشتیبانی از دستورالعمل های پردازنده جدید TSXLDTRK ، Serialize ، HRESET ، UINTRKEYLOCKER ، AMX-TILE ، AMX-INT8 ، AMX-BF16 ، AVX-VNNI اضافه شده است.
- پشتیبانی از پرچمهای "-march=x86-64-v[234]" برای انتخاب سطوح معماری x86-64 (v2 - برنامههای افزودنی SSE4.2، SSSE3، POPCNT و CMPXCHG16B را پوشش میدهد؛ v3 - AVX2 و MOVBE؛ v4 - AVX-512 ) .
- اضافه شدن پشتیبانی از سیستم های RISC-V با ترتیب بایت های بزرگ. گزینه "-misa-spec=*" برای انتخاب نسخه مشخصات معماری مجموعه دستورالعمل RISC-V اضافه شده است. پشتیبانی از AddressSanitizer و حفاظت پشته با استفاده از برچسب قناری اضافه شده است.
- بهبود مستمر حالت تحلیل استاتیک "-fanalyzer" که تجزیه و تحلیل بین رویه ای با منابع فشرده مسیرهای اجرای کد و جریان داده ها را در برنامه انجام می دهد. این حالت قادر است مشکلاتی را در مرحله کامپایل تشخیص دهد، مانند تماسهای مضاعف به تابع free() برای یک ناحیه حافظه، نشت توصیفگر فایل، ارجاع دادن و ارسال نشانگرهای تهی، دسترسی به بلوکهای حافظه آزاد شده، استفاده از مقادیر اولیه و غیره. در نسخه جدید:
- کد ردیابی وضعیت برنامه به طور کامل بازنویسی شده است. مشکلات اسکن فایل های C بسیار بزرگ حل شده است.
- پشتیبانی اولیه C++ اضافه شد.
- تجزیه و تحلیل تخصیص و تخصیص حافظه از توابع خاص malloc و آزاد انتزاع شده است و اکنون از new/delete و new[]/delete[] پشتیبانی می کند.
- هشدارهای جدید اضافه شده است: -Wanalyzer-shift-count-negative، -Wanalyzer-shift-count-overflow، -Wanalyzer-write-to-const و -Wanalyzer-write-to-string-literal.
- گزینه های اشکال زدایی جدید -fdump-analyzer-json و -fno-analyzer-feasibility اضافه شد.
- قابلیت گسترش آنالایزر از طریق پلاگین ها برای GCC پیاده سازی شده است (به عنوان مثال، افزونه ای برای بررسی استفاده نادرست از قفل جهانی (GIL) در CPython آماده شده است).
منبع: opennet.ru