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.6 KiB
2.6 KiB
PW6 实验报告
PB21000117 陈应豪 PB21111663 李璐豪
问题回答
task1
while
语句块的布局特点是将循环体、循环条件和循环结束语块分成三个bb块。- cond_bb是条件。如果为真就跳转到true_bb,否则跳转到false_bb
- true_bb是循环体。每次结束后跳到cond_bb
- false_bb是循环结束语块
Func
语块是一个单独的语句块。在调用函数的时候使用call的方法来调用函数,然后把变量传入到函数中
task2
请给出SysYFIR.md
中提到的两种getelementptr用法的区别, 并解释原因:
%2 = getelementptr [10 x i32], [10 x i32]* %1, i32 0, i32 %0
%2 = getelementptr i32, i32* %1, i32 %0
区别:第一种先说明了数组的类型和数组指针,然后再根据偏移类型和偏移值算出地址;第二种方式是用普通的指针而非数组指针做基址加偏移。
原因是数据结构不同
task3
使用scope处理函数,能很好的约定变量的作用域,不容易引起变量的越界
实验设计
在task1的时候,学习SysYF的语法,并编写等效的ll文件
在task2的时候,学习能够生成SysYF的IR文法,使之能生成等效的ll文件
在task3的时候,利用实验框架,通过类比上一关的IR认罚的编写,利用已经生成的AST树为不同的模块编写对应的IR语法
-
在task1的时候,学习SysYF的语法,并编写等效的ll文件
-
在task2的时候,学习能够生成SysYF的IR文法,使之能生成等效的ll文件
-
在task3的时候,利用实验框架,通过类比上一关的IR认罚的编写,利用已经生成的AST树为不同的模块编写对应的IR语法
- 参考助教给出的代码框架,我们把实验分成了变量定义、初始化和赋值;函数和算数调用和求值两个部分进行分工
实验难点及解决方案
在函数外表达式的计算中,由于全局变量无法使用bb模块内的build相关函数,需要根据变量名,单独取出值并计算
Const数组不会在函数外进行再赋值的操作
-
全局变量在初始化时,如果用到其他全局变量进行赋初值,无法使用builder->create_load()
-
获取全局数组中元素的值比较麻烦
- 因此。如果scope.in_global(),那不论访问什么变量,我们都传值(因为赋初值在初始化中完成了,和lval中的传值不冲突。同时,在没有进入任何bb的情况下赋值语句是不能出现的)
实验总结
利用PW5学到的AST以及访问者模式,我们编写了能够生成IR的实验框架,对AST和IR的理解更加深刻
实验反馈
配置文件不够齐全