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

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

Các tính năng mới của LLVM 9.0 bao gồm loại bỏ thẻ thiết kế thử nghiệm khỏi nền tảng RISC-V đích, hỗ trợ C++ cho OpenCL, khả năng chia chương trình thành các phần được tải động trong LLD và triển khai “asm đi", được sử dụng trong mã nhân Linux. libc++ đã thêm hỗ trợ cho WASI (Giao diện hệ thống WebAssembly) và LLD đã thêm hỗ trợ ban đầu cho liên kết động WebAssembly.

Cải tiến trong Clang 9.0:

  • Thêm triển khai biểu thức dành riêng cho GCC "asm đi“, cho phép bạn chuyển từ khối nội tuyến của trình biên dịch mã sang nhãn bằng mã C. Tính năng này là bắt buộc để xây dựng nhân Linux ở chế độ “CONFIG_JUMP_LABEL=y” bằng cách sử dụng Clang trên các hệ thống có kiến ​​trúc x86_64. Có tính đến những thay đổi được thêm vào trong các bản phát hành trước, nhân Linux hiện có thể được xây dựng trong Clang cho kiến ​​trúc x86_64 (trước đây chỉ hỗ trợ xây dựng cho kiến ​​trúc arm, aarch64, ppc32, ppc64le và mips). Hơn nữa, các dự án Android và ChromeOS đã được chuyển đổi để sử dụng Clang để xây dựng hạt nhân và Google đang thử nghiệm Clang làm nền tảng chính để xây dựng hạt nhân cho các hệ thống Linux sản xuất của mình. Trong tương lai, các thành phần LLVM khác có thể được sử dụng trong quá trình xây dựng kernel, bao gồm LLD, llvm-objcopy, llvm-ar, llvm-nm và llvm-objdump;
  • Đã thêm hỗ trợ thử nghiệm để sử dụng C++17 trong OpenCL. Các tính năng cụ thể bao gồm hỗ trợ các thuộc tính không gian địa chỉ, chặn chuyển đổi không gian địa chỉ bằng toán tử truyền kiểu, cung cấp các loại vectơ như trong OpenCL cho C, sự hiện diện của các loại OpenCL cụ thể cho hình ảnh, sự kiện, kênh, v.v.
  • Đã thêm cờ trình biên dịch mới “-ftime-trace” và “-ftime-trace-grainarity=N” để tạo báo cáo về thời gian thực hiện của các giai đoạn khác nhau của giao diện người dùng (phân tích cú pháp, khởi tạo) và phụ trợ (giai đoạn tối ưu hóa). Báo cáo được lưu ở định dạng json, tương thích với chrome://tracing và speedscope.app;
  • Đã thêm xử lý trình chỉ định “__declspec(allocator)” và tạo thông tin gỡ lỗi đi kèm cho phép bạn theo dõi mức tiêu thụ bộ nhớ trong môi trường Visual Studio;
  • Đối với ngôn ngữ C, hỗ trợ đã được thêm cho macro “__FILE_NAME__”, giống với macro “__FILE__”, nhưng chỉ bao gồm tên tệp mà không có đường dẫn đầy đủ;
  • C++ đã mở rộng hỗ trợ cho các thuộc tính không gian địa chỉ để bao gồm nhiều tính năng khác nhau của C++, bao gồm các mẫu tham số và đối số, kiểu tham chiếu, suy luận kiểu trả về, đối tượng, hàm được tạo tự động, toán tử tích hợp, v.v.
  • Các khả năng liên quan đến hỗ trợ OpenCL, OpenMP và CUDA đã được mở rộng. Điều này bao gồm hỗ trợ ban đầu cho việc bao gồm ngầm các hàm OpenCL tích hợp sẵn (cờ “-fdeclare-opencl-buildins” đã được thêm vào), tiện ích mở rộng cl_arm_integer_dot_product đã được triển khai và các công cụ chẩn đoán đã được mở rộng;
  • Công việc của máy phân tích tĩnh đã được cải thiện và tài liệu về thực hiện phân tích tĩnh đã được bổ sung. Đã thêm cờ để hiển thị các mô-đun kiểm tra có sẵn và các tùy chọn được hỗ trợ (“-analyzer-checker[-option]-help”, “-analyzer-checker[-option]-help-alpha” và “-analyzer-checker[-option]-help ” -nhà phát triển"). Đã thêm cờ "-analyzer-werror" để coi cảnh báo là lỗi.
    Đã thêm chế độ xác minh mới:

    • security.insecureAPI.DeprecatedOrUnsafeBufferHandling để xác định các phương pháp không an toàn khi làm việc với bộ đệm;
    • osx.MIGChecker để tìm kiếm các vi phạm quy tắc gọi MIG (Mach Interface Generator);
    • optin.osx.OSObjectCStyleCast để tìm các chuyển đổi đối tượng libkern XNU không chính xác;
    • apiModeling.llvm với một bộ chức năng kiểm tra mô hình hóa để phát hiện lỗi trong cơ sở mã LLVM;
    • Mã ổn định để kiểm tra các đối tượng C++ chưa được khởi tạo (UninitializedObject trong gói optin.cplusplus);
  • Tiện ích định dạng clang đã thêm hỗ trợ cho mã định dạng bằng ngôn ngữ C# và cung cấp hỗ trợ cho kiểu định dạng mã được Microsoft sử dụng;
  • clang-cl, một giao diện dòng lệnh thay thế cung cấp khả năng tương thích ở cấp độ tùy chọn với trình biên dịch cl.exe có trong Visual Studio, đã thêm phương pháp phỏng đoán để xử lý các tệp không tồn tại dưới dạng tùy chọn dòng lệnh và hiển thị cảnh báo tương ứng (ví dụ: khi chạy "clang-cl /diagnostic :caret /c test.cc");
  • Một phần lớn các bước kiểm tra mới đã được thêm vào linter clang-tidy, bao gồm các bước kiểm tra bổ sung dành riêng cho API OpenMP;
  • mở rộng khả năng của máy chủ clangd (Máy chủ Clang), trong đó chế độ xây dựng chỉ mục nền được bật theo mặc định, hỗ trợ cho các hành động theo ngữ cảnh với mã đã được thêm vào (truy xuất biến, mở rộng định nghĩa tự động và macro, chuyển đổi chuỗi thoát thành chuỗi không thoát), khả năng hiển thị cảnh báo từ Clang-tidy, mở rộng chẩn đoán lỗi trong tệp tiêu đề và thêm khả năng hiển thị thông tin về phân cấp loại;

Chính đổi mới LLVM 9.0:

  • Một tính năng phân vùng thử nghiệm đã được thêm vào trình liên kết LLD, cho phép bạn chia một chương trình thành nhiều phần, mỗi phần nằm trong một tệp ELF riêng biệt. Tính năng này cho phép bạn khởi chạy phần chính của chương trình, phần này sẽ tải các thành phần khác nếu cần trong quá trình hoạt động (ví dụ: bạn có thể tách trình xem PDF tích hợp thành một tệp riêng, tệp này sẽ chỉ tải khi người dùng mở tệp PDF tài liệu).

    Trình liên kết LLD đem lại sang trạng thái phù hợp để liên kết nhân Linux cho các kiến ​​trúc arm32_7, arm64, ppc64le và x86_64.
    Các tùy chọn mới "-" (xuất ra thiết bị xuất chuẩn), "-[no-]allow-shlib-không xác định", "-không xác định-glob", "-nmagic", "-omagic", "-depend-library", " - z ifunc-noplt" và "-z kích thước trang chung". Đối với kiến ​​trúc AArch64, hỗ trợ cho hướng dẫn BTI (Chỉ báo mục tiêu nhánh) và PAC (Mã xác thực con trỏ) đã được thêm vào. Hỗ trợ cho nền tảng MIPS, RISC-V và PowerPC đã được cải thiện đáng kể. Đã thêm hỗ trợ ban đầu cho liên kết động cho WebAssembly;

  • Trong libc++ thực hiện các hàm ssize, std::is_constant_evaluated, std::midpoint và std::lerp, các phương thức “front” và “back” đã được thêm vào std::span, các thuộc tính kiểu std::is_unbounded_array và std::is_bounded_array đã được thêm vào , khả năng tiêu chuẩn đã được mở rộng: :atomic. Hỗ trợ cho GCC 4.9 đã bị ngừng (có thể được sử dụng với GCC 5.1 và các bản phát hành mới hơn). Đã thêm hỗ trợ LÀ TÔI (Giao diện hệ thống WebAssembly, giao diện để sử dụng WebAssembly bên ngoài trình duyệt);
  • Tối ưu hóa mới đã được thêm vào. Đã bật chuyển đổi cuộc gọi memcmp sang bcmp trong một số trường hợp. Đã thực hiện bỏ qua việc kiểm tra phạm vi cho các bảng nhảy trong đó các khối chuyển đổi phía dưới không thể truy cập được hoặc khi các hướng dẫn không được sử dụng, chẳng hạn như khi gọi các hàm có loại void;
  • Phần phụ trợ cho kiến ​​trúc RISC-V đã được ổn định, không còn được coi là thử nghiệm nữa và được xây dựng theo mặc định. Cung cấp hỗ trợ tạo mã đầy đủ cho các biến thể của tập lệnh RV32I và RV64I với phần mở rộng MAFDC;
  • Nhiều cải tiến đã được thực hiện đối với các chương trình phụ trợ cho kiến ​​trúc X86, AArch64, ARM, SystemZ, MIPS, AMDGPU và PowerPC. Ví dụ, đối với kiến ​​trúc
    AArch64 đã thêm hỗ trợ cho hướng dẫn SVE2 (Phần mở rộng vectơ có thể mở rộng 2) và MTE (Phần mở rộng gắn thẻ bộ nhớ); trong phần phụ trợ ARM, hỗ trợ cho kiến ​​trúc Armv8.1-M và phần mở rộng MVE (M-Profile Vector Extension) đã được thêm vào. Hỗ trợ cho kiến ​​trúc GFX10 (Navi) đã được thêm vào phần phụ trợ AMDGPU, khả năng gọi chức năng được bật theo mặc định và thẻ kết hợp được kích hoạt DPP (Nguyên thủy song song dữ liệu).

  • Trình gỡ lỗi LLDB hiện có tính năng đánh dấu màu cho các dấu vết lùi và hỗ trợ thêm cho các khối debug_types DWARF4 và debug_info DWARF5;
  • Hỗ trợ cho các tệp đối tượng và tệp thực thi ở định dạng COFF đã được thêm vào các tiện ích llvm-objcopy và llvm-strip.

Nguồn: opennet.ru

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