/[pcre]/code/trunk/sljit/sljitLir.h
ViewVC logotype

Diff of /code/trunk/sljit/sljitLir.h

Parent Directory Parent Directory | Revision Log Revision Log | View Patch Patch

revision 722 by zherczeg, Fri Oct 7 19:18:55 2011 UTC revision 836 by ph10, Wed Dec 28 17:16:11 2011 UTC
# Line 1  Line 1 
1  /*  /*
2   *    Stack-less Just-In-Time compiler   *    Stack-less Just-In-Time compiler
3   *   *
4   *    Copyright 2009-2010 Zoltan Herczeg (hzmester@freemail.hu). All rights reserved.   *    Copyright 2009-2012 Zoltan Herczeg (hzmester@freemail.hu). All rights reserved.
5   *   *
6   * Redistribution and use in source and binary forms, with or without modification, are   * Redistribution and use in source and binary forms, with or without modification, are
7   * permitted provided that the following conditions are met:   * permitted provided that the following conditions are met:
# Line 56  Line 56 
56          - mainly position independent code          - mainly position independent code
57        - Optimizations (perhaps later)        - Optimizations (perhaps later)
58          - Only for basic blocks (when no labels inserted between LIR instructions)          - Only for basic blocks (when no labels inserted between LIR instructions)
59    
60        For valgrind users:
61          - pass --smc-check=all argument to valgrind, since JIT is a "self-modifying code"
62  */  */
63    
64  #if !(defined SLJIT_NO_DEFAULT_CONFIG && SLJIT_NO_DEFAULT_CONFIG)  #if !(defined SLJIT_NO_DEFAULT_CONFIG && SLJIT_NO_DEFAULT_CONFIG)
# Line 87  Line 90 
90    
91  #define SLJIT_UNUSED            0  #define SLJIT_UNUSED            0
92    
93    /* Temporary (scratch) registers may not preserve their values across function calls. */
94  #define SLJIT_TEMPORARY_REG1    1  #define SLJIT_TEMPORARY_REG1    1
95  #define SLJIT_TEMPORARY_REG2    2  #define SLJIT_TEMPORARY_REG2    2
96  #define SLJIT_TEMPORARY_REG3    3  #define SLJIT_TEMPORARY_REG3    3
# Line 95  Line 99 
99  #define SLJIT_TEMPORARY_EREG1   4  #define SLJIT_TEMPORARY_EREG1   4
100  #define SLJIT_TEMPORARY_EREG2   5  #define SLJIT_TEMPORARY_EREG2   5
101    
102    /* General (saved) registers preserve their values across function calls. */
103  #define SLJIT_GENERAL_REG1      6  #define SLJIT_GENERAL_REG1      6
104  #define SLJIT_GENERAL_REG2      7  #define SLJIT_GENERAL_REG2      7
105  #define SLJIT_GENERAL_REG3      8  #define SLJIT_GENERAL_REG3      8
# Line 190  struct sljit_compiler { Line 195  struct sljit_compiler {
195          int local_size;          int local_size;
196          /* Code size. */          /* Code size. */
197          sljit_uw size;          sljit_uw size;
198            /* For statistical purposes. */
199            sljit_uw executable_size;
200    
201  #if (defined SLJIT_CONFIG_X86_32 && SLJIT_CONFIG_X86_32)  #if (defined SLJIT_CONFIG_X86_32 && SLJIT_CONFIG_X86_32)
202          int args;          int args;
# Line 199  struct sljit_compiler { Line 206  struct sljit_compiler {
206    
207  #if (defined SLJIT_CONFIG_X86_64 && SLJIT_CONFIG_X86_64)  #if (defined SLJIT_CONFIG_X86_64 && SLJIT_CONFIG_X86_64)
208          int mode32;          int mode32;
209    #ifdef _WIN64
210            int has_locals;
211    #endif
212  #endif  #endif
213    
214  #if (defined SLJIT_CONFIG_X86_32 && SLJIT_CONFIG_X86_32) || (defined SLJIT_CONFIG_X86_64 && SLJIT_CONFIG_X86_64)  #if (defined SLJIT_CONFIG_X86_32 && SLJIT_CONFIG_X86_32) || (defined SLJIT_CONFIG_X86_64 && SLJIT_CONFIG_X86_64)
# Line 257  struct sljit_compiler { Line 267  struct sljit_compiler {
267    
268  /* Creates an sljit compiler.  /* Creates an sljit compiler.
269     Returns NULL if failed. */     Returns NULL if failed. */
270  struct sljit_compiler* sljit_create_compiler(void);  SLJIT_API_FUNC_ATTRIBUTE struct sljit_compiler* sljit_create_compiler(void);
271  /* Free everything except the codes. */  /* Free everything except the codes. */
272  void sljit_free_compiler(struct sljit_compiler *compiler);  SLJIT_API_FUNC_ATTRIBUTE void sljit_free_compiler(struct sljit_compiler *compiler);
273    
274  static SLJIT_INLINE int sljit_get_compiler_error(struct sljit_compiler *compiler) { return compiler->error; }  static SLJIT_INLINE int sljit_get_compiler_error(struct sljit_compiler *compiler) { return compiler->error; }
275    
# Line 273  static SLJIT_INLINE int sljit_get_compil Line 283  static SLJIT_INLINE int sljit_get_compil
283     but this return value does not indicate that there is no more memory (does     but this return value does not indicate that there is no more memory (does
284     not set the compiler to out-of-memory status).     not set the compiler to out-of-memory status).
285  */  */
286  void* sljit_alloc_memory(struct sljit_compiler *compiler, int size);  SLJIT_API_FUNC_ATTRIBUTE void* sljit_alloc_memory(struct sljit_compiler *compiler, int size);
287    
288  #if (defined SLJIT_VERBOSE && SLJIT_VERBOSE)  #if (defined SLJIT_VERBOSE && SLJIT_VERBOSE)
289  /* Passing NULL disables verbose. */  /* Passing NULL disables verbose. */
290  void sljit_compiler_verbose(struct sljit_compiler *compiler, FILE* verbose);  SLJIT_API_FUNC_ATTRIBUTE void sljit_compiler_verbose(struct sljit_compiler *compiler, FILE* verbose);
291  #endif  #endif
292    
293  void* sljit_generate_code(struct sljit_compiler *compiler);  SLJIT_API_FUNC_ATTRIBUTE void* sljit_generate_code(struct sljit_compiler *compiler);
294  void sljit_free_code(void* code);  SLJIT_API_FUNC_ATTRIBUTE void sljit_free_code(void* code);
295    
296    /*
297       After the code generation we can retrieve the allocated executable memory size,
298       although this area may not be fully filled with instructions depending on some
299       optimizations. This function is useful only for statistical purposes.
300    
301       Before a successful code generation, this function returns with 0.
302    */
303    static SLJIT_INLINE sljit_uw sljit_get_generated_code_size(struct sljit_compiler *compiler) { return compiler->executable_size; }
304    
305  /* Instruction generation. Returns with error code. */  /* Instruction generation. Returns with error code. */
306    
# Line 302  void sljit_free_code(void* code); Line 321  void sljit_free_code(void* code);
321    
322  #define SLJIT_MAX_LOCAL_SIZE    65536  #define SLJIT_MAX_LOCAL_SIZE    65536
323    
324  int sljit_emit_enter(struct sljit_compiler *compiler, int args, int temporaries, int generals, int local_size);  SLJIT_API_FUNC_ATTRIBUTE int sljit_emit_enter(struct sljit_compiler *compiler, int args, int temporaries, int generals, int local_size);
325    
326  /* Since sljit_emit_return (and many asserts) uses variables which are initialized  /* Since sljit_emit_return (and many asserts) uses variables which are initialized
327     by sljit_emit_enter, a simple return is not possible if these variables are not     by sljit_emit_enter, a simple return is not possible if these variables are not
# Line 311  int sljit_emit_enter(struct sljit_compil Line 330  int sljit_emit_enter(struct sljit_compil
330    
331  /* Note: multiple calls of this function overwrites the previous call. */  /* Note: multiple calls of this function overwrites the previous call. */
332    
333  void sljit_fake_enter(struct sljit_compiler *compiler, int args, int temporaries, int generals, int local_size);  SLJIT_API_FUNC_ATTRIBUTE void sljit_fake_enter(struct sljit_compiler *compiler, int args, int temporaries, int generals, int local_size);
334    
335  /* Return from jit. See below the possible values for src and srcw. */  /* Return from jit. See below the possible values for src and srcw. */
336  int sljit_emit_return(struct sljit_compiler *compiler, int src, sljit_w srcw);  SLJIT_API_FUNC_ATTRIBUTE int sljit_emit_return(struct sljit_compiler *compiler, int src, sljit_w srcw);
337    
338  /* Really fast calling method for utility functions inside sljit (see SLJIT_FAST_CALL).  /* Really fast calling method for utility functions inside sljit (see SLJIT_FAST_CALL).
339     All registers and even the stack frame is passed to the callee. The return address is     All registers and even the stack frame is passed to the callee. The return address is
# Line 331  int sljit_emit_return(struct sljit_compi Line 350  int sljit_emit_return(struct sljit_compi
350  /* Note: although sljit_emit_fast_return could be replaced by an ijump, it is not suggested,  /* Note: although sljit_emit_fast_return could be replaced by an ijump, it is not suggested,
351     since many architectures do clever branch prediction on call / return instruction pairs. */     since many architectures do clever branch prediction on call / return instruction pairs. */
352    
353  int sljit_emit_fast_enter(struct sljit_compiler *compiler, int dst, sljit_w dstw, int args, int temporaries, int generals, int local_size);  SLJIT_API_FUNC_ATTRIBUTE int sljit_emit_fast_enter(struct sljit_compiler *compiler, int dst, sljit_w dstw, int args, int temporaries, int generals, int local_size);
354  int sljit_emit_fast_return(struct sljit_compiler *compiler, int src, sljit_w srcw);  SLJIT_API_FUNC_ATTRIBUTE int sljit_emit_fast_return(struct sljit_compiler *compiler, int src, sljit_w srcw);
355    
356  /*  /*
357     Source and destination values for arithmetical instructions     Source and destination values for arithmetical instructions
# Line 427  int sljit_emit_fast_return(struct sljit_ Line 446  int sljit_emit_fast_return(struct sljit_
446           it can even decrease the runtime in a few cases. */           it can even decrease the runtime in a few cases. */
447  #define SLJIT_NOP                       1  #define SLJIT_NOP                       1
448    
449  int sljit_emit_op0(struct sljit_compiler *compiler, int op);  SLJIT_API_FUNC_ATTRIBUTE int sljit_emit_op0(struct sljit_compiler *compiler, int op);
450    
451  /* Notes for MOV instructions:  /* Notes for MOV instructions:
452     U = Mov with update (post form). If source or destination defined as SLJIT_MEM1(r1)     U = Mov with update (post form). If source or destination defined as SLJIT_MEM1(r1)
# Line 473  int sljit_emit_op0(struct sljit_compiler Line 492  int sljit_emit_op0(struct sljit_compiler
492     Flags: I | E | K */     Flags: I | E | K */
493  #define SLJIT_CLZ                       18  #define SLJIT_CLZ                       18
494    
495  int sljit_emit_op1(struct sljit_compiler *compiler, int op,  SLJIT_API_FUNC_ATTRIBUTE int sljit_emit_op1(struct sljit_compiler *compiler, int op,
496          int dst, sljit_w dstw,          int dst, sljit_w dstw,
497          int src, sljit_w srcw);          int src, sljit_w srcw);
498    
# Line 501  int sljit_emit_op1(struct sljit_compiler Line 520  int sljit_emit_op1(struct sljit_compiler
520  /* Flags: I | E | K */  /* Flags: I | E | K */
521  #define SLJIT_ASHR                      29  #define SLJIT_ASHR                      29
522    
523  int sljit_emit_op2(struct sljit_compiler *compiler, int op,  SLJIT_API_FUNC_ATTRIBUTE int sljit_emit_op2(struct sljit_compiler *compiler, int op,
524          int dst, sljit_w dstw,          int dst, sljit_w dstw,
525          int src1, sljit_w src1w,          int src1, sljit_w src1w,
526          int src2, sljit_w src2w);          int src2, sljit_w src2w);
527    
528  int sljit_is_fpu_available(void);  SLJIT_API_FUNC_ATTRIBUTE int sljit_is_fpu_available(void);
529    
530  /* Note: dst is the left and src is the right operand for SLJIT_FCMP.  /* Note: dst is the left and src is the right operand for SLJIT_FCMP.
531     Note: NaN check is always performed. If SLJIT_C_FLOAT_NAN is set,     Note: NaN check is always performed. If SLJIT_C_FLOAT_NAN is set,
# Line 520  int sljit_is_fpu_available(void); Line 539  int sljit_is_fpu_available(void);
539  /* Flags: - (never set any flags) */  /* Flags: - (never set any flags) */
540  #define SLJIT_FABS                      33  #define SLJIT_FABS                      33
541    
542  int sljit_emit_fop1(struct sljit_compiler *compiler, int op,  SLJIT_API_FUNC_ATTRIBUTE int sljit_emit_fop1(struct sljit_compiler *compiler, int op,
543          int dst, sljit_w dstw,          int dst, sljit_w dstw,
544          int src, sljit_w srcw);          int src, sljit_w srcw);
545    
# Line 533  int sljit_emit_fop1(struct sljit_compile Line 552  int sljit_emit_fop1(struct sljit_compile
552  /* Flags: - (never set any flags) */  /* Flags: - (never set any flags) */
553  #define SLJIT_FDIV                      37  #define SLJIT_FDIV                      37
554    
555  int sljit_emit_fop2(struct sljit_compiler *compiler, int op,  SLJIT_API_FUNC_ATTRIBUTE int sljit_emit_fop2(struct sljit_compiler *compiler, int op,
556          int dst, sljit_w dstw,          int dst, sljit_w dstw,
557          int src1, sljit_w src1w,          int src1, sljit_w src1w,
558          int src2, sljit_w src2w);          int src2, sljit_w src2w);
559    
560  /* Label and jump instructions. */  /* Label and jump instructions. */
561    
562  struct sljit_label* sljit_emit_label(struct sljit_compiler *compiler);  SLJIT_API_FUNC_ATTRIBUTE struct sljit_label* sljit_emit_label(struct sljit_compiler *compiler);
563    
564  /* Invert conditional instruction: xor (^) with 0x1 */  /* Invert conditional instruction: xor (^) with 0x1 */
565  #define SLJIT_C_EQUAL                   0  #define SLJIT_C_EQUAL                   0
# Line 589  struct sljit_label* sljit_emit_label(str Line 608  struct sljit_label* sljit_emit_label(str
608      type can be combined (or'ed) with SLJIT_REWRITABLE_JUMP      type can be combined (or'ed) with SLJIT_REWRITABLE_JUMP
609     Flags: - (never set any flags) for both conditional and unconditional jumps.     Flags: - (never set any flags) for both conditional and unconditional jumps.
610     Flags: destroy all flags for calls. */     Flags: destroy all flags for calls. */
611  struct sljit_jump* sljit_emit_jump(struct sljit_compiler *compiler, int type);  SLJIT_API_FUNC_ATTRIBUTE struct sljit_jump* sljit_emit_jump(struct sljit_compiler *compiler, int type);
612    
613  /* Basic arithmetic comparison. In most architectures it is equal to  /* Basic arithmetic comparison. In most architectures it is equal to
614     an SLJIT_SUB operation (with SLJIT_UNUSED destination) followed by a     an SLJIT_SUB operation (with SLJIT_UNUSED destination) followed by a
# Line 599  struct sljit_jump* sljit_emit_jump(struc Line 618  struct sljit_jump* sljit_emit_jump(struc
618      type must be between SLJIT_C_EQUAL and SLJIT_C_SIG_LESS_EQUAL      type must be between SLJIT_C_EQUAL and SLJIT_C_SIG_LESS_EQUAL
619      type can be combined (or'ed) with SLJIT_REWRITABLE_JUMP or SLJIT_INT_OP      type can be combined (or'ed) with SLJIT_REWRITABLE_JUMP or SLJIT_INT_OP
620     Flags: destroy flags. */     Flags: destroy flags. */
621  struct sljit_jump* sljit_emit_cmp(struct sljit_compiler *compiler, int type,  SLJIT_API_FUNC_ATTRIBUTE struct sljit_jump* sljit_emit_cmp(struct sljit_compiler *compiler, int type,
622          int src1, sljit_w src1w,          int src1, sljit_w src1w,
623          int src2, sljit_w src2w);          int src2, sljit_w src2w);
624    
625  /* Set the destination of the jump to this label. */  /* Set the destination of the jump to this label. */
626  void sljit_set_label(struct sljit_jump *jump, struct sljit_label* label);  SLJIT_API_FUNC_ATTRIBUTE void sljit_set_label(struct sljit_jump *jump, struct sljit_label* label);
627  /* Only for jumps defined with SLJIT_REWRITABLE_JUMP flag.  /* Only for jumps defined with SLJIT_REWRITABLE_JUMP flag.
628     Note: use sljit_emit_ijump for fixed jumps. */     Note: use sljit_emit_ijump for fixed jumps. */
629  void sljit_set_target(struct sljit_jump *jump, sljit_uw target);  SLJIT_API_FUNC_ATTRIBUTE void sljit_set_target(struct sljit_jump *jump, sljit_uw target);
630    
631  /* Call function or jump anywhere. Both direct and indirect form  /* Call function or jump anywhere. Both direct and indirect form
632      type must be between SLJIT_JUMP and SLJIT_CALL3      type must be between SLJIT_JUMP and SLJIT_CALL3
# Line 615  void sljit_set_target(struct sljit_jump Line 634  void sljit_set_target(struct sljit_jump
634      Indirect form: any other valid addressing mode      Indirect form: any other valid addressing mode
635     Flags: - (never set any flags) for unconditional jumps.     Flags: - (never set any flags) for unconditional jumps.
636     Flags: destroy all flags for calls. */     Flags: destroy all flags for calls. */
637  int sljit_emit_ijump(struct sljit_compiler *compiler, int type, int src, sljit_w srcw);  SLJIT_API_FUNC_ATTRIBUTE int sljit_emit_ijump(struct sljit_compiler *compiler, int type, int src, sljit_w srcw);
638    
639  /* If op == SLJIT_MOV:  /* If op == SLJIT_MOV:
640       Set dst to 1 if condition is fulfilled, 0 otherwise       Set dst to 1 if condition is fulfilled, 0 otherwise
# Line 626  int sljit_emit_ijump(struct sljit_compil Line 645  int sljit_emit_ijump(struct sljit_compil
645       the condition is fulfilled. Otherwise it does nothing.       the condition is fulfilled. Otherwise it does nothing.
646       Flags: E | K       Flags: E | K
647     Note: sljit_emit_cond_value does nothing, if dst is SLJIT_UNUSED (regardless of op). */     Note: sljit_emit_cond_value does nothing, if dst is SLJIT_UNUSED (regardless of op). */
648  int sljit_emit_cond_value(struct sljit_compiler *compiler, int op, int dst, sljit_w dstw, int type);  SLJIT_API_FUNC_ATTRIBUTE int sljit_emit_cond_value(struct sljit_compiler *compiler, int op, int dst, sljit_w dstw, int type);
649    
650  /* The constant can be changed runtime (see: sljit_set_const)  /* The constant can be changed runtime (see: sljit_set_const)
651     Flags: - (never set any flags) */     Flags: - (never set any flags) */
652  struct sljit_const* sljit_emit_const(struct sljit_compiler *compiler, int dst, sljit_w dstw, sljit_w init_value);  SLJIT_API_FUNC_ATTRIBUTE struct sljit_const* sljit_emit_const(struct sljit_compiler *compiler, int dst, sljit_w dstw, sljit_w init_value);
653    
654  /* After the code generation the address for label, jump and const instructions  /* After the code generation the address for label, jump and const instructions
655     are computed. Since these structures are freed sljit_free_compiler, the     are computed. Since these structures are freed sljit_free_compiler, the
# Line 640  static SLJIT_INLINE sljit_uw sljit_get_j Line 659  static SLJIT_INLINE sljit_uw sljit_get_j
659  static SLJIT_INLINE sljit_uw sljit_get_const_addr(struct sljit_const *const_) { return const_->addr; }  static SLJIT_INLINE sljit_uw sljit_get_const_addr(struct sljit_const *const_) { return const_->addr; }
660    
661  /* Only the address is required to rewrite the code. */  /* Only the address is required to rewrite the code. */
662  void sljit_set_jump_addr(sljit_uw addr, sljit_uw new_addr);  SLJIT_API_FUNC_ATTRIBUTE void sljit_set_jump_addr(sljit_uw addr, sljit_uw new_addr);
663  void sljit_set_const(sljit_uw addr, sljit_w new_constant);  SLJIT_API_FUNC_ATTRIBUTE void sljit_set_const(sljit_uw addr, sljit_w new_constant);
664    
665  /* --------------------------------------------------------------------- */  /* --------------------------------------------------------------------- */
666  /*  Miscellaneous utility functions                                      */  /*  Miscellaneous utility functions                                      */
# Line 653  void sljit_set_const(sljit_uw addr, slji Line 672  void sljit_set_const(sljit_uw addr, slji
672  /* Get the human readable name of the platfrom.  /* Get the human readable name of the platfrom.
673     Can be useful for debugging on platforms like ARM, where ARM and     Can be useful for debugging on platforms like ARM, where ARM and
674     Thumb2 functions can be mixed. */     Thumb2 functions can be mixed. */
675  SLJIT_CONST char* sljit_get_platform_name(void);  SLJIT_API_FUNC_ATTRIBUTE SLJIT_CONST char* sljit_get_platform_name(void);
676    
677  /* Portble helper function to get an offset of a member. */  /* Portble helper function to get an offset of a member. */
678  #define SLJIT_OFFSETOF(base, member)    ((sljit_w)(&((base*)0x10)->member) - 0x10)  #define SLJIT_OFFSETOF(base, member)    ((sljit_w)(&((base*)0x10)->member) - 0x10)
679    
680  #if (defined SLJIT_UTIL_GLOBAL_LOCK && SLJIT_UTIL_GLOBAL_LOCK)  #if (defined SLJIT_UTIL_GLOBAL_LOCK && SLJIT_UTIL_GLOBAL_LOCK)
681  /* This global lock is useful to compile common functions. */  /* This global lock is useful to compile common functions. */
682  void SLJIT_CALL sljit_grab_lock(void);  SLJIT_API_FUNC_ATTRIBUTE void SLJIT_CALL sljit_grab_lock(void);
683  void SLJIT_CALL sljit_release_lock(void);  SLJIT_API_FUNC_ATTRIBUTE void SLJIT_CALL sljit_release_lock(void);
684  #endif  #endif
685    
686  #if (defined SLJIT_UTIL_STACK && SLJIT_UTIL_STACK)  #if (defined SLJIT_UTIL_STACK && SLJIT_UTIL_STACK)
# Line 696  struct sljit_stack { Line 715  struct sljit_stack {
715  /* Returns NULL if unsuccessful.  /* Returns NULL if unsuccessful.
716     Note: limit and max_limit contains the size for stack allocation     Note: limit and max_limit contains the size for stack allocation
717     Note: the top field is initialized to base. */     Note: the top field is initialized to base. */
718  struct sljit_stack* SLJIT_CALL sljit_allocate_stack(sljit_w limit, sljit_w max_limit);  SLJIT_API_FUNC_ATTRIBUTE struct sljit_stack* SLJIT_CALL sljit_allocate_stack(sljit_uw limit, sljit_uw max_limit);
719  void SLJIT_CALL sljit_free_stack(struct sljit_stack* stack);  SLJIT_API_FUNC_ATTRIBUTE void SLJIT_CALL sljit_free_stack(struct sljit_stack* stack);
720    
721  /* Can be used to increase (allocate) or decrease (free) the memory area.  /* Can be used to increase (allocate) or decrease (free) the memory area.
722     Returns with a non-zero value if unsuccessful. If new_limit is greater than     Returns with a non-zero value if unsuccessful. If new_limit is greater than
# Line 705  void SLJIT_CALL sljit_free_stack(struct Line 724  void SLJIT_CALL sljit_free_stack(struct
724     since the growth ratio can be added to the current limit, and sljit_stack_resize     since the growth ratio can be added to the current limit, and sljit_stack_resize
725     will do all the necessary checks. The fields of the stack are not changed if     will do all the necessary checks. The fields of the stack are not changed if
726     sljit_stack_resize fails. */     sljit_stack_resize fails. */
727  sljit_w SLJIT_CALL sljit_stack_resize(struct sljit_stack* stack, sljit_uw new_limit);  SLJIT_API_FUNC_ATTRIBUTE sljit_w SLJIT_CALL sljit_stack_resize(struct sljit_stack* stack, sljit_uw new_limit);
728    
729  #endif /* (defined SLJIT_UTIL_STACK && SLJIT_UTIL_STACK) */  #endif /* (defined SLJIT_UTIL_STACK && SLJIT_UTIL_STACK) */
730    
# Line 730  struct sljit_function_context { Line 749  struct sljit_function_context {
749  /* Fill the context arguments using the addr and the function.  /* Fill the context arguments using the addr and the function.
750     If func_ptr is NULL, it will not be set to the address of context     If func_ptr is NULL, it will not be set to the address of context
751     If addr is NULL, the function address also comes from the func pointer. */     If addr is NULL, the function address also comes from the func pointer. */
752  void sljit_set_function_context(void** func_ptr, struct sljit_function_context* context, sljit_w addr, void* func);  SLJIT_API_FUNC_ATTRIBUTE void sljit_set_function_context(void** func_ptr, struct sljit_function_context* context, sljit_w addr, void* func);
753    
754  #endif /* !(defined SLJIT_INDIRECT_CALL && SLJIT_INDIRECT_CALL) */  #endif /* !(defined SLJIT_INDIRECT_CALL && SLJIT_INDIRECT_CALL) */
755    

Legend:
Removed from v.722  
changed lines
  Added in v.836

  ViewVC Help
Powered by ViewVC 1.1.5