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

Sau sáu tháng phát triển, dự án LLVM 15.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 lớn trong Clang 15.0:

  • Đối với các hệ thống dựa trên kiến ​​trúc x86, cờ “-fzero-call-used-regs” đã được thêm vào để đảm bảo rằng tất cả các thanh ghi CPU được sử dụng trong hàm được đặt lại về 20 trước khi trả lại quyền điều khiển từ hàm. Tùy chọn này cho phép bạn bảo vệ khỏi rò rỉ thông tin từ các chức năng và giảm số lượng khối phù hợp để xây dựng các tiện ích ROP (Lập trình định hướng trả về) khi khai thác khoảng XNUMX%.
  • Việc ngẫu nhiên hóa vị trí bộ nhớ của các cấu trúc cho mã C đã được triển khai, điều này làm phức tạp việc trích xuất dữ liệu từ các cấu trúc trong trường hợp khai thác lỗ hổng. Tính năng ngẫu nhiên hóa được bật và tắt bằng cách sử dụng các thuộc tính Randomize_layout và no_randomize_layout, đồng thời yêu cầu đặt hạt giống bằng cờ "-frandomize-layout-seed" hoặc "-frandomize-layout-seed-file".
  • Đã thêm cờ "-fstrict-flex-arrays=" ", nhờ đó bạn có thể kiểm soát ranh giới cho một phần tử mảng linh hoạt trong cấu trúc (Thành viên mảng linh hoạt, một mảng có kích thước không xác định ở cuối cấu trúc). Khi được đặt thành 0 (mặc định), phần tử cuối cùng của cấu trúc có mảng luôn được xử lý dưới dạng mảng linh hoạt, 1 - chỉ các kích thước [], [0] và [1] được xử lý dưới dạng mảng linh hoạt, 2 - chỉ các kích thước [] và [0] được xử lý như một mảng linh hoạt.
  • Đã thêm hỗ trợ thử nghiệm cho ngôn ngữ giống C HLSL (Ngôn ngữ đổ bóng cấp cao), được sử dụng trong DirectX để viết các trình đổ bóng.
  • Đã thêm "-Warray-parameter" để cảnh báo về các hàm ghi đè có khai báo đối số không tương thích được liên kết với các mảng có độ dài cố định và có thể thay đổi.
  • Cải thiện khả năng tương thích với MSVC. Đã thêm hỗ trợ cho "hàm #pragma" (hướng dẫn trình biên dịch tạo lệnh gọi hàm thay vì mở rộng nội tuyến) và "#pragma alloc_text" (xác định tên của phần bằng mã hàm) được cung cấp trong MSVC. Đã thêm hỗ trợ cho các cờ /JMC và /JMC tương thích với MSVC.
  • Công việc tiếp tục hỗ trợ các tiêu chuẩn C2X và C++23 trong tương lai. Đối với ngôn ngữ C, những điều sau đây được triển khai: thuộc tính noreturn, từ khóa sai và đúng, loại _BitInt(N) cho số nguyên có độ sâu bit nhất định, macro *_WIDTH, tiền tố u8 cho các ký tự được mã hóa UTF-8.

    Đối với C++, những điều sau đây được triển khai: hợp nhất mô-đun, cách ly ABI của các thành viên hàm, khởi tạo động theo thứ tự các biến không cục bộ trong mô-đun, toán tử chỉ mục đa chiều, auto(x), biến không phải chữ, goto và nhãn trong các hàm được khai báo là constexpr , các chuỗi thoát được phân tách, các ký tự thoát được đặt tên.

  • Các khả năng liên quan đến hỗ trợ OpenCL và OpenMP đã được mở rộng. Đã thêm hỗ trợ cho tiện ích mở rộng OpenCL cl_khr_subgroup_rotate.
  • Đối với kiến ​​trúc x86, tính năng bảo vệ đã được bổ sung để chống lại các lỗ hổng trong bộ xử lý do việc thực thi các lệnh mang tính suy đoán sau các hoạt động nhảy về phía trước vô điều kiện. Sự cố xảy ra do việc xử lý trước các lệnh ngay sau lệnh rẽ nhánh trong bộ nhớ (SLS, Suy đoán đường thẳng). Để kích hoạt tính năng bảo vệ, tùy chọn “-mharden-sls=[none|all|return|indirect-jmp]” được đề xuất.
  • Đối với các nền tảng hỗ trợ tiện ích mở rộng SSE2, loại _Float16 đã được thêm vào, được mô phỏng bằng loại float trong trường hợp thiếu hỗ trợ cho hướng dẫn AVX512-FP16.
  • Đã thêm cờ "-m[no-]rdpru" để kiểm soát việc sử dụng lệnh RDPRU, được hỗ trợ bắt đầu với bộ xử lý AMD Zen2.
  • Đã thêm cờ "-mfunction-return=thunk-extern" để bảo vệ khỏi lỗ hổng RETBLEED. Lỗ hổng này hoạt động bằng cách thêm một chuỗi hướng dẫn loại trừ sự tham gia của cơ chế thực thi suy đoán cho các nhánh gián tiếp.

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

  • Đã thêm hỗ trợ cho CPU Cortex-M85, kiến ​​trúc Armv9-A, Armv9.1-A và Armv9.2-A, phần mở rộng Armv8.1-M PACBTI-M.
  • Một chương trình phụ trợ thử nghiệm cho DirectX đã được thêm vào để hỗ trợ định dạng DXIL (Ngôn ngữ trung gian DirectX) được sử dụng cho trình đổ bóng DirectX. Phần phụ trợ được bật bằng cách chỉ định tham số “-DLLVM_EXPERIMENTAL_TARGETS_TO_BUILD=DirectX” trong quá trình lắp ráp.
  • 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 việc hoàn thành triển khai thư viện “định dạng” và phiên bản thử nghiệm được đề xuất của thư viện “phạm vi”.
  • Phần phụ trợ được cải tiến cho kiến ​​trúc x86, PowerPC và RISC-V.
  • Khả năng của trình liên kết LLD và trình gỡ lỗi LLDB đã được nâng cao.

Nguồn: opennet.ru

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