LLVM

LLVM a devenit un proiect umbrelă care conține mai multe componente.

Front endsEdit

LLVM a fost scris inițial pentru a fi un înlocuitor pentru generatorul de cod existent în stiva GCC, iar multe dintre front-end-urile GCC au fost modificate pentru a funcționa cu el, rezultând suita LLVM-GCC, acum dispărută. Modificările implică, în general, o etapă de trecere de la GIMPLE la LLVM IR, astfel încât optimizatoarele și codegenul LLVM să poată fi utilizate în locul sistemului GIMPLE al GCC. Apple a fost un utilizator important al LLVM-GCC prin Xcode 4.x (2013). Această utilizare a front-end-ului GCC a fost considerată în mare parte o măsură temporară, dar, odată cu apariția Clang și cu avantajele LLVM și ale bazei de cod moderne și modulare a Clang (precum și ale vitezei de compilare), este în mare parte depășită.

LLVM suportă în prezent compilarea de Ada, C, C++, D, Delphi, Fortran, Haskell, Julia, Objective-C, Rust și Swift folosind diverse front-end-uri.

Interesul larg răspândit pentru LLVM a dus la mai multe eforturi de a dezvolta noi front-end-uri pentru o varietate de limbaje. Cel care a primit cea mai mare atenție este Clang, un nou compilator care acceptă C, C++ și Objective-C. Susținut în principal de Apple, Clang are ca scop înlocuirea compilatorului C/Objective-C din sistemul GCC cu un sistem care să se integreze mai ușor cu mediile de dezvoltare integrate (IDE) și să aibă un suport mai larg pentru multithreading. Suportul pentru directivele OpenMP a fost inclus în Clang începând cu versiunea 3.8.

Compilatorul Utrecht Haskell poate genera cod pentru LLVM. Deși generatorul se află în stadii incipiente de dezvoltare, în multe cazuri a fost mai eficient decât generatorul de cod C. Există un backend al compilatorului Glasgow Haskell (GHC) care utilizează LLVM și care realizează o accelerare de 30% a codului compilat în raport cu compilarea codului nativ prin GHC sau cu generarea de cod C urmată de compilare, lipsind doar una dintre numeroasele tehnici de optimizare implementate de GHC.

Multe alte componente se află în diverse stadii de dezvoltare, inclusiv, dar fără a se limita la, compilatorul Rust, un front-end Java bytecode, un front-end Common Intermediate Language (CIL), implementarea MacRuby a Ruby 1.9, diverse front-end-uri pentru Standard ML și un nou alocator de registre de colorare grafică.

Reprezentare intermediarăEdit

LLVM IR este utilizat de ex, de către radeonsi și de către llvmpipe. Ambele fac parte din Mesa 3D.

Nucleul de bază al LLVM este reprezentarea intermediară (IR), un limbaj de programare de nivel scăzut, similar cu asamblarea. IR este un set de instrucțiuni RISC (reduced instruction set computing) puternic tipizat, care face abstracție de majoritatea detaliilor de la țintă. De exemplu, convenția de apelare este abstractizată prin instrucțiuni call și ret cu argumente explicite. De asemenea, în loc de un set fix de registre, IR utilizează un set infinit de temporizări de forma %0, %1 etc. LLVM suportă trei forme echivalente de RI: un format de asamblare lizibil pentru oameni, un format în memorie potrivit pentru interfețe frontale și un format de cod bit dens pentru serializare. Un program simplu „Hello, world!” în format IR:

@.str = internal constant c"hello, world\0A\00"declare i32 @printf(i8*, ...)define i32 @main(i32 %argc, i8** %argv) nounwind {entry: %tmp1 = getelementptr , * @.str, i32 0, i32 0 %tmp2 = call i32 (i8*, ...) @printf( i8* %tmp1 ) nounwind ret i32 0}

Multe convenții diferite utilizate și caracteristici furnizate de diferite ținte înseamnă că LLVM nu poate produce cu adevărat un IR independent de țintă și să îl retargeteze fără a încălca unele reguli stabilite. Exemple de dependență de țintă dincolo de ceea ce este menționat în mod explicit în documentație pot fi găsite într-o propunere din 2011 pentru „wordcode”, o variantă complet independentă de țintă a IR LLVM destinată distribuției online. Un exemplu mai practic este PNaCl.

Înapoi încheieEdit

La versiunea 3.4, LLVM acceptă multe seturi de instrucțiuni, inclusiv ARM, Qualcomm Hexagon, MIPS, Nvidia Parallel Thread Execution (PTX; numit NVPTX în documentația LLVM), PowerPC, AMD TeraScale, AMD Graphics Core Next (GCN), SPARC, z/Architecture (numit SystemZ în documentația LLVM), x86, x86-64 și XCore. Unele caracteristici nu sunt disponibile pe anumite platforme. Majoritatea caracteristicilor sunt prezente pentru x86, x86-64, z/Architecture, ARM și PowerPC. RISC-V este suportat începând cu versiunea 7. În trecut, LLVM a suportat complet sau parțial și alte backend-uri, inclusiv C backend, Cell SPU, mblaze (MicroBlaze), AMD R600, DEC/Compaq Alpha (Alpha AXP) și Nios2, dar majoritatea acestor hardware-uri sunt în mare parte învechite, iar suportul și întreținerea LLVM pentru acestea nu ar putea fi justificate.

LLVM suportă, de asemenea, WebAssembly ca țintă, permițând programelor compilate să se execute în medii compatibile cu WebAssembly, cum ar fi Google Chrome / Chromium, Firefox, Microsoft Edge, Apple Safari sau WAVM. Compilatoarele WebAssembly compatibile cu LLVM suportă, de obicei, în cea mai mare parte, codul sursă nemodificat scris în C, C++, D, Rust, Nim, Kotlin și alte câteva limbaje.

Subproiectul LLVM machine code (MC) este cadrul LLVM pentru traducerea instrucțiunilor mașinii între formele textuale și codul mașinii. Anterior, LLVM se baza pe asamblorul sistemului, sau pe unul furnizat de un lanț de instrumente, pentru a traduce asamblarea în cod mașină. Asamblatorul integrat al LLVM MC suportă majoritatea țintelor LLVM, inclusiv x86, x86-64, ARM și ARM64. Pentru unele ținte, inclusiv pentru diversele seturi de instrucțiuni MIPS, suportul integrat de asamblare este utilizabil, dar se află încă în stadiul beta.

LinkerEdit

Subproiectul lld este o încercare de a dezvolta un linker integrat, independent de platformă pentru LLVM. lld urmărește să elimine dependența de un linker terț. Începând cu mai 2017, lld acceptă ELF, PE/COFF, Mach-O și WebAssembly în ordinea descrescătoare a completitudinii. lld este mai rapid decât ambele versiuni ale GNU ld.

Spre deosebire de linkerii GNU, lld are suport încorporat pentru optimizarea timpului de legătură. Acest lucru permite generarea mai rapidă a codului, deoarece ocolește utilizarea unui plugin de linker, dar, pe de altă parte, interzice interoperabilitatea cu alte versiuni ale lld.

C++ Standard LibraryEdit

Proiectul LLVM include o implementare a bibliotecii standard C++ numită libc++, cu licență dublă, sub licența MIT și licența UIUC.

De la v9.0.0, a fost relicențată la Licența Apache 2.0 cu excepții LLVM.

PollyEdit

Aceasta implementează o suită de optimizări de cache-localitate, precum și autoparalelism și vectorizare folosind un model poliedric.

DebuggerEdit

Articolul principal: LLDB (debugger)

.

Lasă un răspuns

Adresa ta de email nu va fi publicată.