Example #1
0
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)
Example #2
0
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)