Phát hành bộ biên dịch LLVM 10.0

Sau sáu tháng phát triển trình bày phát hành dự án LLVM 10.0 — Các công cụ tương thích với GCC (trình biên dịch, trình tối ưu hóa và trình tạo mã), biên dịch chương trình thành mã bit trung gian của các lệnh ảo giống RISC (máy ảo cấp thấp có hệ thống tối ưu hóa đa cấp). Mã giả được tạo có thể được chuyển đổi bằng trình biên dịch JIT thành các lệnh máy trực tiếp tại thời điểm thực hiện chương trình.

Các tính năng mới trong LLVM 10.0 bao gồm hỗ trợ cho các khái niệm C++, không còn chạy Clang như một quy trình riêng biệt nữa, hỗ trợ kiểm tra CFG (bảo vệ luồng điều khiển) cho Windows và hỗ trợ các khả năng CPU mới.

Cải tiến trong Clang 10.0:

  • Đã thêm hỗ trợ cho "các khái niệm", một phần mở rộng mẫu C++ sẽ được đưa vào tiêu chuẩn tiếp theo, có tên mã là C++2a (được bật bằng cờ -std=c++2a).
    Các khái niệm cho phép bạn xác định một tập hợp các yêu cầu tham số mẫu mà tại thời điểm biên dịch sẽ giới hạn tập hợp các đối số có thể được chấp nhận làm tham số mẫu. Các khái niệm có thể được sử dụng để tránh sự mâu thuẫn logic giữa các thuộc tính của kiểu dữ liệu được sử dụng trong mẫu và thuộc tính kiểu dữ liệu của các tham số đầu vào.

    bản mẫu
    khái niệm EqualityComparable = yêu cầu(T a, T b) {
    { a == b } -> std::boolean;
    { a != b } -> std::boolean;
    };

  • Theo mặc định, việc khởi chạy một quy trình riêng biệt (“clang -cc1”) trong đó quá trình biên dịch được thực hiện sẽ bị dừng. Quá trình biên dịch hiện được thực hiện trong quy trình chính và tùy chọn "-fno-integrated-cc1" có thể được sử dụng để khôi phục hành vi cũ.
  • Chế độ chẩn đoán mới:
    • "-Wc99-designator" và "-Wreorder-init-list" cảnh báo không nên sử dụng bộ khởi tạo C99 ở chế độ C++ trong trường hợp chúng đúng trong C99 nhưng không đúng trong C++20.
    • "-Wsizeof-array-div" - nắm bắt các tình huống như "int arr[10]; …sizeof(arr) / sizeof(short)…” (phải là “sizeof(arr) / sizeof(int)”).
    • "-Wxor-used-as-po" - cảnh báo việc sử dụng các cấu trúc như sử dụng toán tử "^" (xor) trong các phép toán có thể bị nhầm lẫn với lũy thừa (2^16).
    • "-Wfinal-dtor-non-final-class" - cảnh báo về các lớp không được đánh dấu bằng bộ xác định "cuối cùng", nhưng có hàm hủy với thuộc tính "cuối cùng".
    • "-Wtautoological-bitwise-compare" là một nhóm cảnh báo để chẩn đoán các so sánh tautological giữa phép toán theo bit và hằng số, đồng thời để xác định các so sánh luôn đúng trong đó phép toán OR theo bit được áp dụng cho số không âm.
    • "-Wbitwise-có điều kiện-dấu ngoặc đơn" cảnh báo các vấn đề khi trộn các toán tử logic AND (&) và OR (|) với toán tử điều kiện (?:).
    • “-Wmislead-indentation” là một dạng tương tự của kiểm tra cùng tên từ GCC, cảnh báo về các biểu thức thụt lề như thể chúng là một phần của khối if/else/for/while, nhưng trên thực tế chúng không được bao gồm trong khối này .
    • Khi chỉ định “-Wextra”, kiểm tra “-Wdeprecated-copy” được bật, cảnh báo về việc sử dụng hàm tạo
      "di chuyển" và "sao chép" trong các lớp có định nghĩa hàm hủy rõ ràng.

    • Các kiểm tra "-Wtautoological-overlap-compare", "-Wsizeof-pointer-div", "-Wtautoological-compare", "-Wrange-loop-analysis" đã được mở rộng.
    • Theo mặc định, việc kiểm tra "-Wbitwise-op-parentheses" và "-Wlogic-op-parentheses" bị tắt.
  • Trong mã C và C++, các phép toán số học con trỏ chỉ được phép trong mảng. Trình khử trùng hành vi không xác định trong chế độ "-fsanitize=pointer-overflow" hiện phát hiện các trường hợp như thêm phần bù khác XNUMX vào con trỏ null hoặc tạo con trỏ null khi trừ một số nguyên khỏi con trỏ khác null.
  • Chế độ "-fsanitize=implicit-conversion" (Bộ khử trùng chuyển đổi ngầm định) được điều chỉnh để xác định các vấn đề về hoạt động tăng và giảm đối với các loại có kích thước bit nhỏ hơn loại "int".
  • Khi chọn kiến ​​trúc đích x86 "-march=skylake-avx512", "-march=icelake-client", "-march=icelake-server", "-march=cascadelake" và "-march=cooperlake" theo mặc định trong Vectorized The mã đã ngừng sử dụng các thanh ghi zmm 512 bit, ngoại trừ dấu hiệu trực tiếp của chúng trong mã nguồn. Nguyên nhân là do tần số CPU giảm khi thực hiện các thao tác 512 bit, điều này có thể ảnh hưởng tiêu cực đến hiệu suất tổng thể. Để thay đổi hành vi mới, tùy chọn "-mprefer-vector-width=512" được cung cấp.
  • Hoạt động của cờ "-flax-vector-conversions" tương tự như GCC: chuyển đổi bit vectơ ngầm giữa vectơ số nguyên và vectơ dấu phẩy động đều bị cấm. Để loại bỏ hạn chế này, người ta đề xuất sử dụng cờ
    "-flax-vector-conversions=all" là mặc định.

  • Cải thiện hỗ trợ cho CPU MIPS thuộc dòng Octeon. Đã thêm "octeon+" vào danh sách các loại CPU hợp lệ.
  • Khi tập hợp thành mã trung gian WebAssembly, trình tối ưu hóa wasm-opt sẽ tự động được gọi nếu có trong hệ thống.
  • Đối với các hệ thống dựa trên kiến ​​trúc RISC-V, việc sử dụng các thanh ghi lưu trữ các giá trị dấu phẩy động được cho phép trong các khối có điều kiện của các phần chèn nội tuyến của trình biên dịch mã.
  • Đã thêm cờ trình biên dịch mới: "-fgnuc-version" để đặt giá trị phiên bản cho "__GNUC__" và các macro tương tự; "-fmacro-prefix-map=OLD=NEW" để thay thế tiền tố thư mục OLD bằng NEW trong các macro như "__FILE__"; "-fpatchable-function-entry=N[,M]" để tạo một số lệnh NOP nhất định trước và sau điểm nhập hàm. Dành cho RISC-V
    đã thêm hỗ trợ cho các cờ "-ffixed-xX", "-mcmodel=medany" và "-mcmodel=medlow".

  • Đã thêm hỗ trợ cho thuộc tính '__attribute__((target(“branch-protection=..."))) thuộc tính, tác dụng của nó tương tự như tùy chọn -mbranch-bảo vệ.
  • Trên nền tảng Windows, khi chỉ định cờ “-cfguard”, việc thay thế kiểm tra tính toàn vẹn của luồng thực thi (Control Flow Guard) cho các lệnh gọi hàm gián tiếp sẽ được triển khai. Để tắt tính năng thay thế séc, bạn có thể sử dụng cờ “-cfguard-nochecks” hoặc công cụ sửa đổi “__declspec(guard(nocf))”.
  • Hoạt động của thuộc tính gnu_inline tương tự như GCC trong trường hợp nó được sử dụng mà không có từ khóa "extern".
  • Các khả năng liên quan đến hỗ trợ OpenCL và CUDA đã được mở rộng. Đã thêm hỗ trợ cho các tính năng OpenMP 5.0 mới.
  • Tùy chọn Tiêu chuẩn đã được thêm vào tiện ích định dạng clang, cho phép bạn xác định phiên bản của tiêu chuẩn C++ được sử dụng khi phân tích cú pháp và định dạng mã (Mới nhất, Tự động, c++03, c++11, c++14, c++17, c++20 ).
  • Các bước kiểm tra mới đã được thêm vào bộ phân tích tĩnh: alpha.cplusplus.PlacementNew để xác định xem có đủ dung lượng lưu trữ hay không, fuchsia.HandleChecker để phát hiện rò rỉ liên quan đến trình xử lý Fuchsia, security.insecureAPI.decodeValueOfObjCType để phát hiện khả năng tràn bộ đệm khi sử dụng [NSCoder giải mãValueOfObjCType :at:] .
  • Công cụ khử trùng hành vi không xác định (UBSan) đã mở rộng các biện pháp kiểm tra tràn con trỏ để nắm bắt việc áp dụng các độ lệch khác XNUMX cho các con trỏ NULL hoặc việc bổ sung kết quả của độ lệch con trỏ NULL.
  • Trong kẻ nói dối kêu vang-gọn gàng thêm một phần lớn các séc mới.

Chính đổi mới LLVM 10.0:

  • Đến khuôn khổ Thuộc tính Tối ưu hóa và phân tích liên thủ tục mới đã được thêm vào. Trạng thái của 19 thuộc tính khác nhau được dự đoán, bao gồm 12 thuộc tính 12 LLVM IR và 7 thuộc tính trừu tượng như độ sống.
  • Đã thêm các hàm toán học ma trận mới được tích hợp vào trình biên dịch (nội tại), được thay thế bằng các lệnh vectơ hiệu quả trong quá trình biên dịch.
  • Nhiều cải tiến đã được thực hiện đối với các chương trình phụ trợ cho kiến ​​trúc X86, AArch64, ARM, SystemZ, MIPS, AMDGPU và PowerPC. Đã thêm hỗ trợ CPU
    Cortex-A65, Cortex-A65AE, Neoverse E1 và Neoverse N1. Đối với ARMv8.1-M, ​​​​quy trình tạo mã đã được tối ưu hóa (ví dụ: đã xuất hiện hỗ trợ cho các vòng lặp với chi phí tối thiểu) và hỗ trợ tự động hóa vector đã được thêm bằng cách sử dụng tiện ích mở rộng MVE. Cải thiện hỗ trợ CPU MIPS Octeon. Đối với PowerPC, tính năng vectơ hóa các chương trình con toán học sử dụng thư viện MASSV (Hệ thống con tăng tốc toán học) được bật, việc tạo mã được cải thiện và khả năng truy cập bộ nhớ từ các vòng lặp được tối ưu hóa. Đối với x86, việc xử lý các loại vectơ v2i32, v4i16, v2i16, v8i8, v4i8 và v2i8 đã được thay đổi.

  • Trình tạo mã được cải tiến cho WebAssugging. Đã thêm hỗ trợ cho các hướng dẫn TLS (Thread-Local Storage) và Atomic.fence. Hỗ trợ SIMD đã được mở rộng đáng kể. Các tệp đối tượng WebAssugging hiện có khả năng sử dụng chữ ký hàm đa giá trị.
  • Máy phân tích được sử dụng khi xử lý các vòng lặp Bộ nhớSSA, cho phép bạn xác định sự phụ thuộc giữa các hoạt động bộ nhớ khác nhau. MemorySSA có thể giảm thời gian biên dịch và thực thi hoặc có thể được sử dụng thay cho AliasSetTracker mà không làm giảm hiệu suất.
  • Trình gỡ lỗi LLDB đã cải thiện đáng kể khả năng hỗ trợ cho định dạng DWARF v5. Cải thiện hỗ trợ xây dựng với MinGW
    và thêm khả năng ban đầu để gỡ lỗi các tệp thực thi Windows cho kiến ​​trúc ARM và ARM64. Đã thêm mô tả về các tùy chọn được cung cấp khi tự động hoàn thành dữ liệu nhập bằng cách nhấn tab.

  • mở rộng Khả năng liên kết LLD. Cải thiện hỗ trợ cho định dạng ELF, bao gồm đảm bảo khả năng tương thích hoàn toàn của các mẫu toàn cầu với trình liên kết GNU, thêm hỗ trợ cho các phần gỡ lỗi nén ".zdebug", thêm thuộc tính PT_GNU_PROPERTY để xác định phần .note.gnu.property (có thể được sử dụng trong tương lai) hạt nhân Linux),
    Các chế độ “-z mũi phân tách-mã”, “-z mã riêng biệt” và “-z phân đoạn có thể tải riêng biệt” đã được triển khai. Cải thiện hỗ trợ cho MinGW và WebAssugging.

Nguồn: opennet.ru

Thêm một lời nhận xét