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

หลังจากหกเดือนของการพัฒนา การเปิดตัวโครงการ 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

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