xref: /openbmc/qemu/scripts/tracetool/backend/__init__.py (revision 650ab98d1d9551f0ca2180c0d88427acfcb081cf)
1*650ab98dSLluís Vilanova#!/usr/bin/env python
2*650ab98dSLluís Vilanova# -*- coding: utf-8 -*-
3*650ab98dSLluís Vilanova
4*650ab98dSLluís Vilanova"""
5*650ab98dSLluís VilanovaBackend management.
6*650ab98dSLluís Vilanova
7*650ab98dSLluís Vilanova
8*650ab98dSLluís VilanovaCreating new backends
9*650ab98dSLluís Vilanova---------------------
10*650ab98dSLluís Vilanova
11*650ab98dSLluís VilanovaA new backend named 'foo-bar' corresponds to Python module
12*650ab98dSLluís Vilanova'tracetool/backend/foo_bar.py'.
13*650ab98dSLluís Vilanova
14*650ab98dSLluís VilanovaA backend module should provide a docstring, whose first non-empty line will be
15*650ab98dSLluís Vilanovaconsidered its short description.
16*650ab98dSLluís Vilanova
17*650ab98dSLluís VilanovaAll backends must generate their contents through the 'tracetool.out' routine.
18*650ab98dSLluís Vilanova
19*650ab98dSLluís Vilanova
20*650ab98dSLluís VilanovaBackend functions
21*650ab98dSLluís Vilanova-----------------
22*650ab98dSLluís Vilanova
23*650ab98dSLluís Vilanova======== =======================================================================
24*650ab98dSLluís VilanovaFunction Description
25*650ab98dSLluís Vilanova======== =======================================================================
26*650ab98dSLluís Vilanova<format> Called to generate the format- and backend-specific code for each of
27*650ab98dSLluís Vilanova         the specified events. If the function does not exist, the backend is
28*650ab98dSLluís Vilanova         considered not compatible with the given format.
29*650ab98dSLluís Vilanova======== =======================================================================
30*650ab98dSLluís Vilanova"""
31*650ab98dSLluís Vilanova
32*650ab98dSLluís Vilanova__author__     = "Lluís Vilanova <vilanova@ac.upc.edu>"
33*650ab98dSLluís Vilanova__copyright__  = "Copyright 2012, Lluís Vilanova <vilanova@ac.upc.edu>"
34*650ab98dSLluís Vilanova__license__    = "GPL version 2 or (at your option) any later version"
35*650ab98dSLluís Vilanova
36*650ab98dSLluís Vilanova__maintainer__ = "Stefan Hajnoczi"
37*650ab98dSLluís Vilanova__email__      = "stefanha@linux.vnet.ibm.com"
38*650ab98dSLluís Vilanova
39*650ab98dSLluís Vilanova
40*650ab98dSLluís Vilanovaimport pkgutil
41*650ab98dSLluís Vilanova
42*650ab98dSLluís Vilanovaimport tracetool
43*650ab98dSLluís Vilanova
44*650ab98dSLluís Vilanova
45*650ab98dSLluís Vilanovadef get_list():
46*650ab98dSLluís Vilanova    """Get a list of (name, description) pairs."""
47*650ab98dSLluís Vilanova    res = [("nop", "Tracing disabled.")]
48*650ab98dSLluís Vilanova    for _, modname, _ in pkgutil.iter_modules(tracetool.backend.__path__):
49*650ab98dSLluís Vilanova        module = tracetool.try_import("tracetool.backend." + modname)
50*650ab98dSLluís Vilanova
51*650ab98dSLluís Vilanova        # just in case; should never fail unless non-module files are put there
52*650ab98dSLluís Vilanova        if not module[0]:
53*650ab98dSLluís Vilanova            continue
54*650ab98dSLluís Vilanova        module = module[1]
55*650ab98dSLluís Vilanova
56*650ab98dSLluís Vilanova        doc = module.__doc__
57*650ab98dSLluís Vilanova        if doc is None:
58*650ab98dSLluís Vilanova            doc = ""
59*650ab98dSLluís Vilanova        doc = doc.strip().split("\n")[0]
60*650ab98dSLluís Vilanova
61*650ab98dSLluís Vilanova        name = modname.replace("_", "-")
62*650ab98dSLluís Vilanova        res.append((name, doc))
63*650ab98dSLluís Vilanova    return res
64*650ab98dSLluís Vilanova
65*650ab98dSLluís Vilanova
66*650ab98dSLluís Vilanovadef exists(name):
67*650ab98dSLluís Vilanova    """Return whether the given backend exists."""
68*650ab98dSLluís Vilanova    if len(name) == 0:
69*650ab98dSLluís Vilanova        return False
70*650ab98dSLluís Vilanova    if name == "nop":
71*650ab98dSLluís Vilanova        return True
72*650ab98dSLluís Vilanova    name = name.replace("-", "_")
73*650ab98dSLluís Vilanova    return tracetool.try_import("tracetool.backend." + name)[1]
74*650ab98dSLluís Vilanova
75*650ab98dSLluís Vilanova
76*650ab98dSLluís Vilanovadef compatible(backend, format):
77*650ab98dSLluís Vilanova    """Whether a backend is compatible with the given format."""
78*650ab98dSLluís Vilanova    if not exists(backend):
79*650ab98dSLluís Vilanova        raise ValueError("unknown backend: %s" % backend)
80*650ab98dSLluís Vilanova
81*650ab98dSLluís Vilanova    backend = backend.replace("-", "_")
82*650ab98dSLluís Vilanova    format = format.replace("-", "_")
83*650ab98dSLluís Vilanova
84*650ab98dSLluís Vilanova    if backend == "nop":
85*650ab98dSLluís Vilanova        return True
86*650ab98dSLluís Vilanova    else:
87*650ab98dSLluís Vilanova        func = tracetool.try_import("tracetool.backend." + backend,
88*650ab98dSLluís Vilanova                                    format, None)[1]
89*650ab98dSLluís Vilanova        return func is not None
90*650ab98dSLluís Vilanova
91*650ab98dSLluís Vilanova
92*650ab98dSLluís Vilanovadef _empty(events):
93*650ab98dSLluís Vilanova    pass
94*650ab98dSLluís Vilanova
95*650ab98dSLluís Vilanovadef generate(backend, format, events):
96*650ab98dSLluís Vilanova    """Generate the per-event output for the given (backend, format) pair."""
97*650ab98dSLluís Vilanova    if not compatible(backend, format):
98*650ab98dSLluís Vilanova        raise ValueError("backend '%s' not compatible with format '%s'" %
99*650ab98dSLluís Vilanova                         (backend, format))
100*650ab98dSLluís Vilanova
101*650ab98dSLluís Vilanova    backend = backend.replace("-", "_")
102*650ab98dSLluís Vilanova    format = format.replace("-", "_")
103*650ab98dSLluís Vilanova
104*650ab98dSLluís Vilanova    if backend == "nop":
105*650ab98dSLluís Vilanova        func = tracetool.try_import("tracetool.format." + format,
106*650ab98dSLluís Vilanova                                    "nop", _empty)[1]
107*650ab98dSLluís Vilanova    else:
108*650ab98dSLluís Vilanova        func = tracetool.try_import("tracetool.backend." + backend,
109*650ab98dSLluís Vilanova                                    format, None)[1]
110*650ab98dSLluís Vilanova
111*650ab98dSLluís Vilanova    func(events)
112