aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorEric Botcazou <ebotcazou@adacore.com>2024-04-04 18:15:24 +0200
committerMarc Poulhiès <poulhies@adacore.com>2024-05-21 09:26:48 +0200
commit933d27af7748c38f1213edceaa6a2edf46f82cc2 (patch)
treed1cce2ab5a7ef68d942bec516b414aafc0d1271a
parent21484502b0d773ae485be9c9b814b30f2b52fb2f (diff)
downloadgcc-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.
-rw-r--r--gcc/ada/sem_ch13.adb29
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