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

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

คุณสมบัติใหม่ใน LLVM 10.0 ประกอบด้วยการรองรับแนวคิด C++, ไม่ต้องเรียกใช้ Clang เป็นกระบวนการแยกต่างหากอีกต่อไป, รองรับการตรวจสอบ CFG (control flow guard) สำหรับ Windows และรองรับความสามารถของ CPU ใหม่

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

  • เพิ่มการสนับสนุนสำหรับแนวคิด" ซึ่งเป็นส่วนขยายเทมเพลต C++ ที่จะรวมอยู่ในมาตรฐานถัดไป ซึ่งมีชื่อรหัสว่า C++2a (เปิดใช้งานโดยแฟล็ก -std=c++2a)
    แนวคิดช่วยให้คุณสามารถกำหนดชุดของข้อกำหนดพารามิเตอร์เทมเพลตที่จำกัดชุดของอาร์กิวเมนต์ที่สามารถยอมรับเป็นพารามิเตอร์เทมเพลตได้ในขณะคอมไพล์ แนวคิดนี้สามารถใช้เพื่อหลีกเลี่ยงความไม่สอดคล้องกันทางลอจิคัลระหว่างคุณสมบัติของชนิดข้อมูลที่ใช้ภายในเทมเพลตและคุณสมบัติชนิดข้อมูลของพารามิเตอร์อินพุต

    แม่แบบ
    แนวคิด EqualityComparable = ต้องการ (T a, T b) {
    { ก == ข } -> มาตรฐาน::บูลีน;
    { ก != ข } -> มาตรฐาน::บูลีน;
    };

  • ตามค่าเริ่มต้น การเรียกใช้กระบวนการแยกต่างหาก (“clang -cc1”) ซึ่งดำเนินการคอมไพล์จะหยุดลง ขณะนี้การคอมไพล์เสร็จสิ้นในกระบวนการหลัก และสามารถใช้ตัวเลือก "-fno-integrated-cc1" เพื่อกู้คืนลักษณะการทำงานแบบเก่าได้
  • โหมดการวินิจฉัยใหม่:
    • "-Wc99-designator" และ "-Wreorder-init-list" เตือนไม่ให้ใช้ตัวเริ่มต้น C99 ในโหมด C ++ ในกรณีที่ถูกต้องใน C99 แต่ไม่ใช่ใน C ++ 20
    • "-Wsizeof-array-div" - จับสถานการณ์เช่น "int arr[10]; …sizeof(arr) / sizeof(short)…” (ควรเป็น “sizeof(arr) / sizeof(int)”)
    • "-Wxor-used-as-po" - เตือนไม่ให้ใช้โครงสร้าง เช่น การใช้ตัวดำเนินการ "^" (xor) ในการดำเนินการที่อาจสับสนกับการยกกำลัง (2^16)
    • "-Wfinal-dtor-non-final-class" - เตือนเกี่ยวกับคลาสที่ไม่ได้ทำเครื่องหมายด้วยตัวระบุ "final" แต่มี destructor ที่มีแอตทริบิวต์ "final"
    • "-Wtautological-bitwise-compare" คือกลุ่มคำเตือนสำหรับการวินิจฉัยการเปรียบเทียบเชิงซ้ำระหว่างการดำเนินการระดับบิตและค่าคงที่ และสำหรับการระบุการเปรียบเทียบที่เป็นจริงเสมอซึ่งการดำเนินการระดับบิต OR ใช้กับจำนวนที่ไม่เป็นลบ
    • "-Wbitwise-conditional-วงเล็บ" เตือนถึงปัญหาเมื่อผสมตัวดำเนินการเชิงตรรกะ AND (&) และ OR (|) กับตัวดำเนินการแบบมีเงื่อนไข (?:)
    • “-Wmisleading-indentation” เป็นอะนาล็อกของการตรวจสอบชื่อเดียวกันจาก GCC ซึ่งเตือนเกี่ยวกับนิพจน์ที่เยื้องราวกับว่าเป็นส่วนหนึ่งของบล็อก if/else/for/ While แต่จริงๆ แล้วไม่ได้รวมอยู่ในบล็อกนี้ .
    • เมื่อระบุ "-Wextra" การตรวจสอบ "-Wdeprecated-copy" จะเปิดใช้งาน คำเตือนเกี่ยวกับการใช้ตัวสร้าง
      "move" และ "copy" ในคลาสที่มีคำจำกัดความ destructor ที่ชัดเจน

    • การตรวจสอบ "-Wtautological-overlap-compare", "-Wsizeof-pointer-div", "-Wtautological-compare", "-Wrange-loop-analysis" ได้รับการขยายแล้ว
    • การตรวจสอบ "-Wbitwise-op-วงเล็บ" และ "-Wlogic-op-วงเล็บ" ถูกปิดใช้งานตามค่าเริ่มต้น
  • ในโค้ด C และ C++ การดำเนินการทางคณิตศาสตร์ของตัวชี้จะได้รับอนุญาตในอาร์เรย์เท่านั้น ขณะนี้ Undefior Behavior Sanitizer ในโหมด "-fsanitize=pointer-overflow" สามารถตรวจจับกรณีต่างๆ เช่น การเพิ่มออฟเซ็ตที่ไม่ใช่ศูนย์ให้กับตัวชี้ null หรือสร้างตัวชี้ null เมื่อลบจำนวนเต็มจากตัวชี้ที่ไม่ใช่ null
  • โหมด "-fsanitize=implicit-conversion" (Implicit Conversion Sanitizer) ได้รับการปรับใช้เพื่อระบุปัญหาเกี่ยวกับการดำเนินการเพิ่มและลดสำหรับประเภทที่มีขนาดบิตเล็กกว่าประเภท "int"
  • เมื่อเลือกสถาปัตยกรรมเป้าหมาย x86 "-march=skylake-avx512", "-march=icelake-client", "-march=icelake-server", "-march=cascadelake" และ "-march=cooperlake" โดยค่าเริ่มต้นในรูปแบบเวกเตอร์ รหัสหยุดใช้รีจิสเตอร์ zmm 512 บิต ยกเว้นการระบุโดยตรงในซอร์สโค้ด เหตุผลก็คือความถี่ของ CPU ลดลงเมื่อดำเนินการแบบ 512 บิต ซึ่งอาจส่งผลเสียต่อประสิทธิภาพโดยรวม หากต้องการเปลี่ยนลักษณะการทำงานใหม่ จะมีการจัดเตรียมตัวเลือก "-mprefer-vector-width=512"
  • ลักษณะการทำงานของแฟล็ก "-flax-vector-conversions" นั้นคล้ายคลึงกับ GCC: ห้ามมิให้มีการแปลงบิตเวกเตอร์โดยนัยระหว่างเวกเตอร์จำนวนเต็มและจุดลอยตัว เพื่อขจัดข้อจำกัดนี้ ขอเสนอให้ใช้แฟล็ก
    "-flax-vector-conversions=all" ซึ่งเป็นค่าเริ่มต้น

  • ปรับปรุงการรองรับ MIPS CPU ของตระกูล Octeon เพิ่ม "octeon+" ในรายการประเภท CPU ที่ถูกต้อง
  • เมื่อประกอบเข้ากับโค้ดระดับกลาง WebAssembly ตัวเพิ่มประสิทธิภาพ wasm-opt จะถูกเรียกโดยอัตโนมัติ หากมีอยู่ในระบบ
  • สำหรับระบบที่ใช้สถาปัตยกรรม RISC-V อนุญาตให้ใช้รีจิสเตอร์ที่เก็บค่าจุดลอยตัวในบล็อกแบบมีเงื่อนไขของส่วนแทรกอินไลน์ของแอสเซมเบลอร์
  • เพิ่มแฟล็กคอมไพเลอร์ใหม่: "-fgnuc-version" เพื่อตั้งค่าเวอร์ชันสำหรับ "__GNUC__" และมาโครที่คล้ายกัน "-fmacro-prefix-map=OLD=NEW" เพื่อแทนที่คำนำหน้าไดเร็กทอรี OLD ด้วย NEW ในมาโคร เช่น "__FILE__"; "-fpatchable-function-entry=N[,M]" เพื่อสร้างคำสั่ง NOP จำนวนหนึ่งก่อนและหลังจุดเข้าใช้งานฟังก์ชัน สำหรับ RISC-V
    เพิ่มการรองรับแฟล็ก "-ffixed-xX", "-mcmodel=medany" และ "-mcmodel=medlow"

  • เพิ่มการรองรับสำหรับแอตทริบิวต์ '__attribute__((target(“branch-protection=..."))) ซึ่งมีผลคล้ายกับตัวเลือก -mbranch-การป้องกัน.
  • บนแพลตฟอร์ม Windows เมื่อระบุแฟล็ก "-cfguard" จะมีการใช้การทดแทนการตรวจสอบความสมบูรณ์ของโฟลว์การดำเนินการ (Control Flow Guard) สำหรับการเรียกฟังก์ชันทางอ้อม หากต้องการปิดใช้งานการทดแทนเช็ค คุณสามารถใช้แฟล็ก “-cfguard-nochecks” หรือตัวปรับแต่ง “__declspec(guard(nocf))”
  • ลักษณะการทำงานของแอตทริบิวต์ gnu_inline จะคล้ายกับ GCC ในกรณีที่ใช้โดยไม่มีคีย์เวิร์ด "extern"
  • ความสามารถที่เกี่ยวข้องกับการรองรับ OpenCL และ CUDA ได้รับการขยายแล้ว เพิ่มการรองรับคุณสมบัติใหม่ของ OpenMP 5.0
  • มีการเพิ่มตัวเลือกมาตรฐานลงในยูทิลิตี้รูปแบบเสียงดังกราว ซึ่งช่วยให้คุณกำหนดเวอร์ชันของมาตรฐาน C++ ที่ใช้ในการแยกวิเคราะห์และจัดรูปแบบโค้ด (ล่าสุด, อัตโนมัติ, c++03, c++11, c++14, ค++17, ค++20 )
  • มีการเพิ่มการตรวจสอบใหม่ลงในตัววิเคราะห์แบบคงที่: alpha.cplusplus.PlacementNew เพื่อตรวจสอบว่ามีพื้นที่จัดเก็บข้อมูลเพียงพอหรือไม่ fuchsia.HandleChecker เพื่อตรวจจับการรั่วไหลที่เกี่ยวข้องกับตัวจัดการ Fuchsia, security.insecureAPI.decodeValueOfObjCType เพื่อตรวจจับบัฟเฟอร์ล้นที่อาจเกิดขึ้นเมื่อใช้ [NSCoder decodeValueOfObjCType :ที่:] .
  • Unknown Behavior Sanitizer (UBSan) ได้ขยายการตรวจสอบการโอเวอร์โฟลว์ของพอยน์เตอร์เพื่อตรวจจับการใช้งานออฟเซ็ตที่ไม่เป็นศูนย์กับพอยน์เตอร์ NULL หรือการเพิ่มผลลัพธ์ของออฟเซ็ตของพอยน์เตอร์ NULL
  • ในเสียงดังกราวเป็นระเบียบเรียบร้อย เพิ่ม เช็คใหม่ส่วนใหญ่

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

  • ไปจนถึงกรอบ ผู้ให้ข้อมูล มีการเพิ่มการเพิ่มประสิทธิภาพและตัววิเคราะห์ระหว่างโพรซีเดอร์ใหม่แล้ว มีการคาดการณ์สถานะของคุณลักษณะที่แตกต่างกัน 19 รายการ รวมถึงคุณลักษณะ 12 รายการ LLVM IR 12 รายการ และคุณลักษณะนามธรรม 7 รายการ เช่น ความมีชีวิตชีวา
  • เพิ่มฟังก์ชันทางคณิตศาสตร์เมทริกซ์ใหม่ที่สร้างไว้ในคอมไพเลอร์ (อินทรินซิกส์) ซึ่งถูกแทนที่ด้วยคำสั่งเวกเตอร์ที่มีประสิทธิภาพระหว่างการคอมไพล์
  • มีการปรับปรุงมากมายสำหรับแบ็กเอนด์สำหรับสถาปัตยกรรม X86, AArch64, ARM, SystemZ, MIPS, AMDGPU และ PowerPC เพิ่มการรองรับซีพียู
    Cortex-A65, Cortex-A65AE, Neoverse E1 และ Neoverse N1 สำหรับ ARMv8.1-M ​​กระบวนการสร้างโค้ดได้รับการปรับให้เหมาะสม (เช่น มีการรองรับลูปที่มีค่าใช้จ่ายน้อยที่สุด) และเพิ่มการรองรับการทำเวกเตอร์อัตโนมัติโดยใช้ส่วนขยาย MVE ปรับปรุงการรองรับ CPU MIPS Octeon สำหรับ PowerPC การทำให้เวกเตอร์ของรูทีนย่อยทางคณิตศาสตร์โดยใช้ไลบรารี MASSV (Mathematical Acceleration SubSystem) ถูกเปิดใช้งาน การสร้างโค้ดได้รับการปรับปรุง และการเข้าถึงหน่วยความจำจากลูปได้รับการปรับปรุงให้เหมาะสม สำหรับ x86 การจัดการประเภทเวกเตอร์ v2i32, v4i16, v2i16, v8i8, v4i8 และ v2i8 มีการเปลี่ยนแปลง

  • ปรับปรุงตัวสร้างโค้ดสำหรับ WebAssembly เพิ่มการรองรับสำหรับ TLS (Thread-Local Storage) และคำสั่ง atomic.fence การรองรับ SIMD ได้รับการขยายอย่างมาก ขณะนี้ไฟล์ออบเจ็กต์ WebAssembly สามารถใช้ลายเซ็นฟังก์ชันหลายค่าได้แล้ว
  • เครื่องวิเคราะห์จะใช้เมื่อประมวลผลลูป หน่วยความจำSSAซึ่งช่วยให้คุณสามารถกำหนดการขึ้นต่อกันระหว่างการทำงานของหน่วยความจำที่แตกต่างกัน MemorySSA สามารถลดเวลาในการคอมไพล์และดำเนินการ หรือสามารถใช้แทน AliasSetTracker ได้โดยไม่สูญเสียประสิทธิภาพ
  • ดีบักเกอร์ LLDB ได้ปรับปรุงการสนับสนุนรูปแบบ DWARF v5 อย่างมาก ปรับปรุงการรองรับการสร้างด้วย MinGW
    และเพิ่มความสามารถเริ่มต้นในการดีบักโปรแกรมปฏิบัติการ Windows สำหรับสถาปัตยกรรม ARM และ ARM64 เพิ่มคำอธิบายของตัวเลือกที่มีให้เมื่อเติมข้อมูลอัตโนมัติโดยการกดแท็บ

  • ขยายแล้ว ความสามารถของตัวเชื่อมโยง LLD การสนับสนุนที่ได้รับการปรับปรุงสำหรับรูปแบบ ELF รวมถึงการรับประกันความเข้ากันได้อย่างสมบูรณ์ของเทมเพลต glob ด้วยตัวเชื่อมโยง GNU เพิ่มการรองรับส่วนการแก้ไขข้อบกพร่องที่บีบอัด ".zdebug" เพิ่มคุณสมบัติ PT_GNU_PROPERTY เพื่อกำหนดส่วน .note.gnu.property (สามารถใช้ได้ในอนาคต เคอร์เนลลินุกซ์)
    โหมด "-z Noseparate-code", "-z Separate-Code" และ "-z Separate-Loadable-Segments" ได้ถูกนำมาใช้แล้ว ปรับปรุงการรองรับ MinGW และ WebAssembly

ที่มา: opennet.ru

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