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
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
|
-- Mcode back-end for ortho - Declarations handling.
-- Copyright (C) 2006 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 GCC; see the file COPYING. If not, write to the Free
-- Software Foundation, 59 Temple Place - Suite 330, Boston, MA
-- 02111-1307, USA.
with Ortho_Code.Abi;
package Ortho_Code.Decls is
-- Kind of a declaration.
type OD_Kind is (OD_Type,
OD_Const,
-- Value of constant, initial value of variable.
OD_Init_Val,
-- Global and local variables.
OD_Var, OD_Local,
-- Subprograms.
OD_Function, OD_Procedure,
-- Additional node for a subprogram. Internal use only.
OD_Subprg_Ext,
OD_Interface,
OD_Body,
OD_Block);
-- Return the kind of declaration DECL.
function Get_Decl_Kind (Decl : O_Dnode) return OD_Kind;
-- Return the type of a declaration.
function Get_Decl_Type (Decl : O_Dnode) return O_Tnode;
-- Return the identifier of a declaration.
function Get_Decl_Ident (Decl : O_Dnode) return O_Ident;
-- Return the storage of a declaration.
function Get_Decl_Storage (Decl : O_Dnode) return O_Storage;
-- Return the depth of a declaration.
function Get_Decl_Depth (Decl : O_Dnode) return O_Depth;
-- Register for the declaration.
function Get_Decl_Reg (Decl : O_Dnode) return O_Reg;
procedure Set_Decl_Reg (Decl : O_Dnode; Reg : O_Reg);
-- Return the next decl (in the same scope) after DECL.
-- This skips declarations in an inner block, but returns interfaces for
-- a subprogram.
function Get_Decl_Chain (Decl : O_Dnode) return O_Dnode;
-- Get the last declaration.
function Get_Decl_Last return O_Dnode;
-- Return the subprogram declaration correspondig to body BOD.
function Get_Body_Decl (Bod : O_Dnode) return O_Dnode;
-- Return the parent of a body.
function Get_Body_Parent (Bod : O_Dnode) return O_Dnode;
-- Get the entry statement of body DECL.
function Get_Body_Stmt (Bod : O_Dnode) return O_Enode;
-- Get/Set the info field of a body.
function Get_Body_Info (Bod : O_Dnode) return Int32;
procedure Set_Body_Info (Bod : O_Dnode; Info : Int32);
-- Get the last declaration of block BLK.
function Get_Block_Last (Blk : O_Dnode) return O_Dnode;
-- Get/Set the block max stack offset.
function Get_Block_Max_Stack (Blk : O_Dnode) return Uns32;
procedure Set_Block_Max_Stack (Blk : O_Dnode; Max : Uns32);
-- Info on blocks.
function Get_Block_Info1 (Blk : O_Dnode) return Int32;
procedure Set_Block_Info1 (Blk : O_Dnode; Info : Int32);
function Get_Block_Info2 (Blk : O_Dnode) return Int32;
procedure Set_Block_Info2 (Blk : O_Dnode; Info : Int32);
-- Get the declaration and the value associated with a constant value.
function Get_Val_Decl (Decl : O_Dnode) return O_Dnode;
function Get_Val_Val (Decl : O_Dnode) return O_Cnode;
-- Declare a type.
-- This simply gives a name to a type.
procedure New_Type_Decl (Ident : O_Ident; Atype : O_Tnode);
-- If Flag_Type_Name is set, a map from type to name is maintained.
function Get_Type_Decl (Atype : O_Tnode) return O_Dnode;
-- Set/Get the offset (or register) of interface or local DECL.
-- To be used by ABI.
procedure Set_Local_Offset (Decl : O_Dnode; Off : Int32);
function Get_Local_Offset (Decl : O_Dnode) return Int32;
-- Get/Set user info on subprogram, variable, constant declaration.
procedure Set_Decl_Info (Decl : O_Dnode; Ref : Int32);
function Get_Decl_Info (Decl : O_Dnode) return Int32;
-- Get/Set the stack size of subprogram arguments.
procedure Set_Subprg_Stack (Decl : O_Dnode; Val : Int32);
function Get_Subprg_Stack (Decl : O_Dnode) return Int32;
-- Get the first interface of a subprogram declaration.
function Get_Subprg_Interfaces (Decl : O_Dnode) return O_Dnode;
-- Get the next interface.
-- End of interface chain when result is O_Dnode_Null.
function Get_Interface_Chain (Decl : O_Dnode) return O_Dnode;
-- Declare a constant.
-- This simply gives a name to a constant value or aggregate.
-- A constant cannot be modified and its storage cannot be local.
-- ATYPE must be constrained.
procedure New_Const_Decl
(Res : out O_Dnode;
Ident : O_Ident;
Storage : O_Storage;
Atype : O_Tnode);
-- Set the value to DECL.
procedure New_Init_Value (Decl : O_Dnode; Val : O_Cnode);
-- Create a variable declaration.
-- A variable can be local only inside a function.
-- ATYPE must be constrained.
procedure New_Var_Decl
(Res : out O_Dnode;
Ident : O_Ident;
Storage : O_Storage;
Atype : O_Tnode);
type O_Inter_List is limited private;
-- Start a subprogram declaration.
-- Note: nested subprograms are allowed, ie o_storage_local subprograms can
-- be declared inside a subprograms. It is not allowed to declare
-- o_storage_external subprograms inside a subprograms.
-- Return type and interfaces cannot be a composite type.
procedure Start_Function_Decl
(Interfaces : out O_Inter_List;
Ident : O_Ident;
Storage : O_Storage;
Rtype : O_Tnode);
-- For a subprogram without return value.
procedure Start_Procedure_Decl
(Interfaces : out O_Inter_List;
Ident : O_Ident;
Storage : O_Storage);
-- Add an interface declaration to INTERFACES.
procedure New_Interface_Decl
(Interfaces : in out O_Inter_List;
Res : out O_Dnode;
Ident : O_Ident;
Atype : O_Tnode);
-- Finish the function declaration, get the node and a statement list.
procedure Finish_Subprogram_Decl
(Interfaces : in out O_Inter_List; Res : out O_Dnode);
-- Start subprogram body of DECL. STMT is the corresponding statement.
-- Return the declaration for the body.
function Start_Subprogram_Body (Decl : O_Dnode; Stmt : O_Enode)
return O_Dnode;
procedure Finish_Subprogram_Body;
-- Start a declarative region.
function Start_Declare_Stmt return O_Dnode;
procedure Finish_Declare_Stmt (Parent : O_Dnode);
procedure Disp_All_Decls;
procedure Disp_Block (Indent : Natural; Start : O_Dnode);
procedure Disp_Decl_Name (Decl : O_Dnode);
procedure Disp_Decl (Indent : Natural; Decl : O_Dnode);
procedure Disp_Stats;
type Mark_Type is limited private;
procedure Mark (M : out Mark_Type);
procedure Release (M : Mark_Type);
-- Allocate non explicitly initialized variables.
procedure Alloc_Zero;
procedure Finish;
private
type O_Inter_List is record
-- The declaration of the subprogram.
Decl : O_Dnode;
-- Last declared parameter.
Last_Param : O_Dnode;
-- Data for ABI.
Abi : Ortho_Code.Abi.O_Abi_Subprg;
end record;
type Mark_Type is record
Dnode : O_Dnode;
TDnode : O_Tnode;
end record;
end Ortho_Code.Decls;
|