LLVM 11.0 kompilatoru komplekta izlaiŔana

Pēc seÅ”u mēneÅ”u attÄ«stÄ«bas uzrādÄ«ts projekta izlaidums LLVM 11.0 ā€” ar GCC saderÄ«gi rÄ«ki (kompilatori, optimizētāji un kodu Ä£eneratori), programmu kompilÄ“Å”anai RISC lÄ«dzÄ«gu virtuālo instrukciju starpbitkodā (zema lÄ«meņa virtuālā maŔīna ar daudzlÄ«meņu optimizācijas sistēmu). Ä¢enerēto pseidokodu, izmantojot JIT kompilatoru, var pārvērst maŔīnas instrukcijās tieÅ”i programmas izpildes laikā.

Galvenās izmaiņas jaunajā laidienā bija iekļauÅ”ana Flangs, priekÅ”puse Fortran valodai. Flang atbalsta Fortran 2018, OpenMP 4.5 un OpenACC 3.0, taču projekta izstrāde vēl nav pabeigta un priekÅ”gals aprobežojas ar koda parsÄ“Å”anu un pareizÄ«bas pārbaudi. LLVM starpposma koda Ä£enerÄ“Å”ana vēl netiek atbalstÄ«ta, un, lai Ä£enerētu izpildāmos failus, tiek Ä£enerēts kanoniskais kods un nosÅ«tÄ«ts ārējam Fortran kompilatoram.

Uzlabojumi Clang 11.0 versijā:

  • Pievienota iespēja atjaunot abstrakto sintakses koku (AST) bojātam C++ kodam, ko var izmantot, lai palÄ«dzētu diagnosticēt kļūdas un sniegtu papildu informāciju ārējām utilÄ«tprogrammām, piemēram, clang-tidy un clangd. Funkcija pēc noklusējuma ir iespējota C++ kodam, un to kontrolē, izmantojot opcijas "-Xclang -f[no-]recovery-ast".
  • Pievienoti jauni diagnostikas režīmi:
    • ā€œ-Wpointer-to-int-castā€ ir brÄ«dinājumu grupa par rādÄ«tāju nosÅ«tÄ«Å”anu uz vesela skaitļa tipa int, kurā nav iekļautas visas iespējamās vērtÄ«bas.
    • ā€œ-Wuninitialized-const-referenceā€ ā€” brÄ«dinājums par neinicializētu mainÄ«go nodoÅ”anu funkciju parametros, kas pieņem atsauces argumentus ar atribÅ«tu ā€œconstā€.
    • "-Wimplicit-const-int-float-conversion" ā€” pēc noklusējuma ir iespējots brÄ«dinājums par reālas konstantes netieÅ”u pārveidoÅ”anu par vesela skaitļa tipu.
  • ARM platformai tiek nodroÅ”inātas kompilatorā iebÅ«vētās C funkcijas (BÅ«tiskās Ä«paŔības), aizstāj ar efektÄ«vām vektora instrukcijām Arm v8.1-M MVE un CDE. Pieejamās funkcijas ir definētas galvenes failos arm_mve.h un arm_cde.h.
  • Pievienots paplaÅ”inātu veselu skaitļu tipu kopa _ExtInt(N), kas ļauj izveidot tipus, kas nav divu pakāpju reizinājumi un kurus var efektÄ«vi apstrādāt FPGA/HLS. Piemēram, _ExtInt(7) definē vesela skaitļa tipu, kas sastāv no 7 bitiem.
  • Pievienoti makro, kas nosaka atbalstu iebÅ«vētajām C funkcijām, pamatojoties uz ARM SVE (Scalable Vector Extension) instrukcijām:
    __ARM_FEATURE_SVE, __ARM_FEATURE_SVE_BF16,
    __ARM_FEATURE_SVE_MATMUL_FP32, __ARM_FEATURE_SVE_MATMUL_FP64,
    __ARM_FEATURE_SVE_MATMUL_INT8,
    __ARM_FEATURE_SVE2, __ARM_FEATURE_SVE2_AES,
    __ARM_FEATURE_SVE2_BITPERM,
    __ARM_FEATURE_SVE2_SHA3,
    __ARM_FEATURE_SVE2_SM4. Piemēram, makro __ARM_FEATURE_SVE tiek definēts, ģenerējot AArch64 kodu, iestatot komandrindas opciju "-march=armv8-a+sve".

  • Karogs "-O" tagad tiek identificēts ar optimizācijas režīmu "-O1", nevis "-O2".
  • Pievienoti jauni kompilatora karodziņi:
    • "-fstack-clash-protection" - nodroÅ”ina aizsardzÄ«bu pret kaudzes un kaudzes krustojumi.
    • "-ffp-exception-behavior={ignore,maytrap,strict}" ā€” ļauj atlasÄ«t izņēmumu apstrādātāja režīmu peldoŔā komata skaitļiem.
    • "-ffp-model={precise,strict,fast}" ā€” vienkārÅ”o piekļuvi virknei specializētu iespēju peldoŔā komata skaitļiem.
    • "-fpch-codegen" un "-fpch-debuginfo", lai Ä£enerētu iepriekÅ” kompilētu galveni (PCH) ar atseviŔķiem objekta failiem kodam un atkļūdoÅ”anas informācijai.
    • ā€œ-fsanitize-coverage-allowlistā€ un ā€œ-fsanitize-coverage-blocklistā€, lai pārbaudÄ«tu pārklājuma pārbaudes baltos un melnos sarakstus.
    • ā€œ-mtls-size={12,24,32,48}ā€, lai atlasÄ«tu TLS (pavedienu vietējā krātuve) izmēru.
    • "-menable-experimental-extension", lai iespējotu eksperimentālos RISC-V paplaÅ”inājumus.
  • C noklusējuma režīms ir "-fno-common", kas dažās platformās ļauj efektÄ«vāk piekļūt globālajiem mainÄ«gajiem.
  • Noklusējuma moduļa keÅ”atmiņa ir pārvietota no /tmp uz direktoriju ~/.cache. Lai ignorētu, varat izmantot karogu ā€œ-fmodules-cache-path=ā€.
  • Noklusējuma C valodas standarts ir atjaunināts no gnu11 uz gnu17.
  • Pievienots sākotnējais atbalsts GNU C paplaÅ”inājumam "asm inlineĀ», lai pievienotu montāžas ieliktņus. PaplaÅ”inājums joprojām tiek analizēts, taču tas nekādā veidā netiek apstrādāts.
  • Ar OpenCL un CUDA atbalstu saistÄ«tās iespējas ir paplaÅ”inātas. Pievienots atbalsts OpenCL 2.0 bloku diagnostikai un ieviestas jaunas OpenMP 5.0 funkcijas.
  • Pievienota IndentExternBlock opcija zvana formāta utilÄ«tai izlÄ«dzināŔanai ārējos "C" un ārējos "C++" blokos.
  • Statiskais analizators ir uzlabojis mantoto konstruktoru apstrādi C++ valodā. Pievienotas jaunas pārbaudes alpha.core.C11Lock un alpha.fuchsia.Lock, lai pārbaudÄ«tu slēdzenes, alpha.security.cert.pos.34c, lai noteiktu putenv nedroÅ”u lietoÅ”anu, webkit.NoUncountedMemberChecker un webkit.RefCntblBaseVirtualDtor, lai atklātu problēmas ar neskaitāmiem veidiem, alpha .cplusplus .SmartPtr, lai pārbaudÄ«tu nulles viedā rādÄ«tāja novirzi.
  • Linteres čaukstÄ«gi pievienots liela daļa jaunu čeku.
  • Clangd keÅ”atmiņas serverim (Clang Server) ir uzlabota veiktspēja un pievienotas jaunas diagnostikas iespējas.

Galvenais jauninājumiem LLVM 11.0:

  • BÅ«vsistēma ir pārslēgta uz Python 3 izmantoÅ”anu. Ja Python 3 nav pieejams, ir iespējams atgriezties pie Python 2 izmantoÅ”anas.
  • PriekŔējā daļa ar Go valodas kompilatoru (llgo) ir izslēgta no laidiena, kas nākotnē var tikt pārstrukturēta.
  • AtribÅ«ts Vector-function-abi-variant ir pievienots starpposma attēlojumam (IR), lai aprakstÄ«tu skalāro un vektora funkciju kartÄ“Å”anu, lai vektorizētu zvanus. No llvm::VectorType ir divi atseviŔķi vektoru veidi: llvm::FixedVectorType un llvm::ScalableVectorType.
  • SazaroÅ”ana, pamatojoties uz uef vērtÄ«bām, un undef vērtÄ«bu nodoÅ”ana standarta bibliotēkas funkcijām tiek atzÄ«ta par nedefinētu darbÄ«bu. IN
    memset/memcpy/memmove ļauj nodot undef rādītājus, bet, ja parametrs ar izmēru ir nulle.

  • LLJIT ir pievienojis atbalstu statiskās inicializācijas veikÅ”anai, izmantojot LLJIT::initialize un LLJIT::deinitialize metodes. Ieviesta iespēja pievienot statiskas bibliotēkas JITDylib, izmantojot StaticLibraryDefinitionGenerator klasi. Pievienots C API priekÅ” ORCv2 (API JIT kompilatoru veidoÅ”anai).
  • AArch64 arhitektÅ«ras aizmugursistēmai ir pievienots Cortex-A34, Cortex-A77, Cortex-A78 un Cortex-X1 procesoru atbalsts. Ieviestie ARMv8.2-BF16 (BFloat16) un ARMv8.6-A paplaÅ”inājumi, tostarp RMv8.6-ECV (uzlabotā skaitÄ«tāju virtualizācija), ARMv8.6-FGT (smalki graudains slazdi), ARMv8.6-AMU (aktivitātes monitoru virtualizācija) un ARMv8.0-DGH (datu vākÅ”anas padoms). Tiek nodroÅ”ināta iespēja Ä£enerēt kodu iebÅ«vētajām funkcijām-saistÄ«bām ar SVE vektora instrukcijām.
  • ARM arhitektÅ«ras aizmugursistēmai ir pievienots Cortex-M55, Cortex-A77, Cortex-A78 un Cortex-X1 procesoru atbalsts. PaplaÅ”inājumi ieviesti
    Armv8.6-A Matrix Multiply un RMv8.2-AA32BF16 BFloat16.

  • PowerPC arhitektÅ«ras aizmugursistēmai ir pievienots atbalsts koda Ä£enerÄ“Å”anai POWER10 procesoriem. Cikla optimizācija ir paplaÅ”ināta, un ir uzlabots peldoŔā komata atbalsts.
  • RISC-V arhitektÅ«ras aizmugure ļauj pieņemt ielāpus, kas atbalsta eksperimentālas paplaÅ”inātas instrukciju kopas, kuras vēl nav oficiāli apstiprinātas.
  • AVR arhitektÅ«ras aizmugure ir pārvietota no eksperimentālās kategorijas uz stabilu, kas iekļauta pamata izplatÄ«Å”anā.
  • Aizmugursistēma x86 arhitektÅ«rai atbalsta Intel AMX un TSXLDTRK instrukcijas. Pievienota aizsardzÄ«ba pret uzbrukumiem LVI (Load Value Injection), kā arÄ« ievieÅ” vispārēju spekulatÄ«vās izpildes blakusparādÄ«bu slāpÄ“Å”anas mehānismu, lai bloķētu uzbrukumus, ko izraisa spekulatÄ«va operāciju izpilde CPU.
  • SystemZ arhitektÅ«ras aizmugursistēmai ir pievienots atbalsts MemorySanitizer un LeakSanitizer.
  • Libc++ ir pievienots galvenes faila atbalsts ar matemātiskām konstantēm .
  • Izvērsts LLD saistÄ«Å”anas iespējas. Uzlabots ELF formāta atbalsts, tostarp pievienotās opcijas "--lto-emit-asm", "--lto-whole-program-visibility", "-print-archive-stats", "-shuffle-sections", " -thinlto- viens modulis", "-unikāls", "-rosegments", "-threads=N". Pievienota opcija ā€œ--time-traceā€, lai saglabātu izsekoÅ”anu failā, ko pēc tam var analizēt, izmantojot pārlÅ«kprogrammas Chrome saskarni chrome://tracing.

Avots: opennet.ru

Pievieno komentāru