aboutsummaryrefslogtreecommitdiffstats
path: root/bindings/python/llvm/core.py
diff options
context:
space:
mode:
authorMichael Gottesman <mgottesman@apple.com>2013-09-11 00:23:14 +0000
committerMichael Gottesman <mgottesman@apple.com>2013-09-11 00:23:14 +0000
commit37a8807323672ab0bb366272e5a798b8e63752a4 (patch)
treef7b06a1fd959d1ec6639ee7c23b4c69feb3e4e0a /bindings/python/llvm/core.py
parent6a63cd12813fea01d711f098126d199c936c8f6b (diff)
downloadexternal_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.py67
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)