Aula 20: Introdução ao LLVM IR
Objetivos
- Conhecer a infraestrutura LLVM.
- Ler e escrever LLVM IR básico.
Motivação
LLVM se tornou a plataforma de referência para pesquisa e desenvolvimento de compiladores na indústria:
- É a base de compiladores para C/C++ (Clang), Rust, Swift, Julia e muitos outros.
- Permite que engenheiros foquem em aspectos de linguagem e análises sem reimplementar back-ends para cada arquitetura.
- Serve como laboratório para técnicas avançadas de otimização e geração de código.
Conteúdo
O LLVM (Low Level Virtual Machine) é um conjunto de bibliotecas e ferramentas para construção de compiladores. Sua LLVM IR é uma linguagem intermediária em SSA, tipada e portável, usada por Clang, Rust, Swift e muitos outros.
flowchart LR
Fonte[Fonte C/Rust] --> Front[Clang/rustc]
Front --> IR[LLVM IR]
IR --> Opt[opt passes]
Opt --> IR2[IR otimizada]
IR2 --> llc[llc]
llc --> Asm[Assembly .s]
Anatomia da LLVM IR
É um Assembly portável, tipado e SSA. - Tipos: i32 (inteiro 32 bits), float, ptr (ponteiro), <4 x float> (vetor SIMD). - Registradores Virtuais: Infinitos, começam com %. %1, %a. - Sintaxe:
define i32 @fatorial(i32 %n) {
entry:
%cmp = icmp eq i32 %n, 0
br i1 %cmp, label %base, label %recurse
base:
ret i32 1
recurse:
%sub = sub i32 %n, 1
%call = call i32 @fatorial(i32 %sub)
%res = mul i32 %n, %call
ret i32 %res
}O Pipeline LLVM
- Frontend (Clang, Rustc): Fonte \(\to\) LLVM IR.
- Optimizer (opt): LLVM IR \(\to\) LLVM IR (melhorada). Passadas como
-mem2reg,-instcombine. - Backend (llc): LLVM IR \(\to\) Assembly Nativo (.s) ou Objeto (.o).
Resumo
- LLVM IR: SSA, tipada, registradores virtuais (
%), funções e blocos nomeados. Permite otimizações e geração de código para várias arquiteturas. - Pipeline: Frontend → IR → opt (passes) → llc → assembly/objeto.
Referências
- Aho et al. (2006); Cooper & Torczon (2011). Documentação oficial: llvm.org.
Materiais da aula
Última atualização: 08/03/2026