backend-bugs
Backend Bugs
出现bug的源码:
1
2
3
4
5
6
7
8int foo() {
return 5;
}
int main() {
putint(foo());
return 0;
}目前生成的目标代码: (简化过)
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.data
.text
ifElseIf:
ifElseIfEntry:
li a0, 5
ret
.globl main
main:
mainEntry:
# reserve space
addi sp, sp, -4
# save caller saved regs
addi sp, sp, -8
sd ra, 0(sp)
# call ifElseIf
call ifElseIf
# restore caller saved regs
ld ra, 0(sp)
addi sp, sp, 8
# get address of local var:ifElseIf
sw a0, 0(sp)
# prepare params
# fetch variables
# get address of local var:ifElseIf
lw t1, 0(sp)
mv a0, t1
# save caller saved regs
addi sp, sp, -8
sd ra, 0(sp)
call putint
# restore caller saved regs
ld ra, 0(sp)
addi sp, sp, 8
# fetch variables
li a0, 0
addi sp, sp, 4
ret报错信息 (昉星光2) :
1
Bus error
修改代码使得
sp
按照8字节对齐: (即 sp 的当前值 永远与 sp初始值 相差 8*k 个字节):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.data
.text
ifElseIf:
ifElseIfEntry:
li a0, 5
ret
.globl main
main:
mainEntry:
# reserve space
addi sp, sp, -8
# save caller saved regs
addi sp, sp, -8
sd ra, 0(sp)
# call ifElseIf
call ifElseIf
# restore caller saved regs
ld ra, 0(sp)
addi sp, sp, 8
# get address of local var:ifElseIf
sw a0, 0(sp)
# prepare params
# fetch variables
# get address of local var:ifElseIf
lw t1, 0(sp)
mv a0, t1
# save caller saved regs
addi sp, sp, -8
sd ra, 0(sp)
call putint
# restore caller saved regs
ld ra, 0(sp)
addi sp, sp, 8
# fetch variables
li a0, 0
addi sp, sp, 8
ret报错消失, 输出正确答案 5
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来源 chaos-warzh's blog!
评论