xref: /openbmc/qemu/scripts/tracetool/backend/__init__.py (revision 9943e0ec38786125ce1bbaf82ba6c3cadb976ba6)
1650ab98dSLluís Vilanova#!/usr/bin/env python
2650ab98dSLluís Vilanova# -*- coding: utf-8 -*-
3650ab98dSLluís Vilanova
4650ab98dSLluís Vilanova"""
5650ab98dSLluís VilanovaBackend management.
6650ab98dSLluís Vilanova
7650ab98dSLluís Vilanova
8650ab98dSLluís VilanovaCreating new backends
9650ab98dSLluís Vilanova---------------------
10650ab98dSLluís Vilanova
11650ab98dSLluís VilanovaA new backend named 'foo-bar' corresponds to Python module
12650ab98dSLluís Vilanova'tracetool/backend/foo_bar.py'.
13650ab98dSLluís Vilanova
14650ab98dSLluís VilanovaA backend module should provide a docstring, whose first non-empty line will be
15650ab98dSLluís Vilanovaconsidered its short description.
16650ab98dSLluís Vilanova
17650ab98dSLluís VilanovaAll backends must generate their contents through the 'tracetool.out' routine.
18650ab98dSLluís Vilanova
19650ab98dSLluís Vilanova
20650ab98dSLluís VilanovaBackend functions
21650ab98dSLluís Vilanova-----------------
22650ab98dSLluís Vilanova
23650ab98dSLluís Vilanova======== =======================================================================
24650ab98dSLluís VilanovaFunction Description
25650ab98dSLluís Vilanova======== =======================================================================
26650ab98dSLluís Vilanova<format> Called to generate the format- and backend-specific code for each of
27650ab98dSLluís Vilanova         the specified events. If the function does not exist, the backend is
28650ab98dSLluís Vilanova         considered not compatible with the given format.
29650ab98dSLluís Vilanova======== =======================================================================
30650ab98dSLluís Vilanova"""
31650ab98dSLluís Vilanova
32650ab98dSLluís Vilanova__author__     = "Lluís Vilanova <vilanova@ac.upc.edu>"
33650ab98dSLluís Vilanova__copyright__  = "Copyright 2012, Lluís Vilanova <vilanova@ac.upc.edu>"
34650ab98dSLluís Vilanova__license__    = "GPL version 2 or (at your option) any later version"
35650ab98dSLluís Vilanova
36650ab98dSLluís Vilanova__maintainer__ = "Stefan Hajnoczi"
37650ab98dSLluís Vilanova__email__      = "stefanha@linux.vnet.ibm.com"
38650ab98dSLluís Vilanova
39650ab98dSLluís Vilanova
40*9943e0ecSStefan Hajnocziimport os
41650ab98dSLluís Vilanova
42650ab98dSLluís Vilanovaimport tracetool
43650ab98dSLluís Vilanova
44650ab98dSLluís Vilanova
45650ab98dSLluís Vilanovadef get_list():
46650ab98dSLluís Vilanova    """Get a list of (name, description) pairs."""
47650ab98dSLluís Vilanova    res = [("nop", "Tracing disabled.")]
48*9943e0ecSStefan Hajnoczi    modnames = []
49*9943e0ecSStefan Hajnoczi    for filename in os.listdir(tracetool.backend.__path__[0]):
50*9943e0ecSStefan Hajnoczi        if filename.endswith('.py') and filename != '__init__.py':
51*9943e0ecSStefan Hajnoczi            modnames.append(filename.rsplit('.', 1)[0])
52*9943e0ecSStefan Hajnoczi    for modname in modnames:
53650ab98dSLluís Vilanova        module = tracetool.try_import("tracetool.backend." + modname)
54650ab98dSLluís Vilanova
55650ab98dSLluís Vilanova        # just in case; should never fail unless non-module files are put there
56650ab98dSLluís Vilanova        if not module[0]:
57650ab98dSLluís Vilanova            continue
58650ab98dSLluís Vilanova        module = module[1]
59650ab98dSLluís Vilanova
60650ab98dSLluís Vilanova        doc = module.__doc__
61650ab98dSLluís Vilanova        if doc is None:
62650ab98dSLluís Vilanova            doc = ""
63650ab98dSLluís Vilanova        doc = doc.strip().split("\n")[0]
64650ab98dSLluís Vilanova
65650ab98dSLluís Vilanova        name = modname.replace("_", "-")
66650ab98dSLluís Vilanova        res.append((name, doc))
67650ab98dSLluís Vilanova    return res
68650ab98dSLluís Vilanova
69650ab98dSLluís Vilanova
70650ab98dSLluís Vilanovadef exists(name):
71650ab98dSLluís Vilanova    """Return whether the given backend exists."""
72650ab98dSLluís Vilanova    if len(name) == 0:
73650ab98dSLluís Vilanova        return False
74650ab98dSLluís Vilanova    if name == "nop":
75650ab98dSLluís Vilanova        return True
76650ab98dSLluís Vilanova    name = name.replace("-", "_")
77650ab98dSLluís Vilanova    return tracetool.try_import("tracetool.backend." + name)[1]
78650ab98dSLluís Vilanova
79650ab98dSLluís Vilanova
80650ab98dSLluís Vilanovadef compatible(backend, format):
81650ab98dSLluís Vilanova    """Whether a backend is compatible with the given format."""
82650ab98dSLluís Vilanova    if not exists(backend):
83650ab98dSLluís Vilanova        raise ValueError("unknown backend: %s" % backend)
84650ab98dSLluís Vilanova
85650ab98dSLluís Vilanova    backend = backend.replace("-", "_")
86650ab98dSLluís Vilanova    format = format.replace("-", "_")
87650ab98dSLluís Vilanova
88650ab98dSLluís Vilanova    if backend == "nop":
89650ab98dSLluís Vilanova        return True
90650ab98dSLluís Vilanova    else:
91650ab98dSLluís Vilanova        func = tracetool.try_import("tracetool.backend." + backend,
92650ab98dSLluís Vilanova                                    format, None)[1]
93650ab98dSLluís Vilanova        return func is not None
94650ab98dSLluís Vilanova
95650ab98dSLluís Vilanova
96650ab98dSLluís Vilanovadef _empty(events):
97650ab98dSLluís Vilanova    pass
98650ab98dSLluís Vilanova
99650ab98dSLluís Vilanovadef generate(backend, format, events):
100650ab98dSLluís Vilanova    """Generate the per-event output for the given (backend, format) pair."""
101650ab98dSLluís Vilanova    if not compatible(backend, format):
102650ab98dSLluís Vilanova        raise ValueError("backend '%s' not compatible with format '%s'" %
103650ab98dSLluís Vilanova                         (backend, format))
104650ab98dSLluís Vilanova
105650ab98dSLluís Vilanova    backend = backend.replace("-", "_")
106650ab98dSLluís Vilanova    format = format.replace("-", "_")
107650ab98dSLluís Vilanova
108650ab98dSLluís Vilanova    if backend == "nop":
109650ab98dSLluís Vilanova        func = tracetool.try_import("tracetool.format." + format,
110650ab98dSLluís Vilanova                                    "nop", _empty)[1]
111650ab98dSLluís Vilanova    else:
112650ab98dSLluís Vilanova        func = tracetool.try_import("tracetool.backend." + backend,
113650ab98dSLluís Vilanova                                    format, None)[1]
114650ab98dSLluís Vilanova
115650ab98dSLluís Vilanova    func(events)
116