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