interp_defs_file = "../../libdex/DexOpcodes.h" # need opcode list
kNumPackedOpcodes = 512 # TODO: Derive this from DexOpcodes.h.
+splitops = False
verbose = False
handler_size_bits = -1000
handler_size_bytes = -1000
if len(tokens) != 2:
raise DataParseError("import requires one argument")
source = tokens[1]
- if source.endswith(".c"):
+ if source.endswith(".cpp"):
appendSourceFile(tokens[1], getGlobalSubDict(), c_fp, None)
elif source.endswith(".S"):
appendSourceFile(tokens[1], getGlobalSubDict(), asm_fp, None)
else:
- raise DataParseError("don't know how to import %s (expecting .c/.S)"
+ raise DataParseError("don't know how to import %s (expecting .cpp/.S)"
% source)
#
except ValueError:
raise DataParseError("unknown opcode %s" % tokens[1])
if alt_opcode_locations.has_key(tokens[1]):
- print "Warning: alt overrides earlier %s (%s -> %s)" \
+ print "Note: alt overrides earlier %s (%s -> %s)" \
% (tokens[1], alt_opcode_locations[tokens[1]], tokens[2])
alt_opcode_locations[tokens[1]] = tokens[2]
generate_alt_table = True
except ValueError:
raise DataParseError("unknown opcode %s" % tokens[1])
if opcode_locations.has_key(tokens[1]):
- print "Warning: op overrides earlier %s (%s -> %s)" \
+ print "Note: op overrides earlier %s (%s -> %s)" \
% (tokens[1], opcode_locations[tokens[1]], tokens[2])
opcode_locations[tokens[1]] = tokens[2]
in_op_start = 2
loadAndEmitOpcodes()
-
+ if splitops == False:
+ if generate_alt_table:
+ loadAndEmitAltOpcodes()
+ if style == "jump-table":
+ emitJmpTable("dvmAsmInstructionStart", label_prefix);
+ emitJmpTable("dvmAsmAltInstructionStart", alt_label_prefix);
+
+def genaltop(tokens):
+ if in_op_start != 2:
+ raise DataParseError("alt-op can be specified only after op-end")
+ if len(tokens) != 1:
+ raise DataParseError("opEnd takes no arguments")
if generate_alt_table:
loadAndEmitAltOpcodes()
if style == "jump-table":
asm_fp.write(" .balign 4\n")
asm_fp.write("dvmAsmSisterStart:\n")
asm_fp.writelines(sister_list)
-
asm_fp.write("\n .size dvmAsmSisterStart, .-dvmAsmSisterStart\n")
asm_fp.write(" .global dvmAsmSisterEnd\n")
asm_fp.write("dvmAsmSisterEnd:\n\n")
# point dvmAsmInstructionStart at the first handler or stub
asm_fp.write("\n .global %s\n" % start_label)
asm_fp.write(" .type %s, %%function\n" % start_label)
- asm_fp.write("%s:\n" % start_label)
asm_fp.write(" .text\n\n")
+ asm_fp.write("%s = " % start_label + label_prefix + "_ALT_OP_NOP\n")
for i in xrange(kNumPackedOpcodes):
op = opcodes[i]
#
def loadAndEmitC(location, opindex):
op = opcodes[opindex]
- source = "%s/%s.c" % (location, op)
+ source = "%s/%s.cpp" % (location, op)
if verbose:
- print " emit %s --> C" % source
+ print " emit %s --> C++" % source
dict = getGlobalSubDict()
dict.update({ "opcode":op, "opnum":opindex })
# Open and prepare output files.
#
try:
- c_fp = open("%s/InterpC-%s.c" % (output_dir, target_arch), "w")
+ c_fp = open("%s/InterpC-%s.cpp" % (output_dir, target_arch), "w")
asm_fp = open("%s/InterpAsm-%s.S" % (output_dir, target_arch), "w")
except:
print "Unable to open output files"
opEntry(tokens)
elif tokens[0] == "handler-style":
setHandlerStyle(tokens)
+ elif tokens[0] == "alt-ops":
+ genaltop(tokens)
+ elif tokens[0] == "split-ops":
+ splitops = True
else:
raise DataParseError, "unrecognized command '%s'" % tokens[0]
if style == None: