การเปิดตัวชุดคอมไพเลอร์ GCC 12

หลังจากหนึ่งปีของการพัฒนา ชุดคอมไพเลอร์ฟรี GCC 12.1 ก็ได้เปิดตัวแล้ว ซึ่งเป็นการเปิดตัวครั้งสำคัญครั้งแรกในสาขา GCC 12.x ใหม่ ตามรูปแบบการกำหนดหมายเลขการเผยแพร่ใหม่ เวอร์ชัน 12.0 ได้ถูกนำมาใช้ในกระบวนการพัฒนา และไม่นานก่อนการเปิดตัว GCC 12.1 สาขา GCC 13.0 ได้แตกแขนงออกไปแล้ว โดยพื้นฐานจากการเปิดตัวหลักครั้งต่อไป GCC 13.1 ถูกสร้างขึ้น ในวันที่ 23 พฤษภาคม โครงการนี้จะเฉลิมฉลองครบรอบ 35 ปีนับตั้งแต่การก่อตั้ง GCC ฉบับพิมพ์ครั้งแรก

การเปลี่ยนแปลงที่สำคัญ:

  • เพิ่มการรองรับสำหรับรูปแบบการดีบัก CTF (Compact Type Format) ซึ่งให้การจัดเก็บข้อมูลขนาดกะทัดรัดเกี่ยวกับประเภท C การเชื่อมต่อระหว่างฟังก์ชัน และสัญลักษณ์การดีบัก เมื่อฝังอยู่ในออบเจ็กต์ ELF รูปแบบจะอนุญาตให้ใช้ตารางอักขระ EFL เพื่อหลีกเลี่ยงการทำสำเนาข้อมูล
  • การสนับสนุนสำหรับรูปแบบการจัดเก็บข้อมูลการดีบัก "STABS" ที่สร้างขึ้นในทศวรรษ 1980 เลิกใช้แล้ว
  • งานยังคงขยายการรองรับมาตรฐาน C2X และ C++23 ในอนาคตสำหรับภาษา C และ C++ ตัวอย่างเช่น มีการเพิ่มการรองรับนิพจน์ "if consteval" อนุญาตให้ใช้ auto ในอาร์กิวเมนต์ของฟังก์ชัน (“f(auto(g()))”); อนุญาตให้ใช้ตัวแปรที่ไม่ใช่ตัวอักษร, goto และ label ในฟังก์ชันที่ประกาศเป็น constexpr เพิ่มการรองรับตัวดำเนินการดัชนีหลายมิติ ตัวดำเนินการ []; ใน if, for และ switch ความสามารถของบล็อกการเริ่มต้นได้รับการขยาย (“สำหรับ (โดยใช้ T = int; T e : v)”)
  • ไลบรารีมาตรฐาน C++ ได้ปรับปรุงการรองรับส่วนทดลองของมาตรฐาน C++20 และ C++23 เพิ่มการรองรับ std::move_only_function , std::basic_string::resize_and_overwrite, , และ std::inurge_r อนุญาตให้ใช้ std::unique_ptr, std::vector, std::basic_string, std::เป็นทางเลือก และ std::variant ในฟังก์ชัน constexpr
  • ส่วนหน้าของ Fortran ให้การสนับสนุนอย่างเต็มที่สำหรับข้อกำหนด TS 29113 ซึ่งอธิบายความสามารถในการรับรองความสามารถในการพกพาระหว่างโค้ด Fortran และ C
  • เพิ่มการสนับสนุนสำหรับส่วนขยาย __builtin_shufflevector(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++ มีการเพิ่มการรองรับแอตทริบิวต์ "ไม่พร้อมใช้งาน" แล้ว (เช่น คุณสามารถทำเครื่องหมายฟังก์ชันที่จะสร้างข้อผิดพลาดได้หากคุณพยายามใช้งาน)
  • สำหรับภาษา 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 (คอมไพล์ครั้งเดียว - เรียกใช้ทุกที่) ให้กับแบ็กเอนด์สำหรับการสร้างโค้ดไบต์ BPF ซึ่งช่วยให้คุณสามารถคอมไพล์โค้ดของโปรแกรม eBPF สำหรับเคอร์เนล Linux เพียงครั้งเดียวและใช้ตัวโหลดสากลพิเศษที่ปรับ โหลดโปรแกรมไปยังเคอร์เนลปัจจุบันและรูปแบบ BPF Types) 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 Engine) ต่อกลุ่ม ก่อนหน้านี้ อนุญาตให้มีขอบคำสั่งเดียวต่อ CU เท่านั้น
  • แบ็คเอนด์ NVPTX ได้รับการออกแบบเพื่อสร้างโค้ดโดยใช้สถาปัตยกรรมชุดคำสั่ง NVIDIA PTX (Parallel Thread Execution) ได้เพิ่มความสามารถในการใช้แฟล็ก “-march”, “-mptx” และ “-march-map” ดำเนินการรองรับ 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_tfiar ได้รับการบันทึกไว้
  • รองรับ Arm Ampere-64 (-mcpu/-mtune ampere1), Arm Cortex-A1 (cortex-a510), Arm Cortex-A510 (cortex-a710) และ Arm Cortex-X710 (cortex-x2) เพิ่มการรองรับตัวเลือกสถาปัตยกรรม ARMv2 ใหม่สำหรับใช้กับตัวเลือก "-march": 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

เพิ่มความคิดเห็น