mirror of
https://github.com/mii443/qemu.git
synced 2025-08-22 15:15:46 +00:00
tracetool: Rewrite infrastructure as python modules
The tracetool script is written in shell and has hit several portability problems due to shell quirks or external tools across host platforms. Additionally the amount of string processing and lack of real data structures makes it tough to implement code generator backends for tracers that are more complex. This patch replaces the shell version of tracetool with a Python version. The new tracetool design is: scripts/tracetool.py - top-level script scripts/tracetool/backend/ - tracer backends live here (simple, ust) scripts/tracetool/format/ - output formats live here (.c, .h) There is common code for trace-events definition parsing so that backends can focus on generating code rather than parsing input. Support for all existing backends (nop, stderr, simple, ust, and dtrace) is added back in follow-up patches. [Commit description written by Stefan Hajnoczi] Signed-off-by: Lluís Vilanova <vilanova@ac.upc.edu> Signed-off-by: Stefan Hajnoczi <stefanha@linux.vnet.ibm.com>
This commit is contained in:
committed by
Stefan Hajnoczi
parent
6e7a7f3d9b
commit
650ab98d1d
108
scripts/tracetool.py
Executable file
108
scripts/tracetool.py
Executable file
@ -0,0 +1,108 @@
|
||||
#!/usr/bin/env python
|
||||
# -*- coding: utf-8 -*-
|
||||
|
||||
"""
|
||||
Command-line wrapper for the tracetool machinery.
|
||||
"""
|
||||
|
||||
__author__ = "Lluís Vilanova <vilanova@ac.upc.edu>"
|
||||
__copyright__ = "Copyright 2012, Lluís Vilanova <vilanova@ac.upc.edu>"
|
||||
__license__ = "GPL version 2 or (at your option) any later version"
|
||||
|
||||
__maintainer__ = "Stefan Hajnoczi"
|
||||
__email__ = "stefanha@linux.vnet.ibm.com"
|
||||
|
||||
|
||||
import sys
|
||||
import getopt
|
||||
|
||||
from tracetool import error_write, out
|
||||
import tracetool.backend
|
||||
import tracetool.format
|
||||
|
||||
|
||||
_SCRIPT = ""
|
||||
|
||||
def error_opt(msg = None):
|
||||
if msg is not None:
|
||||
error_write("Error: " + msg + "\n")
|
||||
|
||||
backend_descr = "\n".join([ " %-15s %s" % (n, d)
|
||||
for n,d in tracetool.backend.get_list() ])
|
||||
format_descr = "\n".join([ " %-15s %s" % (n, d)
|
||||
for n,d in tracetool.format.get_list() ])
|
||||
error_write("""\
|
||||
Usage: %(script)s --format=<format> --backend=<backend> [<options>]
|
||||
|
||||
Backends:
|
||||
%(backends)s
|
||||
|
||||
Formats:
|
||||
%(formats)s
|
||||
|
||||
Options:
|
||||
--help This help message.
|
||||
--list-backends Print list of available backends.
|
||||
--check-backend Check if the given backend is valid.
|
||||
""" % {
|
||||
"script" : _SCRIPT,
|
||||
"backends" : backend_descr,
|
||||
"formats" : format_descr,
|
||||
})
|
||||
|
||||
if msg is None:
|
||||
sys.exit(0)
|
||||
else:
|
||||
sys.exit(1)
|
||||
|
||||
|
||||
def main(args):
|
||||
global _SCRIPT
|
||||
_SCRIPT = args[0]
|
||||
|
||||
long_opts = [ "backend=", "format=", "help", "list-backends", "check-backend" ]
|
||||
long_opts += [ "binary=", "target-type=", "target-arch=", "probe-prefix=" ]
|
||||
|
||||
try:
|
||||
opts, args = getopt.getopt(args[1:], "", long_opts)
|
||||
except getopt.GetoptError as err:
|
||||
error_opt(str(err))
|
||||
|
||||
check_backend = False
|
||||
arg_backend = ""
|
||||
arg_format = ""
|
||||
for opt, arg in opts:
|
||||
if opt == "--help":
|
||||
error_opt()
|
||||
|
||||
elif opt == "--backend":
|
||||
arg_backend = arg
|
||||
elif opt == "--format":
|
||||
arg_format = arg
|
||||
|
||||
elif opt == "--list-backends":
|
||||
backends = tracetool.backend.get_list()
|
||||
out(", ".join([ b for b,_ in backends ]))
|
||||
sys.exit(0)
|
||||
elif opt == "--check-backend":
|
||||
check_backend = True
|
||||
|
||||
else:
|
||||
error_opt("unhandled option: %s" % opt)
|
||||
|
||||
if arg_backend is None:
|
||||
error_opt("backend not set")
|
||||
|
||||
if check_backend:
|
||||
if tracetool.backend.exists(arg_backend):
|
||||
sys.exit(0)
|
||||
else:
|
||||
sys.exit(1)
|
||||
|
||||
try:
|
||||
tracetool.generate(sys.stdin, arg_format, arg_backend)
|
||||
except tracetool.TracetoolError as e:
|
||||
error_opt(str(e))
|
||||
|
||||
if __name__ == "__main__":
|
||||
main(sys.argv)
|
Reference in New Issue
Block a user