[PATCH][4.3] Deprecate -ftrapv

Robert Dewar dewar@adacore.com
Sat Mar 1 02:05:00 GMT 2008


Richard Kenner wrote:
>> Why doesn't it work?  Can it be made to work relatively easily?  Do we 
>> need functionality like this for Ada or Java?
> 
> Ada currently has to do this itself, precisely because -ftrapv doesn't
> work, so it's not the case that Ada "needs" it.

Well no one "needs" anything in this sense, any interfaced is Turing
complete so there is *always* a work around deficiencies in the back 
end. But right now, the "do this itself" is really horribly inefficient:

> procedure k (x : out integer; y,z : integer) is
> begin
>    x := y + z;
> end;

> procedure k (x : out integer; y : integer; z : integer) is
> begin
>    [constraint_error when
>      not (long_long_integer?(y) + long_long_integer?(z) in
>        -16#8000_0000# .. 16#7FFF_FFFF#)
>      "overflow check failed"]
>    x := integer?(long_long_integer?(y) + long_long_integer?(z));
>    return;
> end k;


assembly language (-O2) with -gnato to enable overflow checking

> __ada_k:
> LFB3:
>         pushl   %ebp
> LCFI0:
>         movl    %esp, %ebp
> LCFI1:
>         pushl   %ebx
> LCFI2:
>         subl    $4, %esp
> LCFI3:
>         movl    8(%ebp), %eax
>         movl    12(%ebp), %ecx
>         movl    %eax, %edx
>         movl    %ecx, %ebx
>         sarl    $31, %edx
>         sarl    $31, %ebx
>         addl    %eax, %ecx
>         adcl    %edx, %ebx
>         movl    %ecx, %eax
>         addl    $-2147483648, %eax
>         movl    %ebx, %edx
>         adcl    $0, %edx
>         cmpl    $0, %edx
>         jbe     L6
>         pushl   %eax
>         pushl   %eax
>         pushl   $3
>         pushl   $LC0
> LCFI4:
>         call    ___gnat_rcheck_10
>         .p2align 4,,7
> L6:
>         movl    %ecx, %eax
>         movl    -4(%ebp), %ebx
>         leave
>         ret

pretty gruesome :-(



More information about the Gcc mailing list