如何在 clang 3.6 中使用编译器实例和 ASTConsumer
How to use Compiler instance and ASTConsumer with clang 3.6
我有一个基于 clang 的小工具,它可以创建编译器实例并且能够解析 C 头文件。此工具适用于 clang 3.4 和 3.5。
我首先创建了一个编译器实例,并将其与从 ASTConsumer 创建的新 class 一起使用:
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 的实例(简化形式):
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
方法中,所有在向量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));
我有一个基于 clang 的小工具,它可以创建编译器实例并且能够解析 C 头文件。此工具适用于 clang 3.4 和 3.5。
我首先创建了一个编译器实例,并将其与从 ASTConsumer 创建的新 class 一起使用:
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 的实例(简化形式):
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
方法中,所有在向量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));