qemu/scripts/tracetool/transform.py
<<
>>
Prefs
   1#!/usr/bin/env python
   2# -*- coding: utf-8 -*-
   3
   4"""
   5Type-transformation rules.
   6"""
   7
   8__author__     = "Lluís Vilanova <vilanova@ac.upc.edu>"
   9__copyright__  = "Copyright 2012-2016, Lluís Vilanova <vilanova@ac.upc.edu>"
  10__license__    = "GPL version 2 or (at your option) any later version"
  11
  12__maintainer__ = "Stefan Hajnoczi"
  13__email__      = "stefanha@linux.vnet.ibm.com"
  14
  15
  16def _transform_type(type_, trans):
  17    if isinstance(trans, str):
  18        return trans
  19    elif isinstance(trans, dict):
  20        if type_ in trans:
  21            return _transform_type(type_, trans[type_])
  22        elif None in trans:
  23            return _transform_type(type_, trans[None])
  24        else:
  25            return type_
  26    elif callable(trans):
  27        return trans(type_)
  28    else:
  29        raise ValueError("Invalid type transformation rule: %s" % trans)
  30
  31
  32def transform_type(type_, *trans):
  33    """Return a new type transformed according to the given rules.
  34
  35    Applies each of the transformation rules in trans in order.
  36
  37    If an element of trans is a string, return it.
  38
  39    If an element of trans is a function, call it with type_ as its only
  40    argument.
  41
  42    If an element of trans is a dict, search type_ in its keys. If type_ is
  43    a key, use the value as a transformation rule for type_. Otherwise, if
  44    None is a key use the value as a transformation rule for type_.
  45
  46    Otherwise, return type_.
  47
  48    Parameters
  49    ----------
  50    type_ : str
  51        Type to transform.
  52    trans : list of function or dict
  53        Type transformation rules.
  54    """
  55    if len(trans) == 0:
  56        raise ValueError
  57    res = type_
  58    for t in trans:
  59        res = _transform_type(res, t)
  60    return res
  61
  62
  63##################################################
  64# tcg -> host
  65
  66def _tcg_2_host(type_):
  67    if type_ == "TCGv":
  68        # force a fixed-size type (target-independent)
  69        return "uint64_t"
  70    else:
  71        return type_
  72
  73TCG_2_HOST = {
  74    "TCGv_i32": "uint32_t",
  75    "TCGv_i64": "uint64_t",
  76    "TCGv_ptr": "void *",
  77    None: _tcg_2_host,
  78    }
  79
  80
  81##################################################
  82# host -> host compatible with tcg sizes
  83
  84HOST_2_TCG_COMPAT = {
  85    "uint8_t": "uint32_t",
  86    }
  87
  88
  89##################################################
  90# host/tcg -> tcg
  91
  92def _host_2_tcg(type_):
  93    if type_.startswith("TCGv"):
  94        return type_
  95    raise ValueError("Don't know how to translate '%s' into a TCG type\n" % type_)
  96
  97HOST_2_TCG = {
  98    "uint32_t": "TCGv_i32",
  99    "uint64_t": "TCGv_i64",
 100    "void *"  : "TCGv_ptr",
 101    "CPUArchState *": "TCGv_env",
 102    None: _host_2_tcg,
 103    }
 104
 105
 106##################################################
 107# tcg -> tcg helper definition
 108
 109def _tcg_2_helper_def(type_):
 110    if type_ == "TCGv":
 111        return "target_ulong"
 112    else:
 113        return type_
 114
 115TCG_2_TCG_HELPER_DEF = {
 116    "TCGv_i32": "uint32_t",
 117    "TCGv_i64": "uint64_t",
 118    "TCGv_ptr": "void *",
 119    None: _tcg_2_helper_def,
 120    }
 121
 122
 123##################################################
 124# tcg -> tcg helper declaration
 125
 126def _tcg_2_tcg_helper_decl_error(type_):
 127    raise ValueError("Don't know how to translate type '%s' into a TCG helper declaration type\n" % type_)
 128
 129TCG_2_TCG_HELPER_DECL = {
 130    "TCGv"    : "tl",
 131    "TCGv_ptr": "ptr",
 132    "TCGv_i32": "i32",
 133    "TCGv_i64": "i64",
 134    "TCGv_env": "env",
 135    None: _tcg_2_tcg_helper_decl_error,
 136    }
 137
 138
 139##################################################
 140# host/tcg -> tcg temporal constant allocation
 141
 142def _host_2_tcg_tmp_new(type_):
 143    if type_.startswith("TCGv"):
 144        return "tcg_temp_new_nop"
 145    raise ValueError("Don't know how to translate type '%s' into a TCG temporal allocation" % type_)
 146
 147HOST_2_TCG_TMP_NEW = {
 148    "uint32_t": "tcg_const_i32",
 149    "uint64_t": "tcg_const_i64",
 150    "void *"  : "tcg_const_ptr",
 151    None: _host_2_tcg_tmp_new,
 152    }
 153
 154
 155##################################################
 156# host/tcg -> tcg temporal constant deallocation
 157
 158def _host_2_tcg_tmp_free(type_):
 159    if type_.startswith("TCGv"):
 160        return "tcg_temp_free_nop"
 161    raise ValueError("Don't know how to translate type '%s' into a TCG temporal deallocation" % type_)
 162
 163HOST_2_TCG_TMP_FREE = {
 164    "uint32_t": "tcg_temp_free_i32",
 165    "uint64_t": "tcg_temp_free_i64",
 166    "void *"  : "tcg_temp_free_ptr",
 167    None: _host_2_tcg_tmp_free,
 168    }
 169