Assignment 1: Backend organization and the AVR architecture

This assignment introduces the compilation flow and organization of a compiler backend. It is split into three parts (Part 1a, Part 1b, and Part 1c), each of which is graded by a quiz on the OnCourse website.

The initial code for this assignment is already in your home directory on the server. Those without an account can use my AVR LLVM branch at GitHub as a starting point.

Part 1a: Compiler organization

Getting started with the compiler and try to correctly compile a blinking LED application for the AVR architecture while running into some typical problems. Introduces the compilation steps, analysis of intermediate results, and linking.

Part 1b: Code generation for simple instructions

Simulating the previously compiled application to check its functional correctness. After that we analyze the generated code for inefficiencies and try to improve the quality of the compiled program.

Part 1c: Generating instruction sequences

Adding more functionality to the AVR backend, teaching LLVM to understand the __builtin_delay_cycles intrinsic from GCC so that we no-longer require a work-around to compile our example program.