2009-04-20 12:23:09 +08:00
|
|
|
<html>
|
|
|
|
<head>
|
|
|
|
<title>Clang Compiler User's Manual</title>
|
|
|
|
<link type="text/css" rel="stylesheet" href="../menu.css" />
|
|
|
|
<link type="text/css" rel="stylesheet" href="../content.css" />
|
|
|
|
<style type="text/css">
|
|
|
|
td {
|
|
|
|
vertical-align: top;
|
|
|
|
}
|
|
|
|
</style>
|
|
|
|
</head>
|
|
|
|
<body>
|
|
|
|
|
|
|
|
<!--#include virtual="../menu.html.incl"-->
|
|
|
|
|
|
|
|
<div id="content">
|
|
|
|
|
|
|
|
<h1>Clang Compiler User's Manual</h1>
|
|
|
|
|
|
|
|
<ul>
|
|
|
|
<li><a href="#intro">Introduction</a>
|
|
|
|
<ul>
|
|
|
|
<li><a href="#terminology">Terminology</a></li>
|
|
|
|
<li><a href="#basicusage">Basic Usage</a></li>
|
|
|
|
</ul>
|
|
|
|
</li>
|
2009-04-20 14:00:23 +08:00
|
|
|
<li><a href="#commandline">Command Line Options</a>
|
|
|
|
<ul>
|
|
|
|
<li><a href="#cl_diagnostics">Options to Control Error and Warning
|
|
|
|
Messages</a></li>
|
|
|
|
</ul>
|
|
|
|
</li>
|
2009-04-20 12:23:09 +08:00
|
|
|
<li><a href="#general_features">Language and Target-Independent Features</a>
|
|
|
|
<ul>
|
|
|
|
<li><a href="#diagnostics">Controlling Errors and Warnings</a></li>
|
|
|
|
<li><a href="#precompiledheaders">Precompiled Headers</a></li>
|
|
|
|
</ul>
|
|
|
|
</li>
|
|
|
|
<li><a href="#c">C Language Features</a>
|
|
|
|
<ul>
|
|
|
|
<!-- <li><a href="#pragmas">Pragmas Supported</a></li> -->
|
|
|
|
<li><a href="#c_extensions">C Extensions Supported</a></li>
|
|
|
|
<li><a href="#c_incompatibilities">Intentional Incompatibilities with
|
|
|
|
GCC</a></li>
|
|
|
|
</ul>
|
|
|
|
</li>
|
|
|
|
<li><a href="#objc">Objective-C Language Features</a>
|
|
|
|
<ul>
|
|
|
|
<li><a href="#objc_incompatibilities">Intentional Incompatibilities with
|
|
|
|
GCC</a></li>
|
|
|
|
</ul>
|
|
|
|
</li>
|
|
|
|
<li><a href="#cxx">C++ Language Features</a>
|
|
|
|
<ul>
|
|
|
|
<li>...</li>
|
|
|
|
</ul>
|
|
|
|
</li>
|
|
|
|
<li><a href="#objcxx">Objective C++ Language Features</a>
|
|
|
|
<ul>
|
|
|
|
<li>...</li>
|
|
|
|
</ul>
|
|
|
|
</li>
|
|
|
|
<li><a href="#target_features">Target-Specific Features and Limitations</a>
|
|
|
|
<ul>
|
|
|
|
<li><a href="#target_arch">CPU Architectures Features and Limitations</a>
|
|
|
|
<ul>
|
|
|
|
<li><a href="#target_arch_x86">X86</a></li>
|
|
|
|
<li>PPC</li>
|
|
|
|
<li>ARM</li>
|
|
|
|
</ul>
|
|
|
|
</li>
|
|
|
|
<li><a href="#target_os">Operating System Features and Limitations</a>
|
|
|
|
<ul>
|
|
|
|
<li><a href="#target_os_darwin">Darwin (Mac OS/X)</a></li>
|
|
|
|
<li>Linux, etc.</li>
|
|
|
|
</ul>
|
|
|
|
|
|
|
|
</li>
|
|
|
|
</ul>
|
|
|
|
</li>
|
|
|
|
</ul>
|
|
|
|
|
|
|
|
|
|
|
|
<!-- ======================================================================= -->
|
|
|
|
<h2 id="intro">Introduction</h2>
|
|
|
|
<!-- ======================================================================= -->
|
|
|
|
|
|
|
|
<p>The Clang Compiler is an open-source compiler for the C family of programming
|
|
|
|
languages, aiming to be the best in class implementation of these languages.
|
|
|
|
Clang builds on the LLVM optimizer and code generator, allowing it to provide
|
|
|
|
high-quality optimization and code generation support for many targets. For
|
|
|
|
more general information, please see the <a href="http://clang.llvm.org">Clang
|
|
|
|
Web Site</a> or the <a href="http://llvm.org">LLVM Web Site</a>.</p>
|
|
|
|
|
|
|
|
<p>This document describes important notes about using Clang as a compiler for
|
|
|
|
an end-user, documenting the supported features, command line options, etc. If
|
|
|
|
you are interested in using Clang to build a tool that processes code, please
|
|
|
|
see <a href="InternalsManual.html">the Clang Internals Manual</a>. If you are
|
|
|
|
interested in the <a href="http://clang.llvm.org/StaticAnalysis.html">Clang
|
|
|
|
Static Analyzer</a>, please see its web page.</p>
|
|
|
|
|
|
|
|
<p>Clang is designed to support the C family of programming languages, which
|
|
|
|
includes <a href="#c">C</a>, <a href="#objc">Objective-C</a>, <a
|
|
|
|
href="#cxx">C++</a>, and <a href="#objcxx">Objective-C++</a> as well as many
|
|
|
|
dialects of those. For language-specific information, please see the
|
|
|
|
corresponding language specific section:</p>
|
|
|
|
|
|
|
|
<ul>
|
|
|
|
<li><a href="#c">C Language</a>: K&R C, ANSI C89, ISO C90, ISO C94
|
|
|
|
(C89+AMD1), ISO C99 (+TC1, TC2, TC3). </li>
|
|
|
|
<li><a href="#objc">Objective-C Language</a>: ObjC 1, ObjC 2, ObjC 2.1, plus
|
|
|
|
variants depending on base language.</li>
|
|
|
|
<li><a href="#cxx">C++ Language Features</a></li>
|
|
|
|
<li><a href="#objcxx">Objective C++ Language</a></li>
|
|
|
|
</ul>
|
|
|
|
|
|
|
|
<p>In addition to these base languages and their dialects, Clang supports a
|
|
|
|
broad variety of language extensions, which are documented in the corresponding
|
|
|
|
language section. These extensions are provided to be compatible with the GCC,
|
|
|
|
Microsoft, and other popular compilers as well as to improve functionality
|
|
|
|
through Clang-specific features. The Clang driver and language features are
|
|
|
|
intentionally designed to be as compatible with the GNU GCC compiler as
|
|
|
|
reasonably possible, easing migration from GCC to Clang. In most cases, code
|
|
|
|
"just works".</p>
|
|
|
|
|
|
|
|
<p>In addition to language specific features, Clang has a variety of features
|
|
|
|
that depend on what CPU architecture or operating system is being compiled for.
|
|
|
|
Please see the <a href="target_features">Target-Specific Features and
|
|
|
|
Limitations</a> section for more details.</p>
|
|
|
|
|
|
|
|
<p>The rest of the introduction introduces some basic <a
|
|
|
|
href="#terminology">compiler terminology</a> that is used throughout this manual
|
|
|
|
and contains a basic <a href="#basicusage">introduction to using Clang</a>
|
|
|
|
as a command line compiler.</p>
|
|
|
|
|
|
|
|
<!-- = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = -->
|
|
|
|
<h3 id="terminology">Terminology</h3>
|
|
|
|
<!-- = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = -->
|
|
|
|
|
|
|
|
<p>Front end, parser, backend, preprocessor, undefined behavior, diagnostic,
|
|
|
|
optimizer</p>
|
|
|
|
|
|
|
|
<!-- = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = -->
|
|
|
|
<h3 id="basicusage">Basic Usage</h3>
|
|
|
|
<!-- = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = -->
|
|
|
|
|
|
|
|
<p>Intro to how to use a C compiler for newbies.</p>
|
|
|
|
<p>
|
|
|
|
compile + link
|
|
|
|
|
|
|
|
compile then link
|
|
|
|
|
|
|
|
debug info
|
|
|
|
|
|
|
|
enabling optimizations
|
|
|
|
|
|
|
|
picking a language to use, defaults to C99 by default. Autosenses based on
|
|
|
|
extension.
|
|
|
|
|
|
|
|
using a makefile
|
|
|
|
</p>
|
|
|
|
|
|
|
|
|
|
|
|
<!-- ======================================================================= -->
|
|
|
|
<h2 id="commandline">Command Line Options</h2>
|
|
|
|
<!-- ======================================================================= -->
|
|
|
|
|
|
|
|
<p>
|
|
|
|
This section is generally an index into other sections. It does not go into
|
2009-04-20 14:00:23 +08:00
|
|
|
depth on the ones that are covered by other sections. However, the first part
|
|
|
|
introduces the language selection and other high level options like -c, -g, etc.
|
2009-04-20 12:23:09 +08:00
|
|
|
</p>
|
|
|
|
|
2009-04-20 14:00:23 +08:00
|
|
|
|
|
|
|
<!-- = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = -->
|
|
|
|
<h3 id="cl_diagnostics">Options to Control Error and Warning Messages</h3>
|
|
|
|
<!-- = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = -->
|
|
|
|
|
|
|
|
<p><b>-Werror</b>: Turn warnings into errors.</p>
|
|
|
|
<p><b>-Werror=foo</b>: Turn warning "foo" into an error.</p>
|
|
|
|
<p><b>-Wno-error=foo</b>: Turn warning "foo" into an warning even if -Werror is
|
|
|
|
specified.</p>
|
|
|
|
<p><b>-Wfoo</b>: Enable warning foo</p>
|
|
|
|
<p><b>-Wno-foo</b>: Disable warning foo</p>
|
|
|
|
<p><b>-w</b>: Disable all warnings.</p>
|
|
|
|
<p><b>-pedantic</b>: Warn on language extensions.</p>
|
|
|
|
<p><b>-pedantic-errors</b>: Error on language extensions.</p>
|
|
|
|
<p><b>-Wsystem-headers</b>: Enable warnings from system headers.</p>
|
|
|
|
|
|
|
|
<!-- ================================================= -->
|
|
|
|
<h4 id="cl_diag_formatting">Formatting of Diagnostics</h4>
|
|
|
|
<!-- ================================================= -->
|
|
|
|
|
|
|
|
<p>Clang aims to produce beautiful diagnostics by default, particularly for new
|
|
|
|
users that first come to Clang. However, different people have different
|
2009-04-20 14:26:18 +08:00
|
|
|
preferences, and sometimes Clang is driven by another program that wants to
|
|
|
|
parse simple and consistent output, not a person. For these cases, Clang
|
|
|
|
provides a wide range of options to control the exact output format of the
|
|
|
|
diagnostics that it generates.</p>
|
2009-04-20 14:00:23 +08:00
|
|
|
|
|
|
|
<dl>
|
|
|
|
|
|
|
|
<!-- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -->
|
|
|
|
<dt id="opt_fshow-column"><b>-f[no-]show-column</b>: Print column number in
|
|
|
|
diagnostic.</dt>
|
|
|
|
<dd>This option, which defaults to on, controls whether or not Clang prints the
|
|
|
|
column number of a diagnostic. For example, when this is enabled, Clang will
|
|
|
|
print something like:</p>
|
|
|
|
|
|
|
|
<pre>
|
|
|
|
test.c:28:8: warning: extra tokens at end of #endif directive [-Wextra-tokens]
|
|
|
|
#endif bad
|
|
|
|
^
|
|
|
|
//
|
|
|
|
</pre>
|
|
|
|
|
|
|
|
<p>When this is disabled, Clang will print "test.c:28: warning..." with no
|
|
|
|
column number.</p>
|
|
|
|
</dd>
|
|
|
|
|
|
|
|
<!-- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -->
|
|
|
|
<dt id="opt_fshow-source-location"><b>-f[no-]show-source-location</b>: Print
|
|
|
|
source file/line/column information in diagnostic.</dt>
|
|
|
|
<dd>This option, which defaults to on, controls whether or not Clang prints the
|
|
|
|
filename, line number and column number of a diagnostic. For example,
|
|
|
|
when this is enabled, Clang will print something like:</p>
|
|
|
|
|
|
|
|
<pre>
|
|
|
|
test.c:28:8: warning: extra tokens at end of #endif directive [-Wextra-tokens]
|
|
|
|
#endif bad
|
|
|
|
^
|
|
|
|
//
|
|
|
|
</pre>
|
|
|
|
|
|
|
|
<p>When this is disabled, Clang will not print the "test.c:28:8: " part.</p>
|
|
|
|
</dd>
|
|
|
|
|
|
|
|
<!-- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -->
|
|
|
|
<dt id="opt_fcaret-diagnostics"><b>-f[no-]caret-diagnostics</b>: Print source
|
|
|
|
line and ranges from source code in diagnostic.</dt>
|
|
|
|
<dd>This option, which defaults to on, controls whether or not Clang prints the
|
|
|
|
source line, source ranges, and caret when emitting a diagnostic. For example,
|
|
|
|
when this is enabled, Clang will print something like:</p>
|
|
|
|
|
|
|
|
<pre>
|
|
|
|
test.c:28:8: warning: extra tokens at end of #endif directive [-Wextra-tokens]
|
|
|
|
#endif bad
|
|
|
|
^
|
|
|
|
//
|
|
|
|
</pre>
|
|
|
|
|
|
|
|
<p>When this is disabled, Clang will just print:</p>
|
|
|
|
|
|
|
|
<pre>
|
|
|
|
test.c:28:8: warning: extra tokens at end of #endif directive [-Wextra-tokens]
|
|
|
|
</pre>
|
|
|
|
|
|
|
|
</dd>
|
|
|
|
|
|
|
|
<!-- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -->
|
|
|
|
<dt id="opt_fdiagnostics-show-option"><b>-f[no-]diagnostics-show-option</b>:
|
|
|
|
Enable <tt>[-Woption]</tt> information in diagnostic line.</dt>
|
|
|
|
<dd>This option, which defaults to on,
|
|
|
|
controls whether or not Clang prints the associated <A
|
|
|
|
href="#cl_diag_warning_groups">warning group</a> option name when outputting
|
|
|
|
a warning diagnostic. For example, in this output:</p>
|
|
|
|
|
|
|
|
<pre>
|
|
|
|
test.c:28:8: warning: extra tokens at end of #endif directive [-Wextra-tokens]
|
|
|
|
#endif bad
|
|
|
|
^
|
|
|
|
//
|
|
|
|
</pre>
|
|
|
|
|
|
|
|
<p>Passing <b>-fno-diagnostics-show-option</b> will prevent Clang from printing
|
|
|
|
the [<a href="#opt_Wextra-tokens">-Wextra-tokens</a>] information in the
|
|
|
|
diagnostic. This information tells you the flag needed to enable or disable the
|
|
|
|
diagnostic, either from the command line or through <a
|
|
|
|
href="#pragma_GCC_diagnostic">#pragma GCC diagnostic</a>.</dd>
|
|
|
|
|
|
|
|
|
|
|
|
<!-- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -->
|
|
|
|
<dt id="opt_fdiagnostics-fixit-info"><b>-f[no-]diagnostics-fixit-info</b>:
|
|
|
|
Enable "FixIt" information in the diagnostics output.</dt>
|
|
|
|
<dd>This option, which defaults to on, controls whether or not Clang prints the
|
|
|
|
information on how to fix a specific diagnostic underneath it when it knows.
|
|
|
|
For example, in this output:</p>
|
|
|
|
|
|
|
|
<pre>
|
|
|
|
test.c:28:8: warning: extra tokens at end of #endif directive [-Wextra-tokens]
|
|
|
|
#endif bad
|
|
|
|
^
|
|
|
|
//
|
|
|
|
</pre>
|
|
|
|
|
|
|
|
<p>Passing <b>-fno-diagnostics-fixit-info</b> will prevent Clang from printing
|
|
|
|
the "//" line at the end of the message. This information is useful for users
|
|
|
|
who may not understand what is wrong, but can be confusing for machine
|
|
|
|
parsing.</p>
|
|
|
|
</dd>
|
|
|
|
|
|
|
|
<!-- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -->
|
2009-04-21 13:35:32 +08:00
|
|
|
<dt id="opt_fdiagnostics-print-source-range-info">
|
|
|
|
<b>-f[no-]diagnostics-print-source-range-info</b>:
|
2009-04-20 14:00:23 +08:00
|
|
|
Print machine parsable information about source ranges.</dt>
|
|
|
|
<dd>This option, which defaults to off, controls whether or not Clang prints
|
|
|
|
information about source ranges in a machine parsable format after the
|
|
|
|
file/line/column number information. The information is a simple sequence of
|
|
|
|
brace enclosed ranges, where each range lists the start and end line/column
|
|
|
|
locations. For example, in this output:</p>
|
|
|
|
|
|
|
|
<pre>
|
|
|
|
exprs.c:47:15:{47:8-47:14}{47:17-47:24}: error: invalid operands to binary expression ('int *' and '_Complex float')
|
|
|
|
P = (P-42) + Gamma*4;
|
|
|
|
~~~~~~ ^ ~~~~~~~
|
|
|
|
</pre>
|
|
|
|
|
2009-04-21 13:35:32 +08:00
|
|
|
<p>The {}'s are generated by -fdiagnostics-print-source-range-info.</p>
|
2009-04-20 14:00:23 +08:00
|
|
|
</dd>
|
|
|
|
|
|
|
|
|
|
|
|
</dl>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<!-- ===================================================== -->
|
|
|
|
<h4 id="cl_diag_warning_groups">Individual Warning Groups</h4>
|
|
|
|
<!-- ===================================================== -->
|
|
|
|
|
|
|
|
<p>TODO: Generate this from tblgen. Define one anchor per warning group.</p>
|
|
|
|
|
|
|
|
|
|
|
|
<dl>
|
|
|
|
|
|
|
|
|
|
|
|
<!-- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -->
|
|
|
|
<dt id="opt_Wextra-tokens"><b>-Wextra-tokens</b>: Warn about excess tokens at
|
|
|
|
the end of a preprocessor directive.</dt>
|
|
|
|
<dd>This option, which defaults to on, enables warnings about extra tokens at
|
|
|
|
the end of preprocessor directives. For example:</p>
|
|
|
|
|
|
|
|
<pre>
|
|
|
|
test.c:28:8: warning: extra tokens at end of #endif directive [-Wextra-tokens]
|
|
|
|
#endif bad
|
|
|
|
^
|
|
|
|
</pre>
|
|
|
|
|
|
|
|
<p>These extra tokens are not strictly conforming, and are usually best handled
|
|
|
|
by commenting them out.</p>
|
|
|
|
|
|
|
|
<p>This option is also enabled by <a href="">-Wfoo</a>, <a href="">-Wbar</a>,
|
|
|
|
and <a href="">-Wbaz</a>.</p>
|
|
|
|
</dd>
|
|
|
|
|
|
|
|
</dl>
|
|
|
|
|
2009-04-20 12:23:09 +08:00
|
|
|
<!-- ======================================================================= -->
|
|
|
|
<h2 id="general_features">Language and Target-Independent Features</h2>
|
|
|
|
<!-- ======================================================================= -->
|
|
|
|
|
|
|
|
|
|
|
|
<!-- = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = -->
|
|
|
|
<h3 id="diagnostics">Controlling Errors and Warnings</h3>
|
|
|
|
<!-- = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = -->
|
|
|
|
|
2009-04-20 14:00:23 +08:00
|
|
|
<p>Clang provides a number of ways to control which code constructs cause it to
|
2009-04-20 14:26:18 +08:00
|
|
|
emit errors and warning messages, and how they are displayed to the console.</p>
|
2009-04-20 14:00:23 +08:00
|
|
|
|
2009-04-20 14:26:18 +08:00
|
|
|
<h4>Controlling How Clang Displays Diagnostics</h4>
|
2009-04-20 14:00:23 +08:00
|
|
|
|
2009-04-20 14:26:18 +08:00
|
|
|
<p>When Clang emits a diagnostic, it includes rich information in the output,
|
|
|
|
and gives you fine-grain control over which information is printed. Clang has
|
|
|
|
the ability to print this information, and these are the options that control
|
|
|
|
it:</p>
|
|
|
|
|
|
|
|
<p>
|
|
|
|
<ol>
|
|
|
|
<li>A file/line/column indicator that shows exactly where the diagnostic occurs
|
|
|
|
in your code [<a href="#opt_fshow-column">-fshow-column</a>, <a
|
|
|
|
href="#opt_fshow-source-location">-fshow-source-location</a>].</li>
|
|
|
|
<li>A categorization of the diagnostic as a note, warning, error, or fatal
|
|
|
|
error.</li>
|
|
|
|
<li>A text string that describes what the problem is.</li>
|
|
|
|
<li>An option that indicates how to control the diagnostic (for diagnostics that
|
|
|
|
support it) [<a
|
|
|
|
href="#opt_fdiagnostics-show-option">-fdiagnostics-show-option</a>].</li>
|
|
|
|
<li>The line of source code that the issue occurs on, along with a caret and
|
|
|
|
ranges that indicate the important locations [<a
|
|
|
|
href="opt_fcaret-diagnostics">-fcaret-diagnostics</a>].</li>
|
|
|
|
<li>"FixIt" information, which is a concise explanation of how to fix the
|
|
|
|
problem (when Clang is certain it knows) [<a
|
|
|
|
href="opt_fdiagnostics-fixit-info">-fdiagnostics-fixit-info</a>].</li>
|
|
|
|
<li>A machine-parsable representation of the ranges involved (off by
|
|
|
|
default) [<a
|
2009-04-21 13:35:32 +08:00
|
|
|
href="opt_fdiagnostics-print-source-range-info">-fdiagnostics-print-source-range-info</a>].</li>
|
2009-04-20 14:26:18 +08:00
|
|
|
</ol></p>
|
|
|
|
|
|
|
|
<p>For more information please see <a href="#cl_diag_formatting">Formatting of
|
|
|
|
Diagnostics</a>.</p>
|
|
|
|
|
|
|
|
<h4>Controlling Which Diagnostics Clang Generates</h4>
|
|
|
|
|
|
|
|
<p>mappings: ignore, note, warning, error, fatal</p>
|
|
|
|
|
|
|
|
<p>
|
|
|
|
The two major classes are control from the command line and control via pragmas
|
|
|
|
in your code.</p>
|
|
|
|
|
|
|
|
|
|
|
|
<p>-W flags, -pedantic, etc</p>
|
|
|
|
|
|
|
|
<p>pragma GCC diagnostic</p>
|
2009-04-20 12:23:09 +08:00
|
|
|
|
|
|
|
<!-- = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = -->
|
|
|
|
<h3 id="precompiledheaders">Precompiled Headers</h3>
|
|
|
|
<!-- = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = -->
|
|
|
|
|
2009-04-20 12:37:38 +08:00
|
|
|
<p><a href="http://en.wikipedia.org/wiki/Precompiled_header">Precompiled
|
|
|
|
headers</a> are a general approach employed by many compilers to reduce
|
|
|
|
compilation time. The underlying motivation of the approach is that it is
|
|
|
|
common for the same (and often large) header files to be included by
|
|
|
|
multiple source files. Consequently, compile times can often be greatly improved
|
|
|
|
by caching some of the (redundant) work done by a compiler to process headers.
|
|
|
|
Precompiled header files, which represent one of many ways to implement
|
|
|
|
this optimization, are literally files that represent an on-disk cache that
|
|
|
|
contains the vital information necessary to reduce some of the work
|
|
|
|
needed to process a corresponding header file. While details of precompiled
|
|
|
|
headers vary between compilers, precompiled headers have been shown to be a
|
|
|
|
highly effective at speeding up program compilation on systems with very large
|
|
|
|
system headers (e.g., Mac OS/X).</p>
|
|
|
|
|
|
|
|
<p>Clang supports an implementation of precompiled headers known as
|
|
|
|
<em>pre-tokenized headers</em> (PTH). Clang's pre-tokenized headers support most
|
|
|
|
of same interfaces as GCC's pre-compiled headers (as well as others) but are
|
|
|
|
completely different in their implementation. If you are interested in how
|
|
|
|
PTH is implemented, please see the <a href="PTHInternals.html">PTH Internals
|
|
|
|
document</a>.</p>
|
|
|
|
|
|
|
|
<h4>Generating a PTH File</h4>
|
|
|
|
|
|
|
|
<p>To generate a PTH file using Clang, one invokes Clang with
|
|
|
|
the <b><tt>-x <i><language></i>-header</tt></b> option. This mirrors the
|
|
|
|
interface in GCC for generating PCH files:</p>
|
|
|
|
|
|
|
|
<pre>
|
|
|
|
$ gcc -x c-header test.h -o test.h.gch
|
|
|
|
$ clang -x c-header test.h -o test.h.pth
|
|
|
|
</pre>
|
|
|
|
|
|
|
|
<h4>Using a PTH File</h4>
|
|
|
|
|
|
|
|
<p>A PTH file can then be used as a prefix header when a
|
|
|
|
<b><tt>-include</tt></b> option is passed to <tt>clang</tt>:</p>
|
|
|
|
|
|
|
|
<pre>
|
|
|
|
$ clang -include test.h test.c -o test
|
|
|
|
</pre>
|
|
|
|
|
|
|
|
<p>The <tt>clang</tt> driver will first check if a PTH file for <tt>test.h</tt>
|
|
|
|
is available; if so, the contents of <tt>test.h</tt> (and the files it includes)
|
|
|
|
will be processed from the PTH file. Otherwise, Clang falls back to
|
|
|
|
directly processing the content of <tt>test.h</tt>. This mirrors the behavior of
|
|
|
|
GCC.</p>
|
|
|
|
|
2009-04-22 01:14:24 +08:00
|
|
|
<p><b>NOTE:</b> Clang does <em>not</em> automatically use PTH files
|
2009-04-20 12:37:38 +08:00
|
|
|
for headers that are directly included within a source file. For example:</p>
|
|
|
|
|
|
|
|
<pre>
|
|
|
|
$ clang -x c-header test.h -o test.h.pth
|
|
|
|
$ cat test.c
|
|
|
|
#include "test.h"
|
|
|
|
$ clang test.c -o test
|
|
|
|
</pre>
|
|
|
|
|
|
|
|
<p>In this example, <tt>clang</tt> will not automatically use the PTH file for
|
|
|
|
<tt>test.h</tt> since <tt>test.h</tt> was included directly in the source file
|
|
|
|
and not specified on the command line using <tt>-include</tt>.</p>
|
2009-04-20 12:23:09 +08:00
|
|
|
|
|
|
|
|
|
|
|
<!-- ======================================================================= -->
|
|
|
|
<h2 id="c">C Language Features</h2>
|
|
|
|
<!-- ======================================================================= -->
|
|
|
|
|
|
|
|
|
|
|
|
<!-- = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = -->
|
|
|
|
<h3 id="c_incompatibilities">Intentional Incompatibilities with GCC</h3>
|
|
|
|
<!-- = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = -->
|
|
|
|
|
|
|
|
<p>No VLAs in structs.</p>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<!-- ======================================================================= -->
|
|
|
|
<h2 id="objc">Objective-C Language Features</h2>
|
|
|
|
<!-- ======================================================================= -->
|
|
|
|
|
|
|
|
|
|
|
|
<!-- = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = -->
|
|
|
|
<h3 id="objc_incompatibilities">Intentional Incompatibilities with GCC</h3>
|
|
|
|
<!-- = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = -->
|
|
|
|
|
|
|
|
<p>No cast of super, no lvalue casts.</p>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<!-- ======================================================================= -->
|
|
|
|
<h2 id="cxx">C++ Language Features</h2>
|
|
|
|
<!-- ======================================================================= -->
|
|
|
|
|
|
|
|
<p>At this point, Clang C++ is not generally useful. However, Clang C++ support
|
|
|
|
is under active development and is progressing rapidly. Please see the <a
|
|
|
|
href="http://clang.llvm.org/cxx_status.html">C++ Status</a> page for details or
|
|
|
|
ask on the mailing list about how you can help.</p>
|
|
|
|
|
|
|
|
<p>Note that the clang driver will refuse to even try to use clang to compile
|
|
|
|
C++ code unless you pass the <tt>-ccc-clang-cxx</tt> option to the driver. If
|
|
|
|
you really want to play with Clang's C++ support, please pass that flag. </p>
|
|
|
|
|
|
|
|
<!-- ======================================================================= -->
|
|
|
|
<h2 id="objcxx">Objective C++ Language Features</h2>
|
|
|
|
<!-- ======================================================================= -->
|
|
|
|
|
|
|
|
<p>At this point, Clang C++ support is not generally useful (and therefore,
|
|
|
|
neither is Objective-C++). Please see the <a href="#cxx">C++ section</a> for
|
|
|
|
more information.</p>
|
|
|
|
|
|
|
|
<!-- ======================================================================= -->
|
|
|
|
<h2 id="target_features">Target-Specific Features and Limitations</h2>
|
|
|
|
<!-- ======================================================================= -->
|
|
|
|
|
|
|
|
|
|
|
|
<!-- = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = -->
|
|
|
|
<h3 id="target_arch">CPU Architectures Features and Limitations</h3>
|
|
|
|
<!-- = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = -->
|
|
|
|
|
|
|
|
<!-- ======================== -->
|
|
|
|
<h4 id="target_arch_x86">X86</h4>
|
|
|
|
<!-- ======================== -->
|
|
|
|
|
|
|
|
|
|
|
|
<!-- = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = -->
|
|
|
|
<h3 id="target_os">Operating System Features and Limitations</h3>
|
|
|
|
<!-- = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = -->
|
|
|
|
|
|
|
|
<!-- ======================================= -->
|
|
|
|
<h4 id="target_os_darwin">Darwin (Mac OS/X)</h4>
|
|
|
|
<!-- ======================================= -->
|
|
|
|
|
|
|
|
<p>No __thread support, 64-bit ObjC support requires SL tools.</p>
|
|
|
|
|
|
|
|
</div>
|
|
|
|
</body>
|
|
|
|
</html>
|