72 lines
1.5 KiB
Python
Executable File
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)
|