aboutsummaryrefslogtreecommitdiffstats
path: root/src/vhdl
diff options
context:
space:
mode:
authorTristan Gingold <tgingold@free.fr>2016-06-28 05:45:53 +0200
committerTristan Gingold <tgingold@free.fr>2016-06-28 05:47:52 +0200
commitc3bfe727639a450270e3e3a69e513b20fc40682f (patch)
tree621b5f4a2c5235c291bc1fde5d6a46dc8b358c9e /src/vhdl
parent60e2338ef145f14ebee26f8f3d383ccefaff2e4b (diff)
downloadghdl-c3bfe727639a450270e3e3a69e513b20fc40682f.tar.gz
ghdl-c3bfe727639a450270e3e3a69e513b20fc40682f.tar.bz2
ghdl-c3bfe727639a450270e3e3a69e513b20fc40682f.zip
Handle uninstantiated packages without body.
Diffstat (limited to 'src/vhdl')
-rw-r--r--src/vhdl/translate/trans-chap2.adb50
-rw-r--r--src/vhdl/translate/trans-chap2.ads2
2 files changed, 38 insertions, 14 deletions
diff --git a/src/vhdl/translate/trans-chap2.adb b/src/vhdl/translate/trans-chap2.adb
index 0d94e91ea..267f3d5ef 100644
--- a/src/vhdl/translate/trans-chap2.adb
+++ b/src/vhdl/translate/trans-chap2.adb
@@ -734,6 +734,23 @@ package body Trans.Chap2 is
Pop_Identifier_Prefix (Mark);
end Translate_Subprogram_Body;
+ procedure Push_Package_Instance_Factory (Spec : Iir)
+ is
+ Info : constant Ortho_Info_Acc := Get_Info (Spec);
+ begin
+ Push_Instance_Factory (Info.Package_Body_Scope'Access);
+ Info.Package_Spec_Field := Add_Instance_Factory_Field
+ (Get_Identifier ("SPEC"),
+ Get_Scope_Type (Info.Package_Spec_Scope));
+ end Push_Package_Instance_Factory;
+
+ procedure Pop_Package_Instance_Factory (Spec : Iir)
+ is
+ Info : constant Ortho_Info_Acc := Get_Info (Spec);
+ begin
+ Pop_Instance_Factory (Info.Package_Body_Scope'Access);
+ end Pop_Package_Instance_Factory;
+
procedure Translate_Package_Declaration (Decl : Iir_Package_Declaration)
is
Header : constant Iir := Get_Package_Header (Decl);
@@ -815,26 +832,33 @@ package body Trans.Chap2 is
Subprgs.Pop_Subprg_Instance (Wki_Instance, Prev_Subprg_Instance);
end if;
Save_Local_Identifier (Info.Package_Local_Id);
+
+ if Is_Uninstantiated_Package (Decl)
+ and then not Get_Need_Body (Decl)
+ and then Get_Package_Body (Decl) = Null_Iir
+ then
+ -- Generic package without a body.
+ -- Create an empty body instance.
+ Push_Package_Instance_Factory (Decl);
+ Pop_Package_Instance_Factory (Decl);
+ end if;
end Translate_Package_Declaration;
- procedure Translate_Package_Body (Decl : Iir_Package_Body)
+ procedure Translate_Package_Body (Bod : Iir_Package_Body)
is
- Spec : constant Iir_Package_Declaration := Get_Package (Decl);
+ Spec : constant Iir_Package_Declaration := Get_Package (Bod);
Info : constant Ortho_Info_Acc := Get_Info (Spec);
Prev_Subprg_Instance : Subprgs.Subprg_Instance_Stack;
Prev_Storage : constant O_Storage := Global_Storage;
begin
-- Translate declarations.
if Is_Uninstantiated_Package (Spec) then
- Push_Instance_Factory (Info.Package_Body_Scope'Access);
- Info.Package_Spec_Field := Add_Instance_Factory_Field
- (Get_Identifier ("SPEC"),
- Get_Scope_Type (Info.Package_Spec_Scope));
+ Push_Package_Instance_Factory (Spec);
-- Translate the specifications.
- Chap4.Translate_Declaration_Chain (Decl);
+ Chap4.Translate_Declaration_Chain (Bod);
- Pop_Instance_Factory (Info.Package_Body_Scope'Access);
+ Pop_Package_Instance_Factory (Spec);
if Global_Storage = O_Storage_External then
return;
@@ -845,15 +869,15 @@ package body Trans.Chap2 is
return;
end if;
- Restore_Local_Identifier (Get_Info (Spec).Package_Local_Id);
+ Restore_Local_Identifier (Info.Package_Local_Id);
- Chap4.Translate_Declaration_Chain (Decl);
+ Chap4.Translate_Declaration_Chain (Bod);
end if;
Global_Storage := O_Storage_Private;
if Flag_Rti then
- Rtis.Generate_Unit (Decl);
+ Rtis.Generate_Unit (Bod);
end if;
if Is_Uninstantiated_Package (Spec) then
@@ -866,14 +890,14 @@ package body Trans.Chap2 is
Info.Package_Body_Scope'Access);
end if;
- Chap4.Translate_Declaration_Chain_Subprograms (Decl);
+ Chap4.Translate_Declaration_Chain_Subprograms (Bod);
if Is_Uninstantiated_Package (Spec) then
Clear_Scope (Info.Package_Spec_Scope);
Subprgs.Pop_Subprg_Instance (Wki_Instance, Prev_Subprg_Instance);
end if;
- Elab_Package_Body (Spec, Decl);
+ Elab_Package_Body (Spec, Bod);
Global_Storage := Prev_Storage;
end Translate_Package_Body;
diff --git a/src/vhdl/translate/trans-chap2.ads b/src/vhdl/translate/trans-chap2.ads
index 5394cba14..fe398cc29 100644
--- a/src/vhdl/translate/trans-chap2.ads
+++ b/src/vhdl/translate/trans-chap2.ads
@@ -32,7 +32,7 @@ package Trans.Chap2 is
procedure Push_Subprg_Identifier (Spec : Iir; Mark : out Id_Mark_Type);
procedure Translate_Package_Declaration (Decl : Iir_Package_Declaration);
- procedure Translate_Package_Body (Decl : Iir_Package_Body);
+ procedure Translate_Package_Body (Bod : Iir_Package_Body);
procedure Translate_Package_Instantiation_Declaration (Inst : Iir);
procedure Elab_Package_Body (Spec : Iir_Package_Declaration; Bod : Iir);