Skip to content

Instantly share code, notes, and snippets.

@marcelogdeandrade
Created June 21, 2018 15:54
Show Gist options
  • Save marcelogdeandrade/b5daffcad8500cd28fffacf27578c882 to your computer and use it in GitHub Desktop.
Save marcelogdeandrade/b5daffcad8500cd28fffacf27578c882 to your computer and use it in GitHub Desktop.
from llvmlite import ir
class Number():
def __init__(self, builder, module, value):
self.builder = builder
self.module = module
self.value = value
def eval(self):
i = ir.Constant(ir.IntType(8), int(self.value))
return i
class BinaryOp():
def __init__(self, builder, module, left, right):
self.builder = builder
self.module = module
self.left = left
self.right = right
class Sum(BinaryOp):
def eval(self):
i = self.builder.add(self.left.eval(), self.right.eval())
return i
class Sub(BinaryOp):
def eval(self):
i = self.builder.sub(self.left.eval(), self.right.eval())
return i
class Print():
def __init__(self, builder, module, printf, value):
self.builder = builder
self.module = module
self.printf = printf
self.value = value
def eval(self):
value = self.value.eval()
# Declare argument list
voidptr_ty = ir.IntType(8).as_pointer()
fmt = "%i \n\0"
c_fmt = ir.Constant(ir.ArrayType(ir.IntType(8), len(fmt)),
bytearray(fmt.encode("utf8")))
global_fmt = ir.GlobalVariable(self.module, c_fmt.type, name="fstr")
global_fmt.linkage = 'internal'
global_fmt.global_constant = True
global_fmt.initializer = c_fmt
fmt_arg = self.builder.bitcast(global_fmt, voidptr_ty)
# Call Print Function
self.builder.call(self.printf, [fmt_arg, value])
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment