MIPS的GCC发出带有“=”的程序集标签(?)&引用;

MIPS的GCC发出带有“=”的程序集标签(?)&引用;,gcc,assembly,mips,Gcc,Assembly,Mips,大家好, 我正在使用GCC 9.3.0为MIPS生成程序集文件。当我观察这些装配线时,我注意到一些看起来像跳转标签的东西——但它从未被引用过 _ZN10FileSystem8AutoLoad9loadAsyncERKNS0_8FileListE: .frame $sp,40,$31 # vars= 0, regs= 5/0, args= 16, gp= 0 .mask 0x800f0000,-4 .fmask 0x00000000,0 .set

大家好,

我正在使用GCC 9.3.0为MIPS生成程序集文件。当我观察这些装配线时,我注意到一些看起来像跳转标签的东西——但它从未被引用过

_ZN10FileSystem8AutoLoad9loadAsyncERKNS0_8FileListE:
    .frame  $sp,40,$31      # vars= 0, regs= 5/0, args= 16, gp= 0
    .mask   0x800f0000,-4
    .fmask  0x00000000,0
    .set    noreorder
    .set    nomacro
    addiu   $sp,$sp,-40
    sw  $18,28($sp)
    lui $18,%hi(_ZN10FileSystemL12curLoadStateE)
    sw  $16,20($sp)
    lw  $16,%lo(_ZN10FileSystemL12curLoadStateE)($18)
    sw  $19,32($sp)
    sw  $17,24($sp)
    lui $19,%hi(_ZN10FileSystem8AutoLoadL14curListElementE)
    move    $17,$4
    li  $4,2            # 0x2
    lw  $3,0($17)
    lw  $2,%lo(_ZN10FileSystem8AutoLoadL14curListElementE)($19)
    bne $16,$4,$L44
    sw  $31,36($sp)

$L36 = .
    addiu   $2,$2,1
$L48:
    sll $4,$2,2
    addu    $3,$3,$4
    lw  $16,0($3)
    sw  $0,%lo(_ZN10FileSystemL12curLoadStateE)($18)
    sw  $2,%lo(_ZN10FileSystem8AutoLoadL14curListElementE)($19)
    sltu    $16,$16,1
$L35:
    lw  $31,36($sp)
    lw  $19,32($sp)
    lw  $18,28($sp)
    lw  $17,24($sp)
    move    $2,$16
    lw  $16,20($sp)
    jr  $31
    addiu   $sp,$sp,40

“$L36=”是什么意思?它是一个经过优化的跳转标签吗?

是GAS语法中的当前位置。像
.word.
会发出一个包含自己地址的单词。我不知道为什么GCC不只是发出
$L36:
来定义该位置的标签,而不是使用
=
将符号值(地址)设置到该位置。您是否有一些最小的C源代码导致asm包含此代码?遗憾的是,代码现在已经更改,并且不再发出此语句。然而,我认为它与代码中的goto语句有关。所以$L36=。与$L36的含义相同:?这可能是删除此标签的优化步骤的结果吗?因为它没有在任何地方引用。是的,
$L36:
$L36=。
之间没有明显的区别。Re:优化:可能不会。大多数优化都是在程序逻辑以SSA形式出现,然后是RTL形式出现时发生的,而在编译器实际转换为asm文本之前很久。这不是优化,因为
$L36:
$L36=。
都不接受任何代码<代码>$L36=。可能是从与C中的用户标签相对应的标签生成的程序集,与其他标签不同,其他标签是控件结构的if-then/while标签程序集形式所需的编译器内部标签(if-then/while,return).我猜这是编译器为这个C构造(带标签的语句)生成程序集的选择。没有充分的理由选择一种标签形式而不是另一种。label语句的标签的生成几乎肯定会经过与其他标签稍有不同的内部编译器代码路径,因此程序集可能会有所不同,这里就是这样。
是GAS语法中的当前位置。像
.word.
会发出一个包含自己地址的单词。我不知道为什么GCC不只是发出
$L36:
来定义该位置的标签,而不是使用
=
将符号值(地址)设置到该位置。您是否有一些最小的C源代码导致asm包含此代码?遗憾的是,代码现在已经更改,并且不再发出此语句。然而,我认为它与代码中的goto语句有关。所以$L36=。与$L36的含义相同:?这可能是删除此标签的优化步骤的结果吗?因为它没有在任何地方引用。是的,
$L36:
$L36=。
之间没有明显的区别。Re:优化:可能不会。大多数优化都是在程序逻辑以SSA形式出现,然后是RTL形式出现时发生的,而在编译器实际转换为asm文本之前很久。这不是优化,因为
$L36:
$L36=。
都不接受任何代码<代码>$L36=。可能是从与C中的用户标签相对应的标签生成的程序集,与其他标签不同,其他标签是控件结构的if-then/while标签程序集形式所需的编译器内部标签(if-then/while,return).我猜这是编译器为这个C构造(带标签的语句)生成程序集的选择。没有充分的理由选择一种标签形式而不是另一种。label语句的标签的生成几乎肯定要经过与其他标签稍有不同的内部编译器代码路径,因此程序集可以不同,这里就是这样。