|
@@ -507,6 +507,8 @@ class DefinitionScheduler(object):
|
|
|
assert not self.has_scheduled(definition)
|
|
|
statements = []
|
|
|
|
|
|
+ # print('Scheduling %s; store_and_forget: %s' % (definition, store_and_forget))
|
|
|
+
|
|
|
self.remove_definition(definition)
|
|
|
if isinstance(definition, cfg_ir.FlowInstruction):
|
|
|
statements.append(self.lowering_state.lower_value(definition))
|
|
@@ -529,6 +531,8 @@ class DefinitionScheduler(object):
|
|
|
else:
|
|
|
statements.append(lowered_value)
|
|
|
|
|
|
+ # print('Done scheduling %s; result: %s' % (definition, tree_ir.create_block(*statements)))
|
|
|
+
|
|
|
return statements
|
|
|
|
|
|
def schedule(self, definition, store_and_forget=False):
|
|
@@ -765,6 +769,16 @@ class LoweringState(object):
|
|
|
arg_list,
|
|
|
tree_ir.LoadLocalInstruction(jit_runtime.KWARGS_PARAMETER_NAME))
|
|
|
|
|
|
+ def lower_macro_call(self, value):
|
|
|
+ """Expands a macro call."""
|
|
|
+ arg_list = [self.use_definition(arg) for _, arg in value.argument_list]
|
|
|
+ if value.target_name in LoweringState.macro_lowerings:
|
|
|
+ return LoweringState.macro_lowerings[value.target_name](*arg_list)
|
|
|
+ else:
|
|
|
+ raise jit_runtime.JitCompilationFailedException(
|
|
|
+ "Unknown macro: '%s' in instruction '%s'" %
|
|
|
+ (value.target_name, value))
|
|
|
+
|
|
|
def lower_jump(self, flow):
|
|
|
"""Lowers the given 'jump' flow instruction to a tree."""
|
|
|
return self.lower_branch(flow.branch)
|
|
@@ -844,7 +858,12 @@ class LoweringState(object):
|
|
|
|
|
|
call_lowerings = {
|
|
|
cfg_ir.SIMPLE_POSITIONAL_CALLING_CONVENTION : lower_simple_positional_call,
|
|
|
- cfg_ir.JIT_CALLING_CONVENTION : lower_jit_call
|
|
|
+ cfg_ir.JIT_CALLING_CONVENTION : lower_jit_call,
|
|
|
+ cfg_ir.MACRO_POSITIONAL_CALLING_CONVENTION : lower_macro_call
|
|
|
+ }
|
|
|
+
|
|
|
+ macro_lowerings = {
|
|
|
+ cfg_ir.PRINT_MACRO_NAME: tree_ir.PrintInstruction
|
|
|
}
|
|
|
|
|
|
def lower_flow_graph(entry_point, jit):
|