当前位置: 首页 > article >正文

LLVM实战之C源码编译

目录

1. 详细步骤

2. 工作原理


      本文将展示使用Clang(C语言前端),把C语言源码转换成LLVM IR 。当然首先需要安装Clang并且把它添加到PATH环境中。

1. 详细步骤

(1)首先准备测试文件,在multiply.c文件编写一段C代码,如下:

$ cat multiply.c
int mult() {

  int a =5;

  int b = 3;

  int c = a * b;

  return c;

}

(2)使用Clang工具将C语言转换成LLVM IR,命令如下:

$ clang -emit-llvm -S multiply.c -o multiply.ll

其中参数:

-emit-llvm:使用LLVM表示汇编和目标文件

-S: 使用.ll文件输出,不加-S,输出文件是.bc格式

(3)查看生成的LLVM IR

$ cat multiply.ll
; ModuleID = 'multiply.c'

target datalayout = "e-m:e-i64:64-f80:128-n8:16:32:64-S128"

target triple = "x86_64-unknown-linux-gnu"

; Function Attrs: nounwind uwtable

define i32 @mult() #0 {

  %a = alloca i32, align 4

  %b = alloca i32, align 4

  %c = alloca i32, align 4

  store i32 5, i32* %a, align 4

  store i32 3, i32* %b, align 4

  %1 = load i32* %a, align 4

  %2 = load i32* %b, align 4

  %3 = mul nsw i32 %1, %2

  store i32 %3, i32* %c, align 4

  %4 = load i32* %c, align 4

  ret i32 %4

}

2. 工作原理

      将C语言代码编译为LLVM IR的过程从词法分析开始——将C语言源码分解成token流,每个token可表示标识符、字面量、运算符等;token流会传递给语法分析器,语法分析器会在语言的CFG(Context Free Grammar,上下文无关文法)的指导下将token流组织成AST(抽象语法树);接下来会进行语义分析,检查语义正确性,然后生成IR。

后续会有文章详细描述词法分析、语法分析和代码生成的工作原理。


http://www.kler.cn/a/227375.html

相关文章:

  • 【项目日记(八)】第三层: 页缓存的具体实现(下)
  • Go 中如何打印结构体?代码调试效率提升
  • 连接区块链节点的 JavaScript 库 web3.js
  • 幻兽帕鲁服务器游戏怎么升级版本?
  • 『运维备忘录』之 Cron 命令详解
  • vue实现二维数组表格渲染
  • ReentrantLock相较于synchronized有哪些区别(一)?
  • 【lesson9】高并发内存池Page Cache层释放内存的实现
  • 【BBF系列协议】TR181-2 TR369的设备数据模型
  • mac电脑风扇控制软件:Macs Fan Control Pro for mac 激活版
  • 【C++】拷贝构造函数和赋值运算符重载详解
  • Spring Boot 中操作 Bean 的生命周期
  • Unity3D 如何获取动态生成的物体的数据详解
  • 嵌入式学习第三篇——51单片机
  • ES6-let
  • “超越摩尔定律”,存内计算走在爆发的边缘
  • DS18B20温度传感器
  • 18.通过telepresence调试部署在Kubernetes上的微服务
  • Vue.js设计与实现(霍春阳)
  • 【Vue】组件间通信的7种方法(全)