STACK(3) Library Routines STACK(3)
NAME
_assertStack, _beginStackCheck, _endStackCheck, _getStackBottom, _re
portStack, __REPORT_STACK - report stack usage
SYNOPSIS
#include <gno/gno.h>
void _assertStack (unsigned int needed, int line, const char *file);
void _beginStackCheck (void);
int _endStackCheck (void);
unsigned int _getStackBottom (void);
void _reportStack (void);
void __REPORT_STACK (void);
DESCRIPTION
The _beginStackCheck and _endStackCheck routines are intended to deter‐
mine the required stack usage for a program during the development cy‐
cle. _beginStackCheck should be called as soon as possible after the
program starts. _endStackCheck should be called just prior to program
exit. _endStackCheck will return the number of bytes of stack space
used by the program. The result can then be used as a lower bound for
the argument to occ's -s flag, or the stacksize pragma for ORCA/C.
Since the procedure used by most programs is to call _beginStackCheck
and then immediately register with atexit(3) a function which prints
the stack usage on exit, this functionality has been provided by _re
portStack; just call _reportStack immediately after main and nothing
else is required. Alternately, you may also call the macro __RE
PORT_STACK() which resolves to a call to __reportStack if and only if
the macro __STACK_CHECK__ is defined.
The _getStackBottom routine returns the lowest direct page address
which can legally be used for the stack. (The stack on the 65816 grows
downward.) This routine is used internally in libc and should not nor‐
mally be needed by an application.
The _assertStack routine ensures that there are at least needed bytes
left unused on the stack. If this is not the case, then _assertStack
prints an appropriate error message and calls exit(3) with a value of
1. This routine is intended for use when you have a function that is
either directly or indirectly recursive, and you do not want to use the
ORCA/C stack checking mechanism for every function in your source file.
The needed number of bytes is usually determined either through code
inspection or empirically (lseg(1) is a good tool for assisting in this
determination). Either way, you should probably make needed slightly
larger than the value you expect to need.
If file is non-NULL, then _assertStack will also print out the file
name and line number as specified. These values are available in any C
program as the macros __FILE__ and __LINE__, respectively.
CAVEAT
The _assertStack routine itself uses stack space, especially when
printing out error messages. Ensure you allow at least 100 bytes extra
to allow for this.
EXAMPLE
The most common way to make use of these routines is to call _report
Stack as your first step in main. The GNO base sources make use of the
macros __STACK_CHECK__ and __REPORT_STACK to control whether or not
this check is done. You may want to use the same macros.
#include <gno/gno.h>
void main (int argc, char **argv) {
__REPORT_STACK();
... <program continues> ...
The _assertStack routine is typically used in the following manner:
#include <gno/gno.h>
int recurse (int arg) {
int i, j;
/*
* The value 350 was determined through code
* inspection or with the help of lseg(1).
*/
_assertStack(350, __LINE__, __FILE__);
... <routine continues> ...
i = recurse(j);
... <routine continues> ...
return i;
}
AUTHORS
Phillip Vandry <vandry@cam.org> Devin Reade <gdr@gno.org>
HISTORY
The _beginStackCheck and _endStackCheck routines first appeared as
stand-along object file, under the names begin_stack_check and
end_stack_check. They were first incorporated into GNO in v2.0.6.
The _getMinStack and _assertStack routines first appeared in GNO
v2.0.6.
SEE ALSO
lseg(1), occ(1), atexit(3), exit(3).
The ORCA/C Reference Manual, Chapter 12.
GNO 26 March 1998 STACK(3)
Man(1) output converted with
man2html