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

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

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

  • X86 архитектурт суурилсан системүүдийн хувьд "-fzero-call-used-regs" гэсэн тугийг нэмсэн бөгөөд энэ нь функцээс хяналтыг буцаахаас өмнө функцэд ашиглагдсан бүх CPU регистрийг тэг болгон тохируулдаг. Энэ сонголт нь функцээс мэдээлэл алдагдахаас хамгаалж, мөлжлөгт ROP (Буцах хандлагатай програмчлал) гаджетуудыг бүтээхэд тохиромжтой блокуудын тоог ойролцоогоор 20%-иар бууруулах боломжийг олгоно.
  • С кодын санах ойн бүтцийг санамсаргүй байдлаар байршуулах ажлыг хэрэгжүүлсэн бөгөөд энэ нь эмзэг байдлыг ашиглах тохиолдолд бүтцээс өгөгдөл гаргахад хүндрэл учруулдаг. Санамсаргүй тохиргоог randomize_layout болон no_randomize_layout шинж чанаруудыг ашиглан асааж унтраадаг бөгөөд "-frandomize-layout-seed" эсвэл "-frandomize-layout-seed-file" тугийг ашиглан үр тогтоох шаардлагатай.
  • "-fstrict-flex-arrays=" туг нэмсэн ", үүний тусламжтайгаар та бүтэц дэх уян хатан массив элементийн хил хязгаарыг хянах боломжтой (Уян хатан массивын гишүүд, бүтцийн төгсгөлд байгаа тодорхойгүй хэмжээтэй массив). 0 (өгөгдмөл) гэж тохируулсан үед массив бүхий бүтцийн сүүлчийн элементийг үргэлж уян хатан массив болгон боловсруулдаг, 1 - зөвхөн [], [0] ба [1] хэмжээсийг уян массив хэлбэрээр, 2 - зөвхөн хэмжээсийг боловсруулдаг. [] ба [0] нь уян хатан массив шиг боловсруулагдана.
  • DirectX-д шэйдер бичихэд ашигладаг C-тэй төстэй хэлний HLSL (High-Level Shader Language)-д туршилтын дэмжлэг нэмсэн.
  • Тогтмол болон хувьсах урттай массивтай холбоотой үл нийцэх аргументын мэдэгдлүүдтэй функцүүдийг хүчингүй болгох талаар анхааруулахын тулд "-Warray-parameter"-ийг нэмсэн.
  • MSVC-тэй нийцтэй байдал сайжирсан. MSVC-д өгөгдсөн "#pragma функц" (хөрвүүлэгчид мөрийн өргөтгөлийн оронд функцийн дуудлагыг үүсгэх зааварчилгаа) болон "#pragma alloc_text" (хэсгийн нэрийг функцийн кодоор тодорхойлно) дэмжлэгийг нэмсэн. MSVC нийцтэй /JMC болон /JMC тугуудын дэмжлэгийг нэмсэн.
  • Ирээдүйн C2X болон C++23 стандартуудыг дэмжих ажил үргэлжилж байна. Си хэлний хувьд дараах зүйлсийг хэрэгжүүлсэн: noreturn шинж чанар, худал ба үнэн түлхүүр үгс, өгөгдсөн битийн гүнийн бүхэл тоонуудын _BitInt(N) төрөл, *_WIDTH макро, UTF-8 кодлогдсон тэмдэгтүүдийн u8 угтвар.

    C++-ийн хувьд дараах зүйлсийг хэрэгжүүлдэг: модуль нэгтгэх, функцийн гишүүдийн ABI тусгаарлалт, модуль дахь орон нутгийн бус хувьсагчдыг эрэмбэлэгдсэн динамик эхлүүлэх, олон хэмжээст индексийн операторууд, auto(x), үсэг бус хувьсагчид, constexpr гэж зарласан функцууд дахь goto болон шошго. , тусгаарлагдсан зугтах дараалал, нэрлэгдсэн зугтах тэмдэгтүүд.

  • OpenCL болон OpenMP-ийн дэмжлэгтэй холбоотой боломжуудыг өргөжүүлсэн. OpenCL өргөтгөлийн cl_khr_subgroup_rotate-д дэмжлэг нэмсэн.
  • X86 архитектурын хувьд болзолгүй урагшлах үйлдлүүдийн дараа зааврын таамаглалаар гүйцэтгэсэн процессоруудын эмзэг байдлаас хамгаалах хамгаалалт нэмэгдсэн. Санах ой дахь салбар зааврын (SLS, Шулуун шугамын таамаглал) нэн даруй зааврыг урьдчилан боловсруулсны улмаас асуудал үүсдэг. Хамгаалалтыг идэвхжүүлэхийн тулд “-mharden-sls=[none|all|return|indirect-jmp]” сонголтыг санал болгож байна.
  • SSE2 өргөтгөлийг дэмждэг платформуудын хувьд _Float16 төрлийг нэмсэн бөгөөд энэ нь AVX512-FP16 зааврыг дэмжихгүй тохиолдолд float төрлийг ашиглан дуурайлган хийдэг.
  • RDPRU зааврын ашиглалтыг хянахын тулд "-m[no-]rdpru" тугийг нэмсэн бөгөөд үүнийг AMD Zen2 процессороос эхлэн дэмждэг.
  • RETBLEED эмзэг байдлаас хамгаалахын тулд "-mfunction-return=thunk-extern" тугийг нэмсэн бөгөөд энэ нь шууд бус салбаруудын таамаглалын гүйцэтгэлийн механизмын оролцоог хассан зааврын дарааллыг нэмснээр ажилладаг.

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

  • Cortex-M85 CPU, Armv9-A, Armv9.1-A болон Armv9.2-A архитектурууд, Armv8.1-M PACBTI-M өргөтгөлүүдийн дэмжлэгийг нэмсэн.
  • DirectX шэйдерүүдэд ашигладаг DXIL (DirectX Intermediate Language) форматыг дэмждэг DirectX-д зориулсан туршилтын арын хэсэг нэмэгдсэн. Угсрах явцад “-DLLVM_EXPERIMENTAL_TARGETS_TO_BUILD=DirectX” параметрийг зааж өгснөөр арын хэсгийг идэвхжүүлнэ.
  • Libc++ нь C++20 болон C++2b стандартуудын шинэ боломжуудыг үргэлжлүүлэн хэрэгжүүлсээр байгаа бөгөөд үүнд "формат" номын сангийн хэрэгжилтийг дуусгах болон "муж" номын сангийн туршилтын хувилбарыг санал болгож байна.
  • X86, PowerPC болон RISC-V архитектурт зориулсан сайжруулсан арын хэсэг.
  • LLD холбогч болон LLDB дибаглагчийн чадавхийг сайжруулсан.

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

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