Release av GCC 15-kompilatorsviten

Efter ett Ärs utveckling har den kostnadsfria GCC-kompilatorsviten GCC 15.1 slÀppts, den första stora utgÄvan i den nya GCC 15.x-grenen. Enligt versionsnumreringsschemat anvÀndes version 15.0 under utvecklingen, och strax före utgivningen av GCC 15.1 hade en gren av GCC 16.0 redan splittrats, vilket kommer att ligga till grund för nÀsta stora utgÄva, GCC 16.1.

HuvudÀndringar:

  • Vid kompilering av C-program anvĂ€nds C23-standarden (Change Summary) med GNU-tillĂ€gg ("-std=gnu23") som standard. Tidigare anvĂ€ndes C17-standarden som standard (-std=gnu17). Ändringen kan potentiellt orsaka problem nĂ€r man bygger befintliga projekt pĂ„ grund av inkluderingen av nullptr-konstanten, typen _BitInt(n) och nyckelorden bool, true och false, vilket kan komma i konflikt med liknande namngivna identifierare som definieras i applikationer.
  • Följande funktioner i C23-standarden har implementerats:
    • Direktivet "#embed" Ă€r utformat för att bĂ€dda in binĂ€ra resurser i kod.
    • Attributet "unsequenced", vilket indikerar att resultatet inte beror pĂ„ exekveringsordningen.
    • Attributet "reproducerbar" indikerar att funktionen alltid returnerar samma resultat med samma input, d.v.s. inte beror pĂ„ andra faktorer.
  • Delar av den framtida C2Y-standarden har implementerats (-std=c2y och -std=gnu2y):
    • Möjlighet att deklarera variabler i en "if"-sats, till exempel "if (int x = get ()) {...}".
    • Stöd för att namnge loopar för att referera till dem i kod. yttre: för (int i = 0; i < IK; ++ i) { switch (i) { fall 1: break; // hoppar till CONT1 fall 2: break yttre; // hoppar till CONT2 } // CONT1 } // CONT2
    • Stöd för att ange intervall av heltalsvĂ€rden i kasusuttryck, som "fall 1...10:".
    • Suffixen "i" och "j" för att beteckna den imaginĂ€ra delen i komplexa tal.
    • Möjlighet att anvĂ€nda operatorerna "++" och "—" med komplexa tal.
    • Konstruktionen "_Generic(type, expr1, expr2, 
)" för att vĂ€lja ett uttryck baserat pĂ„ operandtypen.
    • Stöd för Ă„tkomst av byte-arrayer som andra objekttyper, sĂ„som strukturer och fackföreningar.
    • Stöd för att tillĂ€mpa operatorn "alignof" pĂ„ ofullstĂ€ndiga arrayer (de som deklareras utan att ange en storlek, till exempel "int a[]").
    • Lagt till ny syntax för oktala, hexadecimala och universella tecken escape-sekvenser. IstĂ€llet för "\u", "\x" och "\nnn" föreslĂ„s sekvenserna "\u{}", "\o{}" och "\x{}", dĂ€r valfritt antal siffror kan anges.
    • Inbyggda funktioner "__builtin_stdc_rotate_left" och "__builtin_stdc_rotate_right".
    • NolllĂ€ngdsoperationer pĂ„ NULL-pekare Ă€r tillĂ„tna (t.ex. "sizeof(*p)").
  • Frontend för C++-sprĂ„ket implementerar funktioner som utvecklas för den framtida C++26-standarden:
    • Variationsoperator "vĂ€n" ("vĂ€n Ts...").
    • Möjligheten att anvĂ€nda nyckelordet constexpr med en variant av new-operatorn (placement new) för att placera ett objekt i förallokerat minne vid kompileringstid.
    • Felutmatning vid borttagning av en pekare till en ofullstĂ€ndig typ.
    • Syntaxen för att definiera variadiska parametrar med en ellips utan föregĂ„ende kommatecken (till exempel nĂ€r du anger "void e(int...)" istĂ€llet för "void e(int, ...)") har förĂ„ldrats.
    • Indexering av ett parameterpaket i mallar.
    • Attribut för strukturerade bindningar;
    • Syntax '= delete("orsak"');
    • Inkludering av "@", "$" och "`" i den grundlĂ€ggande teckenuppsĂ€ttningen.
    • Det Ă€r förbjudet att anvĂ€nda makron för att deklarera moduler.
    • Möjlighet att anvĂ€nda strukturerad bindning som ett villkor i if- och switch-satser.
    • Stöd för direkt arrayjĂ€mförelse (t.ex. "int arr1[5]; int arr2[5]; bool same = arr1 == arr2") har upphört.
    • "#embed"-mekanismen för inbĂ€ddning av binĂ€ra resurser.
    • Mallklassen is_trivial har fasats ut.
  • Lade till C++23-funktioner:
    • TillĂ„t viss anvĂ€ndning av "export"-direktivet och tillĂ„t anvĂ€ndning av "export {}".
    • Stöd för att förlĂ€nga livslĂ€ngden för tillfĂ€lliga objekt för loopar som itererar över intervall.
  • Biblioteket libstdc++ implementerar experimentellt stöd för modulerna std och std.compat.
  • Att anvĂ€nda "{0}"-initieraren för fackföreningar i C- och C++-kod garanterar inte lĂ€ngre att allt innehĂ„ll rensas, utan resulterar istĂ€llet i att det första elementet i föreningen nollstĂ€lls. För att rensa hela unionen, anvĂ€nd "{}"-uttrycket som definierats i C23-specifikationen, eller ange alternativet "-fzero-init-padding-bits=unions" för att Ă„terstĂ€lla det gamla beteendet.
  • Implementerat stöd för "musttail"-attributet ([[gnu::musttail]] och [[clang::musttail]]) för garanterade svansanrop. Attributet gĂ€ller för retursatser som gör ett rekursivt anrop till den aktuella funktionen, och sĂ€kerstĂ€ller att ett sĂ„dant anrop kommer att anvĂ€nda svansrekursion, vilket inte allokerar ytterligare minne pĂ„ stacken (eliminerar risken att minnet tar slut med ett mycket stort antal anrop).
  • Implementerat stöd för attributet flag_enum ([[gnu::flag_enum]] och [[clang::flag_enum]]) tillĂ€mpat pĂ„ upprĂ€kningar för att indikera att innehĂ„llet anvĂ€nds i bitvisa operationer (förhindrar varningar i -Wswitch-lĂ€ge).
  • Lade till stöd för attributet "counted_by", som kan anvĂ€ndas för att specificera ett fĂ€lt i en struktur med en flexibel array som bestĂ€mmer antalet element. Attributet kan anvĂ€ndas för att förbĂ€ttra effektiviteten i kontroller av buffertspill.
  • Lade till attributet "nonnull_if_nonzero" till funktioner, vilket anger att vissa funktionsparametrar med pekare kan vara NULL endast om en annan parameter Ă€r noll.
  • Utökade assembler-införande "asm(
.)" externa funktioner Ă€r tillĂ„tna. I assembler-inlĂ€gg Ă€r det tillĂ„tet att skriva över minne i den röda zonen av stacken (omrĂ„det överst i stacken).
  • Kompileringen av C++-kod gĂ„r snabbare tack vare förbĂ€ttrad mallhashning.
  • Lade till nya optimeringar. Stöd har implementerats för vektoriseringsslingor som innehĂ„ller kod för tidig exit (till exempel via ett paus- eller returanrop), Ă€ven om sĂ„dana loopar manipulerar dynamiskt allokerade arrayer eller buffertar vars storlek Ă€r okĂ€nd vid kompileringstidpunkten. NĂ€r alternativet -O2 Ă€r specificerat, aktiveras vektorisering av nĂ„gra lĂ€tt vektoriserbara slingor för vilka tripcountinformation inte Ă€r tillgĂ€nglig.
  • Lade till inkrementellt optimeringslĂ€ge vid lĂ€nkningsstadiet (LTO, Link-Time Optimization), vilket avsevĂ€rt minskar omkompileringstiden vid anvĂ€ndning av LTO i situationer dĂ€r mindre Ă€ndringar har gjorts i koden (en funktion har redigerats). För att aktivera inkrementellt lĂ€ge, föreslĂ„s alternativet "-flto-inkrementell".
  • FörbĂ€ttrad kompilering av mycket stora indatafiler. Implementerad spĂ„rning av kolumnnummer större Ă€n 4096. FörbĂ€ttrad noggrannhet för att ange platsen för fel och varningar i mycket stora filer.
  • FörbĂ€ttrad synlighet för rapporter vid diagnos av problem. Till exempel Ă€r platsen för problemet markerad med "⚠"-symbolen, layouten för utdata för fel i C++-mallar har Ă€ndrats, tips har lagts till för att förenkla övergĂ„ngen till C23-standarden och fĂ€rgschemat har gjorts om. Lade till möjligheten att mata ut diagnostik i Sarif-format (-fdiagnostics-format=sarif-fil).
  • Biblioteket libgdiagnostics har implementerats, vilket gör att du kan integrera GCC-funktioner relaterade till utformningen av diagnostiska meddelanden i dina projekt (du kan till exempel anvĂ€nda citat, markering och korrigeringstips).
  • Lade till varningar "-Wtrailing-whitespace" och "-Wleading-whitespace" för att upptĂ€cka kvarvarande blanksteg i slutet av rader och extra blanksteg i början av rader.
  • Lade till "-Wheader-guard" varning för att rapportera problem i header guard makron som förhindrar en header fil frĂ„n att inkluderas igen.
  • Frontend för D-sprĂ„ket har uppdaterats till version 2.111.0.
  • Stöd för osignerade heltal har lagts till i Fortran-grĂ€nssnittet.
  • Paketet innehĂ„ller en kompilator för COBOL-sprĂ„ket, gcobol, som stöder plattformarna x86-64 och AArch64 och Ă€r inte designad för anvĂ€ndning pĂ„ 32-bitarssystem. Kompilatorn implementerar ISO/IEC 1989:2023-specifikationen och klarar de flesta NIST CCVS/85-testerna.
  • Implementeringen av OpenMP 5.0, 5.1, 5.2 och 6.0 (Open Multi-Processing) standarder, som definierar API och metoder för att tillĂ€mpa parallella programmeringsmetoder pĂ„ flerkĂ€rniga och hybridsystem (CPU+GPU/DSP) med delat minne och vektoriseringsenheter (SIMD), har fortsatt. Lade till stöd för metadirektiv och tile, unroll, interop och dispatch konstruktioner. För vissa AMD- och NVIDIA GPU:er har stöd för enhetligt delat minne lagts till (aktiverat genom att ange unified_shared_memory i "requires"-direktivet). Lade till stöd för uttrycket "self_maps".
  • Backend för AArch64-arkitekturen har uppdaterats för att stödja MinGW-plattformen (aarch64-w64-mingw32). Mer Ă€n 20 ARM8-tillĂ€gg har implementerats och stödet för tillĂ€gget ACLE (Arm C Language Extensions) har förbĂ€ttrats. MĂ„nga förbĂ€ttringar har gjorts av kodgeneratorn. Tillagt CPU-stöd:
    • Apple A12 (apple-a12)
    • Apple M1 (apple-m1)
    • Apple M2 (apple-m2)
    • Apple M3 (apple-m3)
    • Arm Cortex-A520AE (cortex-a520ae)
    • Arm Cortex-A720AE (cortex-a720ae)
    • Arm Cortex-A725 (cortex-a725)
    • Arm Cortex-R82AE (cortex-r82ae)
    • Arm Cortex-X925 (cortex-x925)
    • Arm Neoverse N3 (neoverse-n3)
    • Arm Neoverse V3 (neoverse-v3)
    • Arm Neoverse V3AE (neoverse-v3ae)
    • FUJITSU-MONAKA (fujitsu-monaka)
    • NVIDIA Grace
    • NVIDIA Olympus (olympus)
    • Qualcomm Oryon-1 (Oryon-1)
  • AMD Radeon GPU (GCN) kodgenereringsbackend har uppdaterats för att stödja libstdc++-biblioteket och experimentell kodgenerering har lagts till för enhetsserierna gfx9-generic, gfx10-3-generic och gfx11-generic.
  • x86-backend stöder nu Intels instruktionsuppsĂ€ttningsarkitekturtillĂ€gg AVX10.2, AMX-AVX512, AMX-FP8, AMX-MOVRS, AMX-TF32, AMX-TRANSPOSE, MOVRS. Tillagt stöd för Intel Diamond Rapids och Xeon Phi-processorer.
  • Utökade backend-funktioner för LoongArch- och AVR-plattformar.
  • Borttaget stöd för nios2-mĂ„larkitekturen som anvĂ€nds i Nios II-processorer. Stöd för ILP32 ABI (-mabi=ilp32) i AArch64-porten har fasats ut och kommer att tas bort i nĂ€sta större version.

KĂ€lla: opennet.ru

LĂ€gg en kommentar