【LLVM】LLVM系列二 - Clang插件开发

接上一篇LLVM的介绍,我们认识了LLVM,现在可以尝试用前端-clang自定义我们需要的东西了。

注意:编写插件需要有C++基础。

一、准备工作

  1. clang/tools目录下新建插件文件夹(例:yb-plugin

    1
    2
    $ cd llvm/tools/clang/tools/
    $ mkdir yb-plugin

  2. 打开CMakeLists.txt(路径:llvm/tools/clang/tools/CMakeLists.txt),把要加载的插件加入到里面

1.1. 新建文件

yb-plugin目录下编写插件(插件是用C++编写的):

  • 新建CMakeLists.txt,目的是让llvm加载插件中哪些C++文件。文件内容:
1
add_llvm_library(YBPlugin MODULE BUILDTREE_ONLY YBPlugin.cpp)
  • YBPlugin是插件名,YBPlugin.cpp是源代码文件。

1.2. 编译插件

  1. 利用cmake生成的Xcode项目来编译插件(第一次编写完插件,需要利用cmake重新生成一下Xcode项目: $ cmake -G Xcode ../llvm)。

  1. 打开工程,选择Automatically Create Schemes

  1. 插件源代码在Sources/Loadable modules目录下可以找到,这样就可以直接在Xcode里编写插件代码。

二、编写插件

选择YBPlugin这个target进行编译,编译完会生成一个动态库文件(路径:llvm_xcode/Debug/lib/YBPlugin.dylib

三、加载插件

3.1. 新增加载项

在Xcode项目中指定加载插件动态库:在BuildSettings > Other C Flags里面添加-Xclang -load -Xclang 动态库路径 -Xclang -add-plugin -Xclang 插件名称

3.2. 修改自定义编译器(Hack Xcode)

编译后发现报错,是因为Xcode默认的编译器不允许使用插件,需要修改自定义编译器。

  1. 首先要对Xcode进行Hack,才能修改默认的编译器。
  2. 下载XcodeHacking.zip,解压,修改HackedClang.xcplugin/Contents/Resources/HackedClang.xcspec的内容,设置一下自己编译好的clang的路径(之前安装好的llvm_release/bin/clang)。

  1. 然后在XcodeHacking目录下输入命令(将XcodeHacking的内容剪切到Xcode内部)。

    1
    2
    3
    $ sudo mv HackedClang.xcplugin `xcode-select -print-path`/../PlugIns/Xcode3Core.ideplugin/Contents/SharedSupport/Developer/Library/Xcode/Plug-ins

    $ sudo mv HackedBuildSystem.xcspec `xcode-select -print-path`/Platforms/iPhoneSimulator.platform/Developer/Library/Xcode/Specifications
  2. 重启Xcode,选择编译器。

  1. 开始编译(编译项目后,会在编译日志看到YBPlugin插件的相关打印信息,如果插件更新了,最好先Clean一下项目)。

想要实现更复杂的插件功能,就需要利用clang的API针对语法树(AST)进行相应的分析和处理。

关于AST的资料: