/*
* jit-walk.h - Functions for walking stack frames.
*
* Copyright (C) 2004 Southern Storm Software, Pty Ltd.
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/
#ifndef _JIT_WALK_H
#define _JIT_WALK_H
#ifdef __cplusplus
extern "C" {
#endif
/*
* Get the frame address for a frame which is "n" levels up the stack.
* A level value of zero indicates the current frame.
*/
void *_jit_get_frame_address(void *start, unsigned int n);
#if defined(__GNUC__)
#define jit_get_frame_address(n) \
(_jit_get_frame_address(__builtin_frame_address(0), (n)))
#else
#define jit_get_frame_address(n) (_jit_get_frame_address(0, (n)))
#endif
/*
* Get the frame address for the current frame. May be more efficient
* than using "jit_get_frame_address(0)".
*/
#if defined(__GNUC__)
#define jit_get_current_frame() (__builtin_frame_address(0))
#else
#define jit_get_current_frame() (jit_get_frame_address(0))
#endif
/*
* Get the next frame up the stack from a specified frame.
* Returns NULL if it isn't possible to retrieve the next frame.
*/
void *jit_get_next_frame_address(void *frame);
/*
* Get the return address for a specific frame.
*/
void *_jit_get_return_address(void *frame, void *frame0, void *return0);
#if defined(__GNUC__)
#define jit_get_return_address(frame) \
(_jit_get_return_address \
((frame), __builtin_frame_address(0), __builtin_return_address(0)))
#else
#define jit_get_return_address(frame) \
(_jit_get_return_address((frame), 0, 0))
#endif
/*
* Get the return address for the current frame. May be more efficient
* than using "jit_get_return_address(0)".
*/
#if defined(__GNUC__)
#define jit_get_current_return() (__builtin_return_address(0))
#else
#define jit_get_current_return() \
(jit_get_return_address(jit_get_current_frame()))
#endif
/*
* Declare a stack crawl mark variable. The address of this variable
* can be passed to "jit_frame_contains_crawl_mark" to determine
* if a frame contains the mark.
*/
typedef struct { void * volatile mark; } jit_crawl_mark_t;
#define jit_declare_crawl_mark(name) jit_crawl_mark_t name = {0}
/*
* Determine if the stack frame just above "frame" contains a
* particular crawl mark.
*/
int jit_frame_contains_crawl_mark(void *frame, jit_crawl_mark_t *mark);
#ifdef __cplusplus
};
#endif
#endif /* _JIT_WALK_H */
syntax highlighted by Code2HTML, v. 0.9.1