Plugins 如何注册clang预处理器插件? 我试图用C++接口为预处理器编写一个CLAN插件,希望能得到一些帮助。我已经阅读了使用ASTFrontendActions的clang插件教程,并尝试在线搜索预处理器插件,但我只比以前稍微深入了一点。我只会一遍又一遍地查找同一教程的参考资料,或者使用C接口查找指南

Plugins 如何注册clang预处理器插件? 我试图用C++接口为预处理器编写一个CLAN插件,希望能得到一些帮助。我已经阅读了使用ASTFrontendActions的clang插件教程,并尝试在线搜索预处理器插件,但我只比以前稍微深入了一点。我只会一遍又一遍地查找同一教程的参考资料,或者使用C接口查找指南,plugins,clang,preprocessor,Plugins,Clang,Preprocessor,在对头文件进行了3天的挖掘之后,我想我已经将插件的父类缩小到了,但不能确定。我只有在尝试注册插件时才会出现构建错误,因为它需要与AST相关的东西。(我认为这是因为教程告诉我要使用的函数可以追溯到使用clang::PluginASTAction的函数。) 教程告诉我要注册的功能是: 静态前端插件注册::添加X(“我的插件名称”、“我的插件描述”) 我以前从未和叮当一起工作过,所以我肯定是头朝下。一个星期后,我感觉自己被头文件淹没了。任何帮助都将不胜感激,因为我显然没有足够的创造力将AST教程应用于

在对头文件进行了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插件的独特方法