-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathquestions.txt
52 lines (39 loc) · 3.06 KB
/
questions.txt
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
1. 返回值是复合类型时,我们知道应该先为其分配内存空间,然后将这块内存的地址作为第一个参数传递。
如何在发动function call时为这块返回值分配内存?
目前的想法是,func call之前肯定会在栈上开辟空间来防止多余参数,返回值的空间可以加在这块里,暂时不考虑RVO。
这里的一切细节暂且隐藏在IR的call指令中,待生成目标汇编时再考虑。
还是说显式地加入栈上分配指令?
2. 函数调用使用的参数本身可能由别的函数调用产生,怎样为此安排栈上空间?先求值再调用外层函数还是现为外层函数开辟栈空间?
使用的形式:直接拷贝全部值(这种貌似无需考虑,拿到地址即可)、点号访问成员等。。。其实expression里的临时struct也有这个问题
直接生成基本块可能会方便很多
也许可以不使用数据结构来收集局部变量,而是通过alloca dealloca这种过程式的标记来表示,这样的话自动变量和临时变量就统一了。
3. 如何在tac中表示不同类型的立即数?
5. 给ValueGenerator写点文档吧
6. 怎样在alloca里统一表示自动变量和临时变量?
7. 以字符串为例的常量的表示
8. 以寄存器传递的参数,可能在函数体内被取地址。
那么在ir转机器码时,怎样通知机器码这件事?通过params这个指针应该可以做到。
为这种参数分配内存要不要在ir里显式写出?一种情况否定了这个提议:有些参数可能就是通过栈来传递的,本来就有地址,
在ir阶段不可能知道该参数以后到底用栈还是寄存器来传递,要不要复制进本函数ar里。
在生成机器码阶段,根据参数列表,应该可以得出,该参数怎样传递(栈还是寄存器)、传递位置、有无被取地址,
到时应该可以作出正确抉择。
9. 汇编里的标签是什么作用域? 文件作用域!
10. passingSpec中也许也需要尺寸、对齐等abi信息,否则无法应对变长参数
11. dealloca的处理
12. 全局变量的收集.
13. 常量和全局变量有相似之处,是否能够合并?
14. 常量又分为可以容纳在指令里的(如int)和必须放在.data段的,分别处理
15. data rdata kdata got lo
16. la saves me!
17. 目前的变量加在操作只考虑了自动变量、参数,没有考虑全局变量!!!!!
* 18. 加载等指令均未考虑浮点数。
19. c语言整形类型转换的规律是,先变长度,再变符号。以此为基础思考立即数的使用。
20. funccall的结果作为左值,LValueGenerator做的事情
21. 给Call指令完善toString
* 22. 考虑内存中的参数 的修改 及GetParamVal引起的问题
23. loadrc有问题
* 24. 考虑增加一个字段,将ir寄存器区分为临时的和绑定于变量的,这样可能
有利于某些寄存器分配算法的实现。
// 21st.March 23:05
* 25. 参数寄存器a0~a3,先一股脑存进栈去8?不然由于函数调用也会使用
这几个寄存器,增加很多复杂度