Siideynta LLVM 10.0 compiler suite

Kadib lix bilood oo horumar ah soo bandhigay sii daynta mashruuca LLVM 10.0 - Qalabka ku habboon GCC (compilers, optimizers and code-generators), isku-dubbarididda barnaamijyada koodhka dhexdhexaadka ah ee RISC-la mid ah tilmaamaha farsamada (mashiinka farsamada heerka hooseeya oo leh nidaam kor u qaadis heerar badan ah). Pseudocode-ka la soo saaray waxaa loo rogi karaa iyadoo la isticmaalayo isku-duwaha JIT si toos ah tilmaamaha mashiinka wakhtiga fulinta barnaamijka.

Tilmaamaha cusub ee LLVM 10.0 waxaa ka mid ah taageerada C++ Concepts, ma sii wado Clang nidaam gooni ah, taageerada CFG (ilaaliyaha socodka socodka) ee Windows, iyo taageerada awoodaha CPU cusub.

Horumar gudaha Clang 10.0:

  • Taageero lagu daray"fikradda", kordhinta qaabka C++ kaas oo lagu dari doono heerka xiga, oo sumadeysan C++2a (oo uu shiday calanka -std=c++2a).
    Fikradaha waxay kuu oggolaanayaan inaad qeexdo shuruudaha cabbirka template, kaas oo, marka la ururiyo, xaddido xujooyinka doodaha ee loo aqbali karo cabbirrada template. Fikradaha waxaa loo isticmaali karaa si looga fogaado is-waafajinta macquulka ah ee udhaxeysa sifooyinka noocyada xogta ee lagu dhex isticmaalo template iyo nooca xogta ee xuduudaha gelinta.

    qaab-dhismeedka
    fikradda EqualityComparable = waxay u baahan tahay (T a, T b) {
    {a == b} -> std :: boolean;
    {a != b } -> std:: boolean;
    };

  • Sida caadiga ah, bilaabista hannaan gaar ah ("clang -cc1") kaas oo la isku duba riday waa la joojiyaa. Isku-dubarid hadda waxaa lagu sameeyaa habka ugu muhiimsan, iyo "-fno-integrated-cc1" doorashada waxaa loo isticmaali karaa soo celinta dhaqankii hore.
  • Qaababka ogaanshaha cusub:
    • "-Wc99-naqshadeeye" iyo "-Wreorder-init-list" waxay ka digayaan isticmaalka bilowga C99 ee qaabka C++ xaaladaha ay ku saxan yihiin C99 laakiin aan ku jirin C++20.
    • "-Wsizeof-array-div" - qabta xaaladaha sida "int arr[10]; …sizeof(arr) / sizeof(gaaban)…” (waa in ay ahaataa β€œxajmiga(arr) / sizeof(int)”).
    • "-Wxor-used-as-po" - wuxuu ka digayaa isticmaalka dhismooyinka sida isticmaalka hawl-wadeenka "^" (xor) ee hawlgallada lagu khaldin karo jibbaarada (2^16).
    • "-Wfinal-dtor-non-final-class" - wuxuu ka digayaa fasallada aan lagu calaamadin "final" tilmaame, laakiin leh wax dumiye leh sifada "ugu dambeysa".
    • "-Wtautological-bitwise-compare" waa koox ka mid ah digniinaha si loo ogaado isbarbardhigga tautological ee u dhexeeya qalliinka birta iyo joogtada ah, iyo si loo ogaado isbarbardhigga had iyo jeer- run ah kaas oo qalliinka bitwise OR lagu dabaqo lambar aan xun ahayn.
    • "-Wbitwise-conditional-parentheses" waxay ka digaysaa dhibaatooyinka marka la isku daro hawlwadeenada macquulka ah IYO (&) iyo AMA (|) hawlwadeenka shuruudaysan (?:).
    • "-Wmisleading-indentation" waa analoog ka mid ah jeeg isku magac ah oo ka yimid GCC, kaas oo ka digaya tibaaxaha la jeexjeexay sida haddii ay yihiin qayb ka mid ah xannibaad / haddii kale / muddo / wakhti, laakiin dhab ahaantii kuma jiraan qaybtan. .
    • Marka la tilmaamayo "-Wextra", jeegga "--nuqul-koobi" waa la damci, digniin ku saabsan isticmaalka dhisayaasha
      "dhaqdhaqaaq" iyo "koobi" ee fasallada oo leh qeexitaan cad oo burburin ah.

    • Baaritaannada "-Wtautological-overlap-compare", "-Wsizeof-pointer-div", "-Wtautological-compare", "-Wrange-loop-analysis" ayaa la ballaariyay.
    • Jeegaga "-Wbitwise-op-parentheses" iyo "-Wlogical-op-parentheses" waa la naafo.
  • C iyo C++ koodka, hawlgallada xisaabinta tilmaamayaasha waxaa loo ogol yahay oo keliya in ay isku diyaariyaan. Nadiifiyaha Dabeecadda Aan La qeexin ee qaabka "-fsanitize=pointer-overflow" hadda wuxuu qabtaa kiisas sida ku darista aan eber ahayn ee tilmaame null ah ama abuurista tilmaame null ah marka laga jarayo shaandhada tilmaame aan waxba lahayn.
  • Habka "-fsanitize=is beddelka-is-beddelka" (Nadiifiyaha is-beddelka tooska ah) ayaa loo habeeyey si loo aqoonsado dhibaatooyinka kordhinta iyo dhimista noocyada leh cabbir yar oo ka yar nooca "int".
  • Markaad dooranayso x86 qaab-dhismeedka bartilmaameedka "-march=skylake-avx512", "-march=icelake-client", "-march=icelake-server", "-march=cascadelake" iyo "-march=cooperlake" si toos ah koodhka ayaa joojiyay isticmaalka 512-bit diiwaannada zmm, marka laga reebo tilmaamahooda tooska ah ee koodhka isha. Sababta ayaa ah in inta jeer ee CPU ay hoos u dhacdo marka la qabanayo hawlgallada 512-bit, taas oo si xun u saameyn karta waxqabadka guud. Si loo beddelo hab-dhaqanka cusub, doorashada "-mprefer-vector-width=512" ayaa la bixiyaa.
  • Habdhaqanka calanka "-flax-vector-conversions" wuxuu la mid yahay GCC: beddelka cad ee vector-ka yar ee u dhexeeya isugeynta iyo sabbaynaysa-dhibcaha waa mamnuuc. Si meesha looga saaro xaddidan, waxaa la soo jeediyay in la isticmaalo calanka
    "-flax-vector-conversions=all" taas oo ah meesha ugu horeysa.

  • Taageerada la wanaajiyay ee MIPS CPUs ee qoyska Octeon. Waxaa lagu daray "octeon+" liiska noocyada CPU ee ansax ah.
  • Marka la isu geeyo koodka dhexe ee WebAssembly, wam-optimizer-ga wam-optimizer si toos ah ayaa loo wacaa, haddii laga heli karo nidaamka.
  • Nidaamyada ku saleysan qaab dhismeedka RISC-V, adeegsiga diiwaannada lagu keydiyo qiyamka dhibcaha sabbeynaya waxaa loo oggol yahay xirmooyin shuruudo ah oo isku xirayaasha khadka ah.
  • Lagu daray calamada iskudubaridka cusub: "-fgnuc-version" si loo dejiyo qiimaha nooca "__GNUC__" iyo macros la mid ah; "-fmacro-prefix-map=OLD= CUSUB" si loogu badalo horgalaha tusaha OLD oo cusub oo macros ah sida "__FILE__"; "-fpatchable-function-entry=N[,M]" si loo soo saaro tiro cayiman oo tilmaamo NOP ah ka hor iyo ka dib barta gelitaanka shaqada. Loogu talagalay RISC-V
    taageero lagu daray "-ffixed-xX", "-mcmodel=medany" iyo "-mcmodel=medlow" calanka.

  • Taageerada lagu daray '__ sifada__(( bartilmaameed("laanta-ilaalinta=..."))) sifada, saamaynteedu waxay la mid tahay doorashada -ilaalinta xudunta.
  • Dusha Windows-ka, marka la qeexayo calanka "-cfguard", beddelka hubinta daacadnimada socodka fulinta (Control Flow Guard) ee wicitaanada aan tooska ahayn ayaa la hirgeliyaa. Si aad u joojiso beddelka hubinta, waxaad isticmaali kartaa calanka "-cfguard-nochecks" ama "__declspec(guard(nocf))" beddelka.
  • Habdhaqanka sifada gnu_inline waxay la mid tahay GCC xaaladaha loo isticmaalo iyada oo aan ereyga furaha "dibadeed".
  • Awoodaha la xidhiidha taageerada OpenCL iyo CUDA waa la balaariyay. Taageero lagu daray qaababka cusub ee OpenMP 5.0.
  • Ikhtiyaarka caadiga ah ayaa lagu daray utility-qaab-qabiil, kaas oo kuu ogolaanaya inaad go'aamiso nooca C++ standard ee la isticmaalo marka la falanqeynayo iyo habaynta koodka (Ugu dambeeyay, Auto, c++03, c++11, c++14, c++17, c++20).
  • Jeegag cusub ayaa lagu daray falanqeeyaha joogtada ah: alpha.cplusplus.PlacementNew si loo go'aamiyo haddii ay jirto meel lagu kaydiyo oo ku filan, fuchsia.HandleChecker si loo ogaado qulqulka la xidhiidha fuchsia handers, security.insecureAPI.decodeValueOfObjCType si loo ogaado qulqulka kaydinta iman kara marka la isticmaalayo [NSCoder deVjue :iyo:].
  • Nadiifiyaha Dabeecadda Aan La Shaacin (UBSan) waxa ay balaadhisay jeegaga qulqulka tilmaanta si ay u qabato codsiga aan eber ka ahayn ee tilmaamayaasha NULL ama ka soo baxay ku darida NULL tilmaame.
  • In linter clang-tidy ayaa lagu daray qayb weyn oo jeegag cusub ah.

Main wax cusub LLVM 10.0:

  • Ku socota qaab-dhismeedka Sifeeyaha Hagaajinta hab-socodka cusub iyo falanqeeyayaasha ayaa lagu daray. Xaaladda 19 sifo oo kala duwan ayaa la saadaaliyay, oo ay ku jiraan 12 sifooyin 12 LLVM IR iyo 7 sifooyin aan la taaban karin sida nolol noolaanshaha.
  • Waxaa lagu daray hawlo xisaabeed cusub oo matrix ah oo lagu dhex dhisay isku-duwaha (Intrinsics), kuwaas oo lagu beddelay tilmaamo wax ku ool ah oo vector ah inta lagu jiro ururinta.
  • Horumarin badan ayaa lagu sameeyay dib-u-celinta X86, AArch64, ARM, SystemZ, MIPS, AMDGPU iyo naqshadaha PowerPC. Taageerada CPU ee lagu daray
    Cortex-A65, Cortex-A65AE, Neoverse E1 iyo Neoverse N1. ARMv8.1-M, ​​habka soo saarista koodhka ayaa la hagaajiyay (tusaale ahaan, taageerada loops-yada leh dusha sare ee ugu yar ayaa soo muuqday) iyo taageerada autovectorization ayaa lagu daray iyadoo la adeegsanayo kordhinta MVE. Taageerada CPU MIPS Octeon oo la hagaajiyay. Marka loo eego PowerPC, vectorization of subroutines xisaabta iyadoo la adeegsanayo maktabadda MASSV (Acceleration SubSystem) waa la dajiyay, jiilka kood waa la wanaajiyey, iyo gelitaanka xusuusta ee loops waa la wanaajiyey. x86, maaraynta noocyada vector v2i32, v4i16, v2i16, v8i8, v4i8 iyo v2i8 waa la bedelay.

  • Soo saaraha koodhka oo la hagaajiyay ee WebAssembly Taageerada lagu daray ee TLS (Kaydinta-Thread-Local Storage) iyo tilmaamaha atomi.fence. Taageerada SIMD ayaa si weyn loo ballaariyay. Faylasha shayga WebAssembly hadda waxay awood u leeyihiin inay isticmaalaan saxeexyo hawleed oo qiimo badan leh.
  • Falanqeeyaha waxaa la isticmaalaa marka la farsameynayo wareegyada XusuustaSSA, kaas oo kuu ogolaanaya inaad qeexdo ku tiirsanaanta u dhexeeya hawlaha xusuusta ee kala duwan. MemorySSA waxay yarayn kartaa isku-duwidda iyo wakhtiga fulinta ama waxa la isticmaali karaa beddelka AliasSetTracker iyada oo aan la lumin waxqabadka.
  • Qalabiyaha LLDB ayaa si weyn u hagaajiyay taageerada qaabka DWARF v5. Taageerada la wanaajiyay ee lagu dhisayo MinGW
    oo lagu daray awoodda bilowga ah ee lagu saxayo Windows executables ee dhismayaasha ARM iyo ARM64. Sharaxaadaha lagu daray ikhtiyaaraadka la bixiyo marka si otomaatig ah loo dhammaystirayo gelinta adigoo riixaya tab.

  • Balaaray Awoodaha xiriiriyaha LLD. Taageerada la wanaajiyay ee qaabka ELF, oo ay ku jirto waafaqid buuxda ee qaababka glob ee isku xidhaha GNU, waxa lagu daray taageerada qaybaha debug ee la isku riixay ".zdebug", ku daray hantida PT_GNU_PROPERTY si loo qeexo qaybta .note.gnu.property (waxaa loo isticmaali karaa mustaqbalka Linux kernels),
    Hababka "-z noseparate-code", "-z gooni-code" iyo "-z gooni-loadable-segments" ayaa la hirgeliyay. Taageerada la hagaajiyay ee MinGW iyo WebAssembly

Source: opennet.ru

Add a comment