def generate_native_function(fn: FuncIR, emitter: Emitter, source_path: str, module_name: str) -> None: declarations = Emitter(emitter.context, fn.env) body = Emitter(emitter.context, fn.env) visitor = FunctionEmitterVisitor(body, declarations, fn.name, source_path, module_name) declarations.emit_line('{} {{'.format(native_function_header(fn, emitter))) body.indent() for r, i in fn.env.indexes.items(): if isinstance(r.type, RTuple): emitter.declare_tuple_struct(r.type) if i < len(fn.args): continue # skip the arguments ctype = emitter.ctype_spaced(r.type) declarations.emit_line('{ctype}{prefix}{name};'.format( ctype=ctype, prefix=REG_PREFIX, name=r.name)) # Before we emit the blocks, give them all labels for i, block in enumerate(fn.blocks): block.label = i for block in fn.blocks: body.emit_label(block) for op in block.ops: op.accept(visitor) body.emit_line('}') emitter.emit_from_emitter(declarations) emitter.emit_from_emitter(body)
def generate_native_function(fn: FuncIR, emitter: Emitter) -> None: declarations = Emitter(emitter.context, fn.env) body = Emitter(emitter.context, fn.env) visitor = FunctionEmitterVisitor(body, declarations) declarations.emit_line('{} {{'.format(native_function_header(fn))) body.indent() for i in range(len(fn.args), fn.env.num_regs()): ctype = fn.env.types[i].ctype declarations.emit_line('{ctype} {prefix}{name};'.format( ctype=ctype, prefix=REG_PREFIX, name=fn.env.names[i])) for block in fn.blocks: body.emit_label(block.label) for op in block.ops: op.accept(visitor) body.emit_line('}') emitter.emit_from_emitter(declarations) emitter.emit_from_emitter(body)