Ejemplo n.º 1
0
    def visit_Writeln(self, node: Writeln) -> None:
        """Converts the contents of the command writeln to LLVM ir code and adds the
        print call to the operating system.

        Args:
            node (Writeln): content passed in the command writeln
        """

        self.printf_counter += 1
        output_operation_type = "%s"

        if isinstance(node.content[0], BinaryOperator):
            self._create_instruct("BinaryOperator", is_printf=True)

        writeln_content = self.visit(node.content[0])

        if isinstance(writeln_content, VarSymbol):
            content = self.GLOBAL_MEMORY[writeln_content.name]
        else:
            content = writeln_content

        content_type = type(content.type).__name__

        if self.builder.block.is_terminated:
            self._create_instruct(typ=content_type, is_printf=True)

        if isinstance(content.type, DoubleType):
            output_operation_type = "%f"

        output_format = f"{output_operation_type}\n\0"
        printf_format = Constant(
            ArrayType(IntType(8), len(output_format)),
            bytearray(output_format.encode("utf8")),
        )

        fstr = GlobalVariable(self.module,
                              printf_format.type,
                              name=f"fstr_{self.printf_counter}")
        fstr.linkage = "internal"
        fstr.global_constant = True
        fstr.initializer = printf_format

        writeln_type = FunctionType(IntType(32), [], var_arg=True)
        writeln = Function(
            self.module,
            writeln_type,
            name=f"printf_{content_type}_{self.printf_counter}",
        )

        body = self.builder.alloca(content.type)
        temp_loaded = self.builder.load(body)
        self.builder.store(temp_loaded, body)

        void_pointer_type = IntType(8).as_pointer()
        casted_arg = self.builder.bitcast(fstr, void_pointer_type)
        self.builder.call(writeln, [casted_arg, body])
        self.builder.ret_void()
Ejemplo n.º 2
0
    def _get_ll_pointer_type(self, target_data, context=None):
        """
        Convert this type object to an LLVM type.
        """
        from llvmlite.ir import Module, GlobalVariable
        from llvmlite.binding import parse_assembly

        if context is None:
            m = Module()
        else:
            m = Module(context=context)
        foo = GlobalVariable(m, self, name="foo")
        with parse_assembly(str(m)) as llmod:
            return llmod.get_global_variable(foo.name).type
Ejemplo n.º 3
0
distance_func = Function(mod, 
                         FunctionType(ty_double, [ty_double, ty_double]), 
                         name='distance')

block = distance_func.append_basic_block('entry')
builder = IRBuilder(block)
x, y = distance_func.args
d2 = builder.call(dsquared_func, [x, y])
d = builder.call(sqrt_func, [d2])
builder.ret(d)

# Part (f) - Global variables

from llvmlite.ir import GlobalVariable, VoidType
x_var = GlobalVariable(mod, ty_double, 'x')
x_var.initializer = Constant(ty_double, 0.0)

incr_func = Function(mod, 
                     FunctionType(VoidType(), []), 
                     name='incr')

block = incr_func.append_basic_block("entry")
builder = IRBuilder(block)
tmp1 = builder.load(x_var)
tmp2 = builder.fadd(tmp1, Constant(ty_double, 1.0))
builder.store(tmp2, x_var)
builder.ret_void()

# Part (g) - JIT
Ejemplo n.º 4
0
 def emit_global_bool(self, name):
     var = GlobalVariable(self.module, bool_type, name=name)
     var.initializer = Constant(bool_type, 0)
     self.globals[name] = var
Ejemplo n.º 5
0
 def emit_global_float(self, name):
     var = GlobalVariable(self.module, float_type, name=name)
     var.initializer = Constant(float_type, 0)
     self.globals[name] = var
Ejemplo n.º 6
0
 def emit_VAR(self, name, var_type):
     var = GlobalVariable(self.module, var_type, name=name)
     var.initializer = Constant(var_type, 0)
     self.globals[name] = var
Ejemplo n.º 7
0
 def emit_VARF(self, name):
     var = GlobalVariable(self.module, float_type, name=name)
     var.initializer = Constant(float_type, 0.0)
     self.globals[name] = var
Ejemplo n.º 8
0
 def emit_GLOBALI(self, name):
     var = GlobalVariable(self.module, int_type, name=name)
     var.initializer = Constant(int_type, 0)
     self.globals[name] = var
Ejemplo n.º 9
0
 def emit_VARB(self, name):
     var = GlobalVariable(self.module, byte_type, name=name)
     var.initializer = Constant(byte_type, 0)
     self.vars[name] = var
Ejemplo n.º 10
0
 def emit_VARF(self, name):
     var = GlobalVariable(self.module, float_type, name=name)
     var.initializer = Constant(float_type, 0.0)
     self.vars[name] = var
     pass  # You must implement