Útgáfa af LLVM 10.0 þýðandasvítunni

Eftir sex mánaða þróun fram verkefnisútgáfu LLVM 10.0 — GCC-samhæf verkfæri (þýðendur, hagræðingartæki og kóðaframleiðendur), setja saman forrit í millibitakóða af RISC-líkum sýndarleiðbeiningum (lágmarks sýndarvél með fjölþrepa fínstillingarkerfi). Hægt er að breyta gervikóðanum sem myndast með JIT þýðanda í vélaleiðbeiningar beint á þeim tíma sem forritið er keyrt.

Nýir eiginleikar í LLVM 10.0 fela í sér stuðning fyrir C++ hugtök, keyrir ekki lengur Clang sem sérstakt ferli, stuðning við CFG (control flow guard) athuganir fyrir Windows og stuðning við nýja CPU getu.

Endurbætur í Clang 10.0:

  • Bætti við stuðningi við "hugtök", C++ sniðmátsframlenging sem verður innifalin í næsta staðli, kóðann C++2a (kveikt á -std=c++2a fánanum).
    Hugtök gera þér kleift að skilgreina sett af kröfum um sniðmátsfæribreytur sem takmarkar á samsetningartíma safnið af rökum sem hægt er að samþykkja sem sniðmátsfæribreytur. Hægt er að nota hugtökin til að forðast rökrænt ósamræmi milli eiginleika gagnategundanna sem notaðar eru innan sniðmátsins og gagnategundareiginleika inntaksfæribreytanna.

    sniðmát
    hugtak JafnréttiSambærilegt = krefst(T a, T b) {
    { a == b } -> std::boolean;
    { a != b } -> std::boolean;
    };

  • Sjálfgefið er að ræsa sérstakt ferli ("clang -cc1") þar sem samantekt er stöðvuð. Samantekt er nú gerð í aðalferlinu og hægt er að nota "-fno-integrated-cc1" valkostinn til að endurheimta gamla hegðun.
  • Nýir greiningarhamir:
    • "-Wc99-designator" og "-Wreorder-init-list" vara við notkun C99 frumstillinga í C++ ham í þeim tilvikum þar sem þeir eru réttir í C99 en ekki í C++20.
    • "-Wsizeof-array-div" - fangar aðstæður eins og "int arr[10]; …sizeof(arr) / sizeof(stutt)…” (ætti að vera „sizeof(arr) / sizeof(int)“).
    • "-Wxor-used-as-po" - varar við notkun smíða eins og notkun "^" (xor) stjórnanda í aðgerðum sem hægt er að rugla saman við veldisvísitölu (2^16).
    • "-Wfinal-dtor-non-final-class" - varar við flokkum sem eru ekki merktir með "final" forskriftinni, en hafa destructor með "final" eiginleikanum.
    • "-Wtautological-bitwise-compare" er hópur viðvarana til að greina tautological samanburð milli bitwise aðgerð og fasta, og til að auðkenna alltaf sannan samanburð þar sem bitwise OR aðgerð er beitt á óneikvæðri tölu.
    • "-Wbitwise-conditional-parentheses" varar við vandamálum þegar blandað er saman rökrænum aðgerðum AND (&) og OR (|) við skilyrt aðgerð (?:).
    • „-Wmisleading-indentation“ er hliðstæða ávísunarinnar með sama nafni frá GCC, sem varar við inndregnum tjáningum eins og þær séu hluti af if/else/for/while blokk, en í raun eru þær ekki innifaldar í þessum reit .
    • Þegar „-Wextra“ er tilgreint, er „-Wdeprecated-copy“ athugunin virkjuð, sem varar við notkun smiða
      „hreyfa“ og „afrita“ í flokkum með skýrri eyðingarskilgreiningu.

    • "-Wtautological-overlap-compare", "-Wsizeof-pointer-div", "-Wtautological-compare", "-Wrange-loop-analysis" hefur verið stækkað.
    • "-Wbitwise-op-svigi" og "-Wlogical-op-svigi" ávísanir eru sjálfgefið óvirkar.
  • Í C og C++ kóða eru bendireikningar aðeins leyfðar í fylkjum. Óskilgreint atferlishreinsiefni í "-fsanitize=bendi-flæði" ham grípur nú tilfelli eins og að bæta við núlljöfnun við núllbendil eða búa til núllbendil þegar heiltala er dregin frá bendi sem ekki er núll.
  • „-fsanitize=implicit-conversion“ (Implicit Conversion Sanitizer) hamurinn er aðlagaður til að bera kennsl á vandamál með aukningu og lækkandi aðgerðir fyrir gerðir með bitastærð minni en „int“ gerð.
  • Þegar þú velur x86 markarkitektúra "-march=skylake-avx512", "-march=icelake-client", "-march=icelake-server", "-march=cascadelake" og "-march=cooperlake" sjálfgefið í vectorized The kóði er hætt að nota 512-bita zmm skrár, nema fyrir beina vísbendingu þeirra í frumkóðann. Ástæðan er sú að CPU-tíðnin minnkar þegar 512-bita aðgerðir eru framkvæmdar, sem getur haft neikvæð áhrif á heildarafköst. Til að breyta nýju hegðuninni er valmöguleikinn "-mprefer-vector-width=512" gefinn upp.
  • Hegðun „-flax-vector-conversions“ fánans er svipuð og GCC: óbein vigurbitabreyting á milli heiltölu- og fljótamarksvektora er bönnuð. Til að afnema þessa takmörkun er lagt til að nota fánann
    "-flax-vector-conversions=all" sem er sjálfgefið.

  • Bættur stuðningur við MIPS örgjörva af Octeon fjölskyldunni. Bætti „octeon+“ við listann yfir gildar CPU-gerðir.
  • Þegar verið er að setja saman í WebAssembly millikóða er wasm-opt fínstillingu sjálfkrafa kallaður til, ef hann er til í kerfinu.
  • Fyrir kerfi sem byggjast á RISC-V arkitektúr er notkun skráa sem geyma fljótandi punktagildi leyfð í skilyrtum blokkum samsetningarinnsetningar.
  • Bætti við nýjum þýðandaflöggum: "-fgnuc-version" til að stilla útgáfugildi fyrir "__GNUC__" og svipuð fjölva; "-fmacro-prefix-map=OLD=NEW" til að skipta út möppuforskeytinu GAMLT fyrir NEW í fjölvi eins og "__FILE__"; "-fpatchable-function-entry=N[,M]" til að búa til ákveðinn fjölda NOP leiðbeininga fyrir og eftir aðgerðainngangsstað. Fyrir RISC-V
    bætti við stuðningi við "-ffixed-xX", "-mcmodel=medany" og "-mcmodel=medlow" fánana.

  • Bætti við stuðningi við '__attribute__((target(“branch-protection=..."))) eigindina, áhrifin sem eru svipuð og valkosturinn -útibúa-vernd.
  • Á Windows pallinum, þegar „-cfguard“ fáninn er tilgreindur, er útfærsla á framkvæmdarflæðisheilleikaathugunum (Control Flow Guard) fyrir óbein aðgerðarköll í staðinn. Til að slökkva á tékkaskipti geturðu notað „-cfguard-nochecks“ fánann eða „__declspec(guard(nocf))“ breytileikarann.
  • Hegðun gnu_inline eigindarinnar er svipuð og GCC í þeim tilvikum þar sem hún er notuð án „extern“ lykilorðsins.
  • Möguleikarnir sem tengjast OpenCL og CUDA stuðningi hafa verið auknir. Bætti við stuðningi við nýja OpenMP 5.0 eiginleika.
  • Stöðluðum valkosti hefur verið bætt við clang-format tólið, sem gerir þér kleift að ákvarða útgáfu C++ staðalsins sem notaður er við þáttun og snið kóða (Nýjasta, Auto, c++03, c++11, c++14, c++17, c++20).
  • Nýjar athuganir hafa verið bættar við kyrrstöðugreiningartækið: alpha.cplusplus.PlacementNew til að ákvarða hvort það sé nægilegt geymslupláss, fuchsia.HandleChecker til að greina leka sem tengjast Fuchsia meðhöndlum, security.insecureAPI.decodeValueOfObjCType til að greina hugsanlega biðminni yfirflæði þegar [NSCoder decodeValueOfObjCTypeOf er notað :hjá:] .
  • The Undefined Behavior Sanitizer (UBSan) hefur stækkað yfirflæðiskoðanir á bendilinn til að ná beitingu frávika sem eru ekki núll á NULL-bendingar eða bætt við NULL-bendisjöfnun.
  • Í linter clang-snyrtilegur bætt við stór hluti nýrra ávísana.

Helstu nýjungar LLVM 10.0:

  • Að rammanum Eigandi Nýjum hagræðingum og greiningartækjum hefur verið bætt við. Spáð er ástandi 19 mismunandi eiginleika, þar á meðal 12 eiginleikum 12 LLVM IR og 7 óhlutbundnum eiginleikum eins og lífleika.
  • Bætti við nýjum fylkisstærðfræðilegum aðgerðum innbyggðum í þýðanda (Eiginleikar), sem skipt er út fyrir skilvirkar vektorleiðbeiningar við söfnun.
  • Fjölmargar endurbætur hafa verið gerðar á bakenda fyrir X86, AArch64, ARM, SystemZ, MIPS, AMDGPU og PowerPC arkitektúr. Bætt við CPU stuðningi
    Cortex-A65, Cortex-A65AE, Neoverse E1 og Neoverse N1. Fyrir ARMv8.1-M hefur kóðamyndunarferlið verið fínstillt (til dæmis hefur komið fram stuðningur við lykkjur með lágmarks kostnaður) og stuðningi við sjálfvirka vökvun hefur verið bætt við með MVE viðbótinni. Bættur CPU MIPS Octeon stuðningur. Fyrir PowerPC er vektorun stærðfræðilegra undiráætlana með því að nota MASSV (Mathematical Acceleration SubSystem) bókasafnið virkt, kóðagerð er bætt og minnisaðgangur frá lykkjum er fínstilltur. Fyrir x86 hefur meðhöndlun vigurgerða v2i32, v4i16, v2i16, v8i8, v4i8 og v2i8 verið breytt.

  • Bættur kóðarafall fyrir WebAssembly. Bætt við stuðningi við TLS (Thread-Local Storage) og atomic.fence leiðbeiningar. SIMD stuðningur hefur verið aukinn verulega. WebAssembly hlutaskrár hafa nú getu til að nota marggildar aðgerðaundirskriftir.
  • Greiningartækið er notað við vinnslu lykkja MinniSSA, sem gerir þér kleift að skilgreina ósjálfstæði milli mismunandi minnisaðgerða. MemorySSA getur dregið úr samantekt og framkvæmdartíma eða hægt að nota í staðinn fyrir AliasSetTracker án þess að missa afköst.
  • LLDB kembiforritið hefur verulega bætt stuðning við DWARF v5 sniðið. Bættur stuðningur við byggingu með MinGW
    og bætti við upphaflegri getu til að kemba Windows executables fyrir ARM og ARM64 arkitektúr. Bætti við lýsingum á valkostunum sem boðið er upp á þegar inntak er sjálfvirkt útfyllt með því að ýta á flipann.

  • Útvíkkað LLD tengimöguleikar. Bættur stuðningur við ELF sniðið, þar á meðal að tryggja fullan samhæfni glob sniðmáta við GNU tengilinn, bæta við stuðningi við þjappaða villuleitarhluta „.zdebug“, bæta við PT_GNU_PROPERTY eiginleikanum til að skilgreina .note.gnu.property hlutann (hægt að nota í framtíðinni) Linux kjarna),
    Stillingarnar „-z noseparate-code“, „-z separate-code“ og „-z separate-loadable-segments“ hafa verið innleiddar. Bættur stuðningur við MinGW og WebAssembly.

Heimild: opennet.ru

Bæta við athugasemd