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

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

การปรับปรุงใน Clang 12.0:

  • การสนับสนุนสำหรับแอตทริบิวต์ "น่าจะ" และ "ไม่น่าจะ" ที่เสนอในมาตรฐาน C ++ 20 ได้รับการติดตั้งและเปิดใช้งานตามค่าเริ่มต้น ทำให้เครื่องมือเพิ่มประสิทธิภาพได้รับแจ้งเกี่ยวกับความน่าจะเป็นของโครงสร้างแบบมีเงื่อนไขที่ถูกทริกเกอร์ (เช่น "[[มีแนวโน้มว่า ]] ถ้า (สุ่ม > 0) {“)
  • เพิ่มการรองรับโปรเซสเซอร์ AMD Zen 3 (-march=znver3), Intel Alder Lake (-march=alderlake) และ Intel Sapphire Rapids (-march=sapphirerapids)
  • เพิ่มการรองรับแฟล็ก "-march=x86-64-v[234]" เพื่อเลือกระดับสถาปัตยกรรม x86-64 (v2 - ครอบคลุมส่วนขยาย SSE4.2, SSSE3, POPCNT และ CMPXCHG16B; v3 - AVX2 และ MOVBE; v4 - AVX-512 ) .
  • เพิ่มการรองรับโปรเซสเซอร์ Arm Cortex-A78C (cortex-a78c), Arm Cortex-R82 (cortex-r82), Arm Neoverse V1 (neoverse-v1), Arm Neoverse N2 (neoverse-n2) และ Fujitsu A64FX (a64fx) ตัวอย่างเช่น หากต้องการเปิดใช้งานการปรับให้เหมาะสมสำหรับ CPU Neoverse-V1 คุณสามารถระบุ “-mcpu=neoverse-v1”
  • สำหรับสถาปัตยกรรม AArch64 มีการเพิ่มแฟล็กคอมไพเลอร์ใหม่ "-moutline-atomics" และ "-mno-outline-atomics" เพื่อเปิดหรือปิดใช้งานฟังก์ชันตัวช่วยการดำเนินการของอะตอมมิก เช่น "__aarch64_cas8_relax" ฟังก์ชันดังกล่าวตรวจพบในขณะรันไทม์ว่ารองรับ LSE (Large System Extensions) หรือไม่ และใช้คำสั่งตัวประมวลผลอะตอมมิกที่ให้มา หรือถอยกลับไปใช้คำสั่ง LL/SC (Load-link/store-conditional) สำหรับการซิงโครไนซ์
  • เพิ่มตัวเลือก "-fbinutils-version" เพื่อเลือกเวอร์ชันเป้าหมายของชุด binutils เพื่อให้เข้ากันได้กับพฤติกรรมของลิงเกอร์และแอสเซมเบลอร์รุ่นเก่า
  • สำหรับไฟล์ปฏิบัติการ ELF เมื่อระบุแฟล็ก "-gz" การบีบอัดข้อมูลการดีบักโดยใช้ไลบรารี zlib จะถูกเปิดใช้งานตามค่าเริ่มต้น (gz=zlib) การเชื่อมโยงไฟล์อ็อบเจ็กต์ผลลัพธ์ต้องใช้ lld หรือ GNU binutils 2.26+ หากต้องการคืนค่าความเข้ากันได้กับ binutils เวอร์ชันเก่า คุณสามารถระบุ "-gz=zlib-gnu"
  • ตัวชี้ 'นี้' ได้รับการประมวลผลด้วยการตรวจสอบที่ไม่ใช่ค่าว่างและสามารถอ้างอิงได้ (N) หากต้องการลบแอตทริบิวต์ที่ไม่เป็นค่าว่าง หากคุณต้องการใช้ค่า NULL คุณสามารถใช้ตัวเลือก "-fdelete-null-pointer-checks"
  • บนแพลตฟอร์ม Linux โหมด "-fasynchronous-unwind-tables" ถูกเปิดใช้งานสำหรับสถาปัตยกรรม AArch64 และ PowerPC เพื่อสร้างตารางการโทรแบบผ่อนคลาย เช่นเดียวกับใน GCC
  • ใน "#pragma clang loop vectorize_width" เพิ่มความสามารถในการระบุตัวเลือก "คงที่" (ค่าเริ่มต้น) และ "ปรับขนาดได้" เพื่อเลือกวิธีการทำเวกเตอร์ โหมด "ปรับขนาดได้" เป็นอิสระจากความยาวของเวกเตอร์ เป็นโหมดทดลองและสามารถใช้กับฮาร์ดแวร์ที่รองรับการทำเวกเตอร์แบบปรับขนาดได้
  • การสนับสนุนที่ได้รับการปรับปรุงสำหรับแพลตฟอร์ม Windows: มีการเตรียมแอสเซมบลีไบนารีอย่างเป็นทางการสำหรับ Windows บนระบบ Arm64 รวมถึงคอมไพเลอร์ Clang, LLD linker และไลบรารีรันไทม์ของคอมไพเลอร์-rt เมื่อสร้างสำหรับแพลตฟอร์มเป้าหมาย MinGW ส่วนต่อท้าย .exe จะถูกเพิ่ม แม้ว่าจะมีการคอมไพล์ข้ามก็ตาม
  • ความสามารถที่เกี่ยวข้องกับการรองรับ OpenCL, OpenMP และ CUDA ได้รับการขยายแล้ว เพิ่มตัวเลือก "-cl-std=CL3.0" และ "-cl-std=CL1.0" เพื่อเลือกตัวเลือกมาโครสำหรับ OpenCL 3.0 และ OpenCL 1.0 มีการขยายเครื่องมือวินิจฉัย
  • เพิ่มการรองรับคำสั่ง HRESET, UINTR และ AVXVNNI ที่ใช้ในโปรเซสเซอร์ที่ใช้ x86 บางตัว
  • บนระบบ x86 มีการเปิดใช้งานการรองรับตัวเลือก "-mtune=" " ซึ่งเปิดใช้งานการปรับให้เหมาะสมทางสถาปัตยกรรมจุลภาคที่เลือก โดยไม่คำนึงถึงค่าของ "-march= "
  • เครื่องวิเคราะห์แบบคงที่ได้ปรับปรุงการประมวลผลฟังก์ชัน POSIX บางอย่างและปรับปรุงการกำหนดผลลัพธ์ของการดำเนินการตามเงื่อนไขอย่างมีนัยสำคัญเมื่อมีค่าสัญลักษณ์หลายค่าในการเปรียบเทียบ เพิ่มการตรวจสอบใหม่: fuchia.HandleChecker (กำหนดการจัดการในโครงสร้าง), webkit.UncountedLambdaCapturesChecker webkit และ alpha.webkit.UncountedLocalVarsChecker (คำนึงถึงลักษณะเฉพาะของการทำงานกับพอยน์เตอร์ในโค้ดกลไก WebKit)
  • ในนิพจน์ที่ใช้ในบริบทของค่าคงที่ อนุญาตให้ใช้ฟังก์ชันในตัว __builtin_bitreverse*, __builtin_rotateleft*, __builtin_rotateright*, _mm_popcnt*, _bit_scan_forward, __bsfd, __bsfq, __bit_scan_reverse, __bsrd, __bsrq, __bswap, __bswapd, __bswap64 ได้รับอนุญาต __bswapq , _castf*, __rol* และ __ror*
  • เพิ่มตัวเลือก BitFieldColonSpacing ให้กับยูทิลิตี้รูปแบบเสียงดังกราวเพื่อเลือกระยะห่างรอบตัวระบุ คอลัมน์ และคำจำกัดความของฟิลด์
  • เซิร์ฟเวอร์แคช clangd (เซิร์ฟเวอร์ Clang) บนแพลตฟอร์ม Linux ได้ลดการใช้หน่วยความจำลงอย่างมากในระหว่างการดำเนินการระยะยาว (มีการเรียก malloc_trim เป็นระยะเพื่อส่งคืนเพจหน่วยความจำว่างไปยังระบบปฏิบัติการ)

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

  • การสนับสนุนเครื่องมือสร้าง llvm-build ที่เขียนด้วย Python ถูกยกเลิกแล้ว และโปรเจ็กต์ได้เปลี่ยนไปใช้ระบบการสร้าง CMake แทนโดยสิ้นเชิง
  • ในแบ็กเอนด์สำหรับสถาปัตยกรรม AArch64 มีการปรับปรุงการรองรับแพลตฟอร์ม Windows: การสร้างเอาต์พุตแอสเซมเบลอร์ที่ถูกต้องสำหรับระบบ Windows เป้าหมายได้รับการปรับปรุง การสร้างข้อมูลในการโทรแบบคลี่คลายได้รับการปรับให้เหมาะสม (ขนาดของข้อมูลดังกล่าวลดลง 60 %) ความสามารถในการสร้างข้อมูลคลี่คลายโดยใช้แอสเซมเบลอร์ได้รับการเพิ่มคำสั่ง .seh_*
  • แบ็กเอนด์สำหรับสถาปัตยกรรม PowerPC มีการปรับแต่งใหม่สำหรับลูปและการปรับใช้แบบอินไลน์ การสนับสนุนเพิ่มเติมสำหรับโปรเซสเซอร์ Power10 เพิ่มการรองรับคำสั่ง MMA สำหรับการจัดการเมทริกซ์ และการสนับสนุนที่ได้รับการปรับปรุงสำหรับระบบปฏิบัติการ AIX
  • แบ็กเอนด์ x86 เพิ่มการรองรับโปรเซสเซอร์ AMD Zen 3, Intel Alder Lake และ Intel Sapphire Rapids รวมถึงคำสั่งโปรเซสเซอร์ HRESET, UINTR และ AVXVNNI รองรับ MPX (ส่วนขยายการป้องกันหน่วยความจำ) สำหรับการตรวจสอบพอยน์เตอร์เพื่อให้แน่ใจว่าไม่รองรับขอบเขตหน่วยความจำอีกต่อไป (เทคโนโลยีนี้ไม่แพร่หลายและได้ถูกลบออกจาก GCC และเสียงดังกราวแล้ว) เพิ่มการรองรับแอสเซมเบลอร์สำหรับคำนำหน้า {disp32} และ {disp8} และส่วนต่อท้าย .d32 และ .d8 เพื่อควบคุมขนาดของโอเปอเรเตอร์ออฟเซ็ตและการข้าม เพิ่มคุณลักษณะใหม่ "tune-cpu" เพื่อควบคุมการรวมการเพิ่มประสิทธิภาพทางสถาปัตยกรรมขนาดเล็ก
  • มีการเพิ่มโหมดใหม่ “-fsanitize=unsigned-shift-base” ให้กับตัวตรวจจับปัญหาจำนวนเต็ม (ตัวฆ่าเชื้อจำนวนเต็ม “-fsanitize=integer”) เพื่อตรวจจับการล้นของจำนวนเต็มที่ไม่ได้ลงนามหลังจากเลื่อนไปทางซ้ายเล็กน้อย
  • ในเครื่องตรวจจับต่างๆ (asan, cfi, lsan, msan, tsan, ubsan sanitizer) ได้มีการเพิ่มการสนับสนุนสำหรับการแจกแจง Linux ด้วยไลบรารี Musl มาตรฐาน
  • ความสามารถของตัวเชื่อมโยง LLD ได้รับการขยายแล้ว ปรับปรุงการรองรับรูปแบบ ELF รวมถึงตัวเลือกเพิ่มเติม “--dependency-file”, “-error-handling-script”, “-lto-pseudo-probe-for-profiling”, “-no-lto-whole-program -การมองเห็น” " ปรับปรุงการรองรับ MinGW สำหรับรูปแบบ Mach-O (macOS) มีการรองรับสถาปัตยกรรม arm64, arm และ i386, การเพิ่มประสิทธิภาพเวลาลิงก์ (LTO) และการคลี่คลายสแต็กสำหรับการจัดการข้อยกเว้น
  • Libc++ ใช้คุณลักษณะใหม่ของมาตรฐาน C++20 และได้เริ่มพัฒนาคุณลักษณะของข้อกำหนด C++2b เพิ่มการสนับสนุนสำหรับการสร้างด้วยการปิดใช้งานการสนับสนุนการแปล (“-DLIBCXX_ENABLE_LOCALIZATION=OFF”) และอุปกรณ์สำหรับการสร้างตัวเลขสุ่มหลอก (“-DLIBCXX_ENABLE_RANDOM_DEVICE=OFF”)

ที่มา: opennet.ru

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