我正在查看LLVM文档here中的DIBuilder::createLabel()
。它说:
优化器可能会删除标签。如果有兴趣在这种情况下保留标签信息,则将其附加到DISubprogram的保留节点列表中。
这是怎么做到的?
我找到了getRetainedNodes
的{{1}}方法,该方法似乎返回了DISubprogram
,但是我看不到应该如何添加。
也许是一成不变的?
答案 0 :(得分:0)
我认为这是一个文档错误。如果我们看一下实现:
DILabel *DIBuilder::createLabel(
DIScope *Scope, StringRef Name, DIFile *File,
unsigned LineNo, bool AlwaysPreserve) {
DIScope *Context = getNonCompileUnitScope(Scope);
auto *Node =
DILabel::get(VMContext, cast_or_null<DILocalScope>(Context), Name,
File, LineNo);
if (AlwaysPreserve) {
/// The optimizer may remove labels. If there is an interest
/// to preserve label info in such situation then append it to
/// the list of retained nodes of the DISubprogram.
DISubprogram *Fn = getDISubprogram(Scope);
assert(Fn && "Missing subprogram for label");
PreservedLabels[Fn].emplace_back(Node);
}
return Node;
}
文档注释的位置表明,如果我们通过alwaysPreserve=True
,此函数将为我们执行此操作,但是当您在doxygen页面上看到此文档注释时,您似乎必须执行此操作你自己!