Documente Academic
Documente Profesional
Documente Cultură
Ernesto Hernndez-Novich
<emhn@usb.ve>
Copyright
2012
c
Componentes de LLVM
Objetivos de LLVM IR
Instrucciones LLVM IR
Sistema de Tipos
Primitivos etiqueta, void, float, integer.
Enteros con cantidad arbitraria de bits (i1, i3, i32, i64).
Punto flotante de hasta 128 bits.
Derivados apuntador, arreglo, estructura y funcin.
No hay tipos de alto nivel neutralidad.
Permite usar type casts
Para expresar lenguajes con sistemas dbiles como C.
Implantar sistemas fuertes es problema del front end.
Hello world!
Instrucciones LLVM IR
Mdulo
Contiene variables globales y funciones.
Es la unidad de compilacin o anlisis.
Funciones
Contiene argumentos y bloques bsicos.
Corresponden a las funciones de C en la prctica.
Bloque Bsico
Contiene una lista de instrucciones.
Termina con una instruccin de salto.
Instruccin
Cdigo de operacin y vector de operandos.
Todos los operandos tienen tipo asociado.
El resultado de la operacin tiene tipo asociado.
El optimizador es modular
Un programa inocente
define i32 @sum (i32 %n) {
entry: %sum = alloca i32
store i32 0, i32* %sum
%i = alloca i32
store i32 0, i32* %i
br label %lab1
lab1: %t1 = load i32* %i
%t2 = add i32 %t1, 1
%t3 = load i32* %sum
%t4 = add i32 %t2, %t3
store i32 %t2, i32* %i
store i32 %t4, i32* %sum
%t5 = icmp eq i32 %t2, %n
br i1 %t5, label %end, label %lab1
end: ret i32 %t4
}
Un programa inocente
define i32 @sum (i32 %n) {
entry: %sum = alloca i32
store i32 0, i32* %sum
%i = alloca i32
store i32 0, i32* %i
br label %lab1
lab1: %t1 = load i32* %i
%t2 = add i32 %t1, 1
%t3 = load i32* %sum
%t4 = add i32 %t2, %t3
store i32 %t2, i32* %i
store i32 %t4, i32* %sum
%t5 = icmp eq i32 %t2, %n
br i1 %t5, label %end, label %lab1
end: ret i32 %t4
}
n
X
sum = i
i=0
Hernndez-Novich (USB) LLVM Compiler Framework 2012 17 / 22
LLVM IR
Pn
i=0 i = n(n + 1)/2 Are you scared?
Hernndez-Novich (USB) LLVM Compiler Framework 2012 18 / 22
LLVM IR
Productos de LLVM
CLANG
Front-end C/C++/Objective-C
Reconocedor recursivo descendente construido a mano.
Soporte completo para C98/C99 y C++98.
Soporte casi completo para C++11
FreeBSD lo usa como compilador por defecto.
CLANG vs. GCC
Licencia BSD ms liberal que la GPL.
Cdigo fuente de CLANG es ms moderno y limpio.
Mejor soporte para CUDA, OpenCL y tecnologa similar.
En Haskell
GHC (Glasgow Haskell Compiler) puede generar cdigo va LLVM.
llvm DSL para generar cdigo LLVM desde Haskell.
synthetizer-llvm sntesis de audio en tiempo real usando LLVM.
Bibliografa