【发布时间】:2016-06-22 12:43:10
【问题描述】:
我需要使用 clang 的 API 转储源代码的块活跃度。我曾尝试打印块活性,但没有成功。以下是我尝试过的代码
bool MyASTVisitor::VisitFunctionDecl(FunctionDecl *f) {
std::cout<<"Dump Liveness\n";
clang::AnalysisDeclContextManager adcm;
clang::AnalysisDeclContext *adc = adcm.getContext(llvm::cast<clang::Decl>(f));
//clang::LiveVariables *lv = clang::LiveVariables::create(*adc);
//clang::LiveVariables *lv = clang::LiveVariables::computeLiveness(*adc,false);
clang::LiveVariables *lv = adc->getAnalysis<LiveVariables>();
clang::LiveVariables::Observer *obs = new clang::LiveVariables::Observer();
lv->runOnAllBlocks(*obs);
lv->dumpBlockLiveness((f->getASTContext()).getSourceManager());
return true;
}
我已覆盖访问者函数并尝试打印函数的活跃度。我尝试使用 create、computeLiveness 和 getAnalysis 方法来获取 LiveVariables 对象,但所有方法都失败了。但是除了区块号之外没有显示任何活跃度信息。
当我使用 clang 的命令行参数打印活性时,它会正确显示输出。
我使用以下源代码作为测试用例,取自Live Variable Analysis Wikipedia .
int main(int argc, char *argv[])
{
int a,b,c,d,x;
a = 3;
b = 5;
d = 4;
x = 100;
if(a>b){
c = a+b;
d = 2;
}
c = 4;
return b * d + c;
}
有人能指出我哪里错了吗? 提前致谢。
【问题讨论】:
标签: c++ clang abstract-syntax-tree clang++