Duncan Temple Lang

University of California at Davis

Department of Statistics

Here we look at global variables. We will create a global variable in a module and a routine that increments it. Then we will retrieve the value.

We start with the usual initialization steps and create our module.

mod = Module("global")

Next we create the global variable. We define a a constant to use as the initial value.

one = createIntegerConstant(-101L)
gvar = createGlobalVariable("gv", one, mod, Int32Type)

So now we define the function that increments the global variable.

fun = Function("inc", Int32Type, module = mod)
e = Block(fun, "entry")
ir = IRBuilder(e)

tmp = ir$createLocalVariable(Int32Type, "tmp")
zero = createIntegerConstant(0L)
createBitCast(ir, zero, Int32Type, "cast")
v = ir$createLoad(gvar)
ans = ir$binOp(Add, v, 1L)
#tmp = ir$createLoad(gvar)
ir$createStore(ans, gvar)
g = ir$createLoad(gvar)
ir$createStore(g, tmp)

ret = Block(fun)

v = ir$createLoad(tmp)

Let's add another function to get the current value.

getGV = Function("getGV", Int32Type, module = mod)
b = Block(getGV)
ir = IRBuilder(b)

#tmp = ir$createLocalVariable(Int32Type, "tmp")
#zero = createIntegerConstant(0L) 
#ir$createBitCast(zero, Int32Type)
ans = ir$createLoad(gvar)
#val = ir$createStore(ans, tmp)
#ans = ir$createLoad(tmp)

ee = ExecutionEngine(mod)
run(getGV, .ee = ee)
run(fun, .ee = ee)
run(fun, .ee = ee)
run(fun, .ee = ee)
run(getGV, .ee = ee)
replicate(10, run(fun, .ee = ee))
run(getGV, .ee = ee)