Az LLVM szigorú típusrendszerrel rendelkezik, ami miatt könnyebben olvasható a szokásos assembly nyelveknél, és lehetővé tesz számos program-analízist és transzformációt.
A nyelvben hasaználható egész típusok nevei iN alakúak, ahol N egy pozitív egész szám, amely a típus által reprezentálható egész számok bitszélességét jelenti. Például: i1 egy bites, i32 egy 32 bites egész szám. Az előjeles és előjel nélküli típusok nincsenek megkülönböztetve, ezt az értékekkel végzett műveletek határozzák meg.
Lebegőpontos számok ábrázolására az alábbi, rögzített méretű típusok állnak rendelkezésre:
Típus | Leírás |
---|---|
half | 16 bites lebegőpontos érték |
float | 32 bites lebegőpontos érték |
double | 64 bites lebegőpontos érték |
fp128 | 128 bites lebegőpontos érték (112 bites mantisszával) |
x86_fp80 | 80 bites lebegőpontos érték |
ppc_fp128 | 128 bites lebegőpontos érték (két 64 bites) |
Mutató típus bármely típusból képezhető egy '*' hozzáadásával. Például: i32* egy mutató egy 4 bites egész számra. Az indirekció lehet többszörös (i32**** is megengedett).
Az üres típus (void) használható visszatérési értékek hiányának jelzésére. Ez a típus méret nélküli. A label típus a kódban elhelyezett címkék típusának azonosítására. Ez azért fontos, mert a vezérlést megvalósító, például ugró utasítások ilyen típusú értékekkel tudnak dolgozni.
Rögzített számú, egyforma típusú elem tárolására szolgáló típusok. Szintaxis: [elemek száma x elemek típusa]. Például: a [40 x i32] negyven darab 4 bites egész tárolására használható tömb típusa.
A tömbhöz hasonló típuskonstrukció, de valójában nem számítanak összetett típusoknak. SIMD műveletek operandusait és eredményeit tárolják bennük. Szintaxis: <elemek száma x elemek típusa>. Például: <8 x float> nyolc darab lebegőpontos szám tárolására használható vektor típusa.
A C nyelv struktúráihoz hasonló, akár eltérő típusú adattagok együttes tárolására alkalmazható típusok. Szintaxis: { típus1, típus2, ... }. Például: { i8, i32, double* } egy 8 és egy 32 bites egész számot, illetve egy 64 lebegőpontos szám mutatóját tartalmazhatja.
A nyelvben típuskonverziót különböző utasítások segítségével végezhetünk.
Szintaxis: <eredmény> = <utasítás-név> <régi-típus> <érték> to <új-típus>
Utasítás neve | Leírás |
---|---|
trunc | Egész típusok közötti konverzió, egy nagyobb bitszélességű típusból kisebbre. A felső bitek levágásra kerülnek. |
zext | Egész típusok közötti konverzió, egy kisebb bitszélességű típusból nagyobbra. Az érték felső bitjei nullákkal lesznek kiegészítve. |
sext | Egész típusok közötti konverzió, egy kisebb bitszélességű típusból nagyobbra. Az érték kiegészítése során figyelembe veszi az előjelet. |
fptrunc | Lebegőpontos típusok közötti konverzió, egy nagyobb bitszélességű típusból kisebbre. |
fpext | Lebegőpontos típusok közötti konverzió, egy kisebb bitszélességű típusból nagyobbra. |
fptoui | Lebegőpontos típus átalakítása előjel nélküli egész típusra (a nulla írányába kerekítve). |
fptosi | Lebegőpontos típus átalakítása előjeles egész típusra (a nulla írányába kerekítve). |
uitofp | Előjel nélküli egész típus átalakítása lebegőpontos típusra. |
sitofp | Előjeles egész típus átalakítása lebegőpontos típusra. |
ptrtoint | Mutató típus átalakítása egész típusra. |
inttoptr | Egész típus átalakítása mutató típusra. |
bitcast | Konverzió típusok között a bitek megváltoztatása nélkül. |
A globális konstansok nevei @ jellel kezdődnek, a lokális változók (regiszterek) nevei pedig % jellel. Az egyetlen operátor az értékadás: =. Egy változó csak egyszer állhat a bal oldalán, ezt nevezik SSA (static single assignment - statikus egyszeri hozzárendelés) formának.
A nyelv tem támogatja az imperatív nyelvekben jellemző további operátorokat és aritmetikai kifejezéseket, ezek helyett a megfelelő utasítások használatára van szükség.