LLVM CFG控制流图可视化

LLVM CFG控制流图可视化

准备

安装必要组件

sudo apt-get install -y graphviz-doc libgraphviz-dev graphviz

示例程序

/// file 1.c
int x = 10; 
int y = 11; 
int main(){
    int z = 12; 
    for (int i = 0;i < 10;i++){
        z *= x * y;
    }   
    return 0;
}

生成LLVM IR 文件

clang -S -emit-llvm 1.c -o 1.ll

调用的控制流图

opt -dot-callgraph  1.ll # 生成dot文件

dot文件会在当前目录下生成,不同版本的llvm可能dot文件的名字可能稍有不同,我使用的版本产生的dot文件是callgraph.dot。使用以下命令生成图片:

dot callgraph.dot -Tpng -o callgraph.png # 生成图片

控制流图如下:

函数控制流图

opt -dot-cfg  1.ll # 生成dot文件

dot文件会在当前目录下生成,不同版本的llvm可能dot文件的名字可能稍有不同,我使用的版本产生的dot文件是cfg.main.dot。使用以下命令生成图片:

dot cfg.main.dot -Tpng -o cfg.main.png # 生成图片

控制流图如下:

  • 8
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
LLVM拓展控制流主要是通过引入新的指令来实现的。LLVM提供了多种控制流指令,如条件分支、无条件分支、switch语句等,但是在某些情况下,这些指令可能无法满足程序员的需要。例如,在一些高级语言中,存在一些控制流结构,如异常处理、goto语句、try-catch语句等,这些结构无法直接转换为LLVM指令。 为了解决这个问题,LLVM引入了拓展控制流指令。拓展控制流指令可以模拟出高级语言中的控制流结构,从而实现对高级语言的支持。例如,LLVM引入了invoke指令来实现函数调用的异常处理,引入了indirectbr指令来实现goto语句,引入了landingpad指令来实现异常处理等。 关于LLVM拓展控制流的编译实验过程,一般可以分为以下几个步骤: 1. 实现拓展控制流指令的前端语言支持。首先需要在前端语言中支持相应的控制流结构,例如在C++中支持异常处理、goto语句等。 2. 实现拓展控制流指令的中间表示(IR)支持。接下来需要在LLVM IR中引入相应的拓展控制流指令,例如invoke、indirectbr、landingpad等。 3. 实现拓展控制流指令的后端支持。最后需要在LLVM后端中实现相应的指令转换和代码生成,以便于将LLVM IR转换为目标代码。 在实际的编译实验中,需要根据具体的拓展控制流指令来进行相应的实现,具体的实现细节可以参考LLVM官方文档。同时,也需要进行相应的测试和验证,以确保拓展控制流指令的正确性和可用性。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值