clang libtooling生成的调用图(.dot)没有节点标签

时间:2017-07-14 18:31:26

标签: clang llvm-clang libtooling

我是clang libtooling的初学者。 我正在尝试使用clang :: CallGraph viewGraph来生成调用图的.dot文件。 这是代码:

C:\users\john\git

有趣的是,生成的调用图文件(.dot)没有节点的标签,尽管我可以正确打印所有节点名称的调用图。

这是生成的图片: enter image description here

我很好奇为什么会这样表现出来。我的代码中哪个部分出错?

提前致谢!

1 个答案:

答案 0 :(得分:0)

我解决了这个问题,但我不确定这是否是正确的方法。 而不是调用函数 - " viewGraph()",我使用" llvm :: WriteGraph"。

以下是代码:

string outputPath = "./";
outputPath.append("CallGraph");
outputPath.append(".dot");

// Write .dot
std::error_code EC;
raw_fd_ostream O(outputPath, EC, sys::fs::F_RW);

if (EC) {
    llvm::errs() << "Error: " << EC.message() << "\n";
    return;
}

llvm::WriteGraph(O, &mCG);

与此同时,我更改了LLVM源代码文件 - GraphWriter.h

void writeNode(NodeRef Node) {

std::string NodeAttributes = DTraits.getNodeAttributes(Node, G);

O << "\tNode" << static_cast<const void*>(Node) << " [shape=record,";
if (!NodeAttributes.empty()) O << NodeAttributes << ",";
O << "label=\"{";

if (!DTraits.renderGraphFromBottomUp()) {

  // I add here: for show the node's label value (otherwise the label will be empty)
  std::string nodeLable ;
  if(Node == G->getRoot()){
     nodeLable = "root";
  }
  else{
    const NamedDecl *ND = dyn_cast_or_null<NamedDecl>(Node->getDecl());
    nodeLable = ND->getNameAsString();
  }

 // O << DOT::EscapeString(DTraits.getNodeLabel(Node, G));
  O << nodeLable;
...

无论如何,它现在适用于我的代码。不确定是否还有其他好方法。