Writing an LLVM backend
  1. Introduction
  2. Writing a backend
    1. Machine backends
      1. Outline
      2. Implementation details
    2. Language backends
  3. Related reading material

Written by Misha Brukman

Introduction

This document describes techniques for writing backends for LLVM which convert the LLVM representation to machine assembly code or other languages.

Writing a backend
Machine backends
Outline

In general, you want to follow the format of SPARC, X86 or PowerPC (in lib/Target). SPARC is the simplest backend, and is RISC, so if you're working on a RISC target, it is a good one to start with.

To create a static compiler (one that emits text assembly), you need to implement the following:

Implementation details
Language backends

For now, just take a look at lib/Target/CBackend for an example of how the C backend is written.

Files to create/modify

To actually create your backend, you need to create and modify a few files. Here, the absolute minimum will be discussed. To actually use LLVM's target independent codegenerator, you must implement extra things.

First of all, you should create a subdirectory under lib/Target, which will hold all the files related to your target. Let's assume that our target is called, "Dummy", we would create the directory lib/Target/Dummy.

In this new directory, you should put a Makefile. You can probably copy one from another target and modify it. It should at least contain the LEVEL, LIBRARYNAME and TARGET variables, and then include $(LEVEL)/Makefile.common. Be careful to give the library the correct name, it must be named LLVMDummy (see the MIPS target, for example). Alternatively, you can split the library into LLVMDummyCodeGen and LLVMDummyAsmPrinter, the latter of which should be implemented in a subdirectory below lib/Target/Dummy (see the PowerPC target, for example).

Note that these two naming schemes are hardcoded into llvm-config. Using any other naming scheme will confuse llvm-config and produce lots of (seemingly unrelated) linker errors when linking llc.

To make your target actually do something, you need to implement a subclass of TargetMachine. This implementation should typically be in the file lib/Target/DummyTargetMachine.cpp, but any file in the lib/Target directory will be built and should work. To use LLVM's target independent code generator, you should create a subclass of LLVMTargetMachine. This is what all current machine backends do. To create a target from scratch, create a subclass of TargetMachine. This is what the current language backends do.

To get LLVM to actually build and link your target, you also need to add it to the TARGETS_TO_BUILD variable. To do this, you need to modify the configure script to know about your target when parsing the --enable-targets option. Search the configure script for TARGETS_TO_BUILD, add your target to the lists there (some creativity required) and then reconfigure. Alternatively, you can change autotools/configure.ac and regenerate configure by running ./autoconf/AutoRegen.sh.

Related reading material

Valid CSS! Valid HTML 4.01! Misha Brukman
The LLVM Compiler Infrastructure
Last modified: $Date$