Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/visual-studio/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用LLVM循环过程中的LLVM别名分析结果_Llvm_Static Analysis - Fatal编程技术网

使用LLVM循环过程中的LLVM别名分析结果

使用LLVM循环过程中的LLVM别名分析结果,llvm,static-analysis,Llvm,Static Analysis,我有一个LLVM循环通过,我需要检查 两个值可以互相别名。如果首先运行别名分析过程,然后运行循环过程,如何查询AA过程的结果? 它可能类似于: virtual bool runOnLoop(Loop *loop, LPPassManager &LPM) { Value *v1 = getValueSomehow(); Value *v2 = getValueSomeOtherWay(); // EDITED with compor's answer Al

我有一个LLVM循环通过,我需要检查 两个值可以互相别名。如果首先运行别名分析过程,然后运行循环过程,如何查询AA过程的结果? 它可能类似于:

virtual bool runOnLoop(Loop *loop, LPPassManager &LPM)
{
    Value *v1 = getValueSomehow();
    Value *v2 = getValueSomeOtherWay();

    // EDITED with compor's answer
    AliasAnalysis *AA = &getAnalysis<AAResultsWrapperPass>().getAAResults();

    if (AA->isNoAlias(v1,v2))
    {
        errs() << "OK";
    }
}
我得到以下运行时错误:

opt: PassAnalysisSupport.h:236: [...]:
Assertion `ResultPass && "getAnalysis*() called on an analysis that was not " "'required' by pass!"' failed.
...
Aborted (core dumped)
编辑:

仅仅把-basicaa通行证放在opt的前面是不够的。 事实上,正如compor所说,必须覆盖getAnalysisUsage, 并明确说明需要哪些通行证

struct StaticAnalyzer : public LoopPass
{
    static char ID;
    StaticAnalyzer():LoopPass(ID){}

    void getAnalysisUsage(AnalysisUsage &AU) const override
    {
        AU.addRequired<AAResultsWrapperPass>();
    }
    // ...
};
struct StaticAnalyzer:public LoopPass
{
静态字符ID;
StaticAnalyzer():LoopPass(ID){}
无效getAnalysisUsage(AnalysisUsage&AU)常量重写
{
AU.addRequired();
}
// ...
};

如有疑问,请按照LLVM的做法行事;例如,在本例中,请查看
llvm/lib/Transforms/Scalar/DeadStoreElimination.cpp

使用
llvm::legacy::PassManager
可以通过添加别名分析作为pass的一项要求来完成:

void getAnalysisUsage(AnalysisUsage &AU) const override {
    AU.addRequired<AAResultsWrapperPass>();
    [...]
}
另外,请注意,您可以通过命令行(已提到)来“插入”和组合各种别名分析(复数),例如


你试过什么?什么不起作用?谢谢,我试过了,但它崩溃了。。。我在问题中添加了断言失败。我正要建议将您的pass升级为函数或模块pass,并使用
LoopInfo
分析,以防万一设置中有什么阻碍。很好,你成功了。
void getAnalysisUsage(AnalysisUsage &AU) const override {
    AU.addRequired<AAResultsWrapperPass>();
    [...]
}
AliasAnalysis *AA = &getAnalysis<AAResultsWrapperPass>().getAAResults();
opt -basicaa [...]