หลังจากพัฒนามาหกเดือน LLVM 22.1.0 ก็ได้ถูกปล่อยออกมาแล้ว LLVM พัฒนาเครื่องมือ (คอมไพเลอร์ ตัวปรับแต่งประสิทธิภาพ และตัวสร้างโค้ด) ที่คอมไพล์โปรแกรมให้เป็นบิตโค้ดระดับกลางของคำสั่งเสมือนแบบ RISC (เครื่องเสมือนระดับต่ำที่มีระบบการปรับแต่งประสิทธิภาพหลายระดับ) รหัสเทียมที่สร้างขึ้นสามารถแปลงเป็นรหัสเครื่องสำหรับแพลตฟอร์มเป้าหมายที่กำหนด หรือใช้โดยคอมไพเลอร์แบบ Just-in-Time (JIT) เพื่อสร้างคำสั่งเครื่องโดยตรงระหว่างการทำงานของโปรแกรม โครงการนี้กำลังพัฒนาคอมไพเลอร์ Clang โดยใช้เทคโนโลยี LLVM ซึ่งรองรับภาษาโปรแกรม C, C++ และ Objective-C เริ่มตั้งแต่เวอร์ชัน 18.x โครงการได้เปลี่ยนไปใช้ระบบการกำหนดหมายเลขเวอร์ชันใหม่ โดยใช้เวอร์ชัน 0 ("N.0") ในระหว่างการพัฒนา และเวอร์ชันเสถียรแรกจะใช้หมายเลข "N.1"
ท่ามกลางการปรับปรุงใน Clang 22:
- เพิ่มการรองรับโทเค็นการจัดสรรหน่วยความจำ (Allocation Tokens) สำหรับทำเครื่องหมายการดำเนินการจัดสรรหน่วยความจำที่ดำเนินการโดยใช้ฟังก์ชันต่างๆ เช่น malloc ด้วยตัวระบุที่ไม่ซ้ำกัน โทเค็นการจัดสรรช่วยให้สามารถจัดโครงสร้างข้อมูลฮีป ลดความซับซ้อนในการตรวจจับการรั่วไหลของหน่วยความจำ และช่วยให้สามารถจัดกลุ่มวัตถุตามวัตถุประสงค์หรือรูปแบบการแก้ไข (เช่น การแยกข้อมูล "ร้อน" ออกจากข้อมูล "เย็น") หากต้องการเปิดใช้งาน ให้ใช้แฟล็ก "-fsanitize=alloc-token"
- คุณสมบัติที่เกี่ยวข้องกับภาษาซี:
- ร่างข้อกำหนดที่กำหนดกลไกการดำเนินการแบบเลื่อนเวลา "defer" ได้ถูกนำมาใช้แล้ว ซึ่งอนุญาตให้ดำเนินการต่างๆ ได้เมื่อขอบเขตปัจจุบันสิ้นสุดลง มีการเพิ่มแฟล็ก "-fdefer-ts" เพื่อเปิดใช้งานการสนับสนุน "defer"
- ฟังก์ชันในตัว __builtin_stack_address() ได้ถูกเพิ่มเข้ามาแล้ว โดยมีลักษณะคล้ายกับฟังก์ชันใน GCC ฟังก์ชันนี้จะส่งคืนที่อยู่สแต็กที่คั่นระหว่างพื้นที่สแต็กของฟังก์ชันปัจจุบันที่เรียกใช้ __builtin_stack_address() และฟังก์ชันถัดไปที่ถูกเรียกใช้
- ความสามารถที่กำลังได้รับการพัฒนาสำหรับมาตรฐาน C2y ในอนาคต:
- เพิ่มการรองรับลูปที่มีชื่อ ซึ่งช่วยให้คุณสามารถกำหนดชื่อให้กับลูปและคำสั่ง switch ได้ โดยสามารถระบุชื่อในคำสั่ง break และ continue เพื่อกำหนดลูปที่จะออกจากลูปได้อย่างชัดเจน outer: for (int i = 0; i < IK; ++ i) { for (int j = 0; j < JK; ++ j) { continue; // ไปที่ CONT1 continue outer; // ไปที่ CONT2 // CONT1 } // CONT2 }
- การใช้งานมาโคร "__COUNTER__" ที่มีอยู่แล้ว ซึ่งออกแบบมาเพื่อสร้างชื่อตัวระบุที่ไม่ซ้ำกัน ได้รับการขยายและรวมอยู่ในมาตรฐานแล้ว มีการกำหนดขีดจำกัดการเรียกใช้มาโครนี้ไว้ที่ 2147483647 ครั้ง หากเกินขีดจำกัดนี้จะทำให้เกิดข้อผิดพลาด
- ลบคำเตือน (-Wstatic-in-inline) เมื่อใช้ฟังก์ชันหรือตัวแปรแบบ static ภายในฟังก์ชันที่ประกาศเป็น "extern inline"
- ความสามารถที่กำหนดไว้ในมาตรฐาน C23 C:
- ไฟล์เฮดเดอร์ float.h ตอนนี้รองรับมาโคร FLT_SNAN, DBL_SNAN และ LDBL_SNAN ซึ่งใช้ในการจัดการค่า NaN ที่ถูกส่งสัญญาณ (ทำให้เกิดข้อยกเว้นเมื่อใช้ในการคำนวณทางคณิตศาสตร์) สำหรับชนิดข้อมูล float, double และ long double
- แก้ไขข้อผิดพลาดที่ทำให้ประเภทข้อมูลที่ไม่มีชื่อต่างกันถูกมองว่าเข้ากันได้ภายในหน่วยการแปลเดียวกัน หากมีฟิลด์เหมือนกัน
- แฟล็ก "-MG" ที่ใช้สำหรับละเว้นไฟล์เฮดเดอร์ที่หายไปในระหว่างการสแกนการพึ่งพา ได้ถูกขยายไปยังคำสั่ง "#embed" แล้ว และตอนนี้จะระงับข้อผิดพลาด "ไม่พบไฟล์" เมื่อไฟล์ที่ระบุในคำสั่ง "#embed" หายไป
- คุณสมบัติที่เกี่ยวข้องกับ C++:
- ความสามารถในการใช้การผูกโครงสร้างในบริบท "constexpr" ตามที่พัฒนาขึ้นในข้อกำหนด C++2c (C++26) ได้ถูกเพิ่มเข้ามาแล้ว ซึ่งหมายความว่าการอ้างอิงถึงนิพจน์คงที่สามารถเป็นนิพจน์คงที่ได้ด้วยตนเอง มีการใช้งานการสนับสนุนสำหรับอาร์เรย์และโครงสร้างแบบง่าย (ยังไม่รองรับทูเปิล) constexpr int arr[] = {1, 2}; constexpr auto [x, y] = arr;
- ตามข้อกำหนดของมาตรฐาน C++20 ข้อจำกัดต่างๆ จะถูกแปลงเป็นรูปแบบมาตรฐานก่อนที่จะตรวจสอบ ทำให้สามารถแสดงข้อความวินิจฉัยที่แม่นยำยิ่งขึ้น และจัดการข้อผิดพลาดในการแทนที่ในอาร์กิวเมนต์เทมเพลตที่ใช้เฉพาะใน concept-id ได้อย่างเหมาะสม
- เพิ่มกลุ่มฟังก์ชันในตัว "__builtin_[lt|gt|le|ge]_synthesizes_from_spaceship" เพื่อตรวจสอบว่าตัวดำเนินการเปรียบเทียบ "<", ">", "<=" และ ">=" ถูกสร้างขึ้นจากตัวดำเนินการ "<=>" หรือไม่
- พารามิเตอร์ "-Wincompatible-pointer-types" ได้ถูกเปลี่ยนให้แสดงข้อผิดพลาดแทนคำเตือน หากต้องการกลับไปใช้พฤติกรรมเดิม ให้ใช้ตัวเลือก "-Wno-error=incompatible-pointer-types"
- เพิ่มฟังก์ชันในตัว __builtin_bswapg, __builtin_elementwise_ldexp, __builtin_elementwise_fshl, __builtin_elementwise_fshr, __builtin_elementwise_minnumnum, __builtin_elementwise_maxnumnum, __builtin_masked_load, __builtin_masked_expand_load, __builtin_masked_store, __builtin_masked_compress_store, __builtin_masked_gather, __builtin_masked_scatter และ __builtin_dedup_pack ตัวอย่างเช่น builtin_dedup_pack ช่วยให้คุณลบรายการที่ซ้ำกันออกจากรายการประเภทได้ โดยใช้ MyTypeList = TypeList<__builtin_dedup_pack …>; // ประเภทผลลัพธ์จะเป็น TypeList
- เมื่อทำการดีบักพฤติกรรมที่ไม่กำหนดด้วย UBSan (-fsanitize=undefined -fsanitize-trap=undefined) ข้อมูลสาเหตุของข้อผิดพลาดจะถูกรวมอยู่ในข้อมูลการดีบักที่สร้างขึ้นแล้ว มีการเพิ่มแฟล็ก "-fsanitize-debug-trap-reasons" เพื่อระบุระดับรายละเอียดของข้อมูลข้อผิดพลาด สามารถตั้งค่าเป็น "basic" สำหรับคำอธิบายทั่วไป (เช่น "การบวกจำนวนเต็มเกินขีดจำกัด") และ "detailed" เพื่อรวมข้อมูลโดยละเอียด (เช่น "การบวกจำนวนเต็มแบบมีเครื่องหมายเกินขีดจำกัดใน 'a + b'")
- เพิ่มแฟล็กคอมไพเลอร์ใหม่:
- "-f[no-]sanitize-debug-trap-reasons" ใช้เพื่อควบคุมว่าจะฝังเหตุผลของการดักจับข้อยกเว้นไว้ในข้อมูลการดีบักหรือไม่ เมื่อคอมไพล์ด้วยโหมด "-fsanitize-trap"
- ตัวเลือก "-fsanitize=alloc-token", "-falloc-token-max", "-fsanitize-alloc-token-fast-abi" และ "-fsanitize-alloc-token-extended" ใช้สำหรับจัดการโทเค็นการจัดสรรหน่วยความจำ
- "-fmatrix-memory-layout" ใช้สำหรับควบคุมรูปแบบการจัดเรียงหน่วยความจำของชนิดข้อมูลเมทริกซ์ (เช่น column-major สำหรับรูปแบบ column-major, row-major สำหรับรูปแบบ row-major)
- ขณะนี้ฟังก์ชันต่างๆ มีแอตทริบิวต์ "malloc_span" ซึ่งคล้ายกับแอตทริบิวต์ malloc แต่ใช้ได้กับฟังก์ชันที่ส่งคืนโครงสร้างคล้าย span ซึ่งประกอบด้วยตัวชี้และฟิลด์ที่มีขนาดหรือตัวชี้ไปยังจุดสิ้นสุดของบล็อก
- เพิ่มแอตทริบิวต์ "modular_format" เพื่อเลือกการใช้งานฟังก์ชัน printf ที่เชื่อมโยงแบบคงที่ตามที่ต้องการโดยอัตโนมัติในระหว่างการเชื่อมโยง
- เครื่องมือวินิจฉัยและวิเคราะห์แบบคงที่ได้รับการพัฒนาเพิ่มเติม และมีการเพิ่มการตรวจสอบใหม่ๆ (มีการปรับปรุงที่เกี่ยวข้องกับการวินิจฉัยหลายสิบรายการ)
- มีการเพิ่มฟังก์ชันภายในเพิ่มเติมสำหรับส่วนขยาย SSE, AVX และ AVX512 ลงในแบ็กเอนด์ X86 แล้ว นอกจากนี้ยังมีการเพิ่มโหมดการสร้างสำหรับซีพียู Intel ที่ใช้สถาปัตยกรรมไมโคร Wildcat Lake (-march=wildcatlake) และ Nova Lake (-march=novalake) ด้วย
- แบ็กเอนด์ AArch64 รองรับโปรเซสเซอร์ Ampere Computing Ampere1C (ampere1c), Arm C1-Nano (c1-nano), Arm C1-Pro (c1-pro), Arm C1-Premium (c1-premium) และ Arm C1-Ultra (c1-ultra) แล้ว มีการเพิ่มฟังก์ชันในตัวเพิ่มเติมสำหรับคำสั่ง FCVTZ[US], FCVTN[US], FCVTM[US], FCVTP[US] และ FCVTA[US] การสนับสนุน Function Multi-Versioning (FMV) ได้รับการแก้ไขให้เสถียรแล้ว ผู้ใช้สามารถกำหนดลำดับความสำคัญของฟังก์ชันเวอร์ชันต่างๆ ได้แล้ว
- เพิ่มการรองรับสถาปัตยกรรม LoongArch32 (LA32R, LA32S)
- ปรับปรุงส่วนประมวลผลแบ็กเอนด์สำหรับสถาปัตยกรรม ARM, AMDGPU, RISC-V, LoongArch64, MIPS, WebAssembly และ PowerPC
ที่มา: opennet.ru
