mirror of https://github.com/ademakov/libjit
Aleksey Demakov
17 years ago
5 changed files with 122 additions and 1 deletions
@ -0,0 +1,81 @@ |
|||||
|
/*
|
||||
|
* jit-arch-x86.h - Architecture-specific definitions. |
||||
|
* |
||||
|
* Copyright (C) 2008 Southern Storm Software, Pty Ltd. |
||||
|
* |
||||
|
* The libjit library is free software: you can redistribute it and/or |
||||
|
* modify it under the terms of the GNU Lesser General Public License |
||||
|
* as published by the Free Software Foundation, either version 2.1 of |
||||
|
* the License, or (at your option) any later version. |
||||
|
* |
||||
|
* The libjit library 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 |
||||
|
* Lesser General Public License for more details. |
||||
|
* |
||||
|
* You should have received a copy of the GNU Lesser General Public |
||||
|
* License along with the libjit library. If not, see |
||||
|
* <http://www.gnu.org/licenses/>.
|
||||
|
*/ |
||||
|
|
||||
|
#ifndef _JIT_ARCH_X86_64_H |
||||
|
#define _JIT_ARCH_X86_64_H |
||||
|
|
||||
|
/*
|
||||
|
* The frame header structure for X86_64 |
||||
|
*/ |
||||
|
typedef struct _jit_arch_frame _jit_arch_frame_t; |
||||
|
struct _jit_arch_frame |
||||
|
{ |
||||
|
_jit_arch_frame_t *next_frame; |
||||
|
void *return_address; |
||||
|
}; |
||||
|
|
||||
|
/*
|
||||
|
* If defined _JIT_ARCH_GET_CURRENT_FRAME() macro assigns the current frame |
||||
|
* pointer to the supplied argument that has to be a void pointer. |
||||
|
*/ |
||||
|
#if defined(__GNUC__) |
||||
|
#define _JIT_ARCH_GET_CURRENT_FRAME(f) \ |
||||
|
do { \ |
||||
|
register void *__f asm("rbp"); \ |
||||
|
f = __f; \ |
||||
|
} while(0) |
||||
|
#elif defined(_MSC_VER) && defined(_M_IX86) |
||||
|
#define _JIT_ARCH_GET_CURRENT_FRAME(f) \ |
||||
|
do { \ |
||||
|
__asm \ |
||||
|
{ \ |
||||
|
mov qword ptr f, rbp \ |
||||
|
} \ |
||||
|
} while(0) |
||||
|
#else |
||||
|
#undef _JIT_ARCH_GET_CURRENT_FRAME |
||||
|
#endif |
||||
|
|
||||
|
/*
|
||||
|
* If defined _JIT_ARCH_GET_NEXT_FRAME assigns the frame address following |
||||
|
* the frame supplied as second arg to the value supplied as first argument. |
||||
|
*/ |
||||
|
#define _JIT_ARCH_GET_NEXT_FRAME(n, f) \ |
||||
|
do { \ |
||||
|
(n) = (void *)((f) ? ((_jit_arch_frame_t *)(f))->next_frame : 0); \ |
||||
|
} while(0) |
||||
|
|
||||
|
/*
|
||||
|
* If defined _JIT_ARCH_GET_RETURN_ADDRESS assigns the return address of the frame |
||||
|
* supplied as second arg to the value supplied as first argument. |
||||
|
*/ |
||||
|
#define _JIT_ARCH_GET_RETURN_ADDRESS(r, f) \ |
||||
|
do { \ |
||||
|
(r) = (void *)((f) ? ((_jit_arch_frame_t *)(f))->return_address : 0); \ |
||||
|
} while(0) |
||||
|
|
||||
|
#define _JIT_ARCH_GET_CURRENT_RETURN(r) \ |
||||
|
do { \ |
||||
|
void *__frame; \ |
||||
|
_JIT_ARCH_GET_CURRENT_FRAME(__frame); \ |
||||
|
_JIT_ARCH_GET_RETURN_ADDRESS((r), __frame); \ |
||||
|
} while(0) |
||||
|
|
||||
|
#endif /* _JIT_ARCH_X86_64_H */ |
Loading…
Reference in new issue