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.

3.4 KiB

[TOC]


任务描述

本关任务熟悉LLVM IR并根据给出的4个SysYF程序(文件扩展名为sy)手写相应的LLVM IR的ll文件以实现相同功能。

相关知识

LLVM IR介绍

LLVM是一个开源的编译器基础设施用C++语言编写包含一系列模块化的编译器组件和工具链用来支持编译器前端和后端的开发。IR的全称是Intermediate Representation即中间表示。LLVM IR是一种类型化的三地址中间表示是类似于汇编的底层语言。
LLVM IR的具体指令可以参考Reference Manual。但是你会发现其内容庞杂为便于你尽快了解本实训项目需要涉及的LLVM IR指令子集请查看本实训提供的精简的IR Reference手册doc/SysYFIR.md
作为一开始的参考,你可以先阅读其中的IR FeaturesIR Format两节,后续有需要再反复参考。

样例学习

go_upstairs.c点击展开
int num[2] = {4, 8};
int x[1];
int n;
int tmp = 1;

int climbStairs(int n) {
    if(n < 4)
        return n;
    int dp[10];
    dp[0] = 0;
    dp[1] = 1;
    dp[2] = 2;
    int i;
    i = 3;
    while(i<n+1){
        dp[i] = dp[i-1] + dp[i-2];
        i = i + 1;
    }
    return dp[n];
}

int main(){
    int res;
    n=num[0];
    x[0] = num[tmp];
    res = climbStairs(n + tmp);
    return res - x[0];
}
  • 阅读Student/task1/demo/go_upstairs.c

  • 进入Student/task1/demo文件夹,输入命令

    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执行结果的正确性。

本关具体任务

  1. Student/task1/student_sy/内提供了四个简单的SysYF 程序:assign_test.syfunc_test.syif_test.sywhile_test.sy
    你需要在Student/task1/ll/目录下手工编写assign_hand.llfunc_hand.llif_hand.llwhile_hand.ll文件,以实现与上述 SysYF 程序相同的逻辑功能。
    你需要在ll文件内添加必要的注释,ll文件的注释是以;开头的。
    必要的情况下,你可以参考clang -S -emit-llvm的输出,但是你提交的结果必须避免同此输出一字不差。
  2. report.md内回答思考题

运行说明

  • 你需要使用 clang --versionlli --version 检查本机的Clang和LLVM版本
  • 你可以使用 which lli 来查找 lli 命令的位置
  • 利用LLVM的命令 lli,可以执行*.ll文件;如果版本过低,可能会遇到error: expected top-level entity等问题
  • 你也可以使用 clang go_upstairs.ll -o go_upstairs 来生成可执行文件
  • $?的内容是上一条命令所返回的结果,而echo $?可以将其输出到终端中
  • 使用clang时,注意扩展名为sy的文件是SysYF语言的程序文件clang是无法直接识别的,你可以将sy文件复制为c文件来用clang编译

思考题

请在report/report.md中详细回答下述思考题: 1-1 请给出while语句对应的LLVM IR的代码布局特点重点解释其中涉及的几个br指令的含义(包含各个参数的含义) 1-2 请简述函数调用语句对应的LLVM IR的代码特点