diff --git a/exp6/report/report.md b/exp6/report/report.md index 95dc34a..8dde411 100644 --- a/exp6/report/report.md +++ b/exp6/report/report.md @@ -2,6 +2,8 @@ 学号1 姓名1 学号2 姓名2 学号3 姓名3 (不要上传到外网) + + ## 问题回答 1-1 请给出while语句对应的LLVM IR的代码布局特点,重点解释其中涉及的几个`br`指令的含义(包含各个参数的含义) @@ -12,7 +14,7 @@ while的条件为一个基本块,后面附带两个基本块,第一个是循 例如 -```c++ +``` {.cpp} while(i tmp_condbb_while; +std::vector tmp_falsebb_while; +std::vector tmp_truebb; +std::vector tmp_falsebb; +``` + +1. if语句: + + 1. 若没有else语句,则整个语句即可分为true 部分 (if(true)) 与next部分。先将创造出的true压入相应容器。 进入判断条件语句:判断条件表达式是否大于与其类型相同的常数0;若大于,则跳转到true 部分。 之后,运行到next部分; + 2. 若有else语句,则添加false 部分 (if(false))。将创造出的false 部分压入相应容器。进入判断条件语句:判断条件表达式是否大于与其类型相同的常数0;若大于,则跳转到true 部分;小于,则跳转的false 部分。 之后,运行到next 部分; + + 结束后,弹出相应容器中的值。 + +2. while语句: + + 创造cond,true,false三个部分,压入相应容器,与if相同,判断条件表达式是否大于与其类型相同的常数0,后跳转到相应部分,true结束后跳转到cond。 + + 结束后,弹出相应容器中的值。 + +3. break语句: + + 跳转到while false部分。 + +4. continue语句: + + 跳转到while cond部分。 + +再考虑变量定义: + +​ VarDef :分为数组,非数组,初始化,非初始化等多种情况考虑,具体在实验难点中讨论。 + +左值表达式: + +​ LVal:分为是否为数组进行讨论;若不是数组,则可以直接在符号表中找到相应的值进行赋值。若为数组,则利用gep对数组进行寻址赋值。 + +函数定义: + +​ FuncDef:根据函数返回值类型与paramlist形参类型创建函数,函数体中根据是否有“return”,构建“ret”。 + +​ FuncFParamList:遍历参数表,记录名字,分配空间,并赋实参值; + + + ## 实验难点及解决方案 -1. 左值、右值转换 -2. 短路计算 +1. 左值、右值转换 + +2. 短路计算 ## 实验总结