Liberigo de la kompililo LLVM 12.0

Post ses monatoj da evoluo, la publikigo de la projekto LLVM 12.0 estis prezentita - GCC-kongrua ilaro (kompiloj, optimumigiloj kaj kodgeneratoroj) kiu kompilas programojn en mezan peckodon de RISC-similaj virtualaj instrukcioj (malaltnivela virtuala maŝino kun plurnivela optimumiga sistemo). La generita pseŭdokodo povas esti konvertita uzante JIT-kompililon en maŝininstrukciojn rekte dum programekzekuto.

Plibonigoj en Clang 12.0:

  • Subteno por la "verŝajnaj" kaj "neprobablaj" atributoj proponitaj en la C++20-normo estis efektivigita kaj ebligita defaŭlte, permesante al la optimumiganto esti informita pri la probableco de la kondiĉa konstruaĵo esti ekigita (ekzemple, "[[verŝajne ]] se (hazarda > 0) {“).
  • Aldonita subteno por AMD Zen 3 (-march=znver3), Intel Alder Lake (-march=alderlake) kaj Intel Sapphire Rapids (-march=sapphirerapids) procesoroj.
  • Aldonita subteno por "-march=x86-64-v[234]" flagoj por elekti x86-64 arkitekturnivelojn (v2 - kovras SSE4.2, SSSE3, POPCNT kaj CMPXCHG16B etendaĵojn; v3 - AVX2 kaj MOVBE; v4 - AVX-512 ).
  • Aldonita subteno por Arm Cortex-A78C (kortekso-a78c), Arm Cortex-R82 (kortekso-r82), Arm Neoverse V1 (neoverse-v1), Arm Neoverse N2 (neoverse-n2) kaj Fujitsu A64FX (a64fx) procesoroj. Ekzemple, por ebligi optimumojn por Neoverse-V1-CPUoj, vi povas specifi "-mcpu=neoverse-v1".
  • Por la AArch64-arkitekturo, novaj kompililflagoj "-moutline-atomics" kaj "-mno-outline-atomics" estis aldonitaj por ebligi aŭ malŝalti atomoperaciajn helpajn funkciojn, kiel ekzemple "__aarch64_cas8_relax". Tiaj funkcioj detektas ĉe rultempo ĉu LSE (Large System Extensions) subteno estas havebla kaj utiligas la provizitajn atomprocesorinstrukciojn aŭ falas reen al uzado de LL/SC (Ŝarĝo-ligo/butiko-kondiĉa) instrukcioj por sinkronigado.
  • Aldonita "-fbinutils-version" opcio por elekti la celversion de la binutils-aro por kongruo kun pli malnova ligilo kaj asemblero konduto.
  • Por ELF ruleblaj dosieroj, kiam la flago "-gz" estas specifita, kunpremado de sencimigaj informoj uzante la zlib-bibliotekon estas ebligita defaŭlte (gz=zlib). Ligi la rezultajn objektodosierojn postulas lld aŭ GNU binutils 2.26+. Por restarigi kongruecon kun pli malnovaj versioj de binutils, vi povas specifi "-gz=zlib-gnu".
  • La "ĉi" montrilo nun estas prilaborita kun nenulaj kaj dereferencaj (N) ĉekoj. Por forigi la nenulan atributon, se vi bezonas uzi NULL-valorojn, vi povas uzi la opcion "-fdelete-null-pointer-checks".
  • Sur la Linukso-platformo, la reĝimo "-fasynchronous-unwind-tables" estas ebligita por la arkitekturoj AArch64 kaj PowerPC por generi unwind-voktablojn, kiel en GCC.
  • En "#pragma clang loop vectorize_width" aldonis la kapablon specifi la "fiksajn" (defaŭltajn) kaj "skaleblajn" opciojn por elekti la vektorigmetodon. La "skalebla" reĝimo, sendependa de vektorlongo, estas eksperimenta kaj povas esti uzita sur aparataro kiu apogas skaleblan vektorigon.
  • Plibonigita subteno por la Vindoza platformo: Oficialaj binaraj asembleoj por Vindozo sur Arm64-sistemoj estis preparitaj, inkluzive de la Clang-kompililo, LLD-ligilo kaj kompililo-rt rultempaj bibliotekoj. Konstruante por celplatformoj de MinGW, la sufikso .exe estas aldonita, eĉ dum transkompilado.
  • La kapabloj asociitaj kun subteno por OpenCL, OpenMP kaj CUDA estis vastigitaj. Aldonitaj opcioj "-cl-std=CL3.0" kaj "-cl-std=CL1.0" por elekti makroopciojn por OpenCL 3.0 kaj OpenCL 1.0. Diagnozaj iloj estis pligrandigitaj.
  • Aldonita subteno por la instrukcioj HRESET, UINTR kaj AVXVNNI efektivigitaj en kelkaj x86-bazitaj procesoroj.
  • Sur x86-sistemoj, subteno por la opcio "-mtune=" estas ebligita, ebligante elektitajn mikroarkitekturajn optimumojn sendepende de la valoro "-march=".
  • La statika analizilo plibonigis prilaboradon de iuj POSIX-funkcioj kaj signife plibonigis la determinon de la rezulto de kondiĉaj operacioj kiam estas pluraj simbolaj valoroj en la komparo. Novaj ĉekoj estis aldonitaj: fuchia.HandleChecker (difinas tenilojn en strukturoj), webkit.UncountedLambdaCapturesChecker webkit kaj alpha.webkit.UncountedLocalVarsChecker (konsideras la proprecojn de labori kun montriloj en la motorkodo WebKit).
  • En esprimoj uzataj en la kunteksto de konstantoj, la uzo de enkonstruitaj funkcioj __builtin_bitreverse*, __builtin_rotateleft*, __builtin_rotateright*, _mm_popcnt*, _bit_scan_forward, __bsfd, __bsfq, __bsfq, _bsn,_bs,_bs,__bs,__bs, wap, __bswapd, __bswap64, __ estas permesita bswapq , _castf*, __rol* kaj __ror*.
  • Aldonis opcion BitFieldColonSpacing al la clang-formata ilo por elekti la interspacon ĉirkaŭ identigiloj, kolumnoj kaj kampodifinoj.
  • La clangd-kaŝservilo (Clang Server) sur la Linukso-platformo signife reduktis memorkonsumon dum longdaŭra operacio (periodaj vokoj al malloc_trim estas disponigitaj por resendi senpagajn memorpaĝojn al la operaciumo).

Ŝlosilaj novigoj en LLVM 12.0:

  • Subteno por la llvm-build-konstrua ilo skribita en Python estis nuligita, kaj anstataŭe la projekto tute ŝanĝis al uzado de la CMake-konstrua sistemo.
  • En la backend por la AArch64-arkitekturo, subteno por la Vindoza platformo estis plibonigita: ĝusta generacio de asemblerproduktaĵo por celitaj Vindozaj sistemoj estis certigita, generacio de datumoj pri mallaŭdaj vokoj estis optimumigita (la grandeco de tiaj datumoj reduktiĝis je 60). %), la kapablo krei malvolvi datumojn per asemblero estis aldonita direktivoj .seh_*.
  • La backend por la PowerPC-arkitekturo havas novajn optimumigojn por bukloj kaj enlinia deplojo, vastigita subteno por Power10-procesoroj, aldonis subtenon por MMA-instrukcioj por matrica manipulado, kaj plibonigitan subtenon por la AIX-operaciumo.
  • La backend x86 aldonas subtenon por procesoroj AMD Zen 3, Intel Alder Lake kaj Intel Sapphire Rapids, same kiel instrukciojn pri procesoroj HRESET, UINTR kaj AVXVNNI. Subteno por MPX (Memory Protection Extensions) por kontrolado de montriloj por certigi memorlimojn ne plu estas subtenataj (ĉi tiu teknologio ne estas disvastigita kaj jam estis forigita de GCC kaj klang). Aldonis subtenon al la asemblero por la prefiksoj {disp32} kaj {disp8} kaj la sufiksoj .d32 kaj .d8 por kontroli la grandecon de operandigaj ofsetoj kaj saltoj. Aldonis novan atributon "tune-cpu" por kontroli la inkludon de mikroarkitekturaj optimumoj.
  • Nova reĝimo "-fsanitize=unsigned-shift-base" estis aldonita al la entjerproblemdetektilo (entjera sanitizer, "-fsanitize=integer") por detekti superfluojn de sensignaj entjeroj post iom moviĝo maldekstren.
  • En diversaj detektiloj (asan, cfi, lsan, msan, tsan, ubsan sanitizer) estis aldonita subteno por Linuksaj distribuoj kun la norma Musl-biblioteko.
  • La kapabloj de la LLD-ligilo estis vastigitaj. Plibonigita subteno por la ELF-formato, inkluzive de la aldonitaj opcioj "--dependency-file", "-error-handling-script", "-lto-pseudo-probe-for-profiling", "-no-lto-whole-program -videbleco" " Plibonigita MinGW-subteno. Por la Mach-O-formato (macOS), subteno por arm64, arm, kaj i386-arkitekturoj, ligtempaj optimumigoj (LTO), kaj stakmalvolviĝo por escepttraktado estis efektivigita.
  • Libc++ efektivigas novajn ecojn de la C++20-normo kaj komencis evoluon de ecoj de la C++2b-specifo. Aldonita subteno por konstruado kun malfunkciiga lokaliza subteno ("-DLIBCXX_ENABLE_LOCALIZATION=OFF") kaj aparatoj por generi pseŭdo-hazardajn nombrojn ("-DLIBCXX_ENABLE_RANDOM_DEVICE=OFF").

fonto: opennet.ru

Aldoni komenton