Liberigo de la kompililo LLVM 16.0

Post ses monatoj da evoluo, la publikigo de la projekto LLVM 16.0 estis prezentita - GCC-kongrua ilaro (kompiloj, optimumigiloj kaj kodgeneratoroj) kiu kompilas programojn en mezan peckodon de RISC-similaj virtualaj instrukcioj (malaltnivela virtuala maŝino kun plurnivela optimumiga sistemo). La generita pseŭdokodo povas esti konvertita uzante JIT-kompililon en maŝininstrukciojn rekte dum programekzekuto.

Gravaj plibonigoj en Clang 16.0:

  • La defaŭlta C++/ObjC++ normo estas gnu++17 (antaŭe gnu++14), kio signifas, ke C++17-ecoj kun GNU-etendaĵoj estas subtenataj defaŭlte. Por redoni la antaŭan konduton, vi povas uzi la opcion "-std=gnu++14".
  • Efektivigitaj progresintaj funkcioj ligitaj al la C++20-normo:
    • Kondiĉe bagatelaj specialaj membrofunkcioj,
    • kaptante strukturitajn ligojn en lambda funkcioj,
    • Egaleca operatoro ene de esprimoj,
    • Opcio preterlasi la tipnoman ŝlosilvorton en iuj kuntekstoj,
    • Valida entuta inicialigo inter krampoj ("Aggr(val1, val2)").
  • Trajtoj difinitaj en la estonta C++2b-normo estis efektivigitaj:
    • Estas permesite meti etikedojn ĉe la fino de kunmetitaj esprimoj,
    • senmova operatoro(),
    • senmova operatoro [],
    • Kongrueco kun la char8_t-tipo estas certigita,
    • La gamo de signoj permesitaj por uzi en "\N{...}" estis pligrandigita
    • Aldonita la kapablo uzi variablojn deklaritajn kiel "senmova konstexpr" en funkcioj deklaritaj kiel constexpr.
  • La funkcioj difinitaj en la estonta C-normo C2x estis efektivigitaj:
    • Por malŝalti la averton "-Wunused-label", la atributo "[[eble_unused]]" rajtas esti aplikita al etikedoj
    • Estas permesite meti etikedojn ie ajn en kunmetitaj esprimoj,
    • Aldonita typeof kaj typeof_unqual operatoroj,
    • Nova tipo nullptr_t kaj nullptr konstanto por difini nulmontrilojn kiuj povas konverti al iu ajn montrilo-tipo kaj reprezenti varianton de NULL kiu ne estas ligita al entjero kaj malplena* tipoj.
    • En C2x-reĝimo, voki la va_start makroon kun varia nombro da argumentoj (variadikaj) estas permesita.
  • En C99, C11, kaj C17 observreĝimoj, la defaŭltaj opcioj "-Wimplicit-function-declaration" kaj "-Wimplicit-int" nun produktas eraron anstataŭ averto.
  • Nerekta uzo de "void *" (ekz. "void func(void *p) { *p; }") en C++-reĝimo nun generas eraron, similan al ISO C++, GCC, ICC kaj MSVC.
  • Specifante bitkampojn kiel instrukciajn operaciojn (ekz. "__asm ​​​​{ mov eax, s.bf }") en Mikrosoft-stilaj enliniaj asembleblokoj nun generas eraron.
  • Aldonita diagnozo por la ĉeesto de malsamaj strukturoj kaj sindikatoj kun la samaj nomoj en malsamaj moduloj.
  • La kapabloj asociitaj kun OpenCL kaj OpenMP-subteno estis vastigitaj. Plibonigita diagnozo por C++-ŝablonoj uzataj en OpenCL-kernargumentoj. Plibonigita vicbloka subteno por AMDGPU. La atributo substantiva vento estas implicite aldonita al ĉiuj funkcioj. Plibonigita subteno por enkonstruitaj funkcioj.
  • Aldonita la kapablo uzi la CLANG_CRASH_DIAGNOSTICS_DIR mediovariablo por difini la dosierujon en kiu kraŝaj diagnozaj datumoj estas konservitaj.
  • Unikodo-subteno estis ĝisdatigita al la Unikodo 15.0-specifo. Kelkaj matematikaj simboloj estas permesitaj en identigiloj, kiel ekzemple "₊" (ekz. "duobla xₖ₊₁").
  • Aldonita subteno por ŝarĝo de pluraj agordaj dosieroj (defaŭltaj agordaj dosieroj estas ŝarĝitaj unue, kaj poste tiuj specifitaj per la flago "--config=", kiu nun povas esti specifita plurfoje). La defaŭlta ordo de ŝarĝo de agordaj dosieroj estis ŝanĝita: clang unue provas ŝargi la dosieron -.cfg, kaj se ĝi ne estas trovita, ĝi provas ŝargi du dosierojn .cfg kaj . .cfg. Por malebligi ŝarĝi agordajn dosierojn defaŭlte, la flago "--no-default-config" estis aldonita.
  • Por certigi ripeteblajn konstruojn, eblas anstataŭigi la aktualajn datajn kaj horajn valorojn en la makrooj __DATE__, __TIME__ kaj __TIMESTAMP__ per la tempo specifita en la mediovariablo SOURCE_DATE_EPOCH.
  • Por kontroli la ĉeeston de enkonstruitaj funkcioj (enkonstruitaj) uzeblaj en la kunteksto de konstantoj, la makroo "__has_constexpr_builtin" estis aldonita.
  • Aldonita nova kompila flago "-fcoro-aligned-allocation" por vicigita korutina kadro-atribuo.
  • La flago "-fstrict-flex-arrays=" efektivigas subtenon por la tria nivelo de konfirmo de flekseblaj tabelelementoj en strukturoj (Flexible Array Members, tabelo de nedifinita grandeco ĉe la fino de la strukturo). Je la tria nivelo, nur la grandeco "[]" (ekzemple, "int b[]") estas traktita kiel fleksebla tabelo, sed la grandeco "[0]" (ekzemple, "int b[0]") ne estas.
  • Aldonita "-fmodule-output" flago por ebligi unufazan kompilmodelon por normaj C++-moduloj.
  • Aldonita "-Rpass-analysis=stack-frame-layout" reĝimo por helpi diagnozi problemojn kun staka kadra aranĝo.
  • Aldonis novan atributon __attribute__((target_version("cpu_features")))) kaj etendis la funkciecon de la atributo __attribute__((target_clones("cpu_features1","cpu_features2",...))) por elekti specifajn versiojn de funkcioj provizitaj de AArch64. CPUoj.
  • Diagnozaj iloj pligrandiĝis:
    • Aldonita averto "-Wsingle-bit-bitfield-constant-conversion" por detekti implican detranĉon dum asignado de unu al unu-bita subskribita bitkampo.
    • La diagnozo de neinicialigitaj constexpr-variabloj estis vastigitaj.
    • Aldonitaj "-Wcast-function-type-strict" kaj "-Wincompatible-function-pointer-types-strict" avertoj por identigi eblajn problemojn kun funkcio-speca casting.
    • Aldonita diagnozo por uzi malĝustajn aŭ rezervitajn modulnomojn en eksportblokoj.
    • Plibonigita detekto de mankantaj "aŭtomataj" ŝlosilvortoj en difinoj.
    • La efektivigo de la averto "-Winteger-overflow" aldonis kontrolojn por pliaj situacioj, kiuj kondukas al superfluoj.
  • Efektivigita subteno por la LoongArch-instrukcia aro-arkitekturo (-march=loongarch64 aŭ -march=la464), uzita en Loongson 3 5000 procesoroj kaj efektiviganta la novan RISC ISA, similan al MIPS kaj RISC-V.

Ŝlosilaj novigoj en LLVM 16.0:

  • LLVM-kodo rajtas uzi elementojn difinitajn en la C++17-normo.
  • La mediopostuloj por konstruado de LLVM estis pliigitaj. La konstruaj iloj nun devus subteni la C++17-normon, t.e. Por konstrui, vi bezonas almenaŭ GCC 7.1, Clang 5.0, Apple Clang 10.0 aŭ Visual Studio 2019 16.7.
  • La backend por la AArch64-arkitekturo aldonas subtenon por Cortex-A715, Cortex-X3 kaj Neoverse V2 CPU-oj, asemblero por RME MEC (Memory Encryption Contexts), Armv8.3-etendaĵoj (Kompleksa Nombro) kaj Function Multi Versioning.
  • En la backend por la ARM-arkitekturo, subteno por la Armv2, Armv2A, Armv3 kaj Armv3M celplatformoj estis nuligita, por kiuj la generacio de ĝusta kodo ne estis garantiita. Aldonis la kapablon generi kodon por instrukcioj por labori kun kompleksaj nombroj.
  • La backend por la X86-arkitekturo aldonis subtenon por instrukciaj arkitekturoj (ISAoj) AMX-FP16, CMPCCXADD, AVX-IFMA, AVX-VNNI-INT8, AVX-NE-CONVERT. Aldonita subteno por RDMSRLIST, RMSRLIST kaj WRMSRNS instrukcioj. Efektivigitaj opcioj "-mcpu=raptorlake", "-mcpu=meteorlake", "-mcpu=emeraldrapids", "-mcpu=sierraforest", "-mcpu=graniterapids" kaj "-mcpu=grandridge".
  • Aldonita oficiala subteno por la platformo LoongArch.
  • Plibonigitaj backends por arkitekturoj MIPS, PowerPC kaj RISC-V
  • Aldonita subteno por senararigado de 64-bitaj ruleblaj por la LoongArch-arkitekturo al la LLDB-erarseĉilo. Plibonigita uzado de COFF-sencimsimboloj. Provizita filtrado de duplikataj DLL-oj en la listo de ŝarĝitaj Vindozaj moduloj.
  • En la Libc++ biblioteko, la ĉeflaboro estis temigis efektivigado de subteno por novaj ecoj de la C++20 kaj C++23 normoj.
  • La LDD-ligilo signife reduktas ligtempon paraleligante adrestranslokigan skanadon kaj sekciajn operaciojn. Aldonita subteno por sekciokunpremo uzante la ZSTD-algoritmon.

fonto: opennet.ru

Aldoni komenton