本次实验分为2关。请务必使用git提交。
实验目的旨在让大家熟悉生成中间代码所需要的相关知识: LLVM IR、 SysYF IR(LLVM IR的轻量子集)以及如何基于Clang/LLVM构建编译器的驱动程序Driver。
在开始实验之前,请确保LLVM的版本最好为10.0.1,且PATH环境变量配置正确。可以通过lli --version
命令输出版本信息来验证,本机版本与平台版本相差过大可能会导致评测时出现错误。(虚拟平台上已经安装10.0.1版本,可以通过前述命令进行检查)
如果你在本机开展实验,你需要事先安装等软件。以LLVM 10.0.1为例,LLVM 10.0.1可以从网址获取。
你可以选择Pre-Built Binaries
中相应的压缩包解压得到二进制文件(linux)或者点击安装(windows),然后添加到PATH(linux平台)或者添加到环境变量(windows,在安装包中有相应选项添加至系统路径)。
下面以Ubuntu20.04系统为例,说明安装步骤。
cd ~
wget https://github.com/llvm/llvm-project/releases/download/llvmorg-10.0.1/clang+llvm-10.0.1-x86_64-linux-gnu-ubuntu-20.04.tar.xz
tar -xvf clang+llvm-10.0.1-x86_64-linux-gnu-ubuntu-20.04.tar.xz
mv clang+llvm-10.0.1-x86_64-linux-gnu-ubuntu-20.04 llvm10.0.1
export PATH=~/llvm10.0.1/bin:$PATH
- 第一部分: 了解LLVM IR。通过clang生成的.ll,了解LLVM IR与C程序代码的对应关系。相应文档见phase1.md
- 第二部分: 了解编译器驱动程序Driver。通过本实验提供的基于Clang Driver改造的可扩展LLVM驱动程序,了解LLVM的前后端处理流程,包括JIT即时编译执行。相应文档见phase2.md
- 实验报告:在report.md中撰写报告。
除了下面特别指出的需要你修改或提交的文件,其他文件请勿随意修改。
.
├── CMakeLists.txt
├── README.md <- 实验文档说明(你在这里)
├── doc
│ ├── phase1.md <- 阶段1(第1关)的文档
│ ├── phase2.md <- 阶段2(第2关)的文档
│ ├── SysYF语言定义.pdf
| ├── runtime.md <- SysYF的运行时库说明
| └── SysYFIR.md <- SysYF IR的精简说明
├── report
│ └── report.md <- 需提交的实验报告
├── lib <- SysYF的运行时库
| ├── lib.h <- 包含可以在SysYF程序中使用的I/O函数接口声明
| └── lib.c
└── Student
├── task1 <- 第1关任务相关的目录
| ├── ll <- 需提交的LLVM IR文件(.ll)的目录(第1关)
| | ├── assign_hand.ll
| │ ├── fun_hand.ll
| │ ├── if_hand.ll
| | ├── io_hand.ll
| │ └── while_hand.ll
| ├── sy <- SysYF源程序的目录
| | ├── assign_test.sy
| │ ├── fun_test.sy
| │ ├── if_test.sy
| │ ├── io.sy
| │ ├── io.in
| │ ├── io.out
| │ └── while_test.sy
| └── demo <- 示例C程序的目录
| └── go_upstairs.c
└── task2 <- 第2关任务相关的目录
├─ CMakeLists.txt
├─ README.md <- LLVM驱动程序的说明
├─ main.cpp <- 调用编译器驱动程序的主程序文件,需要提交对qsort程序的编译执行版本(第2关)
├─ include
| ├─ IR
| | ├─ gcd_generator.hpp
| | └─ qs_generator.hpp <- 需要提交的qsort程序的LLVM IR生成器(第2关)
| ├─ runtime
| | ├─ io.h
| | └─ runtime.h
| └─ Driver
| └─ driver.h <- 自定义可扩展Driver类的声明(第2关)
├─ src
| ├─ runtime
| | ├─ io.cpp
| | └─ runtime.cpp <- 需要提交的qsort程序的运行时库函数实现(第2关)
| └─ Driver
| └─ driver.cpp <- 自定义可扩展Driver类的定义
└─ tests
├─ gcd.c
├─ helloworld.c
├─ quicksort.c 第2关待翻译为LLVM IR的目标c语言程序
├─ quicksort_[*].in 第2关测试样例输入
└─ quicksort_[*].out 第2关测试样例输出
- 提交要求
本实验的提交要求分为两部分: 实验部分的文件和实验报告。- 实验部分
- 需要完成
./Student/task1/ll
目录下的5个文件 - 需要完成
./Student/task2/main.cpp
、./Student/task2/src/runtime/runtime.cpp
以及./Student/task2/include/qs_generator.hpp
三个文件,并保持与./Student/task2/tests
中的测试样例相同的输入输出格式 - 需要在
./report/report.md
中撰写实验报告- 实验报告内容包括:
- 实验要求、问题回答、实验设计、实验难点及解决方案、实验总结、实验反馈(具体参考report.md)
- 实验报告内容包括:
- 需要完成
- 提交规范:
- 不破坏目录结构(
report.md
如果需要放图片,请新建figs
文件夹放在./report
下,并将图片放在figs
文件夹内) - 不上传临时文件(凡是自动生成的文件和临时文件请不要上传)
- 不破坏目录结构(
- 实验部分
- 评分标准: 本次实验分为2部分
- 禁止执行恶意代码,违者本次实验0分处理
- 第一部分30分:
.ll
运行结果正确(1个5分, 注释共5分) - 第三部分70分:
mClang -IR
命令的运行结果正确
- 迟交规定
- 迟交需要邮件通知助教:
- 邮件主题: IRLab迟交-学号
- 内容: 包括迟交原因、最后版本commit ID、迟交时间等
- 迟交需要邮件通知助教:
- 关于抄袭和雷同 经过助教和老师判定属于作业抄袭或雷同情况,所有参与方一律零分,不接受任何解释和反驳。
如有任何问题,欢迎提issue进行批判指正。