Ukukhishwa kwe-LLVM 9.0 compiler suite

Ngemva kwezinyanga eziyisithupha zentuthuko kwethulwe ukukhululwa kwephrojekthi LLVM 9.0 - Amathuluzi ahambisana ne-GCC (abahlanganisi, izithuthukisi kanye namakhodi akhiqiza amakhodi), ahlanganisa izinhlelo zibe yi-bitcode emaphakathi yemiyalelo ebonakalayo efana ne-RISC (umshini wezinga eliphansi onohlelo lokusebenzisa amazinga amaningi). I-pseudocode ekhiqiziwe ingaguqulwa kusetshenziswa i-JIT compiler ibe imiyalelo yomshini ngokuqondile ngesikhathi sokwenziwa kohlelo.

Izici ezintsha ze-LLVM 9.0 zifaka ukususwa komaka womklamo wokuhlola kusukela kungxenyekazi eqondiwe ye-RISC-V, usekelo lwe-C++ lwe-OpenCL, ikhono lokuhlukanisa uhlelo lube izingxenye ezilayishwe ngamandla ku-LLD, kanye nokuqaliswa kokuthi “ngiza", esetshenziswe kukhodi ye-Linux kernel. i-libc++ yengeze ukusekelwa kwe-WASI (WebAssembly System Interface), futhi i-LLD yengeze ukusekelwa kokuqala kokuxhumanisa okunamandla kwe-WebAssembly.

Ukuthuthuka ku-Clang 9.0:

  • Kwengeziwe ukuqaliswa kwenkulumo ethize ye-GCC "ngiza", okukuvumela ukuthi usuke ku-assembler inline block uye kulebula enekhodi C. Lesi sici siyadingeka ukuze kwakhiwe i-Linux kernel kumodi ye-“CONFIG_JUMP_LABEL=y” kusetshenziswa i-Clang kumasistimu ane-x86_64 architecture. Uma kucatshangelwa izinguquko ezingezwe ekukhishweni kwangaphambilini, i-Linux kernel manje ingakhiwa e-Clang ye-x86_64 architecture (ngaphambilini eyakhiwe kuphela ingalo, i-aarch64, i-ppc32, i-ppc64le kanye ne-mips architectures yayisekelwe). Ngaphezu kwalokho, amaphrojekthi we-Android ne-ChromeOS asevele aguqulwa ukuze asebenzise i-Clang yokwakha i-kernel, futhi i-Google ihlola i-Clang njengenkundla eyinhloko yokwakha izinhlamvu zezinhlelo zayo ze-Linux zokukhiqiza. Ngokuzayo, ezinye izingxenye ze-LLVM zingasetshenziswa kunqubo yokwakha i-kernel, okuhlanganisa i-LLD, i-llvm-objcopy, i-llvm-ar, i-llvm-nm, ne-llvm-objdump;
  • Kwengezwe usekelo lokuhlola lokusebenzisa i-C++17 ku-OpenCL. Izici ezithile zifaka ukusekelwa kwezibaluli zesikhala samakheli, ukuvimbela ukuguqulwa kwesikhala sekheli ngohlobo lwama-opharetha okusakaza, ukuhlinzekwa kwezinhlobo ze-vector njengaku-OpenCL ye-C, ukuba khona kwezinhlobo ezithile ze-OpenCL zezithombe, imicimbi, iziteshi, njll.
  • Kwengezwe amafulegi amasha weqoqo elithi “-ftime-trace” kanye ne-“-ftime-trace-granularity=N” ukuze kukhiqizwe umbiko ngesikhathi sokwenziwa kwezigaba ezihlukene ze-frontend (ukuhlaziya, ukuqalisa) kanye ne-backend (izigaba zokuthuthukisa). Umbiko ulondolozwe ngefomethi ye-json, ehambisana ne-chrome://tracing kanye ne-speedscope.app;
  • Ukucutshungulwa okungeziwe kwesicacisi se-“__declspec(allocator)” nokukhiqizwa kolwazi lokususa iphutha olukuvumela ukuthi ugade ukusetshenziswa kwememori endaweni ye-Visual Studio;
  • Olimini C, usekelo lwengeziwe lwe-“__FILE_NAME__” macro, efana ne-“__FILE__” macro, kodwa ehlanganisa kuphela igama lefayela ngaphandle kwendlela egcwele;
  • I-C++ iye yandisa ukusekelwa kwezibaluli zesikhala samakheli ukuze ihlanganise izici ezihlukahlukene ze-C++, okuhlanganisa ipharamitha namaphethini wokungqubuzana, izinhlobo zereferensi, inkomba yohlobo lokubuyisela, izinto, imisebenzi ekhiqizwa ngokuzenzekelayo, ama-opharetha akhelwe ngaphakathi, nokuningi.
  • Amakhono ahlobene nokusekelwa kwe-OpenCL, i-OpenMP ne-CUDA anwetshiwe. Lokhu kuhlanganisa ukusekelwa kokuqala kokufakwa okucacile kwemisebenzi ye-OpenCL eyakhelwe ngaphakathi (ifulegi elithi “-fdeclare-opencl-builtins” lengeziwe), isandiso se-cl_arm_integer_dot_product sifakiwe, futhi amathuluzi okuxilonga anwetshiwe;
  • Umsebenzi womhlaziyi omile uthuthukisiwe futhi nemibhalo yokwenza ukuhlaziya okumile yengeziwe. Kwengezwe amafulegi ukuze kuboniswe amamojula okuhlola atholakalayo nezinketho ezisekelwayo (“-i-analyzer-checker[-option]-help”, “-i-analyzer-checker[-option]-help-alpha” kanye “nesihloli-sihloli[-inketho]-usizo "-unjiniyela"). Kwengezwe ifulegi elithi "-analyzer-werror" ukuphatha izexwayiso njengamaphutha.
    Kungezwe izindlela zokuqinisekisa ezintsha:

    • security.insecureAPI.DeprecatedNomaUnsafeBufferHandling ukuhlonza imikhuba engaphephile yokusebenza ngezikhindi;
    • osx.MIGChecker ukucinga ukwephulwa kwemithetho yekholi ye-MIG (Mach Interface Generator);
    • optin.osx.OSObjectCStyleCast ukuthola ukuguqulwa kwento ye-XNU ye-libkern okungalungile;
    • i-apiModeling.llvm enesethi yemisebenzi yokuhlola ukumodela ukuze kutholwe amaphutha ku-codebase ye-LLVM;
    • Ikhodi ezinzile yokuhlola izinto ze-C++ ezingaqaliswanga (UninitializedObject in the optin.cplusplus package);
  • Isisetshenziswa sefomethi ye-clang sengeze ukusekelwa kwekhodi yokufometha ngolimi lwe-C# futhi sinikeza ukusekelwa kwesitayela sokufometha sekhodi esisetshenziswa yi-Microsoft;
  • i-clang-cl, enye i-interface yomugqa womyalo enikeza ukuhambisana kwezinga lokukhetha nomhlanganisi we-cl.exe ofakwe ku-Visual Studio, yengeze i-heuristics ukuphatha amafayela angekho njengezinketho zomugqa womyalo futhi ibonise isixwayiso esihambisanayo (isibonelo, lapho usebenzisa "clang-cl / diagnostic :caret /c test.cc");
  • Ingxenye enkulu yokuhlola okusha yengezwe ku-linter clang-tidy, okuhlanganisa ukuhlola okungeziwe okuqondene ne-OpenMP API;
  • Kunwetshiwe amakhono eseva clangd (Iseva ye-Clang), lapho imodi yokwakha inkomba yangemuva ivulwa ngokuzenzakalelayo, ukusekelwa kwezenzo zomongo ngekhodi kuye kwengeziwe (ukubuyisa okuguquguqukayo, ukunwetshwa kwezincazelo ezizenzakalelayo nezinkulu, ukuguqulwa kwezintambo eziphunyukile zibe ezingaphunyukile), ikhono lokubonisa izixwayiso ezivela ku-Clang-tidy, ukuxilonga okunwetshiwe kwamaphutha kumafayela anhlokweni futhi kwengeza ikhono lokubonisa ulwazi mayelana nohlobo lwesigaba;

main emisha I-LLVM 9.0:

  • Isici sokuhlola sokuhlukanisa sengezwe kusixhumi se-LLD, esikuvumela ukuthi uhlukanise uhlelo olulodwa lube izingxenye ezimbalwa, ngayinye etholakala kufayela elihlukile le-ELF. Lesi sici sikuvumela ukuthi wethule ingxenye eyinhloko yohlelo, ezolayisha ezinye izingxenye njengoba kudingeka ngesikhathi sokusebenza (ngokwesibonelo, ungahlukanisa isibukeli se-PDF esakhelwe ngaphakathi sibe ifayela elihlukile, elizolayisha kuphela lapho umsebenzisi evula i-PDF. ifayela).

    I-LLD Linker alethwe phambili esimeni esifanele ukuxhumanisa i-Linux kernel ye-architectures ye-arm32_7, arm64, ppc64le kanye ne-x86_64.
    Izinketho ezintsha "-" (okuphumayo ku-stdout), "-[no-]vumela-shlib-undefined", "-undefined-glob", "-nmagic", "-omagic", "-dependent-library", " - z ifunc-noplt" kanye ne-"-z common-page-size". Ngokwakheka kwe-AArch64, usekelo lwe-BTI (Isikhombi Esiqondisiwe Segatsha) kanye ne-PAC (Ikhodi Yokuqinisekisa Yesikhombi) yengeziwe. Ukusekelwa kwezinkundla ze-MIPS, RISC-V kanye ne-PowerPC kuthuthukiswe kakhulu. Kwengezwe ukusekelwa kokuqala kokuxhumanisa okunamandla kwe-WebAssembly;

  • Ku-libc++ kwenziwe usayizi wemisebenzi, std::is_constant_evaluated, std::midpoint kanye ne-std::lerp, izindlela “ngaphambili” kanye “nomuva” zengezwe ku-std::span, izici zezinhlobo std::is_unbounded_array futhi std::is_bounded_array yengeziwe , amandla e-std anwetshiwe: :atomic. Ukusekelwa kwe-GCC 4.9 kunqanyuliwe (kungasetshenziswa ne-GCC 5.1 kanye nokukhishwa okusha). Ukwesekwa okwengeziwe WASI (I-WebAssembly System Interface, isixhumi esibonakalayo sokusebenzisa i-WebAssembly ngaphandle kwesiphequluli);
  • Ukulungiselelwa okusha kwengeziwe. Kunikwe amandla ukuguqulwa kwamakholi we-memcmp abe yi-bcmp kwezinye izimo. Ukweqiwa okwenziwe kobubanzi bokuhlola amatafula okugxuma lapho amabhulokhi eswishi aphansi engafinyeleleki noma lapho imiyalelo ingasetshenziswa, isibonelo, lapho ubiza imisebenzi enohlobo olungenalutho;
  • Ingemuva lesakhiwo se-RISC-V sizinzile, esingasabekwa njengesilingo futhi sakhiwe ngokuzenzakalelayo. Inikeza ukwesekwa okugcwele kokukhiqizwa kwekhodi ye-RV32I kanye ne-RV64I yokuhlukahluka kwesethi yemiyalelo enezandiso ze-MAFDC;
  • Kuningi okuthuthukisiwe okwenziwe kuma-backends wezakhiwo ze-X86, AArch64, ARM, SystemZ, MIPS, AMDGPU kanye ne-PowerPC. Isibonelo, ngezokwakha
    I-AArch64 yengeze ukusekelwa kwe-SVE2 (Scalable Vector Extension 2) kanye nemiyalelo ye-MTE (Memory Tagging Extensions); ku-backend ye-ARM, usekelo lwezakhiwo ze-Armv8.1-M kanye nesandiso se-MVE (M-Profile Vector Extension) sengeziwe. Ukusekelwa kwe-architecture ye-GFX10 (Navi) yengezwe ku-backend ye-AMDGPU, amandla okushaya ucingo anikwe amandla ngokuzenzakalelayo, futhi iphasi elihlanganisiwe liyasebenza. I-DPP (Data-Parallel Primitives).

  • Isilungisi sephutha se-LLDB manje sinokugqanyiswa kombala kokulandela ngemuva futhi sengeze usekelo lwezinhlobo ze-DWARF4 debug_types kanye namabhulokhi we-DWARF5 debug_info;
  • Ukusekelwa kwezinto namafayela asebenzisekayo ngefomethi ye-COFF kwengezwe ezintweni ezisetshenziswayo ze-llvm-objcopy kanye ne-llvm-strip.

Source: opennet.ru

Engeza amazwana