C ++ инструкция возврата ссылки не отображается в сборке - PullRequest
0 голосов
/ 17 октября 2019

Я пытаюсь узнать больше о том, как возвращаются ссылки, и в настоящее время я застрял на том, как они отображаются в сборке. Код, который я запускаю, таков:

struct Obj {
    char buf[100];
    int i;
    long b;
} B, B2;

Obj foo(Obj b) {
  b.i = 100; // Do something to the argument
  return b;
}

int main() {

  B2 = foo(B);
}

, а код сборки выглядит следующим образом:

    .file   "return_function_assembly.cpp"
    .text
    .globl  B
    .bss
    .align 32
    .type   B, @object
    .size   B, 112
B:
    .zero   112
    .globl  B2
    .align 32
    .type   B2, @object
    .size   B2, 112
B2:
    .zero   112
    .text
    .globl  _Z3foo3Obj
    .type   _Z3foo3Obj, @function
_Z3foo3Obj:
.LFB0:
    .cfi_startproc
    pushq   %rbp
    .cfi_def_cfa_offset 16
    .cfi_offset 6, -16
    movq    %rsp, %rbp
    .cfi_def_cfa_register 6
    movq    %rdi, -8(%rbp)
    movl    $100, 116(%rbp)
    movq    -8(%rbp), %rax
    movq    16(%rbp), %rdx
    movq    24(%rbp), %rcx
    movq    %rdx, (%rax)
    movq    %rcx, 8(%rax)
    movq    32(%rbp), %rdx
    movq    40(%rbp), %rcx
    movq    %rdx, 16(%rax)
    movq    %rcx, 24(%rax)
    movq    48(%rbp), %rdx
    movq    56(%rbp), %rcx
    movq    %rdx, 32(%rax)
    movq    %rcx, 40(%rax)
    movq    64(%rbp), %rdx
    movq    72(%rbp), %rcx
    movq    %rdx, 48(%rax)
    movq    %rcx, 56(%rax)
    movq    80(%rbp), %rdx
    movq    88(%rbp), %rcx
    movq    %rdx, 64(%rax)
    movq    %rcx, 72(%rax)
    movq    96(%rbp), %rdx
    movq    104(%rbp), %rcx
    movq    %rdx, 80(%rax)
    movq    %rcx, 88(%rax)
    movq    112(%rbp), %rdx
    movq    120(%rbp), %rcx
    movq    %rdx, 96(%rax)
    movq    %rcx, 104(%rax)
    movq    -8(%rbp), %rax
    popq    %rbp
    .cfi_def_cfa 7, 8
    ret
    .cfi_endproc
.LFE0:
    .size   _Z3foo3Obj, .-_Z3foo3Obj
    .globl  main
    .type   main, @function
main:
.LFB1:
    .cfi_startproc
    pushq   %rbp
    .cfi_def_cfa_offset 16
    .cfi_offset 6, -16
    movq    %rsp, %rbp
    .cfi_def_cfa_register 6
    addq    $-128, %rsp
    movq    %fs:40, %rax
    movq    %rax, -8(%rbp)
    xorl    %eax, %eax
    leaq    -128(%rbp), %rax
    pushq   104+B(%rip)
    pushq   96+B(%rip)
    pushq   88+B(%rip)
    pushq   80+B(%rip)
    pushq   72+B(%rip)
    pushq   64+B(%rip)
    pushq   56+B(%rip)
    pushq   48+B(%rip)
    pushq   40+B(%rip)
    pushq   32+B(%rip)
    pushq   24+B(%rip)
    pushq   16+B(%rip)
    pushq   8+B(%rip)
    pushq   B(%rip)
    movq    %rax, %rdi
    call    _Z3foo3Obj
    addq    $112, %rsp
    movq    -128(%rbp), %rax
    movq    -120(%rbp), %rdx
    movq    %rax, B2(%rip)
    movq    %rdx, 8+B2(%rip)
    movq    -112(%rbp), %rax
    movq    -104(%rbp), %rdx
    movq    %rax, 16+B2(%rip)
    movq    %rdx, 24+B2(%rip)
    movq    -96(%rbp), %rax
    movq    -88(%rbp), %rdx
    movq    %rax, 32+B2(%rip)
    movq    %rdx, 40+B2(%rip)
    movq    -80(%rbp), %rax
    movq    -72(%rbp), %rdx
    movq    %rax, 48+B2(%rip)
    movq    %rdx, 56+B2(%rip)
    movq    -64(%rbp), %rax
    movq    -56(%rbp), %rdx
    movq    %rax, 64+B2(%rip)
    movq    %rdx, 72+B2(%rip)
    movq    -48(%rbp), %rax
    movq    -40(%rbp), %rdx
    movq    %rax, 80+B2(%rip)
    movq    %rdx, 88+B2(%rip)
    movq    -32(%rbp), %rax
    movq    -24(%rbp), %rdx
    movq    %rax, 96+B2(%rip)
    movq    %rdx, 104+B2(%rip)
    movl    $0, %eax
    movq    -8(%rbp), %rdx
    xorq    %fs:40, %rdx
    je  .L5
    call    __stack_chk_fail@PLT
.L5:
    leave
    .cfi_def_cfa 7, 8
    ret
    .cfi_endproc
.LFE1:
    .size   main, .-main
    .ident  "GCC: (Ubuntu 7.4.0-1ubuntu1~18.04.1) 7.4.0"
    .section    .note.GNU-stack,"",@progbits

Система Linux, скомпилированная с g ++, и из моего понимания функциональных фреймовЯ должен увидеть дополнительную инструкцию "push", которая помещает адрес B2 в стек перед инструкцией call в функциональном фрейме.

Однако ни одна из этих инструкций push не соответствует тому, что янаходясь в поиске. Я вижу инструкцию по выводу и pushq (% rbp) в начале main, но ничего такого, что я должен видеть, мне кажется. Кто-нибудь может посоветовать, пожалуйста?

...