github.com/goccy/go-jit@v0.0.0-20200514131505-ff78d45cf6af/internal/ccall/include/jit/jit-arch.h (about)

     1  /*
     2   * jit-arch-x86.h - Architecture-specific definitions.
     3   *
     4   * Copyright (C) 2008  Southern Storm Software, Pty Ltd.
     5   *
     6   * The libjit library is free software: you can redistribute it and/or
     7   * modify it under the terms of the GNU Lesser General Public License
     8   * as published by the Free Software Foundation, either version 2.1 of
     9   * the License, or (at your option) any later version.
    10   *
    11   * The libjit library is distributed in the hope that it will be useful,
    12   * but WITHOUT ANY WARRANTY; without even the implied warranty of
    13   * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
    14   * Lesser General Public License for more details.
    15   *
    16   * You should have received a copy of the GNU Lesser General Public
    17   * License along with the libjit library.  If not, see
    18   * <http://www.gnu.org/licenses/>.
    19   */
    20  
    21  #ifndef	_JIT_ARCH_X86_64_H
    22  #define	_JIT_ARCH_X86_64_H
    23  
    24  /*
    25   * The frame header structure for X86_64
    26   */
    27  typedef struct _jit_arch_frame _jit_arch_frame_t;
    28  struct _jit_arch_frame
    29  {
    30  	_jit_arch_frame_t *next_frame;
    31  	void *return_address;
    32  };
    33  
    34  /*
    35   * If defined _JIT_ARCH_GET_CURRENT_FRAME() macro assigns the current frame
    36   * pointer to the supplied argument that has to be a void pointer.
    37   */
    38  #if defined(__GNUC__)
    39  #define _JIT_ARCH_GET_CURRENT_FRAME(f)		\
    40  	do {					\
    41  		register void *__f asm("rbp");	\
    42  		f = __f;			\
    43  	} while(0)
    44  #elif defined(_MSC_VER) && defined(_M_IX86)
    45  #define	_JIT_ARCH_GET_CURRENT_FRAME(f)		\
    46  	do {					\
    47  		void *__ptr;			\
    48  		__asm				\
    49  		{				\
    50  			__asm mov qword ptr __ptr, rbp	\
    51  		}				\
    52  		(f) = __ptr;			\
    53  	} while(0)
    54  #else
    55  #undef _JIT_ARCH_GET_CURRENT_FRAME
    56  #endif
    57  
    58  /*
    59   * If defined _JIT_ARCH_GET_NEXT_FRAME() assigns the frame address following
    60   * the frame supplied as second arg to the value supplied as first argument.
    61   */
    62  #define _JIT_ARCH_GET_NEXT_FRAME(n, f)							\
    63  	do {										\
    64  		(n) = (void *)((f) ? ((_jit_arch_frame_t *)(f))->next_frame : 0);	\
    65  	} while(0)
    66  
    67  /*
    68   * If defined _JIT_ARCH_GET_RETURN_ADDRESS() assigns the return address of
    69   * the frame supplied as second arg to the value supplied as first argument.
    70   */
    71  #define _JIT_ARCH_GET_RETURN_ADDRESS(r, f)						\
    72  	do {										\
    73  		(r) = (void *)((f) ? ((_jit_arch_frame_t *)(f))->return_address : 0);	\
    74  	} while(0)
    75  
    76  /*
    77   * If defined _JIT_ARCH_GET_CURRENT_RETURN() assigns the return address of
    78   * the current to the supplied argument.
    79   */
    80  #define _JIT_ARCH_GET_CURRENT_RETURN(r)				\
    81  	do {							\
    82  		void *__frame;					\
    83  		_JIT_ARCH_GET_CURRENT_FRAME(__frame);		\
    84  		_JIT_ARCH_GET_RETURN_ADDRESS((r), __frame);	\
    85  	} while(0)
    86  
    87  #endif /* _JIT_ARCH_X86_64_H */