Verëffentlechung vun der LLVM 10.0 Compiler Suite

No sechs Méint Entwécklung presentéiert Projet Verëffentlechung LLVM 10.0 - GCC-kompatibel Tools (Compilatoren, Optimisateuren a Code Generatoren), kompiléiere Programmer an Zwëschen Bitcode vu RISC-ähnleche virtuelle Instruktiounen (niddereg virtuell Maschinn mat engem Multi-Level Optimiséierungssystem). De generéierte Pseudocode ka mat engem JIT Compiler a Maschinninstruktiounen direkt zur Zäit vun der Ausféierung vum Programm ëmgewandelt ginn.

Nei Fonctiounen am LLVM 10.0 och Ënnerstëtzung fir C ++ Konzepter, net méi lafen Clang als separat Prozess, Ënnerstëtzung fir CFG (Kontroll Flux Gard) Schecken fir Windows, an Ënnerstëtzung fir nei CPU Kënnen.

Verbesserungen am Clang 10.0:

  • Zousätzlech Ënnerstëtzung fir "Konzepter", eng C++ Schabloun Extensioun déi am nächste Standard abegraff gëtt, mam Codenumm C++2a (ageschalt vum -std=c++2a Fändel).
    Konzepter erlaben Iech e Set vu Schablounparameter Ufuerderunge ze definéieren, déi an der Zesummesetzung Zäit d'Set vun Argumenter limitéieren déi als Schablounparameter akzeptéiert kënne ginn. D'Konzepter kënne benotzt ginn fir logesch Inkonsistenz tëscht den Eegeschafte vun den Datentypen, déi an der Schabloun benotzt ginn, an den Datentypeigenschaften vun den Inputparameter ze vermeiden.

    Schabloun
    Konzept GläichheetComparable = erfuerdert(T a, T b) {
    { a == b } -> std::boolean;
    { a != b } -> std::boolean;
    };

  • Par défaut gëtt de Start vun engem separaten Prozess ("clang -cc1") an deem d'Kompilatioun ausgefouert gëtt gestoppt. D'Kompilatioun gëtt elo am Haaptprozess gemaach, an d'Optioun "-fno-integrated-cc1" kann benotzt ginn fir dat alt Verhalen ze restauréieren.
  • Nei Diagnosmodi:
    • "-Wc99-designator" an "-Wreorder-init-list" warnen géint d'Benotzung vun C99 Initialisatoren am C++ Modus a Fäll wou se an C99 korrekt sinn awer net an C++20.
    • "-Wsizeof-array-div" - fënnt Situatiounen wéi "int arr[10]; ...sizeof(arr) / sizeof(short)..." (soll "sizeof(arr) / sizeof(int)" sinn).
    • "-Wxor-used-as-po" - warnt géint d'Benotzung vu Konstrukter wéi d'Benotzung vum "^" (xor) Bedreiwer an Operatiounen déi mat Exponentiatioun verwiesselt kënne ginn (2^16).
    • "-Wfinal-dtor-non-final-Klass" - warnt iwwer Klassen déi net mat der "Finale" spezifizéieren markéiert sinn, mä hunn eng destructor mat der "final" Attribut.
    • "-Wtautological-bitwise-compare" ass eng Grupp vu Warnungen fir d'Diagnos vun tautologesche Vergläicher tëscht enger bitwise Operatioun an enger konstanter, a fir ëmmer richteg Vergläicher z'identifizéieren, an deenen d'bitwise ODER Operatioun op eng net-negativ Zuel applizéiert gëtt.
    • "-Wbitwise-conditional-parentheses" warnt vu Probleemer wann Dir déi logesch Betreiber AND (&) an ODER (|) mam bedingungsbedreiwer (?:) vermëscht.
    • "-Wmisleading-indentation" ass en Analog vum Scheck mam selwechten Numm vum GCC, deen iwwer verzweifelt Ausdréck warnt wéi wa se Deel vun engem if/else/for/while Block wieren, awer tatsächlech sinn se net an dësem Block abegraff. .
    • Wann Dir "-Wextra" spezifizéiert, ass de "-Wdeprecated-copy" Scheck aktivéiert, warnt iwwer d'Benotzung vu Konstruktoren
      "move" a "copy" a Klassen mat enger explizit Destructor Definitioun.

    • D'Kontrollen "-Wtautological-overlap-compare", "-Wsizeof-pointer-div", "-Wtautological-compare", "-Wrange-Loop-Analyse" goufen erweidert.
    • D'Kontrollen "-Wbitwise-op-parentheses" an "-Wlogical-op-parentheses" sinn als Standard deaktivéiert.
  • Am C an C ++ Code sinn Pointer arithmetesch Operatiounen nëmmen an Arrays erlaabt. Den Undefined Behavior Sanitizer am "-fsanitize = Pointer-Iwwerfluss" Modus fënnt elo Fäll wéi en Net-Null Offset un en Null Pointer bäizefügen oder en Null Pointer ze kreéieren wann Dir en Ganzt vun engem Net-Null Pointer subtrahéiert.
  • De Modus "-fsanitize = implizit-Konversioun" (Implicit Conversion Sanitizer) Modus ass ugepasst fir Probleemer mat Inkrement- an Dekrementoperatioune fir Typen mat enger Bitgréisst méi kleng wéi déi vum "int" Typ ze identifizéieren.
  • Wann Dir x86 Zilarchitekturen auswielen "-march=skylake-avx512", "-march=icelake-client", "-march=icelake-server", "-march=cascadelake" an "-march=cooperlake" par défaut am vectorized The Code huet gestoppt mat 512-Bit zmm Registere ze benotzen, ausser fir hir direkt Indikatioun am Quellcode. De Grond ass datt d'CPU Frequenz erof geet wann Dir 512-Bit Operatiounen ausféiert, wat d'allgemeng Leeschtung negativ beaflosse kann. Fir dat neit Verhalen z'änneren, gëtt d'Optioun "-mrefer-vector-width=512" ugebueden.
  • D'Behuele vun de Fändel "-flax-vector-conversions" ass ähnlech wéi GCC: implizit Vecteure Bit Konversiounen tëscht ganz Zuelen a Floating Point Vecteure si verbueden. Fir dës Begrenzung ze eliminéieren, gëtt proposéiert de Fändel ze benotzen
    "-flax-vector-conversions=all" wat de Standard ass.

  • Verbesserte Ënnerstëtzung fir MIPS CPUs vun der Octeon Famill. Dobäi "octeon +" op d'Lëscht vun valabel CPU Zorte.
  • Wann Dir an de WebAssembly Zwëschencode montéiert, gëtt de wasm-opt Optimizer automatesch genannt, wa verfügbar am System.
  • Fir Systemer baséiert op der RISC-V Architektur, ass d'Benotzung vu Registere, déi Floating Point Wäerter späicheren, erlaabt a bedingte Blocke vun Assembler Inline Inserts.
  • Nei Compiler Fändelen dobäigesat: "-fgnuc-version" fir de Versiounswäert fir "__GNUC__" an ähnlech Makroen ze setzen; "-fmacro-prefix-map = OLD = NEI" fir de Verzeechnes Präfix OLD duerch NEW a Makroen wéi "__FILE__" ze ersetzen; "-fpatchable-function-entry=N[,M]" fir eng gewëssen Unzuel vun NOP-Instruktioune virum an no dem Funktiounentréepunkt ze generéieren. Fir RISC-V
    Zousätzlech Ënnerstëtzung fir d'"-ffixed-xX", "-mcmodel=medany" an "-mcmodel=medlow" Fändelen.

  • Ënnerstëtzung bäigefüügt fir den '__attribute__((target ("Branch-Protection =..."))) Attribut, den Effekt vun deem ass ähnlech wéi d'Optioun -Branch-Schutz.
  • Op der Windows Plattform, wann Dir de Fändel "-cfguard" spezifizéiert, gëtt d'Auswiesselung vun Ausféierungsfloss Integritéitskontrollen (Control Flow Guard) fir indirekt Funktiounsuriff ëmgesat. Fir d'Schecksubstitutioun auszeschalten, kënnt Dir de "-cfguard-nochecks" Fändel oder den "__declspec (guard(nocf))" Modifikateur benotzen.
  • D'Behuele vum gnu_inline Attribut ass ähnlech wéi GCC a Fäll wou et ouni dat "extern" Schlësselwuert benotzt gëtt.
  • D'Kapazitéite verbonne mat OpenCL an CUDA Support goufen erweidert. Zousätzlech Ënnerstëtzung fir nei OpenMP 5.0 Features.
  • Eng Standardoptioun gouf zum Clang-Format Utility bäigefüügt, wat Iech erlaabt d'Versioun vum C++ Standard ze bestëmmen, dee beim Parsing an Formatéierungscode benotzt gëtt (Lescht, Auto, c++03, c++11, c++14, c++17, c++20).
  • Nei Kontrollen goufen op de statesche Analysator bäigefüügt: alpha.cplusplus.PlacementNew fir ze bestëmmen ob et genuch Späicherplatz ass, fuchsia.HandleChecker fir Leckage am Zesummenhang mat Fuchsia Handler z'entdecken, security.insecureAPI.decodeValueOfObjCType fir potenziell Pufferiwwerflëss z'entdecken wann Dir [NSCoder decodeValueOfOfObjCTypueOf benotzt] :op:].
  • Den Undefined Behavior Sanitizer (UBSan) huet seng Pointer Iwwerschwemmungskontrollen erweidert fir d'Applikatioun vun net-Null Offsets op NULL Pointer oder déi resultéierend Zousatz vun engem NULL Pointer Offset ze fangen.
  • An linter clang-ugeriicht dobäi e groussen Deel vun neie Schecken.

Haaptstrooss Innovatiounen LLVM 10.0:

  • An de Kader Attributer Nei interprozedural Optimisatiounen an Analysatoren goufen derbäigesat. Den Zoustand vun 19 verschiddenen Attributer gëtt virausgesot, dorënner 12 Attributer 12 LLVM IR a 7 abstrakt Attributer wéi Liveness.
  • Nei Matrix mathematesch Funktiounen agebaut an de Compiler bäigefüügt (Intrinsics), déi duerch effizient Vektorinstruktioune wärend der Kompiléierung ersat ginn.
  • Vill Verbesserunge goufen u Backends fir X86, AArch64, ARM, SystemZ, MIPS, AMDGPU a PowerPC Architekturen gemaach. Zousätzlech CPU Ënnerstëtzung
    Cortex-A65, Cortex-A65AE, Neoverse E1 an Neoverse N1. Fir ARMv8.1-M ass de Code Generatiounsprozess optimiséiert ginn (zum Beispill, Ënnerstëtzung fir Loops mat minimalen Overhead ass erschéngt) an Ënnerstëtzung fir Autovektoriséierung gouf mat der MVE Extensioun bäigefüügt. Verbesserte CPU MIPS Octeon Ënnerstëtzung. Fir PowerPC ass Vektoriséierung vu mathematesche Subroutine mat der MASSV (Mathematical Acceleration SubSystem) Bibliothéik aktivéiert, Code Generatioun gëtt verbessert, an Erënnerungszougang vu Loops ass optimiséiert. Fir x86 ass d'Handhabung vu Vektortypen v2i32, v4i16, v2i16, v8i8, v4i8 a v2i8 geännert ginn.

  • Verbesserte Code Generator fir WebAssembly. Zousätzlech Ënnerstëtzung fir TLS (Thread-Local Storage) an atomic.fence Uweisungen. SIMD Ënnerstëtzung ass wesentlech erweidert. WebAssembly Objektdateien hunn elo d'Fäegkeet Multi-Wäertfunktiounssignaturen ze benotzen.
  • Den Analyser gëtt benotzt wann Dir Loops veraarbecht ErënnerungSSA, wat erlaabt Iech Ofhängegkeeten tëscht verschiddene Erënnerung Operatiounen ze definéieren. MemorySSA kann d'Kompilatioun an d'Ausféierungszäit reduzéieren oder kann amplaz vun AliasSetTracker benotzt ginn ouni Leeschtungsverloscht.
  • Den LLDB Debugger huet d'Ënnerstëtzung fir den DWARF v5 Format wesentlech verbessert. Verbessert Ënnerstëtzung fir Gebai mat MinGW
    a bäigefüügt initial Fäegkeet fir Windows Ausféierbar fir ARM an ARM64 Architekturen ze debuggen. D'Beschreiwunge vun den ugebueden Optiounen bäigefüügt beim Autocomplete Input andeems Dir op Tab dréckt.

  • Erweidert LLD Linker Fäegkeeten. Verbesserte Ënnerstëtzung fir den ELF-Format, inklusiv d'ganz Kompatibilitéit vu Glob-Templates mam GNU-Linker ze garantéieren, Ënnerstëtzung fir kompriméiert Debugsektiounen ".zdebug" bäizefügen, d'PT_GNU_PROPERTY-Eegeschaft bäizefügen fir d'.note.gnu.property-Sektioun ze definéieren (kann an Zukunft benotzt ginn Linux Kernels),
    D'Modi "-z noseparate-code", "-z separate-code" an "-z separate-loadable-segments" goufen ëmgesat. Verbesserte Ënnerstëtzung fir MinGW a WebAssembly.

Source: opennet.ru

Setzt e Commentaire