หลังจากหกเดือนของการพัฒนา
การเปลี่ยนแปลงที่สำคัญในรุ่นใหม่คือการรวม
- เพิ่มความสามารถในการกู้คืนแผนผังไวยากรณ์นามธรรม (
AST ) สำหรับโค้ด C++ ที่เสียหาย ซึ่งสามารถใช้เพื่อช่วยวินิจฉัยข้อผิดพลาดและให้ข้อมูลเพิ่มเติมแก่ยูทิลิตี้ภายนอก เช่น clang-tidy และ clangd คุณลักษณะนี้เปิดใช้งานตามค่าเริ่มต้นสำหรับโค้ด C++ และควบคุมผ่านตัวเลือก "-Xclang -f[no-]recovery-ast" - เพิ่มโหมดการวินิจฉัยใหม่:
- “-Wpointer-to-int-cast” คือกลุ่มคำเตือนเกี่ยวกับการหล่อพอยน์เตอร์เป็นประเภทจำนวนเต็ม int ที่ไม่รองรับค่าที่เป็นไปได้ทั้งหมด
- “-Wuninitialized-const-reference” - คำเตือนเกี่ยวกับการส่งตัวแปรที่ไม่ได้กำหนดค่าเริ่มต้นในพารามิเตอร์ฟังก์ชันที่ยอมรับอาร์กิวเมนต์อ้างอิงด้วยแอตทริบิวต์ "const"
- "-Wimplicit-const-int-float-conversion" - เปิดใช้งานโดยคำเตือนเริ่มต้นเกี่ยวกับการแปลงโดยนัยของค่าคงที่จริงเป็นประเภทจำนวนเต็ม
- สำหรับแพลตฟอร์ม ARM จะมีฟังก์ชัน C ที่สร้างไว้ในคอมไพเลอร์ให้ไว้ (
อินทรินซิกส์ ) แทนที่ด้วยคำสั่งเวกเตอร์ที่มีประสิทธิภาพ Arm v8.1-M MVE และ CDE ฟังก์ชันที่ใช้ได้ถูกกำหนดไว้ในไฟล์ส่วนหัว arm_mve.h และ arm_cde.h -
เพิ่ม ชุดของประเภทจำนวนเต็มขยาย _ExtInt(N) ช่วยให้คุณสร้างประเภทที่ไม่ทวีคูณของกำลังสอง ซึ่งสามารถประมวลผลได้อย่างมีประสิทธิภาพบน FPGA/HLSเช่น , _ExtInt(7) กำหนดประเภทจำนวนเต็มประกอบด้วย 7 บิต - เพิ่มมาโครที่กำหนดการรองรับฟังก์ชัน C ในตัวตามคำสั่ง ARM SVE (Scalable Vector Extension):
__ARM_FEATURE_SVE, __ARM_FEATURE_SVE_BF16,
__ARM_FEATURE_SVE_MATMUL_FP32, __ARM_FEATURE_SVE_MATMUL_FP64,
__ARM_FEATURE_SVE_MATMUL_INT8,
__ARM_FEATURE_SVE2, __ARM_FEATURE_SVE2_AES,
__ARM_FEATURE_SVE2_BITPERM,
__ARM_FEATURE_SVE2_SHA3,
__ARM_FEATURE_SVE2_SM4. ตัวอย่างเช่น มาโคร __ARM_FEATURE_SVE ถูกกำหนดไว้เมื่อสร้างโค้ด AArch64 โดยการตั้งค่าตัวเลือกบรรทัดคำสั่ง "-march=armv8-a+sve" - ขณะนี้แฟล็ก "-O" ถูกระบุด้วยโหมดการปรับให้เหมาะสม "-O1" แทน "-O2"
- เพิ่มแฟล็กคอมไพเลอร์ใหม่:
- "-fstack-clash-protection" - ช่วยให้สามารถป้องกันได้
จุดตัดของสแต็กและฮีป . - "-ffp-Exception-behavior={ignore,maytrap,strict}" - อนุญาตให้คุณเลือกโหมดตัวจัดการข้อยกเว้นสำหรับตัวเลขทศนิยม
- "-ffp-model={precise,strict,fast}" - ทำให้การเข้าถึงชุดตัวเลือกพิเศษสำหรับตัวเลขทศนิยมง่ายขึ้น
- "-fpch-codegen" และ "-fpch-debuginfo" เพื่อสร้างส่วนหัวที่คอมไพล์แล้ว (PCH) พร้อมไฟล์อ็อบเจ็กต์แยกต่างหากสำหรับโค้ดและ debuginfo
- “-fsanitize-coverage-allowlist” และ “-fsanitize-coverage-blocklist” สำหรับการตรวจสอบความครอบคลุมในการทดสอบรายการขาวและดำ
- “-mtls-size={12,24,32,48}” เพื่อเลือกขนาด TLS (thread-local storage)
- "-menable-experimental-extension" เพื่อเปิดใช้งานส่วนขยาย RISC-V รุ่นทดลอง
- "-fstack-clash-protection" - ช่วยให้สามารถป้องกันได้
- โหมดเริ่มต้นสำหรับ C คือ "-fno-common" ซึ่งช่วยให้สามารถเข้าถึงตัวแปรทั่วโลกได้อย่างมีประสิทธิภาพมากขึ้นในบางแพลตฟอร์ม
- แคชโมดูลเริ่มต้นถูกย้ายจาก /tmp ไปยังไดเร็กทอรี ~/.cache หากต้องการแทนที่ คุณสามารถใช้แฟล็ก “-fmodules-cache-path=”
- มาตรฐานภาษา C เริ่มต้นได้รับการอัปเดตจาก gnu11 เป็น gnu17
- เพิ่มการสนับสนุนเบื้องต้นสำหรับส่วนขยาย GNU C "
asm แบบอินไลน์ » เพื่อเพิ่มส่วนแทรกของแอสเซมเบลอร์ ส่วนขยายยังคงอยู่ในระหว่างการวิเคราะห์ แต่ไม่ได้ประมวลผลแต่อย่างใด - ความสามารถที่เกี่ยวข้องกับการรองรับ OpenCL และ CUDA ได้รับการขยายแล้ว เพิ่มการรองรับการวินิจฉัยบล็อก OpenCL 2.0 และใช้ฟีเจอร์ OpenMP 5.0 ใหม่
- เพิ่มตัวเลือก IndentExternBlock ให้กับยูทิลิตี้รูปแบบเสียงดังกราวสำหรับการจัดตำแหน่งภายในบล็อกภายนอก "C" และบล็อกภายนอก "C ++"
- ตัววิเคราะห์แบบคงที่ได้ปรับปรุงการจัดการตัวสร้างที่สืบทอดมาใน C ++ เพิ่มการตรวจสอบใหม่ alpha.core.C11Lock และ alpha.fuchsia.Lock เพื่อตรวจสอบการล็อค alpha.security.cert.pos.34c เพื่อตรวจจับการใช้งาน putenv, webkit.NoUncountedMemberChecker และ webkit.RefCntblBaseVirtualDtor ที่ไม่ปลอดภัยเพื่อตรวจจับปัญหาเกี่ยวกับประเภทที่นับไม่ได้ alpha .cplusplus .SmartPtr เพื่อตรวจสอบการยกเลิกการอ้างอิงตัวชี้อัจฉริยะที่เป็นโมฆะ
- ในเสียงดังกราวเป็นระเบียบเรียบร้อย
เพิ่ม เช็คใหม่ส่วนใหญ่ - เซิร์ฟเวอร์แคช clangd (Clang Server) ได้รับการปรับปรุงประสิทธิภาพและเพิ่มความสามารถในการวินิจฉัยใหม่
หลัก
- ระบบบิลด์ได้เปลี่ยนไปใช้ Python 3 แล้ว หากไม่มี Python 3 ก็สามารถย้อนกลับไปใช้ Python 2 ได้
- ส่วนหน้าที่มีคอมไพเลอร์สำหรับภาษา Go (llgo) จะไม่รวมอยู่ในการเปิดตัว ซึ่งอาจมีการปรับโครงสร้างใหม่ในอนาคต
- คุณลักษณะ vector-function-abi-variant ได้รับการเพิ่มในการเป็นตัวแทนระดับกลาง (IR) เพื่ออธิบายการแมประหว่างฟังก์ชันสเกลาร์และฟังก์ชันเวกเตอร์เพื่อเรียกแบบเวกเตอร์ จาก llvm::VectorType มีเวกเตอร์สองประเภทแยกกัน llvm::FixedVectorType และ llvm::ScalableVectorType
- การแตกแขนงตามค่า udef และส่งผ่านค่า undef ไปยังฟังก์ชันไลบรารีมาตรฐานจะได้รับการยอมรับว่าเป็นพฤติกรรมที่ไม่ได้กำหนดไว้ ใน
memset/memcpy/memmove อนุญาตให้ส่งผ่านตัวชี้ undef แต่หากพารามิเตอร์ที่มีขนาดเป็นศูนย์ - LLJIT ได้เพิ่มการสนับสนุนสำหรับการดำเนินการกำหนดค่าเริ่มต้นแบบคงที่ผ่านวิธี LLJIT::initialize และ LLJIT::deinitialize ความสามารถในการเพิ่มไลบรารีแบบคงที่ให้กับ JITDylib โดยใช้คลาส StaticLibraryDefinitionGenerator ได้ถูกนำมาใช้แล้ว เพิ่ม C API สำหรับ
โออาร์ซีv2 (API สำหรับการสร้างคอมไพเลอร์ JIT) - เพิ่มการรองรับโปรเซสเซอร์ Cortex-A64, Cortex-A34, Cortex-A77 และ Cortex-X78 ให้กับแบ็กเอนด์สำหรับสถาปัตยกรรม AArch1 ใช้งานส่วนขยาย ARMv8.2-BF16 (BFloat16) และ ARMv8.6-A รวมถึง RMv8.6-ECV (Enhanced Counter Virtualization), ARMv8.6-FGT (Fine Grained Traps), ARMv8.6-AMU (Virtualization Monitors กิจกรรม) และ ARMv8.0-DGH (คำแนะนำในการรวบรวมข้อมูล) มีความสามารถในการสร้างโค้ดสำหรับการเชื่อมโยงฟังก์ชันในตัวกับคำสั่งเวกเตอร์ SVE
- เพิ่มการรองรับโปรเซสเซอร์ Cortex-M55, Cortex-A77, Cortex-A78 และ Cortex-X1 ให้กับแบ็กเอนด์สำหรับสถาปัตยกรรม ARM ส่วนขยายถูกนำมาใช้
Armv8.6-A เมทริกซ์คูณและ RMv8.2-AA32BF16 BFloat16 - เพิ่มการสนับสนุนการสร้างโค้ดสำหรับโปรเซสเซอร์ POWER10 ในส่วนแบ็คเอนด์สำหรับสถาปัตยกรรม PowerPC การเพิ่มประสิทธิภาพลูปได้รับการขยายและปรับปรุงการรองรับจุดลอยตัวแล้ว
- แบ็กเอนด์สำหรับสถาปัตยกรรม RISC-V ช่วยให้สามารถรับแพตช์ที่รองรับชุดคำสั่งขยายแบบทดลองที่ยังไม่ได้รับการอนุมัติอย่างเป็นทางการ
- แบ็กเอนด์สำหรับสถาปัตยกรรม AVR ได้รับการถ่ายโอนจากหมวดหมู่ทดลองไปยังเสถียร ซึ่งรวมอยู่ในการกระจายพื้นฐาน
- แบ็กเอนด์สำหรับสถาปัตยกรรม x86 รองรับคำสั่ง Intel AMX และ TXLDTRK เพิ่มการป้องกันการโจมตี
แอลวีไอ (การแทรกค่าโหลด) และยังใช้กลไกปราบปรามผลข้างเคียงของการดำเนินการเก็งกำไรทั่วไปเพื่อป้องกันการโจมตีที่เกิดจากการดำเนินการเก็งกำไรบน CPU - ในแบ็กเอนด์สำหรับสถาปัตยกรรม SystemZ มีการเพิ่มการรองรับ MemorySanitizer และ LeakSanitizer
- เพิ่มการรองรับไฟล์ส่วนหัวพร้อมค่าคงที่ทางคณิตศาสตร์เป็น Libc++
. -
ขยายแล้ว ความสามารถของตัวเชื่อมโยง LLD ปรับปรุงการรองรับรูปแบบ ELF รวมถึงตัวเลือกเพิ่มเติม "--lto-emit-asm", "--lto-whole-program-visibility", "-print-archive-stats", "-shuffle-sections", " -thinlto- โมดูลเดียว", "-ไม่ซ้ำกัน", "-rosegment", "-threads=N" เพิ่มตัวเลือก "--time-trace" เพื่อบันทึกการติดตามลงในไฟล์ ซึ่งสามารถวิเคราะห์ได้ผ่านทางอินเทอร์เฟซ chrome://tracing ใน Chrome
ที่มา: opennet.ru