Az LLVM egy több komponenst tartalmazó ernyőprojekt lett.
Front endekSzerkesztés
Az LLVM eredetileg a GCC stackben meglévő kódgenerátor helyettesítésére készült, és számos GCC front endet módosítottak, hogy működjön vele, így jött létre az azóta megszűnt LLVM-GCC csomag. A módosítások általában egy GIMPLE-ről-LLVM-re történő IR lépést foglalnak magukban, hogy a GCC GIMPLE rendszere helyett az LLVM optimalizátorok és a codegen használható legyen. Az Apple az Xcode 4.x-en keresztül (2013) az LLVM-GCC jelentős felhasználója volt. A GCC frontend ezen használata többnyire átmeneti intézkedésnek számított, de a Clang megjelenésével és az LLVM és a Clang modern és moduláris kódbázisának előnyeivel (valamint a fordítási sebességgel) nagyrészt elavult.
Az LLVM jelenleg az Ada, C, C++, D, Delphi, Fortran, Haskell, Julia, Objective-C, Rust és Swift nyelvek fordítását támogatja különböző frontendek segítségével.
Az LLVM iránti széles körű érdeklődés számos erőfeszítéshez vezetett, hogy új frontendeket fejlesszenek ki különböző nyelvekhez. A legnagyobb figyelmet a Clang kapta, egy új fordítóprogram, amely támogatja a C, C++ és Objective-C nyelveket. Az elsősorban az Apple által támogatott Clang célja, hogy a GCC rendszerben lévő C/Objective-C fordítót egy olyan rendszerrel váltsa fel, amely könnyebben integrálható az integrált fejlesztőkörnyezetekkel (IDE), és szélesebb körű támogatást nyújt a többszálúsághoz. Az OpenMP direktívák támogatása a 3.8-as kiadás óta szerepel a Clangban.
Az Utrecht Haskell fordító képes kódot generálni az LLVM számára. Bár a generátor a fejlesztés korai szakaszában van, sok esetben hatékonyabbnak bizonyult, mint a C kódgenerátor. Létezik egy LLVM-et használó Glasgow Haskell Compiler (GHC) háttértár, amely 30%-os sebességnövekedést ér el a lefordított kódban a GHC segítségével történő natív kódfordításhoz vagy a fordítást követő C kódgeneráláshoz képest, ami csak egyet hagy ki a GHC által megvalósított számos optimalizálási technika közül.
Sok más komponens is a fejlesztés különböző szakaszaiban van, többek között a Rust fordító, egy Java bytecode frontend, egy Common Intermediate Language (CIL) frontend, a Ruby 1 MacRuby implementációja.9, különböző frontendek a Standard ML-hez, és egy új gráfszínező regiszterallokátor.
Intermediate representationEdit
A LLVM magja az intermediate representation (IR), egy assemblyhez hasonló alacsony szintű programozási nyelv. Az IR egy erősen tipizált RISC (Reduced Instruction Set Computing) utasításkészlet, amely absztrahálja a célprogram legtöbb részletét. Például a hívási konvenciót a call és ret utasítások absztrahálják explicit argumentumokkal. Továbbá az IR a regiszterek rögzített halmaza helyett a %0, %1 stb. formájú temporárisok végtelen halmazát használja. Az LLVM az IR három egyenértékű formáját támogatja: egy ember által olvasható assembly formátumot, egy frontendekhez alkalmas memórián belüli formátumot és egy sűrű bitkód formátumot a szerializáláshoz. Egy egyszerű “Hello, world!” program IR formátumban:
@.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}
A sokféle használt konvenció és a különböző célprogramok által biztosított funkciók miatt az LLVM nem tud igazán célprogram-független IR-t előállítani és újracélozni anélkül, hogy megszegne néhány bevett szabályt. A dokumentációban kifejezetten említetteken túli céltól való függőségre találunk példát a 2011-es “wordcode” javaslatban, amely az LLVM IR teljesen céltól független, online terjesztésre szánt változata. Egy gyakorlatiasabb példa a PNaCl.
Back endsEdit
A 3. verzióban.4 az LLVM számos utasításkészletet támogat, köztük az ARM, Qualcomm Hexagon, MIPS, Nvidia Parallel Thread Execution (PTX; az LLVM dokumentációban NVPTX-nek nevezik), PowerPC, AMD TeraScale, AMD Graphics Core Next (GCN), SPARC, z/Architecture (az LLVM dokumentációban SystemZ-nek nevezik), x86, x86-64 és XCore. Néhány funkció nem érhető el egyes platformokon. A legtöbb funkció jelen van az x86, x86-64, z/Architecture, ARM és PowerPC platformokon. A RISC-V a 7. verziótól kezdve támogatott. A múltban az LLVM teljesen vagy részben más háttértárakat is támogatott, beleértve a C háttértárat, Cell SPU-t, mblaze-t (MicroBlaze), AMD R600, DEC/Compaq Alpha (Alpha AXP) és Nios2-t, de ezen hardverek többsége többnyire elavult, és az LLVM támogatása és karbantartása nem volt indokolt.
Az LLVM célként támogatja a WebAssembly-t is, így a lefordított programok olyan WebAssembly-képes környezetekben is futtathatók, mint a Google Chrome / Chromium, Firefox, Microsoft Edge, Apple Safari vagy WAVM. Az LLVM-kompatibilis WebAssembly fordítóprogramok jellemzően támogatják a C, C++, D, Rust, Nim, Kotlin és számos más nyelven írt, többnyire változatlan forráskódot.
A LLVM gépi kód (MC) alprojekt az LLVM keretrendszere a gépi utasítások szöveges formák és gépi kód közötti fordítására. Korábban az LLVM a rendszer asszemblerére vagy egy toolchain által biztosított asszemblerre támaszkodott az assembly gépi kódra fordításában. Az LLVM MC integrált asszemblere támogatja a legtöbb LLVM célprogramot, beleértve az x86, x86-64, ARM és ARM64 célokat. Egyes célokhoz, beleértve a különböző MIPS utasításkészleteket, az integrált assembly támogatás használható, de még béta fázisban van.
LinkerEdit
Az lld alprojekt egy beépített, platformfüggetlen linker kifejlesztésére tesz kísérletet az LLVM számára. lld célja, hogy megszüntesse a harmadik féltől származó linkertől való függést. 2017 májusától az lld támogatja az ELF, PE/COFF, Mach-O és WebAssembly rendszereket a teljesség csökkenő sorrendjében. Az lld gyorsabb, mint a GNU ld mindkét változata.
A GNU linkerekkel ellentétben az lld beépített támogatással rendelkezik a linkidő optimalizáláshoz. Ez gyorsabb kódgenerálást tesz lehetővé, mivel megkerüli a linker plugin használatát, másrészt viszont tiltja az interoperabilitást az lld más ízléseivel.
C++ Standard LibraryEdit
Az LLVM projekt tartalmazza a C++ Standard Library libc++ nevű implementációját, amely kettős licenc alatt áll a MIT licenc és az UIUC licenc alatt.
A v9.0.0 óta újra licencelték az Apache License 2.0 LLVM kivételekkel.
PollyEdit
Ez egy sor cache-lokalitás optimalizálást, valamint automatikus párhuzamosítást és vektorizálást valósít meg egy poliéderes modell segítségével.