diff options
author | Michael Gottesman <mgottesman@apple.com> | 2013-09-11 00:23:14 +0000 |
---|---|---|
committer | Michael Gottesman <mgottesman@apple.com> | 2013-09-11 00:23:14 +0000 |
commit | 37a8807323672ab0bb366272e5a798b8e63752a4 (patch) | |
tree | f7b06a1fd959d1ec6639ee7c23b4c69feb3e4e0a /bindings/python/llvm/core.py | |
parent | 6a63cd12813fea01d711f098126d199c936c8f6b (diff) | |
download | external_llvm-37a8807323672ab0bb366272e5a798b8e63752a4.zip external_llvm-37a8807323672ab0bb366272e5a798b8e63752a4.tar.gz external_llvm-37a8807323672ab0bb366272e5a798b8e63752a4.tar.bz2 |
[python-bindings] Added code for loading a module from bitcode, getset its datalayout, getset its target, dump it, print it to a file.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@190458 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'bindings/python/llvm/core.py')
-rw-r--r-- | bindings/python/llvm/core.py | 67 |
1 files changed, 67 insertions, 0 deletions
diff --git a/bindings/python/llvm/core.py b/bindings/python/llvm/core.py index 76d1b14..2072d2f 100644 --- a/bindings/python/llvm/core.py +++ b/bindings/python/llvm/core.py @@ -16,10 +16,12 @@ from . import enumerations from ctypes import POINTER from ctypes import byref from ctypes import c_char_p +from ctypes import c_uint __all__ = [ "lib", "MemoryBuffer", + "Module", "Context", "PassRegistry" ] @@ -88,6 +90,45 @@ class MemoryBuffer(LLVMObject): def __len__(self): return lib.LLVMGetBufferSize(self) +class Module(LLVMObject): + """Represents the top-level structure of an llvm program in an opaque object.""" + + def __init__(self, module, name=None, context=None): + LLVMObject.__init__(self, module, disposer=lib.LLVMDisposeModule) + + @classmethod + def CreateWithName(cls, module_id): + m = Module(lib.LLVMModuleCreateWithName(module_id)) + c = Context.GetGlobalContext().take_ownership(m) + return m + + @property + def data_layout(self): + return lib.LLVMGetDataLayout(self) + + @data_layout.setter + def data_layout(self, new_data_layout): + """new_data_layout is a string.""" + lib.LLVMSetDataLayout(self, new_data_layout) + + @property + def target(self): + return lib.LLVMGetTarget(self) + + @target.setter + def target(self, new_target): + """new_target is a string.""" + lib.LLVMSetTarget(self, new_target) + + def dump(self): + lib.LLVMDumpModule(self) + + def print_module_to_file(self, filename): + out = c_char_p(None) + result = lib.LLVMPrintModuleToFile(self, filename, byref(out)) + if not result: + raise RuntimeError("LLVM Error: %s" % out.value) + class Context(LLVMObject): def __init__(self, context=None): @@ -172,6 +213,32 @@ def register_library(library): library.LLVMDisposeMemoryBuffer.argtypes = [MemoryBuffer] + # Module declarations + library.LLVMModuleCreateWithName.argtypes = [c_char_p] + library.LLVMModuleCreateWithName.restype = c_object_p + + library.LLVMDisposeModule.argtypes = [Module] + library.LLVMDisposeModule.restype = None + + library.LLVMGetDataLayout.argtypes = [Module] + library.LLVMGetDataLayout.restype = c_char_p + + library.LLVMSetDataLayout.argtypes = [Module, c_char_p] + library.LLVMSetDataLayout.restype = None + + library.LLVMGetTarget.argtypes = [Module] + library.LLVMGetTarget.restype = c_char_p + + library.LLVMSetTarget.argtypes = [Module, c_char_p] + library.LLVMSetTarget.restype = None + + library.LLVMDumpModule.argtypes = [Module] + library.LLVMDumpModule.restype = None + + library.LLVMPrintModuleToFile.argtypes = [Module, c_char_p, + POINTER(c_char_p)] + library.LLVMPrintModuleToFile.restype = bool + def register_enumerations(): for name, value in enumerations.OpCodes: OpCode.register(name, value) |