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

Sau sáu tháng phát triển, LLVM 22.1.0 đã được phát hành. Phiên bản này phát triển các công cụ (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 kiểu 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 ra có thể được chuyển đổi thành mã máy cho nền tảng mục tiêu cụ thể hoặc được sử dụng bởi trình biên dịch JIT (just-in-time) để tạo ra các lệnh máy trực tiếp trong quá trình thực thi chương trình. Dựa trên công nghệ LLVM, dự án đang phát triển trình biên dịch Clang, hỗ trợ các ngôn ngữ lập trình C, C++ và Objective-C. Bắt đầu từ nhánh 18.x, dự án đã chuyển sang một hệ thống đánh số phiên bản mới, theo đó phiên bản 0 ("N.0") được sử dụng trong quá trình phát triển, và phiên bản ổn định đầu tiên được đánh số "N.1".

Những cải tiến trong Clang 22 bao gồm:

  • Đã thêm hỗ trợ cho các mã thông báo phân bổ bộ nhớ (Allocation Tokens) để đánh dấu các thao tác phân bổ bộ nhớ được thực hiện bằng các hàm như malloc bằng một mã định danh duy nhất. Mã thông báo phân bổ cho phép cấu trúc thông tin vùng nhớ heap, đơn giản hóa việc phát hiện rò rỉ bộ nhớ và cho phép nhóm các đối tượng dựa trên mục đích hoặc kiểu sửa đổi của chúng (ví dụ: tách dữ liệu "nóng" khỏi dữ liệu "lạnh"). Để kích hoạt, hãy sử dụng cờ "-fsanitize=alloc-token".
  • Các tính năng liên quan đến ngôn ngữ C:
    • Bản dự thảo đặc tả định nghĩa cơ chế thực thi trì hoãn "defer" đã được triển khai, cho phép các hành động được thực thi khi phạm vi hiện tại kết thúc. Cờ "-fdefer-ts" đã được thêm vào để kích hoạt hỗ trợ "defer".
    • Hàm tích hợp __builtin_stack_address() đã được thêm vào, tương tự như hàm trong GCC. Hàm này trả về địa chỉ ngăn xếp, phân tách vùng ngăn xếp của hàm hiện tại gọi __builtin_stack_address() và các hàm tiếp theo mà nó gọi.
  • Các khả năng đang được phát triển cho tiêu chuẩn C2y trong tương lai:
    • Đã thêm hỗ trợ cho vòng lặp có tên, cho phép bạn gán tên cho các vòng lặp và câu lệnh switch, có thể được chỉ định trong các câu lệnh break và continue để xác định rõ ràng vòng lặp cần thoát ra. outer: for (int i = 0; i < iK; ++ i) { for (int j = 0; j < jK; ++ j) { continue; // chuyển đến CONT1 continue outer; // chuyển đến CONT2 // CONT1 } // CONT2 }
    • Việc triển khai macro "__COUNTER__" tích hợp sẵn, được thiết kế để tạo ra các tên định danh duy nhất, đã được mở rộng và đưa vào tiêu chuẩn. Giới hạn số lần gọi macro này là 2147483647; vượt quá giới hạn này sẽ gây ra lỗi.
    • Đã loại bỏ cảnh báo (-Wstatic-in-inline) khi sử dụng các hàm hoặc biến tĩnh bên trong các hàm được khai báo là "extern inline".
  • Các khả năng được xác định trong tiêu chuẩn C23 C:
    • Tệp tiêu đề float.h hiện hỗ trợ các macro FLT_SNAN, DBL_SNAN và LDBL_SNAN, thực hiện việc báo hiệu (gây ra ngoại lệ khi được sử dụng trong các phép toán số học) đối với các giá trị NaN cho các kiểu float, double và long double.
    • Đã sửa lỗi trong đó các kiểu dữ liệu không tên khác nhau được coi là tương thích trong cùng một đơn vị dịch nếu chúng có cùng các trường.
    • Cờ "-MG" được sử dụng để bỏ qua các tệp tiêu đề bị thiếu trong quá trình quét phụ thuộc đã được mở rộng cho các chỉ thị "#embed" và hiện nay sẽ ngăn chặn lỗi "không tìm thấy tệp" khi một tệp được chỉ định trong chỉ thị "#embed" bị thiếu.
  • Các tính năng liên quan đến C++:
    • Khả năng sử dụng liên kết có cấu trúc trong ngữ cảnh "constexpr", như đã được phát triển trong đặc tả C++2c (C++26), đã được thêm vào. Điều này có nghĩa là các tham chiếu đến biểu thức hằng số giờ đây bản thân chúng cũng có thể là biểu thức hằng số. Hỗ trợ được triển khai cho mảng và cấu trúc đơn giản (bộ dữ liệu chưa được hỗ trợ). constexpr int arr[] = {1, 2}; constexpr auto [x, y] = arr;
    • Theo yêu cầu của tiêu chuẩn C++20, các ràng buộc hiện được chuyển đổi sang dạng chuẩn trước khi được kiểm tra, cho phép đưa ra các thông báo chẩn đoán chính xác hơn và xử lý đúng cách các lỗi thay thế trong các đối số mẫu chỉ được sử dụng trong định danh khái niệm.
    • Đã thêm một nhóm các hàm tích hợp "__builtin_[lt|gt|le|ge]_synthesizes_from_spaceship" để tìm hiểu xem các toán tử so sánh "<", ">", "<=" và ">=" có được tổng hợp từ toán tử "<=>" hay không.
    • Tham số "-Wincompatible-pointer-types" đã được thay đổi để xuất ra lỗi thay vì cảnh báo. Để khôi phục lại hành vi trước đó, hãy sử dụng tùy chọn "-Wno-error=incompatible-pointer-types".
  • Đã thêm các hàm tích hợp sẵn __builtin_bswapg, __builtin_elementwise_ldexp, __builtin_elementwise_fshl, __builtin_elementwise_fshr, __builtin_elementwise_minnumnum, __builtin_elementwise_maxnumnum, __builtin_masked_load, __builtin_masked_expand_load, __builtin_masked_store, __builtin_masked_compress_store, __builtin_masked_gather, __builtin_masked_scatter và __builtin_dedup_pack. Ví dụ, hàm builtin_dedup_pack cho phép bạn loại bỏ các phần tử trùng lặp khỏi danh sách các kiểu dữ liệu: using MyTypeList = TypeList<__builtin_dedup_pack> …>; // kiểu kết quả sẽ là TypeList
  • Khi gỡ lỗi hành vi không xác định với UBSan (-fsanitize=undefined -fsanitize-trap=undefined), thông tin về nguyên nhân lỗi hiện được bao gồm trong thông tin gỡ lỗi được tạo ra. Cờ "-fsanitize-debug-trap-reasons" đã được thêm vào để chỉ định mức độ chi tiết trong thông tin lỗi. Nó có thể được đặt thành "basic" cho các mô tả chung (ví dụ: "Lỗi tràn phép cộng số nguyên") và "detailed" để bao gồm thông tin chi tiết (ví dụ: "lỗi tràn phép cộng số nguyên có dấu trong 'a + b'").
  • Đã thêm cờ trình biên dịch mới:
    • Tham số "-f[no-]sanitize-debug-trap-reasons" được sử dụng để kiểm soát xem lý do bẫy ngoại lệ có được nhúng vào thông tin gỡ lỗi khi biên dịch với chế độ "-fsanitize-trap" hay không.
    • "-fsanitize=alloc-token", "-falloc-token-max", "-fsanitize-alloc-token-fast-abi", và "-fsanitize-alloc-token-extended" được sử dụng để quản lý các token cấp phát bộ nhớ.
    • "-fmatrix-memory-layout" dùng để điều khiển cách bố trí bộ nhớ của các kiểu ma trận (ví dụ: column-major cho kiểu cột, row-major cho kiểu hàng).
  • Các hàm hiện có thuộc tính "malloc_span", tương tự như thuộc tính malloc nhưng áp dụng cho các hàm trả về cấu trúc giống span chứa con trỏ và trường có kích thước hoặc con trỏ đến cuối khối.
  • Đã thêm thuộc tính "modular_format" để tự động chọn phiên bản cài đặt liên kết tĩnh cần thiết của hàm printf tại thời điểm liên kết.
  • Các công cụ chẩn đoán và phân tích tĩnh đã được mở rộng, các bước kiểm tra mới đã được bổ sung (hàng chục cải tiến liên quan đến chẩn đoán).
  • Đã bổ sung thêm các hàm nội tại cho các phần mở rộng SSE, AVX và AVX512 vào phần phụ trợ X86. Đã thêm các chế độ biên dịch cho CPU Intel dựa trên kiến ​​trúc vi xử lý Wildcat Lake (-march=wildcatlake) và Nova Lake (-march=novalake).
  • Phần phụ trợ AArch64 hiện hỗ trợ các bộ xử lý Ampere Computing Ampere1C (ampere1c), Arm C1-Nano (c1-nano), Arm C1-Pro (c1-pro), Arm C1-Premium (c1-premium) và Arm C1-Ultra (c1-ultra). Các chức năng tích hợp bổ sung đã được thêm vào cho các lệnh FCVTZ[US], FCVTN[US], FCVTM[US], FCVTP[US] và FCVTA[US]. Hỗ trợ Đa phiên bản chức năng (FMV) đã được ổn định. Người dùng hiện có thể ghi đè thứ tự ưu tiên của các phiên bản chức năng khác nhau.
  • Đã thêm hỗ trợ cho kiến ​​trúc LoongArch32 (LA32R, LA32S).
  • Cải tiến hệ thống phụ trợ cho các kiến ​​trúc ARM, AMDGPU, RISC-V, LoongArch64, MIPS, WebAssembly và PowerPC.

Nguồn: opennet.ru

Mua dịch vụ lưu trữ đáng tin cậy cho các trang web có bảo vệ DDoS, máy chủ VPS VDS 🔥 Mua dịch vụ hosting website đáng tin cậy với bảo vệ DDoS, máy chủ VPS VDS | ProHoster