c++ - 如何将 Compiler 实例和 ASTConsumer 与 clang 3.6 一起使用

标签 c++ clang++ llvm-clang

我有一个基于 clang 的小工具,它创建一个编译器实例,并且能够解析 C 头文件。该工具在 clang 3.4 和 3.5 上运行良好。

我首先创建了一个编译器实例,并将其与从 ASTConsumer 创建的新类一起使用:

ci = new clang::CompilerInstance()
ci.createDiagnostics();
ci.createFileManager();
ci.createSourceManager(ci.getFileManager());
std::shared_ptr<clang::TargetOptions> pto = std::make_shared<clang::TargetOptions>();
pto->Triple = llvm::sys::getDefaultTargetTriple();
clang::TargetInfo *pti = clang::TargetInfo::CreateTargetInfo(m_ci.getDiagnostics(), pto);
ci.setTarget(pti);
ci.createPreprocessor(clang::TU_Complete);
...     
//add source file and the headers paths
...
MyASTConsumer * myASTConsumerClassInstance = new MyASTConsumer;
ci.setASTConsumer(myASTConsumerClassInstance);
...
//parse the header file

其中 myASTConsumerClassInstance 是我像这样创建的类的实例(简化形式):

class MyASTConsumer : public clang::ASTConsumer
{
    MyASTConsumer()
    ~MyASTConsumer() {};
    virtual bool HandleTopLevelDecl( clang::DeclGroupRef d);
    virtual void HandleTagDeclDefinition( clang::TagDecl * d);
    private:
    std::vector<clang::TagDecl *> m_my_tags;
}

HandleTagDeclDefinition方法,所有在 vector m_my_tags 中注册的标签声明。因此,在解析过程之后,我能够从 myASTConsumerInstance 访问所有标记声明。

现在在 clang 3.6 api 中,方法 clang::CompilerInstance::setASTConsumer需要 std::unique_ptr<ASTConsumer> 。如何调整我的代码?

最佳答案

事实上替换它很容易

MyASTConsumer * myASTConsumerClassInstance = new MyASTConsumer;
ci.setASTConsumer(myASTConsumerClassInstance);

与:

ci.setASTConsumer(llvm::make_unique<MyASTConsumer>());

或:

MyASTConsumer * myASTConsumerClassInstance = new MyASTConsumer;
ci.setASTConsumer(llvm::make_unique<clang::ASTConsumer>(*myASTConsumerClassInstance));

关于c++ - 如何将 Compiler 实例和 ASTConsumer 与 clang 3.6 一起使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29411052/

相关文章:

c++ - 在 c++ Eclipse CDT 中使用不同的值构建

c++ - Crypto++ 验证大文件签名

c++ - 我可以在 using 声明中正确使用 C++20 概念吗?

c++ - Windows 上的 Clang/LLVM 7 和 8 多次初始化内联静态数据成员(同时使用 link.exe 和 lld-link.exe)

c++ - 访问其他线程堆栈变量如何在 C++ 中工作?

c++ - 如何处理 QThread 上的事件?

c++ - 将使用 ExternalProject_Add 构建的库链接到使用 CMAKE_CXX_COMPILER 配置的项目时出错

c++ - 模板化类构造函数的模板实例化

llvm - 在 LLVM 中查找特定变量的所有用途

llvm - 无法在 Ubuntu 16.04 上安装 llvm-9 或 clang-9