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

หลังจากหกเดือนของการพัฒนา การเปิดตัวโครงการ LLVM 15.0 ได้ถูกนำเสนอ ซึ่งเป็นชุดเครื่องมือที่เข้ากันได้กับ GCC (คอมไพเลอร์ ตัวเพิ่มประสิทธิภาพ และตัวสร้างโค้ด) ที่รวบรวมโปรแกรมเป็นบิตโค้ดระดับกลางของคำสั่งเสมือนที่คล้ายกับ RISC (เครื่องเสมือนระดับต่ำที่มี ระบบการเพิ่มประสิทธิภาพหลายระดับ) รหัสจำลองที่สร้างขึ้นสามารถแปลงโดยคอมไพเลอร์ JIT เป็นคำสั่งเครื่องได้ทันทีที่ดำเนินการโปรแกรม

การปรับปรุงที่สำคัญใน Clang 15.0:

  • สำหรับระบบที่ใช้สถาปัตยกรรม x86 มีการเพิ่มแฟล็ก “-fzero-call-used-regs” ซึ่งช่วยให้มั่นใจได้ว่าการลงทะเบียน CPU ทั้งหมดที่ใช้ในฟังก์ชันจะถูกรีเซ็ตเป็นศูนย์ก่อนที่จะส่งคืนการควบคุมจากฟังก์ชัน ตัวเลือกนี้ช่วยให้คุณสามารถป้องกันการรั่วไหลของข้อมูลจากฟังก์ชันต่างๆ และลดจำนวนบล็อกที่เหมาะสมสำหรับการสร้างอุปกรณ์ ROP (Return-Oriented Programming) ในการหาประโยชน์ได้ประมาณ 20%
  • มีการสุ่มวางตำแหน่งหน่วยความจำของโครงสร้างสำหรับรหัส C ซึ่งทำให้การแยกข้อมูลจากโครงสร้างมีความซับซ้อนในกรณีที่มีการใช้ประโยชน์จากช่องโหว่ การสุ่มเปิดและปิดโดยใช้แอตทริบิวต์ Randomize_layout และ no_randomize_layout และจำเป็นต้องตั้งค่าเริ่มต้นโดยใช้แฟล็ก "-frandomize-layout-seed" หรือ "-frandomize-layout-seed-file"
  • เพิ่มแฟล็ก "-fstrict-flex-arrays=" " ซึ่งคุณสามารถควบคุมขอบเขตสำหรับองค์ประกอบอาร์เรย์ที่ยืดหยุ่นในโครงสร้างได้ (สมาชิกอาร์เรย์แบบยืดหยุ่น ซึ่งเป็นอาร์เรย์ที่มีขนาดไม่แน่นอนที่ส่วนท้ายของโครงสร้าง) เมื่อตั้งค่าเป็น 0 (ค่าเริ่มต้น) องค์ประกอบสุดท้ายของโครงสร้างที่มีอาร์เรย์จะถูกประมวลผลเป็นอาร์เรย์แบบยืดหยุ่นเสมอ ขนาด 1 เท่านั้น [], [0] และ [1] จะถูกประมวลผลเป็นอาร์เรย์แบบยืดหยุ่น ขนาด 2 เท่านั้น [] และ [0] ได้รับการประมวลผลเหมือนอาเรย์แบบยืดหยุ่น
  • เพิ่มการรองรับการทดลองสำหรับภาษา C-like HLSL (High-Level Shader Language) ซึ่งใช้ใน DirectX สำหรับการเขียนเชเดอร์
  • เพิ่ม "-Warray-parameter" เพื่อเตือนเกี่ยวกับการแทนที่ฟังก์ชันด้วยการประกาศอาร์กิวเมนต์ที่เข้ากันไม่ได้ซึ่งเกี่ยวข้องกับอาร์เรย์ที่มีความยาวคงที่และผันแปรได้
  • ปรับปรุงความเข้ากันได้กับ MSVC เพิ่มการรองรับสำหรับฟังก์ชัน "#pragma" (สั่งให้คอมไพเลอร์สร้างการเรียกใช้ฟังก์ชันแทนการขยายแบบอินไลน์) และ "#pragma alloc_text" (กำหนดชื่อของส่วนด้วยโค้ดฟังก์ชัน) ที่ให้ไว้ใน MSVC เพิ่มการรองรับแฟล็ก /JMC และ /JMC ที่เข้ากันได้กับ MSVC
  • งานยังคงรองรับมาตรฐาน C2X และ C++23 ในอนาคต สำหรับภาษา C จะมีการใช้สิ่งต่อไปนี้: แอ็ตทริบิวต์ noreturn, คีย์เวิร์ด false และ true, ประเภท _BitInt(N) สำหรับจำนวนเต็มของความลึกบิตที่กำหนด, มาโคร *_WIDTH, คำนำหน้า u8 สำหรับอักขระที่เข้ารหัส UTF-8

    สำหรับ C++ จะมีการปรับใช้สิ่งต่อไปนี้: การรวมโมดูล, การแยก ABI ของสมาชิกฟังก์ชัน, การกำหนดค่าเริ่มต้นแบบไดนามิกของตัวแปรที่ไม่ใช่โลคัลในโมดูล, ตัวดำเนินการดัชนีหลายมิติ, auto(x), ตัวแปรที่ไม่ใช่ตัวอักษร, goto และเลเบลในฟังก์ชันที่ประกาศเป็น constexpr ลำดับการหลีกแบบมีตัวคั่น ชื่ออักขระหลีก

  • ความสามารถที่เกี่ยวข้องกับการรองรับ OpenCL และ OpenMP ได้รับการขยายแล้ว เพิ่มการสนับสนุนสำหรับส่วนขยาย OpenCL cl_khr_subgroup_rotate
  • สำหรับสถาปัตยกรรม x86 มีการเพิ่มการป้องกันช่องโหว่ในโปรเซสเซอร์ที่เกิดจากการดำเนินการตามคำสั่งแบบเก็งกำไรหลังจากการข้ามไปข้างหน้าแบบไม่มีเงื่อนไข ปัญหาเกิดขึ้นเนื่องจากการประมวลผลคำสั่งล่วงหน้าทันทีตามคำสั่งสาขาในหน่วยความจำ (SLS, Straight Line Speculation) เพื่อเปิดใช้งานการป้องกัน จึงเสนอตัวเลือก “-mharden-sls=[none|all|return|indirect-jmp]”
  • สำหรับแพลตฟอร์มที่รองรับส่วนขยาย SSE2 ได้เพิ่มประเภท _Float16 ซึ่งจำลองโดยใช้ประเภท float ในกรณีที่ขาดการรองรับคำสั่ง AVX512-FP16
  • เพิ่มแฟล็ก "-m[no-]rdpru" เพื่อควบคุมการใช้คำสั่ง RDPRU ซึ่งรองรับตั้งแต่โปรเซสเซอร์ AMD Zen2
  • เพิ่มแฟล็ก "-mfunction-return=thunk-extern" เพื่อป้องกันช่องโหว่ RETBEED ซึ่งทำงานโดยการเพิ่มลำดับคำสั่งที่ไม่รวมการมีส่วนร่วมของกลไกการดำเนินการเชิงคาดเดาสำหรับสาขาทางอ้อม

นวัตกรรมที่สำคัญใน LLVM 15.0:

  • เพิ่มการรองรับสถาปัตยกรรม Cortex-M85 CPU, Armv9-A, Armv9.1-A และ Armv9.2-A, ส่วนขยาย Armv8.1-M PACBTI-M
  • มีการเพิ่มแบ็กเอนด์ทดลองสำหรับ DirectX ที่รองรับรูปแบบ DXIL (DirectX Intermediate Language) ที่ใช้สำหรับ DirectX shaders แบ็กเอนด์ถูกเปิดใช้งานโดยการระบุพารามิเตอร์ “-DLLVM_EXPERIMENTAL_TARGETS_TO_BUILD=DirectX” ในระหว่างการประกอบ
  • Libc++ ยังคงใช้คุณสมบัติใหม่ของมาตรฐาน C++20 และ C++2b ต่อไป รวมถึงการปรับใช้ไลบรารี "รูปแบบ" และไลบรารี "ช่วง" เวอร์ชันทดลองที่เสนอให้เสร็จสมบูรณ์
  • ปรับปรุงแบ็กเอนด์สำหรับสถาปัตยกรรม x86, PowerPC และ RISC-V
  • ความสามารถของตัวเชื่อมโยง LLD และดีบักเกอร์ LLDB ได้รับการปรับปรุงแล้ว

ที่มา: opennet.ru

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