LLVM 15.0 cũng bao gồm một số cập nhật thú vị cho C / C ++.
Sau sáu tháng phát triển, Công bố phát hành dự án LLVM 15.0, trong đó rất nhiều thay đổi lớn đã được thực hiện, cũng như hỗ trợ thêm cho bộ xử lý, kiến trúc mới và hơn thế nữa.
Đối với những người không quen thuộc với LLVM, bạn nên biết rằng điều này là một trình biên dịch 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 các chương trình thành bitcode trung gian lệnh ảo giống như RISC (một máy ảo cấp thấp với hệ thống tối ưu hóa đa cấp).
Mã giả được tạo có thể được trình biên dịch JIT chuyển đổi thành các lệnh máy ngay tại thời điểm thực thi chương trình.
Các tính năng mới chính của LLVM 15.0
Trong phiên bản mới này được trình bày, điều được nhấn mạnh là hỗ trợ cho bộ vi xử lý Cortex-M85, cũng như đối với 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 thay đổi khác nổi bật là đã thêm một chương trình phụ trợ DirectX thử nghiệm mà hỗ trợ định dạng DXIL (Ngôn ngữ trung gian DirectX) được sử dụng cho trình tạo bóng DirectX. Phần phụ trợ được bật qua tùy chọn xây dựng "-DLLVM_EXPERIMENTAL_TARGETS_TO_BUILD = DirectX".
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 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".
Đối với một phần của những thay đổi liên quan đến Clang 15.0, nó được đề cập rằng thêm hỗ trợ thử nghiệm cho ngôn ngữ C-like HLSL (Ngôn ngữ tô bóng mức cao), được sử dụng để viết trình tạo bóng bắt đầu bằng DirectX 9, cũng như dịch trình tạo bóng HLSL sang định dạng nhị phân DXIL (Ngôn ngữ trung gian DirectX) tương thích với DirectX 12, cũng như định dạng SPIR -V được sử dụng bởi Vulkan. Trong tương lai, kế hoạch triển khai hỗ trợ cho định dạng DXBC (DirectX Bytecode) được sử dụng trong DirectX 9-11. Việc triển khai được cung cấp bởi Microsoft và dựa trên Trình biên dịch DirectX Shader, được phát hành vào năm 2017, được xây dựng trên cơ sở LLVM 3.7.
Nó cũng được đề cập rằng nó tiếp tục với làm việc để hỗ trợ các tiêu chuẩn C2X và C ++ 23 trong tương lai. Được triển khai cho ngôn ngữ C: thuộc tính noreturn, từ khóa false và true, loại _BitInt (N) cho các số nguyên có độ sâu bit nhất định, macro * _WIDTH, tiền tố u8 cho các ký tự UTF-8.
Ngoài nó, đã được triển khai cho C ++: 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ủa các biến không cục bộ trong mô-đun, toán tử chỉ mục đa chiều, auto (x), các biến không phải là 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.
Đối với hệ thống dựa trên kiến trúc x86, đã thêm cờ "-fzero-call-used-regs", cung cấp việc làm XNUMX của tất cả các thanh ghi CPU được sử dụng trong chức năng trước khi trả lại quyền điều khiển từ chức năng. tùy chọn này bảo vệ chống rò rỉ dữ liệu của các chức năng và giảm số lượng khối phù hợp để tạo thiết bị ROP (Lập trình hướng trở lại) trong các lần khai thác khoảng 20%.
Đã thực hiện ngẫu nhiên hóa vị trí bộ nhớ của các cấu trúc cho mã C, đ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 các lỗ hổng. Tính năng ngẫu nhiên hóa được bật và tắt với các thuộc tính randomize_layout và no_randomize_layout và yêu cầu đặt hạt giống với cờ "-frandomize-layout-seed" hoặc "-frandomize-layout-seed-file" để đảm bảo các bản dựng có thể lặp lại.
Những thay đổi khác nổi bật:
- Các khả năng được mở rộng liên quan đến hỗ trợ OpenCL và OpenMP. Đã thêm hỗ trợ cho tiện ích mở rộng OpenCL cl_khr_subgroup_rotate.
- Các phần phụ trợ được cải thiện cho kiến trúc x86, PowerPC và RISC-V.
Cải thiện khả năng trình liên kết LLD và trình gỡ lỗi LLDB. - Đã thêm cờ "-fstrict-flex-arrayys =" »Mà bạn có thể kiểm soát giới hạn của một phần tử mảng mềm trong cấu trúc (Thành viên mảng mềm, một mảng có kích thước không xác định ở cuối cấu trúc).
- Đã thêm tùy chọn "-warray-tham số" để cảnh báo về việc ghi đè các hàm với khai báo đối số không khớp được liên kết với các mảng có độ dài cố định và thay đổi.
- Cải thiện khả năng tương thích với MSVC.
- Đã thêm hỗ trợ cho "#pragma function và" #pragmaosystem_text "được cung cấp trong MSVC.
- Đã thêm hỗ trợ cho cờ tương thích / JMC và / JMC tương thích với MSVC.
- Đã thêm cờ "-m [no-] rdpru" để kiểm soát việc sử dụng lệnh RDPRU, được hỗ trợ từ bộ xử lý AMD Zen2.
- Đã thêm cờ "-m Function-return = thunk-extern" để bảo vệ khỏi lỗ hổng RETBLEED, 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 đối với các bước nhảy gián tiếp.
Cuối cùng Nếu bạn muốn biết thêm về nó, bạn có thể kiểm tra các chi tiết trong liên kết theo dõi.