Add AllocaInstruction
This commit is contained in:
parent
091a393d1d
commit
b8e0338da8
4 changed files with 59 additions and 6 deletions
33
llvm/core.py
33
llvm/core.py
|
|
@ -1951,6 +1951,33 @@ class CompareInstruction(Instruction):
|
||||||
return FCMPEnum.get(n)
|
return FCMPEnum.get(n)
|
||||||
|
|
||||||
|
|
||||||
|
class AllocaInstruction(Instruction):
|
||||||
|
_type_ = api.llvm.AllocaInst
|
||||||
|
|
||||||
|
@property
|
||||||
|
def alignment(self):
|
||||||
|
return self._ptr.getAlignment()
|
||||||
|
|
||||||
|
@alignment.setter
|
||||||
|
def alignment(self, n):
|
||||||
|
self._ptr.setAlignment(n)
|
||||||
|
|
||||||
|
@property
|
||||||
|
def array_size(self):
|
||||||
|
return self._ptr.getArraySize()
|
||||||
|
|
||||||
|
@array_size.setter
|
||||||
|
def array_size(self, value):
|
||||||
|
return self._ptr.setArraySize(value._ptr)._ptr
|
||||||
|
|
||||||
|
@property
|
||||||
|
def is_array(self):
|
||||||
|
return self._ptr.isArrayAllocation()
|
||||||
|
|
||||||
|
@property
|
||||||
|
def is_static(self):
|
||||||
|
return self._ptr.isStaticAlloca()
|
||||||
|
|
||||||
#===----------------------------------------------------------------------===
|
#===----------------------------------------------------------------------===
|
||||||
# Basic block
|
# Basic block
|
||||||
#===----------------------------------------------------------------------===
|
#===----------------------------------------------------------------------===
|
||||||
|
|
@ -2010,7 +2037,8 @@ class _ValueFactory(object):
|
||||||
VALUE_INSTRUCTION + OPCODE_INVOKE : CallOrInvokeInstruction,
|
VALUE_INSTRUCTION + OPCODE_INVOKE : CallOrInvokeInstruction,
|
||||||
VALUE_INSTRUCTION + OPCODE_SWITCH : SwitchInstruction,
|
VALUE_INSTRUCTION + OPCODE_SWITCH : SwitchInstruction,
|
||||||
VALUE_INSTRUCTION + OPCODE_ICMP : CompareInstruction,
|
VALUE_INSTRUCTION + OPCODE_ICMP : CompareInstruction,
|
||||||
VALUE_INSTRUCTION + OPCODE_FCMP : CompareInstruction
|
VALUE_INSTRUCTION + OPCODE_FCMP : CompareInstruction,
|
||||||
|
VALUE_INSTRUCTION + OPCODE_ALLOCA : AllocaInstruction,
|
||||||
}
|
}
|
||||||
|
|
||||||
@classmethod
|
@classmethod
|
||||||
|
|
@ -2218,7 +2246,6 @@ class Builder(llvm.Wrapper):
|
||||||
# memory
|
# memory
|
||||||
|
|
||||||
def malloc(self, ty, name=""):
|
def malloc(self, ty, name=""):
|
||||||
context = api.llvm.getGlobalContext()
|
|
||||||
allocsz = api.llvm.ConstantExpr.getSizeOf(ty._ptr)
|
allocsz = api.llvm.ConstantExpr.getSizeOf(ty._ptr)
|
||||||
ity = allocsz.getType()
|
ity = allocsz.getType()
|
||||||
malloc = api.llvm.CallInst.CreateMalloc(self.basic_block._ptr,
|
malloc = api.llvm.CallInst.CreateMalloc(self.basic_block._ptr,
|
||||||
|
|
@ -2232,7 +2259,6 @@ class Builder(llvm.Wrapper):
|
||||||
return _make_value(inst)
|
return _make_value(inst)
|
||||||
|
|
||||||
def malloc_array(self, ty, size, name=""):
|
def malloc_array(self, ty, size, name=""):
|
||||||
context = api.llvm.getGlobalContext()
|
|
||||||
allocsz = api.llvm.ConstantExpr.getSizeOf(ty._ptr)
|
allocsz = api.llvm.ConstantExpr.getSizeOf(ty._ptr)
|
||||||
ity = allocsz.getType()
|
ity = allocsz.getType()
|
||||||
malloc = api.llvm.CallInst.CreateMalloc(self.basic_block._ptr,
|
malloc = api.llvm.CallInst.CreateMalloc(self.basic_block._ptr,
|
||||||
|
|
@ -2246,7 +2272,6 @@ class Builder(llvm.Wrapper):
|
||||||
return _make_value(inst)
|
return _make_value(inst)
|
||||||
|
|
||||||
def alloca(self, ty, name=""):
|
def alloca(self, ty, name=""):
|
||||||
intty = Type.int()
|
|
||||||
return _make_value(self._ptr.CreateAlloca(ty._ptr, None, name))
|
return _make_value(self._ptr.CreateAlloca(ty._ptr, None, name))
|
||||||
|
|
||||||
def alloca_array(self, ty, size, name=""):
|
def alloca_array(self, ty, size, name=""):
|
||||||
|
|
|
||||||
24
llvm/tests/test_alloca.py
Normal file
24
llvm/tests/test_alloca.py
Normal file
|
|
@ -0,0 +1,24 @@
|
||||||
|
import unittest
|
||||||
|
from llvm.core import Type, Module, Builder, Constant
|
||||||
|
from .support import TestCase, tests
|
||||||
|
|
||||||
|
class TestAlloca(TestCase):
|
||||||
|
def test_alloca_alignment(self):
|
||||||
|
m = Module.new('')
|
||||||
|
f = m.add_function(Type.function(Type.void(), []), "foo")
|
||||||
|
b = Builder.new(f.append_basic_block(''))
|
||||||
|
inst = b.alloca(Type.int(32))
|
||||||
|
inst.alignment = 4
|
||||||
|
b.ret_void()
|
||||||
|
m.verify()
|
||||||
|
|
||||||
|
self.assertTrue(inst.is_static)
|
||||||
|
self.assertFalse(inst.is_array)
|
||||||
|
self.assertEqual(inst.alignment, 4)
|
||||||
|
self.assertEqual(str(inst.array_size), 'i32 1')
|
||||||
|
|
||||||
|
tests.append(TestAlloca)
|
||||||
|
|
||||||
|
if __name__ == '__main__':
|
||||||
|
unittest.main()
|
||||||
|
|
||||||
|
|
@ -84,7 +84,7 @@ class Capsule(object):
|
||||||
return cls(self)
|
return cls(self)
|
||||||
|
|
||||||
def __eq__(self, other):
|
def __eq__(self, other):
|
||||||
if self.pointer == other.pointer:
|
if isinstance(other, Capsule) and self.pointer == other.pointer:
|
||||||
assert self.name == other.name
|
assert self.name == other.name
|
||||||
return True
|
return True
|
||||||
else:
|
else:
|
||||||
|
|
@ -193,7 +193,8 @@ class Wrapper(object):
|
||||||
return hash(self._capsule)
|
return hash(self._capsule)
|
||||||
|
|
||||||
def __eq__(self, other):
|
def __eq__(self, other):
|
||||||
return self._capsule == other._capsule
|
if isinstance(other, Wrapper):
|
||||||
|
return self._capsule == other._capsule
|
||||||
|
|
||||||
def __ne__(self, other):
|
def __ne__(self, other):
|
||||||
return not(self == other)
|
return not(self == other)
|
||||||
|
|
|
||||||
|
|
@ -346,6 +346,9 @@ class AllocaInst:
|
||||||
isStaticAlloca = Method(cast(Bool, bool))
|
isStaticAlloca = Method(cast(Bool, bool))
|
||||||
getArraySize = Method(ptr(Value))
|
getArraySize = Method(ptr(Value))
|
||||||
getAllocatedType = Method(ptr(Type))
|
getAllocatedType = Method(ptr(Type))
|
||||||
|
getAlignment = Method(cast(Unsigned, int))
|
||||||
|
setAlignment = Method(Void, cast(int, Unsigned))
|
||||||
|
getArraySize = Method(ptr(Value))
|
||||||
|
|
||||||
|
|
||||||
@CastInst
|
@CastInst
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue