diff options
author | Eric Botcazou <ebotcazou@adacore.com> | 2020-01-15 11:03:14 +0100 |
---|---|---|
committer | Pierre-Marie de Rodat <derodat@adacore.com> | 2020-06-03 06:01:44 -0400 |
commit | 415c22da949f15a18c914588e4796b218ccf0db5 (patch) | |
tree | ead43615ea5ed4a07a31358f5df8414efbca6781 /gcc/ada/sem_ch4.adb | |
parent | 30c6e576a32bfa132fd57434a80b35b712f05458 (diff) | |
download | gcc-415c22da949f15a18c914588e4796b218ccf0db5.zip gcc-415c22da949f15a18c914588e4796b218ccf0db5.tar.gz gcc-415c22da949f15a18c914588e4796b218ccf0db5.tar.bz2 |
[Ada] Support pragma Allow_Integer_Address on 64-bit targets
2020-06-03 Eric Botcazou <ebotcazou@adacore.com>
gcc/ada/
* opt.ads (Allow_Integer_Address): Fix typo in comment.
* stand.ads (Standard_Address): New entity.
* cstand.adb (Create_Standard): Create it.
* sem_ch4.adb (Operator_Check): Convert the operands of an
operation with addresses and integers to Standard_Address
if pragma Allow_Integer_Address is in effect.
Diffstat (limited to 'gcc/ada/sem_ch4.adb')
-rw-r--r-- | gcc/ada/sem_ch4.adb | 27 |
1 files changed, 19 insertions, 8 deletions
diff --git a/gcc/ada/sem_ch4.adb b/gcc/ada/sem_ch4.adb index 7b8548f..0b04c42 100644 --- a/gcc/ada/sem_ch4.adb +++ b/gcc/ada/sem_ch4.adb @@ -7168,9 +7168,8 @@ package body Sem_Ch4 is N_Op_Divide, N_Op_Ge, N_Op_Gt, - N_Op_Le) - or else - Nkind_In (N, N_Op_Lt, + N_Op_Le, + N_Op_Lt, N_Op_Mod, N_Op_Multiply, N_Op_Rem, @@ -7183,8 +7182,12 @@ package body Sem_Ch4 is and then not Is_Numeric_Type (Etype (R)) then if Address_Integer_Convert_OK (Etype (R), Etype (L)) then + Rewrite (L, + Unchecked_Convert_To ( + Standard_Address, Relocate_Node (L))); Rewrite (R, - Unchecked_Convert_To (Etype (L), Relocate_Node (R))); + Unchecked_Convert_To ( + Standard_Address, Relocate_Node (R))); if Nkind_In (N, N_Op_Ge, N_Op_Gt, N_Op_Le, N_Op_Lt) then Analyze_Comparison_Op (N); @@ -7202,7 +7205,11 @@ package body Sem_Ch4 is then if Address_Integer_Convert_OK (Etype (L), Etype (R)) then Rewrite (L, - Unchecked_Convert_To (Etype (R), Relocate_Node (L))); + Unchecked_Convert_To ( + Standard_Address, Relocate_Node (L))); + Rewrite (R, + Unchecked_Convert_To ( + Standard_Address, Relocate_Node (R))); if Nkind_In (N, N_Op_Ge, N_Op_Gt, N_Op_Le, N_Op_Lt) then Analyze_Comparison_Op (N); @@ -7229,10 +7236,10 @@ package body Sem_Ch4 is begin Rewrite (L, Unchecked_Convert_To ( - Standard_Integer, Relocate_Node (L))); + Standard_Address, Relocate_Node (L))); Rewrite (R, Unchecked_Convert_To ( - Standard_Integer, Relocate_Node (R))); + Standard_Address, Relocate_Node (R))); if Nkind_In (N, N_Op_Ge, N_Op_Gt, N_Op_Le, N_Op_Lt) then Analyze_Comparison_Op (N); @@ -7330,8 +7337,12 @@ package body Sem_Ch4 is elsif Nkind_In (N, N_Op_Eq, N_Op_Ne) then if Address_Integer_Convert_OK (Etype (R), Etype (L)) then + Rewrite (L, + Unchecked_Convert_To ( + Standard_Address, Relocate_Node (L))); Rewrite (R, - Unchecked_Convert_To (Etype (L), Relocate_Node (R))); + Unchecked_Convert_To ( + Standard_Address, Relocate_Node (R))); Analyze_Equality_Op (N); return; |