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

หลังจากหนึ่งปีของการพัฒนา การตีพิมพ์ การเปิดตัวชุดคอมไพเลอร์ฟรี GCC 10.1ซึ่งเป็นการเปิดตัวครั้งใหญ่ครั้งแรกในสาขา GCC 10.x ใหม่ ตาม โครงการใหม่ หมายเลขรุ่น เวอร์ชัน 10.0 ถูกนำมาใช้ในกระบวนการพัฒนา และไม่นานก่อนการเปิดตัว GCC 10.1 สาขา GCC 11.0 ได้แตกแขนงออกไปแล้ว โดยขึ้นอยู่กับการเปิดตัว GCC 11.1 ที่สำคัญครั้งต่อไป

GCC 10.1 มีความโดดเด่นในการใช้งานนวัตกรรมมากมายในภาษา C++ ที่พัฒนาขึ้นสำหรับมาตรฐาน C++20 การปรับปรุงที่เกี่ยวข้องกับมาตรฐานภาษา C ในอนาคต (C2x) การเพิ่มประสิทธิภาพใหม่ในแบ็กเอนด์คอมไพเลอร์ และการสนับสนุนการทดลอง โหมดการวิเคราะห์แบบคงที่. นอกจากนี้ ในระหว่างการจัดเตรียมสาขาใหม่ โปรเจ็กต์ได้โอนพื้นที่เก็บข้อมูลจาก SVN ไปยัง Git

หลัก การเปลี่ยนแปลง:

  • เพิ่ม โหมดทดลองการวิเคราะห์แบบคงที่ "- เครื่องวิเคราะห์“ ซึ่งทำการวิเคราะห์ระหว่างโพรซีเดอร์ที่ใช้ทรัพยากรจำนวนมากของพาธการเรียกใช้โค้ดและกระแสข้อมูลในโปรแกรม โหมดนี้สามารถตรวจจับปัญหาในขั้นตอนการคอมไพล์ เช่น การเรียกใช้ฟังก์ชัน free() สองครั้งสำหรับพื้นที่หน่วยความจำหนึ่ง พื้นที่ตัวอธิบายไฟล์รั่ว การยกเลิกการอ้างอิงและการส่งผ่านพอยน์เตอร์ null การเข้าถึงบล็อกหน่วยความจำที่ว่าง การใช้ค่าที่ไม่ได้เตรียมใช้งาน เป็นต้น การใช้โหมดใหม่สำหรับโค้ด OpenSSL ทำให้สามารถระบุตัวตนได้แล้ว ความเปราะบางที่เป็นอันตราย.
  • ปรับปรุงการเพิ่มประสิทธิภาพระหว่างโพรซีเดอร์แล้ว IPA-SRA (Interprocedural Scalar Shared Replacement) ได้รับการออกแบบใหม่เพื่อให้ทำงานในเวลาผูก และเหนือสิ่งอื่นใด ตอนนี้จะลบค่าที่คำนวณแล้วและส่งกลับค่าที่ไม่ได้ใช้ออกไป ในโหมดการปรับให้เหมาะสม "-O2" ตัวเลือก "-finline-functions" จะถูกเปิดใช้งาน ซึ่งได้รับการปรับแต่งใหม่เพื่อให้สนับสนุนโค้ดที่มีขนาดกะทัดรัดมากกว่าประสิทธิภาพการดำเนินการ การทำงานของฮิวริสติกสำหรับการปรับใช้ฟังก์ชันอินไลน์ได้รับการเร่งให้เร็วขึ้น การขยายแบบอินไลน์และการวิเคราะห์พฤติกรรมการโคลนฟังก์ชันสามารถใช้ข้อมูลเกี่ยวกับช่วงค่าเพื่อคาดการณ์ประสิทธิภาพของการแปลงแต่ละรายการได้แล้ว สำหรับ C ++ ความแม่นยำของการแยกวิเคราะห์นามแฝงตามประเภทได้รับการปรับปรุง
  • การเพิ่มประสิทธิภาพเวลาการเชื่อมโยงที่ได้รับการปรับปรุง (LTO) เพิ่มปฏิบัติการใหม่แล้ว lto-ถ่ายโอนข้อมูล เพื่อรีเซ็ตข้อมูลเกี่ยวกับไฟล์อ็อบเจ็กต์ด้วยรหัสไบต์ LTO LTO แบบขนานที่ส่งผ่านจะกำหนดจำนวนของงานสร้างที่ทำงานพร้อมกันโดยอัตโนมัติ และหากไม่สามารถระบุได้ ให้ใช้ข้อมูลเกี่ยวกับจำนวนแกน CPU เป็นปัจจัยในการขนาน เพิ่มความสามารถในการบีบอัดรหัสไบต์ LTO โดยใช้อัลกอริทึม zstd
  • กลไกการปรับให้เหมาะสมที่สุดตามผลลัพธ์ของโปรไฟล์โค้ด (PGO - การเพิ่มประสิทธิภาพที่แนะนำโดยโปรไฟล์) ได้รับการปรับปรุง ซึ่งสร้างโค้ดที่เหมาะสมที่สุดมากขึ้นโดยอาศัยการวิเคราะห์ลักษณะของการเรียกใช้โค้ด ปรับปรุงการบำรุงรักษาโปรไฟล์ในระหว่างการคอมไพล์และการแยกโค้ดแบบร้อน/เย็น ผ่านตัวเลือก "-fprofile-ค่า» ขณะนี้สามารถตรวจสอบค่าโปรไฟล์ได้สูงสุด 4 ค่า เช่น การโทรทางอ้อมและการให้ข้อมูลโปรไฟล์ที่แม่นยำยิ่งขึ้น
  • ข้อกำหนดการเขียนโปรแกรมแบบขนานที่นำไปใช้กับภาษา C, C++ และ Fortran OpenACC2.6ซึ่งกำหนดเครื่องมือสำหรับการลดภาระการดำเนินการบน GPU และโปรเซสเซอร์พิเศษ เช่น NVIDIA PTX การดำเนินการตามมาตรฐานนี้ใกล้จะเสร็จสมบูรณ์แล้ว เปิด MP 5.0 (Open Multi-Processing) ซึ่งกำหนด API และวิธีการใช้วิธีการเขียนโปรแกรมแบบขนานบนระบบมัลติคอร์และไฮบริด (CPU+GPU/DSP) พร้อมด้วยหน่วยความจำที่ใช้ร่วมกันและหน่วยเวกเตอร์ไดเซชัน (SIMD) เพิ่มคุณสมบัติ เช่น เงื่อนไข Lastprivate, คำสั่งสแกนและวนซ้ำ, นิพจน์ลำดับและ use_device_addr สำหรับ OpenMP และ OpenACC มีการเพิ่มการรองรับสำหรับการดำเนินการถ่ายข้อมูลบน GPU รุ่นที่สี่ (ฟิจิ) และรุ่นที่ห้า AMD Radeon (GCN) (VEGA 10/VEGA 20)
  • สำหรับภาษาตระกูล C มีการเพิ่มฟังก์ชัน "การเข้าถึง" เพื่ออธิบายการเข้าถึงของฟังก์ชันไปยังวัตถุที่ส่งผ่านโดยการอ้างอิงหรือตัวชี้ และเพื่อเชื่อมโยงวัตถุดังกล่าวกับอาร์กิวเมนต์จำนวนเต็มที่มีข้อมูลเกี่ยวกับขนาดของวัตถุ ในการทำงานร่วมกับ "การเข้าถึง" คุณลักษณะ "ประเภท" จะถูกนำมาใช้เพื่อตรวจจับการเข้าถึงที่ไม่ถูกต้องจากฟังก์ชั่นผู้ใช้เช่นเมื่อเขียนค่าไปยังพื้นที่นอกขอบเขตของอาร์เรย์ ที่เพิ่มเข้ามาคือแอตทริบิวต์ "symver" เพื่อเชื่อมโยงสัญลักษณ์ในไฟล์ ELF ด้วยหมายเลขเวอร์ชันเฉพาะ
  • เพิ่มคำเตือนใหม่:
    • “ -Wstring-compare” (เปิดใช้งานด้วย“ -Wextra”) - เตือนเกี่ยวกับการมีอยู่ของนิพจน์ที่มีการเปรียบเทียบกับศูนย์กับผลลัพธ์ของการเรียกใช้ฟังก์ชัน strcmp และ strncmp ซึ่งเทียบเท่ากับค่าคงที่เนื่องจากความจริงที่ว่าความยาว ของอาร์กิวเมนต์หนึ่งมีขนาดใหญ่กว่าขนาดของอาร์เรย์ในอาร์กิวเมนต์ที่สอง
    • "-Wzero-length-bounds" (เปิดใช้งานด้วย "-Warray-bounds") - เตือนเกี่ยวกับการเข้าถึงองค์ประกอบอาร์เรย์ที่มีความยาวเป็นศูนย์ ซึ่งอาจนำไปสู่การเขียนทับข้อมูลอื่น ๆ
    • คำเตือน “-Warray-bounds”, “-Wformat-overflow”, “-Wrestrict”, “-Wreturn-local-addr” และ “-Wstringop-overflow” ได้รับการขยายเพื่อขยายจำนวนสถานการณ์นอกขอบเขต ที่ได้รับการจัดการ
  • ใช้ความสามารถในการระบุอักขระเพิ่มเติมในตัวระบุโดยตรงโดยใช้การเข้ารหัสปัจจุบัน (UTF-8 โดยค่าเริ่มต้น) แทนที่จะเป็นรูปแบบ UCN (\uNNNN หรือ \UNNNNNNNN) ตัวอย่างเช่น:

    ค่าคงคงที่ int π = 3;
    int get_naïve_pi() {
    กลับπ;
    }

  • สำหรับภาษา C คุณลักษณะใหม่บางส่วนที่พัฒนาภายในมาตรฐาน C2X ได้ถูกนำมาใช้แล้ว (เปิดใช้งานโดยการระบุ -std=c2x และ -std=gnu2x): การสนับสนุนสำหรับไวยากรณ์ "[[]]" ปรากฏขึ้นเพื่อกำหนดคุณลักษณะเช่นเดียวกับใน C++ (เช่น [[gnu ::const]], [[deprecated]], [[fallthrough]] และ [[maybe_unused]] เพิ่มการรองรับไวยากรณ์ "u8" สำหรับการกำหนดค่าคงที่ด้วยอักขระ UTF-8
    เพิ่มมาโครใหม่ให้กับ . เพิ่มการทดแทน "%OB" และ "%Ob" ให้กับ strftime

  • โหมดเริ่มต้นสำหรับ C คือ "-fno-common" ซึ่งช่วยให้สามารถเข้าถึงตัวแปรทั่วโลกได้อย่างมีประสิทธิภาพมากขึ้นในบางแพลตฟอร์ม
  • สำหรับ C++ ได้มีการนำการเปลี่ยนแปลงและนวัตกรรมประมาณ 16 รายการไปใช้ ซึ่งพัฒนาในมาตรฐาน C++20 รวมถึงคำสำคัญที่เพิ่มเข้ามา “constinit”
    และรองรับส่วนขยายเทมเพลตแล้ว "แนวคิด". แนวคิดช่วยให้คุณสามารถกำหนดชุดของข้อกำหนดพารามิเตอร์เทมเพลตที่จำกัดชุดของอาร์กิวเมนต์ที่สามารถยอมรับเป็นพารามิเตอร์เทมเพลตได้ในขณะคอมไพล์ แนวคิดนี้สามารถใช้เพื่อหลีกเลี่ยงความไม่สอดคล้องกันทางลอจิคัลระหว่างคุณสมบัติของชนิดข้อมูลที่ใช้ภายในเทมเพลตและคุณสมบัติชนิดข้อมูลของพารามิเตอร์อินพุต

  • G++ ให้การตรวจจับพฤติกรรมที่ไม่ได้กำหนดซึ่งเกิดจากการเปลี่ยนแปลงวัตถุคงที่ผ่าน constexpr ลดการใช้หน่วยความจำโดยคอมไพเลอร์เมื่อคำนวณ constexpr เพิ่มคำเตือนใหม่ "-Wmismatched-tags" และ "-Wredundant-tags"
  • มีการเสนอตัวเลือกบรรทัดคำสั่งใหม่:
    • "-falllocation-dce" เพื่อลบคู่ตัวดำเนินการ "ใหม่" และ "ลบ" ที่ไม่จำเป็น
    • "-fprofile-partial-training" เพื่อปิดใช้งานการเพิ่มประสิทธิภาพขนาดสำหรับโค้ดที่ไม่มีการรันการฝึก
    • "-fprofile-reproducible เพื่อควบคุมระดับความสามารถในการทำซ้ำโปรไฟล์
    • "-fprofile-prefix-path" เพื่อกำหนดไดเร็กทอรีบิลด์ซอร์สฐานที่ใช้สำหรับการสร้างโปรไฟล์แยกกัน (สำหรับ "-fprofile-generate=profile_dir" และ "-fprofile-use=profile_dir")
  • ในข้อความคำเตือนสำหรับตัวเลือกดังกล่าว มีไฮเปอร์ลิงก์ที่ให้ไว้เพื่อให้คุณไปที่เอกสารประกอบสำหรับตัวเลือกเหล่านี้ การทดแทน URL ถูกควบคุมโดยใช้ตัวเลือก "-fdiagnostics-urls"
  • เพิ่มตัวดำเนินการพรีโปรเซสเซอร์ "__has_builtin" ซึ่งสามารถใช้เพื่อตรวจสอบฟังก์ชันในตัวได้
  • เพิ่มฟังก์ชันในตัวใหม่ "__builtin_roundeven" ด้วยการใช้งานฟังก์ชันการปัดเศษที่กำหนดไว้ในข้อกำหนด ISO/IEC TS 18661 ซึ่งคล้ายกับ "round" แต่การปัดเศษส่วนที่มากกว่า 0.5 ขึ้น (เป็นค่าที่มากขึ้น) น้อยกว่า 0.5 - ลง (เป็นศูนย์) และเท่ากับ 0.5 - เริ่มต้นจากความเท่าเทียมกันของหลักสุดท้าย
  • สำหรับสถาปัตยกรรม AArch64 มีการเพิ่มการรองรับส่วนขยาย SVE2 และปรับปรุงการรองรับ SVE (Scalable Vector Extension) รวมถึงเพิ่มการรองรับฟังก์ชันและประเภท SVE ACLE ในตัว และการใช้การทำให้เป็นเวกเตอร์ ขยายการสนับสนุน LSE (Large System Extensions) และ TME (Transactional Memory Extension) แล้ว เพิ่มคำแนะนำใหม่ที่เสนอใน Armv8.5-A และ Armv8.6-A รวมถึงคำแนะนำสำหรับการสร้างตัวเลขสุ่ม การปัดเศษ การผูกแท็กหน่วยความจำ
    bfloat16 และการคูณเมทริกซ์ เพิ่มการรองรับโปรเซสเซอร์
    แขน Cortex-A77,
    แขน Cortex-A76AE,
    แขน Cortex-A65,
    แขน Cortex-A65AE,
    แขน Cortex-A34 และ
    มาร์เวลล์ ธันเดอร์เอ็กซ์ 3

  • เพิ่มการรองรับ ABI FDPIC (ตัวชี้ฟังก์ชัน 32 บิต) สำหรับ ARM64 ออกแบบใหม่และเพิ่มประสิทธิภาพการประมวลผลการดำเนินการจำนวนเต็ม 64 บิต เพิ่มการรองรับซีพียู
    แขน Cortex-A77,
    แขน Cortex-A76AE และ
    อาร์ม Cortex-M35P. การสนับสนุนเพิ่มเติมสำหรับคำสั่งการประมวลผลข้อมูล ACLE รวมถึง SIMD 32 บิต, การคูณ 16 บิต, เลขคณิต latch และการเพิ่มประสิทธิภาพอัลกอริทึม DSP อื่น ๆ เพิ่มการสนับสนุนการทดลองสำหรับคำแนะนำ ACLE CDE (ส่วนขยาย Datapath แบบกำหนดเอง)

  • ปรับปรุงการสร้างโค้ดและการทำเวกเตอร์ในแบ็กเอนด์สำหรับ GPU AMD ที่ใช้ GCN microarchitecture ได้ดีขึ้นอย่างมาก
  • เพิ่มการรองรับอุปกรณ์ที่คล้าย XMEGA สำหรับสถาปัตยกรรม AVR
    ATtiny202, ATtiny204, ATtiny402, ATtiny404, ATtiny406, ATtiny804, ATtiny806, ATtiny807, ATtiny1604, ATtiny1606, ATtiny1607, ATmega808, ATmega809, ATmega1608, ATmega1609, ATmega3208, ATmega3209 4808, ATmega4809 และ ATmegaXNUMX

  • มีการเพิ่มส่วนขยายสถาปัตยกรรมชุดคำสั่ง Intel ENQCMD ใหม่ (-menqcmd) สำหรับสถาปัตยกรรม IA-32/x86-64 เพิ่มการรองรับ Intel Cooperlake (-march=cooperlake รวมถึงส่วนขยาย AVX512BF16 ISA) และ Tigerlake (-march=tigerlake รวมถึง CPU MOVDIRI, MOVDIR64B และ AVX512VP2INTERSECT ISA)
  • การใช้งาน HSAIL (Heterogeneous System Architecture Intermediate Language) สำหรับระบบคอมพิวเตอร์ที่แตกต่างกันซึ่งใช้สถาปัตยกรรม HSA นั้นเลิกใช้แล้ว และมีแนวโน้มว่าจะถูกนำออกในรุ่นต่อๆ ไป

ที่มา: opennet.ru

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