1#
2# Copyright (C) 2016 The Android Open Source Project
3#
4# Licensed under the Apache License, Version 2.0 (the "License");
5# you may not use this file except in compliance with the License.
6# You may obtain a copy of the License at
7#
8#      http://www.apache.org/licenses/LICENSE-2.0
9#
10# Unless required by applicable law or agreed to in writing, software
11# distributed under the License is distributed on an "AS IS" BASIS,
12# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13# See the License for the specific language governing permissions and
14# limitations under the License.
15#
16
17# Common global variables and helper methods for the in-memory python script.
18# The script starts with this file and is followed by the code generated form
19# the templated snippets. Those define all the helper functions used below.
20
21import sys, re
22from cStringIO import StringIO
23
24out = StringIO()  # File-like in-memory buffer.
25handler_size_bytes = "MTERP_HANDLER_SIZE"
26handler_size_bits = "MTERP_HANDLER_SIZE_LOG2"
27opcode = ""
28opnum = ""
29
30def write_line(line):
31  out.write(line + "\n")
32
33def balign():
34  write_line("    .balign {}".format(handler_size_bytes))
35
36def write_opcode(num, name, write_method):
37  global opnum, opcode
38  opnum, opcode = str(num), name
39  write_line("/* ------------------------------ */")
40  balign()
41  write_line(".L_{1}: /* {0:#04x} */".format(num, name))
42  opcode_start()
43  opcode_pre()
44  write_method()
45  opcode_end()
46  write_line("")
47  opnum, opcode = None, None
48
49generated_helpers = {}
50
51# This method generates a helper using the provided writer method.
52# The output is temporarily redirected to in-memory buffer.
53def add_helper(write_helper, name = None):
54  if name == None:
55    name = "mterp_" + opcode + "_helper"
56  global out
57  old_out = out
58  out = StringIO()
59  helper_start(name)
60  write_helper()
61  helper_end(name)
62  out.seek(0)
63  generated_helpers[name] = out.read()
64  out = old_out
65  return name
66
67def generate(output_filename):
68  out.seek(0)
69  out.truncate()
70  write_line("/* DO NOT EDIT: This file was generated by gen-mterp.py. */")
71  header()
72  entry()
73
74  instruction_start()
75  opcodes()
76  balign()
77  instruction_end()
78
79  for name, helper in sorted(generated_helpers.items()):
80    out.write(helper)
81  helpers()
82
83  footer()
84
85  out.seek(0)
86  # Squash consequtive empty lines.
87  text = re.sub(r"(\n\n)(\n)+", r"\1", out.read())
88  with open(output_filename, 'w') as output_file:
89    output_file.write(text)
90
91