如何编写一个clang插件,在编译时为原始代码注入一些代码

时间:2013-10-13 15:04:51

标签: c++ clang llvm

我遇到了一个关于如何编写一个会改变代码的clang插件的问题。 我想为程序注入一些代码,就像这样:在这里输入代码

//the original code
//the filename is user_code.cpp
int f1(){
    return 1;
}
int f2(){
    return 2;
}
int f3(){
    return 3;
}
int main(){
   for(int i=0;i<1000;i++)f1();
   for(int i=0;i<10000;i++)f2();
   for(int i=0;i<100000;i++)f3();
   return 0;
}
//the injected code
int function_counter[3];
int f1(){
    function_counter[0]++;
    return 1;
}
int f2(){
    function_counter[1]++;
    return 2;
}
int f3(){
    function_counter[2]++;
    return 3;
}
int main(){
   for(int i=0;i<1000;i++)f1();
   for(int i=0;i<10000;i++)f2();
   for(int i=0;i<100000;i++)f3();
   return 0;
}

现在,我可以通过将此代码解析为AST并遍历它,使用ReWriter类修改代码,最后将修改后的代码重写为新文件来实现。但这对user.i要求不透明写一个clang插件,用户只需输入命令:

 clang -load myplugin.so -plugin myplugin user_code.cpp -o user_code.o

首先可以透明地注入代码,然后像usualy一样编译。我可以做什么?有什么建议吗?

0 个答案:

没有答案