LLVM

LLVM har blivit ett paraplyprojekt som innehåller flera komponenter.

Front endsEdit

LLVM skrevs ursprungligen för att ersätta den befintliga kodgeneratorn i GCC-stacken, och många av GCC:s front ends har modifierats för att fungera med den, vilket resulterade i den numera nedlagda LLVM-GCC-sviten. Modifieringarna innebär i allmänhet ett IR-steg från GIMPLE till LLVM så att LLVM:s optimerare och codegen kan användas i stället för GCC:s GIMPLE-system. Apple var en betydande användare av LLVM-GCC genom Xcode 4.x (2013). Denna användning av GCC-frontend ansågs mestadels vara en tillfällig åtgärd, men i och med tillkomsten av Clang och fördelarna med LLVM och Clangs moderna och modulära kodbas (samt kompileringshastighet) är den mestadels föråldrad.

LLVM stöder för närvarande kompilering av Ada, C, C++, D, Delphi, Fortran, Haskell, Julia, Objective-C, Rust och Swift med hjälp av olika frontend.

Det utbredda intresset för LLVM har lett till flera insatser för att utveckla nya frontend för en rad olika språk. Den som har fått mest uppmärksamhet är Clang, en ny kompilator med stöd för C, C++ och Objective-C. Clang, som främst stöds av Apple, syftar till att ersätta kompilatorn C/Objective-C i GCC-systemet med ett system som är lättare att integrera med integrerade utvecklingsmiljöer (IDE) och som har ett bredare stöd för multithreading. Stöd för OpenMP-direktiv har ingått i Clang sedan version 3.8.

Outrechts Haskellkompilator kan generera kod för LLVM. Även om generatorn befinner sig i ett tidigt utvecklingsskede har den i många fall varit effektivare än C-kodgeneratorn. Det finns en Glasgow Haskell Compiler (GHC) backend som använder LLVM och som uppnår en 30 % snabbare kompilering av den kompilerade koden i förhållande till kompilering av inhemsk kod via GHC eller generering av C-kod följt av kompilering, vilket bara saknar en av de många optimeringstekniker som implementeras av GHC.

Många andra komponenter befinner sig i olika stadier av utveckling, inklusive, men inte begränsat till, Rust-kompilatorn, en Java bytecode front end, en Common Intermediate Language (CIL) front end, MacRuby-implementeringen av Ruby 1.9, olika front ends för Standard ML, och en ny registerallokering med grafisk färgning.

Intermediate representationEdit

LLVM IR används t.ex, av radeonsi och llvmpipe. Båda är en del av Mesa 3D.

Kärnan i LLVM är intermediate representation (IR), ett programmeringsspråk på låg nivå som liknar assembler. IR är en starkt typad RISC-instruktionsuppsättning (reduced instruction set computing) som abstraherar de flesta detaljerna i målet. Till exempel abstraheras anropskonventionen genom call- och ret-instruktioner med explicita argument. I stället för en fast uppsättning register använder IR också en oändlig uppsättning temporära enheter av formen %0, %1 osv. LLVM stöder tre likvärdiga former av IR: ett mänskligt läsbart assemblerformat, ett format i minnet som lämpar sig för frontends och ett tätt bitkodformat för serialisering. Ett enkelt ”Hello, world!”-program i IR-format:

@.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}

De många olika konventioner som används och funktioner som tillhandahålls av olika mål innebär att LLVM inte verkligen kan producera en måloberoende IR och återanpassa den utan att bryta mot vissa etablerade regler. Exempel på målberoende utöver vad som uttryckligen nämns i dokumentationen finns i ett förslag från 2011 om ”wordcode”, en helt måloberoende variant av LLVM IR avsedd för distribution på nätet. Ett mer praktiskt exempel är PNaCl.

BaksidorRedigera

I version 3.4 stöder LLVM många instruktionsuppsättningar, inklusive ARM, Qualcomm Hexagon, MIPS, Nvidia Parallel Thread Execution (PTX; kallas NVPTX i LLVM-dokumentationen), PowerPC, AMD TeraScale, AMD Graphics Core Next (GCN), SPARC, z/Architecture (kallas SystemZ i LLVM-dokumentationen), x86, x86-64 och XCore. Vissa funktioner är inte tillgängliga på vissa plattformar. De flesta funktioner finns för x86, x86-64, z/Architecture, ARM och PowerPC. RISC-V stöds från och med version 7. Tidigare stödde LLVM även helt eller delvis andra backends, bland annat C backend, Cell SPU, mblaze (MicroBlaze), AMD R600, DEC/Compaq Alpha (Alpha AXP) och Nios2, men de flesta av dessa hårdvaror är till största delen föråldrade och LLVM-stödet och -underhållet för dem kunde inte motiveras.

LLVM stöder också WebAssembly som mål, vilket gör det möjligt för kompilerade program att köras i WebAssembly-aktiverade miljöer som Google Chrome/Cromium, Firefox, Microsoft Edge, Apple Safari eller WAVM. LLVM-kompilatorer som är kompatibla med WebAssembly stöder vanligtvis mestadels oförändrad källkod skriven i C, C++, D, Rust, Nim, Kotlin och flera andra språk.

Det delprojektet LLVM-maskinkod (MC) är LLVM:s ramverk för översättning av maskininstruktioner mellan textform och maskinkod. Tidigare förlitade sig LLVM på systemets assembler, eller en assembler som tillhandahålls av en verktygskedja, för att översätta assembler till maskinkod. LLVM MC:s integrerade assembler stöder de flesta LLVM-mål, inklusive x86, x86-64, ARM och ARM64. För vissa mål, inklusive de olika MIPS-instruktionsuppsättningarna, är stöd för integrerad assembler användbart men fortfarande i betastadiet.

LinkerEdit

Tillprojektet lld är ett försök att utveckla en inbyggd, plattformsoberoende linker för LLVM. lld syftar till att avlägsna beroendet av en linker från en tredje part. I maj 2017 stöder lld ELF, PE/COFF, Mach-O och WebAssembly i fallande ordning efter fullständighet. lld är snabbare än båda varianterna av GNU ld.

Till skillnad från GNU linkers har lld inbyggt stöd för länktidsoptimering. Detta gör det möjligt att generera snabbare kod eftersom det går förbi användningen av en linker-plugin, men förbjuder å andra sidan interoperabilitet med andra varianter av LTO.

C++ Standard LibraryEdit

L LLVM-projektet innehåller en implementering av C++ Standard Library som kallas libc++, dubbellicensierad under MIT-licensen och UIUC-licensen.

Sedan v9.0.0.0 har det återlicensierats till Apachelicensen 2.0 med LLVM Exceptions.

PollyEdit

Detta implementerar en svit av cache-locality-optimeringar samt auto-parallelism och vektorisering med hjälp av en polyedermodell.

DebuggerEdit

Huvudartikel: LLDB (debugger)

Lämna ett svar

Din e-postadress kommer inte publiceras.