LLVM 16.0 хөрвүүлэгчийн багцыг гаргасан

Зургаан сарын турш хөгжүүлсний дараа LLVM 16.0 төслийн хувилбарыг танилцуулав - GCC-тэй нийцтэй хэрэгслийн иж бүрдэл (эмхэтгэгчид, оновчтой болгогчид болон код үүсгэгчид) нь програмуудыг RISC-тэй төстэй виртуал зааврын завсрын бит код болгон хөрвүүлдэг (бага түвшний виртуал машин). олон түвшний оновчлолын систем). Үүсгэсэн псевдокодыг JIT хөрвүүлэгч ашиглан программыг гүйцэтгэх үед шууд машины заавар болгон хувиргаж болно.

Clang 16.0-ийн томоохон сайжруулалтууд:

  • Анхдагч C++/ObjC++ стандарт нь gnu++17 (өмнө нь gnu++14) бөгөөд энэ нь GNU өргөтгөлтэй C++17 функцуудыг анхдагчаар дэмждэг гэсэн үг юм. Өмнөх үйлдлийг буцаахын тулд та "-std=gnu++14" сонголтыг ашиглаж болно.
  • C++ 20 стандарттай холбоотой дэвшилтэт боломжуудыг хэрэгжүүлсэн:
    • Нөхцөлт багатай тусгай гишүүн функцууд,
    • lambda функцууд дахь бүтэцлэгдсэн холболтыг авах,
    • Илэрхийллийн доторх тэгш байдлын оператор,
    • Зарим контекстэд typename түлхүүр үгийг орхих сонголт,
    • Хаалтанд хүчинтэй нэгтгэсэн эхлэл (“Aggr(val1, val2)”).
  • Ирээдүйн C++2b стандартад тодорхойлсон онцлогуудыг хэрэгжүүлсэн:
    • Нийлмэл илэрхийллийн төгсгөлд шошго байрлуулахыг зөвшөөрнө.
    • статик оператор (),
    • статик оператор[],
    • char8_t төрлийн нийцтэй байдал хангагдсан,
    • "\N{...}"-д ашиглахыг зөвшөөрсөн тэмдэгтүүдийн хүрээг өргөтгөсөн
    • constexpr гэж зарласан функцүүдэд "статик constexpr" гэж зарласан хувьсагчдыг ашиглах чадварыг нэмсэн.
  • Ирээдүйд C-стандарт C2x-д тодорхойлсон шинж чанаруудыг хэрэгжүүлэв.
    • "-Wunused-label" анхааруулгыг идэвхгүй болгохын тулд "[[магадгүй_ашиглагдаагүй]]" шинж чанарыг шошгон дээр ашиглахыг зөвшөөрнө.
    • Нийлмэл илэрхийлэл дотор хаана ч шошго байрлуулахыг зөвшөөрнө.
    • typeof болон typeof_unqual операторуудыг нэмсэн,
    • Шинэ төрлийн nullptr_t ба nullptr тогтмол нь ямар ч заагч төрөл рүү хөрвүүлэх боломжтой null заагчийг тодорхойлох ба бүхэл тоо болон хүчингүй* төрлүүдтэй холбогддоггүй NULL-ийн хувилбарыг төлөөлдөг.
    • C2x горимд va_start макрог хувьсах тооны аргументтай (вариадик) дуудахыг зөвшөөрдөг.
  • C99, C11, C17 дагаж мөрдөх горимд "-Wimplicit-function-declaration" болон "-Wimplicit-int" гэсэн үндсэн сонголтууд нь одоо анхааруулгын оронд алдаа гаргадаг.
  • C++ горимд "void *" (жишээ нь "void func(void *p) { *p; }") шууд бусаар ашиглах нь одоо ISO C++, GCC, ICC болон MSVC-тэй төстэй алдаа үүсгэдэг.
  • Бит талбаруудыг зааврын операнд (жишээ нь: "__asm ​​{ mov eax, s.bf }") гэж Microsoft загварын шугаман угсралтын блокуудад зааж өгөх нь одоо алдаа үүсгэдэг.
  • Өөр өөр модулиудад ижил нэртэй өөр өөр бүтэц, нэгдлүүд байгаа эсэхийг оношлох оношийг нэмсэн.
  • OpenCL болон OpenMP-ийн дэмжлэгтэй холбоотой боломжуудыг өргөжүүлсэн. OpenCL цөмийн аргументуудад ашигладаг C++ загваруудын оношилгоог сайжруулсан. AMDGPU-д зориулсан дарааллын блокийн дэмжлэгийг сайжруулсан. Nounwind шинж чанар нь бүх функцэд далд хэлбэрээр нэмэгддэг. Суулгасан функцүүдийн дэмжлэгийг сайжруулсан.
  • Гэмтлийн оношилгооны өгөгдөл хадгалагдах лавлахыг тодорхойлохын тулд CLANG_CRASH_DIAGNOSTICS_DIR орчны хувьсагчийг ашиглах боломжийг нэмсэн.
  • Юникод дэмжлэгийг Юникод 15.0 тодорхойлолт болгон шинэчилсэн. "₊" (жишээ нь "давхар xₖ₊₁") гэх мэт зарим математикийн тэмдэгтүүдийг танигчдад зөвшөөрдөг.
  • Олон тохиргооны файлуудыг ачаалах дэмжлэгийг нэмсэн (үндсэн тохиргооны файлуудыг эхлээд ачаалж, дараа нь "--config=" туг ашиглан заасан файлуудыг одоо олон удаа зааж өгч болно). Тохиргооны файлуудын анхдагч ачаалах дарааллыг өөрчилсөн: clang эхлээд файлыг ачаалахыг оролддог - .cfg, хэрэв олдохгүй бол хоёр файлыг ачаалахыг оролдоно .cfg болон .cfg. Анхдагчаар тохиргооны файлуудыг ачаалахыг идэвхгүй болгохын тулд "--no-default-config" гэсэн тугийг нэмсэн.
  • Дахин давтагдах бүтцийг баталгаажуулахын тулд __DATE__, __TIME__ болон __TIMESTAMP__ макро дахь одоогийн огноо, цагийн утгыг SOURCE_DATE_EPOCH орчны хувьсагчд заасан цагаар солих боломжтой.
  • Тогтмол утгуудын хүрээнд ашиглаж болох суулгасан функц (бүтээл) байгаа эсэхийг шалгахын тулд “__has_constexpr_builtin” макро нэмсэн.
  • Зэрэгцүүлсэн корутин хүрээний хуваарилалтад зориулж "-fcoro-aligned-allocation" эмхэтгэлийн шинэ тугийг нэмсэн.
  • “-fstrict-flex-arrays=” туг нь бүтэц дэх уян хатан массивын элементүүдийг шалгах гурав дахь түвшний дэмжлэгийг хэрэгжүүлдэг (Уян хатан массивын гишүүд, бүтцийн төгсгөлд байгаа тодорхойгүй хэмжээтэй массив). Гурав дахь түвшинд зөвхөн "[]" хэмжээг (жишээлбэл, "int b[]") уян хатан массив гэж үздэг боловч "[0]" хэмжээг (жишээлбэл, "int b[0]") биш.
  • Стандарт C++ модулиудын нэг фазын эмхэтгэлийн загварыг идэвхжүүлэхийн тулд "-fmodule-output" тугийг нэмсэн.
  • Стекийн хүрээний зохион байгуулалттай холбоотой асуудлуудыг оношлоход туслах "-Rpass-analysis=stack-frame-layout" горимыг нэмсэн.
  • __attribute__((target_version("cpu_features"))) шинэ атрибут нэмсэн ба __attribute__((target_clones("cpu_features1","cpu_features2",...))) AArch64-с өгсөн онцлогуудын тодорхой хувилбаруудыг сонгохын тулд атрибутын ажиллагааг өргөтгөсөн. CPU-ууд.
  • Оношлогооны хэрэгслийг өргөжүүлсэн:
    • "-Wsingle-bit-bitfield-constant-conversion" гэсэн анхааруулгыг нэг битийн гарын үсэг бүхий бит талбарт оноох үед далд таслалтыг илрүүлэхийн тулд нэмсэн.
    • Эхлээгүй constexpr хувьсагчийн оношлогоо өргөжсөн.
    • "-Wcast-function-type-strict" болон "-Wincompatible-function-pointer-types-strict" сэрэмжлүүлгийг функцийн төрлийн дамжуулалтад гарч болзошгүй асуудлуудыг тодорхойлохын тулд нэмсэн.
    • Экспортын блокуудад буруу эсвэл нөөцлөгдсөн модулийн нэрийг ашиглах оношилгоог нэмсэн.
    • Улучшено выявление пропущенных ключевых слов «auto» в определениях.
    • "-Winteger-overflow" анхааруулгыг хэрэгжүүлснээр халихад хүргэдэг нэмэлт нөхцөл байдлын шалгалтыг нэмсэн.
  • Loongson 64 464 процессорт ашигласан, MIPS болон RISC-V-тэй төстэй шинэ RISC ISA-г хэрэгжүүлж буй LoongArch зааварчилгааны багц архитектурт (-march=loongarch3 эсвэл -march=la5000) дэмжлэг үзүүлсэн.

LLVM 16.0-ийн гол шинэчлэлүүд:

  • LLVM код нь C++ 17 стандартад тодорхойлсон элементүүдийг ашиглахыг зөвшөөрдөг.
  • LLVM барих орчны шаардлагыг нэмэгдүүлсэн. Одоо бүтээх хэрэгслүүд нь C++ 17 стандартыг дэмжих ёстой, өөрөөр хэлбэл. Үүнийг бүтээхийн тулд танд хамгийн багадаа GCC 7.1, Clang 5.0, Apple Clang 10.0 эсвэл Visual Studio 2019 16.7 хэрэгтэй.
  • AArch64 архитектурын арын хэсэг нь Cortex-A715, Cortex-X3 болон Neoverse V2 CPU-ийн дэмжлэг, RME MEC (санах ойн шифрлэлтийн контекст) ассемблер, Armv8.3 өргөтгөлүүд (цогц тоо) болон функцийн олон хувилбарыг дэмждэг.
  • ARM архитектурын арын хэсэгт Armv2, Armv2A, Armv3 болон Armv3M зорилтот платформуудын дэмжлэгийг зогсоосон тул зөв код үүсгэх баталгаагүй байсан. Нарийн төвөгтэй тоонуудтай ажиллах зааварчилгааны код үүсгэх чадварыг нэмсэн.
  • X86 архитектурын арын хэсэг нь AMX-FP16, CMPCCXADD, AVX-IFMA, AVX-VNNI-INT8, AVX-NE-CONVERT зааврын багц архитектурын (ISAs) дэмжлэгийг нэмсэн. RDMSRLIST, RMSRLIST болон WRMSRNS зааварчилгааны дэмжлэгийг нэмсэн. "-mcpu=raptorlake", "-mcpu=meteorlake", "-mcpu=emeraldrapids", "-mcpu=sierraforest", "-mcpu=graniterapids" болон "-mcpu=grandridge" гэсэн сонголтуудыг хэрэгжүүлсэн.
  • LoongArch платформд албан ёсны дэмжлэг нэмсэн.
  • MIPS, PowerPC болон RISC-V архитектурт зориулсан сайжруулсан backends
  • LLDB дибаглагч руу LoongArch архитектурт зориулсан 64 битийн гүйцэтгэх файлуудыг дибаг хийх дэмжлэгийг нэмсэн. COFF дибаг хийх тэмдгүүдийн зохицуулалт сайжирсан. Ачаалагдсан Windows модулиудын жагсаалтад давхардсан DLL файлуудыг шүүж өгсөн.
  • Libc++ номын санд үндсэн ажил нь C++20 болон C++23 стандартуудын шинэ боломжуудыг дэмжихэд чиглэгдсэн.
  • LDD холбогч нь хаяг нүүлгэн шилжүүлэх скан хийх болон хэсгийг эхлүүлэх үйлдлүүдийг зэрэгцүүлэн холбох хугацааг эрс багасгадаг. ZSTD алгоритмыг ашиглан хэсгийг шахах дэмжлэгийг нэмсэн.

Эх сурвалж: opennet.ru

сэтгэгдэл нэмэх