Kutolewa kwa safu ya mkusanyaji ya LLVM 12.0

Baada ya miezi sita ya maendeleo, kutolewa kwa mradi wa LLVM 12.0 kuliwasilishwa - zana ya zana inayoendana na GCC (compilers, viboreshaji na jenereta za msimbo) ambayo inakusanya programu katika bitcode ya kati ya maagizo ya mtandaoni kama RISC (mashine pepe ya kiwango cha chini iliyo na mfumo wa uboreshaji wa ngazi nyingi). Msimbo wa uchapishaji unaozalishwa unaweza kubadilishwa kwa kutumia kikusanyaji cha JIT kuwa maagizo ya mashine moja kwa moja wakati wa utekelezaji wa programu.

Maboresho katika Clang 12.0:

  • Usaidizi wa sifa za "uwezekano" na "isiyowezekana" zilizopendekezwa katika kiwango cha C++20 umetekelezwa na kuwezeshwa kwa chaguo-msingi, kuwezesha kiboreshaji kufahamishwa kuhusu uwezekano wa muundo wa masharti kuanzishwa (kwa mfano, β€œ[[huenda ]] ikiwa (nasibu > 0) {β€œ).
  • Usaidizi ulioongezwa kwa vichakataji vya AMD Zen 3 (-march=znver3), Intel Alder Lake (-march=alderlake) na Intel Sapphire Rapids (-march=sapphirerapids).
  • Umeongeza uwezo wa kutumia bendera za "-march=x86-64-v[234]" ili kuchagua viwango vya usanifu vya x86-64 (v2 - inashughulikia viendelezi vya SSE4.2, SSSE3, POPCNT na CMPXCHG16B; v3 - AVX2 na MOVBE; v4 - AVX-512 ).
  • Usaidizi ulioongezwa kwa vichakataji vya Arm Cortex-A78C (cortex-a78c), Arm Cortex-R82 (cortex-r82), Arm Neoverse V1 (neoverse-v1), Arm Neoverse N2 (neoverse-n2) na Fujitsu A64FX (a64fx). Kwa mfano, ili kuwezesha uboreshaji wa Neoverse-V1 CPU, unaweza kubainisha β€œ-mcpu=neoverse-v1”.
  • Kwa usanifu wa AArch64, bendera mpya za mkusanyaji "-moutline-atomics" na "-mno-outline-atomics" zimeongezwa ili kuwezesha au kuzima vitendaji vya usaidizi wa operesheni ya atomiki, kama vile "__aarch64_cas8_relax". Vitendaji kama hivyo hutambua wakati wa utekelezaji ikiwa usaidizi wa LSE (Viendelezi Kubwa vya Mfumo) unapatikana na utumie maagizo yaliyotolewa ya kichakataji cha atomiki au urudi kutumia maagizo ya LL/SC (Load-link/store-conditional) kwa ulandanishi.
  • Imeongeza chaguo la "-fbinutils-version" ili kuchagua toleo lengwa la binutils suite kwa upatanifu na kiunganishi cha zamani na tabia ya kiunganishi.
  • Kwa faili zinazoweza kutekelezeka za ELF, bendera ya "-gz" inapobainishwa, ukandamizaji wa maelezo ya utatuzi kwa kutumia maktaba ya zlib huwashwa kwa chaguo-msingi (gz=zlib). Kuunganisha faili zinazotokana na kitu kunahitaji lld au GNU binutils 2.26+. Ili kurejesha utangamano na matoleo ya zamani ya binutils, unaweza kubainisha "-gz=zlib-gnu".
  • Kielekezi cha 'hii' sasa kimechakatwa kwa ukaguzi usio na maana na usioweza kurejelewa (N). Ili kuondoa sifa isiyo na maana, ikiwa unahitaji kutumia maadili NULL, unaweza kutumia chaguo la "-fdelete-null-pointer-checks".
  • Kwenye jukwaa la Linux, modi ya "-fasynchronous-unwind-tables" imewashwa kwa usanifu wa AArch64 na PowerPC ili kutoa meza za simu za kupumzika, kama vile katika GCC.
  • Katika "#pragma clang loop vectorize_width" iliongeza uwezo wa kubainisha chaguo "zisizohamishika" (chaguo-msingi) na "zinazoweza" kuchagua mbinu ya uwekaji vekta. Hali ya "scalable", isiyotegemea urefu wa vekta, ni ya majaribio na inaweza kutumika kwenye maunzi ambayo yanaauni uwekaji vekta hatari.
  • Usaidizi ulioboreshwa wa jukwaa la Windows: Mikusanyiko rasmi ya binary kwa Windows kwenye mifumo ya Arm64 imetayarishwa, ikijumuisha mkusanyiko wa Clang, kiunganishi cha LLD na maktaba za wakati wa utekelezaji wa mkusanyaji. Wakati wa kujenga kwa ajili ya majukwaa lengwa ya MinGW, kiambishi tamati cha .exe kinaongezwa, hata wakati wa kujumuisha.
  • Uwezo unaohusishwa na usaidizi wa OpenCL, OpenMP na CUDA umepanuliwa. Chaguo zilizoongezwa "-cl-std=CL3.0" na "-cl-std=CL1.0" ili kuchagua chaguo kubwa za OpenCL 3.0 na OpenCL 1.0. Zana za uchunguzi zimepanuliwa.
  • Usaidizi ulioongezwa kwa maagizo ya HRESET, UINTR, na AVXVNNI yanayotekelezwa katika baadhi ya vichakataji kulingana na x86.
  • Kwenye mifumo ya x86, uwezo wa kutumia chaguo la "-mtune=" umewashwa, na kuwezesha uboreshaji wa usanifu mdogo uliochaguliwa bila kujali thamani ya "-march=".
  • Kichanganuzi tuli kimeboresha usindikaji wa baadhi ya kazi za POSIX na kuboresha kwa kiasi kikubwa uamuzi wa matokeo ya shughuli za masharti wakati kuna maadili kadhaa ya mfano katika kulinganisha. Hundi mpya zimeongezwa: fuchia.HandleChecker (inafafanua vipini katika miundo), webkit.UncountedLambdaCapturesChecker webkit na alpha.webkit.UncountedLocalVarsChecker (inazingatia upekee wa kufanya kazi na viashiria katika msimbo wa injini ya WebKit).
  • Katika misemo inayotumika katika muktadha wa viunga, matumizi ya vitendakazi vilivyojengewa ndani __builtin_bitreverse*, __builtin_rotateleft*, __builtin_rotateright*, _mm_popcnt*, _bit_scan_forward, __bsfd, __bsfq, _bit_scan_bsrverse, _bsrverse_wapd_waps_wapd, __bswap64, __ inaruhusiwa bswapq , _castf*, __rol* na __ror*.
  • Imeongeza chaguo la BitFieldColonSpacing kwa matumizi ya umbizo la clang ili kuchagua nafasi karibu na vitambulishi, safu wima na ufafanuzi wa sehemu.
  • Seva ya caching ya clangd (Clang Server) kwenye jukwaa la Linux imepunguza kwa kiasi kikubwa matumizi ya kumbukumbu wakati wa operesheni ya muda mrefu (simu za mara kwa mara kwa malloc_trim hutolewa ili kurejesha kurasa za kumbukumbu za bure kwenye mfumo wa uendeshaji).

Ubunifu muhimu katika LLVM 12.0:

  • Msaada wa zana ya ujenzi wa llvm iliyoandikwa katika Python imekomeshwa, na badala yake mradi umebadilika kabisa kwa kutumia mfumo wa ujenzi wa CMake.
  • Katika upande wa nyuma wa usanifu wa AArch64, usaidizi wa jukwaa la Windows umeboreshwa: uzalishaji sahihi wa pato la mkusanyiko kwa mifumo inayolengwa ya Windows imehakikishwa, utolewaji wa data kwenye simu za kupumzika umeboreshwa (saizi ya data kama hiyo imepunguzwa na 60. %), uwezo wa kuunda data ya kupumzika kwa kutumia kiunganishi umeongezwa maagizo .seh_*.
  • Sehemu ya nyuma ya usanifu wa PowerPC ina uboreshaji mpya wa vitanzi na uwekaji wa ndani, usaidizi uliopanuliwa kwa vichakataji vya Power10, usaidizi ulioongezwa kwa maagizo ya MMA ya uchakachuaji wa matrix, na usaidizi ulioboreshwa wa mfumo wa uendeshaji wa AIX.
  • Backend ya x86 inaongeza usaidizi kwa vichakataji vya AMD Zen 3, Intel Alder Lake na Intel Sapphire Rapids, pamoja na maagizo ya HRESET, UINTR na AVXVNNI. Usaidizi wa MPX (Viendelezi vya Ulinzi wa Kumbukumbu) kwa kuangalia viashiria ili kuhakikisha kuwa mipaka ya kumbukumbu haitumiki tena (teknolojia hii haijaenea na tayari imeondolewa kwenye GCC na clang). Imeongeza usaidizi kwa kiunganishi cha viambishi awali vya {disp32} na {disp8} na viambishi tamati .d32 na .d8 ili kudhibiti saizi ya miondoko na miruko ya operand. Imeongeza sifa mpya "tune-cpu" ili kudhibiti ujumuishaji wa uboreshaji wa usanifu mdogo.
  • Hali mpya ya "-fsanitize=unsigned-shift-base" imeongezwa kwenye kitambua tatizo kamili (kisafishaji nambari kamili, "-fsanitize=integer") ili kutambua wingi wa nambari kamili ambazo hazijatiwa saini baada ya kuhama kidogo kuelekea kushoto.
  • Katika vigunduzi mbalimbali (asan, cfi, lsan, msan, tsan, ubsan sanitizer) usaidizi wa usambazaji wa Linux na maktaba ya Musl ya kawaida umeongezwa.
  • Uwezo wa kiunganishi cha LLD umepanuliwa. Usaidizi ulioboreshwa wa umbizo la ELF, ikijumuisha chaguo zilizoongezwa β€œ--dependency-file”, β€œ-error-handling-script”, β€œ-lto-pseudo-probe-for-profiling”, β€œ-no-lto-whole-program - kuonekana"" Usaidizi wa MinGW ulioboreshwa. Kwa umbizo la Mach-O (macOS), msaada wa usanifu wa arm64, mkono, na i386, uboreshaji wa wakati wa kiungo (LTO), na uondoaji wa rafu kwa ushughulikiaji wa kipekee umetekelezwa.
  • Libc++ hutumia vipengele vipya vya kiwango cha C++20 na imeanza uundaji wa vipengele vya vipimo vya C++2b. Usaidizi ulioongezwa wa kujenga kwa kuzima usaidizi wa ujanibishaji (β€œ-DLIBCXX_ENABLE_LOCALIZATION=OFF”) na vifaa vya kuzalisha nambari zisizo za kawaida (β€œ-DLIBCXX_ENABLE_RANDOM_DEVICE=OFF”).

Chanzo: opennet.ru

Kuongeza maoni