gpt4 book ai didi

c++ - 如何在自定义 llvm 传递之间正确传递数据结构

转载 作者:塔克拉玛干 更新时间:2023-11-03 07:40:29 34 4
gpt4 key购买 nike

我有一个Function pass,叫做firstPass,它做一些分析和填充:

A a;

在哪里

typedef std::map< std::string, B* > A;
class firstPass : public FunctionPass {
A a;
}

typedef std::vector< C* > D;
class B {
D d;
}

class C {
// some class packing information about basic blocks;
}

因此我有一个由 std::string 遍历的 vector 映射。我为这些类编写了相关的析构函数。此通行证可自行成功运行。

我有另一个 Function 传递,称为 secondPass,需要这种 A 类型的结构来进行一些转换。我用过

bool secondPass::doInitialization(Module &M) {
errs() << "now running secondPass\n";
a = getAnalysis<firstPass>().getA();
return false;
}

void secondPass::getAnalysisUsage(AnalysisUsage &AU) const {
AU.addRequired<firstPass>();
AU.setPreservesAll();
}

整个代码编译正常,但在我的第一遍结束时打印此结构时出现段错误仅当我调用第二遍时(因为 B* 为空) .

要清楚:

opt -load ./libCustomLLVMPasses.so -passA < someCode.bc

doFinalization()中打印并成功退出

opt -load ./libCustomLLVMPasses.so -passA -passB < someCode.bc

给出一个段错误。

我应该如何包装这个数据结构并将其毫无问题地传递给第二遍?我尝试了 std::unique_ptr 而不是原始的,但我无法让它工作。无论如何,我不确定这是否是正确的方法,因此我们将不胜感激。

编辑:我解决了seg的问题。过错。基本上是我在 doInitialization() 中调用 getAnalysis。我写了一个 ModulePass 来组合我的 firstPass 和 secondPass,其 runOnModule 如下所示。

bool MPass::runOnModule(Module &M) {
for(Function& F : M) {
errs() << "F: " << F.getName() << "\n";
if(!F.getName().equals("main") && !F.isDeclaration())
getAnalysis<firstPass>(F);
}

StringRef main = StringRef("main");
A& a = getAnalysis<firstPass>(*(M.getFunction(main))).getA();

return false;
}

这也让我能够控制函数处理的顺序。现在我可以获得一个 channel 的输出,但不能将其用作另一个 channel 的输入。我认为这表明 llvm 中的通行证是独立的。

最佳答案

我不会根据 C++ 的优点来评论数据结构的质量(仅通过这个最小的例子很难评论)。

此外,我不会使用 doInitialization方法,如果实际的初始化就那么简单,但这也是旁注。 (doc 没有明确提及任何关于它的内容,但如果它每个 Module 运行一次,而 runOn 方法在该模块的每个 Function 上运行,这可能是一个问题)。

我怀疑主要问题似乎源于事实 A a在你的firstPass绑定(bind)到传递对象的生命周期,一旦传递完成,它就结束了。最简单的更改是在堆上分配该对象(例如 new )并在调用时返回指向它的指针 getAnalysis<firstPass>().getA(); .

请注意,如果您决定使用原始指针,使用此方法可能需要手动清理。

关于c++ - 如何在自定义 llvm 传递之间正确传递数据结构,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52021530/

34 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com