如何修改C++源代码以生成控制流程图并显示函数和运算符的名称?

3
这是我的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

这使得很难区分特定的代码块,因为它们在源码块中存在。我想要消除这些令人尴尬的字符,以便能够看到放在cpp文件中的标识符。要做到这一点,需要添加什么指令(或者推荐哪些资源可以帮助我更熟悉这个主题)?如果在适当地编辑源代码之后,我更愿意继续使用clang++/llvm解析。

我认为您想要的是改进clang生成的IR值的命名选择,并更多地基于源代码的命名。Clang是开源的,您可以编写并提交一个补丁。 - arnt
1个回答

0
LLVM在其中间表示(IR)中使用静态单赋值(SSA)来表示源代码。这需要LLVM在IR中添加更多的SSA变量。这些变量将会被编号。但是你可以通过包含标志-fno-discard-value-names来保留源变量名。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接