Re: FW: noreturn atribute and its optimization

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 





On 11/01/2015 01:11 PM, boris smidt wrote:
Dear,

I have been playing around with the noreturn atribute and  created the following program (i know this is not thr right way to write C):

#include <stdio.h>
static void loop()__attribute__((noreturn,nothrow));
//int main()__attribute__((noreturn,nothrow));
static void loop(int a)
{
     int b= a+1;
     printf("Hello World %u!\n",b);
     loop(b);
}

int main()
{
     int b= 1;
     printf("Hello World %u!\n",b);
     loop(b);
}



I would have expected this program to run forever. But when i looked at the generated assembly code with -O3 it calls the function loop and allocates stack in the loop function and thus crashes.
But i wonder why  this function doesn't clear/reset the stack, since it is a "no return function" and thus can never return to older stack references.

The noreturn attribute is an indication to the caller that the callee does not return, and thus it can optimize the caller accordingly, and avoid warnings about missing return values in the caller.

It does not direct the compiler to optimize the callee, and even if it did, with optimizations disabled, it wouldn't.


When i compiled the program it with -O3, without the atributes, it generates the expected result. i.e. a jump to the function label and no allocating on the stack.


Here is the generated assembly:


with atrributes
      .file    "main.c"
     .section .rdata,"dr"
.LC0:
     .ascii "Hello World %u!\12\0"
     .text
     .p2align 4,,15
     .def    loop;    .scl    3;    .type    32;    .endef
     .seh_proc    loop
loop:
     pushq    %rbx
     .seh_pushreg    %rbx
     subq    $32, %rsp
     .seh_stackalloc    32
     .seh_endprologue
     leal    1(%rcx), %ebx
     leaq    .LC0(%rip), %rcx
     movl    %ebx, %edx
     call    printf
     movl    %ebx, %ecx
     call    loop
     nop
     .seh_endproc
     .def    __main;    .scl    2;    .type    32;    .endef
     .section    .text.startup,"x"
     .p2align 4,,15
     .globl    main
     .def    main;    .scl    2;    .type    32;    .endef
     .seh_proc    main
main:
     subq    $40, %rsp
     .seh_stackalloc    40
     .seh_endprologue
     call    __main
     leaq    .LC0(%rip), %rcx
     movl    $1, %edx
     call    printf
     movl    $1, %ecx
     call    loop
     nop
     .seh_endproc
     .def    printf;    .scl    2;    .type    32;    .endef


without attributs
     .file    "main.c"
     .def    __main;    .scl    2;    .type    32;    .endef
     .section .rdata,"dr"
.LC0:
     .ascii "Hello World %u!\12\0"
     .section    .text.startup,"x"
     .p2align 4,,15
     .globl    main
     .def    main;    .scl    2;    .type    32;    .endef
     .seh_proc    main
main:
     pushq    %rbx
     .seh_pushreg    %rbx
     subq    $32, %rsp
     .seh_stackalloc    32
     .seh_endprologue
     movl    $1, %ebx
     call    __main
     leaq    .LC0(%rip), %rcx
     movl    $1, %edx
     call    printf
     .p2align 4,,10
.L2:
     addl    $1, %ebx
     leaq    .LC0(%rip), %rcx
     movl    %ebx, %edx
     call    printf
     jmp    .L2
     .seh_endproc

     .def    printf;    .scl    2;    .type    32;    .endef









[Index of Archives]     [Linux C Programming]     [Linux Kernel]     [eCos]     [Fedora Development]     [Fedora Announce]     [Autoconf]     [The DWARVES Debugging Tools]     [Yosemite Campsites]     [Yosemite News]     [Linux GCC]

  Powered by Linux