colinux64/bin/tracewrapper.py
2025-02-13 19:09:34 -07:00

72 lines
1.5 KiB
Python
Executable File

#!/usr/bin/env python
import sys, os, re
#
# GCC wrapper for auto tracing
#
# It works using these steps:
# * Takes a regular GCC command line
# * Executes this command line but with a modification that causes
# it to output a processed C file instead.
# * Execute autotrace.py to add traces to the preprocessed output.
# * Compile the preprocessed output with the added traces.
#
def reexec(params):
pid = os.fork()
if pid == 0:
try:
os.execvp(params[0], params);
finally:
os._exit(-1);
(pid, status) = os.waitpid(pid, 0)
if not os.WIFEXITED(status):
sys.exit(-1)
return os.WEXITSTATUS(status)
params = sys.argv[1:]
if ('-c' not in params) or (not (os.getenv("GCCTRACE") == 'Y')):
sys.exit(reexec(params))
c_file = None
for param in params:
if re.match(r'^(.+)?[.]c$', param):
c_file = param
if '-o' not in params:
params.append('-o')
params.append(os.path.splitext(c_file)[0]+'.o')
if c_file == None or c_file == "init_task.c":
sys.exit(reexec(params))
params.append('-DCOLINUX_TRACE')
ppc_params = params[:]
ppc_params.remove('-c')
ppc_params.append('-E')
oparam = ppc_params.index('-o')
ppc_file = ppc_params[oparam+1] = ppc_params[oparam+1] + '.ppc.c'
trace_file = ppc_params[oparam+1] + '.trace.c'
reexec(ppc_params)
import autotrace
autotrace.CTracer(open(ppc_file).read(), open(trace_file, 'w')).run()
params.remove(c_file)
params.append(trace_file)
result = reexec(params)
os.unlink(ppc_file)
os.unlink(trace_file)
sys.exit(result)