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

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

คุณสมบัติใหม่ของ LLVM 9.0 ประกอบด้วยการลบแท็กการออกแบบทดลองออกจากแพลตฟอร์ม RISC-V เป้าหมาย, การสนับสนุน C++ สำหรับ OpenCL, ความสามารถในการแบ่งโปรแกรมออกเป็นส่วน ๆ ที่โหลดแบบไดนามิกใน LLD และการใช้งาน “กลับไปแล้ว" ใช้ในโค้ดเคอร์เนล Linux libc++ เพิ่มการรองรับ WASI (WebAssembly System Interface) และ LLD เพิ่มการรองรับเบื้องต้นสำหรับการลิงก์แบบไดนามิกของ WebAssembly

การปรับปรุง ในเสียงดังกราว 9.0:

  • เพิ่ม การใช้นิพจน์เฉพาะของ GCC "กลับไปแล้ว“ ซึ่งช่วยให้คุณย้ายจากบล็อกอินไลน์ของแอสเซมเบลอร์ไปยังป้ายกำกับในโค้ด C คุณสมบัตินี้จำเป็นสำหรับการสร้างเคอร์เนล Linux ในโหมด “CONFIG_JUMP_LABEL=y” โดยใช้ Clang บนระบบที่มีสถาปัตยกรรม x86_64 เมื่อคำนึงถึงการเปลี่ยนแปลงที่เพิ่มเข้ามาในรีลีสก่อนหน้านี้ ขณะนี้เคอร์เนล Linux สามารถสร้างได้ใน Clang สำหรับสถาปัตยกรรม x86_64 (ก่อนหน้านี้รองรับเฉพาะสถาปัตยกรรมสำหรับ arm, aarch64, ppc32, ppc64le และ mips เท่านั้น) นอกจากนี้ โครงการ Android และ ChromeOS ได้ถูกแปลงให้ใช้ Clang สำหรับการสร้างเคอร์เนลแล้ว และ Google กำลังทดสอบ Clang เป็นแพลตฟอร์มหลักสำหรับการสร้างเคอร์เนลสำหรับระบบ Linux ที่ใช้งานจริง ในอนาคต ส่วนประกอบ LLVM อื่นๆ สามารถใช้ในกระบวนการสร้างเคอร์เนลได้ รวมถึง LLD, llvm-objcopy, llvm-ar, llvm-nm และ llvm-objdump;
  • เพิ่มการสนับสนุนการทดลองสำหรับการใช้ C++17 ใน OpenCL คุณสมบัติเฉพาะรวมถึงการรองรับแอตทริบิวต์พื้นที่ที่อยู่ การบล็อกการแปลงพื้นที่ที่อยู่ตามตัวดำเนินการหล่อประเภท การจัดหาประเภทเวกเตอร์ใน OpenCL สำหรับ C การมีอยู่ของประเภท OpenCL เฉพาะสำหรับรูปภาพ เหตุการณ์ ช่อง ฯลฯ
  • เพิ่มแฟล็กคอมไพเลอร์ใหม่ “-ftime-trace” และ “-ftime-trace-granularity=N” เพื่อสร้างรายงานเกี่ยวกับเวลาดำเนินการของขั้นตอนต่างๆ ของส่วนหน้า (การแยกวิเคราะห์ การเริ่มต้น) และแบ็กเอนด์ (ขั้นตอนการเพิ่มประสิทธิภาพ) รายงานจะถูกบันทึกในรูปแบบ json ซึ่งเข้ากันได้กับ chrome://tracing และ speedscope.app
  • เพิ่มการประมวลผลตัวระบุ "__declspec (allocator)" และการสร้างข้อมูลการดีบักที่มาพร้อมกันซึ่งช่วยให้คุณสามารถตรวจสอบปริมาณการใช้หน่วยความจำในสภาพแวดล้อม Visual Studio
  • สำหรับภาษา C มีการเพิ่มการรองรับสำหรับมาโคร “__FILE_NAME__” ซึ่งมีลักษณะคล้ายกับมาโคร “__FILE__” แต่จะรวมเฉพาะชื่อไฟล์ที่ไม่มีเส้นทางแบบเต็ม
  • C++ ได้ขยายการสนับสนุนสำหรับแอตทริบิวต์พื้นที่ที่อยู่เพื่อให้ครอบคลุมคุณลักษณะต่างๆ ของ C++ รวมถึงรูปแบบพารามิเตอร์และอาร์กิวเมนต์ ประเภทการอ้างอิง การอนุมานประเภทการส่งคืน อ็อบเจ็กต์ ฟังก์ชันที่สร้างขึ้นอัตโนมัติ ตัวดำเนินการในตัว และอื่นๆ
  • ความสามารถที่เกี่ยวข้องกับการรองรับ OpenCL, OpenMP และ CUDA ได้รับการขยายแล้ว ซึ่งรวมถึงการสนับสนุนเบื้องต้นสำหรับการรวมฟังก์ชัน OpenCL ในตัวโดยนัย (มีการเพิ่มแฟล็ก “-fdeclare-opencl-builtins”) มีการใช้ส่วนขยาย cl_arm_integer_dot_product และเครื่องมือวินิจฉัยได้รับการขยาย
  • การทำงานของเครื่องวิเคราะห์แบบคงที่ได้รับการปรับปรุงและเพิ่มเอกสารเกี่ยวกับการดำเนินการวิเคราะห์แบบคงที่แล้ว เพิ่มแฟล็กเพื่อแสดงโมดูลตัวตรวจสอบที่มีอยู่และตัวเลือกที่รองรับ (“-analyzer-checker[-option]-help”, “-analyzer-checker[-option]-help-alpha” และ “-analyzer-checker[-option]-help ” -ผู้พัฒนา") เพิ่มแฟล็ก "-analyzer-werror" เพื่อถือว่าคำเตือนเป็นข้อผิดพลาด
    เพิ่มโหมดการตรวจสอบใหม่:

    • security.insecureAPI.DeprecatedOrUnsafeBufferHandling เพื่อระบุแนวทางปฏิบัติที่ไม่ปลอดภัยสำหรับการทำงานกับบัฟเฟอร์
    • osx.MIGChecker เพื่อค้นหาการละเมิดกฎการโทร MIG (Mach Interface Generator)
    • optin.osx.OSObjectCStyleCast เพื่อค้นหาการแปลงวัตถุ XNU libkern ที่ไม่ถูกต้อง
    • apiModeling.llvm พร้อมชุดฟังก์ชันการตรวจสอบการสร้างแบบจำลองเพื่อตรวจจับข้อผิดพลาดในโค้ดเบส LLVM
    • รหัสที่เสถียรสำหรับการตรวจสอบวัตถุ C ++ ที่ไม่ได้กำหนดค่าเริ่มต้น (UninitializedObject ในแพ็คเกจ optin.cplusplus)
  • ยูทิลิตี้รูปแบบเสียงดังกราวได้เพิ่มการรองรับการจัดรูปแบบโค้ดในภาษา C# และให้การสนับสนุนสำหรับรูปแบบการจัดรูปแบบโค้ดที่ Microsoft ใช้
  • clang-cl ซึ่งเป็นอินเทอร์เฟซบรรทัดคำสั่งทางเลือกที่ให้ความเข้ากันได้กับระดับตัวเลือกกับคอมไพเลอร์ cl.exe ที่รวมอยู่ใน Visual Studio ได้เพิ่มการวิเคราะห์พฤติกรรมเพื่อถือว่าไฟล์ที่ไม่มีอยู่เป็นตัวเลือกบรรทัดคำสั่งและแสดงคำเตือนที่เกี่ยวข้อง (ตัวอย่างเช่น เมื่อรัน "clang-cl /diagnostic :caret /c test.cc");
  • มีการเพิ่มการตรวจสอบใหม่ส่วนใหญ่ใน linter clang-tidy รวมถึงเพิ่มการตรวจสอบเฉพาะสำหรับ OpenMP API
  • ขยายแล้ว ความสามารถของเซิร์ฟเวอร์ เสียงดังกราว (เซิร์ฟเวอร์เสียงดังกราว) ซึ่งเปิดใช้งานโหมดการสร้างดัชนีพื้นหลังเป็นค่าเริ่มต้น รองรับการดำเนินการตามบริบทด้วยโค้ดที่เพิ่มเข้ามา (การดึงตัวแปร การขยายคำจำกัดความอัตโนมัติและแมโคร การแปลงสตริงที่ Escape ไปเป็นสตริงที่ไม่ได้ใช้ Escape) ความสามารถในการแสดง คำเตือนจาก Clang-tidy ขยายการวินิจฉัยข้อผิดพลาดในไฟล์ส่วนหัวและเพิ่มความสามารถในการแสดงข้อมูลเกี่ยวกับลำดับชั้นของประเภท

หลัก นวัตกรรม LLVM 9.0:

  • มีการเพิ่มคุณลักษณะการแบ่งพาร์ติชันแบบทดลองลงในตัวเชื่อมโยง LLD ซึ่งช่วยให้คุณสามารถแบ่งโปรแกรมหนึ่งออกเป็นหลายส่วน โดยแต่ละส่วนจะอยู่ในไฟล์ ELF แยกต่างหาก คุณสมบัตินี้ช่วยให้คุณสามารถเปิดใช้งานส่วนหลักของโปรแกรม ซึ่งจะโหลดส่วนประกอบอื่น ๆ ตามความจำเป็นระหว่างการดำเนินการ (เช่น คุณสามารถแยกโปรแกรมดู PDF ในตัวออกเป็นไฟล์แยกต่างหาก ซึ่งจะโหลดเมื่อผู้ใช้เปิด PDF เท่านั้น ไฟล์).

    แอลแอลดี ลิงค์เกอร์ นำมาไว้ข้างหน้า ไปยังสถานะที่เหมาะสมสำหรับการเชื่อมโยงเคอร์เนล Linux สำหรับสถาปัตยกรรม arm32_7, arm64, ppc64le และ x86_64
    ตัวเลือกใหม่ "-" (ส่งออกไปยัง stdout), "- [no-]allow-shlib-undef", "-undef-glob", "-nmagic", "-omagic", "-dependent-library", " - z ifunc-noplt" และ "-z ขนาดหน้าทั่วไป" สำหรับสถาปัตยกรรม AArch64 ได้เพิ่มการรองรับคำแนะนำ BTI (Branch Target Indicator) และ PAC (Pointer Authentication Code) แล้ว การรองรับแพลตฟอร์ม MIPS, RISC-V และ PowerPC ได้รับการปรับปรุงอย่างมีนัยสำคัญ เพิ่มการสนับสนุนเบื้องต้นสำหรับการเชื่อมโยงแบบไดนามิกสำหรับ WebAssembly

  • ใน libc++ ดำเนินการ ฟังก์ชั่นขนาด, std::is_constant_evaluated, std::midpoint และ std::lerp, เพิ่มวิธีการ “front” และ “back” ให้กับ std::span, เพิ่มคุณลักษณะของประเภท std::is_unbounded_array และ std::is_bounded_array แล้ว ความสามารถมาตรฐานได้รับการขยาย: :atomic การสนับสนุน GCC 4.9 ถูกยกเลิกแล้ว (สามารถใช้กับ GCC 5.1 และรุ่นที่ใหม่กว่าได้) เพิ่มการสนับสนุน วาสิ (WebAssembly System Interface อินเทอร์เฟซสำหรับการใช้ WebAssembly ภายนอกเบราว์เซอร์)
  • มีการเพิ่มประสิทธิภาพใหม่แล้ว เปิดใช้งานการแปลงการเรียก memcmp เป็น bcmp ในบางสถานการณ์ ดำเนินการละเว้นการตรวจสอบช่วงสำหรับตารางการข้ามซึ่งไม่สามารถเข้าถึงบล็อกสวิตช์ด้านล่างได้ หรือเมื่อไม่ได้ใช้คำสั่ง ตัวอย่างเช่น เมื่อเรียกใช้ฟังก์ชันที่มีประเภทเป็นโมฆะ
  • แบ็กเอนด์สำหรับสถาปัตยกรรม RISC-V มีเสถียรภาพแล้ว ซึ่งไม่อยู่ในตำแหน่งทดลองอีกต่อไป และถูกสร้างขึ้นตามค่าเริ่มต้น ให้การสนับสนุนการสร้างโค้ดเต็มรูปแบบสำหรับชุดคำสั่ง RV32I และ RV64I ที่มีส่วนขยาย MAFDC
  • มีการปรับปรุงมากมายสำหรับแบ็กเอนด์สำหรับสถาปัตยกรรม X86, AArch64, ARM, SystemZ, MIPS, AMDGPU และ PowerPC ตัวอย่างเช่นสำหรับสถาปัตยกรรม
    AArch64 เพิ่มการรองรับสำหรับคำสั่ง SVE2 (Scalable Vector Extension 2) และ MTE (Memory Tagging Extensions) ในแบ็กเอนด์ ARM มีการเพิ่มการรองรับสถาปัตยกรรม Armv8.1-M และส่วนขยาย MVE (M-Profile Vector Extension) เพิ่มการรองรับสถาปัตยกรรม GFX10 (Navi) ให้กับแบ็กเอนด์ AMDGPU แล้ว ความสามารถในการเรียกใช้ฟังก์ชันจะเปิดใช้งานตามค่าเริ่มต้น และเปิดใช้งานการส่งผ่านแบบรวม DPP (ข้อมูลพื้นฐานแบบขนาน)

  • ขณะนี้ดีบักเกอร์ LLDB มีการเน้นสีสำหรับ backtraces และเพิ่มการสนับสนุนสำหรับบล็อก debug_types DWARF4 และ DWARF5 debug_info
  • เพิ่มการรองรับอ็อบเจ็กต์และไฟล์ปฏิบัติการในรูปแบบ COFF ให้กับยูทิลิตี้ llvm-objcopy และ llvm-strip

ที่มา: opennet.ru

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