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.3 KiB

PW6 实验报告

  • 舒英特 PB21111704

  • 杨宇航 PB21051030

问题回答

  • 1-1 一个while语句对应三个标签:第一个标签处执行判断,第二个标签处执行函数体,第三个标签对应while的末尾。br指令有两种形式:br label a表示直接跳转到a标签处;br i1 x, label a, label b表示x是真则跳到ax是假则跳到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中可以适当提供给一个实现示例可以帮助同学们更快熟悉和理解接下来所需要完成的实验任务

组间交流