aboutsummaryrefslogtreecommitdiffstats
path: root/src/vhdl/sem_scopes.adb
diff options
context:
space:
mode:
Diffstat (limited to 'src/vhdl/sem_scopes.adb')
-rw-r--r--src/vhdl/sem_scopes.adb1672
1 files changed, 0 insertions, 1672 deletions
diff --git a/src/vhdl/sem_scopes.adb b/src/vhdl/sem_scopes.adb
deleted file mode 100644
index e4f780961..000000000
--- a/src/vhdl/sem_scopes.adb
+++ /dev/null
@@ -1,1672 +0,0 @@
--- Semantic analysis.
--- Copyright (C) 2002, 2003, 2004, 2005 Tristan Gingold
---
--- GHDL is free software; you can redistribute it and/or modify it under
--- the terms of the GNU General Public License as published by the Free
--- Software Foundation; either version 2, or (at your option) any later
--- version.
---
--- GHDL is distributed in the hope that it will be useful, but WITHOUT ANY
--- WARRANTY; without even the implied warranty of MERCHANTABILITY or
--- FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
--- for more details.
---
--- You should have received a copy of the GNU General Public License
--- along with GHDL; see the file COPYING. If not, write to the Free
--- Software Foundation, 59 Temple Place - Suite 330, Boston, MA
--- 02111-1307, USA.
-with Logging; use Logging;
-with Tables;
-with Flags; use Flags;
-with Name_Table; -- use Name_Table;
-with Files_Map; use Files_Map;
-with Errorout; use Errorout;
-with Iirs_Utils; use Iirs_Utils;
-
-package body Sem_Scopes is
- -- An interpretation cell is the element of the simply linked list
- -- of interpretation for an identifier.
- -- Interpretation cells are stored in table Interpretations.
- type Interpretation_Cell is record
- -- The declaration for this interpretation.
- Decl: Iir;
-
- -- If True, the declaration is potentially visible (ie visible via a
- -- use clause).
- Is_Potential : Boolean;
-
- -- If True, previous declarations in PREV chain are hidden and shouldn't
- -- be considered.
- Prev_Hidden : Boolean;
-
- -- Previous interpretation for this identifier.
- -- If No_Name_Interpretation, this (not PREV) interpretation is the last
- -- one. If Prev_Hidden is True, PREV must be ignored. If Prev_Hidden is
- -- false, the identifier is overloaded.
- Prev: Name_Interpretation_Type;
-
- -- Previous added identifier in the declarative region. This forms a
- -- linked list used to remove interpretations when a declarative
- -- region is closed.
- Prev_In_Region : Name_Id;
- end record;
- pragma Pack (Interpretation_Cell);
-
- package Interpretations is new Tables
- (Table_Component_Type => Interpretation_Cell,
- Table_Index_Type => Name_Interpretation_Type,
- Table_Low_Bound => First_Valid_Interpretation,
- Table_Initial => 1024);
-
- -- Cached value of Prev_In_Region of current region.
- Last_In_Region : Name_Id := Null_Identifier;
-
- -- First interpretation in the current declarative region.
- Current_Region_Start : Name_Interpretation_Type :=
- First_Valid_Interpretation;
-
- -- First valid interpretation. All interpretations smaller than this
- -- value are part of a previous (and nested) analysis and must not be
- -- considered.
- First_Interpretation : Name_Interpretation_Type :=
- First_Valid_Interpretation;
-
- -- List of non-local hidden declarations.
- type Hide_Index is new Nat32;
- No_Hide_Index : constant Hide_Index := 0;
-
- package Hidden_Decls is new Tables
- (Table_Component_Type => Name_Interpretation_Type,
- Table_Index_Type => Hide_Index,
- Table_Low_Bound => No_Hide_Index + 1,
- Table_Initial => 32);
-
- -- First non-local hidden declarations. In VHDL, it is possible to hide
- -- an overloaded declaration (by declaring a subprogram with the same
- -- profile). If the overloaded declaration is local, the interpretation
- -- can simply be modified. But if it is not local, the interpretation is
- -- removed from the chain and saved in the Hidden_Decls table.
- First_Hide_Index : Hide_Index := No_Hide_Index;
-
- -- To manage the list of interpretation and to add informations to this
- -- list, a stack is used.
- -- Elements of stack can be of kind:
- -- Save_Cell:
- -- the element contains the interpretation INTER for the indentifier ID
- -- for the outer declarative region.
- -- A save cell is always created each time a declaration is added to save
- -- the previous interpretation.
- -- Region_Start:
- -- A new declarative region start at interpretation INTER. Here, INTER
- -- is used as an index in the interpretations stack (table).
- -- ID is used as an index into the unidim_array stack.
- -- Barrier_start, Barrier_end:
- -- All currents interpretations are saved between both INTER, and
- -- are cleared. This is used to call semantic during another semantic.
-
- type Scope_Cell_Kind_Type is (Scope_Start, Scope_Region);
-
- type Scope_Cell is record
- Kind: Scope_Cell_Kind_Type;
-
- -- Values for the previous scope.
- Saved_Last_In_Region : Name_Id;
- Saved_Region_Start : Name_Interpretation_Type;
- Saved_First_Hide_Index : Hide_Index;
- Saved_First_Interpretation : Name_Interpretation_Type;
- end record;
-
- package Scopes is new Tables
- (Table_Component_Type => Scope_Cell,
- Table_Index_Type => Natural,
- Table_Low_Bound => 1,
- Table_Initial => 64);
-
- function Valid_Interpretation (Inter : Name_Interpretation_Type)
- return Boolean is
- begin
- return Inter >= First_Interpretation;
- end Valid_Interpretation;
-
- -- Return True iff NI means there is a conflict for the identifier: no
- -- valid interpretation due to potentially visible homoraph.
- function Is_Conflict_Declaration (Ni : Name_Interpretation_Type)
- return Boolean is
- begin
- pragma Assert (Valid_Interpretation (Ni));
- return Interpretations.Table (Ni).Decl = Null_Iir;
- end Is_Conflict_Declaration;
-
- -- Get the current interpretation for ID. The result is raw: it may not
- -- be valid.
- function Get_Interpretation_Raw (Id : Name_Id)
- return Name_Interpretation_Type is
- begin
- return Name_Interpretation_Type (Name_Table.Get_Name_Info (Id));
- end Get_Interpretation_Raw;
-
- procedure Set_Interpretation
- (Id : Name_Id; Inter : Name_Interpretation_Type) is
- begin
- Name_Table.Set_Name_Info (Id, Int32 (Inter));
- end Set_Interpretation;
-
- function Get_Interpretation_From_Raw (Inter : Name_Interpretation_Type)
- return Name_Interpretation_Type is
- begin
- if Valid_Interpretation (Inter)
- and then not Is_Conflict_Declaration (Inter)
- then
- -- In the current scopes set and not a conflict.
- return Inter;
- else
- return No_Name_Interpretation;
- end if;
- end Get_Interpretation_From_Raw;
-
- function Get_Interpretation (Id : Name_Id)
- return Name_Interpretation_Type is
- begin
- return Get_Interpretation_From_Raw (Get_Interpretation_Raw (Id));
- end Get_Interpretation;
-
- procedure Check_Interpretations;
- pragma Unreferenced (Check_Interpretations);
-
- procedure Check_Interpretations
- is
- Inter: Name_Interpretation_Type;
- Last : constant Name_Interpretation_Type := Interpretations.Last;
- Err : Boolean;
- begin
- Err := False;
- for I in 0 .. Name_Table.Last_Name_Id loop
- Inter := Get_Interpretation (I);
- if Inter > Last then
- Log_Line ("bad interpretation for " & Name_Table.Image (I));
- Err := True;
- end if;
- end loop;
- if Err then
- raise Internal_Error;
- end if;
- end Check_Interpretations;
-
- procedure Push_Interpretations is
- begin
- Scopes.Append ((Kind => Scope_Start,
- Saved_Last_In_Region => Last_In_Region,
- Saved_Region_Start => Current_Region_Start,
- Saved_First_Hide_Index => First_Hide_Index,
- Saved_First_Interpretation => First_Interpretation));
- Last_In_Region := Null_Identifier;
- Current_Region_Start := Interpretations.Last + 1;
- First_Hide_Index := Hidden_Decls.Last + 1;
- First_Interpretation := Interpretations.Last + 1;
- end Push_Interpretations;
-
- procedure Pop_Interpretations
- is
- Cell : Scope_Cell renames Scopes.Table (Scopes.Last);
- begin
- pragma Assert (Scopes.Table (Scopes.Last).Kind = Scope_Start);
-
- -- All the declarative regions must have been removed.
- pragma Assert (Last_In_Region = Null_Identifier);
- pragma Assert (Current_Region_Start = Interpretations.Last + 1);
- pragma Assert (First_Hide_Index = Hidden_Decls.Last + 1);
- pragma Assert (First_Interpretation = Interpretations.Last + 1);
-
- Last_In_Region := Cell.Saved_Last_In_Region;
- Current_Region_Start := Cell.Saved_Region_Start;
- First_Hide_Index := Cell.Saved_First_Hide_Index;
- First_Interpretation := Cell.Saved_First_Interpretation;
-
- Scopes.Decrement_Last;
- end Pop_Interpretations;
-
- -- Create a new declarative region.
- -- Simply push a region_start cell and update current_scope_start.
- procedure Open_Declarative_Region is
- begin
- Scopes.Append ((Kind => Scope_Region,
- Saved_Last_In_Region => Last_In_Region,
- Saved_Region_Start => Current_Region_Start,
- Saved_First_Hide_Index => First_Hide_Index,
- Saved_First_Interpretation => No_Name_Interpretation));
- Last_In_Region := Null_Identifier;
- Current_Region_Start := Interpretations.Last + 1;
- First_Hide_Index := Hidden_Decls.Last + 1;
- end Open_Declarative_Region;
-
- -- Close a declarative region.
- -- Update interpretation of identifiers.
- procedure Close_Declarative_Region
- is
- Cell : Scope_Cell renames Scopes.Table (Scopes.Last);
- Id : Name_Id;
- begin
- pragma Assert (Cell.Kind = Scope_Region);
-
- -- Restore hidden declarations.
- for I in reverse First_Hide_Index .. Hidden_Decls.Last loop
- declare
- Inter : constant Name_Interpretation_Type :=
- Hidden_Decls.Table (I);
- Prev_Inter, Next_Inter : Name_Interpretation_Type;
- begin
- Prev_Inter := Interpretations.Table (Inter).Prev;
- Next_Inter := Interpretations.Table (Prev_Inter).Prev;
- Interpretations.Table (Inter).Prev := Next_Inter;
- Interpretations.Table (Prev_Inter).Prev := Inter;
- end;
- end loop;
- Hidden_Decls.Set_Last (First_Hide_Index - 1);
-
- -- Remove interpretations of that region.
- Id := Last_In_Region;
- if Id /= Null_Identifier then
- declare
- Inter : Name_Interpretation_Type;
- begin
- loop
- Inter := Get_Interpretation_Raw (Id);
- pragma Assert (Inter >= Current_Region_Start);
- Set_Interpretation (Id, Interpretations.Table (Inter).Prev);
- Id := Interpretations.Table (Inter).Prev_In_Region;
- exit when Id = Null_Identifier;
- end loop;
- pragma Assert (Inter = Current_Region_Start);
- end;
- Interpretations.Set_Last (Current_Region_Start - 1);
- end if;
-
- Last_In_Region := Cell.Saved_Last_In_Region;
- Current_Region_Start := Cell.Saved_Region_Start;
- First_Hide_Index := Cell.Saved_First_Hide_Index;
-
- Scopes.Decrement_Last;
- end Close_Declarative_Region;
-
- procedure Open_Scope_Extension renames Open_Declarative_Region;
- procedure Close_Scope_Extension renames Close_Declarative_Region;
-
- function Get_Next_Interpretation (Ni : Name_Interpretation_Type)
- return Name_Interpretation_Type
- is
- pragma Assert (Valid_Interpretation (Ni));
- Cell : Interpretation_Cell renames Interpretations.Table (Ni);
- begin
- if Cell.Prev_Hidden
- or else not Valid_Interpretation (Cell.Prev)
- then
- return No_Name_Interpretation;
- else
- return Cell.Prev;
- end if;
- end Get_Next_Interpretation;
-
- function Get_Declaration (Ni : Name_Interpretation_Type) return Iir is
- begin
- pragma Assert (Valid_Interpretation (Ni));
- return Interpretations.Table (Ni).Decl;
- end Get_Declaration;
-
- function Get_Under_Interpretation (Id : Name_Id)
- return Name_Interpretation_Type
- is
- Inter : constant Name_Interpretation_Type := Get_Interpretation (Id);
- begin
- -- ID has no interpretation.
- -- So, there is no 'under' interpretation (FIXME: prove it).
- pragma Assert (Valid_Interpretation (Inter));
-
- declare
- Cell : Interpretation_Cell renames Interpretations.Table (Inter);
- Prev : constant Name_Interpretation_Type := Cell.Prev;
- begin
- -- Get_Under_Interpretation can be used only to get a hidden
- -- interpretation.
- pragma Assert (Cell.Prev_Hidden);
-
- if Valid_Interpretation (Prev)
- -- Not a conflict one (use clauses).
- and then Get_Declaration (Prev) /= Null_Iir
- then
- return Prev;
- else
- return No_Name_Interpretation;
- end if;
- end;
- end Get_Under_Interpretation;
-
- function Strip_Non_Object_Alias (Decl : Iir) return Iir
- is
- Res : Iir;
- begin
- Res := Decl;
- if Get_Kind (Res) = Iir_Kind_Non_Object_Alias_Declaration then
- Res := Get_Named_Entity (Get_Name (Res));
- end if;
- return Res;
- end Strip_Non_Object_Alias;
-
- function Get_Non_Alias_Declaration (Ni : Name_Interpretation_Type)
- return Iir is
- begin
- return Strip_Non_Object_Alias (Get_Declaration (Ni));
- end Get_Non_Alias_Declaration;
-
- -- Return TRUE if INTER was made directly visible via a use clause.
- function Is_Potentially_Visible (Inter : Name_Interpretation_Type)
- return Boolean is
- begin
- return Interpretations.Table (Inter).Is_Potential;
- end Is_Potentially_Visible;
-
- -- Return TRUE iif DECL can be overloaded.
- function Is_Overloadable (Decl : Iir) return Boolean is
- begin
- -- LRM93 10.3:
- -- The overloaded declarations considered in this chapter are those for
- -- subprograms and enumeration literals.
- case Get_Kind (Decl) is
- when Iir_Kind_Enumeration_Literal
- | Iir_Kind_Function_Declaration
- | Iir_Kind_Procedure_Declaration
- | Iir_Kind_Interface_Function_Declaration
- | Iir_Kind_Interface_Procedure_Declaration =>
- return True;
- when Iir_Kind_Non_Object_Alias_Declaration =>
- case Get_Kind (Get_Named_Entity (Get_Name (Decl))) is
- when Iir_Kind_Enumeration_Literal
- | Iir_Kind_Function_Declaration
- | Iir_Kind_Procedure_Declaration
- | Iir_Kind_Interface_Function_Declaration
- | Iir_Kind_Interface_Procedure_Declaration =>
- return True;
- when Iir_Kind_Non_Object_Alias_Declaration =>
- raise Internal_Error;
- when others =>
- return False;
- end case;
- when others =>
- return False;
- end case;
- end Is_Overloadable;
-
- -- Return TRUE if INTER was made direclty visible in the current
- -- declarative region.
- function Is_In_Current_Declarative_Region (Inter : Name_Interpretation_Type)
- return Boolean is
- begin
- return Inter >= Current_Region_Start;
- end Is_In_Current_Declarative_Region;
-
- -- Emit a warning when DECL hides PREV_DECL.
- procedure Warning_Hide (Decl : Iir; Prev_Decl : Iir)
- is
- begin
- if Get_Kind (Decl) in Iir_Kinds_Interface_Declaration
- and then Get_Kind (Get_Parent (Decl)) = Iir_Kind_Component_Declaration
- then
- -- Do not warn when an interface in a component hides a declaration.
- -- This is a common case (eg: in testbenches), and there is no real
- -- hiding.
- return;
- end if;
-
- if Get_Kind (Decl) = Iir_Kind_Element_Declaration then
- -- Do not warn for record elements. They are used by selection.
- return;
- end if;
-
- if Decl = Prev_Decl then
- -- Can happen in configuration. No real hidding.
- return;
- end if;
-
- Warning_Msg_Sem (Warnid_Hide, +Decl,
- "declaration of %i hides %n", (+Decl, +Prev_Decl));
- end Warning_Hide;
-
- -- Add interpretation DECL to the identifier of DECL.
- -- POTENTIALLY is true if the identifier comes from a use clause.
- procedure Add_Name (Decl : Iir; Ident : Name_Id; Potentially : Boolean)
- is
- -- Current interpretation of ID. This is the one before DECL is
- -- added (if so).
- Raw_Inter : constant Name_Interpretation_Type :=
- Get_Interpretation_Raw (Ident);
- Current_Inter : constant Name_Interpretation_Type :=
- Get_Interpretation_From_Raw (Raw_Inter);
- Current_Decl : Iir;
-
- -- Add DECL in the chain of interpretation for the identifier.
- procedure Add_New_Interpretation (Hid_Prev : Boolean; D : Iir := Decl) is
- begin
- Interpretations.Append ((Decl => D,
- Prev => Raw_Inter,
- Is_Potential => Potentially,
- Prev_Hidden => Hid_Prev,
- Prev_In_Region => Last_In_Region));
- Set_Interpretation (Ident, Interpretations.Last);
- Last_In_Region := Ident;
- end Add_New_Interpretation;
- begin
- if Ident = Null_Identifier then
- -- Missing identifier can happen only in case of parse error.
- pragma Assert (Flags.Flag_Force_Analysis);
- return;
- end if;
-
- if not Valid_Interpretation (Raw_Inter) then
- -- Very simple: no hidding, no overloading.
- Add_New_Interpretation (True);
- return;
- end if;
-
- if Is_Conflict_Declaration (Raw_Inter) then
- if Potentially then
- -- Yet another conflicting interpretation.
- return;
- else
- -- Very simple: no hidding, no overloading.
- -- (current interpretation is Conflict_Interpretation if there is
- -- only potentially visible declarations that are not made
- -- directly visible).
- -- Note: in case of conflict interpretation, it may be unnecessary
- -- to keep the current interpretation (but it is simpler as is).
- Add_New_Interpretation (True);
- return;
- end if;
- end if;
-
- if Potentially then
- -- Do not re-add a potential decl. This handles cases like:
- -- 'use p.all; use p.all;'.
- -- FIXME: add a flag (or reuse Visible_Flag) to avoid walking all
- -- the interpretations.
- declare
- Inter : Name_Interpretation_Type := Current_Inter;
- begin
- while Valid_Interpretation (Inter) loop
- if Get_Declaration (Inter) = Decl then
- return;
- end if;
- Inter := Get_Next_Interpretation (Inter);
- end loop;
- end;
- end if;
-
- -- LRM 10.3 Visibility
- -- Each of two declarations is said to be a homograph of the other if
- -- both declarations have the same identifier, operator symbol, or
- -- character literal, and overloading is allowed for at most one
- -- of the two.
- --
- -- GHDL: the condition 'overloading is allowed for at most one of the
- -- two' is false iff overloading is allowed for both; this is a nand.
-
- -- Note: at this stage, current_inter is valid.
- Current_Decl := Get_Declaration (Current_Inter);
-
- if Is_Overloadable (Current_Decl) and then Is_Overloadable (Decl) then
- -- Current_Inter and Decl overloads (well, they have the same
- -- designator).
-
- -- LRM 10.3 Visibility
- -- If overloading is allowed for both declarations, then each of the
- -- two is a homograph of the other if they have the same identifier,
- -- operator symbol or character literal, as well as the same
- -- parameter and result profile.
-
- declare
- Homograph : Name_Interpretation_Type;
- Prev_Homograph : Name_Interpretation_Type;
-
- -- Hide HOMOGRAPH (ie unlink it from the chain of interpretation).
- procedure Hide_Homograph
- is
- S : Name_Interpretation_Type;
- begin
- if Prev_Homograph = No_Name_Interpretation then
- Prev_Homograph := Interpretations.Last;
- end if;
-
- -- PREV_HOMOGRAPH must be the interpretation just before
- -- HOMOGRAPH.
- pragma Assert
- (Interpretations.Table (Prev_Homograph).Prev = Homograph);
-
- -- Hide previous interpretation.
- Hidden_Decls.Append (Homograph);
-
- S := Interpretations.Table (Homograph).Prev;
- Interpretations.Table (Homograph).Prev := Prev_Homograph;
- Interpretations.Table (Prev_Homograph).Prev := S;
- end Hide_Homograph;
-
- function Get_Hash_Non_Alias (D : Iir) return Iir_Int32 is
- begin
- return Get_Subprogram_Hash (Strip_Non_Object_Alias (D));
- end Get_Hash_Non_Alias;
-
- -- Return True iff D is an implicit declaration (either a
- -- subprogram or an implicit alias).
- function Is_Implicit_Declaration (D : Iir) return Boolean is
- begin
- case Get_Kind (D) is
- when Iir_Kind_Non_Object_Alias_Declaration =>
- return Get_Implicit_Alias_Flag (D);
- when Iir_Kind_Enumeration_Literal =>
- return False;
- when Iir_Kind_Procedure_Declaration
- | Iir_Kind_Function_Declaration =>
- return Is_Implicit_Subprogram (D);
- when others =>
- Error_Kind ("is_implicit_declaration", D);
- end case;
- end Is_Implicit_Declaration;
-
- -- Return TRUE iff D is an implicit alias of an implicit
- -- subprogram.
- function Is_Implicit_Alias (D : Iir) return Boolean is
- begin
- -- FIXME: Is it possible to have an implicit alias of an
- -- explicit subprogram ? Yes for enumeration literal and
- -- physical units.
- return Get_Kind (D) = Iir_Kind_Non_Object_Alias_Declaration
- and then Get_Implicit_Alias_Flag (D)
- and then Is_Implicit_Subprogram (Get_Named_Entity
- (Get_Name (D)));
- end Is_Implicit_Alias;
-
- -- Replace the homograph of DECL by DECL.
- procedure Replace_Homograph is
- begin
- Interpretations.Table (Homograph).Decl := Decl;
- end Replace_Homograph;
-
- Decl_Hash : Iir_Int32;
- Hash : Iir_Int32;
- begin
- Decl_Hash := Get_Hash_Non_Alias (Decl);
- -- The hash must have been computed.
- pragma Assert (Decl_Hash /= 0);
-
- -- LRM02 10.3 Visibility
- -- Each of two declarations is said to be a /homograph/ of the
- -- other if both declarations have the same identifier, operator
- -- symbol, or character literal, and if overloading is allowed for
- -- at most one of the two.
- --
- -- LRM08 12.3 Visibility
- -- Each of two declarations is said to be a /homograph/ of the
- -- other if and only if both declarations have the same
- -- designator, and they denote different named entities, and
- -- either overloading is allows for at most one of the two, or
- -- overloading is allowed for both declarations and they have the
- -- same parameter and result type profile.
-
- -- GHDL: here we are in the case when both declarations are
- -- overloadable. Also, always follow the LRM08 rules as they fix
- -- issues.
- -- GHDL: Special case for a second declaration with the same
- -- designator and that denotes the same named entity than a
- -- previous one (that would be an alias): according to the LRM,
- -- they are both visible and there are no ambiguity as they
- -- denotes the same named entity. In GHDL, the new one hides the
- -- previous one. The behaviour should be the same.
-
- -- Find an homograph of this declaration (and also keep the
- -- interpretation just before it in the chain).
- Homograph := Current_Inter;
- Prev_Homograph := No_Name_Interpretation;
- while Homograph /= No_Name_Interpretation loop
- Current_Decl := Get_Declaration (Homograph);
- Hash := Get_Hash_Non_Alias (Current_Decl);
- exit when Decl_Hash = Hash
- and then Is_Same_Profile (Decl, Current_Decl);
- Prev_Homograph := Homograph;
- Homograph := Get_Next_Interpretation (Homograph);
- end loop;
-
- if Homograph = No_Name_Interpretation then
- -- Simple case: no homograph.
- Add_New_Interpretation (False);
- return;
- end if;
-
- -- There is an homograph (or the named entity is the same).
- if Potentially then
- -- Added DECL would be made potentially visible.
-
- -- LRM93 10.4 1) / LRM08 12.4 a) Use Clauses
- -- 1. A potentially visible declaration is not made
- -- directly visible if the place considered is within the
- -- immediate scope of a homograph of the declaration.
- if not Is_Potentially_Visible (Homograph) then
- return;
- end if;
-
- -- LRM08 12.4 Use Clauses
- -- b) If two potentially visible declarations are homograph
- -- and one is explicitly declared and the other is
- -- implicitly declared, then the implicit declaration is
- -- not made directly visible.
- if (Flags.Flag_Explicit or else Flags.Vhdl_Std >= Vhdl_08)
- and then Is_Potentially_Visible (Homograph)
- then
- declare
- Implicit_Current_Decl : constant Boolean :=
- Is_Implicit_Declaration (Current_Decl);
- Implicit_Decl : constant Boolean :=
- Is_Implicit_Declaration (Decl);
- begin
- if Implicit_Current_Decl and then not Implicit_Decl then
- if Is_In_Current_Declarative_Region (Homograph) then
- Replace_Homograph;
- else
- -- Insert DECL and hide homograph.
- Add_New_Interpretation (False);
- Hide_Homograph;
- end if;
- return;
- elsif not Implicit_Current_Decl and then Implicit_Decl
- then
- -- Discard decl.
- return;
- elsif Strip_Non_Object_Alias (Decl)
- = Strip_Non_Object_Alias (Current_Decl)
- then
- -- This rule is not written clearly in the LRM, but
- -- if two designators denote the same named entity,
- -- no need to make both visible.
- return;
- end if;
- end;
- end if;
-
- -- GHDL: if the homograph is in the same declarative
- -- region than DECL, it must be an implicit declaration
- -- to be hidden.
- -- FIXME: this rule is not in the LRM93, but it is necessary
- -- so that explicit declaration hides the implicit one.
- if Flags.Vhdl_Std < Vhdl_08
- and then not Flags.Flag_Explicit
- and then Get_Parent (Decl) = Get_Parent (Current_Decl)
- then
- declare
- Implicit_Current_Decl : constant Boolean :=
- Is_Implicit_Subprogram (Current_Decl);
- Implicit_Decl : constant Boolean :=
- Is_Implicit_Subprogram (Decl);
- begin
- if Implicit_Current_Decl and not Implicit_Decl then
- -- Note: no need to save previous interpretation, as
- -- it is in the same declarative region.
- -- Replace the previous homograph with DECL.
- Replace_Homograph;
- return;
- elsif not Implicit_Current_Decl and Implicit_Decl then
- -- As we have replaced the homograph, it is possible
- -- than the implicit declaration is re-added (by
- -- a new use clause). Discard it.
- return;
- end if;
- end;
- end if;
-
- -- The homograph was made visible in an outer declarative
- -- region. Therefore, it must not be hidden.
- Add_New_Interpretation (False);
-
- return;
- else
- -- Added DECL would be made directly visible.
-
- if not Is_Potentially_Visible (Homograph) then
- -- The homograph was also declared in that declarative
- -- region or in an inner one.
- if Is_In_Current_Declarative_Region (Homograph) then
- -- ... and was declared in the same region
-
- -- To sum up: at this point both DECL and CURRENT_DECL
- -- are overloadable, have the same profile (but may be
- -- aliases) and are declared in the same declarative
- -- region.
-
- -- LRM08 12.3 Visibility
- -- LRM93 10.3 Visibility
- -- Two declarations that occur immediately within
- -- the same declarative regions [...] shall not be
- -- homograph, unless exactely one of them is the
- -- implicit declaration of a predefined operation,
-
- -- LRM08 12.3 Visibility
- -- or is an implicit alias of such implicit declaration.
- --
- -- GHDL: FIXME: 'implicit alias'
-
- -- LRM08 12.3 Visibility
- -- LRM93 10.3 Visibility
- -- Each of two declarations is said to be a
- -- homograph of the other if and only if both
- -- declarations have the same designator, [...]
- --
- -- LRM08 12.3 Visibility
- -- [...] and they denote different named entities,
- -- and [...]
- declare
- Is_Decl_Implicit : Boolean;
- Is_Current_Decl_Implicit : Boolean;
- begin
- if Flags.Vhdl_Std >= Vhdl_08 then
- Is_Current_Decl_Implicit :=
- Is_Implicit_Subprogram (Current_Decl)
- or else Is_Implicit_Alias (Current_Decl);
- Is_Decl_Implicit := Is_Implicit_Subprogram (Decl)
- or else Is_Implicit_Alias (Decl);
-
- -- If they denote the same entity, they aren't
- -- homograph.
- if Strip_Non_Object_Alias (Decl)
- = Strip_Non_Object_Alias (Current_Decl)
- then
- if Is_Current_Decl_Implicit
- and then not Is_Decl_Implicit
- then
- -- They aren't homograph but DECL is stronger
- -- (at it is not an implicit declaration)
- -- than CURRENT_DECL
- Replace_Homograph;
- end if;
-
- return;
- end if;
-
- if Is_Decl_Implicit
- and then not Is_Current_Decl_Implicit
- then
- -- Re-declaration of an implicit subprogram via
- -- an implicit alias is simply discarded.
- return;
- end if;
- else
- -- Can an implicit subprogram declaration appears
- -- after an explicit one in vhdl 93? I don't
- -- think so.
- Is_Decl_Implicit := Is_Implicit_Subprogram (Decl);
- Is_Current_Decl_Implicit :=
- Is_Implicit_Subprogram (Current_Decl);
- end if;
-
- if not (Is_Decl_Implicit xor Is_Current_Decl_Implicit)
- then
- Error_Msg_Sem
- (+Decl, "redeclaration of %n defined at %l",
- (+Current_Decl, +Current_Decl));
- return;
- end if;
-
- if not Is_Decl_Implicit and Is_Current_Decl_Implicit
- then
- -- DECL 'overrides' the predefined current
- -- declaration.
-
- -- LRM93 10.3 Visibility
- -- In such cases, a predefined operation is always
- -- hidden by the other homograph. Where hidden in
- -- this manner, an implicit declaration is hidden
- -- within the entire scope of the other declaration
- -- (regardless of which declaration occurs first);
- -- the implicit declaration is visible neither by
- -- selection nor directly.
- Set_Visible_Flag (Current_Decl, False);
- if Get_Kind (Decl)
- in Iir_Kinds_Subprogram_Declaration
- then
- Set_Hide_Implicit_Flag (Decl, True);
- end if;
- end if;
- end;
- else
- -- GHDL: hide directly visible declaration declared in
- -- an outer region.
- null;
- end if;
- else
- -- LRM 10.4 Use Clauses
- -- 1. A potentially visible declaration is not made
- -- directly visible if the place considered is within the
- -- immediate scope of a homograph of the declaration.
-
- -- GHDL: hide the potentially visible declaration.
- null;
- end if;
- Add_New_Interpretation (False);
-
- Hide_Homograph;
- return;
- end if;
- end;
- end if;
-
- -- The current interpretation and the new one aren't overloadable, ie
- -- they are homograph (well almost).
-
- if Is_Potentially_Visible (Current_Inter) then
- if Potentially then
- -- LRM93 10.4 2) / LRM08 12.4 c) Use clauses
- -- Potentially visible declarations that have the same
- -- designator are not made directly visible unless each of
- -- them is either an enumeration literal specification or
- -- the declaration of a subprogram.
- if Decl = Get_Declaration (Current_Inter) then
- -- The rule applies only for distinct declaration.
- -- This handles 'use p.all; use P.all;'.
- -- FIXME: this should have been handled at the start of
- -- this subprogram.
- raise Internal_Error;
- return;
- end if;
-
- -- LRM08 12.3 Visibility
- -- Each of two declarations is said to be a homograph of the
- -- other if and only if both declarations have the same
- -- designator; and they denote different named entities, [...]
- if Flags.Vhdl_Std >= Vhdl_08 then
- if Strip_Non_Object_Alias (Decl)
- = Strip_Non_Object_Alias (Current_Decl)
- then
- return;
- end if;
- end if;
-
- -- Conflict.
- Add_New_Interpretation (True, Null_Iir);
- return;
- else
- -- LRM93 10.4 item #1
- -- A potentially visible declaration is not made directly
- -- visible if the place considered is within the immediate
- -- scope of a homograph of the declaration.
- -- GHDL: Could directly replace the previous interpretation
- -- (added in same scope), but don't do that for entity
- -- declarations, since it is used to find default binding.
- Add_New_Interpretation (True);
- return;
- end if;
- else
- -- There is already a declaration in the current scope.
- if Potentially then
- -- LRM93 §10.4 item #1
- -- Discard the new and potentially visible declaration.
- -- However, add the type.
- -- FIXME: Add_In_Visible_List (Ident, Decl);
- return;
- else
- if Is_In_Current_Declarative_Region (Current_Inter) then
- -- They are perhaps visible in the same declarative region.
-
- -- LRM93 11.2
- -- If two or more logical names having the same
- -- identifier appear in library clauses in the same
- -- context, the second and subsequent occurences of the
- -- logical name have no effect. The same is true of
- -- logical names appearing both in the context clause
- -- of a primary unit and in the context clause of a
- -- corresponding secondary unit.
- -- GHDL: we apply this rule with VHDL-87, because of implicits
- -- library clauses STD and WORK.
- if Get_Kind (Decl) = Iir_Kind_Library_Declaration
- and then
- Get_Kind (Current_Decl) = Iir_Kind_Library_Declaration
- then
- return;
- end if;
-
- -- None of the two declarations are potentially visible, ie
- -- both are visible.
- -- LRM §10.3:
- -- Two declarations that occur immediately within the same
- -- declarative region must not be homographs,
- -- FIXME: unless one of them is the implicit declaration of a
- -- predefined operation.
- Error_Msg_Sem
- (+Decl, "identifier %i already used for a declaration",
- (1 => +Ident), Cont => True);
- Error_Msg_Sem
- (+Current_Decl, "previous declaration: %n", +Current_Decl);
- return;
- else
- -- Homograph, not in the same scope.
- -- LRM §10.3:
- -- A declaration is said to be hidden within (part of) an inner
- -- declarative region if the inner region contains an homograph
- -- of this declaration; the outer declaration is the hidden
- -- within the immediate scope of the inner homograph.
- if Is_Warning_Enabled (Warnid_Hide)
- and then not Is_Potentially_Visible (Current_Inter)
- then
- Warning_Hide (Decl, Current_Decl);
- end if;
-
- Add_New_Interpretation (True);
- return;
- end if;
- end if;
- end if;
- end Add_Name;
-
- procedure Add_Name (Decl: Iir) is
- begin
- Add_Name (Decl, Get_Identifier (Decl), False);
- end Add_Name;
-
- procedure Replace_Name (Id: Name_Id; Old : Iir; Decl: Iir)
- is
- Inter : Name_Interpretation_Type;
- begin
- Inter := Get_Interpretation (Id);
- loop
- exit when Get_Declaration (Inter) = Old;
- Inter := Get_Next_Interpretation (Inter);
- pragma Assert (Valid_Interpretation (Inter));
- end loop;
- Interpretations.Table (Inter).Decl := Decl;
- pragma Assert (Get_Next_Interpretation (Inter) = No_Name_Interpretation);
- end Replace_Name;
-
- procedure Name_Visible (Decl : Iir) is
- begin
- -- A name can be made visible only once.
- pragma Assert (not Get_Visible_Flag (Decl));
- Set_Visible_Flag (Decl, True);
- end Name_Visible;
-
- procedure Iterator_Decl (Decl : Iir; Arg : Arg_Type)
- is
- begin
- case Get_Kind (Decl) is
- when Iir_Kind_Subtype_Declaration
- | Iir_Kind_Enumeration_Literal -- By use clause
- | Iir_Kind_Constant_Declaration
- | Iir_Kind_Signal_Declaration
- | Iir_Kind_Variable_Declaration
- | Iir_Kind_File_Declaration
- | Iir_Kind_Object_Alias_Declaration
- | Iir_Kind_Non_Object_Alias_Declaration
- | Iir_Kinds_Interface_Object_Declaration
- | Iir_Kind_Interface_Package_Declaration
- | Iir_Kinds_Interface_Subprogram_Declaration
- | Iir_Kind_Component_Declaration
- | Iir_Kind_Attribute_Declaration
- | Iir_Kind_Group_Template_Declaration
- | Iir_Kind_Group_Declaration
- | Iir_Kind_Nature_Declaration
- | Iir_Kind_Free_Quantity_Declaration
- | Iir_Kind_Through_Quantity_Declaration
- | Iir_Kind_Across_Quantity_Declaration
- | Iir_Kind_Terminal_Declaration
- | Iir_Kind_Entity_Declaration
- | Iir_Kind_Package_Declaration
- | Iir_Kind_Package_Instantiation_Declaration
- | Iir_Kind_Configuration_Declaration
- | Iir_Kind_Context_Declaration
- | Iir_Kinds_Concurrent_Statement
- | Iir_Kinds_Sequential_Statement =>
- Handle_Decl (Decl, Arg);
- when Iir_Kind_Procedure_Declaration
- | Iir_Kind_Function_Declaration =>
- if not Is_Second_Subprogram_Specification (Decl) then
- Handle_Decl (Decl, Arg);
- end if;
- when Iir_Kind_Type_Declaration =>
- declare
- Def : constant Iir := Get_Type_Definition (Decl);
- List : Iir_Flist;
- El : Iir;
- begin
- -- Handle incomplete type declaration.
- if Get_Kind (Def) = Iir_Kind_Incomplete_Type_Definition then
- return;
- end if;
-
- Handle_Decl (Decl, Arg);
-
- if Get_Kind (Def) = Iir_Kind_Enumeration_Type_Definition then
- List := Get_Enumeration_Literal_List (Def);
- for I in Flist_First .. Flist_Last (List) loop
- El := Get_Nth_Element (List, I);
- Handle_Decl (El, Arg);
- end loop;
- end if;
- end;
- when Iir_Kind_Anonymous_Type_Declaration =>
- Handle_Decl (Decl, Arg);
-
- declare
- Def : constant Iir := Get_Type_Definition (Decl);
- El : Iir;
- begin
- if Get_Kind (Def) = Iir_Kind_Physical_Type_Definition then
- El := Get_Unit_Chain (Def);
- while El /= Null_Iir loop
- Handle_Decl (El, Arg);
- El := Get_Chain (El);
- end loop;
- end if;
- end;
- when Iir_Kind_Interface_Type_Declaration =>
- Handle_Decl (Decl, Arg);
- declare
- El : Iir;
- begin
- El := Get_Interface_Type_Subprograms (Decl);
- while El /= Null_Iir loop
- Handle_Decl (El, Arg);
- El := Get_Chain (El);
- end loop;
- end;
- when Iir_Kind_Use_Clause
- | Iir_Kind_Context_Reference =>
- Handle_Decl (Decl, Arg);
- when Iir_Kind_Library_Clause =>
- Handle_Decl (Decl, Arg);
--- El := Get_Library_Declaration (Decl);
--- if El /= Null_Iir then
--- -- May be empty.
--- Handle_Decl (El, Arg);
--- end if;
-
- when Iir_Kind_Procedure_Body
- | Iir_Kind_Function_Body =>
- null;
-
- when Iir_Kind_Package_Body =>
- null;
-
- when Iir_Kind_Attribute_Specification
- | Iir_Kind_Configuration_Specification
- | Iir_Kind_Disconnection_Specification =>
- null;
- when Iir_Kinds_Signal_Attribute
- | Iir_Kind_Signal_Attribute_Declaration =>
- null;
-
- when Iir_Kind_Protected_Type_Body =>
- -- FIXME: allowed only in debugger (if the current scope is
- -- within a package body) ?
- null;
-
- when others =>
- Error_Kind ("iterator_decl", Decl);
- end case;
- end Iterator_Decl;
-
- -- Handle context_clause of context reference CTXT.
- procedure Add_One_Context_Reference (Ctxt : Iir)
- is
- Name : constant Iir := Get_Selected_Name (Ctxt);
- Ent : constant Iir := Get_Named_Entity (Name);
- Item : Iir;
- begin
- if Ent = Null_Iir or else Is_Error (Ent) then
- -- Stop now in case of error.
- return;
- end if;
- pragma Assert (Get_Kind (Ent) = Iir_Kind_Context_Declaration);
-
- Item := Get_Context_Items (Ent);
- while Item /= Null_Iir loop
- case Get_Kind (Item) is
- when Iir_Kind_Use_Clause =>
- Add_Use_Clause (Item);
- when Iir_Kind_Library_Clause =>
- Add_Name (Get_Library_Declaration (Item),
- Get_Identifier (Item), False);
- when Iir_Kind_Context_Reference =>
- Add_Context_Reference (Item);
- when others =>
- Error_Kind ("add_context_reference", Item);
- end case;
- Item := Get_Chain (Item);
- end loop;
- end Add_One_Context_Reference;
-
- procedure Add_Context_Reference (Ref : Iir)
- is
- Ctxt : Iir;
- begin
- Ctxt := Ref;
- loop
- Add_One_Context_Reference (Ctxt);
- Ctxt := Get_Context_Reference_Chain (Ctxt);
- exit when Ctxt = Null_Iir;
- end loop;
- end Add_Context_Reference;
-
- -- Make POTENTIALLY (or not) visible DECL.
- procedure Add_Name_Decl (Decl : Iir; Potentially : Boolean) is
- begin
- case Get_Kind (Decl) is
- when Iir_Kind_Use_Clause =>
- if not Potentially then
- Add_Use_Clause (Decl);
- end if;
- when Iir_Kind_Context_Reference =>
- pragma Assert (not Potentially);
- Add_Context_Reference (Decl);
- when Iir_Kind_Library_Clause =>
- Add_Name (Get_Library_Declaration (Decl),
- Get_Identifier (Decl), Potentially);
- when Iir_Kind_Anonymous_Type_Declaration =>
- null;
- when others =>
- Add_Name (Decl, Get_Identifier (Decl), Potentially);
- end case;
- end Add_Name_Decl;
-
- procedure Add_Declaration is
- new Iterator_Decl (Arg_Type => Boolean, Handle_Decl => Add_Name_Decl);
-
- procedure Iterator_Decl_List (Decl_List : Iir_List; Arg : Arg_Type)
- is
- Decl : Iir;
- It : List_Iterator;
- begin
- if Decl_List = Null_Iir_List then
- return;
- end if;
- It := List_Iterate (Decl_List);
- while Is_Valid (It) loop
- Decl := Get_Element (It);
- Handle_Decl (Decl, Arg);
- Next (It);
- end loop;
- end Iterator_Decl_List;
-
- procedure Iterator_Decl_Chain (Chain_First : Iir; Arg : Arg_Type)
- is
- Decl: Iir;
- begin
- Decl := Chain_First;
- while Decl /= Null_Iir loop
- Handle_Decl (Decl, Arg);
- Decl := Get_Chain (Decl);
- end loop;
- end Iterator_Decl_Chain;
-
- procedure Add_Declarations_1 is new Iterator_Decl_Chain
- (Arg_Type => Boolean, Handle_Decl => Add_Declaration);
-
- procedure Add_Declarations (Chain : Iir; Potentially : Boolean := False)
- renames Add_Declarations_1;
-
- procedure Add_Declarations_List is new Iterator_Decl_List
- (Arg_Type => Boolean, Handle_Decl => Add_Declaration);
-
- procedure Add_Declarations_From_Interface_Chain (Chain : Iir)
- is
- El : Iir;
- Id : Name_Id;
- begin
- El := Chain;
- while El /= Null_Iir loop
- Id := Get_Identifier (El);
-
- -- The chain may be from an implicitely declared subprograms, with
- -- anonymous identifiers. In that case, all interfaces are
- -- anonymous and there is no need to iterate.
- exit when Id = Null_Identifier;
-
- Add_Name (El, Id, False);
- El := Get_Chain (El);
- end loop;
- end Add_Declarations_From_Interface_Chain;
-
- procedure Add_Declarations_Of_Concurrent_Statement (Parent : Iir)
- is
- El: Iir;
- Label: Name_Id;
- begin
- El := Get_Concurrent_Statement_Chain (Parent);
- while El /= Null_Iir loop
- Label := Get_Label (El);
- if Label /= Null_Identifier then
- Add_Name (El, Get_Identifier (El), False);
- end if;
- El := Get_Chain (El);
- end loop;
- end Add_Declarations_Of_Concurrent_Statement;
-
- procedure Add_Context_Clauses (Unit : Iir_Design_Unit) is
- begin
- Add_Declarations (Get_Context_Items (Unit), False);
- end Add_Context_Clauses;
-
- -- Add declarations from an entity into the current declarative region.
- -- This is needed when an architecture is analysed.
- procedure Add_Entity_Declarations (Entity : Iir_Entity_Declaration)
- is
- begin
- Add_Declarations_From_Interface_Chain (Get_Generic_Chain (Entity));
- Add_Declarations_From_Interface_Chain (Get_Port_Chain (Entity));
- Add_Declarations (Get_Declaration_Chain (Entity), False);
- Add_Declarations_Of_Concurrent_Statement (Entity);
- end Add_Entity_Declarations;
-
- -- Add declarations from a package into the current declarative region.
- -- (for a use clause or when a package body is analyzed)
- procedure Add_Package_Declarations
- (Decl: Iir_Package_Declaration; Potentially : Boolean)
- is
- Header : constant Iir := Get_Package_Header (Decl);
- begin
- -- LRM08 12.1 Declarative region
- -- d) A package declaration together with the corresponding body
- --
- -- GHDL: the formal generic declarations are considered to be in the
- -- same declarative region as the package declarations (and therefore
- -- in the same scope), even if they don't occur immediately within a
- -- package declaration.
- if Header /= Null_Iir then
- Add_Declarations (Get_Generic_Chain (Header), Potentially);
- end if;
-
- Add_Declarations (Get_Declaration_Chain (Decl), Potentially);
- end Add_Package_Declarations;
-
- procedure Add_Package_Instantiation_Declarations
- (Decl: Iir; Potentially : Boolean) is
- begin
- -- LRM08 4.9 Package instantiation declarations
- -- The package instantiation declaration is equivalent to declaration of
- -- a generic-mapped package, consisting of a package declaration [...]
- Add_Declarations (Get_Generic_Chain (Decl), Potentially);
- Add_Declarations (Get_Declaration_Chain (Decl), Potentially);
- end Add_Package_Instantiation_Declarations;
-
- -- Add declarations from a package into the current declarative region.
- -- This is needed when a package body is analysed.
- procedure Add_Package_Declarations (Decl: Iir_Package_Declaration) is
- begin
- Add_Package_Declarations (Decl, False);
- end Add_Package_Declarations;
-
- procedure Add_Component_Declarations (Component: Iir_Component_Declaration)
- is
- begin
- Add_Declarations_From_Interface_Chain (Get_Generic_Chain (Component));
- Add_Declarations_From_Interface_Chain (Get_Port_Chain (Component));
- end Add_Component_Declarations;
-
- procedure Add_Protected_Type_Declarations
- (Decl : Iir_Protected_Type_Declaration) is
- begin
- Add_Declarations (Get_Declaration_Chain (Decl), False);
- end Add_Protected_Type_Declarations;
-
- procedure Extend_Scope_Of_Block_Declarations (Decl : Iir) is
- begin
- case Get_Kind (Decl) is
- when Iir_Kind_Architecture_Body =>
- Add_Context_Clauses (Get_Design_Unit (Decl));
- when Iir_Kind_Block_Statement
- | Iir_Kind_Generate_Statement_Body =>
- -- FIXME: formal, iterator ?
- null;
- when others =>
- Error_Kind ("extend_scope_of_block_declarations", Decl);
- end case;
- Add_Declarations (Get_Declaration_Chain (Decl), False);
- Add_Declarations_Of_Concurrent_Statement (Decl);
- end Extend_Scope_Of_Block_Declarations;
-
- procedure Use_Library_All (Library : Iir_Library_Declaration)
- is
- Design_File : Iir_Design_File;
- Design_Unit : Iir_Design_Unit;
- Library_Unit : Iir;
- begin
- Design_File := Get_Design_File_Chain (Library);
- while Design_File /= Null_Iir loop
- Design_Unit := Get_First_Design_Unit (Design_File);
- while Design_Unit /= Null_Iir loop
- Library_Unit := Get_Library_Unit (Design_Unit);
- if Get_Kind (Library_Unit) /= Iir_Kind_Package_Body then
- Add_Name (Design_Unit, Get_Identifier (Design_Unit), True);
- end if;
- Design_Unit := Get_Chain (Design_Unit);
- end loop;
- Design_File := Get_Chain (Design_File);
- end loop;
- end Use_Library_All;
-
- procedure Potentially_Add_Name (Name : Iir) is
- begin
- Add_Name (Name, Get_Identifier (Name), True);
- end Potentially_Add_Name;
-
- -- LRM08 12.4 Use clauses
- -- Moreover, the following declarations, if any, that occurs immediately
- -- within the package denoted by the prefix of the selected name, are also
- -- identifier:
- procedure Use_Selected_Type_Name (Name : Iir)
- is
- Type_Def : constant Iir := Get_Type (Name);
- Base_Type : constant Iir := Get_Base_Type (Type_Def);
- begin
- case Get_Kind (Base_Type) is
- when Iir_Kind_Enumeration_Type_Definition =>
- -- LRM08 12.4 Use clauses
- -- - If the type mark denotes an enumeration type of a subtype of
- -- an enumeration type, the enumeration literals of the base
- -- type
- declare
- List : constant Iir_Flist :=
- Get_Enumeration_Literal_List (Base_Type);
- El : Iir;
- begin
- for I in Flist_First .. Flist_Last (List) loop
- El := Get_Nth_Element (List, I);
- Potentially_Add_Name (El);
- end loop;
- end;
- when Iir_Kind_Physical_Type_Definition =>
- -- LRM08 12.4 Use clauses
- -- - If the type mark denotes a subtype of a physical type, the
- -- units of the base type
- declare
- El : Iir;
- begin
- El := Get_Unit_Chain (Base_Type);
- while El /= Null_Iir loop
- Potentially_Add_Name (El);
- El := Get_Chain (El);
- end loop;
- end;
- when others =>
- null;
- end case;
-
- -- LRM08 12.4 Use clauses
- -- - The implicit declarations of predefined operations for the type
- -- that are not hidden by homographs explicitely declared immediately
- -- within the package denoted by the prefix of the selected name
- -- - The declarations of homographs, explicitely declared immediately
- -- within the package denotes by the prefix of the selected name,
- -- that hide implicit declarations of predefined operations for the
- -- type
- declare
- Type_Decl : constant Iir := Get_Type_Declarator (Base_Type);
- El : Iir;
- Has_Override : Boolean;
- begin
- Has_Override := False;
- El := Get_Chain (Type_Decl);
- while El /= Null_Iir loop
- if Is_Implicit_Subprogram (El)
- and then Is_Operation_For_Type (El, Base_Type)
- then
- if Get_Visible_Flag (El) then
- -- Implicit declaration EL was overriden by a user
- -- declaration. Don't make it visible.
- Potentially_Add_Name (El);
- else
- Has_Override := True;
- end if;
- El := Get_Chain (El);
- else
- exit;
- end if;
- end loop;
-
- -- Explicitely declared homograph.
- if Has_Override then
- while El /= Null_Iir loop
- if Get_Kind (El) in Iir_Kinds_Subprogram_Declaration
- and then Get_Hide_Implicit_Flag (El)
- and then Is_Operation_For_Type (El, Base_Type)
- then
- Potentially_Add_Name (El);
- end if;
- El := Get_Chain (El);
- end loop;
- end if;
- end;
- end Use_Selected_Type_Name;
-
- -- LRM02 10.4 Use clauses
- -- Each selected name in a use clause identifiers one or more declarations
- -- that will potentially become directly visible. If the suffix of the
- -- selected name is a simple name, a character literal, or operator
- -- symbol, then the selected name identifiers only the declarations(s) of
- -- that simple name, character literal, or operator symbol contained
- -- within the package or library denoted by the prefix of the selected
- -- name.
- procedure Use_Selected_Name (Name : Iir) is
- begin
- case Get_Kind (Name) is
- when Iir_Kind_Overload_List =>
- Add_Declarations_List (Get_Overload_List (Name), True);
- when Iir_Kind_Error =>
- null;
- when others =>
- Potentially_Add_Name (Name);
-
- -- LRM08 12.4 Use clauses
- -- If the suffix of the selected name is a type mark, then the
- -- declaration of the type or subtype denoted by the type mark
- -- is identified. Moreover [...]
- if (Vhdl_Std >= Vhdl_08 or else Flag_Relaxed_Rules)
- and then Get_Kind (Name) in Iir_Kinds_Type_Declaration
- then
- Use_Selected_Type_Name (Name);
- end if;
- end case;
- end Use_Selected_Name;
-
- -- LRM93 10.4 Use clauses
- -- If the suffix is the reserved word ALL, then all the selected name
- -- identifies all declaration that are contained within the package or
- -- library denotes by te prefix of the selected name.
- procedure Use_All_Names (Name: Iir) is
- begin
- case Get_Kind (Name) is
- when Iir_Kind_Library_Declaration =>
- Use_Library_All (Name);
- when Iir_Kind_Package_Declaration =>
- Add_Package_Declarations (Name, True);
- when Iir_Kind_Package_Instantiation_Declaration =>
- Add_Package_Instantiation_Declarations (Name, True);
- when Iir_Kind_Interface_Package_Declaration =>
- -- LRM08 6.5.5 Interface package declarations
- -- Within an entity declaration, an architecture body, a
- -- component declaration, or an uninstantiated subprogram or
- -- package declaration that declares a given interface package,
- -- the name of the given interface package denotes an undefined
- -- instance of the uninstantiated package.
- Add_Package_Instantiation_Declarations (Name, True);
- when Iir_Kind_Error =>
- null;
- when others =>
- raise Internal_Error;
- end case;
- end Use_All_Names;
-
- procedure Add_Use_Clause (Clause : Iir_Use_Clause)
- is
- Name : Iir;
- Cl : Iir_Use_Clause;
- begin
- Cl := Clause;
- loop
- Name := Get_Selected_Name (Cl);
- if Name = Null_Iir then
- pragma Assert (Flags.Flag_Force_Analysis);
- null;
- else
- if Get_Kind (Name) = Iir_Kind_Selected_By_All_Name then
- Name := Get_Prefix (Name);
- if not Is_Error (Name) then
- Use_All_Names (Get_Named_Entity (Name));
- end if;
- else
- if not Is_Error (Name) then
- Use_Selected_Name (Get_Named_Entity (Name));
- end if;
- end if;
- end if;
- Cl := Get_Use_Clause_Chain (Cl);
- exit when Cl = Null_Iir;
- end loop;
- end Add_Use_Clause;
-
- -- Debugging subprograms.
- procedure Disp_All_Names;
- pragma Unreferenced (Disp_All_Names);
-
- procedure Disp_Scopes;
- pragma Unreferenced (Disp_Scopes);
-
- procedure Disp_Detailed_Interpretations (Ident : Name_Id);
- pragma Unreferenced (Disp_Detailed_Interpretations);
-
- procedure Dump_Current_Scope;
- pragma Unreferenced (Dump_Current_Scope);
-
- procedure Disp_Detailed_Interpretations (Ident : Name_Id)
- is
- Inter: Name_Interpretation_Type;
- Decl : Iir;
- begin
- Log (Name_Table.Image (Ident));
- Log_Line (":");
-
- Inter := Get_Interpretation (Ident);
- while Valid_Interpretation (Inter) loop
- Log (Name_Interpretation_Type'Image (Inter));
- if Is_Potentially_Visible (Inter) then
- Log (" (use)");
- end if;
- Log (":");
- Decl := Get_Declaration (Inter);
- Log (Iir'Image (Decl));
- Log (":");
- Log (Iir_Kind'Image (Get_Kind (Decl)));
- Log_Line (", loc: " & Image (Get_Location (Decl)));
- if Get_Kind (Decl) in Iir_Kinds_Subprogram_Declaration then
- Log_Line (" " & Disp_Subprg (Decl));
- end if;
- Inter := Get_Next_Interpretation (Inter);
- end loop;
- end Disp_Detailed_Interpretations;
-
- procedure Disp_All_Interpretations
- (Interpretation : Name_Interpretation_Type)
- is
- Inter: Name_Interpretation_Type;
- begin
- Inter := Interpretation;
- while Valid_Interpretation (Inter) loop
- Log (Name_Interpretation_Type'Image (Inter));
- Log (".");
- Log (Iir_Kind'Image (Get_Kind (Get_Declaration (Inter))));
- Inter := Get_Next_Interpretation (Inter);
- end loop;
- Log_Line;
- end Disp_All_Interpretations;
-
- procedure Disp_All_Names
- is
- Inter: Name_Interpretation_Type;
- begin
- for I in 0 .. Name_Table.Last_Name_Id loop
- Inter := Get_Interpretation (I);
- if Valid_Interpretation (Inter) then
- Log (Name_Table.Image (I));
- Log (Name_Id'Image (I));
- Log (":");
- Disp_All_Interpretations (Inter);
- end if;
- end loop;
- Log_Line ("interprations.last = "
- & Name_Interpretation_Type'Image (Interpretations.Last));
- Log_Line ("current_region_start ="
- & Name_Interpretation_Type'Image (Current_Region_Start));
- end Disp_All_Names;
-
- procedure Dump_Interpretation (Inter : Name_Interpretation_Type)
- is
- Decl : Iir;
- begin
- Log (Name_Interpretation_Type'Image (Inter));
- if Is_Potentially_Visible (Inter) then
- Log (" (use)");
- end if;
- Log (": ");
- Decl := Get_Declaration (Inter);
- if Decl = Null_Iir then
- Log_Line ("null: conflict");
- else
- Log (Iir_Kind'Image (Get_Kind (Decl)));
- Log_Line (", loc: " & Image (Get_Location (Decl)));
- if Get_Kind (Decl) in Iir_Kinds_Subprogram_Declaration then
- Log_Line (" " & Disp_Subprg (Decl));
- end if;
- end if;
- end Dump_Interpretation;
-
- procedure Dump_A_Scope (First, Last : Name_Interpretation_Type) is
- begin
- if First > Last then
- Log_Line ("scope is empty");
- return;
- end if;
-
- for Inter in reverse First .. Last loop
- declare
- Cell : Interpretation_Cell renames Interpretations.Table (Inter);
- begin
- Dump_Interpretation (Inter);
- if Cell.Prev_Hidden then
- Log (" [prev:");
- Log (Name_Interpretation_Type'Image (Cell.Prev));
- if Cell.Prev_Hidden then
- Log (" hidden");
- end if;
- Log_Line ("]");
- else
- if Cell.Prev < First then
- Log_Line (" [last in scope]");
- end if;
- end if;
- end;
- end loop;
- end Dump_A_Scope;
-
- procedure Dump_Current_Scope is
- begin
- Dump_A_Scope (Current_Region_Start, Interpretations.Last);
- end Dump_Current_Scope;
-
- procedure Disp_Scopes is
- begin
- for I in reverse Scopes.First .. Scopes.Last loop
- declare
- S : Scope_Cell renames Scopes.Table (I);
- begin
- case S.Kind is
- when Scope_Start =>
- Log ("scope_start at");
- when Scope_Region =>
- Log ("scope_region at");
- end case;
- Log_Line (Name_Interpretation_Type'Image (S.Saved_Region_Start));
- end;
- end loop;
- end Disp_Scopes;
-end Sem_Scopes;