Backend Bugs

  1. 出现bug的源码:

    1
    2
    3
    4
    5
    6
    7
    8
    int foo() {
    return 5;
    }

    int main() {
    putint(foo());
    return 0;
    }
  2. 目前生成的目标代码: (简化过)

    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
  3. 报错信息 (昉星光2) :

    1
    Bus error
  4. 修改代码使得 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. 报错消失, 输出正确答案 5