You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

2.5 KiB

IR实验阶段一

本实验由黄庄湫、吴毓辰助教设计

0 前言

本次实验的目的是让大家熟悉阶段三所需相关知识:
LLVM IR

1 任务描述

了解LLVM IR
通过clang生成的.ll了解LLVM IR与c代码的对应关系
根据c程序手写.ll文件实现相同功能

2 实验内容

2.1 LLVM IR介绍

根据维基百科的介绍LLVM是一个自由软件项目它是一种编译器基础设施以C++写成包含一系列模块化的编译器组件和工具链用来开发编译器前端和后端。IR的全称是Intermediate Representation即中间表示。LLVM IR是一种类似于汇编的底层语言。
LLVM IR的具体指令可以参考Reference Manual。但是你会发现其内容庞杂。虽然助教认为,高效地查阅官方文档及手册是非常必要的一项技能,但是由于其手册过于复杂,因此助教筛选了后续实验中将要用到的子集,总结为了精简的IR Reference手册
作为一开始的参考,你可以先阅读其中IR FeaturesIR Format两节,后续有需要再反复参考。

2.2 例子: 利用clang生成的.ll

阅读SysYF_Student/SysYF_Task1/ta_demo/go_upstairs.c
在对应文件夹内输入clang -S -emit-llvm go_upstairs.c指令,你可以得到对应的go_upstairs.ll
你需要结合go_upstairs.c阅读go_upstairs.ll理解其中每条LLVM IR指令与c代码的对应情况。
通过lli go_upstairs.ll; echo $?指令,你可以测试go_upstairs.ll执行结果的正确性。

2.3 你需要做: 手动编写.ll

助教在SysYF_Student/SysYF_Task1/student_sy/内提供了四个简单的sy程序assign_test.syfunc_test.syif_test.sywhile_test.sy
你需要在SysYF_Student/SysYF_Task1/student_ll/内手工完成自己的assign_test.llfunc_test.llif_test.llwhile_test.ll文件以实现与上述C程序相同的逻辑功能。你需要添加必要的注释.ll文件的注释是以;开头的
必要的情况下,你可以参考clang -S -emit-llvm的输出,但是你提交的结果必须避免同此输出一字不差
注:.sy文件是我们定义的语言文件,clang无法直接识别

2.4 运行.ll文件

  • lli会运行*.ll文件
  • $?的内容是上一条命令所返回的结果,而echo $?可以将其输出到终端中