使用插件修改clangast

使用插件修改clangast,clang,llvm,Clang,Llvm,我想用一个插件来修改ClangAST。 我有以下使用ClangRewriter对象的建议。 我使用compiler.createDefaultOutputFile()获取输出流,将更改后的文件写入其中。 编译工作正常,但生成的对象文件已损坏。 我收到以下链接器错误:“无法识别文件格式” 生成命令行: clang++-8-Xclang-load-Xclang-libcashpp.so-Xclang-addplugin-Xclang-cashptest.cpp 生成输出: /tmp/test-eb7

我想用一个插件来修改ClangAST。 我有以下使用ClangRewriter对象的建议。 我使用compiler.createDefaultOutputFile()获取输出流,将更改后的文件写入其中。 编译工作正常,但生成的对象文件已损坏。 我收到以下链接器错误:“无法识别文件格式”

生成命令行: clang++-8-Xclang-load-Xclang-libcashpp.so-Xclang-addplugin-Xclang-cashptest.cpp

生成输出: /tmp/test-eb7d3d.o:未识别文件:未识别文件格式

问题:

  • 是否可以使用叮当声插件更新AST
  • 有人能给我举个例子吗
源代码:

#包括
#包括
#包括
#包括
#包括“clang/Rewrite/Core/Rewriter.h”
#包括
#包括
#包括
#包括
#包括
名称空间{
类VarDeclVisitor:public clang::RecursiveASTVisitor{
公众:
VarDeclVisitor(铿锵::重写器和重写器)
:重写器(重写器)
{}
bool VisitCallExpr(clang::CallExpr*ce){
自动q=ce->getType();
auto t=q.getTypePtrOrNull();
如果(t!=NULL){
auto callee=ce->getDirectCallee();
auto funcName=callee->getNameInfo().getAsString();
如果(funcName==“getInstanceName”){
重写器.ReplaceText(ce->getBeginLoc(),被调用方->getIdentifier()->getName().size(),“getInstanceName2”);
}
}
返回true;
}
私人:
叮当声:重写器&重写器;
};
类MyASTConsumer:public clang::ASTConsumer{
使用Base=clang::ASTConsumer;
公众:
MyASTConsumer(std::unique_ptr&&os)
:操作系统(标准::移动(操作系统))
{}
void HandleTranslationUnit(clang::ASTContext和context)重写{
clang::Rewriter-Rewriter(context.getSourceManager(),context.getLangOpts());
VarDeclVisitor访问者(重写器);
auto&source\u manager=context.getSourceManager();
const auto&mainFileID=source_manager.getMainFileID();
const auto&decls=context.getTranslationUnitDecl()->decls();
用于(自动和终止:终止){
const auto&fileID=source_manager.getFileID(decl->getLocation());
if(fileID!=mainFileID)
继续;
访客:特拉维塞德尔(decl);
}   
auto rwbuf=rewriter.getRewriteBufferFor(mainFileID);
if(rwbuf){
*操作系统开始(),rwbuf->end();
}否则{
*操作系统_