aboutsummaryrefslogtreecommitdiffstats
path: root/translate
diff options
context:
space:
mode:
Diffstat (limited to 'translate')
-rw-r--r--translate/translation.adb107
1 files changed, 67 insertions, 40 deletions
diff --git a/translate/translation.adb b/translate/translation.adb
index b609e7ad7..6da25dec8 100644
--- a/translate/translation.adb
+++ b/translate/translation.adb
@@ -2355,15 +2355,20 @@ package body Translation is
-- Close the temporary region.
procedure Close_Temp;
+ -- Like Open_Temp, but will never create a declare region. To be used
+ -- only within a subprogram, to use the declare region of the
+ -- subprogram.
+ procedure Open_Local_Temp;
+ -- Destroy transient types created in a temporary region.
+ procedure Destroy_Local_Transient_Types;
+ procedure Close_Local_Temp;
+
-- Return TRUE if stack2 will be released. Used for fine-tuning only
-- (return statement).
function Has_Stack2_Mark return Boolean;
-- Manually release stack2. Used for fine-tuning only.
procedure Stack2_Release;
- -- Check there is no temporary region.
- procedure Check_No_Temp;
-
-- Free all old temp.
-- Used only to free memory.
procedure Free_Old_Temp;
@@ -3284,6 +3289,12 @@ package body Translation is
end if;
end Open_Temp;
+ procedure Open_Local_Temp is
+ begin
+ Open_Temp;
+ Temp_Level.Emitted := True;
+ end Open_Local_Temp;
+
procedure Add_Transient_Type_In_Temp (Atype : Iir)
is
Type_Info : Type_Info_Acc;
@@ -3293,6 +3304,21 @@ package body Translation is
Temp_Level.Transient_Types := Atype;
end Add_Transient_Type_In_Temp;
+ procedure Release_Transient_Types (Chain : in out Iir) is
+ N_Atype : Iir;
+ begin
+ while Chain /= Null_Iir loop
+ N_Atype := Get_Info (Chain).Type_Transient_Chain;
+ Chap3.Destroy_Type_Info (Chain);
+ Chain := N_Atype;
+ end loop;
+ end Release_Transient_Types;
+
+ procedure Destroy_Local_Transient_Types is
+ begin
+ Release_Transient_Types (Temp_Level.Transient_Types);
+ end Destroy_Local_Transient_Types;
+
function Has_Stack2_Mark return Boolean is
begin
return Temp_Level.Stack2_Mark /= O_Dnode_Null;
@@ -3332,19 +3358,7 @@ package body Translation is
end if;
-- Destroy transcient types.
- if Temp_Level.Transient_Types /= Null_Iir then
- declare
- Atype : Iir;
- N_Atype : Iir;
- begin
- Atype := Temp_Level.Transient_Types;
- while Atype /= Null_Iir loop
- N_Atype := Get_Info (Atype).Type_Transient_Chain;
- Chap3.Destroy_Type_Info (Atype);
- Atype := N_Atype;
- end loop;
- end;
- end if;
+ Release_Transient_Types (Temp_Level.Transient_Types);
-- Unlink temp_level.
L := Temp_Level;
@@ -3353,12 +3367,11 @@ package body Translation is
Old_Level := L;
end Close_Temp;
- procedure Check_No_Temp is
+ procedure Close_Local_Temp is
begin
- if Temp_Level /= null then
- raise Internal_Error;
- end if;
- end Check_No_Temp;
+ Temp_Level.Emitted := False;
+ Close_Temp;
+ end Close_Local_Temp;
procedure Free_Old_Temp
is
@@ -3903,19 +3916,23 @@ package body Translation is
-- Generics.
El := Get_Generic_Chain (Entity);
while El /= Null_Iir loop
+ Open_Temp;
Chap4.Elab_Object_Value (El, Get_Default_Value (El));
+ Close_Temp;
El := Get_Chain (El);
end loop;
-- Ports.
El := Get_Port_Chain (Entity);
while El /= Null_Iir loop
+ Open_Temp;
El_Type := Get_Type (El);
if not Is_Fully_Constrained_Type (El_Type) then
Chap5.Elab_Unconstrained_Port (El, Get_Default_Value (El));
end if;
Chap4.Elab_Signal_Declaration_Storage (El);
Chap4.Elab_Signal_Declaration_Object (El, Entity, False);
+ Close_Temp;
El := Get_Chain (El);
end loop;
@@ -4654,7 +4671,9 @@ package body Translation is
Push_Architecture_Scope (Arch, Instance);
if Get_Kind (Config) = Iir_Kind_Configuration_Declaration then
+ Open_Temp;
Chap4.Elab_Declaration_Chain (Config, Final);
+ Close_Temp;
if Final then
raise Internal_Error;
end if;
@@ -4981,6 +5000,7 @@ package body Translation is
Start_Subprg_Instance_Use (Spec);
Push_Local_Factory;
+ Open_Local_Temp;
Chap2.Save_Subprg_Instance (Subprg_Instances);
-- Init out parameter passed by value/copy.
@@ -5014,8 +5034,6 @@ package body Translation is
Chap4.Elab_Declaration_Chain (Subprg, Final);
- pragma Debug (Check_No_Temp);
-
-- If finalization is required, create a dummy loop around the
-- body and convert returns into exit out of this loop.
-- If the subprogram is a function, also create a variable for the
@@ -5076,14 +5094,13 @@ package body Translation is
end if;
Chap2.Restore_Subprg_Instance (Subprg_Instances);
+ Close_Local_Temp;
Pop_Local_Factory;
Finish_Subprg_Instance_Use (Spec);
Finish_Subprogram_Body;
- pragma Debug (Check_No_Temp);
-
Pop_Identifier_Prefix (Mark);
end Translate_Subprogram_Body;
@@ -5270,7 +5287,10 @@ package body Translation is
Push_Local_Factory;
Elab_Dependence (Get_Design_Unit (Spec));
+
+ Open_Temp;
Chap4.Elab_Declaration_Chain (Spec, Final);
+ Close_Temp;
Pop_Local_Factory;
Finish_Subprogram_Body;
@@ -5302,7 +5322,9 @@ package body Translation is
if Bod /= Null_Iir then
Elab_Dependence (Get_Design_Unit (Bod));
+ Open_Temp;
Chap4.Elab_Declaration_Chain (Bod, Final);
+ Close_Temp;
end if;
Pop_Local_Factory;
@@ -6954,7 +6976,9 @@ package body Translation is
Call_Ghdl_Protected_Procedure (Decl, Ghdl_Protected_Init);
-- Elaborate fields.
+ Open_Temp;
Chap4.Elab_Declaration_Chain (Bod, Final);
+ Close_Temp;
Chap2.Finish_Subprg_Instance_Use (Info.T.Prot_Init_Instance);
Finish_Subprogram_Body;
@@ -9348,10 +9372,14 @@ package body Translation is
Alloc_Kind := Get_Alloc_Kind_For_Var (Obj_Info.Object_Var);
- Open_Temp;
+ -- Note: no temporary variable region is created, as the allocation
+ -- may be performed on the stack.
+
if Value = Null_Iir then
-- Performs default initialization.
+ Open_Temp;
Init_Object (Name, Obj_Type);
+ Close_Temp;
elsif Get_Kind (Value) = Iir_Kind_Aggregate then
if Type_Info.Type_Mode = Type_Mode_Fat_Array then
-- Allocate.
@@ -9403,9 +9431,8 @@ package body Translation is
else
Chap3.Translate_Object_Copy (Name, Value_Node, Obj_Type);
end if;
+ Destroy_Local_Transient_Types;
end if;
-
- Close_Temp;
end Elab_Object_Init;
-- Generate code to create object OBJ and initialize it with value VAL.
@@ -10976,8 +11003,6 @@ package body Translation is
Decl := Get_Declaration_Chain (Parent);
Need_Final := False;
while Decl /= Null_Iir loop
- Open_Temp;
-
case Get_Kind (Decl) is
when Iir_Kind_Use_Clause =>
null;
@@ -11056,8 +11081,6 @@ package body Translation is
Error_Kind ("elab_declaration_chain", Decl);
end case;
- Close_Temp;
-
Decl := Get_Chain (Decl);
end loop;
end Elab_Declaration_Chain;
@@ -12105,6 +12128,7 @@ package body Translation is
-- the ports, since a port subtype may depend on a generic.
Assoc := Get_Generic_Map_Aspect_Chain (Mapping);
while Assoc /= Null_Iir loop
+ Open_Temp;
Formal := Get_Formal (Assoc);
case Get_Kind (Assoc) is
when Iir_Kind_Association_Element_By_Expression =>
@@ -12113,17 +12137,14 @@ package body Translation is
Targ := Chap6.Translate_Name (Formal);
Chap4.Elab_Object_Init (Targ, Formal, Get_Actual (Assoc));
else
- Open_Temp;
Targ := Chap6.Translate_Name (Formal);
Chap7.Translate_Assign
(Targ, Get_Actual (Assoc), Get_Type (Formal));
- Close_Temp;
end if;
when Iir_Kind_Association_Element_Open =>
Chap4.Elab_Object_Value (Formal, Get_Default_Value (Formal));
when Iir_Kind_Association_Element_By_Individual =>
-- Create the object.
- Open_Temp;
declare
Formal_Node : Mnode;
Formal_Type : Iir;
@@ -12150,10 +12171,10 @@ package body Translation is
(Formal_Node, Alloc_System, Formal_Type, Bounds);
end if;
end;
- Close_Temp;
when others =>
Error_Kind ("elab_map_aspect(1)", Assoc);
end case;
+ Close_Temp;
Assoc := Get_Chain (Assoc);
end loop;
@@ -12164,6 +12185,7 @@ package body Translation is
Formal_Base := Get_Base_Name (Formal);
Fb_Type := Get_Type (Formal_Base);
+ Open_Temp;
-- Set bounds of unconstrained ports.
Fbt_Info := Get_Info (Fb_Type);
if Fbt_Info.Type_Mode = Type_Mode_Fat_Array then
@@ -12173,7 +12195,6 @@ package body Translation is
Elab_Unconstrained_Port (Formal, Get_Actual (Assoc));
end if;
when Iir_Kind_Association_Element_Open =>
- Open_Temp;
declare
Actual_Type : Iir;
Bounds : Mnode;
@@ -12187,9 +12208,7 @@ package body Translation is
(M2Lp (Chap3.Get_Array_Bounds (Formal_Node)),
M2Addr (Bounds));
end;
- Close_Temp;
when Iir_Kind_Association_Element_By_Individual =>
- Open_Temp;
declare
Actual_Type : Iir;
Bounds : Mnode;
@@ -12203,13 +12222,14 @@ package body Translation is
(M2Lp (Chap3.Get_Array_Bounds (Formal_Node)),
M2Addr (Bounds));
end;
- Close_Temp;
when others =>
Error_Kind ("elab_map_aspect(2)", Assoc);
end case;
end if;
+ Close_Temp;
-- Allocate storage of ports.
+ Open_Temp;
case Get_Kind (Assoc) is
when Iir_Kind_Association_Element_By_Individual
| Iir_Kind_Association_Element_Open =>
@@ -12221,8 +12241,10 @@ package body Translation is
when others =>
Error_Kind ("elab_map_aspect(3)", Assoc);
end case;
+ Close_Temp;
-- Create or copy signals.
+ Open_Temp;
case Get_Kind (Assoc) is
when Iir_Kind_Association_Element_By_Expression =>
if Get_Whole_Association_Flag (Assoc) then
@@ -12263,6 +12285,7 @@ package body Translation is
when others =>
Error_Kind ("elab_map_aspect(4)", Assoc);
end case;
+ Close_Temp;
Assoc := Get_Chain (Assoc);
end loop;
@@ -22301,7 +22324,9 @@ package body Translation is
-- First elaborate declarations since a driver may depend on
-- an alias declaration.
-- Also, with vhdl 08 a sensitivity element may depend on an alias.
+ Open_Temp;
Chap4.Elab_Declaration_Chain (Proc, Final);
+ Close_Temp;
-- Register drivers.
if Flag_Direct_Drivers then
@@ -23104,7 +23129,9 @@ package body Translation is
Error_Kind ("elab_block_declarations", Block);
end case;
+ Open_Temp;
Chap4.Elab_Declaration_Chain (Block, Final);
+ Close_Temp;
Stmt := Get_Concurrent_Statement_Chain (Block);
while Stmt /= Null_Iir loop