Home | History | Annotate | Download | only in qemu
      1 /*
      2  *  Host code generation
      3  *
      4  *  Copyright (c) 2003 Fabrice Bellard
      5  *
      6  * This library is free software; you can redistribute it and/or
      7  * modify it under the terms of the GNU Lesser General Public
      8  * License as published by the Free Software Foundation; either
      9  * version 2 of the License, or (at your option) any later version.
     10  *
     11  * This 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 this library; if not, write to the Free Software
     18  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
     19  */
     20 #include <stdarg.h>
     21 #include <stdlib.h>
     22 #include <stdio.h>
     23 #include <string.h>
     24 #include <inttypes.h>
     25 
     26 #include "config.h"
     27 
     28 enum {
     29 #define DEF(s, n, copy_size) INDEX_op_ ## s,
     30 #ifdef GEN_TRACE
     31 #include "opc-trace.h"
     32 #else
     33 #include "opc.h"
     34 #endif
     35 #undef DEF
     36     NB_OPS,
     37 };
     38 
     39 #include "dyngen.h"
     40 #ifdef GEN_TRACE
     41 #define   dyngen_code   _trace_dyngen_code
     42 #include "op-trace.h"
     43 #else
     44 #define   dyngen_code  _default_dyngen_code
     45 #include "op.h"
     46 #endif
     47 
     48 typedef int (*dyngen_code_func)(uint8_t *gen_code_buf,
     49                 uint16_t *label_offsets, uint16_t *jmp_offsets,
     50                 const uint16_t *opc_buf, const uint32_t *opparam_buf, const long *gen_labels);
     51 
     52 extern dyngen_code_func  _dyngen_code;
     53 
     54 #ifdef GEN_TRACE
     55 
     56 void  qemu_trace_enable_dyngen( void )
     57 {
     58     _dyngen_code = dyngen_code;
     59 }
     60 
     61 #else
     62 
     63 void  qemu_trace_disable_dyngen( void )
     64 {
     65     _dyngen_code = dyngen_code;
     66 }
     67 
     68 dyngen_code_func  _dyngen_code = _default_dyngen_code;
     69 
     70 #undef  dyngen_code
     71 
     72 int dyngen_code(uint8_t *gen_code_buf,
     73                 uint16_t *label_offsets, uint16_t *jmp_offsets,
     74                 const uint16_t *opc_buf, const uint32_t *opparam_buf, const long *gen_labels)
     75 {
     76     return (*_dyngen_code)(gen_code_buf, label_offsets, jmp_offsets, opc_buf, opparam_buf, gen_labels);
     77 }
     78 
     79 #endif
     80 
     81 
     82