Compreender na prática o conceito de representação intermediária (IR) no processo de compilação, utilizando o LLVM IR para observar como um código em C é transformado em uma representação abstrata independente de máquina. Esta atividade permite também visualizar o uso de variáveis SSA, blocos básicos, instruções de controle e otimizações no nível de IR.
O aluno deve enviar os arquivos abaixo via Google Classroom (não envie um .zip
, mas suba os arquivos separadamente):
operacoes.c
– código-fonte originaloperacoes.ll
– IR gerado da versão originaloperacoes_mod.c
– código-fonte modificadooperacoes_mod.ll
– IR da versão modificadaoperacoes_opt.ll
– IR otimizado com opt -O2
respostas.md
ou respostas.pdf
– respostas às perguntas da atividadeVerifique se clang
e opt
estão instalados:
clang --version
opt --version
Se necessário, instale no Linux com:
sudo apt install clang llvm
Para outros SOs, vide https://llvm.org.
operacoes.c
com o seguinte conteúdo:#include <stdio.h>
int soma(int a, int b) {
return a + b;
}
int multiplica(int x, int y) {
return x * y;
}
int calcula(int valor) {
if (valor > 10) {
return multiplica(valor, 2);
} else {
return soma(valor, 5);
}
}
int main() {
int resultado = calcula(7);
printf("Resultado: %d\n", resultado);
return 0;
}
clang -S -emit-llvm operacoes.c -o operacoes.ll
operacoes.ll
e responda às perguntas a seguir em um arquivo respostas.md
ou respostas.pdf
.soma
, multiplica
e calcula
em IR?if (valor > 10)
?operacoes_mod.c
com alterações. Por exemplo (apenas para dar uma ideia, faça alterações como desejar, exceto na função calcula
):#include <stdio.h>
int soma(int a, int b) {
return a + b;
}
int multiplica(int x, int y) {
return x * y;
}
int divide(int x, int y) {
if (y == 0) return 0;
return x / y;
}
int calcula(int valor) {
int temp = soma(valor, 3);
if (temp % 2 == 0) {
return multiplica(temp, 4);
} else {
return divide(temp, 2);
}
}
int main() {
int resultado = calcula(5);
printf("Resultado: %d\n", resultado);
return 0;
}
clang -S -emit-llvm operacoes_mod.c -o operacoes_mod.ll
operacoes.ll
e responda as questões abaixo.if (temp % 2 == 0)
aparece no IR?%
(módulo) é representado no LLVM IR?opt
opt -O2 operacoes.ll -S -o operacoes_opt.ll
main
após a otimização?Nesta etapa, você irá gerar uma representação gráfica do fluxo de controle da função calcula
usando o opt
com a opção -dot-cfg
. Esse recurso gera arquivos .dot
que podem ser visualizados.
.dot
:opt -dot-cfg operacoes_mod.ll -disable-output
.dot
(um por função) com nomes como cfg.calcula.dot
. Para visualizar, use ferramentas como xdot
(no Linux) ou converta para imagem com Graphviz
.calcula
?if (temp % 2 == 0)
?