Paglabas ng LLVM 16.0 compiler suite

Pagkatapos ng anim na buwan ng pag-unlad, ipinakita ang paglabas ng proyekto ng LLVM 16.0 - isang toolkit na katugma sa GCC (mga compiler, optimizer at code generator) na nagsasama-sama ng mga programa sa intermediate bitcode ng tulad ng RISC na virtual na mga tagubilin (isang mababang antas na virtual machine na may isang multi-level optimization system). Ang nabuong pseudocode ay maaaring ma-convert gamit ang isang JIT compiler sa mga tagubilin sa makina nang direkta sa oras ng pagpapatupad ng programa.

Mga pangunahing pagpapabuti sa Clang 16.0:

  • Ang default na pamantayan ng C++/ObjC++ ay gnu++17 (dating gnu++14), na nangangahulugang ang mga feature ng C++17 na may mga extension ng GNU ay sinusuportahan bilang default. Upang ibalik ang dating gawi, maaari mong gamitin ang opsyong "-std=gnu++14".
  • Ipinatupad ang mga advanced na tampok na nauugnay sa pamantayan ng C++20:
    • Walang kundisyon na mga espesyal na function ng miyembro,
    • pagkuha ng mga structured binding sa mga function ng lambda,
    • Equality operator sa loob ng mga expression,
    • Pagpipilian na alisin ang typename na keyword sa ilang konteksto,
    • Wastong pinagsama-samang pagsisimula sa mga panaklong (β€œAggr(val1, val2)”).
  • Ang mga tampok na tinukoy sa hinaharap na pamantayan ng C++2b ay ipinatupad:
    • Pinapayagan na maglagay ng mga label sa dulo ng mga compound expression,
    • static operator(),
    • static operator[],
    • Nasisiguro ang pagiging tugma sa uri ng char8_t,
    • Ang hanay ng mga character na pinapayagan para sa paggamit sa "\N{...}" ay pinalawak
    • Idinagdag ang kakayahang gumamit ng mga variable na idineklara bilang "static constexpr" sa mga function na idineklara bilang constexpr.
  • Ang mga tampok na tinukoy sa hinaharap na C-standard na C2x ay ipinatupad:
    • Upang hindi paganahin ang babala na "-Wunused-label," pinapayagan ang attribute na "[[maybe_unused]]" na ilapat sa mga label
    • Pinapayagan na maglagay ng mga label saanman sa loob ng mga compound expression,
    • Nagdagdag ng typeof at typeof_unqual operator,
    • Isang bagong uri na nullptr_t at isang nullptr constant upang tukuyin ang mga null pointer na maaaring mag-convert sa anumang uri ng pointer at kumakatawan sa isang variant ng NULL na hindi nakatali sa mga uri ng integer at void*.
    • Sa C2x mode, pinapayagan ang pagtawag sa va_start macro na may variable na bilang ng mga argumento (variadic).
  • Sa mga mode ng pagsunod sa C99, C11, at C17, ang mga default na opsyon na "-Wimplicit-function-declaration" at "-Wimplicit-int" ay gumagawa na ngayon ng error sa halip na isang babala.
  • Ang hindi direktang paggamit ng "void *" (hal. "void func(void *p) { *p; }") sa C++ mode ay nagdudulot na ngayon ng error, katulad ng ISO C++, GCC, ICC at MSVC.
  • Ang pagtukoy sa mga bitfield bilang mga operand ng pagtuturo (hal. "__asm ​​​​{ mov eax, s.bf }") sa mga inline na bloke ng pagpupulong na istilo ng Microsoft ay bumubuo na ngayon ng error.
  • Nagdagdag ng mga diagnostic para sa pagkakaroon ng iba't ibang istruktura at unyon na may parehong mga pangalan sa iba't ibang mga module.
  • Ang mga kakayahan na nauugnay sa suporta ng OpenCL at OpenMP ay pinalawak. Mga pinahusay na diagnostic para sa mga template ng C++ na ginagamit sa mga argumento ng OpenCL kernel. Pinahusay na suporta sa queuing block para sa AMDGPU. Ang katangian ng nounwind ay tahasang idinagdag sa lahat ng mga function. Pinahusay na suporta para sa mga built-in na function.
  • Idinagdag ang kakayahang gamitin ang CLANG_CRASH_DIAGNOSTICS_DIR na environment variable upang tukuyin ang direktoryo kung saan naka-save ang data ng diagnostic ng pag-crash.
  • Ang suporta sa Unicode ay na-update sa detalye ng Unicode 15.0. Ang ilang mga mathematical na simbolo ay pinapayagan sa mga identifier, gaya ng "β‚Š" (hal. "double xβ‚–β‚Šβ‚").
  • Nagdagdag ng suporta para sa paglo-load ng maramihang mga configuration file (ang mga default na configuration file ay unang na-load, at pagkatapos ay ang mga tinukoy sa pamamagitan ng "--config=" flag, na maaari na ngayong tukuyin nang maraming beses). Binago ang default na pagkakasunud-sunod ng paglo-load ng mga configuration file: sinusubukang i-load muna ng clang ang file - .cfg, at kung hindi ito matagpuan, susubukan nitong mag-load ng dalawang file .cfg at .cfg. Upang i-disable ang paglo-load ng mga configuration file bilang default, idinagdag ang flag na β€œ--no-default-config”.
  • Upang matiyak ang paulit-ulit na mga build, posibleng palitan ang kasalukuyang mga halaga ng petsa at oras sa mga __DATE__, __TIME__ at __TIMESTAMP__ na mga macro sa oras na tinukoy sa variable ng kapaligiran ng SOURCE_DATE_EPOCH.
  • Upang suriin ang pagkakaroon ng mga built-in na function (builtin) na maaaring gamitin sa konteksto ng mga constant, ang macro na "__has_constexpr_builtin" ay idinagdag.
  • Nagdagdag ng bagong compilation flag na "-fcoro-aligned-allocation" para sa aligned coroutine frame allocation.
  • Ang flag na "-fstrict-flex-arrays=" ay nagpapatupad ng suporta para sa ikatlong antas ng pag-verify ng mga flexible na elemento ng array sa mga istruktura (Mga Miyembro ng Flexible Array, isang array ng hindi tiyak na laki sa dulo ng istraktura). Sa ikatlong antas, ang laki lang na "[]" (halimbawa, "int b[]") ang itinuturing bilang isang flexible array, ngunit ang laki na "[0]" (halimbawa, "int b[0]") ay hindi.
  • Idinagdag ang flag na "-fmodule-output" para paganahin ang single-phase compilation model para sa mga karaniwang C++ na module.
  • Idinagdag ang mode na "-Rpass-analysis=stack-frame-layout" upang makatulong sa pag-diagnose ng mga problema sa layout ng stack frame.
  • Nagdagdag ng bagong attribute na __attribute__((target_version("cpu_features"))) at pinalawig ang functionality ng attribute na __attribute__((target_clones("cpu_features1","cpu_features2",...))) para pumili ng mga partikular na bersyon ng mga feature na ibinigay ng AArch64 Mga CPU.
  • Pinalawak na mga tool sa diagnostic:
    • Nagdagdag ng babala na "-Wsingle-bit-bitfield-constant-conversion" para makita ang implicit na pagpuputol kapag nagtatalaga ng isa sa isang bitfield na nilagdaan ng single-bit.
    • Ang mga diagnostic ng hindi nasimulang mga variable ng constexpr ay pinalawak.
    • Nagdagdag ng mga babala na "-Wcast-function-type-strict" at "-Wincompatible-function-pointer-types-strict" para matukoy ang mga potensyal na problema sa pag-cast ng uri ng function.
    • Nagdagdag ng mga diagnostic para sa paggamit ng hindi tama o nakareserbang mga pangalan ng module sa mga bloke ng pag-export.
    • Pinahusay na pagtuklas ng mga nawawalang "auto" na keyword sa mga kahulugan.
    • Ang pagpapatupad ng babala na "-Winteger-overflow" ay nagdagdag ng mga pagsusuri para sa mga karagdagang sitwasyon na humahantong sa mga overflow.
  • Ang suporta para sa LoongArch instruction set architecture (-march=loongarch64 o -march=la464), na ginamit sa Loongson 3 5000 na mga processor at pagpapatupad ng bagong RISC ISA, katulad ng MIPS at RISC-V, ay ipinatupad.

Mga pangunahing inobasyon sa LLVM 16.0:

  • Pinapayagan ang LLVM code na gumamit ng mga elemento na tinukoy sa pamantayan ng C++17.
  • Ang mga kinakailangan sa kapaligiran para sa pagtatayo ng LLVM ay nadagdagan. Ang mga tool sa pagbuo ay dapat na ngayong suportahan ang pamantayan ng C++17, ibig sabihin. Upang bumuo, kailangan mo ng hindi bababa sa GCC 7.1, Clang 5.0, Apple Clang 10.0 o Visual Studio 2019 16.7.
  • Ang backend para sa arkitektura ng AArch64 ay nagdaragdag ng suporta para sa Cortex-A715, Cortex-X3 at Neoverse V2 na mga CPU, assembler para sa RME MEC (Memory Encryption Contexts), Armv8.3 extension (Complex Number) at Function Multi Versioning.
  • Sa backend para sa arkitektura ng ARM, ang suporta para sa Armv2, Armv2A, Armv3 at Armv3M na mga target na platform ay hindi na ipinagpatuloy, kung saan hindi ginagarantiyahan ang pagbuo ng tamang code. Idinagdag ang kakayahang bumuo ng code para sa mga tagubilin para sa pagtatrabaho sa mga kumplikadong numero.
  • Ang backend para sa X86 architecture ay nagdagdag ng suporta para sa mga instruction set architecture (ISA) AMX-FP16, CMPCCXADD, AVX-IFMA, AVX-VNNI-INT8, AVX-NE-CONVERT. Nagdagdag ng suporta para sa RDMSRLIST, RMSRLIST at WRMSRNS na mga tagubilin. Ipinatupad ang mga opsyon na "-mcpu=raptorlake", "-mcpu=meteorlake", "-mcpu=emeraldrapids", "-mcpu=sierraforest", "-mcpu=graniterapids" at "-mcpu=grandridge".
  • Nagdagdag ng opisyal na suporta para sa LoongArch platform.
  • Mga pinahusay na backend para sa mga arkitektura ng MIPS, PowerPC at RISC-V
  • Nagdagdag ng suporta para sa pag-debug ng mga 64-bit na executable para sa arkitektura ng LoongArch sa debugger ng LLDB. Pinahusay na paghawak ng mga simbolo ng pag-debug ng COFF. Ibinigay ang pag-filter ng mga duplicate na DLL sa listahan ng mga naka-load na Windows module.
  • Sa Libc++ library, ang pangunahing gawain ay nakatuon sa pagpapatupad ng suporta para sa mga bagong feature ng C++20 at C++23 na pamantayan.
  • Ang LDD linker ay makabuluhang binabawasan ang oras ng pag-link sa pamamagitan ng pagpapaparallelize ng address relocation scanning at section initialization operations. Nagdagdag ng suporta para sa pag-compress ng seksyon gamit ang ZSTD algorithm.

Pinagmulan: opennet.ru

Magdagdag ng komento