# PW6 实验报告 * 舒英特 PB21111704 * 杨宇航 PB21051030 ## 问题回答 * 1-1 一个`while`语句对应三个标签:第一个标签处执行判断,第二个标签处执行函数体,第三个标签对应`while`的末尾。`br`指令有两种形式:`br label a`表示直接跳转到`a`标签处;`br i1 x, label a, label b`表示`x`是真则跳到`a`,`x`是假则跳到`b`。 * 1-2 函数调用语句的格式是call @( ),包含了返回值类型,参数类型及、其具体值。 * 2-1 两种用法的区别为,使用的指针类型不同,前者数据类型为 `i32`,指针类型为 `i32\*`,只有一个参数,表示一维的偏移量;后者数据类型为 `[10 x i32]`(数组),指针类型为 `[10 x i32]*`,有两个参数,分别表示一个维度的偏移量 * 3-1 在`scope`中单独处理`func`方便管理在当前作用域中的变量,方便处理局部变量以及实现整个`modul`的结构层次 ## 实验设计 * task1:理解LLVM IR指令含义,首先将所给的sy代码翻译成单赋值中间表示,然后翻译为LLVM IR * task2:理解提供的生成器接口,调用接口实现生成Task1中的LLVM IR * task3:根据生成的语法树,遍历语法树的节点,补充对各个节点的访问代码,生成对应的LLVM IR ## 实验难点及解决方案 * 主要难点为理解生成LLVM IR模块的用法,然后对应到具体的LLVM IR语句,参考所给示例进行理解熟悉用法从而解决 * 其次是根据对语法树结点的访问,调用正确的接口来生成对应的LLVM IR代码语句,参考PW5的形式进行解决 ## 实验总结 * 本次实验使我们组成员进一步了解了LLVM IR的语法 * 本次实验使我们组员可以将课堂理论知识中的IR部分与实践相结合,理解更加透彻 * 本次实验使我们组成员更深入理解了LLVM的部分工作原理和机制 * 本次实验使我们组成员提升了对于C++语法中共享指针的熟练程度 ## 实验反馈 * task1和task2中,所需要完成翻译的sy代码都相对简单,可以考虑提供一个具体算法的代码(类似于所给demo),可以进一步加深理解 * task3中可以适当提供给一个实现示例,可以帮助同学们更快熟悉和理解接下来所需要完成的实验任务 ## 组间交流 * 无