diff options
author | Eric Botcazou <ebotcazou@adacore.com> | 2024-04-04 18:15:24 +0200 |
---|---|---|
committer | Marc Poulhiès <poulhies@adacore.com> | 2024-05-21 09:26:48 +0200 |
commit | 933d27af7748c38f1213edceaa6a2edf46f82cc2 (patch) | |
tree | d1cce2ab5a7ef68d942bec516b414aafc0d1271a /gcc | |
parent | 21484502b0d773ae485be9c9b814b30f2b52fb2f (diff) | |
download | gcc-933d27af7748c38f1213edceaa6a2edf46f82cc2.zip gcc-933d27af7748c38f1213edceaa6a2edf46f82cc2.tar.gz gcc-933d27af7748c38f1213edceaa6a2edf46f82cc2.tar.bz2 |
ada: Remove useless trampolines caused by Unchecked_Conversion
The partial solution implemented in Validate_Unchecked_Conversion to support
unchecked conversions between addresses and pointers to subprograms, for the
platforms where pointers to subprograms do not all have the same size, turns
out to be counter-productive for others because it may cause the creation of
useless trampolines, which in turn makes the stack executable.
gcc/ada/
* sem_ch13.adb (Validate_Unchecked_Conversion): Restrict forcing the
Can_Use_Internal_Rep flag to platforms that require unnesting.
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/ada/sem_ch13.adb | 29 |
1 files changed, 16 insertions, 13 deletions
diff --git a/gcc/ada/sem_ch13.adb b/gcc/ada/sem_ch13.adb index 59c8002..4cf6fc9 100644 --- a/gcc/ada/sem_ch13.adb +++ b/gcc/ada/sem_ch13.adb @@ -18132,20 +18132,23 @@ package body Sem_Ch13 is Set_No_Strict_Aliasing (Implementation_Base_Type (Target)); end if; - -- If the unchecked conversion is between Address and an access - -- subprogram type, show that we shouldn't use an internal - -- representation for the access subprogram type. + -- For code generators that do not support nested subprograms, if the + -- unchecked conversion is between Address and an access subprogram + -- type, show that we shouldn't use an internal representation for the + -- access subprogram type. - if Is_Access_Subprogram_Type (Target) - and then Is_Descendant_Of_Address (Source) - and then In_Same_Source_Unit (Target, N) - then - Set_Can_Use_Internal_Rep (Base_Type (Target), False); - elsif Is_Access_Subprogram_Type (Source) - and then Is_Descendant_Of_Address (Target) - and then In_Same_Source_Unit (Source, N) - then - Set_Can_Use_Internal_Rep (Base_Type (Source), False); + if Unnest_Subprogram_Mode then + if Is_Access_Subprogram_Type (Target) + and then Is_Descendant_Of_Address (Source) + and then In_Same_Source_Unit (Target, N) + then + Set_Can_Use_Internal_Rep (Base_Type (Target), False); + elsif Is_Access_Subprogram_Type (Source) + and then Is_Descendant_Of_Address (Target) + and then In_Same_Source_Unit (Source, N) + then + Set_Can_Use_Internal_Rep (Base_Type (Source), False); + end if; end if; -- Generate N_Validate_Unchecked_Conversion node for back end in case |