1d80f118eSChris Lattner======================================== 2d80f118eSChris Lattner Kaleidoscope: Compiling to Object Code 3d80f118eSChris Lattner======================================== 4d80f118eSChris Lattner 5d80f118eSChris Lattner.. contents:: 6d80f118eSChris Lattner :local: 7d80f118eSChris Lattner 8d80f118eSChris LattnerChapter 8 Introduction 9d80f118eSChris Lattner====================== 10d80f118eSChris Lattner 11d80f118eSChris LattnerWelcome to Chapter 8 of the "`Implementing a language with LLVM 12d80f118eSChris Lattner<index.html>`_" tutorial. This chapter describes how to compile our 13d80f118eSChris Lattnerlanguage down to object files. 14d80f118eSChris Lattner 15d80f118eSChris LattnerChoosing a target 16d80f118eSChris Lattner================= 17d80f118eSChris Lattner 18d80f118eSChris LattnerLLVM has native support for cross-compilation. You can compile to the 19d80f118eSChris Lattnerarchitecture of your current machine, or just as easily compile for 20d80f118eSChris Lattnerother architectures. In this tutorial, we'll target the current 21d80f118eSChris Lattnermachine. 22d80f118eSChris Lattner 23d80f118eSChris LattnerTo specify the architecture that you want to target, we use a string 24d80f118eSChris Lattnercalled a "target triple". This takes the form 25d80f118eSChris Lattner``<arch><sub>-<vendor>-<sys>-<abi>`` (see the `cross compilation docs 26*72fd1033SSylvestre Ledru<https://clang.llvm.org/docs/CrossCompilation.html#target-triple>`_). 27d80f118eSChris Lattner 28d80f118eSChris LattnerAs an example, we can see what clang thinks is our current target 29d80f118eSChris Lattnertriple: 30d80f118eSChris Lattner 31d80f118eSChris Lattner:: 32d80f118eSChris Lattner 33d80f118eSChris Lattner $ clang --version | grep Target 34d80f118eSChris Lattner Target: x86_64-unknown-linux-gnu 35d80f118eSChris Lattner 36d80f118eSChris LattnerRunning this command may show something different on your machine as 37d80f118eSChris Lattneryou might be using a different architecture or operating system to me. 38d80f118eSChris Lattner 39d80f118eSChris LattnerFortunately, we don't need to hard-code a target triple to target the 40d80f118eSChris Lattnercurrent machine. LLVM provides ``sys::getDefaultTargetTriple``, which 41d80f118eSChris Lattnerreturns the target triple of the current machine. 42d80f118eSChris Lattner 43d80f118eSChris Lattner.. code-block:: c++ 44d80f118eSChris Lattner 45d80f118eSChris Lattner auto TargetTriple = sys::getDefaultTargetTriple(); 46d80f118eSChris Lattner 47d80f118eSChris LattnerLLVM doesn't require us to link in all the target 48d80f118eSChris Lattnerfunctionality. For example, if we're just using the JIT, we don't need 49d80f118eSChris Lattnerthe assembly printers. Similarly, if we're only targeting certain 50d80f118eSChris Lattnerarchitectures, we can only link in the functionality for those 51d80f118eSChris Lattnerarchitectures. 52d80f118eSChris Lattner 53d80f118eSChris LattnerFor this example, we'll initialize all the targets for emitting object 54d80f118eSChris Lattnercode. 55d80f118eSChris Lattner 56d80f118eSChris Lattner.. code-block:: c++ 57d80f118eSChris Lattner 58d80f118eSChris Lattner InitializeAllTargetInfos(); 59d80f118eSChris Lattner InitializeAllTargets(); 60d80f118eSChris Lattner InitializeAllTargetMCs(); 61d80f118eSChris Lattner InitializeAllAsmParsers(); 62d80f118eSChris Lattner InitializeAllAsmPrinters(); 63d80f118eSChris Lattner 64d80f118eSChris LattnerWe can now use our target triple to get a ``Target``: 65d80f118eSChris Lattner 66d80f118eSChris Lattner.. code-block:: c++ 67d80f118eSChris Lattner 68d80f118eSChris Lattner std::string Error; 69d80f118eSChris Lattner auto Target = TargetRegistry::lookupTarget(TargetTriple, Error); 70d80f118eSChris Lattner 71d80f118eSChris Lattner // Print an error and exit if we couldn't find the requested target. 72d80f118eSChris Lattner // This generally occurs if we've forgotten to initialise the 73d80f118eSChris Lattner // TargetRegistry or we have a bogus target triple. 74d80f118eSChris Lattner if (!Target) { 75d80f118eSChris Lattner errs() << Error; 76d80f118eSChris Lattner return 1; 77d80f118eSChris Lattner } 78d80f118eSChris Lattner 79d80f118eSChris LattnerTarget Machine 80d80f118eSChris Lattner============== 81d80f118eSChris Lattner 82d80f118eSChris LattnerWe will also need a ``TargetMachine``. This class provides a complete 83d80f118eSChris Lattnermachine description of the machine we're targeting. If we want to 84d80f118eSChris Lattnertarget a specific feature (such as SSE) or a specific CPU (such as 85d80f118eSChris LattnerIntel's Sandylake), we do so now. 86d80f118eSChris Lattner 87d80f118eSChris LattnerTo see which features and CPUs that LLVM knows about, we can use 88d80f118eSChris Lattner``llc``. For example, let's look at x86: 89d80f118eSChris Lattner 90d80f118eSChris Lattner:: 91d80f118eSChris Lattner 92d80f118eSChris Lattner $ llvm-as < /dev/null | llc -march=x86 -mattr=help 93d80f118eSChris Lattner Available CPUs for this target: 94d80f118eSChris Lattner 95d80f118eSChris Lattner amdfam10 - Select the amdfam10 processor. 96d80f118eSChris Lattner athlon - Select the athlon processor. 97d80f118eSChris Lattner athlon-4 - Select the athlon-4 processor. 98d80f118eSChris Lattner ... 99d80f118eSChris Lattner 100d80f118eSChris Lattner Available features for this target: 101d80f118eSChris Lattner 102d80f118eSChris Lattner 16bit-mode - 16-bit mode (i8086). 103d80f118eSChris Lattner 32bit-mode - 32-bit mode (80386). 104d80f118eSChris Lattner 3dnow - Enable 3DNow! instructions. 105d80f118eSChris Lattner 3dnowa - Enable 3DNow! Athlon instructions. 106d80f118eSChris Lattner ... 107d80f118eSChris Lattner 108d80f118eSChris LattnerFor our example, we'll use the generic CPU without any additional 109d80f118eSChris Lattnerfeatures, options or relocation model. 110d80f118eSChris Lattner 111d80f118eSChris Lattner.. code-block:: c++ 112d80f118eSChris Lattner 113d80f118eSChris Lattner auto CPU = "generic"; 114d80f118eSChris Lattner auto Features = ""; 115d80f118eSChris Lattner 116d80f118eSChris Lattner TargetOptions opt; 117d80f118eSChris Lattner auto RM = Optional<Reloc::Model>(); 118d80f118eSChris Lattner auto TargetMachine = Target->createTargetMachine(TargetTriple, CPU, Features, opt, RM); 119d80f118eSChris Lattner 120d80f118eSChris Lattner 121d80f118eSChris LattnerConfiguring the Module 122d80f118eSChris Lattner====================== 123d80f118eSChris Lattner 124d80f118eSChris LattnerWe're now ready to configure our module, to specify the target and 125d80f118eSChris Lattnerdata layout. This isn't strictly necessary, but the `frontend 126d80f118eSChris Lattnerperformance guide <../Frontend/PerformanceTips.html>`_ recommends 127d80f118eSChris Lattnerthis. Optimizations benefit from knowing about the target and data 128d80f118eSChris Lattnerlayout. 129d80f118eSChris Lattner 130d80f118eSChris Lattner.. code-block:: c++ 131d80f118eSChris Lattner 132d80f118eSChris Lattner TheModule->setDataLayout(TargetMachine->createDataLayout()); 133d80f118eSChris Lattner TheModule->setTargetTriple(TargetTriple); 134d80f118eSChris Lattner 135d80f118eSChris LattnerEmit Object Code 136d80f118eSChris Lattner================ 137d80f118eSChris Lattner 138d80f118eSChris LattnerWe're ready to emit object code! Let's define where we want to write 139d80f118eSChris Lattnerour file to: 140d80f118eSChris Lattner 141d80f118eSChris Lattner.. code-block:: c++ 142d80f118eSChris Lattner 143d80f118eSChris Lattner auto Filename = "output.o"; 144d80f118eSChris Lattner std::error_code EC; 145d9b948b6SFangrui Song raw_fd_ostream dest(Filename, EC, sys::fs::OF_None); 146d80f118eSChris Lattner 147d80f118eSChris Lattner if (EC) { 148d80f118eSChris Lattner errs() << "Could not open file: " << EC.message(); 149d80f118eSChris Lattner return 1; 150d80f118eSChris Lattner } 151d80f118eSChris Lattner 152d80f118eSChris LattnerFinally, we define a pass that emits object code, then we run that 153d80f118eSChris Lattnerpass: 154d80f118eSChris Lattner 155d80f118eSChris Lattner.. code-block:: c++ 156d80f118eSChris Lattner 157d80f118eSChris Lattner legacy::PassManager pass; 1581dfede31SReid Kleckner auto FileType = CGFT_ObjectFile; 159d80f118eSChris Lattner 1608ef8e568SChris Lattner if (TargetMachine->addPassesToEmitFile(pass, dest, nullptr, FileType)) { 161d80f118eSChris Lattner errs() << "TargetMachine can't emit a file of this type"; 162d80f118eSChris Lattner return 1; 163d80f118eSChris Lattner } 164d80f118eSChris Lattner 165d80f118eSChris Lattner pass.run(*TheModule); 166d80f118eSChris Lattner dest.flush(); 167d80f118eSChris Lattner 168d80f118eSChris LattnerPutting It All Together 169d80f118eSChris Lattner======================= 170d80f118eSChris Lattner 171d80f118eSChris LattnerDoes it work? Let's give it a try. We need to compile our code, but 172d80f118eSChris Lattnernote that the arguments to ``llvm-config`` are different to the previous chapters. 173d80f118eSChris Lattner 174d80f118eSChris Lattner:: 175d80f118eSChris Lattner 176d80f118eSChris Lattner $ clang++ -g -O3 toy.cpp `llvm-config --cxxflags --ldflags --system-libs --libs all` -o toy 177d80f118eSChris Lattner 178d80f118eSChris LattnerLet's run it, and define a simple ``average`` function. Press Ctrl-D 179d80f118eSChris Lattnerwhen you're done. 180d80f118eSChris Lattner 181d80f118eSChris Lattner:: 182d80f118eSChris Lattner 183d80f118eSChris Lattner $ ./toy 184d80f118eSChris Lattner ready> def average(x y) (x + y) * 0.5; 185d80f118eSChris Lattner ^D 186d80f118eSChris Lattner Wrote output.o 187d80f118eSChris Lattner 188d80f118eSChris LattnerWe have an object file! To test it, let's write a simple program and 189d80f118eSChris Lattnerlink it with our output. Here's the source code: 190d80f118eSChris Lattner 191d80f118eSChris Lattner.. code-block:: c++ 192d80f118eSChris Lattner 193d80f118eSChris Lattner #include <iostream> 194d80f118eSChris Lattner 195d80f118eSChris Lattner extern "C" { 196d80f118eSChris Lattner double average(double, double); 197d80f118eSChris Lattner } 198d80f118eSChris Lattner 199d80f118eSChris Lattner int main() { 200d80f118eSChris Lattner std::cout << "average of 3.0 and 4.0: " << average(3.0, 4.0) << std::endl; 201d80f118eSChris Lattner } 202d80f118eSChris Lattner 203d80f118eSChris LattnerWe link our program to output.o and check the result is what we 204d80f118eSChris Lattnerexpected: 205d80f118eSChris Lattner 206d80f118eSChris Lattner:: 207d80f118eSChris Lattner 208d80f118eSChris Lattner $ clang++ main.cpp output.o -o main 209d80f118eSChris Lattner $ ./main 210d80f118eSChris Lattner average of 3.0 and 4.0: 3.5 211d80f118eSChris Lattner 212d80f118eSChris LattnerFull Code Listing 213d80f118eSChris Lattner================= 214d80f118eSChris Lattner 215147e0ddaSHans Wennborg.. literalinclude:: ../../../examples/Kaleidoscope/Chapter8/toy.cpp 216d80f118eSChris Lattner :language: c++ 217d80f118eSChris Lattner 218d80f118eSChris Lattner`Next: Adding Debug Information <LangImpl09.html>`_ 219