• Nenhum resultado encontrado

O conjunto de testes efetuados não foi muito extenso. Para cada teste são apresentados os resultados da compilação (frontend e backend) e os resultados obtidos na simulação do micro processador. Nesta primeira versão do compilador os testes foram apenas efetuados na simulação do microcontrolador com o objetivo de validar a sua implementação. O primeiro teste efetuado foi um teste simples em que se faz a soma de dois números. Na Figura 5.1 está representado o código C para este teste.

O Clang foi utilizado como frontend para gerar o código intermédio LLVM. Na Figura 5.2 apresenta-se o código LLVM IR gerado pelo Clang a partir do código C da Figura 5.1.

Figura 5.2- Código LLVM IR gerado a partir do código c da figura 5.1

Utilizando o gerador de código do LLVM definindo como backend o M2up o código LLVM IR foi transformado no código assembly da Figura 5.3.

Figura 5.3-Código Assembly gerado pelo backend M2up do LLVM

O assemblador do M2up foi utilizado para gerar o código binário a partir do código assembly para se efetuar o teste na simulação do micro.

Figura 5.4-Resultado obtido na simulação do primeiro caso de teste. A branco os sinais de clock e reset, a azul o opcode das instruções, a verde os registos e a amarelo a memória.

Na Figura 5.4 podem ser observados os resultados da simulação deste primeiro teste. Nesta simulação podem ser observados os valores dos opcodes das instruções que foram executadas, o valor dos registos (em decimal com sinal) e as linhas de memória (em hexadecimal) que são afetadas pela execução do teste, o sinal de clock e o sinal de

reset. Os valores das variáveis a, b e c do código da Figura 5.1 são todas guardadas em

memória e verifica-se que o resultado da soma é o correto.

O segundo teste efetuado foi um código para testar o funcionamento dos saltos condicionais recorrendo para isso a uma condição if-else. O código testado foi o seguinte:

Na Figura 5.6 apresenta-se o código LLVM IR gerado pelo Clang a partir do código C da Figura 5.5.

Figura 5.6- Código LLVM IR gerado a partir do código C da Figura 5.5

Utilizando o gerador de código do LLVM definindo como backend o M2up o código LLVM IR foi transformado no código assembly da Figura 5.7.

O assemblador do M2up foi utilizado para gerar o código binário a partir do código assembly para se efetuar a simulação. A simulação da Figura 5.8 permite visualizar os mesmos dados que a simulação do primeiro teste mas acrescenta uma nova linha com o valor das flags do registo PSW. O código C da Figura 5.5 apresenta apenas uma variável, a variável e, como pode ser observado na última linha da simulação que apresenta os dados relativos à memória a variável e tem inicialmente o valor 6. Analisando o código C percebe-se que no final do programa a variável e deverá ter o valor 4 porque a condição do if é falsa e observando a linha de memória verifica-se que isto acontece. O registo R5 contém o valor de retorno da função e como o retorno da função é o valor da variável e também este fica com o valor 4. A observação do registo PSW permite perceber que as alterações nas flags foram efetuadas corretamente para permitir que o salto condicional fosse efetuado corretamente.

Figura 5.8-Resultado obtido na simulação do segundo caso de teste. A branco os sinais de clock e reset, a azul o

opcode das instruções, a verde os registos e a amarelo a memória e a lilás as flags do registo PSW

O terceiro caso de teste, testa as funções e convenções de chamada. O código utilizado foi o seguinte:

Figura 5.9-Código c para do terceiro teste

Na Figura 5.10 apresenta-se o código LLVM IR gerado pelo Clang a partir do código c da Figura 5.9. Na Figura 5.11 e na Figura 5.12 apresenta-se o código assembly M2up para as funções main() e soma().

Figura 5.11-Código assembly M2up gerado para a função main a partir do código LLVM IR da Figura 5.10

Figura 5.12-Código assembly M2up gerado para a função soma a partir do código LLVM IR da Figura 5.10

O assemblador do M2up foi utilizado para gerar o código binário a partir do código assembly para se efetuar a simulação. Na Figura 5.13 pode ser observado o resultado da simulação deste terceiro teste. Pela simulação verifica-se que a chamada da função soma ocorreu corretamente assim como o retorno para a função main. Os

argumentos foram passados corretamente à função soma e verifica-se que o resultado obtido após a soma dos números é o correto.

Figura 5.13-Resultado obtido na simulação do terceiro caso de teste. A branco os sinais de clock e reset, a azul o opcode das instruções, a verde os registos e a amarelo a memória.

5.3 Resumo

Com objetivo de validar a implementação foi realizado um conjunto de testes simples. Foram realizados três casos de teste, o primeiro testando um código que somava duas variáveis, o segundo para testar os saltos condicionais recorrendo a uma condição if-else e o terceiro para testar a chamada e retorno de uma função. Os resultados da compilação e simulação no micro foram apresentados para cada um dos testes verificando-se que estes executavam corretamente.

6 Conclusão

O principal objetivo desta tese era dotar o microprocessador M2up de um compilador para as linguagens C e C++. Nesta tese apresentou-se o design, implementação e teste de um backend LLVM para o M2up.

O desenvolvimento deste backend teve como base a Framework de geração de código do LLVM. Esta Framework fornece um conjunto de algoritmos para a geração de código assim como um conjunto de plataformas base a partir das quais foram implementadas diversas partes do backend M2up.

Um conjunto de informações sobre a plataforma alvo o M2up, foi fornecida à Framework através de um conjunto de ficheiros de descrição TableGen e também de um conjunto de métodos específicos para lidar com algumas transformações que ainda não são possíveis de realizar através dos ficheiros de descrição.

A estrutura modular do LLVM permitiu uma fácil integração do backend M2up na infraestrutura do LLVM assim como com o frontend Clang. Esta combinação entre o

backend M2up desenvolvido e o Clang permite a geração de código assembly M2up a

partir de código fonte em linguagem C e C++.

Documentos relacionados