[python-bindings] Added support for getting/setting operands of values and getting...
authorMichael Gottesman <mgottesman@apple.com>
Wed, 11 Sep 2013 01:38:12 +0000 (01:38 +0000)
committerMichael Gottesman <mgottesman@apple.com>
Wed, 11 Sep 2013 01:38:12 +0000 (01:38 +0000)
Also in the process did some cleanups for BasicBlock.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@190477 91177308-0d34-0410-b5e6-96231b3b80d8

bindings/python/llvm/core.py
bindings/python/llvm/tests/test_core.py

index 740ce47188d21b5ae25fd2684ba31c5e93ebfcd2..ebf57d44438bf14f4657117b681fba0b0cb53c7a 100644 (file)
@@ -106,6 +106,15 @@ class Value(LLVMObject):
 
     def dump(self):
         lib.LLVMDumpValue(self)
+    
+    def get_operand(self, i):
+        return Value(lib.LLVMGetOperand(self, i))
+    
+    def set_operand(self, i, v):
+        return lib.LLVMSetOperand(self, i, v)
+    
+    def __len__(self):
+        return lib.LLVMGetNumOperands(self)
 
 class Module(LLVMObject):
     """Represents the top-level structure of an llvm program in an opaque object."""
@@ -264,12 +273,26 @@ class BasicBlock(LLVMObject):
         i = lib.LLVMGetLastInstruction(self)
         return i and Instruction(i)
 
+    def __as_value(self):
+        return Value(lib.LLVMBasicBlockAsValue(self))
+    
     @property
     def name(self):
-        return lib.LLVMGetValueName(Value(lib.LLVMBasicBlockAsValue(self)))
+        return lib.LLVMGetValueName(self.__as_value())
 
     def dump(self):
-        lib.LLVMDumpValue(Value(lib.LLVMBasicBlockAsValue(self)))
+        lib.LLVMDumpValue(self.__as_value())
+
+    def get_operand(self, i):
+        return Value(lib.LLVMGetOperand(self.__as_value(),
+                                        i))
+    
+    def set_operand(self, i, v):
+        return lib.LLVMSetOperand(self.__as_value(),
+                                  i, v)
+    
+    def __len__(self):
+        return lib.LLVMGetNumOperands(self.__as_value())
 
     class __inst_iterator(object):
         def __init__(self, bb, reverse=False):            
@@ -448,6 +471,15 @@ def register_library(library):
     library.LLVMDumpValue.argtypes = [Value]
     library.LLVMDumpValue.restype = None
 
+    library.LLVMGetOperand.argtypes = [Value, c_uint]
+    library.LLVMGetOperand.restype = c_object_p
+
+    library.LLVMSetOperand.argtypes = [Value, Value, c_uint]
+    library.LLVMSetOperand.restype = None
+
+    library.LLVMGetNumOperands.argtypes = [Value]
+    library.LLVMGetNumOperands.restype = c_uint
+
     # Basic Block Declarations.
     library.LLVMGetFirstBasicBlock.argtypes = [Function]
     library.LLVMGetFirstBasicBlock.restype = c_object_p
index ec47c67bbc4f994efa66581f53902fe2068d53f1..63f84c828bc8ac8eefbee45efa41799b3854ccf9 100644 (file)
@@ -115,9 +115,13 @@ class TestCore(TestBase):
         for inst in bb:
             self.assertEqual(inst.name, inst_list[i][0])
             self.assertEqual(inst.opcode, inst_list[i][1])
+            for op in range(len(inst)):
+                o = inst.get_operand(op)
+                print o.name
+                o.dump()
             inst.dump()
             i += 1
-        
+
         # Backwards
         for inst in reversed(bb):
             i -= 1