หลังจากหกเดือนของการพัฒนา การเปิดตัวโครงการ LLVM 16.0 ได้ถูกนำเสนอ ซึ่งเป็นชุดเครื่องมือที่เข้ากันได้กับ GCC (คอมไพเลอร์ ตัวเพิ่มประสิทธิภาพ และตัวสร้างโค้ด) ที่รวบรวมโปรแกรมเป็นบิตโค้ดระดับกลางของคำสั่งเสมือนที่คล้ายกับ RISC (เครื่องเสมือนระดับต่ำที่มี ระบบการเพิ่มประสิทธิภาพหลายระดับ) รหัสจำลองที่สร้างขึ้นสามารถแปลงโดยคอมไพเลอร์ JIT เป็นคำสั่งเครื่องได้ทันทีที่ดำเนินการโปรแกรม
การปรับปรุงที่สำคัญใน Clang 16.0:
- มาตรฐาน C++/ObjC++ เริ่มต้นถูกตั้งค่าเป็น gnu++17 (เดิมคือ gnu++14) ซึ่งแสดงถึงการรองรับคุณลักษณะ C++17 พร้อมส่วนขยาย GNU ตามค่าเริ่มต้น คุณสามารถใช้ตัวเลือก "-std=gnu++14" เพื่อเปลี่ยนกลับเป็นพฤติกรรมก่อนหน้า
- ใช้คุณสมบัติขั้นสูงที่เกี่ยวข้องกับมาตรฐาน C ++ 20:
- ฟังก์ชั่นสมาชิกพิเศษเล็กน้อยแบบมีเงื่อนไข
- จับการเชื่อมโยงที่มีโครงสร้างในฟังก์ชันแลมบ์ดา
- ตัวดำเนินการความเท่าเทียมกันภายในนิพจน์
- ความสามารถในการไม่ระบุคีย์เวิร์ด typename ในบางบริบท
- การอนุญาตการเริ่มต้นรวมในวงเล็บ ("Aggr(val1, val2)")
- คุณลักษณะที่นำไปใช้ที่กำหนดไว้ในมาตรฐาน C++2b ในอนาคต:
- อนุญาตให้ใช้ป้ายกำกับที่ส่วนท้ายของนิพจน์ผสม
- ตัวดำเนินการคงที่ (),
- ตัวดำเนินการคงที่[],
- ให้ความเข้ากันได้กับประเภท char8_t
- ช่วงของอักขระที่อนุญาตให้ใช้ใน "\N{...}" ได้รับการขยายแล้ว
- เพิ่มความสามารถในการใช้ตัวแปรที่ประกาศเป็น "static constexpr" ในฟังก์ชันที่ประกาศเป็น constexpr
- คุณลักษณะที่นำไปใช้ที่กำหนดไว้ในมาตรฐาน C2x C ในอนาคต:
- หากต้องการปิดใช้งานคำเตือน "-Wunused-label" สามารถใช้แอตทริบิวต์ "[[maybe_unused]]" กับป้ายกำกับได้
- ป้ายกำกับสามารถวางไว้ที่ใดก็ได้ภายในนิพจน์ผสม
- เพิ่มตัวดำเนินการ typeof และ typeof_unqual
- ชนิด nullptr_t ใหม่และค่าคงที่ nullptr เพื่อกำหนดพอยน์เตอร์ null ที่สามารถแปลงเป็นพอยน์เตอร์ชนิดใดก็ได้ และแสดงถึงตัวแปรของ NULL ที่ไม่ผูกพันกับชนิดอินทิกรัลและ void*
- ในโหมด C2x อนุญาตให้เรียกใช้แมโคร va_start ด้วยจำนวนตัวแปรของอาร์กิวเมนต์ (variadic)
- ในโหมดความสอดคล้อง C99, C11 และ C17 ตัวเลือก "-Wimplicit-function-declaration" และ "-Wimplicit-int" จะสร้างข้อผิดพลาดแทนคำเตือนตามค่าเริ่มต้น
- การใช้ "โมฆะ *" ทางอ้อม (ตัวอย่างเช่น "โมฆะ func(โมฆะ *p) { *p; }") ในโหมด C++ ในขณะนี้ทำให้เกิดข้อผิดพลาด คล้ายกับ ISO C++, GCC, ICC และ MSVC
- การระบุบิตฟิลด์เป็นตัวดำเนินการคำสั่ง (เช่น "__asm { mov eax, s.bf }") ในบล็อกแอสเซมบลีอินไลน์สไตล์ Microsoft ทำให้เกิดข้อผิดพลาด
- เพิ่มการวินิจฉัยสำหรับการมีอยู่ของโครงสร้างและยูเนี่ยนต่างๆ ที่มีชื่อเดียวกันในโมดูลต่างๆ
- ความสามารถที่เพิ่มขึ้นที่เกี่ยวข้องกับการรองรับ OpenCL และ OpenMP ปรับปรุงการวินิจฉัยแม่แบบ C++ ที่ใช้ในอาร์กิวเมนต์เคอร์เนล OpenCL ปรับปรุงการรองรับบล็อกการเข้าคิวสำหรับ AMDGPU แอตทริบิวต์ nounwind ถูกเพิ่มไปยังฟังก์ชันทั้งหมดโดยปริยาย ปรับปรุงการรองรับฟังก์ชันในตัว
- ให้ความสามารถในการใช้ตัวแปรสภาพแวดล้อม CLANG_CRASH_DIAGNOSTICS_DIR เพื่อกำหนดไดเร็กทอรีที่บันทึกข้อมูลการวินิจฉัยข้อขัดข้อง
- การสนับสนุน Unicode ได้รับการอัปเดตเป็นข้อกำหนด Unicode 15.0 อนุญาตให้ใช้สัญลักษณ์ทางคณิตศาสตร์บางอย่างในตัวระบุ เช่น "₊" (เช่น "double xₖ₊₁")
- เพิ่มการสนับสนุนสำหรับการโหลดไฟล์การกำหนดค่าหลายไฟล์ (ไฟล์การกำหนดค่าเริ่มต้นจะถูกโหลดก่อน แล้วจึงโหลดไฟล์ที่ระบุผ่านแฟล็ก "--config=" ซึ่งสามารถระบุได้หลายครั้ง) เปลี่ยนลำดับการโหลดไฟล์การกำหนดค่าเริ่มต้น: เสียงดังกราวพยายามโหลดไฟล์ก่อน - .cfg และหากไม่พบให้ลองโหลดสองไฟล์ .cfg และ .cfg เพิ่มแฟล็ก "--no-default-config" เพื่อปิดใช้งานการโหลดไฟล์การกำหนดค่าตามค่าเริ่มต้น
- เพื่อให้แน่ใจว่าบิลด์ซ้ำได้ คุณสามารถแทนที่ค่าวันที่และเวลาปัจจุบันในมาโคร __DATE__, __TIME__ และ __TIMESTAMP__ ด้วยเวลาที่ระบุในตัวแปรสภาพแวดล้อม SOURCE_DATE_EPOCH
- ในการตรวจสอบฟังก์ชันในตัว (บิวด์อิน) ที่สามารถใช้ในบริบทของค่าคงที่ ได้เพิ่มมาโคร "__has_constexpr_buildin"
- เพิ่มแฟล็กคอมไพล์ใหม่ "-fcoro-aligned-allocation" สำหรับการกระจายเฟรม coroutine ในแนวเดียวกัน
- แฟล็ก "-fstrict-flex-arrays=" ใช้การสนับสนุนระดับที่สามของการตรวจสอบองค์ประกอบอาร์เรย์ที่ยืดหยุ่นในโครงสร้าง (Flexible Array Members ซึ่งเป็นอาร์เรย์ที่มีขนาดไม่แน่นอนที่ส่วนท้ายของโครงสร้าง) ในระดับที่สาม เฉพาะขนาด "[]" (เช่น "int b[]") เท่านั้นที่ถือเป็นอาร์เรย์แบบยืดหยุ่น แต่ขนาด "[0]" (เช่น "int b[0]") ไม่ใช่.
- เพิ่มแฟล็ก "-fmodule-output" เพื่อเปิดใช้งานโมเดลการคอมไพล์เฟสเดียวสำหรับโมดูล C++ มาตรฐาน
- เพิ่มโหมด "-Rpass-analysis=stack-frame-layout" ซึ่งช่วยให้สามารถวินิจฉัยปัญหาเกี่ยวกับเค้าโครงเฟรมสแต็กได้
- มีการเพิ่มแอตทริบิวต์ใหม่ __attribute__((target_version("cpu_features"))) และฟังก์ชันการทำงานของแอตทริบิวต์ __attribute__((target_clones("cpu_features1″,"cpu_features2",...))) ได้รับการขยายเพื่อเลือกเวอร์ชันเฉพาะของคุณสมบัติที่มีให้ โดยซีพียู AArch64
- เครื่องมือวินิจฉัยขั้นสูง:
- เพิ่มคำเตือน "-Wsingle-bit-bitfield-constant-conversion" เพื่อตรวจหาการตัดทอนโดยนัยเมื่อกำหนดหนึ่งให้กับบิตฟิลด์ที่มีลายเซ็นหนึ่งบิต
- การวินิจฉัยเพิ่มเติมของตัวแปร constexpr ที่ไม่ได้กำหนดค่าเริ่มต้น
- เพิ่มคำเตือน "-Wcast-function-type-strict" และ "-Wincompatible-function-pointer-types-strict" เพื่อตรวจหาปัญหาที่อาจเกิดขึ้นกับการแคสต์ประเภทฟังก์ชัน
- เพิ่มการวินิจฉัยสำหรับการใช้ชื่อโมดูลที่ไม่ถูกต้องหรือสงวนไว้ในบล็อกการส่งออก
- ปรับปรุงการตรวจหาคำหลัก "อัตโนมัติ" ที่ขาดหายไปในคำจำกัดความ
- เพิ่มการตรวจสอบสำหรับสถานการณ์โอเวอร์โฟลว์เพิ่มเติมในการดำเนินการคำเตือน "-Winteger-overflow"
- ดำเนินการรองรับสถาปัตยกรรมชุดคำสั่ง LoongArch (-march=loongarch64 หรือ -march=la464) ที่ใช้ในโปรเซสเซอร์ Loongson 3 5000 ซึ่งใช้ RISC ISA ใหม่ที่คล้ายกับ MIPS และ RISC-V
นวัตกรรมที่สำคัญใน LLVM 16.0:
- ในโค้ด LLVM อนุญาตให้ใช้องค์ประกอบที่กำหนดในมาตรฐาน C++17
- ข้อกำหนดด้านสิ่งแวดล้อมที่เพิ่มขึ้นสำหรับการสร้าง LLVM ชุดเครื่องมือสำหรับสร้างควรรองรับมาตรฐาน C++17 เช่น รุ่นต้องมี GCC 7.1, Clang 5.0, Apple Clang 10.0 หรือ Visual Studio 2019 16.7 เป็นอย่างน้อย
- รองรับซีพียู Cortex-A64, Cortex-X715 และ Neoverse V3, แอสเซมเบลอร์ RME MEC (บริบทการเข้ารหัสหน่วยความจำ), ส่วนขยาย Armv2 (จำนวนเชิงซ้อน) และฟังก์ชันหลายเวอร์ชันในแบ็กเอนด์ AArch8.3
- แบ็กเอนด์สถาปัตยกรรม ARM ไม่รองรับแพลตฟอร์มเป้าหมาย Armv2, Armv2A, Armv3 และ Armv3M อีกต่อไป ซึ่งไม่รับประกันการสร้างรหัสที่ถูกต้อง เพิ่มความสามารถในการสร้างรหัสสำหรับคำแนะนำในการทำงานกับจำนวนเชิงซ้อน
- เพิ่มการสนับสนุนสำหรับสถาปัตยกรรมชุดคำสั่ง (ISA) AMX-FP86, CMPCXADD, AVX-IFMA, AVX-VNNI-INT16, AVX-NE-CONVERT ไปยังแบ็กเอนด์ X8 เพิ่มการรองรับคำสั่ง RDMSRLIST, RMSRLIST และ WRMSRNS ใช้ตัวเลือก "-mcpu=raptorlake", "-mcpu=meteorlake", "-mcpu=emeraldrapids", "-mcpu=sierraforest", "-mcpu=graniterapids" และ "-mcpu=grandridge"
- เพิ่มการสนับสนุนอย่างเป็นทางการสำหรับแพลตฟอร์ม LoongArch
- แบ็กเอนด์ที่ได้รับการปรับปรุงสำหรับสถาปัตยกรรม MIPS, PowerPC และ RISC-V
- การสนับสนุนสำหรับการดีบักไฟล์เรียกทำงานแบบ 64 บิตสำหรับสถาปัตยกรรม LoongArch ถูกเพิ่มเข้าไปในดีบักเกอร์ LLDB ปรับปรุงการจัดการสัญลักษณ์การดีบัก COFF มีการกรอง DLL ที่ซ้ำกันในรายการโมดูล Windows ที่โหลดไว้
- ในไลบรารี Libc++ งานหลักมุ่งเน้นไปที่การรองรับคุณสมบัติใหม่ของมาตรฐาน C++20 และ C++23
- เวลาในการเชื่อมโยงลดลงอย่างมากในตัวเชื่อมโยง LDD โดยการสแกนการย้ายที่อยู่แบบขนานและการดำเนินการเริ่มต้นส่วน เพิ่มการรองรับการบีบอัดส่วนโดยใช้อัลกอริทึม ZSTD
ที่มา: opennet.ru