diff options
author | Tristan Gingold <tgingold@free.fr> | 2018-11-10 07:32:54 +0100 |
---|---|---|
committer | Tristan Gingold <tgingold@free.fr> | 2018-11-10 07:32:54 +0100 |
commit | 39f7879742b5b4b87a5b4881871ece229f968b5b (patch) | |
tree | 7e55da3d1385d26291d48df1c9ff83ef329e705d /src/vhdl | |
parent | 8521efde4b3e3f4ef082608fbd0e4f34d7c38eb6 (diff) | |
download | ghdl-39f7879742b5b4b87a5b4881871ece229f968b5b.tar.gz ghdl-39f7879742b5b4b87a5b4881871ece229f968b5b.tar.bz2 ghdl-39f7879742b5b4b87a5b4881871ece229f968b5b.zip |
trans-chap3: elaborate bounds of arrays with unbounded elements.
For #645
Diffstat (limited to 'src/vhdl')
-rw-r--r-- | src/vhdl/translate/trans-chap3.adb | 20 |
1 files changed, 18 insertions, 2 deletions
diff --git a/src/vhdl/translate/trans-chap3.adb b/src/vhdl/translate/trans-chap3.adb index 2d6b2d038..c9e639dd1 100644 --- a/src/vhdl/translate/trans-chap3.adb +++ b/src/vhdl/translate/trans-chap3.adb @@ -737,11 +737,15 @@ package body Trans.Chap3 is declare Indexes_List : constant Iir_Flist := Get_Index_Subtype_List (Def); + Tinfo : constant Type_Info_Acc := Get_Info (Def); + El_Tinfo : Type_Info_Acc; Targ : Mnode; Index : Iir; begin Targ := Layout_To_Bounds (Target); - if Get_Nbr_Elements (Indexes_List) > 1 then + if Tinfo.B.Bounds_El /= O_Fnode_Null + or else Get_Nbr_Elements (Indexes_List) > 1 + then Targ := Stabilize (Targ); end if; for I in Flist_First .. Flist_Last (Indexes_List) loop @@ -751,7 +755,17 @@ package body Trans.Chap3 is (Bounds_To_Range (Targ, Def, I + 1), Index); Close_Temp; end loop; - -- FIXME: element ? + + -- Element. + if Tinfo.B.Bounds_El /= O_Fnode_Null then + -- TODO: should be directly elaborated in place. + El_Tinfo := Get_Info (Get_Element_Subtype (Def)); + Gen_Memcpy + (M2Addr (Array_Bounds_To_Element_Layout (Targ, Def)), + M2Addr (Get_Composite_Type_Layout (El_Tinfo)), + New_Lit (New_Sizeof (El_Tinfo.B.Layout_Type, + Ghdl_Index_Type))); + end if; end; when Iir_Kind_Record_Type_Definition => @@ -2394,6 +2408,8 @@ package body Trans.Chap3 is begin -- Handle element subtype. if El_Type /= Parent_El_Type then + -- TODO: do not create vars for element subtype, but use + -- the layout field of the array vars. Push_Identifier_Prefix (Mark, "ET"); Translate_Subtype_Definition (El_Type, Parent_El_Type, With_Vars); |