LLVM 9.0 kompilatoru komplekta izlaiŔana

Pēc seÅ”u mēneÅ”u attÄ«stÄ«bas uzrādÄ«ts projekta izlaidums LLVM 9.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ā.

Jaunās LLVM 9.0 funkcijas ietver eksperimentālā dizaina taga noņemÅ”anu no mērÄ·a RISC-V platformas, C++ atbalstu OpenCL, iespēju sadalÄ«t programmu dinamiski ielādētās daļās LLD un ievieÅ”anu.asm goto", ko izmanto Linux kodola kodā. libc++ pievienoja atbalstu WASI (WebAssembly System Interface), un LLD pievienoja sākotnējo atbalstu WebAssembly dinamiskajai saitei.

Uzlabojumi Clang 9.0 versijā:

  • Pievienots GCC specifiskās izteiksmes ievieÅ”anaasm gotoā€œ, kas ļauj pāriet no montētāja iekļautā bloka uz etiÄ·eti C kodā. Å Ä« funkcija ir nepiecieÅ”ama, lai izveidotu Linux kodolu režīmā ā€œCONFIG_JUMP_LABEL=yā€, izmantojot Clang sistēmās ar x86_64 arhitektÅ«ru. Ņemot vērā iepriekŔējos laidienos pievienotās izmaiņas, Linux kodolu tagad var izveidot programmā Clang x86_64 arhitektÅ«rai (iepriekÅ” tika atbalstÄ«ta tikai ēka arm, aarch64, ppc32, ppc64le un mips arhitektÅ«rām). Turklāt Android un ChromeOS projekti jau ir pārveidoti, lai kodola veidoÅ”anai izmantotu Clang, un Google testē Clang kā galveno platformu kodolu veidoÅ”anai savām ražoÅ”anas Linux sistēmām. Nākotnē kodola veidoÅ”anas procesā var izmantot citus LLVM komponentus, tostarp LLD, llvm-objcopy, llvm-ar, llvm-nm un llvm-objdump;
  • Pievienots eksperimentāls atbalsts C++17 lietoÅ”anai OpenCL. ÄŖpaÅ”as funkcijas ietver adreÅ”u telpas atribÅ«tu atbalstu, adreÅ”u telpas konvertÄ“Å”anas bloÄ·Ä“Å”anu, izmantojot tipu apraides operatorus, vektoru tipu nodroÅ”ināŔanu, kā OpenCL for C, Ä«paÅ”u OpenCL tipu klātbÅ«tni attēliem, notikumiem, kanāliem utt.
  • Pievienoti jauni kompilatora karodziņi ā€œ-ftime-traceā€ un ā€œ-ftime-trace-granularity=Nā€, lai Ä£enerētu atskaiti par dažādu priekÅ”gala posmu (parsÄ“Å”ana, inicializācija) un aizmugursistēmas (optimizācijas posmi) izpildes laiku. Pārskats tiek saglabāts json formātā, kas ir saderÄ«gs ar chrome://tracing un speedscope.app;
  • Pievienota specifikatora ā€œ__declspec(allocator)ā€ apstrāde un pavadoŔās atkļūdoÅ”anas informācijas Ä£enerÄ“Å”ana, kas ļauj uzraudzÄ«t atmiņas patēriņu Visual Studio vidē;
  • C valodai ir pievienots atbalsts makro ā€œ__FILE_NAME__ā€, kas atgādina makro ā€œ__FILE__ā€, bet ietver tikai faila nosaukumu bez pilna ceļa;
  • C++ ir paplaÅ”inājis atbalstu adreÅ”u telpas atribÅ«tiem, lai aptvertu dažādas C++ funkcijas, tostarp parametru un argumentu modeļus, atsauces veidus, atgrieÅ”anas veida secinājumus, objektus, automātiski Ä£enerētas funkcijas, iebÅ«vētos operatorus un daudz ko citu.
  • Ir paplaÅ”inātas iespējas, kas saistÄ«tas ar OpenCL, OpenMP un CUDA atbalstu. Tas ietver sākotnējo atbalstu iebÅ«vēto OpenCL funkciju netieÅ”ai iekļauÅ”anai (ir pievienots karodziņŔ ā€œ-fdeclare-opencl-builtinsā€), ir ieviests paplaÅ”inājums cl_arm_integer_dot_product un ir paplaÅ”ināti diagnostikas rÄ«ki;
  • Uzlabots statiskā analizatora darbs un pievienota dokumentācija par statiskās analÄ«zes veikÅ”anu. Pievienoti karodziņi, lai parādÄ«tu pieejamos pārbaudÄ«tāja moduļus un atbalstÄ«tās opcijas (ā€œ-analyzer-checker[-option]-helpā€, ā€œ-analyzer-checker[-option]-help-alphaā€ un ā€œ-analyzer-checker[-option]-help ā€ -izstrādātājsā€). Pievienots karodziņŔ "-analyzer-werror", lai brÄ«dinājumus uzskatÄ«tu par kļūdām.
    Pievienoti jauni verifikācijas režīmi:

    • security.insecureAPI.DeprecatedOrUnsafeBufferHandling, lai identificētu nedroÅ”u praksi darbā ar buferiem;
    • osx.MIGChecker, lai meklētu MIG (Mach Interface Generator) izsaukuma noteikumu pārkāpumus;
    • optin.osx.OSObjectCStyleCast, lai atrastu nepareizas XNU libkern objektu konversijas;
    • apiModeling.llvm ar modelÄ“Å”anas pārbaudes funkciju komplektu, lai atklātu kļūdas LLVM kodu bāzē;
    • Stabilizēts kods neinicializētu C++ objektu pārbaudei (UninitializedObject optin.cplusplus pakotnē);
  • Clang-format utilÄ«ta ir pievienojusi atbalstu koda formatÄ“Å”anai C# valodā un nodroÅ”ina atbalstu koda formatÄ“Å”anas stilam, ko izmanto Microsoft;
  • clang-cl, alternatÄ«vs komandrindas interfeiss, kas nodroÅ”ina opciju lÄ«meņa saderÄ«bu ar cl.exe kompilatoru, kas iekļauts Visual Studio, ir pievienojis heiristiku, lai neesoÅ”us failus uzskatÄ«tu par komandrindas opcijām un parādÄ«tu atbilstoÅ”u brÄ«dinājumu (piemēram, palaižot "clang-cl /diagnostic :caret /c test.cc");
  • Liela daļa jaunu pārbaužu ir pievienota, lai nodroÅ”inātu tÄ«rÄ«bu, tostarp pievienotas pārbaudes, kas raksturÄ«gas OpenMP API;
  • Izvērsts servera iespējas zvana (Clang Server), kurā pēc noklusējuma ir iespējots fona indeksa veidoÅ”anas režīms, ir pievienots atbalsts kontekstuālajām darbÄ«bām ar kodu (mainÄ«go izguve, automātisko un makro definÄ«ciju paplaÅ”ināŔana, atsoļu virkņu konvertÄ“Å”ana uz neatsoļotām), iespēja parādÄ«t brÄ«dinājumi no Clang-tidy, paplaÅ”ināta kļūdu diagnostika galvenes failos un pievienota iespēja parādÄ«t informāciju par tipu hierarhiju;

Galvenais jauninājumiem LLVM 9.0:

  • LLD linkerim ir pievienota eksperimentāla sadalÄ«Å”anas funkcija, kas ļauj sadalÄ«t vienu programmu vairākās daļās, no kurām katra atrodas atseviŔķā ELF failā. Å Ä« funkcija ļauj palaist programmas galveno daļu, kas darbÄ«bas laikā pēc nepiecieÅ”amÄ«bas ielādēs citus komponentus (piemēram, iebÅ«vēto PDF skatÄ«tāju var atdalÄ«t atseviŔķā failā, kas tiks ielādēts tikai tad, kad lietotājs atvērs PDF fails).

    LLD Linker izvirzÄ«ts priekÅ”plānā uz stāvokli, kas piemērots Linux kodola saistÄ«Å”anai arm32_7, arm64, ppc64le un x86_64 arhitektÅ«rām.
    Jaunas opcijas "-" (izvade uz stdout), "-[no-]allow-shlib-undefined", "-undefined-glob", "-nmagic", "-omagic", "-dependent-library", " - z ifunc-noplt" un "-z common-page-size". AArch64 arhitektÅ«rai ir pievienots BTI (zaru mērÄ·a rādÄ«tāja) un PAC (rādÄ«tāja autentifikācijas koda) instrukciju atbalsts. Atbalsts MIPS, RISC-V un PowerPC platformām ir ievērojami uzlabots. Pievienots sākotnējais atbalsts WebAssembly dinamiskajai saistÄ«Å”anai;

  • Programmā libc++ Ä«stenota funkcijas ssize, std::is_constant_evaluated, std::midpoint un std::lerp, std::span ir pievienotas metodes ā€œfrontā€ un ā€œbackā€, ir pievienoti tipu std::is_unbounded_array un std::is_bounded_array atribÅ«ti. , standarta iespējas ir paplaÅ”inātas: :atomic. GCC 4.9 atbalsts ir pārtraukts (var izmantot ar GCC 5.1 un jaunākiem izdevumiem). Pievienots atbalsts BIJU ES (WebAssembly sistēmas interfeiss, interfeiss WebAssembly lietoÅ”anai ārpus pārlÅ«kprogrammas);
  • Ir pievienotas jaunas optimizācijas. Dažās situācijās ir iespējota memcmp zvanu pārvērÅ”ana par bcmp. ÄŖstenota diapazona pārbaudes izlaidums lēciena tabulām, kurās zemākie slēdžu bloki nav sasniedzami vai ja netiek izmantotas instrukcijas, piemēram, izsaucot funkcijas ar tipu void;
  • RISC-V arhitektÅ«ras aizmugure ir stabilizēta, kas vairs netiek pozicionēta kā eksperimentāla un tiek veidota pēc noklusējuma. NodroÅ”ina pilnu koda Ä£enerÄ“Å”anas atbalstu RV32I un RV64I instrukciju kopas variantiem ar MAFDC paplaÅ”inājumiem;
  • Ir veikti daudzi X86, AArch64, ARM, SystemZ, MIPS, AMDGPU un PowerPC arhitektÅ«ru aizmugursistēmas uzlabojumi. Piemēram, arhitektÅ«rai
    AArch64 pievienoja atbalstu SVE2 (Scalable Vector Extension 2) un MTE (Memory Tagging Extensions) instrukcijām; ARM aizmugursistēmā tika pievienots atbalsts Armv8.1-M arhitektÅ«rai un MVE (M-Profile Vector Extension) paplaÅ”inājums. AMDGPU aizmugursistēmai ir pievienots atbalsts GFX10 (Navi) arhitektÅ«rai, pēc noklusējuma ir iespējotas funkciju izsaukÅ”anas iespējas un ir aktivizēta kombinētā caurlaide. DPP (Datu paralēlās primitÄ«vas).

  • LLDB atkļūdotājam tagad ir krāsu izcelÅ”ana atpakaļsekoÅ”anas gadÄ«jumiem un pievienots atbalsts DWARF4 debug_types un DWARF5 debug_info blokiem;
  • Objektu un izpildāmo failu atbalsts COFF formātā ir pievienots utilÄ«tprogrammām llvm-objcopy un llvm-strip.

Avots: opennet.ru

Pievieno komentāru