summaryrefslogtreecommitdiff
path: root/sem_names.ads
blob: 5fc57fb04ef467374110d3022e905028546b8666 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
--  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 Iirs; use Iirs;

package Sem_Names is
   --  Semantize NAME as long as it consists in named entities.
   --  Set Named_Entity field of NAME, with:
   --  * the named entity (if any)
   --  * an overload_list of named entity
   --  * error_mark (in case of error, the message error is displayed).
   procedure Sem_Name (Name : Iir; Keep_Alias : Boolean);

   --  Finish semantisation of NAME, if necessary.
   procedure Maybe_Finish_Sem_Name (Name : Iir);

   --  Same as Sem_Name but without any side-effect:
   --  * do not report error
   --  * do not set xrefs
   --  Currently, only simple names (and expanded names) are handled.
   --  This is to be used during sem of associations.
   procedure Sem_Name_Soft (Name : Iir);

   --  Remove every named_entity of NAME.
   --  If NAME is Null_Iir then this is no op.
   --  To be used only for names (weakly) semantized by sem_name_soft.
   procedure Sem_Name_Clean (Name : Iir);

   --  Return TRUE if NAME is a name that designate an object.
   --  Only in this case, base_name is defined.
   function Is_Object_Name (Name : Iir) return Boolean;

   --  Return an object node if NAME designates an object (ie either is an
   --  object or a name for an object).
   --  Otherwise, returns NULL_IIR.
   function Name_To_Object (Name : Iir) return Iir;

   --  If NAME is a selected name whose prefix is a protected variable, set
   --  method_object of CALL.
   procedure Name_To_Method_Object (Call : Iir; Name : Iir);

   --  Convert name EXPR to an expression (ie, can create function call).
   --  A_TYPE is the expected type of the expression.
   --  FIXME: it is unclear wether the result must be an expression or not
   --  (ie, it *must* have a type, but may be a range).
   function Name_To_Expression (Name : Iir; A_Type : Iir) return Iir;

   -- Return true if AN_IIR is an overload list.
   function Is_Overload_List (An_Iir: Iir) return Boolean;
   pragma Inline (Is_Overload_List);

   -- Create an overload list.
   -- must be destroyed with free_iir.
   function Get_Overload_List return Iir_Overload_List;
   pragma Inline (Get_Overload_List);
   function Create_Overload_List (List : Iir_List) return Iir_Overload_List;
   pragma Inline (Create_Overload_List);

   procedure Error_Overload (Expr: Iir);

   procedure Disp_Overload_List (List : Iir_List; Loc : Iir);

   --  Convert a list to either Null_Iir, an element or an overload list.
   function Simplify_Overload_List (List : Iir_List) return Iir;

   --  Return TRUE iff TYPE1 and TYPE2 are closely related.
   function Are_Types_Closely_Related (Type1, Type2 : Iir) return Boolean;

   --  From the list LIST of function or enumeration literal, extract the
   --  list of (return) types.
   --  If there is only one type, return it.
   --  If there is no types, return NULL.
   --  Otherwise, return the list as an overload list.
   function Create_List_Of_Types (List : Iir_List) return Iir;

   function Sem_Index_Specification (Name : Iir_Parenthesis_Name; Itype : Iir)
                                    return Iir;

   --  Kind of declaration to find.
   --  Decl_entity: an entity declaration (used for binding_indication).
   --  Decl_Any : no checks is performed.

   type Decl_Kind_Type is
     (Decl_Type, Decl_Incomplete_Type,
      Decl_Component, Decl_Unit, Decl_Label,
      Decl_Group_Template, Decl_Entity, Decl_Configuration, Decl_Attribute);

   --  Find a uniq declaration for name NAME, which can be a simple_name,
   --  an identifier or a selected_name.
   --  Disp an error message if:
   --   NAME (or any prefix of it) is undefined
   --   NAME is overloaded
   --   NAME does not belong to KIND.
   --  In these case, null_iir  is returned.
   --  Otherwise, the declaration is returned, and NAME is freed.
   --  If NAME is a selected_name, dependencies can be added to the current
   --  design unit.
   function Find_Declaration (Name: Iir; Kind: Decl_Kind_Type) return Iir;
end Sem_Names;