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

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

Clang 12.0-ийн сайжруулалт:

  • C++ 20 стандартад санал болгож буй “боломжтой” болон “боломжгүй” шинж чанаруудын дэмжлэгийг анхдагчаар хэрэгжүүлж, идэвхжүүлсэн нь оновчлогчдод нөхцөлт бүтээц үүсэх магадлалын талаар мэдээлэх боломжийг олгосон (жишээлбэл, “[[боломжтой ]] хэрэв (санамсаргүй > 0) {“).
  • AMD Zen 3 (-march=znver3), Intel Alder Lake (-march=alderlake) болон Intel Sapphire Rapids (-march=sapphirerapids) процессоруудын дэмжлэгийг нэмсэн.
  • X86-64 архитектурын түвшинг сонгохын тулд "-march=x234-86-v[64]" тугуудын дэмжлэгийг нэмсэн (v2 - SSE4.2, SSSE3, POPCNT болон CMPXCHG16B өргөтгөлүүдийг хамарна; v3 - AVX2 болон MOVBE; v4 - AVX-512 ) .
  • Arm Cortex-A78C (cortex-a78c), Arm Cortex-R82 (cortex-r82), Arm Neoverse V1 (neoverse-v1), Arm Neoverse N2 (neoverse-n2) болон Fujitsu A64FX (a64fx) процессоруудад зориулсан дэмжлэг нэмэгдсэн. Жишээлбэл, Neoverse-V1 CPU-ийн оновчлолыг идэвхжүүлэхийн тулд та "-mcpu=neoverse-v1" гэж зааж өгч болно.
  • AArch64 архитектурын хувьд "__aarch64_cas8_relax" гэх мэт атомын үйл ажиллагааны туслах функцийг идэвхжүүлэх эсвэл идэвхгүй болгохын тулд "-moutline-atomics" болон "-mno-outline-atomics" шинэ хөрвүүлэгчийн тугуудыг нэмсэн. Эдгээр функцүүд нь LSE (Том системийн өргөтгөл) дэмжлэг байгаа эсэхийг ажлын үед илрүүлж, өгөгдсөн атомын процессорын зааврыг ашиглах эсвэл синхрончлолд зориулж LL/SC (Load-link/store-нөхцөлт) зааварчилгааг ашиглана.
  • "-fbinutils-version" сонголтыг нэмсэн, binutils багцын зорилтот хувилбарыг хуучин холбогч болон ассемблерийн үйлдэлтэй нийцүүлэхийн тулд сонгох.
  • ELF-ийн гүйцэтгэгдэх файлуудын хувьд "-gz" тугийг зааж өгсөн үед zlib номын санг ашиглан дибаг хийх мэдээллийг шахах нь анхдагчаар идэвхждэг (gz=zlib). Үүссэн объектын файлуудыг холбоход lld эсвэл GNU binutils 2.26+ шаардлагатай. Binutils-ийн хуучин хувилбаруудтай нийцтэй байдлыг сэргээхийн тулд та "-gz=zlib-gnu" гэж зааж өгч болно.
  • 'This' заагчийг одоо null болон dereferenceable(N) чекүүдээр боловсруулж байна. NULL утгыг ашиглах шаардлагатай үед null бус шинж чанарыг арилгахын тулд "-fdelete-null-pointer-checks" сонголтыг ашиглаж болно.
  • Линукс платформ дээр "-fasynchronous-unwind-tables" горимыг AArch64 болон PowerPC архитектурт идэвхжүүлсэн бөгөөд GCC шиг дуудлагын хүснэгтийг тайлах боломжтой.
  • "#pragma clang loop vectorize_width" хэсэгт векторжуулалтын аргыг сонгохын тулд "тогтмол" (анхдагч) болон "хэмжих боломжтой" сонголтыг зааж өгөх боломжийг нэмсэн. Векторын уртаас үл хамааран "хэмжих боломжтой" горим нь туршилтын шинж чанартай бөгөөд өргөтгөх боломжтой векторжуулалтыг дэмждэг техник хангамжид ашиглагдаж болно.
  • Windows платформд зориулсан сайжруулсан дэмжлэг: Clang хөрвүүлэгч, LLD холбогч, хөрвүүлэгч-rt ажиллах цагийн номын сан зэрэг Arm64 систем дээрх Windows-д зориулсан албан ёсны хоёртын ассемблейг бэлтгэсэн. MinGW зорилтот платформд зориулж бүтээхдээ хөндлөн эмхэтгэл хийх үед ч .exe дагавар нэмэгддэг.
  • OpenCL, OpenMP болон CUDA-ийн дэмжлэгтэй холбоотой боломжуудыг өргөжүүлсэн. OpenCL 3.0 болон OpenCL 1.0-ийн макро сонголтуудыг сонгох "-cl-std=CL3.0" ба "-cl-std=CL1.0" сонголтуудыг нэмсэн. Оношлогооны хэрэгслүүдийг өргөжүүлсэн.
  • Зарим x86-д суурилсан процессоруудад хэрэгжсэн HRESET, UINTR болон AVXVNNI заавруудын дэмжлэгийг нэмсэн.
  • X86 систем дээр "-mtune=" сонголтын дэмжлэг идэвхжсэн "-марч=-ийн утгаас үл хамааран сонгосон бичил архитектурын оновчлолыг идэвхжүүлдэг. "
  • Статик анализатор нь зарим POSIX функцүүдийн боловсруулалтыг сайжруулж, харьцуулалтад хэд хэдэн симбол утга байгаа тохиолдолд нөхцөлт үйлдлүүдийн үр дүнг тодорхойлоход мэдэгдэхүйц сайжирсан. Шинэ чекүүд нэмэгдсэн: fuchia.HandleChecker (бүтэц дэх бариулыг тодорхойлдог), webkit.UncountedLambdaCapturesChecker webkit болон alpha.webkit.UncountedLocalVarsChecker (WebKit хөдөлгүүрийн код дахь заагчтай ажиллах онцлогийг харгалзан үздэг).
  • Тогтмол тоонуудын хүрээнд ашигласан илэрхийлэлд __builtin_bitreverse*, __builtin_rotateleft*, __builtin_rotateleft*, _mm_popcnt*, _bit_scan_forward, __bsfd, __bsfq, __reverse_bs, rd_bs,rq_bs, rd_bs, суулгасан функцуудыг ашигладаг __bswapd, __bswap64, зөвшөөрөгдсөн. __bswapq , _castf*, __rol* болон __ror*.
  • Тодорхойлогч, багана болон талбарын тодорхойлолтуудын хоорондох зайг сонгохын тулд clang форматын хэрэгсэлд BitFieldColonSpacing сонголтыг нэмсэн.
  • Линукс платформ дээрх clangd кэш сервер (Clang Server) нь урт хугацааны үйл ажиллагааны явцад санах ойн хэрэглээг мэдэгдэхүйц бууруулсан (үйлдлийн системд сул санах ойн хуудсыг буцаахын тулд malloc_trim руу үе үе залгадаг).

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

  • Python хэл дээр бичигдсэн llvm-build бүтээх хэрэгслийг дэмжихээ больсон бөгөөд үүний оронд төсөл CMake бүтээх системийг ашиглахад бүрэн шилжсэн.
  • AArch64 архитектурын арын хэсэгт Windows платформын дэмжлэг сайжирсан: зорилтот Windows системүүдэд ассемблерийн гаралтыг зөв үүсгэх, тайлах дуудлагын өгөгдлийг үүсгэх оновчтой болсон (ийм өгөгдлийн хэмжээг 60-аар багасгасан). %), ассемблер ашиглан задлах өгөгдөл үүсгэх чадварыг .seh_* удирдамж нэмсэн.
  • PowerPC архитектурын арын хэсэг нь гогцоо болон шугаман байршуулалтын шинэ оновчлол, Power10 процессоруудын өргөтгөсөн дэмжлэг, матрицыг удирдахад зориулсан MMA зааварчилгааны дэмжлэг, AIX үйлдлийн системийн сайжруулсан дэмжлэг зэргийг багтаасан.
  • X86 backend нь AMD Zen 3, Intel Alder Lake, Intel Sapphire Rapids процессоруудад дэмжлэг үзүүлэхээс гадна HRESET, UINTR болон AVXVNNI процессорын зааварчилгааг нэмж өгдөг. Санах ойн хил хязгаарыг дэмжихээ болихын тулд заагчийг шалгах MPX (санах ойн хамгаалалтын өргөтгөлүүд)-ийн дэмжлэг (энэ технологи нь өргөн тархаагүй бөгөөд GCC болон дуугаралтаас аль хэдийн хасагдсан). Ассемблерт {disp32} ба {disp8} угтварууд болон .d32 болон .d8 дагаваруудын дэмжлэгийг нэмсэн бөгөөд операндын офсет болон үсрэлтийн хэмжээг хянах боломжтой. Микроархитектурын оновчлолыг оруулахыг хянахын тулд "tune-cpu" шинэ шинж чанарыг нэмсэн.
  • Зүүн тийш бага зэрэг шилжсэний дараа тэмдэггүй бүхэл тоонуудын халилтыг илрүүлэхийн тулд бүхэл тооны асуудал илрүүлэгч (бүхэл тоо ариутгагч, "-fsanitize=integer") "-fsanitize=unsigned-shift-base" шинэ горимыг нэмсэн.
  • Төрөл бүрийн детекторуудад (asan, cfi, lsan, msan, tsan, ubsan sanitizer) стандарт Musl номын сан бүхий Линукс түгээлтийн дэмжлэгийг нэмсэн.
  • LLD холбогчийн боломжууд өргөжсөн. "--dependency-file", "-error-handling-script", "-lto-pseudo-probe-for-profiling", "-no-lto-whole-program" зэрэг нэмэлт сонголтуудыг багтаасан ELF форматын сайжруулсан дэмжлэг. -үзэгдэх орчин"" MinGW-ийн дэмжлэгийг сайжруулсан. Mach-O форматын (macOS) хувьд arm64, arm, i386 архитектурын дэмжлэг, холбоосын цагийг оновчтой болгох (LTO) болон онцгой тохиолдлуудад зориулсан стекийг задлах үйл ажиллагааг хэрэгжүүлсэн.
  • Libc++ нь C++20 стандартын шинэ боломжуудыг хэрэгжүүлж, C++2b техникийн үзүүлэлтийн онцлогуудыг боловсруулж эхэлсэн. Локалчлалын дэмжлэгийг идэвхгүй болгох (“-DLIBCXX_ENABLE_LOCALIZATION=OFF”) болон псевдо санамсаргүй тоо үүсгэх төхөөрөмжүүд (“-DLIBCXX_ENABLE_RANDOM_DEVICE=OFF”) бүхий барилгад зориулсан дэмжлэг нэмэгдсэн.

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

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