# Precompiled Headers

This document describes the design and implementation of Clang's precompiled headers (PCH). If you are interested in the end-user view, please see the User's Manual.

## Using precompiled headers with `clang-cc`

The low-level Clang compiler, `clang-cc`, supports two command line options for generating and using PCH files.

To generate PCH files using `clang-cc`, use the option `-emit-pch`:

     $ clang-cc test.h -emit-pch -o test.h.pch

This option is transparently used by `clang` when generating PCH files. The resulting PCH file contains the serialized form of the compiler's internal representation after it has completed parsing and semantic analysis. The PCH file can then be used as a prefix header with the `-include-pch` option:

      $ clang-cc -include-pch test.h.pch test.c -o test.s

## PCH Design Philosophy

Precompiled headers are meant to improve overall compile times for projects, so the design of precompiled headers is entirely driven by performance concerns. The use case for precompiled headers is relatively simple: when there is a common set of headers that is included in nearly every source file in the project, we precompile that bundle of headers into a single precompiled header (PCH file). Then, when compiling the source files in the project, we load the PCH file first (as a prefix header), which acts as a stand-in for that bundle of headers.

A precompiled header implementation improves performance when:

- Loading the PCH file is significantly faster than re-parsing the bundle of headers stored within the PCH file. Thus, a precompiled header design attempts to minimize the cost of reading the PCH file. Ideally, this cost should not vary with the size of the precompiled header file.
- The cost of generating the PCH file initially is not so large that it counters the per-source-file performance improvement due to eliminating the need to parse the bundled headers in the first place. This is particularly important on multi-core systems, because PCH file generation serializes the build when all compilations require the PCH file to be up-to-date.

More to be written...