Liberasyon LLVM 10.0 konpilatè suite a

Apre sis mwa nan devlopman prezante lage pwojè LLVM NAN — Zouti GCC-konpatib (konpilateur, optimiseur ak dèlko kòd), konpile pwogram nan bitkod entèmedyè nan enstriksyon vityèl tankou RISC (machin vityèl ba-nivo ak yon sistèm optimize milti-nivo). Pseudokod pwodwi a ka konvèti lè l sèvi avèk yon du JIT nan enstriksyon machin dirèkteman nan moman ekzekisyon pwogram lan.

Nouvo karakteristik nan LLVM 10.0 gen ladan sipò pou C++ konsèp, pa kouri Clang kòm yon pwosesis separe ankò, sipò pou CFG (kontwòl koule gad) chèk pou Windows, ak sipò pou nouvo kapasite CPU.

Amelyorasyon nan Clang 10.0:

  • Te ajoute sipò pou "konsèp la", yon ekstansyon modèl C++ ki pral enkli nan pwochen estanda a, ki gen non kod C++2a (aktive pa drapo a -std=c++2a).
    Konsèp pèmèt ou defini yon seri kondisyon paramèt modèl ki, nan moman konpile, limite seri agiman yo ka aksepte kòm paramèt modèl. Konsèp yo ka itilize pou evite enkonsistans lojik ant pwopriyete kalite done yo itilize nan modèl la ak pwopriyete kalite done paramèt D 'yo.

    modèl
    konsèp EqualityComparable = mande (T a, T b) {
    { a == b } -> std::boolean;
    { a != b } -> std::boolean;
    };

  • Pa default, lansman yon pwosesis separe ("clang -cc1") kote konpilasyon fèt yo sispann. Konpilasyon se kounye a fè nan pwosesis prensipal la, epi yo ka itilize opsyon "-fno-integrated-cc1" pou retabli ansyen konpòtman an.
  • Nouvo mòd dyagnostik:
    • "-Wc99-designator" ak "-Wreorder-init-list" avèti kont itilize C99 initializers nan mòd C++ nan ka kote yo kòrèk nan C99 men pa nan C++20.
    • "-Wsizeof-array-div" - kaptire sitiyasyon tankou "int arr[10]; …sizeof(arr) / sizeof(short)…” (ta dwe “sizeof(arr) / sizeof(int)”).
    • "-Wxor-used-as-po" - avèti kont itilizasyon konstriksyon tankou itilizasyon operatè "^" (xor) nan operasyon ki ka konfonn ak eksponantisyon (2^16).
    • "-Wfinal-dtor-non-final-class" - avèti sou klas ki pa make ak spécificateur "final" la, men ki gen yon destriksyon ak atribi "final" la.
    • "-Wtautological-bitwise-compare" se yon gwoup avètisman pou fè dyagnostik konparezon tautolojik ant yon operasyon bit ak yon konstan, ak pou idantifye konparezon ki toujou vre nan ki operasyon an bitwise OSWA aplike nan yon nimewo ki pa negatif.
    • "-Wbitwise-conditional-parentheses" avèti sou pwoblèm lè melanje operatè lojik AK (&) ak OSWA (|) ak operatè kondisyonèl (?:).
    • "-Wmisleading-indentation" se yon analogue chèk la ki gen menm non ki soti nan GCC, ki avèti sou ekspresyon endentasyon kòm si yo fè pati yon blòk if/else/for/while, men an reyalite yo pa enkli nan blòk sa a. .
    • Lè w espesifye "-Wextra", chèk la "-Wdeprecated-copy" aktive, avètisman sou itilizasyon konstrukteur yo.
      "deplase" ak "kopi" nan klas ki gen yon definisyon eksplisit destriksyon.

    • Chèk "-Wtautological-overlap-compare", "-Wsizeof-pointer-div", "-Wtautological-compare", "-Wrange-loop-analysis" yo te elaji.
    • Chèk "-Wbitwise-op-parentheses" ak "-Wlogical-op-parentheses" yo enfim pa default.
  • Nan kòd C ak C++, operasyon aritmetik pointeur yo pèmèt sèlman nan etalaj. Dezenfektan Konpòtman Undefined la nan mòd "-fsanitize=pointer-overflow" kounye a kaptire ka tankou ajoute yon konpanse ki pa zewo nan yon pointeur nil oswa kreye yon pointeur nil lè w ap soustraksyon yon nonb antye relatif nan yon pointeur ki pa nil.
  • Mòd "-fsanitize=implicit-conversion" (Dezenfektan Konvèsyon Enplisite) adapte pou idantifye pwoblèm ak operasyon ogmantasyon ak diminye pou kalite ki gen yon ti gwosè ki pi piti pase sa ki nan kalite "int".
  • Lè w ap chwazi achitekti sib x86 "-march=skylake-avx512", "-march=icelake-client", "-march=icelake-server", "-march=cascadelake" ak "-march=cooperlake" pa default nan vektorize a. kòd te sispann itilize rejis zmm 512-bit, eksepte pou endikasyon dirèk yo nan kòd sous la. Rezon ki fè la se ke frekans CPU a diminye lè w ap fè operasyon 512-bit, sa ki ka afekte pèfòmans jeneral. Pou chanje nouvo konpòtman an, yo bay opsyon "-mprefer-vector-width=512".
  • Konpòtman drapo "-flax-vector-conversions" la sanble ak GCC: konvèsyon ti vektè implicite ant vektè nonb antye ak pwen flotan yo entèdi. Pou elimine limit sa a, li pwopoze pou itilize drapo a
    "-flax-vector-conversions = tout" ki se default la.

  • Amelyore sipò pou CPU MIPS nan fanmi Octeon. Te ajoute "octeon+" nan lis kalite CPU ki valab.
  • Lè rasanble nan kòd entèmedyè WebAssembly, yo otomatikman rele wasm-opt optimiseur a, si sa disponib nan sistèm lan.
  • Pou sistèm ki baze sou achitekti RISC-V, itilizasyon rejis ki estoke valè pwen k ap flote pèmèt yo nan blòk kondisyonèl nan foure asanblaj inline.
  • Te ajoute nouvo drapo konpilatè: "-fgnuc-version" pou mete valè vèsyon an pou "__GNUC__" ak makro menm jan an; "-fmacro-prefix-map=OLD=NEW" pou ranplase prefiks anyè OLD ak NEW nan makro tankou "__FILE__"; "-fpatchable-function-entry=N[,M]" pou jenere yon sèten kantite enstriksyon NOP anvan ak apre pwen antre fonksyon an. Pou RISC-V
    te ajoute sipò pou drapo "-ffixed-xX", "-mcmodel=medany" ak "-mcmodel=medlow".

  • Te ajoute sipò pou atribi '__attribute__((sib ("branch-protection=..."))) atribi, efè ki sanble ak opsyon an. -branch-pwoteksyon.
  • Sou platfòm Windows la, lè w ap espesifye drapo "-cfguard", sibstitisyon nan chèk entegrite koule egzekisyon (Kontwòl Flow Gad) pou apèl fonksyon endirèk yo aplike. Pou enfim sibstitisyon chèk la, ou ka itilize drapo "-cfguard-nochecks" oswa "__declspec(guard(nocf))" modifye.
  • Konpòtman atribi gnu_inline a sanble ak GCC nan ka kote yo itilize li san mo kle "extern".
  • Kapasite ki asosye ak sipò OpenCL ak CUDA yo te elaji. Te ajoute sipò pou nouvo karakteristik OpenMP 5.0.
  • Yo te ajoute yon opsyon Creole nan sèvis piblik la clang-format, ki pèmèt ou detèmine vèsyon an nan estanda C++ yo itilize lè analiz ak fòma kòd (Dènye, Auto, c++03, c++11, c++14, c++17, c++20).
  • Nouvo chèk yo te ajoute nan analizè estatik la: alpha.cplusplus.PlacementNew pou detèmine si gen ase espas depo, fuchsia.HandleChecker pou detekte fwit ki gen rapò ak moun kap okipe Fuchsia, security.insecureAPI.decodeValueOfObjCType pou detekte potansyèl tanpon debòde lè w ap itilize [NSCoder decodebValueypeOf. :nan:] .
  • Undefined Behavior Sanitizer (UBSan) te elaji chèk debòde pwentè li yo pou kenbe aplikasyon an nan konpanse ki pa zewo nan endikasyon NULL oswa adisyon a ki kapab lakòz yon konpanse pwent NULL.
  • Nan linter clang-tidy te ajoute yon gwo pòsyon nan nouvo chèk yo.

Prensipal la inovasyon LLVM 10.0:

  • Pou fondasyon an Atribitè Nouvo optimize entèprosedi ak analizeur yo te ajoute. Yo prevwa eta a nan 19 atribi diferan, ki gen ladan 12 atribi 12 LLVM IR ak 7 atribi abstrè tankou liveness.
  • Te ajoute nouvo fonksyon matematik matris ki te bati nan du a (Intrinsèques), ki ranplase pa enstriksyon vektè efikas pandan konpilasyon.
  • Yo te fè anpil amelyorasyon nan backend pou achitekti X86, AArch64, ARM, SystemZ, MIPS, AMDGPU ak PowerPC. Te ajoute sipò CPU
    Cortex-A65, Cortex-A65AE, Neoverse E1 ak Neoverse N1. Pou ARMv8.1-M, ​​yo te optimize pwosesis jenerasyon kòd (pa egzanp, sipò pou bouk ki gen minimòm sou tèt yo te parèt) epi yo te ajoute sipò pou autovectorization lè l sèvi avèk ekstansyon MVE. Amelyore CPU MIPS Octeon sipò. Pou PowerPC, vektorizasyon sousroutin matematik lè l sèvi avèk bibliyotèk MASSV (Mathematical Acceleration SubSystem) pèmèt, jenerasyon kòd amelyore, ak aksè memwa nan bouk yo optimize. Pou x86, manyen kalite vektè v2i32, v4i16, v2i16, v8i8, v4i8 ak v2i8 te chanje.

  • Amelyore dèlko kòd pou WebAssembly. Te ajoute sipò pou TLS (Thread-Local Storage) ak enstriksyon atomic.fence. Sipò SIMD te elaji anpil. Fichye objè WebAssembly kounye a gen kapasite pou itilize siyati fonksyon milti-valè.
  • Yo itilize analizeur a lè w ap trete bouk MemorySSA, ki pèmèt ou defini depandans ant operasyon memwa diferan. MemorySSA ka diminye tan konpilasyon ak ekzekisyon oswa yo ka itilize olye pou yo AliasSetTracker san pèt pèfòmans.
  • Debugger LLDB a amelyore anpil sipò pou fòma DWARF v5. Amelyore sipò pou bati ak MinGW
    epi li te ajoute premye kapasite pou debogaj ègzèkutabl Windows pou achitekti ARM ak ARM64. Te ajoute deskripsyon opsyon yo ofri lè otokonplete opinyon pa peze tab.

  • Elaji Kapasite LLD Linker. Amelyore sipò pou fòma ELF a, ki gen ladan asire konpatibilite konplè modèl glob ak GNU Linker la, ajoute sipò pou seksyon debug konprese ".zdebug", ajoute pwopriyete PT_GNU_PROPERTY pou defini seksyon .note.gnu.property (ka itilize alavni). nwayo Linux),
    Mòd "-z noseparate-code", "-z separe-code" ak "-z separe-loadable-segments" yo te aplike. Amelyore sipò pou MinGW ak WebAssembly.

Sous: opennet.ru

Add nouvo kòmantè