diff options
author | Tristan Gingold <tgingold@free.fr> | 2017-11-07 05:47:43 +0100 |
---|---|---|
committer | Tristan Gingold <tgingold@free.fr> | 2017-11-07 05:47:43 +0100 |
commit | 8ffc472d4def7cb5fb6b0d1af41e217f88a474e6 (patch) | |
tree | 9e053fcafec873d8b9302569bc5c1b12247ef4b8 /src/vhdl | |
parent | 75b1d013e603af6e7d0e27def4f34b5914a6e6fd (diff) | |
download | ghdl-8ffc472d4def7cb5fb6b0d1af41e217f88a474e6.tar.gz ghdl-8ffc472d4def7cb5fb6b0d1af41e217f88a474e6.tar.bz2 ghdl-8ffc472d4def7cb5fb6b0d1af41e217f88a474e6.zip |
Use flist for signatures.
Diffstat (limited to 'src/vhdl')
-rw-r--r-- | src/vhdl/disp_vhdl.adb | 8 | ||||
-rw-r--r-- | src/vhdl/iirs.adb | 8 | ||||
-rw-r--r-- | src/vhdl/iirs.ads | 4 | ||||
-rw-r--r-- | src/vhdl/nodes_meta.adb | 10 | ||||
-rw-r--r-- | src/vhdl/parse.adb | 4 | ||||
-rw-r--r-- | src/vhdl/sem_decls.adb | 33 |
6 files changed, 31 insertions, 36 deletions
diff --git a/src/vhdl/disp_vhdl.adb b/src/vhdl/disp_vhdl.adb index f6bde461f..4cc22f0f8 100644 --- a/src/vhdl/disp_vhdl.adb +++ b/src/vhdl/disp_vhdl.adb @@ -1258,7 +1258,7 @@ package body Disp_Vhdl is procedure Disp_Signature (Sig : Iir) is Prefix : constant Iir := Get_Signature_Prefix (Sig); - List : Iir_List; + List : constant Iir_Flist := Get_Type_Marks_List (Sig); El : Iir; begin if Is_Valid (Prefix) then @@ -1266,11 +1266,9 @@ package body Disp_Vhdl is Disp_Name (Prefix); end if; Put (" ["); - List := Get_Type_Marks_List (Sig); - if List /= Null_Iir_List then - for I in Natural loop + if List /= Null_Iir_Flist then + for I in Flist_First .. Flist_Last (List) loop El := Get_Nth_Element (List, I); - exit when El = Null_Iir; if I /= 0 then Put (", "); end if; diff --git a/src/vhdl/iirs.adb b/src/vhdl/iirs.adb index 286055d2a..e2d217f6b 100644 --- a/src/vhdl/iirs.adb +++ b/src/vhdl/iirs.adb @@ -5220,20 +5220,20 @@ package body Iirs is Set_Flag5 (Target, Val); end Set_Is_Within_Flag; - function Get_Type_Marks_List (Target : Iir) return Iir_List is + function Get_Type_Marks_List (Target : Iir) return Iir_Flist is begin pragma Assert (Target /= Null_Iir); pragma Assert (Has_Type_Marks_List (Get_Kind (Target)), "no field Type_Marks_List"); - return Iir_To_Iir_List (Get_Field2 (Target)); + return Iir_To_Iir_Flist (Get_Field2 (Target)); end Get_Type_Marks_List; - procedure Set_Type_Marks_List (Target : Iir; List : Iir_List) is + procedure Set_Type_Marks_List (Target : Iir; List : Iir_Flist) is begin pragma Assert (Target /= Null_Iir); pragma Assert (Has_Type_Marks_List (Get_Kind (Target)), "no field Type_Marks_List"); - Set_Field2 (Target, Iir_List_To_Iir (List)); + Set_Field2 (Target, Iir_Flist_To_Iir (List)); end Set_Type_Marks_List; function Get_Implicit_Alias_Flag (Decl : Iir) return Boolean is diff --git a/src/vhdl/iirs.ads b/src/vhdl/iirs.ads index 119f0b3fc..f6defecc3 100644 --- a/src/vhdl/iirs.ads +++ b/src/vhdl/iirs.ads @@ -7245,8 +7245,8 @@ package Iirs is -- List of type_mark for an Iir_Kind_Signature -- Field: Field2 (uc) - function Get_Type_Marks_List (Target : Iir) return Iir_List; - procedure Set_Type_Marks_List (Target : Iir; List : Iir_List); + function Get_Type_Marks_List (Target : Iir) return Iir_Flist; + procedure Set_Type_Marks_List (Target : Iir; List : Iir_Flist); -- Field: Flag1 function Get_Implicit_Alias_Flag (Decl : Iir) return Boolean; diff --git a/src/vhdl/nodes_meta.adb b/src/vhdl/nodes_meta.adb index aa1261220..cadc86c2a 100644 --- a/src/vhdl/nodes_meta.adb +++ b/src/vhdl/nodes_meta.adb @@ -306,7 +306,7 @@ package body Nodes_Meta is Field_Has_Disconnect_Flag => Type_Boolean, Field_Has_Active_Flag => Type_Boolean, Field_Is_Within_Flag => Type_Boolean, - Field_Type_Marks_List => Type_Iir_List, + Field_Type_Marks_List => Type_Iir_Flist, Field_Implicit_Alias_Flag => Type_Boolean, Field_Alias_Signature => Type_Iir, Field_Attribute_Signature => Type_Iir, @@ -5919,6 +5919,8 @@ package body Nodes_Meta is return Get_Index_Constraint_List (N); when Field_Index_List => return Get_Index_List (N); + when Field_Type_Marks_List => + return Get_Type_Marks_List (N); when others => raise Internal_Error; end case; @@ -5939,6 +5941,8 @@ package body Nodes_Meta is Set_Index_Constraint_List (N, V); when Field_Index_List => Set_Index_List (N, V); + when Field_Type_Marks_List => + Set_Type_Marks_List (N, V); when others => raise Internal_Error; end case; @@ -6089,8 +6093,6 @@ package body Nodes_Meta is return Get_Guard_Sensitivity_List (N); when Field_Instantiation_List => return Get_Instantiation_List (N); - when Field_Type_Marks_List => - return Get_Type_Marks_List (N); when Field_Overload_List => return Get_Overload_List (N); when Field_PSL_Clock_Sensitivity => @@ -6129,8 +6131,6 @@ package body Nodes_Meta is Set_Guard_Sensitivity_List (N, V); when Field_Instantiation_List => Set_Instantiation_List (N, V); - when Field_Type_Marks_List => - Set_Type_Marks_List (N, V); when Field_Overload_List => Set_Overload_List (N, V); when Field_PSL_Clock_Sensitivity => diff --git a/src/vhdl/parse.adb b/src/vhdl/parse.adb index 1daed149f..e2c3a51f7 100644 --- a/src/vhdl/parse.adb +++ b/src/vhdl/parse.adb @@ -3498,12 +3498,14 @@ package body Parse is -- List of type_marks. if Current_Token = Tok_Identifier then List := Create_Iir_List; - Set_Type_Marks_List (Res, List); loop Append_Element (List, Parse_Type_Mark (Check_Paren => True)); exit when Current_Token /= Tok_Comma; + + -- Skip ','. Scan; end loop; + Set_Type_Marks_List (Res, List_To_Flist (List)); end if; if Current_Token = Tok_Return then diff --git a/src/vhdl/sem_decls.adb b/src/vhdl/sem_decls.adb index ca1351720..5fdf71c9a 100644 --- a/src/vhdl/sem_decls.adb +++ b/src/vhdl/sem_decls.adb @@ -2248,11 +2248,10 @@ package body Sem_Decls is function Signature_Match (N_Entity : Iir; Sig : Iir_Signature) return Boolean is - List : Iir_List; + List : constant Iir_Flist := Get_Type_Marks_List (Sig); Inter : Iir; El : Iir; begin - List := Get_Type_Marks_List (Sig); case Get_Kind (N_Entity) is when Iir_Kind_Enumeration_Literal => -- LRM93 2.3.2 Signatures @@ -2264,9 +2263,9 @@ package body Sem_Decls is if Get_Return_Type_Mark (Sig) = Null_Iir then return False; end if; - return List = Null_Iir_List - and then Get_Type (N_Entity) - = Get_Type (Get_Return_Type_Mark (Sig)); + return List = Null_Iir_Flist + and then (Get_Type (N_Entity) + = Get_Type (Get_Return_Type_Mark (Sig))); when Iir_Kind_Function_Declaration | Iir_Kind_Interface_Function_Declaration => -- LRM93 2.3.2 Signatures @@ -2305,15 +2304,13 @@ package body Sem_Decls is -- mark of the signature is the same as the base type of the -- corresponding formal parameter of the subprogram; [and finally, ] Inter := Get_Interface_Declaration_Chain (N_Entity); - if List = Null_Iir_List then + if List = Null_Iir_Flist then return Inter = Null_Iir; end if; - for I in Natural loop + for I in Flist_First .. Flist_Last (List) loop El := Get_Nth_Element (List, I); - if El = Null_Iir and Inter = Null_Iir then - return True; - end if; - if El = Null_Iir or Inter = Null_Iir then + if Inter = Null_Iir then + -- More type marks in the signature than in the interface. return False; end if; if Get_Base_Type (Get_Type (Inter)) /= Get_Type (El) then @@ -2321,26 +2318,24 @@ package body Sem_Decls is end if; Inter := Get_Chain (Inter); end loop; - -- Avoid a spurious warning. - return False; + -- Match only if the number of type marks is the same. + return Inter = Null_Iir; end Signature_Match; -- Extract from NAME the named entity whose profile matches with SIG. function Sem_Signature (Name : Iir; Sig : Iir_Signature) return Iir is + List : constant Iir_Flist := Get_Type_Marks_List (Sig); Res : Iir; El : Iir; - List : Iir_List; Error : Boolean; begin -- Sem signature. - List := Get_Type_Marks_List (Sig); - if List /= Null_Iir_List then - for I in Natural loop + if List /= Null_Iir_Flist then + for I in Flist_First .. Flist_Last (List) loop El := Get_Nth_Element (List, I); - exit when El = Null_Iir; El := Sem_Type_Mark (El); - Replace_Nth_Element (List, I, El); + Set_Nth_Element (List, I, El); -- Reuse the Type field of the name for the base type. This is -- a deviation from the use of Type in a name, but restricted to |