diff --git a/llvm/core.py b/llvm/core.py index 8a4ac2d..10b123a 100644 --- a/llvm/core.py +++ b/llvm/core.py @@ -2337,15 +2337,20 @@ class Builder(llvm.Wrapper): # misc def extract_value(self, retval, idx, name=""): - return _make_value(self._ptr.CreateExtractValue(retval._ptr, [idx], name)) + if not isinstance(idx, (tuple, list)): + idx = [idx] + return _make_value(self._ptr.CreateExtractValue(retval._ptr, idx, + name)) # obsolete synonym for extract_value getresult = extract_value def insert_value(self, retval, rhs, idx, name=""): + if not isinstance(idx, (tuple, list)): + idx = [idx] return _make_value(self._ptr.CreateInsertValue(retval._ptr, rhs._ptr, - [idx], + idx, name)) def phi(self, ty, name=""): diff --git a/llvm/tests/test_struct.py b/llvm/tests/test_struct.py index 3783a8c..8d61111 100644 --- a/llvm/tests/test_struct.py +++ b/llvm/tests/test_struct.py @@ -1,5 +1,5 @@ import unittest -from llvm.core import Type +from llvm.core import Type, Module, Builder, Constant from .support import TestCase, tests class TestStruct(TestCase): @@ -8,6 +8,19 @@ class TestStruct(TestCase): tb = Type.struct([Type.int(32), Type.float()]) self.assertTrue(ta.is_layout_identical(tb)) + def test_struct_extract_value_2d(self): + ta = Type.struct([Type.int(32), Type.float()]) + tb = Type.struct([ta, Type.float()]) + m = Module.new('') + f = m.add_function(Type.function(Type.void(), []), "foo") + b = Builder.new(f.append_basic_block('')) + v = Constant.undef(tb) + ins = b.insert_value(v, Constant.real(Type.float(), 1.234), [0, 1]) + ext = b.extract_value(ins, [0, 1]) + b.ret_void() + m.verify() + self.assertEqual(str(ext), 'float 0x3FF3BE76C0000000') + tests.append(TestStruct) if __name__ == '__main__':