#ifndef _JIT_WALK_H
#define _JIT_WALK_H
#include <jit/jit-arch.h>
#ifdef __cplusplus
extern "C" {
#endif
void *_jit_get_frame_address(void *start, unsigned int n);
#if defined(__GNUC__)
# define jit_get_frame_address(n) \
(_jit_get_frame_address(jit_get_current_frame(), (n)))
#else
# define jit_get_frame_address(n) (_jit_get_frame_address(0, (n)))
#endif
#if defined(__GNUC__)
# define JIT_FAST_GET_CURRENT_FRAME 1
# if defined(_JIT_ARCH_GET_CURRENT_FRAME)
# define jit_get_current_frame() \
({ \
void *address; \
_JIT_ARCH_GET_CURRENT_FRAME(address); \
address; \
})
# else
# define jit_get_current_frame() (__builtin_frame_address(0))
# endif
#else
# define JIT_FAST_GET_CURRENT_FRAME 0
# define jit_get_current_frame() (jit_get_frame_address(0))
#endif
void *_jit_get_next_frame_address(void *frame);
#if defined(__GNUC__) && defined(_JIT_ARCH_GET_NEXT_FRAME)
# define jit_get_next_frame_address(frame) \
({ \
void *address; \
_JIT_ARCH_GET_NEXT_FRAME(address, (frame)); \
address; \
})
#else
# define jit_get_next_frame_address(frame) \
(_jit_get_next_frame_address(frame))
#endif
void *_jit_get_return_address(void *frame, void *frame0, void *return0);
#if defined(__GNUC__)
# if defined(_JIT_ARCH_GET_RETURN_ADDRESS)
# define jit_get_return_address(frame) \
({ \
void *address; \
_JIT_ARCH_GET_RETURN_ADDRESS(address, (frame)); \
address; \
})
# else
# define jit_get_return_address(frame) \
(_jit_get_return_address \
((frame), \
__builtin_frame_address(0), \
__builtin_return_address(0)))
# endif
#else
# define jit_get_return_address(frame) \
(_jit_get_return_address((frame), 0, 0))
#endif
#if defined(__GNUC__)
# if defined(_JIT_ARCH_GET_CURRENT_RETURN)
# define jit_get_current_return() \
({ \
void *address; \
_JIT_ARCH_GET_CURRENT_RETURN(address); \
address; \
})
# else
# define jit_get_current_return() (__builtin_return_address(0))
# endif
#else
# define jit_get_current_return() \
(jit_get_return_address(jit_get_current_frame()))
#endif
typedef struct { void * volatile mark; } jit_crawl_mark_t;
#define jit_declare_crawl_mark(name) jit_crawl_mark_t name = {0}
int jit_frame_contains_crawl_mark(void *frame, jit_crawl_mark_t *mark);
#ifdef __cplusplus
};
#endif
#endif