Phát hành bộ biên dịch GCC 10

Sau một năm phát triển xuất bản phát hành một bộ trình biên dịch miễn phí GCC 10.1, bản phát hành chính đầu tiên trong nhánh GCC 10.x mới. Phù hợp với kế hoạch mới số phát hành, phiên bản 10.0 đã được sử dụng trong quá trình phát triển và ngay trước khi phát hành GCC 10.1, nhánh GCC 11.0 đã phân nhánh, trên cơ sở đó bản phát hành quan trọng tiếp theo, GCC 11.1, sẽ được hình thành.

GCC 10.1 đáng chú ý vì đã triển khai nhiều cải tiến trong ngôn ngữ C++ được phát triển cho tiêu chuẩn C++ 20, các cải tiến liên quan đến tiêu chuẩn ngôn ngữ C trong tương lai (C2x), các tối ưu hóa mới trong phần phụ trợ của trình biên dịch và hỗ trợ thử nghiệm chế độ phân tích tĩnh. Ngoài ra, trong quá trình chuẩn bị chi nhánh mới, dự án đã chuyển kho lưu trữ từ SVN sang Git.

Chính thay đổi:

  • Thêm chế độ thử nghiệm phân tích tĩnh "-fanalyzer“, thực hiện phân tích liên thủ tục sử dụng nhiều tài nguyên về các đường dẫn thực thi mã và luồng dữ liệu trong một chương trình. Chế độ này có khả năng phát hiện các vấn đề ở giai đoạn biên dịch, chẳng hạn như gọi hai lần hàm free() cho một vùng bộ nhớ, rò rỉ bộ mô tả tệp, hủy tham chiếu và truyền con trỏ null, truy cập các khối bộ nhớ được giải phóng, sử dụng các giá trị chưa được khởi tạo, v.v. Việc sử dụng chế độ mới cho mã OpenSSL đã giúp xác định được lỗ hổng nguy hiểm.
  • Cải thiện tối ưu hóa liên thủ tục. Thẻ IPA-SRA (Thay thế chia sẻ vô hướng liên thủ tục) đã được thiết kế lại để hoạt động tại thời điểm liên kết và, trong số những thứ khác, giờ đây loại bỏ các giá trị được tính toán và trả về không được sử dụng. Trong chế độ tối ưu hóa "-O2", tùy chọn "-finline-functions" được bật, được điều chỉnh lại để ưu tiên mã nhỏ gọn hơn so với hiệu suất thực thi. Công việc heuristic để triển khai hàm nội tuyến đã được đẩy nhanh. Giờ đây, các phương pháp phỏng đoán nhân bản hàm và mở rộng nội tuyến có thể sử dụng thông tin về các phạm vi giá trị để dự đoán tính hiệu quả của các phép biến đổi riêng lẻ. Đối với C++, độ chính xác của việc phân tích bí danh dựa trên loại đã được cải thiện.
  • Tối ưu hóa thời gian liên kết nâng cao (LTO). Đã thêm tệp thực thi mới lto-đổ để đặt lại thông tin về các tệp đối tượng bằng mã byte LTO. Các đường truyền LTO song song tự động xác định số lượng tác vụ thực hiện đang chạy đồng thời và nếu không thể xác định được chúng, hãy sử dụng thông tin về số lượng lõi CPU làm hệ số song song. Đã thêm khả năng nén mã byte LTO bằng thuật toán zstd.
  • Cơ chế tối ưu hóa dựa trên kết quả của việc định hình mã (PGO - Profile-guided optimization) đã được cải tiến, giúp tạo ra mã tối ưu hơn dựa trên phân tích các đặc điểm của việc thực thi mã. Cải thiện việc bảo trì hồ sơ trong quá trình biên dịch và phân tách mã nóng/lạnh. Thông qua tùy chọn "-fprofile-giá trị» hiện có thể giám sát tối đa 4 giá trị hồ sơ, ví dụ như các cuộc gọi gián tiếp và cung cấp thông tin hồ sơ chính xác hơn.
  • Đặc tả lập trình song song được triển khai cho các ngôn ngữ C, C++ và Fortran OpenACC 2.6, xác định các công cụ cho hoạt động giảm tải trên GPU và bộ xử lý chuyên dụng như NVIDIA PTX. Việc thực hiện tiêu chuẩn gần như đã hoàn tất Mở MP 5.0 (Đa xử lý mở), xác định API và các phương pháp áp dụng các phương pháp lập trình song song trên các hệ thống đa lõi và lai (CPU+GPU/DSP) với bộ nhớ dùng chung và các đơn vị vectơ hóa (SIMD). Đã thêm các tính năng như điều kiện riêng tư cuối cùng, chỉ thị quét và vòng lặp, biểu thức thứ tự và use_device_addr. Đối với OpenMP và OpenACC, hỗ trợ đã được thêm vào cho các hoạt động giảm tải trên GPU AMD Radeon (GCN) thế hệ thứ tư (Fiji) và thế hệ thứ năm (VEGA 10/VEGA 20).
  • Đối với các ngôn ngữ thuộc họ C, chức năng "truy cập" đã được thêm vào để mô tả quyền truy cập của hàm vào các đối tượng được truyền bằng tham chiếu hoặc con trỏ và để liên kết các đối tượng đó với các đối số nguyên chứa thông tin về kích thước của đối tượng. Để hoạt động cùng với “access”, thuộc tính “type” được triển khai để phát hiện quyền truy cập không chính xác từ các hàm của người dùng, chẳng hạn như khi ghi giá trị vào một khu vực bên ngoài giới hạn của mảng. Cũng được thêm vào là thuộc tính "symver" để liên kết các ký hiệu trong tệp ELF với số phiên bản cụ thể.
  • Cảnh báo mới được thêm vào:
    • “-Wstring-compare” (được bật bằng “-Wextra”) - cảnh báo về sự hiện diện của các biểu thức trong đó số XNUMX được so sánh với kết quả của việc gọi các hàm strcmp và strncmp, tương đương với một hằng số do thực tế là độ dài của một đối số lớn hơn kích thước của mảng trong đối số thứ hai.
    • "-Wzero-length-bounds" (được bật bằng "-Warray-bounds") - cảnh báo về việc truy cập các phần tử mảng có độ dài bằng XNUMX, điều này có thể dẫn đến ghi đè dữ liệu khác.
    • Các cảnh báo “-Warray-bounds”, “-Wformat-overflow”, “-Wrestrict”, “-Wreturn-local-addr” và “-Wstringop-overflow” đã được mở rộng để mở rộng số lượng các tình huống vượt quá giới hạn được xử lý.
  • Đã triển khai khả năng chỉ định trực tiếp các ký tự rộng trong số nhận dạng bằng cách sử dụng mã hóa hiện tại (UTF-8 theo mặc định) thay vì ký hiệu UCN (\uNNNN hoặc \UNNNNNNNN). Ví dụ:

    hằng số tĩnh int π = 3;
    int get_naïve_pi() {
    trả về π;
    }

  • Đối với ngôn ngữ C, một phần tính năng mới được phát triển trong tiêu chuẩn C2X đã được triển khai (được kích hoạt bằng cách chỉ định -std=c2x và -std=gnu2x): hỗ trợ cho cú pháp “[[]]” đã xuất hiện để xác định các thuộc tính như trong C++ (ví dụ: [[gnu ::const]], [[không được dùng nữa]], [[fallthrough]] và [[maybe_unused]]. Đã thêm hỗ trợ cho cú pháp "u8" để xác định các hằng số có ký tự UTF-8.
    Đã thêm macro mới vào . Đã thêm các thay thế "%OB" và "%Ob" vào strftime.

  • 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.
  • Đối với C++, khoảng 16 thay đổi, đổi mới đã được triển khai, phát triển theo chuẩn C++20. Bao gồm từ khóa được thêm vào “constinit”
    và hỗ trợ cho các tiện ích mở rộng mẫu đã được triển khai "các khái niệm". Các khái niệm cho phép bạn xác định một tập hợp các yêu cầu tham số mẫu mà tại thời điểm biên dịch sẽ giới hạn tập hợp các đối số có thể được chấp nhận làm tham số mẫu. Các khái niệm có thể được sử dụng để tránh sự mâu thuẫn logic giữa các thuộc tính của kiểu dữ liệu được sử dụng trong mẫu và thuộc tính kiểu dữ liệu của các tham số đầu vào.

  • G++ cung cấp khả năng phát hiện hành vi không xác định do thay đổi các đối tượng không đổi thông qua constexpr. Giảm mức tiêu thụ bộ nhớ của trình biên dịch khi tính toán constexpr. Đã thêm cảnh báo mới "-Wmismatched-tags" và "-Wredundant-tags".
  • Các tùy chọn dòng lệnh mới đã được đề xuất:
    • "-fallocation-dce" để loại bỏ các cặp toán tử "mới" và "xóa" không cần thiết.
    • "-fprofile-partial-training" để tắt tính năng tối ưu hóa kích thước cho mã không được đào tạo.
    • "-fprofile-reproducible để kiểm soát mức độ tái tạo hồ sơ.
    • "-fprofile-prefix-path" để xác định thư mục xây dựng nguồn cơ sở được sử dụng để tạo hồ sơ riêng biệt (cho "-fprofile-generate=profile_dir" và "-fprofile-use=profile_dir").
  • Trong văn bản cảnh báo về các tùy chọn được đề cập, các siêu liên kết được cung cấp cho phép bạn truy cập tài liệu về các tùy chọn này. Việc thay thế URL được kiểm soát bằng tùy chọn "-fdiagnostics-urls".
  • Đã thêm toán tử tiền xử lý "__has_buildin", có thể được sử dụng để kiểm tra các chức năng tích hợp.
  • Đã thêm hàm tích hợp mới "__buildin_roundeven" với việc triển khai hàm làm tròn được xác định trong thông số kỹ thuật ISO/IEC TS 18661, tương tự như "làm tròn", nhưng làm tròn phần lớn hơn 0.5 trở lên (thành giá trị lớn hơn), nhỏ hơn 0.5 - giảm (về 0.5) và bằng XNUMX - bắt đầu từ số chẵn lẻ của chữ số áp chót.
  • Đối với kiến ​​trúc AArch64, hỗ trợ cho phần mở rộng SVE2 đã được thêm vào và hỗ trợ cho SVE (Phần mở rộng vectơ có thể mở rộng) đã được cải thiện, bao gồm hỗ trợ bổ sung cho các chức năng và loại SVE ACLE tích hợp sẵn cũng như việc sử dụng vectơ hóa. Hỗ trợ cho LSE (Phần mở rộng hệ thống lớn) và TME (Phần mở rộng bộ nhớ giao dịch) đã được mở rộng. Đã thêm các hướng dẫn mới được đề xuất trong Armv8.5-A và Armv8.6-A, bao gồm các hướng dẫn tạo số ngẫu nhiên, làm tròn, liên kết thẻ nhớ,
    bfloat16 và phép nhân ma trận. Đã thêm hỗ trợ bộ xử lý
    Cánh tay Cortex-A77,
    Cánh tay Cortex-A76AE,
    Cánh tay Cortex-A65,
    Cánh tay Cortex-A65AE,
    Cánh tay Cortex-A34 và
    Marvell ThunderX3.

  • Đã thêm hỗ trợ cho ABI FDPIC (con trỏ hàm 32 bit) cho ARM64. Được thiết kế lại và tối ưu hóa việc xử lý các phép toán số nguyên 64 bit. Đã thêm hỗ trợ CPU
    Cánh tay Cortex-A77,
    Cánh tay Cortex-A76AE và
    Cánh tay Cortex-M35P. Hỗ trợ mở rộng cho các hướng dẫn xử lý dữ liệu ACLE, bao gồm SIMD 32 bit, phép nhân 16 bit, số học chốt và các tối ưu hóa thuật toán DSP khác. Đã thêm hỗ trợ thử nghiệm cho các hướng dẫn ACLE CDE (Phần mở rộng đường dẫn dữ liệu tùy chỉnh).

  • Cải thiện đáng kể việc tạo mã và vector hóa trong phần phụ trợ cho GPU AMD dựa trên vi kiến ​​trúc GCN.
  • Đã thêm hỗ trợ cho các thiết bị giống XMEGA cho kiến ​​trúc AVR
    ATtiny202, ATtiny204, ATtiny402, ATtiny404, ATtiny406, ATtiny804, ATtiny806, ATtiny807, ATtiny1604, ATtiny1606, ATtiny1607, ATmega808, ATmega809, ATmega1608, ATmega1609, ATmega3208, ATmega3209 4808, AT mega4809 và ATmegaXNUMX.

  • Phần mở rộng kiến ​​trúc tập lệnh Intel ENQCMD mới (-menqcmd) đã được thêm vào cho kiến ​​trúc IA-32/x86-64. Đã thêm hỗ trợ cho CPU Intel Cooperlake (-march=cooperlake, bao gồm phần mở rộng AVX512BF16 ISA) và Tigerlake (-march=tigerlake, bao gồm các phần mở rộng MOVDIRI, MOVDIR64B và AVX512VP2INTERSECT ISA).
  • Việc triển khai HSAIL (Ngôn ngữ trung gian kiến ​​trúc hệ thống không đồng nhất) cho các hệ thống máy tính không đồng nhất dựa trên kiến ​​trúc HSA đã không còn được dùng nữa và có thể sẽ bị xóa trong bản phát hành trong tương lai.

Nguồn: opennet.ru

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