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

Sau sáu tháng phát triển, dự án LLVM 13.0 đã được ra mắt - một bộ 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ã) giúp biên dịch các chương trình thành mã bit trung gian của các lệnh ảo giống RISC (một 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.

Những cải tiến trong Clang 13.0:

  • Đã triển khai hỗ trợ cho các lệnh gọi đuôi được đảm bảo (gọi một chương trình con ở cuối hàm, tạo thành một đệ quy đuôi nếu chương trình con đó gọi chính nó). Hỗ trợ cho các lệnh gọi tail được đảm bảo được cung cấp bởi thuộc tính "[[clang::musttail]]" trong C++ và "__attribute__((musttail))" trong C, được sử dụng trong câu lệnh "return". Tính năng này cho phép bạn triển khai tối ưu hóa bằng cách triển khai mã thành vòng lặp phẳng để tiết kiệm mức tiêu thụ ngăn xếp.
  • Các khai báo "sử dụng" và phần mở rộng clang cung cấp hỗ trợ cho việc xác định các thuộc tính kiểu C++ 11 bằng định dạng "[[]]".
  • Đã thêm cờ "-Mã định danh dành riêng" để hiển thị cảnh báo khi bạn chỉ định mã định danh dành riêng trong mã người dùng.
  • Đã thêm cờ "-Wunused-but-set-parameter" và "-Wunused-but-set-variable" để hiển thị cảnh báo nếu một tham số hoặc biến được đặt nhưng không được sử dụng.
  • Đã thêm cờ "-Wnull-pointer-trừ" để đưa ra cảnh báo nếu mã có thể đưa ra hành vi không xác định do sử dụng con trỏ null trong các thao tác trừ.
  • Đã thêm cờ "-fstack-usage" để tạo cho mỗi tệp mã một tệp ".su" bổ sung chứa thông tin về kích thước của khung ngăn xếp cho từng chức năng được xác định trong tệp đang được xử lý.
  • Một loại đầu ra mới đã được thêm vào bộ phân tích tĩnh - “sarif-html”, dẫn đến việc tạo báo cáo đồng thời ở định dạng HTML và Sarif. Đã thêm kiểm tra allocClassWithName mới. Khi chỉ định tùy chọn “-analyzer-display-progress”, thời gian phân tích của từng chức năng sẽ được hiển thị. Bộ phân tích con trỏ thông minh (alpha.cplusplus.SmartPtr) gần như đã sẵn sàng.
  • Các khả năng liên quan đến hỗ trợ OpenCL đã được mở rộng. Đã thêm hỗ trợ cho các tiện ích mở rộng mới cl_khr_integer_dot_product, cl_khr_extends_bit_ops, __cl_clang_bitfields và __cl_clang_non_portable_kernel_param_types. Việc triển khai đặc tả OpenCL 3.0 vẫn tiếp tục. Đối với C, đặc tả OpenCL 1.2 được sử dụng theo mặc định trừ khi phiên bản khác được chọn rõ ràng. Đối với C++, hỗ trợ cho các tệp có phần mở rộng “.clcpp” đã được thêm vào.
  • Hỗ trợ các chỉ thị chuyển đổi vòng lặp (“#pragma omp unrol” và “#pragma omp Tile”) được xác định trong đặc tả OpenMP 5.1 đã được triển khai.
  • Đã thêm tùy chọn vào tiện ích định dạng clang: SpacesInLineCommentPrefix để xác định số lượng khoảng trắng trước nhận xét, IndentAccessModifiers, LambdaBodyIndentation và PPIndentWidth để kiểm soát việc căn chỉnh các mục nhập, biểu thức lambda và chỉ thị tiền xử lý. Khả năng sắp xếp liệt kê các tệp tiêu đề (SortIncludes) đã được mở rộng. Đã thêm hỗ trợ để định dạng tệp JSON.
  • Một phần lớn các séc mới đã được thêm vào linter clang-tidy.

Những cải tiến chính trong LLVM 13.0:

  • Đã thêm tùy chọn “-ehcontguard” để sử dụng công nghệ CET (Công nghệ thực thi luồng điều khiển Windows) nhằm bảo vệ chống lại việc thực thi các hoạt động khai thác được xây dựng bằng kỹ thuật Lập trình hướng quay lại (ROP) ở giai đoạn xử lý ngoại lệ.
  • Dự án debuginfo-test đã được đổi tên thành cross-project-tests và được thiết kế để kiểm tra các thành phần từ các dự án khác nhau, không giới hạn ở thông tin gỡ lỗi.
  • Hệ thống lắp ráp cung cấp hỗ trợ để xây dựng một số bản phân phối, ví dụ: một bản phân phối có tiện ích và bản phân phối kia có thư viện dành cho nhà phát triển.
  • Trong phần phụ trợ của kiến ​​trúc AArch64, hỗ trợ cho các tiện ích mở rộng Armv9-A RME (Phần mở rộng quản lý vương quốc) và SME (Phần mở rộng ma trận có thể mở rộng) được triển khai trong trình biên dịch chương trình.
  • Hỗ trợ cho ISA V68/HVX đã được thêm vào phần phụ trợ cho kiến ​​trúc Hexagon.
  • Phần phụ trợ x86 đã cải thiện khả năng hỗ trợ cho bộ xử lý AMD Zen 3.
  • Đã thêm hỗ trợ cho APU GFX1013 RDNA2 vào phần phụ trợ AMDGPU.
  • Libc++ tiếp tục triển khai các tính năng mới của tiêu chuẩn C++20 và C++2b, bao gồm cả việc hoàn thiện thư viện “khái niệm”. Đã thêm hỗ trợ cho std::filesystem cho nền tảng Windows dựa trên MinGW. Các tập tin tiêu đề được tách ra , Và . Đã thêm tùy chọn xây dựng LIBCXX_ENABLE_INCOMPLETE_FEATURES để tắt các tệp tiêu đề có chức năng chưa được triển khai đầy đủ.
  • Các khả năng của trình liên kết LLD đã được mở rộng, trong đó triển khai hỗ trợ cho bộ xử lý Big-endian Aarch64 và phần phụ trợ Mach-O đã được đưa đến trạng thái cho phép liên kết các chương trình thông thường. Bao gồm các cải tiến cần thiết để liên kết Glibc bằng LLD.
  • Tiện ích llvm-mca (Trình phân tích mã máy) đã bổ sung hỗ trợ cho các bộ xử lý thực thi các hướng dẫn theo thứ tự (đường dẫn siêu vô hướng theo thứ tự), chẳng hạn như ARM Cortex-A55.
  • Trình gỡ lỗi LLDB cho nền tảng AArch64 cung cấp hỗ trợ đầy đủ cho Xác thực con trỏ, MTE (MemTag, Tiện ích mở rộng gắn thẻ bộ nhớ) và các thanh ghi SVE. Đã thêm các lệnh cho phép bạn liên kết các thẻ với từng thao tác cấp phát bộ nhớ và tổ chức kiểm tra con trỏ khi truy cập bộ nhớ, con trỏ này phải được liên kết với thẻ chính xác.
  • Trình gỡ lỗi LLDB và giao diện người dùng cho ngôn ngữ Fortran - Flang đã được thêm vào tập hợp nhị phân do dự án tạo ra.

Nguồn: opennet.ru

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