aboutsummaryrefslogtreecommitdiffstats
path: root/src/grt/grt-stack2.ads
diff options
context:
space:
mode:
authorTristan Gingold <tgingold@free.fr>2015-09-04 21:52:38 +0200
committerTristan Gingold <tgingold@free.fr>2015-09-04 21:52:38 +0200
commit8520993b4d1eadefa488dfc96dff25333f1b19db (patch)
tree818d4fe917d3e6b765932ed3d1ab1ee70dc3c508 /src/grt/grt-stack2.ads
parent2d8f611cb63b72aa0373efe0ffa0df47e25519c9 (diff)
downloadghdl-8520993b4d1eadefa488dfc96dff25333f1b19db.tar.gz
ghdl-8520993b4d1eadefa488dfc96dff25333f1b19db.tar.bz2
ghdl-8520993b4d1eadefa488dfc96dff25333f1b19db.zip
Suppress stack switching; save process state in secondary stack.
Diffstat (limited to 'src/grt/grt-stack2.ads')
-rw-r--r--src/grt/grt-stack2.ads35
1 files changed, 29 insertions, 6 deletions
diff --git a/src/grt/grt-stack2.ads b/src/grt/grt-stack2.ads
index b3de6b76d..1c0c79afe 100644
--- a/src/grt/grt-stack2.ads
+++ b/src/grt/grt-stack2.ads
@@ -26,18 +26,41 @@ with System;
with Grt.Types; use Grt.Types;
-- Secondary stack management.
+-- The secondary stack is used by vhdl to return object from function whose
+-- type is unconstrained. This is less efficient than returning the object
+-- on the stack, but compatible with any ABI.
+--
+-- The management is very simple: mark and release. Allocate reserved a
+-- chunk of memory from the secondary stack, Release deallocate all the
+-- memory allocated since the mark.
+
package Grt.Stack2 is
- type Stack2_Ptr is new System.Address;
- Null_Stack2_Ptr : constant Stack2_Ptr := Stack2_Ptr (System.Null_Address);
+ -- Designate a secondary stack.
+ type Stack2_Ptr is private;
- type Mark_Id is new Integer_Address;
+ -- Indicator for a non-existing secondary stack. Create never return that
+ -- value.
+ Null_Stack2_Ptr : constant Stack2_Ptr;
+
+ -- Type of a mark.
+ type Mark_Id is private;
+ -- Get the current mark, which indicate a current amount of allocated
+ -- memory.
function Mark (S : Stack2_Ptr) return Mark_Id;
+
+ -- Deallocate (free) all the memory allocated since MARK.
procedure Release (S : Stack2_Ptr; Mark : Mark_Id);
+
+ -- Allocate SIZE bytes (aligned on the maximum alignment) on stack S.
function Allocate (S : Stack2_Ptr; Size : Ghdl_Index_Type)
- return System.Address;
+ return System.Address;
+
+ -- Create a secondary stack.
function Create return Stack2_Ptr;
+private
+ type Stack2_Ptr is new System.Address;
+ Null_Stack2_Ptr : constant Stack2_Ptr := Stack2_Ptr (System.Null_Address);
- -- Check S is empty.
- procedure Check_Empty (S : Stack2_Ptr);
+ type Mark_Id is new Integer_Address;
end Grt.Stack2;