Release fan de LLVM 9.0-kompilersuite

Nei seis moannen fan ûntwikkeling presintearre projekt release LLVM 9.0 - GCC-kompatibele ark (kompilators, optimizers en koadegenerators), kompilearjen fan programma's yn intermediate bitcode fan RISC-lykas firtuele ynstruksjes (leech-level firtuele masine mei in multi-level optimisaasjesysteem). De oanmakke pseudokoade kin wurde omboud mei in JIT-kompiler yn masineynstruksjes direkt op it momint fan útfiering fan it programma.

Nije funksjes fan LLVM 9.0 omfetsje it fuortheljen fan it eksperimintele ûntwerptag fan it doel RISC-V-platfoarm, C++-stipe foar OpenCL, de mooglikheid om in programma te splitsen yn dynamysk laden dielen yn LLD, en de ymplemintaasje fan 'e "asm gean", brûkt yn de Linux-kernelkoade. libc ++ tafoege stipe foar WASI (WebAssembly System Interface), en LLD tafoege initial stipe foar WebAssembly dynamyske keppeling.

Ferbetterings yn Clang 9.0:

  • Added ymplemintaasje fan 'e GCC-spesifike útdrukking "asm gean", wêrtroch jo kinne ferpleatse fan in assembler ynline blok nei in label yn C-koade. Dizze funksje is nedich om de Linux-kernel te bouwen yn 'e "CONFIG_JUMP_LABEL=y" modus mei Clang op systemen mei x86_64-arsjitektuer. Mei rekkening mei de wizigingen tafoege yn eardere releases, kin de Linux-kernel no boud wurde yn Clang foar de x86_64-arsjitektuer (earder waard allinich gebou foar de earm, aarch64, ppc32, ppc64le en mips-arsjitektuer stipe). Boppedat binne Android- en ChromeOS-projekten al omboud om Clang te brûken foar kernelbou, en Google testet Clang as it haadplatfoarm foar it bouwen fan kernels foar har produksje Linux-systemen. Yn 'e takomst kinne oare LLVM-komponinten brûkt wurde yn it kearnbouproses, ynklusyf LLD, llvm-objcopy, llvm-ar, llvm-nm en llvm-objdump;
  • Eksperimintele stipe tafoege foar it brûken fan C ++ 17 yn OpenCL. Spesifike funksjes omfetsje stipe foar adresromte-attributen, blokkearjen fan adresromtekonverzje troch type casting-operators, foarsjenning fan fektortypen lykas yn OpenCL foar C, de oanwêzigens fan spesifike OpenCL-typen foar ôfbyldings, eveneminten, kanalen, ensfh.
  • Nije kompilerflaggen "-ftime-trace" en "-ftime-trace-granularity=N" tafoege om in rapport te generearjen oer de útfieringstiid fan ferskate stadia fan 'e frontend (parsearjen, inisjalisaasje) en efterkant (optimisearringstappen). It rapport wurdt bewarre yn json-formaat, kompatibel mei chrome://tracing en speedscope.app;
  • Added ferwurking fan de "__declspec (allocator)" specifier en generaasje fan byhearrende debuggen ynformaasje wêrmei jo te kontrolearjen ûnthâld konsumpsje yn de Visual Studio omjouwing;
  • Foar de C-taal is stipe tafoege foar de makro "__FILE_NAME__", dy't liket op 'e makro "__FILE__", mar befettet allinich de triemnamme sûnder it folsleine paad;
  • C++ hat stipe útwreide foar adresromte-attributen om ferskate C++-funksjes te dekken, ynklusyf parameter- en argumintpatroanen, referinsjetypen, konklúzjes fan weromkomsttype, objekten, auto-genereare funksjes, ynboude operators, en mear.
  • De mooglikheden ferbûn mei stipe foar OpenCL, OpenMP en CUDA binne útwreide. Dit omfettet inisjele stipe foar ymplisite opnimmen fan ynboude OpenCL-funksjes (de flagge "-fdeclare-opencl-builtins" is tafoege), de cl_arm_integer_dot_product-útwreiding is ymplementearre, en diagnostyske ark binne útwreide;
  • It wurk fan 'e statyske analysator is ferbettere en dokumintaasje oer it útfieren fan statyske analyse is tafoege. Flaggen tafoege om beskikbere checker-modules en stipe opsjes te werjaan ("-analyzer-checker[-option]-help", "-analyzer-checker[-option]-help-alpha" en "-analyzer-checker[-option]-help "-ûntwikkelder"). Flagge "-analyzer-werror" tafoege om warskôgingen as flaters te behanneljen.
    Nije ferifikaasjemodi tafoege:

    • security.insecureAPI.DeprecatedOrUnsafeBufferHandling om ûnfeilige praktiken te identifisearjen foar wurkjen mei buffers;
    • osx.MIGChecker om te sykjen nei oertredings fan MIG (Mach Interface Generator) call regels;
    • optin.osx.OSObjectCStyleCast om ferkearde XNU libkern-objektkonverzjes te finen;
    • apiModeling.llvm mei in set fan modellering kontrôle funksjes foar in detect flaters yn de LLVM codebase;
    • Stabilisearre koade foar it kontrolearjen fan uninitialisearre C ++-objekten (UninitializedObject yn it pakket optin.cplusplus);
  • It hulpprogramma clang-formaat hat stipe tafoege foar opmaak fan koade yn 'e C#-taal en biedt stipe foar de koade-opmaakstyl brûkt troch Microsoft;
  • clang-cl, in alternative kommando-rigel-ynterface dy't kompatibiliteit op opsjenivo leveret mei de cl.exe-kompilator opnommen yn Visual Studio, hat heuristyk tafoege om net-besteande bestannen as kommando-rigelopsjes te behanneljen en in oerienkommende warskôging werjaan (bygelyks, by it útfieren fan "clang-cl /diagnostyk:caret /c test.cc");
  • In grut part fan nije kontrôles is tafoege oan linter clang-tidy, ynklusyf tafoege kontrôles spesifyk foar de OpenMP API;
  • Utwreide tsjinner mooglikheden clangd (Clang Server), wêryn de eftergrûnyndeksboumodus standert ynskeakele is, is stipe foar kontekstuele aksjes mei koade tafoege (fariabele opheljen, útwreiding fan auto- en makro-definysjes, konverzje fan ûntsnapte stringen nei net ûntkommen), de mooglikheid om te werjaan warskôgings fan Clang-tidy, útwreide diagnoaze fan flaters yn header triemmen en tafoege de mooglikheid om te werjaan ynformaasje oer de type hierargy;

haad ynnovaasjes LLVM 9.0:

  • In eksperimintele partitioneringsfunksje is tafoege oan de LLD-linker, wêrtroch jo ien programma kinne splitse yn ferskate dielen, elk fan dat is yn in aparte ELF-bestân te finen. Mei dizze funksje kinne jo it haaddiel fan it programma starte, dat oare komponinten as nedich sil laden tidens operaasje (jo kinne bygelyks de ynboude PDF-werjouwer skiede yn in apart bestân, dat allinich sil laden as de brûker de PDF iepenet map).

    LLD Linker nei foaren brocht nei in steat geskikt foar it keppeljen fan de Linux kernel foar arm32_7, arm64, ppc64le en x86_64 arsjitektuer.
    Nije opsjes "-" (útfier nei stdout), "-[no-]allow-shlib-undefined", "-undefined-glob", "-nmagic", "-omagic", "-dependent-library", "- z ifunc-noplt" en "-z mienskiplike sidegrutte". Foar de AArch64-arsjitektuer is stipe foar ynstruksjes foar BTI (Branch Target Indicator) en PAC (Pointer Authentication Code) tafoege. Stipe foar MIPS-, RISC-V- en PowerPC-platfoarms is signifikant ferbettere. Inisjele stipe tafoege foar dynamyske keppeling foar WebAssembly;

  • In libc++ útfierd funksjes ssize, std :: is_constant_evaluated, std :: midpoint en std :: lerp, metoaden "front" en "back" binne tafoege oan std :: span, attributen fan typen std :: is_unbounded_array en std :: is_bounded_array binne tafoege , std mooglikheden binne útwreide: :atomic. Stipe foar GCC 4.9 is stopset (kin brûkt wurde mei GCC 5.1 en nijere releases). Stipe tafoege WASI (WebAssembly System Interface, in ynterface foar it brûken fan WebAssembly bûten de browser);
  • Nije optimalisaasjes binne tafoege. Ynskeakele konverzje fan memcmp-oproppen nei bcmp yn guon situaasjes. Implementearre weglating fan berik kontrôle foar sprong tabellen dêr't legere switch blokken binne net te berikken of as ynstruksjes wurde net brûkt, Bygelyks, by it oproppen fan funksjes mei type void;
  • De efterkant foar de RISC-V-arsjitektuer is stabilisearre, dy't net langer as eksperiminteel gepositioneerd is en standert is boud. Biedt folsleine koade generaasje stipe foar RV32I en RV64I ynstruksje set farianten mei MAFDC útwreidings;
  • Tal fan ferbetteringen binne makke oan backends foar X86, AArch64, ARM, SystemZ, MIPS, AMDGPU en PowerPC-arsjitektuer. Bygelyks foar arsjitektuer
    AArch64 tafoege stipe foar ynstruksjes foar SVE2 (Scalable Vector Extension 2) en MTE (Memory Tagging Extensions); yn 'e ARM-backend waard stipe foar de Armv8.1-M-arsjitektuer en de MVE (M-Profile Vector Extension) tafoeging tafoege. Stipe foar de GFX10 (Navi)-arsjitektuer is tafoege oan 'e AMDGPU-backend, funksje-opropmooglikheden binne standert ynskeakele, en in kombineare pas is aktivearre DPP (Data-parallelle primitiven).

  • De LLDB-debugger hat no kleurmarkearring foar backtraces en tafoege stipe foar de DWARF4 debug_types en DWARF5 debug_info blokken;
  • Stipe foar objekten en útfierbere bestannen yn COFF-formaat is tafoege oan de llvm-objcopy en llvm-strip-helpprogramma's.

Boarne: opennet.ru

Add a comment