lab4实验报告

PB17000002 古宜民(队长)

PB15081586 苏文治

PB16001837 朱凡

实验要求

  1. RISC-V 机器代码的生成和运行

    • 重新编译LLVM使得LLVM支持RISC-V
    • 生成RISC-V源码
    • 使用模拟器运行RISC-V源码
  2. LLVM源码阅读与理解

    • 阅读RegAllocFast.cpp,了解文件执行流程,并关注几个重点函数和变量的作用
    • 与龙书的寄存器分配算法比较,分析不同点

报告内容

1. RISC-V 机器代码的生成和运行

2. LLVM源码阅读与理解

组内讨论内容

  1. RISC-V 机器代码的生成和运行

    在虚拟机中重新编译LLVM8.0.1极其消耗磁盘空间,多次扩充虚拟硬盘容量还是提示空间不足;riscv-gnu-toolchain下载速度慢。

    解决方式:

     1. 可以使用[issue #257](http://210.45.114.30/gbxu/notice_board/issues/257)中提供的镜像。
     2. 可以不在虚拟硬盘中编译,而是改为在主机的共享文件夹中编译
    
  2. LLVM源码阅读与理解(下列各个问题的讨论结果已经在回答助教提出的问题的过程中写明)

    • 虚拟寄存器和物理寄存器的区别

    • 程序中多次出现isDef、isUse这些函数,寄存器的use def两个状态的区别。相应的,还有与之关联的:isUndef isDead isKill

    • live-in寄存器与live-out寄存器

    • 寄存器的三个状态 regDisabled regFree regReserved 的区别以及用途

    • hasTiedOpshasPartialRedefs,hasEarlyClobbers 三个变量,分别对应了tied, Partial Redefination, early clobber几种特殊情况,这几种特殊情况是什么含义,以及需要怎么处理

实验总结

本次实验的主要任务为代码生成和阅读代码,需要阅读的代码相对上个实验更长,难度较大。

在代码生成实验中,主要的任务是编译代码。中途遇到了一些问题,主要问题有LLVM8.0.1的重新编译,最后通过扩充虚拟硬盘容量,给虚拟机分配更多的内存,增加swap空间等方式解决;一开始不熟悉spike模拟器的调试方式。

我们在阅读代码中也遇到了诸多问题,比如说注释很多但是不能直接有助于理解;我们只看了单个文件,“没头没尾“,难以抓住流程,开始只看了一个文件没搞清楚代码的分析结果放在了什么地方;一些名词反复出现但是难以找到定义,网上和文档都没有说明;以及代码规模较大,难以驾驭。

在查找资料过程中,我们发现虽然文档上没有直接表明某函数或变量的作用,但是如果在源代码中寻找,在类定义或函数定义以及较为底层的函数的注释里通常能够发现说明,比如我们从readsVirtualRegister调用的readsWritesVirtualRegister中发现了很多关于partial define的内容,帮助很大。另外,我们在搜索过程中找到了两个LLVM Developer Meeting的slides,里面有很多描述、例子和图片,对我们的理解帮助很大。最后我们搞清楚了代码整体的流程,完成了题目。

也不得不说,对于代码中的很多细节我们还没能完全理解,如果要进一步理解甚至修改代码,很可能需要专业人士的帮助了。

总之,虽然这次实验难度较大,我们在完成实验的过程中也有很大收获。

实验反馈

对本次实验的建议(可选 不会评分)