c++ - 应该在 C++ 源代码中修改什么以生成显示函数名称和运算符的控制流图?

标签 c++ llvm graphviz code-analysis control-flow-graph

我的 C++ 程序可以将 CFG 演示文稿构建为 png 文件:

#include <iostream>
#include <array>
#include <string>
#include <cstring> 

int partitionFunc(std::string &str, int startInd, int endInd)
{   
    int primIndex = startInd;
    int pivotVal = str[endInd];
    for(int i = startInd; i < endInd; i++) {
         if(str[i] <= pivotVal) {             
             char tempIn = str[i];             
             str[i] = str[primIndex];             
             str[primIndex] = tempIn;             
             primIndex++; 
         }
    }

    char tempOut = str[primIndex];
    str[primIndex] = str[endInd]; 
    str[endInd] = tempOut;
    
    return primIndex;
}

void runQsort(std::string &str, int startInd, int endIndex)
{
    if(startInd < endIndex) {        
        int primIndex = partitionFunc(str, startInd, endIndex);        
        runQsort(str, startInd, primIndex - 1);        
        runQsort(str, primIndex, endIndex);        
    }
}

int main(int argc, char * argv[])
{

       
    std::array<std::string, 6> verbs = { "alternative", "destination", "airlines", "turbulence", "contribution", "ultimate" };      
    
    std::string selected; 
    int option = 14;
    int endIndex;

    switch (option)
    {
        case 1:            
            selected = verbs[0];            
            break;
        case 2:
            selected = verbs[1];             
            break;
        case 3:
            selected = verbs[2];              
            break;
        case 4:
            selected = verbs[3]; 
            break;
        case 5:
            selected = verbs[4];            
            break;   
        default:
            selected = verbs[5];            
            break;            
    }  
      
    runQsort(selected, 0, selected.length() - 1);

    int x = 0;

    while(x < selected.length()) {        
        std::cout << selected[x];         
        x++;
    }

    std::cout << std::endl;

    return 0;
}

为了实现可视化,我使用 clang++ 处理整个代码,llvm 将源代码解析为 dot 格式:

clang -emit-llvm main.cpp -c -o main.bc
opt --dot-cfg-only main.bc 

最后,要执行此命令以将图形视为流程图:

dot -Tpng .main.dot -o main.png

我遇到的问题是在输出文件中出现百分号字符,而缺少函数和运算符标识符:

trash22

很难区分特定 block ,因为它们存在于源 block 中。我会消除那些令人尴尬的字符,因为它们被放入 cpp 文件中。必须在此处添加哪些说明才能做到这一点(或者可以推荐哪些资源以熟悉该主题)?如果在适本地编辑源代码后它是一个可用选项,我宁愿继续使用 clang++/llvm 进行解析。

最佳答案

LLVM 使用 Static Single Assignment (SSA)在其中间表示(IR)中表示源。这需要 LLVM 向 IR 添加更多 SSA 变量。这些将被编号。但是您可以通过包含标志 -fno-discard-value-names 来保留您的源变量名称。

关于c++ - 应该在 C++ 源代码中修改什么以生成显示函数名称和运算符的控制流图?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63987739/

相关文章:

c++ - 无法使用 llvm 和 clang 解析 C++

GraphViz dirType 似乎没有任何效果

java - GraphViz 的纯 Java 重新实现?

c++ - 日志记录和多线程

c++ - OpenGL 中对 R8G8B8 纹理的 NPOT 支持

c++ - 优先队列中的池内存分配

java - 如何在java中使用Graphviz进行图形操作

c++ - 当内联函数实际替换代码时,是否可以放置断点?

javascript - 在 Javascript 中生成 LLVM 浮点十六进制文字

llvm - 在 LLVM 中查找指令的后继列表