• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN"
2          "http://www.w3.org/TR/html4/strict.dtd">
3<!-- Material used from: HTML 4.01 specs: http://www.w3.org/TR/html401/ -->
4<html>
5<head>
6  <META http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
7  <title>Hacking on clang</title>
8  <link type="text/css" rel="stylesheet" href="menu.css">
9  <link type="text/css" rel="stylesheet" href="content.css">
10  <style type="text/css">
11  pre { margin-left: 1.5em; }
12  </style>
13</head>
14<body>
15<!--#include virtual="menu.html.incl"-->
16<div id="content">
17  <!--*********************************************************************-->
18  <h1>Hacking on Clang</h1>
19  <!--*********************************************************************-->
20
21  <p>This document provides some hints for how to get started hacking
22  on Clang for developers who are new to the Clang and/or LLVM
23  codebases.</p>
24    <ul>
25      <li><a href="#style">Coding Standards</a></li>
26      <li><a href="#docs">Developer Documentation</a></li>
27      <li><a href="#debugging">Debugging</a></li>
28      <li><a href="#testing">Testing</a>
29      <ul>
30        <li><a href="#testingNonWindows">Testing on Unix-like Systems</a></li>
31        <li><a href="#testingWindows">Testing using Visual Studio on Windows</a></li>
32        <li><a href="#testingCommands">Testing on the Command Line</a></li>
33      </ul>
34      </li>
35      <li><a href="#patches">Creating Patch Files</a></li>
36      <li><a href="#irgen">LLVM IR Generation</a></li>
37    </ul>
38
39  <!--=====================================================================-->
40  <h2 id="style">Coding Standards</h2>
41  <!--=====================================================================-->
42
43  <p>Clang follows the
44  LLVM <a href="http://llvm.org/docs/CodingStandards.html">Coding
45  Standards</a>. When submitting patches, please take care to follow these standards
46  and to match the style of the code to that present in Clang (for example, in
47  terms of indentation, bracing, and statement spacing).</p>
48
49  <p>Clang has a few additional coding standards:</p>
50  <ul>
51    <li><i>cstdio is forbidden</i>: library code should not output diagnostics
52      or other information using <tt>cstdio</tt>; debugging routines should
53      use <tt>llvm::errs()</tt>. Other uses of <tt>cstdio</tt> impose behavior
54      upon clients and block integrating Clang as a library. Libraries should
55      support <tt>raw_ostream</tt> based interfaces for textual
56      output. See <a href="http://llvm.org/docs/CodingStandards.html#ll_raw_ostream">Coding
57      Standards</a>.</li>
58  </ul>
59
60  <!--=====================================================================-->
61  <h2 id="docs">Developer Documentation</h2>
62  <!--=====================================================================-->
63
64  <p>Both Clang and LLVM use doxygen to provide API documentation. Their
65  respective web pages (generated nightly) are here:</p>
66    <ul>
67      <li><a href="http://clang.llvm.org/doxygen">Clang</a></li>
68      <li><a href="http://llvm.org/doxygen">LLVM</a></li>
69    </ul>
70
71  <p>For work on the LLVM IR generation, the LLVM assembly language
72  <a href="http://llvm.org/docs/LangRef.html">reference manual</a> is
73  also useful.</p>
74
75  <!--=====================================================================-->
76  <h2 id="debugging">Debugging</h2>
77  <!--=====================================================================-->
78
79  <p>Inspecting data structures in a debugger:</p>
80    <ul>
81      <li>Many LLVM and Clang data structures provide
82        a <tt>dump()</tt> method which will print a description of the
83        data structure to <tt>stderr</tt>.</li>
84      <li>The <a href="docs/InternalsManual.html#QualType"><tt>QualType</tt></a>
85      structure is used pervasively. This is a simple value class for
86      wrapping types with qualifiers; you can use
87      the <tt>isConstQualified()</tt>, for example, to get one of the
88      qualifiers, and the <tt>getTypePtr()</tt> method to get the
89      wrapped <tt>Type*</tt> which you can then dump.</li>
90      <li>For <a href="http://lldb.llvm.org"> <tt>LLDB</tt></a> users there are
91      data formatters for clang data structures in
92      <a href="http://llvm.org/svn/llvm-project/cfe/trunk/utils/ClangDataFormat.py">
93      <tt>utils/ClangDataFormat.py</tt></a>.</li>
94    </ul>
95
96  <!--=====================================================================-->
97  <h3 id="debuggingVisualStudio">Debugging using Visual Studio</h3>
98  <!--=====================================================================-->
99
100  <p>The file <tt>utils/clangVisualizers.txt</tt> provides debugger visualizers that make debugging
101  of more complex data types much easier.</p>
102  <p>There are two ways to install them:</p>
103
104  <ul>
105      <li>Put the path to <tt>clangVisualizers.txt</tt> in the environment variable called
106      <tt>_vcee_autoexp</tt>. This method should work for Visual Studio 2008 and above.
107      </li>
108      <li>Edit your local <tt>autoexp.dat</tt> (make sure you make a backup first!),
109      located in <tt>Visual Studio Directory\Common7\Packages\Debugger</tt> and append
110      the contents of <tt>clangVisuailzers.txt</tt> to it. This method should work for
111      Visual Studio 2008 and above.
112       </li>
113  </ul>
114
115  <p><i>[Note: To disable the visualizer for any specific variable, type
116  <tt>variable_name,!</tt> inside the watch window.]</i></p>
117
118  <!--=====================================================================-->
119  <h2 id="testing">Testing</h2>
120  <!--=====================================================================-->
121
122  <p><i>[Note: The test running mechanism is currently under revision, so the
123  following might change shortly.]</i></p>
124
125  <!--=====================================================================-->
126  <h3 id="testingNonWindows">Testing on Unix-like Systems</h3>
127  <!--=====================================================================-->
128
129  <p>Clang includes a basic regression suite in the tree which can be
130  run with <tt>make test</tt> from the top-level clang directory, or
131  just <tt>make</tt> in the <em>test</em> sub-directory.
132  <tt>make VERBOSE=1</tt> can be used to show more detail
133  about what is being run.</p>
134
135  <p>If you built LLVM and Clang using CMake, the test suite can be run
136  with <tt>make clang-test</tt> from the top-level LLVM directory.</p>
137
138  <p>The tests primarily consist of a test runner script running the compiler
139  under test on individual test files grouped in the directories under the
140  test directory.  The individual test files include comments at the
141  beginning indicating the Clang compile options to use, to be read
142  by the test runner. Embedded comments also can do things like telling
143  the test runner that an error is expected at the current line.
144  Any output files produced by the test will be placed under
145  a created Output directory.</p>
146
147  <p>During the run of <tt>make test</tt>, the terminal output will
148  display a line similar to the following:</p>
149
150  <pre>--- Running clang tests for i686-pc-linux-gnu ---</pre>
151
152  <p>followed by a line continually overwritten with the current test
153  file being compiled, and an overall completion percentage.</p>
154
155  <p>After the <tt>make test</tt> run completes, the absence of any
156  <tt>Failing Tests (count):</tt> message indicates that no tests
157  failed unexpectedly.  If any tests did fail, the
158  <tt>Failing Tests (count):</tt> message will be followed by a list
159  of the test source file paths that failed.  For example:</p>
160
161  <pre>
162  Failing Tests (3):
163      /home/john/llvm/tools/clang/test/SemaCXX/member-name-lookup.cpp
164      /home/john/llvm/tools/clang/test/SemaCXX/namespace-alias.cpp
165      /home/john/llvm/tools/clang/test/SemaCXX/using-directive.cpp
166</pre>
167
168  <p>If you used the <tt>make VERBOSE=1</tt> option, the terminal
169  output will reflect the error messages from the compiler and
170  test runner.</p>
171
172  <p>The regression suite can also be run with Valgrind by running
173  <tt>make test VG=1</tt> in the top-level clang directory.</p>
174
175  <p>For more intensive changes, running
176  the <a href="http://llvm.org/docs/TestingGuide.html#testsuiterun">LLVM
177  Test Suite</a> with clang is recommended. Currently the best way to
178  override LLVMGCC, as in: <tt>make LLVMGCC="clang -std=gnu89"
179  TEST=nightly report</tt> (make sure <tt>clang</tt> is in your PATH or use the
180  full path).</p>
181
182  <!--=====================================================================-->
183  <h3 id="testingWindows">Testing using Visual Studio on Windows</h3>
184  <!--=====================================================================-->
185
186  <p>The Clang test suite can be run from either Visual Studio or
187  the command line.</p>
188
189  <p>Note that the test runner is based on
190  Python, which must be installed.  Find Python at:
191  <a href="http://www.python.org/download/">http://www.python.org/download/</a>.
192  Download the latest stable version (2.6.2 at the time of this writing).</p>
193
194  <p>The GnuWin32 tools are also necessary for running the tests.
195  Get them from <a href="http://getgnuwin32.sourceforge.net/">
196  http://getgnuwin32.sourceforge.net/</a>.
197  If the environment variable <tt>%PATH%</tt> does not have GnuWin32,
198  or if other grep(s) supercedes GnuWin32 on <tt>%PATH%,</tt>
199  you should specify <tt>LLVM_LIT_TOOLS_DIR</tt>
200  to CMake explicitly.</p>
201
202  <p>The cmake build tool is set up to create Visual Studio project files
203  for running the tests, "clang-test" being the root.  Therefore, to
204  run the test from Visual Studio, right-click the clang-test project
205  and select "Build".</p>
206
207  <p>
208    Please see also
209    <a href="http://llvm.org/docs/GettingStartedVS.html">Getting Started
210    with the LLVM System using Microsoft Visual Studio</a> and
211    <a href="http://llvm.org/docs/CMake.html">Building LLVM with CMake</a>.
212  </p>
213
214  <!--=====================================================================-->
215  <h3 id="testingCommands">Testing on the Command Line</h3>
216  <!--=====================================================================-->
217
218  <p>If you want more control over how the tests are run, it may
219  be convenient to run the test harness on the command-line directly. Before
220  running tests from the command line, you will need to ensure that
221  <tt>lit.site.cfg</tt> files have been created for your build.  You can do
222  this by running the tests as described in the previous sections. Once the
223  tests have started running, you can stop them with control+C, as the
224  files are generated before running any tests.</p>
225
226  <p>Once that is done, to run all the tests from the command line,
227  execute a command like the following:</p>
228
229  <pre>
230  python (path to llvm)\llvm\utils\lit\lit.py -sv
231  --param=build_mode=Win32 --param=build_config=Debug
232  --param=clang_site_config=(build dir)\tools\clang\test\lit.site.cfg
233 (path to llvm)\llvm\tools\clang\test
234</pre>
235
236  <p>For CMake builds e.g. on Windows with Visual Studio, you will need
237  to specify your build configuration (Debug, Release, etc.) via
238  <tt>--param=build_config=(build config)</tt>.  You may also need to specify
239  the build mode (Win32, etc) via <tt>--param=build_mode=(build mode)</tt>.</p>
240
241  <p>Additionally, you will need to specify the lit site configuration which
242  lives in (build dir)\tools\clang\test, via
243  <tt>--param=clang_site_config=(build dir)\tools\clang\test\lit.site.cfg</tt>.
244  </p>
245
246  <p>To run a single test:</p>
247
248  <pre>
249  python (path to llvm)\llvm\utils\lit\lit.py -sv
250  --param=build_mode=Win32 --param=build_config=Debug
251  --param=clang_site_config=(build dir)\tools\clang\test\lit.site.cfg
252  (path to llvm)\llvm\tools\clang\test\(dir)\(test)
253</pre>
254
255  <p>For example:</p>
256
257  <pre>
258  python C:\Tool\llvm\utils\lit\lit.py -sv
259  --param=build_mode=Win32 --param=build_config=Debug
260  --param=clang_site_config=c:\Tools\build\tools\clang\test\lit.site.cfg
261  C:\Tools\llvm\tools\clang\test\Sema\wchar.c
262</pre>
263
264  <p>The -sv option above tells the runner to show the test output if
265  any tests failed, to help you determine the cause of failure.</p>
266
267  <p>You can also pass in the --no-progress-bar option if you wish to disable
268  progress indications while the tests are running.</p>
269
270  <p>Your output might look something like this:</p>
271
272  <pre>lit.py: lit.cfg:152: note: using clang: 'C:\Tools\llvm\bin\Release\clang.EXE'
273-- Testing: Testing: 2534 tests, 4 threads --
274Testing: 0 .. 10.. 20.. 30.. 40.. 50.. 60.. 70.. 80.. 90..
275Testing Time: 81.52s
276  Expected Passes    : 2503
277  Expected Failures  : 28
278  Unsupported Tests  : 3
279</pre>
280
281  <p>The statistic, "Unexpected Failures" (not shown if all tests pass), is the important one.</p>
282
283  <!--=====================================================================-->
284  <h2 id="patches">Creating Patch Files</h2>
285  <!--=====================================================================-->
286
287  <p>To return changes to the Clang team, unless you have checkin
288  privileges, the preferred way is to send patch files to the
289  cfe-commits mailing list, with an explanation of what the patch is
290  for.  If your patch requires a wider discussion (for example,
291  because it is an architectural change), you can use the cfe-dev
292  mailing list.  </p>
293
294  <p>To create these patch files, change directory
295  to the llvm/tools/clang root and run:</p>
296
297  <pre>svn diff (relative path) >(patch file name)</pre>
298
299  <p>For example, for getting the diffs of all of clang:</p>
300
301  <pre>svn diff . >~/mypatchfile.patch</pre>
302
303  <p>For example, for getting the diffs of a single file:</p>
304
305  <pre>svn diff lib/Parse/ParseDeclCXX.cpp >~/ParseDeclCXX.patch</pre>
306
307  <p>Note that the paths embedded in the patch depend on where you run it,
308  so changing directory to the llvm/tools/clang directory is recommended.</p>
309
310  <!--=====================================================================-->
311  <h2 id="irgen">LLVM IR Generation</h2>
312  <!--=====================================================================-->
313
314  <p>The LLVM IR generation part of clang handles conversion of the
315    AST nodes output by the Sema module to the LLVM Intermediate
316    Representation (IR). Historically, this was referred to as
317    "codegen", and the Clang code for this lives
318    in <tt>lib/CodeGen</tt>.</p>
319
320  <p>The output is most easily inspected using the <tt>-emit-llvm</tt>
321    option to clang (possibly in conjunction with <tt>-o -</tt>). You
322    can also use <tt>-emit-llvm-bc</tt> to write an LLVM bitcode file
323    which can be processed by the suite of LLVM tools
324    like <tt>llvm-dis</tt>, <tt>llvm-nm</tt>, etc. See the LLVM
325    <a href="http://llvm.org/docs/CommandGuide/">Command Guide</a>
326    for more information.</p>
327
328</div>
329</body>
330</html>
331