gpt4 book ai didi

LLVM 通行证 : Error when iterating over Module functions list

转载 作者:行者123 更新时间:2023-12-04 02:13:23 27 4
gpt4 key购买 nike

我正在尝试在 LLVM 传递中使用 llvm::Module::getFunctionList() 返回的列表来迭代模块函数列表。 .我使用这样的循环:

    for (auto curFref = M->getFunctionList().begin(), 
endFref = M->getFunctionList().end();
curFref != endFref; ++curFref) {
errs() << "found function: " << curFref->getName() << "\n";
}

这个循环的第一次迭代检索了一个函数,正如预期的那样,但它没有检测到列表的结尾,并继续在后续迭代中获取其他不是函数的对象(如它们的 getName() 所报告的),例如功能参数。经过几次迭代后,它可能会遇到一些垃圾(或 NULL)并在引用当前“函数”引用时崩溃。
例如,对于这个程序:
int foo(int k) {
int i, s = 0;
for (i = 0; i < k; ++i)
s += i;
return s;
}

这成为这个 IR 代码:
...
; Function Attrs: nounwind uwtable
define i32 @foo(i32 %k) #0 {
entry:
...

输出将如下所示:
found function: foo
found function: k
found function: #0 0x00007f481f77c46e llvm::sys::PrintStackTrace(llvm::raw_ostream&) /home/me/work/llvm-3.8.0/lib/Support/Unix/Signals.inc:322:0
...

所以你可以看到在正确迭代 foo 之后它继续到参数 k 等对象.

我在模块传递(在 runOnModule() 中)以及函数传递(使用 F.getParent() 查询包含的模块)中都尝试了这个,并得到了相同的结果。

该问题也出现在 LLVM 3.8.0 和 LLVM 3.5.2 上。

知道我没有正确迭代返回的函数列表吗?

=====

编辑:

请注意,在模块的函数上使用替代迭代时会显示相同的行为,例如使用 M.begin()/end() 时。对于迭代器,甚至在使用基于 C++11 范围的 for 时循环: for (Function &curF: M) ... .

此外, M.getFunctionList().size()在尝试迭代列表项时导致段错误。因此,功能列表似乎确实已损坏。但这是我在 runOnModule() 开头得到的列表。入口点。因此,我的代码似乎并没有破坏它。

======

编辑2:

我不知道这是否重要,但我的 LLVM channel 是从 LLVM 源树外部构建的,作为可动态加载的库,然后加载到 opt使用 -load=foo.so命令行选项。

最佳答案

我是核心 LLVM 开发人员之一。

这几乎可以肯定是 LLVM 的错误 check out 、错误编译的 LLVM,或者您的通行证是作为单独的 DSO 构建的这一事实的问题(尽管我不知道这是怎么回事)。

LLVM 的许多部分使用 M->functions() (或 M->begin()M->end() )仅迭代函数。如果行为被破坏,这些部分将始终失败。这些机制与直接访问函数列表的唯一区别是M->getFunctionList()。 does 是列表是否可变。对于您展示的用例,它们应该是完全相同的行为。

我建议尝试运行 LLVM 测试套件以确保它正常工作。如果你使用 Ninja CMake 生成器(我会推荐)来构建 LLVM:

% ninja check-llvm

如果这失败了,特别是如果它在类似区域崩溃,这似乎是一个非常好的迹象,表明问题出在你的 LLVM 副本中。

无论如何,SO 不是在这里获得进一步帮助的好地方。问题的答案是“这实际上应该有效”,我检查了 LLVM 中的代码,但没有看到任何明显的解释。所以我的建议是尝试上述方法,尝试 LLVM 的新副本(可能是树的顶部,或最新版本)。确保您有足够现代的主机工具链来构建 LLVM。有关详细信息,请参阅本节:
http://llvm.org/docs/GettingStarted.html#host-c-toolchain-both-compiler-and-standard-library

如果一切都失败了,请尝试联系邮件列表中的开发人员:
http://lists.llvm.org/mailman/listinfo/llvm-dev

或者试试 IRC channel : http://llvm.org/docs/#irc

希望这可以帮助!

关于LLVM 通行证 : Error when iterating over Module functions list,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36308903/

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