LVM se stal zastřešujícím projektem, který obsahuje více komponent.
FrontendyUpravit
LVM byl původně napsán jako náhrada stávajícího generátoru kódu ve stacku GCC a mnoho frontendů GCC bylo upraveno tak, aby s ním fungovaly, což vedlo k vytvoření dnes již neexistující sady LLVM-GCC. Úpravy obecně zahrnují krok GIMPLE-to-LLVM IR, aby bylo možné používat optimalizátory LLVM a codegen místo systému GIMPLE v GCC. Společnost Apple byla významným uživatelem LLVM-GCC prostřednictvím Xcode 4.x (2013). Toto používání frontendu GCC bylo považováno většinou za dočasné opatření, ale s příchodem Clangu a výhodami LLVM a moderní a modulární kódové základny Clangu (a také rychlosti kompilace) je většinou zastaralé.
LVM v současné době podporuje kompilaci jazyků Ada, C, C++, D, Delphi, Fortran, Haskell, Julia, Objective-C, Rust a Swift pomocí různých frontendů.
Široký zájem o LLVM vedl k několika snahám o vývoj nových frontendů pro různé jazyky. Největší pozornost si získal Clang, nový překladač podporující jazyky C, C++ a Objective-C. Clang, podporovaný především společností Apple, má za cíl nahradit kompilátor C/Objective-C v systému GCC systémem, který je snadněji integrovatelný s integrovanými vývojovými prostředími (IDE) a má širší podporu multithreadingu. Podpora direktiv OpenMP je v Clangu obsažena od verze 3.8.
Kompilátor Utrecht Haskell dokáže generovat kód pro LLVM. Ačkoli je tento generátor v rané fázi vývoje, v mnoha případech byl efektivnější než generátor kódu v jazyce C. Existuje backend Glasgow Haskell Compiler (GHC) využívající LLVM, který dosahuje 30% zrychlení kompilovaného kódu oproti nativnímu kódu kompilovanému pomocí GHC nebo generování kódu C s následnou kompilací, přičemž chybí pouze jedna z mnoha optimalizačních technik implementovaných GHC.
Mnoho dalších komponent je v různých fázích vývoje, mimo jiné kompilátor jazyka Rust, frontend pro bajtový kód jazyka Java, frontend pro společný zprostředkující jazyk (CIL), implementace jazyka Ruby 1 v jazyce MacRuby.9, různé front endy pro Standard ML a nový alokátor registrů pro barvení grafů.
Meziproduktová reprezentaceEdit
Jádrem LLVM je intermediální reprezentace (IR), nízkoúrovňový programovací jazyk podobný assembleru. IR je silně typovaná instrukční sada RISC (reduced instruction set computing), která abstrahuje většinu detailů cíle. Například konvence volání je abstrahována pomocí instrukcí call a ret s explicitními argumenty. Také místo pevné množiny registrů používá IR nekonečnou množinu dočasných registrů ve tvaru %0, %1 atd. LLVM podporuje tři ekvivalentní formy IR: lidsky čitelný formát assembleru, formát v paměti vhodný pro frontendy a formát hustého bitového kódu pro serializaci. Jednoduchý program „Hello, world!“ ve formátu 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}
Mnoho různých používaných konvencí a funkcí poskytovaných různými cíli znamená, že LLVM nemůže skutečně vytvořit IR nezávislý na cíli a retargetovat jej bez porušení některých zavedených pravidel. Příklady závislosti na cíli nad rámec toho, co je výslovně uvedeno v dokumentaci, lze nalézt v návrhu „wordcode“ z roku 2011, což je plně na cíli nezávislá varianta IR LLVM určená pro online distribuci. Praktičtějším příkladem je PNaCl.
Back endsEdit
U verze 3.4 podporuje LLVM mnoho instrukčních sad, včetně ARM, Qualcomm Hexagon, MIPS, Nvidia Parallel Thread Execution (PTX; v dokumentaci LLVM se nazývá NVPTX), PowerPC, AMD TeraScale, AMD Graphics Core Next (GCN), SPARC, z/Architecture (v dokumentaci LLVM se nazývá SystemZ), x86, x86-64 a XCore. Některé funkce nejsou na některých platformách dostupné. Většina funkcí je přítomna pro x86, x86-64, z/Architekturu, ARM a PowerPC. RISC-V je podporován od verze 7. V minulosti LLVM plně nebo částečně podporovalo i další backendy, včetně backendu C, Cell SPU, mblaze (MicroBlaze), AMD R600, DEC/Compaq Alpha (Alpha AXP) a Nios2, ale většina tohoto hardwaru je většinou zastaralá a podpora a údržba LLVM pro něj nemohla být opodstatněná.
LVM také podporuje WebAssembly jako cíl, což umožňuje spouštět zkompilované programy v prostředích podporujících WebAssembly, jako jsou Google Chrome / Chromium, Firefox, Microsoft Edge, Apple Safari nebo WAVM. Kompilátory WebAssembly kompatibilní s LLVM obvykle podporují většinou nemodifikovaný zdrojový kód napsaný v jazycích C, C++, D, Rust, Nim, Kotlin a několika dalších jazycích.
Podprojekt LLVM machine code (MC) je rámec LLVM pro překlad strojových instrukcí mezi textovou formou a strojovým kódem. Dříve se LLVM při překladu assembleru do strojového kódu spoléhal na systémový assembler nebo na assembler poskytovaný řetězcem nástrojů. Integrovaný assembler LLVM MC podporuje většinu cílů LLVM, včetně x86, x86-64, ARM a ARM64. Pro některé cíle, včetně různých instrukčních sad MIPS, je integrovaná podpora assembleru použitelná, ale stále je ve fázi beta verze.
LinkerEdit
Podprojekt lld je pokusem o vývoj vestavěného, na platformě nezávislého linkeru pro LLVM. lld má za cíl odstranit závislost na linkeru třetí strany. Od května 2017 lld podporuje ELF, PE/COFF, Mach-O a WebAssembly v sestupném pořadí podle úplnosti. lld je rychlejší než obě varianty GNU ld.
Na rozdíl od linkerů GNU má lld vestavěnou podporu optimalizace v době linkování. To umožňuje rychlejší generování kódu, protože se obejde bez použití zásuvného modulu linkeru, ale na druhou stranu zakazuje interoperabilitu s ostatními příchutěmi lld.
Standardní knihovna C++Edit
Projekt LLVM obsahuje implementaci standardní knihovny C++ s názvem libc++, která je pod dvojí licencí MIT License a licencí UIUC.
Od verze 9.0.0 byla přelicencována na licenci Apache 2.0 s výjimkami LLVM.
PollyEdit
Tato implementuje sadu optimalizací pro lokalizaci mezipaměti a také automatický paralelizmus a vektorizaci pomocí polyedrického modelu.