Rhyddhau'r gyfres casglu LLVM 10.0

Ar ôl chwe mis o ddatblygiad wedi'i gyflwyno rhyddhau prosiect LLVM 10.0 - Offer sy'n gydnaws â GCC (cyfunwyr, optimizers a generaduron cod), llunio rhaglenni i god did canolradd o gyfarwyddiadau rhithwir tebyg i RISC (peiriant rhithwir lefel isel gyda system optimeiddio aml-lefel). Gellir trosi'r ffuggod a gynhyrchir gan ddefnyddio casglwr JIT yn gyfarwyddiadau peiriant yn uniongyrchol ar adeg gweithredu'r rhaglen.

Mae nodweddion newydd yn LLVM 10.0 yn cynnwys cefnogaeth ar gyfer C ++ Concepts, nid yw bellach yn rhedeg Clang fel proses ar wahân, cefnogaeth ar gyfer gwiriadau CFG (gwarchod llif rheoli) ar gyfer Windows, a chefnogaeth ar gyfer galluoedd CPU newydd.

Gwelliannau yn Clang 10.0:

  • Ychwanegwyd cefnogaeth ar gyfer "cysyniadau", estyniad templed C++ a fydd yn cael ei gynnwys yn y safon nesaf, gyda'r enw cod C++2a (wedi'i droi ymlaen gan y faner -std=c++2a).
    Mae cysyniadau'n caniatáu ichi ddiffinio set o ofynion paramedr templed sydd, ar amser llunio, yn cyfyngu ar y set o ddadleuon y gellir eu derbyn fel paramedrau templed. Gellir defnyddio'r cysyniadau i osgoi anghysondebau rhesymegol rhwng priodweddau'r mathau o ddata a ddefnyddir yn y templed a phriodweddau math data'r paramedrau mewnbwn.

    templed
    cysyniad CydraddoldebComparable = gofyn(T a, T b) {
    { a == b } -> std::boolean;
    { a != b } -> std::boolean;
    };

  • Yn ddiofyn, rhoddir y gorau i lansio proses ar wahân (“clang -cc1”) lle caiff y gwaith ei lunio. Mae'r gwaith llunio bellach yn cael ei wneud yn y brif broses, a gellir defnyddio'r opsiwn "-fno-integrated-cc1" i adfer yr hen ymddygiad.
  • Dulliau diagnostig newydd:
    • Mae "-Wc99-designator" a "-Wreorder-init-list" yn rhybuddio yn erbyn defnyddio cychwynwyr C99 yn y modd C++ mewn achosion lle maent yn gywir yn C99 ond nid yn C++20.
    • "-Wsizeof-array-div" - dal sefyllfaoedd fel "int arr[10]; …maint(arr) / sizeof(byr)…” (dylai fod yn “sizeof(arr) / sizeof(int)”).
    • Mae "-Wxor-used-as-po" - yn rhybuddio yn erbyn defnyddio lluniadau megis y defnydd o weithredwr "^" (xor) mewn gweithrediadau y gellir eu cymysgu ag esboniad (2^16).
    • Mae "-Wfinal-dtor-non-final-class" - yn rhybuddio am ddosbarthiadau nad ydynt wedi'u marcio â'r fanyleb "terfynol", ond sydd â distryw gyda'r priodoledd "terfynol".
    • Mae "-Wtautological-bitwise-compare" yn grŵp o rybuddion ar gyfer gwneud diagnosis o gymariaethau tautolegol rhwng gweithrediad bitwise a chysonyn, ac ar gyfer nodi cymariaethau gwir bob amser lle mae'r gweithrediad bitwise NEU yn cael ei gymhwyso i rif nad yw'n negyddol.
    • Mae "-Wbitwise-conditional-parentheses" yn rhybuddio am broblemau wrth gymysgu'r gweithredwyr rhesymegol AC (&) ac OR(|) gyda'r gweithredwr amodol (?:).
    • Mae “-Wmisleading-indentation” yn analog o'r siec o'r un enw gan GCC, sy'n rhybuddio am ymadroddion wedi'u hindentio fel pe baent yn rhan o floc os/arall/am/tra, ond mewn gwirionedd nid ydynt wedi'u cynnwys yn y bloc hwn .
    • Wrth nodi "-Wextra", mae'r gwiriad "-Wdeprecated-copy" wedi'i alluogi, gan rybuddio am y defnydd o adeiladwyr
      "symud" a "copi" mewn dosbarthiadau gyda diffiniad dinistriol penodol.

    • Mae'r gwiriadau "-Wtautological-overlap-compare", "-Wsizeof-pointer-div", "-Wtautological-compare", "-Wrange-loop-analysis" wedi'u hehangu.
    • Mae'r gwiriadau "-Wbitwise-op-parentheses" a "-Wlogical-op-parentheses" wedi'u hanalluogi yn ddiofyn.
  • Mewn cod C a C++, dim ond mewn araeau y caniateir gweithrediadau rhifyddeg pwyntydd. Mae'r Glanweithydd Ymddygiad Anniffiniedig yn y modd "-fsanitize=pointer-overflow" bellach yn dal achosion fel ychwanegu gwrthbwyso di-sero at bwyntydd nwl neu greu pwyntydd nwl wrth dynnu cyfanrif o bwyntydd di-nwl.
  • Mae'r modd "-fsanitize=implicit-conversion" (Implicit Conversion Sanitizer) wedi'i addasu i nodi problemau gyda gweithrediadau cynyddiad a gostyngiad ar gyfer mathau sydd ychydig yn llai na maint y math "int".
  • Wrth ddewis pensaernïaeth darged x86 "-march=skylake-avx512", "-march=icelake-client", "-march=icelake-server", "-march=cascadelake" a "-march=cooperlake" yn ddiofyn yn fectorized The cod wedi rhoi'r gorau i ddefnyddio cofrestrau zmm 512-did, ac eithrio eu dynodiad uniongyrchol yn y cod ffynhonnell. Y rheswm yw bod amledd y CPU yn lleihau wrth berfformio gweithrediadau 512-did, a all effeithio'n negyddol ar berfformiad cyffredinol. I newid yr ymddygiad newydd, darperir yr opsiwn "-mprefer-vector-width=512".
  • Mae ymddygiad y faner "-flax-fector-conversions" yn debyg i GCC: gwaherddir trawsnewidiadau did fector ymhlyg rhwng cyfanrif a fectorau pwynt arnawf. Er mwyn dileu'r cyfyngiad hwn, cynigir defnyddio'r faner
    "-flax-vector-conversions=all" sef y rhagosodiad.

  • Gwell cefnogaeth i CPUs MIPS y teulu Octeon. Ychwanegwyd "octeon+" at y rhestr o fathau CPU dilys.
  • Wrth gydosod i god canolradd WebAssembly, gelwir yr optimizer wasm-opt yn awtomatig, os yw ar gael yn y system.
  • Ar gyfer systemau sy'n seiliedig ar bensaernïaeth RISC-V, caniateir defnyddio cofrestrau sy'n storio gwerthoedd pwynt arnawf mewn blociau amodol o fewnosodiadau cydosodwr.
  • Ychwanegwyd baneri casglwr newydd: "-fgnuc-version" i osod gwerth y fersiwn ar gyfer "__GNUC__" a macros tebyg; "-fmacro-prefix-map=OLD=NEW" i ddisodli'r rhagddodiad cyfeiriadur OLD gyda NEWYDD mewn macros megis "__FILE__"; "-fpatchable-function-entry=N[,M]" i gynhyrchu nifer penodol o gyfarwyddiadau NOP cyn ac ar ôl pwynt mynediad y ffwythiant. Ar gyfer RISC-V
    cefnogaeth ychwanegol ar gyfer y baneri "-ffixed-xX", "-mcmodel=medany" a "-mcmodel=medlow".

  • Ychwanegwyd cefnogaeth i'r briodwedd '__attribute__((target("branch-protection=..."))), y mae ei effaith yn debyg i'r opsiwn -cangen-amddiffyn.
  • Ar blatfform Windows, wrth nodi'r faner “-cfguard”, gweithredir amnewid gwiriadau cywirdeb llif gweithredu (Control Flow Guard) ar gyfer galwadau swyddogaeth anuniongyrchol. I analluogi amnewid siec, gallwch ddefnyddio'r faner “-cfguard-nochecks” neu'r addasydd “__declspec(guard(nocf))”.
  • Mae ymddygiad y priodoledd gnu_inline yn debyg i GCC mewn achosion lle caiff ei ddefnyddio heb yr allweddair "allanol".
  • Mae'r galluoedd sy'n gysylltiedig â chymorth OpenCL a CUDA wedi'u hehangu. Cefnogaeth ychwanegol ar gyfer nodweddion OpenMP 5.0 newydd.
  • Mae opsiwn safonol wedi'i ychwanegu at y cyfleustodau fformat clang, sy'n eich galluogi i bennu'r fersiwn o'r safon C++ a ddefnyddir wrth ddosrannu a fformatio cod (Diweddaraf, Auto, c++03, c++11, c++14, c++17, c++20).
  • Mae gwiriadau newydd wedi'u hychwanegu at y dadansoddwr statig: alpha.cplusplus.PlacementNew i benderfynu a oes digon o le storio, fuchsia.HandleChecker i ganfod gollyngiadau sy'n ymwneud â thrinwyr Fuchsia, security.insecureAPI.decodeValueOfObjCType i ganfod gorlifoedd clustogi posibl wrth ddefnyddio [NSCoder decodebCtalypepe :yn:].
  • Mae'r Glanweithydd Ymddygiad Anniffiniedig (UBSan) wedi ehangu ei wiriadau gorlif pwyntydd i ddal y defnydd o wrthbwyso di-sero i awgrymiadau NULL neu ychwanegu gwrthbwyso pwyntydd NULL o ganlyniad.
  • Yn linter clang-taclus wedi adio cyfran fawr o sieciau newydd.

Y prif arloesiadau LLVM 10.0:

  • I'r fframwaith Priodolwr Mae optimeiddiadau a dadansoddwyr rhyng-weithdrefnol newydd wedi'u hychwanegu. Rhagfynegir cyflwr 19 o wahanol nodweddion, gan gynnwys 12 nodwedd 12 LLVM IR a 7 priodoledd haniaethol megis bywiogrwydd.
  • Ychwanegwyd ffwythiannau mathemategol matrics newydd yn y casglwr (Cynhenid), sy'n cael eu disodli gan gyfarwyddiadau fector effeithlon wrth eu llunio.
  • Mae nifer o welliannau wedi'u gwneud i gefnlenni ar gyfer pensaernïaeth X86, AArch64, ARM, SystemZ, MIPS, AMDGPU a PowerPC. Ychwanegwyd cefnogaeth CPU
    Cortex-A65, Cortex-A65AE, Neoverse E1 a Neoverse N1. Ar gyfer ARMv8.1-M, ​​mae'r broses cynhyrchu cod wedi'i optimeiddio (er enghraifft, mae cefnogaeth ar gyfer dolenni heb fawr o uwchben wedi ymddangos) ac mae cefnogaeth ar gyfer autovectorization wedi'i ychwanegu gan ddefnyddio'r estyniad MVE. Gwell cefnogaeth CPU MIPS Octeon. Ar gyfer PowerPC, mae fectoreiddio is-reolweithiau mathemategol gan ddefnyddio'r llyfrgell MASSV (Is-System Cyflymu Mathemategol) wedi'i alluogi, mae cynhyrchu cod yn cael ei wella, ac mae mynediad cof o ddolenni wedi'i optimeiddio. Ar gyfer x86, mae'r modd yr ymdrinnir â mathau fector v2i32, v4i16, v2i16, v8i8, v4i8 a v2i8 wedi'i newid.

  • Gwell generadur cod ar gyfer WebCynulliad. Ychwanegwyd cefnogaeth ar gyfer cyfarwyddiadau TLS (Storio Thread-Local) a atomic.fence. Mae cefnogaeth SIMD wedi'i ehangu'n sylweddol. Bellach mae gan ffeiliau gwrthrych WebCynulliad y gallu i ddefnyddio llofnodion swyddogaeth aml-werth.
  • Defnyddir y dadansoddwr wrth brosesu dolenni Cof SSA, sy'n eich galluogi i ddiffinio dibyniaethau rhwng gwahanol weithrediadau cof. Gall MemorySSA leihau amser llunio a gweithredu neu gellir ei ddefnyddio yn lle AliasSetTracker heb golli perfformiad.
  • Mae dadfygiwr LLDB wedi gwella cefnogaeth yn sylweddol ar gyfer fformat DWARF v5. Gwell cefnogaeth ar gyfer adeiladu gyda MinGW
    a gallu cychwynnol ychwanegol i ddadfygio nwyddau gweithredadwy Windows ar gyfer pensaernïaeth ARM ac ARM64. Ychwanegwyd disgrifiadau o'r opsiynau a gynigir wrth awtolenwi mewnbwn trwy wasgu tab.

  • Ehangwyd Galluoedd cysylltydd LLD. Gwell cefnogaeth i'r fformat ELF, gan gynnwys sicrhau cydnawsedd llawn o dempledi glob gyda'r cysylltydd GNU, ychwanegu cefnogaeth ar gyfer adrannau dadfygio cywasgedig ".zdebug", gan ychwanegu'r eiddo PT_GNU_PROPERTY i ddiffinio'r adran .note.gnu.property (gellir ei ddefnyddio yn y dyfodol cnewyllyn Linux),
    Mae'r moddau “-z noseparate-code”, “-z separate-code” a “-z separate-loadable-segments” wedi'u rhoi ar waith. Gwell cefnogaeth i MinGW a WebCynulliad.

Ffynhonnell: opennet.ru

Ychwanegu sylw