入门:编译和运行 Clang

    Clang 作为常规 LLVM 的一部分来发行。你可以从 http://llvm.org/releases/ 下载。

    1. 获取必须的工具
    2. Checkout LLVM:
      • 到你想要保存 llvm 的目录
      • svn co http://llvm.org/svn/llvm-project/llvm/trunk llvm
    3. Checkout Clang:
      • cd llvm/tools
      • svn co http://llvm.org/svn/llvm-project/cfe/trunk clang
      • cd ../..
    4. Checkout 额外的 Clang 工具:(可选)
      • svn co http://llvm.org/svn/llvm-project/clang-tools-extra/trunk extra
      • cd ../../../..
    5. Checkout Compiler-RT:
      • cd llvm/projects
      • svn co http://llvm.org/svn/llvm-project/compiler-rt/trunk compiler-rt
      • cd ../..
    6. 编译 LLVM 和 Clang:
      • mkdri build (为了编译的时候不污染源代码目录)
      • cd build
      • ../llvm/configure
      • make
      • 这将编译 LLVM 和 Clang 的 Debug 版本
      • 注意:为了后续的 Clang 开发,你可以只在 clang 目录层 make
      • 也可以使用 CMake 代替 makefiles。使用 CMake 可以为不同的IDE 生成工程文件:Xcode, Eclipse CDT4, CodeBlocks, Qt-Creator(使用 CodeBlocks 产生器), KDevelop3。
    7. 如果你想要使用 Clang 的 C++ 支持,你需要告诉它如何找到你的 C++ 标准库头文件。一般地,Clang 会探测 libstdc++ 可用的最好版本并使用它们-它既会找系统安装的 libstdc++,也会找随 Clang 安装的。如果你的配置不满足,你可以使用 --with-gcc-toolchain 配置选项来告诉 Clang gcc 包含的 libstdc++ 安装位置。
    8. 尝试这些(假定你添加了 llvm/Debug+Asserts/bin 到你的 path 中):
      • clang file.c -fsyntax-only (检查正确性)
      • clang file.c -S -emit-llvm -o - (打印未做优化的 llvm 代码)
      • clang file.c -S -emit-llvm -o - -O3
      • clang file.c -S -O3 -o - (打印出本地机器代码)

    注意 C 前端 使用的是 LLVM,但是并不依赖 llvm-gcc。如果你编译 Clang 的过程中遇到了问题,确保你具有最新的 SVN 版本的 LLVM。LLVM 包含了 Clang 的支持库。

    同时编译 Clang 和 LLVM

    注意:观察 Clang 在技术上是一个单独的 Subversion 源的一部分。如上所述,最新的 Clang 源代码绑定到了最新的 LLVM 代码树中。你可以使用 make update 更新顶层的 LLVM 工程(可能是无关的)和所有包含在内的工程。这将会执行 svn update 在所有相关联的 subversion。

    预处理:

    1. $ clang ~/t.c -E
    2. # 1 "/Users/oxnz/t.c" 1
    3. typedef float V __attribute__((vector_size(16)));
    4. V foo(V a, V b) { return a+b*a; }

    GCC 选项:

    1. $ clang -fsyntax-only ~/t.c -pedantic
    2. /Users/oxnz/t.c:2:17: warning: extension used
    3. typedef float V __attribute__((vector_size(16)));
    4. 1 diagnostic generated.

    LLVM 代码生成:

    1. $ clang ~/t.c -S -emit-llvm -o -
    2. define <4 x float> @foo(<4 x float> %a, <4 x float> %b) {
    3. entry:
    4. %mul = mul <4 x float> %b, %a
    5. %add = add <4 x float> %mul, %a
    6. ret <4 x float> %add
    7. }
    8. $ clang -fomit-frame-pointer -O3 -S -o - t.c # On x86_64
    9. ...
    10. _foo:
    11. Leh_func_begin1:
    12. mulps %xmm0, %xmm1
    13. addps %xmm1, %xmm0
    14. Leh_func_end1: