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

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

การเปลี่ยนแปลงที่สำคัญในรุ่นใหม่คือการรวม ปีกส่วนหน้าสำหรับภาษา Fortran Flang รองรับ Fortran 2018, OpenMP 4.5 และ OpenACC 3.0 แต่การพัฒนาโครงการยังไม่เสร็จสมบูรณ์ และส่วนหน้าถูกจำกัดอยู่เพียงการแยกวิเคราะห์โค้ดและตรวจสอบความถูกต้อง ยังไม่รองรับการสร้างโค้ดระดับกลาง LLVM และเพื่อสร้างไฟล์ที่ปฏิบัติการได้ โค้ดมาตรฐานจะถูกสร้างขึ้นและส่งผ่านไปยังคอมไพเลอร์ Fortran ภายนอก

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

  • เพิ่มความสามารถในการกู้คืนแผนผังไวยากรณ์นามธรรม (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 รุ่นทดลอง
  • โหมดเริ่มต้นสำหรับ 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) ได้รับการปรับปรุงประสิทธิภาพและเพิ่มความสามารถในการวินิจฉัยใหม่

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

  • ระบบบิลด์ได้เปลี่ยนไปใช้ 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

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