Fix CompareInstruction.predicate

This commit is contained in:
Siu Kwan Lam 2013-05-23 11:45:15 -05:00
commit a0eb03b239
2 changed files with 67 additions and 2 deletions

View file

@ -55,12 +55,18 @@ class Enum(int):
@classmethod
def declare(cls):
declared = cls._declared_ = {}
scope = globals()
for name in filter(lambda s: s.startswith(cls.prefix), dir(cls)):
n = getattr(cls, name)
typ = type(name, (cls,), {})
scope[name] = typ(n)
obj = typ(n)
declared[n] = obj
scope[name] = obj
@classmethod
def get(cls, num):
return cls._declared_[num]
# type id (llvm::Type::TypeID)
class TypeEnum(Enum):
@ -1872,16 +1878,24 @@ class PHINode(Instruction):
class SwitchInstruction(Instruction):
_type_ = api.llvm.SwitchInst
def add_case(self, const, bblk):
self._ptr.addCase(const._ptr, bblk._ptr)
class CompareInstruction(Instruction):
_type_ = api.llvm.CmpInst
@property
def predicate(self):
return self._ptr.getPredicate()
n = self._ptr.getPredicate()
try:
return ICMPEnum.get(n)
except KeyError:
return FCMPEnum.get(n)
#===----------------------------------------------------------------------===
# Basic block
#===----------------------------------------------------------------------===

View file

@ -1302,6 +1302,57 @@ class TestArgAttr(TestCase):
tests.append(TestArgAttr)
# ---------------------------------------------------------------------------
class TestSwitch(TestCase):
def test_arg_attr(self):
m = Module.new('oifjda')
fnty = Type.function(Type.void(), [Type.int()])
func = m.add_function(fnty, 'foo')
bb = func.append_basic_block('')
bbdef = func.append_basic_block('')
bbsw1 = func.append_basic_block('')
bbsw2 = func.append_basic_block('')
bldr = Builder.new(bb)
swt = bldr.switch(func.args[0], bbdef, n=2)
swt.add_case(Constant.int(Type.int(), 0), bbsw1)
swt.add_case(Constant.int(Type.int(), 1), bbsw2)
bldr.position_at_end(bbsw1)
bldr.ret_void()
bldr.position_at_end(bbsw2)
bldr.ret_void()
bldr.position_at_end(bbdef)
bldr.ret_void()
func.verify()
tests.append(TestSwitch)
# ---------------------------------------------------------------------------
class TestCmp(TestCase):
def test_arg_attr(self):
m = Module.new('oifjda')
fnty = Type.function(Type.void(), [Type.int()])
func = m.add_function(fnty, 'foo')
bb = func.append_basic_block('')
bldr = Builder.new(bb)
cmpinst = bldr.icmp(lc.ICMP_ULE, func.args[0],
Constant.int(Type.int(), 123))
self.assertTrue(repr(cmpinst.predicate).startswith('ICMP_ULE'))
self.assertEqual(cmpinst.predicate, lc.ICMP_ULE)
bldr.ret_void()
func.verify()
tests.append(TestCmp)
# ---------------------------------------------------------------------------
def run(verbosity=1):