blob: eca4817c74a5def3ea3587676f35f9d6b6d3c898 [file] [log] [blame]
#!/usr/bin/python
# Copyright (c) 2012 The Native Client Authors. All rights reserved.
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.
"""This tool synthesizes a very large C program based on a single
integer argument passed on the command line.
"""
import sys
# The genareted code alternated between these operators
OPERATORS = ["+", "-", "*", "/"]
# number of function calls made by each function
# A fairly high number here will disuade the inliner from doing anything
# because function bodies will be large and the number of callers will be large.
NUM_CALLS = 100
def EmitProlog(n, out):
out.write("/* n == %d */\n" % n)
for i in range(n):
out.write("int func_%d(int x);\n" % i)
def EmitFunctions(n, out):
for i in range(n):
out.write("\n")
out.write("int func_%d(int x) {\n" % i)
out.write(" int result = %d;\n" % i)
op = OPERATORS[i % len(OPERATORS)]
fun_indices = [(i + x) % n for x in range(1, NUM_CALLS + 1)]
for f in fun_indices:
out.write(" if (result != %d) result %s= func_%d(result);\n" %
(f, op, f))
out.write(" return result;\n")
out.write("}\n")
def EmitMain(n, out):
out.write("\n")
# Note, use of argc is intended to thwart optimization
out.write("int main(int argc, char* argv[]) { return func_0(argc); }\n")
def main(argv):
if len(argv) != 2:
print "Expecting integer parameter"
return 1
n = int(argv[1])
out = sys.stdout
out.write("/* This code was generated using %s */\n" % repr(argv))
EmitProlog(n, out)
EmitFunctions(n, out)
EmitMain(n, out)
if __name__ == '__main__':
sys.exit(main(sys.argv))