summaryrefslogtreecommitdiff
path: root/bindings/python
diff options
context:
space:
mode:
authorMichael Gottesman <mgottesman@apple.com>2013-09-10 06:57:57 +0000
committerMichael Gottesman <mgottesman@apple.com>2013-09-10 06:57:57 +0000
commit653212fdd1f5b5eea1c5b7d4d28b3f6c8fd05bba (patch)
treecaab39a22536cd5c265b267034e86196f64ce71e /bindings/python
parentc3c9b9b7a8e36e17e629196d33f5c33eb690c2f8 (diff)
downloadllvm-653212fdd1f5b5eea1c5b7d4d28b3f6c8fd05bba.tar.gz
llvm-653212fdd1f5b5eea1c5b7d4d28b3f6c8fd05bba.tar.bz2
llvm-653212fdd1f5b5eea1c5b7d4d28b3f6c8fd05bba.tar.xz
[python bindings] Added code to get the length of a memory buffer. Tests are included.
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
Diffstat (limited to 'bindings/python')
-rw-r--r--bindings/python/llvm/core.py6
-rw-r--r--bindings/python/llvm/tests/base.py3
-rw-r--r--bindings/python/llvm/tests/test_core.py4
-rw-r--r--bindings/python/llvm/tests/test_file1
4 files changed, 14 insertions, 0 deletions
diff --git a/bindings/python/llvm/core.py b/bindings/python/llvm/core.py
index 6756637425..bd61a6ac99 100644
--- a/bindings/python/llvm/core.py
+++ b/bindings/python/llvm/core.py
@@ -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():
diff --git a/bindings/python/llvm/tests/base.py b/bindings/python/llvm/tests/base.py
index ff9eb2fc14..22da5fdbdd 100644
--- a/bindings/python/llvm/tests/base.py
+++ b/bindings/python/llvm/tests/base.py
@@ -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")
diff --git a/bindings/python/llvm/tests/test_core.py b/bindings/python/llvm/tests/test_core.py
index 545abc826e..699f3105e8 100644
--- a/bindings/python/llvm/tests/test_core.py
+++ b/bindings/python/llvm/tests/test_core.py
@@ -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
index 0000000000..6c9b0385bd
--- /dev/null
+++ b/bindings/python/llvm/tests/test_file
@@ -0,0 +1 @@
+I,"cAGxqԐdvl\L>g>``wɩ \ No newline at end of file