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

Sau sáu tháng phát triển, dự án LLVM 12.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 12.0:

  • Hỗ trợ cho các thuộc tính “có thể” và “không chắc” được đề xuất trong tiêu chuẩn C++ 20 đã được triển khai và bật theo mặc định, cho phép trình tối ưu hóa được thông báo về xác suất cấu trúc có điều kiện được kích hoạt (ví dụ: “[[có thể ]] if (ngẫu nhiên > 0) {“).
  • Đã thêm hỗ trợ cho bộ xử lý AMD Zen 3 (-march=znver3), Intel Alder Lake (-march=alderlake) và Intel Sapphire Rapids (-march=sapphirerapids).
  • Đã thêm hỗ trợ cho cờ "-march=x86-64-v[234]" để chọn mức kiến ​​trúc x86-64 (v2 - bao gồm các phần mở rộng SSE4.2, SSSE3, POPCNT và CMPXCHG16B; v3 - AVX2 và MOVBE; v4 - AVX-512 ) .
  • Đã thêm hỗ trợ cho bộ xử lý Arm Cortex-A78C (cortex-a78c), Arm Cortex-R82 (cortex-r82), Arm Neoverse V1 (neoverse-v1), Arm Neoverse N2 (neoverse-n2) và Fujitsu A64FX (a64fx). Ví dụ: để bật tối ưu hóa cho CPU Neoverse-V1, bạn có thể chỉ định “-mcpu=neoverse-v1”.
  • Đối với kiến ​​trúc AArch64, các cờ trình biên dịch mới "-moutline-atomics" và "-mno-outline-atomics" đã được thêm vào để bật hoặc tắt các chức năng trợ giúp vận hành nguyên tử, chẳng hạn như "__aarch64_cas8_relax". Các chức năng như vậy phát hiện trong thời gian chạy xem có hỗ trợ LSE (Phần mở rộng hệ thống lớn) hay không và sử dụng các hướng dẫn bộ xử lý nguyên tử được cung cấp hoặc quay lại sử dụng các hướng dẫn LL/SC (Liên kết tải/lưu trữ có điều kiện) để đồng bộ hóa.
  • Đã thêm tùy chọn "-fbinutils-version" để chọn phiên bản đích của bộ binutils để tương thích với hành vi của trình liên kết và trình biên dịch mã cũ hơn.
  • Đối với các tệp thực thi ELF, khi cờ "-gz" được chỉ định, việc nén thông tin gỡ lỗi bằng thư viện zlib được bật theo mặc định (gz=zlib). Việc liên kết các tệp đối tượng kết quả yêu cầu lld hoặc GNU binutils 2.26+. Để khôi phục khả năng tương thích với các phiên bản binutils cũ hơn, bạn có thể chỉ định "-gz=zlib-gnu".
  • Con trỏ 'this' hiện được xử lý bằng các kiểm tra không có giá trị và không thể tham chiếu (N). Để loại bỏ thuộc tính nonnull khi bạn cần sử dụng giá trị NULL, bạn có thể sử dụng tùy chọn "-fdelete-null-pointer-checks".
  • Trên nền tảng Linux, chế độ "-fasynchronous-unwind-tables" được bật cho kiến ​​trúc AArch64 và PowerPC để tạo các bảng lệnh gọi thư giãn, như trong GCC.
  • Trong "#pragma clang loop vectorize_width" đã thêm khả năng chỉ định các tùy chọn "cố định" (mặc định) và "có thể mở rộng" để chọn phương pháp vector hóa. Chế độ "có thể mở rộng", không phụ thuộc vào độ dài vectơ, là chế độ thử nghiệm và có thể được sử dụng trên phần cứng hỗ trợ vectơ hóa có thể mở rộng.
  • Cải thiện hỗ trợ cho nền tảng Windows: Các tập hợp nhị phân chính thức cho Windows trên hệ thống Arm64 đã được chuẩn bị, bao gồm trình biên dịch Clang, trình liên kết LLD và thư viện thời gian chạy trình biên dịch-rt. Khi xây dựng cho nền tảng đích MinGW, hậu tố .exe sẽ được thêm vào, ngay cả khi biên dịch chéo.
  • Các khả năng liên quan đến hỗ trợ OpenCL, OpenMP và CUDA đã được mở rộng. Đã thêm tùy chọn "-cl-std=CL3.0" và "-cl-std=CL1.0" để chọn tùy chọn macro cho OpenCL 3.0 và OpenCL 1.0. Các công cụ chẩn đoán đã được mở rộng.
  • Đã thêm hỗ trợ cho các hướng dẫn HRESET, UINTR và AVXVNNI được triển khai trong một số bộ xử lý dựa trên x86.
  • Trên hệ thống x86, hỗ trợ cho tùy chọn "-mtune=" được bật ", kích hoạt tối ưu hóa vi kiến ​​trúc đã chọn, bất kể giá trị của "-march= "
  • Trình phân tích tĩnh đã cải thiện khả năng xử lý một số hàm POSIX và cải thiện đáng kể việc xác định kết quả của các phép toán có điều kiện khi có một số giá trị ký hiệu trong phép so sánh. Các bước kiểm tra mới đã được thêm vào: fuchia.HandleChecker (xác định các thẻ điều khiển trong cấu trúc), webkit.UncountedLambdaCapturesChecker webkit và alpha.webkit.UncountedLocalVarsChecker (có tính đến các đặc thù khi làm việc với con trỏ trong mã công cụ WebKit).
  • Trong các biểu thức được sử dụng trong ngữ cảnh của hằng số, việc sử dụng các hàm dựng sẵn __buildin_bitreverse*, __buildin_rotateleft*, __buildin_rotateright*, _mm_popcnt*, _bit_scan_forward, __bsfd, __bsfq, __bit_scan_reverse, __bsrd, __bsrq, __bswap, __bswapd, __bswap64, được cho phép. __bswapq , _castf*, __rol* và __ror*.
  • Đã thêm tùy chọn BitFieldColonSpacing vào tiện ích định dạng clang để chọn khoảng cách xung quanh mã định danh, cột và định nghĩa trường.
  • Máy chủ bộ nhớ đệm clangd (Clang Server) trên nền tảng Linux đã giảm đáng kể mức tiêu thụ bộ nhớ trong quá trình hoạt động lâu dài (các lệnh gọi định kỳ tới malloc_trim được cung cấp để trả lại các trang bộ nhớ trống cho hệ điều hành).

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

  • Hỗ trợ cho công cụ xây dựng llvm-build viết bằng Python đã ngừng hoạt động và thay vào đó, dự án đã hoàn toàn chuyển sang sử dụng hệ thống xây dựng CMake.
  • Trong phần phụ trợ cho kiến ​​trúc AArch64, khả năng hỗ trợ cho nền tảng Windows đã được cải thiện: việc tạo đầu ra trình biên dịch mã chính xác cho các hệ thống Windows mục tiêu đã được đảm bảo, việc tạo dữ liệu về các lệnh gọi thư giãn đã được tối ưu hóa (kích thước của dữ liệu đó đã giảm 60 %), khả năng tạo dữ liệu thư giãn bằng trình biên dịch mã đã được thêm chỉ thị .seh_*.
  • Phần phụ trợ cho kiến ​​trúc PowerPC có các tính năng tối ưu hóa mới cho vòng lặp và triển khai nội tuyến, hỗ trợ mở rộng cho bộ xử lý Power10, hỗ trợ thêm cho hướng dẫn MMA để thao tác ma trận và hỗ trợ cải tiến cho hệ điều hành AIX.
  • Phần phụ trợ x86 bổ sung hỗ trợ cho bộ xử lý AMD Zen 3, Intel Alder Lake và Intel Sapphire Rapids, cũng như các hướng dẫn bộ xử lý HRESET, UINTR và AVXVNNI. Hỗ trợ MPX (Tiện ích mở rộng bảo vệ bộ nhớ) để kiểm tra con trỏ nhằm đảm bảo ranh giới bộ nhớ không còn được hỗ trợ (công nghệ này không phổ biến và đã bị xóa khỏi GCC và clang). Đã thêm hỗ trợ cho trình biên dịch mã cho các tiền tố {disp32} và {disp8} cũng như các hậu tố .d32 và .d8 để kiểm soát kích thước của các khoảng dịch chuyển và bước nhảy toán hạng. Đã thêm thuộc tính mới "tune-cpu" để kiểm soát việc đưa vào các tối ưu hóa vi kiến ​​trúc.
  • Một chế độ mới “-fsanitize=unsigned-shift-base” đã được thêm vào trình phát hiện sự cố số nguyên (khử trùng số nguyên, “-fsanitize=integer”) để phát hiện tình trạng tràn số nguyên không dấu sau khi dịch chuyển bit sang trái.
  • Trong các trình phát hiện khác nhau (asan, cfi, lsan, msan, tsan, ubsansan), hỗ trợ cho các bản phân phối Linux với thư viện Musl tiêu chuẩn đã được thêm vào.
  • Khả năng của trình liên kết LLD đã được mở rộng. Cải thiện hỗ trợ cho định dạng ELF, bao gồm các tùy chọn bổ sung “--dependency-file”, “-error-handling-script”, “-lto-pseudo-probe-for-profiling”, “-no-lto-whole-program -khả năng hiển thị” " Cải thiện hỗ trợ MinGW. Đối với định dạng Mach-O (macOS), hỗ trợ cho kiến ​​trúc arm64, arm và i386, tối ưu hóa thời gian liên kết (LTO) và giải phóng ngăn xếp để xử lý ngoại lệ đã được triển khai.
  • Libc++ triển khai các tính năng mới của tiêu chuẩn C++20 và đã bắt đầu phát triển các tính năng của đặc tả C++2b. Đã thêm hỗ trợ cho việc xây dựng với việc vô hiệu hóa hỗ trợ bản địa hóa (“-DLIBCXX_ENABLE_LOCALIZATION=OFF”) và các thiết bị để tạo số giả ngẫu nhiên (“-DLIBCXX_ENABLE_RANDOM_DEVICE=OFF”).

Nguồn: opennet.ru

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