LLVM 10.0 konpiladore-multzoaren kaleratzea

Sei hilabeteko garapenaren ostean aurkeztu proiektuaren kaleratzea LLVM 10.0 β€” GCC-rekin bateragarriak diren tresnak (konpilatzaileak, optimizatzaileak eta kode-sortzaileak), programak RISC moduko instrukzio birtualen bitarteko bitkodean konpilatzea (maila baxuko makina birtuala maila anitzeko optimizazio-sistema duena). Sortutako pseudokodea JIT konpiladore bat erabiliz makinen jarraibideetan bihur daiteke zuzenean programa exekutatzen den unean.

LLVM 10.0-ren eginbide berrien artean, C++ kontzeptuak onartzen dira, jada ez du Clang-ek prozesu bereizi gisa exekutatzen, Windows-erako CFG (kontrol-fluxuaren babesa) egiaztapenetarako laguntza eta CPU gaitasun berrietarako laguntza.

Hobekuntzak Clang 10.0-n:

  • Laguntza gehitu da "kontzeptuak", hurrengo estandarrean sartuko den C++ txantiloiaren luzapena, C++2a kode izenarekin (-std=c++2a banderarekin aktibatuta).
    Kontzeptuek txantiloi-parametro-eskakizunen multzo bat definitzeko aukera ematen dute, konpilazio garaian txantiloi-parametro gisa onar daitezkeen argumentuen multzoa mugatzen dutenak. Kontzeptuak txantiloiaren barruan erabiltzen diren datu-moten propietateen eta sarrera-parametroen datu-moten propietateen arteko inkoherentzia logikoak saihesteko erabil daitezke.

    txantiloia
    kontzeptua BerdintasunaKonparagarria = eskatzen du(T a, T b) {
    { a == b } -> std::boolean;
    { a != b } -> std::boolean;
    };

  • Lehenespenez, konpilazioa egiten den prozesu bereizi baten abiarazte ("clang -cc1") gelditzen da. Konpilazioa prozesu nagusian egiten da orain, eta "-fno-integrated-cc1" aukera erabil daiteke portaera zaharra berreskuratzeko.
  • Diagnostiko modu berriak:
    • "-Wc99-designator" eta "-Wreorder-init-list"-ek C99 abiarazleak C++ moduan erabiltzeaz ohartarazten dute C99n zuzenak diren kasuetan baina C++20n ez.
    • "-Wsizeof-array-div" - "int arr[10] bezalako egoerak harrapatzen ditu; …sizeof(arr) / sizeof(short)...” (Β«sizeof(arr)/ sizeof(int)Β» izan behar du).
    • "-Wxor-used-as-po" - "^" (xor) eragilea erabiltzea bezalako eraikuntzak erabiltzeaz ohartarazten du (2^16) esponentziazioarekin nahas daitezkeen eragiketetan.
    • "-Wfinal-dtor-non-final-class" - "final" zehatzailearekin markatuta ez dauden klaseei buruz ohartarazten du, baina "final" atributua duten suntsitzaile bat duten.
    • "-Wtautological-bitwise-compare" abisu-multzo bat da, bitaren araberako eragiketa baten eta konstante baten arteko konparazio tautologikoak diagnostikatzeko, eta beti egiazko konparazioak identifikatzeko, zeinetan bitan OR eragiketa zenbaki ez-negatibo bati aplikatzen zaion.
    • "-Wbitwise-conditional-parentheses"-ek ETA (&) eta OR (|) eragile logikoak baldintzazko eragilearekin (?:) nahasten direnean arazoen berri ematen du.
    • "-Wmisleading-indentation" GCC-ren izen bereko txekearen analogoa da, koska-esamoldeei buruz ohartarazten duena if/else/for/while bloke baten parte izango balira bezala, baina hain zuzen ere ez daude bloke honetan sartzen .
    • "-Wextra" zehaztean, "-Wdeprecated-copy" egiaztapena gaituta dago, eraikitzaileen erabilerari buruz ohartaraziz
      "mugitu" eta "kopiatu" suntsitzaile-definizio esplizitua duten klaseetan.

    • "-Wtautological-overlap-compare", "-Wsizeof-pointer-div", "-Wtautological-compare", "-Wrange-loop-analysis" egiaztapenak zabaldu dira.
    • "-Wbitwise-op-parentheses" eta "-Wlogical-op-parentheses" egiaztapenak desgaituta daude lehenespenez.
  • C eta C++ kodean, erakusleen eragiketa aritmetikoak matrizeetan soilik onartzen dira. "-fsanitize=pointer-overflow" moduan dagoen Definitu gabeko Behavior Sanitizer-ek orain kasuak harrapatzen ditu erakusle nulu bati zero ez den desplazamendu bat gehitzea edo erakusle nulua sortzea erakusle ez nulu bati zenbaki oso bat kentzean.
  • "-fsanitize=implicit-conversion" (Inplicit Conversion Sanitizer) modua "int" motakoak baino bit-tamaina txikiagoa duten moten gehikuntza eta gutxitze eragiketekin arazoak identifikatzeko egokituta dago.
  • "-march=skylake-avx86", "-march=icelake-client", "-march=icelake-server", "-march=cascadelake" eta "-march=cooperlake" bektorializatuan lehenespenez x512 xede-arkitekturak hautatzean. kodeak 512 biteko zmm erregistroak erabiltzeari utzi dio, iturburu-kodean zuzeneko adierazpidea izan ezik. Arrazoia da PUZaren maiztasuna gutxitzen dela 512 biteko eragiketak egitean, eta horrek errendimendu orokorra eragin dezake. Portaera berria aldatzeko, "-mprefer-vector-width=512" aukera eskaintzen da.
  • "-flax-vector-conversions" banderaren portaera GCCren antzekoa da: debekatuta daude zenbaki osoen eta koma mugikorreko bektoreen arteko bit bektorial inplizituen bihurketak. Muga hori kentzeko, bandera erabiltzea proposatzen da
    "-flax-vector-conversions=all" lehenetsia dena.

  • Octeon familiako MIPS CPUetarako laguntza hobetua. "octeon+" gehitu da baliozko CPU moten zerrendara.
  • WebAssembly bitarteko kodean muntatzean, wasm-opt optimizatzailea automatikoki deitzen da, sisteman eskuragarri badago.
  • RISC-V arkitekturan oinarritutako sistemetan, koma mugikorreko balioak gordetzen dituzten erregistroak erabiltzea onartzen da muntatzaileen lerroko txertatzeen baldintza-blokeetan.
  • Konpiladore-marka berriak gehitu dira: "-fgnuc-version" "__GNUC__" eta antzeko makroen bertsioaren balioa ezartzeko; "-fmacro-prefix-map=OLD=NEW" direktorio-aurrizkia ZAHARRArekin ordezkatzeko "__FILE__" bezalako makroetan BERRIA; "-fpatchable-function-entry=N[,M]" funtzioaren sarrera-puntuaren aurretik eta ondoren NOP instrukzio kopuru jakin bat sortzeko. RISC-V-rako
    "-ffixed-xX", "-mcmodel=medany" eta "-mcmodel=medlow" banderen laguntza gehitu du.

  • "__attribute__((target ("branch-protection=..."))) atributuaren euskarria gehitu da, eta horren eragina aukeraren antzekoa da. -branka-babesa.
  • Windows plataforman, "-cfguard" bandera zehaztean, exekuzio-fluxuaren osotasunaren egiaztapenak (Control Flow Guard) zeharkako funtzio-deien ordez ezartzen dira. Txekeen ordezkapena desgaitzeko, "-cfguard-nochecks" bandera edo "__declspec(guard(nocf))" aldatzailea erabil dezakezu.
  • gnu_inline atributuaren portaera GCCren antzekoa da "extern" hitz gakorik gabe erabiltzen den kasuetan.
  • OpenCL eta CUDA euskarriarekin lotutako gaitasunak zabaldu dira. OpenMP 5.0 funtzio berrietarako laguntza gehitu da.
  • Clang-format utilitateari Standard aukera bat gehitu zaio, eta horri esker, kodea analizatzeko eta formateatzeko erabiltzen den C++ estandarraren bertsioa zehazteko (Azkena, Auto, c++03, c++11, c++14, c++17, c++20).
  • Egiaztapen berriak gehitu dira analizatzaile estatikoan: alpha.cplusplus.PlacementNew biltegiratze leku nahikoa dagoen zehazteko, fuchsia.HandleChecker Fuchsia kudeatzaileekin erlazionatutako ihesak detektatzeko, security.insecureAPI.decodeValueOfObjCType [NSCoder decodebValuepeObjCTypeOfObjCTypeOfObjCType erabiltzean balizko buffer gainezkatzea detektatzeko. :at:] .
  • Undefined Behavior Sanitizer-ek (UBSan) bere erakusleen gainezkatze egiaztapenak zabaldu ditu NULL erakusleei nuluak ez diren desplazamenduen aplikazioa edo ondorioz NULL erakusleen desplazamenduaren gehikuntza atzemateko.
  • In linter clang-txukun gehitu txeke berrien zati handi bat.

Nagusia berrikuntzak LLVM 10.0:

  • Esparrura Esleitzailea Prozedura arteko optimizazio eta analizatzaile berriak gehitu dira. 19 atributu ezberdinen egoera aurreikusten da, 12 atributu 12 LLVM IR eta 7 atributu abstraktu barne, hala nola bizitasuna.
  • Konpilagailuan integratutako matrize-funtzio matematiko berriak gehitu dira (Berezkoak), konpilazioan zehar instrukzio bektorial eraginkorrekin ordezkatzen direnak.
  • Hobekuntza ugari egin dira X86, AArch64, ARM, SystemZ, MIPS, AMDGPU eta PowerPC arkitekturaren backendetan. CPU euskarria gehitu da
    Cortex-A65, Cortex-A65AE, Neoverse E1 eta Neoverse N1. ARMv8.1-M-rako, kodea sortzeko prozesua optimizatu da (adibidez, gainkostu gutxieneko begiztetarako laguntza agertu da) eta autobektoretzarako laguntza gehitu da MVE luzapena erabiliz. CPU MIPS Octeon laguntza hobetua. PowerPCrako, MASSV (Mathematical Acceleration SubSystem) liburutegia erabiliz azpierrutinen matematikoen bektorizazioa gaituta dago, kodea sortzea hobetzen da eta begiztetatik memoriarako sarbidea optimizatzen da. x86rako, v2i32, v4i16, v2i16, v8i8, v4i8 eta v2i8 bektore-moten kudeaketa aldatu da.

  • WebAssemblyrako kode-sorgailu hobetua. TLS (Thread-Local Storage) eta atomic.fence argibideetarako euskarria gehitu da. SIMD laguntza nabarmen zabaldu da. WebAssembly objektu-fitxategiek balio anitzeko funtzio sinadurak erabiltzeko gaitasuna dute orain.
  • Analizatzailea begiztak prozesatzeko erabiltzen da MemoriaSSA, memoria-eragiketa ezberdinen arteko menpekotasunak definitzeko aukera ematen duena. MemorySSA konpilazio eta exekuzio denbora murrizten du edo AliasSetTracker-en ordez erabil daiteke errendimendua galdu gabe.
  • LLDB araztaileak DWARF v5 formatuaren euskarria nabarmen hobetu du. MinGW-rekin eraikitzeko laguntza hobetua
    eta ARM eta ARM64 arkitekturarako Windows exekutagarriak arazteko hasierako gaitasuna gehitu zuen. Sarrera automatikoki osatzerakoan eskaintzen diren aukeren deskribapenak gehitu dira fitxa sakatuz.

  • Zabaldua LLD lotura-gaitasunak. ELF formatuaren euskarria hobetu da, besteak beste, glob txantiloien erabateko bateragarritasuna bermatzea GNU estekatzailearekin, ".zdebug" konprimitutako arazketa ataletarako laguntza gehitzea, PT_GNU_PROPERTY propietatea gehituz .note.gnu.property atala definitzeko (etorkizunean erabil daiteke. Linux nukleoak),
    β€œ-z noseparate-code”, β€œ-z separate-code” eta β€œ-z separate-loadable-segments” moduak inplementatu dira. MinGW eta WebAssembly-ren laguntza hobetu da.

Iturria: opennet.ru

Gehitu iruzkin berria