如何使用LLVM C ++ API将数据附加到保留的节点列表中?

时间:2018-07-26 13:26:59

标签: c++ llvm dwarf

我正在查看LLVM文档here中的DIBuilder::createLabel()。它说:

  

优化器可能会删除标签。如果有兴趣在这种情况下保留标签信息,则将其附加到DISubprogram的保留节点列表中。

这是怎么做到的?

我找到了getRetainedNodes的{​​{1}}方法,该方法似乎返回了DISubprogram,但是我看不到应该如何添加。

也许是一成不变的?

1 个答案:

答案 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页面上看到此文档注释时,您似乎必须执行此操作你自己!