LLVM实战之C源码编译

目录

[1. 详细步骤](#1. 详细步骤)

[2. 工作原理](#2. 工作原理)


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

1. 详细步骤

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

bash 复制代码
$ cat multiply.c
cpp 复制代码
int mult() {

  int a =5;

  int b = 3;

  int c = a * b;

  return c;

}

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

bash 复制代码
$ clang -emit-llvm -S multiply.c -o multiply.ll

其中参数:

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

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

(3)查看生成的LLVM IR

bash 复制代码
$ cat multiply.ll
bash 复制代码
; 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。

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

相关推荐
测试员周周3 小时前
【Appium 系列】第16节-WebView-H5上下文切换 — 混合应用的自动化难点
运维·开发语言·人工智能·功能测试·appium·自动化·测试用例
杜子不疼.5 小时前
【C++ AI 大模型接入 SDK】 - DeepSeek 模型接入(上)
开发语言·c++·chatgpt
加号36 小时前
【C#】 串口通信技术深度解析及实现
开发语言·c#
sycmancia6 小时前
Qt——编辑交互功能的实现
开发语言·qt
石山代码7 小时前
C++ 内存分区 堆区
java·开发语言·c++
无风听海7 小时前
C# 隐式转换深度解析
java·开发语言·c#
一只大袋鼠8 小时前
Git 进阶(二):分支管理、暂存栈、远程仓库与多人协作
java·开发语言·git
LuminousCPP8 小时前
数据结构 - 线性表第四篇:C 语言通讯录优化升级全记录(踩坑 + 思考)
c语言·开发语言·数据结构·经验分享·笔记·学习
web3.08889998 小时前
1688 图搜接口(item_search_img / 拍立淘) 接入方法
开发语言·python
один but you9 小时前
从可变参数到 emplace:现代 C++ 性能优化的核心组合
java·开发语言