@@ -30,9 +30,6 @@ package body Tree_Walk is
30
30
procedure Append_Declare_And_Init
31
31
(Symbol : Irep; Value : Irep; Block : Irep; Source_Loc : Source_Ptr);
32
32
33
- function Add_To_Table (Name : String; Symbol_Type : Irep; Value : Irep)
34
- return Symbol;
35
-
36
33
procedure Declare_Itype (Ty : Entity_Id);
37
34
38
35
function Do_Address_Of (N : Node_Id) return Irep
@@ -129,7 +126,7 @@ package body Tree_Walk is
129
126
Description : Irep) return Irep;
130
127
131
128
function Make_Range_Assert_Expr (N : Node_Id; Value : Irep;
132
- Value_Type : Irep) return Irep;
129
+ Bounds_Type : Irep) return Irep;
133
130
134
131
function Do_Nondet_Function_Call (N : Node_Id) return Irep
135
132
with Pre => Nkind (N) = N_Function_Call,
@@ -894,29 +891,8 @@ package body Tree_Walk is
894
891
return Do_Bare_Range_Constraint (N, Underlying);
895
892
end Do_Array_Range ;
896
893
897
- -- ----------------
898
- -- Add_To_Table --
899
- -- ----------------
900
-
901
- function Add_To_Table (Name : String; Symbol_Type : Irep; Value : Irep)
902
- return Symbol is
903
- New_Symbol : Symbol;
904
- begin
905
- New_Symbol.SymType := Symbol_Type;
906
- New_Symbol.Name := Intern (Name);
907
- New_Symbol.PrettyName := New_Symbol.Name;
908
- New_Symbol.BaseName := New_Symbol.Name;
909
- New_Symbol.Mode := Intern (" C" );
910
- New_Symbol.Value := Value;
911
-
912
- if not (Global_Symbol_Table.Contains (Key => Intern (Name))) then
913
- Global_Symbol_Table.Insert (Intern (Name), New_Symbol);
914
- end if ;
915
- return New_Symbol;
916
- end Add_To_Table ;
917
-
918
894
function Make_Range_Assert_Expr (N : Node_Id; Value : Irep;
919
- Value_Type : Irep)
895
+ Bounds_Type : Irep)
920
896
return Irep
921
897
is
922
898
Call_Inst : constant Irep := New_Irep (I_Side_Effect_Expr_Function_Call);
@@ -930,45 +906,55 @@ package body Tree_Walk is
930
906
-- Build_Assert_Function --
931
907
-- -------------------------
932
908
909
+ -- Build a symbol for the following function
910
+ -- Actual_Type range_check(Actual_Type value) {
911
+ -- assert (value >= Bounds_Type.lower_bound
912
+ -- && value <= Bounds_Type.upper_bound);
913
+ -- return value;
914
+ -- }
933
915
function Build_Assert_Function return Symbol
934
916
is
935
- Func_Type : constant Irep := New_Irep (I_Code_Type );
936
- Func_Args : constant Irep := New_Irep (I_Parameter_List );
937
- Func_Name : constant String :=
938
- Fresh_Var_Name ( " range_check " );
939
- Body_Block : constant Irep := New_Irep (I_Code_Block);
940
- Return_Inst : constant Irep := New_Irep (I_Code_Return);
941
- Description : constant Irep := New_Irep (I_String_Constant_Expr );
942
- Value_Param : Irep := New_Irep (I_Symbol_Expr );
917
+ Func_Name : constant String := Fresh_Var_Name ( " range_check " );
918
+ Body_Block : constant Irep := Make_Code_Block (Sloc (N) );
919
+ Description : constant Irep := Make_String_Constant_Expr (
920
+ Source_Location => Sloc (N),
921
+ I_Type => Ireps.Empty,
922
+ Range_Check => False,
923
+ Value => " Range Check " );
924
+ Func_Params : constant Irep := New_Irep (I_Parameter_List );
943
925
Value_Arg : constant Irep :=
944
926
Create_Fun_Parameter (Fun_Name => Func_Name,
945
927
Param_Name => " value" ,
946
928
Param_Type => Actual_Type,
947
- Param_List => Func_Args ,
929
+ Param_List => Func_Params ,
948
930
A_Symbol_Table => Global_Symbol_Table,
949
931
Source_Location => Sloc (N));
932
+ Func_Type : constant Irep := Make_Code_Type (
933
+ -- Function parameters should only be created via
934
+ -- Create_Fun_Parameter
935
+ Parameters => Func_Params,
936
+ Ellipsis => False,
937
+ Return_Type => Actual_Type,
938
+ Inlined => False,
939
+ Knr => False);
940
+ Value_Param : constant Irep := Param_Symbol (Value_Arg);
941
+ --
942
+ Return_Inst : constant Irep := Make_Code_Return (
943
+ Return_Value => Value_Param,
944
+ Source_Location => Sloc (N),
945
+ I_Type => Ireps.Empty);
950
946
begin
951
- -- Create type (value_type) -> element_type
952
-
953
- Set_Parameters (Func_Type, Func_Args);
954
- Set_Return_Type (Func_Type, Actual_Type);
955
- Set_Ellipsis (Func_Type, False);
956
-
957
- -- Create body (allocate and then call array_copy)
958
- Value_Param := Param_Symbol (Value_Arg);
959
- Set_Return_Value (Return_Inst, Value_Param);
960
- Set_Value (I => Description,
961
- Value => " Range Check" );
962
947
Append_Op (Body_Block,
963
948
Make_Assert_Call (Expression (N),
964
949
Make_Range_Expression
965
- (Value_Param, Value_Type ),
950
+ (Value_Param, Bounds_Type ),
966
951
Description));
967
952
Append_Op (Body_Block, Return_Inst);
968
953
969
- return Add_To_Table (Name => Func_Name,
970
- Symbol_Type => Func_Type,
971
- Value => Body_Block);
954
+ return New_Function_Symbol_Entry (Name => Func_Name,
955
+ Symbol_Type => Func_Type,
956
+ Value => Body_Block,
957
+ A_Symbol_Table => Global_Symbol_Table);
972
958
end Build_Assert_Function ;
973
959
974
960
begin
@@ -1011,7 +997,7 @@ package body Tree_Walk is
1011
997
Value => Make_Range_Assert_Expr (
1012
998
N => N,
1013
999
Value => RHS,
1014
- Value_Type => Get_Type (LHS)));
1000
+ Bounds_Type => Get_Type (LHS)));
1015
1001
-- Set_Op0 (Cast_RHS, RHS);
1016
1002
Set_Type (Cast_RHS, Get_Type (LHS));
1017
1003
Set_Rhs (I => R,
@@ -1717,21 +1703,23 @@ package body Tree_Walk is
1717
1703
-- --------------------
1718
1704
1719
1705
function Make_Assume_Expr (N : Node_Id; Assumption : Irep) return Irep is
1720
- SE_Call_Expr : constant Irep :=
1706
+ Sym_Assume : constant Irep := Make_Symbol_Expr (
1707
+ Source_Location => Sloc (N),
1708
+ I_Type => New_Irep (I_Code_Type),
1709
+ Range_Check => False,
1710
+ Identifier => " __CPROVER_assume" );
1711
+ SEE_Fun_Call : constant Irep :=
1721
1712
New_Irep (I_Side_Effect_Expr_Function_Call);
1722
- Sym_Assume : constant Irep := New_Irep (I_Symbol_Expr);
1723
1713
Assume_Args : constant Irep := New_Irep (I_Argument_List);
1724
1714
begin
1725
- Set_Identifier (Sym_Assume, " __CPROVER_assume" );
1726
- Set_Type (Sym_Assume, New_Irep (I_Code_Type));
1727
1715
1728
1716
Append_Argument (Assume_Args, Assumption);
1729
1717
1730
- Set_Source_Location (SE_Call_Expr , Sloc (N));
1731
- Set_Function (SE_Call_Expr , Sym_Assume);
1732
- Set_Arguments (SE_Call_Expr , Assume_Args);
1733
- Set_Type (SE_Call_Expr , Make_Void_Type);
1734
- return SE_Call_Expr ;
1718
+ Set_Source_Location (SEE_Fun_Call , Sloc (N));
1719
+ Set_Function (SEE_Fun_Call , Sym_Assume);
1720
+ Set_Arguments (SEE_Fun_Call , Assume_Args);
1721
+ Set_Type (SEE_Fun_Call , Make_Void_Type);
1722
+ return SEE_Fun_Call ;
1735
1723
end Make_Assume_Expr ;
1736
1724
1737
1725
-- --------------------
@@ -3809,7 +3797,7 @@ package body Tree_Walk is
3809
3797
Set_Op0 (I => Ret,
3810
3798
Value => Make_Range_Assert_Expr (N => N,
3811
3799
Value => To_Convert,
3812
- Value_Type => New_Type));
3800
+ Bounds_Type => New_Type));
3813
3801
else
3814
3802
Set_Op0 (Ret, To_Convert);
3815
3803
end if ;
0 commit comments