[python bindings] Added code to get the length of a memory buffer. Tests are included.
authorMichael Gottesman <mgottesman@apple.com>
Tue, 10 Sep 2013 06:57:57 +0000 (06:57 +0000)
committerMichael Gottesman <mgottesman@apple.com>
Tue, 10 Sep 2013 06:57:57 +0000 (06:57 +0000)
This is a part of a series of patches that have been sitting fallow on a
personal branch that I have been messing with for a bit.

The patches start to flesh out the python llvm-c wrapper to the point where you can:

1. Load Modules from Bitcode/Dump/Print them.
2. Iterate over Functions from those modules/get their names/dump them.
3. Iterate over the BasicBlocks from said function/get the BB's name/dump it.
4. Iterate over the Instructions in said BasicBlocks/get the instructions
   name/dump the instruction.

My main interest in developing this was to be able to gather statistics about
LLVM IR using python scripts to speed up statistical profiling of different IR
level transformations (hence the focus on printing/dumping/getting names).

This is a gift from me to the LLVM community = ).

I am going to be committing the patches slowly over the next bit as I have time
to prepare the patches.

The overall organization follows the c-api like the bindings that are already
implemented.

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

bindings/python/llvm/core.py
bindings/python/llvm/tests/base.py
bindings/python/llvm/tests/test_core.py
bindings/python/llvm/tests/test_file [new file with mode: 0644]

index 67566374256e521745023a495a47633b23c7f688..bd61a6ac993e7273fb98dfe450ac0fb151ab4bbe 100644 (file)
@@ -83,11 +83,17 @@ class MemoryBuffer(LLVMObject):
 
         LLVMObject.__init__(self, memory, disposer=lib.LLVMDisposeMemoryBuffer)
 
+    def __len__(self):
+        return lib.LLVMGetBufferSize(self)
+
 def register_library(library):
+    # Memory buffer declarations
     library.LLVMCreateMemoryBufferWithContentsOfFile.argtypes = [c_char_p,
             POINTER(c_object_p), POINTER(c_char_p)]
     library.LLVMCreateMemoryBufferWithContentsOfFile.restype = bool
 
+    library.LLVMGetBufferSize.argtypes = [MemoryBuffer]
+
     library.LLVMDisposeMemoryBuffer.argtypes = [MemoryBuffer]
 
 def register_enumerations():
index ff9eb2fc143862515188fd21a30d58fb7503a84e..22da5fdbdd0970da4eecb5e7282ecb2bf243f616 100644 (file)
@@ -30,3 +30,6 @@ class TestBase(unittest.TestCase):
 
         raise Exception('No suitable test binaries available!')
     get_test_binary.__test__ = False
+
+    def get_test_file(self):
+        return os.path.join(os.path.dirname(os.path.abspath(__file__)), "test_file")
index 545abc826ea713efde0866414ffeabae628d0436..699f3105e81b9edcc89296e09a8235adeaffdeb8 100644 (file)
@@ -21,3 +21,7 @@ class TestCore(TestBase):
         with self.assertRaises(Exception):
             MemoryBuffer(filename="/hopefully/this/path/doesnt/exist")
 
+    def test_memory_buffer_len(self):
+        source = self.get_test_file()
+        m = MemoryBuffer(filename=source)
+        self.assertEqual(len(m), 50)
diff --git a/bindings/python/llvm/tests/test_file b/bindings/python/llvm/tests/test_file
new file mode 100644 (file)
index 0000000..6c9b038
--- /dev/null
@@ -0,0 +1 @@
+I,"ìc\ 6AGðxq\91ÑÔ\90¹\ed«±ù\1cà§vl¥À\»L\1f>\9ag>`ö©ÿ©\19`\81\87w\16\1fÉ©
\ No newline at end of file