55 lines
1.4 KiB
ReStructuredText
55 lines
1.4 KiB
ReStructuredText
A More Complicated Function
|
|
===========================
|
|
|
|
.. code-block:: python
|
|
|
|
#!/usr/bin/env python
|
|
|
|
from llvm.core import *
|
|
|
|
#create a module
|
|
module = Module.new("tut2")
|
|
|
|
#create a function type taking 2 integers, return a 32-bit integer
|
|
ty_int = Type.int(32)
|
|
func_type = Type.function(ty_int, (ty_int, ty_int))
|
|
|
|
#create a function of that type
|
|
gcd = Function.new(module, func_type, "gcd")
|
|
|
|
#name function args
|
|
x = gcd.args[0]; x.name = "x"
|
|
y = gcd.args[1]; y.name = "y"
|
|
|
|
#implement the function
|
|
|
|
#blocks...
|
|
entry = gcd.append_basic_block("entry")
|
|
ret = gcd.append_basic_block("return")
|
|
cond_false = gcd.append_basic_block("cond_false")
|
|
cond_true = gcd.append_basic_block("cond_true")
|
|
cond_false_2 = gcd.append_basic_block("cond_false_2")
|
|
|
|
#create a llvm::IRBuilder
|
|
bldr = Builder.new(entry)
|
|
x_eq_y = bldr.icmp(IPRED_EQ, x, y, "tmp")
|
|
bldr.cbranch(x_eq_y, ret, cond_false)
|
|
|
|
bldr.position_at_end (ret)
|
|
bldr.ret(x)
|
|
|
|
bldr.position_at_end(cond_false)
|
|
x_lt_y = bldr.icmp(IPRED_ULT, x, y, "tmp")
|
|
bldr.cbranch(x_lt_y, cond_true, cond_false_2)
|
|
|
|
bldr.position_at_end(cond_true)
|
|
y_sub_x = bldr.sub(y, x, "tmp")
|
|
recur_1 = bldr.call(gcd, (x, y_sub_x,), "tmp")
|
|
bldr.ret(recur_1)
|
|
|
|
bldr.position_at_end(cond_false_2)
|
|
x_sub_y = bldr.sub(x, y, "x_sub_y")
|
|
recur_2 = bldr.call(gcd, (x_sub_y, y,), "tmp")
|
|
bldr.ret(recur_2)
|
|
|
|
print module
|