[DAGCombiner] Add target hook function to decide folding (mul (add x, c1), c2)
[llvm-project.git] / clang / docs / HowToSetupToolingForLLVM.rst
blobcbe15abaab3b4dd27ec36ee9e7be578a72686b4c
1 ===================================
2 How To Setup Clang Tooling For LLVM
3 ===================================
5 Clang Tooling provides infrastructure to write tools that need syntactic
6 and semantic information about a program. This term also relates to a set
7 of specific tools using this infrastructure (e.g. ``clang-check``). This
8 document provides information on how to set up and use Clang Tooling for
9 the LLVM source code.
11 Introduction
12 ============
14 Clang Tooling needs a compilation database to figure out specific build
15 options for each file. Currently it can create a compilation database
16 from the ``compile_commands.json`` file, generated by CMake. When
17 invoking clang tools, you can either specify a path to a build directory
18 using a command line parameter ``-p`` or let Clang Tooling find this
19 file in your source tree. In either case you need to configure your
20 build using CMake to use clang tools.
22 Setup Clang Tooling Using CMake and Make
23 ========================================
25 If you intend to use make to build LLVM, you should have CMake 2.8.6 or
26 later installed (can be found `here <https://cmake.org>`_).
28 First, you need to generate Makefiles for LLVM with CMake. You need to
29 make a build directory and run CMake from it:
31 .. code-block:: console
33   $ mkdir your/build/directory
34   $ cd your/build/directory
35   $ cmake -DCMAKE_EXPORT_COMPILE_COMMANDS=ON path/to/llvm/sources
37 If you want to use clang instead of GCC, you can add
38 ``-DCMAKE_C_COMPILER=/path/to/clang -DCMAKE_CXX_COMPILER=/path/to/clang++``.
39 You can also use ``ccmake``, which provides a curses interface to configure
40 CMake variables.
42 As a result, the new ``compile_commands.json`` file should appear in the
43 current directory. You should link it to the LLVM source tree so that
44 Clang Tooling is able to use it:
46 .. code-block:: console
48   $ ln -s $PWD/compile_commands.json path/to/llvm/source/
50 Now you are ready to build and test LLVM using make:
52 .. code-block:: console
54   $ make check-all
56 Using Clang Tools
57 =================
59 After you completed the previous steps, you are ready to run clang tools. If
60 you have a recent clang installed, you should have ``clang-check`` in
61 ``$PATH``. Try to run it on any ``.cpp`` file inside the LLVM source tree:
63 .. code-block:: console
65   $ clang-check tools/clang/lib/Tooling/CompilationDatabase.cpp
67 If you're using vim, it's convenient to have clang-check integrated. Put
68 this into your ``.vimrc``:
72     function! ClangCheckImpl(cmd)
73       if &autowrite | wall | endif
74       echo "Running " . a:cmd . " ..."
75       let l:output = system(a:cmd)
76       cexpr l:output
77       cwindow
78       let w:quickfix_title = a:cmd
79       if v:shell_error != 0
80         cc
81       endif
82       let g:clang_check_last_cmd = a:cmd
83     endfunction
85     function! ClangCheck()
86       let l:filename = expand('%')
87       if l:filename =~ '\.\(cpp\|cxx\|cc\|c\)$'
88         call ClangCheckImpl("clang-check " . l:filename)
89       elseif exists("g:clang_check_last_cmd")
90         call ClangCheckImpl(g:clang_check_last_cmd)
91       else
92         echo "Can't detect file's compilation arguments and no previous clang-check invocation!"
93       endif
94     endfunction
96     nmap <silent> <F5> :call ClangCheck()<CR><CR>
98 When editing a .cpp/.cxx/.cc/.c file, hit F5 to reparse the file. In
99 case the current file has a different extension (for example, .h), F5
100 will re-run the last clang-check invocation made from this vim instance
101 (if any). The output will go into the error window, which is opened
102 automatically when clang-check finds errors, and can be re-opened with
103 ``:cope``.
105 Other ``clang-check`` options that can be useful when working with clang
106 AST:
108 * ``-ast-print`` --- Build ASTs and then pretty-print them.
109 * ``-ast-dump`` --- Build ASTs and then debug dump them.
110 * ``-ast-dump-filter=<string>`` --- Use with ``-ast-dump`` or ``-ast-print`` to
111   dump/print only AST declaration nodes having a certain substring in a
112   qualified name. Use ``-ast-list`` to list all filterable declaration node
113   names.
114 * ``-ast-list`` --- Build ASTs and print the list of declaration node qualified
115   names.
117 Examples:
119 .. code-block:: console
121   $ clang-check tools/clang/tools/clang-check/ClangCheck.cpp -ast-dump -ast-dump-filter ActionFactory::newASTConsumer
122   Processing: tools/clang/tools/clang-check/ClangCheck.cpp.
123   Dumping ::ActionFactory::newASTConsumer:
124   clang::ASTConsumer *newASTConsumer() (CompoundStmt 0x44da290 </home/alexfh/local/llvm/tools/clang/tools/clang-check/ClangCheck.cpp:64:40, line:72:3>
125     (IfStmt 0x44d97c8 <line:65:5, line:66:45>
126       <<<NULL>>>
127         (ImplicitCastExpr 0x44d96d0 <line:65:9> '_Bool':'_Bool' <UserDefinedConversion>
128   ...
129   $ clang-check tools/clang/tools/clang-check/ClangCheck.cpp -ast-print -ast-dump-filter ActionFactory::newASTConsumer
130   Processing: tools/clang/tools/clang-check/ClangCheck.cpp.
131   Printing <anonymous namespace>::ActionFactory::newASTConsumer:
132   clang::ASTConsumer *newASTConsumer() {
133       if (this->ASTList.operator _Bool())
134           return clang::CreateASTDeclNodeLister();
135       if (this->ASTDump.operator _Bool())
136           return clang::CreateASTDumper(nullptr /*Dump to stdout.*/,
137                                         this->ASTDumpFilter);
138       if (this->ASTPrint.operator _Bool())
139           return clang::CreateASTPrinter(&llvm::outs(), this->ASTDumpFilter);
140       return new clang::ASTConsumer();
141   }
143 Using Ninja Build System
144 =======================================
146 Optionally you can use the `Ninja <https://github.com/martine/ninja>`_
147 build system instead of make. It is aimed at making your builds faster.
148 Currently this step will require building Ninja from sources.
150 To take advantage of using Clang Tools along with Ninja build you need
151 at least CMake 2.8.9.
153 Clone the Ninja git repository and build Ninja from sources:
155 .. code-block:: console
157   $ git clone git://github.com/martine/ninja.git
158   $ cd ninja/
159   $ ./bootstrap.py
161 This will result in a single binary ``ninja`` in the current directory.
162 It doesn't require installation and can just be copied to any location
163 inside ``$PATH``, say ``/usr/local/bin/``:
165 .. code-block:: console
167   $ sudo cp ninja /usr/local/bin/
168   $ sudo chmod a+rx /usr/local/bin/ninja
170 After doing all of this, you'll need to generate Ninja build files for
171 LLVM with CMake. You need to make a build directory and run CMake from
174 .. code-block:: console
176   $ mkdir your/build/directory
177   $ cd your/build/directory
178   $ cmake -G Ninja -DCMAKE_EXPORT_COMPILE_COMMANDS=ON path/to/llvm/sources
180 If you want to use clang instead of GCC, you can add
181 ``-DCMAKE_C_COMPILER=/path/to/clang -DCMAKE_CXX_COMPILER=/path/to/clang++``.
182 You can also use ``ccmake``, which provides a curses interface to configure
183 CMake variables in an interactive manner.
185 As a result, the new ``compile_commands.json`` file should appear in the
186 current directory. You should link it to the LLVM source tree so that
187 Clang Tooling is able to use it:
189 .. code-block:: console
191   $ ln -s $PWD/compile_commands.json path/to/llvm/source/
193 Now you are ready to build and test LLVM using Ninja:
195 .. code-block:: console
197   $ ninja check-all
199 Other target names can be used in the same way as with make.