|  | <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" | 
|  | "http://www.w3.org/TR/html4/strict.dtd"> | 
|  | <!-- Material used from: HTML 4.01 specs: http://www.w3.org/TR/html401/ --> | 
|  | <html> | 
|  | <head> | 
|  | <META http-equiv="Content-Type" content="text/html; charset=utf-8"> | 
|  | <title>Hacking on clang</title> | 
|  | <link type="text/css" rel="stylesheet" href="menu.css"> | 
|  | <link type="text/css" rel="stylesheet" href="content.css"> | 
|  | <style type="text/css"> | 
|  | pre { margin-left: 1.5em; } | 
|  | </style> | 
|  | </head> | 
|  | <body> | 
|  | <!--#include virtual="menu.html.incl"--> | 
|  | <div id="content"> | 
|  | <!--*********************************************************************--> | 
|  | <h1>Hacking on Clang</h1> | 
|  | <!--*********************************************************************--> | 
|  |  | 
|  | <p>This document provides some hints for how to get started hacking | 
|  | on Clang for developers who are new to the Clang and/or LLVM | 
|  | codebases.</p> | 
|  | <ul> | 
|  | <li><a href="#style">Coding Standards</a></li> | 
|  | <li><a href="#docs">Developer Documentation</a></li> | 
|  | <li><a href="#debugging">Debugging</a></li> | 
|  | <li><a href="#testing">Testing</a> | 
|  | <ul> | 
|  | <li><a href="#testingNonWindows">Testing on Unix-like Systems</a></li> | 
|  | <li><a href="#testingWindows">Testing using Visual Studio on Windows</a></li> | 
|  | <li><a href="#testingCommands">Testing on the Command Line</a></li> | 
|  | <li><a href="#testingLibc++">Testing changes affecting libc++</a></li> | 
|  | </ul> | 
|  | </li> | 
|  | <li><a href="#patches">Creating Patch Files</a></li> | 
|  | <li><a href="#irgen">LLVM IR Generation</a></li> | 
|  | </ul> | 
|  |  | 
|  | <!--=====================================================================--> | 
|  | <h2 id="style">Coding Standards</h2> | 
|  | <!--=====================================================================--> | 
|  |  | 
|  | <p>Clang follows the | 
|  | LLVM <a href="https://llvm.org/docs/CodingStandards.html">Coding | 
|  | Standards</a>. When submitting patches, please take care to follow these standards | 
|  | and to match the style of the code to that present in Clang (for example, in | 
|  | terms of indentation, bracing, and statement spacing).</p> | 
|  |  | 
|  | <p>Clang has a few additional coding standards:</p> | 
|  | <ul> | 
|  | <li><i>cstdio is forbidden</i>: library code should not output diagnostics | 
|  | or other information using <tt>cstdio</tt>; debugging routines should | 
|  | use <tt>llvm::errs()</tt>. Other uses of <tt>cstdio</tt> impose behavior | 
|  | upon clients and block integrating Clang as a library. Libraries should | 
|  | support <tt>raw_ostream</tt> based interfaces for textual | 
|  | output. See <a href="https://llvm.org/docs/CodingStandards.html#use-raw-ostream">Coding | 
|  | Standards</a>.</li> | 
|  | </ul> | 
|  |  | 
|  | <!--=====================================================================--> | 
|  | <h2 id="docs">Developer Documentation</h2> | 
|  | <!--=====================================================================--> | 
|  |  | 
|  | <p>Both Clang and LLVM use doxygen to provide API documentation. Their | 
|  | respective web pages (generated nightly) are here:</p> | 
|  | <ul> | 
|  | <li><a href="https://clang.llvm.org/doxygen">Clang</a></li> | 
|  | <li><a href="https://llvm.org/doxygen">LLVM</a></li> | 
|  | </ul> | 
|  |  | 
|  | <p>For work on the LLVM IR generation, the LLVM assembly language | 
|  | <a href="https://llvm.org/docs/LangRef.html">reference manual</a> is | 
|  | also useful.</p> | 
|  |  | 
|  | <!--=====================================================================--> | 
|  | <h2 id="debugging">Debugging</h2> | 
|  | <!--=====================================================================--> | 
|  |  | 
|  | <p>Inspecting data structures in a debugger:</p> | 
|  | <ul> | 
|  | <li>Many LLVM and Clang data structures provide | 
|  | a <tt>dump()</tt> method which will print a description of the | 
|  | data structure to <tt>stderr</tt>.</li> | 
|  | <li>The <a href="docs/InternalsManual.html#QualType"><tt>QualType</tt></a> | 
|  | structure is used pervasively. This is a simple value class for | 
|  | wrapping types with qualifiers; you can use | 
|  | the <tt>isConstQualified()</tt>, for example, to get one of the | 
|  | qualifiers, and the <tt>getTypePtr()</tt> method to get the | 
|  | wrapped <tt>Type*</tt> which you can then dump.</li> | 
|  | <li>For <a href="https://lldb.llvm.org"> <tt>LLDB</tt></a> users there are | 
|  | data formatters for clang data structures in | 
|  | <a href="https://github.com/llvm/llvm-project/blob/main/clang/utils/ClangDataFormat.py"> | 
|  | <tt>clang/utils/ClangDataFormat.py</tt></a>.</li> | 
|  | </ul> | 
|  |  | 
|  | <!--=====================================================================--> | 
|  | <h3 id="debuggingVisualStudio">Debugging using Visual Studio</h3> | 
|  | <!--=====================================================================--> | 
|  |  | 
|  | <p>The files | 
|  | <a href="https://github.com/llvm/llvm-project/blob/main/llvm/utils/LLVMVisualizers/llvm.natvis"> | 
|  | <tt>llvm/utils/LLVMVisualizers/llvm.natvis</tt></a> and | 
|  | <a href="https://github.com/llvm/llvm-project/blob/main/clang/utils/ClangVisualizers/clang.natvis"> | 
|  | <tt>clang/utils/ClangVisualizers/clang.natvis</tt></a> provide debugger visualizers | 
|  | that make debugging of more complex data types much easier.</p> | 
|  | <p>Depending on how you configure the project, Visual Studio may automatically | 
|  | use these visualizers when debugging or you may be required to put the files | 
|  | into <tt>%USERPROFILE%\Documents\Visual Studio <version>\Visualizers</tt> | 
|  | or create a symbolic link so they update automatically. See | 
|  | <a href="https://learn.microsoft.com/en-us/visualstudio/debugger/create-custom-views-of-native-objects"> | 
|  | Microsoft's documentation</a> for more details on use of NATVIS.</p> | 
|  |  | 
|  | <!--=====================================================================--> | 
|  | <h2 id="testing">Testing</h2> | 
|  | <!--=====================================================================--> | 
|  |  | 
|  | <!--=====================================================================--> | 
|  | <h3 id="testingNonWindows">Testing on Unix-like Systems</h3> | 
|  | <!--=====================================================================--> | 
|  |  | 
|  | <p>Clang includes a basic regression suite in the tree which can be | 
|  | run with <tt>make test</tt> from the top-level clang directory, or | 
|  | just <tt>make</tt> in the <em>test</em> sub-directory. | 
|  | <tt>make VERBOSE=1</tt> can be used to show more detail | 
|  | about what is being run.</p> | 
|  |  | 
|  | <p>If you built LLVM and Clang using CMake, the test suite can be run | 
|  | with <tt>make check-clang</tt> from the top-level LLVM directory.</p> | 
|  |  | 
|  | <p>The tests primarily consist of a test runner script running the compiler | 
|  | under test on individual test files grouped in the directories under the | 
|  | test directory.  The individual test files include comments at the | 
|  | beginning indicating the Clang compile options to use, to be read | 
|  | by the test runner. Embedded comments also can do things like telling | 
|  | the test runner that an error is expected at the current line. | 
|  | Any output files produced by the test will be placed under | 
|  | a created Output directory.</p> | 
|  |  | 
|  | <p>During the run of <tt>make test</tt>, the terminal output will | 
|  | display a line similar to the following:</p> | 
|  |  | 
|  | <pre>--- Running clang tests for i686-pc-linux-gnu ---</pre> | 
|  |  | 
|  | <p>followed by a line continually overwritten with the current test | 
|  | file being compiled, and an overall completion percentage.</p> | 
|  |  | 
|  | <p>After the <tt>make test</tt> run completes, the absence of any | 
|  | <tt>Failing Tests (count):</tt> message indicates that no tests | 
|  | failed unexpectedly.  If any tests did fail, the | 
|  | <tt>Failing Tests (count):</tt> message will be followed by a list | 
|  | of the test source file paths that failed.  For example:</p> | 
|  |  | 
|  | <pre> | 
|  | Failing Tests (3): | 
|  | /home/john/llvm/tools/clang/test/SemaCXX/member-name-lookup.cpp | 
|  | /home/john/llvm/tools/clang/test/SemaCXX/namespace-alias.cpp | 
|  | /home/john/llvm/tools/clang/test/SemaCXX/using-directive.cpp | 
|  | </pre> | 
|  |  | 
|  | <p>If you used the <tt>make VERBOSE=1</tt> option, the terminal | 
|  | output will reflect the error messages from the compiler and | 
|  | test runner.</p> | 
|  |  | 
|  | <p>The regression suite can also be run with Valgrind by running | 
|  | <tt>make test VG=1</tt> in the top-level clang directory.</p> | 
|  |  | 
|  | <p>For more intensive changes, running | 
|  | the <a href="https://llvm.org/docs/TestingGuide.html#quick-start">LLVM | 
|  | Test Suite</a> with clang is recommended. Currently the best way to | 
|  | override LLVMGCC, as in: <tt>make LLVMGCC="clang -std=gnu89" | 
|  | TEST=nightly report</tt> (make sure <tt>clang</tt> is in your PATH or use the | 
|  | full path).</p> | 
|  |  | 
|  | <!--=====================================================================--> | 
|  | <h3 id="testingWindows">Testing using Visual Studio on Windows</h3> | 
|  | <!--=====================================================================--> | 
|  |  | 
|  | <p>The Clang test suite can be run from either Visual Studio or | 
|  | the command line.</p> | 
|  |  | 
|  | <p>Note that the test runner is based on | 
|  | Python, which must be installed.  Find Python at: | 
|  | <a href="https://www.python.org/downloads/">https://www.python.org/downloads/</a>. | 
|  | Download the latest stable version.</p> | 
|  |  | 
|  | <p>The GnuWin32 tools are also necessary for running the tests. | 
|  | Get them from <a href="http://getgnuwin32.sourceforge.net/"> | 
|  | http://getgnuwin32.sourceforge.net/</a>. | 
|  | If the environment variable <tt>%PATH%</tt> does not have GnuWin32, | 
|  | or if other grep(s) supercedes GnuWin32 on <tt>%PATH%,</tt> | 
|  | you should specify <tt>LLVM_LIT_TOOLS_DIR</tt> | 
|  | to CMake explicitly.</p> | 
|  |  | 
|  | <p>The cmake build tool is set up to create Visual Studio project files | 
|  | for running the tests, "check-clang" being the root.  Therefore, to | 
|  | run the test from Visual Studio, right-click the check-clang project | 
|  | and select "Build".</p> | 
|  |  | 
|  | <p> | 
|  | Please see also | 
|  | <a href="https://llvm.org/docs/GettingStartedVS.html">Getting Started | 
|  | with the LLVM System using Microsoft Visual Studio</a> and | 
|  | <a href="https://llvm.org/docs/CMake.html">Building LLVM with CMake</a>. | 
|  | </p> | 
|  |  | 
|  | <!--=====================================================================--> | 
|  | <h3 id="testingCommands">Testing on the Command Line</h3> | 
|  | <!--=====================================================================--> | 
|  |  | 
|  | <p>If you want more control over how the tests are run, it may | 
|  | be convenient to run the test harness on the command-line directly. Before | 
|  | running tests from the command line, you will need to ensure that | 
|  | <tt>lit.site.cfg</tt> files have been created for your build.  You can do | 
|  | this by running the tests as described in the previous sections. Once the | 
|  | tests have started running, you can stop them with control+C, as the | 
|  | files are generated before running any tests.</p> | 
|  |  | 
|  | <p>Once that is done, to run all the tests from the command line, | 
|  | execute a command like the following:</p> | 
|  |  | 
|  | <pre> | 
|  | python (path to llvm)\llvm\utils\lit\lit.py -sv | 
|  | --param=build_mode=Win32 --param=build_config=Debug | 
|  | --param=clang_site_config=(build dir)\tools\clang\test\lit.site.cfg | 
|  | (path to llvm)\llvm\tools\clang\test | 
|  | </pre> | 
|  |  | 
|  | <p>For CMake builds e.g. on Windows with Visual Studio, you will need | 
|  | to specify your build configuration (Debug, Release, etc.) via | 
|  | <tt>--param=build_config=(build config)</tt>.  You may also need to specify | 
|  | the build mode (Win32, etc) via <tt>--param=build_mode=(build mode)</tt>.</p> | 
|  |  | 
|  | <p>Additionally, you will need to specify the lit site configuration which | 
|  | lives in (build dir)\tools\clang\test, via | 
|  | <tt>--param=clang_site_config=(build dir)\tools\clang\test\lit.site.cfg</tt>. | 
|  | </p> | 
|  |  | 
|  | <p>To run a single test:</p> | 
|  |  | 
|  | <pre> | 
|  | python (path to llvm)\llvm\utils\lit\lit.py -sv | 
|  | --param=build_mode=Win32 --param=build_config=Debug | 
|  | --param=clang_site_config=(build dir)\tools\clang\test\lit.site.cfg | 
|  | (path to llvm)\llvm\tools\clang\test\(dir)\(test) | 
|  | </pre> | 
|  |  | 
|  | <p>For example:</p> | 
|  |  | 
|  | <pre> | 
|  | python C:\Tools\llvm\utils\lit\lit.py -sv | 
|  | --param=build_mode=Win32 --param=build_config=Debug | 
|  | --param=clang_site_config=C:\Tools\build\tools\clang\test\lit.site.cfg | 
|  | C:\Tools\llvm\tools\clang\test\Sema\wchar.c | 
|  | </pre> | 
|  |  | 
|  | <p>The -sv option above tells the runner to show the test output if | 
|  | any tests failed, to help you determine the cause of failure.</p> | 
|  |  | 
|  | <p>You can also pass in the --no-progress-bar option if you wish to disable | 
|  | progress indications while the tests are running.</p> | 
|  |  | 
|  | <p>Your output might look something like this:</p> | 
|  |  | 
|  | <pre>lit.py: lit.cfg:152: note: using clang: 'C:\Tools\llvm\bin\Release\clang.EXE' | 
|  | -- Testing: Testing: 2534 tests, 4 threads -- | 
|  | Testing: 0 .. 10.. 20.. 30.. 40.. 50.. 60.. 70.. 80.. 90.. | 
|  | Testing Time: 81.52s | 
|  | Passed           : 2503 | 
|  | Expectedly Failed:   28 | 
|  | Unsupported      :    3 | 
|  | </pre> | 
|  |  | 
|  | <p>The statistic, "Failed" (not shown if all tests pass), is the important one.</p> | 
|  |  | 
|  | <!--=====================================================================--> | 
|  | <h3 id="testingLibc++">Testing changes affecting libc++</h3> | 
|  | <!--=====================================================================--> | 
|  |  | 
|  | <p>Some changes in Clang affect <a href="https://libcxx.llvm.org">libc++</a>, | 
|  | for example:</p> | 
|  | <ul> | 
|  | <li>Changing the output of Clang's diagnostics.</li> | 
|  | <li>Changing compiler builtins, especially the builtins used for type traits | 
|  | or replacements of library functions like <tt>std::move</tt> or | 
|  | <tt>std::forward</tt>.</li> | 
|  | </ul> | 
|  |  | 
|  | <p>After adjusting libc++ to work with the changes, the next revision will be | 
|  | tested by libc++'s | 
|  | <a href="https://buildkite.com/llvm-project/libcxx-ci">pre-commit CI</a>. | 
|  |  | 
|  | <p>For most configurations, the pre-commit CI uses a recent | 
|  | <a href="https://apt.llvm.org/">nightly build</a> of Clang from LLVM's main | 
|  | branch. These configurations do <em>not</em> use the Clang changes in the | 
|  | patch. They only use the libc++ changes.</p> | 
|  |  | 
|  | <p>The "Bootstrapping build" builds Clang and uses it to build and | 
|  | test libc++. This build <em>does</em> use the Clang changes in the patch.</p> | 
|  |  | 
|  | <p>Libc++ supports multiple versions of Clang. Therefore when a patch changes | 
|  | the diagnostics it might be required to use a regex in the | 
|  | "expected" tests to make it pass the CI.</p> | 
|  |  | 
|  | <p>Libc++ has more | 
|  | <a href="https://libcxx.llvm.org/Contributing.html#pre-commit-ci"> | 
|  | documentation</a> about the pre-commit CI. For questions regarding | 
|  | libc++, the best place to ask is the <tt>#libcxx</tt> channel on | 
|  | <a href="https://discord.gg/jzUbyP26tQ">LLVM's Discord server</a>.</p> | 
|  |  | 
|  | <!--=====================================================================--> | 
|  | <h2 id="patches">Creating Patch Files</h2> | 
|  | <!--=====================================================================--> | 
|  |  | 
|  | <p>To contribute changes to Clang see | 
|  | <a href="https://llvm.org/docs/GettingStarted.html#sending-patches">LLVM's Getting Started page</a></p> | 
|  |  | 
|  | <!--=====================================================================--> | 
|  | <h2 id="irgen">LLVM IR Generation</h2> | 
|  | <!--=====================================================================--> | 
|  |  | 
|  | <p>The LLVM IR generation part of clang handles conversion of the | 
|  | AST nodes output by the Sema module to the LLVM Intermediate | 
|  | Representation (IR). Historically, this was referred to as | 
|  | "codegen", and the Clang code for this lives | 
|  | in <tt>lib/CodeGen</tt>.</p> | 
|  |  | 
|  | <p>The output is most easily inspected using the <tt>-emit-llvm</tt> | 
|  | option to clang (possibly in conjunction with <tt>-o -</tt>). You | 
|  | can also use <tt>-emit-llvm-bc</tt> to write an LLVM bitcode file | 
|  | which can be processed by the suite of LLVM tools | 
|  | like <tt>llvm-dis</tt>, <tt>llvm-nm</tt>, etc. See the LLVM | 
|  | <a href="https://llvm.org/docs/CommandGuide/">Command Guide</a> | 
|  | for more information.</p> | 
|  |  | 
|  | </div> | 
|  | </body> | 
|  | </html> |