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

Sau sáu tháng phát triển trình bày phát hành dự án LLVM 11.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.

Thay đổi quan trọng trong bản phát hành mới là việc bao gồm Hông, giao diện người dùng cho ngôn ngữ Fortran. Flang hỗ trợ Fortran 2018, OpenMP 4.5 và OpenACC 3.0, nhưng quá trình phát triển dự án vẫn chưa hoàn thành và giao diện người dùng bị giới hạn trong việc phân tích mã và kiểm tra tính chính xác. Việc tạo mã trung gian LLVM chưa được hỗ trợ và để tạo các tệp thực thi, mã chuẩn được tạo và chuyển đến trình biên dịch Fortran bên ngoài.

Cải tiến trong Clang 11.0:

  • Đã thêm khả năng khôi phục cây cú pháp trừu tượng (AST) dành cho mã C++ bị hỏng, mã này có thể được sử dụng để giúp chẩn đoán lỗi và cung cấp thông tin bổ sung cho các tiện ích bên ngoài như clang-tidy và clangd. Tính năng này được bật theo mặc định cho mã C++ và được kiểm soát thông qua tùy chọn "-Xclang -f[no-]recovery-ast".
  • Đã thêm các chế độ chẩn đoán mới:
    • “-Wpointer-to-int-cast” là một nhóm cảnh báo về việc truyền con trỏ tới kiểu số nguyên int không chứa tất cả các giá trị có thể.
    • “-Wuninitialized-const-reference” - cảnh báo về việc truyền các biến chưa được khởi tạo trong các tham số hàm chấp nhận các đối số tham chiếu có thuộc tính “const”.
    • "-Wimplicit-const-int-float-conversion" - được bật theo cảnh báo mặc định về việc chuyển đổi ngầm định một hằng số thực thành một loại số nguyên.
  • Đối với nền tảng ARM, các hàm C được tích hợp trong trình biên dịch được cung cấp (nội tại), được thay thế bằng các lệnh vectơ hiệu quả Arm v8.1-M MVE và CDE. Các hàm khả dụng được xác định trong các tệp tiêu đề arm_mve.h và arm_cde.h.
  • Thêm một tập hợp các kiểu số nguyên mở rộng _ExtInt(N), cho phép bạn tạo các kiểu không phải bội số của hai, có thể được xử lý hiệu quả trên FPGA/HLS. Ví dụ, _ExtInt(7) xác định loại số nguyên gồm 7 bit.
  • Đã thêm các macro xác định hỗ trợ cho các hàm C tích hợp dựa trên hướng dẫn ARM SVE (Phần mở rộng vectơ có thể mở rộng):
    __ARM_FEATURE_SVE, __ARM_FEATURE_SVE_BF16,
    __ARM_FEATURE_SVE_MATMUL_FP32, __ARM_FEATURE_SVE_MATMUL_FP64,
    __ARM_FEATURE_SVE_MATMUL_INT8,
    __ARM_FEATURE_SVE2, __ARM_FEATURE_SVE2_AES,
    __ARM_FEATURE_SVE2_BITPERM,
    __ARM_FEATURE_SVE2_SHA3,
    __ARM_FEATURE_SVE2_SM4. Ví dụ: macro __ARM_FEATURE_SVE được xác định khi tạo mã AArch64 bằng cách đặt tùy chọn dòng lệnh "-march=armv8-a+sve".

  • Cờ "-O" hiện được xác định bằng chế độ tối ưu hóa "-O1" thay vì "-O2".
  • Đã thêm cờ trình biên dịch mới:
    • "-fstack-clash-protection" - cho phép bảo vệ chống lại giao điểm của ngăn xếp và đống.
    • "-ffp-Exception-behavior={ignore,maytrap,strict}" - cho phép bạn chọn chế độ xử lý ngoại lệ cho số dấu phẩy động.
    • "-ffp-model={precise,strict,fast}" - Đơn giản hóa việc truy cập vào một loạt các tùy chọn chuyên biệt cho số dấu phẩy động.
    • "-fpch-codegen" và "-fpch-debuginfo" để tạo tiêu đề được biên dịch trước (PCH) với các tệp đối tượng riêng biệt cho mã và thông tin gỡ lỗi.
    • “-fsanitize-coverage-allowlist” và “-fsanitize-coverage-blocklist” để kiểm tra danh sách trắng và đen kiểm tra phạm vi bảo hiểm.
    • “-mtls-size={12,24,32,48}” để chọn kích thước TLS (bộ nhớ cục bộ theo luồng).
    • "-menable-experimental-extension" để bật tiện ích mở rộng RISC-V thử nghiệm.
  • Chế độ mặc định cho C là "-fno-common", cho phép truy cập hiệu quả hơn vào các biến toàn cục trên một số nền tảng.
  • Bộ đệm mô-đun mặc định đã được chuyển từ /tmp sang thư mục ~/.cache. Để ghi đè, bạn có thể sử dụng cờ “-fmodules-cache-path=”.
  • Tiêu chuẩn ngôn ngữ C mặc định đã được cập nhật từ gnu11 lên gnu17.
  • Đã thêm hỗ trợ sơ bộ cho tiện ích mở rộng GNU C "asm nội tuyến» để thêm các phần chèn của trình biên dịch mã. Tiện ích mở rộng vẫn đang được phân tích nhưng chưa được xử lý theo bất kỳ cách nào.
  • Các khả năng liên quan đến hỗ trợ OpenCL và CUDA đã được mở rộng. Đã thêm hỗ trợ cho chẩn đoán khối OpenCL 2.0 và triển khai các tính năng OpenMP 5.0 mới.
  • Đã thêm tùy chọn IndentExternBlock vào tiện ích định dạng clang để căn chỉnh trong các khối "C" bên ngoài và khối "C++" bên ngoài.
  • Trình phân tích tĩnh đã cải thiện khả năng xử lý các hàm tạo kế thừa trong C++. Đã thêm các kiểm tra mới alpha.core.C11Lock và alpha.fuchsia.Lock để kiểm tra khóa, alpha.security.cert.pos.34c để phát hiện việc sử dụng putenv, webkit.NoUncountedMemberChecker và webkit.RefCntblBaseVirtualDtor để phát hiện sự cố với các loại không thể đếm được, alpha .cplusplus .SmartPtr để kiểm tra xem có vô hiệu hóa con trỏ thông minh không.
  • Trong kẻ nói dối kêu vang-gọn gàng thêm một phần lớn các séc mới.
  • Máy chủ bộ nhớ đệm clangd (Máy chủ Clang) đã cải thiện hiệu suất và bổ sung các khả năng chẩn đoán mới.

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

  • Hệ thống xây dựng đã được chuyển sang sử dụng Python 3. Nếu Python 3 không có sẵn, bạn có thể quay lại sử dụng Python 2.
  • Giao diện người dùng với trình biên dịch cho ngôn ngữ Go (llgo) bị loại khỏi bản phát hành và có thể được cơ cấu lại trong tương lai.
  • Thuộc tính vector-function-abi-variant đã được thêm vào biểu diễn trung gian (IR) để mô tả ánh xạ giữa các hàm vô hướng và vectơ nhằm vector hóa các lệnh gọi. Từ llvm::VectorType có hai loại vectơ riêng biệt llvm::FixedVectorType và llvm::ScalableVectorType.
  • Việc phân nhánh dựa trên các giá trị udef và chuyển các giá trị undef tới các hàm thư viện tiêu chuẩn được coi là hành vi không xác định. TRONG
    memset/memcpy/memmove cho phép truyền con trỏ undef, nhưng nếu tham số có kích thước bằng XNUMX.

  • LLJIT đã thêm hỗ trợ để thực hiện khởi tạo tĩnh thông qua các phương thức LLJIT::initialize và LLJIT::deinitialize. Khả năng thêm các thư viện tĩnh vào JITDylib bằng cách sử dụng lớp StaticLibraryDefinitionGenerator đã được triển khai. Đã thêm API C cho ORCv2 (API xây dựng trình biên dịch JIT).
  • Hỗ trợ cho bộ xử lý Cortex-A64, Cortex-A34, Cortex-A77 và Cortex-X78 đã được thêm vào phần phụ trợ cho kiến ​​trúc AArch1. Đã triển khai các phần mở rộng ARMv8.2-BF16 (BFloat16) và ARMv8.6-A, bao gồm RMv8.6-ECV (Ảo hóa bộ đếm nâng cao), ARMv8.6-FGT (Bẫy hạt mịn), ARMv8.6-AMU (Ảo hóa màn hình hoạt động) và ARMv8.0-DGH (Gợi ý thu thập dữ liệu). Khả năng tạo mã cho các hàm gắn sẵn với các lệnh vectơ SVE được cung cấp.
  • Hỗ trợ cho bộ xử lý Cortex-M55, Cortex-A77, Cortex-A78 và Cortex-X1 đã được thêm vào phần phụ trợ cho kiến ​​trúc ARM. Đã triển khai tiện ích mở rộng
    Nhân ma trận Armv8.6-A và RMv8.2-AA32BF16 BFloat16.

  • Hỗ trợ tạo mã cho bộ xử lý POWER10 đã được thêm vào phần phụ trợ cho kiến ​​trúc PowerPC. Tối ưu hóa vòng lặp đã được mở rộng và hỗ trợ dấu phẩy động đã được cải thiện.
  • Phần phụ trợ của kiến ​​trúc RISC-V cho phép chấp nhận các bản vá hỗ trợ các tập lệnh mở rộng thử nghiệm chưa được phê duyệt chính thức.
  • Phần phụ trợ cho kiến ​​trúc AVR đã được chuyển từ loại thử nghiệm sang dạng ổn định, được đưa vào bản phân phối cơ bản.
  • Phần phụ trợ cho kiến ​​trúc x86 hỗ trợ các lệnh Intel AMX và TSXLDTRK. Thêm bảo vệ chống lại các cuộc tấn công LVI (Tiêm giá trị tải) và cũng triển khai cơ chế Ngăn chặn tác dụng phụ thực thi suy đoán chung để chặn các cuộc tấn công gây ra bởi việc thực thi các hoạt động suy đoán trên CPU.
  • Trong phần phụ trợ của kiến ​​trúc SystemZ, tính năng hỗ trợ MemorySanitizer và LeakSanitizer đã được thêm vào.
  • Đã thêm hỗ trợ cho tệp tiêu đề với các hằng số toán học vào Libc++ .
  • mở rộng Khả năng liên kết LLD. Cải thiện hỗ trợ cho định dạng ELF, bao gồm các tùy chọn bổ sung "--lto-emit-asm", "--lto-whole-program-visibility", "-print-archive-stats", "-shuffle-sections", " -thinlto- mô-đun đơn", "-unique", "-rosegment", "-threads=N". Đã thêm tùy chọn "--time-trace" để lưu dấu vết vào một tệp, sau đó có thể phân tích tệp này qua giao diện chrome://tracing trong Chrome.

Nguồn: opennet.ru

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