Plugins 如何注册clang预处理器插件? 我试图用C++接口为预处理器编写一个CLAN插件,希望能得到一些帮助。我已经阅读了使用ASTFrontendActions的clang插件教程,并尝试在线搜索预处理器插件,但我只比以前稍微深入了一点。我只会一遍又一遍地查找同一教程的参考资料,或者使用C接口查找指南
在对头文件进行了3天的挖掘之后,我想我已经将插件的父类缩小到了,但不能确定。我只有在尝试注册插件时才会出现构建错误,因为它需要与AST相关的东西。(我认为这是因为教程告诉我要使用的函数可以追溯到使用clang::PluginASTAction的函数。) 教程告诉我要注册的功能是: 静态前端插件注册::添加X(“我的插件名称”、“我的插件描述”)代码> 我以前从未和叮当一起工作过,所以我肯定是头朝下。一个星期后,我感觉自己被头文件淹没了。任何帮助都将不胜感激,因为我显然没有足够的创造力将AST教程应用于我的预处理器问题 编辑:所以,我已经克服了构建错误,现在所有的构建都很好。不幸的是,我不知道我是否真正注册了我的插件。在每一个函数中,我都试图打印到屏幕上,但在运行时什么也看不出来 这是我到目前为止所拥有的Plugins 如何注册clang预处理器插件? 我试图用C++接口为预处理器编写一个CLAN插件,希望能得到一些帮助。我已经阅读了使用ASTFrontendActions的clang插件教程,并尝试在线搜索预处理器插件,但我只比以前稍微深入了一点。我只会一遍又一遍地查找同一教程的参考资料,或者使用C接口查找指南,plugins,clang,preprocessor,Plugins,Clang,Preprocessor,在对头文件进行了3天的挖掘之后,我想我已经将插件的父类缩小到了,但不能确定。我只有在尝试注册插件时才会出现构建错误,因为它需要与AST相关的东西。(我认为这是因为教程告诉我要使用的函数可以追溯到使用clang::PluginASTAction的函数。) 教程告诉我要注册的功能是: 静态前端插件注册::添加X(“我的插件名称”、“我的插件描述”) 我以前从未和叮当一起工作过,所以我肯定是头朝下。一个星期后,我感觉自己被头文件淹没了。任何帮助都将不胜感激,因为我显然没有足够的创造力将AST教程应用于
//PluginTest.h
template class llvm::Registry<clang::PreprocessorFrontendAction>;
namespace clang {
typedef llvm::Registry<PreprocessorFrontendAction> PreprocessorFrontendPluginRegistry;
} // namespace clang
//PluginTest.cpp
namespace {
class TestPreprocessorFrontendAction : public PreprocessorFrontendAction{
public:
TestPreprocessorFrontendAction(){
cerr << "We have a constructor.\n";
}
protected:
virtual void ExecuteAction() {}
bool BeginSourceFileAction(CompilerInstance &CI, StringRef Filename){
setCompilerInstance(&CI);
cerr << "Inside BeginSourceFileAction. \n";
return true;
}
//This function should not be called by a PreprocessorFrontendAction
//and should be overloaded to return an abort. Or so say the headers.
virtual std::unique_ptr<ASTConsumer> CreateASTConsumer(CompilerInstance &CI, StringRef InFile) {
cerr << "Inside the badness.\n";
return null ptr;
}
void EndSourceFileAction() {
cerr << "We have ignition?\n";
}
};
}
static PreprocessorFrontendPluginRegistry::Add<TestPreprocessorFrontendAction> X(
"test-plugin",
"Test preprocessor plugin");
//pluginest.h
模板类llvm::Registry;
名称空间响声{
注册表预处理器FrontEndPluginRegistry;
}//名称空间叮当声
//插件
名称空间{
类TestPreprocessFrontEndAction:公共预处理器FrontEndAction{
公众:
TestPreprocessFrontEndAction(){
cerr如果您想编写一个挂接预处理器回调的铿锵插件,您必须按照以下方式进行:
#包括
#包括
#包括
使用名称空间铿锵;
类MyPPCallbacks:公共PPCallbacks{
公众:
//在这里实现回调
};
类别MyASTConsumer:公共ASTConsumer{
公众:
MyASTConsumer(编译器立场和CI){
CI.getPreprocessor().addPPCallbacks(std::make_unique());
}
};
类MyPluginasAction:公共PluginasAction{
公众:
理解如何编译和使用clang插件的独特方法